From 22b7c5981294dcf5573c4f23b92a7f3010f5e98c Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 24 Oct 2023 09:23:03 +0200
Subject: [PATCH] refs #6335 feat(ticketAdvance): add zone field

---
 .../234003/00-ticket_canAdvance_zone.sql      | 132 ++++++++++++++++++
 .../back/methods/ticket/getTicketsAdvance.js  |  15 +-
 modules/ticket/front/advance/index.html       |   4 +
 modules/ticket/front/advance/index.js         |  44 +++---
 4 files changed, 159 insertions(+), 36 deletions(-)
 create mode 100644 db/changes/234003/00-ticket_canAdvance_zone.sql

diff --git a/db/changes/234003/00-ticket_canAdvance_zone.sql b/db/changes/234003/00-ticket_canAdvance_zone.sql
new file mode 100644
index 0000000000..c11cdc49ad
--- /dev/null
+++ b/db/changes/234003/00-ticket_canAdvance_zone.sql
@@ -0,0 +1,132 @@
+DELIMITER $$
+$$
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
+BEGIN
+/**
+ * Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
+ *
+ * @param vDateFuture Fecha de los tickets que se quieren adelantar.
+ * @param vDateToAdvance Fecha a cuando se quiere adelantar.
+ * @param vWarehouseFk Almacén
+ */
+	DECLARE vDateInventory DATE;
+
+	SELECT inventoried INTO vDateInventory FROM config;
+
+	DROP TEMPORARY TABLE IF EXISTS tmp.stock;
+	CREATE TEMPORARY TABLE tmp.stock
+		(itemFk INT PRIMARY KEY,
+		amount INT)
+		ENGINE = MEMORY;
+
+	INSERT INTO tmp.stock(itemFk, amount)
+		SELECT itemFk, SUM(quantity) amount FROM
+		(
+			SELECT itemFk, quantity
+				FROM itemTicketOut
+				WHERE shipped >= vDateInventory
+					AND shipped < vDateFuture
+					AND warehouseFk = vWarehouseFk
+			UNION ALL
+			SELECT itemFk, quantity
+				FROM itemEntryIn
+				WHERE landed >= vDateInventory
+					AND landed < vDateFuture
+					AND isVirtualStock = FALSE
+					AND warehouseInFk = vWarehouseFk
+			UNION ALL
+			SELECT itemFk, quantity
+				FROM itemEntryOut
+				WHERE shipped >= vDateInventory
+					AND shipped < vDateFuture
+					AND warehouseOutFk = vWarehouseFk
+		) t
+		GROUP BY itemFk HAVING amount != 0;
+
+	CREATE OR REPLACE TEMPORARY TABLE tmp.filter
+		(INDEX (id))
+		SELECT
+				origin.ticketFk futureId,
+				dest.ticketFk id,
+				dest.state,
+				origin.futureState,
+				origin.futureIpt,
+				dest.ipt,
+				origin.workerFk,
+				origin.futureLiters,
+				origin.futureLines,
+				dest.shipped,
+				origin.shipped futureShipped,
+				dest.totalWithVat,
+				origin.totalWithVat futureTotalWithVat,
+				dest.agency,
+				origin.futureAgency,
+				dest.lines,
+				dest.liters,
+				origin.futureLines - origin.hasStock AS notMovableLines,
+				(origin.futureLines = origin.hasStock) AS isFullMovable,
+                origin.futureZoneFk,
+                origin.futureZoneName,
+				origin.classColor futureClassColor,
+				dest.classColor
+			FROM (
+					SELECT
+							s.ticketFk,
+							t.workerFk,
+							t.shipped,
+							t.totalWithVat,
+							st.name futureState,
+							t.addressFk,
+							am.name futureAgency,
+							count(s.id) futureLines,
+							GROUP_CONCAT(DISTINCT ipt.code  ORDER BY ipt.code) futureIpt,
+							CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
+							SUM((s.quantity <= IFNULL(st.amount,0))) hasStock,
+							z.id futureZoneFk,
+							z.name futureZoneName,
+							st.classColor
+						FROM ticket t
+							JOIN sale s ON s.ticketFk = t.id
+							JOIN saleVolume sv ON sv.saleFk = s.id
+							JOIN item i ON i.id = s.itemFk
+							JOIN ticketState ts ON ts.ticketFk = t.id
+							JOIN state st ON st.id = ts.stateFk
+							JOIN agencyMode am ON t.agencyModeFk = am.id
+                            JOIN zone z ON t.zoneFk = z.id
+							LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
+							LEFT JOIN tmp.stock st ON st.itemFk = i.id
+						WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
+							AND t.warehouseFk = vWarehouseFk
+						GROUP BY t.id
+				) origin
+				JOIN (
+					SELECT
+							t.id ticketFk,
+							t.addressFk,
+							st.name state,
+							GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
+							t.shipped,
+							t.totalWithVat,
+							am.name agency,
+							CAST(SUM(litros) AS DECIMAL(10,0)) liters,
+							CAST(COUNT(*) AS DECIMAL(10,0)) `lines`,
+							st.classColor
+						FROM ticket t
+							JOIN sale s ON s.ticketFk = t.id
+							JOIN saleVolume sv ON sv.saleFk = s.id
+							JOIN item i ON i.id = s.itemFk
+							JOIN ticketState ts ON ts.ticketFk = t.id
+							JOIN state st ON st.id = ts.stateFk
+							JOIN agencyMode am ON t.agencyModeFk = am.id
+							LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
+						WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
+							AND t.warehouseFk = vWarehouseFk
+							AND st.order <= 5
+						GROUP BY t.id
+				) dest ON dest.addressFk = origin.addressFk
+			WHERE origin.hasStock != 0;
+
+	DROP TEMPORARY TABLE tmp.stock;
+END$$
+DELIMITER ;
+
diff --git a/modules/ticket/back/methods/ticket/getTicketsAdvance.js b/modules/ticket/back/methods/ticket/getTicketsAdvance.js
index ec9314db2b..ab40b95599 100644
--- a/modules/ticket/back/methods/ticket/getTicketsAdvance.js
+++ b/modules/ticket/back/methods/ticket/getTicketsAdvance.js
@@ -28,32 +28,27 @@ module.exports = Self => {
             {
                 arg: 'ipt',
                 type: 'string',
-                description: 'Origin Item Packaging Type',
-                required: false
+                description: 'Origin Item Packaging Type'
             },
             {
                 arg: 'futureIpt',
                 type: 'string',
-                description: 'Destination Item Packaging Type',
-                required: false
+                description: 'Destination Item Packaging Type'
             },
             {
                 arg: 'id',
                 type: 'number',
-                description: 'Origin id',
-                required: false
+                description: 'Origin id'
             },
             {
                 arg: 'futureId',
                 type: 'number',
-                description: 'Destination id',
-                required: false
+                description: 'Destination id'
             },
             {
                 arg: 'isFullMovable',
                 type: 'boolean',
-                description: 'True when lines and stock of origin are equal',
-                required: false
+                description: 'True when lines and stock of origin are equal'
             },
             {
                 arg: 'filter',
diff --git a/modules/ticket/front/advance/index.html b/modules/ticket/front/advance/index.html
index e6f16c9651..a6cf8facea 100644
--- a/modules/ticket/front/advance/index.html
+++ b/modules/ticket/front/advance/index.html
@@ -81,6 +81,9 @@
                         <th field="futureLiters">
                             <span translate>Liters</span>
                         </th>
+                        <th field="futureZoneFk">
+                            <span translate>Zone</span>
+                        </th>
                         <th field="notMovableLines">
                             <span translate>Not Movable</span>
                         </th>
@@ -155,6 +158,7 @@
                             </span>
                         </td>
                         <td>{{::ticket.futureLiters | dashIfEmpty}}</td>
+                        <td>{{::ticket.futureZoneName | dashIfEmpty}}</td>
                         <td>{{::ticket.notMovableLines | dashIfEmpty}}</td>
                         <td>{{::ticket.futureLines | dashIfEmpty}}</td>
                         <td>
diff --git a/modules/ticket/front/advance/index.js b/modules/ticket/front/advance/index.js
index 6f8a92ebe2..389bcdf14a 100644
--- a/modules/ticket/front/advance/index.js
+++ b/modules/ticket/front/advance/index.js
@@ -15,28 +15,22 @@ export default class Controller extends Section {
                 {
                     field: 'state',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'futureState',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'totalWithVat',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'futureTotalWithVat',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'shipped',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'futureShipped',
                     searchable: false
-                },
-                {
+                }, {
                     field: 'ipt',
                     autocomplete: {
                         url: 'ItemPackingTypes',
@@ -44,8 +38,7 @@ export default class Controller extends Section {
                         showField: 'description',
                         valueField: 'code'
                     }
-                },
-                {
+                }, {
                     field: 'futureIpt',
                     autocomplete: {
                         url: 'ItemPackingTypes',
@@ -53,6 +46,11 @@ export default class Controller extends Section {
                         showField: 'description',
                         valueField: 'code'
                     }
+                }, {
+                    field: 'futureZoneFk',
+                    autocomplete: {
+                        url: 'Zones',
+                    }
                 },
             ]
         };
@@ -158,27 +156,21 @@ export default class Controller extends Section {
     exprBuilder(param, value) {
         switch (param) {
         case 'id':
-            return {'id': value};
         case 'futureId':
-            return {'futureId': value};
         case 'liters':
-            return {'liters': value};
         case 'futureLiters':
-            return {'futureLiters': value};
         case 'lines':
-            return {'lines': value};
         case 'futureLines':
-            return {'futureLines': value};
+        case 'totalWithVat':
+        case 'futureTotalWithVat':
+        case 'futureZone':
+        case 'notMovableLines':
+        case 'futureZoneFk':
+            return {[param]: value};
         case 'ipt':
             return {'ipt': {like: `%${value}%`}};
         case 'futureIpt':
             return {'futureIpt': {like: `%${value}%`}};
-        case 'totalWithVat':
-            return {'totalWithVat': value};
-        case 'futureTotalWithVat':
-            return {'futureTotalWithVat': value};
-        case 'notMovableLines':
-            return {'notMovableLines': value};
         }
     }
 }
-- 
2.40.1