+
+ /**
+ * Проверяет, что у сотрудника была смена должности в рамках периода
+ * Если смена была, то считает зп по дням, по каждой должности что были
+ *
+ * @param $dateFrom string
+ * @param $dateTo string
+ * @param $adminId int|string
+ * @return array
+ */
+ private function getChangingSalary($dateFrom, $dateTo, $adminId)
+ {
+ $summary_salary = 0;
+ $error = '';
+ $positions_history = [];
+
+ // https://erp.erp-flowers.ru/crud/employee-payment/
+ // если дата > месяца, то убирать кнопку редактирования
+
+ // Проверяем наличие перехода в admin_dynamic
+ $positions = AdminDynamic::find()->where(['admin_id' => $adminId])->where(['category_id' => 1])
+ ->where(['or', ['between', 'date_to', $dateFrom, $dateTo],['between', 'date_from', $dateFrom, $dateTo]])->asArray()->all();
+ echo $adminId . '<br><pre>' . print_r($positions, true) . '</pre>';
+echo $dateFrom;
+echo $dateTo;
+ if (count($positions)) {
+ // разбиваем период по дням, способ не самый быстрый, но лучший для подсчета
+ $date_list = $this->period_explode($dateFrom, $dateTo);
+ foreach ($date_list as $date) {
+ // проверяем, что в этот день у сотрудника была смена
+ $shift = Timetable::find()->where(['admin_id' => $adminId])->where(['date' => $date])->asArray()->one();
+ if ($shift) {
+ // если была, то смотрим его ставку за день
+ // берем ближайшую запись
+ $daily_payment = EmployeePayment::find()
+ ->where(['admin_id' => $adminId])->where(['<=', 'date', $date])
+ ->orderBy(['date' => SORT_DESC])->asArray()->one();
+ if ($daily_payment) {
+ foreach ($positions as $position) {
+ if ($position['date_from'] <= $date && $position['date_to'] >= $date) {
+ $group = AdminGroup::find()->where(['id' =>$position['value_id']]);
+ $positions_history[] = [
+ 'date' => $date,
+
+ ];
+ }
+ }
+ // плюсуем к общей зп
+ $summary_salary += $daily_payment['daily_payment'];
+ } else {
+ $error = 'По одной из должностей сотрудника не был найден оклад';
+ }
+ }
+ }
+ }
+
+ return [$summary_salary, $error];
+ }
+
+ /**
+ * Разбивает период дат по дням
+ *
+ * @param $dateFrom string
+ * @param $dateTo string
+ * @return array
+ */
+ private function period_explode($dateFrom, $dateTo)
+ {
+ $dates_array = [];
+ $dates_array[] = $dateFrom;
+ $dateFrom = DateTime::createFromFormat('Y-m-d', $dateFrom);
+ $dateTo = DateTime::createFromFormat('Y-m-d', $dateTo);
+
+ while ($dateFrom->getTimestamp() <= $dateTo->getTimestamp()) {
+ $dateFrom->modify('+1 day');
+ $dates_array[] = $dateFrom->format('Y-m-d');
+ }
+
+ return $dates_array;
+ }
+