]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
erp-468 add service
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 2 Oct 2025 21:14:51 +0000 (00:14 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 2 Oct 2025 21:14:51 +0000 (00:14 +0300)
erp24/services/SelfCostProductDinamicService.php [new file with mode: 0644]

diff --git a/erp24/services/SelfCostProductDinamicService.php b/erp24/services/SelfCostProductDinamicService.php
new file mode 100644 (file)
index 0000000..5d4f221
--- /dev/null
@@ -0,0 +1,210 @@
+<?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();
+                }
+            }
+        }
+    }
+   
+
+
+}