]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Пересечение и объединение
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 11 Sep 2025 09:32:00 +0000 (12:32 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 11 Sep 2025 09:32:00 +0000 (12:32 +0300)
erp24/web/js/matrix-bouquet-actuality/index.js

index c0220c859a3687d7463f58c60c74a704992e511b..e010a4a7b020f08bf70abe22ddc0f169874e9cac 100644 (file)
 
     filterSubgroups();
 
+    function checkIntervalsForBouquetId(id) {
+        // Собираем все интервалы для товара (всех строк)
+        let intervals = [];
+        $('#actuality-form table tbody tr').each(function(){
+            let $row = $(this);
+            let rowGuid = $row.find('input[type=hidden][name*="[bouquet_id]"]').val();
+            if (rowGuid == id) {
+                let from = $row.find('select.from-month').val();
+                let to   = $row.find('select.to-month').val();
+                if (from && to) intervals.push({from, to, $row});
+            }
+        });
+        intervals.sort((a,b) => a.from.localeCompare(b.from));
+
+        let hasOverlap = false;
+        for(let i=0; i<intervals.length; ++i) {
+            for(let j=i+1; j<intervals.length; ++j) {
+                if (intervals[i].to >= intervals[j].from) {
+                    // Пересечение!
+                    intervals[i].$row.addClass('table-danger');
+                    intervals[j].$row.addClass('table-danger');
+                    hasOverlap = true;
+                }
+            }
+        }
+        if (hasOverlap) {
+            if (!$('.interval-overlap-alert').length) {
+                $('<div class="alert alert-warning interval-overlap-alert mt-2">Пересекающиеся диапазоны по одному товару!</div>')
+                    .insertBefore('#actuality-form');
+            }
+        } else {
+            $('.interval-overlap-alert').remove();
+            $('#actuality-form table tbody tr').removeClass('table-danger');
+        }
+        return hasOverlap;
+    }
     $(document).on('change', '.from-month, .to-month', function(){
         let $row = $(this).closest('tr');
-        let guid = $row.find('input[type=hidden][name*="[guid]"]').val();
-        checkIntervalsForGuid(guid);
+        let id = $row.find('input[type=hidden][name*="[bouquet_id]"]').val();
+        checkIntervalsForBouquetId(id);
     });
 
     function ymParse(ym) {
         const newRow = `
             <tr class="table-info">
                 <td style="min-width:150px;">
-                    <div class="d-flex justify-content-between">${name} (${id}) <div class="text-danger mx-5">Новая запись. Заполните интервал</div></div>
+                    <div class="d-flex justify-content-between">${name} (${guid}) <div class="text-danger mx-5">Новая запись. Заполните интервал</div></div>
                 </td>
                 <td style="text-align:center;">
                     <div class="d-flex justify-content-between">${price}</div>