From 0348398be05d60de06c48e96f42fae7591868138 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Sat, 1 Nov 2025 09:04:30 +0300 Subject: [PATCH] =?utf8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8?= =?utf8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=BA=D0=BB=D0=B0=D0=B4?= =?utf8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/records/Admin.php | 55 +++++++++++++++++++++ erp24/records/EmployeePosition.php | 76 ++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+) diff --git a/erp24/records/Admin.php b/erp24/records/Admin.php index 10cc37e4..940cee39 100755 --- a/erp24/records/Admin.php +++ b/erp24/records/Admin.php @@ -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 diff --git a/erp24/records/EmployeePosition.php b/erp24/records/EmployeePosition.php index 31d47c28..d9a2874e 100755 --- a/erp24/records/EmployeePosition.php +++ b/erp24/records/EmployeePosition.php @@ -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(); + } + } } -- 2.39.5