]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
синхронизация оклада
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Sat, 1 Nov 2025 06:04:30 +0000 (09:04 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Sat, 1 Nov 2025 06:04:30 +0000 (09:04 +0300)
erp24/records/Admin.php
erp24/records/EmployeePosition.php

index 10cc37e4a3a52cdfcd65127d2f654697330816fa..940cee397ff7894df170a843f47357872eba64a2 100755 (executable)
@@ -753,4 +753,59 @@ class Admin extends ActiveRecord implements IdentityInterface
         return false;
     }
 
+    /**
+     * {@inheritdoc}
+     * Синхронизирует зарплату из employee_position в employee_payment при назначении должности
+     */
+    public function afterSave($insert, $changedAttributes)
+    {
+        parent::afterSave($insert, $changedAttributes);
+
+        // Если изменился employee_position_id, синхронизируем зарплату
+        if (array_key_exists('employee_position_id', $changedAttributes) && !empty($this->employee_position_id)) {
+            $employeePosition = EmployeePosition::findOne($this->employee_position_id);
+            if (!empty($employeePosition) && !empty($employeePosition->salary)) {
+                // Обновляем или создаем запись в employee_payment
+                $today = date('Y-m-d');
+                
+                // Проверяем, есть ли уже запись на сегодня или позже
+                $existingPayment = EmployeePayment::find()
+                    ->where(['admin_id' => $this->id])
+                    ->andWhere(['>=', 'date', $today])
+                    ->orderBy(['date' => SORT_DESC])
+                    ->one();
+
+                if (!empty($existingPayment)) {
+                    // Обновляем существующую запись
+                    $existingPayment->monthly_salary = $employeePosition->salary;
+                    $existingPayment->save(false);
+                } else {
+                    // Если нет записи на сегодня, создаем новую
+                    $latestPayment = EmployeePayment::find()
+                        ->where(['admin_id' => $this->id])
+                        ->orderBy(['date' => SORT_DESC])
+                        ->one();
+
+                    if (!empty($latestPayment)) {
+                        // Берем daily_payment из последней записи
+                        $newPayment = new EmployeePayment();
+                        $newPayment->admin_id = $this->id;
+                        $newPayment->monthly_salary = $employeePosition->salary;
+                        $newPayment->daily_payment = $latestPayment->daily_payment ?? 0;
+                        $newPayment->date = $today;
+                        $newPayment->save(false);
+                    } else {
+                        // Если записей нет вообще, создаем с нулевым daily_payment
+                        $newPayment = new EmployeePayment();
+                        $newPayment->admin_id = $this->id;
+                        $newPayment->monthly_salary = $employeePosition->salary;
+                        $newPayment->daily_payment = 0;
+                        $newPayment->date = $today;
+                        $newPayment->save(false);
+                    }
+                }
+            }
+        }
+    }
+
 }
\ No newline at end of file
index 31d47c2887e7d03139214cd0fa9d312e3f342913..d9a2874ee7d6003e12baec336bfca285adeb6bd0 100755 (executable)
@@ -6,6 +6,7 @@ use Yii;
 use yii\helpers\ArrayHelper;
 use yii\behaviors\TimestampBehavior;
 use yii\behaviors\BlameableBehavior;
+use yii_app\records\EmployeePayment;
 
 /**
  * This is the model class for table "employee_position".
@@ -112,4 +113,79 @@ class EmployeePosition extends \yii\db\ActiveRecord
     public function getAdminGroup() {
         return $this->hasOne(\yii_app\records\AdminGroup::class, ['id' => 'group_id']);
     }
+
+    /**
+     * Синхронизирует зарплату из employee_position в employee_payment для всех администраторов с этой должностью
+     * @return void
+     */
+    public function syncSalaryToEmployeePayments(): void
+    {
+        if (empty($this->salary)) {
+            return;
+        }
+
+        // Находим всех администраторов с этой должностью
+        $adminsWithPosition = Admin::find()
+            ->select(['id'])
+            ->where(['employee_position_id' => $this->id])
+            ->column();
+
+        if (empty($adminsWithPosition)) {
+            return;
+        }
+
+        // Обновляем или создаем записи в employee_payment для каждого администратора
+        $today = date('Y-m-d');
+        foreach ($adminsWithPosition as $adminId) {
+            // Проверяем, есть ли уже запись на сегодня или позже
+            $existingPayment = EmployeePayment::find()
+                ->where(['admin_id' => $adminId])
+                ->andWhere(['>=', 'date', $today])
+                ->orderBy(['date' => SORT_DESC])
+                ->one();
+
+            if (!empty($existingPayment)) {
+                // Обновляем существующую запись
+                $existingPayment->monthly_salary = $this->salary;
+                $existingPayment->save(false);
+            } else {
+                // Если нет записи на сегодня, создаем новую
+                $latestPayment = EmployeePayment::find()
+                    ->where(['admin_id' => $adminId])
+                    ->orderBy(['date' => SORT_DESC])
+                    ->one();
+
+                if (!empty($latestPayment)) {
+                    // Берем daily_payment из последней записи
+                    $newPayment = new EmployeePayment();
+                    $newPayment->admin_id = $adminId;
+                    $newPayment->monthly_salary = $this->salary;
+                    $newPayment->daily_payment = $latestPayment->daily_payment ?? 0;
+                    $newPayment->date = $today;
+                    $newPayment->save(false);
+                } else {
+                    // Если записей нет вообще, создаем с нулевым daily_payment
+                    $newPayment = new EmployeePayment();
+                    $newPayment->admin_id = $adminId;
+                    $newPayment->monthly_salary = $this->salary;
+                    $newPayment->daily_payment = 0;
+                    $newPayment->date = $today;
+                    $newPayment->save(false);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function afterSave($insert, $changedAttributes)
+    {
+        parent::afterSave($insert, $changedAttributes);
+
+        // Если изменилась зарплата, синхронизируем для всех администраторов
+        if (array_key_exists('salary', $changedAttributes) || $insert) {
+            $this->syncSalaryToEmployeePayments();
+        }
+    }
 }