From: Aleksey Filippov Date: Thu, 2 Oct 2025 21:14:51 +0000 (+0300) Subject: erp-468 add service X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=52f5589a9cf34efc756da41d77630e6dcc072895;p=erp24_rep%2Fyii-erp24%2F.git erp-468 add service --- diff --git a/erp24/services/SelfCostProductDinamicService.php b/erp24/services/SelfCostProductDinamicService.php new file mode 100644 index 00000000..5d4f2212 --- /dev/null +++ b/erp24/services/SelfCostProductDinamicService.php @@ -0,0 +1,210 @@ + $row['product_guid'], + 'store_id' => $row['store_id'], + 'price' => $row['price'], + 'date_from' => $start, + 'date_to' => $prev, + ]; + // новый интервал + $start = $date; + $prev = $date; + } + } + } + + // закрываем последний интервал + if ($start !== null) { + $result[] = [ + 'product_guid' => $row['product_guid'], + 'store_id' => $row['store_id'], + 'price' => $row['price'], + 'date_from' => $start, + 'date_to' => $prev, + ]; + } + } + + // Вывод + return($result); + } + + public static function SaveResult($selfCostProduct) + { + foreach ($selfCostProduct as $row) { + // Ищем существующие записи с теми же параметрами (product_guid, store_id, price) + $existingRecord = SelfCostProductDynamic::find() + ->where([ + 'product_guid' => $row['product_guid'], + 'store_id' => $row['store_id'], + 'price' => $row['price'] + ]) + ->one(); + + if (!empty($existingRecord)) { + // Запись найдена - проверяем пересечение или примыкание интервалов + $existingDateFrom = strtotime($existingRecord->date_from); + $existingDateTo = strtotime($existingRecord->date_to); + $newDateFrom = strtotime($row['date_from']); + $newDateTo = strtotime($row['date_to']); + + // Проверяем, примыкают ли интервалы (разница <= 1 день) или пересекаются + $daysBetween = min( + abs($newDateFrom - $existingDateTo) / 86400, + abs($existingDateFrom - $newDateTo) / 86400 + ); + + if ($daysBetween <= 1 || + ($newDateFrom <= $existingDateTo && $newDateTo >= $existingDateFrom)) { + // Вычисляем новые границы интервала + $newCalculatedDateFrom = date('Y-m-d', min($existingDateFrom, $newDateFrom)); + $newCalculatedDateTo = date('Y-m-d', max($existingDateTo, $newDateTo)); + + // Проверяем, изменились ли даты + if ($existingRecord->date_from !== $newCalculatedDateFrom || + $existingRecord->date_to !== $newCalculatedDateTo) { + // Расширяем интервал только если данные изменились + $existingRecord->date_from = $newCalculatedDateFrom; + $existingRecord->date_to = $newCalculatedDateTo; + $existingRecord->updated_at = date('Y-m-d H:i:s'); + + if ($existingRecord->validate()) { + $existingRecord->save(); + } + } + } else { + // Интервалы не примыкают - создаем новую запись + $rowSelfCost = new SelfCostProductDynamic(); + $rowSelfCost->product_guid = $row['product_guid']; + $rowSelfCost->store_id = $row['store_id']; + $rowSelfCost->price = $row['price']; + $rowSelfCost->date_from = $row['date_from']; + $rowSelfCost->date_to = $row['date_to']; + $rowSelfCost->updated_at = date('Y-m-d H:i:s'); + + if ($rowSelfCost->validate()) { + $rowSelfCost->save(); + } + } + } else { + // Записи нет - создаем новую + $rowSelfCost = new SelfCostProductDynamic(); + $rowSelfCost->product_guid = $row['product_guid']; + $rowSelfCost->store_id = $row['store_id']; + $rowSelfCost->price = $row['price']; + $rowSelfCost->date_from = $row['date_from']; + $rowSelfCost->date_to = $row['date_to']; + $rowSelfCost->updated_at = date('Y-m-d H:i:s'); + + if ($rowSelfCost->validate()) { + $rowSelfCost->save(); + } + } + } + } + + public static function UpdateResult($values) + { + foreach ($values as $row) { + // Ищем существующие записи с теми же параметрами (product_guid, store_id, price) + $existingRecord = SelfCostProductDynamic::find() + ->where([ + 'product_guid' => $row['product_guid'], + 'store_id' => $row['store_id'], + 'price' => $row['price'] + ]) + ->one(); + + if (!empty($existingRecord)) { + // Запись найдена - проверяем, примыкает ли новая дата к интервалу + $existingDateFrom = strtotime($existingRecord->date_from); + $existingDateTo = strtotime($existingRecord->date_to); + $newDate = strtotime($row['date']); + + // Проверяем, примыкает ли новая дата (±1 день от границ интервала) + $dayBeforeDateFrom = strtotime('-1 day', $existingDateFrom); + $dayAfterDateTo = strtotime('+1 day', $existingDateTo); + + if ($newDate >= $dayBeforeDateFrom && $newDate <= $dayAfterDateTo) { + // Новая дата примыкает к интервалу или находится внутри него + $newCalculatedDateFrom = date('Y-m-d', min($existingDateFrom, $newDate)); + $newCalculatedDateTo = date('Y-m-d', max($existingDateTo, $newDate)); + + // Проверяем, изменились ли даты + if ($existingRecord->date_from !== $newCalculatedDateFrom || + $existingRecord->date_to !== $newCalculatedDateTo) { + // Расширяем интервал только если данные изменились + $existingRecord->date_from = $newCalculatedDateFrom; + $existingRecord->date_to = $newCalculatedDateTo; + $existingRecord->updated_at = $row['updated_at']; + + if ($existingRecord->validate()) { + $existingRecord->save(); + } + } + } else { + // Дата не примыкает к интервалу - создаем новую запись + $newRecord = new SelfCostProductDynamic(); + $newRecord->product_guid = $row['product_guid']; + $newRecord->store_id = $row['store_id']; + $newRecord->price = $row['price']; + $newRecord->date_from = $row['date']; + $newRecord->date_to = $row['date']; + $newRecord->updated_at = $row['updated_at']; + + if ($newRecord->validate()) { + $newRecord->save(); + } + } + } else { + // Записи нет - создаем новую + $newRecord = new SelfCostProductDynamic(); + $newRecord->product_guid = $row['product_guid']; + $newRecord->store_id = $row['store_id']; + $newRecord->price = $row['price']; + $newRecord->date_from = $row['date']; + $newRecord->date_to = $row['date']; + $newRecord->updated_at = $row['updated_at']; + + if ($newRecord->validate()) { + $newRecord->save(); + } + } + } + } + + + +}