--- /dev/null
+<?php
+
+namespace yii_app\services;
+
+use yii_app\records\SelfCostProductDynamic;
+
+class SelfCostProductDinamicService
+{
+
+ public static function PrepareResult($selfCostProduct):array
+ {
+ $result = [];
+
+ foreach ($selfCostProduct as $row) {
+ $dates = array_map('trim', explode(',', $row['dates']));
+ sort($dates); // сортировка дат на всякий случай
+
+ $start = null;
+ $prev = null;
+
+ foreach ($dates as $date) {
+ if ($start === null) {
+ // начало интервала
+ $start = $date;
+ $prev = $date;
+ } else {
+ // проверим, что дата идёт на следующий день за предыдущей
+ $expectedNext = date('Y-m-d', strtotime($prev . ' +1 day'));
+ if ($date === $expectedNext) {
+ // продолжаем интервал
+ $prev = $date;
+ } else {
+ // закрываем интервал
+ $result[] = [
+ 'product_guid' => $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();
+ }
+ }
+ }
+ }
+
+
+
+}