From 1d95c17a0b520a0a8b6387022408610066efc8c1 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 09:23:59 +0100 Subject: [PATCH 001/183] refs #5858 feat: remove row from bs.nightTask --- db/changes/234901/04-remove-procedure-bs_nightTask.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/changes/234901/04-remove-procedure-bs_nightTask.sql diff --git a/db/changes/234901/04-remove-procedure-bs_nightTask.sql b/db/changes/234901/04-remove-procedure-bs_nightTask.sql new file mode 100644 index 000000000..530dc6ef5 --- /dev/null +++ b/db/changes/234901/04-remove-procedure-bs_nightTask.sql @@ -0,0 +1,2 @@ +DELETE FROM bs.nightTask + WHERE `procedure` ='zone_getCollisions'; From 50cb7964d9ad12d877ae6c0cd233788d9d84e313 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 09:24:45 +0100 Subject: [PATCH 002/183] ref #5858 feat: drp zone_getCollisions procedure --- db/changes/234901/05-drop-procedure-zone_getCollisions.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 db/changes/234901/05-drop-procedure-zone_getCollisions.sql diff --git a/db/changes/234901/05-drop-procedure-zone_getCollisions.sql b/db/changes/234901/05-drop-procedure-zone_getCollisions.sql new file mode 100644 index 000000000..9d0db5465 --- /dev/null +++ b/db/changes/234901/05-drop-procedure-zone_getCollisions.sql @@ -0,0 +1 @@ +DROP PROCEDURE vn.zone_getCollisions; From 1b60cd33d5bf137e762480776cb14a0cfaab29b3 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 09:25:35 +0100 Subject: [PATCH 003/183] ref #5858 feat: notification template --- .../email/zone-included/assets/css/import.js | 11 ++++++++ .../email/zone-included/locale/es.yml | 2 ++ .../email/zone-included/sql/zoneIncluded.sql | 5 ++++ .../email/zone-included/zone-included.html | 8 ++++++ .../email/zone-included/zone-included.js | 27 +++++++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 print/templates/email/zone-included/assets/css/import.js create mode 100644 print/templates/email/zone-included/locale/es.yml create mode 100644 print/templates/email/zone-included/sql/zoneIncluded.sql create mode 100644 print/templates/email/zone-included/zone-included.html create mode 100755 print/templates/email/zone-included/zone-included.js diff --git a/print/templates/email/zone-included/assets/css/import.js b/print/templates/email/zone-included/assets/css/import.js new file mode 100644 index 000000000..4b4bb7086 --- /dev/null +++ b/print/templates/email/zone-included/assets/css/import.js @@ -0,0 +1,11 @@ +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); + +module.exports = new Stylesheet([ + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/email.css`]) + .mergeStyles(); diff --git a/print/templates/email/zone-included/locale/es.yml b/print/templates/email/zone-included/locale/es.yml new file mode 100644 index 000000000..2e954840d --- /dev/null +++ b/print/templates/email/zone-included/locale/es.yml @@ -0,0 +1,2 @@ +subject: Colisión de zona detectada +title: "La zona {0} ha sido registrada en más de un sitio" diff --git a/print/templates/email/zone-included/sql/zoneIncluded.sql b/print/templates/email/zone-included/sql/zoneIncluded.sql new file mode 100644 index 000000000..eaf331232 --- /dev/null +++ b/print/templates/email/zone-included/sql/zoneIncluded.sql @@ -0,0 +1,5 @@ +SELECT + z.name +FROM vn.zoneIncluded zI + LEFT JOIN vn.zone z ON z.Id = zI.zoneFk +WHERE zI.id = ?; diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html new file mode 100644 index 000000000..fbb58334a --- /dev/null +++ b/print/templates/email/zone-included/zone-included.html @@ -0,0 +1,8 @@ + +
+
+

{{ $t('subject') }}

+

{{ $t('title', [this.zoneIncluded.name]) }}

+
+
+
diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js new file mode 100755 index 000000000..821d7c42a --- /dev/null +++ b/print/templates/email/zone-included/zone-included.js @@ -0,0 +1,27 @@ +const Component = require(`vn-print/core/component`); +const emailBody = new Component('email-body'); + +module.exports = { + name: 'zone-included', + async serverPrefetch() { + this.zoneIncluded = await this.fetchZoneIncluded(this.id); + }, + methods: { + fetchZoneIncluded(id) { + return this.findOneFromDef('zoneIncluded', [id]); + }, + }, + components: { + 'email-body': emailBody.build(), + }, + props: { + id: { + type: Number, + required: true + }, + url: { + type: String, + required: true + } + } +}; From f00b264daa9ee57d233d74d328cf7712c0c7a701 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 09:27:08 +0100 Subject: [PATCH 004/183] ref #5858 feat: dispatchers_after[Insert|Update|Delete] --- db/changes/234901/00-zoneIncluded_trigger.sql | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 db/changes/234901/00-zoneIncluded_trigger.sql diff --git a/db/changes/234901/00-zoneIncluded_trigger.sql b/db/changes/234901/00-zoneIncluded_trigger.sql new file mode 100644 index 000000000..b482d1747 --- /dev/null +++ b/db/changes/234901/00-zoneIncluded_trigger.sql @@ -0,0 +1,47 @@ +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterInsert`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterInsert` + AFTER INSERT ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'insert', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); +END$$ +DELIMITER ; + +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterUpdate`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterUpdate` + AFTER UPDATE ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'update', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); +END$$ +DELIMITER ; + +-- DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterDelete`; +-- USE `vn`; + +-- DELIMITER $$ +-- CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterDelete` +-- AFTER DELETE ON `zoneIncluded` +-- FOR EACH ROW +-- BEGIN +-- INSERT INTO zoneLog +-- SET `action` = 'delete', +-- `changedModel` = 'zoneIncluded', +-- `changedModelId` = OLD.zoneFk, +-- `userFk` = account.myUser_getId(); +-- END$$ +-- DELIMITER ; From f4a9e7b74e4e05d5f5ec7c993bd3143a628e9188 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 09:31:09 +0100 Subject: [PATCH 005/183] ref #5858 feat: create table zoneIncludedCheck --- .../234901/01-zoneIncluded_table_zoneincludedCheck.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql diff --git a/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql b/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql new file mode 100644 index 000000000..0fd19d4bf --- /dev/null +++ b/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql @@ -0,0 +1,7 @@ +CREATE TABLE `vn`.`zoneIncludedCheck` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `zoneFK` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY (`inclusion_FK`,`zoneFK`), + CONSTRAINT `inclusion_FK` FOREIGN KEY (`zoneFK`) REFERENCES `zoneIncluded` (`id`) ON UPDATE CASCADE, +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; From b453abdb3a615c11ea630f6930e5784024ebc67a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 Nov 2023 12:48:43 +0100 Subject: [PATCH 006/183] refs #5858 feat: new event in vn --- db/changes/234901/02-zoneIncluded_event_checkCollisions.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 db/changes/234901/02-zoneIncluded_event_checkCollisions.sql diff --git a/db/changes/234901/02-zoneIncluded_event_checkCollisions.sql b/db/changes/234901/02-zoneIncluded_event_checkCollisions.sql new file mode 100644 index 000000000..3a6dd32b8 --- /dev/null +++ b/db/changes/234901/02-zoneIncluded_event_checkCollisions.sql @@ -0,0 +1,5 @@ +USE vn; +CREATE EVENT zoneCollisionsCheck +ON SCHEDULE AT CURRENT_TIMESTAMP +DISABLE ON SLAVE +DO SELECT vn.zoneIncluded_checkCollisions; From a2329e12765d05040289c3fade90d9465bc11e88 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 23 Nov 2023 15:17:40 +0100 Subject: [PATCH 007/183] refs #5858 feat: update template notification --- print/templates/email/zone-included/locale/es.yml | 4 ++-- print/templates/email/zone-included/zone-included.html | 4 ++-- print/templates/email/zone-included/zone-included.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/print/templates/email/zone-included/locale/es.yml b/print/templates/email/zone-included/locale/es.yml index 2e954840d..5cf617ba3 100644 --- a/print/templates/email/zone-included/locale/es.yml +++ b/print/templates/email/zone-included/locale/es.yml @@ -1,2 +1,2 @@ -subject: Colisión de zona detectada -title: "La zona {0} ha sido registrada en más de un sitio" +subject: Colisión de zona {0} detectada +title: "La localización {0} ha sido registrada en más de un sitio" diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html index fbb58334a..eafa6513f 100644 --- a/print/templates/email/zone-included/zone-included.html +++ b/print/templates/email/zone-included/zone-included.html @@ -1,8 +1,8 @@
-

{{ $t('subject') }}

-

{{ $t('title', [this.zoneIncluded.name]) }}

+

{{ $t('subject', [zoneSelected]) }}

+

{{ $t('title', [geoSelected]) }}

diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index 821d7c42a..caac6cfd6 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -15,11 +15,11 @@ module.exports = { 'email-body': emailBody.build(), }, props: { - id: { - type: Number, + zoneSelected: { + type: String, required: true }, - url: { + geoSelected: { type: String, required: true } From 5d156e81ca87b155911cfd55752ddebaa3d80aed Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 23 Nov 2023 15:18:09 +0100 Subject: [PATCH 008/183] refs #5858 perf: move files to current version folder --- db/changes/234801/00-zoneIncluded_trigger.sql | 72 +++++++++++++++++++ ...1-zoneIncluded_table_zoneincludedCheck.sql | 14 ++++ .../02-zoneIncluded_event_checkCollisions.sql | 0 ...zoneIncluded_procedure_checkCollisions.sql | 30 ++++++++ .../04-remove-procedure-bs_nightTask.sql | 0 .../05-drop-procedure-zone_getCollisions.sql | 0 db/changes/234901/00-zoneIncluded_trigger.sql | 47 ------------ ...1-zoneIncluded_table_zoneincludedCheck.sql | 7 -- ...zoneIncluded_procedure_checkCollisions.sql | 14 ++++ 9 files changed, 130 insertions(+), 54 deletions(-) create mode 100644 db/changes/234801/00-zoneIncluded_trigger.sql create mode 100644 db/changes/234801/01-zoneIncluded_table_zoneincludedCheck.sql rename db/changes/{234901 => 234801}/02-zoneIncluded_event_checkCollisions.sql (100%) create mode 100644 db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql rename db/changes/{234901 => 234801}/04-remove-procedure-bs_nightTask.sql (100%) rename db/changes/{234901 => 234801}/05-drop-procedure-zone_getCollisions.sql (100%) delete mode 100644 db/changes/234901/00-zoneIncluded_trigger.sql delete mode 100644 db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql create mode 100644 db/dump/03-zoneIncluded_procedure_checkCollisions.sql diff --git a/db/changes/234801/00-zoneIncluded_trigger.sql b/db/changes/234801/00-zoneIncluded_trigger.sql new file mode 100644 index 000000000..521ca2601 --- /dev/null +++ b/db/changes/234801/00-zoneIncluded_trigger.sql @@ -0,0 +1,72 @@ +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterInsert`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterInsert` + AFTER INSERT ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'insert', + `changedModel` = 'zoneIncluded', + `changedModelId` = NEW.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'insert', + `zoneFk` = NEW.zoneFk, + `geoFk` = NEW.geoFk, + `userFk` = account.myUser_getId(); + CALL `vn`.`zoneIncluded_checkCollisions`(); +END$$ +DELIMITER ; + +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterUpdate`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterUpdate` + AFTER UPDATE ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'update', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'update', + `zoneFk` = NEW.zoneFk, + `geoFk` = NEW.geoFk, + `userFk` = account.myUser_getId(); + + CALL `vn`.`zoneIncluded_checkCollisions`(); + + +END$$ +DELIMITER ; + +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterDelete`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterDelete` + AFTER DELETE ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'delete', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'delete', + `zoneFk` = OLD.zoneFk, + `geoFk` = OLD.geoFk, + `userFk` = account.myUser_getId(); + + CALL `vn`.`zoneIncluded_checkCollisions`(); +END$$ +DELIMITER ; diff --git a/db/changes/234801/01-zoneIncluded_table_zoneincludedCheck.sql b/db/changes/234801/01-zoneIncluded_table_zoneincludedCheck.sql new file mode 100644 index 000000000..ba52f76b0 --- /dev/null +++ b/db/changes/234801/01-zoneIncluded_table_zoneincludedCheck.sql @@ -0,0 +1,14 @@ +CREATE TABLE `vn`.`zoneIncludedCheck` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `zoneFK` int(11) NOT NULL, + `geoFK` int(11) NOT NULL, + `userFK` int(10) unsigned NOT NULL, + `action`set('insert','update','delete') NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `user_FK` FOREIGN KEY (`userFK`) REFERENCES `account`.`user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `zone_FK` FOREIGN KEY (`zoneFK`) REFERENCES `vn`.`zone` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `geo_FK` FOREIGN KEY (`geoFK`) REFERENCES `vn`.`zoneGeo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + UNIQUE INDEX (`zoneFK`, `geoFK`, `userFK`, `action`) +) + +comment 'Table to save temporarily zone changes'; diff --git a/db/changes/234901/02-zoneIncluded_event_checkCollisions.sql b/db/changes/234801/02-zoneIncluded_event_checkCollisions.sql similarity index 100% rename from db/changes/234901/02-zoneIncluded_event_checkCollisions.sql rename to db/changes/234801/02-zoneIncluded_event_checkCollisions.sql diff --git a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql new file mode 100644 index 000000000..84d0e363f --- /dev/null +++ b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql @@ -0,0 +1,30 @@ +-- DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`(IN id INT) +BEGIN +DECLARE done INT DEFAULT 0; +DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; +DECLARE z_name VARCHAR(255); +DECLARE g_name VARCHAR(255); + +DECLARE my_cur CURSOR FOR + SELECT zic.id, z.name , zg.name , zic.geoFk ,zic.`action` , zic.userFK FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id ; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + +OPEN my_cur; + my_cur_loop: + LOOP FETCH my_cur INTO zic_id, z_name,g_name, zic_geo, zic_action, zic_userFk ; + IF done = 1 THEN + select concat('NO REDCORDS' ) AS '** DEBUG:'; + LEAVE my_cur_loop; + END IF; + SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_geo,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; + DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; + SELECT util.notification_send('zone-included', + JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), + account.myUser_getId() + ); + END LOOP my_cur_loop; +CLOSE my_cur; + + +END diff --git a/db/changes/234901/04-remove-procedure-bs_nightTask.sql b/db/changes/234801/04-remove-procedure-bs_nightTask.sql similarity index 100% rename from db/changes/234901/04-remove-procedure-bs_nightTask.sql rename to db/changes/234801/04-remove-procedure-bs_nightTask.sql diff --git a/db/changes/234901/05-drop-procedure-zone_getCollisions.sql b/db/changes/234801/05-drop-procedure-zone_getCollisions.sql similarity index 100% rename from db/changes/234901/05-drop-procedure-zone_getCollisions.sql rename to db/changes/234801/05-drop-procedure-zone_getCollisions.sql diff --git a/db/changes/234901/00-zoneIncluded_trigger.sql b/db/changes/234901/00-zoneIncluded_trigger.sql deleted file mode 100644 index b482d1747..000000000 --- a/db/changes/234901/00-zoneIncluded_trigger.sql +++ /dev/null @@ -1,47 +0,0 @@ -DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterInsert`; -USE `vn`; - -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterInsert` - AFTER INSERT ON `zoneIncluded` - FOR EACH ROW -BEGIN - INSERT INTO zoneLog - SET `action` = 'insert', - `changedModel` = 'zoneIncluded', - `changedModelId` = OLD.zoneFk, - `userFk` = account.myUser_getId(); -END$$ -DELIMITER ; - -DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterUpdate`; -USE `vn`; - -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterUpdate` - AFTER UPDATE ON `zoneIncluded` - FOR EACH ROW -BEGIN - INSERT INTO zoneLog - SET `action` = 'update', - `changedModel` = 'zoneIncluded', - `changedModelId` = OLD.zoneFk, - `userFk` = account.myUser_getId(); -END$$ -DELIMITER ; - --- DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterDelete`; --- USE `vn`; - --- DELIMITER $$ --- CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterDelete` --- AFTER DELETE ON `zoneIncluded` --- FOR EACH ROW --- BEGIN --- INSERT INTO zoneLog --- SET `action` = 'delete', --- `changedModel` = 'zoneIncluded', --- `changedModelId` = OLD.zoneFk, --- `userFk` = account.myUser_getId(); --- END$$ --- DELIMITER ; diff --git a/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql b/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql deleted file mode 100644 index 0fd19d4bf..000000000 --- a/db/changes/234901/01-zoneIncluded_table_zoneincludedCheck.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE `vn`.`zoneIncludedCheck` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `zoneFK` int(11) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY (`inclusion_FK`,`zoneFK`), - CONSTRAINT `inclusion_FK` FOREIGN KEY (`zoneFK`) REFERENCES `zoneIncluded` (`id`) ON UPDATE CASCADE, -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; diff --git a/db/dump/03-zoneIncluded_procedure_checkCollisions.sql b/db/dump/03-zoneIncluded_procedure_checkCollisions.sql new file mode 100644 index 000000000..540bec5ee --- /dev/null +++ b/db/dump/03-zoneIncluded_procedure_checkCollisions.sql @@ -0,0 +1,14 @@ +DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() +BEGIN + -- DROP TEMPORARY TABLE IF EXISTS tmp.toCheck; + DECLARE vZonesToCheck INT; + DECLARE vDone INT DEFAULT FALSE; + DECLARE vZoneFk INT; + DECLARE vCounter INT; + +END$$ +DELIMITER ; From 4383ebd7f1ad7f0430488f92ba4cd131a0e61e8f Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 24 Nov 2023 12:30:44 +0100 Subject: [PATCH 009/183] refs #5858 feat: email notification --- db/changes/234801/00-zoneIncluded_trigger.sql | 7 ++++--- .../03-zoneIncluded_procedure_checkCollisions.sql | 9 ++++++--- db/changes/234801/06-zoneincluded_notification.sql | 11 +++++++++++ .../methods/zone/specs/toggleIsIncluded.spec.js | 13 +++++++++++-- print/templates/email/zone-included/locale/es.yml | 4 ++-- .../email/zone-included/zone-included.html | 4 ++-- .../templates/email/zone-included/zone-included.js | 8 -------- 7 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 db/changes/234801/06-zoneincluded_notification.sql diff --git a/db/changes/234801/00-zoneIncluded_trigger.sql b/db/changes/234801/00-zoneIncluded_trigger.sql index 521ca2601..4de0416b7 100644 --- a/db/changes/234801/00-zoneIncluded_trigger.sql +++ b/db/changes/234801/00-zoneIncluded_trigger.sql @@ -17,7 +17,8 @@ BEGIN `zoneFk` = NEW.zoneFk, `geoFk` = NEW.geoFk, `userFk` = account.myUser_getId(); - CALL `vn`.`zoneIncluded_checkCollisions`(); + -- CALL `vn`.`zoneIncluded_checkCollisions`(NEW.zoneFk, NEW.geoFk); + END$$ DELIMITER ; @@ -41,7 +42,7 @@ BEGIN `geoFk` = NEW.geoFk, `userFk` = account.myUser_getId(); - CALL `vn`.`zoneIncluded_checkCollisions`(); + -- CALL `vn`.`zoneIncluded_checkCollisions`(); END$$ @@ -67,6 +68,6 @@ BEGIN `geoFk` = OLD.geoFk, `userFk` = account.myUser_getId(); - CALL `vn`.`zoneIncluded_checkCollisions`(); + -- CALL `vn`.`zoneIncluded_checkCollisions`(); END$$ DELIMITER ; diff --git a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql index 84d0e363f..ccfb8f3b8 100644 --- a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql +++ b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql @@ -1,5 +1,7 @@ --- DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; -CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`(IN id INT) +DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; +DELIMITER $$ + +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`(IN zi_zone INT, IN zi_geo INT) BEGIN DECLARE done INT DEFAULT 0; DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; @@ -27,4 +29,5 @@ OPEN my_cur; CLOSE my_cur; -END +END$$ +DELIMITER ; diff --git a/db/changes/234801/06-zoneincluded_notification.sql b/db/changes/234801/06-zoneincluded_notification.sql new file mode 100644 index 000000000..53b2a9189 --- /dev/null +++ b/db/changes/234801/06-zoneincluded_notification.sql @@ -0,0 +1,11 @@ +-- Auto-generated SQL script #202311241021 +INSERT INTO util.notification (name,description) + VALUES ('zone-included','An email to notify zoneCollisions'); + +-- Auto-generated SQL script #202311241051 +INSERT INTO util.notificationSubscription (notificationFk,userFk) + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included" + + +INSERT INTO util.notificationAcl (notificationFk,roleFk) + SELECT id, account.role FROM util.notification WHERE name= "zone-included" diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 746a2d0bd..3e72408cf 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,8 +1,9 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); - +let conn = null; describe('zone toggleIsIncluded()', () => { beforeAll(async() => { + conn = await models.Item.dataSource.connector; const activeCtx = { accessToken: {userId: 9}, http: { @@ -16,15 +17,23 @@ describe('zone toggleIsIncluded()', () => { }); }); - it('should return the created location with isIncluded true', async() => { + fit('should return the created location with isIncluded true', async() => { const tx = await models.Zone.beginTransaction({}); try { + let toCheck = await conn.executeStmt({sql: ' SELECT * FROM zoneIncludedCheck'}); + + expect(toCheck.length).toEqual(0); const options = {transaction: tx}; let result = await models.Zone.toggleIsIncluded(1, 20, true, options); expect(result.isIncluded).toBeTrue(); + toCheck = await conn.executeStmt({sql: ' SELECT * FROM zoneIncludedCheck'}); + + expect(toCheck.length).not.toEqual(1); + + await conn.executeStmt({sql: 'CALL vn.zoneIncluded_checkCollisions(?, ? )', params: [0, 0]}); await tx.rollback(); } catch (e) { diff --git a/print/templates/email/zone-included/locale/es.yml b/print/templates/email/zone-included/locale/es.yml index 5cf617ba3..57d257663 100644 --- a/print/templates/email/zone-included/locale/es.yml +++ b/print/templates/email/zone-included/locale/es.yml @@ -1,2 +1,2 @@ -subject: Colisión de zona {0} detectada -title: "La localización {0} ha sido registrada en más de un sitio" +subject: Colisión de zona detectada +title: "La zona {0} y localización {1} ha sido registrada en más de un sitio" diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html index eafa6513f..76f59e9f9 100644 --- a/print/templates/email/zone-included/zone-included.html +++ b/print/templates/email/zone-included/zone-included.html @@ -1,8 +1,8 @@
-

{{ $t('subject', [zoneSelected]) }}

-

{{ $t('title', [geoSelected]) }}

+

{{ $t('subject') }}

+

{{ $t('title', [zoneSelected,geoSelected]) }}

diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index caac6cfd6..6ed8964b1 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -3,14 +3,6 @@ const emailBody = new Component('email-body'); module.exports = { name: 'zone-included', - async serverPrefetch() { - this.zoneIncluded = await this.fetchZoneIncluded(this.id); - }, - methods: { - fetchZoneIncluded(id) { - return this.findOneFromDef('zoneIncluded', [id]); - }, - }, components: { 'email-body': emailBody.build(), }, From c40dc134f811cebef8a51ad16cb6928eeb423d66 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 29 Nov 2023 12:15:38 +0100 Subject: [PATCH 010/183] refs #5858 feat: sql files for new version --- .../234801/06-zoneincluded_notification.sql | 6 +- db/changes/234802/00-zoneIncluded_trigger.sql | 73 +++++++++++++++++++ ...1-zoneIncluded_table_zoneincludedCheck.sql | 14 ++++ .../02-zoneIncluded_event_checkCollisions.sql | 5 ++ ...zoneIncluded_procedure_checkCollisions.sql | 33 +++++++++ .../04-remove-procedure-bs_nightTask.sql | 2 + .../05-drop-procedure-zone_getCollisions.sql | 1 + .../234802/06-zoneincluded_notification.sql | 11 +++ .../email/zone-included/zone-included.html | 29 +++++++- .../email/zone-included/zone-included.js | 6 ++ 10 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 db/changes/234802/00-zoneIncluded_trigger.sql create mode 100644 db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql create mode 100644 db/changes/234802/02-zoneIncluded_event_checkCollisions.sql create mode 100644 db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql create mode 100644 db/changes/234802/04-remove-procedure-bs_nightTask.sql create mode 100644 db/changes/234802/05-drop-procedure-zone_getCollisions.sql create mode 100644 db/changes/234802/06-zoneincluded_notification.sql diff --git a/db/changes/234801/06-zoneincluded_notification.sql b/db/changes/234801/06-zoneincluded_notification.sql index 53b2a9189..3de713884 100644 --- a/db/changes/234801/06-zoneincluded_notification.sql +++ b/db/changes/234801/06-zoneincluded_notification.sql @@ -1,11 +1,9 @@ --- Auto-generated SQL script #202311241021 INSERT INTO util.notification (name,description) VALUES ('zone-included','An email to notify zoneCollisions'); --- Auto-generated SQL script #202311241051 INSERT INTO util.notificationSubscription (notificationFk,userFk) - SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included" + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; INSERT INTO util.notificationAcl (notificationFk,roleFk) - SELECT id, account.role FROM util.notification WHERE name= "zone-included" + SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/db/changes/234802/00-zoneIncluded_trigger.sql b/db/changes/234802/00-zoneIncluded_trigger.sql new file mode 100644 index 000000000..4de0416b7 --- /dev/null +++ b/db/changes/234802/00-zoneIncluded_trigger.sql @@ -0,0 +1,73 @@ +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterInsert`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterInsert` + AFTER INSERT ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'insert', + `changedModel` = 'zoneIncluded', + `changedModelId` = NEW.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'insert', + `zoneFk` = NEW.zoneFk, + `geoFk` = NEW.geoFk, + `userFk` = account.myUser_getId(); + -- CALL `vn`.`zoneIncluded_checkCollisions`(NEW.zoneFk, NEW.geoFk); + +END$$ +DELIMITER ; + +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterUpdate`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterUpdate` + AFTER UPDATE ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'update', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'update', + `zoneFk` = NEW.zoneFk, + `geoFk` = NEW.geoFk, + `userFk` = account.myUser_getId(); + + -- CALL `vn`.`zoneIncluded_checkCollisions`(); + + +END$$ +DELIMITER ; + +DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterDelete`; +USE `vn`; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterDelete` + AFTER DELETE ON `zoneIncluded` + FOR EACH ROW +BEGIN + INSERT INTO zoneLog + SET `action` = 'delete', + `changedModel` = 'zoneIncluded', + `changedModelId` = OLD.zoneFk, + `userFk` = account.myUser_getId(); + INSERT INTO zoneIncludedCheck + SET + `action`= 'delete', + `zoneFk` = OLD.zoneFk, + `geoFk` = OLD.geoFk, + `userFk` = account.myUser_getId(); + + -- CALL `vn`.`zoneIncluded_checkCollisions`(); +END$$ +DELIMITER ; diff --git a/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql b/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql new file mode 100644 index 000000000..ba52f76b0 --- /dev/null +++ b/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql @@ -0,0 +1,14 @@ +CREATE TABLE `vn`.`zoneIncludedCheck` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `zoneFK` int(11) NOT NULL, + `geoFK` int(11) NOT NULL, + `userFK` int(10) unsigned NOT NULL, + `action`set('insert','update','delete') NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `user_FK` FOREIGN KEY (`userFK`) REFERENCES `account`.`user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `zone_FK` FOREIGN KEY (`zoneFK`) REFERENCES `vn`.`zone` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `geo_FK` FOREIGN KEY (`geoFK`) REFERENCES `vn`.`zoneGeo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + UNIQUE INDEX (`zoneFK`, `geoFK`, `userFK`, `action`) +) + +comment 'Table to save temporarily zone changes'; diff --git a/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql b/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql new file mode 100644 index 000000000..3a6dd32b8 --- /dev/null +++ b/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql @@ -0,0 +1,5 @@ +USE vn; +CREATE EVENT zoneCollisionsCheck +ON SCHEDULE AT CURRENT_TIMESTAMP +DISABLE ON SLAVE +DO SELECT vn.zoneIncluded_checkCollisions; diff --git a/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql new file mode 100644 index 000000000..8959b3945 --- /dev/null +++ b/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql @@ -0,0 +1,33 @@ +DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; +DELIMITER $$ + +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() +BEGIN +DECLARE done INT DEFAULT 0; +DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; +DECLARE z_name VARCHAR(255); +DECLARE g_name VARCHAR(255); + +DECLARE my_cur CURSOR FOR + SELECT zic.id, z.name , zg.name , zic.geoFk ,zic.`action` , zic.userFK FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id ; +DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + +OPEN my_cur; + my_cur_loop: + LOOP FETCH my_cur INTO zic_id, z_name,g_name, zic_geo, zic_action, zic_userFk ; + IF done = 1 THEN + select concat('NO REDCORDS' ) AS '** DEBUG:'; + LEAVE my_cur_loop; + END IF; + SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_geo,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; + DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; + SELECT util.notification_send('zone-included', + JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), + account.myUser_getId() + ); + END LOOP my_cur_loop; +CLOSE my_cur; + + +END$$ +DELIMITER ; diff --git a/db/changes/234802/04-remove-procedure-bs_nightTask.sql b/db/changes/234802/04-remove-procedure-bs_nightTask.sql new file mode 100644 index 000000000..530dc6ef5 --- /dev/null +++ b/db/changes/234802/04-remove-procedure-bs_nightTask.sql @@ -0,0 +1,2 @@ +DELETE FROM bs.nightTask + WHERE `procedure` ='zone_getCollisions'; diff --git a/db/changes/234802/05-drop-procedure-zone_getCollisions.sql b/db/changes/234802/05-drop-procedure-zone_getCollisions.sql new file mode 100644 index 000000000..9d0db5465 --- /dev/null +++ b/db/changes/234802/05-drop-procedure-zone_getCollisions.sql @@ -0,0 +1 @@ +DROP PROCEDURE vn.zone_getCollisions; diff --git a/db/changes/234802/06-zoneincluded_notification.sql b/db/changes/234802/06-zoneincluded_notification.sql new file mode 100644 index 000000000..53b2a9189 --- /dev/null +++ b/db/changes/234802/06-zoneincluded_notification.sql @@ -0,0 +1,11 @@ +-- Auto-generated SQL script #202311241021 +INSERT INTO util.notification (name,description) + VALUES ('zone-included','An email to notify zoneCollisions'); + +-- Auto-generated SQL script #202311241051 +INSERT INTO util.notificationSubscription (notificationFk,userFk) + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included" + + +INSERT INTO util.notificationAcl (notificationFk,roleFk) + SELECT id, account.role FROM util.notification WHERE name= "zone-included" diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html index 76f59e9f9..95f43b570 100644 --- a/print/templates/email/zone-included/zone-included.html +++ b/print/templates/email/zone-included/zone-included.html @@ -1,8 +1,33 @@
-

{{ $t('subject') }}

-

{{ $t('title', [zoneSelected,geoSelected]) }}

+ + + + + + + + + + + + + + + + + +
C.PostalNúmero de zonaPrecioZonaAlmacénSalix
{{ zn.name }}{{ zoneFk }}{{ z.price }}{{ z.name }}{{ w.name }}' + 'https://salix.verdnatura.es/#!/zone/', + zoneFk, + '/location?q=%7B%22search%22:%22', + zn.name, + '%22%7D
diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index 6ed8964b1..7fb60fb63 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -5,6 +5,12 @@ module.exports = { name: 'zone-included', components: { 'email-body': emailBody.build(), + }, + computed: { + + }, + methods: { + }, props: { zoneSelected: { From 60fbb1d56ee4f2e4af9c9ccfbeccd0374803d3cc Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 1 Dec 2023 09:39:21 +0100 Subject: [PATCH 011/183] refs #5858 feat: update procedure zoneIncluded_getCollisions --- ...zoneIncluded_procedure_checkCollisions.sql | 83 ++++++++++++------- db/changes/234802/00-zoneIncluded_trigger.sql | 73 ---------------- ...1-zoneIncluded_table_zoneincludedCheck.sql | 14 ---- .../02-zoneIncluded_event_checkCollisions.sql | 5 -- ...zoneIncluded_procedure_checkCollisions.sql | 33 -------- .../04-remove-procedure-bs_nightTask.sql | 2 - .../05-drop-procedure-zone_getCollisions.sql | 1 - .../234802/06-zoneincluded_notification.sql | 11 --- 8 files changed, 55 insertions(+), 167 deletions(-) delete mode 100644 db/changes/234802/00-zoneIncluded_trigger.sql delete mode 100644 db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql delete mode 100644 db/changes/234802/02-zoneIncluded_event_checkCollisions.sql delete mode 100644 db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql delete mode 100644 db/changes/234802/04-remove-procedure-bs_nightTask.sql delete mode 100644 db/changes/234802/05-drop-procedure-zone_getCollisions.sql delete mode 100644 db/changes/234802/06-zoneincluded_notification.sql diff --git a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql index ccfb8f3b8..f3649466b 100644 --- a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql +++ b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql @@ -1,33 +1,60 @@ -DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; +DROP PROCEDURE IF EXISTS vn.zoneIncluded_checkCollisions; + DELIMITER $$ - -CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`(IN zi_zone INT, IN zi_geo INT) +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() BEGIN -DECLARE done INT DEFAULT 0; -DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; -DECLARE z_name VARCHAR(255); -DECLARE g_name VARCHAR(255); - -DECLARE my_cur CURSOR FOR - SELECT zic.id, z.name , zg.name , zic.geoFk ,zic.`action` , zic.userFK FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id ; -DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; - -OPEN my_cur; - my_cur_loop: - LOOP FETCH my_cur INTO zic_id, z_name,g_name, zic_geo, zic_action, zic_userFk ; - IF done = 1 THEN - select concat('NO REDCORDS' ) AS '** DEBUG:'; - LEAVE my_cur_loop; - END IF; - SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_geo,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; - DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; - SELECT util.notification_send('zone-included', - JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), - account.myUser_getId() - ); - END LOOP my_cur_loop; -CLOSE my_cur; + DECLARE zic_id, zic_zone, zic_geoFk, zic_action, zic_zoneFk, zic_userFk INT; + DECLARE zic2_geoFk, zic2_zoneFk INT; + DECLARE z_name VARCHAR(255); + DECLARE g_name VARCHAR(255); + DECLARE vDone boolean; -END$$ + DECLARE cur CURSOR FOR + SELECT zic.id, z.name , zg.name ,zic.zoneFK, zic.geoFk ,zic.`action` , zic.userFK + FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg + WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id and zic.action ='insert'; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + SET vDone := FALSE; + OPEN cur; + LOOP1: LOOP + SET vDone := FALSE; + FETCH cur INTO zic_id, z_name, g_name, zic_zoneFk, zic_geoFk, zic_action, zic_userFk ; + IF vDone THEN + select concat('NO RECORDS LOOP 1' ) AS '** DEBUG:'; + CLOSE cur; + LEAVE LOOP1; + END IF; + -- SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_zoneFk,'**',zic_geoFk,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; + DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; + + BLOCK2: BEGIN + DECLARE vDone2 boolean; + DECLARE cur2 CURSOR FOR + SELECT zi.zoneFk,zi.geoFk + FROM vn.zoneIncluded zi, vn.zone z + where z.id = zi.zoneFk and zi.zoneFk=zic_zoneFk and zi.geoFk=zic_geoFk and zi.isIncluded = 1; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone2 = TRUE; + SET vDone2 := FALSE; + OPEN cur2; + LOOP2: LOOP + FETCH cur2 INTO zic2_zoneFk, zic2_geoFk ; + IF vDone2 THEN + select concat('NO RECORDS LOOP 2' ) AS '** DEBUG:'; + CLOSE cur2; + LEAVE LOOP2; + END IF; + SELECT concat('COLLISION DETECTED', zic2_zoneFk, zic2_geoFk ) AS '** DEBUG:'; + + SELECT util.notification_send('zone-included', + JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), + account.myUser_getId() + ); + END LOOP LOOP2; + END BLOCK2; + END LOOP LOOP1; +END +$$ DELIMITER ; diff --git a/db/changes/234802/00-zoneIncluded_trigger.sql b/db/changes/234802/00-zoneIncluded_trigger.sql deleted file mode 100644 index 4de0416b7..000000000 --- a/db/changes/234802/00-zoneIncluded_trigger.sql +++ /dev/null @@ -1,73 +0,0 @@ -DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterInsert`; -USE `vn`; - -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterInsert` - AFTER INSERT ON `zoneIncluded` - FOR EACH ROW -BEGIN - INSERT INTO zoneLog - SET `action` = 'insert', - `changedModel` = 'zoneIncluded', - `changedModelId` = NEW.zoneFk, - `userFk` = account.myUser_getId(); - INSERT INTO zoneIncludedCheck - SET - `action`= 'insert', - `zoneFk` = NEW.zoneFk, - `geoFk` = NEW.geoFk, - `userFk` = account.myUser_getId(); - -- CALL `vn`.`zoneIncluded_checkCollisions`(NEW.zoneFk, NEW.geoFk); - -END$$ -DELIMITER ; - -DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterUpdate`; -USE `vn`; - -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterUpdate` - AFTER UPDATE ON `zoneIncluded` - FOR EACH ROW -BEGIN - INSERT INTO zoneLog - SET `action` = 'update', - `changedModel` = 'zoneIncluded', - `changedModelId` = OLD.zoneFk, - `userFk` = account.myUser_getId(); - INSERT INTO zoneIncludedCheck - SET - `action`= 'update', - `zoneFk` = NEW.zoneFk, - `geoFk` = NEW.geoFk, - `userFk` = account.myUser_getId(); - - -- CALL `vn`.`zoneIncluded_checkCollisions`(); - - -END$$ -DELIMITER ; - -DROP TRIGGER IF EXISTS `vn`.`zoneIncluded_afterDelete`; -USE `vn`; - -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_afterDelete` - AFTER DELETE ON `zoneIncluded` - FOR EACH ROW -BEGIN - INSERT INTO zoneLog - SET `action` = 'delete', - `changedModel` = 'zoneIncluded', - `changedModelId` = OLD.zoneFk, - `userFk` = account.myUser_getId(); - INSERT INTO zoneIncludedCheck - SET - `action`= 'delete', - `zoneFk` = OLD.zoneFk, - `geoFk` = OLD.geoFk, - `userFk` = account.myUser_getId(); - - -- CALL `vn`.`zoneIncluded_checkCollisions`(); -END$$ -DELIMITER ; diff --git a/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql b/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql deleted file mode 100644 index ba52f76b0..000000000 --- a/db/changes/234802/01-zoneIncluded_table_zoneincludedCheck.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE `vn`.`zoneIncludedCheck` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `zoneFK` int(11) NOT NULL, - `geoFK` int(11) NOT NULL, - `userFK` int(10) unsigned NOT NULL, - `action`set('insert','update','delete') NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `user_FK` FOREIGN KEY (`userFK`) REFERENCES `account`.`user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT `zone_FK` FOREIGN KEY (`zoneFK`) REFERENCES `vn`.`zone` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, - CONSTRAINT `geo_FK` FOREIGN KEY (`geoFK`) REFERENCES `vn`.`zoneGeo` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, - UNIQUE INDEX (`zoneFK`, `geoFK`, `userFK`, `action`) -) - -comment 'Table to save temporarily zone changes'; diff --git a/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql b/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql deleted file mode 100644 index 3a6dd32b8..000000000 --- a/db/changes/234802/02-zoneIncluded_event_checkCollisions.sql +++ /dev/null @@ -1,5 +0,0 @@ -USE vn; -CREATE EVENT zoneCollisionsCheck -ON SCHEDULE AT CURRENT_TIMESTAMP -DISABLE ON SLAVE -DO SELECT vn.zoneIncluded_checkCollisions; diff --git a/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql deleted file mode 100644 index 8959b3945..000000000 --- a/db/changes/234802/03-zoneIncluded_procedure_checkCollisions.sql +++ /dev/null @@ -1,33 +0,0 @@ -DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; -DELIMITER $$ - -CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() -BEGIN -DECLARE done INT DEFAULT 0; -DECLARE zic_id, zic_zone, zic_geo, zic_action, zic_userFk INT; -DECLARE z_name VARCHAR(255); -DECLARE g_name VARCHAR(255); - -DECLARE my_cur CURSOR FOR - SELECT zic.id, z.name , zg.name , zic.geoFk ,zic.`action` , zic.userFK FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id ; -DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; - -OPEN my_cur; - my_cur_loop: - LOOP FETCH my_cur INTO zic_id, z_name,g_name, zic_geo, zic_action, zic_userFk ; - IF done = 1 THEN - select concat('NO REDCORDS' ) AS '** DEBUG:'; - LEAVE my_cur_loop; - END IF; - SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_geo,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; - DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; - SELECT util.notification_send('zone-included', - JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), - account.myUser_getId() - ); - END LOOP my_cur_loop; -CLOSE my_cur; - - -END$$ -DELIMITER ; diff --git a/db/changes/234802/04-remove-procedure-bs_nightTask.sql b/db/changes/234802/04-remove-procedure-bs_nightTask.sql deleted file mode 100644 index 530dc6ef5..000000000 --- a/db/changes/234802/04-remove-procedure-bs_nightTask.sql +++ /dev/null @@ -1,2 +0,0 @@ -DELETE FROM bs.nightTask - WHERE `procedure` ='zone_getCollisions'; diff --git a/db/changes/234802/05-drop-procedure-zone_getCollisions.sql b/db/changes/234802/05-drop-procedure-zone_getCollisions.sql deleted file mode 100644 index 9d0db5465..000000000 --- a/db/changes/234802/05-drop-procedure-zone_getCollisions.sql +++ /dev/null @@ -1 +0,0 @@ -DROP PROCEDURE vn.zone_getCollisions; diff --git a/db/changes/234802/06-zoneincluded_notification.sql b/db/changes/234802/06-zoneincluded_notification.sql deleted file mode 100644 index 53b2a9189..000000000 --- a/db/changes/234802/06-zoneincluded_notification.sql +++ /dev/null @@ -1,11 +0,0 @@ --- Auto-generated SQL script #202311241021 -INSERT INTO util.notification (name,description) - VALUES ('zone-included','An email to notify zoneCollisions'); - --- Auto-generated SQL script #202311241051 -INSERT INTO util.notificationSubscription (notificationFk,userFk) - SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included" - - -INSERT INTO util.notificationAcl (notificationFk,roleFk) - SELECT id, account.role FROM util.notification WHERE name= "zone-included" From e3379b42a1c40ea05196f2901a285ff6adc4a04d Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 1 Dec 2023 14:06:28 +0100 Subject: [PATCH 012/183] refs #5858 test: bad test calls --- .../zone/back/methods/zone/specs/toggleIsIncluded.spec.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 3e72408cf..241b0d0cc 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -21,19 +21,11 @@ describe('zone toggleIsIncluded()', () => { const tx = await models.Zone.beginTransaction({}); try { - let toCheck = await conn.executeStmt({sql: ' SELECT * FROM zoneIncludedCheck'}); - - expect(toCheck.length).toEqual(0); const options = {transaction: tx}; let result = await models.Zone.toggleIsIncluded(1, 20, true, options); expect(result.isIncluded).toBeTrue(); - toCheck = await conn.executeStmt({sql: ' SELECT * FROM zoneIncludedCheck'}); - - expect(toCheck.length).not.toEqual(1); - - await conn.executeStmt({sql: 'CALL vn.zoneIncluded_checkCollisions(?, ? )', params: [0, 0]}); await tx.rollback(); } catch (e) { From 15936ddc552e6f86907735f584d5503caa6ef12a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 07:53:47 +0100 Subject: [PATCH 013/183] refs #5858 other: rename files --- ...dure-bs_nightTask.sql => 04-remove_procedure_bs_nightTask.sql} | 0 ...getCollisions.sql => 05-drop_procedure_zone_getCollisions.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename db/changes/234801/{04-remove-procedure-bs_nightTask.sql => 04-remove_procedure_bs_nightTask.sql} (100%) rename db/changes/234801/{05-drop-procedure-zone_getCollisions.sql => 05-drop_procedure_zone_getCollisions.sql} (100%) diff --git a/db/changes/234801/04-remove-procedure-bs_nightTask.sql b/db/changes/234801/04-remove_procedure_bs_nightTask.sql similarity index 100% rename from db/changes/234801/04-remove-procedure-bs_nightTask.sql rename to db/changes/234801/04-remove_procedure_bs_nightTask.sql diff --git a/db/changes/234801/05-drop-procedure-zone_getCollisions.sql b/db/changes/234801/05-drop_procedure_zone_getCollisions.sql similarity index 100% rename from db/changes/234801/05-drop-procedure-zone_getCollisions.sql rename to db/changes/234801/05-drop_procedure_zone_getCollisions.sql From cc88fcbd9d88623917db080f17b5cfbbe6a9f9ea Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 07:54:12 +0100 Subject: [PATCH 014/183] refs #5858 feat: update notification template --- .../email/zone-included/locale/es.yml | 5 +++ .../email/zone-included/zone-included.html | 41 ++++++++++--------- .../email/zone-included/zone-included.js | 26 ++++++++---- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/print/templates/email/zone-included/locale/es.yml b/print/templates/email/zone-included/locale/es.yml index 57d257663..974253ddc 100644 --- a/print/templates/email/zone-included/locale/es.yml +++ b/print/templates/email/zone-included/locale/es.yml @@ -1,2 +1,7 @@ subject: Colisión de zona detectada title: "La zona {0} y localización {1} ha sido registrada en más de un sitio" +postalCode: C. Postal +zoneFk: Número de zona +price: Precio +zone: Zona +warehouse: Almacén diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html index 95f43b570..0381cc8c4 100644 --- a/print/templates/email/zone-included/zone-included.html +++ b/print/templates/email/zone-included/zone-included.html @@ -3,28 +3,29 @@
- - - - - + + + + + - - - - - - - + + + + + +
C.PostalNúmero de zonaPrecioZonaAlmacén{{ $t('postalCode') }}{{ $t('zoneFk') }}{{ $t('price') }}{{ $t('zone') }}{{ $t('warehouse') }} Salix
{{ zn.name }}{{ zoneFk }}{{ z.price }}{{ z.name }}{{ w.name }}' - 'https://salix.verdnatura.es/#!/zone/', - zoneFk, - '/location?q=%7B%22search%22:%22', - zn.name, +
{{ zone.zn.name }}{{ zone.zoneFk }}{{ zone.z.price }}{{ zone.z.name }}{{ zone.w.name }} + + 'https://salix.verdnatura.es/#!/zone/'+ + {{zone.zoneFk}}+ + '/location?q=%7B%22search%22:%22'+ + {{zone.zn.name}}+ '%22%7D
diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index 7fb60fb63..c42e2c34e 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -6,6 +6,7 @@ module.exports = { components: { 'email-body': emailBody.build(), }, + computed: { }, @@ -13,13 +14,22 @@ module.exports = { }, props: { - zoneSelected: { - type: String, - required: true - }, - geoSelected: { - type: String, - required: true - } + zoneCollisions: {type: Array, required: true} + // zoneFk: { + // type: String, + // required: true + // }, + // z: { + // type: Object, + // required: true + // }, + // zn: { + // type: Object, + // required: true + // }, + // w: { + // type: Object, + // required: true + // } } }; From 5b6112720fdb8022e88b6b96b1f00d49de78fb2a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 07:54:29 +0100 Subject: [PATCH 015/183] refs #5858 feat: new fixture --- db/dump/fixtures.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index af181fd3b..85d5873fd 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -3010,3 +3010,9 @@ INSERT INTO `vn`.`invoiceCorrectionType` (`id`, `description`) (1, 'Error in VAT calculation'), (2, 'Error in sales details'), (3, 'Error in customer data'); + + +-- Auto-generated SQL script #202312181416 +UPDATE salix.ACL + SET principalId='employee' + WHERE id=391; From a31b689ae2d597f9ed19374bb6d29c600fd2a79b Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 07:54:49 +0100 Subject: [PATCH 016/183] refs #5858 perf: update db/changes --- ...zoneIncluded_procedure_checkCollisions.sql | 145 ++++++++++++------ .../234801/06-zoneincluded_notification.sql | 5 +- 2 files changed, 99 insertions(+), 51 deletions(-) diff --git a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql index f3649466b..99cab6746 100644 --- a/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql +++ b/db/changes/234801/03-zoneIncluded_procedure_checkCollisions.sql @@ -1,60 +1,107 @@ DROP PROCEDURE IF EXISTS vn.zoneIncluded_checkCollisions; DELIMITER $$ -$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() BEGIN - DECLARE zic_id, zic_zone, zic_geoFk, zic_action, zic_zoneFk, zic_userFk INT; - DECLARE zic2_geoFk, zic2_zoneFk INT; - DECLARE z_name VARCHAR(255); - DECLARE g_name VARCHAR(255); - DECLARE vDone boolean; +/** + * Calcula si para un mismo codigo postal y dia + * hay mas de una zona configurada y manda correo + * + */ + DECLARE vGeoFk INT DEFAULT NULL; + DECLARE vZoneFk INT; + DECLARE vIsDone INT DEFAULT FALSE; + DECLARE vTableCollisions TEXT; + DECLARE json_data JSON; + DECLARE cur1 CURSOR FOR SELECT zoneFk from tmp.zoneOption; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vIsDone = TRUE; - DECLARE cur CURSOR FOR - SELECT zic.id, z.name , zg.name ,zic.zoneFK, zic.geoFk ,zic.`action` , zic.userFK - FROM vn.zoneIncludedCheck zic, vn.`zone` z, vn.zoneGeo zg - WHERE zic.zoneFK =z.id AND zic.geoFK = zg.id and zic.action ='insert'; + DROP TEMPORARY TABLE IF EXISTS tmp.zone; + CREATE TEMPORARY TABLE tmp.zone + SELECT z.id + FROM zone z + JOIN agencyMode am ON am.id = z.agencyModeFk + JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk + WHERE dm.code IN ('AGENCY','DELIVERY'); - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - SET vDone := FALSE; - OPEN cur; - LOOP1: LOOP - SET vDone := FALSE; - FETCH cur INTO zic_id, z_name, g_name, zic_zoneFk, zic_geoFk, zic_action, zic_userFk ; - IF vDone THEN - select concat('NO RECORDS LOOP 1' ) AS '** DEBUG:'; - CLOSE cur; - LEAVE LOOP1; - END IF; - -- SELECT concat('** ', zic_id, '** ',z_name, '** ',g_name,'**',zic_zoneFk,'**',zic_geoFk,'** ', zic_action,'** ', zic_userFk ) AS '** DEBUG:'; - DELETE FROM vn.zoneIncludedCheck WHERE id =zic_id; + CALL zone_getOptionsForShipment(util.VN_CURDATE(),FALSE); - BLOCK2: BEGIN - DECLARE vDone2 boolean; - DECLARE cur2 CURSOR FOR - SELECT zi.zoneFk,zi.geoFk - FROM vn.zoneIncluded zi, vn.zone z - where z.id = zi.zoneFk and zi.zoneFk=zic_zoneFk and zi.geoFk=zic_geoFk and zi.isIncluded = 1; - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone2 = TRUE; - SET vDone2 := FALSE; - OPEN cur2; - LOOP2: LOOP - FETCH cur2 INTO zic2_zoneFk, zic2_geoFk ; - IF vDone2 THEN - select concat('NO RECORDS LOOP 2' ) AS '** DEBUG:'; - CLOSE cur2; - LEAVE LOOP2; - END IF; - SELECT concat('COLLISION DETECTED', zic2_zoneFk, zic2_geoFk ) AS '** DEBUG:'; + DROP TEMPORARY TABLE IF EXISTS tmp.zoneNodes; + CREATE TEMPORARY TABLE tmp.zoneNodes ( + geoFk INT, + name VARCHAR(100), + parentFk INT, + sons INT, + isChecked BOOL DEFAULT 0, + zoneFk INT, + PRIMARY KEY zoneFkk (zoneFk, geoFk), + INDEX(geoFk)) + ENGINE = MyISAM; - SELECT util.notification_send('zone-included', - JSON_OBJECT('zoneSelected', z_name, 'geoSelected', g_name), - account.myUser_getId() - ); - END LOOP LOOP2; - END BLOCK2; - END LOOP LOOP1; -END -$$ + OPEN cur1; + cur1Loop: LOOP + SET vIsDone = FALSE; + FETCH cur1 INTO vZoneFk; + IF vIsDone THEN + LEAVE cur1Loop; + END IF; + + CALL zone_getLeaves(vZoneFk, NULL, NULL, TRUE); + + myLoop: LOOP + SET vGeoFk = NULL; + SELECT geoFk INTO vGeoFk + FROM tmp.zoneNodes zn + WHERE NOT isChecked + LIMIT 1; + + IF vGeoFk IS NULL THEN + LEAVE myLoop; + END IF; + + CALL zone_getLeaves(vZoneFk, vGeoFk, NULL, TRUE); + UPDATE tmp.zoneNodes + SET isChecked = TRUE + WHERE geoFk = vGeoFk; + END LOOP; + + END LOOP; + CLOSE cur1; + DELETE FROM tmp.zoneNodes + WHERE sons > 0; + + DROP TEMPORARY TABLE IF EXISTS geoCollision; + CREATE TEMPORARY TABLE geoCollision + SELECT z.agencyModeFk, zn.geoFk, zw.warehouseFk + FROM tmp.zoneNodes zn + JOIN zone z ON z.id = zn.zoneFk + JOIN zoneWarehouse zw ON z.id = zw.zoneFk + GROUP BY z.agencyModeFk, zn.geoFk, zw.warehouseFk + HAVING count(*) > 1; + + SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'zoneFk', zoneFk, + 'zn', JSON_OBJECT('name', zn.name), + 'z', JSON_OBJECT('name', z.name,'price', z.price), + 'w', JSON_OBJECT('name', w.name) + ) + ) FROM tmp.zoneNodes zn + JOIN zone z ON z.id = zn.zoneFk + JOIN geoCollision gc ON gc.agencyModeFk = z.agencyModeFk AND zn.geoFk = gc.geoFk + JOIN warehouse w ON w.id = gc.warehouseFk + INTO json_data; + + SELECT util.notification_send( + 'zone-included', + JSON_OBJECT('zoneCollisions',json_data), + account.myUser_getId() + ); + + DROP TEMPORARY TABLE + geoCollision, + tmp.zone, + tmp.zoneNodes; +END ;; DELIMITER ; diff --git a/db/changes/234801/06-zoneincluded_notification.sql b/db/changes/234801/06-zoneincluded_notification.sql index 3de713884..d05902461 100644 --- a/db/changes/234801/06-zoneincluded_notification.sql +++ b/db/changes/234801/06-zoneincluded_notification.sql @@ -1,5 +1,6 @@ -INSERT INTO util.notification (name,description) - VALUES ('zone-included','An email to notify zoneCollisions'); +INSERT INTO util.notification (id, name,description) + VALUES ( +(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); INSERT INTO util.notificationSubscription (notificationFk,userFk) SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; From dbc3fc800781a6fb300aeebaa21cadbe9b4bcb55 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 08:02:38 +0100 Subject: [PATCH 017/183] refs #5858 perf: remove bad comments --- db/changes/234801/00-zoneIncluded_trigger.sql | 3 --- ...03-zoneIncluded_procedure_checkCollisions.sql | 14 -------------- db/dump/fixtures.sql | 3 +-- .../methods/zone/specs/toggleIsIncluded.spec.js | 4 +--- .../email/zone-included/sql/zoneIncluded.sql | 5 ----- .../email/zone-included/zone-included.js | 16 ---------------- 6 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 db/dump/03-zoneIncluded_procedure_checkCollisions.sql diff --git a/db/changes/234801/00-zoneIncluded_trigger.sql b/db/changes/234801/00-zoneIncluded_trigger.sql index 4de0416b7..7684e7787 100644 --- a/db/changes/234801/00-zoneIncluded_trigger.sql +++ b/db/changes/234801/00-zoneIncluded_trigger.sql @@ -17,7 +17,6 @@ BEGIN `zoneFk` = NEW.zoneFk, `geoFk` = NEW.geoFk, `userFk` = account.myUser_getId(); - -- CALL `vn`.`zoneIncluded_checkCollisions`(NEW.zoneFk, NEW.geoFk); END$$ DELIMITER ; @@ -42,7 +41,6 @@ BEGIN `geoFk` = NEW.geoFk, `userFk` = account.myUser_getId(); - -- CALL `vn`.`zoneIncluded_checkCollisions`(); END$$ @@ -68,6 +66,5 @@ BEGIN `geoFk` = OLD.geoFk, `userFk` = account.myUser_getId(); - -- CALL `vn`.`zoneIncluded_checkCollisions`(); END$$ DELIMITER ; diff --git a/db/dump/03-zoneIncluded_procedure_checkCollisions.sql b/db/dump/03-zoneIncluded_procedure_checkCollisions.sql deleted file mode 100644 index 540bec5ee..000000000 --- a/db/dump/03-zoneIncluded_procedure_checkCollisions.sql +++ /dev/null @@ -1,14 +0,0 @@ -DROP PROCEDURE IF EXISTS `vn`.`zoneIncluded_checkCollisions`; - -DELIMITER $$ -$$ -CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() -BEGIN - -- DROP TEMPORARY TABLE IF EXISTS tmp.toCheck; - DECLARE vZonesToCheck INT; - DECLARE vDone INT DEFAULT FALSE; - DECLARE vZoneFk INT; - DECLARE vCounter INT; - -END$$ -DELIMITER ; diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 85d5873fd..e934ee12e 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -3012,7 +3012,6 @@ INSERT INTO `vn`.`invoiceCorrectionType` (`id`, `description`) (3, 'Error in customer data'); --- Auto-generated SQL script #202312181416 UPDATE salix.ACL SET principalId='employee' - WHERE id=391; + WHERE model ="Notification"; diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 241b0d0cc..86c04f844 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,9 +1,7 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); -let conn = null; describe('zone toggleIsIncluded()', () => { beforeAll(async() => { - conn = await models.Item.dataSource.connector; const activeCtx = { accessToken: {userId: 9}, http: { @@ -17,7 +15,7 @@ describe('zone toggleIsIncluded()', () => { }); }); - fit('should return the created location with isIncluded true', async() => { + it('should return the created location with isIncluded true', async() => { const tx = await models.Zone.beginTransaction({}); try { diff --git a/print/templates/email/zone-included/sql/zoneIncluded.sql b/print/templates/email/zone-included/sql/zoneIncluded.sql index eaf331232..e69de29bb 100644 --- a/print/templates/email/zone-included/sql/zoneIncluded.sql +++ b/print/templates/email/zone-included/sql/zoneIncluded.sql @@ -1,5 +0,0 @@ -SELECT - z.name -FROM vn.zoneIncluded zI - LEFT JOIN vn.zone z ON z.Id = zI.zoneFk -WHERE zI.id = ?; diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index c42e2c34e..cddebe612 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -15,21 +15,5 @@ module.exports = { }, props: { zoneCollisions: {type: Array, required: true} - // zoneFk: { - // type: String, - // required: true - // }, - // z: { - // type: Object, - // required: true - // }, - // zn: { - // type: Object, - // required: true - // }, - // w: { - // type: Object, - // required: true - // } } }; From 2d4fb9d2f8c2a460ff5e8c1c782e0e8a551173ee Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 08:04:11 +0100 Subject: [PATCH 018/183] refs #5858 perf: remove unused methods --- print/templates/email/zone-included/zone-included.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index cddebe612..7e23ee2f0 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -6,13 +6,6 @@ module.exports = { components: { 'email-body': emailBody.build(), }, - - computed: { - - }, - methods: { - - }, props: { zoneCollisions: {type: Array, required: true} } From 243319b11325be0eb659e33a6388c1330d0ca520 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 12:55:27 +0100 Subject: [PATCH 019/183] refs #5858 feat zoneIncludedCheck model --- modules/zone/back/model-config.json | 3 ++ .../zone/back/models/zone-included-check.json | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 modules/zone/back/models/zone-included-check.json diff --git a/modules/zone/back/model-config.json b/modules/zone/back/model-config.json index 261a89902..72c755978 100644 --- a/modules/zone/back/model-config.json +++ b/modules/zone/back/model-config.json @@ -32,6 +32,9 @@ "ZoneIncluded": { "dataSource": "vn" }, + "ZoneIncludedCheck": { + "dataSource": "vn" + }, "ZoneWarehouse": { "dataSource": "vn" }, diff --git a/modules/zone/back/models/zone-included-check.json b/modules/zone/back/models/zone-included-check.json new file mode 100644 index 000000000..8affee92c --- /dev/null +++ b/modules/zone/back/models/zone-included-check.json @@ -0,0 +1,44 @@ +{ + "name": "ZoneIncludedCheck", + "base": "Loggable", + "options": { + "mysql": { + "table": "zoneIncludedCheck" + } + }, + "properties": { + "id": { + "id": true, + "type": "number" + }, + "zoneFk": { + "type": "int" + }, + "geoFk": { + "type": "int" + }, + "userFk": { + "type": "int" + }, + "action": { + "type": "string" + } + }, + "relations": { + "zone": { + "type": "belongsTo", + "model": "Zone", + "foreignKey": "zoneFk" + }, + "geo": { + "type": "belongsTo", + "model": "ZoneGeo", + "foreignKey": "geoFk" + }, + "user": { + "type": "belongsTo", + "model": "VnUser", + "foreignKey": "userFk" + } + } +} From 38a5337f680428b31ee63a6afb3276d01b28bd43 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 19 Dec 2023 12:57:10 +0100 Subject: [PATCH 020/183] refs #5858 test: execute test --- .../methods/zone/specs/deleteZone.spec.js | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index 968685fec..b5cdbba52 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -30,11 +30,59 @@ describe('zone deletezone()', () => { } }); + it('should NOT delete a zone if is included', async() => { + const tx = await models.Zone.beginTransaction({}); + let isIncluded = false; + try { + const options = {transaction: tx}; + const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}); + isIncluded = zoneIncluded.length > 0; + await models.Zone.deleteZone(ctx, zoneId, options); + } catch (e) { + expect(isIncluded).toBeTrue(); + expect(e).not.toBeNull(); + await tx.rollback(); + } + }); + + it('should NOT delete a zone if is included check', async() => { + const tx = await models.Zone.beginTransaction({}); + let isIncluded = false; + try { + const options = {transaction: tx}; + const zoneIncludedCheck = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}); + isIncluded = zoneIncludedCheck.length > 0; + await models.Zone.deleteZone(ctx, zoneId, options); + } catch (e) { + expect(isIncluded).toBeTrue(); + expect(e).not.toBeNull(); + await tx.rollback(); + } + }); + it('should delete a zone and update their tickets', async() => { const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; + const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); + await models.ZoneIncluded.destroyById(zoneIncluded[0].id, options); + + const zoneIncludedDeleted = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); + + expect(zoneIncludedDeleted.length).toEqual(0); + const zoneIncludedCheck = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}, options); + + expect(zoneIncludedCheck.length).toEqual(2); + // Insert + await models.ZoneIncludedCheck.destroyById(zoneIncludedCheck[0].id, options); + // Delete + await models.ZoneIncludedCheck.destroyById(zoneIncludedCheck[1].id, options); + + const zoneIncludedCheckDeleted = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}, options); + + expect(zoneIncludedCheckDeleted.length).toEqual(0); + await models.Zone.deleteZone(ctx, zoneId, options); const updatedZone = await models.Zone.findById(zoneId, null, options); From c8b156771d39f9893ca84093f547464f60adcd1b Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 9 Feb 2024 14:00:16 +0100 Subject: [PATCH 021/183] feat: refs #6395 Added buyerFk in buy --- db/routines/vn/triggers/buy_beforeInsert.sql | 1 + db/routines/vn/triggers/buy_beforeUpdate.sql | 4 ++++ db/versions/10880-salmonHydrangea/00-firstScript.sql | 1 + 3 files changed, 6 insertions(+) create mode 100644 db/versions/10880-salmonHydrangea/00-firstScript.sql diff --git a/db/routines/vn/triggers/buy_beforeInsert.sql b/db/routines/vn/triggers/buy_beforeInsert.sql index c88bef05a..c698e23e6 100644 --- a/db/routines/vn/triggers/buy_beforeInsert.sql +++ b/db/routines/vn/triggers/buy_beforeInsert.sql @@ -19,6 +19,7 @@ trig: BEGIN END IF; SET NEW.editorFk = account.myUser_getId(); + SET NEW.buyerFk = NEW.editorFk; CALL buy_checkGrouping(NEW.`grouping`); diff --git a/db/routines/vn/triggers/buy_beforeUpdate.sql b/db/routines/vn/triggers/buy_beforeUpdate.sql index fc03c456f..b41418bcc 100644 --- a/db/routines/vn/triggers/buy_beforeUpdate.sql +++ b/db/routines/vn/triggers/buy_beforeUpdate.sql @@ -65,6 +65,10 @@ trig:BEGIN SET NEW.isIgnored = TRUE; END IF; + IF NOT (NEW.itemFk <=> OLD.itemFk) THEN + SET NEW.buyerFk = NEW.editorFk; + END IF; + IF NOT (NEW.itemFk <=> OLD.itemFk) OR NOT (OLD.entryFk <=> NEW.entryFk) THEN CREATE OR REPLACE TEMPORARY TABLE tmp.buysToCheck diff --git a/db/versions/10880-salmonHydrangea/00-firstScript.sql b/db/versions/10880-salmonHydrangea/00-firstScript.sql new file mode 100644 index 000000000..934fc2020 --- /dev/null +++ b/db/versions/10880-salmonHydrangea/00-firstScript.sql @@ -0,0 +1 @@ +ALTER TABLE vn.buy ADD buyerFk int(10) unsigned DEFAULT NULL NULL; From 995a99c66131127021c96f3a3fe5ca1c96423e0a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 08:53:55 +0100 Subject: [PATCH 022/183] refs #5858 feat: removeZoneIncludedCheck --- .../methods/zone/specs/deleteZone.spec.js | 15 ------- modules/zone/back/model-config.json | 7 +-- .../zone/back/models/zone-included-check.json | 44 ------------------- 3 files changed, 2 insertions(+), 64 deletions(-) delete mode 100644 modules/zone/back/models/zone-included-check.json diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index b5cdbba52..e105bb296 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -47,14 +47,10 @@ describe('zone deletezone()', () => { it('should NOT delete a zone if is included check', async() => { const tx = await models.Zone.beginTransaction({}); - let isIncluded = false; try { const options = {transaction: tx}; - const zoneIncludedCheck = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}); - isIncluded = zoneIncludedCheck.length > 0; await models.Zone.deleteZone(ctx, zoneId, options); } catch (e) { - expect(isIncluded).toBeTrue(); expect(e).not.toBeNull(); await tx.rollback(); } @@ -71,17 +67,6 @@ describe('zone deletezone()', () => { const zoneIncludedDeleted = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); expect(zoneIncludedDeleted.length).toEqual(0); - const zoneIncludedCheck = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}, options); - - expect(zoneIncludedCheck.length).toEqual(2); - // Insert - await models.ZoneIncludedCheck.destroyById(zoneIncludedCheck[0].id, options); - // Delete - await models.ZoneIncludedCheck.destroyById(zoneIncludedCheck[1].id, options); - - const zoneIncludedCheckDeleted = await models.ZoneIncludedCheck.find({where: {zoneFk: zoneId}}, options); - - expect(zoneIncludedCheckDeleted.length).toEqual(0); await models.Zone.deleteZone(ctx, zoneId, options); diff --git a/modules/zone/back/model-config.json b/modules/zone/back/model-config.json index 72c755978..3bbbe0d1b 100644 --- a/modules/zone/back/model-config.json +++ b/modules/zone/back/model-config.json @@ -3,10 +3,10 @@ "dataSource": "vn" }, "AgencyMode": { - "dataSource": "vn" + "dataSource": "vn" }, "DeliveryMethod": { - "dataSource": "vn" + "dataSource": "vn" }, "Zone": { "dataSource": "vn" @@ -32,9 +32,6 @@ "ZoneIncluded": { "dataSource": "vn" }, - "ZoneIncludedCheck": { - "dataSource": "vn" - }, "ZoneWarehouse": { "dataSource": "vn" }, diff --git a/modules/zone/back/models/zone-included-check.json b/modules/zone/back/models/zone-included-check.json deleted file mode 100644 index 8affee92c..000000000 --- a/modules/zone/back/models/zone-included-check.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "ZoneIncludedCheck", - "base": "Loggable", - "options": { - "mysql": { - "table": "zoneIncludedCheck" - } - }, - "properties": { - "id": { - "id": true, - "type": "number" - }, - "zoneFk": { - "type": "int" - }, - "geoFk": { - "type": "int" - }, - "userFk": { - "type": "int" - }, - "action": { - "type": "string" - } - }, - "relations": { - "zone": { - "type": "belongsTo", - "model": "Zone", - "foreignKey": "zoneFk" - }, - "geo": { - "type": "belongsTo", - "model": "ZoneGeo", - "foreignKey": "geoFk" - }, - "user": { - "type": "belongsTo", - "model": "VnUser", - "foreignKey": "userFk" - } - } -} From 4799151565b3488e255e41e9def118b97757d759 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:12:17 +0100 Subject: [PATCH 023/183] refs #5858 feat: fixtures.before.sql --- db/dump/fixtures.before.sql | 9397 ++++++++++------------------------- 1 file changed, 2654 insertions(+), 6743 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index be288588e..8a6bd85fd 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -7,7152 +7,3063 @@ SET foreign_key_checks = 0; DROP ROLE 'salix'; - CREATE ROLE 'salix'; - -GRANT 'salix' TO 'root' @'%'; - -SET DEFAULT ROLE 'salix' FOR 'root' @'%'; +GRANT 'salix' TO 'root'@'%'; +SET DEFAULT ROLE 'salix' FOR 'root'@'%'; CREATE SCHEMA IF NOT EXISTS `vn2008`; - CREATE SCHEMA IF NOT EXISTS `tmp`; -UPDATE `util`.`config` SET `environment` = 'development'; +UPDATE `util`.`config` + SET `environment`= 'development'; -- FOR MOCK vn.time DROP PROCEDURE IF EXISTS `vn`.`mockVnTime`; DELIMITER $$ - $$ - -CREATE DEFINER =`root`@`localhost` PROCEDURE `vn`.`mockVnTime` -() +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`mockVnTime`() BEGIN -DECLARE - vDate DATE; + + DECLARE vDate DATE; SET vDate = '2000-01-01'; - WHILE (YEAR(vDate) < = 2002) DO - INSERT IGNORE INTO - vn.`time` ( - dated, period, `month`, `year`, `day`, week, yearMonth, salesYear - ) - VALUES ( - vDate, CONCAT( - YEAR(vDate), (WEEK(vDate) + 1) - ), MONTH(vDate), YEAR(vDate), DAY(vDate), WEEK(vDate) + 1, CONCAT(YEAR(vDate), MONTH(vDate)), YEAR(vDate) - ); - SET vDate = DATE_ADD(vDate, INTERVAL 1 DAY); -END - WHILE; + + WHILE ( YEAR(vDate) <= 2002 ) DO + INSERT IGNORE INTO vn.`time` (dated, period, `month`, `year`, `day`, week, yearMonth, salesYear) + VALUES (vDate, CONCAT(YEAR(vDate), (WEEK(vDate)+1)), MONTH(vDate), YEAR(vDate), DAY(vDate), WEEK(vDate)+1, CONCAT(YEAR(vDate), MONTH(vDate)), YEAR(vDate)); + + SET vDate = DATE_ADD(vDate, INTERVAL 1 DAY); + END WHILE; + END$$ +DELIMITER ; -DELIMITER; - -CALL `vn`.`mockVnTime` (); - +CALL `vn`.`mockVnTime`(); DROP PROCEDURE IF EXISTS `vn`.`mockVnTime`; -- END MOCK vn.time ALTER TABLE `vn`.`itemTaxCountry` AUTO_INCREMENT = 1; - ALTER TABLE `vn`.`address` AUTO_INCREMENT = 1; - ALTER TABLE `vn`.`zoneGeo` AUTO_INCREMENT = 1; - ALTER TABLE `vn`.`ticket` AUTO_INCREMENT = 1; -INSERT INTO - `salix`.`AccessToken` ( - `id`, `ttl`, `created`, `userId` - ) -VALUES ( - 'DEFAULT_TOKEN', '1209600', CURDATE(), 66 - ); +INSERT INTO `salix`.`AccessToken` (`id`, `ttl`, `created`, `userId`) + VALUES + ('DEFAULT_TOKEN', '1209600', CURDATE(), 66); -INSERT INTO - `salix`.`printConfig` ( - `id`, `itRecipient`, `incidencesEmail` - ) -VALUES ( - 1, 'it@gotamcity.com', 'incidences@gotamcity.com' - ); +INSERT INTO `salix`.`printConfig` (`id`, `itRecipient`, `incidencesEmail`) + VALUES + (1, 'it@gotamcity.com', 'incidences@gotamcity.com'); -INSERT INTO - `vn`.`ticketConfig` (`id`, `scopeDays`) -VALUES ('1', '6'); +INSERT INTO `vn`.`ticketConfig` (`id`, `scopeDays`) + VALUES + ('1', '6'); -INSERT INTO - `vn`.`bionicConfig` ( - `generalInflationCoeficient`, `minimumDensityVolumetricWeight`, `verdnaturaVolumeBox`, `itemCarryBox` - ) -VALUES (1.30, 167.00, 138000, 71); +INSERT INTO `vn`.`bionicConfig` (`generalInflationCoeficient`, `minimumDensityVolumetricWeight`, `verdnaturaVolumeBox`, `itemCarryBox`) + VALUES + (1.30, 167.00, 138000, 71); -INSERT INTO - `vn`.`chatConfig` (`host`, `api`) -VALUES ( - 'https://chat.verdnatura.es', 'https://chat.verdnatura.es/api/v1' - ); +INSERT INTO `vn`.`chatConfig` (`host`, `api`) + VALUES + ('https://chat.verdnatura.es', 'https://chat.verdnatura.es/api/v1'); -INSERT IGNORE INTO - `vn`.`greugeConfig` (`id`, `freightPickUpPrice`) -VALUES ('1', '11'); +INSERT IGNORE INTO `vn`.`greugeConfig`(`id`, `freightPickUpPrice`) + VALUES + ('1', '11'); UPDATE `account`.`role` SET id = 100 WHERE id = 0; -INSERT INTO - `account`.`roleConfig` ( - `id`, `mysqlPassword`, `rolePrefix`, `userPrefix`, `userHost`, `tplUser` - ) -VALUES ( - 1, 'mysqlPassword', '$', '!', '%', 'any' - ); +INSERT INTO `account`.`roleConfig`(`id`, `mysqlPassword`, `rolePrefix`, `userPrefix`, `userHost`, `tplUser`) + VALUES + (1, 'mysqlPassword', '$', '!', '%', 'any'); CALL `account`.`role_sync`; -INSERT INTO - `account`.`user` ( - `id`, `name`, `nickname`, `role`, `active`, `email`, `lang`, `image`, `password` - ) -SELECT id, name, CONCAT(name, 'Nick'), id, 1, CONCAT(name, '@mydomain.com'), 'en', '4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2' -FROM `account`.`role` -ORDER BY id; +INSERT INTO `account`.`user`(`id`,`name`, `nickname`, `role`,`active`,`email`, `lang`, `image`, `password`) + SELECT id, name, CONCAT(name, 'Nick'), id, 1, CONCAT(name, '@mydomain.com'), 'en', '4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2' + FROM `account`.`role` + ORDER BY id; -INSERT INTO - `account`.`account` (`id`) -SELECT `u`.`id` -FROM `account`.`user` `u` - JOIN `account`.`role` `r` ON `u`.`role` = `r`.`id` -WHERE - `r`.`name` <> 'customer'; +INSERT INTO `account`.`account`(`id`) + SELECT `u`.`id` + FROM `account`.`user` `u` + JOIN `account`.`role` `r` ON `u`.`role` = `r`.`id` + WHERE `r`.`name` <> 'customer'; -INSERT INTO - `vn`.`educationLevel` (`id`, `name`) -VALUES ( - 1, 'ESTUDIOS PRIMARIOS COMPLETOS' - ), - ( - 2, 'ENSEÑANZAS DE BACHILLERATO' - ); +INSERT INTO `vn`.`educationLevel` (`id`, `name`) + VALUES + (1, 'ESTUDIOS PRIMARIOS COMPLETOS'), + (2, 'ENSEÑANZAS DE BACHILLERATO'); -INSERT INTO - `vn`.`worker` ( - `id`, `code`, `firstName`, `lastName`, `bossFk` - ) -SELECT id, UPPER(LPAD(role, 3, '0')), name, name, NULL -FROM `account`.`user` -WHERE - `id` = 9; +INSERT INTO `vn`.`worker`(`id`,`code`, `firstName`, `lastName`, `bossFk`) + SELECT id,UPPER(LPAD(role, 3, '0')), name, name, NULL + FROM `account`.`user` + WHERE `id` = 9; -INSERT INTO - `vn`.`worker` ( - `id`, `code`, `firstName`, `lastName`, `bossFk` - ) -SELECT id, UPPER(LPAD(role, 3, '0')), name, name, 9 -FROM `account`.`user` -WHERE - `id` <> 9; +INSERT INTO `vn`.`worker`(`id`,`code`, `firstName`, `lastName`, `bossFk`) + SELECT id,UPPER(LPAD(role, 3, '0')), name, name, 9 + FROM `account`.`user` + WHERE `id` <> 9; UPDATE `vn`.`worker` SET bossFk = NULL WHERE id = 20; - UPDATE `vn`.`worker` SET bossFk = 20 WHERE id = 1 OR id = 9; - UPDATE `vn`.`worker` SET bossFk = 19 WHERE id = 18; -DELETE FROM `vn`.`worker` WHERE firstName = 'customer'; +DELETE FROM `vn`.`worker` WHERE firstName ='customer'; -INSERT INTO - `hedera`.`tpvConfig` ( - `id`, `currency`, `terminal`, `transactionType`, `maxAmount`, `employeeFk`, `testUrl` - ) -VALUES (1, 978, 1, 0, 2000, 9, 0); +INSERT INTO `hedera`.`tpvConfig`(`id`, `currency`, `terminal`, `transactionType`, `maxAmount`, `employeeFk`, `testUrl`) + VALUES + (1, 978, 1, 0, 2000, 9, 0); -INSERT INTO - `account`.`user` ( - `id`, `name`, `nickname`, `password`, `role`, `active`, `email`, `lang`, `image` - ) -VALUES ( - 1101, 'BruceWayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'BruceWayne@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1102, 'PetterParker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'PetterParker@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1103, 'ClarkKent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'ClarkKent@mydomain.com', 'fr', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1104, 'TonyStark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'TonyStark@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1105, 'MaxEisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1106, 'DavidCharlesHaller', 'David Charles Haller', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1107, 'HankPym', 'Hank Pym', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'HankPym@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1108, 'CharlesXavier', 'Charles Xavier', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'CharlesXavier@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1109, 'BruceBanner', 'Bruce Banner', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'BruceBanner@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29' - ), - ( - 1110, 'JessicaJones', 'Jessica Jones', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'JessicaJones@mydomain.com', 'en', NULL - ), - ( - 1111, 'Missing', 'Missing', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL - ), - ( - 1112, 'Trash', 'Trash', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL - ); +INSERT INTO `account`.`user`(`id`,`name`,`nickname`, `password`,`role`,`active`,`email`,`lang`, `image`) + VALUES + (1101, 'BruceWayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'BruceWayne@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1102, 'PetterParker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'PetterParker@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1103, 'ClarkKent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'ClarkKent@mydomain.com', 'fr', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1104, 'TonyStark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'TonyStark@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1105, 'MaxEisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1106, 'DavidCharlesHaller', 'David Charles Haller', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1107, 'HankPym', 'Hank Pym', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'HankPym@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1108, 'CharlesXavier', 'Charles Xavier', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'CharlesXavier@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1109, 'BruceBanner', 'Bruce Banner', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'BruceBanner@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), + (1110, 'JessicaJones', 'Jessica Jones', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'JessicaJones@mydomain.com', 'en', NULL), + (1111, 'Missing', 'Missing', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL), + (1112, 'Trash', 'Trash', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL); UPDATE account.`user` -SET - passExpired = DATE_SUB( - util.VN_CURDATE (), INTERVAL 1 YEAR - ) -WHERE - name = 'maintenance'; + SET passExpired = DATE_SUB(util.VN_CURDATE(), INTERVAL 1 YEAR) + WHERE name = 'maintenance'; -INSERT INTO - `account`.`mailAlias` ( - `id`, `alias`, `description`, `isPublic` - ) -VALUES ( - 1, 'general', 'General mailing list', FALSE - ), - ( - 2, 'it', 'IT department', TRUE - ), - ( - 3, 'sales', 'Sales department', TRUE - ); +INSERT INTO `account`.`mailAlias`(`id`, `alias`, `description`, `isPublic`) + VALUES + (1, 'general', 'General mailing list', FALSE), + (2, 'it' , 'IT department' , TRUE), + (3, 'sales' , 'Sales department' , TRUE); -INSERT INTO - `account`.`mailAliasAccount` (`mailAlias`, `account`) -VALUES (1, 1), - (1, 18), - (3, 18), - (1, 9), - (2, 9); +INSERT INTO `account`.`mailAliasAccount`(`mailAlias`, `account`) + VALUES + (1, 1), + (1, 18), + (3, 18), + (1, 9), + (2, 9); -INSERT INTO - `account`.`mailForward` (`account`, `forwardTo`) -VALUES (1, 'employee@domain.local'); +INSERT INTO `account`.`mailForward`(`account`, `forwardTo`) + VALUES + (1, 'employee@domain.local'); -INSERT INTO - `vn`.`currency` (`id`, `code`, `name`, `ratio`) -VALUES (1, 'EUR', 'Euro', 1), - (2, 'USD', 'Dollar USA', 1.4), - (3, 'GBP', 'Libra', 1), - (4, 'JPY', 'Yen Japones', 1); -INSERT INTO - `vn`.`country` ( - `id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`, `hasDailyInvoice`, `CEE` - ) -VALUES ( - 1, 'España', 1, 'ES', 1, 24, 4, 0, 1 - ), - ( - 2, 'Italia', 1, 'IT', 1, 27, 4, 0, 1 - ), - ( - 3, 'Alemania', 1, 'DE', 1, 22, 4, 0, 1 - ), - ( - 4, 'Rumania', 1, 'RO', 1, 24, 4, 0, 1 - ), - ( - 5, 'Holanda', 1, 'NL', 1, 18, 4, 0, 1 - ), - ( - 8, 'Portugal', 1, 'PT', 1, 27, 4, 0, 1 - ), - ( - 13, 'Ecuador', 0, 'EC', 1, 24, 2, 1, 2 - ), - ( - 19, 'Francia', 1, 'FR', 1, 27, 4, 0, 1 - ), - ( - 30, 'Canarias', 1, 'IC', 1, 24, 4, 1, 2 - ); -INSERT INTO - `vn`.`warehouse` ( - `id`, `name`, `code`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasDms`, `hasComission`, `countryFk`, `hasProduction`, `isOrigin`, `isDestiny` - ) -VALUES ( - 1, 'Warehouse One', 'ALG', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - ), - ( - 2, 'Warehouse Two', NULL, 1, 1, 1, 1, 0, 1, 13, 1, 1, 0 - ), - ( - 3, 'Warehouse Three', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 - ), - ( - 4, 'Warehouse Four', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1 - ), - ( - 5, 'Warehouse Five', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 - ), - ( - 13, 'Inventory', 'inv', 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 - ), - ( - 60, 'Algemesi', NULL, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 - ); +INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) + VALUES + (1, 'EUR', 'Euro', 1), + (2, 'USD', 'Dollar USA', 1.4), + (3, 'GBP', 'Libra', 1), + (4, 'JPY', 'Yen Japones', 1); -INSERT INTO `vn`.`sectorType` (`id`, `code`) VALUES (1, 'normal'); +INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`, `hasDailyInvoice`, `CEE`) + VALUES + (1, 'España', 1, 'ES', 1, 24, 4, 0, 1), + (2, 'Italia', 1, 'IT', 1, 27, 4, 0, 1), + (3, 'Alemania', 1, 'DE', 1, 22, 4, 0, 1), + (4, 'Rumania', 1, 'RO', 1, 24, 4, 0, 1), + (5, 'Holanda', 1, 'NL', 1, 18, 4, 0, 1), + (8, 'Portugal', 1, 'PT', 1, 27, 4, 0, 1), + (13,'Ecuador', 0, 'EC', 1, 24, 2, 1, 2), + (19,'Francia', 1, 'FR', 1, 27, 4, 0, 1), + (30,'Canarias', 1, 'IC', 1, 24, 4, 1, 2); -INSERT INTO - `vn`.`sector` ( - `id`, `description`, `warehouseFk`, `code`, `typeFk` - ) -VALUES ( - 1, 'First sector', 1, 'FIRST', 1 - ), - ( - 2, 'Second sector', 2, 'SECOND', 1 - ); +INSERT INTO `vn`.`warehouse`(`id`, `name`, `code`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasDms`, `hasComission`, `countryFk`, `hasProduction`, `isOrigin`, `isDestiny`) + VALUES + (1, 'Warehouse One', 'ALG', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), + (2, 'Warehouse Two', NULL, 1, 1, 1, 1, 0, 1, 13, 1, 1, 0), + (3, 'Warehouse Three', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0), + (4, 'Warehouse Four', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1), + (5, 'Warehouse Five', NULL, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0), + (13, 'Inventory', 'inv', 1, 1, 1, 0, 0, 0, 1, 0, 0, 0), + (60, 'Algemesi', NULL, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0); -INSERT INTO - `vn`.`printer` ( - `id`, `name`, `path`, `isLabeler`, `sectorFk`, `ipAddress` - ) -VALUES ( - 1, 'printer1', 'path1', 0, 1, NULL - ), - ( - 2, 'printer2', 'path2', 1, 1, NULL - ), - ( - 4, 'printer4', 'path4', 0, NULL, '10.1.10.4' - ); +INSERT INTO `vn`.`sectorType` (`id`, `code`) + VALUES (1,'normal'); + +INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `code`, `typeFk`) + VALUES + (1, 'First sector', 1, 'FIRST', 1), + (2, 'Second sector', 2, 'SECOND',1); + +INSERT INTO `vn`.`printer` (`id`, `name`, `path`, `isLabeler`, `sectorFk`, `ipAddress`) + VALUES + (1, 'printer1', 'path1', 0, 1 , NULL), + (2, 'printer2', 'path2', 1, 1 , NULL), + (4, 'printer4', 'path4', 0, NULL, '10.1.10.4'); UPDATE `vn`.`sector` SET mainPrinterFk = 1 WHERE id = 1; -INSERT INTO - `vn`.`worker` ( - `id`, `code`, `firstName`, `lastName`, `bossFk`, `phone` - ) -VALUES ( - 1106, 'LGN', 'David Charles', 'Haller', 19, 432978106 - ), - ( - 1107, 'ANT', 'Hank', 'Pym', 19, 432978107 - ), - ( - 1108, 'DCX', 'Charles', 'Xavier', 19, 432978108 - ), - ( - 1109, 'HLK', 'Bruce', 'Banner', 19, 432978109 - ), - ( - 1110, 'JJJ', 'Jessica', 'Jones', 19, 432978110 - ); -INSERT INTO - `vn`.`parking` ( - `id`, `column`, `row`, `sectorFk`, `code`, `pickingOrder` - ) -VALUES ( - '1', 700, '01', 1, '700-01', 70001 - ), - ( - '2', 700, '02', 2, '700-02', 70002 - ), - ( - '3', 100, '01', 1, '100-01', 1 - ), - ( - 32397, 100, '02', 1, 'A-47-1', 1165 - ), - ( - 34831, 200, '01', 1, 'K-26-2', 20220 - ), - ( - 34965, 200, '02', 2, 'L-08-4', 21800 - ), - ( - 39096, 200, '03', 2, 'LR-02-3', 99999 - ); +INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`,`bossFk`, `phone`) + VALUES + (1106, 'LGN', 'David Charles', 'Haller', 19, 432978106), + (1107, 'ANT', 'Hank' , 'Pym' , 19, 432978107), + (1108, 'DCX', 'Charles' , 'Xavier', 19, 432978108), + (1109, 'HLK', 'Bruce' , 'Banner', 19, 432978109), + (1110, 'JJJ', 'Jessica' , 'Jones' , 19, 432978110); -INSERT INTO - `vn`.`shelving` ( - `code`, `parkingFk`, `isPrinted`, `priority`, `userFk`, `isRecyclable` - ) -VALUES ('AA6', 34965, 1, 0, NULL, 0), - ('AA7', 34965, 1, 0, NULL, 0), - ('AA8', 34965, 1, 0, NULL, 0), - ('AA9', NULL, 1, 0, NULL, 0), - ('AAA', NULL, 0, 0, 1109, 1), - ('AAB', NULL, 0, 0, 1109, 1), - ('AAC', NULL, 1, 99, 1109, 1), - ('AAD', NULL, 0, 0, 1109, 1), - ('AAE', 39096, 1, 0, 1109, 1), - ('AAF', 34831, 1, 0, 1109, 1), - ('GVC', 1, 0, 1, 1106, 1), - ('HEJ', 2, 0, 1, 1106, 1), - ('UXN', 1, 0, 1, 1106, 1); +INSERT INTO `vn`.`parking` (`id`, `column`, `row`, `sectorFk`, `code`, `pickingOrder`) + VALUES + ('1', 700, '01', 1, '700-01', 70001), + ('2', 700, '02', 2, '700-02', 70002), + ('3', 100, '01', 1, '100-01', 1), + (32397, 100, '02', 1, 'A-47-1', 1165), + (34831, 200, '01', 1, 'K-26-2', 20220), + (34965, 200, '02', 2, 'L-08-4', 21800), + (39096, 200, '03', 2, 'LR-02-3', 99999); -INSERT INTO - `vn`.`accountingType` ( - `id`, `description`, `receiptDescription`, `code`, `maxAmount`, `daysInFuture` - ) -VALUES ( - 1, 'CC and credit policies', 'Transfers', 'wireTransfer', NULL, 1 - ), - ( - 2, 'Cash', 'Cash', 'cash', 1000, 0 - ), - ( - 3, 'Credit card', 'Credit Card', 'creditCard', NULL, 0 - ), - ( - 4, 'Finalcial lines', NULL, NULL, NULL, 0 - ), - ( - 5, 'Other products', NULL, NULL, NULL, 0 - ), - ( - 6, 'Loans', NULL, NULL, NULL, 0 - ), - ( - 7, 'Leasing', NULL, NULL, NULL, 0 - ), - ( - 8, 'Compensations', 'Compensations', 'compensation', NULL, 0 - ); +INSERT INTO `vn`.`shelving` (`code`, `parkingFk`, `isPrinted`, `priority`, `userFk`, `isRecyclable`) + VALUES + ('AA6', 34965, 1, 0, NULL, 0), + ('AA7', 34965, 1, 0, NULL, 0), + ('AA8', 34965, 1, 0, NULL, 0), + ('AA9', NULL, 1, 0, NULL, 0), + ('AAA', NULL, 0, 0, 1109, 1), + ('AAB', NULL, 0, 0, 1109, 1), + ('AAC', NULL, 1, 99, 1109, 1), + ('AAD', NULL, 0, 0, 1109, 1), + ('AAE', 39096, 1, 0, 1109, 1), + ('AAF', 34831, 1, 0, 1109, 1), + ('GVC', 1, 0, 1, 1106, 1), + ('HEJ', 2, 0, 1, 1106, 1), + ('UXN', 1, 0, 1, 1106, 1); -INSERT INTO - `vn`.`bankEntity` ( - `id`, `countryFk`, `name`, `bic` - ) -VALUES ( - 128, 1, 'The Best Bank', 'BBKKESMMMMMM' - ), - ( - 2100, 1, 'Caixa Bank', 'CAIXESBB' - ); +INSERT INTO `vn`.`accountingType`(`id`, `description`, `receiptDescription`,`code`, `maxAmount`, `daysInFuture`) + VALUES + (1, 'CC and credit policies', 'Transfers', 'wireTransfer', NULL, 1), + (2, 'Cash', 'Cash', 'cash', 1000, 0), + (3, 'Credit card', 'Credit Card', 'creditCard', NULL, 0), + (4, 'Finalcial lines', NULL, NULL, NULL, 0), + (5, 'Other products', NULL, NULL, NULL, 0), + (6, 'Loans', NULL, NULL, NULL, 0), + (7, 'Leasing', NULL, NULL, NULL, 0), + (8, 'Compensations', 'Compensations', 'compensation', NULL, 0); -INSERT INTO - `vn`.`accounting` ( - `id`, `bank`, `account`, `accountingTypeFk`, `entityFk`, `isActive`, `currencyFk`, `code` - ) -VALUES ( - 1, 'Pay on receipt', '5720000001', 3, 128, 1, 1, 'payOnReceipt' - ), - ( - 2, 'Cash', '5700000001', 2, 128, 1, 1, 'cash' - ), - ( - 3, 'Compensation', '4000000000', 8, 128, 1, 1, 'compensation' - ), - ( - 4, 'Transfers', '4000000001', 1, 128, 1, 1, 'transfers' - ), - ( - 3117, 'Caixa Rural d''Algemesi', '5720000000', 8, 2100, 1, 1, 'cra' - ); +INSERT INTO `vn`.`bankEntity`(`id`, `countryFk`, `name`, `bic`) + VALUES + (128, 1, 'The Best Bank', 'BBKKESMMMMMM'), + (2100, 1, 'Caixa Bank', 'CAIXESBB'); -INSERT INTO - `vn`.`deliveryMethod` (`id`, `code`, `description`) -VALUES (1, 'AGENCY', 'Agencia'), - (2, 'DELIVERY', 'Reparto'), - (3, 'PICKUP', 'Recogida'), - (4, 'OTHER', 'Otros'); +INSERT INTO `vn`.`accounting`(`id`, `bank`, `account`, `accountingTypeFk`, `entityFk`, `isActive`, `currencyFk`, `code`) + VALUES + (1, 'Pay on receipt', '5720000001', 3, 128, 1, 1, 'payOnReceipt'), + (2, 'Cash', '5700000001', 2, 128, 1, 1, 'cash'), + (3, 'Compensation', '4000000000', 8, 128, 1, 1, 'compensation'), + (4, 'Transfers', '4000000001', 1, 128, 1, 1, 'transfers'), + (3117, 'Caixa Rural d''Algemesi', '5720000000', 8, 2100, 1, 1, 'cra'); -INSERT INTO - `vn`.`agency` (`id`, `name`, `warehouseFk`) -VALUES (1, 'inhouse pickup', 1), - (2, 'Super-Man delivery', 1), - (3, 'Teleportation device', 1), - (4, 'Entanglement', 1), - (5, 'Quantum break device', 1), - (6, 'Walking', 1), - (7, 'Gotham247', 1), - (8, 'Gotham247Expensive', 1), - (9, 'Refund', 1), - (10, 'Other agency', 1); +INSERT INTO `vn`.`deliveryMethod`(`id`, `code`, `description`) + VALUES + (1, 'AGENCY', 'Agencia'), + (2, 'DELIVERY', 'Reparto'), + (3, 'PICKUP', 'Recogida'), + (4, 'OTHER', 'Otros'); -UPDATE `vn`.`agencyMode` -SET - `id` = 1 -WHERE - `name` = 'inhouse pickup'; - -UPDATE `vn`.`agencyMode` -SET - `id` = 2 -WHERE - `name` = 'Super-Man delivery'; - -UPDATE `vn`.`agencyMode` -SET - `id` = 3 -WHERE - `name` = 'Teleportation device'; +INSERT INTO `vn`.`agency`(`id`, `name`, `warehouseFk`) + VALUES + (1, 'inhouse pickup' , 1), + (2, 'Super-Man delivery' , 1), + (3, 'Teleportation device' , 1), + (4, 'Entanglement' , 1), + (5, 'Quantum break device' , 1), + (6, 'Walking' , 1), + (7, 'Gotham247' , 1), + (8, 'Gotham247Expensive' , 1), + (9, 'Refund' , 1), + (10, 'Other agency' , 1); +UPDATE `vn`.`agencyMode` SET `id` = 1 WHERE `name` = 'inhouse pickup'; +UPDATE `vn`.`agencyMode` SET `id` = 2 WHERE `name` = 'Super-Man delivery'; +UPDATE `vn`.`agencyMode` SET `id` = 3 WHERE `name` = 'Teleportation device'; UPDATE `vn`.`agencyMode` SET `id` = 4 WHERE `name` = 'Entanglement'; - -UPDATE `vn`.`agencyMode` -SET - `id` = 5 -WHERE - `name` = 'Quantum break device'; - +UPDATE `vn`.`agencyMode` SET `id` = 5 WHERE `name` = 'Quantum break device'; UPDATE `vn`.`agencyMode` SET `id` = 6 WHERE `name` = 'Walking'; - UPDATE `vn`.`agencyMode` SET `id` = 7 WHERE `name` = 'Gotham247'; - -UPDATE `vn`.`agencyMode` -SET - `id` = 8 -WHERE - `name` = 'Gotham247Expensive'; - +UPDATE `vn`.`agencyMode` SET `id` = 8 WHERE `name` = 'Gotham247Expensive'; UPDATE `vn`.`agencyMode` SET `id` = 23 WHERE `name` = 'Refund'; - UPDATE `vn`.`agencyMode` SET `id` = 10 WHERE `name` = 'Other agency'; UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 3 WHERE `id` = 1; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 2; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 2 WHERE `id` = 3; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 4; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 5; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 2 WHERE `id` = 6; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 7; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 8; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 4 WHERE `id` = 23; - UPDATE `vn`.`agencyMode` SET `deliveryMethodFk` = 1 WHERE `id` = 10; -UPDATE `vn`.`agencyMode` -SET - `web` = 1, - `reportMail` = 'no-reply@gothamcity.com'; +UPDATE `vn`.`agencyMode` SET `web` = 1, `reportMail` = 'no-reply@gothamcity.com'; -UPDATE `vn`.`agencyMode` SET `code` = 'refund' WHERE `id` = 23; +UPDATE `vn`.`agencyMode` SET `code` = 'refund' WHERE `id` = 23; -INSERT INTO - `vn`.`payMethod` ( - `id`, `code`, `name`, `graceDays`, `outstandingDebt`, `isIbanRequiredForClients`, `isIbanRequiredForSuppliers`, `hasVerified` - ) -VALUES ( - 1, NULL, 'PayMethod one', 0, 001, 0, 0, 0 - ), - ( - 2, NULL, 'PayMethod two', 10, 001, 0, 0, 1 - ), - ( - 3, 'compensation', 'PayMethod three', 0, 001, 0, 0, 0 - ), - ( - 4, NULL, 'PayMethod with IBAN', 0, 001, 1, 0, 0 - ), - ( - 5, NULL, 'PayMethod five', 10, 001, 0, 0, 0 - ), - ( - 8, 'wireTransfer', 'WireTransfer', 5, 001, 1, 1, 0 - ); +INSERT INTO `vn`.`payMethod`(`id`,`code`, `name`, `graceDays`, `outstandingDebt`, `isIbanRequiredForClients`, `isIbanRequiredForSuppliers`, `hasVerified`) + VALUES + (1, NULL, 'PayMethod one', 0, 001, 0, 0, 0), + (2, NULL, 'PayMethod two', 10, 001, 0, 0, 1), + (3, 'compensation', 'PayMethod three', 0, 001, 0, 0, 0), + (4, NULL, 'PayMethod with IBAN', 0, 001, 1, 0, 0), + (5, NULL, 'PayMethod five', 10, 001, 0, 0, 0), + (8,'wireTransfer', 'WireTransfer', 5, 001, 1, 1, 0); -INSERT INTO - `vn`.`payDem` (`id`, `payDem`) -VALUES (1, 10), - (2, 20), - (7, 0); +INSERT INTO `vn`.`payDem`(`id`, `payDem`) + VALUES + (1, 10), + (2, 20), + (7, 0); -INSERT INTO - `vn`.`autonomy` (`id`, `name`, `countryFk`) -VALUES (1, 'Autonomy one', 1), - (2, 'Autonomy two', 1), - (3, 'Autonomy three', 2), - (4, 'Autonomy four', 13); +INSERT INTO `vn`.`autonomy`(`id`, `name`, `countryFk`) + VALUES + (1, 'Autonomy one', 1), + (2, 'Autonomy two', 1), + (3, 'Autonomy three', 2), + (4, 'Autonomy four', 13); -INSERT INTO - `vn`.`province` ( - `id`, `name`, `countryFk`, `autonomyFk`, `warehouseFk` - ) -VALUES (1, 'Province one', 1, 1, NULL), - (2, 'Province two', 1, 1, NULL), - ( - 3, 'Province three', 30, 2, NULL - ), - ( - 4, 'Province four', 2, 3, NULL - ), - ( - 5, 'Province five', 13, 4, NULL - ); -INSERT INTO - `vn`.`town` (`id`, `name`, `provinceFk`) -VALUES (1, 'Valencia', 1), - (2, 'Gotham', 1), - (3, 'Algemesi', 1), - (4, 'Alzira', 1), - (5, 'Quito', 5); +INSERT INTO `vn`.`province`(`id`, `name`, `countryFk`, `autonomyFk`, `warehouseFk`) + VALUES + (1, 'Province one', 1, 1, NULL), + (2, 'Province two', 1, 1, NULL), + (3, 'Province three', 30, 2, NULL), + (4, 'Province four', 2, 3, NULL), + (5, 'Province five', 13, 4, NULL); -INSERT INTO - `vn`.`postCode` (`code`, `townFk`, `geoFk`) -VALUES ('46000', 1, 6), - ('46460', 2, 6), - ('46680', 3, 6), - ('46600', 4, 7), - ('EC170150', 5, 8); +INSERT INTO `vn`.`town`(`id`, `name`, `provinceFk`) + VALUES + (1, 'Valencia', 1), + (2, 'Gotham', 1), + (3, 'Algemesi', 1), + (4, 'Alzira', 1), + (5, 'Quito', 5); -INSERT INTO - `vn`.`clientType` (`id`, `code`, `type`) -VALUES (1, 'normal', 'Normal'), - ( - 2, 'internalUse', 'Autoconsumo' - ), - (3, 'handMaking', 'Confección'), - (4, 'loses', 'Mermas'); +INSERT INTO `vn`.`postCode`(`code`, `townFk`, `geoFk`) + VALUES + ('46000', 1, 6), + ('46460', 2, 6), + ('46680', 3, 6), + ('46600', 4, 7), + ('EC170150', 5, 8); -INSERT INTO - `vn`.`cplusTerIdNif` (`id`, `description`) -VALUES (1, 'NIF'); +INSERT INTO `vn`.`clientType`(`id`, `code`, `type`) + VALUES + (1, 'normal', 'Normal'), + (2, 'internalUse', 'Autoconsumo'), + (3, 'handMaking', 'Confección'), + (4, 'loses', 'Mermas'); -INSERT INTO - `vn`.`contactChannel` (`id`, `name`) -VALUES (1, 'Rumors on the streets'), - (2, 'Metropolis newspaper'), - (3, 'Daily Bugle'), - (4, 'GCN Channel'), - (5, 'The Newspaper'); +INSERT INTO `vn`.`cplusTerIdNif`(`id`, `description`) + VALUES + (1, 'NIF'); -INSERT INTO - `vn`.`client` ( - `id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `phone`, `mobile`, `isRelevant`, `email`, `iban`, `dueDay`, `accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`, `created`, `isToBeMailed`, `contactChannelFk`, `hasSepaVnl`, `hasCoreVnl`, `hasCoreVnh`, `riskCalculated`, `clientTypeFk`, `hasToInvoiceByAddress`, `isTaxDataChecked`, `isFreezed`, `creditInsurance`, `isCreatedAsServed`, `hasInvoiceSimplified`, `salesPersonFk`, `isVies`, `eypbc`, `businessTypeFk`, `typeFk` - ) -VALUES ( - 1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist', 'normal' - ), - ( - 1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist', 'normal' - ), - ( - 1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist', 'normal' - ), - ( - 1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist', 'normal' - ), - ( - 1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist', 'normal' - ), - ( - 1106, 'DavidCharlesHaller', '53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist', 'normal' - ), - ( - 1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist', 'normal' - ), - ( - 1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist', 'normal' - ), - ( - 1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist', 'normal' - ), - ( - 1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist', 'normal' - ), - ( - 1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others', 'loses' - ), - ( - 1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE (), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others', 'loses' - ); +INSERT INTO `vn`.`contactChannel`(`id`, `name`) + VALUES + (1, 'Rumors on the streets'), + (2, 'Metropolis newspaper'), + (3, 'Daily Bugle'), + (4, 'GCN Channel'), + (5, 'The Newspaper'); -INSERT INTO - `vn`.`client` ( - `id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`, `dueDay`, `accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`, `created`, `isTaxDataChecked` - ) -SELECT - id, - name, - CONCAT( - RPAD(CONCAT(id, 9), 8, id), 'A' - ), - CONCAT(name, 'Social'), - CONCAT(name, 'Contact'), - CONCAT(name, 'Street'), - 'GOTHAM', - 46460, - 1, - CONCAT(name, '@mydomain.com'), - NULL, - 0, - 1234567890, - 0, - 1, - 1, - 300, - 1, - 1, - NULL, - 10, - 5, - util.VN_CURDATE (), - 1 -FROM `account`.`role` `r` -WHERE - `r`.`hasLogin` = 1; +INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`,`typeFk`) + VALUES + (1101, 'Bruce Wayne', '84612325V', 'BATMAN', 'Alfred', '1007 MOUNTAIN DRIVE, GOTHAM', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), + (1102, 'Petter Parker', '87945234L', 'SPIDER MAN', 'Aunt May', '20 INGRAM STREET, QUEENS, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), + (1103, 'Clark Kent', '06815934E', 'SUPER MAN', 'lois lane', '344 CLINTON STREET, APARTAMENT 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), + (1104, 'Tony Stark', '06089160W', 'IRON MAN', 'Pepper Potts', '10880 MALIBU POINT, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist','normal'), + (1105, 'Max Eisenhardt', '251628698', 'MAGNETO', 'Rogue', 'UNKNOWN WHEREABOUTS', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist','normal'), + (1106, 'DavidCharlesHaller', '53136686Q', 'LEGION', 'Charles Xavier', 'CITY OF NEW YORK, NEW YORK, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist','normal'), + (1107, 'Hank Pym', '09854837G', 'ANT MAN', 'Hawk', 'ANTHILL, SAN FRANCISCO, CALIFORNIA', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist','normal'), + (1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist','normal'), + (1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist','normal'), + (1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist','normal'), + (1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','loses'), + (1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others','loses'); -INSERT INTO - `vn`.`clientManaCache` (`clientFk`, `mana`, `dated`) -VALUES ( - 1101, 50, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 1102, 100, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 1103, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 1104, -30, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ); +INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`) + SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1 + FROM `account`.`role` `r` + WHERE `r`.`hasLogin` = 1; -INSERT INTO - `vn`.`mandateType` (`id`, `name`) -VALUES (1, 'B2B'), - (2, 'CORE'), - (3, 'LCR'); +INSERT INTO `vn`.`clientManaCache`(`clientFk`, `mana`, `dated`) + VALUES + (1101, 50, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (1102, 100, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (1103, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (1104, -30, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)); -INSERT INTO - `vn`.`clientConfig` ( - `id`, `riskTolerance`, `maxCreditRows`, `maxPriceIncreasingRatio`, `riskScope`, `defaultPayMethodFk`, `defaultDueDay`, `defaultCredit`, `defaultIsTaxDataChecked`, `defaultHasCoreVnl`, `defaultMandateTypeFk` - ) -VALUES ( - 1, 200, 10, 0.25, 2, 4, 5, 300.00, 1, 1, 2 - ); +INSERT INTO `vn`.`mandateType`(`id`, `name`) + VALUES + (1, 'B2B'), + (2, 'CORE'), + (3, 'LCR'); -INSERT INTO - `vn`.`address` ( - `id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress` - ) -VALUES ( - 1, 'Bruce Wayne', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 1 - ), - ( - 2, 'Petter Parker', '20 Ingram Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 1 - ), - ( - 3, 'Clark Kent', '344 Clinton Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 1 - ), - ( - 4, 'Tony Stark', '10880 Malibu Point', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1104, 2, NULL, NULL, 0, 1 - ), - ( - 5, 'Max Eisenhardt', 'Unknown Whereabouts', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 1 - ), - ( - 6, 'DavidCharlesHaller', 'Evil hideout', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 1 - ), - ( - 7, 'Hank Pym', 'Anthill', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 1 - ), - ( - 8, 'Charles Xavier', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 1 - ), - ( - 9, 'Bruce Banner', 'Somewhere in New York', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 1 - ), - ( - 10, 'Jessica Jones', 'NYCC 2015 Poster', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 1 - ), - ( - 11, 'Missing', 'The space', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1111, 10, NULL, NULL, 0, 1 - ), - ( - 12, 'Trash', 'New York city', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1112, 10, NULL, NULL, 0, 1 - ), - ( - 101, 'Somewhere in Thailand', 'address 01', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 102, 'Somewhere in Poland', 'address 02', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 103, 'Somewhere in Japan', 'address 03', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 104, 'Somewhere in Spain', 'address 04', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 105, 'Somewhere in Potugal', 'address 05', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 106, 'Somewhere in UK', 'address 06', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 107, 'Somewhere in Valencia', 'address 07', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 108, 'Somewhere in Gotham', 'address 08', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 109, 'Somewhere in London', 'address 09', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 110, 'Somewhere in Algemesi', 'address 10', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 111, 'Somewhere in Carlet', 'address 11', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 112, 'Somewhere in Campanar', 'address 12', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 113, 'Somewhere in Malilla', 'address 13', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 114, 'Somewhere in France', 'address 14', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 115, 'Somewhere in Birmingham', 'address 15', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 116, 'Somewhere in Scotland', 'address 16', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 117, 'Somewhere in nowhere', 'address 17', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 118, 'Somewhere over the rainbow', 'address 18', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 119, 'Somewhere in Alberic', 'address 19', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 120, 'Somewhere in Montortal', 'address 20', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0 - ), - ( - 121, 'the bat cave', 'address 21', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 0 - ), - ( - 122, 'NY roofs', 'address 22', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 0 - ), - ( - 123, 'The phone box', 'address 23', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 0 - ), - ( - 124, 'Stark tower Gotham', 'address 24', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1104, 2, NULL, NULL, 0, 0 - ), - ( - 125, 'The plastic cell', 'address 25', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 0 - ), - ( - 126, 'Many places', 'address 26', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 0 - ), - ( - 127, 'Your pocket', 'address 27', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 0 - ), - ( - 128, 'Cerebro', 'address 28', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 0 - ), - ( - 129, 'Luke Cages Bar', 'address 29', 'Gotham', 'EC170150', 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 0 - ), - ( - 130, 'Non valid address', 'address 30', 'Gotham', 46460, 1, 1111111111, 222222222, 0, 1101, 2, NULL, NULL, 0, 0 - ); +INSERT INTO `vn`.`clientConfig`(`id`, `riskTolerance`, `maxCreditRows`, `maxPriceIncreasingRatio`, `riskScope`, `defaultPayMethodFk`, `defaultDueDay`, `defaultCredit`, `defaultIsTaxDataChecked`, `defaultHasCoreVnl`, `defaultMandateTypeFk`) + VALUES + (1, 200, 10, 0.25, 2, 4, 5, 300.00, 1, 1, 2); -INSERT INTO - `vn`.`address` ( - `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `isActive`, `clientFk`, `agencyModeFk`, `isDefaultAddress` - ) -SELECT name, CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, 1, id, 2, 1 -FROM `account`.`role` `r` -WHERE - `r`.`hasLogin` = 1; + +INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress`) + VALUES + (1, 'Bruce Wayne', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 1), + (2, 'Petter Parker', '20 Ingram Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 1), + (3, 'Clark Kent', '344 Clinton Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 1), + (4, 'Tony Stark', '10880 Malibu Point', 'Gotham', 46460, 1, 1111111111, 222222222, 1 , 1104, 2, NULL, NULL, 0, 1), + (5, 'Max Eisenhardt', 'Unknown Whereabouts', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 1), + (6, 'DavidCharlesHaller', 'Evil hideout', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 1), + (7, 'Hank Pym', 'Anthill', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 1), + (8, 'Charles Xavier', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 1), + (9, 'Bruce Banner', 'Somewhere in New York', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 1), + (10, 'Jessica Jones', 'NYCC 2015 Poster', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 1), + (11, 'Missing', 'The space', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1111, 10, NULL, NULL, 0, 1), + (12, 'Trash', 'New York city', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1112, 10, NULL, NULL, 0, 1), + (101, 'Somewhere in Thailand', 'address 01', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (102, 'Somewhere in Poland', 'address 02', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0), + (103, 'Somewhere in Japan', 'address 03', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0), + (104, 'Somewhere in Spain', 'address 04', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0), + (105, 'Somewhere in Potugal', 'address 05', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0), + (106, 'Somewhere in UK', 'address 06', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0), + (107, 'Somewhere in Valencia', 'address 07', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0), + (108, 'Somewhere in Gotham', 'address 08', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0), + (109, 'Somewhere in London', 'address 09', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (110, 'Somewhere in Algemesi', 'address 10', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (111, 'Somewhere in Carlet', 'address 11', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (112, 'Somewhere in Campanar', 'address 12', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (113, 'Somewhere in Malilla', 'address 13', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (114, 'Somewhere in France', 'address 14', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (115, 'Somewhere in Birmingham', 'address 15', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (116, 'Somewhere in Scotland', 'address 16', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (117, 'Somewhere in nowhere', 'address 17', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (118, 'Somewhere over the rainbow', 'address 18', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (119, 'Somewhere in Alberic', 'address 19', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (120, 'Somewhere in Montortal', 'address 20', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0), + (121, 'the bat cave', 'address 21', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 0), + (122, 'NY roofs', 'address 22', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 0), + (123, 'The phone box', 'address 23', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 0), + (124, 'Stark tower Gotham', 'address 24', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1104, 2, NULL, NULL, 0, 0), + (125, 'The plastic cell', 'address 25', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 0), + (126, 'Many places', 'address 26', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 0), + (127, 'Your pocket', 'address 27', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 0), + (128, 'Cerebro', 'address 28', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 0), + (129, 'Luke Cages Bar', 'address 29', 'Gotham', 'EC170150', 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 0), + (130, 'Non valid address', 'address 30', 'Gotham', 46460, 1, 1111111111, 222222222, 0, 1101, 2, NULL, NULL, 0, 0); + +INSERT INTO `vn`.`address`( `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `isActive`, `clientFk`, `agencyModeFk`, `isDefaultAddress`) + SELECT name, CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, 1, id, 2, 1 + FROM `account`.`role` `r` + WHERE `r`.`hasLogin` = 1; UPDATE `vn`.`client` SET defaultAddressFk = 1 WHERE id = 1101; - UPDATE `vn`.`client` SET defaultAddressFk = 2 WHERE id = 1102; - UPDATE `vn`.`client` SET defaultAddressFk = 3 WHERE id = 1103; - UPDATE `vn`.`client` SET defaultAddressFk = 4 WHERE id = 1104; - UPDATE `vn`.`client` SET defaultAddressFk = 5 WHERE id = 1105; - UPDATE `vn`.`client` SET defaultAddressFk = 6 WHERE id = 1106; - UPDATE `vn`.`client` SET defaultAddressFk = 7 WHERE id = 1107; - UPDATE `vn`.`client` SET defaultAddressFk = 8 WHERE id = 1108; - UPDATE `vn`.`client` SET defaultAddressFk = 9 WHERE id = 1109; - UPDATE `vn`.`client` SET defaultAddressFk = 10 WHERE id = 1110; - UPDATE `vn`.`client` SET defaultAddressFk = 11 WHERE id = 200; - UPDATE `vn`.`client` SET defaultAddressFk = 12 WHERE id = 400; DROP TEMPORARY TABLE IF EXISTS tmp.address; -CREATE TEMPORARY TABLE tmp.address SELECT * FROM `vn`.`address`; - -UPDATE `vn`.`client` `c` -JOIN `tmp`.`address` `a` ON `a`.`clientFk` = `c`.`id` -SET - `c`.`defaultAddressFk` = `a`.`id` -WHERE - `defaultAddressFk` IS NULL; +CREATE TEMPORARY TABLE tmp.address + SELECT * FROM `vn`.`address`; + UPDATE `vn`.`client` `c` + JOIN `tmp`.`address` `a` ON `a`.`clientFk` = `c`.`id` + SET `c`.`defaultAddressFk` = `a`.`id` + WHERE `defaultAddressFk` IS NULL; DROP TEMPORARY TABLE tmp.address; -INSERT INTO - `vn`.`clientCredit` ( - `clientFk`, `workerFk`, `amount`, `created` - ) -VALUES ( - 1101, 5, 300, DATE_ADD( - util.VN_CURDATE (), INTERVAL -11 MONTH - ) - ), - ( - 1101, 5, 900, DATE_ADD( - util.VN_CURDATE (), INTERVAL -10 MONTH - ) - ), - ( - 1101, 5, 800, DATE_ADD( - util.VN_CURDATE (), INTERVAL -9 MONTH - ) - ), - ( - 1101, 5, 700, DATE_ADD( - util.VN_CURDATE (), INTERVAL -8 MONTH - ) - ), - ( - 1101, 5, 600, DATE_ADD( - util.VN_CURDATE (), INTERVAL -7 MONTH - ) - ), - ( - 1101, 5, 500, DATE_ADD( - util.VN_CURDATE (), INTERVAL -6 MONTH - ) - ), - ( - 1101, 5, 400, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 MONTH - ) - ), - ( - 1101, 9, 300, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ) - ), - ( - 1101, 9, 200, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ) - ), - ( - 1101, 9, 100, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ) - ), - ( - 1101, 9, 50, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 1102, 9, 800, util.VN_CURDATE () - ), - ( - 1104, 9, 90, util.VN_CURDATE () - ), - ( - 1105, 9, 90, util.VN_CURDATE () - ); +INSERT INTO `vn`.`clientCredit`(`clientFk`, `workerFk`, `amount`, `created`) + VALUES + (1101, 5, 300, DATE_ADD(util.VN_CURDATE(), INTERVAL -11 MONTH)), + (1101, 5, 900, DATE_ADD(util.VN_CURDATE(), INTERVAL -10 MONTH)), + (1101, 5, 800, DATE_ADD(util.VN_CURDATE(), INTERVAL -9 MONTH)), + (1101, 5, 700, DATE_ADD(util.VN_CURDATE(), INTERVAL -8 MONTH)), + (1101, 5, 600, DATE_ADD(util.VN_CURDATE(), INTERVAL -7 MONTH)), + (1101, 5, 500, DATE_ADD(util.VN_CURDATE(), INTERVAL -6 MONTH)), + (1101, 5, 400, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 MONTH)), + (1101, 9, 300, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH)), + (1101, 9, 200, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH)), + (1101, 9, 100, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), + (1101, 9, 50 , DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (1102, 9, 800, util.VN_CURDATE()), + (1104, 9, 90 , util.VN_CURDATE()), + (1105, 9, 90 , util.VN_CURDATE()); -INSERT INTO - `vn`.`roleCreditLimit` (`id`, `maxAmount`, `roleFk`) -VALUES (1, 9999999, 20), - (2, 10000, 21), - (3, 600, 13); +INSERT INTO `vn`.`roleCreditLimit`(`id`, `maxAmount`, `roleFk`) + VALUES + (1, 9999999, 20), + (2, 10000, 21), + (3, 600, 13); -INSERT INTO - `vn`.`clientObservation` ( - `id`, `clientFk`, `workerFk`, `text`, `created` - ) -VALUES ( - 1, 1101, 1, 'Madness, as you know, is like gravity, all it takes is a little push', util.VN_CURDATE () - ), - ( - 2, 1102, 1, 'With great power, comes great responsibility', util.VN_CURDATE () - ), - ( - 3, 1103, 3, 'this is a job for Super-Man!', util.VN_CURDATE () - ), - ( - 4, 1104, 3, 'yes... I am Iron-Man', util.VN_CURDATE () - ), - ( - 5, 1105, 5, 'They do understand. Our mutant powers make us superior', util.VN_CURDATE () - ), - ( - 6, 1106, 5, 'My name is Legion, for we are many!', util.VN_CURDATE () - ), - ( - 7, 1107, 9, 'I think our first move should be calling the Avengers..', util.VN_CURDATE () - ), - ( - 8, 1108, 9, 'Just because someone stumbles and loses their path, does not mean they are lost forever.', util.VN_CURDATE () - ), - ( - 9, 1109, 18, 'HULK SMASH! ...', util.VN_CURDATE () - ), - ( - 10, 1110, 18, 'They say everyone is born a hero. But if you let it, life will push you over the line until you are the villain.', util.VN_CURDATE () - ); +INSERT INTO `vn`.`clientObservation`(`id`, `clientFk`, `workerFk`, `text`, `created`) + VALUES + (1, 1101, 1, 'Madness, as you know, is like gravity, all it takes is a little push', util.VN_CURDATE()), + (2, 1102, 1, 'With great power, comes great responsibility', util.VN_CURDATE()), + (3, 1103, 3, 'this is a job for Super-Man!', util.VN_CURDATE()), + (4, 1104, 3, 'yes... I am Iron-Man', util.VN_CURDATE()), + (5, 1105, 5, 'They do understand. Our mutant powers make us superior', util.VN_CURDATE()), + (6, 1106, 5, 'My name is Legion, for we are many!', util.VN_CURDATE()), + (7, 1107, 9, 'I think our first move should be calling the Avengers..', util.VN_CURDATE()), + (8, 1108, 9, 'Just because someone stumbles and loses their path, does not mean they are lost forever.', util.VN_CURDATE()), + (9, 1109, 18, 'HULK SMASH! ...', util.VN_CURDATE()), + (10, 1110, 18, 'They say everyone is born a hero. But if you let it, life will push you over the line until you are the villain.', util.VN_CURDATE()); -INSERT INTO - `vn`.`observationType` (`id`, `description`, `code`) -VALUES (1, 'ItemPicker', 'itemPicker'), - (2, 'Packager', 'packager'), - (3, 'Delivery', 'delivery'), - ( - 4, 'SalesPerson', 'salesPerson' - ), - ( - 5, 'Administrative', 'administrative' - ), - (6, 'Weight', 'weight'), - (7, 'InvoiceOut', 'invoiceOut'); +INSERT INTO `vn`.`observationType`(`id`,`description`, `code`) + VALUES + (1, 'ItemPicker', 'itemPicker'), + (2, 'Packager', 'packager'), + (3, 'Delivery', 'delivery'), + (4, 'SalesPerson', 'salesPerson'), + (5, 'Administrative', 'administrative'), + (6, 'Weight', 'weight'), + (7, 'InvoiceOut', 'invoiceOut'); -INSERT INTO - `vn`.`addressObservation` ( - `id`, `addressFk`, `observationTypeFk`, `description` - ) -VALUES (1, 121, 1, 'under the floor'), - ( - 2, 121, 2, 'wears leather and goes out at night' - ), - ( - 3, 121, 3, 'care with the dog' - ), - ( - 5, 122, 5, 'Delivery after 10am' - ); +INSERT INTO `vn`.`addressObservation`(`id`,`addressFk`,`observationTypeFk`,`description`) + VALUES + (1, 121, 1, 'under the floor'), + (2, 121, 2, 'wears leather and goes out at night'), + (3, 121, 3, 'care with the dog'), + (5, 122, 5, 'Delivery after 10am'); -INSERT INTO - `vn`.`creditClassification` ( - `id`, `client`, `dateStart`, `dateEnd` - ) -VALUES ( - 1, 1101, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 2, 1102, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 3, 1103, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 4, 1104, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 5, 1105, util.VN_CURDATE (), util.VN_CURDATE () - ); +INSERT INTO `vn`.`creditClassification`(`id`, `client`, `dateStart`, `dateEnd`) + VALUES + (1, 1101, util.VN_CURDATE(), util.VN_CURDATE()), + (2, 1102, util.VN_CURDATE(), util.VN_CURDATE()), + (3, 1103, util.VN_CURDATE(), util.VN_CURDATE()), + (4, 1104, util.VN_CURDATE(), util.VN_CURDATE()), + (5, 1105, util.VN_CURDATE(), util.VN_CURDATE()); -INSERT INTO - `vn`.`creditInsurance` ( - `id`, `creditClassificationFk`, `credit`, `creationDate`, `grade` - ) -VALUES ( - 1, 1, 3000, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), NULL - ), - ( - 2, 2, 6000, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), NULL - ), - ( - 3, 3, 10000, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), NULL - ); +INSERT INTO `vn`.`creditInsurance`(`id`, `creditClassificationFk`, `credit`, `creationDate`, `grade`) + VALUES + (1, 1, 3000, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL), + (2, 2, 6000, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL), + (3, 3, 10000, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL); -INSERT INTO - `vn`.`companyGroup` (`id`, `code`) -VALUES (1, 'wayneIndustries'), - (2, 'verdnatura'); +INSERT INTO `vn`.`companyGroup`(`id`, `code`) + VALUES + (1, 'wayneIndustries'), + (2, 'verdnatura'); -INSERT INTO - `vn`.`supplierActivity` (`code`, `name`) -VALUES ( - 'animals', 'Food and complements for pets' - ), - ( - 'complements', 'Other complements' - ), - ( - 'flowerPlants', 'Wholesale of flowers and plants' - ), - ( - 'vegetablesFruits', 'Fruit and vegetable trade' - ); +INSERT INTO `vn`.`supplierActivity`(`code`, `name`) + VALUES + ('animals', 'Food and complements for pets'), + ('complements', 'Other complements'), + ('flowerPlants', 'Wholesale of flowers and plants'), + ('vegetablesFruits', 'Fruit and vegetable trade'); -INSERT INTO - `vn`.`supplier` ( - `id`, `name`, `nickname`, `account`, `countryFk`, `nif`, `commission`, `created`, `isActive`, `street`, `city`, `provinceFk`, `postCode`, `payMethodFk`, `payDemFk`, `payDay`, `taxTypeSageFk`, `withholdingSageFk`, `transactionTypeSageFk`, `workerFk`, `supplierActivityFk`, `isPayMethodChecked`, `healthRegister` - ) -VALUES ( - 1, 'PLANTS SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE (), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V' - ), - ( - 2, 'FARMER KING', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE (), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V' - ), - ( - 69, 'PACKAGING', 'Packaging nick', 4100000069, 1, '94935005K', 0, util.VN_CURDATE (), 1, 'supplier address 5', 'ASGARD', 3, 46600, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V' - ), - ( - 442, 'VERDNATURA LEVANTE SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE (), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V' - ), - ( - 567, 'HOLLAND', 'Holland nick', 4000020567, 1, '14364089Z', 0, util.VN_CURDATE (), 1, 'supplier address 6', 'ASGARD', 3, 46600, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V' - ), - ( - 791, 'BROS SL', 'Bros nick', 5115000791, 1, '37718083S', 0, util.VN_CURDATE (), 1, 'supplier address 7', 'ASGARD', 3, 46600, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V' - ), - ( - 1381, 'ORNAMENTALES', 'Ornamentales', 7185001381, 1, '07972486L', 0, util.VN_CURDATE (), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V' - ); +INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif`, `commission`, `created`, `isActive`, `street`, `city`, `provinceFk`, `postCode`, `payMethodFk`, `payDemFk`, `payDay`, `taxTypeSageFk`, `withholdingSageFk`, `transactionTypeSageFk`, `workerFk`, `supplierActivityFk`, `isPayMethodChecked`, `healthRegister`) + VALUES + (1, 'PLANTS SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), + (2, 'FARMER KING', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), + (69, 'PACKAGING', 'Packaging nick', 4100000069, 1, '94935005K', 0, util.VN_CURDATE(), 1, 'supplier address 5', 'ASGARD', 3, 46600, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'), + (442, 'VERDNATURA LEVANTE SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), + (567, 'HOLLAND', 'Holland nick', 4000020567, 1, '14364089Z', 0, util.VN_CURDATE(), 1, 'supplier address 6', 'ASGARD', 3, 46600, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'), + (791, 'BROS SL', 'Bros nick', 5115000791, 1, '37718083S', 0, util.VN_CURDATE(), 1, 'supplier address 7', 'ASGARD', 3, 46600, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'), + (1381, 'ORNAMENTALES', 'Ornamentales', 7185001381, 1, '07972486L', 0, util.VN_CURDATE(), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'); -INSERT INTO - `vn`.`supplierAddress` ( - `id`, `supplierFk`, `nickname`, `street`, `provinceFk`, `postalCode`, `city`, `phone`, `mobile` - ) -VALUES ( - 1, 1, 'Ace Chemicals', 'The Midtown', 1, '46000', 'Gotham', '111111111', '222222222' - ), - ( - 2, 1, 'Arkham Asylum', 'Grand Avenue', 1, '46000', 'Gotham', '111111111', '222222222' - ), - ( - 3, 2, 'Wayne Tower', 'Grand Avenue', 1, '46000', 'Gotham', '111111111', '222222222' - ), - ( - 4, 2, 'Bank of Gotham', 'Founders Island', 1, '46000', 'Gotham', '111111111', '222222222' - ), - ( - 5, 442, 'GCR building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222' - ), - ( - 6, 442, 'The Gotham Tonight building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222' - ); +INSERT INTO `vn`.`supplierAddress`(`id`, `supplierFk`, `nickname`, `street`, `provinceFk`, `postalCode`, `city`, `phone`, `mobile`) + VALUES + (1, 1, 'Ace Chemicals', 'The Midtown', 1, '46000', 'Gotham', '111111111', '222222222'), + (2, 1, 'Arkham Asylum', 'Grand Avenue', 1, '46000', 'Gotham', '111111111', '222222222'), + (3, 2, 'Wayne Tower', 'Grand Avenue', 1, '46000', 'Gotham', '111111111', '222222222'), + (4, 2, 'Bank of Gotham', 'Founders Island', 1, '46000', 'Gotham', '111111111', '222222222'), + (5, 442, 'GCR building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222'), + (6, 442, 'The Gotham Tonight building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222'); -INSERT INTO - `vn`.`supplierContact` ( - `id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name` - ) -VALUES ( - 1, 1, 123121212, 654789123, 'supplier1@email.es', 'observation1', 'the boss' - ), - ( - 2, 1, 987456132, NULL, NULL, NULL, 'the salesperson' - ), - ( - 3, 2, 321654987, NULL, 'supplier2@email.es', NULL, NULL - ), - ( - 4, 442, 321654987, NULL, NULL, 'observation442', NULL - ); +INSERT INTO `vn`.`supplierContact`(`id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name`) + VALUES + (1, 1, 123121212, 654789123, 'supplier1@email.es', 'observation1', 'the boss'), + (2, 1, 987456132, NULL, NULL, NULL, 'the salesperson'), + (3, 2, 321654987, NULL, 'supplier2@email.es', NULL, NULL), + (4, 442, 321654987, NULL, NULL, 'observation442', NULL); -INSERT INTO - `vn`.`supplierAccount` ( - `id`, `supplierFk`, `iban`, `bankEntityFk` - ) -VALUES ( - 241, 442, 'ES111122333344111122221111', 128 - ); +INSERT INTO `vn`.`supplierAccount`(`id`, `supplierFk`, `iban`, `bankEntityFk`) + VALUES + (241, 442, 'ES111122333344111122221111', 128); -INSERT INTO - `vn`.`company` ( - `id`, `code`, `supplierAccountFk`, `workerManagerFk`, `companyCode`, `sage200Company`, `expired`, `companyGroupFk`, `phytosanitary`, `clientFk` - ) -VALUES ( - 69, 'CCs', NULL, 30, NULL, 0, NULL, 1, NULL, NULL - ), - ( - 442, 'VNL', 241, 30, 2, 1, NULL, 2, 'VNL Company - Plant passport', 1101 - ), - ( - 567, 'VNH', NULL, 30, NULL, 4, NULL, 1, 'VNH Company - Plant passport', NULL - ), - ( - 791, 'FTH', NULL, 30, NULL, 3, '2015-11-30', 1, NULL, NULL - ), - ( - 1381, 'ORN', NULL, 30, NULL, 7, NULL, 1, 'ORN Company - Plant passport', NULL - ); +INSERT INTO `vn`.`company`(`id`, `code`, `supplierAccountFk`, `workerManagerFk`, `companyCode`, `sage200Company`, `expired`, `companyGroupFk`, `phytosanitary` , `clientFk`) + VALUES + (69 , 'CCs', NULL, 30, NULL, 0, NULL, 1, NULL , NULL), + (442 , 'VNL', 241, 30, 2 , 1, NULL, 2, 'VNL Company - Plant passport' , 1101), + (567 , 'VNH', NULL, 30, NULL, 4, NULL, 1, 'VNH Company - Plant passport' , NULL), + (791 , 'FTH', NULL, 30, NULL, 3, '2015-11-30', 1, NULL , NULL), + (1381, 'ORN', NULL, 30, NULL, 7, NULL, 1, 'ORN Company - Plant passport' , NULL); -INSERT INTO - `vn`.`taxArea` ( - `code`, `claveOperacionFactura`, `CodigoTransaccion` - ) -VALUES ('CEE', 1, 10), - ('EQU', 0, 1), - ('NATIONAL', 0, 1), - ('WORLD', 2, 15); +INSERT INTO `vn`.`taxArea` (`code`, `claveOperacionFactura`, `CodigoTransaccion`) + VALUES + ('CEE', 1, 10), + ('EQU', 0, 1), + ('NATIONAL', 0, 1), + ('WORLD', 2, 15); -INSERT INTO vn.invoiceOutConfig SET parallelism = 8; +INSERT INTO vn.invoiceOutConfig + SET parallelism = 8; -INSERT INTO - `vn`.`invoiceOutSerial` ( - `code`, `description`, `isTaxed`, `taxAreaFk`, `isCEE`, `type` - ) -VALUES ( - 'A', 'Global nacional', 1, 'NATIONAL', 0, 'global' - ), - ( - 'T', 'Española rapida', 1, 'NATIONAL', 0, 'quick' - ), - ( - 'V', 'Intracomunitaria global', 0, 'CEE', 1, 'global' - ), - ( - 'M', 'Múltiple nacional', 1, 'NATIONAL', 0, 'quick' - ), - ( - 'R', 'Rectificativa', 1, 'NATIONAL', 0, NULL - ), - ( - 'E', 'Exportación rápida', 0, 'WORLD', 0, 'quick' - ); +INSERT INTO `vn`.`invoiceOutSerial` (`code`, `description`, `isTaxed`, `taxAreaFk`, `isCEE`, `type`) + VALUES + ('A', 'Global nacional', 1, 'NATIONAL', 0, 'global'), + ('T', 'Española rapida', 1, 'NATIONAL', 0, 'quick'), + ('V', 'Intracomunitaria global', 0, 'CEE', 1, 'global'), + ('M', 'Múltiple nacional', 1, 'NATIONAL', 0, 'quick'), + ('R', 'Rectificativa', 1, 'NATIONAL', 0, NULL), + ('E', 'Exportación rápida', 0, 'WORLD', 0, 'quick'); -INSERT INTO - `vn`.`invoiceOut` ( - `id`, `serial`, `amount`, `issued`, `clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `hasPdf` - ) -VALUES ( - 1, 'T', 1026.24, util.VN_CURDATE (), 1101, util.VN_CURDATE (), 442, util.VN_CURDATE (), util.VN_CURDATE (), 1, 0 - ), - ( - 2, 'T', 121.36, util.VN_CURDATE (), 1102, util.VN_CURDATE (), 442, util.VN_CURDATE (), util.VN_CURDATE (), 1, 0 - ), - ( - 3, 'T', 8.88, util.VN_CURDATE (), 1103, util.VN_CURDATE (), 442, util.VN_CURDATE (), util.VN_CURDATE (), 1, 0 - ), - ( - 4, 'T', 8.88, util.VN_CURDATE (), 1104, util.VN_CURDATE (), 442, util.VN_CURDATE (), util.VN_CURDATE (), 1, 0 - ), - ( - 5, 'A', 8.88, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1103, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 442, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 0 - ); +INSERT INTO `vn`.`invoiceOut`(`id`, `serial`, `amount`, `issued`,`clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `hasPdf`) + VALUES + (1, 'T', 1026.24, util.VN_CURDATE(), 1101, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0), + (2, 'T', 121.36, util.VN_CURDATE(), 1102, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0), + (3, 'T', 8.88, util.VN_CURDATE(), 1103, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0), + (4, 'T', 8.88, util.VN_CURDATE(), 1104, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0), + (5, 'A', 8.88, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1103, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 442, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 0); UPDATE `vn`.`invoiceOut` SET ref = 'T1111111' WHERE id = 1; - UPDATE `vn`.`invoiceOut` SET ref = 'T2222222' WHERE id = 2; - UPDATE `vn`.`invoiceOut` SET ref = 'T3333333' WHERE id = 3; - UPDATE `vn`.`invoiceOut` SET ref = 'T4444444' WHERE id = 4; - UPDATE `vn`.`invoiceOut` SET ref = 'A1111111' WHERE id = 5; -INSERT INTO - `vn`.`invoiceOutTax` ( - `invoiceOutFk`, `taxableBase`, `vat`, `pgcFk` - ) -VALUES (1, 895.76, 89.58, 4722000010), - (1, 33.80, 7.10, 4722000021), - (2, 110.33, 11.03, 4770000010), - (3, 8.07, 0.81, 4770000010), - (4, 8.07, 0.81, 4770000010), - (5, 8.07, 0.81, 4770000010); +INSERT INTO `vn`.`invoiceOutTax` (`invoiceOutFk`, `taxableBase`, `vat`, `pgcFk`) + VALUES + (1, 895.76, 89.58, 4722000010), + (1, 33.80, 7.10, 4722000021), + (2, 110.33, 11.03, 4770000010), + (3, 8.07, 0.81, 4770000010), + (4, 8.07, 0.81, 4770000010), + (5, 8.07, 0.81, 4770000010); -INSERT INTO - `vn`.`expense` (`id`, `name`, `isWithheld`) -VALUES ( - 2000000000, 'Inmovilizado pendiente', 0 - ), - ( - 2000000001, 'Compra de bienes de inmovilizado', 0 - ), - (4751000000, 'Retenciones', 1), - (4751000001, 'Retencion', 0), - (6210000567, 'Alquiler VNH', 0), - ( - 6240000000, 'Transportes de ventas rutas', 0 - ), - (7001000000, 'Mercaderia', 0), - ( - 7050000000, 'Prestacion de servicios', 1 - ); +INSERT INTO `vn`.`expense`(`id`, `name`, `isWithheld`) + VALUES + (2000000000, 'Inmovilizado pendiente', 0), + (2000000001, 'Compra de bienes de inmovilizado', 0), + (4751000000, 'Retenciones', 1), + (4751000001, 'Retencion', 0), + (6210000567, 'Alquiler VNH', 0), + (6240000000, 'Transportes de ventas rutas', 0), + (7001000000, 'Mercaderia', 0), + (7050000000, 'Prestacion de servicios', 1); -INSERT INTO - `vn`.`invoiceOutExpense` ( - `id`, `invoiceOutFk`, `amount`, `expenseFk`, `created` - ) -VALUES ( - 1, 1, 813.06, 2000000000, util.VN_CURDATE () - ), - ( - 2, 1, 33.80, 4751000000, util.VN_CURDATE () - ), - ( - 3, 1, 70.70, 6210000567, util.VN_CURDATE () - ), - ( - 4, 2, 110.33, 2000000000, util.VN_CURDATE () - ), - ( - 5, 3, 8.07, 2000000000, util.VN_CURDATE () - ), - ( - 6, 4, 8.07, 2000000000, util.VN_CURDATE () - ), - ( - 7, 5, 8.07, 2000000000, util.VN_CURDATE () - ); -INSERT INTO - `vn`.`zone` ( - `id`, `name`, `hour`, `agencyModeFk`, `travelingDays`, `price`, `bonus`, `itemMaxSize` - ) -VALUES ( - 1, 'Zone pickup A', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 1, 0, 1, 0, 100 - ), - ( - 2, 'Zone pickup B', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 1, 0, 1, 0, 100 - ), - ( - 3, 'Zone 247 A', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 7, 1, 2, 0, 100 - ), - ( - 4, 'Zone 247 B', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 7, 1, 2, 0, 100 - ), - ( - 5, 'Zone expensive A', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 8, 1, 1000, 0, 100 - ), - ( - 6, 'Zone expensive B', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 8, 1, 1000, 0, 100 - ), - ( - 7, 'Zone refund', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 23, 0, 1, 0, 100 - ), - ( - 8, 'Zone others', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 10, 0, 1, 0, 100 - ), - ( - 9, 'Zone superMan', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 2, 0, 1, 0, 100 - ), - ( - 10, 'Zone teleportation', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 3, 0, 1, 0, 100 - ), - ( - 11, 'Zone pickup C', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 1, 0, 1, 0, 100 - ), - ( - 12, 'Zone entanglement', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 4, 0, 1, 0, 100 - ), - ( - 13, 'Zone quantum break', CONCAT( - util.VN_CURDATE (), ' ', TIME('23:59') - ), 5, 0, 1, 0, 100 - ); +INSERT INTO `vn`.`invoiceOutExpense`(`id`, `invoiceOutFk`, `amount`, `expenseFk`, `created`) + VALUES + (1, 1, 813.06, 2000000000, util.VN_CURDATE()), + (2, 1, 33.80, 4751000000, util.VN_CURDATE()), + (3, 1, 70.70, 6210000567, util.VN_CURDATE()), + (4, 2, 110.33, 2000000000, util.VN_CURDATE()), + (5, 3, 8.07, 2000000000, util.VN_CURDATE()), + (6, 4, 8.07, 2000000000, util.VN_CURDATE()), + (7, 5, 8.07, 2000000000, util.VN_CURDATE()); -INSERT INTO - `vn`.`zoneWarehouse` (`id`, `zoneFk`, `warehouseFk`) -VALUES (1, 1, 1), - (2, 2, 2), - (3, 3, 1), - (4, 4, 2), - (5, 5, 1), - (6, 6, 2), - (7, 7, 1), - (8, 8, 1), - (9, 9, 1), - (10, 10, 3), - (11, 11, 5), - (12, 12, 4), - (13, 13, 5); +INSERT INTO `vn`.`zone` (`id`, `name`, `hour`, `agencyModeFk`, `travelingDays`, `price`, `bonus`, `itemMaxSize`) + VALUES + (1, 'Zone pickup A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), + (2, 'Zone pickup B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), + (3, 'Zone 247 A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100), + (4, 'Zone 247 B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100), + (5, 'Zone expensive A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100), + (6, 'Zone expensive B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100), + (7, 'Zone refund', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 23, 0, 1, 0, 100), + (8, 'Zone others', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 10, 0, 1, 0, 100), + (9, 'Zone superMan', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 2, 0, 1, 0, 100), + (10, 'Zone teleportation', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 3, 0, 1, 0, 100), + (11, 'Zone pickup C', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), + (12, 'Zone entanglement', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 4, 0, 1, 0, 100), + (13, 'Zone quantum break', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 5, 0, 1, 0, 100); -INSERT INTO - `vn`.`zoneClosure` (`zoneFk`, `dated`, `hour`) -VALUES ( - 1, util.VN_CURDATE (), '23:59' - ), - ( - 2, util.VN_CURDATE (), '23:59' - ), - ( - 3, util.VN_CURDATE (), '23:59' - ), - ( - 4, util.VN_CURDATE (), '23:59' - ), - ( - 5, util.VN_CURDATE (), '23:59' - ), - ( - 6, util.VN_CURDATE (), '23:59' - ), - ( - 7, util.VN_CURDATE (), '23:59' - ), - ( - 8, util.VN_CURDATE (), '23:59' - ), - ( - 9, util.VN_CURDATE (), '23:59' - ), - ( - 10, util.VN_CURDATE (), '23:59' - ), - ( - 11, util.VN_CURDATE (), '23:59' - ), - ( - 12, util.VN_CURDATE (), '23:59' - ), - ( - 13, util.VN_CURDATE (), '23:59' - ); + +INSERT INTO `vn`.`zoneWarehouse` (`id`, `zoneFk`, `warehouseFk`) + VALUES + (1, 1, 1), + (2, 2, 2), + (3, 3, 1), + (4, 4, 2), + (5, 5, 1), + (6, 6, 2), + (7, 7, 1), + (8, 8, 1), + (9, 9, 1), + (10, 10, 3), + (11, 11, 5), + (12, 12, 4), + (13, 13, 5); + +INSERT INTO `vn`.`zoneClosure` (`zoneFk`, `dated`, `hour`) + VALUES + (1, util.VN_CURDATE(), '23:59'), + (2, util.VN_CURDATE(), '23:59'), + (3, util.VN_CURDATE(), '23:59'), + (4, util.VN_CURDATE(), '23:59'), + (5, util.VN_CURDATE(), '23:59'), + (6, util.VN_CURDATE(), '23:59'), + (7, util.VN_CURDATE(), '23:59'), + (8, util.VN_CURDATE(), '23:59'), + (9, util.VN_CURDATE(), '23:59'), + (10, util.VN_CURDATE(), '23:59'), + (11, util.VN_CURDATE(), '23:59'), + (12, util.VN_CURDATE(), '23:59'), + (13, util.VN_CURDATE(), '23:59'); INSERT INTO `vn`.`zoneConfig` (`scope`) VALUES ('1'); -INSERT INTO - `vn`.`route` ( - `id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk` - ) -VALUES ( - 1, '1899-12-30 12:15:00', 56, util.VN_CURDATE (), 1, 1, 'first route', 1.8, 10, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1 - ), - ( - 2, '1899-12-30 13:20:00', 56, util.VN_CURDATE (), 1, 2, 'second route', 0.2, 20, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 9 - ), - ( - 3, '1899-12-30 14:30:00', 56, util.VN_CURDATE (), 2, 3, 'third route', 0.5, 30, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 10 - ), - ( - 4, '1899-12-30 15:45:00', 56, util.VN_CURDATE (), 3, 4, 'fourth route', 0, 40, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 12 - ), - ( - 5, '1899-12-30 16:00:00', 56, util.VN_CURDATE (), 4, 5, 'fifth route', 0.1, 50, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 13 - ), - ( - 6, NULL, 57, util.VN_CURDATE (), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 3 - ), - ( - 7, NULL, 57, util.VN_CURDATE (), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 5 - ); +INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk`) + VALUES + (1, '1899-12-30 12:15:00', 56, util.VN_CURDATE(), 1, 1, 'first route', 1.8, 10, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1), + (2, '1899-12-30 13:20:00', 56, util.VN_CURDATE(), 1, 2, 'second route', 0.2, 20, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 9), + (3, '1899-12-30 14:30:00', 56, util.VN_CURDATE(), 2, 3, 'third route', 0.5, 30, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 10), + (4, '1899-12-30 15:45:00', 56, util.VN_CURDATE(), 3, 4, 'fourth route', 0, 40, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 12), + (5, '1899-12-30 16:00:00', 56, util.VN_CURDATE(), 4, 5, 'fifth route', 0.1, 50, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 13), + (6, NULL, 57, util.VN_CURDATE(), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 3), + (7, NULL, 57, util.VN_CURDATE(), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 5); -INSERT INTO - `vn`.`ticket` ( - `id`, `priority`, `agencyModeFk`, `warehouseFk`, `routeFk`, `shipped`, `landed`, `clientFk`, `nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight` - ) -VALUES ( - 1, 3, 1, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1101, 'Bat cave', 121, NULL, 0, 1, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1 - ), - ( - 2, 1, 1, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2 - ), - ( - 3, 1, 7, 1, 6, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), INTERVAL + 1 DAY - ), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), NULL - ), - ( - 4, 3, 2, 1, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), INTERVAL + 1 DAY - ), 1104, 'Stark tower', 124, NULL, 0, 9, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), NULL - ), - ( - 5, 3, 3, 3, 3, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), INTERVAL + 1 DAY - ), 1104, 'Stark tower', 124, NULL, 0, 10, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), NULL - ), - ( - 6, 1, 3, 3, 3, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 10, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), NULL - ), - ( - 7, NULL, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 8, NULL, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1101, 'Bat cave', 121, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 9, NULL, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 10, 1, 1, 5, 1, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1102, 'Ingram Street', 2, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 11, 1, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 12, 1, 8, 1, 1, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 13, 1, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 14, 1, 2, 1, NULL, util.VN_CURDATE (), util.VN_CURDATE (), 1104, 'Malibu Point', 4, NULL, 0, 9, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 15, 1, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 16, 1, 7, 1, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 17, 1, 7, 2, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 18, 1, 4, 4, 4, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 12 HOUR - ), NULL - ), - ( - 19, 1, 5, 5, NULL, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 20, 1, 5, 5, 3, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), NULL - ), - ( - 21, NULL, 5, 5, 5, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), NULL - ), - ( - 22, NULL, 5, 5, 5, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 'Somewhere in Japan', 103, NULL, 0, 13, 5, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), NULL - ), - ( - 23, NULL, 8, 1, 7, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1101, 'address 21', 121, NULL, 0, 5, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 24, NULL, 8, 1, 7, util.VN_CURDATE (), util.VN_CURDATE (), 1101, 'Bruce Wayne', 1, NULL, 0, 5, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 25, NULL, 8, 1, NULL, util.VN_CURDATE (), util.VN_CURDATE (), 1101, 'Bruce Wayne', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 26, NULL, 8, 1, NULL, util.VN_CURDATE (), util.VN_CURDATE (), 1101, 'An incredibly long alias for testing purposes', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 27, NULL, 8, 1, NULL, util.VN_CURDATE (), util.VN_CURDATE (), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 28, 1, 8, 1, 1, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 29, 1, 8, 1, 1, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 30, 1, 8, 1, 1, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 31, 1, 8, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ), - ( - 32, 1, 8, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE (), NULL - ); +INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight`) + VALUES + (1 , 3, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 121, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1), + (2 , 1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2), + (3 , 1, 7, 1, 6, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -2 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL), + (4 , 3, 2, 1, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 9, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL), + (5 , 3, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -4 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), NULL), + (6 , 1, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL), + (7 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (8 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Bat cave', 121, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (9 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (10, 1, 1, 5, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'Ingram Street', 2, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (11, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (12, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (13, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (14, 1, 2, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1104, 'Malibu Point', 4, NULL, 0, 9, 5, 1, util.VN_CURDATE(), NULL), + (15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL), + (18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +12 HOUR), NULL), + (19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE(), NULL), + (20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL), + (21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL), + (22, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Japan', 103, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL), + (23, NULL, 8, 1, 7, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'address 21', 121, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL), + (24 ,NULL, 8, 1, 7, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL), + (25 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (26 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'An incredibly long alias for testing purposes', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (27 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (28, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (29, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (30, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (31, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL), + (32, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL); -INSERT INTO - `vn`.`ticketObservation` ( - `id`, `ticketFk`, `observationTypeFk`, `description` - ) -VALUES (1, 11, 1, 'ready'), - (2, 2, 2, 'do it fast please'), - ( - 3, 3, 5, 'Faster faster fasteeeeeer!!!' - ), - (4, 4, 5, 'Deliver before 8am'), - ( - 5, 13, 5, 'You can run from the disappointments you are trying to forget. But its only when you embrace your past that you truly move forward. Maybe I never get to go home again, but I found my way there. And I am glad I did.' - ), - ( - 6, 14, 5, 'Careful, armed warhead' - ), - (7, 23, 1, 'under the floor'), - ( - 8, 23, 2, 'wears leather and goes out at night' - ), - (9, 23, 5, 'care with the dog'), - ( - 10, 23, 4, 'Reclama ticket: 8' - ), - ( - 11, 24, 4, 'Reclama ticket: 7' - ), - ( - 12, 11, 3, 'Delivery after 10am' - ), - ( - 13, 1, 7, 'observation of ticket one' - ), - ( - 14, 2, 7, 'observation of ticket two' - ); +INSERT INTO `vn`.`ticketObservation`(`id`, `ticketFk`, `observationTypeFk`, `description`) + VALUES + (1, 11, 1, 'ready'), + (2, 2, 2, 'do it fast please'), + (3, 3, 5, 'Faster faster fasteeeeeer!!!'), + (4, 4, 5, 'Deliver before 8am'), + (5, 13, 5, 'You can run from the disappointments you are trying to forget. But its only when you embrace your past that you truly move forward. Maybe I never get to go home again, but I found my way there. And I am glad I did.'), + (6, 14, 5, 'Careful, armed warhead'), + (7, 23, 1, 'under the floor'), + (8, 23, 2, 'wears leather and goes out at night'), + (9, 23, 5, 'care with the dog'), + (10, 23, 4, 'Reclama ticket: 8'), + (11, 24, 4, 'Reclama ticket: 7'), + (12, 11, 3, 'Delivery after 10am'), + (13, 1, 7, 'observation of ticket one'), + (14, 2, 7, 'observation of ticket two'); -- FIX for state hours on local, inter_afterInsert -- UPDATE vncontrol.inter SET odbc_date = DATE_ADD(util.VN_CURDATE(), INTERVAL -10 SECOND); -INSERT INTO - `vn`.`ticketTracking` ( - `ticketFk`, `stateFk`, `userFk`, `created` - ) -VALUES ( - 1, 16, 5, DATE_ADD( - util.VN_NOW (), INTERVAL -1 MONTH - ) - ), - ( - 2, 16, 5, DATE_ADD( - util.VN_NOW (), INTERVAL -1 MONTH - ) - ), - ( - 3, 16, 5, DATE_ADD( - util.VN_NOW (), INTERVAL -2 MONTH - ) - ), - ( - 4, 16, 5, DATE_ADD( - util.VN_NOW (), INTERVAL -3 MONTH - ) - ), - ( - 5, 16, 18, DATE_ADD( - util.VN_NOW (), INTERVAL -4 MONTH - ) - ), - ( - 6, 16, 18, DATE_ADD( - util.VN_NOW (), INTERVAL -1 MONTH - ) - ), - (7, 10, 18, util.VN_NOW ()), - (8, 5, 19, util.VN_NOW ()), - (9, 5, 19, util.VN_NOW ()), - (10, 5, 19, util.VN_NOW ()), - (11, 3, 19, util.VN_NOW ()), - (12, 3, 19, util.VN_NOW ()), - (13, 3, 19, util.VN_NOW ()), - (14, 3, 19, util.VN_NOW ()), - (15, 2, 19, util.VN_NOW ()), - (16, 3, 19, util.VN_NOW ()), - (17, 2, 19, util.VN_NOW ()), - (18, 2, 19, util.VN_NOW ()), - (19, 2, 19, util.VN_NOW ()), - ( - 20, 1, 19, DATE_ADD( - util.VN_NOW (), INTERVAL + 1 MONTH - ) - ), - ( - 21, 1, 19, DATE_ADD( - util.VN_NOW (), INTERVAL + 1 MONTH - ) - ), - ( - 22, 1, 19, DATE_ADD( - util.VN_NOW (), INTERVAL + 1 MONTH - ) - ), - (23, 16, 21, util.VN_NOW ()), - (24, 16, 21, util.VN_NOW ()); +INSERT INTO `vn`.`ticketTracking`(`ticketFk`, `stateFk`, `userFk`, `created`) + VALUES + (1, 16, 5 , DATE_ADD(util.VN_NOW(), INTERVAL -1 MONTH)), + (2, 16, 5 , DATE_ADD(util.VN_NOW(), INTERVAL -1 MONTH)), + (3, 16, 5 , DATE_ADD(util.VN_NOW(), INTERVAL -2 MONTH)), + (4, 16, 5 , DATE_ADD(util.VN_NOW(), INTERVAL -3 MONTH)), + (5, 16, 18, DATE_ADD(util.VN_NOW(), INTERVAL -4 MONTH)), + (6, 16, 18, DATE_ADD(util.VN_NOW(), INTERVAL -1 MONTH)), + (7, 10, 18, util.VN_NOW()), + (8, 5, 19, util.VN_NOW()), + (9, 5, 19, util.VN_NOW()), + (10, 5, 19, util.VN_NOW()), + (11, 3, 19, util.VN_NOW()), + (12, 3, 19, util.VN_NOW()), + (13, 3, 19, util.VN_NOW()), + (14, 3, 19, util.VN_NOW()), + (15, 2, 19, util.VN_NOW()), + (16, 3, 19, util.VN_NOW()), + (17, 2, 19, util.VN_NOW()), + (18, 2, 19, util.VN_NOW()), + (19, 2, 19, util.VN_NOW()), + (20, 1, 19, DATE_ADD(util.VN_NOW(), INTERVAL +1 MONTH)), + (21, 1, 19, DATE_ADD(util.VN_NOW(), INTERVAL +1 MONTH)), + (22, 1, 19, DATE_ADD(util.VN_NOW(), INTERVAL +1 MONTH)), + (23, 16, 21, util.VN_NOW()), + (24, 16, 21, util.VN_NOW()); -INSERT INTO - `vn`.`deliveryPoint` (`id`, `name`, `ubication`) -VALUES ( - 1, 'Gotham', '1007 Mountain Drive, Gotham' - ); +INSERT INTO `vn`.`deliveryPoint` (`id`, `name`, `ubication`) + VALUES + (1, 'Gotham','1007 Mountain Drive, Gotham'); -INSERT INTO - `vn`.`vehicle` ( - `id`, `numberPlate`, `tradeMark`, `model`, `companyFk`, `warehouseFk`, `description`, `m3`, `isActive`, `deliveryPointFk` - ) -VALUES ( - 1, '3333-BAT', 'WAYNE INDUSTRIES', 'BATMOBILE', 442, 1, 'The ultimate war machine', 50, 1, 1 - ), - ( - 2, '1111-IMK', 'STARK INDUSTRIES', 'MARK-III', 442, 1, 'Iron-Man Heavy Armor MARK-III', 18, 1, 1 - ), - ( - 3, '2222-IMK', 'STARK INDUSTRIES', 'MARK-VI', 442, 1, 'Iron-Man Heavy Armor MARK-VI', 16, 1, 1 - ), - ( - 4, '3333-IMK', 'STARK INDUSTRIES', 'MARK-VII', 442, 1, 'Iron-Man Heavy Armor MARK-VII', 14, 1, 1 - ), - ( - 5, '4444-IMK', 'STARK INDUSTRIES', 'MARK-XLII', 442, 1, 'Iron-Man Heavy Armor MARK-XLII', 13, 1, 1 - ), - ( - 6, '5555-IMK', 'STARK INDUSTRIES', 'MARK-XLV', 442, 1, 'Iron-Man Heavy Armor MARK-XLV', 12, 0, 1 - ); +INSERT INTO `vn`.`vehicle`(`id`, `numberPlate`, `tradeMark`, `model`, `companyFk`, `warehouseFk`, `description`, `m3`, `isActive`, `deliveryPointFk`) + VALUES + (1, '3333-BAT', 'WAYNE INDUSTRIES', 'BATMOBILE', 442, 1, 'The ultimate war machine', 50, 1, 1), + (2, '1111-IMK', 'STARK INDUSTRIES', 'MARK-III', 442, 1, 'Iron-Man Heavy Armor MARK-III', 18, 1, 1), + (3, '2222-IMK', 'STARK INDUSTRIES', 'MARK-VI', 442, 1, 'Iron-Man Heavy Armor MARK-VI', 16, 1, 1), + (4, '3333-IMK', 'STARK INDUSTRIES', 'MARK-VII', 442, 1, 'Iron-Man Heavy Armor MARK-VII', 14, 1, 1), + (5, '4444-IMK', 'STARK INDUSTRIES', 'MARK-XLII', 442, 1, 'Iron-Man Heavy Armor MARK-XLII', 13, 1, 1), + (6, '5555-IMK', 'STARK INDUSTRIES', 'MARK-XLV', 442, 1, 'Iron-Man Heavy Armor MARK-XLV', 12, 0, 1); -INSERT INTO - `vn`.`config` ( - `id`, `mdbServer`, `fakeEmail`, `defaultersMaxAmount`, `inventoried` - ) -VALUES ( - 1, 'beta-server', 'nightmare@mydomain.com', '200', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ); +INSERT INTO `vn`.`config`(`id`, `mdbServer`, `fakeEmail`, `defaultersMaxAmount`, `inventoried`) + VALUES + (1, 'beta-server', 'nightmare@mydomain.com', '200', DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH)); -INSERT INTO - `vn`.`greugeType` (`id`, `name`, `code`) -VALUES (1, 'Diff', 'diff'), - (2, 'Recover', 'recover'), - (3, 'Mana', 'mana'), - (4, 'Reclaim', 'reclaim'), - (5, 'Heritage', 'heritage'), - ( - 6, 'Miscellaneous', 'miscellaneous' - ), - ( - 7, 'Freight Pickup', 'freightPickUp' - ); -INSERT INTO - `vn`.`greuge` ( - `id`, `clientFk`, `description`, `amount`, `shipped`, `created`, `greugeTypeFk`, `ticketFk` - ) -VALUES ( - 1, 1101, 'some diff charges', -19.99, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 1, 1 - ), - ( - 2, 1101, 'more diff charges', 60, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 2, 1 - ), - ( - 3, 1101, 'even more! diff charges', -9.99, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 3, 1 - ), - ( - 4, 1101, 'insane diff charges', 60, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 4, 1 - ), - ( - 5, 1101, 'gargantuous diff charges', -9.99, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 5, 1 - ), - ( - 6, 1101, 'diff charges', 88.30, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 6, 1 - ), - ( - 7, 1101, 'unaffordable diff charges', -39.12, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 1, 1 - ), - ( - 8, 1101, 'some recovery charges', 29.35, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 2, 1 - ), - ( - 9, 1101, 'some manna charges', -9.99, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 3, 1 - ), - ( - 10, 1101, 'some claim charges', 13.13, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 4, 1 - ), - ( - 11, 1101, 'some heritage charges', -15.99, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 5, 1 - ), - ( - 12, 1101, 'some miscellaneous charges', 58.00, DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), util.VN_CURDATE (), 6, 1 - ); +INSERT INTO `vn`.`greugeType`(`id`, `name`, `code`) + VALUES + (1, 'Diff', 'diff'), + (2, 'Recover', 'recover'), + (3, 'Mana', 'mana'), + (4, 'Reclaim', 'reclaim'), + (5, 'Heritage', 'heritage'), + (6, 'Miscellaneous', 'miscellaneous'), + (7, 'Freight Pickup', 'freightPickUp'); -INSERT INTO - `vn`.`mandate` ( - `id`, `clientFk`, `companyFk`, `code`, `created`, `mandateTypeFk` - ) -VALUES ( - 1, 1102, 442, '1-1', util.VN_CURDATE (), 2 - ); +INSERT INTO `vn`.`greuge`(`id`, `clientFk`, `description`, `amount`, `shipped`, `created`, `greugeTypeFk`, `ticketFk`) + VALUES + (1, 1101, 'some diff charges', -19.99, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 1, 1), + (2, 1101, 'more diff charges', 60, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 2, 1), + (3, 1101, 'even more! diff charges', -9.99, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 3, 1), + (4, 1101, 'insane diff charges', 60, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 4, 1), + (5, 1101, 'gargantuous diff charges', -9.99, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 5, 1), + (6, 1101, 'diff charges', 88.30, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 6, 1), + (7, 1101, 'unaffordable diff charges', -39.12, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 1, 1), + (8, 1101, 'some recovery charges', 29.35, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 2, 1), + (9, 1101, 'some manna charges', -9.99, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 3, 1), + (10, 1101, 'some claim charges', 13.13, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 4, 1), + (11, 1101, 'some heritage charges', -15.99, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 5, 1), + (12, 1101, 'some miscellaneous charges', 58.00, DATE_ADD(util.VN_CURDATE(), INTERVAL 1 MONTH), util.VN_CURDATE(), 6, 1); -INSERT INTO - `vn`.`itemCategory` ( - `id`, `name`, `display`, `color`, `icon`, `code` - ) -VALUES ( - 1, 'Plant', 1, 'B92A26', 'icon-plant', 'plant' - ), - ( - 2, 'Flower', 2, 'dcf711', 'icon-flower', 'flower' - ), - ( - 3, 'Logistic', 0, 'b9f711', NULL, 'logistical' - ), - ( - 4, 'Handmade', 1, NULL, 'icon-handmade', 'handmade' - ), - ( - 5, 'Artificial', 1, NULL, 'icon-artificial', 'artificial' - ), - ( - 6, 'Green', 1, NULL, 'icon-greenery', 'greenery' - ), - ( - 7, 'Accessories', 1, NULL, 'icon-accessory', 'accessory' - ), - ( - 8, 'Fruit', 1, NULL, 'icon-fruit', 'fruit' - ); +INSERT INTO `vn`.`mandate`(`id`, `clientFk`, `companyFk`, `code`, `created`, `mandateTypeFk`) + VALUES + (1, 1102, 442, '1-1', util.VN_CURDATE(), 2); -INSERT INTO - `vn`.`temperature` (`code`, `name`, `description`) -VALUES ('warm', 'Warm', 'Warm'), - ('cool', 'Cool', 'Cool'); +INSERT INTO `vn`.`itemCategory`(`id`, `name`, `display`, `color`, `icon`, `code`) + VALUES + (1, 'Plant', 1, 'B92A26', 'icon-plant', 'plant'), + (2, 'Flower', 2, 'dcf711', 'icon-flower', 'flower'), + (3, 'Logistic', 0, 'b9f711', NULL, 'logistical'), + (4, 'Handmade', 1, NULL, 'icon-handmade', 'handmade'), + (5, 'Artificial', 1, NULL, 'icon-artificial', 'artificial'), + (6, 'Green', 1, NULL, 'icon-greenery', 'greenery'), + (7, 'Accessories', 1, NULL, 'icon-accessory', 'accessory'), + (8, 'Fruit', 1, NULL, 'icon-fruit', 'fruit'); -INSERT INTO - `vn`.`itemType` ( - `id`, `code`, `name`, `categoryFk`, `life`, `workerFk`, `isPackaging`, `temperatureFk`, `isFragile` - ) -VALUES ( - 1, 'CRI', 'Crisantemo', 2, 31, 35, 0, 'cool', 0 - ), - ( - 2, 'ITG', 'Anthurium', 1, 31, 35, 0, 'cool', 1 - ), - ( - 3, 'WPN', 'Paniculata', 2, 31, 35, 0, 'cool', 0 - ), - ( - 4, 'PRT', 'Delivery ports', 3, NULL, 35, 1, 'warm', 0 - ), - ( - 5, 'CON', 'Container', 3, NULL, 35, 1, 'warm', 0 - ), - ( - 6, 'ALS', 'Alstroemeria', 1, 31, 16, 0, 'warm', 1 - ); +INSERT INTO `vn`.`temperature`(`code`, `name`, `description`) + VALUES + ('warm', 'Warm', 'Warm'), + ('cool', 'Cool', 'Cool'); -INSERT INTO - `vn`.`ink` ( - `id`, `name`, `picture`, `showOrder`, `hex` - ) -VALUES ( - 'YEL', 'Yellow', 1, 1, 'F4D03F' - ), - ('BLU', 'Blue', 1, 2, '5DADE2'), - ('RED', 'Red', 1, 3, 'EC7063'), - ( - 'SLV', 'Silver', 1, 4, 'CACFD2' - ), - ( - 'BRW', 'Brown', 1, 5, 'DC7633' - ), - ( - 'BLK', 'Black', 1, 6, '000000' - ), - ( - 'BAS', 'Blue/Silver', 1, 7, '5DADE2' - ), - ( - 'GRN', 'Green', 1, 8, '28A745' - ), - ( - 'WHT', 'White', 1, 9, 'FFFFFF' - ); +INSERT INTO `vn`.`itemType`(`id`, `code`, `name`, `categoryFk`, `life`, `workerFk`, `isPackaging`, `temperatureFk`, `isFragile`) + VALUES + (1, 'CRI', 'Crisantemo', 2, 31, 35, 0, 'cool', 0), + (2, 'ITG', 'Anthurium', 1, 31, 35, 0, 'cool', 1), + (3, 'WPN', 'Paniculata', 2, 31, 35, 0, 'cool', 0), + (4, 'PRT', 'Delivery ports', 3, NULL, 35, 1, 'warm', 0), + (5, 'CON', 'Container', 3, NULL, 35, 1, 'warm', 0), + (6, 'ALS', 'Alstroemeria', 1, 31, 16, 0, 'warm', 1); -INSERT INTO - `vn`.`origin` (`id`, `code`, `name`) -VALUES (1, 'SPA', 'Spain'), - (2, 'HOL', 'Holand'), - (3, 'VLC', 'Valencia'); +INSERT INTO `vn`.`ink`(`id`, `name`, `picture`, `showOrder`, `hex`) + VALUES + ('YEL', 'Yellow', 1, 1, 'F4D03F'), + ('BLU', 'Blue', 1, 2, '5DADE2'), + ('RED', 'Red', 1, 3, 'EC7063'), + ('SLV', 'Silver', 1, 4, 'CACFD2'), + ('BRW', 'Brown', 1, 5, 'DC7633'), + ('BLK', 'Black', 1, 6, '000000'), + ('BAS', 'Blue/Silver', 1, 7, '5DADE2'), + ('GRN', 'Green', 1, 8, '28A745'), + ('WHT', 'White', 1, 9, 'FFFFFF'); -INSERT INTO - `vn`.`producer` (`id`, `name`) -VALUES (1, 'Marvel Studios'), - (2, 'Nordic Mythology'); +INSERT INTO `vn`.`origin`(`id`,`code`, `name`) + VALUES + (1, 'SPA', 'Spain'), + (2, 'HOL', 'Holand'), + (3, 'VLC', 'Valencia'); -INSERT INTO - `vn`.`taxType` ( - `id`, `nickname`, `isAccrued`, `serial`, `TIPOOPE`, `description`, `countryFk` - ) -VALUES ( - 1, 'National', 1, 'R', 'I', 'national VAT', 1 - ), - ( - 2, 'European', 0, 'E', 'I', 'europe VAT', 1 - ); +INSERT INTO `vn`.`producer`(`id`, `name`) + VALUES + (1, 'Marvel Studios'), + (2, 'Nordic Mythology'); -INSERT INTO - `vn`.`taxCode` ( - `id`, `dated`, `code`, `taxTypeFk`, `rate`, `equalizationTax`, `type`, `link`, `isActive`, `updated`, `transactionCode` - ) -VALUES ( - 1, util.VN_CURDATE (), '1111111111', 1, 7.0, 0.0, 'R', 1, 1, util.VN_CURDATE (), 1 - ), - ( - 2, util.VN_CURDATE (), '2222222222', 2, 16.0, 0.0, 'G', 2, 1, util.VN_CURDATE (), 1 - ), - ( - 21, util.VN_CURDATE (), '3333333333', 1, 7.0, 0.0, 'R', 3, 1, util.VN_CURDATE (), 1 - ), - ( - 108, util.VN_CURDATE (), '4444444444', 2, 8.0, 0.0, 'R', 4, 1, util.VN_CURDATE (), 1 - ); +INSERT INTO `vn`.`taxType`(`id`, `nickname`, `isAccrued`, `serial`, `TIPOOPE`, `description`, `countryFk`) + VALUES + (1, 'National', 1, 'R', 'I', 'national VAT', 1), + (2, 'European', 0, 'E', 'I', 'europe VAT', 1); -INSERT INTO - `vn`.`taxClass` (`id`, `description`, `code`) -VALUES (1, 'Reduced VAT', 'R'), - (2, 'General VAT', 'G'); +INSERT INTO `vn`.`taxCode`(`id`, `dated`, `code`, `taxTypeFk`, `rate`, `equalizationTax`, `type`, `link`, `isActive`, `updated`, `transactionCode`) + VALUES + (1 , util.VN_CURDATE(), '1111111111', 1, 7.0 , 0.0, 'R', 1, 1, util.VN_CURDATE(), 1), + (2 , util.VN_CURDATE(), '2222222222', 2, 16.0, 0.0, 'G', 2, 1, util.VN_CURDATE(), 1), + (21 , util.VN_CURDATE(), '3333333333', 1, 7.0, 0.0, 'R', 3, 1, util.VN_CURDATE(), 1), + (108, util.VN_CURDATE(), '4444444444', 2, 8.0 , 0.0, 'R', 4, 1, util.VN_CURDATE(), 1); -INSERT INTO - `vn`.`taxClassCode` ( - `taxClassFk`, `effectived`, `taxCodeFk` - ) -VALUES (1, util.VN_CURDATE (), 1), - (1, util.VN_CURDATE (), 21), - (2, util.VN_CURDATE (), 2); +INSERT INTO `vn`.`taxClass`(`id`, `description`, `code`) + VALUES + (1, 'Reduced VAT', 'R'), + (2, 'General VAT', 'G'); -INSERT INTO - `vn`.`intrastat` ( - `id`, `description`, `taxClassFk`, `taxCodeFk` - ) -VALUES ( - 05080000, 'Coral y materiales similares', 2, 2 - ), - ( - 06021010, 'Plantas vivas: Esqueje/injerto, Vid', 1, 1 - ); +INSERT INTO `vn`.`taxClassCode`(`taxClassFk`, `effectived`, `taxCodeFk`) + VALUES + (1, util.VN_CURDATE(), 1), + (1, util.VN_CURDATE(), 21), + (2, util.VN_CURDATE(), 2); -INSERT INTO - `vn`.`itemFamily` (`code`, `description`) -VALUES ('EMB', 'Packagings'), - ('SER', 'Services'), - ('VT', 'Sales'); +INSERT INTO `vn`.`intrastat`(`id`, `description`, `taxClassFk`, `taxCodeFk`) + VALUES + (05080000, 'Coral y materiales similares', 2, 2), + (06021010, 'Plantas vivas: Esqueje/injerto, Vid', 1, 1); -INSERT INTO - `vn`.`item` ( - `id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenseFk`, `comment`, `relevancy`, `image`, `subName`, `minPrice`, `family`, `isFloramondo`, `genericFk`, `itemPackingTypeFk`, `hasMinPrice`, `weightByPiece` - ) -VALUES ( - 1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 'EMB', 0, NULL, 'V', 0, 3 - ), - ( - 2, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '2', NULL, 0, 'VT', 0, NULL, 'H', 0, 2 - ), - ( - 3, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '3', NULL, 0, 'VT', 0, NULL, NULL, 0, 5 - ), - ( - 4, 1, 1, 1, 'Increases block', 1, 05080000, 4751000000, NULL, 0, '4', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 5, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '5', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 6, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '6', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 7, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '7', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 8, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '8', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 9, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '9', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL - ), - ( - 10, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '10', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 11, 1, 1, 1, NULL, 1, 05080000, 4751000000, NULL, 0, '11', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 12, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '12', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ), - ( - 13, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 1, 'VT', 1, NULL, NULL, 1, NULL - ), - ( - 14, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL - ), - ( - 15, 4, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL - ), - ( - 16, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL - ), - ( - 71, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL - ); +INSERT INTO `vn`.`itemFamily`(`code`, `description`) + VALUES + ('EMB', 'Packagings'), + ('SER', 'Services'), + ('VT', 'Sales'); + +INSERT INTO `vn`.`item`(`id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenseFk`, + `comment`, `relevancy`, `image`, `subName`, `minPrice`, `family`, `isFloramondo`, `genericFk`, `itemPackingTypeFk`, `hasMinPrice`, `weightByPiece`) + VALUES + (1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 'EMB', 0, NULL, 'V', 0, 3), + (2, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '2', NULL, 0, 'VT', 0, NULL, 'H', 0, 2), + (3, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '3', NULL, 0, 'VT', 0, NULL, NULL, 0, 5), + (4, 1, 1, 1, 'Increases block', 1, 05080000, 4751000000, NULL, 0, '4', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (5, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '5', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (6, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '6', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (7, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '7', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (8, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '8', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (9, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '9', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL), + (10, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '10', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (11, 1, 1, 1, NULL, 1, 05080000, 4751000000, NULL, 0, '11', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (12, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '12', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL), + (13, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 1, 'VT', 1, NULL, NULL, 1, NULL), + (14, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL), + (15, 4, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL), + (16, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL), + (71, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL); -- Update the taxClass after insert of the items -UPDATE `vn`.`itemTaxCountry` -SET - `taxClassFk` = 2 -WHERE - `itemFk` IN ( - 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 71 - ); +UPDATE `vn`.`itemTaxCountry` SET `taxClassFk` = 2 + WHERE `itemFk` IN(4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 71); -INSERT INTO - `vn`.`priceFixed` ( - `id`, `itemFk`, `rate0`, `rate1`, `rate2`, `rate3`, `started`, `ended`, `bonus`, `warehouseFk`, `created` - ) -VALUES ( - 1, 1, 0, 0, 2.5, 2, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 0, 1, util.VN_CURDATE () - ), - ( - 2, 3, 10, 10, 10, 10, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 0, 1, util.VN_CURDATE () - ), - ( - 3, 13, 8.5, 10, 7.5, 6, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 1, 2, util.VN_CURDATE () - ); +INSERT INTO `vn`.`priceFixed`(`id`, `itemFk`, `rate0`, `rate1`, `rate2`, `rate3`, `started`, `ended`, `bonus`, `warehouseFk`, `created`) + VALUES + (1, 1, 0, 0, 2.5, 2, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 0, 1, util.VN_CURDATE()), + (2, 3, 10, 10, 10, 10, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 0, 1, util.VN_CURDATE()), + (3, 13, 8.5, 10, 7.5, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 1, 2, util.VN_CURDATE()); -INSERT INTO - `vn`.`expeditionBoxVol` (`boxFk`, `m3`, `ratio`) -VALUES (71, 0.141, 1); +INSERT INTO `vn`.`expeditionBoxVol`(`boxFk`, `m3`, `ratio`) + VALUES + (71,0.141,1); -INSERT INTO - `vn`.`packaging` ( - `id`, `volume`, `width`, `height`, `depth`, `isPackageReturnable`, `created`, `itemFk`, `price` - ) -VALUES ( - 1, 0.00, 10, 10, 0, 1, util.VN_CURDATE (), 6, 1.50 - ), - ( - 2, 100.00, 20, 20, 0, 1, util.VN_CURDATE (), 7, 1.00 - ), - ( - 3, 14000.00, 0, 0, 0, 1, util.VN_CURDATE (), NULL, 0 - ), - ( - 4, 218000.00, 0, 0, 0, 0, util.VN_CURDATE (), NULL, 0 - ), - ( - 5, 292000.00, 0, 0, 0, 0, util.VN_CURDATE (), NULL, 0 - ), - ( - 94, 140875.00, 49.00, 115.00, 25.00, 0, util.VN_CURDATE (), 71, 0.00 - ), - ( - 'cc', 1640038.00, 56.00, 220.00, 128.00, 1, util.VN_CURDATE (), 15, 90.00 - ), - ( - 'pallet 100', 2745600.00, 100.00, 220.00, 120.00, 1, util.VN_CURDATE (), 16, 0.00 - ); +INSERT INTO `vn`.`packaging`(`id`, `volume`, `width`, `height`, `depth`, `isPackageReturnable`, `created`, `itemFk`, `price`) + VALUES + (1, 0.00, 10, 10, 0, 1, util.VN_CURDATE(), 6, 1.50), + (2, 100.00, 20, 20, 0, 1, util.VN_CURDATE(), 7, 1.00), + (3, 14000.00, 0, 0, 0, 1, util.VN_CURDATE(), NULL, 0), + (4, 218000.00, 0, 0, 0, 0, util.VN_CURDATE(), NULL, 0), + (5, 292000.00, 0, 0, 0, 0, util.VN_CURDATE(), NULL, 0), + (94, 140875.00, 49.00, 115.00, 25.00, 0, util.VN_CURDATE(), 71, 0.00), + ('cc', 1640038.00, 56.00, 220.00, 128.00, 1, util.VN_CURDATE(), 15, 90.00), + ('pallet 100', 2745600.00, 100.00, 220.00, 120.00, 1, util.VN_CURDATE(), 16, 0.00); -INSERT INTO - `vn`.`packagingConfig` ( - `upperGap`, `defaultSmallPackageFk`, `defaultBigPackageFk` - ) -VALUES ('10', 1, 'pallet 100'); +INSERT INTO `vn`.`packagingConfig`(`upperGap`, `defaultSmallPackageFk`, `defaultBigPackageFk`) + VALUES + ('10', 1, 'pallet 100'); -INSERT INTO - `vn`.`expeditionStateType` (`id`, `description`, `code`) -VALUES ( - 1, 'En reparto', 'ON DELIVERY' - ), - (2, 'Entregada', 'DELIVERED'), - (3, 'Perdida', 'LOST'); +INSERT INTO `vn`.`expeditionStateType`(`id`, `description`, `code`) + VALUES + (1, 'En reparto', 'ON DELIVERY'), + (2, 'Entregada', 'DELIVERED'), + (3, 'Perdida', 'LOST'); -INSERT INTO - `vn`.`expedition` ( - `id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, `created`, `counter`, `workerFk`, `externalId`, `packagingFk`, `stateTypeFk`, `hostFk` - ) -VALUES ( - 1, 1, 1, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 18, 'UR9000006041', 94, 1, 'pc1' - ), - ( - 2, 1, 1, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2, 18, 'UR9000006041', 94, 1, NULL - ), - ( - 3, 1, 1, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 3, 18, 'UR9000006041', 94, 2, NULL - ), - ( - 4, 1, 1, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 4, 18, 'UR9000006041', 94, 2, NULL - ), - ( - 5, 1, 2, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 18, NULL, 94, 3, NULL - ), - ( - 6, 7, 3, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), 1, 18, NULL, 94, 3, NULL - ), - ( - 7, 2, 4, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), 1, 18, NULL, 94, NULL, NULL - ), - ( - 8, 3, 5, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), 1, 18, NULL, 94, 1, NULL - ), - ( - 9, 3, 6, 71, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 18, NULL, 94, 2, NULL - ), - ( - 10, 7, 7, 71, util.VN_NOW (), 1, 18, NULL, 94, 3, NULL - ), - ( - 11, 7, 8, 71, util.VN_NOW (), 1, 18, NULL, 94, 3, NULL - ), - ( - 12, 7, 9, 71, util.VN_NOW (), 1, 18, NULL, 94, 3, NULL - ), - ( - 13, 1, 10, 71, util.VN_NOW (), 1, 18, NULL, 94, 3, NULL - ); -INSERT INTO - `vn`.`expeditionState` ( - `id`, `created`, `expeditionFk`, `typeFk`, `userFk` - ) -VALUES ( - 1, util.VN_CURDATE (), 1, 1, 1 - ), - ( - 2, util.VN_CURDATE (), 2, 1, 1 - ), - ( - 3, util.VN_CURDATE (), 3, 1, 1 - ), - ( - 4, util.VN_CURDATE (), 3, 2, 1106 - ), - ( - 5, util.VN_CURDATE (), 5, 1, 1106 - ), - ( - 6, util.VN_CURDATE (), 5, 3, 1106 - ); +INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, `created`, `counter`, `workerFk`, `externalId`, `packagingFk`, `stateTypeFk`, `hostFk`) + VALUES + (1, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, 'UR9000006041', 94, 1, 'pc1'), + (2, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 18, 'UR9000006041', 94, 1, NULL), + (3, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 18, 'UR9000006041', 94, 2, NULL), + (4, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 18, 'UR9000006041', 94, 2, NULL), + (5, 1, 2, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 3, NULL), + (6, 7, 3, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 18, NULL, 94, 3, NULL), + (7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL), + (8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL), + (9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL), + (10, 7, 7, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (11, 7, 8, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (12, 7, 9, 71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL), + (13, 1, 10,71, util.VN_NOW(), 1, 18, NULL, 94, 3, NULL); -INSERT INTO - `vn`.`ticketPackaging` ( - `id`, `ticketFk`, `packagingFk`, `quantity`, `created`, `pvp` - ) -VALUES ( - 1, 1, 2, 2, util.VN_CURDATE (), NULL - ), - ( - 2, 2, 2, 1, util.VN_CURDATE (), NULL - ), - ( - 3, 3, 2, 4, util.VN_CURDATE (), NULL - ); -INSERT INTO - `vn`.`sale` ( - `id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created` - ) -VALUES ( - 1, 1, 1, 'Ranged weapon longbow 200cm', 5, 100.39, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 2, 2, 1, 'Melee weapon combat fist 15cm', 10, 7.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 3, 1, 1, 'Ranged weapon longbow 200cm', 2, 100.39, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 4, 4, 1, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 5, 1, 2, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 6, 1, 3, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ) - ), - ( - 7, 2, 11, 'Melee weapon combat fist 15cm', 15, 7.74, 0, 0, 0, util.VN_CURDATE () - ), - ( - 8, 4, 11, 'Melee weapon heavy shield 100cm', 10, 1.79, 0, 0, 0, util.VN_CURDATE () - ), - ( - 9, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE () - ), - ( - 10, 2, 16, 'Melee weapon combat fist 15cm', 10, 7.09, 0, 0, 0, util.VN_CURDATE () - ), - ( - 11, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE () - ), - ( - 12, 4, 16, 'Melee weapon heavy shield 100cm', 20, 1.71, 0, 0, 0, util.VN_CURDATE () - ), - ( - 13, 2, 8, 'Melee weapon combat fist 15cm', 10, 7.08, 0, 0, 0, util.VN_CURDATE () - ), - ( - 14, 1, 8, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE () - ), - ( - 15, 1, 19, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE () - ), - ( - 16, 2, 20, 'Melee weapon combat fist 15cm', 20, 7.07, 0, 0, 0, util.VN_CURDATE () - ), - ( - 17, 2, 22, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ), - ( - 18, 4, 22, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ), - ( - 19, 1, 4, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ) - ), - ( - 20, 1, 5, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ) - ), - ( - 21, 1, 6, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 22, 1, 7, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE () - ), - ( - 23, 1, 9, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE () - ), - ( - 24, 1, 10, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE () - ), - ( - 25, 4, 12, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 26, 4, 13, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 27, 4, 14, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 28, 4, 15, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 29, 4, 17, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 30, 4, 18, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 31, 2, 23, 'Melee weapon combat fist 15cm', -5, 7.08, 0, 0, 0, util.VN_CURDATE () - ), - ( - 32, 1, 24, 'Ranged weapon longbow 200cm', -1, 8.07, 0, 0, 0, util.VN_CURDATE () - ), - ( - 33, 5, 14, 'Ranged weapon pistol 9mm', 50, 1.79, 0, 0, 0, util.VN_CURDATE () - ), - ( - 34, 4, 28, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 35, 4, 29, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 37, 4, 31, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 36, 4, 30, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE () - ), - ( - 38, 2, 32, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ), - ( - 39, 1, 32, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE () - ); +INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`) + VALUES + (1, util.VN_CURDATE(), 1, 1, 1), + (2, util.VN_CURDATE(), 2, 1, 1), + (3, util.VN_CURDATE(), 3, 1, 1), + (4, util.VN_CURDATE(), 3, 2, 1106), + (5, util.VN_CURDATE(), 5, 1, 1106), + (6, util.VN_CURDATE(), 5, 3, 1106); -INSERT INTO - `vn`.`saleComponent` ( - `saleFk`, `componentFk`, `value` - ) -VALUES (1, 28, 50), - (1, 29, 49.4), - (1, 39, 0.994), - (2, 28, 5), - (2, 29, 2), - (2, 39, 0.07), - (3, 28, 50), - (3, 29, 49.4), - (3, 39, 0.994), - (4, 28, 1.25), - (4, 29, 0.42), - (4, 39, 0.017), - (5, 17, 9.94), - (5, 28, 50), - (5, 29, 49.4), - (5, 39, 0.994), - (6, 17, 9.94), - (6, 28, 50), - (6, 29, 49.4), - (6, 39, 0.994), - (7, 15, 0.0199), - (7, 17, 0.35), - (7, 28, 5), - (7, 29, 2), - (7, 39, 0.07), - (8, 15, 0.0199), - (8, 17, 0.084), - (8, 28, 1.25), - (8, 29, 0.42), - (8, 39, 0.017), - (9, 15, 3.0949), - (9, 21, 0.001), - (9, 28, 53), - (9, 29, 46.4), - (9, 39, 0.994), - (10, 15, 0.0199), - (10, 28, 7), - (10, 29, 0), - (10, 39, 0.07), - (11, 15, 3.0949), - (11, 21, 0.001), - (11, 28, 53), - (11, 29, 46.4), - (11, 39, 0.994), - (12, 15, 0.0199), - (12, 21, 0.003), - (12, 28, 2.25), - (12, 29, -0.58), - (12, 39, 0.017), - (13, 15, 0.114), - (13, 28, 5), - (13, 29, 2), - (13, 39, 0.07), - (14, 15, 3.0949), - (14, 28, 50), - (14, 29, 49.4), - (14, 39, 0.994), - (15, 15, 3.0949), - (15, 28, 50), - (15, 29, 49.4), - (15, 39, 0.994), - (16, 28, 5), - (16, 29, 2), - (16, 39, 0.07), - (17, 28, 5), - (17, 29, 2), - (17, 39, 0.07), - (18, 28, 1.25), - (18, 29, 0.42), - (18, 39, 0.017), - (19, 17, 0.7), - (19, 22, 0.3), - (19, 28, 5), - (19, 29, 2), - (19, 39, 0.02), - (20, 17, 0.7), - (20, 22, 0.3), - (20, 28, 5), - (20, 29, 2), - (20, 39, 0.02), - (21, 17, 0.7), - (21, 22, 0.3), - (21, 28, 5), - (21, 29, 2), - (21, 39, 0.02), - (22, 17, 0.7), - (22, 22, 0.3), - (22, 28, 5), - (22, 29, 2), - (22, 39, 0.02), - (23, 17, 0.7), - (23, 22, 0.3), - (23, 28, 5), - (23, 29, 2), - (23, 39, 0.02), - (24, 17, 0.7), - (24, 22, 0.3), - (24, 28, 5), - (24, 29, 2), - (24, 39, 0.02), - (25, 17, 0.033), - (25, 28, 1.25), - (25, 29, 0.42), - (25, 39, 0.017), - (26, 17, 0.033), - (26, 28, 1.25), - (26, 29, 0.42), - (26, 39, 0.017), - (27, 17, 0.033), - (27, 28, 1.25), - (27, 29, 0.42), - (27, 39, 0.017), - (28, 17, 0.033), - (28, 28, 1.25), - (28, 29, 0.42), - (28, 39, 0.017), - (29, 17, 0.033), - (29, 28, 1.25), - (29, 29, 0.42), - (29, 39, 0.017), - (30, 17, 0.033), - (30, 28, 1.25), - (30, 29, 0.42), - (30, 39, 0.017), - (31, 28, 5), - (31, 29, 2), - (31, 36, 0.01), - (31, 39, 0.07), - (32, 28, 50), - (32, 29, 49.4), - (32, 36, -92.324), - (32, 39, 0.994); +INSERT INTO `vn`.`ticketPackaging`(`id`, `ticketFk`, `packagingFk`, `quantity`, `created`, `pvp`) + VALUES + (1, 1, 2, 2, util.VN_CURDATE(), NULL), + (2, 2, 2, 1, util.VN_CURDATE(), NULL), + (3, 3, 2, 4, util.VN_CURDATE(), NULL); -INSERT INTO - `vn`.`itemShelving` ( - `itemFk`, `shelvingFk`, `visible`, `grouping`, `packing`, `userFk` - ) -VALUES (2, 'GVC', 1, 1, 1, 1106), - (4, 'HEJ', 1, 1, 1, 1106), - (1, 'UXN', 2, 12, 12, 1106); +INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created`) + VALUES + (1, 1, 1, 'Ranged weapon longbow 200cm', 5, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (2, 2, 1, 'Melee weapon combat fist 15cm', 10, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (3, 1, 1, 'Ranged weapon longbow 200cm', 2, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (4, 4, 1, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (5, 1, 2, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (6, 1, 3, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), + (7, 2, 11, 'Melee weapon combat fist 15cm', 15, 7.74, 0, 0, 0, util.VN_CURDATE()), + (8, 4, 11, 'Melee weapon heavy shield 100cm', 10, 1.79, 0, 0, 0, util.VN_CURDATE()), + (9, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()), + (10, 2, 16, 'Melee weapon combat fist 15cm', 10, 7.09, 0, 0, 0, util.VN_CURDATE()), + (11, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()), + (12, 4, 16, 'Melee weapon heavy shield 100cm', 20, 1.71, 0, 0, 0, util.VN_CURDATE()), + (13, 2, 8, 'Melee weapon combat fist 15cm', 10, 7.08, 0, 0, 0, util.VN_CURDATE()), + (14, 1, 8, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE()), + (15, 1, 19, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()), + (16, 2, 20, 'Melee weapon combat fist 15cm', 20, 7.07, 0, 0, 0, util.VN_CURDATE()), + (17, 2, 22, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)), + (18, 4, 22, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)), + (19, 1, 4, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH)), + (20, 1, 5, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH)), + (21, 1, 6, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (22, 1, 7, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()), + (23, 1, 9, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()), + (24, 1, 10, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()), + (25, 4, 12, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (26, 4, 13, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (27, 4, 14, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (28, 4, 15, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (29, 4, 17, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (30, 4, 18, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (31, 2, 23, 'Melee weapon combat fist 15cm', -5, 7.08, 0, 0, 0, util.VN_CURDATE()), + (32, 1, 24, 'Ranged weapon longbow 200cm', -1, 8.07, 0, 0, 0, util.VN_CURDATE()), + (33, 5, 14, 'Ranged weapon pistol 9mm', 50, 1.79, 0, 0, 0, util.VN_CURDATE()), + (34, 4, 28, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (35, 4, 29, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (37, 4, 31, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (36, 4, 30, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()), + (38, 2, 32, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)), + (39, 1, 32, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE()); -INSERT INTO - `vn`.`itemShelvingSale` ( - `itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk` - ) -VALUES ( - '1', '1', '1', util.VN_CURDATE (), '1106' - ), - ( - '2', '2', '5', util.VN_CURDATE (), '1106' - ), - ( - '1', '7', '1', util.VN_CURDATE (), '1106' - ), - ( - '2', '8', '5', util.VN_CURDATE (), '1106' - ); +INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`) + VALUES + (1, 28, 50), + (1, 29, 49.4), + (1, 39, 0.994), + (2, 28, 5), + (2, 29, 2), + (2, 39, 0.07), + (3, 28, 50), + (3, 29, 49.4), + (3, 39, 0.994), + (4, 28, 1.25), + (4, 29, 0.42), + (4, 39, 0.017), + (5, 17, 9.94), + (5, 28, 50), + (5, 29, 49.4), + (5, 39, 0.994), + (6, 17, 9.94), + (6, 28, 50), + (6, 29, 49.4), + (6, 39, 0.994), + (7, 15, 0.0199), + (7, 17, 0.35), + (7, 28, 5), + (7, 29, 2), + (7, 39, 0.07), + (8, 15, 0.0199), + (8, 17, 0.084), + (8, 28, 1.25), + (8, 29, 0.42), + (8, 39, 0.017), + (9, 15, 3.0949), + (9, 21, 0.001), + (9, 28, 53), + (9, 29, 46.4), + (9, 39, 0.994), + (10, 15, 0.0199), + (10, 28, 7), + (10, 29, 0), + (10, 39, 0.07), + (11, 15, 3.0949), + (11, 21, 0.001), + (11, 28, 53), + (11, 29, 46.4), + (11, 39, 0.994), + (12, 15, 0.0199), + (12, 21, 0.003), + (12, 28, 2.25), + (12, 29, -0.58), + (12, 39, 0.017), + (13, 15, 0.114), + (13, 28, 5), + (13, 29, 2), + (13, 39, 0.07), + (14, 15, 3.0949), + (14, 28, 50), + (14, 29, 49.4), + (14, 39, 0.994), + (15, 15, 3.0949), + (15, 28, 50), + (15, 29, 49.4), + (15, 39, 0.994), + (16, 28, 5), + (16, 29, 2), + (16, 39, 0.07), + (17, 28, 5), + (17, 29, 2), + (17, 39, 0.07), + (18, 28, 1.25), + (18, 29, 0.42), + (18, 39, 0.017), + (19, 17, 0.7), + (19, 22, 0.3), + (19, 28, 5), + (19, 29, 2), + (19, 39, 0.02), + (20, 17, 0.7), + (20, 22, 0.3), + (20, 28, 5), + (20, 29, 2), + (20, 39, 0.02), + (21, 17, 0.7), + (21, 22, 0.3), + (21, 28, 5), + (21, 29, 2), + (21, 39, 0.02), + (22, 17, 0.7), + (22, 22, 0.3), + (22, 28, 5), + (22, 29, 2), + (22, 39, 0.02), + (23, 17, 0.7), + (23, 22, 0.3), + (23, 28, 5), + (23, 29, 2), + (23, 39, 0.02), + (24, 17, 0.7), + (24, 22, 0.3), + (24, 28, 5), + (24, 29, 2), + (24, 39, 0.02), + (25, 17, 0.033), + (25, 28, 1.25), + (25, 29, 0.42), + (25, 39, 0.017), + (26, 17, 0.033), + (26, 28, 1.25), + (26, 29, 0.42), + (26, 39, 0.017), + (27, 17, 0.033), + (27, 28, 1.25), + (27, 29, 0.42), + (27, 39, 0.017), + (28, 17, 0.033), + (28, 28, 1.25), + (28, 29, 0.42), + (28, 39, 0.017), + (29, 17, 0.033), + (29, 28, 1.25), + (29, 29, 0.42), + (29, 39, 0.017), + (30, 17, 0.033), + (30, 28, 1.25), + (30, 29, 0.42), + (30, 39, 0.017), + (31, 28, 5), + (31, 29, 2), + (31, 36, 0.01), + (31, 39, 0.07), + (32, 28, 50), + (32, 29, 49.4), + (32, 36, -92.324), + (32, 39, 0.994); -INSERT INTO - `vn`.`saleTracking` ( - `saleFk`, `isChecked`, `created`, `originalQuantity`, `workerFk`, `id`, `stateFk` - ) -VALUES ( - 1, 0, util.VN_CURDATE (), 5, 55, 1, 14 - ), - ( - 1, 1, util.VN_CURDATE (), 5, 54, 2, 8 - ), - ( - 2, 1, util.VN_CURDATE (), 10, 40, 3, 8 - ), - ( - 3, 1, util.VN_CURDATE (), 2, 40, 4, 8 - ), - ( - 31, 1, util.VN_CURDATE (), -5, 40, 5, 8 - ); +INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`, `packing`, `userFk`) + VALUES + (2, 'GVC', 1, 1, 1, 1106), + (4, 'HEJ', 1, 1, 1, 1106), + (1, 'UXN', 2, 12, 12, 1106); -INSERT INTO - `vn`.`itemBarcode` (`id`, `itemFk`, `code`) -VALUES (1, 1, 1111111111), - (2, 1, 2222222222), - (3, 1, 3333333333), - (4, 2, 4444444444); +INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`) + VALUES + ('1', '1', '1', util.VN_CURDATE(), '1106'), + ('2', '2', '5', util.VN_CURDATE(), '1106'), + ('1', '7', '1', util.VN_CURDATE(), '1106'), + ('2', '8', '5', util.VN_CURDATE(), '1106'); -INSERT INTO - `vn`.`train` (`id`, `name`) -VALUES (1, 'Train1'), - (2, 'Train2'); +INSERT INTO `vn`.`saleTracking`(`saleFk`, `isChecked`, `created`, `originalQuantity`, `workerFk`, `id`, `stateFk`) + VALUES + (1, 0, util.VN_CURDATE(), 5, 55, 1, 14), + (1, 1, util.VN_CURDATE(), 5, 54, 2, 8), + (2, 1, util.VN_CURDATE(), 10, 40, 3, 8), + (3, 1, util.VN_CURDATE(), 2, 40, 4, 8), + (31, 1, util.VN_CURDATE(), -5, 40, 5, 8); -INSERT INTO - `vn`.`operator` ( - `workerFk`, `numberOfWagons`, `trainFk`, `itemPackingTypeFk`, `warehouseFk`, `sectorFk`, `labelerFk` - ) -VALUES ( - '1106', '1', '1', 'H', '1', '1', '1' - ), - ( - '1107', '1', '1', 'V', '1', '1', '1' - ); +INSERT INTO `vn`.`itemBarcode`(`id`, `itemFk`, `code`) + VALUES + (1, 1, 1111111111), + (2, 1, 2222222222), + (3, 1, 3333333333), + (4, 2, 4444444444); -INSERT INTO - `vn`.`collection` ( - `id`, `workerFk`, `stateFk`, `created`, `trainFk` - ) -VALUES ( - 1, 1106, 5, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1 - ), - ( - 2, 1106, 14, util.VN_CURDATE (), 1 - ); +INSERT INTO `vn`.`train`(`id`, `name`) + VALUES + (1, 'Train1'), + (2, 'Train2'); -INSERT INTO - `vn`.`ticketCollection` ( - `ticketFk`, `collectionFk`, `level` - ) -VALUES (1, 1, 1), - (2, 1, NULL), - (3, 2, NULL), - (23, 1, NULL); +INSERT INTO `vn`.`operator` (`workerFk`, `numberOfWagons`, `trainFk`, `itemPackingTypeFk`, `warehouseFk`, `sectorFk`, `labelerFk`) + VALUES + ('1106', '1', '1', 'H', '1', '1', '1'), + ('1107', '1', '1', 'V', '1', '1', '1'); -INSERT INTO - `vn`.`genus` (`id`, `name`) -VALUES (1, 'Abelia'), - (2, 'Abies'), - (3, 'Abutilon'); +INSERT INTO `vn`.`collection`(`id`, `workerFk`, `stateFk`, `created`, `trainFk`) + VALUES + (1, 1106, 5, DATE_ADD(util.VN_CURDATE(),INTERVAL +1 DAY), 1), + (2, 1106, 14, util.VN_CURDATE(), 1); -INSERT INTO - `vn`.`specie` (`id`, `name`) -VALUES (1, 'grandiflora'), - (2, 'procera'), - (3, 'decurrens'), - (4, 'dealbata'); +INSERT INTO `vn`.`ticketCollection`(`ticketFk`, `collectionFk`, `level`) + VALUES + (1, 1, 1), + (2, 1, NULL), + (3, 2, NULL), + (23, 1, NULL); -INSERT INTO - `vn`.`itemBotanical` ( - `itemFk`, `genusFk`, `specieFk` - ) -VALUES (1, 1, 1), - (2, 2, 2), - (3, 2, NULL), - (4, 2, 1); +INSERT INTO `vn`.`genus`(`id`, `name`) + VALUES + (1, 'Abelia'), + (2, 'Abies'), + (3, 'Abutilon'); -INSERT INTO - `vn`.`tag` ( - `id`, `code`, `name`, `isFree`, `isQuantitatif`, `sourceTable`, `unit`, `ediTypeFk`, `overwrite` - ) -VALUES ( - 1, 'color', 'Color', 0, 0, 'ink', NULL, NULL, 'inkFk' - ), - ( - 2, NULL, 'Forma', 1, 0, NULL, NULL, NULL, NULL - ), - ( - 3, NULL, 'Material', 1, 0, NULL, NULL, NULL, NULL - ), - ( - 4, NULL, 'Longitud', 1, 1, NULL, 'mm', NULL, 'size' - ), - ( - 5, NULL, 'Diámetro', 1, 1, NULL, 'mm', NULL, 'diameter' - ), - ( - 7, NULL, 'Ancho de la base', 1, 1, NULL, 'mm', NULL, NULL - ), - ( - 23, 'stems', 'Tallos', 1, 1, NULL, NULL, NULL, 'stems' - ), - ( - 27, NULL, 'Longitud(cm)', 1, 1, NULL, 'cm', NULL, 'size' - ), - ( - 36, 'producer', 'Proveedor', 1, 0, NULL, NULL, NULL, 'producer' - ), - ( - 56, NULL, 'Genero', 1, 0, NULL, NULL, NULL, NULL - ), - ( - 58, NULL, 'Variedad', 1, 0, NULL, NULL, NULL, NULL - ), - ( - 67, 'category', 'Categoria', 1, 0, NULL, NULL, NULL, NULL - ), - ( - 92, NULL, 'Nombre temporal', 1, 0, NULL, NULL, NULL, NULL - ); +INSERT INTO `vn`.`specie`(`id`, `name`) + VALUES + (1, 'grandiflora'), + (2, 'procera'), + (3, 'decurrens'), + (4, 'dealbata'); -INSERT INTO - `vn`.`itemTag` ( - `id`, `itemFk`, `tagFk`, `value`, `priority` - ) -VALUES (1, 1, 56, 'Ranged weapon', 1), - (2, 1, 58, 'longbow', 2), - (3, 1, 27, '200cm', 3), - ( - 4, 1, 36, 'Stark Industries', 4 - ), - (5, 1, 1, 'Brown', 5), - (6, 1, 67, '+1 precission', 6), - (7, 1, 23, '1', 7), - (8, 2, 56, 'Melee weapon', 1), - (9, 2, 58, 'combat fist', 2), - (10, 2, 27, '15cm', 3), - ( - 11, 2, 36, 'Stark Industries', 4 - ), - (12, 2, 1, 'Silver', 5), - (13, 2, 67, 'Concussion', 6), - (14, 2, 23, '2', 7), - (15, 3, 56, 'Ranged weapon', 1), - (16, 3, 58, 'sniper rifle', 2), - (17, 3, 4, '113cm', 3), - ( - 18, 3, 36, 'Stark Industries', 4 - ), - (19, 3, 1, 'Green', 5), - (20, 3, 67, 'precission', 6), - (21, 3, 23, '3', 7), - (22, 4, 56, 'Melee weapon', 1), - (23, 4, 58, 'heavy shield', 2), - (24, 4, 4, '100cm', 3), - ( - 25, 4, 36, 'Stark Industries', 4 - ), - (26, 4, 1, 'Black', 5), - (27, 4, 67, 'containtment', 6), - (28, 4, 23, '4', 7), - (29, 5, 56, 'Ranged weapon', 1), - (30, 5, 58, 'pistol', 2), - (31, 5, 67, '9mm', 3), - ( - 32, 5, 36, 'Stark Industries', 4 - ), - (33, 5, 1, 'Silver', 5), - (34, 5, 27, '15cm', 6), - (35, 5, 23, '5', 7), - (36, 6, 56, 'Container', 1), - (37, 6, 58, 'ammo box', 2), - (38, 6, 27, '100cm', 3), - ( - 39, 6, 36, 'Stark Industries', 4 - ), - (40, 6, 1, 'Green', 5), - (41, 6, 67, 'supply', 6), - (42, 6, 23, '6', 7), - (43, 7, 56, 'Container', 1), - (44, 7, 58, 'medical box', 2), - (45, 7, 27, '100cm', 3), - ( - 46, 7, 36, 'Stark Industries', 4 - ), - (47, 7, 1, 'White', 5), - (48, 7, 67, 'supply', 6), - (49, 7, 23, '7', 7), - ( - 50, 8, 56, 'Ranged Reinforced weapon', 1 - ), - (51, 8, 58, '+1 longbow', 2), - (52, 8, 27, '200cm', 3), - ( - 53, 8, 36, 'Stark Industries', 4 - ), - (54, 8, 1, 'Brown', 5), - (55, 8, 67, 'precission', 6), - (56, 8, 23, '8', 7), - ( - 57, 9, 56, 'Melee Reinforced weapon', 1 - ), - (58, 9, 58, 'combat fist', 2), - (59, 9, 27, '15cm', 3), - ( - 60, 9, 36, 'Stark Industries', 4 - ), - (61, 9, 1, 'Silver', 5), - (62, 9, 67, 'Concussion', 6), - (63, 9, 23, '9', 7), - ( - 64, 10, 56, 'Ranged Reinforced weapon', 1 - ), - (65, 10, 58, 'sniper rifle', 2), - (66, 10, 67, '700mm', 3), - ( - 67, 10, 36, 'Stark Industries', 4 - ), - (68, 10, 1, 'Green', 5), - (69, 10, 27, '130cm', 6), - (70, 10, 23, '10', 7), - ( - 71, 11, 56, 'Melee Reinforced weapon', 1 - ), - (72, 11, 58, 'heavy shield', 2), - (73, 11, 4, '120cm', 3), - ( - 74, 11, 36, 'Stark Industries', 4 - ), - (75, 11, 1, 'Black', 5), - (76, 11, 67, 'containtment', 6), - (77, 11, 23, '11', 7), - ( - 78, 12, 56, 'Ranged Reinforced weapon', 1 - ), - (79, 12, 58, 'pistol', 2), - (80, 12, 27, '9mm', 3), - ( - 81, 12, 36, 'Stark Industries', 4 - ), - (82, 12, 1, 'Silver', 5), - (83, 12, 67, '23cm', 6), - (84, 12, 23, '12', 7), - (85, 13, 56, 'Chest', 1), - (86, 13, 58, 'ammo box', 2), - (87, 13, 27, '100cm', 3), - ( - 88, 13, 36, 'Stark Industries', 4 - ), - (89, 13, 1, 'Green', 5), - (90, 13, 67, 'supply', 6), - (91, 13, 23, '13', 7), - (92, 14, 56, 'Chest', 1), - (93, 14, 58, 'medical box', 2), - (94, 14, 27, '100cm', 3), - ( - 95, 14, 36, 'Stark Industries', 4 - ), - (96, 14, 1, 'White', 5), - (97, 14, 67, 'supply', 6), - (98, 14, 23, '1', 7), - (99, 15, 92, 'Trolley', 2), - (100, 16, 92, 'Pallet', 2), - ( - 101, 71, 92, 'Shipping cost', 2 - ); +INSERT INTO `vn`.`itemBotanical`(`itemFk`, `genusFk`, `specieFk`) + VALUES + (1, 1, 1), + (2, 2, 2), + (3, 2, NULL), + (4, 2, 1); -INSERT INTO - `vn`.`itemTypeTag` ( - `id`, `itemTypeFk`, `tagFk`, `priority` - ) -VALUES (1, 1, 1, 0), - (2, 2, 2, 0), - (3, 3, 3, 0), - (4, 1, 4, 4), - (5, 1, 5, 5); +INSERT INTO `vn`.`tag`(`id`, `code`, `name`, `isFree`, `isQuantitatif`, `sourceTable`, `unit`, `ediTypeFk`, `overwrite`) + VALUES + (1, 'color', 'Color', 0, 0, 'ink', NULL, NULL, 'inkFk'), + (2, NULL, 'Forma', 1, 0, NULL, NULL,NULL, NULL), + (3, NULL, 'Material', 1, 0, NULL, NULL,NULL, NULL), + (4, NULL, 'Longitud', 1, 1, NULL, 'mm', NULL, 'size'), + (5, NULL, 'Diámetro', 1, 1, NULL, 'mm',NULL, 'diameter'), + (7, NULL, 'Ancho de la base', 1, 1, NULL, 'mm',NULL, NULL), + (23, 'stems', 'Tallos', 1, 1, NULL, NULL, NULL, 'stems'), + (27, NULL, 'Longitud(cm)', 1, 1, NULL, 'cm', NULL, 'size'), + (36, 'producer', 'Proveedor', 1, 0, NULL, NULL, NULL, 'producer'), + (56, NULL, 'Genero', 1, 0, NULL, NULL, NULL, NULL), + (58, NULL, 'Variedad', 1, 0, NULL, NULL, NULL, NULL), + (67, 'category', 'Categoria', 1, 0, NULL, NULL, NULL, NULL), + (92, NULL, 'Nombre temporal', 1, 0, NULL, NULL, NULL, NULL); -CALL `vn`.`itemRefreshTags` (NULL); +INSERT INTO `vn`.`itemTag`(`id`,`itemFk`,`tagFk`,`value`,`priority`) + VALUES + (1, 1, 56, 'Ranged weapon', 1), + (2, 1, 58, 'longbow', 2), + (3, 1, 27, '200cm', 3), + (4, 1, 36, 'Stark Industries', 4), + (5, 1, 1, 'Brown', 5), + (6, 1, 67, '+1 precission', 6), + (7, 1, 23, '1', 7), + (8, 2, 56, 'Melee weapon', 1), + (9, 2, 58, 'combat fist', 2), + (10, 2, 27, '15cm', 3), + (11, 2, 36, 'Stark Industries', 4), + (12, 2, 1, 'Silver', 5), + (13, 2, 67, 'Concussion', 6), + (14, 2, 23, '2', 7), + (15, 3, 56, 'Ranged weapon', 1), + (16, 3, 58, 'sniper rifle', 2), + (17, 3, 4, '113cm', 3), + (18, 3, 36, 'Stark Industries', 4), + (19, 3, 1, 'Green', 5), + (20, 3, 67, 'precission', 6), + (21, 3, 23, '3', 7), + (22, 4, 56, 'Melee weapon', 1), + (23, 4, 58, 'heavy shield', 2), + (24, 4, 4, '100cm', 3), + (25, 4, 36, 'Stark Industries', 4), + (26, 4, 1, 'Black', 5), + (27, 4, 67, 'containtment', 6), + (28, 4, 23, '4', 7), + (29, 5, 56, 'Ranged weapon', 1), + (30, 5, 58, 'pistol', 2), + (31, 5, 67, '9mm', 3), + (32, 5, 36, 'Stark Industries', 4), + (33, 5, 1, 'Silver', 5), + (34, 5, 27, '15cm', 6), + (35, 5, 23, '5', 7), + (36, 6, 56, 'Container', 1), + (37, 6, 58, 'ammo box', 2), + (38, 6, 27, '100cm', 3), + (39, 6, 36, 'Stark Industries', 4), + (40, 6, 1, 'Green', 5), + (41, 6, 67, 'supply', 6), + (42, 6, 23, '6', 7), + (43, 7, 56, 'Container', 1), + (44, 7, 58, 'medical box', 2), + (45, 7, 27, '100cm', 3), + (46, 7, 36, 'Stark Industries', 4), + (47, 7, 1, 'White', 5), + (48, 7, 67, 'supply', 6), + (49, 7, 23, '7', 7), + (50, 8, 56, 'Ranged Reinforced weapon', 1), + (51, 8, 58, '+1 longbow', 2), + (52, 8, 27, '200cm', 3), + (53, 8, 36, 'Stark Industries', 4), + (54, 8, 1, 'Brown', 5), + (55, 8, 67, 'precission', 6), + (56, 8, 23, '8', 7), + (57, 9, 56, 'Melee Reinforced weapon', 1), + (58, 9, 58, 'combat fist', 2), + (59, 9, 27, '15cm', 3), + (60, 9, 36, 'Stark Industries', 4), + (61, 9, 1, 'Silver', 5), + (62, 9, 67, 'Concussion', 6), + (63, 9, 23, '9', 7), + (64, 10, 56, 'Ranged Reinforced weapon', 1), + (65, 10, 58, 'sniper rifle', 2), + (66, 10, 67, '700mm', 3), + (67, 10, 36, 'Stark Industries', 4), + (68, 10, 1, 'Green', 5), + (69, 10, 27, '130cm', 6), + (70, 10, 23, '10', 7), + (71, 11, 56, 'Melee Reinforced weapon', 1), + (72, 11, 58, 'heavy shield', 2), + (73, 11, 4, '120cm', 3), + (74, 11, 36, 'Stark Industries', 4), + (75, 11, 1, 'Black', 5), + (76, 11, 67, 'containtment', 6), + (77, 11, 23, '11', 7), + (78, 12, 56, 'Ranged Reinforced weapon', 1), + (79, 12, 58, 'pistol', 2), + (80, 12, 27, '9mm', 3), + (81, 12, 36, 'Stark Industries', 4), + (82, 12, 1, 'Silver', 5), + (83, 12, 67, '23cm', 6), + (84, 12, 23, '12', 7), + (85, 13, 56, 'Chest', 1), + (86, 13, 58, 'ammo box', 2), + (87, 13, 27, '100cm', 3), + (88, 13, 36, 'Stark Industries', 4), + (89, 13, 1, 'Green', 5), + (90, 13, 67, 'supply', 6), + (91, 13, 23, '13', 7), + (92, 14, 56, 'Chest', 1), + (93, 14, 58, 'medical box', 2), + (94, 14, 27, '100cm', 3), + (95, 14, 36, 'Stark Industries', 4), + (96, 14, 1, 'White', 5), + (97, 14, 67, 'supply', 6), + (98, 14, 23, '1', 7), + (99, 15, 92, 'Trolley', 2), + (100, 16, 92, 'Pallet', 2), + (101, 71, 92, 'Shipping cost', 2); -INSERT INTO - `vn`.`itemLog` ( - `id`, `originFk`, `userFk`, `action`, `description`, `changedModel`, `oldInstance`, `newInstance`, `changedModelId`, `changedModelValue` - ) -VALUES ( - '1', '1', '1', 'insert', 'We made a change!', 'Item', '{}', '{}', 1, '1' - ); +INSERT INTO `vn`.`itemTypeTag`(`id`, `itemTypeFk`, `tagFk`, `priority`) + VALUES + (1, 1, 1, 0), + (2, 2, 2, 0), + (3, 3, 3, 0), + (4, 1, 4, 4), + (5, 1, 5, 5); -INSERT INTO - `vn`.`recovery` ( - `id`, `clientFk`, `started`, `finished`, `amount`, `period` - ) -VALUES ( - 1, 1101, DATE_ADD( - util.VN_CURDATE (), INTERVAL -7 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), 50, 7 - ), - ( - 2, 1102, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 MONTH - ), util.VN_CURDATE (), 100, 1 - ), - ( - 3, 1102, util.VN_CURDATE (), DATE_ADD( - util.VN_CURDATE (), INTERVAL 1 MONTH - ), 50, 7 - ), - ( - 4, 1103, util.VN_CURDATE (), NULL, 50, 7 - ); +CALL `vn`.`itemRefreshTags`(NULL); -INSERT INTO - `bs`.`clientAnnualConsumption` (`clientFk`, `invoiced`) -VALUES (1101, 1500), - (1102, 100), - (1103, 1000), - (1104, 500), - (1105, 5000); +INSERT INTO `vn`.`itemLog` (`id`, `originFk`, `userFk`, `action`, `description`, `changedModel`, `oldInstance`, `newInstance`, `changedModelId`, `changedModelValue`) + VALUES + ('1', '1', '1', 'insert', 'We made a change!', 'Item', '{}', '{}', 1, '1'); -INSERT INTO - `cache`.`cache_calc` ( - `id`, `cache_id`, `cacheName`, `params`, `last_refresh`, `expires`, `created`, `connection_id` - ) -VALUES ( - 1, 2, 'available', CONCAT_WS('/', 1, util.VN_CURDATE ()), util.VN_NOW (), DATE_ADD( - util.VN_NOW (), INTERVAL 15 MINUTE - ), util.VN_CURDATE (), NULL - ), - ( - 2, 4, 'last_buy', CONCAT_WS('/', 1, util.VN_CURDATE ()), util.VN_NOW (), DATE_ADD( - util.VN_NOW (), INTERVAL 15 MINUTE - ), util.VN_CURDATE (), NULL - ), - ( - 3, 8, 'visible', CONCAT_WS('/', 1, util.VN_CURDATE ()), util.VN_NOW (), DATE_ADD( - util.VN_NOW (), INTERVAL 15 MINUTE - ), util.VN_CURDATE (), NULL - ); +INSERT INTO `vn`.`recovery`(`id`, `clientFk`, `started`, `finished`, `amount`, `period`) + VALUES + (1, 1101, DATE_ADD(util.VN_CURDATE(),INTERVAL -7 MONTH), DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), 50, 7), + (2, 1102, DATE_ADD(util.VN_CURDATE(),INTERVAL -5 MONTH), util.VN_CURDATE(), 100, 1), + (3, 1102, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(),INTERVAL 1 MONTH), 50, 7), + (4, 1103, util.VN_CURDATE(), NULL, 50, 7); -INSERT INTO - `vn`.`ticketWeekly` (`ticketFk`, `weekDay`) -VALUES (2, 1), - (3, 2), - (5, 6), - (15, 6); +INSERT INTO `bs`.`clientAnnualConsumption`(`clientFk`, `invoiced`) + VALUES + (1101, 1500), + (1102, 100), + (1103, 1000), + (1104, 500), + (1105, 5000); -INSERT INTO - `vn`.`awb` ( - id, code, package, weight, created, amount, transitoryFk, taxFk - ) -VALUES ( - 1, '07546501420', 67, 671, util.VN_CURDATE (), 1761, 1, 1 - ), - ( - 2, '07546491421', 252, 2769, util.VN_CURDATE (), 5231, 1, 1 - ), - ( - 3, '07546500823', 102, 1495, util.VN_CURDATE (), 3221, 1, 1 - ), - ( - 4, '99610288821', 252, 2777, util.VN_CURDATE (), 3641, 1, 1 - ), - ( - 5, '07546500834', 229, 3292, util.VN_CURDATE (), 6601, 2, 1 - ), - ( - 6, '22101929561', 37, 458, util.VN_CURDATE (), 441, 2, 1 - ), - ( - 7, '07546491432', 258, 3034, util.VN_CURDATE (), 6441, 2, 1 - ), - ( - 8, '99610288644', 476, 4461, util.VN_CURDATE (), 5751, 442, 1 - ), - ( - 9, '99610289193', 302, 2972, util.VN_CURDATE (), 3871, 442, 1 - ), - ( - 10, '07546500856', 185, 2364, util.VN_CURDATE (), 5321, 442, 1 - ); +INSERT INTO `cache`.`cache_calc`(`id`, `cache_id`, `cacheName`, `params`, `last_refresh`, `expires`, `created`, `connection_id`) + VALUES + (1, 2, 'available', CONCAT_WS('/',1,util.VN_CURDATE()), util.VN_NOW(), DATE_ADD(util.VN_NOW(),INTERVAL 15 MINUTE), util.VN_CURDATE(), NULL), + (2, 4, 'last_buy', CONCAT_WS('/',1,util.VN_CURDATE()), util.VN_NOW(), DATE_ADD(util.VN_NOW(),INTERVAL 15 MINUTE), util.VN_CURDATE(), NULL), + (3, 8, 'visible', CONCAT_WS('/',1,util.VN_CURDATE()), util.VN_NOW(), DATE_ADD(util.VN_NOW(),INTERVAL 15 MINUTE), util.VN_CURDATE(), NULL); -INSERT INTO - `vn`.`travel` ( - `id`, `shipped`, `landed`, `warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`, `ref`, `totalEntries`, `cargoSupplierFk`, `awbFK` - ) -VALUES ( - 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1 - ), - ( - 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 2, 1, 150, 2000, 'second travel', 2, 2, 2 - ), - ( - 3, util.VN_CURDATE (), util.VN_CURDATE (), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3 - ), - ( - 4, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4 - ), - ( - 5, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5 - ), - ( - 6, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6 - ), - ( - 7, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7 - ), - ( - 8, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10 - ); +INSERT INTO `vn`.`ticketWeekly`(`ticketFk`, `weekDay`) + VALUES + (2, 1), + (3, 2), + (5, 6), + (15, 6); -INSERT INTO - `vn`.`entry` ( - `id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes` - ) -VALUES ( - 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, '' - ), - ( - 2, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two' - ), - ( - 3, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three' - ), - ( - 4, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four' - ), - ( - 5, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five' - ), - ( - 6, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six' - ), - ( - 7, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven' - ), - ( - 8, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '' - ); +INSERT INTO `vn`.`awb` (id, code, package, weight, created, amount, transitoryFk, taxFk) + VALUES + (1, '07546501420', 67, 671, util.VN_CURDATE(), 1761, 1, 1), + (2, '07546491421', 252, 2769, util.VN_CURDATE(), 5231, 1, 1), + (3, '07546500823', 102, 1495, util.VN_CURDATE(), 3221, 1, 1), + (4, '99610288821', 252, 2777, util.VN_CURDATE(), 3641, 1, 1), + (5, '07546500834', 229, 3292, util.VN_CURDATE(), 6601, 2, 1), + (6, '22101929561', 37, 458, util.VN_CURDATE(), 441, 2, 1), + (7, '07546491432', 258, 3034, util.VN_CURDATE(), 6441, 2, 1), + (8, '99610288644', 476, 4461, util.VN_CURDATE(), 5751, 442, 1), + (9, '99610289193', 302, 2972, util.VN_CURDATE(), 3871, 442, 1), + (10, '07546500856', 185, 2364, util.VN_CURDATE(), 5321, 442, 1); -INSERT INTO - `bs`.`waste` ( - `buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate` - ) -VALUES ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Carnation', 1, 1, '1062', '51', '4.8' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Carnation Colombia', 2, 1, '35074', '687', '2.0' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Carnation Mini', 3, 1, '1777', '13', '0.7' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Carnation Short', 4, 1, '3182', '59', '0.6' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Crisantemo', 5, 1, '1747', '13', '0.7' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Lilium Oriental', 6, 1, '7182', '59', '0.6' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Alstroemeria', 7, 1, '1777', '13', '0.7' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Cymbidium', 1, 1, '4181', '59', '0.6' - ), - ( - 'CharlesXavier', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Cymbidium', 2, 1, '7268', '59', '0.6' - ), - ( - 'DavidCharlesHaller', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Containers', 2, 1, '-74', '0', '0.0' - ), - ( - 'DavidCharlesHaller', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Packagings', 3, 1, '-7', '0', '0.0' - ), - ( - 'DavidCharlesHaller', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Freight', 4, 1, '1100', '0', '0.0' - ), - ( - 'HankPym', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Funeral Accessories', 5, 1, '848', '-187', '-22.1' - ), - ( - 'HankPym', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Miscellaneous Accessories', 6, 1, '186', '0', '0.0' - ), - ( - 'HankPym', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ) - ), WEEK( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 WEEK - ), 1 - ), 'Adhesives', 7, 1, '277', '0', '0.0' - ); +INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`,`ref`, `totalEntries`, `cargoSupplierFk`, `awbFK`) + VALUES + (1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1), + (2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150, 2000, 'second travel', 2, 2, 2), + (3, util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3), + (4, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4), + (5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5), + (6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6), + (7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7), + (8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10); -INSERT INTO - `vn`.`buy` ( - `id`, `entryFk`, `itemFk`, `buyingValue`, `quantity`, `packagingFk`, `stickers`, `freightValue`, `packageValue`, `comissionValue`, `packing`, `grouping`, `groupingMode`, `location`, `price1`, `price2`, `price3`, `printedStickers`, `isChecked`, `isIgnored`, `weight`, `created` - ) -VALUES ( - 1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ) - ), - ( - 2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 3, 3, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 0, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE () - ), - ( - 4, 2, 2, 5, 450, 3, 1, 1.000, 1.000, 0.000, 10, 10, 0, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 2.5, util.VN_CURDATE () - ), - ( - 5, 3, 3, 55, 500, 5, 1, 1.000, 1.000, 0.000, 1, 1, 0, NULL, 0.00, 78.3, 75.6, 0, 1, 0, 2.5, util.VN_CURDATE () - ), - ( - 6, 4, 8, 50, 1000, 4, 1, 1.000, 1.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 2.5, util.VN_CURDATE () - ), - ( - 7, 4, 9, 20, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 30.50, 29.00, 0, 1, 0, 2.5, util.VN_CURDATE () - ), - ( - 8, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 2.5, util.VN_CURDATE () - ), - ( - 9, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 10, 5, 1, 50, 10, 4, 1, 2.500, 2.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 11, 5, 4, 1.25, 10, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 12, 6, 4, 1.25, 0, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 13, 7, 1, 50, 0, 3, 1, 2.000, 2.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 14, 7, 2, 5, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 4, util.VN_CURDATE () - ), - ( - 15, 7, 4, 1.25, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE () - ); +INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`) + VALUES + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, ''), + (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two'), + (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three'), + (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four'), + (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five'), + (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six'), + (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven'), + (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, ''); -INSERT INTO - `hedera`.`order` ( - `id`, `date_send`, `customer_id`, `delivery_method_id`, `agency_id`, `address_id`, `company_id`, `note`, `source_app`, `confirmed`, `total`, `date_make`, `first_row_stamp`, `confirm_date` - ) -VALUES ( - 1, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1101, 3, 1, 121, 442, NULL, 'TPV', 1, '155.89', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 2, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1104, 3, 1, 124, 442, NULL, 'WEB', 1, '100.10', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 3, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), INTERVAL + 1 DAY - ), 1104, 1, 2, 124, 442, NULL, 'ANDROID', 1, '107.25', DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ) - ), - ( - 4, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), INTERVAL + 1 DAY - ), 1104, 1, 2, 124, 442, NULL, 'SALIX', 1, '10.01', DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ) - ), - ( - 5, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), INTERVAL + 1 DAY - ), 1104, 1, 3, 124, 442, NULL, 'SALIX', 1, '10.01', DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ) - ), - ( - 6, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), INTERVAL + 1 DAY - ), 1101, 1, 3, 1, 442, NULL, 'SALIX', 1, '10.01', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ) - ), - ( - 7, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1101, 2, 7, 1, 442, NULL, 'SALIX', 0, '10.01', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 8, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1101, 2, 7, 121, 442, NULL, 'SALIX', 0, '123.53', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 9, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1104, 2, 7, 124, 442, NULL, 'SALIX', 0, '10.01', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 10, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1102, 3, 1, 2, 442, NULL, 'SALIX', 0, '10.01', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 11, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1102, 2, 7, 122, 442, NULL, 'SALIX', 0, '60.90', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 12, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 3, 1, 3, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 13, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1103, 1, 2, 123, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 14, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1104, 1, 2, 4, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 15, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1105, 1, 3, 125, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 16, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1106, 2, 7, 126, 442, NULL, 'SALIX', 0, '155.89', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 17, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1107, 1, 4, 127, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 18, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1108, 1, 4, 128, 442, NULL, 'SALIX', 0, '72.60', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 19, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), 1109, 1, 5, 129, 442, NULL, 'SALIX', 0, '16.50', util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 20, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 1, 5, 101, 442, NULL, 'SALIX', 0, '21.45', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ), - ( - 21, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 1, 5, 102, 442, NULL, 'SALIX', 0, '0.00', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ), - ( - 22, DATE_ADD( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), INTERVAL + 1 DAY - ), 1109, 1, 5, 103, 442, NULL, 'SALIX', 0, '148.50', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ) - ); +INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`) + VALUES + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation', 1, 1, '1062', '51', '4.8'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Colombia', 2, 1, '35074', '687', '2.0'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Mini', 3, 1, '1777', '13', '0.7'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Short', 4, 1, '3182', '59', '0.6'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Crisantemo', 5, 1, '1747', '13', '0.7'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Lilium Oriental', 6, 1, '7182', '59', '0.6'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Alstroemeria', 7, 1, '1777', '13', '0.7'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Cymbidium', 1, 1, '4181', '59', '0.6'), + ('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Cymbidium', 2, 1, '7268', '59', '0.6'), + ('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Containers', 2, 1, '-74', '0', '0.0'), + ('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Packagings', 3, 1, '-7', '0', '0.0'), + ('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Freight', 4, 1, '1100', '0', '0.0'), + ('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Funeral Accessories', 5, 1, '848', '-187', '-22.1'), + ('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Miscellaneous Accessories', 6, 1, '186', '0', '0.0'), + ('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Adhesives', 7, 1, '277', '0', '0.0'); -INSERT INTO - `hedera`.`orderRow` ( - `id`, `orderFk`, `itemFk`, `warehouseFk`, `shipment`, `amount`, `price`, `rate`, `created`, `saleFk` - ) -VALUES ( - 1, 1, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 5, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1 - ), - ( - 2, 1, 2, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 10, 1.07, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2 - ), - ( - 3, 1, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 3 - ), - ( - 4, 1, 4, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 20, 3.06, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 4 - ), - ( - 5, 2, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 10, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 5 - ), - ( - 6, 3, 1, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), 15, 6.50, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 MONTH - ), 6 - ), - ( - 7, 11, 2, 1, util.VN_CURDATE (), 15, 1.30, 0, util.VN_CURDATE (), 7 - ), - ( - 8, 11, 4, 1, util.VN_CURDATE (), 10, 3.26, 0, util.VN_CURDATE (), 8 - ), - ( - 9, 16, 1, 1, util.VN_CURDATE (), 5, 9.10, 0, util.VN_CURDATE (), 9 - ), - ( - 10, 16, 2, 1, util.VN_CURDATE (), 10, 1.07, 0, util.VN_CURDATE (), 10 - ), - ( - 11, 16, 1, 1, util.VN_CURDATE (), 2, 9.10, 0, util.VN_CURDATE (), 11 - ), - ( - 12, 16, 4, 1, util.VN_CURDATE (), 20, 3.06, 0, util.VN_CURDATE (), 12 - ), - ( - 13, 8, 2, 1, util.VN_CURDATE (), 15, 1.30, 0, util.VN_CURDATE (), 13 - ), - ( - 14, 8, 1, 1, util.VN_CURDATE (), 10, 9.28, 0, util.VN_CURDATE (), 14 - ), - ( - 15, 19, 1, 1, util.VN_CURDATE (), 10, 1.50, 0, util.VN_CURDATE (), 15 - ), - ( - 16, 20, 2, 1, util.VN_CURDATE (), 15, 1.30, 0, util.VN_CURDATE (), 16 - ), - ( - 17, 22, 2, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 30, 2.30, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 17 - ), - ( - 18, 22, 4, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 20, 3.00, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 MONTH - ), 18 - ), - ( - 19, 4, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), 1, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 MONTH - ), 19 - ), - ( - 20, 5, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), 1, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -4 MONTH - ), 20 - ), - ( - 21, 6, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 9.10, 0, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 21 - ), - ( - 22, 7, 1, 1, util.VN_CURDATE (), 1, 9.10, 0, util.VN_CURDATE (), 22 - ), - ( - 23, 9, 1, 1, util.VN_CURDATE (), 1, 9.10, 0, util.VN_CURDATE (), 23 - ), - ( - 24, 10, 1, 1, util.VN_CURDATE (), 1, 9.10, 0, util.VN_CURDATE (), 24 - ), - ( - 25, 12, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 25 - ), - ( - 26, 13, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 26 - ), - ( - 27, 14, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 27 - ), - ( - 28, 15, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 28 - ), - ( - 29, 17, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 29 - ), - ( - 30, 18, 4, 1, util.VN_CURDATE (), 20, 3.00, 0, util.VN_CURDATE (), 30 - ); +INSERT INTO `vn`.`buy`(`id`,`entryFk`,`itemFk`,`buyingValue`,`quantity`,`packagingFk`,`stickers`,`freightValue`,`packageValue`,`comissionValue`,`packing`,`grouping`,`groupingMode`,`location`,`price1`,`price2`,`price3`, `printedStickers`,`isChecked`,`isIgnored`,`weight`, `created`) + VALUES + (1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), + (2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (3, 3, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 0, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE()), + (4, 2, 2, 5, 450, 3, 1, 1.000, 1.000, 0.000, 10, 10, 0, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 2.5, util.VN_CURDATE()), + (5, 3, 3, 55, 500, 5, 1, 1.000, 1.000, 0.000, 1, 1, 0, NULL, 0.00, 78.3, 75.6, 0, 1, 0, 2.5, util.VN_CURDATE()), + (6, 4, 8, 50, 1000, 4, 1, 1.000, 1.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 2.5, util.VN_CURDATE()), + (7, 4, 9, 20, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 30.50, 29.00, 0, 1, 0, 2.5, util.VN_CURDATE()), + (8, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 2.5, util.VN_CURDATE()), + (9, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()), + (10, 5, 1, 50, 10, 4, 1, 2.500, 2.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE()), + (11, 5, 4, 1.25, 10, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()), + (12, 6, 4, 1.25, 0, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()), + (13, 7, 1, 50, 0, 3, 1, 2.000, 2.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE()), + (14, 7, 2, 5, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 4, util.VN_CURDATE()), + (15, 7, 4, 1.25, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()); -INSERT INTO - `hedera`.`orderRowComponent` ( - `rowFk`, `componentFk`, `price` - ) -VALUES (1, 15, 0.58), - (1, 23, 6.5), - (1, 28, 20.72), - (1, 29, -18.72), - (1, 39, 0.02), - (2, 15, 0.058), - (2, 21, 0.002), - (2, 28, 5.6), - (2, 29, -4.6), - (2, 39, 0.01), - (3, 15, 0.58), - (3, 23, 6.5), - (3, 28, 20.72), - (3, 29, -18.72), - (3, 39, 0.02), - (4, 15, 0.051), - (4, 21, -0.001), - (4, 28, 20.72), - (4, 29, -19.72), - (4, 37, 2), - (4, 39, 0.01), - (5, 15, 0.58), - (5, 23, 6.5), - (5, 28, 20.72), - (5, 29, -18.72), - (5, 39, 0.02), - (6, 23, 6.5), - (7, 15, 0.0114), - (7, 28, 5.6), - (7, 29, -4.6), - (7, 39, 0.01), - (8, 15, 0.0016), - (8, 28, 20.72), - (8, 29, -19.72), - (8, 37, 2), - (8, 39, 0.01), - (9, 15, 0.58), - (9, 23, 6.5), - (9, 28, 20.72), - (9, 29, -18.72), - (9, 39, 0.02), - (10, 15, 0.058), - (10, 21, 0.002), - (10, 28, 5.6), - (10, 29, -4.6), - (10, 39, 0.01), - (11, 15, 0.58), - (11, 23, 6.5), - (11, 28, 20.72), - (11, 29, -18.72), - (11, 39, 0.02), - (12, 15, 0.051), - (12, 22, -0.001), - (12, 28, 20.72), - (12, 29, -19.72), - (12, 37, 2), - (12, 39, 0.01), - (13, 15, 0.2899), - (13, 28, 5.6), - (13, 29, -4.6), - (13, 39, 0.01), - (14, 15, 0.58), - (14, 23, 6.5), - (14, 28, 20.72), - (14, 29, -18.72), - (14, 39, 0.02), - (15, 15, 0.58), - (15, 23, 6.5), - (15, 28, 20.72), - (15, 29, -18.72), - (15, 39, 0.02), - (16, 15, 0.058), - (16, 21, 0.002), - (16, 28, 5.6), - (16, 29, -4.6), - (16, 39, 0.01), - (17, 15, 0.058), - (17, 21, 0.002), - (17, 28, 5.6), - (17, 29, -4.6), - (17, 39, 0.01), - (18, 15, 0.051), - (18, 22, -0.001), - (18, 28, 20.72), - (18, 29, -19.72), - (18, 37, 2), - (18, 39, 0.01), - (19, 15, 0.58), - (19, 23, 6.5), - (19, 28, 20.72), - (19, 29, -18.72), - (19, 39, 0.02), - (20, 15, 0.58), - (20, 23, 6.5), - (20, 28, 20.72), - (20, 29, -18.72), - (20, 39, 0.02), - (21, 15, 0.58), - (21, 23, 6.5), - (21, 28, 20.72), - (21, 29, -18.72), - (21, 39, 0.02), - (22, 15, 0.58), - (22, 23, 6.5), - (22, 28, 20.72), - (22, 29, -18.72), - (22, 39, 0.02), - (23, 15, 0.58), - (23, 23, 6.5), - (23, 28, 20.72), - (23, 29, -18.72), - (23, 39, 0.02), - (24, 15, 0.58), - (24, 23, 6.5), - (24, 28, 20.72), - (24, 29, -18.72), - (24, 39, 0.02), - (25, 15, 0.051), - (25, 22, -0.001), - (25, 28, 20.72), - (25, 29, -19.72), - (25, 37, 2), - (25, 39, 0.01), - (26, 15, 0.051), - (26, 22, -0.001), - (26, 28, 20.72), - (26, 29, -19.72), - (26, 37, 2), - (26, 39, 0.01), - (27, 15, 0.051), - (27, 22, -0.001), - (27, 28, 20.72), - (27, 29, -19.72), - (27, 37, 2), - (27, 39, 0.01), - (28, 15, 0.051), - (28, 22, -0.001), - (28, 28, 20.72), - (28, 29, -19.72), - (28, 37, 2), - (28, 39, 0.01), - (29, 15, 0.051), - (29, 22, -0.001), - (29, 28, 20.72), - (29, 29, -19.72), - (29, 37, 2), - (29, 39, 0.01), - (30, 15, 0.051), - (30, 22, -0.001), - (30, 28, 20.72), - (30, 29, -19.72), - (30, 37, 2), - (30, 39, 0.01); +INSERT INTO `hedera`.`order`(`id`, `date_send`, `customer_id`, `delivery_method_id`, `agency_id`, `address_id`, `company_id`, `note`, `source_app`, `confirmed`,`total`, `date_make`, `first_row_stamp`, `confirm_date`) + VALUES + (1, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 3, 1, 121, 442, NULL, 'TPV', 1,'155.89', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (2, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1104, 3, 1, 124, 442, NULL, 'WEB', 1,'100.10', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (3, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -2 MONTH), INTERVAL +1 DAY), 1104, 1, 2, 124, 442, NULL, 'ANDROID', 1,'107.25', DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), + (4, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), INTERVAL +1 DAY), 1104, 1, 2, 124, 442, NULL, 'SALIX', 1,'10.01', DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH)), + (5, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -4 MONTH), INTERVAL +1 DAY), 1104, 1, 3, 124, 442, NULL, 'SALIX', 1,'10.01', DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH)), + (6, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 1, 3, 1, 442, NULL, 'SALIX', 1,'10.01', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (7, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 2, 7, 1, 442, NULL, 'SALIX', 0,'10.01', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (8, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 2, 7, 121, 442, NULL, 'SALIX', 0,'123.53', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (9, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1104, 2, 7, 124, 442, NULL, 'SALIX', 0,'10.01', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (10, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 3, 1, 2, 442, NULL, 'SALIX', 0,'10.01', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (11, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 2, 7, 122, 442, NULL, 'SALIX', 0,'60.90', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (12, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 3, 1, 3, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (13, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 1, 2, 123, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (14, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1104, 1, 2, 4, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (15, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 1, 3, 125, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (16, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 2, 7, 126, 442, NULL, 'SALIX', 0,'155.89', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (17, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1107, 1, 4, 127, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (18, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 1, 4, 128, 442, NULL, 'SALIX', 0,'72.60', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (19, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 1, 5, 129, 442, NULL, 'SALIX', 0,'16.50', util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE()), + (20, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 1, 5, 101, 442, NULL, 'SALIX', 0,'21.45', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)), + (21, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 1, 5, 102, 442, NULL, 'SALIX', 0,'0.00', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)), + (22, DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 1, 5, 103, 442, NULL, 'SALIX', 0,'148.50', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)); -INSERT INTO - `hedera`.`visit` (`id`, `firstAgentFk`) -VALUES (1, NULL), - (2, NULL), - (3, NULL), - (4, NULL), - (5, NULL), - (6, NULL), - (7, NULL), - (8, NULL), - (9, NULL), - (10, NULL), - (11, NULL); +INSERT INTO `hedera`.`orderRow`(`id`, `orderFk`, `itemFk`, `warehouseFk`, `shipment`, `amount`, `price`, `rate`, `created`, `saleFk`) + VALUES + (1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1), + (2, 1, 2, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 10, 1.07, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2), + (3, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3), + (4, 1, 4, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 20, 3.06, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4), + (5, 2, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 10, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5), + (6, 3, 1, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 15, 6.50, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 6), + (7, 11, 2, 1, util.VN_CURDATE(), 15, 1.30, 0, util.VN_CURDATE(), 7), + (8, 11, 4, 1, util.VN_CURDATE(), 10, 3.26, 0, util.VN_CURDATE(), 8), + (9, 16, 1, 1, util.VN_CURDATE(), 5, 9.10, 0, util.VN_CURDATE(), 9), + (10, 16, 2, 1, util.VN_CURDATE(), 10, 1.07, 0, util.VN_CURDATE(), 10), + (11, 16, 1, 1, util.VN_CURDATE(), 2, 9.10, 0, util.VN_CURDATE(), 11), + (12, 16, 4, 1, util.VN_CURDATE(), 20, 3.06, 0, util.VN_CURDATE(), 12), + (13, 8, 2, 1, util.VN_CURDATE(), 15, 1.30, 0, util.VN_CURDATE(), 13), + (14, 8, 1, 1, util.VN_CURDATE(), 10, 9.28, 0, util.VN_CURDATE(), 14), + (15, 19, 1, 1, util.VN_CURDATE(), 10, 1.50, 0, util.VN_CURDATE(), 15), + (16, 20, 2, 1, util.VN_CURDATE(), 15, 1.30, 0, util.VN_CURDATE(), 16), + (17, 22, 2, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 30, 2.30, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 17), + (18, 22, 4, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 20, 3.00, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 18), + (19, 4, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 19), + (20, 5, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 20), + (21, 6, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 9.10, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 21), + (22, 7, 1, 1, util.VN_CURDATE(), 1, 9.10, 0, util.VN_CURDATE(), 22), + (23, 9, 1, 1, util.VN_CURDATE(), 1, 9.10, 0, util.VN_CURDATE(), 23), + (24, 10, 1, 1, util.VN_CURDATE(), 1, 9.10, 0, util.VN_CURDATE(), 24), + (25, 12, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 25), + (26, 13, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 26), + (27, 14, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 27), + (28, 15, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 28), + (29, 17, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 29), + (30, 18, 4, 1, util.VN_CURDATE(), 20, 3.00, 0, util.VN_CURDATE(), 30); -INSERT INTO - `hedera`.`visitAgent` (`id`, `visitFk`) -VALUES (1, 1), - (2, 2), - (3, 3), - (4, 4), - (5, 5), - (6, 6), - (7, 7), - (8, 8), - (9, 9), - (10, 10), - (11, 11); +INSERT INTO `hedera`.`orderRowComponent`(`rowFk`, `componentFk`, `price`) + VALUES + (1, 15, 0.58), + (1, 23, 6.5), + (1, 28, 20.72), + (1, 29, -18.72), + (1, 39, 0.02), + (2, 15, 0.058), + (2, 21, 0.002), + (2, 28, 5.6), + (2, 29, -4.6), + (2, 39, 0.01), + (3, 15, 0.58), + (3, 23, 6.5), + (3, 28, 20.72), + (3, 29, -18.72), + (3, 39, 0.02), + (4, 15, 0.051), + (4, 21, -0.001), + (4, 28, 20.72), + (4, 29, -19.72), + (4, 37, 2), + (4, 39, 0.01), + (5, 15, 0.58), + (5, 23, 6.5), + (5, 28, 20.72), + (5, 29, -18.72), + (5, 39, 0.02), + (6, 23, 6.5), + (7, 15, 0.0114), + (7, 28, 5.6), + (7, 29, -4.6), + (7, 39, 0.01), + (8, 15, 0.0016), + (8, 28, 20.72), + (8, 29, -19.72), + (8, 37, 2), + (8, 39, 0.01), + (9, 15, 0.58), + (9, 23, 6.5), + (9, 28, 20.72), + (9, 29, -18.72), + (9, 39, 0.02), + (10, 15, 0.058), + (10, 21, 0.002), + (10, 28, 5.6), + (10, 29, -4.6), + (10, 39, 0.01), + (11, 15, 0.58), + (11, 23, 6.5), + (11, 28, 20.72), + (11, 29, -18.72), + (11, 39, 0.02), + (12, 15, 0.051), + (12, 22, -0.001), + (12, 28, 20.72), + (12, 29, -19.72), + (12, 37, 2), + (12, 39, 0.01), + (13, 15, 0.2899), + (13, 28, 5.6), + (13, 29, -4.6), + (13, 39, 0.01), + (14, 15, 0.58), + (14, 23, 6.5), + (14, 28, 20.72), + (14, 29, -18.72), + (14, 39, 0.02), + (15, 15, 0.58), + (15, 23, 6.5), + (15, 28, 20.72), + (15, 29, -18.72), + (15, 39, 0.02), + (16, 15, 0.058), + (16, 21, 0.002), + (16, 28, 5.6), + (16, 29, -4.6), + (16, 39, 0.01), + (17, 15, 0.058), + (17, 21, 0.002), + (17, 28, 5.6), + (17, 29, -4.6), + (17, 39, 0.01), + (18, 15, 0.051), + (18, 22, -0.001), + (18, 28, 20.72), + (18, 29, -19.72), + (18, 37, 2), + (18, 39, 0.01), + (19, 15, 0.58), + (19, 23, 6.5), + (19, 28, 20.72), + (19, 29, -18.72), + (19, 39, 0.02), + (20, 15, 0.58), + (20, 23, 6.5), + (20, 28, 20.72), + (20, 29, -18.72), + (20, 39, 0.02), + (21, 15, 0.58), + (21, 23, 6.5), + (21, 28, 20.72), + (21, 29, -18.72), + (21, 39, 0.02), + (22, 15, 0.58), + (22, 23, 6.5), + (22, 28, 20.72), + (22, 29, -18.72), + (22, 39, 0.02), + (23, 15, 0.58), + (23, 23, 6.5), + (23, 28, 20.72), + (23, 29, -18.72), + (23, 39, 0.02), + (24, 15, 0.58), + (24, 23, 6.5), + (24, 28, 20.72), + (24, 29, -18.72), + (24, 39, 0.02), + (25, 15, 0.051), + (25, 22, -0.001), + (25, 28, 20.72), + (25, 29, -19.72), + (25, 37, 2), + (25, 39, 0.01), + (26, 15, 0.051), + (26, 22, -0.001), + (26, 28, 20.72), + (26, 29, -19.72), + (26, 37, 2), + (26, 39, 0.01), + (27, 15, 0.051), + (27, 22, -0.001), + (27, 28, 20.72), + (27, 29, -19.72), + (27, 37, 2), + (27, 39, 0.01), + (28, 15, 0.051), + (28, 22, -0.001), + (28, 28, 20.72), + (28, 29, -19.72), + (28, 37, 2), + (28, 39, 0.01), + (29, 15, 0.051), + (29, 22, -0.001), + (29, 28, 20.72), + (29, 29, -19.72), + (29, 37, 2), + (29, 39, 0.01), + (30, 15, 0.051), + (30, 22, -0.001), + (30, 28, 20.72), + (30, 29, -19.72), + (30, 37, 2), + (30, 39, 0.01); -INSERT INTO - `hedera`.`visitAccess` (`id`, `agentFk`, `stamp`) -VALUES (1, 1, util.VN_CURDATE ()), - (2, 2, util.VN_CURDATE ()), - (3, 3, util.VN_CURDATE ()), - (4, 4, util.VN_CURDATE ()), - (5, 5, util.VN_CURDATE ()), - (6, 6, util.VN_CURDATE ()), - (7, 7, util.VN_CURDATE ()), - (8, 8, util.VN_CURDATE ()), - (9, 9, util.VN_CURDATE ()), - (10, 10, util.VN_CURDATE ()), - (11, 11, util.VN_CURDATE ()); +INSERT INTO `hedera`.`visit`(`id`, `firstAgentFk`) + VALUES + (1, NULL), + (2, NULL), + (3, NULL), + (4, NULL), + (5, NULL), + (6, NULL), + (7, NULL), + (8, NULL), + (9, NULL), + (10, NULL), + (11, NULL); -INSERT INTO - `hedera`.`visitUser` ( - `id`, `accessFk`, `userFk`, `stamp` - ) -VALUES ( - 1, 1, 1101, util.VN_CURDATE () - ), - ( - 2, 2, 1101, util.VN_CURDATE () - ), - ( - 3, 3, 1101, util.VN_CURDATE () - ), - ( - 4, 4, 1102, util.VN_CURDATE () - ), - ( - 5, 5, 1102, util.VN_CURDATE () - ), - ( - 6, 6, 1102, util.VN_CURDATE () - ), - ( - 7, 7, 1103, util.VN_CURDATE () - ), - ( - 8, 8, 1103, util.VN_CURDATE () - ), - ( - 9, 9, 1103, util.VN_CURDATE () - ), - ( - 10, 10, 1102, DATE_SUB( - util.VN_CURDATE (), INTERVAL 1 DAY - ) - ), - ( - 11, 11, 1103, DATE_SUB( - util.VN_CURDATE (), INTERVAL 1 DAY - ) - ); +INSERT INTO `hedera`.`visitAgent`(`id`, `visitFk`) + VALUES + (1, 1), + (2, 2), + (3, 3), + (4, 4), + (5, 5), + (6, 6), + (7, 7), + (8, 8), + (9, 9), + (10, 10), + (11, 11); -INSERT INTO - `hedera`.`userSession` ( - `created`, `lastUpdate`, `ssid`, `data`, `userVisitFk` - ) -VALUES ( - util.VN_CURDATE (), util.VN_CURDATE (), '121', 'data', 1 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '122', 'data', 2 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '123', 'data', 3 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '124', 'data', 4 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '125', 'data', 5 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '126', 'data', 6 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '127', 'data', 7 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '128', 'data', 8 - ), - ( - util.VN_CURDATE (), util.VN_CURDATE (), '129', 'data', 9 - ); +INSERT INTO `hedera`.`visitAccess`(`id`, `agentFk`, `stamp`) + VALUES + (1, 1, util.VN_CURDATE()), + (2, 2, util.VN_CURDATE()), + (3, 3, util.VN_CURDATE()), + (4, 4, util.VN_CURDATE()), + (5, 5, util.VN_CURDATE()), + (6, 6, util.VN_CURDATE()), + (7, 7, util.VN_CURDATE()), + (8, 8, util.VN_CURDATE()), + (9, 9, util.VN_CURDATE()), + (10, 10, util.VN_CURDATE()), + (11, 11, util.VN_CURDATE()); -INSERT INTO - `vn`.`clientContact` ( - `id`, `clientFk`, `name`, `phone` - ) -VALUES ( - 1, 1101, 'contact 1', 666777888 - ), - ( - 2, 1101, 'contact 2', 111222333 - ), - ( - 3, 1101, 'contact 3', 222333444 - ), - ( - 4, 1102, 'contact 1', 876543219 - ); +INSERT INTO `hedera`.`visitUser`(`id`, `accessFk`, `userFk`, `stamp`) + VALUES + (1, 1, 1101, util.VN_CURDATE()), + (2, 2, 1101, util.VN_CURDATE()), + (3, 3, 1101, util.VN_CURDATE()), + (4, 4, 1102, util.VN_CURDATE()), + (5, 5, 1102, util.VN_CURDATE()), + (6, 6, 1102, util.VN_CURDATE()), + (7, 7, 1103, util.VN_CURDATE()), + (8, 8, 1103, util.VN_CURDATE()), + (9, 9, 1103, util.VN_CURDATE()), + (10, 10, 1102, DATE_SUB(util.VN_CURDATE(), INTERVAL 1 DAY)), + (11, 11, 1103, DATE_SUB(util.VN_CURDATE(), INTERVAL 1 DAY)); -INSERT INTO - `vn`.`workerManaExcluded` (`workerFk`) -VALUES (9); +INSERT INTO `hedera`.`userSession`(`created`, `lastUpdate`, `ssid`, `data`, `userVisitFk`) + VALUES + (util.VN_CURDATE(), util.VN_CURDATE(), '121', 'data', 1), + (util.VN_CURDATE(), util.VN_CURDATE(), '122', 'data', 2), + (util.VN_CURDATE(), util.VN_CURDATE(), '123', 'data', 3), + (util.VN_CURDATE(), util.VN_CURDATE(), '124', 'data', 4), + (util.VN_CURDATE(), util.VN_CURDATE(), '125', 'data', 5), + (util.VN_CURDATE(), util.VN_CURDATE(), '126', 'data', 6), + (util.VN_CURDATE(), util.VN_CURDATE(), '127', 'data', 7), + (util.VN_CURDATE(), util.VN_CURDATE(), '128', 'data', 8), + (util.VN_CURDATE(), util.VN_CURDATE(), '129', 'data', 9); +INSERT INTO `vn`.`clientContact`(`id`, `clientFk`, `name`, `phone`) + VALUES + (1, 1101, 'contact 1', 666777888), + (2, 1101, 'contact 2', 111222333), + (3, 1101, 'contact 3', 222333444), + (4, 1102, 'contact 1', 876543219); + +INSERT INTO `vn`.`workerManaExcluded`(`workerFk`) + VALUES + (9); /* -el mana de los trabajadores lo podemos poner a mano en la tabla si lo calculamos antes, -pero si hazemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto -La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets + el mana de los trabajadores lo podemos poner a mano en la tabla si lo calculamos antes, + pero si hazemos alguna modificacion en alguna tabla que utiliza para calcularlo ya no seria correcto + + La otra manera es poner el calculo con los 2 trabajadores que utilizamos ahora mismo para los tickets */ -call vn.manaSpellersRequery (19); +call vn.manaSpellersRequery(19); +call vn.manaSpellersRequery(18); -call vn.manaSpellersRequery (18); +INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk`, `userFk`, `companyFk`) + VALUES + (1, 1101, 1, util.VN_CURDATE(), 18, 18, 442), + (2, 1101, 1, util.VN_CURDATE(), 18, 18, 442), + (3, 1101, 2, util.VN_CURDATE(), 18, 18, 442), + (4, 1102, 2, util.VN_CURDATE(), 18, 18, 567), + (5, 1102, 3, util.VN_CURDATE(), 19, 19, 567); -INSERT INTO - `vn`.`clientSample` ( - `id`, `clientFk`, `typeFk`, `created`, `workerFk`, `userFk`, `companyFk` - ) -VALUES ( - 1, 1101, 1, util.VN_CURDATE (), 18, 18, 442 - ), - ( - 2, 1101, 1, util.VN_CURDATE (), 18, 18, 442 - ), - ( - 3, 1101, 2, util.VN_CURDATE (), 18, 18, 442 - ), - ( - 4, 1102, 2, util.VN_CURDATE (), 18, 18, 567 - ), - ( - 5, 1102, 3, util.VN_CURDATE (), 19, 19, 567 - ); +INSERT INTO `vn`.`claimState`(`id`, `code`, `description`, `roleFk`, `priority`, `hasToNotify`) + VALUES + ( 1, 'pending', 'Pendiente', 1, 1, 0), + ( 2, 'managed', 'Gestionado', 72, 5, 0), + ( 3, 'resolved', 'Resuelto', 72, 7, 0), + ( 4, 'canceled', 'Anulado', 72, 6, 1), + ( 5, 'incomplete', 'Incompleta', 1, 3, 1), + ( 6, 'mana', 'Mana', 72, 4, 0), + ( 7, 'lack', 'Faltas', 72, 2, 0); -INSERT INTO - `vn`.`claimState` ( - `id`, `code`, `description`, `roleFk`, `priority`, `hasToNotify` - ) -VALUES ( - 1, 'pending', 'Pendiente', 1, 1, 0 - ), - ( - 2, 'managed', 'Gestionado', 72, 5, 0 - ), - ( - 3, 'resolved', 'Resuelto', 72, 7, 0 - ), - ( - 4, 'canceled', 'Anulado', 72, 6, 1 - ), - ( - 5, 'incomplete', 'Incompleta', 1, 3, 1 - ), - (6, 'mana', 'Mana', 72, 4, 0), - (7, 'lack', 'Faltas', 72, 2, 0); +INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `rma`, `ticketFk`) + VALUES + (1, util.VN_CURDATE(), 1, 1101, 18, 3, 0, util.VN_CURDATE(), 0, '02676A049183', 11), + (2, util.VN_CURDATE(), 2, 1101, 18, 3, 0, util.VN_CURDATE(), 1, NULL, 16), + (3, util.VN_CURDATE(), 3, 1101, 18, 1, 1, util.VN_CURDATE(), 5, NULL, 7), + (4, util.VN_CURDATE(), 3, 1104, 18, 5, 0, util.VN_CURDATE(), 10, NULL, 8); -INSERT INTO - `vn`.`claim` ( - `id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `rma`, `ticketFk` - ) -VALUES ( - 1, util.VN_CURDATE (), 1, 1101, 18, 3, 0, util.VN_CURDATE (), 0, '02676A049183', 11 - ), - ( - 2, util.VN_CURDATE (), 2, 1101, 18, 3, 0, util.VN_CURDATE (), 1, NULL, 16 - ), - ( - 3, util.VN_CURDATE (), 3, 1101, 18, 1, 1, util.VN_CURDATE (), 5, NULL, 7 - ), - ( - 4, util.VN_CURDATE (), 3, 1104, 18, 5, 0, util.VN_CURDATE (), 10, NULL, 8 - ); +INSERT INTO `vn`.`claimObservation` (`claimFk`, `workerFk`, `text`, `created`) + VALUES + (1, 18, 'Cu nam labores lobortis definiebas, ei aliquyam salutatus persequeris quo, cum eu nemore fierent dissentiunt. Per vero dolor id, vide democritum scribentur eu vim, pri erroribus temporibus ex.', util.VN_CURDATE()), + (2, 18, 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.', util.VN_CURDATE()), + (3, 18, 'An vim commodo dolorem volutpat, cu expetendis voluptatum usu, et mutat consul adversarium his. His natum numquam legimus an, diam fabulas mei ut. Melius fabellas sadipscing vel id. Partem diceret mandamus mea ne, has te tempor nostrud. Aeque nostro eum no.', util.VN_CURDATE()), + (4, 18, 'Wisi forensibus mnesarchum in cum. Per id impetus abhorreant, his no magna definiebas, inani rationibus in quo. Ut vidisse dolores est, ut quis nominavi mel. Ad pri quod apeirian concludaturque.', util.VN_CURDATE()); -INSERT INTO - `vn`.`claimObservation` ( - `claimFk`, `workerFk`, `text`, `created` - ) -VALUES ( - 1, 18, 'Cu nam labores lobortis definiebas, ei aliquyam salutatus persequeris quo, cum eu nemore fierent dissentiunt. Per vero dolor id, vide democritum scribentur eu vim, pri erroribus temporibus ex.', util.VN_CURDATE () - ), - ( - 2, 18, 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.', util.VN_CURDATE () - ), - ( - 3, 18, 'An vim commodo dolorem volutpat, cu expetendis voluptatum usu, et mutat consul adversarium his. His natum numquam legimus an, diam fabulas mei ut. Melius fabellas sadipscing vel id. Partem diceret mandamus mea ne, has te tempor nostrud. Aeque nostro eum no.', util.VN_CURDATE () - ), - ( - 4, 18, 'Wisi forensibus mnesarchum in cum. Per id impetus abhorreant, his no magna definiebas, inani rationibus in quo. Ut vidisse dolores est, ut quis nominavi mel. Ad pri quod apeirian concludaturque.', util.VN_CURDATE () - ); +INSERT INTO `vn`.`claimBeginning`(`id`, `claimFk`, `saleFk`, `quantity`) + VALUES + (1, 1, 7, 5), + (2, 2, 10, 10), + (3, 3, 22, 1), + (4, 4, 13, 5); -INSERT INTO - `vn`.`claimBeginning` ( - `id`, `claimFk`, `saleFk`, `quantity` - ) -VALUES (1, 1, 7, 5), - (2, 2, 10, 10), - (3, 3, 22, 1), - (4, 4, 13, 5); +INSERT INTO `vn`.`claimDestination`(`id`, `description`, `addressFk`) + VALUES + (1, 'Bueno', NULL), + (2, 'Basura/Perd.', 12), + (3, 'Confeccion', NULL), + (4, 'Reclam.PRAG', 12), + (5, 'Corregido', 11); -INSERT INTO - `vn`.`claimDestination` ( - `id`, `description`, `addressFk` - ) -VALUES (1, 'Bueno', NULL), - (2, 'Basura/Perd.', 12), - (3, 'Confeccion', NULL), - (4, 'Reclam.PRAG', 12), - (5, 'Corregido', 11); +INSERT INTO `vn`.`claimDevelopment`(`id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk`) + VALUES + (1, 1, 1, 21, 1, 1, 2, 5), + (2, 1, 2, 21, 7, 2, 2, 5), + (3, 2, 7, 21, 9, 3, 2, 5), + (4, 3, 7, 21, 15, 8, 2, 5), + (5, 4, 7, 21, 7, 8, 2, 5); -INSERT INTO - `vn`.`claimDevelopment` ( - `id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk` - ) -VALUES (1, 1, 1, 21, 1, 1, 2, 5), - (2, 1, 2, 21, 7, 2, 2, 5), - (3, 2, 7, 21, 9, 3, 2, 5), - (4, 3, 7, 21, 15, 8, 2, 5), - (5, 4, 7, 21, 7, 8, 2, 5); +INSERT INTO `vn`.`claimEnd`(`id`, `saleFk`, `claimFk`, `workerFk`, `claimDestinationFk`) + VALUES + (1, 31, 4, 21, 2), + (2, 32, 3, 21, 3); -INSERT INTO - `vn`.`claimEnd` ( - `id`, `saleFk`, `claimFk`, `workerFk`, `claimDestinationFk` - ) -VALUES (1, 31, 4, 21, 2), - (2, 32, 3, 21, 3); +INSERT INTO `vn`.`claimConfig`(`id`, `maxResponsibility`) + VALUES + (1, 50), + (2, 30); -INSERT INTO - `vn`.`claimConfig` (`id`, `maxResponsibility`) -VALUES (1, 50), - (2, 30); +INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate`) + VALUES + (1101, 500, NULL, 0.00, 0.00, 1.00), + (1102, 1000, 2.00, 0.01, 0.05, 1.00), + (1103, 2000, 0.00, 0.00, 0.02, 1.00), + (1104, 2500, 150.00, 0.02, 0.10, 1.00); -INSERT INTO - `vn`.`claimRatio` ( - `clientFk`, `yearSale`, `claimAmount`, `claimingRate`, `priceIncreasing`, `packingRate` - ) -VALUES ( - 1101, 500, NULL, 0.00, 0.00, 1.00 - ), - ( - 1102, 1000, 2.00, 0.01, 0.05, 1.00 - ), - ( - 1103, 2000, 0.00, 0.00, 0.02, 1.00 - ), - ( - 1104, 2500, 150.00, 0.02, 0.10, 1.00 - ); +INSERT INTO vn.claimRma (`id`, `code`, `created`, `workerFk`) + VALUES + (1, '02676A049183', DEFAULT, 1106), + (2, '02676A049183', DEFAULT, 1106), + (3, '02676A049183', DEFAULT, 1107), + (4, '02676A049183', DEFAULT, 1107), + (5, '01837B023653', DEFAULT, 1106); -INSERT INTO - vn.claimRma ( - `id`, `code`, `created`, `workerFk` - ) -VALUES ( - 1, '02676A049183', DEFAULT, 1106 - ), - ( - 2, '02676A049183', DEFAULT, 1106 - ), - ( - 3, '02676A049183', DEFAULT, 1107 - ), - ( - 4, '02676A049183', DEFAULT, 1107 - ), - ( - 5, '01837B023653', DEFAULT, 1106 - ); +INSERT INTO `vn`.`claimLog` (`originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description`) + VALUES + (1, 18, 'update', 'Claim', '{"hasToPickUp":false}', '{"hasToPickUp":true}', 1, NULL), + (1, 18, 'update', 'ClaimObservation', '{}', '{"claimFk":1,"text":"Waiting for customer"}', 1, NULL), + (1, 18, 'insert', 'ClaimBeginning', '{}', '{"claimFk":1,"saleFk":1,"quantity":10}', 1, NULL), + (1, 18, 'insert', 'ClaimDms', '{}', '{"claimFk":1,"dmsFk":1}', 1, NULL); -INSERT INTO - `vn`.`claimLog` ( - `originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description` - ) -VALUES ( - 1, 18, 'update', 'Claim', '{"hasToPickUp":false}', '{"hasToPickUp":true}', 1, NULL - ), - ( - 1, 18, 'update', 'ClaimObservation', '{}', '{"claimFk":1,"text":"Waiting for customer"}', 1, NULL - ), - ( - 1, 18, 'insert', 'ClaimBeginning', '{}', '{"claimFk":1,"saleFk":1,"quantity":10}', 1, NULL - ), - ( - 1, 18, 'insert', 'ClaimDms', '{}', '{"claimFk":1,"dmsFk":1}', 1, NULL - ); +INSERT INTO `hedera`.`tpvMerchant`(`id`, `description`, `companyFk`, `bankFk`, `secretKey`) + VALUES + (1, 'Arkham Bank', 442, 1, 'h12387193H10238'), + (2, 'NewYork Bank', 442, 1, '7981ugsgd1hsdad'); -INSERT INTO - `hedera`.`tpvMerchant` ( - `id`, `description`, `companyFk`, `bankFk`, `secretKey` - ) -VALUES ( - 1, 'Arkham Bank', 442, 1, 'h12387193H10238' - ), - ( - 2, 'NewYork Bank', 442, 1, '7981ugsgd1hsdad' - ); +INSERT INTO `hedera`.`tpvTransaction`(`id`,`merchantFk`, `clientFk`,`receiptFk`, `amount`, `response`, `errorCode`, `status`, `created`) + VALUES + (1, 1, 1101, NULL, 2000, NULL, 'SIS0042', 'ok', util.VN_CURDATE()), + (2, 1, 1101, NULL, 1000, NULL, 'SIS0051', 'started', util.VN_CURDATE()), + (3, 2, 1101, NULL, 7268, NULL, NULL, 'ok', util.VN_CURDATE()), + (4, 2, 1101, NULL, 4698, NULL, NULL, 'started', util.VN_CURDATE()), + (5, 1, 1104, NULL, 2000, NULL, 'SIS0043', 'ok', util.VN_CURDATE()), + (6, 2, 1104, NULL, 4000, NULL, 'SIS0044', 'started', util.VN_CURDATE()); -INSERT INTO - `hedera`.`tpvTransaction` ( - `id`, `merchantFk`, `clientFk`, `receiptFk`, `amount`, `response`, `errorCode`, `status`, `created` - ) -VALUES ( - 1, 1, 1101, NULL, 2000, NULL, 'SIS0042', 'ok', util.VN_CURDATE () - ), - ( - 2, 1, 1101, NULL, 1000, NULL, 'SIS0051', 'started', util.VN_CURDATE () - ), - ( - 3, 2, 1101, NULL, 7268, NULL, NULL, 'ok', util.VN_CURDATE () - ), - ( - 4, 2, 1101, NULL, 4698, NULL, NULL, 'started', util.VN_CURDATE () - ), - ( - 5, 1, 1104, NULL, 2000, NULL, 'SIS0043', 'ok', util.VN_CURDATE () - ), - ( - 6, 2, 1104, NULL, 4000, NULL, 'SIS0044', 'started', util.VN_CURDATE () - ); +INSERT INTO `vn`.`orderTicket`(`orderFk`, `ticketFk`) + VALUES + (1, 1), + (2, 2), + (3, 3), + (4, 4), + (5, 5), + (6, 6), + (7, 7), + (8, 8), + (9, 9), + (10, 10), + (11, 11), + (12, 12), + (13, 13), + (14, 14), + (15, 15), + (16, 16), + (17, 17), + (18, 18), + (19, 19), + (20, 20), + (21, 21), + (22, 22); -INSERT INTO - `vn`.`orderTicket` (`orderFk`, `ticketFk`) -VALUES (1, 1), - (2, 2), - (3, 3), - (4, 4), - (5, 5), - (6, 6), - (7, 7), - (8, 8), - (9, 9), - (10, 10), - (11, 11), - (12, 12), - (13, 13), - (14, 14), - (15, 15), - (16, 16), - (17, 17), - (18, 18), - (19, 19), - (20, 20), - (21, 21), - (22, 22); +INSERT INTO `vn`.`userConfig` (`userFk`, `warehouseFk`, `companyFk`) + VALUES + (1, 1, 69), + (5, 1, 442), + (9, 1, 442), + (18, 3, 567); -INSERT INTO - `vn`.`userConfig` ( - `userFk`, `warehouseFk`, `companyFk` - ) -VALUES (1, 1, 69), - (5, 1, 442), - (9, 1, 442), - (18, 3, 567); +INSERT INTO `vn`.`receipt`(`id`, `invoiceFk`, `amountPaid`, `payed`, `workerFk`, `bankFk`, `clientFk`, `created`, `companyFk`, `isConciliate`) + VALUES + (1, 'Cobro web', 100.50, util.VN_CURDATE(), 9, 1, 1101, util.VN_CURDATE(), 442, 1), + (2, 'Cobro web', 200.50, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), 9, 1, 1101, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), 442, 1), + (3, 'Cobro en efectivo', 300.00, DATE_ADD(util.VN_CURDATE(), INTERVAL -10 DAY), 9, 1, 1102, DATE_ADD(util.VN_CURDATE(), INTERVAL -10 DAY), 442, 0), + (4, 'Cobro en efectivo', 400.00, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY), 9, 1, 1103, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY), 442, 0), + (5, 'Compensación', 400.00, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY), 9, 3, 1103, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY), 442, 0); -INSERT INTO - `vn`.`receipt` ( - `id`, `invoiceFk`, `amountPaid`, `payed`, `workerFk`, `bankFk`, `clientFk`, `created`, `companyFk`, `isConciliate` - ) -VALUES ( - 1, 'Cobro web', 100.50, util.VN_CURDATE (), 9, 1, 1101, util.VN_CURDATE (), 442, 1 - ), - ( - 2, 'Cobro web', 200.50, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ), 9, 1, 1101, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ), 442, 1 - ), - ( - 3, 'Cobro en efectivo', 300.00, DATE_ADD( - util.VN_CURDATE (), INTERVAL -10 DAY - ), 9, 1, 1102, DATE_ADD( - util.VN_CURDATE (), INTERVAL -10 DAY - ), 442, 0 - ), - ( - 4, 'Cobro en efectivo', 400.00, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ), 9, 1, 1103, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ), 442, 0 - ), - ( - 5, 'Compensación', 400.00, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ), 9, 3, 1103, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ), 442, 0 - ); +INSERT INTO `vn`.`workerTeam`(`id`, `team`, `workerFk`) + VALUES + (1, 1, 9), + (2, 2, 18), + (3, 2, 19), + (4, 3, 1101), + (5, 3, 1102), + (6, 4, 1103), + (7, 4, 1104); -INSERT INTO - `vn`.`workerTeam` (`id`, `team`, `workerFk`) -VALUES (1, 1, 9), - (2, 2, 18), - (3, 2, 19), - (4, 3, 1101), - (5, 3, 1102), - (6, 4, 1103), - (7, 4, 1104); +INSERT INTO `vn`.`ticketRequest`(`id`, `description`, `requesterFk`, `attenderFk`, `quantity`, `itemFk`, `price`, `isOk`, `saleFk`, `ticketFk`, `created`) + VALUES + (1, 'Ranged weapon longbow 200cm', 18, 35, 5, 1, 9.10, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY)), + (2, 'Melee weapon combat first 15cm', 18, 35, 10, 2, 1.07, 0, NULL, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -15 DAY)), + (3, 'Melee weapon heavy shield 100cm', 18, 35, 20, NULL, 3.06, NULL, NULL, 23, util.VN_CURDATE()), + (4, 'Melee weapon combat first 15cm', 18, 35, 15, NULL, 1.30, NULL, NULL, 11, util.VN_CURDATE()), + (5, 'Melee weapon combat first 15cm', 18, 35, 15, 4, 1.30, 0, NULL, 18, util.VN_CURDATE()); -INSERT INTO - `vn`.`ticketRequest` ( - `id`, `description`, `requesterFk`, `attenderFk`, `quantity`, `itemFk`, `price`, `isOk`, `saleFk`, `ticketFk`, `created` - ) -VALUES ( - 1, 'Ranged weapon longbow 200cm', 18, 35, 5, 1, 9.10, 1, 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ) - ), - ( - 2, 'Melee weapon combat first 15cm', 18, 35, 10, 2, 1.07, 0, NULL, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL -15 DAY - ) - ), - ( - 3, 'Melee weapon heavy shield 100cm', 18, 35, 20, NULL, 3.06, NULL, NULL, 23, util.VN_CURDATE () - ), - ( - 4, 'Melee weapon combat first 15cm', 18, 35, 15, NULL, 1.30, NULL, NULL, 11, util.VN_CURDATE () - ), - ( - 5, 'Melee weapon combat first 15cm', 18, 35, 15, 4, 1.30, 0, NULL, 18, util.VN_CURDATE () - ); +INSERT INTO `vn`.`ticketServiceType`(`id`, `name`, `expenseFk`) + VALUES + (1, 'Porte Agencia', 7001000000), + (2, 'Portes Retorno', 7001000000), + (3, 'Porte Carry', 7001000000), + (4, 'Cargo FITOSANITARIO', 4751000000), + (5, 'Documentos', 2000000000); -INSERT INTO - `vn`.`ticketServiceType` (`id`, `name`, `expenseFk`) -VALUES ( - 1, 'Porte Agencia', 7001000000 - ), - ( - 2, 'Portes Retorno', 7001000000 - ), - (3, 'Porte Carry', 7001000000), - ( - 4, 'Cargo FITOSANITARIO', 4751000000 - ), - (5, 'Documentos', 2000000000); +INSERT INTO `vn`.`ticketService`(`id`, `description`, `quantity`, `price`, `taxClassFk`, `ticketFk`, `ticketServiceTypeFk`) + VALUES + (1, 'Documentos', 1, 2.00, 1, 1, 1), + (2, 'Porte Agencia', 1, 10.00, 1, 2, 1), + (3, 'Documentos', 1, 5.50, 1, 11, 1), + (4, 'Documentos', 1, 2.00, 1, 9, 1), + (5, 'Documentos', 1, 2.00, 1, 8, 1); -INSERT INTO - `vn`.`ticketService` ( - `id`, `description`, `quantity`, `price`, `taxClassFk`, `ticketFk`, `ticketServiceTypeFk` - ) -VALUES ( - 1, 'Documentos', 1, 2.00, 1, 1, 1 - ), - ( - 2, 'Porte Agencia', 1, 10.00, 1, 2, 1 - ), - ( - 3, 'Documentos', 1, 5.50, 1, 11, 1 - ), - ( - 4, 'Documentos', 1, 2.00, 1, 9, 1 - ), - ( - 5, 'Documentos', 1, 2.00, 1, 8, 1 - ); +INSERT INTO `pbx`.`sip`(`user_id`, `extension`) + VALUES + (1, 1010), + (3, 1101), + (5, 1102), + (9, 1201); -INSERT INTO - `pbx`.`sip` (`user_id`, `extension`) -VALUES (1, 1010), - (3, 1101), - (5, 1102), - (9, 1201); +INSERT INTO `vn`.`professionalCategory` (`id`, `name`, `level`, `dayBreak`) + VALUES + (1, 'employee', NULL, NULL), + (2, 'florist', NULL, NULL); -INSERT INTO - `vn`.`professionalCategory` ( - `id`, `name`, `level`, `dayBreak` - ) -VALUES (1, 'employee', NULL, NULL), - (2, 'florist', NULL, NULL); +INSERT INTO `vn`.`calendarType` (`id`, `description`, `hoursWeek`, `isPartial`) + VALUES + (1, 'General schedule', 40, 0); -INSERT INTO - `vn`.`calendarType` ( - `id`, `description`, `hoursWeek`, `isPartial` - ) -VALUES (1, 'General schedule', 40, 0); - -INSERT INTO - `vn`.`workerBusinessAgreement` ( - `id`, `name`, `monthHolidays`, `yearHours`, `started`, `ended` - ) -VALUES ( - 1, 'flowers', 2.5, 1830, '2001-01-01', NULL - ); +INSERT INTO `vn`.`workerBusinessAgreement` (`id`, `name`, `monthHolidays`, `yearHours`, `started`, `ended`) + VALUES(1, 'flowers', 2.5, 1830, '2001-01-01', NULL); DROP TEMPORARY TABLE IF EXISTS tmp.worker; +CREATE TEMPORARY TABLE tmp.worker + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT w.id, w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-25') as started, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-12-25') as ended, CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + FROM `vn`.`worker` `w`; -CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY -SELECT - w.id, - w.id as `workerFk`, - 'VNL', - CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-12-25' - ) as started, - CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 YEAR - ) - ), '-12-25' - ) as ended, - CONCAT( - 'E-46-', RPAD(CONCAT(w.id, 9), 8, w.id) - ), - NULL as `notes`, - NULL as `departmentFk`, - 23, - 1 as `workerBusinessProfessionalCategoryFk`, - 1 as `calendarTypeFk`, - 1 as `isHourlyLabor`, - 1 as `workerBusinessAgreementFk`, - 1 as `workcenterFk` -FROM `vn`.`worker` `w`; - -INSERT INTO - `vn`.`business` ( - `id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk` - ) -SELECT * -FROM tmp.worker; +INSERT INTO `vn`.`business`(`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`) + SELECT * FROM tmp.worker; DROP TEMPORARY TABLE IF EXISTS tmp.worker; +CREATE TEMPORARY TABLE tmp.worker + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT '1111' as 'id', w.id as `workerFk`, 'VNL', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-12-25') as started, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-12-24') as ended, CONCAT('E-46-', RPAD(CONCAT(w.id, 9), 8, w.id)), NULL as `notes`, NULL as `departmentFk`, 23, 1 as `workerBusinessProfessionalCategoryFk`, 1 as `calendarTypeFk`, 1 as `isHourlyLabor`, 1 as `workerBusinessAgreementFk`, 1 as `workcenterFk` + FROM `vn`.`worker` `w` + WHERE `w`.`id` = 1109; -CREATE TEMPORARY TABLE tmp.worker (PRIMARY KEY (id)) ENGINE = MEMORY -SELECT - '1111' as 'id', - w.id as `workerFk`, - 'VNL', - CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 YEAR - ) - ), '-12-25' - ) as started, - CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-12-24' - ) as ended, - CONCAT( - 'E-46-', RPAD(CONCAT(w.id, 9), 8, w.id) - ), - NULL as `notes`, - NULL as `departmentFk`, - 23, - 1 as `workerBusinessProfessionalCategoryFk`, - 1 as `calendarTypeFk`, - 1 as `isHourlyLabor`, - 1 as `workerBusinessAgreementFk`, - 1 as `workcenterFk` -FROM `vn`.`worker` `w` -WHERE - `w`.`id` = 1109; - -INSERT INTO - `vn`.`business` ( - `id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk` - ) -SELECT * -FROM tmp.worker; +INSERT INTO `vn`.`business` (`id`, `workerFk`, `companyCodeFk`, `started`, `ended`, `workerBusiness`, `reasonEndFk`, `notes`, `departmentFk`, `workerBusinessProfessionalCategoryFk`, `calendarTypeFk`, `isHourlyLabor`, `workerBusinessAgreementFk`, `workcenterFk`) + SELECT * FROM tmp.worker; DROP TEMPORARY TABLE IF EXISTS tmp.worker; UPDATE `vn`.`business` -SET - `payedHolidays` = 8 -WHERE - `id` = 1106; + SET `payedHolidays`= 8 + WHERE `id`= 1106; UPDATE `vn`.`business` b -SET - b.`workerBusinessProfessionalCategoryFk` = 2 -WHERE - b.`workerFk` = 1110; + SET b.`workerBusinessProfessionalCategoryFk` = 2 + WHERE b.`workerFk` = 1110; UPDATE `vn`.`business` b -SET - b.`departmentFk` = 43 -WHERE - b.id IN (18, 19); + SET b.`departmentFk` = 43 + WHERE b.id IN(18, 19); UPDATE `vn`.`business` b -SET - b.`started` = b.`started` - INTERVAL 100 DAY -WHERE - b.id = 1107; + SET b.`started` = b.`started` - INTERVAL 100 DAY + WHERE b.id = 1107; -INSERT INTO - `vn`.`workCenterHoliday` ( - `workCenterFk`, `days`, `year` - ) -VALUES ( - '1', '27.5', YEAR(util.VN_CURDATE ()) - ), - ( - '5', '22', YEAR(util.VN_CURDATE ()) - ), - ( - '1', '24.5', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ) - ), - ( - '5', '23', YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ) - ); +INSERT INTO `vn`.`workCenterHoliday` (`workCenterFk`, `days`, `year`) + VALUES + ('1', '27.5', YEAR(util.VN_CURDATE())), + ('5', '22', YEAR(util.VN_CURDATE())), + ('1', '24.5', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR))), + ('5', '23', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR))); -INSERT INTO - `vn`.`workerBusinessType` ( - `id`, `name`, `isFullTime`, `isPermanent`, `hasHolidayEntitlement` - ) -VALUES ( - 1, 'CONTRATO HOLANDA', 1, 0, 1 - ), - ( - 100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1 - ), - ( - 109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1 - ); +INSERT INTO `vn`.`workerBusinessType` (`id`, `name`, `isFullTime`, `isPermanent`, `hasHolidayEntitlement`) + VALUES + (1, 'CONTRATO HOLANDA', 1, 0, 1), + (100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1), + (109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1); UPDATE `vn`.`business` b -SET - `rate` = 7, - `workerBusinessTypeFk` = 100, - `amount` = 900.50 -WHERE - b.id = 1; + SET `rate` = 7, + `workerBusinessTypeFk` = 100, + `amount` = 900.50 + WHERE b.id = 1; UPDATE `vn`.`business` b -SET - `rate` = 7, - `workerBusinessTypeFk` = 100, - `amount` = 1263.03 -WHERE - b.id = 1106; + SET `rate` = 7, + `workerBusinessTypeFk` = 100, + `amount` = 1263.03 + WHERE b.id = 1106; UPDATE `vn`.`business` b -SET - `rate` = 7, - `workerBusinessTypeFk` = 100, - `amount` = 2000 -WHERE - b.id = 1107; + SET `rate` = 7, + `workerBusinessTypeFk` = 100, + `amount` = 2000 + WHERE b.id = 1107; UPDATE `vn`.`business` b -SET - `rate` = 7, - `workerBusinessTypeFk` = 100, - `amount` = 1500 -WHERE - b.id = 1108; + SET `rate` = 7, + `workerBusinessTypeFk` = 100, + `amount` = 1500 + WHERE b.id = 1108; -INSERT INTO - `vn`.`absenceType` ( - `id`, `name`, `rgb`, `code`, `holidayEntitlementRate`, `discountRate` - ) -VALUES ( - 1, 'Holidays', '#FF4444', 'holiday', 0, 0 - ), - ( - 2, 'Leave of absence', '#C71585', 'absence', 0, 1 - ), - ( - 6, 'Half holiday', '#E65F00', 'halfHoliday', 0, 0.5 - ), - ( - 15, 'Half Paid Leave', '#5151c0', 'halfPaidLeave', 0, 1 - ), - ( - 20, 'Furlough', '#97B92F', 'furlough', 1, 1 - ), - ( - 21, 'Furlough half day', '#778899', 'halfFurlough', 0.5, 1 - ); +INSERT INTO `vn`.`absenceType` (`id`, `name`, `rgb`, `code`, `holidayEntitlementRate`, `discountRate`) + VALUES + (1, 'Holidays', '#FF4444', 'holiday', 0, 0), + (2, 'Leave of absence', '#C71585', 'absence', 0, 1), + (6, 'Half holiday', '#E65F00', 'halfHoliday', 0, 0.5), + (15, 'Half Paid Leave', '#5151c0', 'halfPaidLeave', 0, 1), + (20, 'Furlough', '#97B92F', 'furlough', 1, 1), + (21, 'Furlough half day', '#778899', 'halfFurlough', 0.5, 1); -INSERT INTO - `vn`.`calendar` ( - `businessFk`, `dayOffTypeFk`, `dated` - ) -VALUES ( - 1, 6, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 10 DAY, util.VN_CURDATE () + INTERVAL 10 DAY - ) - ), - ( - 1106, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 10 DAY, util.VN_CURDATE () + INTERVAL 10 DAY - ) - ), - ( - 1106, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 11 DAY, util.VN_CURDATE () + INTERVAL 11 DAY - ) - ), - ( - 1106, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 12 DAY, util.VN_CURDATE () + INTERVAL 12 DAY - ) - ), - ( - 1106, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 20 DAY, util.VN_CURDATE () + INTERVAL 20 DAY - ) - ), - ( - 1106, 2, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 13 DAY, util.VN_CURDATE () + INTERVAL 8 DAY - ) - ), - ( - 1106, 1, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 14 DAY, util.VN_CURDATE () + INTERVAL 9 DAY - ) - ), - ( - 1106, 2, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 15 DAY, util.VN_CURDATE () + INTERVAL 7 DAY - ) - ), - ( - 1107, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 10 DAY, util.VN_CURDATE () + INTERVAL 10 DAY - ) - ), - ( - 1107, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 11 DAY, util.VN_CURDATE () + INTERVAL 11 DAY - ) - ), - ( - 1107, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 12 DAY, util.VN_CURDATE () + INTERVAL 12 DAY - ) - ), - ( - 1107, 1, IF( - MONTH(util.VN_CURDATE ()) = 12 - AND DAY(util.VN_CURDATE ()) > 10, util.VN_CURDATE () - INTERVAL 20 DAY, util.VN_CURDATE () + INTERVAL 20 DAY - ) - ), - ( - 1107, 2, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 13 DAY, util.VN_CURDATE () + INTERVAL 8 DAY - ) - ), - ( - 1107, 1, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 14 DAY, util.VN_CURDATE () + INTERVAL 9 DAY - ) - ), - ( - 1107, 2, IF( - MONTH(util.VN_CURDATE ()) >= 1 - AND DAY(util.VN_CURDATE ()) > 20, util.VN_CURDATE () - INTERVAL 15 DAY, util.VN_CURDATE () + INTERVAL 7 DAY - ) - ), - ( - 1107, 2, util.VN_CURDATE () - INTERVAL 16 DAY - ); +INSERT INTO `vn`.`calendar` (`businessFk`, `dayOffTypeFk`, `dated`) + VALUES + (1, 6, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 10 DAY, util.VN_CURDATE() + INTERVAL 10 DAY)), + (1106, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 10 DAY, util.VN_CURDATE() + INTERVAL 10 DAY)), + (1106, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 11 DAY, util.VN_CURDATE() + INTERVAL 11 DAY)), + (1106, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 12 DAY, util.VN_CURDATE() + INTERVAL 12 DAY)), + (1106, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 20 DAY, util.VN_CURDATE() + INTERVAL 20 DAY)), + (1106, 2, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 13 DAY, util.VN_CURDATE() + INTERVAL 8 DAY)), + (1106, 1, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 14 DAY, util.VN_CURDATE() + INTERVAL 9 DAY)), + (1106, 2, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 15 DAY, util.VN_CURDATE() + INTERVAL 7 DAY)), + (1107, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 10 DAY, util.VN_CURDATE() + INTERVAL 10 DAY)), + (1107, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 11 DAY, util.VN_CURDATE() + INTERVAL 11 DAY)), + (1107, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 12 DAY, util.VN_CURDATE() + INTERVAL 12 DAY)), + (1107, 1, IF(MONTH(util.VN_CURDATE()) = 12 AND DAY(util.VN_CURDATE()) > 10, util.VN_CURDATE() - INTERVAL 20 DAY, util.VN_CURDATE() + INTERVAL 20 DAY)), + (1107, 2, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 13 DAY, util.VN_CURDATE() + INTERVAL 8 DAY)), + (1107, 1, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 14 DAY, util.VN_CURDATE() + INTERVAL 9 DAY)), + (1107, 2, IF(MONTH(util.VN_CURDATE()) >= 1 AND DAY(util.VN_CURDATE()) > 20, util.VN_CURDATE() - INTERVAL 15 DAY, util.VN_CURDATE() + INTERVAL 7 DAY)), + (1107, 2, util.VN_CURDATE() - INTERVAL 16 DAY); -INSERT INTO - `vn`.`smsConfig` ( - `id`, `uri`, `title`, `apiKey` - ) -VALUES ( - '1', 'https://api.gateway360.com/api/3.0/sms/send', 'Verdnatura', '5715476da95b46d686a5a255e6459523' - ); +INSERT INTO `vn`.`smsConfig` (`id`, `uri`, `title`, `apiKey`) + VALUES + ('1', 'https://api.gateway360.com/api/3.0/sms/send', 'Verdnatura', '5715476da95b46d686a5a255e6459523'); -INSERT INTO - `vn`.`sharingClient` ( - `id`, `workerFk`, `started`, `ended`, `clientFk` - ) -VALUES ( - 1, 19, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ), 1101 - ), - ( - 2, 18, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ), 1106 - ); +INSERT INTO `vn`.`sharingClient`(`id`, `workerFk`, `started`, `ended`, `clientFk`) + VALUES + (1, 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1101), + (2, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 1106); -INSERT INTO - `vn`.`sharingCart` ( - `id`, `workerFk`, `started`, `ended`, `workerSubstitute`, `created` - ) -VALUES ( - 1, 18, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ), 19, DATE_ADD( - util.VN_CURDATE (), INTERVAL -5 DAY - ) - ); +INSERT INTO `vn`.`sharingCart`(`id`, `workerFk`, `started`, `ended`, `workerSubstitute`, `created`) + VALUES + (1, 18, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY), 19, DATE_ADD(util.VN_CURDATE(), INTERVAL -5 DAY)); -CALL `vn`.zoneGeo_calcTree (); --- this is an auto calculate for table vn.zoneGeo, columns: path,lft,rgt,depth,sons -INSERT INTO - `vn`.`zoneIncluded` ( - `zoneFk`, `geoFk`, `isIncluded` - ) -VALUES (1, 3, 0), - (1, 4, 0), - (1, 5, 0), - (1, 1, 1), - (2, 3, 0), - (2, 4, 0), - (2, 5, 0), - (2, 1, 1), - (3, 3, 0), - (3, 4, 0), - (3, 5, 0), - (3, 1, 1), - (4, 3, 0), - (4, 4, 0), - (4, 5, 0), - (4, 1, 1), - (5, 3, 1), - (5, 4, 0), - (5, 5, 1), - (5, 1, 1), - (6, 3, 1), - (6, 4, 0), - (6, 5, 1), - (6, 1, 1), - (7, 3, 0), - (7, 4, 0), - (7, 5, 0), - (7, 1, 1), - (8, 3, 0), - (8, 4, 0), - (8, 5, 0), - (8, 1, 1), - (9, 7, 1), - (10, 14, 1); +CALL `vn`.zoneGeo_calcTree(); -- this is an auto calculate for table vn.zoneGeo, columns: path,lft,rgt,depth,sons -INSERT INTO - `vn`.`zoneEvent` (`zoneFk`, `type`, `dated`) -VALUES ( - 1, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 2, 2, 9 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 1, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 3, 3, 10 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 1, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 4, 4, 11 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 1, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 5, 5, 12 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 1, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 6, 6, 13 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 2, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 2, 2, 9 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 2, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 3, 3, 10 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 2, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 4, 4, 11 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 2, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 5, 5, 12 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - ( - 2, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 6, 6, 13 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ) - ), - (3, 'day', util.VN_CURDATE ()), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 3 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 4 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 5 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 6 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 7 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 8 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 9 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 10 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 11 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 12 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 13 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 14 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 16 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 17 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 18 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 19 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 20 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 21 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 22 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 23 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 24 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 25 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 26 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 27 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 28 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 29 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 30 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 31 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 32 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 33 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 34 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 35 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 36 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 37 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 38 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 39 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 40 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 41 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 42 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 43 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 44 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 45 DAY - ) - ), - ( - 3, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 46 DAY - ) - ), - (4, 'day', util.VN_CURDATE ()), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 3 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 4 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 5 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 6 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 7 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 8 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 9 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 10 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 11 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 12 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 13 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 14 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 16 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 17 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 18 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 19 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 20 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 21 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 22 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 23 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 24 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 25 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 26 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 27 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 28 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 29 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 30 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 31 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 32 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 33 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 34 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 35 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 36 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 37 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 38 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 39 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 40 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 41 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 42 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 43 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 44 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 45 DAY - ) - ), - ( - 4, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 46 DAY - ) - ), - (5, 'day', util.VN_CURDATE ()), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 3 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 4 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 5 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 6 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 7 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 8 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 9 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 10 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 11 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 12 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 13 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 14 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 16 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 17 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 18 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 19 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 20 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 21 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 22 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 23 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 24 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 25 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 26 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 27 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 28 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 29 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 30 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 31 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 32 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 33 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 34 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 35 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 36 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 37 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 38 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 39 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 40 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 41 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 42 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 43 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 44 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 45 DAY - ) - ), - ( - 5, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 46 DAY - ) - ), - (6, 'day', util.VN_CURDATE ()), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 3 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 4 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 5 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 6 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 7 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 8 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 9 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 10 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 11 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 12 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 13 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 14 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 15 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 16 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 17 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 18 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 19 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 20 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 21 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 22 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 23 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 24 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 25 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 26 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 27 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 28 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 29 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 30 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 31 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 32 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 33 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 34 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 35 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 36 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 37 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 38 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 39 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 40 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 41 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 42 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 43 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 44 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 45 DAY - ) - ), - ( - 6, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 46 DAY - ) - ), - (7, 'day', util.VN_CURDATE ()), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 2 DAY - ) - ), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 3 DAY - ) - ), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 4 DAY - ) - ), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 5 DAY - ) - ), - ( - 7, 'day', DATE_ADD( - util.VN_CURDATE (), INTERVAL + 6 DAY - ) - ); +INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`) + VALUES + (1, 3, 0), + (1, 4, 0), + (1, 5, 0), + (1, 1, 1), + (2, 3, 0), + (2, 4, 0), + (2, 5, 0), + (2, 1, 1), + (3, 3, 0), + (3, 4, 0), + (3, 5, 0), + (3, 1, 1), + (4, 3, 0), + (4, 4, 0), + (4, 5, 0), + (4, 1, 1), + (5, 3, 1), + (5, 4, 0), + (5, 5, 1), + (5, 1, 1), + (6, 3, 1), + (6, 4, 0), + (6, 5, 1), + (6, 1, 1), + (7, 3, 0), + (7, 4, 0), + (7, 5, 0), + (7, 1, 1), + (8, 3, 0), + (8, 4, 0), + (8, 5, 0), + (8, 1, 1), + (9, 7, 1), + (10, 14, 1); -INSERT INTO - `vn`.`zoneEvent` (`zoneFk`, `type`, `weekDays`) -VALUES ( - 8, 'indefinitely', 'mon,tue,wed,thu,fri,sat,sun' - ), - ( - 10, 'indefinitely', 'mon,tue,wed,thu,fri,sat,sun' - ); +INSERT INTO `vn`.`zoneEvent`(`zoneFk`, `type`, `dated`) + VALUES + (1, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=2, 2, 9) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (1, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=3, 3, 10) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (1, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=4, 4, 11) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (1, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=5, 5, 12) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (1, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=6, 6, 13) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (2, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=2, 2, 9) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (2, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=3, 3, 10) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (2, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=4, 4, 11) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (2, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=5, 5, 12) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (2, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=6, 6, 13) - DAYOFWEEK(util.VN_CURDATE())) DAY)), + (3, 'day', util.VN_CURDATE()), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +3 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +4 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +6 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +7 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +8 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +9 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +10 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +11 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +12 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +13 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +14 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +16 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +17 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +18 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +19 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +20 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +21 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +22 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +23 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +24 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +25 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +26 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +27 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +28 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +29 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +30 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +31 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +32 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +33 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +34 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +35 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +36 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +37 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +38 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +39 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +40 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +41 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +42 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +43 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +44 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +45 DAY)), + (3, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +46 DAY)), + (4, 'day', util.VN_CURDATE()), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +3 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +4 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +6 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +7 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +8 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +9 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +10 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +11 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +12 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +13 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +14 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +16 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +17 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +18 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +19 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +20 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +21 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +22 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +23 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +24 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +25 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +26 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +27 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +28 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +29 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +30 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +31 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +32 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +33 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +34 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +35 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +36 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +37 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +38 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +39 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +40 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +41 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +42 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +43 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +44 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +45 DAY)), + (4, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +46 DAY)), + (5, 'day', util.VN_CURDATE()), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +3 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +4 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +6 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +7 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +8 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +9 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +10 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +11 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +12 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +13 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +14 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +16 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +17 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +18 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +19 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +20 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +21 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +22 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +23 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +24 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +25 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +26 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +27 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +28 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +29 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +30 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +31 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +32 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +33 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +34 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +35 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +36 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +37 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +38 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +39 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +40 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +41 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +42 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +43 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +44 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +45 DAY)), + (5, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +46 DAY)), + (6, 'day', util.VN_CURDATE()), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +3 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +4 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +6 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +7 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +8 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +9 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +10 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +11 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +12 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +13 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +14 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +15 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +16 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +17 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +18 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +19 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +20 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +21 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +22 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +23 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +24 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +25 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +26 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +27 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +28 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +29 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +30 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +31 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +32 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +33 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +34 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +35 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +36 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +37 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +38 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +39 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +40 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +41 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +42 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +43 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +44 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +45 DAY)), + (6, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +46 DAY)), + (7, 'day', util.VN_CURDATE()), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY)), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +3 DAY)), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +4 DAY)), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY)), + (7, 'day', DATE_ADD(util.VN_CURDATE(), INTERVAL +6 DAY)); -INSERT INTO - `vn`.`zoneEvent` ( - `zoneFk`, `type`, `started`, `ended`, `weekDays` - ) -VALUES ( - 9, 'range', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 YEAR - ), 'mon' - ), - ( - 9, 'range', util.VN_CURDATE (), NULL, 'tue' - ), - ( - 9, 'range', NULL, util.VN_CURDATE (), 'wed' - ); +INSERT INTO `vn`.`zoneEvent`(`zoneFk`, `type`, `weekDays`) + VALUES + (8, 'indefinitely', 'mon,tue,wed,thu,fri,sat,sun'), + (10, 'indefinitely', 'mon,tue,wed,thu,fri,sat,sun'); -INSERT INTO - `vn`.`workerTimeControl` ( - `userFk`, `timed`, `manual`, `direction`, `isSendMail` - ) -VALUES ( - 1106, CONCAT(util.VN_CURDATE (), ' 07:00'), TRUE, 'in', 0 - ), - ( - 1106, CONCAT(util.VN_CURDATE (), ' 10:00'), TRUE, 'middle', 0 - ), - ( - 1106, CONCAT(util.VN_CURDATE (), ' 10:20'), TRUE, 'middle', 0 - ), - ( - 1106, CONCAT(util.VN_CURDATE (), ' 14:50'), TRUE, 'out', 0 - ), - ( - 1107, CONCAT(util.VN_CURDATE (), ' 07:00'), TRUE, 'in', 1 - ), - ( - 1107, CONCAT(util.VN_CURDATE (), ' 10:00'), TRUE, 'middle', 1 - ), - ( - 1107, CONCAT(util.VN_CURDATE (), ' 10:20'), TRUE, 'middle', 1 - ), - ( - 1107, CONCAT(util.VN_CURDATE (), ' 14:50'), TRUE, 'out', 1 - ); +INSERT INTO `vn`.`zoneEvent`(`zoneFk`, `type`, `started`, `ended`, `weekDays`) + VALUES + (9, 'range', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR), 'mon'), + (9, 'range', util.VN_CURDATE(), NULL, 'tue'), + (9, 'range', NULL, util.VN_CURDATE(), 'wed'); -INSERT INTO - `vn`.`dmsType` ( - `id`, `name`, `readRoleFk`, `writeRoleFk`, `code` - ) -VALUES ( - 1, 'Facturas Recibidas', NULL, NULL, 'invoiceIn' - ), - ( - 2, 'Doc oficial', NULL, NULL, 'officialDoc' - ), - ( - 3, 'Laboral', 37, 37, 'hhrrData' - ), - ( - 4, 'Albaranes recibidos', NULL, NULL, 'deliveryNote' - ), - ( - 5, 'Otros', 1, 1, 'miscellaneous' - ), - ( - 6, 'Pruebas', NULL, NULL, 'tests' - ), - ( - 7, 'IAE Clientes', 1, 1, 'economicActivitiesTax' - ), - ( - 8, 'Fiscal', NULL, NULL, 'fiscal' - ), - ( - 9, 'Vehiculos', NULL, NULL, 'vehicles' - ), - ( - 10, 'Plantillas', NULL, NULL, 'templates' - ), - ( - 11, 'Contratos', NULL, NULL, 'contracts' - ), - ( - 12, 'ley de pagos', 1, 1, 'paymentsLaw' - ), - (13, 'Basura', 1, 1, 'trash'), - (14, 'Ticket', 1, 1, 'ticket'), - ( - 15, 'Presupuestos', NULL, NULL, 'budgets' - ), - ( - 16, 'Logistica', NULL, NULL, 'logistics' - ), - (17, 'cmr', NULL, NULL, 'cmr'), - (18, 'dua', NULL, NULL, 'dua'), - ( - 19, 'inmovilizado', NULL, NULL, 'fixedAssets' - ), - ( - 20, 'Reclamación', 1, 1, 'claim' - ); +INSERT INTO `vn`.`workerTimeControl`(`userFk`, `timed`, `manual`, `direction`, `isSendMail`) + VALUES + (1106, CONCAT(util.VN_CURDATE(), ' 07:00'), TRUE, 'in', 0), + (1106, CONCAT(util.VN_CURDATE(), ' 10:00'), TRUE, 'middle', 0), + (1106, CONCAT(util.VN_CURDATE(), ' 10:20'), TRUE, 'middle', 0), + (1106, CONCAT(util.VN_CURDATE(), ' 14:50'), TRUE, 'out', 0), + (1107, CONCAT(util.VN_CURDATE(), ' 07:00'), TRUE, 'in', 1), + (1107, CONCAT(util.VN_CURDATE(), ' 10:00'), TRUE, 'middle', 1), + (1107, CONCAT(util.VN_CURDATE(), ' 10:20'), TRUE, 'middle', 1), + (1107, CONCAT(util.VN_CURDATE(), ' 14:50'), TRUE, 'out', 1); -INSERT INTO - `vn`.`dms` ( - `id`, `dmsTypeFk`, `file`, `contentType`, `workerFk`, `warehouseFk`, `companyFk`, `hardCopyNumber`, `hasFile`, `reference`, `description`, `created` - ) -VALUES ( - 1, 14, '1.txt', 'text/plain', 5, 1, 442, NULL, FALSE, 'Ticket:11', 'Ticket:11 dms for the ticket', util.VN_CURDATE () - ), - ( - 2, 5, '2.txt', 'text/plain', 5, 1, 442, 1, TRUE, 'Client:104', 'Client:104 dms for the client', util.VN_CURDATE () - ), - ( - 3, 5, '3.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'Client: 104', 'Client:104 readme', util.VN_CURDATE () - ), - ( - 4, 3, '4.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'Worker: 106', 'Worker:106 readme', util.VN_CURDATE () - ), - ( - 5, 5, '5.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'travel: 1', 'dmsForThermograph', util.VN_CURDATE () - ), - ( - 6, 5, '6.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'NotExists', 'DoesNotExists', util.VN_CURDATE () - ), - ( - 7, 20, '7.jpg', 'image/jpeg', 9, 1, 442, NULL, FALSE, '1', 'TICKET ID DEL CLIENTE BRUCE WAYNE ID 1101', util.VN_CURDATE () - ), - ( - 8, 20, '8.mp4', 'video/mp4', 9, 1, 442, NULL, FALSE, '1', 'TICKET ID DEL CLIENTE BRUCE WAYNE ID 1101', util.VN_CURDATE () - ); +INSERT INTO `vn`.`dmsType`(`id`, `name`, `readRoleFk`, `writeRoleFk`, `code`) + VALUES + (1, 'Facturas Recibidas', NULL, NULL, 'invoiceIn'), + (2, 'Doc oficial', NULL, NULL, 'officialDoc'), + (3, 'Laboral', 37, 37, 'hhrrData'), + (4, 'Albaranes recibidos', NULL, NULL, 'deliveryNote'), + (5, 'Otros', 1, 1, 'miscellaneous'), + (6, 'Pruebas', NULL, NULL, 'tests'), + (7, 'IAE Clientes', 1, 1, 'economicActivitiesTax'), + (8, 'Fiscal', NULL, NULL, 'fiscal'), + (9, 'Vehiculos', NULL, NULL, 'vehicles'), + (10, 'Plantillas', NULL, NULL, 'templates'), + (11, 'Contratos', NULL, NULL, 'contracts'), + (12, 'ley de pagos', 1, 1, 'paymentsLaw'), + (13, 'Basura', 1, 1, 'trash'), + (14, 'Ticket', 1, 1, 'ticket'), + (15, 'Presupuestos', NULL, NULL, 'budgets'), + (16, 'Logistica', NULL, NULL, 'logistics'), + (17, 'cmr', NULL, NULL, 'cmr'), + (18, 'dua', NULL, NULL, 'dua'), + (19, 'inmovilizado', NULL, NULL, 'fixedAssets'), + (20, 'Reclamación', 1, 1, 'claim'); -INSERT INTO - `vn`.`claimDms` (`claimFk`, `dmsFk`) -VALUES (1, 7), - (1, 8); +INSERT INTO `vn`.`dms`(`id`, `dmsTypeFk`, `file`, `contentType`, `workerFk`, `warehouseFk`, `companyFk`, `hardCopyNumber`, `hasFile`, `reference`, `description`, `created`) + VALUES + (1, 14, '1.txt', 'text/plain', 5, 1, 442, NULL, FALSE, 'Ticket:11', 'Ticket:11 dms for the ticket', util.VN_CURDATE()), + (2, 5, '2.txt', 'text/plain', 5, 1, 442, 1, TRUE, 'Client:104', 'Client:104 dms for the client', util.VN_CURDATE()), + (3, 5, '3.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'Client: 104', 'Client:104 readme', util.VN_CURDATE()), + (4, 3, '4.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'Worker: 106', 'Worker:106 readme', util.VN_CURDATE()), + (5, 5, '5.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'travel: 1', 'dmsForThermograph', util.VN_CURDATE()), + (6, 5, '6.txt', 'text/plain', 5, 1, 442, NULL, TRUE, 'NotExists', 'DoesNotExists', util.VN_CURDATE()), + (7, 20, '7.jpg', 'image/jpeg', 9, 1, 442, NULL, FALSE, '1', 'TICKET ID DEL CLIENTE BRUCE WAYNE ID 1101', util.VN_CURDATE()), + (8, 20, '8.mp4', 'video/mp4', 9, 1, 442, NULL, FALSE, '1', 'TICKET ID DEL CLIENTE BRUCE WAYNE ID 1101', util.VN_CURDATE()); -INSERT INTO - `vn`.`ticketDms` (`ticketFk`, `dmsFk`) -VALUES (11, 1); +INSERT INTO `vn`.`claimDms`(`claimFk`, `dmsFk`) + VALUES + (1, 7), + (1, 8); -INSERT INTO - `vn`.`clientDms` (`clientFk`, `dmsFk`) -VALUES (1104, 2), - (1104, 3); +INSERT INTO `vn`.`ticketDms`(`ticketFk`, `dmsFk`) + VALUES + (11, 1); -INSERT INTO - `vn`.`workerDocument` ( - `id`, `worker`, `document`, `isReadableByWorker` - ) -VALUES (1, 1106, 4, TRUE), - (2, 1107, 3, FALSE); +INSERT INTO `vn`.`clientDms`(`clientFk`, `dmsFk`) + VALUES + (1104, 2), + (1104, 3); -INSERT INTO - `vn`.`device` (`sn`, `model`, `userFk`) -VALUES ('aaa', 'android', '9'); +INSERT INTO `vn`.`workerDocument`(`id`, `worker`, `document`,`isReadableByWorker`) + VALUES + (1, 1106, 4, TRUE), + (2, 1107, 3, FALSE); -INSERT INTO - `vn`.`queuePriority` (`id`, `priority`, `code`) -VALUES (1, 'Alta', 'high'), - (2, 'Normal', 'normal'), - (3, 'Baja', 'low'); +INSERT INTO `vn`.`device` (`sn`, `model`, `userFk`) + VALUES + ('aaa', 'android', '9'); -INSERT INTO - `vn`.`workerTimeControlParams` ( - `id`, `dayBreak`, `weekBreak`, `weekScope`, `dayWorkMax`, `dayStayMax`, `weekMaxBreak`, `weekMaxScope`, `askInOut` - ) -VALUES ( - 1, 43200, 129600, 734400, 43200, 50400, 259200, 1296000, 36000 - ); +INSERT INTO `vn`.`queuePriority`(`id`, `priority`, `code`) + VALUES + (1, 'Alta', 'high'), + (2, 'Normal', 'normal'), + (3, 'Baja', 'low'); -INSERT IGNORE INTO - `vn`.`greugeConfig` (`id`, `freightPickUpPrice`) -VALUES ('1', '11'); +INSERT INTO `vn`.`workerTimeControlParams` (`id`, `dayBreak`, `weekBreak`, `weekScope`, `dayWorkMax`, `dayStayMax`, `weekMaxBreak`, `weekMaxScope`, `askInOut`) + VALUES + (1, 43200, 129600, 734400, 43200, 50400, 259200, 1296000, 36000); -INSERT INTO - `vn`.`thermograph` (`id`, `model`) -VALUES ('TMM190901395', 'TEMPMATE'), - ('TL.BBA85422', 'TL30'), - ('TZ1905012010', 'DISPOSABLE'), - ('138350-0', 'DISPOSABLE'); +INSERT IGNORE INTO `vn`.`greugeConfig` (`id`, `freightPickUpPrice`) VALUES ('1', '11'); -INSERT INTO - `vn`.`travelThermograph` ( - `thermographFk`, `created`, `warehouseFk`, `travelFk`, `temperatureFk`, `result`, `dmsFk` - ) -VALUES ( - 'TMM190901395', util.VN_CURDATE (), 1, 1, 'WARM', 'Ok', NULL - ), - ( - 'TL.BBA85422', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 2, 2, 'COOL', 'Ok', NULL - ), - ( - 'TL.BBA85422', util.VN_CURDATE (), 2, 1, 'COOL', 'can not read the temperature', NULL - ), - ( - 'TZ1905012010', util.VN_CURDATE (), 1, 1, 'WARM', 'Temperature in range', 5 - ), - ( - '138350-0', DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1, 1, 'WARM', NULL, 5 - ), - ( - '138350-0', util.VN_CURDATE (), 1, NULL, 'COOL', NULL, NULL - ); +INSERT INTO `vn`.`thermograph`(`id`, `model`) + VALUES + ('TMM190901395', 'TEMPMATE'), + ('TL.BBA85422', 'TL30'), + ('TZ1905012010', 'DISPOSABLE'), + ('138350-0', 'DISPOSABLE'); -REPLACE INTO - `vn`.`incoterms` (`code`, `name`) -VALUES ('FAS', 'Free Alongside Ship'); -REPLACE INTO - `vn`.`customsAgent` ( - `id`, `fiscalName`, `street`, `nif`, `phone`, `email` - ) -VALUES ( - 1, 'Agent one', '1007 Mountain Drive, Gotham', 'N1111111111', '111111111', 'agentone@gotham.com' - ), - ( - 2, 'Agent two', '1007 Mountain Drive, Gotham', 'N2222222222', '222222222', 'agenttwo@gotham.com' - ); +INSERT INTO `vn`.`travelThermograph`(`thermographFk`, `created`, `warehouseFk`, `travelFk`, `temperatureFk`, `result`, `dmsFk`) + VALUES + ('TMM190901395', util.VN_CURDATE(), 1, 1, 'WARM', 'Ok', NULL), + ('TL.BBA85422', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 2, 'COOL', 'Ok', NULL), + ('TL.BBA85422', util.VN_CURDATE(), 2, 1, 'COOL', 'can not read the temperature', NULL), + ('TZ1905012010', util.VN_CURDATE(), 1, 1, 'WARM', 'Temperature in range', 5), + ('138350-0', DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 'WARM', NULL, 5), + ('138350-0', util.VN_CURDATE(), 1, NULL, 'COOL', NULL, NULL); -INSERT INTO - `vn`.`tablet` ( - `uuid`, `name`, `place`, `macwifi` - ) -VALUES ( - '1', 'TEST', 'ON THE FIXTURES', '0' - ), - ( - '2', 'DEV', 'OTHER TABLET', '0' - ); +REPLACE INTO `vn`.`incoterms`(`code`, `name`) + VALUES + ('FAS', 'Free Alongside Ship'); -INSERT INTO - `vn`.`tabletDepartment` (`tabletFk`, `departmentFk`) -VALUES (1, 23), - (2, 1); +REPLACE INTO `vn`.`customsAgent`(`id`, `fiscalName`, `street`, `nif`, `phone`, `email`) + VALUES + (1, 'Agent one', '1007 Mountain Drive, Gotham', 'N1111111111', '111111111', 'agentone@gotham.com'), + (2, 'Agent two', '1007 Mountain Drive, Gotham', 'N2222222222', '222222222', 'agenttwo@gotham.com'); -INSERT INTO - `vn`.`campaign` (`code`, `dated`) -VALUES ( - 'valentinesDay', CONCAT( - YEAR(util.VN_CURDATE ()), '-02-14' - ) - ), - ( - 'valentinesDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-02-14' - ) - ), - ( - 'valentinesDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 YEAR - ) - ), '-02-14' - ) - ), - ( - 'valentinesDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 YEAR - ) - ), '-02-14' - ) - ), - ( - 'mothersDay', CONCAT( - YEAR(util.VN_CURDATE ()), '-05-05' - ) - ), - ( - 'mothersDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-05-05' - ) - ), - ( - 'mothersDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 YEAR - ) - ), '-05-05' - ) - ), - ( - 'mothersDay', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 YEAR - ) - ), '-05-05' - ) - ), - ( - 'allSaints', CONCAT( - YEAR(util.VN_CURDATE ()), '-11-01' - ) - ), - ( - 'allSaints', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-11-01' - ) - ), - ( - 'allSaints', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -2 YEAR - ) - ), '-11-01' - ) - ), - ( - 'allSaints', CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -3 YEAR - ) - ), '-11-01' - ) - ); +INSERT INTO `vn`.`tablet`(`uuid`, `name`, `place`, `macwifi`) + VALUES + ('1', 'TEST', 'ON THE FIXTURES', '0'), + ('2', 'DEV', 'OTHER TABLET', '0'); -INSERT INTO - `hedera`.`imageCollectionSize` ( - `id`, `collectionFk`, `width`, `height` - ) -VALUES (1, 4, 160, 160); +INSERT INTO `vn`.`tabletDepartment`(`tabletFk`, `departmentFk`) + VALUES + (1, 23), + (2, 1); -INSERT INTO - `vn`.`rateConfig` ( - `rate0`, `rate1`, `rate2`, `rate3` - ) -VALUES (36, 31, 25, 21); +INSERT INTO `vn`.`campaign`(`code`, `dated`) + VALUES + ('valentinesDay', CONCAT(YEAR(util.VN_CURDATE()), '-02-14')), + ('valentinesDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-02-14')), + ('valentinesDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-02-14')), + ('valentinesDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -3 YEAR)), '-02-14')), + ('mothersDay', CONCAT(YEAR(util.VN_CURDATE()), '-05-05')), + ('mothersDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-05-05')), + ('mothersDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-05-05')), + ('mothersDay', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -3 YEAR)), '-05-05')), + ('allSaints', CONCAT(YEAR(util.VN_CURDATE()), '-11-01')), + ('allSaints', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-11-01')), + ('allSaints', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -2 YEAR)), '-11-01')), + ('allSaints', CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -3 YEAR)), '-11-01')); -INSERT INTO - `vn`.`rate` ( - `dated`, `warehouseFk`, `rate0`, `rate1`, `rate2`, `rate3` - ) -VALUES ( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ), 1, 10, 15, 20, 25 - ), - ( - util.VN_CURDATE (), 1, 12, 17, 22, 27 - ); +INSERT INTO `hedera`.`imageCollectionSize`(`id`, `collectionFk`,`width`, `height`) + VALUES + (1, 4, 160, 160); -INSERT INTO - `vn`.`dua` ( - id, code, awbFk__, issued, operated, booked, bookEntried, gestdocFk, customsValue, companyFk - ) -VALUES ( - 1, '19ES0028013A481523', 1, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 1, 11276.95, 442 - ), - ( - 2, '21ES00280136115760', 2, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 1376.20, 442 - ), - ( - 3, '19ES00280131956004', 3, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 3, 14268.50, 442 - ), - ( - 4, '19ES00280131955995', 4, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 1, 8242.50, 442 - ), - ( - 5, '19ES00280132022070', 5, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 10012.49, 442 - ), - ( - 6, '19ES00280132032308', 6, util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 19914.25, 442 - ), - ( - 7, '19ES00280132025489', 7, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 1934.06, 442 - ), - ( - 8, '19ES00280132025490', 8, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 3618.52, 442 - ), - ( - 9, '19ES00280132025491', 9, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 7126.23, 442 - ), - ( - 10, '19ES00280132025492', 10, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), util.VN_CURDATE (), util.VN_CURDATE (), util.VN_CURDATE (), 2, 4631.45, 442 - ); +INSERT INTO `vn`.`rateConfig`(`rate0`, `rate1`, `rate2`, `rate3`) + VALUES + (36, 31, 25, 21); -INSERT INTO - `vn`.`duaEntry` ( - `duaFk`, `entryFk`, `value`, `customsValue`, `euroValue` - ) -VALUES (1, 1, 1.00, 1.00, 1.00), - (2, 2, 1.00, 1.00, 1.00), - (3, 3, 1.00, 1.00, 1.00), - (4, 4, 1.00, 1.00, 1.00), - (5, 5, 1.00, 1.00, 1.00), - (6, 6, 1.00, 1.00, 1.00), - (7, 7, 1.00, 1.00, 1.00), - (8, 8, 1.00, 1.00, 1.00); +INSERT INTO `vn`.`rate`(`dated`, `warehouseFk`, `rate0`, `rate1`, `rate2`, `rate3`) + VALUES + (DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR), 1, 10, 15, 20, 25), + (util.VN_CURDATE(), 1, 12, 17, 22, 27); -REPLACE INTO - `vn`.`invoiceIn` ( - `id`, `serialNumber`, `serial`, `supplierFk`, `issued`, `created`, `supplierRef`, `isBooked`, `companyFk`, `docFk` - ) -VALUES ( - 1, 1001, 'R', 1, util.VN_CURDATE (), util.VN_CURDATE (), 1234, 0, 442, 1 - ), - ( - 2, 1002, 'R', 1, util.VN_CURDATE (), util.VN_CURDATE (), 1235, 1, 442, 1 - ), - ( - 3, 1003, 'R', 1, util.VN_CURDATE (), util.VN_CURDATE (), 1236, 0, 442, 1 - ), - ( - 4, 1004, 'R', 1, util.VN_CURDATE (), util.VN_CURDATE (), 1237, 0, 442, 1 - ), - ( - 5, 1005, 'R', 1, util.VN_CURDATE (), util.VN_CURDATE (), 1238, 1, 442, 1 - ), - ( - 6, 1006, 'R', 2, util.VN_CURDATE (), util.VN_CURDATE (), 1239, 0, 442, 1 - ), - ( - 7, 1007, 'R', 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1240, 1, 442, 1 - ), - ( - 8, 1008, 'R', 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1241, 1, 442, 1 - ), - ( - 9, 1009, 'R', 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1242, 1, 442, 1 - ), - ( - 10, 1010, 'R', 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 MONTH - ), 1243, 1, 442, 1 - ); +INSERT INTO `vn`.`dua` (id, code, awbFk__, issued, operated, booked, bookEntried, gestdocFk, customsValue, companyFk) + VALUES + (1, '19ES0028013A481523', 1, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 1, 11276.95, 442), + (2, '21ES00280136115760', 2, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 1376.20, 442), + (3, '19ES00280131956004', 3, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 3, 14268.50, 442), + (4, '19ES00280131955995', 4, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 1, 8242.50, 442), + (5, '19ES00280132022070', 5, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 10012.49, 442), + (6, '19ES00280132032308', 6, util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 19914.25, 442), + (7, '19ES00280132025489', 7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 1934.06, 442), + (8, '19ES00280132025490', 8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 3618.52, 442), + (9, '19ES00280132025491', 9, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 7126.23, 442), + (10, '19ES00280132025492', 10, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), util.VN_CURDATE(), util.VN_CURDATE(), util.VN_CURDATE(), 2, 4631.45, 442); -INSERT INTO - `vn`.`invoiceInConfig` ( - `id`, `retentionRate`, `retentionName`, `sageWithholdingFk`, `daysAgo` - ) -VALUES (1, -2, '2% retention', 2, 45); +INSERT INTO `vn`.`duaEntry` (`duaFk`, `entryFk`, `value`, `customsValue`, `euroValue`) + VALUES + (1, 1, 1.00, 1.00, 1.00), + (2, 2, 1.00, 1.00, 1.00), + (3, 3, 1.00, 1.00, 1.00), + (4, 4, 1.00, 1.00, 1.00), + (5, 5, 1.00, 1.00, 1.00), + (6, 6, 1.00, 1.00, 1.00), + (7, 7, 1.00, 1.00, 1.00), + (8, 8, 1.00, 1.00, 1.00); -INSERT INTO - `vn`.`invoiceInDueDay` ( - `invoiceInFk`, `dueDated`, `bankFk`, `amount` - ) -VALUES ( - 1, util.VN_CURDATE (), 1, 336.99 - ), - ( - 1, util.VN_CURDATE (), 1, 15.25 - ), - (2, util.VN_CURDATE (), 1, 168), - ( - 2, util.VN_CURDATE (), 1, 55.17 - ), - ( - 3, util.VN_CURDATE (), 1, 87.95 - ), - ( - 3, util.VN_CURDATE (), 1, 7.65 - ), - ( - 4, util.VN_CURDATE (), 1, 373.27 - ), - ( - 4, util.VN_CURDATE (), 1, 73.36 - ), - ( - 5, util.VN_CURDATE (), 1, 64.23 - ), - ( - 6, util.VN_CURDATE (), 1, 32.95 - ), - ( - 7, util.VN_CURDATE (), 1, 58.64 - ); +REPLACE INTO `vn`.`invoiceIn`(`id`, `serialNumber`,`serial`, `supplierFk`, `issued`, `created`, `supplierRef`, `isBooked`, `companyFk`, `docFk`) + VALUES + (1, 1001, 'R', 1, util.VN_CURDATE(), util.VN_CURDATE(), 1234, 0, 442, 1), + (2, 1002, 'R', 1, util.VN_CURDATE(), util.VN_CURDATE(), 1235, 1, 442, 1), + (3, 1003, 'R', 1, util.VN_CURDATE(), util.VN_CURDATE(), 1236, 0, 442, 1), + (4, 1004, 'R', 1, util.VN_CURDATE(), util.VN_CURDATE(), 1237, 0, 442, 1), + (5, 1005, 'R', 1, util.VN_CURDATE(), util.VN_CURDATE(), 1238, 1, 442, 1), + (6, 1006, 'R', 2, util.VN_CURDATE(), util.VN_CURDATE(), 1239, 0, 442, 1), + (7, 1007, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1240, 1, 442, 1), + (8, 1008, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1241, 1, 442, 1), + (9, 1009, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1242, 1, 442, 1), + (10, 1010, 'R', 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1243, 1, 442, 1); -INSERT INTO - `vn`.`duaInvoiceIn` (`id`, `duaFk`, `invoiceInFk`) -VALUES (1, 1, 1), - (2, 2, 2), - (3, 3, 3), - (4, 4, 4), - (5, 5, 5), - (6, 6, 6), - (7, 7, 7), - (8, 8, 8), - (9, 9, 9), - (10, 10, 10); +INSERT INTO `vn`.`invoiceInConfig` (`id`, `retentionRate`, `retentionName`, `sageWithholdingFk`, `daysAgo`) + VALUES + (1, -2, '2% retention', 2, 45); -INSERT INTO - `vn`.`invoiceInTax` ( - `invoiceInFk`, `taxableBase`, `expenseFk`, `foreignValue`, `taxTypeSageFk`, `transactionTypeSageFk` - ) -VALUES ( - 1, 99.99, '2000000000', NULL, NULL, NULL - ), - ( - 2, 999.99, '2000000000', NULL, NULL, NULL - ), - ( - 3, 1000.50, '2000000000', NULL, NULL, NULL - ), - ( - 4, 0.50, '2000000000', NULL, NULL, NULL - ), - ( - 5, 150.50, '2000000000', NULL, NULL, NULL - ), - ( - 1, 252.25, '4751000000', NULL, 7, 61 - ), - ( - 2, 223.17, '6210000567', NULL, 8, 20 - ), - ( - 3, 95.60, '7001000000', NULL, 8, 35 - ), - ( - 4, 446.63, '7001000000', NULL, 6, 61 - ), - ( - 5, 64.23, '6210000567', NULL, 8, 20 - ), - ( - 6, 29.95, '7001000000', NULL, 7, 20 - ), - ( - 7, 58.64, '6210000567', NULL, 8, 20 - ); +INSERT INTO `vn`.`invoiceInDueDay`(`invoiceInFk`, `dueDated`, `bankFk`, `amount`) + VALUES + (1, util.VN_CURDATE(), 1, 336.99), + (1, util.VN_CURDATE(), 1, 15.25), + (2, util.VN_CURDATE(), 1, 168), + (2, util.VN_CURDATE(), 1, 55.17), + (3, util.VN_CURDATE(), 1, 87.95), + (3, util.VN_CURDATE(), 1, 7.65), + (4, util.VN_CURDATE(), 1, 373.27), + (4, util.VN_CURDATE(), 1, 73.36), + (5, util.VN_CURDATE(), 1, 64.23), + (6, util.VN_CURDATE(), 1, 32.95), + (7, util.VN_CURDATE(), 1, 58.64); -INSERT INTO - `vn`.`invoiceInIntrastat` ( - `invoiceInFk`, `net`, `intrastatFk`, `amount`, `stems`, `countryFk` - ) -VALUES ( - 1, 30.50, 5080000, 10.00, 162, 5 - ), - (1, 10, 6021010, 20.00, 205, 5), - ( - 2, 13.20, 5080000, 15.00, 580, 5 - ), - ( - 2, 16.10, 6021010, 25.00, 80, 5 - ); +INSERT INTO `vn`.`duaInvoiceIn`(`id`, `duaFk`, `invoiceInFk`) + VALUES + (1, 1, 1), + (2, 2, 2), + (3, 3, 3), + (4, 4, 4), + (5, 5, 5), + (6, 6, 6), + (7, 7, 7), + (8, 8, 8), + (9, 9, 9), + (10, 10, 10); -INSERT INTO - `vn`.`ticketRecalc` (`ticketFk`) -SELECT t.id -FROM vn.ticket t - LEFT JOIN vn.ticketRecalc tr ON tr.ticketFk = t.id -WHERE - tr.ticketFk IS NULL; +INSERT INTO `vn`.`invoiceInTax` (`invoiceInFk`, `taxableBase`, `expenseFk`, `foreignValue`, `taxTypeSageFk`, `transactionTypeSageFk`) + VALUES + (1, 99.99, '2000000000', NULL, NULL, NULL), + (2, 999.99, '2000000000', NULL, NULL, NULL), + (3, 1000.50, '2000000000', NULL, NULL, NULL), + (4, 0.50, '2000000000', NULL, NULL, NULL), + (5, 150.50, '2000000000', NULL, NULL, NULL), + (1, 252.25, '4751000000', NULL, 7, 61), + (2, 223.17, '6210000567', NULL, 8, 20), + (3, 95.60, '7001000000', NULL, 8, 35), + (4, 446.63, '7001000000', NULL, 6, 61), + (5, 64.23, '6210000567', NULL, 8, 20), + (6, 29.95, '7001000000', NULL, 7, 20), + (7, 58.64, '6210000567', NULL, 8, 20); -CALL `vn`.`ticket_doRecalc` (); +INSERT INTO `vn`.`invoiceInIntrastat` (`invoiceInFk`, `net`, `intrastatFk`, `amount`, `stems`, `countryFk`) + VALUES + (1, 30.50, 5080000, 10.00, 162, 5), + (1, 10, 6021010, 20.00, 205, 5), + (2, 13.20, 5080000, 15.00, 580, 5), + (2, 16.10, 6021010, 25.00, 80, 5); + +INSERT INTO `vn`.`ticketRecalc`(`ticketFk`) + SELECT t.id + FROM vn.ticket t + LEFT JOIN vn.ticketRecalc tr ON tr.ticketFk = t.id + WHERE tr.ticketFk IS NULL; + +CALL `vn`.`ticket_doRecalc`(); UPDATE `vn`.`ticket` -SET - refFk = 'T1111111' -WHERE - id IN (1, 2); + SET refFk = 'T1111111' + WHERE id IN (1,2); -UPDATE `vn`.`ticket` SET refFk = 'T2222222' WHERE id = 3; +UPDATE `vn`.`ticket` + SET refFk = 'T2222222' + WHERE id = 3; -UPDATE `vn`.`ticket` SET refFk = 'T3333333' WHERE id = 4; +UPDATE `vn`.`ticket` + SET refFk = 'T3333333' + WHERE id = 4; -UPDATE `vn`.`ticket` SET refFk = 'T4444444' WHERE id = 5; +UPDATE `vn`.`ticket` + SET refFk = 'T4444444' + WHERE id = 5; -UPDATE `vn`.`ticket` SET refFk = 'A1111111' WHERE id = 6; +UPDATE `vn`.`ticket` + SET refFk = 'A1111111' + WHERE id = 6; -INSERT INTO - `vn`.`zoneAgencyMode` ( - `id`, `agencyModeFk`, `zoneFk` - ) -VALUES (1, 1, 1), - (2, 1, 2), - (3, 6, 5), - (4, 7, 1); +INSERT INTO `vn`.`zoneAgencyMode`(`id`, `agencyModeFk`, `zoneFk`) + VALUES + (1, 1, 1), + (2, 1, 2), + (3, 6, 5), + (4, 7, 1); -INSERT INTO - `vn`.`roadmap` ( - `id`, `name`, `tractorPlate`, `trailerPlate`, `phone`, `supplierFk`, `etd`, `observations`, `userFk`, `price`, `driverName` - ) -VALUES ( - 1, 'val-algemesi', 'RE-001', 'PO-001', '111111111', 1, util.VN_NOW (), 'this is test observation', 1, 15, 'Batman' - ), - ( - 2, 'alg-valencia', 'RE-002', 'PO-002', '111111111', 1, util.VN_NOW (), 'test observation', 1, 20, 'Robin' - ), - ( - 3, 'alz-algemesi', 'RE-003', 'PO-003', '222222222', 2, DATE_ADD( - util.VN_NOW (), INTERVAL 2 DAY - ), 'observations...', 2, 25, 'Driverman' - ); +INSERT INTO `vn`.`roadmap` (`id`, `name`, `tractorPlate`, `trailerPlate`, `phone`, `supplierFk`, `etd`, `observations`, `userFk`, `price`, `driverName`) + VALUES + (1, 'val-algemesi', 'RE-001', 'PO-001', '111111111', 1, util.VN_NOW(), 'this is test observation', 1, 15, 'Batman'), + (2, 'alg-valencia', 'RE-002', 'PO-002', '111111111', 1, util.VN_NOW(), 'test observation', 1, 20, 'Robin'), + (3, 'alz-algemesi', 'RE-003', 'PO-003', '222222222', 2, DATE_ADD(util.VN_NOW(), INTERVAL 2 DAY), 'observations...', 2, 25, 'Driverman'); -INSERT INTO - `vn`.`expeditionTruck` ( - `id`, `roadmapFk`, `warehouseFk`, `eta`, `description`, `userFk` - ) -VALUES ( - 1, 1, 1, DATE_ADD( - util.VN_NOW (), INTERVAL 1 DAY - ), 'Best truck in fleet', 1 - ), - ( - 2, 1, 2, DATE_ADD( - util.VN_NOW (), INTERVAL '1 2' DAY_HOUR - ), 'Second truck in fleet', 1 - ), - ( - 3, 1, 3, DATE_ADD( - util.VN_NOW (), INTERVAL '1 4' DAY_HOUR - ), 'Third truck in fleet', 1 - ), - ( - 4, 2, 1, DATE_ADD( - util.VN_NOW (), INTERVAL 3 DAY - ), 'Truck red', 1 - ); +INSERT INTO `vn`.`expeditionTruck` (`id`, `roadmapFk`, `warehouseFk`, `eta`, `description`, `userFk`) + VALUES + (1, 1, 1, DATE_ADD(util.VN_NOW(), INTERVAL 1 DAY), 'Best truck in fleet', 1), + (2, 1, 2, DATE_ADD(util.VN_NOW(), INTERVAL '1 2' DAY_HOUR), 'Second truck in fleet', 1), + (3, 1, 3, DATE_ADD(util.VN_NOW(), INTERVAL '1 4' DAY_HOUR), 'Third truck in fleet', 1), + (4, 2, 1, DATE_ADD(util.VN_NOW(), INTERVAL 3 DAY), 'Truck red', 1); -INSERT INTO - `vn`.`expeditionPallet` ( - `id`, `truckFk`, `built`, `position`, `isPrint` - ) -VALUES ( - 1, 1, util.VN_CURDATE (), 1, 1 - ); +INSERT INTO `vn`.`expeditionPallet` (`id`, `truckFk`, `built`, `position`, `isPrint`) + VALUES + (1, 1, util.VN_CURDATE(), 1, 1); -INSERT INTO - `vn`.`expeditionScan` ( - `id`, `expeditionFk`, `scanned`, `palletFk` - ) -VALUES (1, 1, util.VN_CURDATE (), 1), - (2, 2, util.VN_CURDATE (), 1), - (3, 3, util.VN_CURDATE (), 1), - (4, 4, util.VN_CURDATE (), 1), - (5, 5, util.VN_CURDATE (), 1), - (6, 6, util.VN_CURDATE (), 1), - (7, 7, util.VN_CURDATE (), 1), - (8, 8, util.VN_CURDATE (), 1), - (9, 9, util.VN_CURDATE (), 1), - (10, 10, util.VN_CURDATE (), 1); +INSERT INTO `vn`.`expeditionScan` (`id`, `expeditionFk`, `scanned`, `palletFk`) + VALUES + (1, 1, util.VN_CURDATE(), 1), + (2, 2, util.VN_CURDATE(), 1), + (3, 3, util.VN_CURDATE(), 1), + (4, 4, util.VN_CURDATE(), 1), + (5, 5, util.VN_CURDATE(), 1), + (6, 6, util.VN_CURDATE(), 1), + (7, 7, util.VN_CURDATE(), 1), + (8, 8, util.VN_CURDATE(), 1), + (9, 9, util.VN_CURDATE(), 1), + (10, 10, util.VN_CURDATE(), 1); -CALL `cache`.`last_buy_refresh` (FALSE); +CALL `cache`.`last_buy_refresh`(FALSE); -UPDATE `vn`.`item` SET `genericFk` = 9 WHERE `id` = 2; +UPDATE `vn`.`item` SET `genericFk` = 9 + WHERE `id` = 2; -INSERT INTO - `bs`.`defaulter` ( - `clientFk`, `amount`, `created`, `defaulterSinced` - ) -VALUES ( - 1101, 500, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 1102, 500, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 1103, 500, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 1107, 500, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 1109, 500, util.VN_CURDATE (), util.VN_CURDATE () - ); +INSERT INTO `bs`.`defaulter` (`clientFk`, `amount`, `created`, `defaulterSinced`) + VALUES + (1101, 500, util.VN_CURDATE(), util.VN_CURDATE()), + (1102, 500, util.VN_CURDATE(), util.VN_CURDATE()), + (1103, 500, util.VN_CURDATE(), util.VN_CURDATE()), + (1107, 500, util.VN_CURDATE(), util.VN_CURDATE()), + (1109, 500, util.VN_CURDATE(), util.VN_CURDATE()); -UPDATE `vn`.`route` SET `invoiceInFk` = 1 WHERE `id` = 1; +UPDATE `vn`.`route` + SET `invoiceInFk`=1 + WHERE `id`=1; -UPDATE `vn`.`route` SET `invoiceInFk` = 2 WHERE `id` = 2; +UPDATE `vn`.`route` + SET `invoiceInFk`=2 + WHERE `id`=2; -INSERT INTO - `bs`.`sale` ( - `saleFk`, `amount`, `dated`, `typeFk`, `clientFk` - ) -VALUES ( - 1, 501.95, util.VN_CURDATE (), 2, 1101 - ), - ( - 2, 70.7, util.VN_CURDATE (), 2, 1101 - ), - ( - 3, 200.78, util.VN_CURDATE (), 2, 1101 - ), - ( - 4, 33.8, util.VN_CURDATE (), 1, 1101 - ), - ( - 30, 34.4, util.VN_CURDATE (), 1, 1108 - ); +INSERT INTO `bs`.`sale` (`saleFk`, `amount`, `dated`, `typeFk`, `clientFk`) + VALUES + (1, 501.95, util.VN_CURDATE(), 2, 1101), + (2, 70.7, util.VN_CURDATE(), 2, 1101), + (3, 200.78, util.VN_CURDATE(), 2, 1101), + (4, 33.8, util.VN_CURDATE(), 1, 1101), + (30, 34.4, util.VN_CURDATE(), 1, 1108); -INSERT INTO - `vn`.`docuwareConfig` (`url`) -VALUES ('http://docuware.url/'); +INSERT INTO `vn`.`docuwareConfig` (`url`) + VALUES + ('http://docuware.url/'); -INSERT INTO - `vn`.`calendarHolidaysName` (`id`, `name`) -VALUES (1, 'dayOfIT'); +INSERT INTO `vn`.`calendarHolidaysName` (`id`, `name`) + VALUES + (1, 'dayOfIT'); -INSERT INTO - `vn`.`calendarHolidaysType` (`id`, `name`, `hexColour`) -VALUES (1, 'National', '#4169E1'); +INSERT INTO `vn`.`calendarHolidaysType` (`id`, `name`, `hexColour`) + VALUES + (1, 'National', '#4169E1'); -INSERT INTO - `vn`.`calendarHolidays` ( - `id`, `calendarHolidaysTypeFk`, `dated`, `calendarHolidaysNameFk`, `workCenterFk` - ) -VALUES ( - 1, 1, CONCAT( - YEAR(util.VN_CURDATE ()), '-12-09' - ), 1, 1 - ); +INSERT INTO `vn`.`calendarHolidays` (`id`, `calendarHolidaysTypeFk`, `dated`, `calendarHolidaysNameFk`, `workCenterFk`) + VALUES + (1, 1, CONCAT(YEAR(util.VN_CURDATE()), '-12-09'), 1, 1); -INSERT INTO - `vn`.`supplierAgencyTerm` ( - `agencyFk`, `supplierFk`, `minimumPackages`, `kmPrice`, `packagePrice`, `routePrice`, `minimumKm`, `minimumM3`, `m3Price` - ) -VALUES ( - 1, 1, 0, 0.00, 0.00, NULL, 0, 0.00, 23 - ), - ( - 2, 1, 60, 0.00, 0.00, NULL, 0, 5.00, 33 - ), - ( - 3, 2, 0, 15.00, 0.00, NULL, 0, 0.00, 0 - ), - ( - 4, 2, 0, 20.00, 0.00, NULL, 0, 0.00, 0 - ), - ( - 5, 442, 0, 0.00, 3.05, NULL, 0, 0.00, 0 - ); +INSERT INTO `vn`.`supplierAgencyTerm` (`agencyFk`, `supplierFk`, `minimumPackages`, `kmPrice`, `packagePrice`, `routePrice`, `minimumKm`, `minimumM3`, `m3Price`) + VALUES + (1, 1, 0, 0.00, 0.00, NULL, 0, 0.00, 23), + (2, 1, 60, 0.00, 0.00, NULL, 0, 5.00, 33), + (3, 2, 0, 15.00, 0.00, NULL, 0, 0.00, 0), + (4, 2, 0, 20.00, 0.00, NULL, 0, 0.00, 0), + (5, 442, 0, 0.00, 3.05, NULL, 0, 0.00, 0); -INSERT INTO - `vn`.`chat` ( - `senderFk`, `recipient`, `dated`, `checkUserStatus`, `message`, `status`, `attempts` - ) -VALUES ( - 1101, '@PetterParker', util.VN_CURDATE (), 1, 'First test message', 0, 'sent' - ), - ( - 1101, '@PetterParker', util.VN_CURDATE (), 0, 'Second test message', 0, 'pending' - ); +INSERT INTO `vn`.`chat` (`senderFk`, `recipient`, `dated`, `checkUserStatus`, `message`, `status`, `attempts`) + VALUES + (1101, '@PetterParker', util.VN_CURDATE(), 1, 'First test message', 0, 'sent'), + (1101, '@PetterParker', util.VN_CURDATE(), 0, 'Second test message', 0, 'pending'); -INSERT INTO - `vn`.`mobileAppVersionControl` ( - `appName`, `version`, `isVersionCritical` - ) -VALUES ('delivery', '9.2', 0), - ('warehouse', '8.1', 0); -INSERT INTO - `vn`.`machine` ( - `plate`, `maker`, `model`, `warehouseFk`, `departmentFk`, `type`, `use`, `productionYear`, `workerFk`, `companyFk` - ) -VALUES ( - 'RE-001', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442 - ), - ( - 'RE-002', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442 - ); +INSERT INTO `vn`.`mobileAppVersionControl` (`appName`, `version`, `isVersionCritical`) + VALUES + ('delivery', '9.2', 0), + ('warehouse', '8.1', 0); -INSERT INTO - `vn`.`machineWorker` ( - `workerFk`, `machineFk`, `inTimed`, `outTimed` - ) -VALUES ( - 1106, 1, util.VN_CURDATE (), util.VN_CURDATE () - ), - ( - 1106, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ), - ( - 1106, 2, util.VN_CURDATE (), NULL - ), - ( - 1106, 2, DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ), DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 DAY - ) - ); +INSERT INTO `vn`.`machine` (`plate`, `maker`, `model`, `warehouseFk`, `departmentFk`, `type`, `use`, `productionYear`, `workerFk`, `companyFk`) + VALUES + ('RE-001', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442), + ('RE-002', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442); -INSERT INTO - `vn`.`zoneExclusion` ( - `id`, `zoneFk`, `dated`, `created`, `userFk` - ) -VALUES ( - 1, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 7, 7, 14 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ), util.VN_CURDATE (), 100 - ), - ( - 2, 1, DATE_ADD( - util.VN_CURDATE (), INTERVAL( - IF( - DAYOFWEEK(util.VN_CURDATE ()) <= 8, 8, 15 - ) - DAYOFWEEK(util.VN_CURDATE ()) - ) DAY - ), util.VN_CURDATE (), 100 - ); +INSERT INTO `vn`.`machineWorker` (`workerFk`, `machineFk`, `inTimed`, `outTimed`) + VALUES + (1106, 1, util.VN_CURDATE(), util.VN_CURDATE()), + (1106, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), + (1106, 2, util.VN_CURDATE(), NULL), + (1106, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)); -INSERT INTO - `vn`.`zoneExclusionGeo` (`zoneExclusionFk`, `geoFk`) -VALUES (2, 1); +INSERT INTO `vn`.`zoneExclusion` (`id`, `zoneFk`, `dated`, `created`, `userFk`) +VALUES + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=7, 7, 14) - DAYOFWEEK(util.VN_CURDATE())) DAY), util.VN_CURDATE(), 100), + (2, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL (IF(DAYOFWEEK(util.VN_CURDATE())<=8, 8, 15) - DAYOFWEEK(util.VN_CURDATE())) DAY), util.VN_CURDATE(), 100); -INSERT INTO - `vn`.`mdbBranch` (`name`) -VALUES ('test'), - ('master'); +INSERT INTO `vn`.`zoneExclusionGeo` (`zoneExclusionFk`, `geoFk`) + VALUES + (2, 1); -INSERT INTO - `vn`.`mdbVersion` (`app`, `branchFk`, `version`) -VALUES ('tpv', 'test', '1'), - ('lab', 'master', '1'); +INSERT INTO `vn`.`mdbBranch` (`name`) + VALUES + ('test'), + ('master'); -INSERT INTO - `vn`.`accountingConfig` (`id`, `minDate`, `maxDate`) -VALUES ( - 1, CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL -1 YEAR - ) - ), '-01-01' - ), CONCAT( - YEAR( - DATE_ADD( - util.VN_CURDATE (), INTERVAL + 1 YEAR - ) - ), '-01-01' - ) - ); +INSERT INTO `vn`.`mdbVersion` (`app`, `branchFk`, `version`) + VALUES + ('tpv', 'test', '1'), + ('lab', 'master', '1'); -INSERT INTO - `vn`.`saleGroup` ( - `userFk`, `parkingFk`, `sectorFk` - ) -VALUES (1, 1, 1); +INSERT INTO `vn`.`accountingConfig` (`id`, `minDate`, `maxDate`) + VALUES + (1, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-01-01'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-01-01')); -INSERT INTO - `vn`.`saleGroupDetail` (`saleFk`, `saleGroupFk`) -VALUES (31, 1); -INSERT INTO - `vn`.`sectorCollection` (`userFk`, `sectorFk`) -VALUES (1, 1); +INSERT INTO `vn`.`saleGroup` (`userFk`, `parkingFk`, `sectorFk`) + VALUES + (1, 1, 1); -INSERT INTO - `vn`.`sectorCollectionSaleGroup` ( - `sectorCollectionFk`, `saleGroupFk` - ) -VALUES (1, 1); +INSERT INTO `vn`.`saleGroupDetail` (`saleFk`, `saleGroupFk`) + VALUES + (31, 1); -INSERT INTO - `vn`.`workerTimeControlConfig` ( - `id`, `dayBreak`, `dayBreakDriver`, `shortWeekBreak`, `longWeekBreak`, `weekScope`, `mailPass`, `mailHost`, `mailSuccessFolder`, `mailErrorFolder`, `mailUser`, `minHoursToBreak`, `breakHours`, `hoursCompleteWeek`, `startNightlyHours`, `endNightlyHours`, `maxTimePerDay`, `breakTime`, `timeToBreakTime`, `dayMaxTime`, `shortWeekDays`, `longWeekDays`, `teleworkingStart`, `teleworkingStartBreakTime`, `maxTimeToBreak`, `maxWorkShortCycle`, `maxWorkLongCycle` - ) -VALUES ( - 1, 43200, 32400, 129600, 259200, 1080000, '', 'imap.verdnatura.es', 'Leidos.exito', 'Leidos.error', 'timeControl', 5.00, 0.33, 40, '22:00:00', '06:00:00', 72000, 1200, 18000, 72000, 6, 13, 28800, 32400, 3600, 561600, 950400 - ); +INSERT INTO `vn`.`sectorCollection` (`userFk`, `sectorFk`) + VALUES + (1, 1); -INSERT INTO - `vn`.`host` ( - `id`, `code`, `description`, `warehouseFk`, `bankFk` - ) -VALUES (1, 'pc1', 'pc host', 1, 1); +INSERT INTO `vn`.`sectorCollectionSaleGroup` (`sectorCollectionFk`, `saleGroupFk`) + VALUES + (1, 1); -INSERT INTO - `vn`.`packingSite` ( - `id`, `code`, `hostFk`, `monitorId` - ) -VALUES (1, 'h1', 1, ''); +INSERT INTO `vn`.`workerTimeControlConfig` (`id`, `dayBreak`, `dayBreakDriver`, `shortWeekBreak`, `longWeekBreak`, `weekScope`, `mailPass`, `mailHost`, `mailSuccessFolder`, `mailErrorFolder`, `mailUser`, `minHoursToBreak`, `breakHours`, `hoursCompleteWeek`, `startNightlyHours`, `endNightlyHours`, `maxTimePerDay`, `breakTime`, `timeToBreakTime`, `dayMaxTime`, `shortWeekDays`, `longWeekDays`, `teleworkingStart`, `teleworkingStartBreakTime`, `maxTimeToBreak`, `maxWorkShortCycle`, `maxWorkLongCycle`) + VALUES + (1, 43200, 32400, 129600, 259200, 1080000, '', 'imap.verdnatura.es', 'Leidos.exito', 'Leidos.error', 'timeControl', 5.00, 0.33, 40, '22:00:00', '06:00:00', 72000, 1200, 18000, 72000, 6, 13, 28800, 32400, 3600, 561600, 950400); -INSERT INTO - `vn`.`packingSiteConfig` ( - `shinobiUrl`, `shinobiToken`, `shinobiGroupKey`, `avgBoxingTime` - ) -VALUES ( - '', 'SHINNOBI_TOKEN', 'GROUP_TOKEN', 6000 - ); +INSERT INTO `vn`.`host` (`id`, `code`, `description`, `warehouseFk`, `bankFk`) + VALUES + (1, 'pc1', 'pc host', 1, 1); -INSERT INTO `util`.`notificationConfig` SET `cleanDays` = 90; +INSERT INTO `vn`.`packingSite` (`id`, `code`, `hostFk`, `monitorId`) + VALUES + (1, 'h1', 1, ''); -INSERT INTO - `util`.`notification` (`id`, `name`, `description`) -VALUES ( - 1, 'print-email', 'notification fixture one' - ), - ( - 2, 'invoice-electronic', 'A electronic invoice has been generated' - ), - ( - 3, 'not-main-printer-configured', 'A printer distinct than main has been configured' - ), - ( - 4, 'supplier-pay-method-update', 'A supplier pay method has been updated' - ), - ( - 5, 'modified-entry', 'An entry has been modified' - ), - ( - 6, 'book-entry-deleted', 'accounting entries deleted' - ); +INSERT INTO `vn`.`packingSiteConfig` (`shinobiUrl`, `shinobiToken`, `shinobiGroupKey`, `avgBoxingTime`) + VALUES + ('', 'SHINNOBI_TOKEN', 'GROUP_TOKEN', 6000); +INSERT INTO `util`.`notificationConfig` + SET `cleanDays` = 90; -INSERT INTO - `util`.`notificationAcl` (`notificationFk`, `roleFk`) -VALUES (1, 9), - (1, 1), - (2, 1), - (3, 9), - (4, 1), - (5, 9), - (6, 9); +INSERT INTO `util`.`notification` (`id`, `name`, `description`) + VALUES + (1, 'print-email', 'notification fixture one'), + (2, 'invoice-electronic', 'A electronic invoice has been generated'), + (3, 'not-main-printer-configured', 'A printer distinct than main has been configured'), + (4, 'supplier-pay-method-update', 'A supplier pay method has been updated'), + (5, 'modified-entry', 'An entry has been modified'), + (6, 'book-entry-deleted', 'accounting entries deleted'), + (7, 'zone-included','An email to notify zoneCollisions'); +INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) + VALUES + (1, 9), + (1, 1), + (2, 1), + (3, 9), + (4, 1), + (5, 9), + (6, 9), + (7, 1); -INSERT INTO - `util`.`notificationQueue` ( - `id`, `notificationFk`, `params`, `authorFk`, `status`, `created` - ) -VALUES ( - 1, 'print-email', '{"id": "1"}', 9, 'pending', util.VN_CURDATE () - ), - ( - 2, 'print-email', '{"id": "2"}', null, 'pending', util.VN_CURDATE () - ), - ( - 3, 'print-email', null, null, 'pending', util.VN_CURDATE () - ); +INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`) + VALUES + (1, 'print-email', '{"id": "1"}', 9, 'pending', util.VN_CURDATE()), + (2, 'print-email', '{"id": "2"}', null, 'pending', util.VN_CURDATE()), + (3, 'print-email', null, null, 'pending', util.VN_CURDATE()); -INSERT INTO - `util`.`notificationSubscription` (`notificationFk`, `userFk`) -VALUES (1, 1109), - (1, 1110), - (2, 1110), - (4, 1110), - (2, 1109), - (1, 9), - (1, 3), - (6, 9); +INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) + VALUES + (1, 1109), + (1, 1110), + (2, 1110), + (4, 1110), + (2, 1109), + (1, 9), + (1, 3), + (6, 9), + (7, 9); -INSERT INTO - `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) -VALUES (1, 9); -INSERT INTO - `vn`.`productionConfig` ( - `isPreviousPreparationRequired`, `ticketPrintedMax`, `ticketTrolleyMax`, `rookieDays`, `notBuyingMonths`, `id`, `isZoneClosedByExpeditionActivated`, `maxNotReadyCollections`, `minTicketsToCloseZone`, `movingTicketDelRoute`, `defaultZone`, `defautlAgencyMode`, `hasUniqueCollectionTime`, `maxCollectionWithoutUser`, `pendingCollectionsOrder`, `pendingCollectionsAge` - ) -VALUES ( - 0, 8, 80, 0, 0, 1, 0, 15, 25, -1, 697, 1328, 0, 1, 8, 6 - ); +INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) + VALUES + (1, 9); -INSERT INTO - `vn`.`collection` ( - `id`, `created`, `workerFk`, `stateFk`, `itemPackingTypeFk`, `saleTotalCount`, `salePickedCount`, `trainFk`, `sectorFk`, `wagons` - ) -VALUES ( - 3, util.VN_NOW (), 1107, 5, NULL, 0, 0, 1, NULL, NULL - ); +INSERT INTO `vn`.`productionConfig` (`isPreviousPreparationRequired`, `ticketPrintedMax`, `ticketTrolleyMax`, `rookieDays`, `notBuyingMonths`, `id`, `isZoneClosedByExpeditionActivated`, `maxNotReadyCollections`, `minTicketsToCloseZone`, `movingTicketDelRoute`, `defaultZone`, `defautlAgencyMode`, `hasUniqueCollectionTime`, `maxCollectionWithoutUser`, `pendingCollectionsOrder`, `pendingCollectionsAge`) + VALUES + (0, 8, 80, 0, 0, 1, 0, 15, 25, -1, 697, 1328, 0, 1, 8, 6); -INSERT INTO - `vn`.`itemConfig` ( - `id`, `isItemTagTriggerDisabled`, `monthToDeactivate`, `wasteRecipients`, `validPriorities`, `defaultPriority`, `defaultTag`, `warehouseFk` - ) -VALUES ( - 0, 0, 24, '', '[1,2,3]', 2, 56, 60 - ); +INSERT INTO `vn`.`collection` (`id`, `created`, `workerFk`, `stateFk`, `itemPackingTypeFk`, `saleTotalCount`, `salePickedCount`, `trainFk`, `sectorFk`, `wagons`) + VALUES + (3, util.VN_NOW(), 1107, 5, NULL, 0, 0, 1, NULL, NULL); -INSERT INTO - `vn`.`ticketCollection` ( - `ticketFk`, `collectionFk`, `created`, `level`, `wagon`, `smartTagFk`, `usedShelves`, `itemCount`, `liters` - ) -VALUES ( - 9, 3, util.VN_NOW (), NULL, 0, NULL, NULL, NULL, NULL - ); +INSERT INTO `vn`.`itemConfig` (`id`, `isItemTagTriggerDisabled`, `monthToDeactivate`, `wasteRecipients`, `validPriorities`, `defaultPriority`, `defaultTag`, `warehouseFk`) + VALUES + (0, 0, 24, '', '[1,2,3]', 2, 56, 60); -INSERT INTO - `vn`.`saleCloned` ( - `saleClonedFk`, `saleOriginalFk` - ) -VALUES (29, 25); +INSERT INTO `vn`.`ticketCollection` (`ticketFk`, `collectionFk`, `created`, `level`, `wagon`, `smartTagFk`, `usedShelves`, `itemCount`, `liters`) + VALUES + (9, 3, util.VN_NOW(), NULL, 0, NULL, NULL, NULL, NULL); + +INSERT INTO `vn`.`saleCloned` (`saleClonedFk`, `saleOriginalFk`) + VALUES + (29, 25); UPDATE `account`.`user` -SET - `hasGrant` = 1 -WHERE - `id` = 66; + SET `hasGrant` = 1 + WHERE `id` = 66; -INSERT INTO - `vn`.`ticketLog` ( - `originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description` - ) -VALUES ( - 7, 18, 'update', 'Sale', '{"quantity":1}', '{"quantity":10}', 22, NULL - ), - ( - 7, 18, 'update', 'Ticket', '{"quantity":1,"concept":"Chest ammo box"}', '{"quantity":10,"concept":"Chest ammo box"}', 22, NULL - ), - ( - 7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 22, NULL - ), - ( - 7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 100cm de '5' a '10'" - ), - ( - 16, 9, 'update', 'Sale', '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', '{"quantity":8,"concept":"Shield", "price": 10.5, "itemFk": 1}', 12, 'Shield' - ); +INSERT INTO `vn`.`ticketLog` (`originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description`) + VALUES + (7, 18, 'update', 'Sale', '{"quantity":1}', '{"quantity":10}', 22, NULL), + (7, 18, 'update', 'Ticket', '{"quantity":1,"concept":"Chest ammo box"}', '{"quantity":10,"concept":"Chest ammo box"}', 22, NULL), + (7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 22, NULL), + (7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 100cm de '5' a '10'"), + (16, 9, 'update', 'Sale', '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', '{"quantity":8,"concept":"Shield", "price": 10.5, "itemFk": 1}' , 12, 'Shield'); -INSERT INTO - `vn`.`ticketLog` ( - originFk, userFk, `action`, creationDate, changedModel, changedModelId, changedModelValue, oldInstance, newInstance, description - ) -VALUES ( - 1, NULL, 'delete', '2001-06-09 11:00:04', 'Ticket', 45, 'Spider Man', NULL, NULL, NULL - ), - ( - 1, 18, 'select', '2001-06-09 11:00:03', 'Ticket', 45, 'Spider Man', NULL, NULL, NULL - ), - ( - 1, NULL, 'update', '2001-05-09 10:00:02', 'Sale', 5, 'Armor', '{"isPicked": false}', '{"isPicked": true}', NULL - ), - ( - 1, 18, 'update', '2001-01-01 10:05:01', 'Sale', 5, 'Armor', NULL, NULL, 'Armor quantity changed from ''15'' to ''10''' - ), - ( - 1, NULL, 'delete', '2001-01-01 10:00:10', 'Sale', 4, 'Shield', '{"quantity":10,"concept":"Shield"}', NULL, NULL - ), - ( - 1, 18, 'insert', '2000-12-31 15:00:05', 'Sale', 1, 'Armor', NULL, '{"quantity":15,"concept":"Armor", "price": 345.99, "itemFk": 2}', NULL - ), - ( - 1, 18, 'update', '2000-12-28 08:40:45', 'Ticket', 45, 'Spider Man', '{"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"isBlocked":false,"hasPriority":false,"companyFk":442,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}', '{"warehouseFk":61,"shipped":"2023-05-17T22:00:00.000Z","nickname":"Spider Man","isSigned":false,"isLabeled":false,"isPrinted":false,"packages":1,"hour":0,"isBlocked":true,"hasPriority":true,"companyFk":443,"landed":"2023-05-18T22:00:00.000Z","isBoxed":false,"isDeleted":false,"zoneFk":713,"zonePrice":13,"zoneBonus":1}', NULL - ), - ( - 1, 18, 'select', '2000-12-27 03:40:30', 'Ticket', 45, NULL, NULL, NULL, NULL - ), - ( - 1, 18, 'insert', '2000-04-10 09:40:15', 'Sale', 4, 'Shield', NULL, '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', NULL - ), - ( - 1, 18, 'insert', '1999-05-09 10:00:00', 'Ticket', 45, 'Super Man', NULL, '{"id":45,"clientFk":8608,"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","addressFk":48637,"isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"created":"2023-05-16T11:42:56.000Z","isBlocked":false,"hasPriority":false,"companyFk":442,"agencyModeFk":639,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}', NULL - ); -INSERT INTO - `vn`.`osTicketConfig` ( - `id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo` - ) -VALUES ( - 0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', '1,6', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all' - ); +INSERT INTO `vn`.`ticketLog` (originFk, userFk, `action`, creationDate, changedModel, changedModelId, changedModelValue, oldInstance, newInstance, description) + VALUES + (1, NULL, 'delete', '2001-06-09 11:00:04', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL), + (1, 18, 'select', '2001-06-09 11:00:03', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL), + (1, NULL, 'update', '2001-05-09 10:00:02', 'Sale', 5, 'Armor' , '{"isPicked": false}','{"isPicked": true}', NULL), + (1, 18, 'update', '2001-01-01 10:05:01', 'Sale', 5, 'Armor' , NULL, NULL, 'Armor quantity changed from ''15'' to ''10'''), + (1, NULL, 'delete', '2001-01-01 10:00:10', 'Sale', 4, 'Shield' , '{"quantity":10,"concept":"Shield"}', NULL, NULL), + (1, 18, 'insert', '2000-12-31 15:00:05', 'Sale', 1, 'Armor' , NULL,'{"quantity":15,"concept":"Armor", "price": 345.99, "itemFk": 2}', NULL), + (1, 18, 'update', '2000-12-28 08:40:45', 'Ticket', 45, 'Spider Man' , '{"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"isBlocked":false,"hasPriority":false,"companyFk":442,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}','{"warehouseFk":61,"shipped":"2023-05-17T22:00:00.000Z","nickname":"Spider Man","isSigned":false,"isLabeled":false,"isPrinted":false,"packages":1,"hour":0,"isBlocked":true,"hasPriority":true,"companyFk":443,"landed":"2023-05-18T22:00:00.000Z","isBoxed":false,"isDeleted":false,"zoneFk":713,"zonePrice":13,"zoneBonus":1}', NULL), + (1, 18, 'select', '2000-12-27 03:40:30', 'Ticket', 45, NULL , NULL, NULL, NULL), + (1, 18, 'insert', '2000-04-10 09:40:15', 'Sale', 4, 'Shield' , NULL, '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', NULL), + (1, 18, 'insert', '1999-05-09 10:00:00', 'Ticket', 45, 'Super Man' , NULL, '{"id":45,"clientFk":8608,"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","addressFk":48637,"isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"created":"2023-05-16T11:42:56.000Z","isBlocked":false,"hasPriority":false,"companyFk":442,"agencyModeFk":639,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}', NULL); +INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`) + VALUES + (0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', '1,6', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all'); -INSERT INTO - `vn`.`mdbApp` ( - `app`, `baselineBranchFk`, `userFk`, `locked` - ) -VALUES ('foo', 'master', NULL, NULL), - ( - 'bar', 'test', 9, util.VN_NOW () - ); +INSERT INTO `vn`.`mdbApp` (`app`, `baselineBranchFk`, `userFk`, `locked`) + VALUES + ('foo', 'master', NULL, NULL), + ('bar', 'test', 9, util.VN_NOW()); -INSERT INTO - `vn`.`profileType` (`id`, `name`) -VALUES (1, 'working'); +INSERT INTO `vn`.`profileType` (`id`, `name`) + VALUES + (1, 'working'); -INSERT INTO - `salix`.`url` ( - `appName`, `environment`, `url` - ) -VALUES ( - 'lilium', 'development', 'http://localhost:9000/#/' - ), - ( - 'hedera', 'development', 'http://localhost:9090/' - ), - ( - 'salix', 'development', 'http://localhost:5000/#!/' - ); +INSERT INTO `salix`.`url` (`appName`, `environment`, `url`) + VALUES + ('lilium', 'development', 'http://localhost:9000/#/'), + ('hedera', 'development', 'http://localhost:9090/'), + ('salix', 'development', 'http://localhost:5000/#!/'); -INSERT INTO - `vn`.`report` ( - `id`, `name`, `paperSizeFk`, `method` - ) -VALUES ( - 3, 'invoice', NULL, 'InvoiceOuts/{refFk}/invoice-out-pdf' - ); +INSERT INTO `vn`.`report` (`id`, `name`, `paperSizeFk`, `method`) + VALUES + (3, 'invoice', NULL, 'InvoiceOuts/{refFk}/invoice-out-pdf'); -INSERT INTO - `vn`.`payDemDetail` (`id`, `detail`) -VALUES (1, 1), - (2, 20), - (7, 1); +INSERT INTO `vn`.`payDemDetail` (`id`, `detail`) + VALUES + (1, 1), + (2, 20), + (7, 1); -INSERT INTO - `vn`.`workerConfig` ( - `id`, `businessUpdated`, `roleFk`, `payMethodFk`, `businessTypeFk` - ) -VALUES (1, NULL, 1, 4, 'worker'); +INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `payMethodFk`, `businessTypeFk`) + VALUES + (1, NULL, 1, 4, 'worker'); -INSERT INTO - `vn`.`ticketRefund` ( - `refundTicketFk`, `originalTicketFk` - ) -VALUES (24, 8); +INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`) + VALUES + (24, 8); -INSERT INTO - `vn`.`deviceProductionModels` (`code`) -VALUES ('BLACKVIEW'), - ('DODGEE'), - ('ZEBRA'); +INSERT INTO `vn`.`deviceProductionModels` (`code`) + VALUES + ('BLACKVIEW'), + ('DODGEE'), + ('ZEBRA'); -INSERT INTO - `vn`.`deviceProductionState` (`code`, `description`) -VALUES ('active', 'activo'), - ('idle', 'inactivo'), - ('lost', 'perdida'), - ('repair', 'reparación'), - ('retired', 'retirada'); +INSERT INTO `vn`.`deviceProductionState` (`code`, `description`) + VALUES + ('active', 'activo'), + ('idle', 'inactivo'), + ('lost', 'perdida'), + ('repair', 'reparación'), + ('retired', 'retirada'); -INSERT INTO - `vn`.`deviceProduction` ( - `imei`, `modelFk`, `macWifi`, `serialNumber`, `android_id`, `purchased`, `stateFk`, `isInScalefusion`, `description` - ) -VALUES ( - 'ime1', 'BLACKVIEW', 'macWifi1', 'serialNumber1', 'androidid11234567890', util.VN_NOW (), 'active', 0, NULL - ), - ( - 'ime2', 'DODGEE', 'macWifi2', 'serialNumber2', 'androidid21234567890', util.VN_NOW (), 'idle', 0, NULL - ), - ( - 'ime3', 'ZEBRA', 'macWifi3', 'serialNumber3', 'androidid31234567890', util.VN_NOW (), 'active', 0, NULL - ), - ( - 'ime4', 'BLACKVIEW', 'macWifi4', 'serialNumber4', 'androidid41234567890', util.VN_NOW (), 'idle', 0, NULL - ); +INSERT INTO `vn`.`deviceProduction` (`imei`, `modelFk`, `macWifi`, `serialNumber`, `android_id`, `purchased`, `stateFk`, `isInScalefusion`, `description`) +VALUES + ('ime1', 'BLACKVIEW', 'macWifi1', 'serialNumber1', 'androidid11234567890', util.VN_NOW(), 'active', 0, NULL), + ('ime2', 'DODGEE', 'macWifi2', 'serialNumber2', 'androidid21234567890', util.VN_NOW(), 'idle', 0, NULL), + ('ime3', 'ZEBRA', 'macWifi3', 'serialNumber3', 'androidid31234567890', util.VN_NOW(), 'active', 0, NULL), + ('ime4', 'BLACKVIEW', 'macWifi4', 'serialNumber4', 'androidid41234567890', util.VN_NOW(), 'idle', 0, NULL); -INSERT INTO - `vn`.`deviceProductionUser` ( - `deviceProductionFk`, `userFk`, `created` - ) -VALUES (1, 1, util.VN_NOW ()), - (3, 3, util.VN_NOW ()); +INSERT INTO `vn`.`deviceProductionUser` (`deviceProductionFk`, `userFk`, `created`) + VALUES + (1, 1, util.VN_NOW()), + (3, 3, util.VN_NOW()); -INSERT INTO - `vn`.`workerTimeControlMail` ( - `id`, `workerFk`, `year`, `week`, `state`, `updated`, `sendedCounter`, `reason` - ) -VALUES ( - 1, 9, 2000, 49, 'REVISE', util.VN_NOW (), 1, 'test2' - ), - ( - 2, 9, 2000, 50, 'SENDED', util.VN_NOW (), 1, NULL - ), - ( - 3, 9, 2000, 51, 'CONFIRMED', util.VN_NOW (), 1, NULL - ), - ( - 4, 9, 2001, 1, 'SENDED', util.VN_NOW (), 1, NULL - ); +INSERT INTO `vn`.`workerTimeControlMail` (`id`, `workerFk`, `year`, `week`, `state`, `updated`, `sendedCounter`, `reason`) + VALUES + (1, 9, 2000, 49, 'REVISE', util.VN_NOW(), 1, 'test2'), + (2, 9, 2000, 50, 'SENDED', util.VN_NOW(), 1, NULL), + (3, 9, 2000, 51, 'CONFIRMED', util.VN_NOW(), 1, NULL), + (4, 9, 2001, 1, 'SENDED', util.VN_NOW(), 1, NULL); -INSERT INTO - `vn`.`wagonConfig` ( - `id`, `width`, `height`, `maxWagonHeight`, `minHeightBetweenTrays`, `maxTrays` - ) -VALUES (1, 1350, 1900, 200, 50, 6); +INSERT INTO `vn`.`wagonConfig` (`id`, `width`, `height`, `maxWagonHeight`, `minHeightBetweenTrays`, `maxTrays`) + VALUES + (1, 1350, 1900, 200, 50, 6); -INSERT INTO - `vn`.`wagonTypeColor` (`id`, `name`, `rgb`) -VALUES (1, 'white', '#ffffff'), - (2, 'red', '#ff0000'), - (3, 'green', '#00ff00'), - (4, 'blue', '#0000ff'); +INSERT INTO `vn`.`wagonTypeColor` (`id`, `name`, `rgb`) + VALUES + (1, 'white', '#ffffff'), + (2, 'red', '#ff0000'), + (3, 'green', '#00ff00'), + (4, 'blue', '#0000ff'); -INSERT INTO - `vn`.`wagonType` (`id`, `name`, `divisible`) -VALUES (1, 'Wagon Type #1', 1); +INSERT INTO `vn`.`wagonType` (`id`, `name`, `divisible`) + VALUES + (1, 'Wagon Type #1', 1); -INSERT INTO - `vn`.`wagonTypeTray` ( - `id`, `typeFk`, `height`, `colorFk` - ) -VALUES (1, 1, 100, 1), - (2, 1, 50, 2), - (3, 1, 0, 3); +INSERT INTO `vn`.`wagonTypeTray` (`id`, `typeFk`, `height`, `colorFk`) + VALUES + (1, 1, 100, 1), + (2, 1, 50, 2), + (3, 1, 0, 3); -INSERT INTO - `salix`.`accessTokenConfig` ( - `id`, `renewPeriod`, `courtesyTime`, `renewInterval` - ) -VALUES (1, 21600, 60, 300); +INSERT INTO `salix`.`accessTokenConfig` (`id`, `renewPeriod`, `courtesyTime`, `renewInterval`) + VALUES + (1, 21600, 60, 300); -INSERT INTO - `vn`.`travelConfig` ( - `id`, `warehouseInFk`, `warehouseOutFk`, `agencyFk`, `companyFk` - ) -VALUES (1, 1, 1, 1, 442); +INSERT INTO `vn`.`travelConfig` (`id`, `warehouseInFk`, `warehouseOutFk`, `agencyFk`, `companyFk`) + VALUES + (1, 1, 1, 1, 442); -INSERT INTO - `vn`.`buyConfig` (`id`, `monthsAgo`) -VALUES (1, 6); +INSERT INTO `vn`.`buyConfig` (`id`, `monthsAgo`) + VALUES + (1, 6); -INSERT INTO - `vn`.`invoiceInSerial` ( - `code`, `description`, `cplusTerIdNifFk`, `taxAreaFk` - ) -VALUES ('C', 'Asgard', 1, 'WORLD'), - ('E', 'Midgard', 1, 'CEE'), - ( - 'R', 'Jotunheim', 1, 'NATIONAL' - ), - ('W', 'Vanaheim', 1, 'WORLD'); +INSERT INTO `vn`.`invoiceInSerial` (`code`, `description`, `cplusTerIdNifFk`, `taxAreaFk`) + VALUES + ('C', 'Asgard', 1, 'WORLD'), + ('E', 'Midgard', 1, 'CEE'), + ('R', 'Jotunheim', 1, 'NATIONAL'), + ('W', 'Vanaheim', 1, 'WORLD'); -INSERT INTO - `hedera`.`imageConfig` ( - `id`, `maxSize`, `useXsendfile`, `url` - ) -VALUES (1, 0, 0, 'marvel.com'); -INSERT INTO - vn.XDiario ( - id, ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, BASEEURO, SERIE, FACTURA, IVA, RECEQUIV, CLAVE, CAMBIO, DEBEME, HABERME, AUXILIAR, MONEDAUSO, TIPOOPE, NFACTICK, TERIDNIF, TERNIF, TERNOM, OPBIENES, L340, enlazado, FECHA_EX, LRECT349, empresa_id, LDIFADUAN, METAL, METALIMP, CLIENTE, METALEJE, FECHA_OP, FACTURAEX, TIPOCLAVE, TIPOEXENCI, TIPONOSUJE, TIPOFACT, TIPORECTIF, SERIE_RT, FACTU_RT, BASEIMP_RT, BASEIMP_RF, RECTIFICA, FECHA_RT, FECREGCON, enlazadoSage - ) -VALUES ( - 1, 1.0, util.VN_CURDATE (), '4300001104', NULL, 'n/fra T3333333', 8.88, NULL, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1 - ), - ( - 2, 1.0, util.VN_CURDATE (), '2000000000', '4300001104', 'n/fra T3333333 Tony Stark', NULL, 8.07, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1 - ), - ( - 3, 1.0, util.VN_CURDATE (), '4770000010', '4300001104', 'Inmovilizado pendiente : n/fra T3333333 Tony Stark', NULL, 0.81, 8.07, 'T', '3333333', 10.00, NULL, NULL, NULL, NULL, NULL, '', '2', '', 1, 1, '06089160W', 'IRON MAN', 1, 1, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1 - ), - ( - 4, 2.0, util.VN_CURDATE (), '4300001104', NULL, 'n/fra T4444444', 8.88, NULL, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0 - ), - ( - 5, 2.0, util.VN_CURDATE (), '2000000000', '4300001104', 'n/fra T4444444 Tony Stark', NULL, 8.07, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0 - ), - ( - 6, 2.0, util.VN_CURDATE (), '4770000010', '4300001104', 'Inmovilizado pendiente : n/fra T4444444 Tony Stark', NULL, 0.81, 8.07, 'T', '4444444', 10.00, NULL, NULL, NULL, NULL, NULL, '', '2', '', 1, 1, '06089160W', 'IRON MAN', 1, 1, 0, util.VN_CURDATE (), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE (), NULL, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0 - ); +INSERT INTO `hedera`.`imageConfig` (`id`, `maxSize`, `useXsendfile`, `url`) + VALUES + (1, 0, 0, 'marvel.com'); -INSERT INTO - `vn`.`mistakeType` (`id`, `description`) -VALUES (1, 'Incorrect quantity'); +INSERT INTO vn.XDiario (id, ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, BASEEURO, SERIE, FACTURA, IVA, RECEQUIV, CLAVE, CAMBIO, DEBEME, HABERME, AUXILIAR, MONEDAUSO, TIPOOPE, NFACTICK, TERIDNIF, TERNIF, TERNOM, OPBIENES, L340, enlazado, FECHA_EX, LRECT349, empresa_id, LDIFADUAN, METAL, METALIMP, CLIENTE, METALEJE, FECHA_OP, FACTURAEX, TIPOCLAVE, TIPOEXENCI, TIPONOSUJE, TIPOFACT, TIPORECTIF, SERIE_RT, FACTU_RT, BASEIMP_RT, BASEIMP_RF, RECTIFICA, FECHA_RT, FECREGCON, enlazadoSage) + VALUES + (1, 1.0, util.VN_CURDATE(), '4300001104', NULL, 'n/fra T3333333', 8.88, NULL, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1), + (2, 1.0, util.VN_CURDATE(), '2000000000', '4300001104', 'n/fra T3333333 Tony Stark', NULL, 8.07, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1), + (3, 1.0, util.VN_CURDATE(), '4770000010', '4300001104', 'Inmovilizado pendiente : n/fra T3333333 Tony Stark', NULL, 0.81, 8.07, 'T', '3333333', 10.00, NULL, NULL, NULL, NULL, NULL, '', '2', '', 1, 1, '06089160W', 'IRON MAN', 1, 1, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 1), + (4, 2.0, util.VN_CURDATE(), '4300001104', NULL, 'n/fra T4444444', 8.88, NULL, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0), + (5, 2.0, util.VN_CURDATE(), '2000000000', '4300001104', 'n/fra T4444444 Tony Stark', NULL, 8.07, NULL, NULL, '0', NULL, 0.00, NULL, NULL, NULL, NULL, NULL, '2', NULL, 1, 2, 'I.F.', 'Nombre Importador', 1, 0, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0), + (6, 2.0, util.VN_CURDATE(), '4770000010', '4300001104', 'Inmovilizado pendiente : n/fra T4444444 Tony Stark', NULL, 0.81, 8.07, 'T', '4444444', 10.00, NULL, NULL, NULL, NULL, NULL, '', '2', '', 1, 1, '06089160W', 'IRON MAN', 1, 1, 0, util.VN_CURDATE(), 0, 442, 0, 0, 0.00, NULL, NULL, util.VN_CURDATE(), NULL, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, 0); -INSERT INTO - `vn`.`invoiceCorrectionType` (`id`, `description`) -VALUES (1, 'Error in VAT calculation'), - (2, 'Error in sales details'), - (3, 'Error in customer data'); +INSERT INTO `vn`.`mistakeType` (`id`, `description`) + VALUES + (1, 'Incorrect quantity'); -UPDATE `vn`.`client` SET fi = '65004204V' WHERE id = 1; +INSERT INTO `vn`.`invoiceCorrectionType` (`id`, `description`) + VALUES + (1, 'Error in VAT calculation'), + (2, 'Error in sales details'), + (3, 'Error in customer data'); -UPDATE `vn`.`worker` SET fi = '59328808D' WHERE id = 1106; +UPDATE `vn`.`client` + SET fi='65004204V' + WHERE id=1; -INSERT INTO - `account`.`mailAliasAcl` (`mailAliasFk`, `roleFk`) -VALUES (1, 1), - (2, 9), - (3, 15); +UPDATE `vn`.`worker` + SET fi='59328808D' + WHERE id=1106; -INSERT INTO - `vn`.`docuwareTablet` (`tablet`, `description`) -VALUES ('Tablet1', 'Jarvis tablet'), - ('Tablet2', 'Avengers tablet'); -INSERT INTO - `vn`.`sms` ( - `id`, `senderFk`, `sender`, `destination`, `message`, `statusCode`, `status`, `created` - ) -VALUES ( - 1, 66, '111111111', '0001111111111', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'OK', util.VN_CURDATE () - ), - ( - 2, 66, '222222222', '0002222222222', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'PENDING', util.VN_CURDATE () - ), - ( - 3, 66, '333333333', '0003333333333', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'ERROR', util.VN_CURDATE () - ), - ( - 4, 66, '444444444', '0004444444444', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'OK', util.VN_CURDATE () - ); +INSERT INTO `account`.`mailAliasAcl` (`mailAliasFk`, `roleFk`) + VALUES + (1, 1), + (2, 9), + (3, 15); -INSERT INTO - `vn`.`clientSms` ( - `id`, `clientFk`, `smsFk`, `ticketFk` - ) -VALUES (1, 1103, 1, NULL), - (2, 1103, 2, NULL), - (3, 1103, 3, 32), - (4, 1103, 4, 32), - (13, 1101, 1, NULL), - (14, 1101, 4, 27); +INSERT INTO `vn`.`docuwareTablet` (`tablet`,`description`) + VALUES + ('Tablet1','Jarvis tablet'), + ('Tablet2','Avengers tablet'); + +INSERT INTO `vn`.`sms` (`id`, `senderFk`, `sender`, `destination`, `message`, `statusCode`, `status`, `created`) + VALUES (1, 66, '111111111', '0001111111111', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'OK', util.VN_CURDATE()), + (2, 66, '222222222', '0002222222222', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'PENDING', util.VN_CURDATE()), + (3, 66, '333333333', '0003333333333', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'ERROR', util.VN_CURDATE()), + (4, 66, '444444444', '0004444444444', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', 0, 'OK', util.VN_CURDATE()); + +INSERT INTO `vn`.`clientSms` (`id`, `clientFk`, `smsFk`, `ticketFk`) + VALUES(1, 1103, 1, NULL), + (2, 1103, 2, NULL), + (3, 1103, 3, 32), + (4, 1103, 4, 32), + (13, 1101, 1, NULL), + (14, 1101, 4, 27); + +UPDATE salix.ACL + SET principalId='employee' WHERE model ="Notification"; From 7abf81f815584e0e899213dcbba66c9f3810c597 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:12:58 +0100 Subject: [PATCH 024/183] refs #5858 fix: restore test to default --- modules/zone/back/methods/zone/specs/deleteZone.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index e105bb296..bb8416b16 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -30,7 +30,7 @@ describe('zone deletezone()', () => { } }); - it('should NOT delete a zone if is included', async() => { + xit('should NOT delete a zone if is included', async() => { const tx = await models.Zone.beginTransaction({}); let isIncluded = false; try { @@ -45,7 +45,7 @@ describe('zone deletezone()', () => { } }); - it('should NOT delete a zone if is included check', async() => { + xit('should NOT delete a zone if is included check', async() => { const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; @@ -61,12 +61,12 @@ describe('zone deletezone()', () => { try { const options = {transaction: tx}; - const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); + /* const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); await models.ZoneIncluded.destroyById(zoneIncluded[0].id, options); const zoneIncludedDeleted = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); - expect(zoneIncludedDeleted.length).toEqual(0); + expect(zoneIncludedDeleted.length).toEqual(0);*/ await models.Zone.deleteZone(ctx, zoneId, options); From 3cb494c7357a016765d89b75e39050d758329220 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:14:23 +0100 Subject: [PATCH 025/183] refs #5858 fix: restore test to default --- .../methods/zone/specs/deleteZone.spec.js | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index e105bb296..a9e0a768f 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -30,43 +30,11 @@ describe('zone deletezone()', () => { } }); - it('should NOT delete a zone if is included', async() => { - const tx = await models.Zone.beginTransaction({}); - let isIncluded = false; - try { - const options = {transaction: tx}; - const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}); - isIncluded = zoneIncluded.length > 0; - await models.Zone.deleteZone(ctx, zoneId, options); - } catch (e) { - expect(isIncluded).toBeTrue(); - expect(e).not.toBeNull(); - await tx.rollback(); - } - }); - - it('should NOT delete a zone if is included check', async() => { - const tx = await models.Zone.beginTransaction({}); - try { - const options = {transaction: tx}; - await models.Zone.deleteZone(ctx, zoneId, options); - } catch (e) { - expect(e).not.toBeNull(); - await tx.rollback(); - } - }); - it('should delete a zone and update their tickets', async() => { const tx = await models.Zone.beginTransaction({}); try { const options = {transaction: tx}; - const zoneIncluded = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); - await models.ZoneIncluded.destroyById(zoneIncluded[0].id, options); - - const zoneIncludedDeleted = await models.ZoneIncluded.find({where: {zoneFk: zoneId}}, options); - - expect(zoneIncludedDeleted.length).toEqual(0); await models.Zone.deleteZone(ctx, zoneId, options); From e5b7395e5ceebbe58c84050fc58ab4ba6fce654e Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:27:28 +0100 Subject: [PATCH 026/183] refs #5858 fix: test Notification getList --- back/methods/notification/specs/getList.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/methods/notification/specs/getList.spec.js b/back/methods/notification/specs/getList.spec.js index 52ac497a5..6c60d3505 100644 --- a/back/methods/notification/specs/getList.spec.js +++ b/back/methods/notification/specs/getList.spec.js @@ -7,7 +7,7 @@ describe('NotificationSubscription getList()', () => { const notifications = await models.Notification.find({}); const totalAvailable = notifications.length - active.length; - expect(active.length).toEqual(2); + expect(active.length).toEqual(3); expect(available.length).toEqual(totalAvailable); }); }); From 337190ef6de03056b476e9b342816bbde301fbb0 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:27:46 +0100 Subject: [PATCH 027/183] refs #5858 feat: use notification system --- .../vn/procedures/zone_getCollisions.sql | 98 ++++++++----------- 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/db/routines/vn/procedures/zone_getCollisions.sql b/db/routines/vn/procedures/zone_getCollisions.sql index f6779e1b7..a3a637e84 100644 --- a/db/routines/vn/procedures/zone_getCollisions.sql +++ b/db/routines/vn/procedures/zone_getCollisions.sql @@ -1,8 +1,8 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getCollisions`() +CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() BEGIN /** - * Calcula si para un mismo codigo postal y dia + * Calcula si para un mismo codigo postal y dia * hay mas de una zona configurada y manda correo * */ @@ -10,17 +10,18 @@ BEGIN DECLARE vZoneFk INT; DECLARE vIsDone INT DEFAULT FALSE; DECLARE vTableCollisions TEXT; + DECLARE json_data JSON; DECLARE cur1 CURSOR FOR SELECT zoneFk from tmp.zoneOption; - + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vIsDone = TRUE; DROP TEMPORARY TABLE IF EXISTS tmp.zone; CREATE TEMPORARY TABLE tmp.zone - SELECT z.id + SELECT z.id FROM zone z JOIN agencyMode am ON am.id = z.agencyModeFk JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk - WHERE dm.code IN ('AGENCY','DELIVERY'); + WHERE dm.code IN ('AGENCY','DELIVERY'); CALL zone_getOptionsForShipment(util.VN_CURDATE(),FALSE); @@ -35,7 +36,7 @@ BEGIN PRIMARY KEY zoneFkk (zoneFk, geoFk), INDEX(geoFk)) ENGINE = MyISAM; - + OPEN cur1; cur1Loop: LOOP SET vIsDone = FALSE; @@ -43,83 +44,62 @@ BEGIN IF vIsDone THEN LEAVE cur1Loop; END IF; - + CALL zone_getLeaves(vZoneFk, NULL, NULL, TRUE); - myLoop: LOOP + myLoop: LOOP SET vGeoFk = NULL; - SELECT geoFk INTO vGeoFk + SELECT geoFk INTO vGeoFk FROM tmp.zoneNodes zn WHERE NOT isChecked LIMIT 1; - + IF vGeoFk IS NULL THEN LEAVE myLoop; END IF; - + CALL zone_getLeaves(vZoneFk, vGeoFk, NULL, TRUE); UPDATE tmp.zoneNodes - SET isChecked = TRUE + SET isChecked = TRUE WHERE geoFk = vGeoFk; END LOOP; END LOOP; CLOSE cur1; - DELETE FROM tmp.zoneNodes + DELETE FROM tmp.zoneNodes WHERE sons > 0; - + DROP TEMPORARY TABLE IF EXISTS geoCollision; CREATE TEMPORARY TABLE geoCollision SELECT z.agencyModeFk, zn.geoFk, zw.warehouseFk FROM tmp.zoneNodes zn JOIN zone z ON z.id = zn.zoneFk - JOIN zoneWarehouse zw ON z.id = zw.zoneFk + JOIN zoneWarehouse zw ON z.id = zw.zoneFk GROUP BY z.agencyModeFk, zn.geoFk, zw.warehouseFk HAVING count(*) > 1; - - SELECT ' - - - - - - - - ' INTO vTableCollisions; - - INSERT INTO mail (receiver,replyTo,subject,body) - SELECT 'pepe@verdnatura.es' receiver, - 'noreply@verdnatura.es' replyTo, - CONCAT('Colisiones en zonas ', util.VN_CURDATE()) subject, - CONCAT(vTableCollisions, - GROUP_CONCAT(sub.td SEPARATOR ''), - '
C.PostalNúmero de zonaPrecioZonaAlmacénSalix
') body - FROM(SELECT - CONCAT(' - ', zn.name, ' - ', zoneFk,' - ', z.price,' - ', z.name,' - ', w.name, ' - ', CONCAT('' - 'https://salix.verdnatura.es/#!/zone/', - zoneFk, - '/location?q=%7B%22search%22:%22', - zn.name, - '%22%7D'),' - ') td - FROM tmp.zoneNodes zn - JOIN zone z ON z.id = zn.zoneFk - JOIN geoCollision gc ON gc.agencyModeFk = z.agencyModeFk AND zn.geoFk = gc.geoFk - JOIN warehouse w ON w.id = gc.warehouseFk) sub; - - DROP TEMPORARY TABLE - geoCollision, + + SELECT JSON_ARRAYAGG( + JSON_OBJECT( + 'zoneFk', zoneFk, + 'zn', JSON_OBJECT('name', zn.name), + 'z', JSON_OBJECT('name', z.name,'price', z.price), + 'w', JSON_OBJECT('name', w.name) + ) + ) FROM tmp.zoneNodes zn + JOIN zone z ON z.id = zn.zoneFk + JOIN geoCollision gc ON gc.agencyModeFk = z.agencyModeFk AND zn.geoFk = gc.geoFk + JOIN warehouse w ON w.id = gc.warehouseFk + INTO json_data; + + SELECT util.notification_send( + 'zone-included', + JSON_OBJECT('zoneCollisions',json_data), + account.myUser_getId() + ); + + DROP TEMPORARY TABLE + geoCollision, tmp.zone, tmp.zoneNodes; -END$$ +END ;; DELIMITER ; From cff59d197d0bb2b6b4a5dbc550050ca598ef356f Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:28:07 +0100 Subject: [PATCH 028/183] refs #5858 feat: use active event when trigger --- db/routines/vn/triggers/zoneIncluded_afterDelete.sql | 1 + db/routines/vn/triggers/zoneIncluded_beforeInsert.sql | 1 + db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql | 1 + 3 files changed, 3 insertions(+) diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 6d184bb12..501e16c32 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -8,5 +8,6 @@ BEGIN `changedModel` = 'zoneIncluded', `changedModelId` = OLD.zoneFk, `userFk` = account.myUser_getId(); + UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index 5eff33efa..a1cf232b3 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeIn FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index 445f37699..e83058782 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; From 7f1e3c66e2a83261d77fd474c905babf4da91e70 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 10:35:12 +0100 Subject: [PATCH 029/183] refs #5858 feat: define event --- db/routines/vn/events/zone_getCollisions.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 db/routines/vn/events/zone_getCollisions.sql diff --git a/db/routines/vn/events/zone_getCollisions.sql b/db/routines/vn/events/zone_getCollisions.sql new file mode 100644 index 000000000..680b264f0 --- /dev/null +++ b/db/routines/vn/events/zone_getCollisions.sql @@ -0,0 +1,11 @@ +DELIMITER $$ +CREATE EVENT IF NOT EXISTS `zone_getCollisions` + ON SCHEDULE EVERY 1 DAY + STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY + ENABLE + DO BEGIN + CALL `zone_getCollisions`(); + -- Desactivar el evento después de ejecutarse + ALTER EVENT `zone_getCollisions` DISABLE; +END$$ +DELIMITER; From 0a398fdd6cc119aceb0c21328479099893e76530 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 11:37:08 +0100 Subject: [PATCH 030/183] refs #5858 feat: comments --- db/routines/vn/events/zone_getCollisions.sql | 12 ++++++------ db/routines/vn/procedures/zone_getCollisions.sql | 7 +++++-- db/routines/vn/triggers/zoneIncluded_afterDelete.sql | 2 ++ .../vn/triggers/zoneIncluded_beforeInsert.sql | 2 ++ .../vn/triggers/zoneIncluded_beforeUpdate.sql | 2 ++ .../10881-greenHydrangea/01-notification.vn.sql | 10 ++++++++++ .../zone/back/methods/zone/specs/deleteZone.spec.js | 1 - 7 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 db/versions/10881-greenHydrangea/01-notification.vn.sql diff --git a/db/routines/vn/events/zone_getCollisions.sql b/db/routines/vn/events/zone_getCollisions.sql index 680b264f0..5df262e63 100644 --- a/db/routines/vn/events/zone_getCollisions.sql +++ b/db/routines/vn/events/zone_getCollisions.sql @@ -1,11 +1,11 @@ DELIMITER $$ + CREATE EVENT IF NOT EXISTS `zone_getCollisions` ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY - ENABLE - DO BEGIN + DO BEGIN CALL `zone_getCollisions`(); - -- Desactivar el evento después de ejecutarse - ALTER EVENT `zone_getCollisions` DISABLE; -END$$ -DELIMITER; + ALTER EVENT `zone_getCollisions` DISABLE; + END$$ + +DELIMITER ; diff --git a/db/routines/vn/procedures/zone_getCollisions.sql b/db/routines/vn/procedures/zone_getCollisions.sql index a3a637e84..023b9aac2 100644 --- a/db/routines/vn/procedures/zone_getCollisions.sql +++ b/db/routines/vn/procedures/zone_getCollisions.sql @@ -1,5 +1,6 @@ DELIMITER $$ -CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zoneIncluded_checkCollisions`() + +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getCollisions`() BEGIN /** * Calcula si para un mismo codigo postal y dia @@ -78,6 +79,7 @@ BEGIN GROUP BY z.agencyModeFk, zn.geoFk, zw.warehouseFk HAVING count(*) > 1; + -- Recojo los datos de la zona que ha dado conflicto SELECT JSON_ARRAYAGG( JSON_OBJECT( 'zoneFk', zoneFk, @@ -91,6 +93,7 @@ BEGIN JOIN warehouse w ON w.id = gc.warehouseFk INTO json_data; + -- Creo un registro de la notificacion 'zone-included' para reportar via email SELECT util.notification_send( 'zone-included', JSON_OBJECT('zoneCollisions',json_data), @@ -101,5 +104,5 @@ BEGIN geoCollision, tmp.zone, tmp.zoneNodes; -END ;; +END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 501e16c32..005709506 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -8,6 +8,8 @@ BEGIN `changedModel` = 'zoneIncluded', `changedModelId` = OLD.zoneFk, `userFk` = account.myUser_getId(); + + -- Activo el evento 'zone_getCollisions' UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index a1cf232b3..4ea26e154 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -4,6 +4,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeIn FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + + -- Activo el evento 'zone_getCollisions' UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index e83058782..1bc12d891 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -4,6 +4,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + + -- Activo el evento 'zone_getCollisions' UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; END$$ DELIMITER ; diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql new file mode 100644 index 000000000..d05902461 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -0,0 +1,10 @@ +INSERT INTO util.notification (id, name,description) + VALUES ( +(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); + +INSERT INTO util.notificationSubscription (notificationFk,userFk) + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; + + +INSERT INTO util.notificationAcl (notificationFk,roleFk) + SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index a9e0a768f..968685fec 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -35,7 +35,6 @@ describe('zone deletezone()', () => { try { const options = {transaction: tx}; - await models.Zone.deleteZone(ctx, zoneId, options); const updatedZone = await models.Zone.findById(zoneId, null, options); From e8c783ca680a629e07836ec191205e59e43a55ae Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 13:14:41 +0100 Subject: [PATCH 031/183] refs #5858 feat: comments --- .../10881-greenHydrangea/00-firstScript.sql | 18 ++++++++++++++++++ .../01-notification.vnx.sql | 10 ++++++++++ 2 files changed, 28 insertions(+) create mode 100644 db/versions/10881-greenHydrangea/00-firstScript.sql create mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/versions/10881-greenHydrangea/00-firstScript.sql b/db/versions/10881-greenHydrangea/00-firstScript.sql new file mode 100644 index 000000000..1ca77c1a0 --- /dev/null +++ b/db/versions/10881-greenHydrangea/00-firstScript.sql @@ -0,0 +1,18 @@ + +-- UPDATE salix.ACL +-- SET principalId='employee' WHERE model ="Notification"; + +-- INSERT INTO util.notification (name,description) +-- VALUES ('zone-included','An email to notify zoneCollisions'); + +-- INSERT INTO util.notificationSubscription (notificationFk,userFk) +-- SELECT +-- (SELECT id FROM util.notification WHERE name= "zone-included") AS notificationFk, +-- (SELECT account.myUser_getId() ) AS userFk; + + +-- INSERT INTO util.notificationAcl (notificationFk, roleFk) +-- SELECT +-- (SELECT id FROM util.notification WHERE name = 'zone-included') AS notificationFk, +-- (SELECT id FROM account.role WHERE name = 'system') AS roleFk; + diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql new file mode 100644 index 000000000..83e2be1d0 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vnx.sql @@ -0,0 +1,10 @@ +-- INSERT INTO util.notification (id, name,description) +-- VALUES ( +-- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); + +-- INSERT INTO util.notificationSubscription (notificationFk,userFk) +-- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; + + +-- INSERT INTO util.notificationAcl (notificationFk,roleFk) +-- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 05d685c86bef4aba674d1e1f8eb5fc333d96bf4e Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 13:17:47 +0100 Subject: [PATCH 032/183] refs #5858 feat: comments --- db/dump/fixtures.before.sql | 13 ++++--------- .../10881-greenHydrangea/00-firstScript.sql | 18 ------------------ .../01-notification.vn.sql | 10 ---------- .../01-notification.vnx.sql | 10 ---------- 4 files changed, 4 insertions(+), 47 deletions(-) delete mode 100644 db/versions/10881-greenHydrangea/00-firstScript.sql delete mode 100644 db/versions/10881-greenHydrangea/01-notification.vn.sql delete mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 8a6bd85fd..be9fe05ff 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2816,8 +2816,8 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`) (3, 'not-main-printer-configured', 'A printer distinct than main has been configured'), (4, 'supplier-pay-method-update', 'A supplier pay method has been updated'), (5, 'modified-entry', 'An entry has been modified'), - (6, 'book-entry-deleted', 'accounting entries deleted'), - (7, 'zone-included','An email to notify zoneCollisions'); + (6, 'book-entry-deleted', 'accounting entries deleted'); + INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) VALUES (1, 9), @@ -2826,8 +2826,7 @@ INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) (3, 9), (4, 1), (5, 9), - (6, 9), - (7, 1); + (6, 9); INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`) VALUES @@ -2844,8 +2843,7 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) (2, 1109), (1, 9), (1, 3), - (6, 9), - (7, 9); + (6, 9); INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) @@ -3064,6 +3062,3 @@ INSERT INTO `vn`.`clientSms` (`id`, `clientFk`, `smsFk`, `ticketFk`) (4, 1103, 4, 32), (13, 1101, 1, NULL), (14, 1101, 4, 27); - -UPDATE salix.ACL - SET principalId='employee' WHERE model ="Notification"; diff --git a/db/versions/10881-greenHydrangea/00-firstScript.sql b/db/versions/10881-greenHydrangea/00-firstScript.sql deleted file mode 100644 index 1ca77c1a0..000000000 --- a/db/versions/10881-greenHydrangea/00-firstScript.sql +++ /dev/null @@ -1,18 +0,0 @@ - --- UPDATE salix.ACL --- SET principalId='employee' WHERE model ="Notification"; - --- INSERT INTO util.notification (name,description) --- VALUES ('zone-included','An email to notify zoneCollisions'); - --- INSERT INTO util.notificationSubscription (notificationFk,userFk) --- SELECT --- (SELECT id FROM util.notification WHERE name= "zone-included") AS notificationFk, --- (SELECT account.myUser_getId() ) AS userFk; - - --- INSERT INTO util.notificationAcl (notificationFk, roleFk) --- SELECT --- (SELECT id FROM util.notification WHERE name = 'zone-included') AS notificationFk, --- (SELECT id FROM account.role WHERE name = 'system') AS roleFk; - diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql deleted file mode 100644 index d05902461..000000000 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ /dev/null @@ -1,10 +0,0 @@ -INSERT INTO util.notification (id, name,description) - VALUES ( -(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); - -INSERT INTO util.notificationSubscription (notificationFk,userFk) - SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; - - -INSERT INTO util.notificationAcl (notificationFk,roleFk) - SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql deleted file mode 100644 index 83e2be1d0..000000000 --- a/db/versions/10881-greenHydrangea/01-notification.vnx.sql +++ /dev/null @@ -1,10 +0,0 @@ --- INSERT INTO util.notification (id, name,description) --- VALUES ( --- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); - --- INSERT INTO util.notificationSubscription (notificationFk,userFk) --- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; - - --- INSERT INTO util.notificationAcl (notificationFk,roleFk) --- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 955828c63ed62480685e1a73ff55ab421e995e5f Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 12 Feb 2024 15:13:18 +0100 Subject: [PATCH 033/183] refs #5858 feat: comments --- db/dump/fixtures.before.sql | 13 ++++--------- db/routines/util/events/vn_scheduler.sql | 9 +++++++++ db/routines/util/procedures/vn_scheduler.sql | 8 ++++++++ db/routines/vn/events/zone_getCollisions.sql | 11 ----------- .../vn/triggers/zoneIncluded_afterDelete.sql | 4 +++- .../vn/triggers/zoneIncluded_beforeInsert.sql | 4 ++-- .../vn/triggers/zoneIncluded_beforeUpdate.sql | 4 ++-- 7 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 db/routines/util/events/vn_scheduler.sql create mode 100644 db/routines/util/procedures/vn_scheduler.sql delete mode 100644 db/routines/vn/events/zone_getCollisions.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 8a6bd85fd..be9fe05ff 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2816,8 +2816,8 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`) (3, 'not-main-printer-configured', 'A printer distinct than main has been configured'), (4, 'supplier-pay-method-update', 'A supplier pay method has been updated'), (5, 'modified-entry', 'An entry has been modified'), - (6, 'book-entry-deleted', 'accounting entries deleted'), - (7, 'zone-included','An email to notify zoneCollisions'); + (6, 'book-entry-deleted', 'accounting entries deleted'); + INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) VALUES (1, 9), @@ -2826,8 +2826,7 @@ INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) (3, 9), (4, 1), (5, 9), - (6, 9), - (7, 1); + (6, 9); INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`) VALUES @@ -2844,8 +2843,7 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) (2, 1109), (1, 9), (1, 3), - (6, 9), - (7, 9); + (6, 9); INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) @@ -3064,6 +3062,3 @@ INSERT INTO `vn`.`clientSms` (`id`, `clientFk`, `smsFk`, `ticketFk`) (4, 1103, 4, 32), (13, 1101, 1, NULL), (14, 1101, 4, 27); - -UPDATE salix.ACL - SET principalId='employee' WHERE model ="Notification"; diff --git a/db/routines/util/events/vn_scheduler.sql b/db/routines/util/events/vn_scheduler.sql new file mode 100644 index 000000000..4c5c99b6a --- /dev/null +++ b/db/routines/util/events/vn_scheduler.sql @@ -0,0 +1,9 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `VN_SCHEDULER` + ON SCHEDULE EVERY 1 DAY + STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY + DO BEGIN + CALL `VN_SCHEDULER`(); + END$$ + +DELIMITER ; diff --git a/db/routines/util/procedures/vn_scheduler.sql b/db/routines/util/procedures/vn_scheduler.sql new file mode 100644 index 000000000..d34fe9092 --- /dev/null +++ b/db/routines/util/procedures/vn_scheduler.sql @@ -0,0 +1,8 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `util`.`VN_SCHEDULER`() +BEGIN + -- Obtener datos de la tabla vn_schedules + +END$$ + +DELIMITER ; diff --git a/db/routines/vn/events/zone_getCollisions.sql b/db/routines/vn/events/zone_getCollisions.sql deleted file mode 100644 index 5df262e63..000000000 --- a/db/routines/vn/events/zone_getCollisions.sql +++ /dev/null @@ -1,11 +0,0 @@ -DELIMITER $$ - -CREATE EVENT IF NOT EXISTS `zone_getCollisions` - ON SCHEDULE EVERY 1 DAY - STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY - DO BEGIN - CALL `zone_getCollisions`(); - ALTER EVENT `zone_getCollisions` DISABLE; - END$$ - -DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 005709506..248717f51 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -10,6 +10,8 @@ BEGIN `userFk` = account.myUser_getId(); -- Activo el evento 'zone_getCollisions' - UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; + -- UPDATE `mysql`.`event` SET status = 1 WHERE name = 'zone_getCollisions'; + + -- Insert en vn_schedules 'zone_getCollisions' END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index 4ea26e154..2e1f70407 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -1,11 +1,11 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeInsert` BEFORE INSERT ON `zoneIncluded` - FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); -- Activo el evento 'zone_getCollisions' - UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; + -- Insert en vn_schedulesla key 'zone_getCollisions' + END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index 1bc12d891..05c3acd41 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp BEGIN SET NEW.editorFk = account.myUser_getId(); - -- Activo el evento 'zone_getCollisions' - UPDATE mysql.event SET status = 1 WHERE name = 'zone_getCollisions'; + -- Activo el evento 'zone_getCollisions' -- Insert en vn_schedules 'zone_getCollisions' + END$$ DELIMITER ; From 7b862c5c30c659addf7b7136db49ddcf97ab60ba Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 12 Feb 2024 16:10:58 +0100 Subject: [PATCH 034/183] fix: refs #6744 fix setPassword --- .../worker/back/methods/worker/setPassword.js | 47 +++++++++++-------- modules/worker/front/descriptor/index.html | 4 +- modules/worker/front/descriptor/index.js | 5 +- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/modules/worker/back/methods/worker/setPassword.js b/modules/worker/back/methods/worker/setPassword.js index 43d3d946f..0f6905e80 100644 --- a/modules/worker/back/methods/worker/setPassword.js +++ b/modules/worker/back/methods/worker/setPassword.js @@ -2,42 +2,49 @@ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('setPassword', { description: 'Set a new password', - accepts: [ - { - arg: 'workerFk', - type: 'number', - required: true, - description: 'The worker id', - }, - { - arg: 'newPass', - type: 'String', - required: true, - description: 'The new worker password' - } + accepts: [{ + arg: 'workerFk', + type: 'number', + required: true, + description: 'The worker id', + }, { + arg: 'newPass', + type: 'String', + required: true, + description: 'The new worker password' + }, { + arg: 'emailVerified', + type: 'Boolean', + required: true, + }, ], http: { path: `/:id/setPassword`, verb: 'PATCH' } }); - Self.setPassword = async(ctx, options) => { + Self.setPassword = async(ctx, workerFk, newPass, emailVerified, options) => { + const userId = ctx.req.accessToken.userId; const models = Self.app.models; const myOptions = {}; - const {args} = ctx; let tx; + if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } - try { - const isSubordinate = await models.Worker.isSubordinate(ctx, args.workerFk, myOptions); - if (!isSubordinate) throw new UserError('You don\'t have enough privileges.'); - await models.VnUser.setPassword(args.workerFk, args.newPass, myOptions); - await models.VnUser.updateAll({id: args.workerFk}, {emailVerified: true}, myOptions); + try { + const ishimself = userId === workerFk; + const isSubordinate = await models.Worker.isSubordinate(ctx, workerFk, myOptions); + + if (ishimself || (isSubordinate && !emailVerified)) { + await models.VnUser.setPassword(workerFk, newPass, myOptions); + await models.VnUser.updateAll({id: workerFk}, {emailVerified: true}, myOptions); + } else + throw new UserError('You don\'t have enough privileges.'); if (tx) await tx.commit(); } catch (e) { diff --git a/modules/worker/front/descriptor/index.html b/modules/worker/front/descriptor/index.html index 8290e2a15..67776ce47 100644 --- a/modules/worker/front/descriptor/index.html +++ b/modules/worker/front/descriptor/index.html @@ -11,8 +11,8 @@ ? 'Click to allow the user to be disabled' : 'Click to exclude the user from getting disabled'}} - - Change password + + Change password diff --git a/modules/worker/front/descriptor/index.js b/modules/worker/front/descriptor/index.js index 13ffa6f2f..4ef98fe3b 100644 --- a/modules/worker/front/descriptor/index.js +++ b/modules/worker/front/descriptor/index.js @@ -15,6 +15,8 @@ class Controller extends Descriptor { this.entity = value; if (value) this.getIsExcluded(); + this.$http.get(`UserConfigs/getUserConfig`) + .then(res => this.userFk = res.data.userFk); if (this.entity && !this.entity.user.emailVerified) this.getPassRequirements(); @@ -69,6 +71,7 @@ class Controller extends Descriptor { } ] }; + return this.getData(`Workers/${this.id}`, {filter}) .then(res => this.entity = res.data); } @@ -87,7 +90,7 @@ class Controller extends Descriptor { throw new UserError(`Passwords don't match`); this.$http.patch( `Workers/${this.entity.id}/setPassword`, - {workerFk: this.entity.id, newPass: this.newPassword} + {workerFk: this.entity.id, newPass: this.newPassword, emailVerified: !!this.entity.user.emailVerified} ) .then(() => { this.vnApp.showSuccess(this.$translate.instant('Password changed!')); }); From 24984e8acacfa15661d4b47dfa9184ee21f53713 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 13 Feb 2024 08:32:04 +0100 Subject: [PATCH 035/183] Revert "refs #5858 feat: comments" This reverts commit 05d685c86bef4aba674d1e1f8eb5fc333d96bf4e. --- db/dump/fixtures.before.sql | 13 +++++++++---- .../10881-greenHydrangea/00-firstScript.sql | 18 ++++++++++++++++++ .../01-notification.vn.sql | 10 ++++++++++ .../01-notification.vnx.sql | 10 ++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 db/versions/10881-greenHydrangea/00-firstScript.sql create mode 100644 db/versions/10881-greenHydrangea/01-notification.vn.sql create mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index be9fe05ff..8a6bd85fd 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2816,8 +2816,8 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`) (3, 'not-main-printer-configured', 'A printer distinct than main has been configured'), (4, 'supplier-pay-method-update', 'A supplier pay method has been updated'), (5, 'modified-entry', 'An entry has been modified'), - (6, 'book-entry-deleted', 'accounting entries deleted'); - + (6, 'book-entry-deleted', 'accounting entries deleted'), + (7, 'zone-included','An email to notify zoneCollisions'); INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) VALUES (1, 9), @@ -2826,7 +2826,8 @@ INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) (3, 9), (4, 1), (5, 9), - (6, 9); + (6, 9), + (7, 1); INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`) VALUES @@ -2843,7 +2844,8 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) (2, 1109), (1, 9), (1, 3), - (6, 9); + (6, 9), + (7, 9); INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) @@ -3062,3 +3064,6 @@ INSERT INTO `vn`.`clientSms` (`id`, `clientFk`, `smsFk`, `ticketFk`) (4, 1103, 4, 32), (13, 1101, 1, NULL), (14, 1101, 4, 27); + +UPDATE salix.ACL + SET principalId='employee' WHERE model ="Notification"; diff --git a/db/versions/10881-greenHydrangea/00-firstScript.sql b/db/versions/10881-greenHydrangea/00-firstScript.sql new file mode 100644 index 000000000..1ca77c1a0 --- /dev/null +++ b/db/versions/10881-greenHydrangea/00-firstScript.sql @@ -0,0 +1,18 @@ + +-- UPDATE salix.ACL +-- SET principalId='employee' WHERE model ="Notification"; + +-- INSERT INTO util.notification (name,description) +-- VALUES ('zone-included','An email to notify zoneCollisions'); + +-- INSERT INTO util.notificationSubscription (notificationFk,userFk) +-- SELECT +-- (SELECT id FROM util.notification WHERE name= "zone-included") AS notificationFk, +-- (SELECT account.myUser_getId() ) AS userFk; + + +-- INSERT INTO util.notificationAcl (notificationFk, roleFk) +-- SELECT +-- (SELECT id FROM util.notification WHERE name = 'zone-included') AS notificationFk, +-- (SELECT id FROM account.role WHERE name = 'system') AS roleFk; + diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql new file mode 100644 index 000000000..d05902461 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -0,0 +1,10 @@ +INSERT INTO util.notification (id, name,description) + VALUES ( +(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); + +INSERT INTO util.notificationSubscription (notificationFk,userFk) + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; + + +INSERT INTO util.notificationAcl (notificationFk,roleFk) + SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql new file mode 100644 index 000000000..83e2be1d0 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vnx.sql @@ -0,0 +1,10 @@ +-- INSERT INTO util.notification (id, name,description) +-- VALUES ( +-- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); + +-- INSERT INTO util.notificationSubscription (notificationFk,userFk) +-- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; + + +-- INSERT INTO util.notificationAcl (notificationFk,roleFk) +-- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 37dd3c00c5fdef400940c6c9e2718fb6f87e99de Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 13 Feb 2024 09:11:39 +0100 Subject: [PATCH 036/183] updates --- db/routines/util/events/vn_scheduler.sql | 1 + db/routines/util/procedures/vn_scheduler.sql | 67 +++++++++++++++++++ db/routines/vn/events/zone_getCollisions.sql | 17 +++++ .../vn/triggers/zoneIncluded_afterDelete.sql | 3 + .../vn/triggers/zoneIncluded_beforeInsert.sql | 4 ++ .../vn/triggers/zoneIncluded_beforeUpdate.sql | 3 + .../01-createVnSchedules.sql | 14 ++++ .../01-notification.vn.sql | 14 ++-- 8 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 db/routines/vn/events/zone_getCollisions.sql create mode 100644 db/versions/10881-greenHydrangea/01-createVnSchedules.sql diff --git a/db/routines/util/events/vn_scheduler.sql b/db/routines/util/events/vn_scheduler.sql index 4c5c99b6a..e25741ac6 100644 --- a/db/routines/util/events/vn_scheduler.sql +++ b/db/routines/util/events/vn_scheduler.sql @@ -2,6 +2,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `VN_SCHEDULER` ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY + ENABLE DO BEGIN CALL `VN_SCHEDULER`(); END$$ diff --git a/db/routines/util/procedures/vn_scheduler.sql b/db/routines/util/procedures/vn_scheduler.sql index d34fe9092..1ab72de39 100644 --- a/db/routines/util/procedures/vn_scheduler.sql +++ b/db/routines/util/procedures/vn_scheduler.sql @@ -1,8 +1,75 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `util`.`VN_SCHEDULER`() BEGIN + DECLARE vDone BOOL; + DECLARE vError VARCHAR(255) DEFAULT NULL; + DECLARE vErrorCode VARCHAR(255) DEFAULT NULL; + DECLARE vSchema VARCHAR(255); + DECLARE vStatus VARCHAR(255); + DECLARE vProcedure VARCHAR(255); + -- DECLARE vLogMail VARCHAR(255); + DECLARE vScheduleFk INT; -- Obtener datos de la tabla vn_schedules + DECLARE vQueue CURSOR FOR + SELECT id, `schema`, `procedure`, `status` + FROM vn_schedules + WHERE status = 'scheduled'; + OPEN vQueue; + l: LOOP + SET vDone = FALSE; + FETCH vQueue INTO vScheduleFk, vSchema, vProcedure, vStatus; + + IF vDone THEN + LEAVE l; + END IF; + + UPDATE vn_schedules + SET `started` = util.VN_NOW(), + `finished` = NULL, + `error` = NULL, + `errorCode` = NULL + WHERE id = vScheduleFk; + + SET vError = NULL; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + GET DIAGNOSTICS CONDITION 1 + vError = MESSAGE_TEXT, + vErrorCode = RETURNED_SQLSTATE; + + CALL util.exec(CONCAT('CALL `', vSchema ,'`.`', vProcedure ,'`')); + + IF vError IS NOT NULL THEN + -- IF vLogMail IS NOT NULL THEN + -- CALL vn.mail_insert( + -- vLogMail, + -- NULL, + -- CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'), + -- CONCAT( + -- '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break + -- 'See ', SCHEMA(), '.nightTask table for more info.' + -- ) + -- ); + -- END IF; + + UPDATE vn_schedules + SET `error` = vError, + finished = util.VN_NOW(), + lastFinished = util.VN_NOW() + `errorCode` = vErrorCode + `status` = 'error' + WHERE id = vScheduleFk; + ELSE + UPDATE vn_schedules + SET `error` = vError, + `errorCode` = vErrorCode + finished = util.VN_NOW(), + lastFinished = util.VN_NOW(), + `status` = 'exec' + WHERE id = vScheduleFk; + END IF; + END LOOP; + CLOSE vQueue; END$$ DELIMITER ; diff --git a/db/routines/vn/events/zone_getCollisions.sql b/db/routines/vn/events/zone_getCollisions.sql new file mode 100644 index 000000000..2437cffc2 --- /dev/null +++ b/db/routines/vn/events/zone_getCollisions.sql @@ -0,0 +1,17 @@ +DELIMITER $$ + +CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`zoneCollisions` + ON SCHEDULE EVERY 1 DAY + STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY + ON COMPLETION NOT PRESERVE + ENABLE + DO BEGIN + DECLARE vEXEC BOOLEAN DEFAULT FALSE; + SELECT COUNT(*)>0 INTO vEXEC from util.vn_schedules; + + IF vEXEC THEN + CALL `zone_getCollisions`(); + END IF; + END$$ + +DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 248717f51..a46ba9060 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -11,6 +11,9 @@ BEGIN -- Activo el evento 'zone_getCollisions' -- UPDATE `mysql`.`event` SET status = 1 WHERE name = 'zone_getCollisions'; + INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) + VALUES + (`vn`, `zone_getCollisions`); -- Insert en vn_schedules 'zone_getCollisions' END$$ diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index 2e1f70407..810546d91 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -6,6 +6,10 @@ BEGIN -- Activo el evento 'zone_getCollisions' -- Insert en vn_schedulesla key 'zone_getCollisions' + -- ALTER EVENT zoneCollisions ENABLE; + INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) + VALUES + (`vn`, `zone_getCollisions`); END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index 05c3acd41..a5e0184b4 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -7,5 +7,8 @@ BEGIN -- Activo el evento 'zone_getCollisions' -- Insert en vn_schedules 'zone_getCollisions' + INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) + VALUES + (`vn`, `zone_getCollisions`); END$$ DELIMITER ; diff --git a/db/versions/10881-greenHydrangea/01-createVnSchedules.sql b/db/versions/10881-greenHydrangea/01-createVnSchedules.sql new file mode 100644 index 000000000..07dedf7d3 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-createVnSchedules.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS `util`.`vn_schedules` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `started` datetime DEFAULT NULL, + `finished` datetime DEFAULT NULL, + `lastFinished` datetime DEFAULT NULL, + `order` int(11) DEFAULT NULL, + `schema` varchar(45) NOT NULL, + `procedure` varchar(100) NOT NULL, + `error` varchar(255) DEFAULT NULL, + `errorCode` varchar(10) DEFAULT NULL, + `status` enum('scheduled','exec','error') NOT NULL DEFAULT 'scheduled', + PRIMARY KEY (`id`), + UNIQUE KEY unique_schedule (`schema`, `procedure`, `status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index d05902461..83e2be1d0 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -1,10 +1,10 @@ -INSERT INTO util.notification (id, name,description) - VALUES ( -(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); +-- INSERT INTO util.notification (id, name,description) +-- VALUES ( +-- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); -INSERT INTO util.notificationSubscription (notificationFk,userFk) - SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; +-- INSERT INTO util.notificationSubscription (notificationFk,userFk) +-- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; -INSERT INTO util.notificationAcl (notificationFk,roleFk) - SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; +-- INSERT INTO util.notificationAcl (notificationFk,roleFk) +-- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 47bfb34507df24839642afa49694f699036a3f71 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 13 Feb 2024 10:10:48 +0100 Subject: [PATCH 037/183] fix: refs #6744 remove params --- .../worker/back/methods/worker/setPassword.js | 21 ++++++++----------- modules/worker/front/descriptor/index.js | 8 +++---- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/modules/worker/back/methods/worker/setPassword.js b/modules/worker/back/methods/worker/setPassword.js index 0f6905e80..cf9cd4cf2 100644 --- a/modules/worker/back/methods/worker/setPassword.js +++ b/modules/worker/back/methods/worker/setPassword.js @@ -3,27 +3,23 @@ module.exports = Self => { Self.remoteMethodCtx('setPassword', { description: 'Set a new password', accepts: [{ - arg: 'workerFk', + arg: 'id', type: 'number', required: true, description: 'The worker id', + http: {source: 'path'} }, { arg: 'newPass', type: 'String', required: true, description: 'The new worker password' - }, { - arg: 'emailVerified', - type: 'Boolean', - required: true, - }, - ], + }], http: { path: `/:id/setPassword`, verb: 'PATCH' } }); - Self.setPassword = async(ctx, workerFk, newPass, emailVerified, options) => { + Self.setPassword = async(ctx, workerId, newPass, options) => { const userId = ctx.req.accessToken.userId; const models = Self.app.models; const myOptions = {}; @@ -37,12 +33,13 @@ module.exports = Self => { } try { - const ishimself = userId === workerFk; - const isSubordinate = await models.Worker.isSubordinate(ctx, workerFk, myOptions); + const ishimself = userId === workerId; + const isSubordinate = await Self.isSubordinate(ctx, workerId, myOptions); + const {emailVerified} = await models.VnUser.findById(workerId, {fields: ['emailVerified']}, myOptions); if (ishimself || (isSubordinate && !emailVerified)) { - await models.VnUser.setPassword(workerFk, newPass, myOptions); - await models.VnUser.updateAll({id: workerFk}, {emailVerified: true}, myOptions); + await models.VnUser.setPassword(workerId, newPass, myOptions); + await models.VnUser.updateAll({id: workerId}, {emailVerified: true}, myOptions); } else throw new UserError('You don\'t have enough privileges.'); diff --git a/modules/worker/front/descriptor/index.js b/modules/worker/front/descriptor/index.js index 4ef98fe3b..3cbeb2c55 100644 --- a/modules/worker/front/descriptor/index.js +++ b/modules/worker/front/descriptor/index.js @@ -5,6 +5,9 @@ class Controller extends Descriptor { constructor($element, $, $rootScope) { super($element, $); this.$rootScope = $rootScope; + + this.$http.get(`UserConfigs/getUserConfig`) + .then(res => this.userFk = res.data.userFk); } get worker() { @@ -15,8 +18,6 @@ class Controller extends Descriptor { this.entity = value; if (value) this.getIsExcluded(); - this.$http.get(`UserConfigs/getUserConfig`) - .then(res => this.userFk = res.data.userFk); if (this.entity && !this.entity.user.emailVerified) this.getPassRequirements(); @@ -89,8 +90,7 @@ class Controller extends Descriptor { if (this.newPassword != this.repeatPassword) throw new UserError(`Passwords don't match`); this.$http.patch( - `Workers/${this.entity.id}/setPassword`, - {workerFk: this.entity.id, newPass: this.newPassword, emailVerified: !!this.entity.user.emailVerified} + `Workers/${this.entity.id}/setPassword`, {newPass: this.newPassword} ) .then(() => { this.vnApp.showSuccess(this.$translate.instant('Password changed!')); }); From 0eaeb2e80598c4bfc77e01cd1abdbe904d2e545f Mon Sep 17 00:00:00 2001 From: pako Date: Thu, 15 Feb 2024 13:13:22 +0100 Subject: [PATCH 038/183] nueva rama --- db/dump/fixtures.after.sql | 404 ++++++++++++++++++ db/routines/floranet/events/clean.sql | 22 + .../floranet/procedures/catalogue_get.sql | 52 +++ .../floranet/procedures/order_confirm.sql | 25 ++ db/routines/floranet/procedures/order_put.sql | 42 ++ .../10887-floranet/00-schemaAndUser.sql | 14 + db/versions/10887-floranet/01-tables.sql | 61 +++ 7 files changed, 620 insertions(+) create mode 100644 db/routines/floranet/events/clean.sql create mode 100644 db/routines/floranet/procedures/catalogue_get.sql create mode 100644 db/routines/floranet/procedures/order_confirm.sql create mode 100644 db/routines/floranet/procedures/order_put.sql create mode 100644 db/versions/10887-floranet/00-schemaAndUser.sql create mode 100644 db/versions/10887-floranet/01-tables.sql diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index 4c5f89d97..a7d059ed2 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -292,7 +292,411 @@ INSERT INTO `hedera`.`tpvConfig` (currency, terminal, transactionType, maxAmount */ INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk) VALUES (1, 442); +-- XXX: floranet +INSERT INTO vn.intrastat(id, description, taxClassFk, taxCodeFk) +VALUES(6031970, 'Flores y capullos frescos (Otras: ramos, coronas)', 1, 63); + +-- Generación de items +SELECT id + INTO @FNR + FROM vn.itemType + WHERE code = 'FNR'; + +SELECT id + INTO @FNP + FROM vn.itemType + WHERE code = 'FNP'; + +DELETE + FROM vn.item + WHERE typeFk IN (@FNR,@FNP); + +SELECT MAX(id) + 1 + INTO @item + FROM vn.item; + +INSERT INTO vn.item + ( + id, + name, + longName, + `size`, + originFk, + intrastatFk, + typeFk, + inkFk, + image, + description + ) + VALUES + ( + @item := @item + 1, + @r := 'Ramo Terranova', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin ORDER BY RAND() LIMIT 1), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1CwtEK5_GReAzconaJsPTCXxV7zajbTos/view?usp=drive_link', + CONCAT('Hemos elegido una selección de flores muy especiales para realizar ', + 'esta composición: brásicas, flor de cera, astrantia, espigas, lisiantum, ', + 'paniculata eucaliptus.') + ), + ( + @item := @item + 1, + @r := 'Ramo Tasmania', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1_149uYZ-sehw3vWH68Quttk8QJe5T_bG/view?usp=drive_link', + CONCAT('La elegancia de este ramo es por la elección de todas las flores que lo componen: ', + 'eringium, verdes variados, rosas proteas, margaritas, astrantia, esta selección de ', + 'flores será un acierto seguro para hacer un regalo muy especial.') + ), + ( + @item := @item + 1, + @r := 'Ramo Pasion', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1-dH1UilV-nOH9XNK23uooZoezlwMT-Jq/view?usp=drive_link', + CONCAT('La unión de las rosas rojas con el lilium rosa hace de este ramo uno de ', + 'los más especiales , el juego de las dos tonalidades con los diferentes verdes ', + 'que cuidadosamente selecionamos para darle el toque final a la composicion hace ', + 'que este ramo sea al mismo tiempo elegante y atrevido, para amantes de lo inesperado ', + 'que quieren decorar alguna estancia de su hogar o hacer un ragalo muy especial') + ), + ( + @item := @item + 1, + @r := 'Ramo Florencia', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1PWKo5N8kg8H3xQtELdeQTQIc1HMZCc1P/view?usp=drive_link', + CONCAT('Este ramo evoca los colores del atardecer en Florencia, las rosas ramificadas ', + 'de pitimini con diferentes tonalidades y la paniculata nos transpotan al ambiente ', + 'sofisticado del norte de Italia y la frescura de los verdes variados nos recuerda ', + 'a la campiña italiana .Este ramo es ideal para regalar pensando en alguien muy especial.') + ), + ( + @item := @item + 1, + @r := 'Ramo Atardecer', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink WHERE name = 'Yellow'), + 'https://drive.google.com/file/d/1eM4gtftQuXN5xUjAHIRUYNPZNmuHVRA_/view?usp=drive_link', + CONCAT('Las rosas amarillas simbolizan la alegría de vivir, la calidez ,el ', + 'optimismo y la energía, por eso son el regalo perfecto para una ocasión muy ', + 'especial o para celebrar la alegría de una amistad o de un encuentro, a estas ', + 'preciosas rosas les añadimos un toque desenfadado a través de los verdes ', + 'variados que unidos a la belleza de la rosa que seguro serán una apuesta segura.') + ), + ( + @item := @item + 1, + @r := 'Ramo Arcoíris', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1Hxk5yqo7891gfK1VKIYfWxO5a_0K2Qej/view?usp=drive_link', + CONCAT('Llega la primavera a tu casa con el ramo Arco Iris , conseguirás iluminar ', + 'cualquier estancia gracias a la combinacón de las gerberas holandesas de gran ', + 'tamaño con colores muy vivos que a su vez contrastan a la perfección con las ', + 'margaritas coconut y el estatice variado, todo ello acompañado de verdes entre ', + 'los que destaca el ruscus danae , para dulcificar la explosión de color , ', + 'añadimos paniculata , una flor sencilla pero que aporta gran armonía al ramo') + ), + ( + @item := @item + 1, + @r := 'Ramo Provenza', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1TA9SBwjqnrEqG1bzwDL37sxtX9CNyLJk/view?usp=drive_link', + CONCAT('La delicada composición de este ramo escogida de forma minuciosa hecho ', + 'con liliums rosa, lisiantum blanco y rosas de color rosa todo ello unificado ', + 'con una selección de maravillosos verdes variados, hacen que esta combinación ', + 'sea muy especial para decorar cualquier estancia de tu casa a la que aportará una luz especial.') + ), + ( + @item := @item + 1, + @r := 'Ramo Alegria', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1sOf2isj84P9OxR3E3x6n2PjPnWVamLCE/view?usp=drive_link', + CONCAT('Hemos elegido el nombre de Alegría para este ramo ya que sus intensos ', + 'y variados colores nos producen esa sensación, la combinación de rosas blancas ', + ', alstroemeria rosa unida a la paniculata tambien de color rosa y a la sutileza ', + 'de la combinación de verdes variados, hace de este ramo una opción perfecta de ', + 'regalo que a todo el mundo le gusta por su armoniosa combinacion de colores.') + ), + ( + @item := @item + 1, + @r := 'Planta Orquídeas ', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/14BIkDDonFaIiTyJer1CWju1YzZNzt3XQ/view?usp=drive_link', + CONCAT('Elegimos personalmente en nuestra tienda dos plantas de orquídeas ', + 'con las mejores características combinadas con diferentes elementos de ', + 'decoración consiguiendo una composición ideal para cualquier ambiente.El ', + 'recipiente de cerámica se puede utilizar para múltiples funciones y sacar ', + 'de el las dos plantas de orquídeas para colocarlas en dos puntos diferentes ', + 'de nuestro hogar, ya que se respeta siempre las macetas originales de cada orquídea') + ), + ( + @item := @item + 1, + @r := 'Planta Kentia', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1rKe2RicfWha-VIm1LbbXckbA41glA99K/view?usp=drive_link', + CONCAT('La Kentia es una de las plantas más decorativas debido al porte que ', + 'le otorgan sus largas finas hojas arqueadas, ideal para un regalo que dejará ', + 'sin palabras a quien lo reciba o para decorar una estancia de tu hogar, ', + 'desde un espacio super moderno hasta el ambiente más clásico. Nuestras Kentias ', + 'proceden de uno de los mejores productores de kentias del mundo, con el añadido ', + 'de ser un producto nacional producido en Canarias de una calidad extrema.') + ), + ( + @item := @item + 1, + @r := 'Planta Calathea', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/11CKm5rqVFVPOELciuyXUrkc2oeTHJzBE/view?usp=drive_link', + CONCAT('Esta planta originaria de América tropical, principalmente de Brasil y Perú ', + ', son plantas ideales para embellecer el interior de una estancia . Debido a su ', + 'llamativo y original colorido, tambien es un regalo perfecto para ', + 'cualquier compromiso que tengamos .') + ), + ( + @item := @item + 1, + @r := 'Planta Anthurium ', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink WHERE name = 'Red'), + 'https://drive.google.com/file/d/1j4il_N9VJGaP4f6CPZM0u6GjxwIeYcBt/view?usp=drive_link', + CONCAT('Nos encanta el color rojo de sus flores .Esta planta original de ', + 'Costa Rica ,proviene de las zonas tropicales de America Central y del Sur, ', + 'su llamativo color alegrará cualquier celebración') + ), + ( + @item := @item + 1, + @r := 'Ramo Mindanao', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1lsGDuC6xmv3SyGukfLTVYsQvbGf1Bzxy/view?usp=drive_link', + CONCAT('La combinación de rosas ramificadas amarillas, las hortensias blancas, ', + 'el estatice, el limonium Tanacetum y los verdes variados hace de este ramo uno ', + 'de los que más gustan tanto si es para regalar como para decorar un rincón de tu casa.') + ), + ( + @item := @item + 1, + @r := 'Ramo Guinea', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1MtF0oghv-ahogaAaVpJNzDiIfyeCCmAi/view?usp=drive_link', + CONCAT('Hemos elegido una selección de flores muy especiales para realizar esta composición:', + ' brásicas, flor de cera, astrantia, espigas, lisiantum, paniculata eucaliptus.') + ), + ( + @item := @item + 1, + @r := 'Ramo Eterno', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/1AOMqlZAKqImnnWSmeq1DW1Krj78mACCG/view?usp=drive_link', + CONCAT('La perfecta combinación de los diferentes tonos de estatice y el eucaliptus ', + 'cinerea hacen de este ramo un recuerdo inolvidable ya que ambos materiales son de ', + 'larga duración por lo que podrás conservar tu ramo junto con las bonitas vivencias ', + 'de ese día durante mucho tiempo, además le añadimos un toque especial que le dan ', + 'las raices las cuales combinan con los tonos del ramo, unas bonitas cintas del colores ', + 'rematan el acabado del ramo. Este ramo se puede secar y mantenerse en perfecto estado.') + ), + ( + @item := @item + 1, + @r := 'Ramo Cielo', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + 'https://drive.google.com/file/d/168DikIOwVT5OO4BHARBoWwLB1wjpAS7s/view?usp=drive_link', + CONCAT('Las hortensias son unas de las flores más elegantes que existen y ', + 'la combinación que proponemos para este ramo te resultará de lo más armoniosa ', + ', ya que intercalamos flores de mayor tamaño como las hortensias azules y ', + 'blancas junto con flores más pequeñas y delicadas como el estatice , todo ello', + ' combinado con el eucaliptus cinerea que te aportará un sueve aroma en toda ', + 'la estancia, el atado del ramo es de rafia natural, siguiendo la tonalidad ', + 'clara de todo el conjunto. ') + ); + + -- Ramo Terranova: 1er elemento +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Rosa roja', + @r, + 60, + 1, + 'RED', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 12 + FROM vn.item + WHERE name = 'Ramo Terranova'; + + -- Ramo Terranova: 2º elemento + +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Hoja de helecho', + @r, + 60, + 1, + 'BAS', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 4 + FROM vn.item + WHERE name = 'Ramo Terranova'; + + + -- Ramo Terranova: 3er elemento +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Paniculata', + @r, + 60, + 1, + 'SLV', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 5 + FROM vn.item + WHERE name = 'Ramo Terranova'; + + + -- XXX SET foreign_key_checks = 1; diff --git a/db/routines/floranet/events/clean.sql b/db/routines/floranet/events/clean.sql new file mode 100644 index 000000000..4477112fd --- /dev/null +++ b/db/routines/floranet/events/clean.sql @@ -0,0 +1,22 @@ +DELIMITER $$ +CREATE OR REPLACE + DEFINER=`root`@`localhost` + EVENT `floranet`.`clean` + ON SCHEDULE EVERY 1 DAY + STARTS '2024-01-01 23:00:00.000' + ON COMPLETION PRESERVE + ENABLE +DO +BEGIN + DELETE + FROM `order` + WHERE created < CURDATE() + AND isPaid = FALSE; + + DELETE c.* + FROM catalogue c + LEFT JOIN `order` o ON o.catalogueFk = c.id + WHERE c.created < CURDATE() + AND o.id IS NULL; +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/floranet/procedures/catalogue_get.sql b/db/routines/floranet/procedures/catalogue_get.sql new file mode 100644 index 000000000..914b5d27f --- /dev/null +++ b/db/routines/floranet/procedures/catalogue_get.sql @@ -0,0 +1,52 @@ +DROP PROCEDURE IF EXISTS floranet.catalogue_get; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE floranet.catalogue_get(vLanded DATE, vPostalCode VARCHAR(15)) +READS SQL DATA +BEGIN +/** + * Returns list, price and all the stuff regarding the floranet items + * + * @param vLanded Delivery date + * @param vPostalCode Delivery address postal code + */ + DECLARE vLastCatalogueFk INT; + + START TRANSACTION; + + SELECT * FROM catalogue FOR UPDATE; + + SELECT MAX(id) INTO vLastCatalogueFk + FROM catalogue; + + INSERT INTO catalogue( + name, + price, + itemFk, + dated, + postalCode, + `type`, + image, + description + ) + SELECT i.name, + i.`size`, + i.id, + vLanded, + vPostalCode, + it.name, + i.image, + i.description + FROM vn.item i + JOIN vn.itemType it ON it.id = i.typeFk + WHERE it.code IN ('FNR','FNP'); + + SELECT * + FROM catalogue + WHERE id > IFNULL(vLastCatalogueFk,0); + + COMMIT; + +END$$ +DELIMITER ; diff --git a/db/routines/floranet/procedures/order_confirm.sql b/db/routines/floranet/procedures/order_confirm.sql new file mode 100644 index 000000000..fed123663 --- /dev/null +++ b/db/routines/floranet/procedures/order_confirm.sql @@ -0,0 +1,25 @@ +DROP PROCEDURE IF EXISTS floranet.order_confirm; + +DELIMITER $$ +$$ + +CREATE DEFINER=`root`@`localhost`PROCEDURE floranet.order_confirm(vCatalogueFk INT) +READS SQL DATA + +BEGIN +/** Update order.isPaid field + * + * @param vCatalogueFk floranet.catalogue.id + * + * @returns floranet.order.isPaid + */ + UPDATE `order` + SET isPaid = TRUE, + payed = NOW() + WHERE catalogueFk = vCatalogueFk; + + SELECT isPaid + FROM `order` + WHERE catalogueFk = vCatalogueFk; +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/floranet/procedures/order_put.sql b/db/routines/floranet/procedures/order_put.sql new file mode 100644 index 000000000..c26cef19a --- /dev/null +++ b/db/routines/floranet/procedures/order_put.sql @@ -0,0 +1,42 @@ +DROP PROCEDURE IF EXISTS floranet.order_put; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE floranet.order_put(vOrder JSON) +READS SQL DATA +BEGIN +/** + * Get and process an order + * + * @param vOrder Data of the order + * + * Customer data: , , + * + * Item data: , + * + * Delivery data: ,
, + * + */ + INSERT IGNORE INTO `order`( + catalogueFk, + customerName, + email, + customerPhone, + message, + deliveryName, + address, + deliveryPhone + ) + VALUES (JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.catalogueFk')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.customerName')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.email')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.customerPhone')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.message')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.deliveryName')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.address')), + JSON_UNQUOTE(JSON_EXTRACT(vOrder,'$.deliveryPhone')) + ); + + SELECT LAST_INSERT_ID() orderFk; +END$$ +DELIMITER ; diff --git a/db/versions/10887-floranet/00-schemaAndUser.sql b/db/versions/10887-floranet/00-schemaAndUser.sql new file mode 100644 index 000000000..34da92550 --- /dev/null +++ b/db/versions/10887-floranet/00-schemaAndUser.sql @@ -0,0 +1,14 @@ + +CREATE SCHEMA IF NOT EXISTS `floranet`; + +CREATE ROLE IF NOT EXISTS 'floranet' ; + +GRANT Create temporary tables ON floranet.* TO 'floranet'; + +GRANT Execute ON floranet.* TO 'floranet'; + +GRANT Lock tables ON floranet.* TO 'floranet'; + +CREATE USER IF NOT EXISTS 'floranet'@'%'; + +GRANT floranet TO floranet@'%'; \ No newline at end of file diff --git a/db/versions/10887-floranet/01-tables.sql b/db/versions/10887-floranet/01-tables.sql new file mode 100644 index 000000000..b63c81c21 --- /dev/null +++ b/db/versions/10887-floranet/01-tables.sql @@ -0,0 +1,61 @@ +CREATE OR REPLACE TABLE floranet.`builder` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `itemFk` int(11) NOT NULL, + `elementFk` int(11) NOT NULL, + `quantity` int(10) unsigned NOT NULL DEFAULT 1, + PRIMARY KEY (`id`), + KEY `builder_FK` (`itemFk`), + KEY `builder_FK_1` (`elementFk`), + CONSTRAINT `builder_FK` FOREIGN KEY (`itemFk`) REFERENCES `vn`.`item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Links handmade products with their elements'; + +CREATE OR REPLACE TABLE floranet.`element` ( + `itemFk` int(11) NOT NULL, + `typeFk` smallint(5) unsigned DEFAULT NULL, + `size` int(11) DEFAULT NULL, + `inkFk` char(3) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL, + `originFk` tinyint(2) unsigned DEFAULT NULL, + `name` varchar(30) DEFAULT NULL, + `quantity` int(11) NOT NULL DEFAULT 1, + PRIMARY KEY (`itemFk`), + KEY `element_FK` (`itemFk`), + KEY `element_FK_1` (`typeFk`), + KEY `element_FK_2` (`inkFk`), + KEY `element_FK_3` (`originFk`), + CONSTRAINT `element_FK` FOREIGN KEY (`itemFk`) REFERENCES `vn`.`item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `element_FK_1` FOREIGN KEY (`typeFk`) REFERENCES `vn`.`itemType` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `element_FK_2` FOREIGN KEY (`inkFk`) REFERENCES `vn`.`ink` (`id`) ON UPDATE CASCADE, + CONSTRAINT `element_FK_3` FOREIGN KEY (`originFk`) REFERENCES `vn`.`origin` (`id`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Filtro para localizar posibles items que coincidan con la descripción'; + +ALTER TABLE floranet.builder ADD CONSTRAINT `builder_FK_1` FOREIGN KEY (`elementFk`) REFERENCES `element` (`itemFk`) ON UPDATE CASCADE; + +CREATE OR REPLACE TABLE floranet.catalogue +(id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50), + price DECIMAL(10,2) NOT NULL, + itemFk INT NOT NULL, + dated DATE, + postalCode VARCHAR(12), + `type` VARCHAR(50), + image VARCHAR(255), + description TEXT, + created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + payed DATETIME, + FOREIGN KEY (itemFk) REFERENCES vn.item(id) ON DELETE RESTRICT ON UPDATE CASCADE); + + +CREATE OR REPLACE TABLE floranet.`order` +(id INT AUTO_INCREMENT PRIMARY KEY, + catalogueFk INT UNIQUE, + customerName VARCHAR(100), + email VARCHAR(100), + customerPhone VARCHAR(15), + message VARCHAR(255), + deliveryName VARCHAR(100), + address VARCHAR(200), + deliveryPhone VARCHAR(100), + isPaid BOOL NOT NULL DEFAULT FALSE, + payed DATETIME, + created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (catalogueFk) REFERENCES catalogue(id) ON DELETE RESTRICT ON UPDATE CASCADE); \ No newline at end of file From 04df5a0ccdf4b1864adf7c1003decbaa54cd1ca4 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 15 Feb 2024 13:52:58 +0100 Subject: [PATCH 039/183] refs #6021 --- db/routines/vn/views/zoneEstimatedDelivery.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/views/zoneEstimatedDelivery.sql b/db/routines/vn/views/zoneEstimatedDelivery.sql index 90c7381d8..c50d3602b 100644 --- a/db/routines/vn/views/zoneEstimatedDelivery.sql +++ b/db/routines/vn/views/zoneEstimatedDelivery.sql @@ -32,7 +32,7 @@ FROM ( ) LEFT JOIN `vn`.`zoneClosure` `zc` ON( `zc`.`zoneFk` = `t`.`zoneFk` - AND `zc`.`dated` = `util`.`VN_CURDATE`() + AND `zc`.`dated` = `util`.`VN_CURDATE`() ) ) LEFT JOIN `cache`.`departure_limit` `dl` ON( From ec9604323dbb0eef440071b57038ecf88186f050 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 15 Feb 2024 13:54:34 +0100 Subject: [PATCH 040/183] commit --- db/routines/vn/views/zoneEstimatedDelivery.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/views/zoneEstimatedDelivery.sql b/db/routines/vn/views/zoneEstimatedDelivery.sql index c50d3602b..90c7381d8 100644 --- a/db/routines/vn/views/zoneEstimatedDelivery.sql +++ b/db/routines/vn/views/zoneEstimatedDelivery.sql @@ -32,7 +32,7 @@ FROM ( ) LEFT JOIN `vn`.`zoneClosure` `zc` ON( `zc`.`zoneFk` = `t`.`zoneFk` - AND `zc`.`dated` = `util`.`VN_CURDATE`() + AND `zc`.`dated` = `util`.`VN_CURDATE`() ) ) LEFT JOIN `cache`.`departure_limit` `dl` ON( From 74136442954aba00717704dedf56b801aba02817 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 15 Feb 2024 14:37:09 +0100 Subject: [PATCH 041/183] contact_request and deliveryDate_get --- .../floranet/procedures/contact_Request.sql | 20 +++++++++++ .../floranet/procedures/deliveryDate_get.sql | 35 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 db/routines/floranet/procedures/contact_Request.sql create mode 100644 db/routines/floranet/procedures/deliveryDate_get.sql diff --git a/db/routines/floranet/procedures/contact_Request.sql b/db/routines/floranet/procedures/contact_Request.sql new file mode 100644 index 000000000..c55348d6f --- /dev/null +++ b/db/routines/floranet/procedures/contact_Request.sql @@ -0,0 +1,20 @@ +DROP PROCEDURE IF EXISTS floranet.contact_Request; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` +PROCEDURE floranet.contact_Request( + vName VARCHAR(100), + vPhone VARCHAR(15), + vEmail VARCHAR(100), + vMessage TEXT) +READS SQL DATA +BEGIN +/** + * Set actions for contact request + * + * @param vPostalCode Delivery address postal code + */ + +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/floranet/procedures/deliveryDate_get.sql b/db/routines/floranet/procedures/deliveryDate_get.sql new file mode 100644 index 000000000..06a8ae1ad --- /dev/null +++ b/db/routines/floranet/procedures/deliveryDate_get.sql @@ -0,0 +1,35 @@ +DROP PROCEDURE IF EXISTS floranet.deliveryDate_get; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE floranet.deliveryDate_get(vPostalCode VARCHAR(15)) +READS SQL DATA +BEGIN +/** + * Returns available dates for this postalCode + * + * @param vPostalCode Delivery address postal code + */ + CREATE OR REPLACE TEMPORARY TABLE tmp.deliveryDate + (dated DATE PRIMARY KEY) + ENGINE = MEMORY; + + IF vPostalCode != "00000" THEN + INSERT INTO tmp.deliveryDate + SET dated = CURDATE() + INTERVAL 1 DAY; + + INSERT INTO tmp.deliveryDate + SET dated = CURDATE() + INTERVAL 2 DAY; + + INSERT INTO tmp.deliveryDate + SET dated = CURDATE() + INTERVAL 4 DAY; + + INSERT INTO tmp.deliveryDate + SET dated = CURDATE() + INTERVAL 7 DAY; + END IF; + + SELECT * FROM tmp.deliveryDate; + + DROP TEMPORARY TABLE tmp.deliveryDate; +END$$ +DELIMITER ; \ No newline at end of file From 24b564f1ce559382d3386b041471110e1d0b6544 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 15 Feb 2024 14:42:06 +0100 Subject: [PATCH 042/183] test --- db/routines/floranet/procedures/contact_Request.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/floranet/procedures/contact_Request.sql b/db/routines/floranet/procedures/contact_Request.sql index c55348d6f..7673c2203 100644 --- a/db/routines/floranet/procedures/contact_Request.sql +++ b/db/routines/floranet/procedures/contact_Request.sql @@ -11,7 +11,7 @@ PROCEDURE floranet.contact_Request( READS SQL DATA BEGIN /** - * Set actions for contact request + * Set actions for contact request. * * @param vPostalCode Delivery address postal code */ From 9f2768c131b6cb04d8fea1ce4fc3d4376c20a6c7 Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 16 Feb 2024 15:51:54 +0100 Subject: [PATCH 043/183] fix: refs #6776 tests --- .../worker/back/methods/worker/setPassword.js | 4 +- .../methods/worker/specs/setPassword.spec.js | 92 +++++++++++++------ modules/worker/front/descriptor/index.spec.js | 1 + 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/modules/worker/back/methods/worker/setPassword.js b/modules/worker/back/methods/worker/setPassword.js index cf9cd4cf2..5571ea1d2 100644 --- a/modules/worker/back/methods/worker/setPassword.js +++ b/modules/worker/back/methods/worker/setPassword.js @@ -33,11 +33,11 @@ module.exports = Self => { } try { - const ishimself = userId === workerId; + const isHimself = userId === workerId; const isSubordinate = await Self.isSubordinate(ctx, workerId, myOptions); const {emailVerified} = await models.VnUser.findById(workerId, {fields: ['emailVerified']}, myOptions); - if (ishimself || (isSubordinate && !emailVerified)) { + if (isHimself || (isSubordinate && !emailVerified)) { await models.VnUser.setPassword(workerId, newPass, myOptions); await models.VnUser.updateAll({id: workerId}, {emailVerified: true}, myOptions); } else diff --git a/modules/worker/back/methods/worker/specs/setPassword.spec.js b/modules/worker/back/methods/worker/specs/setPassword.spec.js index fbb403b24..0f0700561 100644 --- a/modules/worker/back/methods/worker/specs/setPassword.spec.js +++ b/modules/worker/back/methods/worker/specs/setPassword.spec.js @@ -1,31 +1,30 @@ -const UserError = require('vn-loopback/util/user-error'); - -const models = require('vn-loopback/server/server').models; +const {models} = require('vn-loopback/server/server'); describe('worker setPassword()', () => { let ctx; + const newPass = 'H3rn4d3z#'; + const employeeId = 1; + const managerId = 20; + const administrativeId = 5; + beforeAll(() => { ctx = { req: { - accessToken: {}, + accessToken: {userId: managerId}, headers: {origin: 'http://localhost'} }, - args: {workerFk: 9} }; }); - beforeEach(() => { - ctx.req.accessToken.userId = 20; - ctx.args.newPass = 'H3rn4d3z#'; - }); - - it('should change the password', async() => { + it('should change the password if it is a subordinate and the email is not verified', async() => { const tx = await models.Worker.beginTransaction({}); try { const options = {transaction: tx}; - await models.Worker.setPassword(ctx, options); + await models.Worker.setPassword(ctx, employeeId, newPass, options); + const isNewPass = await passHasBeenChanged(employeeId, newPass, options); + expect(isNewPass).toBeTrue(); await tx.rollback(); } catch (e) { await tx.rollback(); @@ -33,29 +32,64 @@ describe('worker setPassword()', () => { } }); - it('should throw an error: Password does not meet requirements', async() => { - const tx = await models.Collection.beginTransaction({}); - ctx.args.newPass = 'Hi'; + it('should not change the password if it is a subordinate and the email is verified', async() => { + const tx = await models.Worker.beginTransaction({}); + try { const options = {transaction: tx}; - await models.Worker.setPassword(ctx, options); + await models.VnUser.updateAll({id: employeeId}, {emailVerified: true}, options); + await models.Worker.setPassword(ctx, employeeId, newPass, options); + + await tx.rollback(); + } catch (e) { + expect(e.message).toEqual(`You don't have enough privileges.`); + await tx.rollback(); + } + }); + + it('should change the password if it is himself', async() => { + const tx = await models.Worker.beginTransaction({}); + + try { + const options = {transaction: tx}; + await models.VnUser.updateAll({id: managerId}, {emailVerified: true}, options); + await models.Worker.setPassword(ctx, managerId, newPass, options); + const isNewPass = await passHasBeenChanged(managerId, newPass, options); + + expect(isNewPass).toBeTrue(); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + } + }); + + it('should not change the password if it is not a subordinate', async() => { + const tx = await models.Worker.beginTransaction({}); + try { + const options = {transaction: tx}; + await models.Worker.setPassword(ctx, administrativeId, newPass, options); + await tx.rollback(); + } catch (e) { + expect(e.message).toEqual(`You don't have enough privileges.`); + await tx.rollback(); + } + }); + + it('should throw an error: Password does not meet requirements', async() => { + const tx = await models.Worker.beginTransaction({}); + const newPass = 'Hi'; + try { + const options = {transaction: tx}; + await models.Worker.setPassword(ctx, employeeId, newPass, options); await tx.rollback(); } catch (e) { expect(e.sqlMessage).toEqual('Password does not meet requirements'); await tx.rollback(); } }); - - it('should throw an error: You don\'t have enough privileges.', async() => { - ctx.req.accessToken.userId = 5; - const tx = await models.Collection.beginTransaction({}); - try { - const options = {transaction: tx}; - await models.Worker.setPassword(ctx, options); - await tx.rollback(); - } catch (e) { - expect(e).toEqual(new UserError(`You don't have enough privileges.`)); - await tx.rollback(); - } - }); }); + +const passHasBeenChanged = async(userId, pass, options) => { + const user = await models.VnUser.findById(userId, null, options); + return user.hasPassword(pass); +}; diff --git a/modules/worker/front/descriptor/index.spec.js b/modules/worker/front/descriptor/index.spec.js index d158a9e8e..4f7fa6a05 100644 --- a/modules/worker/front/descriptor/index.spec.js +++ b/modules/worker/front/descriptor/index.spec.js @@ -16,6 +16,7 @@ describe('vnWorkerDescriptor', () => { const id = 1; const response = 'foo'; + $httpBackend.whenGET('UserConfigs/getUserConfig').respond({}); $httpBackend.expectRoute('GET', `Workers/${id}`).respond(response); controller.id = id; $httpBackend.flush(); From 2e01b6ee0a9ef4a3d187e7589e02a1d6d4a109c2 Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 19 Feb 2024 09:55:54 +0100 Subject: [PATCH 044/183] refactor(packing): refs #6875 add restriction on vn.buy.packing field not null and > 0 --- db/routines/vn/procedures/inventoryMake.sql | 2 +- db/versions/10892-yellowGerbera/00-firstScript.sql | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 db/versions/10892-yellowGerbera/00-firstScript.sql diff --git a/db/routines/vn/procedures/inventoryMake.sql b/db/routines/vn/procedures/inventoryMake.sql index 0def763dc..abf185c9f 100644 --- a/db/routines/vn/procedures/inventoryMake.sql +++ b/db/routines/vn/procedures/inventoryMake.sql @@ -182,7 +182,7 @@ proc: BEGIN LEFT JOIN producer p ON p.id = i.producerFk SET inv.buyingValue = b.buyingValue, inv.freightValue = b.freightValue, - inv.packing = b.packing, + inv.packing = IFNULL(GREATEST(b.packing, 1), 1), inv.`grouping`= b.`grouping`, inv.groupingMode = b.groupingMode, inv.comissionValue = b.comissionValue, diff --git a/db/versions/10892-yellowGerbera/00-firstScript.sql b/db/versions/10892-yellowGerbera/00-firstScript.sql new file mode 100644 index 000000000..4df616f3a --- /dev/null +++ b/db/versions/10892-yellowGerbera/00-firstScript.sql @@ -0,0 +1,12 @@ +-- Place your SQL code here + +UPDATE vn.buy + SET packing = 1 + WHERE packing IS NULL + OR NOT packing + +ALTER TABLE vn.buy MODIFY COLUMN packing int(11) NOT NULL CHECK(packing > 0); + +-- antes tenia '0=sin obligar 1=groping 2=packing' +ALTER TABLE vn.buy MODIFY COLUMN groupingMode tinyint(4) DEFAULT 0 NOT NULL COMMENT '0=sin obligar 1=grouping 2=packing'; + From 9e3b4e84515e832a454b161f7a12f8e63138012c Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 19 Feb 2024 13:30:03 +0100 Subject: [PATCH 045/183] refs #6842 sql mod sage --- .../vn/triggers/invoiceOut_beforeInsert.sql | 12 +++---- db/versions/10893-limeFern/00-sage.sql | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 db/versions/10893-limeFern/00-sage.sql diff --git a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql index 0081c8803..f3a292edd 100644 --- a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql +++ b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql @@ -17,16 +17,16 @@ BEGIN DECLARE vRefLen INT; DECLARE vRefPrefix VARCHAR(255); DECLARE vLastRef VARCHAR(255); - DECLARE vCompanyCode INT; + DECLARE vSage200Company INT; DECLARE vYearLen INT DEFAULT 2; DECLARE vPrefixLen INT; - SELECT companyCode INTO vCompanyCode + SELECT sage200Company INTO vSage200Company FROM company WHERE id = NEW.companyFk; - IF vCompanyCode IS NULL THEN - CALL util.throw('companyCodeNotDefined'); + IF vSage200Company IS NULL THEN + CALL util.throw('vSage200CompanyNotDefined'); END IF; SELECT MAX(i.ref) INTO vLastRef @@ -36,7 +36,7 @@ BEGIN AND i.companyFk = NEW.companyFk; IF vLastRef IS NOT NULL THEN - SET vPrefixLen = LENGTH(NEW.serial) + LENGTH(vCompanyCode) + vYearLen; + SET vPrefixLen = LENGTH(NEW.serial) + LENGTH(vSage200Company) + vYearLen; SET vRefLen = LENGTH(vLastRef) - vPrefixLen; SET vRefPrefix = LEFT(vLastRef, vPrefixLen); SET vRef = RIGHT(vLastRef, vRefLen); @@ -44,7 +44,7 @@ BEGIN SELECT refLen INTO vRefLen FROM invoiceOutConfig; SET vRefPrefix = CONCAT( NEW.serial, - vCompanyCode, + vSage200Company, RIGHT(YEAR(NEW.issued), vYearLen) ); END IF; diff --git a/db/versions/10893-limeFern/00-sage.sql b/db/versions/10893-limeFern/00-sage.sql new file mode 100644 index 000000000..049bb2993 --- /dev/null +++ b/db/versions/10893-limeFern/00-sage.sql @@ -0,0 +1,35 @@ +-- Auto-generated SQL script #202402151810 +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=69; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=567; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=791; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=792; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=965; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=1381; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=1463; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=2142; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=2292; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=2393; +UPDATE vn.company + SET companyGroupFk=NULL + WHERE id=3869; +ALTER TABLE vn.company MODIFY COLUMN sage200Company int(2) DEFAULT NULL NULL COMMENT 'Campo para la serie InvoiceOut'; From 791687f2717ed3aace2f251146a4563b32f05706 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 20 Feb 2024 14:27:22 +0100 Subject: [PATCH 046/183] refs #5878 feat: comments --- db/routines/util/events/vn_scheduler.sql | 4 ++++ db/routines/util/procedures/vn_scheduler.sql | 22 +++++++++++-------- .../vn/triggers/zoneIncluded_afterDelete.sql | 7 +++--- .../vn/triggers/zoneIncluded_beforeInsert.sql | 8 +++---- .../vn/triggers/zoneIncluded_beforeUpdate.sql | 6 ++--- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/db/routines/util/events/vn_scheduler.sql b/db/routines/util/events/vn_scheduler.sql index e25741ac6..2d8457499 100644 --- a/db/routines/util/events/vn_scheduler.sql +++ b/db/routines/util/events/vn_scheduler.sql @@ -4,6 +4,10 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `VN_SCHEDULER` STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY ENABLE DO BEGIN + /** + * Ejecuta el PROCEDURE que comprueba si hay procedimientos planificados para ejecutar + * + */ CALL `VN_SCHEDULER`(); END$$ diff --git a/db/routines/util/procedures/vn_scheduler.sql b/db/routines/util/procedures/vn_scheduler.sql index 1ab72de39..2b65b20b0 100644 --- a/db/routines/util/procedures/vn_scheduler.sql +++ b/db/routines/util/procedures/vn_scheduler.sql @@ -1,20 +1,27 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `util`.`VN_SCHEDULER`() BEGIN +/** + * Ejecuta los procedimientos que se han programado a demanda. + * +*/ DECLARE vDone BOOL; DECLARE vError VARCHAR(255) DEFAULT NULL; DECLARE vErrorCode VARCHAR(255) DEFAULT NULL; DECLARE vSchema VARCHAR(255); DECLARE vStatus VARCHAR(255); DECLARE vProcedure VARCHAR(255); - -- DECLARE vLogMail VARCHAR(255); + DECLARE vScheduleFk INT; -- Obtener datos de la tabla vn_schedules DECLARE vQueue CURSOR FOR SELECT id, `schema`, `procedure`, `status` FROM vn_schedules WHERE status = 'scheduled'; - + DECLARE EXIT HANDLER FOR SQLEXCEPTION + GET DIAGNOSTICS CONDITION 1 + vError = MESSAGE_TEXT, + vErrorCode = RETURNED_SQLSTATE; OPEN vQueue; l: LOOP SET vDone = FALSE; @@ -32,10 +39,7 @@ BEGIN WHERE id = vScheduleFk; SET vError = NULL; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - GET DIAGNOSTICS CONDITION 1 - vError = MESSAGE_TEXT, - vErrorCode = RETURNED_SQLSTATE; + CALL util.exec(CONCAT('CALL `', vSchema ,'`.`', vProcedure ,'`')); @@ -55,14 +59,14 @@ BEGIN UPDATE vn_schedules SET `error` = vError, finished = util.VN_NOW(), - lastFinished = util.VN_NOW() - `errorCode` = vErrorCode + lastFinished = util.VN_NOW(), + `errorCode` = vErrorCode, `status` = 'error' WHERE id = vScheduleFk; ELSE UPDATE vn_schedules SET `error` = vError, - `errorCode` = vErrorCode + `errorCode` = vErrorCode, finished = util.VN_NOW(), lastFinished = util.VN_NOW(), `status` = 'exec' diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index a46ba9060..1a076cd8f 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -9,12 +9,11 @@ BEGIN `changedModelId` = OLD.zoneFk, `userFk` = account.myUser_getId(); - -- Activo el evento 'zone_getCollisions' - -- UPDATE `mysql`.`event` SET status = 1 WHERE name = 'zone_getCollisions'; + -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' + INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) VALUES - (`vn`, `zone_getCollisions`); + ('vn', 'zone_getCollisions'); - -- Insert en vn_schedules 'zone_getCollisions' END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index 810546d91..13d45aa12 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -1,15 +1,15 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeInsert` BEFORE INSERT ON `zoneIncluded` + FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); - -- Activo el evento 'zone_getCollisions' - -- Insert en vn_schedulesla key 'zone_getCollisions' - -- ALTER EVENT zoneCollisions ENABLE; + -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' + INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) VALUES - (`vn`, `zone_getCollisions`); + ('vn', 'zone_getCollisions'); END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index a5e0184b4..f54c55654 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -5,10 +5,10 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp BEGIN SET NEW.editorFk = account.myUser_getId(); - -- Activo el evento 'zone_getCollisions' -- Insert en vn_schedules 'zone_getCollisions' + -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) - VALUES - (`vn`, `zone_getCollisions`); + VALUES + ('vn', 'zone_getCollisions'); END$$ DELIMITER ; From be0e835a37a1985b6d49124f3629344aea9a3ce3 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 20 Feb 2024 14:40:38 +0100 Subject: [PATCH 047/183] refs #5878 feat: remove vn_event_getCollisions --- db/.pullinfo.json | 16 ++++++++++++++++ db/dump/fixtures.before.sql | 2 +- db/routines/util/procedures/vn_scheduler.sql | 12 ------------ db/routines/vn/events/zone_getCollisions.sql | 17 ----------------- 4 files changed, 17 insertions(+), 30 deletions(-) create mode 100644 db/.pullinfo.json delete mode 100644 db/routines/vn/events/zone_getCollisions.sql diff --git a/db/.pullinfo.json b/db/.pullinfo.json new file mode 100644 index 000000000..f4afbc5fb --- /dev/null +++ b/db/.pullinfo.json @@ -0,0 +1,16 @@ +{ + "lastPull": "2024-02-15T08:58:24.000Z", + "shaSums": { + "srt": { + "view": { + "routePalletized": "765f8933a6a5a86dfe8f22825cc77351bc8620cdf1be9d3f25abb130460f3a61", + "ticketPalletized": "c327f3243e717cc607f01d3747967ba68158f90ef1038986b0aa6ae6d5ce7309" + } + }, + "vn": { + "view": { + "expeditionPallet_Print": "288cbd6e8289df083ed5eb1a2c808f7a82ba4c90c8ad9781104808a7a54471fb" + } + } + } +} \ No newline at end of file diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index df2bb6498..53939bfe8 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2818,7 +2818,7 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`) (4, 'supplier-pay-method-update', 'A supplier pay method has been updated'), (5, 'modified-entry', 'An entry has been modified'), (6, 'book-entry-deleted', 'accounting entries deleted'), - (7, 'zone-included','An email to notify zoneCollisions'); + (7, 'zone-included','An email to notify zoneCollisions'); INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) VALUES (1, 9), diff --git a/db/routines/util/procedures/vn_scheduler.sql b/db/routines/util/procedures/vn_scheduler.sql index 2b65b20b0..cd7c629f8 100644 --- a/db/routines/util/procedures/vn_scheduler.sql +++ b/db/routines/util/procedures/vn_scheduler.sql @@ -44,18 +44,6 @@ BEGIN CALL util.exec(CONCAT('CALL `', vSchema ,'`.`', vProcedure ,'`')); IF vError IS NOT NULL THEN - -- IF vLogMail IS NOT NULL THEN - -- CALL vn.mail_insert( - -- vLogMail, - -- NULL, - -- CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'), - -- CONCAT( - -- '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break - -- 'See ', SCHEMA(), '.nightTask table for more info.' - -- ) - -- ); - -- END IF; - UPDATE vn_schedules SET `error` = vError, finished = util.VN_NOW(), diff --git a/db/routines/vn/events/zone_getCollisions.sql b/db/routines/vn/events/zone_getCollisions.sql deleted file mode 100644 index 2437cffc2..000000000 --- a/db/routines/vn/events/zone_getCollisions.sql +++ /dev/null @@ -1,17 +0,0 @@ -DELIMITER $$ - -CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`zoneCollisions` - ON SCHEDULE EVERY 1 DAY - STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY - ON COMPLETION NOT PRESERVE - ENABLE - DO BEGIN - DECLARE vEXEC BOOLEAN DEFAULT FALSE; - SELECT COUNT(*)>0 INTO vEXEC from util.vn_schedules; - - IF vEXEC THEN - CALL `zone_getCollisions`(); - END IF; - END$$ - -DELIMITER ; From 88a88640e5ec8f268f05214f606822e9d2c09e8e Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 21 Feb 2024 14:22:06 +0100 Subject: [PATCH 048/183] refs #5858 feat: sql comments --- db/dump/fixtures.after.sql | 5 ++++- ...nSchedules.sql => 00-createVnSchedules.sql} | 0 .../10881-greenHydrangea/00-firstScript.sql | 18 ------------------ .../01-notification.vn.sql | 10 ---------- .../01-notification.vnx.sql | 10 ---------- 5 files changed, 4 insertions(+), 39 deletions(-) rename db/versions/10881-greenHydrangea/{01-createVnSchedules.sql => 00-createVnSchedules.sql} (100%) delete mode 100644 db/versions/10881-greenHydrangea/00-firstScript.sql delete mode 100644 db/versions/10881-greenHydrangea/01-notification.vn.sql delete mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index 4c5f89d97..1f14278a9 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -70,7 +70,7 @@ UPDATE vn.supplier UPDATE `vn`.`claimRatio` SET `claimAmount` = '10' WHERE (`clientFk` = '1101'); -INSERT INTO `vn`.`agency` (`name`, `warehouseFk`, `isOwn`, `isAnyVolumeAllowed`) +INSERT INTO `vn`.`agency` (`name`, `warehouseFk`, `isOwn`, `isAnyVolumeAllowed`) VALUES ('Agencia', '1', '1', '1'), ('Otra agencia ', '1', '0', '0'); @@ -327,4 +327,7 @@ INSERT INTO mysql.roles_mapping (`User`, `Host`, `Role`, `Admin_option`) FROM mysql.roles_mapping WHERE `User` LIKE @prefixedLike AND `Host` = @genRoleHost; + +TRUNCATE util.vn_schedules; + FLUSH PRIVILEGES; diff --git a/db/versions/10881-greenHydrangea/01-createVnSchedules.sql b/db/versions/10881-greenHydrangea/00-createVnSchedules.sql similarity index 100% rename from db/versions/10881-greenHydrangea/01-createVnSchedules.sql rename to db/versions/10881-greenHydrangea/00-createVnSchedules.sql diff --git a/db/versions/10881-greenHydrangea/00-firstScript.sql b/db/versions/10881-greenHydrangea/00-firstScript.sql deleted file mode 100644 index 1ca77c1a0..000000000 --- a/db/versions/10881-greenHydrangea/00-firstScript.sql +++ /dev/null @@ -1,18 +0,0 @@ - --- UPDATE salix.ACL --- SET principalId='employee' WHERE model ="Notification"; - --- INSERT INTO util.notification (name,description) --- VALUES ('zone-included','An email to notify zoneCollisions'); - --- INSERT INTO util.notificationSubscription (notificationFk,userFk) --- SELECT --- (SELECT id FROM util.notification WHERE name= "zone-included") AS notificationFk, --- (SELECT account.myUser_getId() ) AS userFk; - - --- INSERT INTO util.notificationAcl (notificationFk, roleFk) --- SELECT --- (SELECT id FROM util.notification WHERE name = 'zone-included') AS notificationFk, --- (SELECT id FROM account.role WHERE name = 'system') AS roleFk; - diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql deleted file mode 100644 index 83e2be1d0..000000000 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ /dev/null @@ -1,10 +0,0 @@ --- INSERT INTO util.notification (id, name,description) --- VALUES ( --- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); - --- INSERT INTO util.notificationSubscription (notificationFk,userFk) --- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; - - --- INSERT INTO util.notificationAcl (notificationFk,roleFk) --- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql deleted file mode 100644 index 83e2be1d0..000000000 --- a/db/versions/10881-greenHydrangea/01-notification.vnx.sql +++ /dev/null @@ -1,10 +0,0 @@ --- INSERT INTO util.notification (id, name,description) --- VALUES ( --- (SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); - --- INSERT INTO util.notificationSubscription (notificationFk,userFk) --- SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; - - --- INSERT INTO util.notificationAcl (notificationFk,roleFk) --- SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From dddd482317132011497ffc0f5008266d322829d0 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 21 Feb 2024 14:22:19 +0100 Subject: [PATCH 049/183] refs #5858 test: check vn_schedules --- .../zone/specs/toggleIsIncluded.spec.js | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index 86c04f844..ccd1abb80 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); -describe('zone toggleIsIncluded()', () => { +fdescribe('zone toggleIsIncluded()', () => { beforeAll(async() => { const activeCtx = { accessToken: {userId: 9}, @@ -20,10 +20,12 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; + await validateSchedules('before', options); let result = await models.Zone.toggleIsIncluded(1, 20, true, options); expect(result.isIncluded).toBeTrue(); + await validateSchedules('after', options); await tx.rollback(); } catch (e) { @@ -37,10 +39,12 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; + await validateSchedules('before', options); let result = await models.Zone.toggleIsIncluded(1, 20, false, options); expect(result.isIncluded).toBeFalse(); + await validateSchedules('after', options); await tx.rollback(); } catch (e) { @@ -54,13 +58,14 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; - + await validateSchedules('before', options); await models.Zone.toggleIsIncluded(1, 20, false, options); - let result = await models.Zone.toggleIsIncluded(1, 20, undefined, options); + const result = await models.Zone.toggleIsIncluded(1, 20, undefined, options); expect(result).toEqual({count: 1}); + await validateSchedules('after', options); await tx.rollback(); } catch (e) { await tx.rollback(); @@ -68,3 +73,22 @@ describe('zone toggleIsIncluded()', () => { } }); }); + +async function validateSchedules(step, options = null) { + const querySchedules = `SELECT count(*) count FROM util.vn_schedules;`; + + switch (step) { + case 'before': { + const [{count}] = await models.Application.rawSql(querySchedules, null, options); + + expect(count).toEqual(0); + } + break; + case 'after': { + const [{count}] = await models.Application.rawSql(querySchedules, null, options); + + expect(count).toEqual(1); + } + break; + } +} From 57a1f2a1f66721cdb29739f651a088ad8d65c4f0 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 21 Feb 2024 14:29:20 +0100 Subject: [PATCH 050/183] refs #5858 test: check vn_schedules --- modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index ccd1abb80..a7a2a7808 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; const LoopBackContext = require('loopback-context'); -fdescribe('zone toggleIsIncluded()', () => { +describe('zone toggleIsIncluded()', () => { beforeAll(async() => { const activeCtx = { accessToken: {userId: 9}, From cc90b13668ca6a9261768b79dbc402f35ebb9c0a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 21 Feb 2024 15:05:38 +0100 Subject: [PATCH 051/183] refs #5858 feat: remove unnecesary update --- db/dump/fixtures.before.sql | 3 --- 1 file changed, 3 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 53939bfe8..c5e016d1b 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -3066,9 +3066,6 @@ INSERT INTO `vn`.`clientSms` (`id`, `clientFk`, `smsFk`, `ticketFk`) (13, 1101, 1, NULL), (14, 1101, 4, 27); -UPDATE salix.ACL - SET principalId='employee' WHERE model ="Notification"; - INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentInstruccions,specialAgreements,companyFk,addressToFk,addressFromFk,supplierFk,packagesList,merchandiseDetail,state) VALUES (1,'123456A','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',442,1,2,1,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'), (2,'123456N','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet',69,3,4,2,'Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet','Lorem ipsum dolor sit amet'), From 838effadc03f99e3e994584a1c320c0f35226146 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 21 Feb 2024 15:18:10 +0100 Subject: [PATCH 052/183] refs #5858 feat: move change to vnx --- .../10881-greenHydrangea/01-notification.vnx.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql new file mode 100644 index 000000000..d05902461 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vnx.sql @@ -0,0 +1,10 @@ +INSERT INTO util.notification (id, name,description) + VALUES ( +(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); + +INSERT INTO util.notificationSubscription (notificationFk,userFk) + SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; + + +INSERT INTO util.notificationAcl (notificationFk,roleFk) + SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 744dd61561af56ad76771a59612ee8ba86bc6bbc Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 22 Feb 2024 15:42:54 +0100 Subject: [PATCH 053/183] fix: refs #6744 create setUnverifiedPassword --- loopback/locale/en.json | 3 ++- loopback/locale/es.json | 3 ++- modules/account/back/models/account.js | 11 +++++++++++ .../worker/back/methods/worker/setPassword.js | 15 ++++----------- .../methods/worker/specs/setPassword.spec.js | 18 +----------------- modules/worker/front/descriptor/index.html | 2 +- modules/worker/front/descriptor/index.js | 7 ++----- 7 files changed, 23 insertions(+), 36 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 2187371cd..39596467c 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -209,5 +209,6 @@ "You cannot update these fields": "You cannot update these fields", "CountryFK cannot be empty": "Country cannot be empty", "You are not allowed to modify the alias": "You are not allowed to modify the alias", - "You already have the mailAlias": "You already have the mailAlias" + "You already have the mailAlias": "You already have the mailAlias", + "The email has been already verified": "The email has been already verified" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index aea0c311c..d36348472 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -344,5 +344,6 @@ "CountryFK cannot be empty": "El país no puede estar vacío", "Cmr file does not exist": "El archivo del cmr no existe", "You are not allowed to modify the alias": "No estás autorizado a modificar el alias", - "No tickets to invoice": "No hay tickets para facturar" + "No tickets to invoice": "No hay tickets para facturar", + "The email has been already verified": "El correo ya ha sido verificado" } diff --git a/modules/account/back/models/account.js b/modules/account/back/models/account.js index 5021a5d94..7c97711d0 100644 --- a/modules/account/back/models/account.js +++ b/modules/account/back/models/account.js @@ -1,4 +1,7 @@ +const ForbiddenError = require('vn-loopback/util/forbiddenError'); +const {models} = require('vn-loopback/server/server'); + module.exports = Self => { require('../methods/account/sync')(Self); require('../methods/account/sync-by-id')(Self); @@ -7,4 +10,12 @@ module.exports = Self => { require('../methods/account/logout')(Self); require('../methods/account/change-password')(Self); require('../methods/account/set-password')(Self); + + Self.setUnverifiedPassword = async(id, pass, options) => { + const user = await models.VnUser.findById(id, null, options); + if (user.emailVerified) throw new ForbiddenError('The email has been already verified'); + + await models.VnUser.setPassword(id, pass, options); + await user.updateAttribute('emailVerified', true, options); + }; }; diff --git a/modules/worker/back/methods/worker/setPassword.js b/modules/worker/back/methods/worker/setPassword.js index 5571ea1d2..e6bdfb364 100644 --- a/modules/worker/back/methods/worker/setPassword.js +++ b/modules/worker/back/methods/worker/setPassword.js @@ -19,8 +19,7 @@ module.exports = Self => { verb: 'PATCH' } }); - Self.setPassword = async(ctx, workerId, newPass, options) => { - const userId = ctx.req.accessToken.userId; + Self.setPassword = async(ctx, id, newPass, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -31,17 +30,11 @@ module.exports = Self => { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } - try { - const isHimself = userId === workerId; - const isSubordinate = await Self.isSubordinate(ctx, workerId, myOptions); - const {emailVerified} = await models.VnUser.findById(workerId, {fields: ['emailVerified']}, myOptions); + const isSubordinate = await Self.isSubordinate(ctx, id, myOptions); + if (!isSubordinate) throw new UserError('You don\'t have enough privileges.'); - if (isHimself || (isSubordinate && !emailVerified)) { - await models.VnUser.setPassword(workerId, newPass, myOptions); - await models.VnUser.updateAll({id: workerId}, {emailVerified: true}, myOptions); - } else - throw new UserError('You don\'t have enough privileges.'); + await models.Account.setUnverifiedPassword(id, newPass, myOptions); if (tx) await tx.commit(); } catch (e) { diff --git a/modules/worker/back/methods/worker/specs/setPassword.spec.js b/modules/worker/back/methods/worker/specs/setPassword.spec.js index 0f0700561..d2daec103 100644 --- a/modules/worker/back/methods/worker/specs/setPassword.spec.js +++ b/modules/worker/back/methods/worker/specs/setPassword.spec.js @@ -42,23 +42,7 @@ describe('worker setPassword()', () => { await tx.rollback(); } catch (e) { - expect(e.message).toEqual(`You don't have enough privileges.`); - await tx.rollback(); - } - }); - - it('should change the password if it is himself', async() => { - const tx = await models.Worker.beginTransaction({}); - - try { - const options = {transaction: tx}; - await models.VnUser.updateAll({id: managerId}, {emailVerified: true}, options); - await models.Worker.setPassword(ctx, managerId, newPass, options); - const isNewPass = await passHasBeenChanged(managerId, newPass, options); - - expect(isNewPass).toBeTrue(); - await tx.rollback(); - } catch (e) { + expect(e.message).toEqual(`The email has been already verified`); await tx.rollback(); } }); diff --git a/modules/worker/front/descriptor/index.html b/modules/worker/front/descriptor/index.html index 67776ce47..73332efac 100644 --- a/modules/worker/front/descriptor/index.html +++ b/modules/worker/front/descriptor/index.html @@ -11,7 +11,7 @@ ? 'Click to allow the user to be disabled' : 'Click to exclude the user from getting disabled'}} - + Change password diff --git a/modules/worker/front/descriptor/index.js b/modules/worker/front/descriptor/index.js index 3cbeb2c55..d7962369c 100644 --- a/modules/worker/front/descriptor/index.js +++ b/modules/worker/front/descriptor/index.js @@ -5,9 +5,6 @@ class Controller extends Descriptor { constructor($element, $, $rootScope) { super($element, $); this.$rootScope = $rootScope; - - this.$http.get(`UserConfigs/getUserConfig`) - .then(res => this.userFk = res.data.userFk); } get worker() { @@ -93,11 +90,11 @@ class Controller extends Descriptor { `Workers/${this.entity.id}/setPassword`, {newPass: this.newPassword} ) .then(() => { this.vnApp.showSuccess(this.$translate.instant('Password changed!')); - }); + }).then(() => this.loadData()); } } -Controller.$inject = ['$element', '$scope', '$rootScope']; +Controller.$inject = ['$element', '$scope', '$rootScope', 'vnConfig']; ngModule.vnComponent('vnWorkerDescriptor', { template: require('./index.html'), From 3bf25e5759ce1169c83d03a1c9c46c71aebcdd38 Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 23 Feb 2024 09:31:01 +0100 Subject: [PATCH 054/183] fix: refs #6744 locale --- loopback/locale/en.json | 2 +- loopback/locale/es.json | 2 +- modules/account/back/models/account.js | 2 +- modules/worker/back/methods/worker/specs/setPassword.spec.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 39596467c..efcf0ef31 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -210,5 +210,5 @@ "CountryFK cannot be empty": "Country cannot be empty", "You are not allowed to modify the alias": "You are not allowed to modify the alias", "You already have the mailAlias": "You already have the mailAlias", - "The email has been already verified": "The email has been already verified" + "This password can only be changed by the user themselves": "This password can only be changed by the user themselves" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index d36348472..64832553b 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -345,5 +345,5 @@ "Cmr file does not exist": "El archivo del cmr no existe", "You are not allowed to modify the alias": "No estás autorizado a modificar el alias", "No tickets to invoice": "No hay tickets para facturar", - "The email has been already verified": "El correo ya ha sido verificado" + "This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario" } diff --git a/modules/account/back/models/account.js b/modules/account/back/models/account.js index 7c97711d0..dd04182f6 100644 --- a/modules/account/back/models/account.js +++ b/modules/account/back/models/account.js @@ -13,7 +13,7 @@ module.exports = Self => { Self.setUnverifiedPassword = async(id, pass, options) => { const user = await models.VnUser.findById(id, null, options); - if (user.emailVerified) throw new ForbiddenError('The email has been already verified'); + if (user.emailVerified) throw new ForbiddenError('This password can only be changed by the user themselves'); await models.VnUser.setPassword(id, pass, options); await user.updateAttribute('emailVerified', true, options); diff --git a/modules/worker/back/methods/worker/specs/setPassword.spec.js b/modules/worker/back/methods/worker/specs/setPassword.spec.js index d2daec103..03cbee03b 100644 --- a/modules/worker/back/methods/worker/specs/setPassword.spec.js +++ b/modules/worker/back/methods/worker/specs/setPassword.spec.js @@ -42,7 +42,7 @@ describe('worker setPassword()', () => { await tx.rollback(); } catch (e) { - expect(e.message).toEqual(`The email has been already verified`); + expect(e.message).toEqual(`This password can only be changed by the user themselves`); await tx.rollback(); } }); From a078de95210a4e99aba1cffea2050761312d0445 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 26 Feb 2024 06:51:19 +0100 Subject: [PATCH 055/183] refs #6930 feat: return multimediaToken when login --- back/models/vn-user.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/back/models/vn-user.js b/back/models/vn-user.js index 3a416d7e3..e1bce7c06 100644 --- a/back/models/vn-user.js +++ b/back/models/vn-user.js @@ -167,7 +167,11 @@ module.exports = function(Self) { console.warn(err); } - return {token: token.id, ttl: token.ttl}; + const multimediaToken = await token.user().accessTokens.create({ + scopes: ['read:multimedia'] + }); + + return {token: token.id, ttl: token.ttl, multimediaToken}; }; Self.userUses = function(user) { From ae0ce8e49a7dec0e6cc7cdef044852f107a5fd3b Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 26 Feb 2024 06:53:30 +0100 Subject: [PATCH 056/183] refs #6930 feat: use tokenMultimedia intead tokenUser --- front/core/services/auth.js | 2 +- front/core/services/token.js | 15 ++++++++++----- front/salix/components/layout/index.js | 3 +-- front/salix/components/log/index.html | 4 ++-- front/salix/module.js | 2 +- modules/client/front/balance/index/index.html | 2 +- .../invoiceOut/front/descriptor-menu/index.html | 2 +- modules/invoiceOut/front/index/index.js | 2 +- modules/route/front/index/index.js | 2 +- 9 files changed, 19 insertions(+), 15 deletions(-) diff --git a/front/core/services/auth.js b/front/core/services/auth.js index 844a5145d..0253eb3c3 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -83,7 +83,7 @@ export default class Auth { } onLoginOk(json, now, remember) { - this.vnToken.set(json.data.token, now, json.data.ttl, remember); + this.vnToken.set(json.data.token, json.data.multimediaToken.id, now, json.data.ttl, remember); return this.loadAcls().then(() => { let continueHash = this.$state.params.continue; diff --git a/front/core/services/token.js b/front/core/services/token.js index c8cb4f6bb..125de6b9a 100644 --- a/front/core/services/token.js +++ b/front/core/services/token.js @@ -24,21 +24,22 @@ export default class Token { } catch (e) {} } - set(token, created, ttl, remember) { + set(token, tokenMultimedia, created, ttl, remember) { this.unset(); Object.assign(this, { token, + tokenMultimedia, created, ttl, remember }); - this.vnInterceptor.setToken(token); + this.vnInterceptor.setToken(token, tokenMultimedia); try { if (remember) - this.setStorage(localStorage, token, created, ttl); + this.setStorage(localStorage, token, tokenMultimedia, created, ttl); else - this.setStorage(sessionStorage, token, created, ttl); + this.setStorage(sessionStorage, token, tokenMultimedia, created, ttl); } catch (err) { console.error(err); } @@ -46,6 +47,7 @@ export default class Token { unset() { this.token = null; + this.tokenMultimedia = null; this.created = null; this.ttl = null; this.remember = null; @@ -57,13 +59,15 @@ export default class Token { getStorage(storage) { this.token = storage.getItem('vnToken'); + this.tokenMultimedia = storage.getItem('vnTokenMultimedia'); if (!this.token) return; const created = storage.getItem('vnTokenCreated'); this.created = created && new Date(created); this.ttl = storage.getItem('vnTokenTtl'); } - setStorage(storage, token, created, ttl) { + setStorage(storage, token, tokenMultimedia, created, ttl) { + storage.setItem('vnTokenMultimedia', tokenMultimedia); storage.setItem('vnToken', token); storage.setItem('vnTokenCreated', created.toJSON()); storage.setItem('vnTokenTtl', ttl); @@ -71,6 +75,7 @@ export default class Token { removeStorage(storage) { storage.removeItem('vnToken'); + storage.removeItem('vnTokenMultimedia'); storage.removeItem('vnTokenCreated'); storage.removeItem('vnTokenTtl'); } diff --git a/front/salix/components/layout/index.js b/front/salix/components/layout/index.js index 89912d4e3..e935c6d99 100644 --- a/front/salix/components/layout/index.js +++ b/front/salix/components/layout/index.js @@ -23,8 +23,7 @@ export class Layout extends Component { if (!this.$.$root.user) return; const userId = this.$.$root.user.id; - const token = this.vnToken.token; - return `/api/Images/user/160x160/${userId}/download?access_token=${token}`; + return `/api/Images/user/160x160/${userId}/download?access_token=${this.vnToken.tokenMultimedia}`; } refresh() { diff --git a/front/salix/components/log/index.html b/front/salix/components/log/index.html index c75030100..a3aaf0011 100644 --- a/front/salix/components/log/index.html +++ b/front/salix/components/log/index.html @@ -31,7 +31,7 @@ ng-click="$ctrl.showDescriptor($event, userLog)"> + ng-src="/api/Images/user/160x160/{{::userLog.userFk}}/download?access_token={{::$ctrl.vnToken.tokenMultimedia}}">
@@ -181,7 +181,7 @@ val="{{::nickname}}"> + ng-src="/api/Images/user/160x160/{{::id}}/download?access_token={{::$ctrl.vnToken.tokenMultimedia}}">
diff --git a/front/salix/module.js b/front/salix/module.js index 0ce855308..53b718427 100644 --- a/front/salix/module.js +++ b/front/salix/module.js @@ -13,7 +13,7 @@ export function run($window, $rootScope, vnAuth, vnApp, vnToken, $state) { if (!collection || !size || !id) return; const basePath = `/api/Images/${collection}/${size}/${id}`; - return `${basePath}/download?access_token=${vnToken.token}`; + return `${basePath}/download?access_token=${vnToken.tokenMultimedia}`; }; $window.validations = {}; diff --git a/modules/client/front/balance/index/index.html b/modules/client/front/balance/index/index.html index faf772c2d..34524d2f3 100644 --- a/modules/client/front/balance/index/index.html +++ b/modules/client/front/balance/index/index.html @@ -114,7 +114,7 @@ + href="api/InvoiceOuts/{{::balance.id}}/download?access_token={{::$ctrl.vnToken.tokenMultimedia}}"> diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html index 435db3612..e26650e10 100644 --- a/modules/invoiceOut/front/descriptor-menu/index.html +++ b/modules/invoiceOut/front/descriptor-menu/index.html @@ -37,7 +37,7 @@ diff --git a/modules/invoiceOut/front/index/index.js b/modules/invoiceOut/front/index/index.js index 2cde3c940..403c51d58 100644 --- a/modules/invoiceOut/front/index/index.js +++ b/modules/invoiceOut/front/index/index.js @@ -25,7 +25,7 @@ export default class Controller extends Section { openPdf() { if (this.checked.length <= 1) { const [invoiceOutId] = this.checked; - const url = `api/InvoiceOuts/${invoiceOutId}/download?access_token=${this.vnToken.token}`; + const url = `api/InvoiceOuts/${invoiceOutId}/download?access_token=${this.vnToken.tokenMultimedia}`; window.open(url, '_blank'); } else { const invoiceOutIds = this.checked; diff --git a/modules/route/front/index/index.js b/modules/route/front/index/index.js index 7c19a26cd..0c5dfe7f3 100644 --- a/modules/route/front/index/index.js +++ b/modules/route/front/index/index.js @@ -40,7 +40,7 @@ export default class Controller extends Section { const stringRoutesIds = routesIds.join(','); if (this.checked.length <= 1) { - const url = `api/Routes/${stringRoutesIds}/driver-route-pdf?access_token=${this.vnToken.token}`; + const url = `api/Routes/${stringRoutesIds}/driver-route-pdf?access_token=${this.vnToken.tokenMultimedia}`; window.open(url, '_blank'); } else { const serializedParams = this.$httpParamSerializer({ From 04086e37eeffe433d0ed26a85d7c78ab8eb80330 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 26 Feb 2024 06:57:17 +0100 Subject: [PATCH 057/183] refs #6930 feat: add accessScopes: ['read:multimedia'] forEarch method --- back/methods/dms/downloadFile.js | 3 ++- back/methods/docuware/download.js | 3 ++- back/methods/image/download.js | 3 ++- modules/claim/back/methods/claim/downloadFile.js | 3 ++- modules/invoiceOut/back/methods/invoiceOut/download.js | 3 ++- modules/invoiceOut/back/methods/invoiceOut/downloadZip.js | 3 ++- modules/item/back/methods/item-image-queue/download.js | 1 + modules/route/back/methods/route/downloadCmrsZip.js | 3 ++- modules/route/back/methods/route/downloadZip.js | 3 ++- modules/route/back/methods/route/driverRoutePdf.js | 4 +++- modules/worker/back/methods/worker-dms/downloadFile.js | 3 ++- 11 files changed, 22 insertions(+), 10 deletions(-) diff --git a/back/methods/dms/downloadFile.js b/back/methods/dms/downloadFile.js index 1b9150053..d64b15b70 100644 --- a/back/methods/dms/downloadFile.js +++ b/back/methods/dms/downloadFile.js @@ -29,7 +29,8 @@ module.exports = Self => { http: { path: `/:id/downloadFile`, verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadFile = async function(ctx, id) { diff --git a/back/methods/docuware/download.js b/back/methods/docuware/download.js index a0d72ce01..a1776cde5 100644 --- a/back/methods/docuware/download.js +++ b/back/methods/docuware/download.js @@ -42,7 +42,8 @@ module.exports = Self => { http: { path: `/:id/download`, verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.download = async function(id, fileCabinet, filter) { diff --git a/back/methods/image/download.js b/back/methods/image/download.js index 2b1a4b546..201e16164 100644 --- a/back/methods/image/download.js +++ b/back/methods/image/download.js @@ -47,7 +47,8 @@ module.exports = Self => { http: { path: `/:collection/:size/:id/download`, verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.download = async function(ctx, collection, size, id) { diff --git a/modules/claim/back/methods/claim/downloadFile.js b/modules/claim/back/methods/claim/downloadFile.js index 750356b0b..61784f39e 100644 --- a/modules/claim/back/methods/claim/downloadFile.js +++ b/modules/claim/back/methods/claim/downloadFile.js @@ -32,7 +32,8 @@ module.exports = Self => { http: { path: `/:id/downloadFile`, verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadFile = async function(ctx, id) { diff --git a/modules/invoiceOut/back/methods/invoiceOut/download.js b/modules/invoiceOut/back/methods/invoiceOut/download.js index 4c76f7c07..cb71121d5 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/download.js +++ b/modules/invoiceOut/back/methods/invoiceOut/download.js @@ -31,7 +31,8 @@ module.exports = Self => { http: { path: '/:id/download', verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.download = async function(ctx, id, options) { diff --git a/modules/invoiceOut/back/methods/invoiceOut/downloadZip.js b/modules/invoiceOut/back/methods/invoiceOut/downloadZip.js index fe005f1ab..4f2a8aab3 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/downloadZip.js +++ b/modules/invoiceOut/back/methods/invoiceOut/downloadZip.js @@ -31,7 +31,8 @@ module.exports = Self => { http: { path: '/downloadZip', verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadZip = async function(ctx, ids, options) { diff --git a/modules/item/back/methods/item-image-queue/download.js b/modules/item/back/methods/item-image-queue/download.js index eb952daa4..e1bc248ae 100644 --- a/modules/item/back/methods/item-image-queue/download.js +++ b/modules/item/back/methods/item-image-queue/download.js @@ -11,6 +11,7 @@ module.exports = Self => { path: `/download`, verb: 'POST', }, + accessScopes: ['read:multimedia'] }); Self.download = async() => { diff --git a/modules/route/back/methods/route/downloadCmrsZip.js b/modules/route/back/methods/route/downloadCmrsZip.js index 58445f6f1..43f6e9648 100644 --- a/modules/route/back/methods/route/downloadCmrsZip.js +++ b/modules/route/back/methods/route/downloadCmrsZip.js @@ -29,7 +29,8 @@ module.exports = Self => { http: { path: '/downloadCmrsZip', verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadCmrsZip = async function(ctx, ids, options) { diff --git a/modules/route/back/methods/route/downloadZip.js b/modules/route/back/methods/route/downloadZip.js index 597f1d1f6..d7fc30aa3 100644 --- a/modules/route/back/methods/route/downloadZip.js +++ b/modules/route/back/methods/route/downloadZip.js @@ -29,7 +29,8 @@ module.exports = Self => { http: { path: '/downloadZip', verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadZip = async function(ctx, id, options) { diff --git a/modules/route/back/methods/route/driverRoutePdf.js b/modules/route/back/methods/route/driverRoutePdf.js index f0cd75f0e..e7b4dee17 100644 --- a/modules/route/back/methods/route/driverRoutePdf.js +++ b/modules/route/back/methods/route/driverRoutePdf.js @@ -34,7 +34,9 @@ module.exports = Self => { http: { path: '/:id/driver-route-pdf', verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] + }); Self.driverRoutePdf = (ctx, id) => Self.printReport(ctx, id, 'driver-route'); diff --git a/modules/worker/back/methods/worker-dms/downloadFile.js b/modules/worker/back/methods/worker-dms/downloadFile.js index cc8653e0e..08fbcf924 100644 --- a/modules/worker/back/methods/worker-dms/downloadFile.js +++ b/modules/worker/back/methods/worker-dms/downloadFile.js @@ -29,7 +29,8 @@ module.exports = Self => { http: { path: `/:id/downloadFile`, verb: 'GET' - } + }, + accessScopes: ['read:multimedia'] }); Self.downloadFile = async function(ctx, id) { From f2ad06918692e3a1474f10660d8ea31e720d224d Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 27 Feb 2024 14:26:54 +0100 Subject: [PATCH 058/183] refs 6930 feat: get multimediaToken from new method --- back/methods/vn-user/share-token.js | 27 ++ .../methods/vn-user/specs/share-token.spec.js | 27 ++ back/models/vn-user.js | 7 +- back/models/vn-user.json | 247 +++++++++--------- front/core/services/auth.js | 21 +- 5 files changed, 197 insertions(+), 132 deletions(-) create mode 100644 back/methods/vn-user/share-token.js create mode 100644 back/methods/vn-user/specs/share-token.spec.js diff --git a/back/methods/vn-user/share-token.js b/back/methods/vn-user/share-token.js new file mode 100644 index 000000000..8efa22db4 --- /dev/null +++ b/back/methods/vn-user/share-token.js @@ -0,0 +1,27 @@ + +module.exports = Self => { + Self.remoteMethodCtx('shareToken', { + description: 'Returns token to view files or images and share it', + accessType: 'WRITE', + accepts: [], + returns: { + type: 'Object', + root: true + }, + http: { + path: `/shareToken`, + verb: 'GET' + } + }); + + Self.shareToken = async function(ctx) { + const {accessToken: token} = ctx.req; + + const user = await Self.findById(token.userId); + const multimediaToken = await user.accessTokens.create({ + scopes: ['read:multimedia'] + }); + + return {multimediaToken}; + }; +}; diff --git a/back/methods/vn-user/specs/share-token.spec.js b/back/methods/vn-user/specs/share-token.spec.js new file mode 100644 index 000000000..4d113f10a --- /dev/null +++ b/back/methods/vn-user/specs/share-token.spec.js @@ -0,0 +1,27 @@ +const {models} = require('vn-loopback/server/server'); +fdescribe('Share Token', () => { + let ctx = null; + beforeAll(async() => { + const unAuthCtx = { + req: { + headers: {}, + connection: { + remoteAddress: '127.0.0.1' + }, + getLocale: () => 'en' + }, + args: {} + }; + let login = await models.VnUser.signIn(unAuthCtx, 'salesAssistant', 'nightmare'); + let accessToken = await models.AccessToken.findById(login.token); + ctx = {req: {accessToken: accessToken}}; + }); + + it('should renew token', async() => { + const multimediaToken = await models.VnUser.shareToken(ctx); + + expect(Object.keys(multimediaToken).length).toEqual(1); + expect(multimediaToken.multimediaToken.userId).toEqual(ctx.req.accessToken.userId); + expect(multimediaToken.multimediaToken.scopes[0]).toEqual('read:multimedia'); + }); +}); diff --git a/back/models/vn-user.js b/back/models/vn-user.js index e1bce7c06..b59f13ffa 100644 --- a/back/models/vn-user.js +++ b/back/models/vn-user.js @@ -13,6 +13,7 @@ module.exports = function(Self) { require('../methods/vn-user/privileges')(Self); require('../methods/vn-user/validate-auth')(Self); require('../methods/vn-user/renew-token')(Self); + require('../methods/vn-user/share-token')(Self); require('../methods/vn-user/update-user')(Self); Self.definition.settings.acls = Self.definition.settings.acls.filter(acl => acl.property !== 'create'); @@ -167,11 +168,7 @@ module.exports = function(Self) { console.warn(err); } - const multimediaToken = await token.user().accessTokens.create({ - scopes: ['read:multimedia'] - }); - - return {token: token.id, ttl: token.ttl, multimediaToken}; + return {token: token.id, ttl: token.ttl}; }; Self.userUses = function(user) { diff --git a/back/models/vn-user.json b/back/models/vn-user.json index 639603643..5f6ac3f47 100644 --- a/back/models/vn-user.json +++ b/back/models/vn-user.json @@ -1,129 +1,140 @@ { - "name": "VnUser", - "base": "User", - "validateUpsert": true, - "options": { - "mysql": { - "table": "account.user" - } - }, + "name": "VnUser", + "base": "User", + "validateUpsert": true, + "options": { + "mysql": { + "table": "account.user" + } + }, "mixins": { "Loggable": true }, "resetPasswordTokenTTL": "604800", - "properties": { - "id": { - "type": "number", - "id": true - }, + "properties": { + "id": { + "type": "number", + "id": true + }, "name": { - "type": "string", - "required": true - }, - "username": { - "type": "string" - }, - "roleFk": { - "type": "number", - "mysql": { - "columnName": "role" - } - }, - "nickname": { - "type": "string" - }, - "lang": { - "type": "string" - }, - "active": { - "type": "boolean" - }, - "email": { - "type": "string" - }, - "emailVerified": { - "type": "boolean" - }, - "created": { - "type": "date" - }, - "updated": { - "type": "date" - }, - "image": { - "type": "string" - }, - "hasGrant": { - "type": "boolean" - }, + "type": "string", + "required": true + }, + "username": { + "type": "string" + }, + "roleFk": { + "type": "number", + "mysql": { + "columnName": "role" + } + }, + "nickname": { + "type": "string" + }, + "lang": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "created": { + "type": "date" + }, + "updated": { + "type": "date" + }, + "image": { + "type": "string" + }, + "hasGrant": { + "type": "boolean" + }, "passExpired": { "type": "date" }, - "twoFactor": { - "type": "string" - } - }, - "relations": { - "role": { - "type": "belongsTo", - "model": "VnRole", - "foreignKey": "roleFk" - }, - "roles": { - "type": "hasMany", - "model": "RoleRole", - "foreignKey": "role", - "primaryKey": "roleFk" - }, - "emailUser": { - "type": "hasOne", - "model": "EmailUser", - "foreignKey": "userFk" - }, - "worker": { - "type": "hasOne", - "model": "Worker", - "foreignKey": "id" - }, - "userConfig": { - "type": "hasOne", - "model": "UserConfig", - "foreignKey": "userFk" - } - }, - "acls": [ - { - "property": "signIn", - "accessType": "EXECUTE", - "principalType": "ROLE", - "principalId": "$everyone", - "permission": "ALLOW" - }, { - "property": "recoverPassword", - "accessType": "EXECUTE", - "principalType": "ROLE", - "principalId": "$everyone", - "permission": "ALLOW" - }, { - "property": "validateAuth", - "accessType": "EXECUTE", - "principalType": "ROLE", - "principalId": "$everyone", - "permission": "ALLOW" - }, { - "property": "privileges", - "accessType": "*", - "principalType": "ROLE", - "principalId": "$authenticated", - "permission": "ALLOW" - }, { - "property": "renewToken", - "accessType": "WRITE", - "principalType": "ROLE", - "principalId": "$authenticated", - "permission": "ALLOW" - } - ], + "twoFactor": { + "type": "string" + } + }, + "relations": { + "role": { + "type": "belongsTo", + "model": "VnRole", + "foreignKey": "roleFk" + }, + "roles": { + "type": "hasMany", + "model": "RoleRole", + "foreignKey": "role", + "primaryKey": "roleFk" + }, + "emailUser": { + "type": "hasOne", + "model": "EmailUser", + "foreignKey": "userFk" + }, + "worker": { + "type": "hasOne", + "model": "Worker", + "foreignKey": "id" + }, + "userConfig": { + "type": "hasOne", + "model": "UserConfig", + "foreignKey": "userFk" + } + }, + "acls": [ + { + "property": "signIn", + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }, + { + "property": "recoverPassword", + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }, + { + "property": "validateAuth", + "accessType": "EXECUTE", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }, + { + "property": "privileges", + "accessType": "*", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + }, + { + "property": "renewToken", + "accessType": "WRITE", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + }, + { + "property": "shareToken", + "accessType": "WRITE", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ], "scopes": { "preview": { "fields": [ @@ -140,7 +151,7 @@ "hasGrant", "realm", "email", - "emailVerified" + "emailVerified" ] } } diff --git a/front/core/services/auth.js b/front/core/services/auth.js index 0253eb3c3..a734e076e 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -83,15 +83,18 @@ export default class Auth { } onLoginOk(json, now, remember) { - this.vnToken.set(json.data.token, json.data.multimediaToken.id, now, json.data.ttl, remember); - - return this.loadAcls().then(() => { - let continueHash = this.$state.params.continue; - if (continueHash) - this.$window.location = continueHash; - else - this.$state.go('home'); - }); + return this.$http.get('VnUsers/ShareToken', { + headers: {Authorization: json.data.token} + }).then(({data}) => { + this.vnToken.set(json.data.token, data.multimediaToken.id, now, json.data.ttl, remember); + this.loadAcls().then(() => { + let continueHash = this.$state.params.continue; + if (continueHash) + this.$window.location = continueHash; + else + this.$state.go('home'); + }); + }).catch(() => {}); } logout() { From fdc5ea244f93b9cfb62d98b964fc45e33d11ef04 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 28 Feb 2024 10:43:07 +0100 Subject: [PATCH 059/183] refs 6930 feat: implements logout in front side --- front/core/services/auth.js | 23 +++++++++++++---------- front/core/services/interceptor.js | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/front/core/services/auth.js b/front/core/services/auth.js index a734e076e..e51a2ff12 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -98,17 +98,20 @@ export default class Auth { } logout() { - let promise = this.$http.post('VnUsers/logout', null, { - headers: {Authorization: this.vnToken.token} - }).catch(() => {}); + this.$http.post('VnUsers/logoutMultimedia', null, {headers: {'Authorization': this.vnToken.tokenMultimedia}, + }).then(({data}) => { + if (data) { + this.$http.post('VnUsers/logout', null, { + headers: {Authorization: this.vnToken.token} + }).catch(() => {}); - this.vnToken.unset(); - this.loggedIn = false; - this.vnModules.reset(); - this.aclService.reset(); - this.$state.go('login'); - - return promise; + this.vnToken.unset(); + this.loggedIn = false; + this.vnModules.reset(); + this.aclService.reset(); + this.$state.go('login'); + } + }); } loadAcls() { diff --git a/front/core/services/interceptor.js b/front/core/services/interceptor.js index 0c3253c69..90d813ed4 100644 --- a/front/core/services/interceptor.js +++ b/front/core/services/interceptor.js @@ -19,7 +19,7 @@ function interceptor($q, vnApp, $translate) { if (config.url.charAt(0) !== '/' && apiPath) config.url = `${apiPath}${config.url}`; - if (token) + if (token && !config.headers.Authorization) config.headers.Authorization = token; if ($translate.use()) config.headers['Accept-Language'] = $translate.use(); From 23b3fb81f9989480f9146fe8b937726950db3697 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 28 Feb 2024 10:43:19 +0100 Subject: [PATCH 060/183] refs 6930 feat: implements logout remoteMethod --- back/models/vn-user.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/back/models/vn-user.js b/back/models/vn-user.js index b59f13ffa..473e619db 100644 --- a/back/models/vn-user.js +++ b/back/models/vn-user.js @@ -31,6 +31,32 @@ module.exports = function(Self) { message: `A client with that Web User name already exists` }); + Self.remoteMethod('logoutMultimedia', { + description: 'Logout current MultimediaToken', + accepts: [{ + arg: 'ctx', + type: 'Object', + http: {source: 'context'} + }], + returns: { + type: 'Boolean', + root: true + }, + http: { + verb: 'POST', + path: '/logoutMultimedia' + }, + accessScopes: ['read:multimedia'] + }); + Self.logoutMultimedia = async function(ctx) { + let {accessToken} = ctx.req; + try { + Self.logout(accessToken.id); + return true; + } catch (error) { + return error; + } + }; Self.remoteMethod('getCurrentUserData', { description: 'Gets the current user data', accepts: [ From a06a59341250eb18ce7aae81ee1459e10cab8998 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 28 Feb 2024 10:55:36 +0100 Subject: [PATCH 061/183] refs 6930 feat: ACL --- db/versions/10919-brownMoss/00-firstScript.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 db/versions/10919-brownMoss/00-firstScript.sql diff --git a/db/versions/10919-brownMoss/00-firstScript.sql b/db/versions/10919-brownMoss/00-firstScript.sql new file mode 100644 index 000000000..da10027e0 --- /dev/null +++ b/db/versions/10919-brownMoss/00-firstScript.sql @@ -0,0 +1,4 @@ +-- Place your SQL code here + +INSERT IGNORE INTO `salix`.`ACL`(`model`,`property`,`accessType`,`permission`, `principalType`, `principalId`) +VALUES(VnUser,logoutMultimedia,*,ALLOW,ROLE,employee) From 1d1d950e4b543d02604bca6db5afbaeb2cce0f34 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 28 Feb 2024 11:57:00 +0100 Subject: [PATCH 062/183] refs 6930 feat: ACL --- db/versions/10919-brownMoss/00-firstScript.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/versions/10919-brownMoss/00-firstScript.sql b/db/versions/10919-brownMoss/00-firstScript.sql index da10027e0..a6abdbe79 100644 --- a/db/versions/10919-brownMoss/00-firstScript.sql +++ b/db/versions/10919-brownMoss/00-firstScript.sql @@ -1,4 +1,5 @@ -- Place your SQL code here INSERT IGNORE INTO `salix`.`ACL`(`model`,`property`,`accessType`,`permission`, `principalType`, `principalId`) -VALUES(VnUser,logoutMultimedia,*,ALLOW,ROLE,employee) +VALUES +('VnUser','logoutMultimedia','*','ALLOW','ROLE','employee') From 5ee9c2b01ef4d5f2d2b43ae23b7bd66524dbe286 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 29 Feb 2024 07:40:20 +0100 Subject: [PATCH 063/183] refs #6930 fix: revert fdescribe --- back/methods/vn-user/specs/share-token.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/methods/vn-user/specs/share-token.spec.js b/back/methods/vn-user/specs/share-token.spec.js index 4d113f10a..aaa83817c 100644 --- a/back/methods/vn-user/specs/share-token.spec.js +++ b/back/methods/vn-user/specs/share-token.spec.js @@ -1,5 +1,5 @@ const {models} = require('vn-loopback/server/server'); -fdescribe('Share Token', () => { +describe('Share Token', () => { let ctx = null; beforeAll(async() => { const unAuthCtx = { From 8e976d2e4fddc06e3eb1fa343775c3bfebd3a75a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 29 Feb 2024 09:28:27 +0100 Subject: [PATCH 064/183] refs #5858 feat: remove Schedule system --- db/dump/fixtures.after.sql | 2 - db/routines/util/events/vn_scheduler.sql | 14 ---- db/routines/util/procedures/vn_scheduler.sql | 67 ------------------- .../vn/triggers/zoneIncluded_afterDelete.sql | 5 -- .../vn/triggers/zoneIncluded_beforeInsert.sql | 6 -- .../vn/triggers/zoneIncluded_beforeUpdate.sql | 6 -- .../00-createVnSchedules.sql | 14 ---- .../zone/specs/toggleIsIncluded.spec.js | 26 +------ 8 files changed, 1 insertion(+), 139 deletions(-) delete mode 100644 db/routines/util/events/vn_scheduler.sql delete mode 100644 db/routines/util/procedures/vn_scheduler.sql delete mode 100644 db/versions/10881-greenHydrangea/00-createVnSchedules.sql diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index 2b83cca57..c539b2aab 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -325,6 +325,4 @@ INSERT INTO mysql.roles_mapping (`User`, `Host`, `Role`, `Admin_option`) WHERE `User` LIKE @prefixedLike AND `Host` = @genRoleHost; -TRUNCATE util.vn_schedules; - FLUSH PRIVILEGES; diff --git a/db/routines/util/events/vn_scheduler.sql b/db/routines/util/events/vn_scheduler.sql deleted file mode 100644 index 2d8457499..000000000 --- a/db/routines/util/events/vn_scheduler.sql +++ /dev/null @@ -1,14 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `VN_SCHEDULER` - ON SCHEDULE EVERY 1 DAY - STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY - ENABLE - DO BEGIN - /** - * Ejecuta el PROCEDURE que comprueba si hay procedimientos planificados para ejecutar - * - */ - CALL `VN_SCHEDULER`(); - END$$ - -DELIMITER ; diff --git a/db/routines/util/procedures/vn_scheduler.sql b/db/routines/util/procedures/vn_scheduler.sql deleted file mode 100644 index cd7c629f8..000000000 --- a/db/routines/util/procedures/vn_scheduler.sql +++ /dev/null @@ -1,67 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `util`.`VN_SCHEDULER`() -BEGIN -/** - * Ejecuta los procedimientos que se han programado a demanda. - * -*/ - DECLARE vDone BOOL; - DECLARE vError VARCHAR(255) DEFAULT NULL; - DECLARE vErrorCode VARCHAR(255) DEFAULT NULL; - DECLARE vSchema VARCHAR(255); - DECLARE vStatus VARCHAR(255); - DECLARE vProcedure VARCHAR(255); - - DECLARE vScheduleFk INT; - -- Obtener datos de la tabla vn_schedules - DECLARE vQueue CURSOR FOR - SELECT id, `schema`, `procedure`, `status` - FROM vn_schedules - WHERE status = 'scheduled'; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - GET DIAGNOSTICS CONDITION 1 - vError = MESSAGE_TEXT, - vErrorCode = RETURNED_SQLSTATE; - OPEN vQueue; - l: LOOP - SET vDone = FALSE; - FETCH vQueue INTO vScheduleFk, vSchema, vProcedure, vStatus; - - IF vDone THEN - LEAVE l; - END IF; - - UPDATE vn_schedules - SET `started` = util.VN_NOW(), - `finished` = NULL, - `error` = NULL, - `errorCode` = NULL - WHERE id = vScheduleFk; - - SET vError = NULL; - - - CALL util.exec(CONCAT('CALL `', vSchema ,'`.`', vProcedure ,'`')); - - IF vError IS NOT NULL THEN - UPDATE vn_schedules - SET `error` = vError, - finished = util.VN_NOW(), - lastFinished = util.VN_NOW(), - `errorCode` = vErrorCode, - `status` = 'error' - WHERE id = vScheduleFk; - ELSE - UPDATE vn_schedules - SET `error` = vError, - `errorCode` = vErrorCode, - finished = util.VN_NOW(), - lastFinished = util.VN_NOW(), - `status` = 'exec' - WHERE id = vScheduleFk; - END IF; - END LOOP; - CLOSE vQueue; -END$$ - -DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 1a076cd8f..3ff8be421 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -9,11 +9,6 @@ BEGIN `changedModelId` = OLD.zoneFk, `userFk` = account.myUser_getId(); - -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' - - INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) - VALUES - ('vn', 'zone_getCollisions'); END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql index 13d45aa12..18895c9a5 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeInsert.sql @@ -5,11 +5,5 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeIn BEGIN SET NEW.editorFk = account.myUser_getId(); - -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' - - INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) - VALUES - ('vn', 'zone_getCollisions'); - END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index f54c55654..445f37699 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -4,11 +4,5 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); - - -- Inserta en vn_schedules para ejecutar el procedure de 'zone_getCollisions' - - INSERT IGNORE INTO `util`.`vn_schedules`(`schema`, `procedure`) - VALUES - ('vn', 'zone_getCollisions'); END$$ DELIMITER ; diff --git a/db/versions/10881-greenHydrangea/00-createVnSchedules.sql b/db/versions/10881-greenHydrangea/00-createVnSchedules.sql deleted file mode 100644 index 07dedf7d3..000000000 --- a/db/versions/10881-greenHydrangea/00-createVnSchedules.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE IF NOT EXISTS `util`.`vn_schedules` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `started` datetime DEFAULT NULL, - `finished` datetime DEFAULT NULL, - `lastFinished` datetime DEFAULT NULL, - `order` int(11) DEFAULT NULL, - `schema` varchar(45) NOT NULL, - `procedure` varchar(100) NOT NULL, - `error` varchar(255) DEFAULT NULL, - `errorCode` varchar(10) DEFAULT NULL, - `status` enum('scheduled','exec','error') NOT NULL DEFAULT 'scheduled', - PRIMARY KEY (`id`), - UNIQUE KEY unique_schedule (`schema`, `procedure`, `status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; diff --git a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js index a7a2a7808..2da176330 100644 --- a/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js +++ b/modules/zone/back/methods/zone/specs/toggleIsIncluded.spec.js @@ -20,12 +20,10 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; - await validateSchedules('before', options); let result = await models.Zone.toggleIsIncluded(1, 20, true, options); expect(result.isIncluded).toBeTrue(); - await validateSchedules('after', options); await tx.rollback(); } catch (e) { @@ -39,12 +37,10 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; - await validateSchedules('before', options); let result = await models.Zone.toggleIsIncluded(1, 20, false, options); expect(result.isIncluded).toBeFalse(); - await validateSchedules('after', options); await tx.rollback(); } catch (e) { @@ -58,14 +54,13 @@ describe('zone toggleIsIncluded()', () => { try { const options = {transaction: tx}; - await validateSchedules('before', options); + await models.Zone.toggleIsIncluded(1, 20, false, options); const result = await models.Zone.toggleIsIncluded(1, 20, undefined, options); expect(result).toEqual({count: 1}); - await validateSchedules('after', options); await tx.rollback(); } catch (e) { await tx.rollback(); @@ -73,22 +68,3 @@ describe('zone toggleIsIncluded()', () => { } }); }); - -async function validateSchedules(step, options = null) { - const querySchedules = `SELECT count(*) count FROM util.vn_schedules;`; - - switch (step) { - case 'before': { - const [{count}] = await models.Application.rawSql(querySchedules, null, options); - - expect(count).toEqual(0); - } - break; - case 'after': { - const [{count}] = await models.Application.rawSql(querySchedules, null, options); - - expect(count).toEqual(1); - } - break; - } -} From 2f275d8f32bc9451c8a225e8cc5e3fb853a98f58 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 29 Feb 2024 13:06:26 +0100 Subject: [PATCH 065/183] itemType add --- db/dump/fixtures.after.sql | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index a7d059ed2..13e423d68 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -294,8 +294,15 @@ INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk) VALUES (1, 442); -- XXX: floranet -INSERT INTO vn.intrastat(id, description, taxClassFk, taxCodeFk) -VALUES(6031970, 'Flores y capullos frescos (Otras: ramos, coronas)', 1, 63); +INSERT IGNORE INTO vn.intrastat(id, description, taxClassFk, taxCodeFk) +VALUES(6031970, 'Flores y capullos frescos (Otras: ramos, coronas)', 1, 63); + + +INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) + VALUES('FNR', 'Floranet Ramos', 1, 1); + +INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) + VALUES('FNP', 'Floranet Plantas', 1, 1); -- Generación de items SELECT id From c79bdeb3f4bfc3379222552c605b7d2f5ccdc302 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 29 Feb 2024 13:41:27 +0100 Subject: [PATCH 066/183] fix: refs #6744 drop to set emailVerified --- modules/account/back/models/account.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/account/back/models/account.js b/modules/account/back/models/account.js index dd04182f6..ceb26053c 100644 --- a/modules/account/back/models/account.js +++ b/modules/account/back/models/account.js @@ -12,10 +12,9 @@ module.exports = Self => { require('../methods/account/set-password')(Self); Self.setUnverifiedPassword = async(id, pass, options) => { - const user = await models.VnUser.findById(id, null, options); - if (user.emailVerified) throw new ForbiddenError('This password can only be changed by the user themselves'); + const {emailVerified} = await models.VnUser.findById(id, {fields: ['emailVerified']}, options); + if (emailVerified) throw new ForbiddenError('This password can only be changed by the user themselves'); await models.VnUser.setPassword(id, pass, options); - await user.updateAttribute('emailVerified', true, options); }; }; From 95fa776e41d10d5c20e929cd00819300c8fbf519 Mon Sep 17 00:00:00 2001 From: JAVIER SEGARRA MARTINEZ Date: Thu, 29 Feb 2024 12:49:50 +0000 Subject: [PATCH 067/183] refs 5858 feat: sql files --- .../10881-greenHydrangea/01-notification.vn.sql | 12 ++++++++++++ .../10881-greenHydrangea/01-notification.vnx.sql | 10 ---------- 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 db/versions/10881-greenHydrangea/01-notification.vn.sql delete mode 100644 db/versions/10881-greenHydrangea/01-notification.vnx.sql diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql new file mode 100644 index 000000000..414a14688 --- /dev/null +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -0,0 +1,12 @@ +SET @MaxId = SELECT MAX(id)+1 from util.notification n) +INSERT INTO IGNORE util.notification (id, name,description) + VALUES ( +(@MaxId, 'zone-included','An email to notify zoneCollisions'); + +INSERT INTO IGNORE util.notificationSubscription (notificationFk,userFk) + VALUES( + @MaxId, 100); + + +INSERT INTO IGNORE util.notificationAcl (notificationFk,roleFk) + SELECT @MaxId, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; diff --git a/db/versions/10881-greenHydrangea/01-notification.vnx.sql b/db/versions/10881-greenHydrangea/01-notification.vnx.sql deleted file mode 100644 index d05902461..000000000 --- a/db/versions/10881-greenHydrangea/01-notification.vnx.sql +++ /dev/null @@ -1,10 +0,0 @@ -INSERT INTO util.notification (id, name,description) - VALUES ( -(SELECT MAX(id)+1 from util.notification n) , 'zone-included','An email to notify zoneCollisions'); - -INSERT INTO util.notificationSubscription (notificationFk,userFk) - SELECT id, account.myUser_getId() FROM util.notification WHERE name= "zone-included"; - - -INSERT INTO util.notificationAcl (notificationFk,roleFk) - SELECT id, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From b9e774cea04f2d0d8e311b29e54119697d13320f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 1 Mar 2024 14:26:36 +0100 Subject: [PATCH 068/183] feat: restricciones AWB para travel y entry refs #6960 --- db/dump/fixtures.before.sql | 4 +-- .../vn/functions/travel_hasUniqueAwb.sql | 28 +++++++++++++++++++ .../vn/triggers/entry_beforeInsert.sql | 4 ++- .../vn/triggers/entry_beforeUpdate.sql | 6 ++++ .../vn/triggers/travel_afterUpdate.sql | 6 +++- .../vn/triggers/travel_beforeInsert.sql | 4 +++ 6 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 db/routines/vn/functions/travel_hasUniqueAwb.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 094b956af..4d8c0bfc2 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1489,8 +1489,8 @@ INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeF INSERT INTO `vn`.`buy`(`id`,`entryFk`,`itemFk`,`buyingValue`,`quantity`,`packagingFk`,`stickers`,`freightValue`,`packageValue`,`comissionValue`,`packing`,`grouping`,`groupingMode`,`location`,`price1`,`price2`,`price3`, `printedStickers`,`isChecked`,`isIgnored`,`weight`, `created`) VALUES - (1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), - (2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), + (1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE() - INTERVAL 2 MONTH), + (2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE() - INTERVAL 1 MONTH), (3, 3, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 0, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE()), (4, 2, 2, 5, 450, 3, 1, 1.000, 1.000, 0.000, 10, 10, 0, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 2.5, util.VN_CURDATE()), (5, 3, 3, 55, 500, 5, 1, 1.000, 1.000, 0.000, 1, 1, 0, NULL, 0.00, 78.3, 75.6, 0, 1, 0, 2.5, util.VN_CURDATE()), diff --git a/db/routines/vn/functions/travel_hasUniqueAwb.sql b/db/routines/vn/functions/travel_hasUniqueAwb.sql new file mode 100644 index 000000000..e918f1a26 --- /dev/null +++ b/db/routines/vn/functions/travel_hasUniqueAwb.sql @@ -0,0 +1,28 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`travel_hasUniqueAwb`( + vSelf INT +) + RETURNS BOOL + READS SQL DATA +BEGIN +/** + * Comprueba que el travel pasado tiene un AWB lógico, + * no se pueden tener varios AWB asociados al mismo DUA + * + * @param vSelf Id del travel + */ + DECLARE vHasUniqueAwb BOOL DEFAULT TRUE; + + SELECT NOT COUNT(t2.awbFk) INTO vHasUniqueAwb + FROM entry e + JOIN travel t ON t.id = e.travelFk + JOIN duaEntry de ON de.entryFk = e.id + JOIN duaEntry de2 ON de2.duaFk = de.duaFk + JOIN entry e2 ON e2.id = de2.entryFk + JOIN travel t2 ON t2.id = e2.travelFk + WHERE t.id = vSelf + AND t2.awbFk <> t.awbFk; + + RETURN vHasUniqueAwb; +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/entry_beforeInsert.sql b/db/routines/vn/triggers/entry_beforeInsert.sql index f475630db..a5fe1d126 100644 --- a/db/routines/vn/triggers/entry_beforeInsert.sql +++ b/db/routines/vn/triggers/entry_beforeInsert.sql @@ -7,6 +7,8 @@ BEGIN CALL supplier_checkIsActive(NEW.supplierFk); SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk); SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk,NEW.supplierFk); - + IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN + CALL util.throw('El travel no es correcto, en las entradas asociadas existe un AWB distinto'); + END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 91d490b21..57fbb12f6 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -8,7 +8,13 @@ BEGIN DECLARE vHasDistinctWarehouses BOOL; SET NEW.editorFk = account.myUser_getId(); + + IF NOT(NEW.travelFk <=> OLD.travelFk) THEN + IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN + CALL util.throw('El travel no es correcto, en las entradas asociadas existe un AWB distinto'); + END IF; + IF !(NEW.travelFk <=> OLD.travelFk) THEN SELECT COUNT(*) > 0 INTO vIsVirtual FROM entryVirtual WHERE entryFk = NEW.id; diff --git a/db/routines/vn/triggers/travel_afterUpdate.sql b/db/routines/vn/triggers/travel_afterUpdate.sql index b4e40ae41..aa1489300 100644 --- a/db/routines/vn/triggers/travel_afterUpdate.sql +++ b/db/routines/vn/triggers/travel_afterUpdate.sql @@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`travel_afterUpdate` BEGIN CALL stock.log_add('travel', NEW.id, OLD.id); - IF !(NEW.shipped <=> OLD.shipped) THEN + IF NOT(NEW.shipped <=> OLD.shipped) THEN UPDATE entry SET commission = entry_getCommission(travelFk, currencyFk,supplierFk) WHERE travelFk = NEW.id; @@ -23,5 +23,9 @@ BEGIN CALL buy_checkItem(); END IF; END IF; + + IF (NOT(NEW.awbFk <=> OLD.awbFk)) AND NEW.awbFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.id) THEN + CALL util.throw('El AWB no es correcto, en las entradas asociadas existe un AWB distinto'); + END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/travel_beforeInsert.sql b/db/routines/vn/triggers/travel_beforeInsert.sql index 4e1dae3ef..9505f4e16 100644 --- a/db/routines/vn/triggers/travel_beforeInsert.sql +++ b/db/routines/vn/triggers/travel_beforeInsert.sql @@ -8,5 +8,9 @@ BEGIN CALL travel_checkDates(NEW.shipped, NEW.landed); CALL travel_checkWarehouseIsFeedStock(NEW.warehouseInFk); + + IF NEW.awbFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.id) THEN + CALL util.throw('El AWB no es correcto, en las entradas asociadas existe un AWB distinto'); + END IF; END$$ DELIMITER ; From 292b77d57eee43d78d09e1343201dd5e1f9bbff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 1 Mar 2024 14:36:49 +0100 Subject: [PATCH 069/183] feat: restricciones AWB para travel y entry refs #6960 --- db/routines/vn/triggers/entry_beforeUpdate.sql | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 57fbb12f6..328843442 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -9,18 +9,17 @@ BEGIN SET NEW.editorFk = account.myUser_getId(); - IF NOT(NEW.travelFk <=> OLD.travelFk) THEN + IF NOT (NEW.travelFk <=> OLD.travelFk) THEN IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN CALL util.throw('El travel no es correcto, en las entradas asociadas existe un AWB distinto'); END IF; - IF !(NEW.travelFk <=> OLD.travelFk) THEN SELECT COUNT(*) > 0 INTO vIsVirtual FROM entryVirtual WHERE entryFk = NEW.id; - SELECT !(o.warehouseInFk <=> n.warehouseInFk) - OR !(o.warehouseOutFk <=> n.warehouseOutFk) + SELECT NOT (o.warehouseInFk <=> n.warehouseInFk) + OR NOT (o.warehouseOutFk <=> n.warehouseOutFk) INTO vHasDistinctWarehouses FROM travel o, travel n WHERE o.id = OLD.travelFk @@ -49,9 +48,8 @@ BEGIN SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk); END IF; - IF NOT (NEW.travelFk <=> OLD.travelFk) - OR NOT (NEW.currencyFk <=> OLD.currencyFk) THEN - SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk,NEW.supplierFk); + IF NOT (NEW.travelFk <=> OLD.travelFk) OR NOT (NEW.currencyFk <=> OLD.currencyFk) THEN + SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk, NEW.supplierFk); END IF; END$$ DELIMITER ; From 1ccec1e0fb5ab8d5b747431693a5ce49860e7a73 Mon Sep 17 00:00:00 2001 From: ivanm Date: Mon, 4 Mar 2024 08:11:06 +0100 Subject: [PATCH 070/183] refs #6499 procRefactor part 6 --- .../procedures/absoluteInventoryHistory.sql | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 db/routines/vn/procedures/absoluteInventoryHistory.sql diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql new file mode 100644 index 000000000..427b9ba51 --- /dev/null +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -0,0 +1,99 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`absoluteInventoryHistory`( + vIdArticle INT, vWarehouse INT, vDate DATETIME) +BEGIN +/** +* Calcula y proporciona un historial de inventario absoluto +* para un artículo específico en un almacén dado +* hasta una fecha determinada. +* +* @param vIdArticle Id de artículo +* @param vWarehouse Almacén +* @param vDate Fecha +*/ + DECLARE vCalculatedInventory INT; + DECLARE vToday DATETIME; + + SET vToday = util.VN_CURDATE(); + + CREATE OR REPLACE TEMPORARY TABLE historicalPast + ENGINE = MEMORY + SELECT * + FROM ( + SELECT tr.landed Fecha, + b.quantity Entrada, + NULL Salida, + (tr.isReceived != FALSE) OK, + s.name Alias, + e.invoiceNumber Referencia, + e.id id, + tr.isDelivered F5 + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel tr ON tr.id = e.travelFk + JOIN supplier s ON s.id = e.supplierFk + WHERE tr.landed >= '2001-01-01' + AND s.id <> 4 + AND vWarehouse IN (tr.warehouseInFk, 0) + AND b.itemFk = vIdArticle + AND e.isExcludedFromAvailable = 0 + AND e.isRaid = 0 + UNION ALL + SELECT tr.shipped Fecha, + NULL Entrada, + b.quantity Salida, + tr.isDelivered OK, + s.name Alias, + e.invoiceNumber Referencia, + e.id id, + tr.isDelivered F5 + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel tr ON tr.id = e.travelFk + JOIN supplier s ON s.id = e.supplierFk + WHERE tr.shipped >= '2001-01-01' + AND vWarehouse = tr.warehouseOutFk + AND s.id <> 4 + AND b.itemFk = vIdArticle + AND e.isExcludedFromAvailable = 0 + AND e.isRaid = 0 + UNION ALL + SELECT t.shipped Fecha, + NULL Entrada, + m.quantity Salida, + (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) OK, + t.nickname Alias, + t.refFk Referencia, + t.id, + t.isPrinted + FROM sale m + JOIN Tickets T USING (Id_Ticket) + JOIN Clientes C ON C.Id_Cliente = T.Id_Cliente + WHERE T.Fecha >= '2001-01-01' + AND M.Id_Article = vIdArticle + AND vWarehouse IN (T.warehouse_id , 0) + ) t1 + ORDER BY Fecha, Entrada DESC, OK DESC; + + SELECT sum(Entrada) - sum(Salida) INTO vCalculatedInventory + FROM historicalPast + WHERE Fecha < vDate; + + SELECT p1.*, NULL v_virtual + FROM( + SELECT vDate Fecha, + vCalculatedInventory Entrada, + NULL Salida, + 1 OK, + 'Inventario calculado' Alias, + '' Referencia, 0 id, + 1 F5 + UNION ALL + SELECT * + FROM historicalPast + WHERE Fecha >= vDate + ) p1; + + DROP TEMPORARY TABLE historicalPast; +END$$ +DELIMITER ; \ No newline at end of file From 78c92af02f81c887ced32137b033a9eb1d4e3a21 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 4 Mar 2024 11:57:10 +0100 Subject: [PATCH 071/183] refs #5858 feat: fix vn file --- .../10881-greenHydrangea/01-notification.vn.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 414a14688..5ed5786f6 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -1,12 +1,12 @@ -SET @MaxId = SELECT MAX(id)+1 from util.notification n) -INSERT INTO IGNORE util.notification (id, name,description) - VALUES ( +SET @MaxId = (SELECT MAX(id)+1 from util.notification n); +INSERT IGNORE INTO util.notification (`id`, `name`,`description`) + VALUES (@MaxId, 'zone-included','An email to notify zoneCollisions'); -INSERT INTO IGNORE util.notificationSubscription (notificationFk,userFk) +INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( @MaxId, 100); -INSERT INTO IGNORE util.notificationAcl (notificationFk,roleFk) +INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk) SELECT @MaxId, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; From 893320b1149fb33d73355b2895167b17cde5203c Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 4 Mar 2024 15:00:43 +0100 Subject: [PATCH 072/183] refs #6755 model ticketlog, restore --- modules/ticket/back/methods/ticket/restore.js | 5 +++ modules/ticket/back/models/ticket-log.json | 37 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index e268c3891..49e6c4389 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -37,6 +37,11 @@ module.exports = Self => { } }] }, myOptions); + const lastUpdatedTicket = await models.ticketLog.findById(id, { + include: [{ + + }] + }); const now = Date.vnNew(); const maxDate = new Date(ticket.updated); diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json index d5d1e5520..ac912856b 100644 --- a/modules/ticket/back/models/ticket-log.json +++ b/modules/ticket/back/models/ticket-log.json @@ -5,5 +5,40 @@ "mysql": { "table": "ticketLog" } - } + }, + "properties": { + "id": { + "type": "string" + }, + "originFk": { + "type": "number" + }, + "userFk": { + "type":"number" + }, + "action": { + "type": "string" + }, + "creationDate": { + "type": "date" + }, + "description": { + "type": "string" + }, + "changeModel": { + "type": "string" + }, + "oldInstance": { + "type": "string" + }, + "newInstance": { + "type": "string" + }, + "changedModelId": { + "type": "number" + }, + "changedModelValue": { + "type": "string" + } + } } From cac388f986d28fd737c854bccc7a7eff4c5d86d9 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 5 Mar 2024 09:43:07 +0100 Subject: [PATCH 073/183] refs #6755 fix ticket --- modules/ticket/back/methods/ticket/restore.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 49e6c4389..8ba005b93 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -30,18 +30,8 @@ module.exports = Self => { Object.assign(myOptions, options); const ticket = await models.Ticket.findById(id, { - include: [{ - relation: 'client', - scope: { - fields: ['id', 'salesPersonFk'] - } - }] + fields: ['originFk', 'creationDate', 'newInstance'] }, myOptions); - const lastUpdatedTicket = await models.ticketLog.findById(id, { - include: [{ - - }] - }); const now = Date.vnNew(); const maxDate = new Date(ticket.updated); From 16fc446b852fb8b3903a28e25f3098f4679d4b2f Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 5 Mar 2024 10:46:15 +0100 Subject: [PATCH 074/183] refs #6755 fix method --- modules/ticket/back/methods/ticket/restore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 8ba005b93..c92f8767e 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -29,7 +29,7 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const ticket = await models.Ticket.findById(id, { + const ticket = await models.TicketLog.findById(id, { fields: ['originFk', 'creationDate', 'newInstance'] }, myOptions); From 68846d30184961cd92704a65c95617b58876ee40 Mon Sep 17 00:00:00 2001 From: ivanm Date: Tue, 5 Mar 2024 13:43:03 +0100 Subject: [PATCH 075/183] refs #6499 Refactor historico_multiple --- .../procedures/absoluteInventoryHistory.sql | 109 ++++++------ .../procedures/multipleInventoryHistory.sql | 161 ++++++++++++++++++ 2 files changed, 216 insertions(+), 54 deletions(-) create mode 100644 db/routines/vn/procedures/multipleInventoryHistory.sql diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index 427b9ba51..f1a317598 100644 --- a/db/routines/vn/procedures/absoluteInventoryHistory.sql +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -1,13 +1,13 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`absoluteInventoryHistory`( - vIdArticle INT, vWarehouse INT, vDate DATETIME) + vItemFk INT, vWarehouse INT, vDate DATETIME) BEGIN /** * Calcula y proporciona un historial de inventario absoluto * para un artículo específico en un almacén dado * hasta una fecha determinada. * -* @param vIdArticle Id de artículo +* @param vItemFk Id de artículo * @param vWarehouse Almacén * @param vDate Fecha */ @@ -16,84 +16,85 @@ BEGIN SET vToday = util.VN_CURDATE(); - CREATE OR REPLACE TEMPORARY TABLE historicalPast - ENGINE = MEMORY + CREATE OR REPLACE TEMPORARY TABLE tHistoricalPast + ENGINE = MEMORY SELECT * FROM ( - SELECT tr.landed Fecha, - b.quantity Entrada, - NULL Salida, - (tr.isReceived != FALSE) OK, - s.name Alias, - e.invoiceNumber Referencia, + SELECT tr.landed `date`, + b.quantity input, + NULL `output`, + (tr.isReceived != FALSE) ok, + s.name alias, + e.invoiceNumber reference, e.id id, - tr.isDelivered F5 + tr.isDelivered f5 FROM buy b - JOIN entry e ON e.id = b.entryFk + JOIN `entry` e ON e.id = b.entryFk JOIN travel tr ON tr.id = e.travelFk - JOIN supplier s ON s.id = e.supplierFk + JOIN supplier s ON s.id = e.supplierFk WHERE tr.landed >= '2001-01-01' AND s.id <> 4 AND vWarehouse IN (tr.warehouseInFk, 0) - AND b.itemFk = vIdArticle - AND e.isExcludedFromAvailable = 0 - AND e.isRaid = 0 + AND b.itemFk = vItemFk + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid UNION ALL - SELECT tr.shipped Fecha, - NULL Entrada, - b.quantity Salida, - tr.isDelivered OK, - s.name Alias, - e.invoiceNumber Referencia, + SELECT tr.shipped `date`, + NULL input, + b.quantity `output`, + tr.isDelivered ok, + s.name alias, + e.invoiceNumber reference, e.id id, - tr.isDelivered F5 + tr.isDelivered f5 FROM buy b - JOIN entry e ON e.id = b.entryFk + JOIN `entry` e ON e.id = b.entryFk JOIN travel tr ON tr.id = e.travelFk - JOIN supplier s ON s.id = e.supplierFk + JOIN supplier s ON s.id = e.supplierFk WHERE tr.shipped >= '2001-01-01' AND vWarehouse = tr.warehouseOutFk AND s.id <> 4 - AND b.itemFk = vIdArticle - AND e.isExcludedFromAvailable = 0 - AND e.isRaid = 0 + AND b.itemFk = vItemFk + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid UNION ALL - SELECT t.shipped Fecha, - NULL Entrada, - m.quantity Salida, - (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) OK, - t.nickname Alias, - t.refFk Referencia, + SELECT t.shipped `date`, + NULL input, + m.quantity `output`, + (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) ok, + t.nickname alias, + t.refFk reference, t.id, t.isPrinted FROM sale m - JOIN Tickets T USING (Id_Ticket) - JOIN Clientes C ON C.Id_Cliente = T.Id_Cliente - WHERE T.Fecha >= '2001-01-01' - AND M.Id_Article = vIdArticle - AND vWarehouse IN (T.warehouse_id , 0) + JOIN ticket t ON t.id = m.ticketFk + JOIN client c ON c.id = t.clientFk + WHERE t.shipped >= '2001-01-01' + AND m.itemFk = vItemFk + AND vWarehouse IN (t.warehouseFk , 0) ) t1 - ORDER BY Fecha, Entrada DESC, OK DESC; + ORDER BY `date`, input DESC, ok DESC; - SELECT sum(Entrada) - sum(Salida) INTO vCalculatedInventory - FROM historicalPast - WHERE Fecha < vDate; + SELECT sum(input) - sum(`output`) INTO vCalculatedInventory + FROM tHistoricalPast + WHERE `date` < vDate; SELECT p1.*, NULL v_virtual FROM( - SELECT vDate Fecha, - vCalculatedInventory Entrada, - NULL Salida, - 1 OK, - 'Inventario calculado' Alias, - '' Referencia, 0 id, - 1 F5 + SELECT vDate `date`, + vCalculatedInventory input, + NULL `output`, + 1 ok, + 'Inventario calculado' alias, + '' reference, + 0 id, + 1 f5 UNION ALL - SELECT * - FROM historicalPast - WHERE Fecha >= vDate + SELECT * + FROM tHistoricalPast + WHERE `date` >= vDate ) p1; - DROP TEMPORARY TABLE historicalPast; + DROP TEMPORARY TABLE tHistoricalPast; END$$ DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/procedures/multipleInventoryHistory.sql b/db/routines/vn/procedures/multipleInventoryHistory.sql new file mode 100644 index 000000000..bd399e889 --- /dev/null +++ b/db/routines/vn/procedures/multipleInventoryHistory.sql @@ -0,0 +1,161 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`multipleInventoryHistory`( + vItemFk INT) +BEGIN +/** +* Calcula y proporciona un historial de inventario detallado +* para un artículo dividiendo la información +* por almacén. +* +* @param vItemFk Artículo +*/ + DECLARE vDateInventory DATETIME; + + SELECT inventoried INTO vDateInventory FROM config; + + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory1; + + CREATE TEMPORARY TABLE tMultipleHistory1 + SELECT DATE(`date`) `date`, + input, + `output`, + ok, + reference, + history.id, + warehouse, + `name` warehouseName + FROM ( + SELECT tr.landed `date`, + c.quantity input, + NULL `output`, + IF(warehouseInFk = 44, 1, warehouseInFk) warehouse, + (tr.isReceived <> FALSE) ok, + e.invoiceNumber reference, + e.id id + FROM buy c + JOIN `entry` e ON e.id = c.entryFk + JOIN travel tr ON tr.id = e.travelFk + WHERE tr.landed >= vDateInventory + AND c.itemFk = vItemFk + AND NOT e.isRaid + AND c.quantity <> 0 + UNION ALL + SELECT tr.shipped `date`, + NULL input, + c.quantity `output`, + warehouseOutFk warehouse, + tr.isDelivered ok, + e.invoiceNumber reference, + e.id id + FROM buy c + JOIN `entry` e ON e.id = c.entryFk + JOIN travel tr ON tr.id = e.travelFk + WHERE tr.shipped >= vDateInventory + AND c.itemFk = vItemFk + AND NOT e.isRaid + AND c.quantity <> 0 + UNION ALL + SELECT t.shipped `date`, + NULL input, + m.quantity `output`, + warehouseInFk warehouse, + (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) ok, + t.refFk reference, + t.id id + FROM sale m + JOIN ticket t ON t.id = m.ticketFk + WHERE t.shipped >= vDateInventory + AND m.itemFk = vItemFk + ) history + JOIN warehouse ON warehouse.id = history.warehouse + ORDER BY `date`, input DESC, ok DESC; + + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory2; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory3; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory4; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory5; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory6; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory7; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory8; + CREATE TEMPORARY TABLE tMultipleHistory2 SELECT * FROM tMultipleHistory1 WHERE warehouse = 19; + CREATE TEMPORARY TABLE tMultipleHistory3 SELECT * FROM tMultipleHistory1 WHERE warehouse = 7; + CREATE TEMPORARY TABLE tMultipleHistory4 SELECT * FROM tMultipleHistory1 WHERE warehouse = 60; + CREATE TEMPORARY TABLE tMultipleHistory5 SELECT * FROM tMultipleHistory1 WHERE warehouse = 5; + CREATE TEMPORARY TABLE tMultipleHistory6 SELECT * FROM tMultipleHistory1 WHERE warehouse = 17; + CREATE TEMPORARY TABLE tMultipleHistory7 SELECT * FROM tMultipleHistory1 WHERE warehouse = 37; + CREATE TEMPORARY TABLE tMultipleHistory8 SELECT * FROM tMultipleHistory1 WHERE warehouse = 55; + + SELECT * + FROM ( + SELECT `date`, input BOGinput, `output` BOGoutput, ok BOGok, reference BOGreference, id BOGid, + NULL VNHinput, NULL VNHoutput, NULL VNHok, NULL VNHreference, NULL VNHid, + NULL ALGinput, NULL ALGoutput, NULL ALGok, NULL ALGreference, NULL ALGid, + NULL MADinput, NULL MADoutput, NULL MADok, NULL MADreference, NULL MADid, + NULL MCFinput, NULL MCFoutput, NULL MCFok, NULL MCFreference, NULL MCFid, + NULL VILinput, NULL VILoutput, NULL VILok, NULL VILreference, NULL VILid, + NULL BARinput, NULL BARoutput, NULL BARok, NULL BARreference, NULL BARid + FROM tMultipleHistory2 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory3 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory4 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory5 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory6 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory7 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id + FROM tMultipleHistory8 + ) sub + ORDER BY `date`, BOGinput IS NULL, VNHinput IS NULL, ALGinput IS NULL, MADinput IS NULL, MCFinput IS NULL, VILinput IS NULL, BARinput IS NULL; +END$$ +DELIMITER ; \ No newline at end of file From 70096e7a762c6c928654ba98626a728e5dfe0b63 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 5 Mar 2024 14:24:32 +0100 Subject: [PATCH 076/183] refs #6755 fix restore --- modules/ticket/back/methods/ticket/restore.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index c92f8767e..c85efb1c8 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -33,12 +33,15 @@ module.exports = Self => { fields: ['originFk', 'creationDate', 'newInstance'] }, myOptions); + console.log('ticket', ticket); const now = Date.vnNew(); - const maxDate = new Date(ticket.updated); + const maxDate = new Date(ticket.creationDate); maxDate.setHours(maxDate.getHours() + 1); - if (now > maxDate) - throw new UserError(`You can only restore a ticket within the first hour after deletion`); + if (ticket.newInstance.includes('isDeleted: true')) { + if (now > maxDate) + throw new UserError(`You can only restore a ticket within the first hour after deletion`); + } // Send notification to salesPerson const salesPersonId = ticket.client().salesPersonFk; From f215ce5f05e4812a477fd1d6c3bf1d602c447275 Mon Sep 17 00:00:00 2001 From: ivanm Date: Tue, 5 Mar 2024 14:33:16 +0100 Subject: [PATCH 077/183] refs #6498 Delete procedures vn2008 and grant vn procs --- .../vn2008/procedures/historico_absoluto.sql | 91 -------- .../vn2008/procedures/historico_multiple.sql | 206 ------------------ .../10932-azureEucalyptus/00-firstScript.sql | 2 + 3 files changed, 2 insertions(+), 297 deletions(-) delete mode 100644 db/routines/vn2008/procedures/historico_absoluto.sql delete mode 100644 db/routines/vn2008/procedures/historico_multiple.sql create mode 100644 db/versions/10932-azureEucalyptus/00-firstScript.sql diff --git a/db/routines/vn2008/procedures/historico_absoluto.sql b/db/routines/vn2008/procedures/historico_absoluto.sql deleted file mode 100644 index 1a7e1dbfa..000000000 --- a/db/routines/vn2008/procedures/historico_absoluto.sql +++ /dev/null @@ -1,91 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`historico_absoluto`(IN idART INT, IN wh INT, IN datfecha DATETIME) -BEGIN - - DECLARE inv_calculado INT; - DECLARE inv INT; - DECLARE today DATETIME; - DECLARE fecha_inv DATETIME; - - SET today = util.VN_CURDATE(); - - CREATE OR REPLACE TEMPORARY TABLE historico_pasado - SELECT * - FROM ( - SELECT TR.landing Fecha, - C.Cantidad Entrada, - NULL Salida, - (TR.received != FALSE) OK, - P.Proveedor Alias, - E.Referencia Referencia, - E.Id_Entrada id, - TR.delivered F5 - FROM Compres C -- mirar perque no entra en received - INNER JOIN Entradas E USING (Id_Entrada) - INNER JOIN travel TR ON TR.id = E.travel_id - INNER JOIN Proveedores P USING (Id_Proveedor) - WHERE TR.landing >= '2001-01-01' - AND Id_proveedor <> 4 - AND wh IN (TR.warehouse_id , 0) - AND C.Id_Article = idART - AND E.Inventario = 0 - AND E.Redada = 0 - UNION ALL - SELECT TR.shipment Fecha, - NULL Entrada, - C.Cantidad Salida, - TR.delivered OK, - P.Proveedor Alias, - E.Referencia Referencia, - E.Id_Entrada id, - TR.delivered F5 - FROM Compres C - INNER JOIN Entradas E USING (Id_Entrada) - INNER JOIN travel TR ON TR.id = E.travel_id - INNER JOIN Proveedores P USING (Id_Proveedor) - WHERE TR.shipment >= '2001-01-01' - AND wh = TR.warehouse_id_out - AND Id_Proveedor <> 4 - AND C.Id_Article = idART - AND E.Inventario = 0 - AND E.Redada = 0 - UNION ALL - SELECT T.Fecha Fecha, - NULL Entrada, - M.Cantidad Salida, - (M.OK <> 0 OR T.Etiquetasemitidas <> 0 OR T.Factura IS NOT NULL) OK, - T.Alias Alias, - T.Factura Referencia, - T.Id_Ticket, - T.PedidoImpreso - FROM Movimientos M - INNER JOIN Tickets T USING (Id_Ticket) - JOIN Clientes C ON C.Id_Cliente = T.Id_Cliente - WHERE T.Fecha >= '2001-01-01' - AND M.Id_Article = idART - AND wh IN (T.warehouse_id , 0) - ) t1 - ORDER BY Fecha, Entrada DESC, OK DESC; - - SELECT sum(Entrada) - sum(Salida) INTO inv_calculado - FROM historico_pasado - WHERE Fecha < datfecha; - - SELECT p1.*, NULL v_virtual - FROM( - SELECT datfecha Fecha, - inv_calculado Entrada, - NULL Salida, - 1 OK, - 'Inventario calculado' Alias, - '' Referencia, 0 id, - 1 F5 - UNION ALL - SELECT * - FROM historico_pasado - WHERE Fecha >= datfecha - ) p1; - - DROP TEMPORARY TABLE historico_pasado; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/historico_multiple.sql b/db/routines/vn2008/procedures/historico_multiple.sql deleted file mode 100644 index ae4045a34..000000000 --- a/db/routines/vn2008/procedures/historico_multiple.sql +++ /dev/null @@ -1,206 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`historico_multiple`(IN vItemFk INT) -BEGIN - - DECLARE vDateInventory DATETIME; - - SELECT Fechainventario INTO vDateInventory FROM tblContadores; - - SET @a = 0; - - DROP TEMPORARY TABLE IF EXISTS hm1; - - CREATE TEMPORARY TABLE hm1 - SELECT DATE(Fecha) as Fecha, - Entrada, - Salida, - OK, - Referencia, - Historia.id, - - wh, - - `name` as wh_name - - FROM - - ( SELECT TR.landing as Fecha, - C.Cantidad as Entrada, - NULL as Salida, - - IF(warehouse_id = 44, 1, warehouse_id) as wh, - (TR.received != FALSE) as OK, - E.Referencia as Referencia, - E.Id_Entrada as id - - - - FROM Compres C - INNER JOIN Entradas E USING (Id_Entrada) - INNER JOIN travel TR ON TR.id = E.travel_id - WHERE TR.landing >= vDateInventory - AND C.Id_Article = vItemFk - AND E.Redada = 0 - - AND C.Cantidad <> 0 - - UNION ALL - - SELECT TR.shipment as Fecha, - NULL as Entrada, - C.Cantidad as Salida, - warehouse_id_out as wh, - TR.delivered as OK, - E.Referencia as Referencia, - E.Id_Entrada as id - - FROM Compres C - INNER JOIN Entradas E USING (Id_Entrada) - INNER JOIN travel TR ON TR.id = E.travel_id - WHERE TR.shipment >= vDateInventory - AND C.Id_Article = vItemFk - - AND E.Redada = 0 - - AND C.Cantidad <> 0 - - UNION ALL - - SELECT T.Fecha as Fecha, - NULL as Entrada, - M.Cantidad as Salida, - warehouse_id as wh, - (M.OK <> 0 OR T.Etiquetasemitidas <> 0 OR T.Factura IS NOT NULL) as OK, - T.Factura as Referencia, - T.Id_Ticket as id - - FROM Movimientos M - INNER JOIN Tickets T USING (Id_Ticket) - WHERE T.Fecha >= vDateInventory - AND M.Id_Article = vItemFk - - ) AS Historia - - INNER JOIN warehouse ON warehouse.id = Historia.wh - ORDER BY Fecha, Entrada DESC, OK DESC; - - - DROP TEMPORARY TABLE IF EXISTS hm2; - DROP TEMPORARY TABLE IF EXISTS hm3; - DROP TEMPORARY TABLE IF EXISTS hm4; - DROP TEMPORARY TABLE IF EXISTS hm5; - DROP TEMPORARY TABLE IF EXISTS hm6; - DROP TEMPORARY TABLE IF EXISTS hm7; - DROP TEMPORARY TABLE IF EXISTS hm8; - CREATE TEMPORARY TABLE hm2 SELECT * FROM hm1 WHERE wh = 19; - CREATE TEMPORARY TABLE hm3 SELECT * FROM hm1 WHERE wh = 7; - CREATE TEMPORARY TABLE hm4 SELECT * FROM hm1 WHERE wh = 60; - CREATE TEMPORARY TABLE hm5 SELECT * FROM hm1 WHERE wh = 5; - CREATE TEMPORARY TABLE hm6 SELECT * FROM hm1 WHERE wh = 17; - CREATE TEMPORARY TABLE hm7 SELECT * FROM hm1 WHERE wh = 37; - CREATE TEMPORARY TABLE hm8 SELECT * FROM hm1 WHERE wh = 55; - - SELECT * FROM - - ( - - SELECT Fecha, Entrada as BOGEntrada, Salida as BOGSalida, OK as BOGOK, Referencia as BOGReferencia, id as BOGid, - - NULL AS VNHEntrada, NULL AS VNHSalida, NULL AS VNHOK, NULL AS VNHReferencia, NULL AS VNHid, - - NULL AS ALGEntrada, NULL AS ALGSalida, NULL AS ALGOK, NULL AS ALGReferencia, NULL AS ALGid, - - NULL AS MADEntrada, NULL AS MADSalida, NULL AS MADOK, NULL AS MADReferencia, NULL AS MADid, - - NULL AS MCFEntrada, NULL AS MCFSalida, NULL AS MCFOK, NULL AS MCFReferencia, NULL AS MCFid, - - NULL AS VILEntrada, NULL AS VILSalida, NULL AS VILOK, NULL AS VILReferencia, NULL AS VILid, - - NULL AS BAREntrada, NULL AS BARSalida, NULL AS BAROK, NULL AS BARReferencia, NULL AS BARid - - FROM hm2 - - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - ,Entrada, Salida, OK, Referencia, id - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - FROM hm3 - - - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , Entrada, Salida, OK, Referencia, id - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - FROM hm4 - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , Entrada, Salida, OK, Referencia, id - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - FROM hm5 - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , Entrada, Salida, OK, Referencia, id - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - FROM hm6 - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , Entrada, Salida, OK, Referencia, id - , NULL, NULL, NULL, NULL, NULL - - - FROM hm7 - - UNION ALL - - SELECT Fecha - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , NULL, NULL, NULL, NULL, NULL - , Entrada, Salida, OK, Referencia, id - - FROM hm8 - - ) sub - - ORDER BY Fecha, BOGEntrada IS NULL, VNHEntrada IS NULL, ALGEntrada IS NULL, MADEntrada IS NULL, MCFEntrada IS NULL, VILEntrada IS NULL, BAREntrada IS NULL; - -END$$ -DELIMITER ; diff --git a/db/versions/10932-azureEucalyptus/00-firstScript.sql b/db/versions/10932-azureEucalyptus/00-firstScript.sql new file mode 100644 index 000000000..55eea3211 --- /dev/null +++ b/db/versions/10932-azureEucalyptus/00-firstScript.sql @@ -0,0 +1,2 @@ +GRANT EXECUTE ON PROCEDURE vn.absoluteInventoryHistory TO buyer; +GRANT EXECUTE ON PROCEDURE vn.multipleInventoryHistory TO buyer; From 66b7a3e8f55c8e033163e052acb96c50b0729115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 5 Mar 2024 17:30:29 +0100 Subject: [PATCH 078/183] feat: restricciones AWB para travel y entry refs #6960 --- db/routines/vn/triggers/entry_beforeInsert.sql | 2 +- db/routines/vn/triggers/entry_beforeUpdate.sql | 4 ++-- db/routines/vn/triggers/travel_afterUpdate.sql | 2 +- db/routines/vn/triggers/travel_beforeInsert.sql | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/db/routines/vn/triggers/entry_beforeInsert.sql b/db/routines/vn/triggers/entry_beforeInsert.sql index a5fe1d126..c0c0aa28c 100644 --- a/db/routines/vn/triggers/entry_beforeInsert.sql +++ b/db/routines/vn/triggers/entry_beforeInsert.sql @@ -8,7 +8,7 @@ BEGIN SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk); SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk,NEW.supplierFk); IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN - CALL util.throw('El travel no es correcto, en las entradas asociadas existe un AWB distinto'); + CALL util.throw('The travel is incorrect, there is a different AWB in the associated entries'); END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 328843442..384feb458 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -12,8 +12,8 @@ BEGIN IF NOT (NEW.travelFk <=> OLD.travelFk) THEN IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN - CALL util.throw('El travel no es correcto, en las entradas asociadas existe un AWB distinto'); - END IF; + CALL util.throw('The travel is incorrect, there is a different AWB in the associated entries'); + END IF; SELECT COUNT(*) > 0 INTO vIsVirtual FROM entryVirtual WHERE entryFk = NEW.id; diff --git a/db/routines/vn/triggers/travel_afterUpdate.sql b/db/routines/vn/triggers/travel_afterUpdate.sql index aa1489300..7752505e3 100644 --- a/db/routines/vn/triggers/travel_afterUpdate.sql +++ b/db/routines/vn/triggers/travel_afterUpdate.sql @@ -25,7 +25,7 @@ BEGIN END IF; IF (NOT(NEW.awbFk <=> OLD.awbFk)) AND NEW.awbFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.id) THEN - CALL util.throw('El AWB no es correcto, en las entradas asociadas existe un AWB distinto'); + CALL util.throw('The AWB is incorrect, there is a different AWB in the associated entries'); END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/travel_beforeInsert.sql b/db/routines/vn/triggers/travel_beforeInsert.sql index 9505f4e16..817bd69bb 100644 --- a/db/routines/vn/triggers/travel_beforeInsert.sql +++ b/db/routines/vn/triggers/travel_beforeInsert.sql @@ -10,7 +10,7 @@ BEGIN CALL travel_checkWarehouseIsFeedStock(NEW.warehouseInFk); IF NEW.awbFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.id) THEN - CALL util.throw('El AWB no es correcto, en las entradas asociadas existe un AWB distinto'); + CALL util.throw('The AWB is incorrect, there is a different AWB in the associated entries'); END IF; END$$ DELIMITER ; From 354ecfaa1684d1f17db20d092ce9821a849219d9 Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 6 Mar 2024 09:00:21 +0100 Subject: [PATCH 079/183] refs #6498 Arreglar grant y tabs --- .../procedures/absoluteInventoryHistory.sql | 4 +- .../procedures/multipleInventoryHistory.sql | 206 +++++++++--------- .../10932-azureEucalyptus/00-firstScript.sql | 20 ++ 3 files changed, 125 insertions(+), 105 deletions(-) diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index f1a317598..a1e143185 100644 --- a/db/routines/vn/procedures/absoluteInventoryHistory.sql +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`absoluteInventoryHistory`( - vItemFk INT, vWarehouse INT, vDate DATETIME) + vItemFk INT, vWarehouse INT, vDate DATETIME) BEGIN /** * Calcula y proporciona un historial de inventario absoluto @@ -72,7 +72,7 @@ BEGIN WHERE t.shipped >= '2001-01-01' AND m.itemFk = vItemFk AND vWarehouse IN (t.warehouseFk , 0) - ) t1 + ) t1 ORDER BY `date`, input DESC, ok DESC; SELECT sum(input) - sum(`output`) INTO vCalculatedInventory diff --git a/db/routines/vn/procedures/multipleInventoryHistory.sql b/db/routines/vn/procedures/multipleInventoryHistory.sql index bd399e889..b15cab549 100644 --- a/db/routines/vn/procedures/multipleInventoryHistory.sql +++ b/db/routines/vn/procedures/multipleInventoryHistory.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`multipleInventoryHistory`( - vItemFk INT) + vItemFk INT) BEGIN /** * Calcula y proporciona un historial de inventario detallado @@ -17,58 +17,58 @@ BEGIN CREATE TEMPORARY TABLE tMultipleHistory1 SELECT DATE(`date`) `date`, - input, + input, `output`, ok, reference, history.id, warehouse, `name` warehouseName - FROM ( - SELECT tr.landed `date`, + FROM ( + SELECT tr.landed `date`, c.quantity input, NULL `output`, IF(warehouseInFk = 44, 1, warehouseInFk) warehouse, (tr.isReceived <> FALSE) ok, e.invoiceNumber reference, - e.id id - FROM buy c - JOIN `entry` e ON e.id = c.entryFk - JOIN travel tr ON tr.id = e.travelFk - WHERE tr.landed >= vDateInventory - AND c.itemFk = vItemFk - AND NOT e.isRaid - AND c.quantity <> 0 - UNION ALL - SELECT tr.shipped `date`, + e.id id + FROM buy c + JOIN `entry` e ON e.id = c.entryFk + JOIN travel tr ON tr.id = e.travelFk + WHERE tr.landed >= vDateInventory + AND c.itemFk = vItemFk + AND NOT e.isRaid + AND c.quantity <> 0 + UNION ALL + SELECT tr.shipped `date`, NULL input, c.quantity `output`, - warehouseOutFk warehouse, + tr.warehouseOutFk warehouse, tr.isDelivered ok, e.invoiceNumber reference, e.id id - FROM buy c - JOIN `entry` e ON e.id = c.entryFk - JOIN travel tr ON tr.id = e.travelFk - WHERE tr.shipped >= vDateInventory - AND c.itemFk = vItemFk - AND NOT e.isRaid - AND c.quantity <> 0 - UNION ALL - SELECT t.shipped `date`, + FROM buy c + JOIN `entry` e ON e.id = c.entryFk + JOIN travel tr ON tr.id = e.travelFk + WHERE tr.shipped >= vDateInventory + AND c.itemFk = vItemFk + AND NOT e.isRaid + AND c.quantity <> 0 + UNION ALL + SELECT t.shipped `date`, NULL input, m.quantity `output`, - warehouseInFk warehouse, + tr.warehouseInFk warehouse, (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) ok, t.refFk reference, t.id id - FROM sale m - JOIN ticket t ON t.id = m.ticketFk - WHERE t.shipped >= vDateInventory - AND m.itemFk = vItemFk - ) history - JOIN warehouse ON warehouse.id = history.warehouse - ORDER BY `date`, input DESC, ok DESC; + FROM sale m + JOIN ticket t ON t.id = m.ticketFk + WHERE t.shipped >= vDateInventory + AND m.itemFk = vItemFk + ) history + JOIN warehouse ON warehouse.id = history.warehouse + ORDER BY `date`, input DESC, ok DESC; DROP TEMPORARY TABLE IF EXISTS tMultipleHistory2; DROP TEMPORARY TABLE IF EXISTS tMultipleHistory3; @@ -86,76 +86,76 @@ BEGIN CREATE TEMPORARY TABLE tMultipleHistory8 SELECT * FROM tMultipleHistory1 WHERE warehouse = 55; SELECT * - FROM ( - SELECT `date`, input BOGinput, `output` BOGoutput, ok BOGok, reference BOGreference, id BOGid, - NULL VNHinput, NULL VNHoutput, NULL VNHok, NULL VNHreference, NULL VNHid, - NULL ALGinput, NULL ALGoutput, NULL ALGok, NULL ALGreference, NULL ALGid, - NULL MADinput, NULL MADoutput, NULL MADok, NULL MADreference, NULL MADid, - NULL MCFinput, NULL MCFoutput, NULL MCFok, NULL MCFreference, NULL MCFid, - NULL VILinput, NULL VILoutput, NULL VILok, NULL VILreference, NULL VILid, - NULL BARinput, NULL BARoutput, NULL BARok, NULL BARreference, NULL BARid - FROM tMultipleHistory2 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL - FROM tMultipleHistory3 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL - FROM tMultipleHistory4 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL - FROM tMultipleHistory5 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL - FROM tMultipleHistory6 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id, - NULL, NULL, NULL, NULL, NULL - FROM tMultipleHistory7 - UNION ALL - SELECT `date`, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, - input, `output`, ok, reference, id - FROM tMultipleHistory8 - ) sub - ORDER BY `date`, BOGinput IS NULL, VNHinput IS NULL, ALGinput IS NULL, MADinput IS NULL, MCFinput IS NULL, VILinput IS NULL, BARinput IS NULL; + FROM ( + SELECT `date`, input BOGinput, `output` BOGoutput, ok BOGok, reference BOGreference, id BOGid, + NULL VNHinput, NULL VNHoutput, NULL VNHok, NULL VNHreference, NULL VNHid, + NULL ALGinput, NULL ALGoutput, NULL ALGok, NULL ALGreference, NULL ALGid, + NULL MADinput, NULL MADoutput, NULL MADok, NULL MADreference, NULL MADid, + NULL MCFinput, NULL MCFoutput, NULL MCFok, NULL MCFreference, NULL MCFid, + NULL VILinput, NULL VILoutput, NULL VILok, NULL VILreference, NULL VILid, + NULL BARinput, NULL BARoutput, NULL BARok, NULL BARreference, NULL BARid + FROM tMultipleHistory2 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory3 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory4 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory5 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory6 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id, + NULL, NULL, NULL, NULL, NULL + FROM tMultipleHistory7 + UNION ALL + SELECT `date`, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + input, `output`, ok, reference, id + FROM tMultipleHistory8 + ) sub + ORDER BY `date`, BOGinput IS NULL, VNHinput IS NULL, ALGinput IS NULL, MADinput IS NULL, MCFinput IS NULL, VILinput IS NULL, BARinput IS NULL; END$$ DELIMITER ; \ No newline at end of file diff --git a/db/versions/10932-azureEucalyptus/00-firstScript.sql b/db/versions/10932-azureEucalyptus/00-firstScript.sql index 55eea3211..399819cc4 100644 --- a/db/versions/10932-azureEucalyptus/00-firstScript.sql +++ b/db/versions/10932-azureEucalyptus/00-firstScript.sql @@ -1,2 +1,22 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`multipleInventoryHistory`( + vItemFk INT) +BEGIN + DECLARE vDateInventory DATETIME; + SELECT inventoried INTO vDateInventory FROM config; + +END$$ +DELIMITER ; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`absoluteInventoryHistory`( + vItemFk INT, vWarehouse INT, vDate DATETIME) +BEGIN + DECLARE vCalculatedInventory INT; + SET vCalculatedInventory = 0; + +END$$ +DELIMITER ; + GRANT EXECUTE ON PROCEDURE vn.absoluteInventoryHistory TO buyer; GRANT EXECUTE ON PROCEDURE vn.multipleInventoryHistory TO buyer; From 2f0c8d96d22b92648537efda09801e63826263dd Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 6 Mar 2024 11:41:25 +0100 Subject: [PATCH 080/183] refs 5858 fix: resolve breaklines --- db/dump/fixtures.after.sql | 1 - db/routines/vn/triggers/zoneIncluded_afterDelete.sql | 1 - db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index c539b2aab..d7f3b22e8 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -324,5 +324,4 @@ INSERT INTO mysql.roles_mapping (`User`, `Host`, `Role`, `Admin_option`) FROM mysql.roles_mapping WHERE `User` LIKE @prefixedLike AND `Host` = @genRoleHost; - FLUSH PRIVILEGES; diff --git a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql index 3ff8be421..18332bb55 100644 --- a/db/routines/vn/triggers/zoneIncluded_afterDelete.sql +++ b/db/routines/vn/triggers/zoneIncluded_afterDelete.sql @@ -9,6 +9,5 @@ BEGIN `changedModelId` = OLD.zoneFk, `userFk` = account.myUser_getId(); - END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql index 445f37699..e3f0a27e2 100644 --- a/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql +++ b/db/routines/vn/triggers/zoneIncluded_beforeUpdate.sql @@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`zoneIncluded_beforeUp FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + END$$ DELIMITER ; From eb5fdd1940f8dcb55b5eb48e68fed41ef4b65411 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 6 Mar 2024 11:41:48 +0100 Subject: [PATCH 081/183] refs 5858 feat: replace with code --- db/versions/10881-greenHydrangea/01-notification.vn.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 5ed5786f6..1d6620c29 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -5,7 +5,7 @@ INSERT IGNORE INTO util.notification (`id`, `name`,`description`) INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( - @MaxId, 100); + @MaxId, (SELECT id from `account`.`user` where name = "system")); INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk) From 1b3a8ddbdde53982a4231820ff3017d397d03a37 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 12:03:35 +0100 Subject: [PATCH 082/183] refs #6755 fix restore --- modules/ticket/back/methods/ticket/restore.js | 16 ++++++++++------ modules/ticket/back/models/ticket-log.json | 2 +- modules/ticket/front/descriptor-menu/index.js | 15 ++++++++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index c85efb1c8..754c2e562 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -29,19 +29,23 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const ticket = await models.TicketLog.findById(id, { - fields: ['originFk', 'creationDate', 'newInstance'] + const ticket = await models.TicketLog.findOne({ + fields: ['originFk', 'creationDate', 'newInstance'], + where: { + originFk: id, + newInstance: {like: '%"isDeleted":true%'} + }, + order: 'creationDate DESC' }, myOptions); + console.log('id', id); console.log('ticket', ticket); const now = Date.vnNew(); const maxDate = new Date(ticket.creationDate); maxDate.setHours(maxDate.getHours() + 1); - if (ticket.newInstance.includes('isDeleted: true')) { - if (now > maxDate) - throw new UserError(`You can only restore a ticket within the first hour after deletion`); - } + if (now > maxDate) + throw new UserError(`You can only restore a ticket within the first hour after deletion`); // Send notification to salesPerson const salesPersonId = ticket.client().salesPersonFk; diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json index ac912856b..e46995a91 100644 --- a/modules/ticket/back/models/ticket-log.json +++ b/modules/ticket/back/models/ticket-log.json @@ -25,7 +25,7 @@ "description": { "type": "string" }, - "changeModel": { + "changedModel": { "type": "string" }, "oldInstance": { diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index e71913267..a73fed500 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -172,12 +172,17 @@ class Controller extends Section { } get canRestoreTicket() { - const isDeleted = this.ticket.isDeleted; - const now = Date.vnNew(); - const maxDate = new Date(this.ticket.updated); - maxDate.setHours(maxDate.getHours() + 1); + // const isDeleted = this.ticket.isDeleted; + // const now = Date.vnNew(); + // const maxDate = new Date(this.ticket.updated); + // maxDate.setHours(maxDate.getHours() + 1); - return isDeleted && (now <= maxDate); + // return isDeleted && (now <= maxDate); + return this.$http.get(`TicketLogs`).then(res => { + if (res && res.data.length) + console.log(res.data); + return true; + }); } restoreTicket() { From 7947d6644e5de63988e8845185b7d968efb997ca Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 6 Mar 2024 12:44:59 +0100 Subject: [PATCH 083/183] refs #6498 Correcion errores --- .../procedures/absoluteInventoryHistory.sql | 25 ++++++++++--------- .../procedures/multipleInventoryHistory.sql | 24 ++++++++---------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index a1e143185..7dce6e252 100644 --- a/db/routines/vn/procedures/absoluteInventoryHistory.sql +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -1,6 +1,9 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`absoluteInventoryHistory`( - vItemFk INT, vWarehouse INT, vDate DATETIME) + vItemFk INT, + vWarehouseFk INT, + vDate DATETIME +) BEGIN /** * Calcula y proporciona un historial de inventario absoluto @@ -8,13 +11,11 @@ BEGIN * hasta una fecha determinada. * * @param vItemFk Id de artículo -* @param vWarehouse Almacén +* @param vWarehouseFk Id de almacén * @param vDate Fecha */ DECLARE vCalculatedInventory INT; - DECLARE vToday DATETIME; - - SET vToday = util.VN_CURDATE(); + DECLARE vToday DATETIME DEFAULT util.VN_CURDATE(); CREATE OR REPLACE TEMPORARY TABLE tHistoricalPast ENGINE = MEMORY @@ -23,7 +24,7 @@ BEGIN SELECT tr.landed `date`, b.quantity input, NULL `output`, - (tr.isReceived != FALSE) ok, + tr.isReceived ok, s.name alias, e.invoiceNumber reference, e.id id, @@ -34,7 +35,7 @@ BEGIN JOIN supplier s ON s.id = e.supplierFk WHERE tr.landed >= '2001-01-01' AND s.id <> 4 - AND vWarehouse IN (tr.warehouseInFk, 0) + AND vWarehouseFk IN (tr.warehouseInFk, 0) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable AND NOT e.isRaid @@ -52,7 +53,7 @@ BEGIN JOIN travel tr ON tr.id = e.travelFk JOIN supplier s ON s.id = e.supplierFk WHERE tr.shipped >= '2001-01-01' - AND vWarehouse = tr.warehouseOutFk + AND vWarehouseFk = tr.warehouseOutFk AND s.id <> 4 AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable @@ -61,7 +62,7 @@ BEGIN SELECT t.shipped `date`, NULL input, m.quantity `output`, - (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) ok, + (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL) ok, t.nickname alias, t.refFk reference, t.id, @@ -71,16 +72,16 @@ BEGIN JOIN client c ON c.id = t.clientFk WHERE t.shipped >= '2001-01-01' AND m.itemFk = vItemFk - AND vWarehouse IN (t.warehouseFk , 0) + AND vWarehouseFk IN (t.warehouseFk , 0) ) t1 ORDER BY `date`, input DESC, ok DESC; - SELECT sum(input) - sum(`output`) INTO vCalculatedInventory + SELECT SUM(input) - SUM(`output`) INTO vCalculatedInventory FROM tHistoricalPast WHERE `date` < vDate; SELECT p1.*, NULL v_virtual - FROM( + FROM ( SELECT vDate `date`, vCalculatedInventory input, NULL `output`, diff --git a/db/routines/vn/procedures/multipleInventoryHistory.sql b/db/routines/vn/procedures/multipleInventoryHistory.sql index b15cab549..ec151a6ff 100644 --- a/db/routines/vn/procedures/multipleInventoryHistory.sql +++ b/db/routines/vn/procedures/multipleInventoryHistory.sql @@ -29,16 +29,16 @@ BEGIN c.quantity input, NULL `output`, IF(warehouseInFk = 44, 1, warehouseInFk) warehouse, - (tr.isReceived <> FALSE) ok, + tr.isReceived ok, e.invoiceNumber reference, - e.id id + e.id FROM buy c JOIN `entry` e ON e.id = c.entryFk JOIN travel tr ON tr.id = e.travelFk WHERE tr.landed >= vDateInventory AND c.itemFk = vItemFk AND NOT e.isRaid - AND c.quantity <> 0 + AND c.quantity UNION ALL SELECT tr.shipped `date`, NULL input, @@ -46,20 +46,20 @@ BEGIN tr.warehouseOutFk warehouse, tr.isDelivered ok, e.invoiceNumber reference, - e.id id + e.id FROM buy c JOIN `entry` e ON e.id = c.entryFk JOIN travel tr ON tr.id = e.travelFk WHERE tr.shipped >= vDateInventory AND c.itemFk = vItemFk AND NOT e.isRaid - AND c.quantity <> 0 + AND c.quantity UNION ALL SELECT t.shipped `date`, NULL input, m.quantity `output`, tr.warehouseInFk warehouse, - (m.isPicked <> 0 OR t.isLabeled <> 0 OR t.refFk IS NOT NULL) ok, + (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL) ok, t.refFk reference, t.id id FROM sale m @@ -70,13 +70,8 @@ BEGIN JOIN warehouse ON warehouse.id = history.warehouse ORDER BY `date`, input DESC, ok DESC; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory2; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory3; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory4; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory5; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory6; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory7; - DROP TEMPORARY TABLE IF EXISTS tMultipleHistory8; + DROP TEMPORARY TABLE IF EXISTS tMultipleHistory2, tMultipleHistory3, + tMultipleHistory4, tMultipleHistory5, tMultipleHistory6, tMultipleHistory7, tMultipleHistory8; CREATE TEMPORARY TABLE tMultipleHistory2 SELECT * FROM tMultipleHistory1 WHERE warehouse = 19; CREATE TEMPORARY TABLE tMultipleHistory3 SELECT * FROM tMultipleHistory1 WHERE warehouse = 7; CREATE TEMPORARY TABLE tMultipleHistory4 SELECT * FROM tMultipleHistory1 WHERE warehouse = 60; @@ -156,6 +151,7 @@ BEGIN input, `output`, ok, reference, id FROM tMultipleHistory8 ) sub - ORDER BY `date`, BOGinput IS NULL, VNHinput IS NULL, ALGinput IS NULL, MADinput IS NULL, MCFinput IS NULL, VILinput IS NULL, BARinput IS NULL; + ORDER BY `date`, BOGinput IS NULL, VNHinput IS NULL, ALGinput IS NULL, + MADinput IS NULL, MCFinput IS NULL, VILinput IS NULL, BARinput IS NULL; END$$ DELIMITER ; \ No newline at end of file From 59a0cb3f4aa9e461f7143e7d8666afa22cd11161 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 13:08:20 +0100 Subject: [PATCH 084/183] refs #6842 deprecated and move --- .../vn/triggers/invoiceOut_beforeInsert.sql | 12 ++-- db/versions/10893-limeFern/00-sage.sql | 57 ++++++++++++------- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql index f3a292edd..eb5c1150f 100644 --- a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql +++ b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql @@ -17,16 +17,16 @@ BEGIN DECLARE vRefLen INT; DECLARE vRefPrefix VARCHAR(255); DECLARE vLastRef VARCHAR(255); - DECLARE vSage200Company INT; + DECLARE vCompanyCode INT; DECLARE vYearLen INT DEFAULT 2; DECLARE vPrefixLen INT; - SELECT sage200Company INTO vSage200Company + SELECT companyCode INTO vCompanyCode FROM company WHERE id = NEW.companyFk; - IF vSage200Company IS NULL THEN - CALL util.throw('vSage200CompanyNotDefined'); + IF vCompanyCode IS NULL THEN + CALL util.throw('vCompanyCodeNotDefined'); END IF; SELECT MAX(i.ref) INTO vLastRef @@ -36,7 +36,7 @@ BEGIN AND i.companyFk = NEW.companyFk; IF vLastRef IS NOT NULL THEN - SET vPrefixLen = LENGTH(NEW.serial) + LENGTH(vSage200Company) + vYearLen; + SET vPrefixLen = LENGTH(NEW.serial) + LENGTH(vCompanyCode) + vYearLen; SET vRefLen = LENGTH(vLastRef) - vPrefixLen; SET vRefPrefix = LEFT(vLastRef, vPrefixLen); SET vRef = RIGHT(vLastRef, vRefLen); @@ -44,7 +44,7 @@ BEGIN SELECT refLen INTO vRefLen FROM invoiceOutConfig; SET vRefPrefix = CONCAT( NEW.serial, - vSage200Company, + vCompanyCode, RIGHT(YEAR(NEW.issued), vYearLen) ); END IF; diff --git a/db/versions/10893-limeFern/00-sage.sql b/db/versions/10893-limeFern/00-sage.sql index 049bb2993..9d076050e 100644 --- a/db/versions/10893-limeFern/00-sage.sql +++ b/db/versions/10893-limeFern/00-sage.sql @@ -1,35 +1,54 @@ --- Auto-generated SQL script #202402151810 +-- Auto-generated SQL script #202403061303 UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=0 WHERE id=69; UPDATE vn.company - SET companyGroupFk=NULL - WHERE id=567; -UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=0 WHERE id=791; UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=3 WHERE id=792; UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=5 WHERE id=965; UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=7 WHERE id=1381; UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=3 WHERE id=1463; UPDATE vn.company - SET companyGroupFk=NULL - WHERE id=2142; -UPDATE vn.company - SET companyGroupFk=NULL - WHERE id=2292; -UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=6 WHERE id=2393; UPDATE vn.company - SET companyGroupFk=NULL + SET companyCode=9 WHERE id=3869; -ALTER TABLE vn.company MODIFY COLUMN sage200Company int(2) DEFAULT NULL NULL COMMENT 'Campo para la serie InvoiceOut'; + +-- Auto-generated SQL script #202403061303 +UPDATE vn.company + SET companyCode=0 + WHERE id=69; +UPDATE vn.company + SET companyCode=0 + WHERE id=791; +UPDATE vn.company + SET companyCode=3 + WHERE id=792; +UPDATE vn.company + SET companyCode=5 + WHERE id=965; +UPDATE vn.company + SET companyCode=7 + WHERE id=1381; +UPDATE vn.company + SET companyCode=3 + WHERE id=1463; +UPDATE vn.company + SET companyCode=6 + WHERE id=2393; +UPDATE vn.company + SET companyCode=9 + WHERE id=3869; + +ALTER TABLE vn.company CHANGE sage200Company sage200Company__ int(2) DEFAULT NULL NULL COMMENT '@deprecated 06/03/2024'; +ALTER TABLE vn.company MODIFY COLUMN sage200Company__ int(2) DEFAULT NULL NULL COMMENT '@deprecated 06/03/2024'; From a24445439ab389ebf8054f766d81bbd1e2b1c3af Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 13:09:03 +0100 Subject: [PATCH 085/183] remove v --- db/routines/vn/triggers/invoiceOut_beforeInsert.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql index eb5c1150f..8eb25e710 100644 --- a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql +++ b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql @@ -26,7 +26,7 @@ BEGIN WHERE id = NEW.companyFk; IF vCompanyCode IS NULL THEN - CALL util.throw('vCompanyCodeNotDefined'); + CALL util.throw('CompanyCodeNotDefined'); END IF; SELECT MAX(i.ref) INTO vLastRef From 6a13a33f840b550c72b6dfd34fe4f6bd9ec12d0a Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 13:09:41 +0100 Subject: [PATCH 086/183] min c --- db/routines/vn/triggers/invoiceOut_beforeInsert.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql index 8eb25e710..0081c8803 100644 --- a/db/routines/vn/triggers/invoiceOut_beforeInsert.sql +++ b/db/routines/vn/triggers/invoiceOut_beforeInsert.sql @@ -26,7 +26,7 @@ BEGIN WHERE id = NEW.companyFk; IF vCompanyCode IS NULL THEN - CALL util.throw('CompanyCodeNotDefined'); + CALL util.throw('companyCodeNotDefined'); END IF; SELECT MAX(i.ref) INTO vLastRef From 58a239708d1dca4dbd23af0f260ad03e801d8790 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 13:11:41 +0100 Subject: [PATCH 087/183] refs #6842 remove sage --- db/versions/10893-limeFern/00-sage.sql | 28 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/db/versions/10893-limeFern/00-sage.sql b/db/versions/10893-limeFern/00-sage.sql index 9d076050e..01508b932 100644 --- a/db/versions/10893-limeFern/00-sage.sql +++ b/db/versions/10893-limeFern/00-sage.sql @@ -24,31 +24,41 @@ UPDATE vn.company SET companyCode=9 WHERE id=3869; --- Auto-generated SQL script #202403061303 +-- Auto-generated SQL script #202403061311 UPDATE vn.company - SET companyCode=0 + SET sage200Company=NULL WHERE id=69; UPDATE vn.company - SET companyCode=0 + SET sage200Company=NULL + WHERE id=442; +UPDATE vn.company + SET sage200Company=NULL + WHERE id=567; +UPDATE vn.company + SET sage200Company=NULL WHERE id=791; UPDATE vn.company - SET companyCode=3 + SET sage200Company=NULL WHERE id=792; UPDATE vn.company - SET companyCode=5 + SET sage200Company=NULL WHERE id=965; UPDATE vn.company - SET companyCode=7 + SET sage200Company=NULL WHERE id=1381; UPDATE vn.company - SET companyCode=3 + SET sage200Company=NULL WHERE id=1463; UPDATE vn.company - SET companyCode=6 + SET sage200Company=NULL + WHERE id=2142; +UPDATE vn.company + SET sage200Company=NULL WHERE id=2393; UPDATE vn.company - SET companyCode=9 + SET sage200Company=NULL WHERE id=3869; + ALTER TABLE vn.company CHANGE sage200Company sage200Company__ int(2) DEFAULT NULL NULL COMMENT '@deprecated 06/03/2024'; ALTER TABLE vn.company MODIFY COLUMN sage200Company__ int(2) DEFAULT NULL NULL COMMENT '@deprecated 06/03/2024'; From a14ab90d5a8ef1cb513c867ac50109c491fb68fb Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 14:41:58 +0100 Subject: [PATCH 088/183] refs #6755 fix restore add fixtures --- db/dump/fixtures.before.sql | 7 +++++++ modules/ticket/front/descriptor-menu/index.js | 1 + 2 files changed, 8 insertions(+) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index aef0f13e3..b8f31ac3a 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -3069,3 +3069,10 @@ INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentIns UPDATE vn.department SET workerFk = null; + +INSERT INTO vn.ticketLog (originFk,userFk,`action`,creationDate,changedModel,newInstance,changedModelId,changedModelValue) + VALUES (9,9,'insert','2000-01-01 11:01:00.000','Ticket','{"isDeleted":true}',45,'Super Man'); + +UPDATE vn.ticket + SET isDeleted=1 + WHERE id=9; diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index a73fed500..245142a60 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -181,6 +181,7 @@ class Controller extends Section { return this.$http.get(`TicketLogs`).then(res => { if (res && res.data.length) console.log(res.data); + console.log(res); return true; }); } From 2e4a5029b8304f8a452b0033331c4313e7bc21c1 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 6 Mar 2024 14:52:49 +0100 Subject: [PATCH 089/183] refs #6755 fix restore --- modules/ticket/back/methods/ticket/restore.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 754c2e562..0d2452df9 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -38,6 +38,15 @@ module.exports = Self => { order: 'creationDate DESC' }, myOptions); + const ticketOG = await models.Ticket.findById(id, { + include: [{ + relation: 'client', + scope: { + fields: ['id', 'salesPersonFk'] + } + }] + }, myOptions); + console.log('id', id); console.log('ticket', ticket); const now = Date.vnNew(); @@ -48,7 +57,7 @@ module.exports = Self => { throw new UserError(`You can only restore a ticket within the first hour after deletion`); // Send notification to salesPerson - const salesPersonId = ticket.client().salesPersonFk; + const salesPersonId = ticketOG.client().salesPersonFk; if (salesPersonId) { const url = await Self.app.models.Url.getUrl(); const message = $t(`I have restored the ticket id`, { @@ -59,12 +68,12 @@ module.exports = Self => { } const fullYear = Date.vnNew().getFullYear(); - const newShipped = ticket.shipped; - const newLanded = ticket.landed; + const newShipped = ticketOG.shipped; + const newLanded = ticketOG.landed; newShipped.setFullYear(fullYear); newLanded.setFullYear(fullYear); - return ticket.updateAttributes({ + return ticketOG.updateAttributes({ shipped: newShipped, landed: newLanded, isDeleted: false From 6b2533cfb122ddd832ae9c6a447fe5bbac8b96fa Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 6 Mar 2024 15:16:55 +0100 Subject: [PATCH 090/183] refs #6498 correccion errores 2 --- .../procedures/absoluteInventoryHistory.sql | 41 ++++++++++--------- .../procedures/multipleInventoryHistory.sql | 31 +++++++------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index 7dce6e252..627b7c8be 100644 --- a/db/routines/vn/procedures/absoluteInventoryHistory.sql +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -16,6 +16,7 @@ BEGIN */ DECLARE vCalculatedInventory INT; DECLARE vToday DATETIME DEFAULT util.VN_CURDATE(); + DECLARE vStartDate DATE DEFAULT '2001-01-01'; CREATE OR REPLACE TEMPORARY TABLE tHistoricalPast ENGINE = MEMORY @@ -33,46 +34,46 @@ BEGIN JOIN `entry` e ON e.id = b.entryFk JOIN travel tr ON tr.id = e.travelFk JOIN supplier s ON s.id = e.supplierFk - WHERE tr.landed >= '2001-01-01' - AND s.id <> 4 + WHERE tr.landed >= vStartDate + AND s.id <> (SELECT supplierFk FROM inventoryConfig) AND vWarehouseFk IN (tr.warehouseInFk, 0) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable AND NOT e.isRaid UNION ALL - SELECT tr.shipped `date`, - NULL input, - b.quantity `output`, - tr.isDelivered ok, - s.name alias, - e.invoiceNumber reference, - e.id id, - tr.isDelivered f5 + SELECT tr.shipped, + NULL, + b.quantity, + tr.isDelivered, + s.name, + e.invoiceNumber, + e.id, + tr.isDelivered FROM buy b JOIN `entry` e ON e.id = b.entryFk JOIN travel tr ON tr.id = e.travelFk JOIN supplier s ON s.id = e.supplierFk - WHERE tr.shipped >= '2001-01-01' + WHERE tr.shipped >= vStartDate AND vWarehouseFk = tr.warehouseOutFk - AND s.id <> 4 + AND s.id <> (SELECT supplierFk FROM inventoryConfig) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable AND NOT e.isRaid UNION ALL - SELECT t.shipped `date`, - NULL input, - m.quantity `output`, - (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL) ok, - t.nickname alias, - t.refFk reference, + SELECT t.shipped, + NULL, + m.quantity, + (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL), + t.nickname, + t.refFk, t.id, t.isPrinted FROM sale m JOIN ticket t ON t.id = m.ticketFk JOIN client c ON c.id = t.clientFk - WHERE t.shipped >= '2001-01-01' + WHERE t.shipped >= vStartDate AND m.itemFk = vItemFk - AND vWarehouseFk IN (t.warehouseFk , 0) + AND vWarehouseFk IN (t.warehouseFk, 0) ) t1 ORDER BY `date`, input DESC, ok DESC; diff --git a/db/routines/vn/procedures/multipleInventoryHistory.sql b/db/routines/vn/procedures/multipleInventoryHistory.sql index ec151a6ff..dc19e615a 100644 --- a/db/routines/vn/procedures/multipleInventoryHistory.sql +++ b/db/routines/vn/procedures/multipleInventoryHistory.sql @@ -1,6 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`multipleInventoryHistory`( - vItemFk INT) + vItemFk INT +) BEGIN /** * Calcula y proporciona un historial de inventario detallado @@ -28,7 +29,7 @@ BEGIN SELECT tr.landed `date`, c.quantity input, NULL `output`, - IF(warehouseInFk = 44, 1, warehouseInFk) warehouse, + tr.warehouseInFk warehouse, tr.isReceived ok, e.invoiceNumber reference, e.id @@ -40,12 +41,12 @@ BEGIN AND NOT e.isRaid AND c.quantity UNION ALL - SELECT tr.shipped `date`, - NULL input, - c.quantity `output`, - tr.warehouseOutFk warehouse, - tr.isDelivered ok, - e.invoiceNumber reference, + SELECT tr.shipped, + NULL, + c.quantity, + tr.warehouseOutFk, + tr.isDelivered, + e.invoiceNumber, e.id FROM buy c JOIN `entry` e ON e.id = c.entryFk @@ -55,13 +56,13 @@ BEGIN AND NOT e.isRaid AND c.quantity UNION ALL - SELECT t.shipped `date`, - NULL input, - m.quantity `output`, - tr.warehouseInFk warehouse, - (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL) ok, - t.refFk reference, - t.id id + SELECT t.shipped, + NULL, + m.quantity, + t.warehouseFk, + (m.isPicked OR t.isLabeled OR t.refFk IS NOT NULL), + t.refFk, + t.id FROM sale m JOIN ticket t ON t.id = m.ticketFk WHERE t.shipped >= vDateInventory From a94fd1a61cdbacbd604b89a1a2712d4cdcae546b Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 7 Mar 2024 09:29:51 +0100 Subject: [PATCH 091/183] fix: refs #6744 change error kind --- loopback/locale/en.json | 3 ++- loopback/locale/es.json | 3 ++- modules/worker/back/methods/worker/setPassword.js | 4 ++-- modules/worker/back/methods/worker/specs/setPassword.spec.js | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 62c0afcf8..31b954a32 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -221,5 +221,6 @@ "printerNotExists": "The printer does not exist", "There are not picking tickets": "There are not picking tickets", "ticketCommercial": "The ticket {{ ticket }} for the salesperson {{ salesMan }} is in preparation. (automatically generated message)", - "This password can only be changed by the user themselves": "This password can only be changed by the user themselves" + "This password can only be changed by the user themselves": "This password can only be changed by the user themselves", + "They're not your subordinate": "They're not your subordinate" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index bf4717c97..945474726 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -348,5 +348,6 @@ "Cmr file does not exist": "El archivo del cmr no existe", "You are not allowed to modify the alias": "No estás autorizado a modificar el alias", "The address of the customer must have information about Incoterms and Customs Agent": "El consignatario del cliente debe tener informado Incoterms y Agente de aduanas", - "This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario" + "This password can only be changed by the user themselves": "Esta contraseña solo puede ser modificada por el propio usuario", + "They're not your subordinate": "No es tu subordinado/a." } diff --git a/modules/worker/back/methods/worker/setPassword.js b/modules/worker/back/methods/worker/setPassword.js index e6bdfb364..9969530a4 100644 --- a/modules/worker/back/methods/worker/setPassword.js +++ b/modules/worker/back/methods/worker/setPassword.js @@ -1,4 +1,4 @@ -const UserError = require('vn-loopback/util/user-error'); +const ForbiddenError = require('vn-loopback/util/forbiddenError'); module.exports = Self => { Self.remoteMethodCtx('setPassword', { description: 'Set a new password', @@ -32,7 +32,7 @@ module.exports = Self => { } try { const isSubordinate = await Self.isSubordinate(ctx, id, myOptions); - if (!isSubordinate) throw new UserError('You don\'t have enough privileges.'); + if (!isSubordinate) throw new ForbiddenError('They\'re not your subordinate'); await models.Account.setUnverifiedPassword(id, newPass, myOptions); diff --git a/modules/worker/back/methods/worker/specs/setPassword.spec.js b/modules/worker/back/methods/worker/specs/setPassword.spec.js index 03cbee03b..8d152bdd1 100644 --- a/modules/worker/back/methods/worker/specs/setPassword.spec.js +++ b/modules/worker/back/methods/worker/specs/setPassword.spec.js @@ -54,7 +54,7 @@ describe('worker setPassword()', () => { await models.Worker.setPassword(ctx, administrativeId, newPass, options); await tx.rollback(); } catch (e) { - expect(e.message).toEqual(`You don't have enough privileges.`); + expect(e.message).toEqual(`They're not your subordinate`); await tx.rollback(); } }); From d4d3fdceb5075874f19d4a163d0bc54326c6e130 Mon Sep 17 00:00:00 2001 From: carlossa Date: Thu, 7 Mar 2024 11:36:30 +0100 Subject: [PATCH 092/183] refs #6755 fix canRestoreTicket --- modules/ticket/back/methods/ticket/restore.js | 2 -- .../back/methods/ticket/specs/filter.spec.js | 2 +- .../back/methods/ticket/specs/restore.spec.js | 18 ++++++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 0d2452df9..9dde43ff9 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -47,8 +47,6 @@ module.exports = Self => { }] }, myOptions); - console.log('id', id); - console.log('ticket', ticket); const now = Date.vnNew(); const maxDate = new Date(ticket.creationDate); maxDate.setHours(maxDate.getHours() + 1); diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js index c1d3f1a9c..09c4ebbb7 100644 --- a/modules/ticket/back/methods/ticket/specs/filter.spec.js +++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js @@ -68,7 +68,7 @@ describe('ticket filter()', () => { const filter = {}; const result = await models.Ticket.filter(ctx, filter, options); - expect(result.length).toEqual(6); + expect(result.length).toEqual(5); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/back/methods/ticket/specs/restore.spec.js b/modules/ticket/back/methods/ticket/specs/restore.spec.js index 3b35ae2b4..736e68628 100644 --- a/modules/ticket/back/methods/ticket/specs/restore.spec.js +++ b/modules/ticket/back/methods/ticket/specs/restore.spec.js @@ -2,9 +2,9 @@ const app = require('vn-loopback/server/server'); const LoopBackContext = require('loopback-context'); const models = app.models; -describe('ticket restore()', () => { +fdescribe('ticket restore()', () => { const employeeUser = 1110; - const ticketId = 18; + const ticketId = 9; const activeCtx = { accessToken: {userId: employeeUser}, headers: { @@ -48,25 +48,31 @@ describe('ticket restore()', () => { const tx = await app.models.Ticket.beginTransaction({}); const now = Date.vnNew(); + console.log('now', now); try { const options = {transaction: tx}; - const ticketBeforeUpdate = await models.Ticket.findById(ticketId, null, options); + const ticketBeforeUpdate = await models.TicketLog.findById(ticketId, null, options); await ticketBeforeUpdate.updateAttributes({ - isDeleted: true, - updated: now + creationDate: '2001-01-01T11:00:00.000Z', }, options); - const ticketAfterUpdate = await models.Ticket.findById(ticketId, null, options); + console.log('ticketBeforeUpdate', ticketBeforeUpdate); + const ticketAfterUpdate = await models.TicketLog.findById(ticketId, null, options); + console.log('ticketAfterUpdate: ', ticketAfterUpdate); expect(ticketAfterUpdate.isDeleted).toBeTruthy(); await models.Ticket.restore(ctx, ticketId, options); const ticketAfterRestore = await models.Ticket.findById(ticketId, null, options); + console.log('ticketAfterRestore: ', ticketAfterRestore); const fullYear = now.getFullYear(); + console.log('fullYear: ', fullYear); const shippedFullYear = ticketAfterRestore.shipped.getFullYear(); + console.log('shippedFullYear: ', shippedFullYear); const landedFullYear = ticketAfterRestore.landed.getFullYear(); + console.log('landedFullYear: ', landedFullYear); expect(ticketAfterRestore.isDeleted).toBeFalsy(); expect(shippedFullYear).toEqual(fullYear); From b588b9807ce73a19f6f2a7f48828a6ab487990e5 Mon Sep 17 00:00:00 2001 From: Pako Date: Thu, 7 Mar 2024 13:45:53 +0100 Subject: [PATCH 093/183] fixtures local --- db/dump/fixtures.after.sql | 411 ------------------------------------- 1 file changed, 411 deletions(-) diff --git a/db/dump/fixtures.after.sql b/db/dump/fixtures.after.sql index 13e423d68..4c5f89d97 100644 --- a/db/dump/fixtures.after.sql +++ b/db/dump/fixtures.after.sql @@ -292,418 +292,7 @@ INSERT INTO `hedera`.`tpvConfig` (currency, terminal, transactionType, maxAmount */ INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk) VALUES (1, 442); --- XXX: floranet -INSERT IGNORE INTO vn.intrastat(id, description, taxClassFk, taxCodeFk) -VALUES(6031970, 'Flores y capullos frescos (Otras: ramos, coronas)', 1, 63); - - -INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) - VALUES('FNR', 'Floranet Ramos', 1, 1); - -INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) - VALUES('FNP', 'Floranet Plantas', 1, 1); - --- Generación de items -SELECT id - INTO @FNR - FROM vn.itemType - WHERE code = 'FNR'; - -SELECT id - INTO @FNP - FROM vn.itemType - WHERE code = 'FNP'; - -DELETE - FROM vn.item - WHERE typeFk IN (@FNR,@FNP); - -SELECT MAX(id) + 1 - INTO @item - FROM vn.item; - -INSERT INTO vn.item - ( - id, - name, - longName, - `size`, - originFk, - intrastatFk, - typeFk, - inkFk, - image, - description - ) - VALUES - ( - @item := @item + 1, - @r := 'Ramo Terranova', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin ORDER BY RAND() LIMIT 1), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1CwtEK5_GReAzconaJsPTCXxV7zajbTos/view?usp=drive_link', - CONCAT('Hemos elegido una selección de flores muy especiales para realizar ', - 'esta composición: brásicas, flor de cera, astrantia, espigas, lisiantum, ', - 'paniculata eucaliptus.') - ), - ( - @item := @item + 1, - @r := 'Ramo Tasmania', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1_149uYZ-sehw3vWH68Quttk8QJe5T_bG/view?usp=drive_link', - CONCAT('La elegancia de este ramo es por la elección de todas las flores que lo componen: ', - 'eringium, verdes variados, rosas proteas, margaritas, astrantia, esta selección de ', - 'flores será un acierto seguro para hacer un regalo muy especial.') - ), - ( - @item := @item + 1, - @r := 'Ramo Pasion', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1-dH1UilV-nOH9XNK23uooZoezlwMT-Jq/view?usp=drive_link', - CONCAT('La unión de las rosas rojas con el lilium rosa hace de este ramo uno de ', - 'los más especiales , el juego de las dos tonalidades con los diferentes verdes ', - 'que cuidadosamente selecionamos para darle el toque final a la composicion hace ', - 'que este ramo sea al mismo tiempo elegante y atrevido, para amantes de lo inesperado ', - 'que quieren decorar alguna estancia de su hogar o hacer un ragalo muy especial') - ), - ( - @item := @item + 1, - @r := 'Ramo Florencia', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1PWKo5N8kg8H3xQtELdeQTQIc1HMZCc1P/view?usp=drive_link', - CONCAT('Este ramo evoca los colores del atardecer en Florencia, las rosas ramificadas ', - 'de pitimini con diferentes tonalidades y la paniculata nos transpotan al ambiente ', - 'sofisticado del norte de Italia y la frescura de los verdes variados nos recuerda ', - 'a la campiña italiana .Este ramo es ideal para regalar pensando en alguien muy especial.') - ), - ( - @item := @item + 1, - @r := 'Ramo Atardecer', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink WHERE name = 'Yellow'), - 'https://drive.google.com/file/d/1eM4gtftQuXN5xUjAHIRUYNPZNmuHVRA_/view?usp=drive_link', - CONCAT('Las rosas amarillas simbolizan la alegría de vivir, la calidez ,el ', - 'optimismo y la energía, por eso son el regalo perfecto para una ocasión muy ', - 'especial o para celebrar la alegría de una amistad o de un encuentro, a estas ', - 'preciosas rosas les añadimos un toque desenfadado a través de los verdes ', - 'variados que unidos a la belleza de la rosa que seguro serán una apuesta segura.') - ), - ( - @item := @item + 1, - @r := 'Ramo Arcoíris', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1Hxk5yqo7891gfK1VKIYfWxO5a_0K2Qej/view?usp=drive_link', - CONCAT('Llega la primavera a tu casa con el ramo Arco Iris , conseguirás iluminar ', - 'cualquier estancia gracias a la combinacón de las gerberas holandesas de gran ', - 'tamaño con colores muy vivos que a su vez contrastan a la perfección con las ', - 'margaritas coconut y el estatice variado, todo ello acompañado de verdes entre ', - 'los que destaca el ruscus danae , para dulcificar la explosión de color , ', - 'añadimos paniculata , una flor sencilla pero que aporta gran armonía al ramo') - ), - ( - @item := @item + 1, - @r := 'Ramo Provenza', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1TA9SBwjqnrEqG1bzwDL37sxtX9CNyLJk/view?usp=drive_link', - CONCAT('La delicada composición de este ramo escogida de forma minuciosa hecho ', - 'con liliums rosa, lisiantum blanco y rosas de color rosa todo ello unificado ', - 'con una selección de maravillosos verdes variados, hacen que esta combinación ', - 'sea muy especial para decorar cualquier estancia de tu casa a la que aportará una luz especial.') - ), - ( - @item := @item + 1, - @r := 'Ramo Alegria', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1sOf2isj84P9OxR3E3x6n2PjPnWVamLCE/view?usp=drive_link', - CONCAT('Hemos elegido el nombre de Alegría para este ramo ya que sus intensos ', - 'y variados colores nos producen esa sensación, la combinación de rosas blancas ', - ', alstroemeria rosa unida a la paniculata tambien de color rosa y a la sutileza ', - 'de la combinación de verdes variados, hace de este ramo una opción perfecta de ', - 'regalo que a todo el mundo le gusta por su armoniosa combinacion de colores.') - ), - ( - @item := @item + 1, - @r := 'Planta Orquídeas ', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNP, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/14BIkDDonFaIiTyJer1CWju1YzZNzt3XQ/view?usp=drive_link', - CONCAT('Elegimos personalmente en nuestra tienda dos plantas de orquídeas ', - 'con las mejores características combinadas con diferentes elementos de ', - 'decoración consiguiendo una composición ideal para cualquier ambiente.El ', - 'recipiente de cerámica se puede utilizar para múltiples funciones y sacar ', - 'de el las dos plantas de orquídeas para colocarlas en dos puntos diferentes ', - 'de nuestro hogar, ya que se respeta siempre las macetas originales de cada orquídea') - ), - ( - @item := @item + 1, - @r := 'Planta Kentia', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNP, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1rKe2RicfWha-VIm1LbbXckbA41glA99K/view?usp=drive_link', - CONCAT('La Kentia es una de las plantas más decorativas debido al porte que ', - 'le otorgan sus largas finas hojas arqueadas, ideal para un regalo que dejará ', - 'sin palabras a quien lo reciba o para decorar una estancia de tu hogar, ', - 'desde un espacio super moderno hasta el ambiente más clásico. Nuestras Kentias ', - 'proceden de uno de los mejores productores de kentias del mundo, con el añadido ', - 'de ser un producto nacional producido en Canarias de una calidad extrema.') - ), - ( - @item := @item + 1, - @r := 'Planta Calathea', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNP, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/11CKm5rqVFVPOELciuyXUrkc2oeTHJzBE/view?usp=drive_link', - CONCAT('Esta planta originaria de América tropical, principalmente de Brasil y Perú ', - ', son plantas ideales para embellecer el interior de una estancia . Debido a su ', - 'llamativo y original colorido, tambien es un regalo perfecto para ', - 'cualquier compromiso que tengamos .') - ), - ( - @item := @item + 1, - @r := 'Planta Anthurium ', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNP, - (SELECT id FROM vn.ink WHERE name = 'Red'), - 'https://drive.google.com/file/d/1j4il_N9VJGaP4f6CPZM0u6GjxwIeYcBt/view?usp=drive_link', - CONCAT('Nos encanta el color rojo de sus flores .Esta planta original de ', - 'Costa Rica ,proviene de las zonas tropicales de America Central y del Sur, ', - 'su llamativo color alegrará cualquier celebración') - ), - ( - @item := @item + 1, - @r := 'Ramo Mindanao', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1lsGDuC6xmv3SyGukfLTVYsQvbGf1Bzxy/view?usp=drive_link', - CONCAT('La combinación de rosas ramificadas amarillas, las hortensias blancas, ', - 'el estatice, el limonium Tanacetum y los verdes variados hace de este ramo uno ', - 'de los que más gustan tanto si es para regalar como para decorar un rincón de tu casa.') - ), - ( - @item := @item + 1, - @r := 'Ramo Guinea', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1MtF0oghv-ahogaAaVpJNzDiIfyeCCmAi/view?usp=drive_link', - CONCAT('Hemos elegido una selección de flores muy especiales para realizar esta composición:', - ' brásicas, flor de cera, astrantia, espigas, lisiantum, paniculata eucaliptus.') - ), - ( - @item := @item + 1, - @r := 'Ramo Eterno', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/1AOMqlZAKqImnnWSmeq1DW1Krj78mACCG/view?usp=drive_link', - CONCAT('La perfecta combinación de los diferentes tonos de estatice y el eucaliptus ', - 'cinerea hacen de este ramo un recuerdo inolvidable ya que ambos materiales son de ', - 'larga duración por lo que podrás conservar tu ramo junto con las bonitas vivencias ', - 'de ese día durante mucho tiempo, además le añadimos un toque especial que le dan ', - 'las raices las cuales combinan con los tonos del ramo, unas bonitas cintas del colores ', - 'rematan el acabado del ramo. Este ramo se puede secar y mantenerse en perfecto estado.') - ), - ( - @item := @item + 1, - @r := 'Ramo Cielo', - @r, - 20 + CEIL(RAND() * 55), - (SELECT id FROM vn.origin WHERE code = 'SPA'), - 6031970, - @FNR, - (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), - 'https://drive.google.com/file/d/168DikIOwVT5OO4BHARBoWwLB1wjpAS7s/view?usp=drive_link', - CONCAT('Las hortensias son unas de las flores más elegantes que existen y ', - 'la combinación que proponemos para este ramo te resultará de lo más armoniosa ', - ', ya que intercalamos flores de mayor tamaño como las hortensias azules y ', - 'blancas junto con flores más pequeñas y delicadas como el estatice , todo ello', - ' combinado con el eucaliptus cinerea que te aportará un sueve aroma en toda ', - 'la estancia, el atado del ramo es de rafia natural, siguiendo la tonalidad ', - 'clara de todo el conjunto. ') - ); - - -- Ramo Terranova: 1er elemento -INSERT INTO vn.item( - name, - longName, - `size`, - stems, - inkFk, - intrastatFk, - typeFk, - originFk) - SELECT - @r:= 'Rosa roja', - @r, - 60, - 1, - 'RED', - 6031970, - id, - 1 - FROM vn.itemType - WHERE code LIKE 'FNE'; - -SELECT LAST_INSERT_ID() INTO @itemFk; - -INSERT INTO floranet.`element` - SET itemFk = @itemFk; - -INSERT INTO floranet.builder( - itemFk, - elementFk, - quantity) - SELECT - id, - @itemFk, - 12 - FROM vn.item - WHERE name = 'Ramo Terranova'; - - -- Ramo Terranova: 2º elemento - -INSERT INTO vn.item( - name, - longName, - `size`, - stems, - inkFk, - intrastatFk, - typeFk, - originFk) - SELECT - @r:= 'Hoja de helecho', - @r, - 60, - 1, - 'BAS', - 6031970, - id, - 1 - FROM vn.itemType - WHERE code LIKE 'FNE'; - -SELECT LAST_INSERT_ID() INTO @itemFk; - -INSERT INTO floranet.`element` - SET itemFk = @itemFk; - -INSERT INTO floranet.builder( - itemFk, - elementFk, - quantity) - SELECT - id, - @itemFk, - 4 - FROM vn.item - WHERE name = 'Ramo Terranova'; - - - -- Ramo Terranova: 3er elemento -INSERT INTO vn.item( - name, - longName, - `size`, - stems, - inkFk, - intrastatFk, - typeFk, - originFk) - SELECT - @r:= 'Paniculata', - @r, - 60, - 1, - 'SLV', - 6031970, - id, - 1 - FROM vn.itemType - WHERE code LIKE 'FNE'; - -SELECT LAST_INSERT_ID() INTO @itemFk; - -INSERT INTO floranet.`element` - SET itemFk = @itemFk; - -INSERT INTO floranet.builder( - itemFk, - elementFk, - quantity) - SELECT - id, - @itemFk, - 5 - FROM vn.item - WHERE name = 'Ramo Terranova'; - - - -- XXX SET foreign_key_checks = 1; From 8a16c24245afac127bbf785ff9923ed8f6ebaf88 Mon Sep 17 00:00:00 2001 From: carlossa Date: Fri, 8 Mar 2024 12:27:47 +0100 Subject: [PATCH 094/183] refs #6755 fix ticket --- modules/ticket/front/descriptor-menu/index.js | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index 245142a60..f60e0012c 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -8,6 +8,7 @@ class Controller extends Section { this.vnReport = vnReport; this.vnEmail = vnEmail; this.vnFile = vnFile; + this.restoreTicket = vnRestoreTicket; } get ticketId() { @@ -172,18 +173,18 @@ class Controller extends Section { } get canRestoreTicket() { - // const isDeleted = this.ticket.isDeleted; - // const now = Date.vnNew(); - // const maxDate = new Date(this.ticket.updated); - // maxDate.setHours(maxDate.getHours() + 1); + const isDeleted = this.ticket.isDeleted; + const now = Date.vnNew(); + const maxDate = new Date(this.ticket.updated); + maxDate.setHours(maxDate.getHours() + 1); - // return isDeleted && (now <= maxDate); - return this.$http.get(`TicketLogs`).then(res => { - if (res && res.data.length) - console.log(res.data); - console.log(res); - return true; - }); + return isDeleted && (now <= maxDate); + // return this.$http.get(`TicketLogs`).then(res => { + // if (res && res.data.length) + // console.log(res.data); + // console.log(res); + // return true; + // }); } restoreTicket() { From 879adfaac8db6a72e92bf607004e5f0c207d081e Mon Sep 17 00:00:00 2001 From: carlossa Date: Fri, 8 Mar 2024 14:59:33 +0100 Subject: [PATCH 095/183] refs #6755 restore fix --- .../ticket/front/descriptor-menu/index.html | 1 + modules/ticket/front/descriptor-menu/index.js | 45 ++++++++++++------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/modules/ticket/front/descriptor-menu/index.html b/modules/ticket/front/descriptor-menu/index.html index cb7eeb8ee..0b9b1b2a1 100644 --- a/modules/ticket/front/descriptor-menu/index.html +++ b/modules/ticket/front/descriptor-menu/index.html @@ -86,6 +86,7 @@ translate> Delete ticket + {{$ctrl.canRestoreTicket}} { + console.log(res); + console.log(res.data.creationDate); + if (res && res.data) { + console.log(res.data); + const now = Date.vnNew(); + const maxDate = new Date(res.data.creationDate); + maxDate.setHours(maxDate.getHours() + 1); + console.log(now, maxDatenow); + console.log(now.getTime(), maxDate.getTime()); + if (now <= maxDate) + return this.canRestoreTicket = true; + } + this.canRestoreTicket = false; + }) + .catch(() => { + console.log('ENTRY'); + this.canRestoreTicket = false; + }); } get isInvoiced() { @@ -172,21 +200,6 @@ class Controller extends Section { }); } - get canRestoreTicket() { - const isDeleted = this.ticket.isDeleted; - const now = Date.vnNew(); - const maxDate = new Date(this.ticket.updated); - maxDate.setHours(maxDate.getHours() + 1); - - return isDeleted && (now <= maxDate); - // return this.$http.get(`TicketLogs`).then(res => { - // if (res && res.data.length) - // console.log(res.data); - // console.log(res); - // return true; - // }); - } - restoreTicket() { return this.$http.post(`Tickets/${this.id}/restore`) .then(() => this.reload()) From 4994a836c7119a6c894e3600a78ba71438ecb410 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Sat, 9 Mar 2024 11:27:29 +0100 Subject: [PATCH 096/183] refs #5858 feat: alter table util.notification --- .../10881-greenHydrangea/00-alterTableNotification.sql | 1 + db/versions/10881-greenHydrangea/01-notification.vn.sql | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 db/versions/10881-greenHydrangea/00-alterTableNotification.sql diff --git a/db/versions/10881-greenHydrangea/00-alterTableNotification.sql b/db/versions/10881-greenHydrangea/00-alterTableNotification.sql new file mode 100644 index 000000000..068d77839 --- /dev/null +++ b/db/versions/10881-greenHydrangea/00-alterTableNotification.sql @@ -0,0 +1 @@ +ALTER TABLE util.notification MODIFY COLUMN id int(11) auto_increment NOT NULL; diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 1d6620c29..6c9152ec7 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -1,8 +1,7 @@ -SET @MaxId = (SELECT MAX(id)+1 from util.notification n); -INSERT IGNORE INTO util.notification (`id`, `name`,`description`) +INSERT IGNORE INTO util.notification ( `name`,`description`) VALUES -(@MaxId, 'zone-included','An email to notify zoneCollisions'); - +( 'zone-included','An email to notify zoneCollisions'); +SET @MaxId = LAST_INSERT_ID(); INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( @MaxId, (SELECT id from `account`.`user` where name = "system")); From 51fa0e1a757531ddb516cf26fa33c895857a7b7a Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 11 Mar 2024 08:12:29 +0100 Subject: [PATCH 097/183] fix: refs #6925 refund invoice transaltions --- modules/invoiceOut/front/descriptor-menu/index.html | 2 +- modules/invoiceOut/front/descriptor-menu/index.js | 11 +++++++---- .../invoiceOut/front/descriptor-menu/locale/es.yml | 2 +- modules/ticket/front/descriptor-menu/locale/es.yml | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html index 435db3612..face46293 100644 --- a/modules/invoiceOut/front/descriptor-menu/index.html +++ b/modules/invoiceOut/front/descriptor-menu/index.html @@ -102,7 +102,7 @@ diff --git a/modules/invoiceOut/front/descriptor-menu/index.js b/modules/invoiceOut/front/descriptor-menu/index.js index 2c28599e7..5184c137e 100644 --- a/modules/invoiceOut/front/descriptor-menu/index.js +++ b/modules/invoiceOut/front/descriptor-menu/index.js @@ -118,11 +118,14 @@ class Controller extends Section { const query = 'InvoiceOuts/refund'; const params = {ref: this.invoiceOut.ref, withWarehouse: withWarehouse}; this.$http.post(query, params).then(res => { - const refundTicket = res.data; - this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { - ticketId: refundTicket.id + const tickets = res.data; + const refundTickets = tickets.map(ticket => ticket.id); + + this.vnApp.showSuccess(this.$t('The following refund tickets have been created', { + ticketId: refundTickets.join(',') })); - this.$state.go('ticket.card.sale', {id: refundTicket.id}); + if (refundTickets.length == 1) + this.$state.go('ticket.card.sale', {id: refundTickets[0]}); }); } diff --git a/modules/invoiceOut/front/descriptor-menu/locale/es.yml b/modules/invoiceOut/front/descriptor-menu/locale/es.yml index aaeefd9cc..9285fafa7 100644 --- a/modules/invoiceOut/front/descriptor-menu/locale/es.yml +++ b/modules/invoiceOut/front/descriptor-menu/locale/es.yml @@ -15,7 +15,7 @@ Are you sure you want to clone this invoice?: Estas seguro de clonar esta factur InvoiceOut booked: Factura asentada Are you sure you want to book this invoice?: Estas seguro de querer asentar esta factura? Are you sure you want to refund this invoice?: Estas seguro de querer abonar esta factura? -Create a single ticket with all the content of the current invoice: Crear un ticket unico con todo el contenido de la factura actual +Create a refund ticket for each ticket on the current invoice: Crear un ticket abono por cada ticket de la factura actual Regenerate PDF invoice: Regenerar PDF factura The invoice PDF document has been regenerated: El documento PDF de la factura ha sido regenerado The email can't be empty: El correo no puede estar vacío diff --git a/modules/ticket/front/descriptor-menu/locale/es.yml b/modules/ticket/front/descriptor-menu/locale/es.yml index 3181a753c..d0802fc4d 100644 --- a/modules/ticket/front/descriptor-menu/locale/es.yml +++ b/modules/ticket/front/descriptor-menu/locale/es.yml @@ -15,6 +15,7 @@ with warehouse: con almacén without warehouse: sin almacén Invoice sent: Factura enviada The following refund ticket have been created: "Se ha creado siguiente ticket de abono: {{ticketId}}" +The following refund tickets have been created: "Se ha creado los siguientes tickets de abono: {{ticketId}}" Transfer client: Transferir cliente Send SMS...: Enviar SMS... Notify changes: Notificar cambios From b051b0512fcb8abf63c2207cee732d641ce746c7 Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 11 Mar 2024 09:48:29 +0100 Subject: [PATCH 098/183] refs #6842 fix fixtures --- db/dump/fixtures.before.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 094b956af..05e183bfd 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -592,13 +592,13 @@ INSERT INTO `vn`.`supplierAccount`(`id`, `supplierFk`, `iban`, `bankEntityFk`) VALUES (241, 442, 'ES111122333344111122221111', 128); -INSERT INTO `vn`.`company`(`id`, `code`, `supplierAccountFk`, `workerManagerFk`, `companyCode`, `sage200Company`, `expired`, `companyGroupFk`, `phytosanitary` , `clientFk`) +INSERT INTO `vn`.`company`(`id`, `code`, `supplierAccountFk`, `workerManagerFk`, `companyCode`, `expired`, `companyGroupFk`, `phytosanitary` , `clientFk`) VALUES - (69 , 'CCs', NULL, 30, NULL, 0, NULL, 1, NULL , NULL), - (442 , 'VNL', 241, 30, 2 , 1, NULL, 2, 'VNL Company - Plant passport' , 1101), - (567 , 'VNH', NULL, 30, NULL, 4, NULL, 1, 'VNH Company - Plant passport' , NULL), - (791 , 'FTH', NULL, 30, NULL, 3, '2015-11-30', 1, NULL , NULL), - (1381, 'ORN', NULL, 30, NULL, 7, NULL, 1, 'ORN Company - Plant passport' , NULL); + (69 , 'CCs', NULL, 30, 0, NULL, 1, NULL , NULL), + (442 , 'VNL', 241, 30, 1, NULL, 2, 'VNL Company - Plant passport' , 1101), + (567 , 'VNH', NULL, 30, 4, NULL, 1, 'VNH Company - Plant passport' , NULL), + (791 , 'FTH', NULL, 30, 3, '2015-11-30', 1, NULL , NULL), + (1381, 'ORN', NULL, 30, 7, NULL, 1, 'ORN Company - Plant passport' , NULL); INSERT INTO `vn`.`taxArea` (`code`, `claveOperacionFactura`, `CodigoTransaccion`) VALUES @@ -728,7 +728,7 @@ INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agen INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight`, `cmrFk`) VALUES (1 , 3, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 121, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1), - (2 , 1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 2), + (2 , 1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 2), (3 , 1, 7, 1, 6, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -2 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL, 3), (4 , 3, 2, 1, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 9, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL, NULL), (5 , 3, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -4 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), NULL, NULL), From 6627c7a16a8f30b8c0219eea0ad86dc9fbaeb263 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 12 Mar 2024 08:25:01 +0100 Subject: [PATCH 099/183] refs #6913 routeKm --- modules/route/back/models/route.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js index 3505609d1..bf1f26e74 100644 --- a/modules/route/back/models/route.js +++ b/modules/route/back/models/route.js @@ -30,9 +30,11 @@ module.exports = Self => { }); function validateDistance(err) { - const routeTotalKm = this.kmEnd - this.kmStart; - const routeMaxKm = 4000; - if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) - err(); + if (this.kmEnd) { + const routeTotalKm = this.kmEnd - this.kmStart; + const routeMaxKm = 4000; + if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) + err(); + } } }; From 5531639027138950a1b73565be11ce3162c858b3 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 12 Mar 2024 09:34:12 +0100 Subject: [PATCH 100/183] feat: refs #6951 create procedure --- db/routines/vn/procedures/ticketClon.sql | 54 ++----------------- db/routines/vn/procedures/ticket_Clone.sql | 4 +- db/routines/vn/procedures/ticket_CloneAll.sql | 54 +++++++++++++++++++ 3 files changed, 61 insertions(+), 51 deletions(-) create mode 100644 db/routines/vn/procedures/ticket_CloneAll.sql diff --git a/db/routines/vn/procedures/ticketClon.sql b/db/routines/vn/procedures/ticketClon.sql index 81328bc11..00386c6aa 100644 --- a/db/routines/vn/procedures/ticketClon.sql +++ b/db/routines/vn/procedures/ticketClon.sql @@ -1,55 +1,11 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticketClon`(vTicketFk INT, vNewShipped DATE) BEGIN - - DECLARE done INT DEFAULT FALSE; - DECLARE vNewTicketFk INT; - DECLARE vOldSaleFk INT; - DECLARE vNewSaleFk INT; - - DECLARE cur1 CURSOR FOR - SELECT id - FROM vn.sale - WHERE ticketFk = vTicketFk; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - SET vNewShipped = IFNULL(vNewShipped, util.VN_CURDATE()); - - CALL vn.ticket_Clone(vTicketFk, vNewTicketFk); - - UPDATE vn.ticket - SET landed = TIMESTAMPADD(DAY, DATEDIFF(vNewShipped, shipped), landed), - shipped = vNewShipped - WHERE id = vNewTicketFk; - - OPEN cur1; - - read_loop: LOOP - - FETCH cur1 INTO vOldSaleFk; - - IF done THEN - LEAVE read_loop; - END IF; - - INSERT INTO vn.sale(ticketFk, itemFk, quantity, concept, price, discount, priceFixed, isPriceFixed) - SELECT vNewTicketFk, itemFk, quantity, concept, price, discount, priceFixed, isPriceFixed - FROM vn.sale - WHERE id = vOldSaleFk; - - SELECT max(id) INTO vNewSaleFk - FROM vn.sale - WHERE ticketFk = vNewTicketFk; - - INSERT INTO vn.saleComponent(saleFk, componentFk, value, isGreuge) - SELECT vNewSaleFk, componentFk, value, isGreuge - FROM vn.saleComponent - WHERE saleFk = vOldSaleFk; - - END LOOP; - CLOSE cur1; - + DECLARE vNewTicketFk INT; + + CALL ticket_CloneAll(vTicketFk, vNewShipped, TRUE, vNewTicketFk); + SELECT vNewTicketFk; + END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/ticket_Clone.sql b/db/routines/vn/procedures/ticket_Clone.sql index 7670e832e..cdddd6225 100644 --- a/db/routines/vn/procedures/ticket_Clone.sql +++ b/db/routines/vn/procedures/ticket_Clone.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_Clone`(vOriginalTicket INT, OUT vNewTicket INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_Clone`(vOriginalTicket INT, OUT vNewTicket INT,vWithWarehouse BOOLEAN) BEGIN /** * Clona el contenido de un ticket en otro @@ -32,7 +32,7 @@ BEGIN addressFk, agencyModeFk, nickname, - warehouseFk, + IF(vWithWarehouse, warehouseFk, NULL), companyFk, landed, zoneFk, diff --git a/db/routines/vn/procedures/ticket_CloneAll.sql b/db/routines/vn/procedures/ticket_CloneAll.sql new file mode 100644 index 000000000..4adb50a10 --- /dev/null +++ b/db/routines/vn/procedures/ticket_CloneAll.sql @@ -0,0 +1,54 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_CloneAll`(vTicketFk INT, vNewShipped DATE, vWithWarehouse BOOLEAN, OUT vNewTicketFk INT) +BEGIN + + DECLARE done INT DEFAULT FALSE; + DECLARE vOldSaleFk INT; + DECLARE vNewSaleFk INT; + + DECLARE cur1 CURSOR FOR + SELECT id + FROM vn.sale + WHERE ticketFk = vTicketFk; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET vNewShipped = IFNULL(vNewShipped, util.VN_CURDATE()); + + CALL vn.ticket_Clone(vTicketFk, vNewTicketFk, vWithWarehouse); + + UPDATE vn.ticket + SET landed = TIMESTAMPADD(DAY, DATEDIFF(vNewShipped, shipped), landed), + shipped = vNewShipped + WHERE id = vNewTicketFk; + + OPEN cur1; + + read_loop: LOOP + + FETCH cur1 INTO vOldSaleFk; + + IF done THEN + LEAVE read_loop; + END IF; + + INSERT INTO vn.sale(ticketFk, itemFk, quantity, concept, price, discount, priceFixed, isPriceFixed) + SELECT vNewTicketFk, itemFk, quantity, concept, price, discount, priceFixed, isPriceFixed + FROM vn.sale + WHERE id = vOldSaleFk; + + SELECT max(id) INTO vNewSaleFk + FROM vn.sale + WHERE ticketFk = vNewTicketFk; + + INSERT INTO vn.saleComponent(saleFk, componentFk, value, isGreuge) + SELECT vNewSaleFk, componentFk, value, isGreuge + FROM vn.saleComponent + WHERE saleFk = vOldSaleFk; + + END LOOP; + + CLOSE cur1; + +END$$ +DELIMITER ; From c1d0ea7e2770648a235fd84cebd14a160e0c309d Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 12 Mar 2024 09:40:42 +0100 Subject: [PATCH 101/183] refs #5858: breaklines --- db/dump/fixtures.before.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 3797b94cd..1414dbe9f 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2811,6 +2811,7 @@ INSERT INTO `util`.`notification` (`id`, `name`, `description`) (5, 'modified-entry', 'An entry has been modified'), (6, 'book-entry-deleted', 'accounting entries deleted'), (7, 'zone-included','An email to notify zoneCollisions'); + INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) VALUES (1, 9), @@ -2840,7 +2841,6 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) (6, 9), (7, 9); - INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) VALUES (1, 9); From e7f6e61ea1a8404989edbb48c0ea954926e78aae Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 12 Mar 2024 10:20:43 +0100 Subject: [PATCH 102/183] refs #5858: change notification owner --- db/dump/fixtures.before.sql | 314 +++++++++--------- .../01-notification.vn.sql | 4 +- 2 files changed, 159 insertions(+), 159 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 1414dbe9f..65d358bb5 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2821,7 +2821,7 @@ INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) (4, 1), (5, 9), (6, 9), - (7, 1); + (7, 100); INSERT INTO `util`.`notificationQueue` (`id`, `notificationFk`, `params`, `authorFk`, `status`, `created`) VALUES @@ -2839,7 +2839,7 @@ INSERT INTO `util`.`notificationSubscription` (`notificationFk`, `userFk`) (1, 9), (1, 3), (6, 9), - (7, 9); + (7, 100); INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) VALUES @@ -3077,11 +3077,11 @@ INSERT INTO vn.packaging INSERT IGNORE INTO vn.intrastat - SET id = 44219999, - description = 'Manufacturas de madera', - taxClassFk = 1, + SET id = 44219999, + description = 'Manufacturas de madera', + taxClassFk = 1, taxCodeFk = 1; - + INSERT IGNORE INTO vn.warehouse SET id = 999, name = 'TestingWarehouse', @@ -3092,33 +3092,33 @@ INSERT IGNORE INTO vn.warehouse hasProduction = TRUE; INSERT IGNORE INTO vn.sector - SET id = 9991, - description = 'NormalSector', - warehouseFk = 999, - code = 'NS', - isPackagingArea = FALSE, - sonFk = NULL, - isMain = TRUE, + SET id = 9991, + description = 'NormalSector', + warehouseFk = 999, + code = 'NS', + isPackagingArea = FALSE, + sonFk = NULL, + isMain = TRUE, itemPackingTypeFk = NULL; INSERT IGNORE INTO vn.sector - SET id = 9992, - description = 'PreviousSector', - warehouseFk = 999, - code = 'PS', - isPackagingArea = FALSE, - sonFk = NULL, - isMain = TRUE, + SET id = 9992, + description = 'PreviousSector', + warehouseFk = 999, + code = 'PS', + isPackagingArea = FALSE, + sonFk = NULL, + isMain = TRUE, itemPackingTypeFk = NULL; INSERT IGNORE INTO vn.sector - SET id = 9993, - description = 'MezaninneSector', - warehouseFk = 999, - code = 'MS', - isPackagingArea = FALSE, - sonFk = 9991, - isMain = TRUE, + SET id = 9993, + description = 'MezaninneSector', + warehouseFk = 999, + code = 'MS', + isPackagingArea = FALSE, + sonFk = 9991, + isMain = TRUE, itemPackingTypeFk = NULL; @@ -3152,58 +3152,58 @@ INSERT IGNORE INTO vn.itemType SET id = 999, code = 'WOO', name = 'Wood Objects', - categoryFk = 3, + categoryFk = 3, workerFk = 103, isInventory = TRUE, life = 10, density = 250, - itemPackingTypeFk = NULL, + itemPackingTypeFk = NULL, temperatureFk = 'warm'; INSERT IGNORE INTO vn.travel - SET id = 99, - shipped = CURDATE(), + SET id = 99, + shipped = CURDATE(), landed = CURDATE(), - warehouseInFk = 999, - warehouseOutFk = 1, + warehouseInFk = 999, + warehouseOutFk = 1, isReceived = TRUE; INSERT INTO vn.entry SET id = 999, supplierFk = 791, - isConfirmed = TRUE, + isConfirmed = TRUE, dated = CURDATE(), - travelFk = 99, + travelFk = 99, companyFk = 442; INSERT INTO vn.ticket - SET id = 999999, + SET id = 999999, clientFk = 2, warehouseFk = 999, shipped = CURDATE(), - nickname = 'Cliente', + nickname = 'Cliente', addressFk = 1, - companyFk = 442, - agencyModeFk = 10, + companyFk = 442, + agencyModeFk = 10, landed = CURDATE(); INSERT INTO vn.collection - SET id = 10101010, + SET id = 10101010, workerFk = 9; - + INSERT IGNORE INTO vn.ticketCollection - SET id = 10101010, - ticketFk = 999999, + SET id = 10101010, + ticketFk = 999999, collectionFk = 10101010; - + INSERT INTO vn.item SET id = 999991, - name = 'Palito para pinchos', + name = 'Palito para pinchos', `size` = 25, - stems = NULL, - category = 'EXT', - typeFk = 999, - longName = 'Palito para pinchos', + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palito para pinchos', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 6, @@ -3230,19 +3230,19 @@ INSERT INTO vn.sale SET id = 99991, itemFk = 999991, ticketFk = 999999, - concept = 'Palito para pinchos', - quantity = 3, - price = 1, + concept = 'Palito para pinchos', + quantity = 3, + price = 1, discount = 0; INSERT INTO vn.item SET id = 999992, - name = 'Madera verde', + name = 'Madera verde', `size` = 10, - stems = NULL, - category = 'EXT', - typeFk = 999, - longName = 'Madera verde', + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Madera verde', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 50, @@ -3269,19 +3269,19 @@ INSERT INTO vn.sale SET id = 99992, itemFk = 999992, ticketFk = 999999, - concept = 'Madera Verde', - quantity = 10, - price = 1, + concept = 'Madera Verde', + quantity = 10, + price = 1, discount = 0; INSERT INTO vn.item SET id = 999993, - name = 'Madera Roja/Morada', + name = 'Madera Roja/Morada', `size` = 12, - stems = 2, - category = 'EXT', - typeFk = 999, - longName = 'Madera Roja/Morada', + stems = 2, + category = 'EXT', + typeFk = 999, + longName = 'Madera Roja/Morada', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 35, @@ -3305,30 +3305,30 @@ INSERT INTO vn.buy weight = 25; INSERT INTO vn.itemShelving - SET id = 9931, - itemFk = 999993, - shelvingFk = 'NCC', - visible = 10, - `grouping` = 5, + SET id = 9931, + itemFk = 999993, + shelvingFk = 'NCC', + visible = 10, + `grouping` = 5, packing = 10; - + INSERT INTO vn.sale SET id = 99993, itemFk = 999993, ticketFk = 999999, - concept = 'Madera Roja/Morada', - quantity = 15, - price = 1, + concept = 'Madera Roja/Morada', + quantity = 15, + price = 1, discount = 0; INSERT INTO vn.item SET id = 999994, - name = 'Madera Naranja', + name = 'Madera Naranja', `size` = 18, - stems = 1, - category = 'EXT', - typeFk = 999, - longName = 'Madera Naranja', + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Madera Naranja', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 160, @@ -3355,19 +3355,19 @@ INSERT INTO vn.sale SET id = 99994, itemFk = 999994, ticketFk = 999999, - concept = 'Madera Naranja', - quantity = 4, - price = 1, + concept = 'Madera Naranja', + quantity = 4, + price = 1, discount = 0; - + INSERT INTO vn.item SET id = 999995, - name = 'Madera Amarilla', + name = 'Madera Amarilla', `size` = 11, - stems = 5, - category = 'EXT', - typeFk = 999, - longName = 'Madera Amarilla', + stems = 5, + category = 'EXT', + typeFk = 999, + longName = 'Madera Amarilla', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 78, @@ -3394,20 +3394,20 @@ INSERT INTO vn.sale SET id = 99995, itemFk = 999995, ticketFk = 999999, - concept = 'Madera Amarilla', - quantity = 5, - price = 1, + concept = 'Madera Amarilla', + quantity = 5, + price = 1, discount = 0; - + -- Palito naranja INSERT INTO vn.item SET id = 999998, - name = 'Palito naranja', + name = 'Palito naranja', `size` = 11, - stems = 1, - category = 'EXT', - typeFk = 999, - longName = 'Palito naranja', + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito naranja', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 78, @@ -3434,20 +3434,20 @@ INSERT INTO vn.sale SET id = 99998, itemFk = 999998, ticketFk = 999999, - concept = 'Palito naranja', - quantity = 60, - price = 1, + concept = 'Palito naranja', + quantity = 60, + price = 1, discount = 0; -- Palito amarillo INSERT INTO vn.item SET id = 999999, - name = 'Palito amarillo', + name = 'Palito amarillo', `size` = 11, - stems = 1, - category = 'EXT', - typeFk = 999, - longName = 'Palito amarillo', + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito amarillo', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 78, @@ -3474,20 +3474,20 @@ INSERT INTO vn.sale SET id = 99999, itemFk = 999999, ticketFk = 999999, - concept = 'Palito amarillo', - quantity = 50, - price = 1, + concept = 'Palito amarillo', + quantity = 50, + price = 1, discount = 0; -- Palito azul INSERT INTO vn.item SET id = 1000000, - name = 'Palito azul', + name = 'Palito azul', `size` = 10, - stems = 1, - category = 'EXT', - typeFk = 999, - longName = 'Palito azul', + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito azul', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 78, @@ -3514,20 +3514,20 @@ INSERT INTO vn.sale SET id = 100000, itemFk = 1000000, ticketFk = 999999, - concept = 'Palito azul', - quantity = 50, - price = 1, + concept = 'Palito azul', + quantity = 50, + price = 1, discount = 0; -- Palito rojo INSERT INTO vn.item SET id = 1000001, - name = 'Palito rojo', + name = 'Palito rojo', `size` = 10, - stems = NULL, - category = 'EXT', - typeFk = 999, - longName = 'Palito rojo', + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palito rojo', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 78, @@ -3555,20 +3555,20 @@ INSERT INTO vn.sale SET id = 100001, itemFk = 1000001, ticketFk = 999999, - concept = 'Palito rojo', - quantity = 10, - price = 1, + concept = 'Palito rojo', + quantity = 10, + price = 1, discount = 0; - + -- Previa INSERT IGNORE INTO vn.item SET id = 999996, - name = 'Bolas de madera', + name = 'Bolas de madera', `size` = 2, - stems = 4, - category = 'EXT', - typeFk = 999, - longName = 'Bolas de madera', + stems = 4, + category = 'EXT', + typeFk = 999, + longName = 'Bolas de madera', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 20, @@ -3595,20 +3595,20 @@ INSERT vn.sale SET id = 99996, itemFk = 999996, ticketFk = 999999, - concept = 'Bolas de madera', - quantity = 4, - price = 7, + concept = 'Bolas de madera', + quantity = 4, + price = 7, discount = 0, isPicked = TRUE; INSERT IGNORE INTO vn.item SET id = 999997, - name = 'Palitos de polo MIX', + name = 'Palitos de polo MIX', `size` = 14, - stems = NULL, - category = 'EXT', - typeFk = 999, - longName = 'Palitos de polo MIX', + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palitos de polo MIX', itemPackingTypeFk = NULL, originFk = 1, weightByPiece = 20, @@ -3635,9 +3635,9 @@ INSERT vn.sale SET id = 99997, itemFk = 999997, ticketFk = 999999, - concept = 'Palitos de polo MIX', - quantity = 5, - price = 7, + concept = 'Palitos de polo MIX', + quantity = 5, + price = 7, discount = 0; USE vn; @@ -3670,38 +3670,38 @@ VALUES -- Previous for Bolas de madera INSERT IGNORE INTO vn.sectorCollection - SET id = 99, - userFk = 1, + SET id = 99, + userFk = 1, sectorFk = 9992; INSERT IGNORE INTO vn.saleGroup - SET id = 4, - userFk = 1, - parkingFk = 9, + SET id = 4, + userFk = 1, + parkingFk = 9, sectorFk = 9992; INSERT IGNORE INTO vn.sectorCollectionSaleGroup SET id = 9999, - sectorCollectionFk = 99, + sectorCollectionFk = 99, saleGroupFk = 999; INSERT vn.saleGroupDetail - SET id = 99991, - saleFk = 99996, + SET id = 99991, + saleFk = 99996, saleGroupFk = 999; - + INSERT INTO vn.saleTracking SET id = 7, - saleFk = 99996, + saleFk = 99996, isChecked = TRUE, workerFk = 103, stateFk = 28; - + INSERT IGNORE INTO vn.itemShelvingSale - SET id = 991, - itemShelvingFk = 9962, - saleFk = 99996, - quantity = 5, + SET id = 991, + itemShelvingFk = 9962, + saleFk = 99996, + quantity = 5, userFk = 1; UPDATE vn.ticket @@ -3734,4 +3734,4 @@ UPDATE vn.saleTracking SET stateFk = 26 WHERE id = 5; INSERT INTO vn.report (name) VALUES ('LabelCollection'); INSERT INTO vn.parkingLog(originFk, userFk, `action`, creationDate, description, changedModel,oldInstance, newInstance, changedModelId, changedModelValue) - VALUES(1, 18, 'update', util.VN_CURDATE(), NULL, 'SaleGroup', '{"parkingFk":null}', '{"parkingFk":1}', 1, NULL); \ No newline at end of file + VALUES(1, 18, 'update', util.VN_CURDATE(), NULL, 'SaleGroup', '{"parkingFk":null}', '{"parkingFk":1}', 1, NULL); diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 6c9152ec7..99b189d5c 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -4,8 +4,8 @@ INSERT IGNORE INTO util.notification ( `name`,`description`) SET @MaxId = LAST_INSERT_ID(); INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( - @MaxId, (SELECT id from `account`.`user` where name = "system")); + @MaxId, (SELECT id from `account`.`user` where name = "root")); INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk) - SELECT @MaxId, (SELECT id from `account`.`role` where name = "system") FROM util.notification WHERE name= "zone-included"; + SELECT @MaxId, (SELECT id from `account`.`role` where name = "root") FROM util.notification WHERE name= "zone-included"; From ed572126181361995176c6d148096a9d595d2eae Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 12 Mar 2024 12:55:14 +0100 Subject: [PATCH 103/183] refs #6755 fix restore --- modules/ticket/back/methods/ticket/restore.js | 16 +++++------ .../back/methods/ticket/specs/restore.spec.js | 27 +++++++++++-------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 9dde43ff9..555982f8d 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -29,7 +29,7 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); - const ticket = await models.TicketLog.findOne({ + const ticketLog = await models.TicketLog.findOne({ fields: ['originFk', 'creationDate', 'newInstance'], where: { originFk: id, @@ -38,7 +38,7 @@ module.exports = Self => { order: 'creationDate DESC' }, myOptions); - const ticketOG = await models.Ticket.findById(id, { + const ticket = await models.Ticket.findById(id, { include: [{ relation: 'client', scope: { @@ -48,14 +48,14 @@ module.exports = Self => { }, myOptions); const now = Date.vnNew(); - const maxDate = new Date(ticket.creationDate); + const maxDate = new Date(ticketLog.creationDate); maxDate.setHours(maxDate.getHours() + 1); - if (now > maxDate) + throw new UserError(`You can only restore a ticket within the first hour after deletion`); // Send notification to salesPerson - const salesPersonId = ticketOG.client().salesPersonFk; + const salesPersonId = ticket.client().salesPersonFk; if (salesPersonId) { const url = await Self.app.models.Url.getUrl(); const message = $t(`I have restored the ticket id`, { @@ -66,12 +66,12 @@ module.exports = Self => { } const fullYear = Date.vnNew().getFullYear(); - const newShipped = ticketOG.shipped; - const newLanded = ticketOG.landed; + const newShipped = ticket.shipped; + const newLanded = ticket.landed; newShipped.setFullYear(fullYear); newLanded.setFullYear(fullYear); - return ticketOG.updateAttributes({ + return ticket.updateAttributes({ shipped: newShipped, landed: newLanded, isDeleted: false diff --git a/modules/ticket/back/methods/ticket/specs/restore.spec.js b/modules/ticket/back/methods/ticket/specs/restore.spec.js index 736e68628..a44d39a7b 100644 --- a/modules/ticket/back/methods/ticket/specs/restore.spec.js +++ b/modules/ticket/back/methods/ticket/specs/restore.spec.js @@ -2,7 +2,7 @@ const app = require('vn-loopback/server/server'); const LoopBackContext = require('loopback-context'); const models = app.models; -fdescribe('ticket restore()', () => { +describe('ticket restore()', () => { const employeeUser = 1110; const ticketId = 9; const activeCtx = { @@ -48,31 +48,36 @@ fdescribe('ticket restore()', () => { const tx = await app.models.Ticket.beginTransaction({}); const now = Date.vnNew(); - console.log('now', now); try { const options = {transaction: tx}; - const ticketBeforeUpdate = await models.TicketLog.findById(ticketId, null, options); + const ticketBeforeUpdate = await models.Ticket.findById(ticketId, null, options); await ticketBeforeUpdate.updateAttributes({ - creationDate: '2001-01-01T11:00:00.000Z', + isDeleted: true, + updated: now }, options); - console.log('ticketBeforeUpdate', ticketBeforeUpdate); - const ticketAfterUpdate = await models.TicketLog.findById(ticketId, null, options); - console.log('ticketAfterUpdate: ', ticketAfterUpdate); + await models.TicketLog.create({ + originFk: ticketId, + userFk: employeeUser, + action: 'update', + changedModel: 'Ticket', + creationDate: new Date('2001-01-01 11:01:00'), + newInstance: '{"isDeleted":true}' + }, options); + + const ticketAfterUpdate = await models.Ticket.findById(ticketId, null, options); expect(ticketAfterUpdate.isDeleted).toBeTruthy(); await models.Ticket.restore(ctx, ticketId, options); const ticketAfterRestore = await models.Ticket.findById(ticketId, null, options); - console.log('ticketAfterRestore: ', ticketAfterRestore); const fullYear = now.getFullYear(); - console.log('fullYear: ', fullYear); + const shippedFullYear = ticketAfterRestore.shipped.getFullYear(); - console.log('shippedFullYear: ', shippedFullYear); + const landedFullYear = ticketAfterRestore.landed.getFullYear(); - console.log('landedFullYear: ', landedFullYear); expect(ticketAfterRestore.isDeleted).toBeFalsy(); expect(shippedFullYear).toEqual(fullYear); From f2f6e7be0b5354d041fe3c746fcf572ea06c7c3e Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 12 Mar 2024 13:29:53 +0100 Subject: [PATCH 104/183] refs #6930 perf: parallel calls --- front/core/services/auth.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/front/core/services/auth.js b/front/core/services/auth.js index e51a2ff12..8727f92bc 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -98,20 +98,19 @@ export default class Auth { } logout() { - this.$http.post('VnUsers/logoutMultimedia', null, {headers: {'Authorization': this.vnToken.tokenMultimedia}, - }).then(({data}) => { - if (data) { - this.$http.post('VnUsers/logout', null, { - headers: {Authorization: this.vnToken.token} - }).catch(() => {}); - - this.vnToken.unset(); - this.loggedIn = false; - this.vnModules.reset(); - this.aclService.reset(); - this.$state.go('login'); - } + this.$http.post('Accounts/logout', null, {headers: {'Authorization': this.vnToken.tokenMultimedia}, }); + + let promise = this.$http.post('VnUsers/logout', null, { + headers: {Authorization: this.vnToken.token} + }).catch(() => {}); + this.vnToken.unset(); + this.loggedIn = false; + this.vnModules.reset(); + this.aclService.reset(); + this.$state.go('login'); + + return promise; } loadAcls() { From c84e86270c8c910903f26f2311883b9771d38a19 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 12 Mar 2024 13:30:32 +0100 Subject: [PATCH 105/183] refs #6930 perf: remove logoutMultimedia method --- back/models/vn-user.js | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/back/models/vn-user.js b/back/models/vn-user.js index 473e619db..b59f13ffa 100644 --- a/back/models/vn-user.js +++ b/back/models/vn-user.js @@ -31,32 +31,6 @@ module.exports = function(Self) { message: `A client with that Web User name already exists` }); - Self.remoteMethod('logoutMultimedia', { - description: 'Logout current MultimediaToken', - accepts: [{ - arg: 'ctx', - type: 'Object', - http: {source: 'context'} - }], - returns: { - type: 'Boolean', - root: true - }, - http: { - verb: 'POST', - path: '/logoutMultimedia' - }, - accessScopes: ['read:multimedia'] - }); - Self.logoutMultimedia = async function(ctx) { - let {accessToken} = ctx.req; - try { - Self.logout(accessToken.id); - return true; - } catch (error) { - return error; - } - }; Self.remoteMethod('getCurrentUserData', { description: 'Gets the current user data', accepts: [ From a6d1c5b6db243a1c032f693da5e9180fefe44bbd Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 12 Mar 2024 13:33:14 +0100 Subject: [PATCH 106/183] refs #6755 remove --- modules/ticket/front/descriptor-menu/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ticket/front/descriptor-menu/index.html b/modules/ticket/front/descriptor-menu/index.html index 0b9b1b2a1..cb7eeb8ee 100644 --- a/modules/ticket/front/descriptor-menu/index.html +++ b/modules/ticket/front/descriptor-menu/index.html @@ -86,7 +86,6 @@ translate> Delete ticket - {{$ctrl.canRestoreTicket}} Date: Tue, 12 Mar 2024 13:39:01 +0100 Subject: [PATCH 107/183] refs #6930 perf: remove logoutMultimedia acl --- db/versions/10919-brownMoss/00-firstScript.sql | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/db/versions/10919-brownMoss/00-firstScript.sql b/db/versions/10919-brownMoss/00-firstScript.sql index a6abdbe79..640d2180a 100644 --- a/db/versions/10919-brownMoss/00-firstScript.sql +++ b/db/versions/10919-brownMoss/00-firstScript.sql @@ -1,5 +1,3 @@ -- Place your SQL code here -INSERT IGNORE INTO `salix`.`ACL`(`model`,`property`,`accessType`,`permission`, `principalType`, `principalId`) -VALUES -('VnUser','logoutMultimedia','*','ALLOW','ROLE','employee') + From 99f01a1dbd165bc89eee52dc2bbd66a0dde54de3 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Tue, 12 Mar 2024 13:39:21 +0100 Subject: [PATCH 108/183] refs #6930 perf: add accessScopes to account.logout --- modules/account/back/methods/account/logout.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/account/back/methods/account/logout.js b/modules/account/back/methods/account/logout.js index 5db3efa33..7d2e8153e 100644 --- a/modules/account/back/methods/account/logout.js +++ b/modules/account/back/methods/account/logout.js @@ -15,7 +15,8 @@ module.exports = Self => { http: { path: `/logout`, verb: 'POST' - } + }, + accessScopes: ['DEFAULT', 'read:multimedia'] }); Self.logout = async ctx => Self.app.models.VnUser.logout(ctx.req.accessToken.id); From 92cf8fc5e1bde70adabcfe74d4a70245994beb69 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 13 Mar 2024 11:46:43 +0100 Subject: [PATCH 109/183] refs #6755 remove console --- modules/ticket/front/descriptor-menu/index.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index 9c7a58719..d2dd13f73 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -46,22 +46,16 @@ class Controller extends Section { }; this.$http.get(`TicketLogs/findOne`, {filter}) .then(res => { - console.log(res); - console.log(res.data.creationDate); if (res && res.data) { - console.log(res.data); const now = Date.vnNew(); const maxDate = new Date(res.data.creationDate); maxDate.setHours(maxDate.getHours() + 1); - console.log(now, maxDatenow); - console.log(now.getTime(), maxDate.getTime()); if (now <= maxDate) return this.canRestoreTicket = true; } this.canRestoreTicket = false; }) .catch(() => { - console.log('ENTRY'); this.canRestoreTicket = false; }); } From 8276765225980861bb1ca2e6b46ac59b97d5035b Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 13 Mar 2024 11:54:02 +0100 Subject: [PATCH 110/183] refs #5858 perf: destinationFk to pepe --- db/versions/10881-greenHydrangea/01-notification.vn.sql | 7 ++++--- print/templates/email/zone-included/locale/es.yml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 99b189d5c..448435749 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -1,11 +1,12 @@ INSERT IGNORE INTO util.notification ( `name`,`description`) VALUES ( 'zone-included','An email to notify zoneCollisions'); + SET @MaxId = LAST_INSERT_ID(); + INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( - @MaxId, (SELECT id from `account`.`user` where name = "root")); - + @MaxId, (SELECT id from `account`.`user` where name = "pepe")); INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk) - SELECT @MaxId, (SELECT id from `account`.`role` where name = "root") FROM util.notification WHERE name= "zone-included"; + SELECT @MaxId, (SELECT role from `account`.`user` where name = "pepe") FROM util.notification WHERE name= "zone-included"; diff --git a/print/templates/email/zone-included/locale/es.yml b/print/templates/email/zone-included/locale/es.yml index 974253ddc..cb35a55cc 100644 --- a/print/templates/email/zone-included/locale/es.yml +++ b/print/templates/email/zone-included/locale/es.yml @@ -1,4 +1,4 @@ -subject: Colisión de zona detectada +subject: Colisiones en zonas title: "La zona {0} y localización {1} ha sido registrada en más de un sitio" postalCode: C. Postal zoneFk: Número de zona From 172e7566b53e70741afa01b45c3bd495cc2ba9a2 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 13 Mar 2024 11:58:25 +0100 Subject: [PATCH 111/183] refs #5858 perf: improve insert --- db/versions/10881-greenHydrangea/01-notification.vn.sql | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 448435749..56ed069f4 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -1,12 +1,14 @@ INSERT IGNORE INTO util.notification ( `name`,`description`) VALUES -( 'zone-included','An email to notify zoneCollisions'); + ( 'zone-included','An email to notify zoneCollisions'); + +SET @DESTINATION_USER = "pepe"; SET @MaxId = LAST_INSERT_ID(); INSERT IGNORE INTO util.notificationSubscription (notificationFk,userFk) VALUES( - @MaxId, (SELECT id from `account`.`user` where name = "pepe")); + @MaxId, (SELECT id from `account`.`user` where name = @DESTINATION_USER)); INSERT IGNORE INTO util.notificationAcl (notificationFk,roleFk) - SELECT @MaxId, (SELECT role from `account`.`user` where name = "pepe") FROM util.notification WHERE name= "zone-included"; + SELECT @MaxId, (SELECT role from `account`.`user` where name = @DESTINATION_USER) FROM util.notification WHERE name= "zone-included"; From 11dcb6e79f22b187e5259216a0d2e1b46f85bb77 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Mar 2024 13:45:57 +0100 Subject: [PATCH 112/183] refactor: refs #6875 packing not null, negative or zero --- db/routines/vn/procedures/inventoryMake.sql | 2 +- db/routines/vn/procedures/inventory_repair.sql | 7 +------ .../10892-yellowGerbera/00-firstScript.sql | 17 ++++++++++------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/db/routines/vn/procedures/inventoryMake.sql b/db/routines/vn/procedures/inventoryMake.sql index 8788336ae..ed6a7fa43 100644 --- a/db/routines/vn/procedures/inventoryMake.sql +++ b/db/routines/vn/procedures/inventoryMake.sql @@ -175,7 +175,7 @@ BEGIN LEFT JOIN producer p ON p.id = i.producerFk SET inv.buyingValue = b.buyingValue, inv.freightValue = b.freightValue, - inv.packing = IFNULL(GREATEST(b.packing, 1), 1), + inv.packing = b.packing, inv.`grouping`= b.`grouping`, inv.groupingMode = b.groupingMode, inv.comissionValue = b.comissionValue, diff --git a/db/routines/vn/procedures/inventory_repair.sql b/db/routines/vn/procedures/inventory_repair.sql index ea65ac37d..93527d84b 100644 --- a/db/routines/vn/procedures/inventory_repair.sql +++ b/db/routines/vn/procedures/inventory_repair.sql @@ -37,7 +37,7 @@ BEGIN LEFT JOIN origin o ON o.id = i.originFk ) ON it.id = i.typeFk LEFT JOIN edi.ekt ek ON b.ektFk = ek.id - WHERE (b.packagingFk = "--" OR b.price2 = 0 OR b.packing = 0 OR b.buyingValue = 0) AND tr.landed > util.firstDayOfMonth(TIMESTAMPADD(MONTH,-1,util.VN_CURDATE())) AND s.name = 'INVENTARIO'; + WHERE (b.packagingFk = "--" OR b.price2 = 0 OR b.buyingValue = 0) AND tr.landed > util.firstDayOfMonth(TIMESTAMPADD(MONTH,-1,util.VN_CURDATE())) AND s.name = 'INVENTARIO'; DROP TEMPORARY TABLE IF EXISTS tmp.lastEntryOk; CREATE TEMPORARY TABLE tmp.lastEntryOk @@ -94,11 +94,6 @@ BEGIN JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk SET b.price2 = eo.price2 WHERE b.price2 = 0 ; - UPDATE buy b - JOIN tmp.lastEntry lt ON lt.buyFk = b.id - JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk - SET b.packing = eo.packing WHERE b.packing = 0; - UPDATE buy b JOIN tmp.lastEntry lt ON lt.buyFk = b.id JOIN tmp.lastEntryOkGroup eo ON eo.itemFk = lt.itemFk AND eo.warehouseFk = lt.warehouseFk diff --git a/db/versions/10892-yellowGerbera/00-firstScript.sql b/db/versions/10892-yellowGerbera/00-firstScript.sql index 4df616f3a..76c0cb46d 100644 --- a/db/versions/10892-yellowGerbera/00-firstScript.sql +++ b/db/versions/10892-yellowGerbera/00-firstScript.sql @@ -1,12 +1,15 @@ --- Place your SQL code here - UPDATE vn.buy - SET packing = 1 - WHERE packing IS NULL - OR NOT packing + SET packing = 1 + WHERE packing IS NULL + OR packing <= 0; + +UPDATE vn.itemShelving + SET packing = 1 + WHERE packing IS NULL + OR NOT packing; ALTER TABLE vn.buy MODIFY COLUMN packing int(11) NOT NULL CHECK(packing > 0); +ALTER TABLE vn.itemShelving MODIFY COLUMN packing int(11) NOT NULL CHECK(packing > 0); --- antes tenia '0=sin obligar 1=groping 2=packing' +-- Antes tenia '0=sin obligar 1=groping 2=packing' (groping → grouping) ALTER TABLE vn.buy MODIFY COLUMN groupingMode tinyint(4) DEFAULT 0 NOT NULL COMMENT '0=sin obligar 1=grouping 2=packing'; - From 25f979156ade5b2fe7afe9fcd103f0a2fe183c1c Mon Sep 17 00:00:00 2001 From: Pako Date: Wed, 13 Mar 2024 14:00:59 +0100 Subject: [PATCH 113/183] nuevo url para catalogue y sliders_get --- .../floranet/procedures/catalogue_get.sql | 2 +- ...ontact_Request.sql => contact_request.sql} | 4 ++-- .../floranet/procedures/sliders_get.sql | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) rename db/routines/floranet/procedures/{contact_Request.sql => contact_request.sql} (68%) create mode 100644 db/routines/floranet/procedures/sliders_get.sql diff --git a/db/routines/floranet/procedures/catalogue_get.sql b/db/routines/floranet/procedures/catalogue_get.sql index 914b5d27f..b6ec61522 100644 --- a/db/routines/floranet/procedures/catalogue_get.sql +++ b/db/routines/floranet/procedures/catalogue_get.sql @@ -36,7 +36,7 @@ BEGIN vLanded, vPostalCode, it.name, - i.image, + CONCAT('https://cdn.verdnatura.es/image/catalog/1600x900/', i.image), i.description FROM vn.item i JOIN vn.itemType it ON it.id = i.typeFk diff --git a/db/routines/floranet/procedures/contact_Request.sql b/db/routines/floranet/procedures/contact_request.sql similarity index 68% rename from db/routines/floranet/procedures/contact_Request.sql rename to db/routines/floranet/procedures/contact_request.sql index 7673c2203..044c22c6f 100644 --- a/db/routines/floranet/procedures/contact_Request.sql +++ b/db/routines/floranet/procedures/contact_request.sql @@ -1,9 +1,9 @@ -DROP PROCEDURE IF EXISTS floranet.contact_Request; +DROP PROCEDURE IF EXISTS floranet.contact_request; DELIMITER $$ $$ CREATE DEFINER=`root`@`localhost` -PROCEDURE floranet.contact_Request( +PROCEDURE floranet.contact_request( vName VARCHAR(100), vPhone VARCHAR(15), vEmail VARCHAR(100), diff --git a/db/routines/floranet/procedures/sliders_get.sql b/db/routines/floranet/procedures/sliders_get.sql new file mode 100644 index 000000000..2f77b8534 --- /dev/null +++ b/db/routines/floranet/procedures/sliders_get.sql @@ -0,0 +1,19 @@ +DROP PROCEDURE IF EXISTS floranet.sliders_get; + +DELIMITER $$ +$$ +CREATE DEFINER=`root`@`localhost` PROCEDURE floranet.sliders_get() +READS SQL DATA +BEGIN +/** + * Returns list of url for sliders + */ + SELECT + CONCAT('https://cdn.verdnatura.es/image/catalog/1600x900/', i.image) url, + i.longName + FROM vn.item i + JOIN vn.itemType it ON it.id = i.typeFk + WHERE it.code IN ('FNR','FNP'); + +END$$ +DELIMITER ; \ No newline at end of file From 67b55ae845b7843038032038f57f7a37aceafbaf Mon Sep 17 00:00:00 2001 From: Pako Date: Wed, 13 Mar 2024 14:16:27 +0100 Subject: [PATCH 114/183] fixtures local --- db/.gitignore | 2 +- db/dump/fixtures.local.sql | 406 +++++++++++++++++++++++++++++++++++++ 2 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 db/dump/fixtures.local.sql diff --git a/db/.gitignore b/db/.gitignore index 54ed9df77..231f0dfe0 100644 --- a/db/.gitignore +++ b/db/.gitignore @@ -4,7 +4,7 @@ remotes/*.ini !remotes/local.ini !remotes/docker.ini dump/.changes -dump/fixtures.local.sql +#dump/fixtures.local.sql .dBeaver .idea .project diff --git a/db/dump/fixtures.local.sql b/db/dump/fixtures.local.sql new file mode 100644 index 000000000..64d22f480 --- /dev/null +++ b/db/dump/fixtures.local.sql @@ -0,0 +1,406 @@ +-- XXX: floranet + +INSERT IGNORE INTO vn.intrastat(id, description, taxClassFk, taxCodeFk) +VALUES(6031970, 'Flores y capullos frescos (Otras: ramos, coronas)', 1, 63); + + +INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) + VALUES('FNR', 'Floranet Ramos', 1, 1); + +INSERT IGNORE INTO vn.itemType (code, name, categoryFk, workerFk) + VALUES('FNP', 'Floranet Plantas', 1, 1); + +-- Generación de items +SELECT id + INTO @FNR + FROM vn.itemType + WHERE code = 'FNR'; + +SELECT id + INTO @FNP + FROM vn.itemType + WHERE code = 'FNP'; + +DELETE + FROM vn.item + WHERE typeFk IN (@FNR,@FNP); + +INSERT INTO vn.item + ( + id, + name, + longName, + `size`, + originFk, + intrastatFk, + typeFk, + inkFk, + image, + description + ) + VALUES + ( + 147791, + @r := 'Ramo Terranova', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin ORDER BY RAND() LIMIT 1), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147791', + CONCAT('Hemos elegido una selección de flores muy especiales para realizar ', + 'esta composición: brásicas, flor de cera, astrantia, espigas, lisiantum, ', + 'paniculata eucaliptus.') + ), + ( + 147792, + @r := 'Ramo Tasmania', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147792', + CONCAT('La elegancia de este ramo es por la elección de todas las flores que lo componen: ', + 'eringium, verdes variados, rosas proteas, margaritas, astrantia, esta selección de ', + 'flores será un acierto seguro para hacer un regalo muy especial.') + ), + ( + 147793, + @r := 'Ramo Pasion', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147793', + CONCAT('La unión de las rosas rojas con el lilium rosa hace de este ramo uno de ', + 'los más especiales , el juego de las dos tonalidades con los diferentes verdes ', + 'que cuidadosamente selecionamos para darle el toque final a la composicion hace ', + 'que este ramo sea al mismo tiempo elegante y atrevido, para amantes de lo inesperado ', + 'que quieren decorar alguna estancia de su hogar o hacer un ragalo muy especial') + ), + ( + 147794, + @r := 'Ramo Florencia', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147794', + CONCAT('Este ramo evoca los colores del atardecer en Florencia, las rosas ramificadas ', + 'de pitimini con diferentes tonalidades y la paniculata nos transpotan al ambiente ', + 'sofisticado del norte de Italia y la frescura de los verdes variados nos recuerda ', + 'a la campiña italiana .Este ramo es ideal para regalar pensando en alguien muy especial.') + ), + ( + 147795, + @r := 'Ramo Atardecer', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink WHERE name = 'Yellow'), + '147795', + CONCAT('Las rosas amarillas simbolizan la alegría de vivir, la calidez ,el ', + 'optimismo y la energía, por eso son el regalo perfecto para una ocasión muy ', + 'especial o para celebrar la alegría de una amistad o de un encuentro, a estas ', + 'preciosas rosas les añadimos un toque desenfadado a través de los verdes ', + 'variados que unidos a la belleza de la rosa que seguro serán una apuesta segura.') + ), + ( + 147796, + @r := 'Ramo Arcoíris', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147796', + CONCAT('Llega la primavera a tu casa con el ramo Arco Iris , conseguirás iluminar ', + 'cualquier estancia gracias a la combinacón de las gerberas holandesas de gran ', + 'tamaño con colores muy vivos que a su vez contrastan a la perfección con las ', + 'margaritas coconut y el estatice variado, todo ello acompañado de verdes entre ', + 'los que destaca el ruscus danae , para dulcificar la explosión de color , ', + 'añadimos paniculata , una flor sencilla pero que aporta gran armonía al ramo') + ), + ( + 147797, + @r := 'Ramo Provenza', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147797', + CONCAT('La delicada composición de este ramo escogida de forma minuciosa hecho ', + 'con liliums rosa, lisiantum blanco y rosas de color rosa todo ello unificado ', + 'con una selección de maravillosos verdes variados, hacen que esta combinación ', + 'sea muy especial para decorar cualquier estancia de tu casa a la que aportará una luz especial.') + ), + ( + 147798, + @r := 'Ramo Alegria', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147798', + CONCAT('Hemos elegido el nombre de Alegría para este ramo ya que sus intensos ', + 'y variados colores nos producen esa sensación, la combinación de rosas blancas ', + ', alstroemeria rosa unida a la paniculata tambien de color rosa y a la sutileza ', + 'de la combinación de verdes variados, hace de este ramo una opción perfecta de ', + 'regalo que a todo el mundo le gusta por su armoniosa combinacion de colores.') + ), + ( + 147799, + @r := 'Planta Orquídeas ', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147799', + CONCAT('Elegimos personalmente en nuestra tienda dos plantas de orquídeas ', + 'con las mejores características combinadas con diferentes elementos de ', + 'decoración consiguiendo una composición ideal para cualquier ambiente.El ', + 'recipiente de cerámica se puede utilizar para múltiples funciones y sacar ', + 'de el las dos plantas de orquídeas para colocarlas en dos puntos diferentes ', + 'de nuestro hogar, ya que se respeta siempre las macetas originales de cada orquídea') + ), + ( + 147800, + @r := 'Planta Kentia', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147800', + CONCAT('La Kentia es una de las plantas más decorativas debido al porte que ', + 'le otorgan sus largas finas hojas arqueadas, ideal para un regalo que dejará ', + 'sin palabras a quien lo reciba o para decorar una estancia de tu hogar, ', + 'desde un espacio super moderno hasta el ambiente más clásico. Nuestras Kentias ', + 'proceden de uno de los mejores productores de kentias del mundo, con el añadido ', + 'de ser un producto nacional producido en Canarias de una calidad extrema.') + ), + ( + 147801, + @r := 'Planta Calathea', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147801', + CONCAT('Esta planta originaria de América tropical, principalmente de Brasil y Perú ', + ', son plantas ideales para embellecer el interior de una estancia . Debido a su ', + 'llamativo y original colorido, tambien es un regalo perfecto para ', + 'cualquier compromiso que tengamos .') + ), + ( + 147802, + @r := 'Planta Anthurium ', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNP, + (SELECT id FROM vn.ink WHERE name = 'Red'), + '147802', + CONCAT('Nos encanta el color rojo de sus flores .Esta planta original de ', + 'Costa Rica ,proviene de las zonas tropicales de America Central y del Sur, ', + 'su llamativo color alegrará cualquier celebración') + ), + ( + 147803, + @r := 'Ramo Mindanao', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147803', + CONCAT('La combinación de rosas ramificadas amarillas, las hortensias blancas, ', + 'el estatice, el limonium Tanacetum y los verdes variados hace de este ramo uno ', + 'de los que más gustan tanto si es para regalar como para decorar un rincón de tu casa.') + ), + ( + 147804, + @r := 'Ramo Guinea', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147804', + CONCAT('Hemos elegido una selección de flores muy especiales para realizar esta composición:', + ' brásicas, flor de cera, astrantia, espigas, lisiantum, paniculata eucaliptus.') + ), + ( + 147805, + @r := 'Ramo Eterno', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147805', + CONCAT('La perfecta combinación de los diferentes tonos de estatice y el eucaliptus ', + 'cinerea hacen de este ramo un recuerdo inolvidable ya que ambos materiales son de ', + 'larga duración por lo que podrás conservar tu ramo junto con las bonitas vivencias ', + 'de ese día durante mucho tiempo, además le añadimos un toque especial que le dan ', + 'las raices las cuales combinan con los tonos del ramo, unas bonitas cintas del colores ', + 'rematan el acabado del ramo. Este ramo se puede secar y mantenerse en perfecto estado.') + ), + ( + 147806, + @r := 'Ramo Cielo', + @r, + 20 + CEIL(RAND() * 55), + (SELECT id FROM vn.origin WHERE code = 'SPA'), + 6031970, + @FNR, + (SELECT id FROM vn.ink ORDER BY RAND() LIMIT 1), + '147806', + CONCAT('Las hortensias son unas de las flores más elegantes que existen y ', + 'la combinación que proponemos para este ramo te resultará de lo más armoniosa ', + ', ya que intercalamos flores de mayor tamaño como las hortensias azules y ', + 'blancas junto con flores más pequeñas y delicadas como el estatice , todo ello', + ' combinado con el eucaliptus cinerea que te aportará un sueve aroma en toda ', + 'la estancia, el atado del ramo es de rafia natural, siguiendo la tonalidad ', + 'clara de todo el conjunto. ') + ); + + -- Ramo Terranova: 1er elemento +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Rosa roja', + @r, + 60, + 1, + 'RED', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 12 + FROM vn.item + WHERE name = 'Ramo Terranova'; + + -- Ramo Terranova: 2º elemento + +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Hoja de helecho', + @r, + 60, + 1, + 'BAS', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 4 + FROM vn.item + WHERE name = 'Ramo Terranova'; + + + -- Ramo Terranova: 3er elemento +INSERT INTO vn.item( + name, + longName, + `size`, + stems, + inkFk, + intrastatFk, + typeFk, + originFk) + SELECT + @r:= 'Paniculata', + @r, + 60, + 1, + 'SLV', + 6031970, + id, + 1 + FROM vn.itemType + WHERE code LIKE 'FNE'; + +SELECT LAST_INSERT_ID() INTO @itemFk; + +INSERT INTO floranet.`element` + SET itemFk = @itemFk; + +INSERT INTO floranet.builder( + itemFk, + elementFk, + quantity) + SELECT + id, + @itemFk, + 5 + FROM vn.item + WHERE name = 'Ramo Terranova'; + From 1315bfda8839d89c68ebafc117341d5499d576f0 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 13 Mar 2024 14:18:53 +0100 Subject: [PATCH 115/183] refs #6755 fix test --- db/dump/fixtures.before.sql | 8 -------- .../back/methods/ticket-log/specs/getChanges.spec.js | 4 ++-- modules/ticket/back/methods/ticket/restore.js | 5 ++--- .../ticket/back/methods/ticket/specs/filter.spec.js | 2 +- .../ticket/back/methods/ticket/specs/restore.spec.js | 12 ++++++++++++ 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 1f6c44d2e..35de9dd47 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -3068,14 +3068,6 @@ INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentIns UPDATE vn.department SET workerFk = null; -INSERT INTO vn.ticketLog (originFk,userFk,`action`,creationDate,changedModel,newInstance,changedModelId,changedModelValue) - VALUES (9,9,'insert','2000-01-01 11:01:00.000','Ticket','{"isDeleted":true}',45,'Super Man'); - -UPDATE vn.ticket - SET isDeleted=1 - WHERE id=9; --- NEW WAREHOUSE - INSERT INTO vn.packaging VALUES('--', 2745600.00, 100.00, 120.00, 220.00, 0.00, 1, '2001-01-01 00:00:00.000', NULL, NULL, NULL, 0.00, 16, 0.00, 0, NULL, 0.00, NULL, NULL, 0, NULL, 0, 0); diff --git a/modules/ticket/back/methods/ticket-log/specs/getChanges.spec.js b/modules/ticket/back/methods/ticket-log/specs/getChanges.spec.js index 04f42f7be..cccaa182f 100644 --- a/modules/ticket/back/methods/ticket-log/specs/getChanges.spec.js +++ b/modules/ticket/back/methods/ticket-log/specs/getChanges.spec.js @@ -9,8 +9,8 @@ describe('ticketLog getChanges()', () => { it('should return the changes in the sales of a ticket', async() => { const ticketId = 16; - const changues = await models.TicketLog.getChanges(ctx, ticketId); + const changes = await models.TicketLog.getChanges(ctx, ticketId); - expect(changues).toContain(`Change quantity`); + expect(changes).toContain(`Change quantity`); }); }); diff --git a/modules/ticket/back/methods/ticket/restore.js b/modules/ticket/back/methods/ticket/restore.js index 555982f8d..01b5d1652 100644 --- a/modules/ticket/back/methods/ticket/restore.js +++ b/modules/ticket/back/methods/ticket/restore.js @@ -48,10 +48,9 @@ module.exports = Self => { }, myOptions); const now = Date.vnNew(); - const maxDate = new Date(ticketLog.creationDate); + const maxDate = new Date(ticketLog?.creationDate); maxDate.setHours(maxDate.getHours() + 1); - if (now > maxDate) - + if (!ticketLog || now > maxDate) throw new UserError(`You can only restore a ticket within the first hour after deletion`); // Send notification to salesPerson diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js index 09c4ebbb7..c1d3f1a9c 100644 --- a/modules/ticket/back/methods/ticket/specs/filter.spec.js +++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js @@ -68,7 +68,7 @@ describe('ticket filter()', () => { const filter = {}; const result = await models.Ticket.filter(ctx, filter, options); - expect(result.length).toEqual(5); + expect(result.length).toEqual(6); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/back/methods/ticket/specs/restore.spec.js b/modules/ticket/back/methods/ticket/specs/restore.spec.js index a44d39a7b..121a6ba96 100644 --- a/modules/ticket/back/methods/ticket/specs/restore.spec.js +++ b/modules/ticket/back/methods/ticket/specs/restore.spec.js @@ -30,10 +30,21 @@ describe('ticket restore()', () => { try { const options = {transaction: tx}; const ticket = await models.Ticket.findById(ticketId, null, options); + await ticket.updateAttributes({ isDeleted: true, updated: now }, options); + + await models.TicketLog.create({ + originFk: ticketId, + userFk: employeeUser, + action: 'update', + changedModel: 'Ticket', + creationDate: new Date('2001-01-01 10:59:00'), + newInstance: '{"isDeleted":true}' + }, options); + await app.models.Ticket.restore(ctx, ticketId, options); await tx.rollback(); } catch (e) { @@ -52,6 +63,7 @@ describe('ticket restore()', () => { const options = {transaction: tx}; const ticketBeforeUpdate = await models.Ticket.findById(ticketId, null, options); + await ticketBeforeUpdate.updateAttributes({ isDeleted: true, updated: now From 4012b1756d48a308eb6af82de77378261143f70b Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 13 Mar 2024 15:00:12 +0100 Subject: [PATCH 116/183] refs #5858 add comment --- db/versions/10881-greenHydrangea/01-notification.vn.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/versions/10881-greenHydrangea/01-notification.vn.sql b/db/versions/10881-greenHydrangea/01-notification.vn.sql index 56ed069f4..ab5480548 100644 --- a/db/versions/10881-greenHydrangea/01-notification.vn.sql +++ b/db/versions/10881-greenHydrangea/01-notification.vn.sql @@ -2,6 +2,7 @@ INSERT IGNORE INTO util.notification ( `name`,`description`) VALUES ( 'zone-included','An email to notify zoneCollisions'); +-- Change value if destionation user should be different SET @DESTINATION_USER = "pepe"; SET @MaxId = LAST_INSERT_ID(); From f09283b9c90ab501bc703395c90f99087d57b1a7 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 13 Mar 2024 15:44:16 +0100 Subject: [PATCH 117/183] refs #5858 perf: html --- .../email/zone-included/zone-included.html | 54 +++++++++++-------- .../email/zone-included/zone-included.js | 4 +- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/print/templates/email/zone-included/zone-included.html b/print/templates/email/zone-included/zone-included.html index 0381cc8c4..78915faad 100644 --- a/print/templates/email/zone-included/zone-included.html +++ b/print/templates/email/zone-included/zone-included.html @@ -1,16 +1,24 @@ - -
-
- - - - - - - - - - + + + + + + + + +
{{ $t('postalCode') }}{{ $t('zoneFk') }}{{ $t('price') }}{{ $t('zone') }}{{ $t('warehouse') }}Salix
+ + + + + + + + + + + + @@ -22,13 +30,13 @@ '/location?q=%7B%22search%22:%22'+ zone.zn.name+ '%22%7D'"> - 'https://salix.verdnatura.es/#!/zone/'+ - {{zone.zoneFk}}+ - '/location?q=%7B%22search%22:%22'+ - {{zone.zn.name}}+ - '%22%7D - -
{{ $t('postalCode') }}{{ $t('zoneFk') }}{{ $t('price') }}{{ $t('zone') }}{{ $t('warehouse') }}
{{ zone.zn.name }} {{ zone.zoneFk }} {{ zone.z.price }}
-
-
-
+ https://salix.verdnatura.es/#!/zone/ + {{zone.zoneFk}} + /location?q=%7B%22search%22:%22 + {{zone.zn.name}} + %22%7D
+ + + + + diff --git a/print/templates/email/zone-included/zone-included.js b/print/templates/email/zone-included/zone-included.js index 7e23ee2f0..4de4777f3 100755 --- a/print/templates/email/zone-included/zone-included.js +++ b/print/templates/email/zone-included/zone-included.js @@ -1,10 +1,10 @@ const Component = require(`vn-print/core/component`); -const emailBody = new Component('email-body'); +const emailHeader = new Component('email-header'); module.exports = { name: 'zone-included', components: { - 'email-body': emailBody.build(), + 'email-header': emailHeader.build(), }, props: { zoneCollisions: {type: Array, required: true} From 33bd21d40b00f7658d7c266ffc555b599e1bfab0 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 13 Mar 2024 16:29:05 +0100 Subject: [PATCH 118/183] refs #6755 fix model --- modules/ticket/back/models/ticket-log.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json index e46995a91..32b4afd13 100644 --- a/modules/ticket/back/models/ticket-log.json +++ b/modules/ticket/back/models/ticket-log.json @@ -29,13 +29,13 @@ "type": "string" }, "oldInstance": { - "type": "string" + "type": "any" }, "newInstance": { - "type": "string" + "type": "any" }, "changedModelId": { - "type": "number" + "type": "string" }, "changedModelValue": { "type": "string" From b4b6b47a9caf3e89e7abbedfa4b18f162c10d04a Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Mar 2024 07:53:24 +0100 Subject: [PATCH 119/183] hotfix: itemProposal added transaction --- db/routines/vn/procedures/itemProposal.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/db/routines/vn/procedures/itemProposal.sql b/db/routines/vn/procedures/itemProposal.sql index eb8a7ab33..0dc04124d 100644 --- a/db/routines/vn/procedures/itemProposal.sql +++ b/db/routines/vn/procedures/itemProposal.sql @@ -18,12 +18,19 @@ BEGIN DECLARE vCalcFk INT; DECLARE vTypeFk INT; DECLARE vPriority INT DEFAULT 1; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; SELECT warehouseFk, shipped INTO vWarehouseFk, vShipped FROM ticket WHERE id = vTicketFk; + START TRANSACTION; + CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vShipped); WITH itemTags AS ( @@ -92,5 +99,6 @@ BEGIN match7 DESC, (i.tag8 = its.tag8) DESC, match8 DESC; + COMMIT; END$$ DELIMITER ; From e24eed16c1b3240cd1bbb80010c7cbb08af0768f Mon Sep 17 00:00:00 2001 From: carlossa Date: Thu, 14 Mar 2024 08:26:50 +0100 Subject: [PATCH 120/183] refs #6842 fix companyCode --- db/versions/10893-limeFern/00-sage.sql | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/db/versions/10893-limeFern/00-sage.sql b/db/versions/10893-limeFern/00-sage.sql index 01508b932..d4c7e6221 100644 --- a/db/versions/10893-limeFern/00-sage.sql +++ b/db/versions/10893-limeFern/00-sage.sql @@ -3,7 +3,13 @@ UPDATE vn.company SET companyCode=0 WHERE id=69; UPDATE vn.company - SET companyCode=0 + SET companyCode=1 + WHERE id=442; +UPDATE vn.company + SET companyCode=4 + WHERE id=567; +UPDATE vn.company + SET companyCode=2 WHERE id=791; UPDATE vn.company SET companyCode=3 @@ -17,6 +23,9 @@ UPDATE vn.company UPDATE vn.company SET companyCode=3 WHERE id=1463; +UPDATE vn.company + SET companyCode=8 + WHERE id=2142; UPDATE vn.company SET companyCode=6 WHERE id=2393; From 0ad052c34a4be6a5fc21a994375c86480dd59329 Mon Sep 17 00:00:00 2001 From: alexm Date: Thu, 14 Mar 2024 08:36:19 +0100 Subject: [PATCH 121/183] refs #7033 deploy(2412): dev to test --- back/methods/collection/assign.js | 31 + back/methods/collection/getSales.js | 157 ++++ back/methods/collection/spec/assign.spec.js | 38 + back/methods/collection/spec/getSales.spec.js | 62 ++ .../machine-worker/specs/updateInTime.spec.js | 132 ++++ back/methods/machine-worker/updateInTime.js | 77 ++ .../mobile-app-version-control/getVersion.js | 45 ++ .../specs/getVersion.spec.js | 29 + back/model-config.json | 23 +- back/models/{bank.json => accounting.json} | 9 +- back/models/collection.js | 2 + back/models/machine-worker-config.json | 18 + back/models/machine-worker.js | 3 + back/models/machine.json | 18 + back/models/mobile-app-version-control.js | 3 + back/models/mobile-app-version-control.json | 39 + back/models/payment.json | 2 +- back/models/workerActivity.json | 39 + back/models/workerActivityType.json | 19 + db/dump/.dump/data.sql | 2 - db/dump/fixtures.before.sql | 696 +++++++++++++++++- .../bs/procedures/manaCustomerUpdate.sql | 2 +- db/routines/cache/procedures/clean.sql | 6 +- .../hedera/procedures/tpvTransaction_undo.sql | 2 +- .../procedures/accountingMovements_add.sql | 6 +- db/routines/sage/procedures/pgc_add.sql | 12 +- .../vn/events/sale_checkWithoutComponents.sql | 8 - db/routines/vn/functions/till_new.sql | 2 +- .../procedures/balanceNestTree_addChild.sql | 52 ++ .../vn/procedures/balanceNestTree_delete.sql | 53 ++ .../vn/procedures/balanceNestTree_move.sql | 117 +++ .../procedures/bankPolicy_notifyExpired.sql | 12 +- db/routines/vn/procedures/clean.sql | 263 +++---- db/routines/vn/procedures/client_getMana.sql | 3 +- .../procedures/confection_controlSource.sql | 103 +++ .../vn/procedures/invoiceInTaxMakeByDua.sql | 9 +- .../vn/procedures/invoiceInTax_recalc.sql | 62 ++ db/routines/vn/procedures/itemProposal.sql | 104 --- .../vn/procedures/itemProposal_beta.sql | 76 -- .../vn/procedures/itemShelving_inventory.sql | 7 +- db/routines/vn/procedures/item_getSimilar.sql | 160 ++-- db/routines/vn/procedures/payment_add.sql | 84 +++ db/routines/vn/procedures/remittance_calc.sql | 70 ++ .../vn/procedures/sale_checkNoComponents.sql | 70 -- .../vn/procedures/sale_getBoxPickingList.sql | 4 +- .../sale_getFromTicketOrCollection.sql | 5 +- .../vn/procedures/supplier_statement.sql | 2 +- .../vn/procedures/ticket_closeByTicket.sql | 3 +- .../vn/triggers/parking_afterDelete.sql | 12 + .../vn/triggers/parking_beforeInsert.sql | 2 +- .../vn/triggers/parking_beforeUpdate.sql | 2 +- .../vn/triggers/payment_beforeInsert.sql | 10 +- db/routines/vn/views/bank.sql | 12 - db/routines/vn/views/exchangeInsuranceOut.sql | 4 +- .../vn2008/procedures/CalculoRemesas.sql | 66 -- .../procedures/ListaTicketsEncajados.sql | 25 - db/routines/vn2008/procedures/cacheReset.sql | 11 - db/routines/vn2008/procedures/camiones.sql | 23 - db/routines/vn2008/procedures/clean.sql | 74 -- .../vn2008/procedures/clean_launcher.sql | 6 - db/routines/vn2008/procedures/cobro.sql | 79 -- .../procedures/confection_control_source.sql | 105 --- .../procedures/customerDebtEvolution.sql | 49 -- .../emailYesterdayPurchasesByConsigna.sql | 100 --- .../emailYesterdayPurchasesLauncher.sql | 27 - .../vn2008/procedures/embalajes_stocks.sql | 51 -- .../procedures/embalajes_stocks_detalle.sql | 78 -- .../vn2008/procedures/nest_child_add.sql | 48 -- db/routines/vn2008/procedures/nest_delete.sql | 51 -- db/routines/vn2008/procedures/nest_move.sql | 108 --- db/routines/vn2008/procedures/pay.sql | 67 -- .../vn2008/procedures/preOrdenarRuta.sql | 22 - .../vn2008/procedures/prepare_ticket_list.sql | 22 - .../vn2008/procedures/recibidaIvaInsert.sql | 39 - db/routines/vn2008/views/Bancos.sql | 16 +- .../10832-purpleAralia/00-newWareHouse.sql | 12 + db/versions/10905-grayIvy/00-firstScript.sql | 36 + .../10913-bronzeGalax/00-firstScript.sql | 4 + .../10915-limeMastic/00-firstScript.sql | 2 + .../10918-wheatRose/00-firstScript.sql | 2 + .../10923-pinkOak/00-createParkingLog.sql | 60 ++ .../10923-pinkOak/01-aclParkingLog.sql | 2 + .../10924-pinkCordyline/00-firstScript.sql | 31 + .../10925-orangeLaurel/00-firstScript.sql | 15 + .../10926-limeFern/00-refactorClaimState.sql | 8 + .../10928-orangeEucalyptus/00-firstScript.sql | 5 + .../10929-orangeAnthurium/00-firstScript.sql | 2 + e2e/paths/06-claim/01_basic_data.spec.js | 4 +- .../salix/components/user-popover/index.html | 2 +- jest.front.config.js | 3 + loopback/common/mixins/loggable.js | 3 +- loopback/locale/en.json | 13 +- loopback/locale/es.json | 3 +- loopback/server/connectors/vn-mysql.js | 6 +- loopback/util/validateIban.js | 1 - .../claim-state/specs/isEditable.spec.js | 2 +- .../methods/claim/specs/updateClaim.spec.js | 126 +--- .../claim/specs/updateClaimAction.spec.js | 2 +- modules/claim/back/model-config.json | 5 +- modules/claim/back/models/claim-rma.js | 9 - modules/claim/back/models/claim.json | 9 - .../back/methods/client/createReceipt.js | 2 +- .../receipt/balanceCompensationEmail.js | 2 +- modules/client/back/models/receipt.json | 2 +- modules/client/back/models/till.json | 2 +- .../client/front/balance/create/index.html | 2 +- modules/client/front/billing-data/index.html | 1 + .../back/methods/entry/specs/filter.spec.js | 4 +- .../back/models/invoice-in-due-day.json | 2 +- modules/invoiceIn/front/dueDay/index.html | 2 +- modules/invoiceOut/back/models/invoice-out.js | 21 + .../item/back/methods/item-barcode/delete.js | 34 + .../methods/item-barcode/specs/delete.spec.js | 22 + .../methods/item-shelving/getAlternative.js | 64 ++ .../specs/getAlternative.spec.js | 25 + .../specs/updateFromSale.spec.js | 22 + .../methods/item-shelving/updateFromSale.js | 48 ++ modules/item/back/methods/item/get.js | 48 ++ .../item/back/methods/item/specs/get.spec.js | 12 + modules/item/back/models/item-barcode.js | 1 + modules/item/back/models/item-shelving.js | 2 + modules/item/back/models/item-shelving.json | 5 +- modules/item/back/models/item.js | 1 + modules/parking/back/model-config.json | 5 + modules/parking/back/models/parking-log.json | 9 + modules/shelving/back/locale/parking/en.yml | 9 + modules/shelving/back/locale/parking/es.yml | 10 + .../shelving/back/methods/shelving/addLog.js | 56 ++ .../methods/shelving/specs/addLog.spec.js | 46 ++ modules/shelving/back/models/parking.json | 8 +- modules/shelving/back/models/shelving.js | 1 + .../back/methods/sale-tracking/delete.js | 36 +- .../back/methods/sale-tracking/setPicked.js | 106 +++ .../sale-tracking/specs/delete.spec.js | 5 +- .../sale-tracking/specs/setPicked.spec.js | 114 +++ .../specs/updateTracking.spec.js | 104 +++ .../methods/sale-tracking/updateTracking.js | 110 +++ .../methods/sale/getFromSectorCollection.js | 61 ++ .../specs/getFromSectorCollection.spec.js | 23 + .../back/methods/ticket/addSaleByCode.js | 56 ++ .../ticket/back/methods/ticket/closeAll.js | 1 + modules/ticket/back/methods/ticket/closure.js | 83 ++- .../ticket/back/methods/ticket/makeInvoice.js | 18 +- .../ticket/specs/addSaleByCode.spec.js | 39 + .../methods/ticket/specs/makeInvoice.spec.js | 2 +- .../methods/ticket/specs/setDeleted.spec.js | 13 +- modules/ticket/back/model-config.json | 3 + .../ticket/back/models/expeditionPallet.json | 26 +- .../back/models/sale-buy.json} | 20 +- modules/ticket/back/models/sale-tracking.js | 2 + modules/ticket/back/models/sale-tracking.json | 3 + modules/ticket/back/models/sale.js | 1 + modules/ticket/back/models/ticket.js | 1 + modules/ticket/front/sale-tracking/index.js | 2 +- modules/worker/back/model-config.json | 3 + modules/worker/back/models/department.json | 7 +- modules/worker/back/models/operator.js | 2 +- modules/worker/back/models/operator.json | 6 + .../worker/back/models/worker-app-tester.json | 22 + myt.config.yml | 1 - package.json | 2 +- .../reports/cmr/assets/css/style.css | 17 +- print/templates/reports/cmr/cmr.html | 22 +- print/templates/reports/cmr/cmr.js | 75 +- print/templates/reports/cmr/sql/data.sql | 1 + 165 files changed, 3756 insertions(+), 1916 deletions(-) create mode 100644 back/methods/collection/assign.js create mode 100644 back/methods/collection/getSales.js create mode 100644 back/methods/collection/spec/assign.spec.js create mode 100644 back/methods/collection/spec/getSales.spec.js create mode 100644 back/methods/machine-worker/specs/updateInTime.spec.js create mode 100644 back/methods/machine-worker/updateInTime.js create mode 100644 back/methods/mobile-app-version-control/getVersion.js create mode 100644 back/methods/mobile-app-version-control/specs/getVersion.spec.js rename back/models/{bank.json => accounting.json} (85%) create mode 100644 back/models/machine-worker-config.json create mode 100644 back/models/machine-worker.js create mode 100644 back/models/machine.json create mode 100644 back/models/mobile-app-version-control.js create mode 100644 back/models/mobile-app-version-control.json create mode 100644 back/models/workerActivity.json create mode 100644 back/models/workerActivityType.json delete mode 100644 db/routines/vn/events/sale_checkWithoutComponents.sql create mode 100644 db/routines/vn/procedures/balanceNestTree_addChild.sql create mode 100644 db/routines/vn/procedures/balanceNestTree_delete.sql create mode 100644 db/routines/vn/procedures/balanceNestTree_move.sql create mode 100644 db/routines/vn/procedures/confection_controlSource.sql create mode 100644 db/routines/vn/procedures/invoiceInTax_recalc.sql delete mode 100644 db/routines/vn/procedures/itemProposal.sql delete mode 100644 db/routines/vn/procedures/itemProposal_beta.sql create mode 100644 db/routines/vn/procedures/payment_add.sql create mode 100644 db/routines/vn/procedures/remittance_calc.sql delete mode 100644 db/routines/vn/procedures/sale_checkNoComponents.sql create mode 100644 db/routines/vn/triggers/parking_afterDelete.sql delete mode 100644 db/routines/vn/views/bank.sql delete mode 100644 db/routines/vn2008/procedures/CalculoRemesas.sql delete mode 100644 db/routines/vn2008/procedures/ListaTicketsEncajados.sql delete mode 100644 db/routines/vn2008/procedures/cacheReset.sql delete mode 100644 db/routines/vn2008/procedures/camiones.sql delete mode 100644 db/routines/vn2008/procedures/clean.sql delete mode 100644 db/routines/vn2008/procedures/clean_launcher.sql delete mode 100644 db/routines/vn2008/procedures/cobro.sql delete mode 100644 db/routines/vn2008/procedures/confection_control_source.sql delete mode 100644 db/routines/vn2008/procedures/customerDebtEvolution.sql delete mode 100644 db/routines/vn2008/procedures/emailYesterdayPurchasesByConsigna.sql delete mode 100644 db/routines/vn2008/procedures/emailYesterdayPurchasesLauncher.sql delete mode 100644 db/routines/vn2008/procedures/embalajes_stocks.sql delete mode 100644 db/routines/vn2008/procedures/embalajes_stocks_detalle.sql delete mode 100644 db/routines/vn2008/procedures/nest_child_add.sql delete mode 100644 db/routines/vn2008/procedures/nest_delete.sql delete mode 100644 db/routines/vn2008/procedures/nest_move.sql delete mode 100644 db/routines/vn2008/procedures/pay.sql delete mode 100644 db/routines/vn2008/procedures/preOrdenarRuta.sql delete mode 100644 db/routines/vn2008/procedures/prepare_ticket_list.sql delete mode 100644 db/routines/vn2008/procedures/recibidaIvaInsert.sql create mode 100644 db/versions/10832-purpleAralia/00-newWareHouse.sql create mode 100644 db/versions/10905-grayIvy/00-firstScript.sql create mode 100644 db/versions/10913-bronzeGalax/00-firstScript.sql create mode 100644 db/versions/10915-limeMastic/00-firstScript.sql create mode 100644 db/versions/10918-wheatRose/00-firstScript.sql create mode 100644 db/versions/10923-pinkOak/00-createParkingLog.sql create mode 100644 db/versions/10923-pinkOak/01-aclParkingLog.sql create mode 100644 db/versions/10924-pinkCordyline/00-firstScript.sql create mode 100644 db/versions/10925-orangeLaurel/00-firstScript.sql create mode 100644 db/versions/10926-limeFern/00-refactorClaimState.sql create mode 100644 db/versions/10928-orangeEucalyptus/00-firstScript.sql create mode 100644 db/versions/10929-orangeAnthurium/00-firstScript.sql delete mode 100644 modules/claim/back/models/claim-rma.js create mode 100644 modules/item/back/methods/item-barcode/delete.js create mode 100644 modules/item/back/methods/item-barcode/specs/delete.spec.js create mode 100644 modules/item/back/methods/item-shelving/getAlternative.js create mode 100644 modules/item/back/methods/item-shelving/specs/getAlternative.spec.js create mode 100644 modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js create mode 100644 modules/item/back/methods/item-shelving/updateFromSale.js create mode 100644 modules/item/back/methods/item/get.js create mode 100644 modules/item/back/methods/item/specs/get.spec.js create mode 100644 modules/parking/back/model-config.json create mode 100644 modules/parking/back/models/parking-log.json create mode 100644 modules/shelving/back/locale/parking/en.yml create mode 100644 modules/shelving/back/locale/parking/es.yml create mode 100644 modules/shelving/back/methods/shelving/addLog.js create mode 100644 modules/shelving/back/methods/shelving/specs/addLog.spec.js create mode 100644 modules/ticket/back/methods/sale-tracking/setPicked.js create mode 100644 modules/ticket/back/methods/sale-tracking/specs/setPicked.spec.js create mode 100644 modules/ticket/back/methods/sale-tracking/specs/updateTracking.spec.js create mode 100644 modules/ticket/back/methods/sale-tracking/updateTracking.js create mode 100644 modules/ticket/back/methods/sale/getFromSectorCollection.js create mode 100644 modules/ticket/back/methods/sale/specs/getFromSectorCollection.spec.js create mode 100644 modules/ticket/back/methods/ticket/addSaleByCode.js create mode 100644 modules/ticket/back/methods/ticket/specs/addSaleByCode.spec.js rename modules/{claim/back/models/claim-rma.json => ticket/back/models/sale-buy.json} (56%) create mode 100644 modules/worker/back/models/worker-app-tester.json diff --git a/back/methods/collection/assign.js b/back/methods/collection/assign.js new file mode 100644 index 000000000..b0c1d9995 --- /dev/null +++ b/back/methods/collection/assign.js @@ -0,0 +1,31 @@ +const UserError = require('vn-loopback/util/user-error'); +module.exports = Self => { + Self.remoteMethodCtx('assign', { + description: 'Assign a collection', + accessType: 'WRITE', + http: { + path: `/assign`, + verb: 'POST' + }, + returns: { + type: ['object'], + root: true + }, + }); + + Self.assign = async(ctx, options) => { + const userId = ctx.req.accessToken.userId; + const myOptions = {userId}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const [,, {collectionFk}] = await Self.rawSql('CALL vn.collection_assign(?, @vCollectionFk); SELECT @vCollectionFk collectionFk', + [userId], myOptions); + + if (!collectionFk) throw new UserError('There are not picking tickets'); + await Self.rawSql('CALL vn.collection_printSticker(?, NULL)', [collectionFk], myOptions); + + return collectionFk; + }; +}; diff --git a/back/methods/collection/getSales.js b/back/methods/collection/getSales.js new file mode 100644 index 000000000..78945dc80 --- /dev/null +++ b/back/methods/collection/getSales.js @@ -0,0 +1,157 @@ +module.exports = Self => { + Self.remoteMethodCtx('getSales', { + description: 'Get sales from ticket or collection', + accessType: 'READ', + accepts: [ + { + arg: 'collectionOrTicketFk', + type: 'number', + required: true + }, { + arg: 'print', + type: 'boolean', + required: true + }, { + arg: 'source', + type: 'string', + required: true + }, + + ], + returns: { + type: 'Object', + root: true + }, + http: { + path: `/getSales`, + verb: 'GET' + }, + }); + + Self.getSales = async(ctx, collectionOrTicketFk, print, source, options) => { + const userId = ctx.req.accessToken.userId; + const myOptions = {userId}; + const $t = ctx.req.__; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const [{id}] = await Self.rawSql('SELECT vn.ticket_get(?) as id', + [collectionOrTicketFk], + myOptions); + + const [tickets] = await Self.rawSql('CALL vn.collection_getTickets(?)', [id], myOptions); + + if (source) { + await Self.rawSql( + 'CALL vn.ticketStateToday_setState(?,?)', [id, source], myOptions + ); + } + + const [sales] = await Self.rawSql('CALL vn.sale_getFromTicketOrCollection(?)', + [id], myOptions); + + const isPicker = source != 'CHECKER'; + const [placements] = await Self.rawSql('CALL vn.collectionPlacement_get(?, ?)', + [id, isPicker], myOptions + ); + + if (print) await Self.rawSql('CALL vn.collection_printSticker(?,NULL)', [id], myOptions); + + for (let ticket of tickets) { + let observations = ticket.observaciones.split(' '); + + for (let observation of observations) { + const salesPerson = ticket.salesPersonFk; + if (observation.startsWith('#') || observation.startsWith('@')) { + await models.Chat.send(ctx, + observation, + $t('ticketCommercial', {ticket: ticket.ticketFk, salesPerson}) + ); + } + } + } + + return getCollection(id, tickets, sales, placements, myOptions); + }; + + async function getCollection(id, tickets, sales, placements, options) { + const collection = { + collectionFk: id, + tickets: [], + }; + for (let ticket of tickets) { + const {ticketFk} = ticket; + ticket.sales = []; + + const barcodes = await getBarcodes(ticketFk, options); + await Self.rawSql( + 'CALL util.log_add(?, ?, ?, ?, ?, ?, ?, ?)', + ['vn', 'ticket', 'Ticket', ticketFk, ticketFk, 'select', null, null], + options + ); + + for (let sale of sales) { + if (sale.ticketFk == ticketFk) { + sale.placements = []; + for (const salePlacement of placements) { + if (salePlacement.saleFk == sale.saleFk && salePlacement.order) { + const placement = { + saleFk: salePlacement.saleFk, + itemFk: salePlacement.itemFk, + placement: salePlacement.placement, + shelving: salePlacement.shelving, + created: salePlacement.created, + visible: salePlacement.visible, + order: salePlacement.order, + grouping: salePlacement.grouping, + priority: salePlacement.priority, + saleOrder: salePlacement.saleOrder, + isPreviousPrepared: salePlacement.isPreviousPrepared, + itemShelvingSaleFk: salePlacement.itemShelvingSaleFk, + ticketFk: salePlacement.ticketFk, + id: salePlacement.id + }; + sale.placements.push(placement); + } + } + + sale.barcodes = []; + for (const barcode of barcodes) { + if (barcode.movementId == sale.saleFk) { + if (barcode.code) { + sale.barcodes.push(barcode.code); + sale.barcodes.push(`0 ${barcode.code}`); + } + + if (barcode.id) { + sale.barcodes.push(barcode.id); + sale.barcodes.push(`0 ${barcode.id}`); + } + } + } + + ticket.sales.push(sale); + } + } + collection.tickets.push(ticket); + } + + return collection; + } + + async function getBarcodes(ticketId, options) { + const query = + `SELECT s.id movementId, + b.code, + c.id + FROM vn.sale s + LEFT JOIN vn.itemBarcode b ON b.itemFk = s.itemFk + LEFT JOIN vn.buy c ON c.itemFk = s.itemFk + LEFT JOIN vn.entry e ON e.id = c.entryFk + LEFT JOIN vn.travel tr ON tr.id = e.travelFk + WHERE s.ticketFk = ? + AND tr.landed >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)`; + return Self.rawSql(query, [ticketId], options); + } +}; diff --git a/back/methods/collection/spec/assign.spec.js b/back/methods/collection/spec/assign.spec.js new file mode 100644 index 000000000..745343819 --- /dev/null +++ b/back/methods/collection/spec/assign.spec.js @@ -0,0 +1,38 @@ +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); + +describe('ticket assign()', () => { + let ctx; + let options; + let tx; + beforeEach(async() => { + ctx = { + req: { + accessToken: {userId: 1106}, + headers: {origin: 'http://localhost'}, + __: value => value + }, + args: {} + }; + + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: ctx.req + }); + + options = {transaction: tx}; + tx = await models.Sale.beginTransaction({}); + options.transaction = tx; + }); + + afterEach(async() => { + await tx.rollback(); + }); + + it('should throw an error when there is not picking tickets', async() => { + try { + await models.Collection.assign(ctx, options); + } catch (e) { + expect(e.message).toEqual('There are not picking tickets'); + } + }); +}); diff --git a/back/methods/collection/spec/getSales.spec.js b/back/methods/collection/spec/getSales.spec.js new file mode 100644 index 000000000..e6205cc79 --- /dev/null +++ b/back/methods/collection/spec/getSales.spec.js @@ -0,0 +1,62 @@ +const {models} = require('vn-loopback/server/server'); + +describe('collection getSales()', () => { + const collectionOrTicketFk = 999999; + const print = true; + const source = 'CHECKER'; + + beforeAll(() => { + ctx = { + req: { + accessToken: {userId: 9}, + headers: {origin: 'http://localhost'}, + } + }; + }); + + it('should return a collection with tickets, placements and barcodes settled correctly', async() => { + const tx = await models.Collection.beginTransaction({}); + const options = {transaction: tx}; + try { + const collection = await models.Collection.getSales(ctx, + collectionOrTicketFk, print, source, options); + + const [firstTicket] = collection.tickets; + const [firstSale] = firstTicket.sales; + const [firstPlacement] = firstSale.placements; + + expect(collection.tickets.length).toBeTruthy(); + expect(collection.collectionFk).toEqual(firstTicket.ticketFk); + + expect(firstSale.ticketFk).toEqual(firstTicket.ticketFk); + expect(firstSale.placements.length).toBeTruthy(); + expect(firstSale.barcodes.length).toBeTruthy(); + + expect(firstSale.saleFk).toEqual(firstPlacement.saleFk); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should print a sticker', async() => { + const tx = await models.Collection.beginTransaction({}); + const options = {transaction: tx}; + const query = 'SELECT * FROM printQueue pq JOIN printQueueArgs pqa ON pqa.printQueueFk = pq.id'; + try { + const printQueueBefore = await models.Collection.rawSql( + query, [], options); + await models.Collection.getSales(ctx, + collectionOrTicketFk, true, source, options); + const printQueueAfter = await models.Collection.rawSql( + query, [], options); + + expect(printQueueAfter.length).toEqual(printQueueBefore.length + 1); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/back/methods/machine-worker/specs/updateInTime.spec.js b/back/methods/machine-worker/specs/updateInTime.spec.js new file mode 100644 index 000000000..f166214b0 --- /dev/null +++ b/back/methods/machine-worker/specs/updateInTime.spec.js @@ -0,0 +1,132 @@ +const {models} = require('vn-loopback/server/server'); + +describe('machineWorker updateInTime()', () => { + const itBoss = 104; + const davidCharles = 1106; + + beforeAll(async() => { + ctx = { + req: { + accessToken: {}, + headers: {origin: 'http://localhost'}, + __: value => value + } + }; + }); + + it('should throw an error if the plate does not exist', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + const plate = 'RE-123'; + ctx.req.accessToken.userId = 1106; + try { + await models.MachineWorker.updateInTime(ctx, plate, options); + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toContain('the plate does not exist'); + await tx.rollback(); + } + }); + + it('should grab a machine where is not in use', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + const plate = 'RE-003'; + ctx.req.accessToken.userId = 1107; + try { + const totalBefore = await models.MachineWorker.find(null, options); + await models.MachineWorker.updateInTime(ctx, plate, options); + const totalAfter = await models.MachineWorker.find(null, options); + + expect(totalAfter.length).toEqual(totalBefore.length + 1); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + } + }); + + describe('less than 12h', () => { + const plate = 'RE-001'; + it('should trow an error if it is not himself', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + ctx.req.accessToken.userId = davidCharles; + + try { + await models.MachineWorker.updateInTime(ctx, plate, options); + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toContain('This machine is already in use'); + await tx.rollback(); + } + }); + + it('should throw an error if it is himself with a different machine', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + ctx.req.accessToken.userId = itBoss; + const plate = 'RE-003'; + try { + await models.MachineWorker.updateInTime(ctx, plate, options); + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toEqual('You are already using a machine'); + await tx.rollback(); + } + }); + + it('should set the out time if it is himself', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + ctx.req.accessToken.userId = itBoss; + + try { + const isNotParked = await models.MachineWorker.findOne({ + where: {workerFk: itBoss} + }, options); + await models.MachineWorker.updateInTime(ctx, plate, options); + const isParked = await models.MachineWorker.findOne({ + where: {workerFk: itBoss} + }, options); + + expect(isNotParked.outTime).toBeNull(); + expect(isParked.outTime).toBeDefined(); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + } + }); + }); + + describe('equal or more than 12h', () => { + const plate = 'RE-002'; + it('should set the out time and grab the machine', async() => { + const tx = await models.MachineWorker.beginTransaction({}); + const options = {transaction: tx}; + ctx.req.accessToken.userId = davidCharles; + const filter = { + where: {workerFk: davidCharles, machineFk: 2} + }; + try { + const isNotParked = await models.MachineWorker.findOne(filter, options); + const totalBefore = await models.MachineWorker.find(null, options); + await models.MachineWorker.updateInTime(ctx, plate, options); + const isParked = await models.MachineWorker.findOne(filter, options); + const totalAfter = await models.MachineWorker.find(null, options); + + expect(isNotParked.outTime).toBeNull(); + expect(isParked.outTime).toBeDefined(); + expect(totalAfter.length).toEqual(totalBefore.length + 1); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + } + }); + }); +}); diff --git a/back/methods/machine-worker/updateInTime.js b/back/methods/machine-worker/updateInTime.js new file mode 100644 index 000000000..8f663302d --- /dev/null +++ b/back/methods/machine-worker/updateInTime.js @@ -0,0 +1,77 @@ +const UserError = require('vn-loopback/util/user-error'); +module.exports = Self => { + Self.remoteMethodCtx('updateInTime', { + description: 'Updates the corresponding registry if the worker has been registered in the last few hours', + accessType: 'WRITE', + accepts: [ + { + arg: 'plate', + type: 'string', + } + ], + http: { + path: `/updateInTime`, + verb: 'POST' + } + }); + + Self.updateInTime = async(ctx, plate, options) => { + const models = Self.app.models; + const userId = ctx.req.accessToken.userId; + const $t = ctx.req.__; + + let tx; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const machine = await models.Machine.findOne({ + fields: ['id', 'plate'], + where: {plate} + }, myOptions); + + if (!machine) + throw new Error($t('the plate does not exist', {plate})); + + const machineWorker = await Self.findOne({ + where: { + or: [{machineFk: machine.id}, {workerFk: userId}], + outTime: null, + } + }, myOptions); + + const {maxHours} = await models.MachineWorkerConfig.findOne({fields: ['maxHours']}, myOptions); + const hoursDifference = (Date.vnNow() - machineWorker.inTime.getTime()) / (60 * 60 * 1000); + + if (machineWorker) { + const isHimself = userId == machineWorker.workerFk; + const isSameMachine = machine.id == machineWorker.machineFk; + + if (hoursDifference < maxHours && !isHimself) + throw new UserError($t('This machine is already in use.')); + + if (hoursDifference < maxHours && isHimself && !isSameMachine) + throw new UserError($t('You are already using a machine')); + + await machineWorker.updateAttributes({ + outTime: Date.vnNew() + }, myOptions); + } + + if (!machineWorker || hoursDifference >= maxHours) + await models.MachineWorker.create({machineFk: machine.id, workerFk: userId}, myOptions); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/back/methods/mobile-app-version-control/getVersion.js b/back/methods/mobile-app-version-control/getVersion.js new file mode 100644 index 000000000..38f4acc54 --- /dev/null +++ b/back/methods/mobile-app-version-control/getVersion.js @@ -0,0 +1,45 @@ +module.exports = Self => { + Self.remoteMethodCtx('getVersion', { + description: 'gets app version data', + accessType: 'READ', + accepts: [{ + arg: 'app', + type: 'string', + required: true + }], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/getVersion`, + verb: 'GET' + } + }); + + Self.getVersion = async(ctx, app) => { + const {models} = Self.app; + const userId = ctx.req.accessToken.userId; + + const workerFk = await models.WorkerAppTester.findOne({ + where: { + workerFk: userId + } + }); + let fields = ['id', 'appName']; + + if (workerFk) + fields = fields.concat(['isVersionBetaCritical', 'versionBeta', 'urlBeta']); + else + fields = fields.concat(['isVersionCritical', 'version', 'urlProduction']); + + const filter = { + where: { + appName: app + }, + fields, + }; + + return Self.findOne(filter); + }; +}; diff --git a/back/methods/mobile-app-version-control/specs/getVersion.spec.js b/back/methods/mobile-app-version-control/specs/getVersion.spec.js new file mode 100644 index 000000000..59d794ccf --- /dev/null +++ b/back/methods/mobile-app-version-control/specs/getVersion.spec.js @@ -0,0 +1,29 @@ +const {models} = require('vn-loopback/server/server'); + +describe('mobileAppVersionControl getVersion()', () => { + const appName = 'delivery'; + beforeAll(async() => { + ctx = { + req: { + accessToken: {}, + headers: {origin: 'http://localhost'}, + } + }; + }); + + it('should get the version app', async() => { + ctx.req.accessToken.userId = 9; + const {version, versionBeta} = await models.MobileAppVersionControl.getVersion(ctx, appName); + + expect(version).toEqual('9.2'); + expect(versionBeta).toBeUndefined(); + }); + + it('should get the beta version app', async() => { + ctx.req.accessToken.userId = 66; + const {version, versionBeta} = await models.MobileAppVersionControl.getVersion(ctx, appName); + + expect(versionBeta).toBeDefined(); + expect(version).toBeUndefined(); + }); +}); diff --git a/back/model-config.json b/back/model-config.json index c4eefd932..f48ec11e6 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -13,10 +13,10 @@ "AuthCode": { "dataSource": "vn" }, - "Bank": { + "Accounting": { "dataSource": "vn" }, - "Buyer": { + "Buyer": { "dataSource": "vn" }, "Campaign": { @@ -79,15 +79,24 @@ "Language": { "dataSource": "vn" }, + "Machine": { + "dataSource": "vn" + }, "MachineWorker": { "dataSource": "vn" }, + "MachineWorkerConfig": { + "dataSource": "vn" + }, "MobileAppVersionControl": { "dataSource": "vn" }, "Module": { "dataSource": "vn" }, + "MrwConfig": { + "dataSource": "vn" + }, "Notification": { "dataSource": "vn" }, @@ -160,10 +169,10 @@ "VnRole": { "dataSource": "vn" }, - "MrwConfig": { + "WorkerActivity": { + "dataSource": "vn" + }, + "WorkerActivityType": { "dataSource": "vn" } -} - - - +} \ No newline at end of file diff --git a/back/models/bank.json b/back/models/accounting.json similarity index 85% rename from back/models/bank.json rename to back/models/accounting.json index da73b1141..979947471 100644 --- a/back/models/bank.json +++ b/back/models/accounting.json @@ -1,9 +1,9 @@ { - "name": "Bank", + "name": "Accounting", "base": "VnModel", "options": { "mysql": { - "table": "bank" + "table": "accounting" } }, "properties": { @@ -22,10 +22,7 @@ }, "accountingTypeFk": { "type": "number", - "required": true, - "mysql": { - "columnName": "cash" - } + "required": true }, "entityFk": { "type": "number", diff --git a/back/models/collection.js b/back/models/collection.js index 52ef26e88..f2c2f1566 100644 --- a/back/models/collection.js +++ b/back/models/collection.js @@ -3,4 +3,6 @@ module.exports = Self => { require('../methods/collection/setSaleQuantity')(Self); require('../methods/collection/previousLabel')(Self); require('../methods/collection/getTickets')(Self); + require('../methods/collection/assign')(Self); + require('../methods/collection/getSales')(Self); }; diff --git a/back/models/machine-worker-config.json b/back/models/machine-worker-config.json new file mode 100644 index 000000000..dfb77124e --- /dev/null +++ b/back/models/machine-worker-config.json @@ -0,0 +1,18 @@ +{ + "name": "MachineWorkerConfig", + "base": "VnModel", + "options": { + "mysql": { + "table": "vn.machineWorkerConfig" + } + }, + "properties": { + "id": { + "type": "number", + "id": true + }, + "maxHours": { + "type": "number" + } + } +} diff --git a/back/models/machine-worker.js b/back/models/machine-worker.js new file mode 100644 index 000000000..cbc5fd53e --- /dev/null +++ b/back/models/machine-worker.js @@ -0,0 +1,3 @@ +module.exports = Self => { + require('../methods/machine-worker/updateInTime')(Self); +}; diff --git a/back/models/machine.json b/back/models/machine.json new file mode 100644 index 000000000..7029091a2 --- /dev/null +++ b/back/models/machine.json @@ -0,0 +1,18 @@ +{ + "name": "Machine", + "base": "VnModel", + "options": { + "mysql": { + "table": "vn.machine" + } + }, + "properties": { + "id": { + "type": "number", + "id": true + }, + "plate": { + "type": "string" + } + } +} diff --git a/back/models/mobile-app-version-control.js b/back/models/mobile-app-version-control.js new file mode 100644 index 000000000..ee8fa2ab6 --- /dev/null +++ b/back/models/mobile-app-version-control.js @@ -0,0 +1,3 @@ +module.exports = Self => { + require('../methods/mobile-app-version-control/getVersion')(Self); +}; diff --git a/back/models/mobile-app-version-control.json b/back/models/mobile-app-version-control.json new file mode 100644 index 000000000..819ad33f5 --- /dev/null +++ b/back/models/mobile-app-version-control.json @@ -0,0 +1,39 @@ +{ + "name": "MobileAppVersionControl", + "base": "VnModel", + "options": { + "mysql": { + "table": "vn.mobileAppVersionControl" + } + }, + "properties": { + "id": { + "type": "number", + "id": true + }, + "appName": { + "type": "string" + }, + + "version": { + "type": "string" + }, + + "isVersionCritical": { + "type": "boolean" + }, + + "urlProduction": { + "type": "string" + }, + "urlBeta": { + "type": "string" + }, + "versionBeta": { + "type": "string" + }, + "isVersionBetaCritical": { + "type": "boolean" + } + } +} diff --git a/back/models/payment.json b/back/models/payment.json index 7eca36e4d..ed354969e 100644 --- a/back/models/payment.json +++ b/back/models/payment.json @@ -47,7 +47,7 @@ }, "bank": { "type": "belongsTo", - "model": "Bank", + "model": "Accounting", "foreignKey": "bankFk" }, "payMethod": { diff --git a/back/models/workerActivity.json b/back/models/workerActivity.json new file mode 100644 index 000000000..e3b994f77 --- /dev/null +++ b/back/models/workerActivity.json @@ -0,0 +1,39 @@ +{ + "name": "WorkerActivity", + "base": "VnModel", + "options": { + "mysql": { + "table": "workerActivity" + } + }, + "properties": { + "id": { + "id": true, + "type": "number" + }, + "created": { + "type": "date" + }, + "model": { + "type": "string" + }, + "event": { + "type": "string" + }, + "description": { + "type": "string" + }, + "relations": { + "workerFk": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerFk" + }, + "workerActivityTypeFk": { + "type": "belongsTo", + "model": "WorkerActivityType", + "foreignKey": "workerActivityTypeFk" + } + } + } +} \ No newline at end of file diff --git a/back/models/workerActivityType.json b/back/models/workerActivityType.json new file mode 100644 index 000000000..f010363a7 --- /dev/null +++ b/back/models/workerActivityType.json @@ -0,0 +1,19 @@ +{ + "name": "WorkerActivityType", + "base": "VnModel", + "options": { + "mysql": { + "table": "workerActivityType" + } + }, + "properties": { + "code": { + "id": true, + "type": "string" + }, + "description": { + "type": "string", + "required": false + } + } +} \ No newline at end of file diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index e9801647e..905847119 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -1393,8 +1393,6 @@ INSERT INTO `ACL` VALUES (385,'Route','driverRoutePdf','READ','ALLOW','ROLE','em INSERT INTO `ACL` VALUES (386,'Route','driverRouteEmail','WRITE','ALLOW','ROLE','employee'); INSERT INTO `ACL` VALUES (387,'Ticket','deliveryNotePdf','READ','ALLOW','ROLE','customer'); INSERT INTO `ACL` VALUES (388,'Supplier','newSupplier','WRITE','ALLOW','ROLE','administrative'); -INSERT INTO `ACL` VALUES (389,'ClaimRma','*','READ','ALLOW','ROLE','claimManager'); -INSERT INTO `ACL` VALUES (390,'ClaimRma','*','WRITE','ALLOW','ROLE','claimManager'); INSERT INTO `ACL` VALUES (391,'Notification','*','WRITE','ALLOW','ROLE','system'); INSERT INTO `ACL` VALUES (392,'Boxing','*','*','ALLOW','ROLE','employee'); INSERT INTO `ACL` VALUES (393,'Url','*','READ','ALLOW','ROLE','employee'); diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index cb9ee0fe6..4ad007f5c 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1239,6 +1239,7 @@ INSERT INTO `vn`.`train`(`id`, `name`) INSERT INTO `vn`.`operator` (`workerFk`, `numberOfWagons`, `trainFk`, `itemPackingTypeFk`, `warehouseFk`, `sectorFk`, `labelerFk`) VALUES ('1106', '1', '1', 'H', '1', '1', '1'), + ('9', '2', '1', 'H', '1', '1', '1'), ('1107', '1', '1', 'V', '1', '1', '1'); INSERT INTO `vn`.`collection`(`id`, `workerFk`, `stateFk`, `created`, `trainFk`) @@ -1819,19 +1820,16 @@ INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk INSERT INTO `vn`.`claimState`(`id`, `code`, `description`, `roleFk`, `priority`, `hasToNotify`) VALUES ( 1, 'pending', 'Pendiente', 1, 1, 0), - ( 2, 'managed', 'Gestionado', 72, 5, 0), ( 3, 'resolved', 'Resuelto', 72, 7, 0), ( 4, 'canceled', 'Anulado', 72, 6, 1), - ( 5, 'incomplete', 'Incompleta', 1, 3, 1), - ( 6, 'mana', 'Mana', 72, 4, 0), - ( 7, 'lack', 'Faltas', 72, 2, 0); + ( 5, 'incomplete', 'Incompleta', 1, 3, 1); -INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `rma`, `ticketFk`) +INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `ticketFk`) VALUES - (1, util.VN_CURDATE(), 1, 1101, 18, 3, 0, util.VN_CURDATE(), 0, '02676A049183', 11), - (2, util.VN_CURDATE(), 2, 1101, 18, 3, 0, util.VN_CURDATE(), 1, NULL, 16), - (3, util.VN_CURDATE(), 3, 1101, 18, 1, 1, util.VN_CURDATE(), 5, NULL, 7), - (4, util.VN_CURDATE(), 3, 1104, 18, 5, 0, util.VN_CURDATE(), 10, NULL, 8); + (1, util.VN_CURDATE(), 1, 1101, 18, 3, 0, util.VN_CURDATE(), 0, 11), + (2, util.VN_CURDATE(), 4, 1101, 18, 3, 0, util.VN_CURDATE(), 1, 16), + (3, util.VN_CURDATE(), 3, 1101, 18, 1, 1, util.VN_CURDATE(), 5, 7), + (4, util.VN_CURDATE(), 3, 1104, 18, 5, 0, util.VN_CURDATE(), 10, 8); INSERT INTO `vn`.`claimObservation` (`claimFk`, `workerFk`, `text`, `created`) VALUES @@ -1880,14 +1878,6 @@ INSERT INTO `vn`.`claimRatio`(`clientFk`, `yearSale`, `claimAmount`, `claimingRa (1103, 2000, 0.00, 0.00, 0.02, 1.00), (1104, 2500, 150.00, 0.02, 0.10, 1.00); -INSERT INTO vn.claimRma (`id`, `code`, `created`, `workerFk`) - VALUES - (1, '02676A049183', DEFAULT, 1106), - (2, '02676A049183', DEFAULT, 1106), - (3, '02676A049183', DEFAULT, 1107), - (4, '02676A049183', DEFAULT, 1107), - (5, '01837B023653', DEFAULT, 1106); - INSERT INTO `vn`.`claimLog` (`originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description`) VALUES (1, 18, 'update', 'Claim', '{"hasToPickUp":false}', '{"hasToPickUp":true}', 1, NULL), @@ -2737,10 +2727,10 @@ INSERT INTO `vn`.`chat` (`senderFk`, `recipient`, `dated`, `checkUserStatus`, `m (1101, '@PetterParker', util.VN_CURDATE(), 0, 'Second test message', 0, 'pending'); -INSERT INTO `vn`.`mobileAppVersionControl` (`appName`, `version`, `isVersionCritical`) +INSERT INTO `vn`.`mobileAppVersionControl` (`appName`, `version`, `isVersionCritical`,`versionBeta`) VALUES - ('delivery', '9.2', 0), - ('warehouse', '8.1', 0); + ('delivery', '9.2', 0,'9.7'), + ('warehouse', '8.1', 0,'8.3'); INSERT INTO `vn`.`machine` (`plate`, `maker`, `model`, `warehouseFk`, `departmentFk`, `type`, `use`, `productionYear`, `workerFk`, `companyFk`) VALUES @@ -3077,3 +3067,669 @@ INSERT INTO `vn`.`cmr` (id,truckPlate,observations,senderInstruccions,paymentIns UPDATE vn.department SET workerFk = null; + +-- NEW WAREHOUSE + +INSERT INTO vn.packaging + VALUES('--', 2745600.00, 100.00, 120.00, 220.00, 0.00, 1, '2001-01-01 00:00:00.000', NULL, NULL, NULL, 0.00, 16, 0.00, 0, NULL, 0.00, NULL, NULL, 0, NULL, 0, 0); + + +INSERT IGNORE INTO vn.intrastat + SET id = 44219999, + description = 'Manufacturas de madera', + taxClassFk = 1, + taxCodeFk = 1; + +INSERT IGNORE INTO vn.warehouse + SET id = 999, + name = 'TestingWarehouse', + hasAvailable = TRUE, + isForTicket = TRUE, + isInventory = TRUE, + hasUbications = TRUE, + hasProduction = TRUE; + +INSERT IGNORE INTO vn.sector + SET id = 9991, + description = 'NormalSector', + warehouseFk = 999, + code = 'NS', + isPackagingArea = FALSE, + sonFk = NULL, + isMain = TRUE, + itemPackingTypeFk = NULL; + +INSERT IGNORE INTO vn.sector + SET id = 9992, + description = 'PreviousSector', + warehouseFk = 999, + code = 'PS', + isPackagingArea = FALSE, + sonFk = NULL, + isMain = TRUE, + itemPackingTypeFk = NULL; + +INSERT IGNORE INTO vn.sector + SET id = 9993, + description = 'MezaninneSector', + warehouseFk = 999, + code = 'MS', + isPackagingArea = FALSE, + sonFk = 9991, + isMain = TRUE, + itemPackingTypeFk = NULL; + + +INSERT INTO vn.parking (id,sectorFk, code, pickingOrder) + VALUES (4,9991, 'A-01-1', 1), + (5,9991, 'A-02-2', 2), + (6,9991, 'A-03-3', 3), + (7,9991, 'A-04-4', 4), + (8,9991, 'A-05-5', 5), + (9,9992, 'P-01-1', 6), + (10,9992, 'P-02-2', 7), + (11,9992, 'P-03-3', 8), + (12,9993, 'M-01-1', 9), + (13,9993, 'M-02-2', 10), + (14,9993, 'M-03-3', 11); + +INSERT INTO vn.shelving (code, parkingFk, priority) + VALUES ('NAA', 4, 1), + ('NBB', 5, 1), + ('NCC', 6, 1), + ('NDD', 7, 1), + ('NEE', 8, 1), + ('PAA', 9, 1), + ('PBB', 10, 1), + ('PCC', 11, 1), + ('MAA', 12, 1), + ('MBB', 13, 1), + ('MCC', 14, 1); + +INSERT IGNORE INTO vn.itemType + SET id = 999, + code = 'WOO', + name = 'Wood Objects', + categoryFk = 3, + workerFk = 103, + isInventory = TRUE, + life = 10, + density = 250, + itemPackingTypeFk = NULL, + temperatureFk = 'warm'; + +INSERT IGNORE INTO vn.travel + SET id = 99, + shipped = CURDATE(), + landed = CURDATE(), + warehouseInFk = 999, + warehouseOutFk = 1, + isReceived = TRUE; + +INSERT INTO vn.entry + SET id = 999, + supplierFk = 791, + isConfirmed = TRUE, + dated = CURDATE(), + travelFk = 99, + companyFk = 442; + +INSERT INTO vn.ticket + SET id = 999999, + clientFk = 2, + warehouseFk = 999, + shipped = CURDATE(), + nickname = 'Cliente', + addressFk = 1, + companyFk = 442, + agencyModeFk = 10, + landed = CURDATE(); + +INSERT INTO vn.collection + SET id = 10101010, + workerFk = 9; + +INSERT IGNORE INTO vn.ticketCollection + SET id = 10101010, + ticketFk = 999999, + collectionFk = 10101010; + +INSERT INTO vn.item + SET id = 999991, + name = 'Palito para pinchos', + `size` = 25, + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palito para pinchos', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 6, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999991, + entryFk = 999, + itemFk = 999991, + quantity = 8, + buyingValue = 0.61, + stickers = 1, + packing = 20, + `grouping` = 1, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 50; + +INSERT INTO vn.sale + SET id = 99991, + itemFk = 999991, + ticketFk = 999999, + concept = 'Palito para pinchos', + quantity = 3, + price = 1, + discount = 0; + +INSERT INTO vn.item + SET id = 999992, + name = 'Madera verde', + `size` = 10, + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Madera verde', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 50, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999992, + entryFk = 999, + itemFk = 999992, + quantity = 40, + buyingValue = 0.62, + stickers = 1, + packing = 40, + `grouping` = 5, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 25; + +INSERT INTO vn.sale + SET id = 99992, + itemFk = 999992, + ticketFk = 999999, + concept = 'Madera Verde', + quantity = 10, + price = 1, + discount = 0; + +INSERT INTO vn.item + SET id = 999993, + name = 'Madera Roja/Morada', + `size` = 12, + stems = 2, + category = 'EXT', + typeFk = 999, + longName = 'Madera Roja/Morada', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 35, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999993, + entryFk = 999, + itemFk = 999993, + quantity = 20, + buyingValue = 0.63, + stickers = 2, + packing = 10, + `grouping` = 5, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 25; + +INSERT INTO vn.itemShelving + SET id = 9931, + itemFk = 999993, + shelvingFk = 'NCC', + visible = 10, + `grouping` = 5, + packing = 10; + +INSERT INTO vn.sale + SET id = 99993, + itemFk = 999993, + ticketFk = 999999, + concept = 'Madera Roja/Morada', + quantity = 15, + price = 1, + discount = 0; + +INSERT INTO vn.item + SET id = 999994, + name = 'Madera Naranja', + `size` = 18, + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Madera Naranja', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 160, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999994, + entryFk = 999, + itemFk = 999994, + quantity = 20, + buyingValue = 0.64, + stickers = 1, + packing = 20, + `grouping` = 4, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 25; + +INSERT INTO vn.sale + SET id = 99994, + itemFk = 999994, + ticketFk = 999999, + concept = 'Madera Naranja', + quantity = 4, + price = 1, + discount = 0; + +INSERT INTO vn.item + SET id = 999995, + name = 'Madera Amarilla', + `size` = 11, + stems = 5, + category = 'EXT', + typeFk = 999, + longName = 'Madera Amarilla', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 78, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999995, + entryFk = 999, + itemFk = 999995, + quantity = 4, + buyingValue = 0.65, + stickers = 1, + packing = 20, + `grouping` = 1, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 35; + +INSERT INTO vn.sale + SET id = 99995, + itemFk = 999995, + ticketFk = 999999, + concept = 'Madera Amarilla', + quantity = 5, + price = 1, + discount = 0; + +-- Palito naranja +INSERT INTO vn.item + SET id = 999998, + name = 'Palito naranja', + `size` = 11, + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito naranja', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 78, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999998, + entryFk = 999, + itemFk = 999998, + quantity = 80, + buyingValue = 0.65, + stickers = 1, + packing = 200, + `grouping` = 30, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 35; + +INSERT INTO vn.sale + SET id = 99998, + itemFk = 999998, + ticketFk = 999999, + concept = 'Palito naranja', + quantity = 60, + price = 1, + discount = 0; + +-- Palito amarillo +INSERT INTO vn.item + SET id = 999999, + name = 'Palito amarillo', + `size` = 11, + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito amarillo', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 78, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 9999999, + entryFk = 999, + itemFk = 999999, + quantity = 70, + buyingValue = 0.65, + stickers = 1, + packing = 500, + `grouping` = 10, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 35; + +INSERT INTO vn.sale + SET id = 99999, + itemFk = 999999, + ticketFk = 999999, + concept = 'Palito amarillo', + quantity = 50, + price = 1, + discount = 0; + +-- Palito azul +INSERT INTO vn.item + SET id = 1000000, + name = 'Palito azul', + `size` = 10, + stems = 1, + category = 'EXT', + typeFk = 999, + longName = 'Palito azul', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 78, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 10000000, + entryFk = 999, + itemFk = 1000000, + quantity = 75, + buyingValue = 0.65, + stickers = 2, + packing = 300, + `grouping` = 50, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 35; + +INSERT INTO vn.sale + SET id = 100000, + itemFk = 1000000, + ticketFk = 999999, + concept = 'Palito azul', + quantity = 50, + price = 1, + discount = 0; + +-- Palito rojo +INSERT INTO vn.item + SET id = 1000001, + name = 'Palito rojo', + `size` = 10, + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palito rojo', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 78, + intrastatFk = 44219999; + +INSERT INTO vn.buy + SET id = 10000001, + entryFk = 999, + itemFk = 1000001, + quantity = 12, + buyingValue = 0.65, + stickers = 2, + packing = 50, + `grouping` = 5, + groupingMode = 1, + packageFk = 94, + price1 = 1, + price2 = 1, + price3 = 1, + minPrice = 1, + weight = 35; + + +INSERT INTO vn.sale + SET id = 100001, + itemFk = 1000001, + ticketFk = 999999, + concept = 'Palito rojo', + quantity = 10, + price = 1, + discount = 0; + +-- Previa +INSERT IGNORE INTO vn.item + SET id = 999996, + name = 'Bolas de madera', + `size` = 2, + stems = 4, + category = 'EXT', + typeFk = 999, + longName = 'Bolas de madera', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 20, + intrastatFk = 44219999; + +INSERT vn.buy + SET id = 9999996, + entryFk = 999, + itemFk = 999996, + quantity = 5, + buyingValue = 3, + stickers = 1, + packing = 5, + `grouping` = 2, + groupingMode = 1, + packageFk = 94, + price1 = 7, + price2 = 7, + price3 = 7, + minPrice = 7, + weight = 80; + +INSERT vn.sale + SET id = 99996, + itemFk = 999996, + ticketFk = 999999, + concept = 'Bolas de madera', + quantity = 4, + price = 7, + discount = 0, + isPicked = TRUE; + +INSERT IGNORE INTO vn.item + SET id = 999997, + name = 'Palitos de polo MIX', + `size` = 14, + stems = NULL, + category = 'EXT', + typeFk = 999, + longName = 'Palitos de polo MIX', + itemPackingTypeFk = NULL, + originFk = 1, + weightByPiece = 20, + intrastatFk = 44219999; + +INSERT vn.buy + SET id = 9999997, + entryFk = 999, + itemFk = 999997, + quantity = 100, + buyingValue = 3.2, + stickers = 1, + packing = 100, + `grouping` = 5, + groupingMode = 1, + packageFk = 94, + price1 = 7, + price2 = 7, + price3 = 7, + minPrice = 7, + weight = 80; + +INSERT vn.sale + SET id = 99997, + itemFk = 999997, + ticketFk = 999999, + concept = 'Palitos de polo MIX', + quantity = 5, + price = 7, + discount = 0; + +USE vn; +DELETE ish.* FROM vn.itemShelving ish + JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.parking p ON p.id = sh.parkingFk + JOIN vn.sector s ON s.id = p.sectorFk + JOIN vn.warehouse w ON w.id = s.warehouseFk + WHERE w.name = 'TestingWarehouse'; + +INSERT INTO vn.itemShelving +(itemFk, shelvingFk, visible, created, `grouping`, packing, packagingFk, userFk, isChecked) +VALUES + (999991, 'NAA', 8, '2023-09-20', 1, 20, NULL, 103, NULL), + (999998, 'NAA', 80, '2023-09-20', 10, 30, NULL, 103, NULL), + (1000001, 'NAA', 6, '2023-09-20', 3, 50, NULL, 103, NULL), + (1000000, 'NBB', 50, '2023-09-18', 25, 500, NULL, 103, NULL), + (999993, 'NBB', 25, '2023-09-18', NULL, 10, NULL, 103, NULL), + (999999, 'NBB', 30, '2023-09-18', 10, 500, NULL, 103, NULL), + (999993, 'NCC', 25, '2023-09-20', 5, 10, NULL, 103, NULL), + (999997, 'NCC', 10, '2023-09-20', NULL, 100, NULL, 103, NULL), + (999999, 'NCC', 40, '2023-09-20', 10, 500, NULL, 103, NULL), + (999995, 'NDD', 10, '2023-09-19', NULL, 20, NULL, 103, NULL), + (999994, 'NDD', 48, '2023-09-19', 4, 20, NULL, 103, NULL), + (1000001, 'NEE', 6, '2023-09-21', 3, 50, NULL, 103, NULL), + (999992, 'NEE', 50, '2023-09-21', NULL, 1, NULL, 103, NULL), + (1000000, 'NEE', 25, '2023-09-21', 25, 500, NULL, 103, NULL), + (999996, 'PAA', 5, '2023-09-27', 1, 5, NULL, 103, NULL), + (999997, 'PCC', 10, '2023-09-27', 5, 100, NULL, 103, NULL); + +-- Previous for Bolas de madera +INSERT IGNORE INTO vn.sectorCollection + SET id = 99, + userFk = 1, + sectorFk = 9992; + +INSERT IGNORE INTO vn.saleGroup + SET id = 4, + userFk = 1, + parkingFk = 9, + sectorFk = 9992; + +INSERT IGNORE INTO vn.sectorCollectionSaleGroup + SET id = 9999, + sectorCollectionFk = 99, + saleGroupFk = 999; + +INSERT vn.saleGroupDetail + SET id = 99991, + saleFk = 99996, + saleGroupFk = 999; + +INSERT INTO vn.saleTracking + SET id = 7, + saleFk = 99996, + isChecked = TRUE, + workerFk = 103, + stateFk = 28; + +INSERT IGNORE INTO vn.itemShelvingSale + SET id = 991, + itemShelvingFk = 9962, + saleFk = 99996, + quantity = 5, + userFk = 1; + +UPDATE vn.ticket + SET zoneFk=1 + WHERE id=999999; + +UPDATE vn.collection + SET workerFk=9 + WHERE id=10101010; + +UPDATE vn.sale + SET isPicked =FALSE; + +INSERT INTO vn.machineWorkerConfig(maxHours) + VALUES(12); + +INSERT INTO vn.workerAppTester(workerFk) VALUES(66); + +INSERT INTO `vn`.`machine` (`plate`, `maker`, `model`, `warehouseFk`, `departmentFk`, `type`, `use`, `productionYear`, `workerFk`, `companyFk`) + VALUES + ('RE-003', 'IRON', 'JPH-24', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442); + + +INSERT INTO vn.machineWorker(workerFk,machineFk,inTimed) VALUES (104,1,'2001-01-01 10:00:00.00.000'); + +UPDATE vn.buy SET itemOriginalFk = 1 WHERE id = 1; + +UPDATE vn.saleTracking SET stateFk = 26 WHERE id = 5; + +INSERT INTO vn.report (name) VALUES ('LabelCollection'); + +INSERT INTO vn.parkingLog(originFk, userFk, `action`, creationDate, description, changedModel,oldInstance, newInstance, changedModelId, changedModelValue) + VALUES(1, 18, 'update', util.VN_CURDATE(), NULL, 'SaleGroup', '{"parkingFk":null}', '{"parkingFk":1}', 1, NULL); \ No newline at end of file diff --git a/db/routines/bs/procedures/manaCustomerUpdate.sql b/db/routines/bs/procedures/manaCustomerUpdate.sql index 2cb25d135..2038f976a 100644 --- a/db/routines/bs/procedures/manaCustomerUpdate.sql +++ b/db/routines/bs/procedures/manaCustomerUpdate.sql @@ -22,7 +22,7 @@ BEGIN FROM vn.component WHERE code = 'manaClaim'; SELECT id INTO vManaBankId - FROM vn.bank WHERE code = 'mana'; + FROM vn.accounting WHERE code = 'mana'; SELECT id INTO vManaGreugeTypeId FROM vn.greugeType WHERE code = 'mana'; diff --git a/db/routines/cache/procedures/clean.sql b/db/routines/cache/procedures/clean.sql index 95841a713..5e6628689 100644 --- a/db/routines/cache/procedures/clean.sql +++ b/db/routines/cache/procedures/clean.sql @@ -1,10 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `cache`.`clean`() BEGIN - DECLARE vDateShort DATETIME; - - SET vDateShort = TIMESTAMPADD(MONTH, -1, util.VN_CURDATE()); - - DELETE FROM cache.departure_limit WHERE Fecha < vDateShort; + DELETE FROM cache.departure_limit WHERE Fecha < util.VN_CURDATE() - INTERVAL 1 MONTH; END$$ DELIMITER ; diff --git a/db/routines/hedera/procedures/tpvTransaction_undo.sql b/db/routines/hedera/procedures/tpvTransaction_undo.sql index ed72dd76d..f31ba6a80 100644 --- a/db/routines/hedera/procedures/tpvTransaction_undo.sql +++ b/db/routines/hedera/procedures/tpvTransaction_undo.sql @@ -54,7 +54,7 @@ p: BEGIN FROM vn.`client` WHERE id = vCustomer; SELECT account INTO vAccount - FROM vn.bank WHERE id = vBank; + FROM vn.accounting WHERE id = vBank; DELETE FROM vn.XDiario WHERE SUBCTA = vSubaccount diff --git a/db/routines/sage/procedures/accountingMovements_add.sql b/db/routines/sage/procedures/accountingMovements_add.sql index bd86e132d..575c63f6c 100644 --- a/db/routines/sage/procedures/accountingMovements_add.sql +++ b/db/routines/sage/procedures/accountingMovements_add.sql @@ -253,9 +253,9 @@ BEGIN LIMIT 10000000000000000000 ) sub GROUP BY ASIEN )sub2 ON sub2.ASIEN = x.ASIEN - LEFT JOIN ( SELECT DISTINCT(account),cu.code - FROM vn.bank b - JOIN vn.currency cu ON cu.id = b.currencyFk + LEFT JOIN ( SELECT DISTINCT(a.account),cu.code + FROM vn.accounting a + JOIN vn.currency cu ON cu.id = a.currencyFk WHERE cu.code <> 'EUR' -- no se informa cuando la divisa en EUR )sub3 ON sub3.account = x.SUBCTA WHERE x.enlazadoSage = FALSE diff --git a/db/routines/sage/procedures/pgc_add.sql b/db/routines/sage/procedures/pgc_add.sql index 6dd5bc72d..ebcb2d043 100644 --- a/db/routines/sage/procedures/pgc_add.sql +++ b/db/routines/sage/procedures/pgc_add.sql @@ -17,15 +17,15 @@ BEGIN e.id accountFk, UCASE(e.name), '' - FROM vn.expense e + FROM expense e UNION SELECT company_getCode(vCompanyFk), - b.account, - UCASE(b.bank), + a.account, + UCASE(a.bank), '' - FROM vn.bank b - WHERE b.isActive - AND b.`account` + FROM accounting a + WHERE a.isActive + AND a.`account` UNION SELECT CodigoEmpresa, CodigoCuenta, diff --git a/db/routines/vn/events/sale_checkWithoutComponents.sql b/db/routines/vn/events/sale_checkWithoutComponents.sql deleted file mode 100644 index 2a1ced6ca..000000000 --- a/db/routines/vn/events/sale_checkWithoutComponents.sql +++ /dev/null @@ -1,8 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `vn`.`sale_checkWithoutComponents` - ON SCHEDULE EVERY 10 MINUTE - STARTS '2020-05-04 11:56:23.000' - ON COMPLETION PRESERVE - ENABLE -DO call sale_checkNoComponents(DATE_ADD(util.VN_NOW(), INTERVAL -10 MINUTE),DATE_ADD(util.VN_NOW(), INTERVAL -1 MINUTE))$$ -DELIMITER ; diff --git a/db/routines/vn/functions/till_new.sql b/db/routines/vn/functions/till_new.sql index cfca5945d..24f4f2b79 100644 --- a/db/routines/vn/functions/till_new.sql +++ b/db/routines/vn/functions/till_new.sql @@ -34,7 +34,7 @@ BEGIN -- Inserta los asientos contables SELECT account INTO vAccount - FROM bank WHERE id = vBank; + FROM accounting WHERE id = vBank; SELECT accountingAccount INTO vSubaccount FROM `client` WHERE id = vClient; diff --git a/db/routines/vn/procedures/balanceNestTree_addChild.sql b/db/routines/vn/procedures/balanceNestTree_addChild.sql new file mode 100644 index 000000000..5cd1ab470 --- /dev/null +++ b/db/routines/vn/procedures/balanceNestTree_addChild.sql @@ -0,0 +1,52 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_addChild`( + vSelf INT, + vName VARCHAR(45) +) +BEGIN +/** + * Agrega un nuevo nodo hijo a un nodo existente dentro de la estructura + * de árbol de vn.balanceNestTree. + * + * @param vSelf Identificador del nodo + * @param vName Nombre del nuevo nodo hijo + */ + DECLARE vTable VARCHAR(45) DEFAULT util.quoteIdentifier('balanceNestTree'); + DECLARE vLeft INT; + + CREATE OR REPLACE TEMPORARY TABLE tAux + SELECT 0 lft; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE tAux + SET lft = (SELECT lft + FROM ', vTable, + ' WHERE id = ?)') + USING vSelf; + + SELECT lft INTO vLeft FROM tAux; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, ' + SET rgt = rgt + 2 + WHERE rgt > ? + ORDER BY rgt DESC') + USING vLeft; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, ' + SET lft = lft + 2 + WHERE lft > ? + ORDER BY lft DESC') + USING vLeft; + + EXECUTE IMMEDIATE CONCAT( + 'INSERT INTO ', vTable, ' (name, lft, rgt) + VALUES(?, ? + 1, ? + 2)') + USING vName, + vLeft, + vLeft; + + DROP TEMPORARY TABLE tAux; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/balanceNestTree_delete.sql b/db/routines/vn/procedures/balanceNestTree_delete.sql new file mode 100644 index 000000000..1d6a9efff --- /dev/null +++ b/db/routines/vn/procedures/balanceNestTree_delete.sql @@ -0,0 +1,53 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_delete`( + vSelf INT +) +BEGIN +/** + * Elimina un nodo dentro de la estructura de árbol de vn.balanceNestTree. + * + * @param vSelf Identificador del nodo + */ + DECLARE vTable VARCHAR(45) DEFAULT util.quoteIdentifier('balanceNestTree'); + DECLARE vRight INT; + DECLARE vLeft INT; + DECLARE vWidth INT; + + CREATE OR REPLACE TEMPORARY TABLE tAux + SELECT 0 rgt, 0 lft, 0 wdt; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE tAux a + JOIN ', vTable, ' t + SET a.rgt = t.rgt, + a.lft = t.lft, + a.wdt = t.rgt - t.lft + 1 + WHERE t.id = ?') + USING vSelf; + + SELECT rgt, lft, wdt + INTO vRight, vLeft, vWidth + FROM tAux; + + EXECUTE IMMEDIATE CONCAT( + 'DELETE FROM ', vTable, + ' WHERE lft BETWEEN ? AND ?') + USING vLeft, vRight; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + ' SET rgt = rgt - ? + WHERE rgt > ? + ORDER BY rgt') + USING vWidth,vRight; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + ' SET lft = lft - ? + WHERE lft > ? + ORDER BY lft') + USING vWidth, vRight; + + DROP TEMPORARY TABLE tAux; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/balanceNestTree_move.sql b/db/routines/vn/procedures/balanceNestTree_move.sql new file mode 100644 index 000000000..ce29de1d9 --- /dev/null +++ b/db/routines/vn/procedures/balanceNestTree_move.sql @@ -0,0 +1,117 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_move`( + vSelf INT, + vFather INT +) +BEGIN +/** + * Mueve un nodo dentro de la estructura de árbol de vn.balanceNestTree. + * + * @param vSelf Identificador del nodo + * @param vFather Identificador del nuevo padre del nodo + */ + DECLARE vTable VARCHAR(45) DEFAULT util.quoteIdentifier('balanceNestTree'); + DECLARE vRight INT; + DECLARE vLeft INT; + DECLARE vWidth INT; + DECLARE vFatherRight INT; + DECLARE vFatherLeft INT; + DECLARE vGap INT; + + CREATE OR REPLACE TEMPORARY TABLE tAux + SELECT 0 rgt, 0 lft, 0 wdt, 0 frg, 0 flf; + + -- Averiguamos el ancho de la rama + EXECUTE IMMEDIATE CONCAT( + 'UPDATE tAux a + JOIN ', vTable, ' t + SET a.wdt = t.rgt - t.lft + 1 + WHERE t.id = ?') + USING vSelf; + + -- Averiguamos la posicion del nuevo padre + EXECUTE IMMEDIATE CONCAT( + 'UPDATE tAux a + JOIN ', vTable, ' t + SET a.frg = t.rgt, + a.flf = t.lft + WHERE t.id = ?') + USING vFather; + + SELECT wdt, frg, flf + INTO vWidth, vFatherRight, vFatherLeft + FROM tAux; + + -- 1º Incrementamos los valores de todos los nodos a la derecha + -- del punto de inserción (vFatherRight) , para hacer sitio + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET rgt = rgt + ? + WHERE rgt >= ? + ORDER BY rgt DESC') + USING vWidth, + vFatherRight; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET lft = lft + ? + WHERE lft >= ? + ORDER BY lft DESC') + USING vWidth, + vFatherRight; + + -- Es preciso recalcular los valores del nodo en el + -- caso de que estuviera a la derecha del nuevo padre + EXECUTE IMMEDIATE CONCAT( + 'UPDATE tAux a + JOIN ', vTable, ' t + SET a.rgt = t.rgt, + a.lft = t.lft + WHERE t.id = ?') + USING vSelf; + + SELECT lft, rgt, frg - lft + INTO vLeft, vRight, vGap + FROM tAux; + + -- 2º Incrementamos el valor de todos los nodos a + -- trasladar hasta alcanzar su nueva posicion + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET lft = lft + ? + WHERE lft BETWEEN ? AND ? + ORDER BY lft DESC') + USING vGap, + vLeft, + vRight; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET rgt = rgt + ? + WHERE rgt BETWEEN ? AND ? + ORDER BY rgt DESC') + USING vGap, + vLeft, + vRight; + + -- 3º Restaremos a todos los nodos resultantes, a la derecha + -- de la posicion arrancada el ancho de la rama escindida + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET lft = lft - ? + WHERE lft > ? + ORDER BY lft') + USING vWidth, + vLeft; + + EXECUTE IMMEDIATE CONCAT( + 'UPDATE ', vTable, + 'SET rgt = rgt - ? + WHERE rgt > ? + ORDER BY rgt') + USING vWidth, + vRight; + + DROP TEMPORARY TABLE tAux; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/bankPolicy_notifyExpired.sql b/db/routines/vn/procedures/bankPolicy_notifyExpired.sql index 52b747659..61216938d 100644 --- a/db/routines/vn/procedures/bankPolicy_notifyExpired.sql +++ b/db/routines/vn/procedures/bankPolicy_notifyExpired.sql @@ -10,13 +10,11 @@ BEGIN INSERT INTO mail (receiver,replyTo,subject,body) SELECT 'administracion@verdnatura.es' receiver, 'noreply@verdnatura.es' replyTo, - CONCAT('El seguro de la poliza ',b.id,' ',b.bank,' ha finalizado.') subject, - CONCAT('El seguro de la poliza ',b.id,' ',b.bank,' ha finalizado.') body - FROM vn.bankPolicy bp - LEFT JOIN vn.supplier s - ON s.id = bp.supplierFk - LEFT JOIN vn.bank b - ON b.id = bp.accountingFk + CONCAT('El seguro de la poliza ',a.id,' ',a.bank,' ha finalizado.') subject, + CONCAT('El seguro de la poliza ',a.id,' ',a.bank,' ha finalizado.') body + FROM bankPolicy bp + LEFT JOIN supplier s ON s.id = bp.supplierFk + LEFT JOIN accounting a ON a.id = bp.accountingFk WHERE bp.insuranceExpired = util.VN_CURDATE(); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/clean.sql b/db/routines/vn/procedures/clean.sql index cee64d772..5ffb03f6d 100644 --- a/db/routines/vn/procedures/clean.sql +++ b/db/routines/vn/procedures/clean.sql @@ -1,48 +1,42 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clean`() BEGIN - DECLARE vDateShort DATETIME; - DECLARE vOneYearAgo DATE; - DECLARE vFourYearsAgo DATE; - DECLARE vFiveYearsAgo DATE; - DECLARE v18Month DATE; - DECLARE v26Month DATE; - DECLARE v3Month DATE; +/** + * Purges outdated data to optimize performance. + * Exercise caution when executing. + */ + DECLARE v2Months DATE DEFAULT util.VN_CURDATE() - INTERVAL 2 MONTH; + DECLARE v3Months DATE DEFAULT util.VN_CURDATE() - INTERVAL 3 MONTH; + DECLARE v18Months DATE DEFAULT util.VN_CURDATE() - INTERVAL 18 MONTH; + DECLARE v26Months DATE DEFAULT util.VN_CURDATE() - INTERVAL 26 MONTH; + DECLARE v1Years DATE DEFAULT util.VN_CURDATE() - INTERVAL 1 YEAR; + DECLARE v2Years DATE DEFAULT util.VN_CURDATE() - INTERVAL 2 YEAR; + DECLARE v4Years DATE DEFAULT util.VN_CURDATE() - INTERVAL 4 YEAR; + DECLARE v5Years DATE DEFAULT util.VN_CURDATE() - INTERVAL 5 YEAR; DECLARE vTrashId VARCHAR(15); - DECLARE v2Years DATE; - DECLARE v5Years DATE; - - SET vDateShort = util.VN_CURDATE() - INTERVAL 2 MONTH; - SET vOneYearAgo = util.VN_CURDATE() - INTERVAL 1 YEAR; - SET vFourYearsAgo = util.VN_CURDATE() - INTERVAL 4 YEAR; - SET vFiveYearsAgo = util.VN_CURDATE() - INTERVAL 5 YEAR; - SET v18Month = util.VN_CURDATE() - INTERVAL 18 MONTH; - SET v26Month = util.VN_CURDATE() - INTERVAL 26 MONTH; - SET v3Month = util.VN_CURDATE() - INTERVAL 3 MONTH; - SET v2Years = util.VN_CURDATE() - INTERVAL 2 YEAR; - SET v5Years = util.VN_CURDATE() - INTERVAL 5 YEAR; + DECLARE vCompanyBlk INT; DELETE FROM workerActivity WHERE created < v2Years; - DELETE FROM ticketParking WHERE created < vDateShort; - DELETE FROM routesMonitor WHERE dated < vDateShort; - DELETE FROM workerTimeControlLog WHERE created < vDateShort; - DELETE FROM `message` WHERE sendDate < vDateShort; - DELETE FROM messageInbox WHERE sendDate < vDateShort; - DELETE FROM messageInbox WHERE sendDate < vDateShort; - DELETE FROM workerTimeControl WHERE timed < vFourYearsAgo; + DELETE FROM ticketParking WHERE created < v2Months; + DELETE FROM routesMonitor WHERE dated < v2Months; + DELETE FROM workerTimeControlLog WHERE created < v2Months; + DELETE FROM `message` WHERE sendDate < v2Months; + DELETE FROM messageInbox WHERE sendDate < v2Months; + DELETE FROM messageInbox WHERE sendDate < v2Months; + DELETE FROM workerTimeControl WHERE timed < v4Years; DELETE FROM itemShelving WHERE created < util.VN_CURDATE() AND visible = 0; - DELETE FROM ticketDown WHERE created < TIMESTAMPADD(DAY,-1,util.VN_CURDATE()); - DELETE FROM entryLog WHERE creationDate < vDateShort; - DELETE IGNORE FROM expedition WHERE created < v26Month; - DELETE FROM sms WHERE created < v18Month; - DELETE FROM saleTracking WHERE created < vOneYearAgo; - DELETE FROM ticketTracking WHERE created < v18Month; + DELETE FROM ticketDown WHERE created < util.yesterday(); + DELETE FROM entryLog WHERE creationDate < v2Months; + DELETE IGNORE FROM expedition WHERE created < v26Months; + DELETE FROM sms WHERE created < v18Months; + DELETE FROM saleTracking WHERE created < v1Years; + DELETE FROM ticketTracking WHERE created < v18Months; DELETE tobs FROM ticketObservation tobs JOIN ticket t ON tobs.ticketFk = t.id WHERE t.shipped < v5Years; - DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < vOneYearAgo; - DELETE FROM sharingCart where ended < vDateShort; - DELETE FROM sharingClient where ended < vDateShort; + DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < v1Years; + DELETE FROM sharingCart where ended < v2Months; + DELETE FROM sharingClient where ended < v2Months; DELETE tw.* FROM ticketWeekly tw LEFT JOIN sale s ON s.ticketFk = tw.ticketFk LEFT JOIN ticketRequest tr ON tr.ticketFk = tw.ticketFk @@ -50,165 +44,182 @@ BEGIN WHERE s.id IS NULL AND tr.id IS NULL AND ts.id IS NULL; - DELETE FROM claim WHERE ticketCreated < vFourYearsAgo; - DELETE FROM message WHERE sendDate < vDateShort; - -- Robert ubicacion anterior de trevelLog comentario para debug - DELETE FROM zoneEvent WHERE `type` = 'day' AND dated < v3Month; + DELETE FROM claim WHERE ticketCreated < v4Years; + -- Robert ubicacion anterior de travelLog comentario para debug + DELETE FROM zoneEvent WHERE `type` = 'day' AND dated < v3Months; DELETE bm FROM buyMark bm JOIN buy b ON b.id = bm.id JOIN entry e ON e.id = b.entryFk JOIN travel t ON t.id = e.travelFk - WHERE t.landed <= vDateShort; - DELETE b FROM vn.buy b - JOIN vn.entryConfig e ON e.defaultEntry = b.entryFk - WHERE b.created < vDateShort; - DELETE FROM vn.itemShelvingLog WHERE created < vDateShort; - DELETE FROM vn.stockBuyed WHERE creationDate < vDateShort; - DELETE FROM vn.itemCleanLog WHERE created < util.VN_NOW() - INTERVAL 1 YEAR; - DELETE FROM printQueue WHERE statusCode = 'printed' AND created < vDateShort; - DELETE FROM ticketLog WHERE creationDate <= vFiveYearsAgo; + WHERE t.landed <= v2Months; + DELETE b FROM buy b + JOIN entryConfig e ON e.defaultEntry = b.entryFk + WHERE b.created < v2Months; + DELETE FROM itemShelvingLog WHERE created < v2Months; + DELETE FROM stockBuyed WHERE creationDate < v2Months; + DELETE FROM itemCleanLog WHERE created < util.VN_NOW() - INTERVAL 1 YEAR; + DELETE FROM printQueue WHERE statusCode = 'printed' AND created < v2Months; + DELETE FROM ticketLog WHERE creationDate <= v5Years; -- Equipos duplicados DELETE w.* FROM workerTeam w - JOIN (SELECT id, team, workerFk, COUNT(*) - 1 as duplicated + JOIN ( + SELECT id, team, workerFk, COUNT(*) - 1 duplicated FROM workerTeam GROUP BY team,workerFk HAVING duplicated - ) d ON d.team = w.team AND d.workerFk = w.workerFk AND d.id != w.id; + ) d ON d.team = w.team + AND d.workerFk = w.workerFk + AND d.id <> w.id; DELETE sc FROM saleComponent sc JOIN sale s ON s.id= sc.saleFk JOIN ticket t ON t.id= s.ticketFk - WHERE t.shipped < v18Month; + WHERE t.shipped < v18Months; DELETE c - FROM vn.claim c - JOIN vn.claimState cs ON cs.id = c.claimStateFk - WHERE cs.description = "Anulado" AND - c.created < vDateShort; - DELETE - FROM vn.expeditionTruck - WHERE eta < v3Month; + FROM claim c + JOIN claimState cs ON cs.id = c.claimStateFk + WHERE cs.description = 'Anulado' + AND c.created < v2Months; - DELETE FROM XDiario WHERE FECHA < v3Month OR FECHA IS NULL; - -- borrar travels sin entradas - DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete; - CREATE TEMPORARY TABLE tmp.thermographToDelete + DELETE FROM expeditionTruck WHERE eta < v3Months; + DELETE FROM XDiario WHERE FECHA < v3Months OR FECHA IS NULL; + + -- Borrar travels sin entradas + CREATE OR REPLACE TEMPORARY TABLE tThermographToDelete SELECT th.id,th.dmsFk - FROM vn.travel t - LEFT JOIN vn.entry e ON e.travelFk = t.id - JOIN vn.travelThermograph th ON th.travelFk = t.id - WHERE t.shipped < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND e.travelFk IS NULL; + FROM travel t + LEFT JOIN entry e ON e.travelFk = t.id + JOIN travelThermograph th ON th.travelFk = t.id + WHERE t.shipped < v3Months + AND e.travelFk IS NULL; SELECT dt.id INTO vTrashId - FROM vn.dmsType dt + FROM dmsType dt WHERE dt.code = 'trash'; - UPDATE tmp.thermographToDelete th - JOIN vn.dms d ON d.id = th.dmsFk + UPDATE tThermographToDelete th + JOIN dms d ON d.id = th.dmsFk SET d.dmsTypeFk = vTrashId; DELETE th - FROM tmp.thermographToDelete tmp - JOIN vn.travelThermograph th ON th.id = tmp.id; + FROM tThermographToDelete tmp + JOIN travelThermograph th ON th.id = tmp.id; DELETE t - FROM vn.travel t - LEFT JOIN vn.entry e ON e.travelFk = t.id - WHERE t.shipped < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND e.travelFk IS NULL; + FROM travel t + LEFT JOIN entry e ON e.travelFk = t.id + WHERE t.shipped < v3Months AND e.travelFk IS NULL; UPDATE dms d JOIN dmsType dt ON dt.id = d.dmsTypeFk SET d.dmsTypeFk = vTrashId - WHERE created < TIMESTAMPADD(MONTH, -dt.monthToDelete, util.VN_CURDATE()); + WHERE created < util.VN_CURDATE() - INTERVAL dt.monthToDelete MONTH; -- borrar entradas sin compras - DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete; - CREATE TEMPORARY TABLE tmp.entryToDelete + CREATE OR REPLACE TEMPORARY TABLE tEntryToDelete SELECT e.* - FROM vn.entry e - LEFT JOIN vn.buy b ON b.entryFk = e.id - JOIN vn.entryConfig ec ON e.id != ec.defaultEntry - WHERE e.dated < TIMESTAMPADD(MONTH, -3, util.VN_CURDATE()) AND b.entryFK IS NULL; + FROM entry e + LEFT JOIN buy b ON b.entryFk = e.id + JOIN entryConfig ec ON e.id <> ec.defaultEntry + WHERE e.dated < v3Months + AND b.entryFK IS NULL; DELETE e - FROM vn.entry e - JOIN tmp.entryToDelete tmp ON tmp.id = e.id; + FROM entry e + JOIN tEntryToDelete tmp ON tmp.id = e.id; -- borrar de route registros menores a 4 años - DROP TEMPORARY TABLE IF EXISTS tmp.routeToDelete; - CREATE TEMPORARY TABLE tmp.routeToDelete + CREATE OR REPLACE TEMPORARY TABLE tRouteToDelete SELECT * - FROM vn.route r - WHERE created < TIMESTAMPADD(YEAR,-4,util.VN_CURDATE()); + FROM route r + WHERE created < v4Years; - UPDATE tmp.routeToDelete tmp - JOIN vn.dms d ON d.id = tmp.gestdocFk + UPDATE tRouteToDelete tmp + JOIN dms d ON d.id = tmp.gestdocFk SET d.dmsTypeFk = vTrashId; DELETE r - FROM tmp.routeToDelete tmp - JOIN vn.route r ON r.id = tmp.id; + FROM tRouteToDelete tmp + JOIN route r ON r.id = tmp.id; -- borrar registros de dua y awb menores a 2 años - DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete; - CREATE TEMPORARY TABLE tmp.duaToDelete + CREATE OR REPLACE TEMPORARY TABLE tDuaToDelete SELECT * - FROM vn.dua - WHERE operated < TIMESTAMPADD(YEAR,-2,CURDATE()); + FROM dua + WHERE operated < v2Years; - UPDATE tmp.duaToDelete tm - JOIN vn.dms d ON d.id = tm.gestdocFk + UPDATE tDuaToDelete tm + JOIN dms d ON d.id = tm.gestdocFk SET d.dmsTypeFk = vTrashId; DELETE d - FROM tmp.duaToDelete tmp - JOIN vn.dua d ON d.id = tmp.id; + FROM tDuaToDelete tmp + JOIN dua d ON d.id = tmp.id; DELETE a - FROM vn.awb a - LEFT JOIN vn.travel t ON t.awbFk = a.id + FROM awb a + LEFT JOIN travel t ON t.awbFk = a.id WHERE a.created < v2Years AND t.id IS NULL; -- Borra los registros de collection y ticketcollection - DELETE FROM vn.collection WHERE created < vDateShort; + DELETE FROM collection WHERE created < v2Months; + DELETE FROM travelLog WHERE creationDate < v3Months; - DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete; - DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete; - DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete; + CALL shelving_clean(); - DELETE FROM travelLog WHERE creationDate < v3Month; + DELETE FROM chat WHERE dated < v5Years; + DELETE tt FROM ticketTracking tt + JOIN ticket t ON tt.ticketFk = t.id + WHERE t.shipped <= v2Months; + DELETE FROM mail WHERE creationDate < v2Months; + DELETE FROM split WHERE dated < v18Months; + DELETE FROM remittance WHERE dated < v18Months; + CREATE OR REPLACE TEMPORARY TABLE tTicketDelete - SELECT DISTINCT tl.originFk ticketFk - FROM ticketLog tl - JOIN ( - SELECT MAX(tl.id)ids - FROM ticket t - JOIN ticketLog tl ON tl.originFk = t.id - LEFT JOIN ticketWeekly tw ON tw.ticketFk =t.id - WHERE t.shipped BETWEEN '2000-01-01' AND '2000-12-31' - AND t.isDeleted - AND tw.ticketFk IS NULL - GROUP BY t.id - ) sub ON sub.ids = tl.id - WHERE tl.creationDate <= vDateShort; - + SELECT DISTINCT tl.originFk ticketFk + FROM ticketLog tl + JOIN ( + SELECT MAX(tl.id)ids + FROM ticket t + JOIN ticketLog tl ON tl.originFk = t.id + LEFT JOIN ticketWeekly tw ON tw.ticketFk = t.id + WHERE t.shipped BETWEEN '2000-01-01' AND '2000-12-31' + AND t.isDeleted + AND tw.ticketFk IS NULL + GROUP BY t.id + ) sub ON sub.ids = tl.id + WHERE tl.creationDate <= v2Months; DELETE t FROM ticket t JOIN tTicketDelete tmp ON tmp.ticketFk = t.id; - DROP TEMPORARY TABLE tTicketDelete; + DELETE sl + FROM saleLabel sl + JOIN sale s ON s.id = sl.saleFk + JOIN ticket t ON t.id = s.ticketFk + WHERE t.shipped < v2Months; - CALL shelving_clean; + -- Tickets Nulos PAK 11/10/2016 + SELECT id INTO vCompanyBlk FROM company WHERE code = 'BLK'; + UPDATE ticket + SET companyFk = vCompanyBlk + WHERE clientFk = (SELECT id FROM client WHERE name = 'AUTOCONSUMO') + AND companyFk <> vCompanyBlk; - DELETE FROM chat WHERE dated < v5Years; - - DELETE tt FROM ticketTracking tt JOIN vn.ticket t ON tt.ticketFk = t.id - WHERE t.shipped <= vDateShort; + DROP TEMPORARY TABLE tTicketDelete, + tThermographToDelete, + tEntryToDelete, + tDuaToDelete, + tRouteToDelete; + -- Other schemas + DELETE FROM hedera.`order` WHERE date_send < v18Months; + DELETE FROM pbx.cdr WHERE call_date < v18Months; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/client_getMana.sql b/db/routines/vn/procedures/client_getMana.sql index 99b00c6df..f5bb5747d 100644 --- a/db/routines/vn/procedures/client_getMana.sql +++ b/db/routines/vn/procedures/client_getMana.sql @@ -39,7 +39,8 @@ BEGIN FROM receipt r JOIN `client` c ON c.id = r.clientFk JOIN tmp.client tc ON tc.id = c.id - JOIN bank b ON r.bankFk = b.id AND b.code = 'mana' + JOIN accounting a ON r.bankFk = a.id + AND a.code = 'mana' WHERE r.payed > vFromDated AND r.payed <= util.VN_CURDATE() UNION ALL diff --git a/db/routines/vn/procedures/confection_controlSource.sql b/db/routines/vn/procedures/confection_controlSource.sql new file mode 100644 index 000000000..f011a52e9 --- /dev/null +++ b/db/routines/vn/procedures/confection_controlSource.sql @@ -0,0 +1,103 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`confection_controlSource`( + vDated DATE, + vScopeDays INT, + vMaxAlertLevel INT, + vWarehouseFk INT +) +BEGIN +/** + * Obtiene la información para el control de confección, + * ya sean tickets y/o entradas. + * + * @param vDated Fecha a calcular + * @param vScopeDays Número de días desde hoy en adelante que entran en el cálculo. + * @param vMaxAlertLevel Id nivel de alerta + * @param vWarehouseFk Id de almacén + */ + DECLARE vEndingDate DATETIME DEFAULT util.dayEnd(vDated) + INTERVAL vScopeDays DAY; + + SELECT t.shipped, + t.id ticketFk, + s.id saleFk, + s.quantity, + s.concept, + ABS(s.reserved) isReserved, + i.category, + it.name itemType, + t.nickname, + wh.name warehouse, + t.warehouseFk warehouseFk, + a.provinceFk, + am.agencyFk, + ct.description, + stock.visible, + stock.available + FROM ticket t + JOIN agencyMode am ON am.id = t.agencyModeFk + JOIN warehouse wh ON wh.id = t.warehouseFk + JOIN sale s ON s.ticketFk = t.id + JOIN item i ON i.id = s.itemFk + JOIN itemType it ON it.id = i.typeFk + JOIN confectionType ct ON ct.id = it.making + JOIN `address` a on a.id = t.addressFk + LEFT JOIN ticketState tls on tls.ticketFk = t.id + LEFT JOIN + ( + SELECT item_id, + SUM(visible) visible, + SUM(available) available + FROM ( + SELECT a.item_id, + 0 visible, + a.available + FROM cache.cache_calc cc + LEFT JOIN cache.available a ON a.calc_id = cc.id + WHERE cc.cache_id IN ('visible', 'available') + AND cc.params = CONCAT(vWarehouseFk, "/", util.VN_CURDATE()) + UNION ALL + SELECT v.item_id, + v.visible, + 0 + FROM cache.cache_calc cc + LEFT JOIN cache.visible v ON v.calc_id = cc.id + WHERE cc.cacheName IN ('visible', 'available') + AND cc.params = vWarehouseFk + ) sub + GROUP BY item_id + ) stock ON stock.item_id = s.itemFk + WHERE it.making + AND tls.alertLevel < vMaxAlertLevel + AND wh.hasConfectionTeam + AND t.shipped BETWEEN vDated AND vEndingDate + AND s.quantity > 0 + UNION ALL + SELECT tr.shipped, + e.id, + NULL, + b.quantity, + i.name, + NULL, + i.category, + NULL, + whi.name, + who.name, + NULL, + NULL, + NULL, + ct.description, + NULL, + NULL + FROM buy b + JOIN `entry` e ON e.id = b.entryFk + JOIN travel tr ON tr.id = e.travelFk + JOIN warehouse whi ON whi.id = tr.warehouseInFk + JOIN warehouse who ON who.id = tr.warehouseOutFk + JOIN item i ON i.id = b.itemFk + JOIN itemType it ON it.id = i.typeFk + JOIN confectionType ct ON ct.id = it.making + WHERE who.hasConfectionTeam + AND it.making + AND tr.shipped BETWEEN vDated AND vEndingDate; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/invoiceInTaxMakeByDua.sql b/db/routines/vn/procedures/invoiceInTaxMakeByDua.sql index 2ff478d6b..3453516cc 100644 --- a/db/routines/vn/procedures/invoiceInTaxMakeByDua.sql +++ b/db/routines/vn/procedures/invoiceInTaxMakeByDua.sql @@ -1,8 +1,11 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceInTaxMakeByDua`(vDuaFk INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceInTaxMakeByDua`( + vDuaFk INT +) BEGIN /** - * Borra los valores de duaTax y sus vctos. y los vuelve a crear en base a la tabla duaEntry + * Borra los valores de duaTax y sus vctos. y los vuelve a + * crear en base a la tabla duaEntry. * * @param vDuaFk Id del dua a recalcular */ @@ -26,7 +29,7 @@ BEGIN LEAVE l; END IF; - CALL vn2008.recibidaIvaInsert(vInvoiceInFk); + CALL invoiceInTax_recalc(vInvoiceInFk); CALL invoiceInDueDay_recalc(vInvoiceInFk); END LOOP; diff --git a/db/routines/vn/procedures/invoiceInTax_recalc.sql b/db/routines/vn/procedures/invoiceInTax_recalc.sql new file mode 100644 index 000000000..3b5ce5247 --- /dev/null +++ b/db/routines/vn/procedures/invoiceInTax_recalc.sql @@ -0,0 +1,62 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceInTax_recalc`( + vInvoiceInFk INT +) +BEGIN +/** + * Recalcula y actualiza los impuestos de la factura + * usando la última tasa de cambio y detalles de compra. + * + * @param vInvoiceInFk Id de factura recibida + */ + DECLARE vRate DOUBLE DEFAULT 1; + DECLARE vDated DATE; + DECLARE vExpenseFk INT; + + SELECT MAX(rr.dated) INTO vDated + FROM referenceRate rr + JOIN invoiceIn ii ON ii.id = vInvoiceInFk + WHERE rr.dated <= ii.issued + AND rr.currencyFk = ii.currencyFk; + + IF vDated THEN + SELECT `value` INTO vRate + FROM referenceRate + WHERE dated = vDated; + END IF; + + DELETE FROM invoiceInTax WHERE invoiceInFk = vInvoiceInFk; + + SELECT id INTO vExpenseFk + FROM expense + WHERE code = 'extraCommGoodsAcquisition'; + + IF vExpenseFk IS NULL THEN + CALL util.throw('Expense extraCommGoodsAcquisition not exists'); + END IF; + + INSERT INTO invoiceInTax( + invoiceInFk, + taxableBase, + expenseFk, + foreignValue, + taxTypeSageFk, + transactionTypeSageFk + ) + SELECT ii.id, + SUM(b.buyingValue * b.quantity) / vRate bi, + vExpenseFk, + IF(c.code = 'EUR', NULL, SUM(b.buyingValue * b.quantity)), + s.taxTypeSageFk, + s.transactionTypeSageFk + FROM invoiceIn ii + JOIN currency c ON c.id = ii.currencyFk + JOIN `entry` e ON e.invoiceInFk = ii.id + JOIN supplier s ON s.id = e.supplierFk + JOIN buy b ON b.entryFk = e.id + LEFT JOIN referenceRate rr ON rr.currencyFk = ii.currencyFk + AND rr.dated = ii.issued + WHERE ii.id = vInvoiceInFk + HAVING bi IS NOT NULL; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/itemProposal.sql b/db/routines/vn/procedures/itemProposal.sql deleted file mode 100644 index 0dc04124d..000000000 --- a/db/routines/vn/procedures/itemProposal.sql +++ /dev/null @@ -1,104 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemProposal`( - vSelf INT, - vTicketFk INT, - vShowType BOOL -) -BEGIN -/** -* Propone articulos disponibles ordenados, con la cantidad -* de veces usado y segun sus caracteristicas. -* -* @param vSelf Id de artículo -* @param vTicketFk Id de ticket -* @param vShowType Mostrar tipos -*/ - DECLARE vWarehouseFk INT; - DECLARE vShipped DATE; - DECLARE vCalcFk INT; - DECLARE vTypeFk INT; - DECLARE vPriority INT DEFAULT 1; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - SELECT warehouseFk, shipped - INTO vWarehouseFk, vShipped - FROM ticket - WHERE id = vTicketFk; - - START TRANSACTION; - - CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vShipped); - - WITH itemTags AS ( - SELECT i.id, - typeFk, - tag5, - value5, - tag6, - value6, - tag7, - value7, - tag8, - value8, - t.name, - it.value - FROM vn.item i - LEFT JOIN vn.itemTag it ON it.itemFk = i.id - AND it.priority = vPriority - LEFT JOIN vn.tag t ON t.id = it.tagFk - WHERE i.id = vSelf - ) - SELECT i.id itemFk, - i.longName, - i.subName, - i.tag5, - i.value5, - (i.value5 <=> its.value5) match5, - i.tag6, - i.value6, - (i.value6 <=> its.value6) match6, - i.tag7, - i.value7, - (i.value7 <=> its.value7) match7, - i.tag8, - i.value8, - (i.value8 <=> its.value8) match8, - a.available, - IFNULL(ip.counter, 0) `counter`, - IF(b.groupingMode = 1, b.grouping, b.packing) minQuantity, - iss.visible located - FROM vn.item i - JOIN cache.available a ON a.item_id = i.id - AND a.calc_id = vCalcFk - LEFT JOIN vn.itemProposal ip ON ip.mateFk = i.id - AND ip.itemFk = vSelf - LEFT JOIN vn.itemTag it ON it.itemFk = i.id - AND it.priority = vPriority - LEFT JOIN vn.tag t ON t.id = it.tagFk - LEFT JOIN cache.last_buy lb ON lb.item_id = i.id - AND lb.warehouse_id = vWarehouseFk - LEFT JOIN vn.buy b ON b.id = lb.buy_id - LEFT JOIN vn.itemShelvingStock iss ON iss.itemFk = i.id - AND iss.warehouseFk = vWarehouseFk - JOIN itemTags its - WHERE a.available > 0 - AND IF(vShowType, i.typeFk = its.typeFk, TRUE) - AND i.id <> vSelf - ORDER BY `counter` DESC, - (t.name = its.name) DESC, - (it.value = its.value) DESC, - (i.tag5 = its.tag5) DESC, - match5 DESC, - (i.tag6 = its.tag6) DESC, - match6 DESC, - (i.tag7 = its.tag7) DESC, - match7 DESC, - (i.tag8 = its.tag8) DESC, - match8 DESC; - COMMIT; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/itemProposal_beta.sql b/db/routines/vn/procedures/itemProposal_beta.sql deleted file mode 100644 index 4a6f761a9..000000000 --- a/db/routines/vn/procedures/itemProposal_beta.sql +++ /dev/null @@ -1,76 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemProposal_beta`(vItemFk INT, vTicketFk INT) -BEGIN - - DECLARE vWarehouseFk INT; - DECLARE vShipped DATE; - DECLARE vCalcFk INT; - DECLARE vTypeFk INT; - DECLARE vResultsMax INT DEFAULT 10; - - DECLARE vTag1 VARCHAR(25); - DECLARE vTag5 VARCHAR(25); - DECLARE vTag6 VARCHAR(25); - DECLARE vTag7 VARCHAR(25); - DECLARE vTag8 VARCHAR(25); - - DECLARE vValue1 VARCHAR(50); - DECLARE vValue5 VARCHAR(50); - DECLARE vValue6 VARCHAR(50); - DECLARE vValue7 VARCHAR(50); - DECLARE vValue8 VARCHAR(50); - - SELECT warehouseFk, shipped INTO vWarehouseFk, vShipped - FROM vn.ticket - WHERE id = vTicketFk; - - SELECT typeFk, tag5, value5, tag6, value6, tag7, value7, tag8, value8, t1.name, it1.value - INTO vTypeFk, vTag5, vValue5, vTag6, vValue6, vTag7, vValue7, vTag8, vValue8, vTag1, vValue1 - FROM vn.item i - LEFT JOIN vn.itemTag it1 ON it1.itemFk = i.id AND it1.priority = 1 - LEFT JOIN vn.tag t1 ON t1.id = it1.tagFk - WHERE i.id = vItemFk; - - CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vShipped); - - SELECT i.id itemFk, - i.longName, - i.subName, - i.tag5, - i.value5, - (i.value5 <=> vValue5 COLLATE utf8_general_ci) match5, - i.tag6, - i.value6, - (i.value6 <=> vValue6 COLLATE utf8_general_ci) match6, - i.tag7, - i.value7, - (i.value7 <=> vValue7 COLLATE utf8_general_ci) match7, - i.tag8, - i.value8, - (i.value8 <=> vValue8 COLLATE utf8_general_ci) match8, - a.available, - IFNULL(ip.counter,0) counter - FROM vn.item i - JOIN cache.available a ON a.item_id = i.id - LEFT JOIN vn.itemProposal ip ON ip.mateFk = i.id AND ip.itemFk = vItemFk - LEFT JOIN vn.itemTag it1 ON it1.itemFk = i.id AND it1.priority = 1 - LEFT JOIN vn.tag t1 ON t1.id = it1.tagFk - WHERE a.calc_id = vCalcFk - AND available > 0 - AND i.typeFk = vTypeFk - AND i.id != vItemFk - ORDER BY counter DESC, - (t1.name = vTag1 COLLATE utf8_general_ci) DESC, - (it1.value = vValue1 COLLATE utf8_general_ci) DESC, - (i.tag5 = vTag5 COLLATE utf8_general_ci) DESC, - (i.value5 = vValue5 COLLATE utf8_general_ci) DESC, - (i.tag6 = vTag6 COLLATE utf8_general_ci) DESC, - (i.value6 = vValue6 COLLATE utf8_general_ci) DESC, - (i.tag7 = vTag7 COLLATE utf8_general_ci) DESC, - (i.value7 = vValue7 COLLATE utf8_general_ci) DESC, - (i.tag8 = vTag8 COLLATE utf8_general_ci) DESC, - (i.value8 = vValue8 COLLATE utf8_general_ci) DESC - LIMIT vResultsMax; - -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/itemShelving_inventory.sql b/db/routines/vn/procedures/itemShelving_inventory.sql index ce2934426..73e438fbb 100644 --- a/db/routines/vn/procedures/itemShelving_inventory.sql +++ b/db/routines/vn/procedures/itemShelving_inventory.sql @@ -30,10 +30,11 @@ BEGIN ish.visible, p.sectorFk, it.workerFk buyer, - CONCAT('http:',ic.url, '/catalog/1600x900/',i.image) urlImage, + ic.url, + i.image, ish.isChecked, CASE - WHEN s.notPrepared > sm.parked THEN 0 + WHEN IFNULL (s.notPrepared, 0) > sm.parked THEN 0 WHEN sm.visible > sm.parked THEN 1 ELSE 2 END priority @@ -43,7 +44,7 @@ BEGIN JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk JOIN shelving sh ON sh.code = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk - JOIN ( + LEFT JOIN ( SELECT s.itemFk, sum(s.quantity) notPrepared FROM sale s JOIN ticket t ON t.id = s.ticketFk diff --git a/db/routines/vn/procedures/item_getSimilar.sql b/db/routines/vn/procedures/item_getSimilar.sql index 7cc9ad63e..0ddfe21b5 100644 --- a/db/routines/vn/procedures/item_getSimilar.sql +++ b/db/routines/vn/procedures/item_getSimilar.sql @@ -1,84 +1,92 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getSimilar`(vItemFk INT, vWarehouseFk INT, vDate DATE, vIsShowedByType BOOL) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getSimilar`( + vSelf INT, + vWarehouseFk INT, + vDated DATE, + vShowType BOOL +) BEGIN - /** - * Propone articulos similares para posible cambio, - * ordenado con la cantidad de veces usado y segun sus caracteristicas - * - * @param vItemFk item id - * @param vWarehouseFk warehouse id - * @param vDate fecha para revisar disponible - * @param vIsShowedByType para mostrar solo artículos de ese tipo - */ +* Propone articulos disponibles ordenados, con la cantidad +* de veces usado y segun sus caracteristicas. +* +* @param vSelf Id de artículo +* @param vWarehouseFk Id de almacen +* @param vDated Fecha +* @param vShowType Mostrar tipos +*/ + DECLARE vCalcFk INT; + DECLARE vTypeFk INT; + DECLARE vPriority INT DEFAULT 1; - DECLARE vCalcFk INT; - DECLARE vTypeFk INT; - - DECLARE vTag1 VARCHAR(25) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vTag5 VARCHAR(25) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vTag6 VARCHAR(25) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vTag7 VARCHAR(25) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vTag8 VARCHAR(25) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - - DECLARE vValue1 VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vValue5 VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vValue6 VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vValue7 VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; - DECLARE vValue8 VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'; + CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vDated); - - SELECT typeFk, tag5, value5, tag6, value6, tag7, value7, tag8, value8, t1.name, it1.value - INTO vTypeFk, vTag5, vValue5, vTag6, vValue6, vTag7, vValue7, vTag8, vValue8, vTag1, vValue1 - FROM vn.item i - LEFT JOIN vn.itemTag it1 ON it1.itemFk = i.id AND it1.priority = 1 - LEFT JOIN vn.tag t1 ON t1.id = it1.tagFk - WHERE i.id = vItemFk; - - CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vDate); - - SELECT i.id itemFk, - i.longName, - i.subName, - i.tag5, - i.value5, - (i.value5 <=> vValue5) match5, - i.tag6, - i.value6, - (i.value6 <=> vValue6) match6, - i.tag7, - i.value7, - (i.value7 <=> vValue7) match7, - i.tag8, - i.value8, - (i.value8 <=> vValue8) match8, - a.available, - IFNULL(ip.counter,0) counter, - IF(b.groupingMode = 1, b.grouping, b.packing) as minQuantity - FROM vn.item i - JOIN cache.available a ON a.item_id = i.id - LEFT JOIN vn.itemProposal ip ON ip.mateFk = i.id AND ip.itemFk = vItemFk - LEFT JOIN vn.itemTag it1 ON it1.itemFk = i.id AND it1.priority = 1 - LEFT JOIN vn.tag t1 ON t1.id = it1.tagFk - LEFT JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = vWarehouseFk + + WITH itemTags AS ( + SELECT i.id, + typeFk, + tag5, + value5, + tag6, + value6, + tag7, + value7, + tag8, + value8, + t.name, + it.value + FROM vn.item i + LEFT JOIN vn.itemTag it ON it.itemFk = i.id + AND it.priority = vPriority + LEFT JOIN vn.tag t ON t.id = it.tagFk + WHERE i.id = vSelf + ) + SELECT i.id itemFk, + i.longName, + i.subName, + i.tag5, + i.value5, + (i.value5 <=> its.value5) match5, + i.tag6, + i.value6, + (i.value6 <=> its.value6) match6, + i.tag7, + i.value7, + (i.value7 <=> its.value7) match7, + i.tag8, + i.value8, + (i.value8 <=> its.value8) match8, + a.available, + IFNULL(ip.counter, 0) `counter`, + IF(b.groupingMode = 1, b.grouping, b.packing) minQuantity, + iss.visible located + FROM vn.item i + JOIN cache.available a ON a.item_id = i.id + AND a.calc_id = vCalcFk + LEFT JOIN vn.itemProposal ip ON ip.mateFk = i.id + AND ip.itemFk = vSelf + LEFT JOIN vn.itemTag it ON it.itemFk = i.id + AND it.priority = vPriority + LEFT JOIN vn.tag t ON t.id = it.tagFk + LEFT JOIN cache.last_buy lb ON lb.item_id = i.id + AND lb.warehouse_id = vWarehouseFk LEFT JOIN vn.buy b ON b.id = lb.buy_id - WHERE a.calc_id = vCalcFk - AND available > 0 - AND IF(vIsShowedByType, i.typeFk = vTypeFk, TRUE) - AND i.id != vItemFk - ORDER BY counter DESC, - (t1.name = vTag1) DESC, - (it1.value = vValue1) DESC, - (i.tag6 = vTag6) DESC, - (i.value6 = vValue6) DESC, - (i.tag5 = vTag5) DESC, - (i.value5 = vValue5) DESC, - (i.tag7 = vTag7) DESC, - (i.value7 = vValue7) DESC, - (i.tag8 = vTag8) DESC, - (i.value8 = vValue8) DESC - LIMIT 30; - - + LEFT JOIN vn.itemShelvingStock iss ON iss.itemFk = i.id + AND iss.warehouseFk = vWarehouseFk + JOIN itemTags its + WHERE a.available > 0 + AND IF(vShowType, i.typeFk = its.typeFk, TRUE) + AND i.id <> vSelf + ORDER BY `counter` DESC, + (t.name = its.name) DESC, + (it.value = its.value) DESC, + (i.tag5 = its.tag5) DESC, + match5 DESC, + (i.tag6 = its.tag6) DESC, + match6 DESC, + (i.tag7 = its.tag7) DESC, + match7 DESC, + (i.tag8 = its.tag8) DESC, + match8 DESC; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/payment_add.sql b/db/routines/vn/procedures/payment_add.sql new file mode 100644 index 000000000..061a75848 --- /dev/null +++ b/db/routines/vn/procedures/payment_add.sql @@ -0,0 +1,84 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`payment_add`( + vDated DATE, + vSupplierFk INT, + vAmount DOUBLE, + vCurrencyFk INT, + vForeignValue DOUBLE, + vBankFk INT, + vPayMethodFk INT, + vExpenseFk DOUBLE, + vConcept VARCHAR(40), + vCompanyFk INT) +BEGIN +/** + * Registra un pago realizado a un proveedor y + * su correspondiente registro en caja. + * + * @param vDated Fecha del pago + * @param vSupplierFk Id del proveedor + * @param vAmount Cantidad a pagar + * @param vCurrencyFk Id de la moneda + * @param vForeignValue Tipo de cambio utilizado + * @param vBankFk Id del banco + * @param vPayMethodFk Id del método de pago + * @param vExpenseFk Id de gasto + * @param vConcept Concepto del pago + * @param vCompanyFk Id de la empresa + * @return paymentFk Id de pago insertado + */ + INSERT INTO till( + concept, + serie, + `number`, + `out`, + dated, + isAccountable, + bankFk, + workerFk, + companyFk, + isConciliate + ) + SELECT CONCAT('n/pago a ', `name`), + 'R', + vSupplierFk, + vAmount, + vDated, + 1, + vBankFk, + account.myUser_getId(), + vCompanyFk, + 1 + FROM supplier + WHERE id = vSupplierFk; + + INSERT INTO payment( + received, + dueDated, + supplierFk, + amount, + currencyFk, + divisa, + bankFk, + payMethodFk, + bankingFees, + concept, + companyFk + ) + VALUES( + vDated, + vDated, + vSupplierFk, + vAmount, + vCurrencyFk, + IF(NOT vForeignValue, NULL, vForeignValue), + vBankFk, + vPayMethodFk, + vExpenseFk, + vConcept, + vCompanyFk + ); + + SELECT LAST_INSERT_ID() paymentFk; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/remittance_calc.sql b/db/routines/vn/procedures/remittance_calc.sql new file mode 100644 index 000000000..ed0a18662 --- /dev/null +++ b/db/routines/vn/procedures/remittance_calc.sql @@ -0,0 +1,70 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`remittance_calc`( + vDated DATE +) +BEGIN +/** +* Calcula los datos de remesa, incluyendo el importe, +* el vencimiento, y otros datos relevantes. +* +* @param vDated Fecha a calcular +* @return tmp.remittance +*/ + CREATE OR REPLACE TEMPORARY TABLE tmp.remittance + SELECT CONCAT(s.nif, REPEAT('0', 12 - LENGTH(s.nif))) cif, + c.id clientFk, + c.name client, + c.fi, + sub.paymentDate, + 0 invoiceAmount, + CAST(sub.receipt AS DECIMAL(10,2)) receiptAmount, + 0 currentAmount, + sub.companyFk, + c.socialName, + CAST(sub.receipt AS DECIMAL(10,2)) totalAmount, + CAST(sub.receipt AS DECIMAL(10,2)) balance, + s.name company, + co.code companyCode, + c.accountingAccount, + c.iban, + c.hasSepaVnl, + c.hasCoreVnl, + c.hasLcr, + be.bic, + be.`name` entityName + FROM client c + JOIN ( + SELECT risk.companyFk, + c.id, + SUM(risk.amount) receipt, + IF((c.dueDay + graceDays) MOD 30.001 <= DAY(vDated), + LAST_DAY(vDated - INTERVAL 1 MONTH) + INTERVAL (c.dueDay + graceDays) MOD 30.001 DAY, + LAST_DAY(vDated - INTERVAL 2 MONTH) + INTERVAL (c.dueDay + graceDays) MOD 30.001 DAY + ) paymentDate + FROM client c + JOIN payMethod pm ON pm.id = c.payMethodFk + JOIN ( + SELECT cr.companyFk, cr.clientFk, cr.amount + FROM client c + JOIN clientRisk cr ON cr.clientFk = c.id + JOIN payMethod pm ON pm.id = c.payMethodFk + WHERE pm.code = 'bankDraft' + UNION ALL + SELECT io.companyFk, io.clientFk, - io.amount + FROM invoiceOut io + JOIN client c ON c.id = io.clientFk + JOIN payMethod pm ON pm.id = c.payMethodFk + WHERE io.dued > vDated + AND pm.code = 'bankDraft' + AND pm.outstandingDebt + AND io.amount > 0 + + ) risk ON risk.clientFk = c.id + GROUP BY risk.companyFk, c.id + HAVING receipt > 10 + ) sub ON sub.id = c.id + JOIN supplier s ON s.id = sub.companyFk + JOIN company co ON co.id = sub.companyFk + LEFT JOIN bankEntity be ON be.id = c.bankEntityFk; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/sale_checkNoComponents.sql b/db/routines/vn/procedures/sale_checkNoComponents.sql deleted file mode 100644 index 79abbbf92..000000000 --- a/db/routines/vn/procedures/sale_checkNoComponents.sql +++ /dev/null @@ -1,70 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_checkNoComponents`(vCreatedFrom DATETIME, vCreatedTo DATETIME) -BEGIN -/** - * Comprueba que las ventas creadas entre un rango de fechas tienen componentes - * - * @param vCreatedFrom inicio del rango - * @param vCreatedTo fin del rango - */ - DECLARE v_done BOOL DEFAULT FALSE; - DECLARE vSaleFk INTEGER; - DECLARE vTicketFk INTEGER; - DECLARE vConcept VARCHAR(50); - DECLARE vCur CURSOR FOR - SELECT s.id - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - JOIN item i ON i.id = s.itemFk - JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk - LEFT JOIN tmp.coste c ON c.id = s.id - WHERE s.created >= vCreatedFrom AND s.created <= vCreatedTo - AND c.id IS NULL - AND t.agencyModeFk IS NOT NULL - AND t.isDeleted IS FALSE - AND t.warehouseFk = 60 - AND ic.merchandise != FALSE - GROUP BY s.id; - - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET v_done = TRUE; - - DROP TEMPORARY TABLE IF EXISTS tmp.coste; - - DROP TEMPORARY TABLE IF EXISTS tmp.coste; - CREATE TEMPORARY TABLE tmp.coste - (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT s.id - FROM sale s - JOIN item i ON i.id = s.itemFk - JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk - JOIN saleComponent sc ON sc.saleFk = s.id - JOIN component c ON c.id = sc.componentFk - JOIN componentType ct ON ct.id = c.typeFk AND ct.id = 6 - WHERE s.created >= vCreatedFrom - AND ic.merchandise != FALSE; - - OPEN vCur; - - l: LOOP - SET v_done = FALSE; - FETCH vCur INTO vSaleFk; - - IF v_done THEN - LEAVE l; - END IF; - - SELECT ticketFk, concept - INTO vTicketFk, vConcept - FROM sale - WHERE id = vSaleFk; - - CALL sale_calculateComponent(vSaleFk, 'renewPrices'); - END LOOP; - - CLOSE vCur; - DROP TEMPORARY TABLE tmp.coste; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/sale_getBoxPickingList.sql b/db/routines/vn/procedures/sale_getBoxPickingList.sql index 0af23e945..ff0e85259 100644 --- a/db/routines/vn/procedures/sale_getBoxPickingList.sql +++ b/db/routines/vn/procedures/sale_getBoxPickingList.sql @@ -27,7 +27,7 @@ BEGIN s.quantity, MAKETIME(pb.HH,pb.mm,0) etd, pb.routeFk, - FLOOR(s.quantity / ish.packing) stickers, + FLOOR(s.quantity / IF(i.isBoxPickingMode, ish.packing, i.packingOut)) stickers, IF(i.isBoxPickingMode, ish.packing, i.packingOut) packing, b.packagingFk FROM sale s @@ -71,5 +71,3 @@ BEGIN DROP TEMPORARY TABLE tmp.sale; END$$ DELIMITER ; - -CALL `vn`.`sale_getBoxPickingList`(1, curdate()); \ No newline at end of file diff --git a/db/routines/vn/procedures/sale_getFromTicketOrCollection.sql b/db/routines/vn/procedures/sale_getFromTicketOrCollection.sql index e0cff202f..5308bdd28 100644 --- a/db/routines/vn/procedures/sale_getFromTicketOrCollection.sql +++ b/db/routines/vn/procedures/sale_getFromTicketOrCollection.sql @@ -79,7 +79,10 @@ DECLARE vIsCollection BOOL; IF(SUM(iss.quantity) IS NULL, 0, SUM(iss.quantity)) pickedQuantity, MIN(iss.created) picked, IF(sm.id, TRUE, FALSE) hasMistake, - sg.sectorFk + sg.sectorFk, + b.packing, + b.grouping, + o.code FROM tmp.ticket t JOIN sale s ON s.ticketFk = t.id JOIN ticket tt ON tt.id = t.id diff --git a/db/routines/vn/procedures/supplier_statement.sql b/db/routines/vn/procedures/supplier_statement.sql index 406286e9d..a03a7770c 100644 --- a/db/routines/vn/procedures/supplier_statement.sql +++ b/db/routines/vn/procedures/supplier_statement.sql @@ -94,7 +94,7 @@ BEGIN 'payment' FROM payment p LEFT JOIN currency c ON c.id = p.currencyFk - LEFT JOIN bank b ON b.id = p.bankFk + LEFT JOIN accounting a ON a.id = p.bankFk LEFT JOIN payMethod pm ON pm.id = p.payMethodFk LEFT JOIN promissoryNote pn ON pn.paymentFk = p.id WHERE p.received > '2014-12-31' diff --git a/db/routines/vn/procedures/ticket_closeByTicket.sql b/db/routines/vn/procedures/ticket_closeByTicket.sql index 6e32a3e76..837b809a2 100644 --- a/db/routines/vn/procedures/ticket_closeByTicket.sql +++ b/db/routines/vn/procedures/ticket_closeByTicket.sql @@ -18,7 +18,8 @@ BEGIN WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code != 'delivered')) AND t.id = vTicketFk AND t.refFk IS NULL - GROUP BY t.id); + GROUP BY t.id + ); CALL ticket_close(); diff --git a/db/routines/vn/triggers/parking_afterDelete.sql b/db/routines/vn/triggers/parking_afterDelete.sql new file mode 100644 index 000000000..1ec96c24d --- /dev/null +++ b/db/routines/vn/triggers/parking_afterDelete.sql @@ -0,0 +1,12 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`parking_afterDelete` + AFTER DELETE ON `parking` + FOR EACH ROW +BEGIN + INSERT INTO parkingLog + SET `action` = 'delete', + `changedModel` = 'Parking', + `changedModelId` = OLD.id, + `userFk` = account.myUser_getId(); +END$$ +DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/triggers/parking_beforeInsert.sql b/db/routines/vn/triggers/parking_beforeInsert.sql index 9cf0bd42a..cdec4c759 100644 --- a/db/routines/vn/triggers/parking_beforeInsert.sql +++ b/db/routines/vn/triggers/parking_beforeInsert.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`parking_beforeInsert` BEFORE INSERT ON `parking` FOR EACH ROW BEGIN - + SET NEW.editorFk = account.myUser_getId(); -- SET new.`code` = CONCAT(new.`column`,' - ',new.`row`) ; END$$ diff --git a/db/routines/vn/triggers/parking_beforeUpdate.sql b/db/routines/vn/triggers/parking_beforeUpdate.sql index 38238daa1..3e808f505 100644 --- a/db/routines/vn/triggers/parking_beforeUpdate.sql +++ b/db/routines/vn/triggers/parking_beforeUpdate.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`parking_beforeUpdate` BEFORE UPDATE ON `parking` FOR EACH ROW BEGIN - + SET NEW.editorFk = account.myUser_getId(); -- SET new.`code` = CONCAT(new.`column`,' - ',new.`row`) ; END$$ diff --git a/db/routines/vn/triggers/payment_beforeInsert.sql b/db/routines/vn/triggers/payment_beforeInsert.sql index 6a28a1382..1b343712f 100644 --- a/db/routines/vn/triggers/payment_beforeInsert.sql +++ b/db/routines/vn/triggers/payment_beforeInsert.sql @@ -10,21 +10,21 @@ BEGIN -- PAK 10/02/15 No se asientan los pagos directamente, salvo en el caso de las cajas de CASH SELECT (at2.code = 'cash') INTO bolCASH - FROM vn.bank b - JOIN vn.accountingType at2 ON at2.id = b.cash - WHERE b.id = NEW.bankFk; + FROM accounting a + JOIN accountingType at2 ON at2.id = a.accountingTypeFk + WHERE a.id = NEW.bankFk; IF bolCASH THEN SELECT account INTO cuenta_banco - FROM bank + FROM accounting WHERE id = NEW.bankFk; SELECT account INTO cuenta_proveedor FROM supplier WHERE id = NEW.supplierFk; - CALL vn.ledger_next(vNewBookEntry); + CALL ledger_next(vNewBookEntry); INSERT INTO XDiario ( ASIEN, FECHA, diff --git a/db/routines/vn/views/bank.sql b/db/routines/vn/views/bank.sql deleted file mode 100644 index fa0d9a4f0..000000000 --- a/db/routines/vn/views/bank.sql +++ /dev/null @@ -1,12 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn`.`bank` -AS SELECT `a`.`id` AS `id`, - `a`.`bank` AS `bank`, - `a`.`account` AS `account`, - `a`.`accountingTypeFk` AS `cash`, - `a`.`entityFk` AS `entityFk`, - `a`.`isActive` AS `isActive`, - `a`.`currencyFk` AS `currencyFk`, - `a`.`code` AS `code` -FROM `vn`.`accounting` `a` diff --git a/db/routines/vn/views/exchangeInsuranceOut.sql b/db/routines/vn/views/exchangeInsuranceOut.sql index f93b65331..5c41dbb24 100644 --- a/db/routines/vn/views/exchangeInsuranceOut.sql +++ b/db/routines/vn/views/exchangeInsuranceOut.sql @@ -7,9 +7,9 @@ AS SELECT `p`.`received` AS `received`, FROM ( ( `vn`.`payment` `p` - JOIN `vn`.`bank` `b` ON(`b`.`id` = `p`.`bankFk`) + JOIN `vn`.`accounting` `a` ON(`a`.`id` = `p`.`bankFk`) ) - JOIN `vn`.`accountingType` `at2` ON(`at2`.`id` = `b`.`cash`) + JOIN `vn`.`accountingType` `at2` ON(`at2`.`id` = `a`.`accountingTypeFk`) ) WHERE `p`.`currencyFk` = 2 AND `at2`.`code` = 'wireTransfer' diff --git a/db/routines/vn2008/procedures/CalculoRemesas.sql b/db/routines/vn2008/procedures/CalculoRemesas.sql deleted file mode 100644 index a4c191a80..000000000 --- a/db/routines/vn2008/procedures/CalculoRemesas.sql +++ /dev/null @@ -1,66 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`CalculoRemesas`(IN vFechaRemesa DATE) -BEGIN - - DROP TEMPORARY TABLE IF EXISTS TMP_REMESAS; - CREATE TEMPORARY TABLE TMP_REMESAS - SELECT - CONCAT(p.NIF,REPEAT('0', 12-LENGTH(p.NIF))) as CIF1, - cli.Id_Cliente, - cli.Cliente, - cli.`IF` as NIF, - c.PaymentDate as Vencimiento, - 0 ImporteFac, - cast(c.Recibo as decimal(10,2)) as ImporteRec, - 0 as ImporteActual, - c.companyFk empresa_id, - cli.RazonSocial, - cast(c.Recibo as decimal(10,2)) as ImporteTotal, - cast(c.Recibo as decimal(10,2)) as Saldo, - p.Proveedor as Empresa, - e.abbreviation as EMP, - cli.cuenta, - iban AS Iban, - CONVERT(SUBSTRING(iban,5,4),UNSIGNED INT) AS nrbe, - sepavnl as SEPA, - corevnl as RecibidoCORE, - hasLcr, - be.bic, - be.`name` entityName - FROM Clientes cli - JOIN - (SELECT risk.companyFk, - c.Id_Cliente, - sum(risk.amount) as Recibo, - IF((c.Vencimiento + graceDays) mod 30.001 <= day(vFechaRemesa) - ,TIMESTAMPADD(DAY, (c.Vencimiento + graceDays) MOD 30.001, LAST_DAY(TIMESTAMPADD(MONTH,-1,vFechaRemesa))) - ,TIMESTAMPADD(DAY, (c.Vencimiento + graceDays) MOD 30.001, LAST_DAY(TIMESTAMPADD(MONTH,-2,vFechaRemesa))) - ) as PaymentDate - FROM Clientes c - JOIN pay_met pm on pm.id = pay_met_id - JOIN - ( - SELECT companyFk, clientFk, amount - FROM Clientes c - JOIN vn.clientRisk cr ON cr.clientFk = c.Id_Cliente - WHERE pay_met_id = 4 - - UNION ALL - - SELECT io.companyFk, io.clientFk Id_Cliente, - io.amount - FROM vn.invoiceOut io - JOIN Clientes c ON c.Id_Cliente = io.clientFk - JOIN pay_met pm on pm.id = pay_met_id - WHERE io.dued > vFechaRemesa - AND pay_met_id = 4 AND pm.deudaviva - AND io.amount > 0 - - ) risk ON c.Id_Cliente = risk.clientFk - GROUP BY risk.companyFk, Id_Cliente - HAVING Recibo > 10 - ) c on c.Id_Cliente = cli.Id_Cliente - JOIN Proveedores p on p.Id_Proveedor = c.companyFk - JOIN empresa e on e.id = c.companyFk - LEFT JOIN vn.bankEntity be ON be.id = cli.bankEntityFk; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/ListaTicketsEncajados.sql b/db/routines/vn2008/procedures/ListaTicketsEncajados.sql deleted file mode 100644 index ce99916ee..000000000 --- a/db/routines/vn2008/procedures/ListaTicketsEncajados.sql +++ /dev/null @@ -1,25 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`ListaTicketsEncajados`(IN intId_Trabajador int) -BEGIN - -SELECT Agencia, - Consignatario, - ti.Id_Ticket, - ts.userFk Id_Trabajador, - IFNULL(ncajas,0) AS ncajas, - IFNULL(nbultos,0) AS nbultos, - IFNULL(notros,0) AS notros, - ts.code AS Estado - FROM Tickets ti - INNER JOIN Consignatarios ON ti.Id_Consigna = Consignatarios.Id_consigna - INNER JOIN Agencias ON ti.Id_Agencia = Agencias.Id_Agencia - LEFT JOIN (SELECT ticketFk,count(*) AS ncajas FROM vn.expedition WHERE packagingFk=94 GROUP BY ticketFk) sub1 ON ti.Id_Ticket=sub1.ticketFk - LEFT JOIN (SELECT ticketFk,count(*) AS nbultos FROM vn.expedition WHERE packagingFk IS NULL GROUP BY ticketFk) sub2 ON ti.Id_Ticket=sub2.ticketFk - LEFT JOIN (SELECT ticketFk,count(*) AS notros FROM vn.expedition WHERE packagingFk >0 GROUP BY ticketFk) sub3 ON ti.Id_Ticket=sub3.ticketFk - INNER JOIN vn.ticketState ts ON ti.Id_ticket = ts.ticketFk - WHERE ti.Fecha=util.VN_CURDATE() AND - ts.userFk=intId_Trabajador - GROUP BY ti.Id_Ticket; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/cacheReset.sql b/db/routines/vn2008/procedures/cacheReset.sql deleted file mode 100644 index f36169fda..000000000 --- a/db/routines/vn2008/procedures/cacheReset.sql +++ /dev/null @@ -1,11 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`cacheReset`(vCacheName VARCHAR(10), vParams VARCHAR(15)) -BEGIN - - UPDATE cache.cache_calc - SET expires = util.VN_NOW() - WHERE cacheName = vCacheName collate utf8_unicode_ci - AND params = vParams collate utf8_unicode_ci; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/camiones.sql b/db/routines/vn2008/procedures/camiones.sql deleted file mode 100644 index 4c37cf9da..000000000 --- a/db/routines/vn2008/procedures/camiones.sql +++ /dev/null @@ -1,23 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`camiones`(vWarehouse INT, vDate DATE) -BEGIN - SELECT Temperatura - ,ROUND(SUM(Etiquetas * volume)) AS cm3 - ,ROUND(SUM(IF(scanned, Etiquetas, 0) * volume)) AS cm3s - ,ROUND(SUM(Vida * volume)) AS cm3e - FROM ( - SELECT t.Temperatura, c.Etiquetas, b.scanned, c.Vida, - IF(cu.Volumen > 0, cu.Volumen, cu.x * cu.y * IF(cu.z > 0, cu.z, a.Medida + 10)) volume - FROM Compres c - LEFT JOIN buy_edi b ON b.id = c.buy_edi_id - JOIN Articles a ON a.Id_Article = c.Id_Article - JOIN Tipos t ON t.tipo_id = a.tipo_id - JOIN Entradas e ON e.Id_Entrada = c.Id_Entrada - JOIN travel tr ON tr.id = e.travel_id - JOIN Cubos cu ON cu.Id_Cubo = c.Id_Cubo - WHERE tr.warehouse_id = vWarehouse - AND tr.landing = vDate - ) sub - GROUP BY Temperatura; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/clean.sql b/db/routines/vn2008/procedures/clean.sql deleted file mode 100644 index 5a62b133e..000000000 --- a/db/routines/vn2008/procedures/clean.sql +++ /dev/null @@ -1,74 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`clean`(IN `v_full` TINYINT(1)) -proc: BEGIN - DECLARE vDate DATETIME; - DECLARE vDate18 DATETIME; - DECLARE vDate26 DATETIME; - DECLARE vDate8 DATE; - DECLARE vDate6 DATE; - DECLARE vDate3 DATE; - DECLARE vDate2000 DATE; - DECLARE vRangeDeleteTicket INT; - DECLARE vStrtable VARCHAR(15) DEFAULT NULL; - - SET vDate = util.VN_CURDATE() - INTERVAL 2 MONTH; - SET vDate18 = util.VN_CURDATE() - INTERVAL 18 MONTH; - SET vDate26 = util.VN_CURDATE() - INTERVAL 26 MONTH; - SET vDate3 = util.VN_CURDATE() - INTERVAL 3 MONTH; - SET vDate8 = util.VN_CURDATE() - INTERVAL 8 DAY; - SET vDate6 = util.VN_CURDATE() - INTERVAL 6 DAY; - SET vDate2000 = util.VN_CURDATE() + INTERVAL (2000 - YEAR(util.VN_CURDATE())) YEAR; - SET vRangeDeleteTicket = 60; - - DELETE FROM cdr WHERE calldate < vDate18; - DELETE FROM mail WHERE DATE_ODBC < vDate; - DELETE FROM Movimientos_mark WHERE odbc_date < vDate; - DELETE FROM Splits WHERE Fecha < vDate18; - - DELETE FROM Remesas WHERE `Fecha Remesa` < vDate18; - - DELETE tt.* - FROM Tickets_turno tt - LEFT JOIN Movimientos m USING(Id_Ticket) - WHERE m.Id_Article IS NULL; - - DELETE FROM cl_main WHERE Fecha < vDate18; - DELETE FROM hedera.`order` WHERE date_send < vDate18; - DELETE FROM vn.message WHERE sendDate < vDate; - - DELETE FROM cache.departure_limit WHERE Fecha < util.VN_CURDATE() - INTERVAL 1 MONTH; - - DELETE cm - FROM Compres_mark cm - JOIN Compres c ON c.Id_Compra = cm.Id_Compra - JOIN Entradas e ON e.Id_Entrada = c.Id_Entrada - JOIN travel t ON t.id = e.travel_id - WHERE t.landing <= vDate; - - IF v_full THEN - CREATE OR REPLACE TEMPORARY TABLE tTicketDelete - SELECT DISTINCT tl.originFk ticketFk - FROM vn.ticketLog tl - JOIN (SELECT MAX(tl.id)ids - FROM vn.ticket t - JOIN vn.ticketLog tl ON tl.originFk = t.id - WHERE t.shipped BETWEEN '2000-01-01' AND '2000-12-31' - AND t.isDeleted - GROUP BY t.id - )sub ON sub.ids = tl.id - WHERE tl.creationDate <= util.VN_CURDATE() - INTERVAL 60 DAY; - - DELETE t - FROM vn.ticket t - JOIN tTicketDelete tmp ON tmp.ticketFk = t.id; - - DROP TEMPORARY TABLE tTicketDelete; - END IF; - - -- Tickets Nulos PAK 11/10/2016 - UPDATE Tickets - SET empresa_id = 965 - WHERE Id_Cliente = 31 - AND empresa_id != 965; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/clean_launcher.sql b/db/routines/vn2008/procedures/clean_launcher.sql deleted file mode 100644 index 63c23e8cf..000000000 --- a/db/routines/vn2008/procedures/clean_launcher.sql +++ /dev/null @@ -1,6 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`clean_launcher`() -BEGIN - CALL clean(TRUE); -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/cobro.sql b/db/routines/vn2008/procedures/cobro.sql deleted file mode 100644 index 26d906813..000000000 --- a/db/routines/vn2008/procedures/cobro.sql +++ /dev/null @@ -1,79 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`cobro`(IN datFEC DATE - , IN idCLI INT - , IN dblIMPORTE DOUBLE - , IN idCAJA INT - , IN idPAYMET INT - , IN strCONCEPTO VARCHAR(40) - , IN idEMP INT - , IN idWH INT - , IN idTRABAJADOR INT) -BEGIN - - DECLARE bolCASH BOOLEAN; - DECLARE cuenta_banco BIGINT; - DECLARE cuenta_cliente BIGINT; - DECLARE max_asien INT; - -- XDIARIO - -- No se asientan los cobros directamente, salvo en el caso de las cajas de CASH - SELECT (at2.code = 'cash') INTO bolCASH FROM Bancos b JOIN vn.accountingType at2 ON at2.id = b.cash WHERE b.Id_Banco = idCAJA; - IF bolCASH THEN - SELECT Cuenta INTO cuenta_banco - FROM Bancos - WHERE Id_Banco = idCAJA; - SELECT Cuenta INTO cuenta_cliente - FROM Clientes - WHERE Id_Cliente = idCLI; - CALL vn.ledger_next(max_asien); - INSERT INTO vn.XDiario (ASIEN,FECHA,SUBCTA,CONTRA,CONCEPTO,EURODEBE,EUROHABER,empresa_id) - SELECT max_asien,datFEC,SUBCTA,CONTRA,strCONCEPTO,EURODEBE,EUROHABER,idEMP - FROM(SELECT cuenta_banco SUBCTA, cuenta_cliente CONTRA, 0 EURODEBE, dblIMPORTE EUROHABER - UNION ALL - SELECT cuenta_cliente SUBCTA, cuenta_banco CONTRA, dblIMPORTE EURODEBE, 0 EUROHABER - ) gf; - END IF; - - -- CAJERA - INSERT INTO Cajas(Id_Trabajador, - Id_Banco, - Entrada, - Concepto, - Cajafecha, - Serie, - Partida, - Numero, - empresa_id, - warehouse_id - ) - VALUES (idTRABAJADOR, - idCAJA, - dblIMPORTE, - strCONCEPTO, - datFEC, - 'A', - TRUE, - idCLI, - idEMP, - idWH - ); - - -- RECIBO - INSERT INTO Recibos(Entregado, - Fechacobro, - Id_Trabajador, - Id_Banco, - Id_Cliente, - Id_Factura, - empresa_id - ) - VALUES ( dblIMPORTE, - datFEC, - idTRABAJADOR, - idCAJA, - idCLI, - strCONCEPTO, - idEMP - ); - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/confection_control_source.sql b/db/routines/vn2008/procedures/confection_control_source.sql deleted file mode 100644 index 77b4df5f3..000000000 --- a/db/routines/vn2008/procedures/confection_control_source.sql +++ /dev/null @@ -1,105 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`confection_control_source`(vDated DATE, vScopeDays TINYINT) -BEGIN - - DECLARE vMidnight DATETIME DEFAULT TIMESTAMP(vDated,'23:59:59'); - DECLARE vEndingDate DATETIME DEFAULT TIMESTAMPADD(DAY,vScopeDays,vMidnight); - DECLARE maxAlertLevel INT DEFAULT 2; - - DROP TEMPORARY TABLE IF EXISTS tmp.production_buffer; - - CREATE TEMPORARY TABLE tmp.production_buffer - ENGINE = MEMORY - SELECT - date(t.Fecha) as Fecha, - hour(t.Fecha) as Hora, - hour(t.Fecha) as Departure, - t.Id_Ticket, - m.Id_Movimiento, - m.Cantidad, - m.Concepte, - ABS(m.Reservado) Reservado, - i.Categoria, - tp.Tipo, - t.Alias as Cliente, - wh.name as Almacen, - t.warehouse_id, - cs.province_id, - a.agency_id, - ct.description as Taller, - stock.visible, - stock.available - FROM vn2008.Tickets t - JOIN vn2008.Agencias a ON a.Id_Agencia = t.Id_Agencia - JOIN vn.warehouse wh ON wh.id = t.warehouse_id - JOIN vn2008.Movimientos m ON m.Id_Ticket = t.Id_Ticket - JOIN vn2008.Articles i ON i.Id_Article = m.Id_Article - JOIN vn2008.Tipos tp ON tp.tipo_id = i.tipo_id - JOIN vn.confectionType ct ON ct.id = tp.confeccion - JOIN vn2008.Consignatarios cs on cs.Id_Consigna = t.Id_Consigna - LEFT JOIN vn.ticketState tls on tls.ticketFk = t.Id_Ticket - LEFT JOIN - ( - SELECT item_id, sum(visible) visible, sum(available) available - FROM - ( - SELECT a.item_id, 0 as visible, a.available - FROM cache.cache_calc cc - LEFT JOIN cache.available a ON a.calc_id = cc.id - WHERE cc.cache_id IN (2,8) - AND cc.params IN (concat("1/", util.VN_CURDATE()),concat("44/", util.VN_CURDATE())) - - UNION ALL - - SELECT v.item_id, v.visible, 0 as available - FROM cache.cache_calc cc - LEFT JOIN cache.visible v ON v.calc_id = cc.id - where cc.cache_id IN (2,8) and cc.params IN ("1","44") - ) sub - GROUP BY item_id - ) stock ON stock.item_id = m.Id_Article - WHERE tp.confeccion - AND tls.alertLevel < maxAlertLevel - AND wh.hasConfectionTeam - AND t.Fecha BETWEEN vDated AND vEndingDate - AND m.Cantidad > 0; - - -- Entradas - - INSERT INTO tmp.production_buffer( - Fecha, - Id_Ticket, - Cantidad, - Concepte, - Categoria, - Cliente, - Almacen, - Taller - ) - SELECT - tr.shipment AS Fecha, - e.Id_Entrada AS Id_Ticket, - c.Cantidad, - a.Article, - a.Categoria, - whi.name as Cliente, - who.name as Almacen, - ct.description as Taller - FROM vn2008.Compres c - JOIN vn2008.Entradas e ON e.Id_Entrada = c.Id_Entrada - JOIN vn2008.travel tr ON tr.id = e.travel_id - JOIN vn.warehouse whi ON whi.id = tr.warehouse_id - JOIN vn.warehouse who ON who.id = tr.warehouse_id_out - JOIN vn2008.Articles a ON a.Id_Article = c.Id_Article - JOIN vn2008.Tipos tp ON tp.tipo_id = a.tipo_id - JOIN vn.confectionType ct ON ct.id = tp.confeccion - WHERE who.hasConfectionTeam - AND tp.confeccion - AND tr.shipment BETWEEN vDated AND vEndingDate; - - - SELECT * FROM tmp.production_buffer; - - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/customerDebtEvolution.sql b/db/routines/vn2008/procedures/customerDebtEvolution.sql deleted file mode 100644 index b9763b985..000000000 --- a/db/routines/vn2008/procedures/customerDebtEvolution.sql +++ /dev/null @@ -1,49 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`customerDebtEvolution`(IN vCustomer INT) -BEGIN - -SELECT * FROM -( - SELECT day, date, @s:= round(IFNULL(Euros,0) + @s,2) as Saldo, Euros, Credito, 0 as Cero - FROM - ( - SELECT day, date, IFNULL(Euros,0) as Euros, Credito - FROM time - JOIN (SELECT @s:= 0, - Credito as Credito FROM Clientes WHERE Id_Cliente = vCustomer) c - LEFT JOIN - (SELECT Euros, date(Fecha) as Fecha FROM - ( - SELECT Fechacobro as Fecha, Entregado as Euros - FROM Recibos - WHERE Id_Cliente = vCustomer - AND Fechacobro >= '2017-01-01' - UNION ALL - SELECT vn.getDueDate(io.issued,c.Vencimiento), - io.amount - FROM vn.invoiceOut io - JOIN Clientes c ON io.clientFk = c.Id_Cliente - WHERE io.clientFk = vCustomer - AND io.issued >= '2017-01-01' - UNION ALL - SELECT '2016-12-31', Debt - FROM bi.customerDebtInventory - WHERE Id_Cliente = vCustomer - UNION ALL - SELECT Fecha, - SUM(Cantidad * Preu * (100 - Descuento ) * 1.10 / 100) - FROM Tickets t - JOIN Movimientos m on m.Id_Ticket = t.Id_Ticket - WHERE Id_Cliente = vCustomer - AND Factura IS NULL - AND Fecha >= '2017-01-01' - GROUP BY Fecha - ) sub2 - ORDER BY Fecha - )sub ON time.date = sub.Fecha - WHERE time.date BETWEEN '2016-12-31' AND util.VN_CURDATE() - ORDER BY date - ) sub3 -)sub4 -; - - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/emailYesterdayPurchasesByConsigna.sql b/db/routines/vn2008/procedures/emailYesterdayPurchasesByConsigna.sql deleted file mode 100644 index 439eba5ad..000000000 --- a/db/routines/vn2008/procedures/emailYesterdayPurchasesByConsigna.sql +++ /dev/null @@ -1,100 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`emailYesterdayPurchasesByConsigna`(IN v_Date DATE, IN v_Client_Id INT) -BEGIN - - DECLARE MyIdTicket BIGINT; - DECLARE MyAlias VARCHAR(50); - DECLARE MyDomicilio VARCHAR(255); - DECLARE MyPoblacion VARCHAR(25); - DECLARE MyImporte DOUBLE; - DECLARE MyMailTo VARCHAR(250); - DECLARE MyMailReplyTo VARCHAR(250); - DECLARE done INT DEFAULT FALSE; - DECLARE emptyList INT DEFAULT 0; - DECLARE txt TEXT; - - DECLARE rs CURSOR FOR - SELECT t.Id_Ticket, Alias, cast(amount as decimal(10,2)) Importe, Domicilio, POBLACION - FROM Tickets t - JOIN Consignatarios cs ON t.Id_Consigna = cs.Id_Consigna - JOIN ( - SELECT `Movimientos`.`Id_Ticket` AS `Id_Ticket`, - sum( - `Movimientos`.`Cantidad` * `Movimientos`.`Preu` * (100 - `Movimientos`.`Descuento`) / 100 - ) AS `amount` - FROM ( - `vn2008`.`Movimientos` - JOIN `vn2008`.`Tickets` ON( - `Movimientos`.`Id_Ticket` = `Tickets`.`Id_Ticket` - ) - ) - WHERE `Tickets`.`Fecha` >= `util`.`VN_CURDATE`() + INTERVAL -6 MONTH - GROUP BY `Movimientos`.`Id_Ticket` - ) v ON v.Id_Ticket = t.Id_Ticket - WHERE t.Fecha BETWEEN v_Date AND util.dayEnd(v_Date) - AND t.Id_Cliente = v_Client_Id; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; - - SET v_Date = IFNULL(v_Date, util.yesterday()); - - OPEN rs; - - FETCH rs INTO MyIdTicket, MyAlias, MyImporte, MyDomicilio, MyPoblacion; - - SET emptyList = done; - - SET txt = CONCAT('

', - '

Relación de envíos.

', - '

Dia: ', v_Date, '

'); - - WHILE NOT done DO - - SET txt = CONCAT(txt, '

', - ' - - - - - - -
- Ticket ', MyIdTicket,' ', MyImporte, ' €
' - , ' ', MyAlias, '
' - , ' ', MyDomicilio, '(', MyPoblacion, ')'); - - FETCH rs INTO MyIdTicket, MyAlias, MyImporte, MyDomicilio, MyPoblacion; - - END WHILE; - - SET txt = CONCAT( - txt, - '', - '', - '
', - '

Puede acceder al detalle de los albaranes haciendo click sobre el número de Ticket', - '

Muchas gracias por su confianza

', - '

'); - - -- Envío del email - IF emptyList = 0 THEN - - SELECT CONCAT(`e-mail`,',pako@verdnatura.es') INTO MyMailTo - FROM Clientes - WHERE Id_Cliente = v_Client_Id AND `e-mail`>''; - - IF v_Client_Id = 7818 THEN -- LOEWE - SET MyMailTo = 'isabel@elisabethblumen.com,emunozca@loewe.es,pako@verdnatura.es'; - END IF; - - CALL vn.mail_insert( - IFNULL(MyMailTo,'pako.natek@gmail.com'), - 'pako@verdnatura.es', - 'Resumen de pedidos preparados', - txt - ); - - END IF; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/emailYesterdayPurchasesLauncher.sql b/db/routines/vn2008/procedures/emailYesterdayPurchasesLauncher.sql deleted file mode 100644 index c414cf1c4..000000000 --- a/db/routines/vn2008/procedures/emailYesterdayPurchasesLauncher.sql +++ /dev/null @@ -1,27 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`emailYesterdayPurchasesLauncher`() -BEGIN - -DECLARE done INT DEFAULT 0; -DECLARE vMyClientId INT; - -DECLARE rs CURSOR FOR -SELECT Id_Cliente -FROM Clientes -WHERE EYPBC != 0; - -DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; - -OPEN rs; - -FETCH rs INTO vMyClientId; - -WHILE NOT done DO - - CALL emailYesterdayPurchasesByConsigna(util.yesterday(), vMyClientId); - - FETCH rs INTO vMyClientId; - -END WHILE; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/embalajes_stocks.sql b/db/routines/vn2008/procedures/embalajes_stocks.sql deleted file mode 100644 index b20e44c79..000000000 --- a/db/routines/vn2008/procedures/embalajes_stocks.sql +++ /dev/null @@ -1,51 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`embalajes_stocks`(IN idPEOPLE INT, IN bolCLIENT BOOLEAN) -BEGIN - -if bolCLIENT then - - select m.Id_Article, Article, - cast(sum(m.Cantidad) as decimal) as Saldo - from Movimientos m - join Articles a on m.Id_Article = a.Id_Article - join Tipos tp on tp.tipo_id = a.tipo_id - join Tickets t using(Id_Ticket) - join Consignatarios cs using(Id_Consigna) - where cs.Id_Cliente = idPEOPLE - and Tipo = 'Contenedores' - and t.Fecha > '2010-01-01' - group by m.Id_Article; - -else - -select Id_Article, Article, sum(Cantidad) as Saldo -from -(select Id_Article, Cantidad -from Compres c -join Articles a using(Id_Article) -join Tipos tp using(tipo_id) -join Entradas e using(Id_Entrada) -join travel tr on tr.id = travel_id -where Id_Proveedor = idPEOPLE -and landing >= '2010-01-01' -and reino_id = 6 - -union all - -select Id_Article, - Cantidad -from Movimientos m -join Articles a using(Id_Article) -join Tipos tp using(tipo_id) -join Tickets t using(Id_Ticket) -join Consignatarios cs using(Id_Consigna) -join proveedores_clientes pc on pc.Id_Cliente = cs.Id_Cliente -where Id_Proveedor = idPEOPLE -and reino_id = 6 -and t.Fecha > '2010-01-01') mov - -join Articles a using(Id_Article) -group by Id_Article; - -end if; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/embalajes_stocks_detalle.sql b/db/routines/vn2008/procedures/embalajes_stocks_detalle.sql deleted file mode 100644 index c49d1b88a..000000000 --- a/db/routines/vn2008/procedures/embalajes_stocks_detalle.sql +++ /dev/null @@ -1,78 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`embalajes_stocks_detalle`(IN idPEOPLE INT, IN idARTICLE INT, IN bolCLIENT BOOLEAN) -BEGIN - - -if bolCLIENT then - - select m.Id_Article - , Article - , IF(Cantidad < 0, - Cantidad, NULL) as Entrada - , IF(Cantidad < 0, NULL, Cantidad) as Salida - , 'T' as Tabla - , t.Id_Ticket as Registro - , t.Fecha - , w.name as Almacen - , cast(Preu as Decimal(5,2)) Precio - , c.Cliente as Proveedor - , abbreviation as Empresa - from Movimientos m - join Articles a using(Id_Article) - join Tickets t using(Id_Ticket) - join empresa e on e.id = t.empresa_id - join warehouse w on w.id = t.warehouse_id - join Consignatarios cs using(Id_Consigna) - join Clientes c on c.Id_Cliente = cs.Id_Cliente - where cs.Id_Cliente = idPEOPLE - and m.Id_Article = idARTICLE - and t.Fecha > '2010-01-01'; - -else - -select Id_Article, Tabla, Registro, Fecha, Article -, w.name as Almacen, Entrada, Salida, Proveedor, cast(Precio as Decimal(5,2)) Precio - -from - -(select Id_Article - , IF(Cantidad > 0, Cantidad, NULL) as Entrada - , IF(Cantidad > 0, NULL,- Cantidad) as Salida - , 'E' as Tabla - , Id_Entrada as Registro - , landing as Fecha - , tr.warehouse_id - , Costefijo as Precio -from Compres c -join Entradas e using(Id_Entrada) -join travel tr on tr.id = travel_id -where Id_Proveedor = idPEOPLE -and Id_Article = idARTICLE -and landing >= '2010-01-01' - -union all - -select Id_Article - , IF(Cantidad < 0, - Cantidad, NULL) as Entrada - , IF(Cantidad < 0, NULL, Cantidad) as Salida - , 'T' - , Id_Ticket - , Fecha - , t.warehouse_id - , Preu -from Movimientos m -join Tickets t using(Id_Ticket) -join Consignatarios cs using(Id_Consigna) -join proveedores_clientes pc on pc.Id_Cliente = cs.Id_Cliente -where Id_Proveedor = idPEOPLE -and Id_Article = idARTICLE -and t.Fecha > '2010-01-01') mov - -join Articles a using(Id_Article) -join Proveedores p on Id_Proveedor = idPEOPLE -join warehouse w on w.id = mov.warehouse_id -; - -end if; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/nest_child_add.sql b/db/routines/vn2008/procedures/nest_child_add.sql deleted file mode 100644 index 5b45a9d07..000000000 --- a/db/routines/vn2008/procedures/nest_child_add.sql +++ /dev/null @@ -1,48 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`nest_child_add`( - vTable VARCHAR(45) - ,vChild VARCHAR(45) - ,vFatherId INT -) -BEGIN - DECLARE vMyLeft INT; - - SET vTable = util.quoteIdentifier(vTable); - - DROP TEMPORARY TABLE IF EXISTS aux; - CREATE TEMPORARY TABLE aux - SELECT 0 as lft; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE aux - SET lft = (SELECT lft - FROM ', vTable, - ' WHERE id = ?)') - USING vFatherId; - - SELECT lft INTO vMyLeft FROM aux; - DROP TEMPORARY TABLE aux; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, ' - SET rgt = rgt + 2 - WHERE rgt > ? - ORDER BY rgt DESC') - USING vMyLeft; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, ' - SET lft = lft + 2 - WHERE lft > ? - ORDER BY lft DESC') - USING vMyLeft; - - EXECUTE IMMEDIATE CONCAT( - 'INSERT INTO ', vTable, ' (name, lft, rgt) - VALUES(?, ? + 1, ? + 2)') - USING vChild, - vMyLeft, - vMyLeft; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/nest_delete.sql b/db/routines/vn2008/procedures/nest_delete.sql deleted file mode 100644 index 84f75294b..000000000 --- a/db/routines/vn2008/procedures/nest_delete.sql +++ /dev/null @@ -1,51 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`nest_delete`( - vTable VARCHAR(45) - ,vNodeId INT -) -BEGIN - DECLARE vMyRight INT; - DECLARE vMyLeft INT; - DECLARE vMyWidth INT; - - DROP TEMPORARY TABLE IF EXISTS aux; - CREATE TEMPORARY TABLE aux - SELECT 0 rgt, 0 lft, 0 wdt; - - SET vTable = util.quoteIdentifier(vTable); - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE aux a - JOIN ', vTable, ' t - SET a.rgt = t.rgt, - a.lft = t.lft, - a.wdt = t.rgt - t.lft + 1 - WHERE t.id = ?') - USING vNodeId; - - SELECT rgt, lft, wdt - INTO vMyRight, vMyLeft, vMyWidth - FROM aux; - - DROP TEMPORARY TABLE aux; - - EXECUTE IMMEDIATE CONCAT( - 'DELETE FROM ', vTable, - ' WHERE lft BETWEEN ? AND ?') - USING vMyLeft, vMyRight; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - ' SET rgt = rgt - ? - WHERE rgt > ? - ORDER BY rgt') - USING vMyWidth,vMyRight; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - ' SET lft = lft - ? - WHERE lft > ? - ORDER BY lft') - USING vMyWidth, vMyRight; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/nest_move.sql b/db/routines/vn2008/procedures/nest_move.sql deleted file mode 100644 index 950d46e68..000000000 --- a/db/routines/vn2008/procedures/nest_move.sql +++ /dev/null @@ -1,108 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`nest_move`( - vTable VARCHAR(45) - ,idNODE INT - ,idFATHER INT -) -BEGIN - DECLARE myRight INT; - DECLARE myLeft INT; - DECLARE myWidth INT; - DECLARE fatherRight INT; - DECLARE fatherLeft INT; - DECLARE gap INT; - - SET vTable = util.quoteIdentifier(vTable); - - DROP TEMPORARY TABLE IF EXISTS aux; - CREATE TEMPORARY TABLE aux - SELECT 0 as rgt, 0 as lft, 0 as wdt, 0 as frg, 0 as flf; - - -- Averiguamos el ancho de la rama - EXECUTE IMMEDIATE CONCAT( - 'UPDATE aux a - JOIN ', vTable, ' t - SET a.wdt = t.rgt - t.lft + 1 - WHERE t.id = ?') - USING idNODE; - - -- Averiguamos la posicion del nuevo padre - EXECUTE IMMEDIATE CONCAT( - 'UPDATE aux a - JOIN ', vTable, ' t - SET a.frg = t.rgt, - a.flf = t.lft - WHERE t.id = ?') - USING idFATHER; - - SELECT wdt, frg, flf INTO myWidth, fatherRight, fatherLeft - FROM aux; - - -- 1º Incrementamos los valores de todos los nodos a la derecha del punto de inserción (fatherRight) , para hacer sitio - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET rgt = rgt + ? - WHERE rgt >= ? - ORDER BY rgt DESC') - USING myWidth, - fatherRight; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET lft = lft + ? - WHERE lft >= ? - ORDER BY lft DESC') - USING myWidth, - fatherRight; - - -- Es preciso recalcular los valores del nodo en el caso de que estuviera a la derecha del nuevo padre - EXECUTE IMMEDIATE CONCAT( - 'UPDATE aux a - JOIN ', vTable, ' t - SET a.rgt = t.rgt, - a.lft = t.lft - WHERE t.id = ?') - USING idNODE; - - SELECT lft, rgt, frg - lft INTO myLeft, myRight, gap - FROM aux; - - -- 2º Incrementamos el valor de todos los nodos a trasladar hasta alcanzar su nueva posicion - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET lft = lft + ? - WHERE lft BETWEEN ? AND ? - ORDER BY lft DESC') - USING gap, - myLeft, - myRight; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET rgt = rgt + ? - WHERE rgt BETWEEN ? AND ? - ORDER BY rgt DESC') - USING gap, - myLeft, - myRight; - - -- 3º Restaremos a todos los nodos resultantes, a la derecha de la posicion arrancada el ancho de la rama escindida - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET lft = lft - ? - WHERE lft > ? - ORDER BY lft') - USING myWidth, - myLeft; - - EXECUTE IMMEDIATE CONCAT( - 'UPDATE ', vTable, - 'SET rgt = rgt - ? - WHERE rgt > ? - ORDER BY rgt') - USING myWidth, - myRight; - - DROP TEMPORARY TABLE aux; -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/pay.sql b/db/routines/vn2008/procedures/pay.sql deleted file mode 100644 index ec73ee696..000000000 --- a/db/routines/vn2008/procedures/pay.sql +++ /dev/null @@ -1,67 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`pay`(IN datFEC DATE - , IN idPROV INT - , IN dblIMPORTE DOUBLE - , IN idMONEDA INT - , IN dblDIVISA DOUBLE - , IN idCAJA INT - , IN idPAYMET INT - , IN dblGASTOS DOUBLE - , IN strCONCEPTO VARCHAR(40) - , IN idEMP INT) -BEGIN - - -- Registro en la tabla Cajas - INSERT INTO Cajas ( Concepto - , Serie - , Numero - , Salida - , Cajafecha - , Partida - , Id_Banco - , Id_Trabajador - ,empresa_id - ,conciliado) - - SELECT CONCAT('n/pago a ', Proveedor) - , 'R' - , idPROV - , dblIMPORTE - , datFEC - , 1 - , idCAJA - , account.myUser_getId() - , idEMP - , 1 - FROM Proveedores - WHERE Id_Proveedor = idPROV; - - -- Registro en la tabla pago - INSERT INTO pago(fecha - , dueDated - , id_proveedor - , importe - , id_moneda - , divisa - , id_banco - , pay_met_id - , g_bancarios - , concepte - , empresa_id) - - VALUES(datFEC - , datFEC - , idPROV - , dblIMPORTE - , idMONEDA - , IF(dblDIVISA = 0, NULL, dblDIVISA) - , idCAJA - , idPAYMET - , dblGASTOS - , strCONCEPTO - , idEMP); - - SELECT LAST_INSERT_ID() as pago_id; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/preOrdenarRuta.sql b/db/routines/vn2008/procedures/preOrdenarRuta.sql deleted file mode 100644 index b5fd2b24b..000000000 --- a/db/routines/vn2008/procedures/preOrdenarRuta.sql +++ /dev/null @@ -1,22 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`preOrdenarRuta`(IN vRutaId INT) -BEGIN -/* Usa los valores del ultimo año para adivinar el orden de los tickets en la ruta - * vRutaId id ruta - * DEPRECATED use vn.routeGressPriority -*/ - -UPDATE Tickets mt -JOIN ( - SELECT tt.Id_Consigna, round(ifnull(avg(t.Prioridad),0),0) as Prioridad - from Tickets t - JOIN Tickets tt on tt.Id_Consigna = t.Id_Consigna - where t.Fecha > TIMESTAMPADD(YEAR,-1,util.VN_CURDATE()) - AND tt.Id_Ruta = vRutaId - GROUP BY Id_Consigna - ) sub ON sub.Id_Consigna = mt.Id_Consigna - SET mt.Prioridad = sub.Prioridad - WHERE mt.Id_Ruta = vRutaId; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/prepare_ticket_list.sql b/db/routines/vn2008/procedures/prepare_ticket_list.sql deleted file mode 100644 index e407a91b7..000000000 --- a/db/routines/vn2008/procedures/prepare_ticket_list.sql +++ /dev/null @@ -1,22 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`prepare_ticket_list`(vStartingDate DATETIME, vEndingDate DATETIME) -BEGIN - DROP TEMPORARY TABLE IF EXISTS tmp.ticket_list; - CREATE TEMPORARY TABLE tmp.ticket_list - (PRIMARY KEY (Id_Ticket)) - ENGINE = MEMORY - SELECT t.Id_Ticket, c.Id_Cliente - FROM Tickets t - LEFT JOIN vn.ticketState ts ON ts.ticketFk = t.Id_Ticket - JOIN Clientes c ON c.Id_Cliente = t.Id_Cliente - WHERE c.typeFk IN ('normal','handMaking','internalUse') - AND ( - Fecha BETWEEN util.today() AND vEndingDate - OR ( - ts.alertLevel < 3 - AND t.Fecha >= vStartingDate - AND t.Fecha < util.today() - ) - ); -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/procedures/recibidaIvaInsert.sql b/db/routines/vn2008/procedures/recibidaIvaInsert.sql deleted file mode 100644 index e2aba0a35..000000000 --- a/db/routines/vn2008/procedures/recibidaIvaInsert.sql +++ /dev/null @@ -1,39 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn2008`.`recibidaIvaInsert`(IN vId INT) -BEGIN - - DECLARE vRate DOUBLE DEFAULT 1; - DECLARE vDated DATE; - - SELECT MAX(rr.date) INTO vDated - FROM reference_rate rr - JOIN recibida r ON r.id = vId - WHERE rr.date <= r.fecha - AND rr.moneda_id = r.moneda_id ; - - IF vDated THEN - - SELECT rate INTO vRate - FROM reference_rate - WHERE `date` = vDated; - END IF; - - DELETE FROM recibida_iva WHERE recibida_id = vId; - - INSERT INTO recibida_iva(recibida_id, bi, gastos_id, divisa, taxTypeSageFk, transactionTypeSageFk) - SELECT r.id, - SUM(Costefijo * Cantidad) / IFNULL(vRate,1) bi, - 6003000000, - IF(r.moneda_id = 1,NULL,SUM(Costefijo * Cantidad )) divisa, - taxTypeSageFk, - transactionTypeSageFk - FROM recibida r - JOIN Entradas e ON e.recibida_id = r.id - JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor - JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - LEFT JOIN reference_rate rr ON rr.moneda_id = r.moneda_id AND rr.date = r.fecha - WHERE r.id = vId - HAVING bi IS NOT NULL; - -END$$ -DELIMITER ; diff --git a/db/routines/vn2008/views/Bancos.sql b/db/routines/vn2008/views/Bancos.sql index 0c6f8d1bd..6e850f365 100644 --- a/db/routines/vn2008/views/Bancos.sql +++ b/db/routines/vn2008/views/Bancos.sql @@ -1,11 +1,11 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vn2008`.`Bancos` -AS SELECT `b`.`id` AS `Id_Banco`, - `b`.`bank` AS `Banco`, - `b`.`account` AS `Cuenta`, - `b`.`cash` AS `cash`, - `b`.`entityFk` AS `entity_id`, - `b`.`isActive` AS `activo`, - `b`.`currencyFk` AS `currencyFk` -FROM `vn`.`bank` `b` +AS SELECT `a`.`id` AS `Id_Banco`, + `a`.`bank` AS `Banco`, + `a`.`account` AS `Cuenta`, + `a`.`accountingTypeFk` AS `cash`, + `a`.`entityFk` AS `entity_id`, + `a`.`isActive` AS `activo`, + `a`.`currencyFk` AS `currencyFk` +FROM `vn`.`accounting` `a` diff --git a/db/versions/10832-purpleAralia/00-newWareHouse.sql b/db/versions/10832-purpleAralia/00-newWareHouse.sql new file mode 100644 index 000000000..dd2c16bdb --- /dev/null +++ b/db/versions/10832-purpleAralia/00-newWareHouse.sql @@ -0,0 +1,12 @@ +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('Collection', 'assign', 'WRITE', 'ALLOW', 'ROLE', 'production'), + ('ExpeditionPallet', 'getPallet', 'READ', 'ALLOW', 'ROLE', 'production'), + ('MachineWorker','updateInTime','WRITE','ALLOW','ROLE','production'), + ('MobileAppVersionControl','getVersion','READ','ALLOW','ROLE','production'), + ('SaleTracking','delete','WRITE','ALLOW','ROLE','production'), + ('SaleTracking','updateTracking','WRITE','ALLOW','ROLE','production'), + ('SaleTracking','setPicked','WRITE','ALLOW','ROLE','production'), + ('ExpeditionPallet', '*', 'READ', 'ALLOW', 'ROLE', 'production'), + ('Sale', 'getFromSectorCollection', 'READ', 'ALLOW', 'ROLE', 'production'), + ('ItemBarcode', 'delete', 'WRITE', 'ALLOW', 'ROLE', 'production'); \ No newline at end of file diff --git a/db/versions/10905-grayIvy/00-firstScript.sql b/db/versions/10905-grayIvy/00-firstScript.sql new file mode 100644 index 000000000..cca41cd48 --- /dev/null +++ b/db/versions/10905-grayIvy/00-firstScript.sql @@ -0,0 +1,36 @@ +USE vn; + +CREATE OR REPLACE TABLE vn.workerActivityType ( + `code` varchar(20) NOT NULL, + `description` varchar(45) NOT NULL, + PRIMARY KEY (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +ALTER TABLE vn.department ADD workerActivityTypeFk varchar(20) NULL COMMENT 'Indica la actitividad que desempeña por defecto ese departamento'; +ALTER TABLE vn.department ADD CONSTRAINT department_workerActivityType_FK FOREIGN KEY (workerActivityTypeFk) REFERENCES vn.workerActivityType(code) ON DELETE CASCADE ON UPDATE CASCADE; + + + +INSERT INTO vn.workerActivityType (code, description) VALUES('ON_CHECKING', 'REVISION'); +INSERT INTO vn.workerActivityType (code, description) VALUES('PREVIOUS_CAM', 'CAMARA'); +INSERT INTO vn.workerActivityType (code, description) VALUES('PREVIOUS_ART', 'ARTIFICIAL'); +INSERT INTO vn.workerActivityType (code, description) VALUES('ON_PREPARATION', 'SACADO'); +INSERT INTO vn.workerActivityType (code, description) VALUES('PACKING', 'ENCAJADO'); +INSERT INTO vn.workerActivityType (code, description) VALUES('FIELD', 'CAMPOS'); +INSERT INTO vn.workerActivityType (code, description) VALUES('DELIVERY', 'REPARTO'); +INSERT INTO vn.workerActivityType (code, description) VALUES('STORAGE', 'ALMACENAJE'); +INSERT INTO vn.workerActivityType (code, description) VALUES('PALLETIZING', 'PALETIZADO'); +INSERT INTO vn.workerActivityType (code, description) VALUES('STOP', 'PARADA'); + + +INSERT INTO salix.ACL ( model, property, accessType, permission, principalType, principalId) VALUES('WorkerActivityType', '*', 'READ', 'ALLOW', 'ROLE', 'production'); +INSERT INTO salix.ACL ( model, property, accessType, permission, principalType, principalId) VALUES('WorkerActivity', '*', '*', 'ALLOW', 'ROLE', 'production'); + + +ALTER TABLE vn.workerActivity MODIFY COLUMN event enum('open','close','insert','delete','update','refresh') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NULL; +ALTER TABLE vn.workerActivity MODIFY COLUMN model enum('COM','ENT','TPV','ENC','LAB','ETI','APP') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL; + + +ALTER TABLE vn.workerActivity ADD workerActivityTypeFk varchar(20) NULL; +ALTER TABLE vn.workerActivity ADD CONSTRAINT workerActivity_workerActivityType_FK FOREIGN KEY (workerActivityTypeFk) REFERENCES vn.workerActivityType(code) ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/db/versions/10913-bronzeGalax/00-firstScript.sql b/db/versions/10913-bronzeGalax/00-firstScript.sql new file mode 100644 index 000000000..aef0c8738 --- /dev/null +++ b/db/versions/10913-bronzeGalax/00-firstScript.sql @@ -0,0 +1,4 @@ +-- Place your SQL code here +RENAME TABLE IF EXISTS vn.claimRma TO vn.claimRma__; +ALTER TABLE IF EXISTS vn.claimRma__ COMMENT='kkeada el 2024-02-26 por Pablo'; +ALTER TABLE vn.claim CHANGE IF EXISTS rma rma__ varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL; diff --git a/db/versions/10915-limeMastic/00-firstScript.sql b/db/versions/10915-limeMastic/00-firstScript.sql new file mode 100644 index 000000000..be83a4984 --- /dev/null +++ b/db/versions/10915-limeMastic/00-firstScript.sql @@ -0,0 +1,2 @@ +DELETE IGNORE FROM bs.nightTask + WHERE `procedure` = 'clean_launcher'; diff --git a/db/versions/10918-wheatRose/00-firstScript.sql b/db/versions/10918-wheatRose/00-firstScript.sql new file mode 100644 index 000000000..5d0fb1c32 --- /dev/null +++ b/db/versions/10918-wheatRose/00-firstScript.sql @@ -0,0 +1,2 @@ +DELETE FROM bs.nightTask + WHERE `procedure` = 'emailYesterdayPurchasesLauncher'; diff --git a/db/versions/10923-pinkOak/00-createParkingLog.sql b/db/versions/10923-pinkOak/00-createParkingLog.sql new file mode 100644 index 000000000..f31f58196 --- /dev/null +++ b/db/versions/10923-pinkOak/00-createParkingLog.sql @@ -0,0 +1,60 @@ +CREATE OR REPLACE TABLE vn.parkingLog ( + + `id` int(11) NOT NULL AUTO_INCREMENT, + + `originFk` int(11) DEFAULT NULL, + + `userFk` int(10) unsigned DEFAULT NULL, + + `action` set('insert','update','delete','select') NOT NULL, + + `creationDate` timestamp NULL DEFAULT current_timestamp(), + + `description` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + + `changedModel` enum('Parking','SaleGroup','SaleGroupDetail') NOT NULL DEFAULT 'Parking', + + `oldInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`oldInstance`)), + + `newInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`newInstance`)), + + `changedModelId` int(11) NOT NULL, + + `changedModelValue` varchar(45) DEFAULT NULL, + + PRIMARY KEY (`id`), + + KEY `logParkinguserFk` (`userFk`), + + KEY `parkingLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`), + + KEY `parkingLog_originFk` (`originFk`,`creationDate`), + + CONSTRAINT `parkingOriginFk` FOREIGN KEY (`originFk`) REFERENCES `parking` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + + CONSTRAINT `parkingUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE + +) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +ALTER TABLE vn.parking DROP COLUMN IF EXISTS editorFk; +ALTER TABLE IF EXISTS vn.parking ADD COLUMN editorFk INT; + +ALTER TABLE vn.saleGroupDetail DROP COLUMN IF EXISTS editorFk; +ALTER TABLE IF EXISTS vn.saleGroupDetail ADD COLUMN editorFk INT; + + +ALTER TABLE vn.ticketLog + MODIFY COLUMN changedModel ENUM( + 'Ticket', + 'Sale', + 'TicketWeekly', + 'TicketTracking', + 'TicketService', + 'TicketRequest', + 'TicketRefund', + 'TicketPackaging', + 'TicketObservation', + 'TicketDms', + 'Expedition', + 'Sms' + ) NOT NULL DEFAULT 'Ticket'; diff --git a/db/versions/10923-pinkOak/01-aclParkingLog.sql b/db/versions/10923-pinkOak/01-aclParkingLog.sql new file mode 100644 index 000000000..8f7e55d63 --- /dev/null +++ b/db/versions/10923-pinkOak/01-aclParkingLog.sql @@ -0,0 +1,2 @@ +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) + VALUES ('ParkingLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); \ No newline at end of file diff --git a/db/versions/10924-pinkCordyline/00-firstScript.sql b/db/versions/10924-pinkCordyline/00-firstScript.sql new file mode 100644 index 000000000..1c6c1c0f8 --- /dev/null +++ b/db/versions/10924-pinkCordyline/00-firstScript.sql @@ -0,0 +1,31 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_addChild`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.balanceNestTree_addChild TO adminBoss; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_delete`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.balanceNestTree_delete TO adminBoss; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`balanceNestTree_move`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.balanceNestTree_move TO adminBoss; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`payment_add`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.payment_add TO financial; diff --git a/db/versions/10925-orangeLaurel/00-firstScript.sql b/db/versions/10925-orangeLaurel/00-firstScript.sql new file mode 100644 index 000000000..049627082 --- /dev/null +++ b/db/versions/10925-orangeLaurel/00-firstScript.sql @@ -0,0 +1,15 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`confection_controlSource`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.confection_controlSource TO handmadeBoss, productionAssi, artificialBoss; + +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`remittance_calc`() +BEGIN + SELECT 1; +END$$ +DELIMITER ; +GRANT EXECUTE ON PROCEDURE vn.remittance_calc TO financial; \ No newline at end of file diff --git a/db/versions/10926-limeFern/00-refactorClaimState.sql b/db/versions/10926-limeFern/00-refactorClaimState.sql new file mode 100644 index 000000000..bb2dc349a --- /dev/null +++ b/db/versions/10926-limeFern/00-refactorClaimState.sql @@ -0,0 +1,8 @@ +UPDATE vn.claim c + JOIN vn.claimState cs ON cs.id = c.claimStateFk + JOIN vn.claimState ns ON ns.code = 'resolved' + SET c.claimStateFk = ns.id + WHERE cs.code IN ('managed', 'mana', 'lack', 'relocation'); + +DELETE FROM vn.claimState + WHERE code IN ('managed', 'mana', 'lack', 'relocation'); diff --git a/db/versions/10928-orangeEucalyptus/00-firstScript.sql b/db/versions/10928-orangeEucalyptus/00-firstScript.sql new file mode 100644 index 000000000..58d3605de --- /dev/null +++ b/db/versions/10928-orangeEucalyptus/00-firstScript.sql @@ -0,0 +1,5 @@ +REVOKE SELECT ON TABLE vn.bank FROM administrative, hr; +GRANT SELECT ON TABLE vn.accounting TO administrative, hr; +UPDATE salix.ACL + SET model = 'Accounting' + WHERE model = 'Bank'; diff --git a/db/versions/10929-orangeAnthurium/00-firstScript.sql b/db/versions/10929-orangeAnthurium/00-firstScript.sql new file mode 100644 index 000000000..299ac63c7 --- /dev/null +++ b/db/versions/10929-orangeAnthurium/00-firstScript.sql @@ -0,0 +1,2 @@ +-- Place your SQL code here +ALTER TABLE dipole.expedition_PrintOut MODIFY COLUMN street varchar(42) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT ' ' NOT NULL; \ No newline at end of file diff --git a/e2e/paths/06-claim/01_basic_data.spec.js b/e2e/paths/06-claim/01_basic_data.spec.js index 0a08cad9f..2df95bd4a 100644 --- a/e2e/paths/06-claim/01_basic_data.spec.js +++ b/e2e/paths/06-claim/01_basic_data.spec.js @@ -21,7 +21,7 @@ describe('Claim edit basic data path', () => { }); it(`should edit claim state and observation fields`, async() => { - await page.autocompleteSearch(selectors.claimBasicData.claimState, 'Gestionado'); + await page.autocompleteSearch(selectors.claimBasicData.claimState, 'Resuelto'); await page.clearInput(selectors.claimBasicData.packages); await page.write(selectors.claimBasicData.packages, '2'); await page.waitToClick(selectors.claimBasicData.saveButton); @@ -48,7 +48,7 @@ describe('Claim edit basic data path', () => { await page.waitForSelector(selectors.claimBasicData.claimState); const result = await page.waitToGetProperty(selectors.claimBasicData.claimState, 'value'); - expect(result).toEqual('Gestionado'); + expect(result).toEqual('Resuelto'); }); it('should confirm the "is paid with mana" and "Pick up" checkbox are checked', async() => { diff --git a/front/salix/components/user-popover/index.html b/front/salix/components/user-popover/index.html index 0fa6800c5..06a4af1e0 100644 --- a/front/salix/components/user-popover/index.html +++ b/front/salix/components/user-popover/index.html @@ -58,7 +58,7 @@ label="Local bank" id="localBank" ng-model="$ctrl.localBankFk" - url="Banks" + url="Accountings" select-fields="['id','bank']" show-field="bank" order="id" diff --git a/jest.front.config.js b/jest.front.config.js index a843832ea..4b292801e 100644 --- a/jest.front.config.js +++ b/jest.front.config.js @@ -1,6 +1,8 @@ // For a detailed explanation regarding each configuration property, visit: // https://jestjs.io/docs/en/configuration.html /* eslint max-len: ["error", { "code": 150 }]*/ +const cpus = require('os').cpus().length; +const maxCpus = Math.floor(cpus * 0.45); module.exports = { name: 'front end', @@ -12,6 +14,7 @@ module.exports = { setupFilesAfterEnv: [ './front/jest-setup.js' ], + maxWorkers: maxCpus, testMatch: [ '**/front/**/*.spec.js', '**/print/**/*.spec.js', diff --git a/loopback/common/mixins/loggable.js b/loopback/common/mixins/loggable.js index 760fdf60a..24243ba68 100644 --- a/loopback/common/mixins/loggable.js +++ b/loopback/common/mixins/loggable.js @@ -1,6 +1,7 @@ const LoopBackContext = require('loopback-context'); async function handleObserve(ctx) { - ctx.options.httpCtx = LoopBackContext.getCurrentContext(); + const httpCtx = LoopBackContext.getCurrentContext(); + ctx.options.userId = httpCtx?.active?.accessToken?.userId; } module.exports = function(Self) { let Mixin = { diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 2187371cd..53b1a8bb5 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -209,5 +209,16 @@ "You cannot update these fields": "You cannot update these fields", "CountryFK cannot be empty": "Country cannot be empty", "You are not allowed to modify the alias": "You are not allowed to modify the alias", - "You already have the mailAlias": "You already have the mailAlias" + "You already have the mailAlias": "You already have the mailAlias", + "This machine is already in use.": "This machine is already in use.", + "the plate does not exist": "The plate {{plate}} does not exist", + "We do not have availability for the selected item": "We do not have availability for the selected item", + "You are already using a machine": "You are already using a machine", + "this state does not exist": "This state does not exist", + "The line could not be marked": "The line could not be marked", + "The sale cannot be tracked": "The sale cannot be tracked", + "Shelving not valid": "Shelving not valid", + "printerNotExists": "The printer does not exist", + "There are not picking tickets": "There are not picking tickets", + "ticketCommercial": "The ticket {{ ticket }} for the salesperson {{ salesMan }} is in preparation. (automatically generated message)" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 4079fa1ca..3748b6eaf 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -324,7 +324,6 @@ "The response is not a PDF": "La respuesta no es un PDF", "Booking completed": "Reserva completada", "The ticket is in preparation": "El ticket [{{ticketId}}]({{{ticketUrl}}}) del comercial {{salesPersonId}} está en preparación", - "Incoterms data for consignee is missing": "Faltan los datos de los Incoterms para el consignatario", "The notification subscription of this worker cant be modified": "La subscripción a la notificación de este trabajador no puede ser modificada", "User disabled": "Usuario desactivado", "The amount cannot be less than the minimum": "La cantidad no puede ser menor que la cantidad mínima", @@ -348,4 +347,4 @@ "Cmr file does not exist": "El archivo del cmr no existe", "You are not allowed to modify the alias": "No estás autorizado a modificar el alias", "The address of the customer must have information about Incoterms and Customs Agent": "El consignatario del cliente debe tener informado Incoterms y Agente de aduanas" -} +} \ No newline at end of file diff --git a/loopback/server/connectors/vn-mysql.js b/loopback/server/connectors/vn-mysql.js index 737fd94d5..5edef4395 100644 --- a/loopback/server/connectors/vn-mysql.js +++ b/loopback/server/connectors/vn-mysql.js @@ -275,7 +275,7 @@ class VnMySQL extends MySQL { } invokeMethod(method, args, model, ctx, opts, cb) { - if (!this.isLoggable(model)) + if (!this.isLoggable(model) && !opts?.userId) return super[method].apply(this, args); this.invokeMethodP(method, [...args], model, ctx, opts) @@ -287,11 +287,11 @@ class VnMySQL extends MySQL { let tx; if (!opts.transaction) { tx = await Transaction.begin(this, {}); - opts = Object.assign({transaction: tx, httpCtx: opts.httpCtx}, opts); + opts = Object.assign({transaction: tx}, opts); } try { - const userId = opts.httpCtx && opts.httpCtx.active?.accessToken?.userId; + const {userId} = opts; if (userId) { const user = await Model.app.models.VnUser.findById(userId, {fields: ['name']}, opts); await this.executeP(`CALL account.myUser_loginWithName(?)`, [user.name], opts); diff --git a/loopback/util/validateIban.js b/loopback/util/validateIban.js index ed3e00426..2386538b5 100644 --- a/loopback/util/validateIban.js +++ b/loopback/util/validateIban.js @@ -3,7 +3,6 @@ module.exports = function(iban, countryCode) { if (typeof iban != 'string') return false; if (countryCode?.toLowerCase() != 'es') return true; - iban = iban.toUpperCase(); iban = trim(iban); iban = iban.replace(/\s/g, ''); diff --git a/modules/claim/back/methods/claim-state/specs/isEditable.spec.js b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js index 1fb8e1536..6d97eed06 100644 --- a/modules/claim/back/methods/claim-state/specs/isEditable.spec.js +++ b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js @@ -64,7 +64,7 @@ describe('claimstate isEditable()', () => { const options = {transaction: tx}; const ctx = {req: {accessToken: {userId: claimManagerId}}}; - const result = await app.models.ClaimState.isEditable(ctx, 7, options); + const result = await app.models.ClaimState.isEditable(ctx, 5, options); expect(result).toEqual(true); diff --git a/modules/claim/back/methods/claim/specs/updateClaim.spec.js b/modules/claim/back/methods/claim/specs/updateClaim.spec.js index e2d5fcfeb..bd77ae406 100644 --- a/modules/claim/back/methods/claim/specs/updateClaim.spec.js +++ b/modules/claim/back/methods/claim/specs/updateClaim.spec.js @@ -21,12 +21,13 @@ describe('Update Claim', () => { claimStatesMap = claimStates.reduce((acc, state) => ({...acc, [state.code]: state.id}), {}); }); const newDate = Date.vnNew(); + const claimManagerId = 72; const originalData = { ticketFk: 3, clientFk: 1101, ticketCreated: newDate, workerFk: 18, - claimStateFk: 2, + claimStateFk: 5, isChargedToMana: true, responsibility: 4, observation: 'observation' @@ -77,7 +78,6 @@ describe('Update Claim', () => { spyOn(chatModel, 'sendCheckingPresence').and.callThrough(); const pendingState = claimStatesMap.pending; - const claimManagerId = 72; const ctx = { req: { accessToken: {userId: claimManagerId}, @@ -104,85 +104,7 @@ describe('Update Claim', () => { } }); - it(`should success to update the claimState to 'managed' and send a rocket message`, async() => { - const tx = await app.models.Claim.beginTransaction({}); - - try { - const options = {transaction: tx}; - - const newClaim = await app.models.Claim.create(originalData, options); - - const chatModel = app.models.Chat; - spyOn(chatModel, 'sendCheckingPresence').and.callThrough(); - - const managedState = claimStatesMap.managed; - const claimManagerId = 72; - const ctx = { - req: { - accessToken: {userId: claimManagerId}, - headers: {origin: url} - }, - args: { - observation: 'valid observation', - claimStateFk: managedState, - hasToPickUp: false - } - }; - ctx.req.__ = i18n.__; - await app.models.Claim.updateClaim(ctx, newClaim.id, options); - - let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options); - - expect(updatedClaim.observation).toEqual(ctx.args.observation); - expect(chatModel.sendCheckingPresence).toHaveBeenCalled(); - - await tx.rollback(); - } catch (e) { - await tx.rollback(); - throw e; - } - }); - - it(`should success to update the claimState to 'resolved' and send a rocket message`, async() => { - const tx = await app.models.Claim.beginTransaction({}); - - try { - const options = {transaction: tx}; - - const newClaim = await app.models.Claim.create(originalData, options); - - const chatModel = app.models.Chat; - spyOn(chatModel, 'sendCheckingPresence').and.callThrough(); - - const resolvedState = claimStatesMap.resolved; - const claimManagerId = 72; - const ctx = { - req: { - accessToken: {userId: claimManagerId}, - headers: {origin: url} - }, - args: { - observation: 'valid observation', - claimStateFk: resolvedState, - hasToPickUp: false - } - }; - ctx.req.__ = i18n.__; - await app.models.Claim.updateClaim(ctx, newClaim.id, options); - - let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options); - - expect(updatedClaim.observation).toEqual(ctx.args.observation); - expect(chatModel.sendCheckingPresence).toHaveBeenCalled(); - - await tx.rollback(); - } catch (e) { - await tx.rollback(); - throw e; - } - }); - - it(`should success to update the claimState to 'canceled' and send a rocket message`, async() => { + it(`should success to update the claimState to 'canceled' and send two rocket message`, async() => { const tx = await app.models.Claim.beginTransaction({}); try { @@ -194,7 +116,6 @@ describe('Update Claim', () => { spyOn(chatModel, 'sendCheckingPresence').and.callThrough(); const canceledState = claimStatesMap.canceled; - const claimManagerId = 72; const ctx = { req: { accessToken: {userId: claimManagerId}, @@ -212,46 +133,7 @@ describe('Update Claim', () => { let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options); expect(updatedClaim.observation).toEqual(ctx.args.observation); - expect(chatModel.sendCheckingPresence).toHaveBeenCalled(); - - await tx.rollback(); - } catch (e) { - await tx.rollback(); - throw e; - } - }); - - it(`should success to update the claimState to 'incomplete' and send a rocket message`, async() => { - const tx = await app.models.Claim.beginTransaction({}); - - try { - const options = {transaction: tx}; - - const newClaim = await app.models.Claim.create(originalData, options); - - const chatModel = app.models.Chat; - spyOn(chatModel, 'sendCheckingPresence').and.callThrough(); - - const incompleteState = 5; - const claimManagerId = 72; - const ctx = { - req: { - accessToken: {userId: claimManagerId}, - headers: {origin: url} - }, - args: { - observation: 'valid observation', - claimStateFk: incompleteState, - hasToPickUp: false - } - }; - ctx.req.__ = i18n.__; - await app.models.Claim.updateClaim(ctx, newClaim.id, options); - - let updatedClaim = await app.models.Claim.findById(newClaim.id, null, options); - - expect(updatedClaim.observation).toEqual(ctx.args.observation); - expect(chatModel.sendCheckingPresence).toHaveBeenCalled(); + expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(2); await tx.rollback(); } catch (e) { diff --git a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js index 2f16d002c..99436fed6 100644 --- a/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js +++ b/modules/claim/back/methods/claim/specs/updateClaimAction.spec.js @@ -21,7 +21,7 @@ describe('Update Claim', () => { clientFk: 1101, ticketCreated: newDate, workerFk: 18, - claimStateFk: 2, + claimStateFk: 1, isChargedToMana: true, responsibility: 4, observation: 'observation' diff --git a/modules/claim/back/model-config.json b/modules/claim/back/model-config.json index 83d88039c..d90ed4c1e 100644 --- a/modules/claim/back/model-config.json +++ b/modules/claim/back/model-config.json @@ -43,8 +43,5 @@ }, "ClaimObservation": { "dataSource": "vn" - }, - "ClaimRma": { - "dataSource": "vn" - } + } } diff --git a/modules/claim/back/models/claim-rma.js b/modules/claim/back/models/claim-rma.js deleted file mode 100644 index 6a93613bd..000000000 --- a/modules/claim/back/models/claim-rma.js +++ /dev/null @@ -1,9 +0,0 @@ -const LoopBackContext = require('loopback-context'); - -module.exports = Self => { - Self.observe('before save', async function(ctx) { - const changes = ctx.data || ctx.instance; - const loopBackContext = LoopBackContext.getCurrentContext(); - changes.workerFk = loopBackContext.active.accessToken.userId; - }); -}; diff --git a/modules/claim/back/models/claim.json b/modules/claim/back/models/claim.json index b85b9e073..1fbbb00b1 100644 --- a/modules/claim/back/models/claim.json +++ b/modules/claim/back/models/claim.json @@ -45,9 +45,6 @@ }, "packages": { "type": "number" - }, - "rma": { - "type": "string" } }, "relations": { @@ -56,12 +53,6 @@ "model": "ClaimState", "foreignKey": "claimStateFk" }, - "rmas": { - "type": "hasMany", - "model": "ClaimRma", - "foreignKey": "code", - "primaryKey": "rma" - }, "client": { "type": "belongsTo", "model": "Client", diff --git a/modules/client/back/methods/client/createReceipt.js b/modules/client/back/methods/client/createReceipt.js index b70b9bbe0..debdaf066 100644 --- a/modules/client/back/methods/client/createReceipt.js +++ b/modules/client/back/methods/client/createReceipt.js @@ -69,7 +69,7 @@ module.exports = function(Self) { delete args.ctx; // Remove unwanted properties const originalClient = await models.Client.findById(args.clientFk, null, myOptions); - const bank = await models.Bank.findById(args.bankFk, null, myOptions); + const bank = await models.Accounting.findById(args.bankFk, null, myOptions); const accountingType = await models.AccountingType.findById(bank.accountingTypeFk, null, myOptions); if (accountingType.code == 'compensation') { diff --git a/modules/client/back/methods/receipt/balanceCompensationEmail.js b/modules/client/back/methods/receipt/balanceCompensationEmail.js index afae5dabc..994d5124a 100644 --- a/modules/client/back/methods/receipt/balanceCompensationEmail.js +++ b/modules/client/back/methods/receipt/balanceCompensationEmail.js @@ -28,7 +28,7 @@ module.exports = Self => { const models = Self.app.models; const receipt = await models.Receipt.findById(id, {fields: ['clientFk', 'bankFk']}); - const bank = await models.Bank.findById(receipt.bankFk); + const bank = await models.Accounting.findById(receipt.bankFk); if (!bank) throw new UserError(`Receipt's bank was not found`); diff --git a/modules/client/back/models/receipt.json b/modules/client/back/models/receipt.json index da7879df9..6ade21ac5 100644 --- a/modules/client/back/models/receipt.json +++ b/modules/client/back/models/receipt.json @@ -60,7 +60,7 @@ }, "bank": { "type": "belongsTo", - "model": "Bank", + "model": "Accounting", "foreignKey": "bankFk" }, "supplier": { diff --git a/modules/client/back/models/till.json b/modules/client/back/models/till.json index 4b86e50e2..6677b27d4 100644 --- a/modules/client/back/models/till.json +++ b/modules/client/back/models/till.json @@ -46,7 +46,7 @@ "relations": { "bank": { "type": "belongsTo", - "model": "Bank", + "model": "Accounting", "foreignKey": "bankFk" }, "worker": { diff --git a/modules/client/front/balance/create/index.html b/modules/client/front/balance/create/index.html index 27b182c9a..25789b01a 100644 --- a/modules/client/front/balance/create/index.html +++ b/modules/client/front/balance/create/index.html @@ -29,7 +29,7 @@ { const result = await models.Entry.filter(ctx, options); - expect(result.length).toEqual(8); + expect(result.length).toEqual(9); await tx.rollback(); } catch (e) { @@ -81,7 +81,7 @@ describe('Entry filter()', () => { const result = await models.Entry.filter(ctx, options); - expect(result.length).toEqual(7); + expect(result.length).toEqual(8); await tx.rollback(); } catch (e) { diff --git a/modules/invoiceIn/back/models/invoice-in-due-day.json b/modules/invoiceIn/back/models/invoice-in-due-day.json index d2cffc81b..ca3616ef8 100644 --- a/modules/invoiceIn/back/models/invoice-in-due-day.json +++ b/modules/invoiceIn/back/models/invoice-in-due-day.json @@ -34,7 +34,7 @@ "relations": { "bank": { "type": "belongsTo", - "model": "Bank", + "model": "Accounting", "foreignKey": "bankFk" } } diff --git a/modules/invoiceIn/front/dueDay/index.html b/modules/invoiceIn/front/dueDay/index.html index 1a1935e72..abc91312d 100644 --- a/modules/invoiceIn/front/dueDay/index.html +++ b/modules/invoiceIn/front/dueDay/index.html @@ -23,7 +23,7 @@ { require('../methods/invoiceOut/filter')(Self); @@ -66,4 +67,24 @@ module.exports = Self => { }); } }; + + Self.getSerial = async function(clientId, companyId, addressId, type, myOptions) { + const [{serial}] = await Self.rawSql( + `SELECT vn.invoiceSerial(?, ?, ?) AS serial`, + [ + clientId, + companyId, + type + ], + myOptions); + + const invoiceOutSerial = await Self.app.models.InvoiceOutSerial.findById(serial); + if (invoiceOutSerial?.taxAreaFk == 'WORLD') { + const address = await Self.app.models.Address.findById(addressId); + if (!address || !address.customsAgentFk || !address.incotermsFk) + throw new UserError('The address of the customer must have information about Incoterms and Customs Agent'); + } + + return serial; + }; }; diff --git a/modules/item/back/methods/item-barcode/delete.js b/modules/item/back/methods/item-barcode/delete.js new file mode 100644 index 000000000..0eea651d3 --- /dev/null +++ b/modules/item/back/methods/item-barcode/delete.js @@ -0,0 +1,34 @@ +module.exports = Self => { + Self.remoteMethod('delete', { + description: 'Delete an ItemBarcode by itemFk and code', + accessType: 'WRITE', + accepts: [ + { + arg: 'barcode', + type: 'string', + required: true, + }, + { + arg: 'itemFk', + type: 'number', + required: true, + } + ], + http: { + path: `/delete`, + verb: 'DELETE' + } + }); + + Self.delete = async(barcode, itemFk, options) => { + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + await Self.destroyAll({ + code: barcode, + itemFk + }, myOptions); + }; +}; diff --git a/modules/item/back/methods/item-barcode/specs/delete.spec.js b/modules/item/back/methods/item-barcode/specs/delete.spec.js new file mode 100644 index 000000000..094a351a3 --- /dev/null +++ b/modules/item/back/methods/item-barcode/specs/delete.spec.js @@ -0,0 +1,22 @@ +const {models} = require('vn-loopback/server/server'); + +describe('itemBarcode delete()', () => { + it('should delete a record by itemFk and code', async() => { + const tx = await models.ItemBarcode.beginTransaction({}); + const options = {transaction: tx}; + const itemFk = 1; + const code = 1111111111; + + try { + const itemsBarcodeBefore = await models.ItemBarcode.find({}, options); + await models.ItemBarcode.delete(code, itemFk, options); + const itemsBarcodeAfter = await models.ItemBarcode.find({}, options); + + expect(itemsBarcodeBefore.length).toBeGreaterThan(itemsBarcodeAfter.length); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/item/back/methods/item-shelving/getAlternative.js b/modules/item/back/methods/item-shelving/getAlternative.js new file mode 100644 index 000000000..8108bfa6e --- /dev/null +++ b/modules/item/back/methods/item-shelving/getAlternative.js @@ -0,0 +1,64 @@ +module.exports = Self => { + Self.remoteMethod('getAlternative', { + description: 'Returns a list of items and possible alternative locations', + accessType: 'READ', + accepts: [{ + arg: 'shelvingFk', + type: 'string', + required: true, + }], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/getAlternative`, + verb: 'GET' + } + }); + + Self.getAlternative = async(shelvingFk, options) => { + const models = Self.app.models; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const filterItemShelvings = { + fields: ['id', 'visible', 'itemFk', 'shelvingFk'], + where: {shelvingFk}, + include: [ + { + relation: 'item', + scope: { + fields: ['longName', 'name', 'size'] + } + }, + + ] + }; + + let itemShelvings = await models.ItemShelving.find(filterItemShelvings, myOptions); + + if (itemShelvings) { + const [alternatives] = await models.ItemShelving.rawSql('CALL vn.itemShelving_getAlternatives(?)', + [shelvingFk], myOptions + ); + return itemShelvings.map(itemShelving => { + const item = itemShelving.item(); + + const shelvings = alternatives.filter(alternative => alternative.itemFk == itemShelving.itemFk); + + return { + id: itemShelving.id, + itemFk: itemShelving.itemFk, + name: item.name, + size: item.size, + longName: item.longName, + quantity: itemShelving.visible, + shelvings + }; + }); + } + }; +}; diff --git a/modules/item/back/methods/item-shelving/specs/getAlternative.spec.js b/modules/item/back/methods/item-shelving/specs/getAlternative.spec.js new file mode 100644 index 000000000..3f4917477 --- /dev/null +++ b/modules/item/back/methods/item-shelving/specs/getAlternative.spec.js @@ -0,0 +1,25 @@ +const {models} = require('vn-loopback/server/server'); + +describe('itemShelving getAlternative()', () => { + beforeAll(async() => { + ctx = { + req: { + headers: {origin: 'http://localhost'}, + } + }; + }); + + it('should return a list of items without alternatives', async() => { + const shelvingFk = 'HEJ'; + const itemShelvings = await models.ItemShelving.getAlternative(shelvingFk); + + expect(itemShelvings[0].shelvings.length).toEqual(0); + }); + + it('should return an empty list', async() => { + const shelvingFk = 'ZZP'; + const itemShelvings = await models.ItemShelving.getAlternative(shelvingFk); + + expect(itemShelvings.length).toEqual(0); + }); +}); diff --git a/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js new file mode 100644 index 000000000..dfa294000 --- /dev/null +++ b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js @@ -0,0 +1,22 @@ +const {models} = require('vn-loopback/server/server'); + +describe('itemShelving updateFromSale()', () => { + it('should update the quantity', async() => { + const tx = await models.ItemBarcode.beginTransaction({}); + const options = {transaction: tx}; + const saleFk = 2; + const filter = {where: {itemFk: 4, shelvingFk: 'HEJ'} + }; + try { + const {visible: visibleBefore} = await models.ItemShelving.findOne(filter, options); + await models.ItemShelving.updateFromSale(saleFk, options); + const {visible: visibleAfter} = await models.ItemShelving.findOne(filter, options); + + expect(visibleAfter).toEqual(visibleBefore + 5); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/item/back/methods/item-shelving/updateFromSale.js b/modules/item/back/methods/item-shelving/updateFromSale.js new file mode 100644 index 000000000..2b9f49cae --- /dev/null +++ b/modules/item/back/methods/item-shelving/updateFromSale.js @@ -0,0 +1,48 @@ +module.exports = Self => { + Self.remoteMethod('updateFromSale', { + description: 'Update the visible items', + accessType: 'WRITE', + accepts: [{ + arg: 'saleFk', + type: 'number', + required: true, + }], + http: { + path: `/updateFromSale`, + verb: 'POST' + } + }); + + Self.updateFromSale = async(saleFk, options) => { + const models = Self.app.models; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const itemShelvingSale = await models.ItemShelvingSale.findOne({ + where: {saleFk}, + include: {relation: 'itemShelving'} + }, myOptions); + + const itemShelving = itemShelvingSale.itemShelving(); + const quantity = itemShelving.visible + itemShelvingSale.quantity; + + await itemShelving.updateAttributes( + {visible: quantity}, + myOptions + ); + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/item/back/methods/item/get.js b/modules/item/back/methods/item/get.js new file mode 100644 index 000000000..38b37a90c --- /dev/null +++ b/modules/item/back/methods/item/get.js @@ -0,0 +1,48 @@ +module.exports = Self => { + Self.remoteMethod('get', { + description: 'Get the data from an item', + accessType: 'READ', + http: { + path: `/get`, + verb: 'GET' + }, + accepts: [ + { + arg: 'barcode', + type: 'number', + required: true, + }, + { + arg: 'warehouseFk', + type: 'number', + required: true, + } + ], + returns: { + type: ['object'], + root: true + }, + }); + + Self.get = async(barcode, warehouseFk, options) => { + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const models = Self.app.models; + + const [[itemInfo]] = await Self.rawSql('CALL vn.item_getInfo(?, ?)', [barcode, warehouseFk], myOptions); + + if (itemInfo) { + itemInfo.barcodes = await models.ItemBarcode.find({ + fields: ['code'], + where: { + itemFk: itemInfo.id + } + }); + } + + return itemInfo; + }; +}; diff --git a/modules/item/back/methods/item/specs/get.spec.js b/modules/item/back/methods/item/specs/get.spec.js new file mode 100644 index 000000000..55262004a --- /dev/null +++ b/modules/item/back/methods/item/specs/get.spec.js @@ -0,0 +1,12 @@ +const {models} = require('vn-loopback/server/server'); + +describe('item get()', () => { + const barcode = 1; + const warehouseFk = 1; + it('should get an item with several barcodes', async() => { + const card = await models.Item.get(barcode, warehouseFk); + + expect(card).toBeDefined(); + expect(card.barcodes.length).toBeTruthy(); + }); +}); diff --git a/modules/item/back/models/item-barcode.js b/modules/item/back/models/item-barcode.js index b608a7fe9..616d973e1 100644 --- a/modules/item/back/models/item-barcode.js +++ b/modules/item/back/models/item-barcode.js @@ -1,5 +1,6 @@ module.exports = Self => { require('../methods/item-barcode/toItem')(Self); + require('../methods/item-barcode/delete')(Self); Self.validatesUniquenessOf('code', { message: `Barcode must be unique` diff --git a/modules/item/back/models/item-shelving.js b/modules/item/back/models/item-shelving.js index c031d8271..53e57dcee 100644 --- a/modules/item/back/models/item-shelving.js +++ b/modules/item/back/models/item-shelving.js @@ -2,4 +2,6 @@ module.exports = Self => { require('../methods/item-shelving/deleteItemShelvings')(Self); require('../methods/item-shelving/upsertItem')(Self); require('../methods/item-shelving/getInventory')(Self); + require('../methods/item-shelving/getAlternative')(Self); + require('../methods/item-shelving/updateFromSale')(Self); }; diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index f3be98fc4..893a1f81d 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -54,7 +54,8 @@ "shelving": { "type": "belongsTo", "model": "Shelving", - "foreignKey": "shelvingFk" - } + "foreignKey": "shelvingFk", + "primaryKey": "code" + } } } diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js index eac1ecb7d..e715ab431 100644 --- a/modules/item/back/models/item.js +++ b/modules/item/back/models/item.js @@ -17,6 +17,7 @@ module.exports = Self => { require('../methods/item/buyerWasteEmail')(Self); require('../methods/item/labelPdf')(Self); require('../methods/item/setVisibleDiscard')(Self); + require('../methods/item/get')(Self); Self.validatesPresenceOf('originFk', {message: 'Cannot be blank'}); diff --git a/modules/parking/back/model-config.json b/modules/parking/back/model-config.json new file mode 100644 index 000000000..5c0d3d916 --- /dev/null +++ b/modules/parking/back/model-config.json @@ -0,0 +1,5 @@ +{ + "ParkingLog": { + "dataSource": "vn" + } +} diff --git a/modules/parking/back/models/parking-log.json b/modules/parking/back/models/parking-log.json new file mode 100644 index 000000000..1bbb031d8 --- /dev/null +++ b/modules/parking/back/models/parking-log.json @@ -0,0 +1,9 @@ +{ + "name": "ParkingLog", + "base": "Log", + "options": { + "mysql": { + "table": "parkingLog" + } + } +} diff --git a/modules/shelving/back/locale/parking/en.yml b/modules/shelving/back/locale/parking/en.yml new file mode 100644 index 000000000..5ef6add52 --- /dev/null +++ b/modules/shelving/back/locale/parking/en.yml @@ -0,0 +1,9 @@ +name: parking +columns: + id: id + column: column + row: row + sectorFk: sector + code: code + pickingOrder: picking order + editorFk: editor \ No newline at end of file diff --git a/modules/shelving/back/locale/parking/es.yml b/modules/shelving/back/locale/parking/es.yml new file mode 100644 index 000000000..d4dd7bb2c --- /dev/null +++ b/modules/shelving/back/locale/parking/es.yml @@ -0,0 +1,10 @@ +name: parking +columns: + id: id + column: columna + row: fila + sectorFk: sector + code: código + pickingOrder: orden de recogida + editorFk: editor + \ No newline at end of file diff --git a/modules/shelving/back/methods/shelving/addLog.js b/modules/shelving/back/methods/shelving/addLog.js new file mode 100644 index 000000000..fe6d8b8da --- /dev/null +++ b/modules/shelving/back/methods/shelving/addLog.js @@ -0,0 +1,56 @@ +const UserError = require('vn-loopback/util/user-error'); + +module.exports = Self => { + Self.remoteMethodCtx('addLog', { + description: 'Add a new log', + accessType: 'WRITE', + accepts: { + arg: 'code', + type: 'string', + required: true, + }, + http: { + path: '/addLog', + verb: 'POST' + } + }); + Self.addLog = async(ctx, code, options) => { + const userId = ctx.req.accessToken.userId; + const $t = ctx.req.__; + const models = Self.app.models; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const shelving = await Self.findOne({ + where: { + code + } + }, myOptions); + + if (!shelving) throw new UserError($t('Shelving not valid')); + + await models.ShelvingLog.create({ + changedModel: 'Shelving', + originFk: shelving.id, + changedModelId: shelving.id, + action: 'select', + userFk: userId + + }, myOptions); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/shelving/back/methods/shelving/specs/addLog.spec.js b/modules/shelving/back/methods/shelving/specs/addLog.spec.js new file mode 100644 index 000000000..d538c24ec --- /dev/null +++ b/modules/shelving/back/methods/shelving/specs/addLog.spec.js @@ -0,0 +1,46 @@ +const {models} = require('vn-loopback/server/server'); + +describe('shelving addLog()', () => { + beforeAll(async() => { + ctx = { + req: { + headers: {origin: 'http://localhost'}, + accessToken: {userId: 66}, + __: value => value + } + }; + }); + + it('should add a log', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + const code = 'AA6'; + + try { + const shelvingLogsBefore = await models.ShelvingLog.find(null, options); + await models.Shelving.addLog(ctx, code, options); + const shelvingLogsAfter = await models.ShelvingLog.find(null, options); + + expect(shelvingLogsAfter.length).toEqual(shelvingLogsBefore.length + 1); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should throw an error when the code does not exist', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + const code = 'DXI345'; + + try { + await models.Shelving.addLog(ctx, code, options); + + await tx.rollback(); + } catch (e) { + expect(e.message).toEqual('Shelving not valid'); + await tx.rollback(); + } + }); +}); diff --git a/modules/shelving/back/models/parking.json b/modules/shelving/back/models/parking.json index 53fec6e69..47a3305ae 100644 --- a/modules/shelving/back/models/parking.json +++ b/modules/shelving/back/models/parking.json @@ -20,9 +20,6 @@ "type": "string", "required": true }, - "sectorFk": { - "type": "number" - }, "code": { "type": "string" }, @@ -35,6 +32,11 @@ "type": "hasMany", "model": "saleGroup", "foreignKey": "parkingFk" + }, + "sector": { + "type": "belongsTo", + "model": "Sector", + "foreignKey": "sectorFk" } } } diff --git a/modules/shelving/back/models/shelving.js b/modules/shelving/back/models/shelving.js index 3e27f5863..bf611d2ba 100644 --- a/modules/shelving/back/models/shelving.js +++ b/modules/shelving/back/models/shelving.js @@ -1,3 +1,4 @@ module.exports = Self => { require('../methods/shelving/getSummary')(Self); + require('../methods/shelving/addLog')(Self); }; diff --git a/modules/ticket/back/methods/sale-tracking/delete.js b/modules/ticket/back/methods/sale-tracking/delete.js index 0b977e5d4..fda21a014 100644 --- a/modules/ticket/back/methods/sale-tracking/delete.js +++ b/modules/ticket/back/methods/sale-tracking/delete.js @@ -2,7 +2,7 @@ module.exports = Self => { Self.remoteMethod('delete', { description: 'Delete sale trackings and item shelving sales', - accessType: 'READ', + accessType: 'WRITE', accepts: [ { arg: 'saleFk', @@ -10,21 +10,17 @@ module.exports = Self => { description: 'The sale id' }, { - arg: 'stateCode', - type: 'string' - } + arg: 'stateCodes', + type: ['string'] + }, ], - returns: { - type: ['object'], - root: true - }, http: { path: `/delete`, verb: 'POST' } }); - Self.delete = async(saleFk, stateCode, options) => { + Self.delete = async(saleFk, stateCodes, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -38,20 +34,24 @@ module.exports = Self => { } try { - if (stateCode === 'PREPARED') { - const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions); - for (let itemShelvingSale of itemShelvingSales) - await itemShelvingSale.destroy(myOptions); - } + const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions); - const state = await models.State.findOne({ - where: {code: stateCode} + for (let itemShelvingSale of itemShelvingSales) + await itemShelvingSale.destroy(myOptions); + + const states = await models.State.find({ + fields: ['id'], + where: { + code: {inq: stateCodes} + } }, myOptions); + const stateIds = states.map(state => state.id); + const filter = { where: { saleFk: saleFk, - stateFk: state.id + stateFk: {inq: stateIds} } }; const saleTrackings = await models.SaleTracking.find(filter, myOptions); @@ -59,8 +59,6 @@ module.exports = Self => { await saleTracking.destroy(myOptions); if (tx) await tx.commit(); - - return true; } catch (e) { if (tx) await tx.rollback(); throw e; diff --git a/modules/ticket/back/methods/sale-tracking/setPicked.js b/modules/ticket/back/methods/sale-tracking/setPicked.js new file mode 100644 index 000000000..828f6eb7e --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/setPicked.js @@ -0,0 +1,106 @@ +const UserError = require('vn-loopback/util/user-error'); + +module.exports = Self => { + Self.remoteMethodCtx('setPicked', { + description: 'Add the sales line of the item and set the tracking.', + accessType: 'WRITE', + accepts: [ + { + arg: 'saleFk', + type: 'number', + required: true + }, + { + arg: 'originalQuantity', + type: 'number', + required: true + }, + { + arg: 'code', + type: 'string', + required: true + }, + { + arg: 'isChecked', + type: 'boolean', + required: true + }, + { + arg: 'buyFk', + type: 'number', + required: true + }, + { + arg: 'isScanned', + type: 'boolean', + }, + { + arg: 'quantity', + type: 'number', + required: true + }, + { + arg: 'itemShelvingFk', + type: 'number', + required: true + } + ], + http: { + path: `/setPicked`, + verb: 'POST' + } + }); + + Self.setPicked = async(ctx, saleFk, originalQuantity, code, isChecked, buyFk, isScanned, quantity, itemShelvingFk, options) => { + const userId = ctx.req.accessToken.userId; + const models = Self.app.models; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + await models.ItemShelvingSale.create({ + itemShelvingFk, + saleFk, + quantity, + userFk: userId + }, myOptions); + + const itemShelving = await models.ItemShelving.findById(itemShelvingFk, null, myOptions); + + await itemShelving.updateAttributes({visible: itemShelving.visible - quantity}, myOptions); + + await Self.updateAll( + {saleFk}, + {isChecked: true}, + myOptions + ); + + await Self.updateTracking(ctx, saleFk, originalQuantity, code, isChecked, null, isScanned, myOptions); + + try { + const {itemOriginalFk} = await models.Buy.findById(buyFk, {fields: ['itemOriginalFk']}, myOptions); + if (itemOriginalFk) await models.SaleBuy.create({saleFk, buyFk}, myOptions); + } catch (e) { + throw new UserError('The sale cannot be tracked'); + } + + if (tx) await tx.commit(); + } catch (e) { + if (e.message == 'The sale cannot be tracked') { + if (tx) tx.commit(); + throw e; + } + + if (tx) await tx.rollback(); + throw new UserError('The line could not be marked'); + } + }; +}; diff --git a/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js index a8bcf5692..bb66db4f3 100644 --- a/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js +++ b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js @@ -11,13 +11,12 @@ describe('sale-tracking delete()', () => { const saleTrackingsBefore = await models.SaleTracking.find(null, options); const saleFk = 1; - const stateCode = 'PREPARED'; - const result = await models.SaleTracking.delete(saleFk, stateCode, options); + const stateCode = ['PREPARED']; + await models.SaleTracking.delete(saleFk, stateCode, options); const itemShelvingsAfter = await models.ItemShelvingSale.find(null, options); const saleTrackingsAfter = await models.SaleTracking.find(null, options); - expect(result).toEqual(true); expect(saleTrackingsAfter.length).toBeLessThan(saleTrackingsBefore.length); expect(itemShelvingsAfter.length).toBeLessThan(itemShelvingsBefore.length); diff --git a/modules/ticket/back/methods/sale-tracking/specs/setPicked.spec.js b/modules/ticket/back/methods/sale-tracking/specs/setPicked.spec.js new file mode 100644 index 000000000..0cf2ccbeb --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/specs/setPicked.spec.js @@ -0,0 +1,114 @@ +const {models} = require('vn-loopback/server/server'); +describe('saleTracking setPicked()', () => { + const saleFk = 1; + const originalQuantity = 10; + const code = 'PREPARED'; + const isChecked = true; + const buyFk = 1; + const isScanned = false; + const quantity = 1; + const itemShelvingFk = 1; + + beforeAll(async() => { + ctx = { + req: { + accessToken: {userId: 104}, + headers: {origin: 'http://localhost'}, + __: value => value + } + }; + }); + + it('should throw an error if the line was not able to be marked', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + const code = 'FAKESTATE'; + try { + await models.SaleTracking.setPicked( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + quantity, + itemShelvingFk, + options + ); + + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toEqual('The line could not be marked'); + await tx.rollback(); + } + }); + + it('should throw an error if there are duplicate salebuys', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + try { + await models.SaleTracking.setPicked( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + quantity, + itemShelvingFk, + options + ); + + await models.SaleTracking.setPicked( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + quantity, + itemShelvingFk, + options + ); + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toEqual('The sale cannot be tracked'); + await tx.rollback(); + } + }); + + it('should add an itemShelvingSale and Modify a saleTracking', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + try { + const itemShelvingSaleBefore = await models.ItemShelvingSale.find({}, options); + await models.SaleTracking.setPicked( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + quantity, + itemShelvingFk, + options + ); + const itemShelvingSaleAfter = await models.ItemShelvingSale.find({}, options); + const saleTracking = await models.SaleTracking.findOne({where: {saleFk, isChecked: false}}, options); + + expect(itemShelvingSaleAfter.length).toEqual(itemShelvingSaleBefore.length + 1); + expect(saleTracking.isChecked).toBeFalse(); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + } + }); +}); diff --git a/modules/ticket/back/methods/sale-tracking/specs/updateTracking.spec.js b/modules/ticket/back/methods/sale-tracking/specs/updateTracking.spec.js new file mode 100644 index 000000000..44bd1a60a --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/specs/updateTracking.spec.js @@ -0,0 +1,104 @@ +const {models} = require('vn-loopback/server/server'); + +describe('saleTracking updateTracking()', () => { + const saleFk = 1; + const originalQuantity = 10; + const code = 'PREPARED'; + const isChecked = true; + const buyFk = 1; + const isScanned = false; + + beforeAll(async() => { + ctx = { + req: { + accessToken: {userId: 104}, + headers: {origin: 'http://localhost'}, + __: value => value + } + }; + }); + + it('should throw an error if the state does not exist', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + const code = 'FAKESTATE'; + try { + await models.SaleTracking.updateTracking( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + options + ); + + await tx.rollback(); + } catch (e) { + const error = e; + + expect(error.message).toEqual('this state does not exist'); + await tx.rollback(); + } + }); + + it('should add a new saleTracking and saleBuy', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + + try { + const saleTrackingBefore = await models.SaleTracking.find(null, options); + const saleBuyBefore = await models.SaleBuy.find(null, options); + await models.SaleTracking.updateTracking( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + options + ); + + const saleTrackingAfter = await models.SaleTracking.find(null, options); + const saleBuyAfter = await models.SaleBuy.find(null, options); + + expect(saleTrackingAfter.length).toEqual(saleTrackingBefore.length + 1); + expect(saleBuyAfter.length).toEqual(saleBuyBefore.length + 1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should only update a saleTracking', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + const options = {transaction: tx}; + const saleFk = 2; + + try { + const saleTrackingBefore = await models.SaleTracking.find(null, options); + await models.SaleTracking.updateTracking( + ctx, + saleFk, + originalQuantity, + code, + isChecked, + buyFk, + isScanned, + options + ); + const saleTrackingAfter = await models.SaleTracking.find(null, options); + + expect(saleTrackingAfter.length).toEqual(saleTrackingBefore.length + 1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/ticket/back/methods/sale-tracking/updateTracking.js b/modules/ticket/back/methods/sale-tracking/updateTracking.js new file mode 100644 index 000000000..f58429790 --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/updateTracking.js @@ -0,0 +1,110 @@ +const UserError = require('vn-loopback/util/user-error'); +module.exports = Self => { + Self.remoteMethodCtx('updateTracking', { + description: 'Modify a saleTracking record and, if applicable, add a corresponding record in saleBuy.', + accessType: 'WRITE', + accepts: [ + { + arg: 'saleFk', + type: 'number', + required: true + }, + { + arg: 'originalQuantity', + type: 'number', + required: true + }, + { + arg: 'code', + type: 'string', + required: true + }, + { + arg: 'isChecked', + type: 'boolean', + required: true + }, + { + arg: 'buyFk', + type: 'number', + required: true + }, + { + arg: 'isScanned', + type: 'boolean', + }, + ], + http: { + path: `/updateTracking`, + verb: 'POST' + } + }); + + Self.updateTracking = async(ctx, saleFk, originalQuantity, code, isChecked, buyFk, isScanned = null, options) => { + const userId = ctx.req.accessToken.userId; + const models = Self.app.models; + const myOptions = {userId}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const state = await models.State.findOne({ + where: {code}, + }, myOptions); + + if (!state) throw new UserError('this state does not exist'); + const uniqueAttributes = { + saleFk, + workerFk: userId, + stateFk: state?.id, + }; + const attributes = { + isChecked, + originalQuantity, + isScanned + }; + + const saleTracking = await models.SaleTracking.findOne({ + where: uniqueAttributes, + }, myOptions); + + if (!saleTracking) { + await models.SaleTracking.create({ + ...uniqueAttributes, + ...attributes + }, myOptions); + } else { + await saleTracking.updateAttributes({ + ...attributes + }, myOptions); + } + + let isBuy; + if (buyFk) { + isBuy = await models.Buy.findOne({ + where: { + id: buyFk, + itemOriginalFk: { + neq: null + } + } + }, myOptions); + } + + if (isBuy) + await models.SaleBuy.create({saleFk, buyFk}, myOptions); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/ticket/back/methods/sale/getFromSectorCollection.js b/modules/ticket/back/methods/sale/getFromSectorCollection.js new file mode 100644 index 000000000..c8925c3a9 --- /dev/null +++ b/modules/ticket/back/methods/sale/getFromSectorCollection.js @@ -0,0 +1,61 @@ +module.exports = Self => { + Self.remoteMethodCtx('getFromSectorCollection', { + description: 'Get sales from sector collection', + accessType: 'READ', + accepts: [ + { + arg: 'sectorCollectionFk', + type: 'number', + required: true, + }, + { + arg: 'sectorFk', + type: 'number', + required: true + } + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/getFromSectorCollection`, + verb: 'GET' + }, + }); + + Self.getFromSectorCollection = async(ctx, sectorCollectionFk, sectorFk, options) => { + const userId = ctx.req.accessToken.userId; + const myOptions = {userId}; + + if (typeof options == 'object') Object.assign(myOptions, options); + + const [sales] = await Self.rawSql('CALL sectorCollection_getSale(?)', [sectorCollectionFk], myOptions); + + const itemShelvings = []; + for (let sale of sales) { + const [carros] = await Self.rawSql( + 'CALL vn.itemPlacementSupplyStockGetTargetList(?, ?)', + [sale.itemFk, sectorFk], + myOptions + ); + + itemShelvings.push({ + id: sale.ticketFk, + itemFk: sale.itemFk, + longName: sale.longName, + packingType: sale.itemPackingTypeFk, + subName: sale.subName, + quantity: sale.quantity, + saldo: sale.quantity, + trabajador: sale.workerCode, + idMovimiento: sale.saleFk, + salesPersonFk: sale.salesPersonFk, + picked: sale.pickedQuantity, + carros + }); + } + + return itemShelvings; + }; +}; diff --git a/modules/ticket/back/methods/sale/specs/getFromSectorCollection.spec.js b/modules/ticket/back/methods/sale/specs/getFromSectorCollection.spec.js new file mode 100644 index 000000000..1501426e4 --- /dev/null +++ b/modules/ticket/back/methods/sale/specs/getFromSectorCollection.spec.js @@ -0,0 +1,23 @@ +const {models} = require('vn-loopback/server/server'); + +describe('sale getFromSectorCollection()', () => { + const sectorCollectionFk = 1; + const sectorFk = 1; + + beforeAll(async() => { + ctx = { + req: { + headers: {origin: 'http://localhost'}, + accessToken: {userId: 40} + } + }; + }); + + it('should find an item and a shelving', async() => { + const options = {}; + const itemShelvings = await models.Sale.getFromSectorCollection(ctx, sectorCollectionFk, sectorFk, options); + + expect(itemShelvings.length).toEqual(1); + expect(itemShelvings[0].carros.length).toEqual(1); + }); +}); diff --git a/modules/ticket/back/methods/ticket/addSaleByCode.js b/modules/ticket/back/methods/ticket/addSaleByCode.js new file mode 100644 index 000000000..a73628c86 --- /dev/null +++ b/modules/ticket/back/methods/ticket/addSaleByCode.js @@ -0,0 +1,56 @@ +const UserError = require('vn-loopback/util/user-error'); +module.exports = Self => { + Self.remoteMethodCtx('addSaleByCode', { + description: 'Add a collection', + accessType: 'WRITE', + accepts: [ + { + arg: 'barcode', + type: 'string', + required: true + }, { + arg: 'quantity', + type: 'number', + required: true + }, { + arg: 'ticketFk', + type: 'number', + required: true + }, { + arg: 'warehouseFk', + type: 'number', + required: true + }, + + ], + http: { + path: `/addSaleByCode`, + verb: 'POST' + }, + }); + + Self.addSaleByCode = async(ctx, barcode, quantity, ticketFk, warehouseFk, options) => { + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const [[item]] = await Self.rawSql('CALL vn.item_getInfo(?,?)', [barcode, warehouseFk], myOptions); + if (!item?.available) throw new UserError('We do not have availability for the selected item'); + + await Self.rawSql('CALL vn.collection_addItem(?, ?, ?)', [item.id, quantity, ticketFk], myOptions); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/ticket/back/methods/ticket/closeAll.js b/modules/ticket/back/methods/ticket/closeAll.js index 46c45aa92..06e9e0ed1 100644 --- a/modules/ticket/back/methods/ticket/closeAll.js +++ b/modules/ticket/back/methods/ticket/closeAll.js @@ -35,6 +35,7 @@ module.exports = Self => { SELECT t.id, t.clientFk, t.companyFk, + c.id clientFk, c.name clientName, c.email recipient, c.salesPersonFk, diff --git a/modules/ticket/back/methods/ticket/closure.js b/modules/ticket/back/methods/ticket/closure.js index 1d04679d3..90fe2d794 100644 --- a/modules/ticket/back/methods/ticket/closure.js +++ b/modules/ticket/back/methods/ticket/closure.js @@ -1,3 +1,5 @@ +/* eslint max-len: ["error", { "code": 150 }]*/ + const Report = require('vn-print/core/report'); const Email = require('vn-print/core/email'); const smtp = require('vn-print/core/smtp'); @@ -11,19 +13,27 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { const failedtickets = []; for (const ticket of tickets) { try { - await Self.rawSql(`CALL vn.ticket_closeByTicket(?)`, [ticket.id], {userId}); + await Self.app.models.InvoiceOut.getSerial(ticket.clientFk, ticket.companyFk, ticket.addressFk, 'M'); + await Self.rawSql( + `CALL vn.ticket_closeByTicket(?)`, + [ticket.id], + {userId} + ); - const [invoiceOut] = await Self.rawSql(` + const [invoiceOut] = await Self.rawSql( + ` SELECT io.id, io.ref, io.serial, cny.code companyCode, io.issued FROM ticket t JOIN invoiceOut io ON io.ref = t.refFk JOIN company cny ON cny.id = io.companyFk WHERE t.id = ? - `, [ticket.id]); + `, + [ticket.id], + ); const mailOptions = { overrideAttachments: true, - attachments: [] + attachments: [], }; const isToBeMailed = ticket.recipient && ticket.salesPersonFk && ticket.isToBeMailed; @@ -33,7 +43,7 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { reference: invoiceOut.ref, recipientId: ticket.clientFk, recipient: ticket.recipient, - replyTo: ticket.salesPersonEmail + replyTo: ticket.salesPersonEmail, }; const invoiceReport = new Report('invoice', args); @@ -50,15 +60,19 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { await storage.write(stream, { type: 'invoice', path: `${year}/${month}/${day}`, - fileName: fileName + fileName: fileName, }); - await Self.rawSql('UPDATE invoiceOut SET hasPdf = true WHERE id = ?', [invoiceOut.id], {userId}); + await Self.rawSql( + 'UPDATE invoiceOut SET hasPdf = true WHERE id = ?', + [invoiceOut.id], + {userId}, + ); if (isToBeMailed) { const invoiceAttachment = { filename: fileName, - content: stream + content: stream, }; if (invoiceOut.serial == 'E' && invoiceOut.companyCode == 'VNL') { @@ -68,7 +82,7 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { mailOptions.attachments.push({ filename: fileName, - content: stream + content: stream, }); } @@ -82,7 +96,7 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { id: ticket.id, recipientId: ticket.clientFk, recipient: ticket.recipient, - replyTo: ticket.salesPersonEmail + replyTo: ticket.salesPersonEmail, }; const email = new Email('delivery-note-link', args); @@ -90,14 +104,17 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { } // Incoterms authorization - const [{firstOrder}] = await Self.rawSql(` + const [{firstOrder}] = await Self.rawSql( + ` SELECT COUNT(*) as firstOrder FROM ticket t JOIN client c ON c.id = t.clientFk WHERE t.clientFk = ? AND NOT t.isDeleted AND c.isVies - `, [ticket.clientFk]); + `, + [ticket.clientFk], + ); if (firstOrder == 1) { const args = { @@ -106,7 +123,7 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { recipientId: ticket.clientFk, recipient: ticket.recipient, replyTo: ticket.salesPersonEmail, - addressId: ticket.addressFk + addressId: ticket.addressFk, }; const email = new Email('incoterms-authorization', args); @@ -116,21 +133,25 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { `SELECT id FROM sample WHERE code = 'incoterms-authorization' - `); + `, + ); - await Self.rawSql(` + await Self.rawSql( + ` INSERT INTO clientSample (clientFk, typeFk, companyFk) VALUES(?, ?, ?) - `, [ticket.clientFk, sample.id, ticket.companyFk], {userId}); + `, + [ticket.clientFk, sample.id, ticket.companyFk], + {userId}, + ); } } catch (error) { // Domain not found - if (error.responseCode == 450) - return invalidEmail(ticket); + if (error.responseCode == 450) return invalidEmail(ticket); // Save tickets on a list of failed ids failedtickets.push({ id: ticket.id, - stacktrace: error + stacktrace: error, }); } } @@ -147,24 +168,26 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { smtp.send({ to: config.app.reportEmail, subject: '[API] Nightly ticket closure report', - html: body + html: body, }); } async function invalidEmail(ticket) { - await Self.rawSql(`UPDATE client SET email = NULL WHERE id = ?`, [ - ticket.clientFk - ], {userId}); + await Self.rawSql( + `UPDATE client SET email = NULL WHERE id = ?`, + [ticket.clientFk], + {userId}, + ); const oldInstance = `{"email": "${ticket.recipient}"}`; const newInstance = `{"email": ""}`; - await Self.rawSql(` + await Self.rawSql( + ` INSERT INTO clientLog (originFk, userFk, action, changedModel, oldInstance, newInstance) - VALUES (?, NULL, 'UPDATE', 'Client', ?, ?)`, [ - ticket.clientFk, - oldInstance, - newInstance - ], {userId}); + VALUES (?, NULL, 'UPDATE', 'Client', ?, ?)`, + [ticket.clientFk, oldInstance, newInstance], + {userId}, + ); const body = `No se ha podido enviar el albarán ${ticket.id} al cliente ${ticket.clientFk} - ${ticket.clientName} @@ -176,7 +199,7 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) { smtp.send({ to: ticket.salesPersonEmail, subject: 'No se ha podido enviar el albarán', - html: body + html: body, }); } }; diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js index 706da6f39..aedb960c3 100644 --- a/modules/ticket/back/methods/ticket/makeInvoice.js +++ b/modules/ticket/back/methods/ticket/makeInvoice.js @@ -77,22 +77,10 @@ module.exports = function(Self) { if (!clientCanBeInvoiced) throw new UserError(`This client can't be invoiced`); - const [{serial}] = invoiceCorrection ? [{serial: 'R'}] : await Self.rawSql( - `SELECT vn.invoiceSerial(?, ?, ?) AS serial`, - [ - clientId, - companyFk, - invoiceType - ], - myOptions); + const serial = !invoiceCorrection + ? await models.InvoiceOut.getSerial(clientId, companyFk, firstTicket.addressFk, invoiceType, myOptions) + : 'R'; - const invoiceOutSerial = await models.InvoiceOutSerial.findById(serial); - if (invoiceOutSerial?.taxAreaFk == 'WORLD') { - const address = await models.Address.findById(firstTicket.addressFk); - - if (!address || !address.customsAgentFk || !address.incotermsFk) - throw new UserError('Incoterms data for consignee is missing'); - } await Self.rawSql('CALL invoiceOut_new(?, ?, null, @invoiceId)', [serial, invoiceDate], myOptions); const [resultInvoice] = await Self.rawSql('SELECT @invoiceId id', [], myOptions); diff --git a/modules/ticket/back/methods/ticket/specs/addSaleByCode.spec.js b/modules/ticket/back/methods/ticket/specs/addSaleByCode.spec.js new file mode 100644 index 000000000..b97139178 --- /dev/null +++ b/modules/ticket/back/methods/ticket/specs/addSaleByCode.spec.js @@ -0,0 +1,39 @@ +const {models} = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); + +describe('Ticket addSaleByCode()', () => { + const quantity = 3; + const ticketFk = 13; + const warehouseFk = 1; + beforeAll(async() => { + activeCtx = { + req: { + accessToken: {userId: 9}, + headers: {origin: 'http://localhost'}, + __: value => value + } + }; + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + + it('should add a new sale', async() => { + const tx = await models.Ticket.beginTransaction({}); + + try { + const options = {transaction: tx}; + const code = '1111111111'; + + const salesBefore = await models.Sale.find(null, options); + await models.Ticket.addSaleByCode(activeCtx, code, quantity, ticketFk, warehouseFk, options); + const salesAfter = await models.Sale.find(null, options); + + expect(salesAfter.length).toEqual(salesBefore.length + 1); + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js index 456303602..fea8b2096 100644 --- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js +++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js @@ -77,6 +77,6 @@ describe('ticket makeInvoice()', () => { await tx.rollback(); } - expect(error.message).toEqual(`Incoterms data for consignee is missing`); + expect(error.message).toEqual(`The address of the customer must have information about Incoterms and Customs Agent`); }); }); diff --git a/modules/ticket/back/methods/ticket/specs/setDeleted.spec.js b/modules/ticket/back/methods/ticket/specs/setDeleted.spec.js index 7931935b7..520a9e403 100644 --- a/modules/ticket/back/methods/ticket/specs/setDeleted.spec.js +++ b/modules/ticket/back/methods/ticket/specs/setDeleted.spec.js @@ -50,14 +50,17 @@ describe('ticket setDeleted()', () => { return value; }; const ticketId = 23; - - await models.Ticket.setDeleted(ctx, ticketId, options); - - const [sectorCollection] = await models.Ticket.rawSql( + const [sectorCollectionBefore] = await models.Ticket.rawSql( `SELECT COUNT(*) numberRows FROM vn.sectorCollection`, [], options); - expect(sectorCollection.numberRows).toEqual(0); + await models.Ticket.setDeleted(ctx, ticketId, options); + + const [sectorCollectionAfter] = await models.Ticket.rawSql( + `SELECT COUNT(*) numberRows + FROM vn.sectorCollection`, [], options); + + expect(sectorCollectionAfter.numberRows).toEqual(sectorCollectionBefore.numberRows - 1); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/back/model-config.json b/modules/ticket/back/model-config.json index 76a289cc3..db90b55e1 100644 --- a/modules/ticket/back/model-config.json +++ b/modules/ticket/back/model-config.json @@ -65,6 +65,9 @@ "SaleTracking": { "dataSource": "vn" }, + "SaleBuy": { + "dataSource": "vn" + }, "State": { "dataSource": "vn" }, diff --git a/modules/ticket/back/models/expeditionPallet.json b/modules/ticket/back/models/expeditionPallet.json index c5a38df75..cab3af6ec 100644 --- a/modules/ticket/back/models/expeditionPallet.json +++ b/modules/ticket/back/models/expeditionPallet.json @@ -1,5 +1,6 @@ { "name": "ExpeditionPallet", + "base": "VnModel", "options": { "mysql": { "table": "expeditionPallet" @@ -10,13 +11,24 @@ "type": "number", "id": true, "description": "Identifier" - } + }, + "built": { + "type": "date" + }, + "position": { + "type": "number" + }, + "isPrint": { + "type": "number" + } }, - "acls": [{ - "accessType": "WRITE", - "principalType": "ROLE", - "principalId": "production", - "permission": "ALLOW" - }] + "relations": { + "expeditionTruck": { + "type": "belongsTo", + "model": "ExpeditionTruck", + "foreignKey": "truckFk" + } + } + } diff --git a/modules/claim/back/models/claim-rma.json b/modules/ticket/back/models/sale-buy.json similarity index 56% rename from modules/claim/back/models/claim-rma.json rename to modules/ticket/back/models/sale-buy.json index 27c3c9729..a431f1224 100644 --- a/modules/claim/back/models/claim-rma.json +++ b/modules/ticket/back/models/sale-buy.json @@ -1,26 +1,29 @@ { - "name": "ClaimRma", + "name": "SaleBuy", "base": "VnModel", "options": { "mysql": { - "table": "claimRma" + "table": "saleBuy" } }, "properties": { - "id": { + "saleFk": { "id": true, - "type": "number", - "description": "Identifier" + "type": "number" }, - "code": { - "type": "string", - "required": true + "buyFk": { + "type": "number" }, "created": { "type": "date" } }, "relations": { + "sale": { + "type": "belongsTo", + "model": "Sale", + "foreignKey": "saleFk" + }, "worker": { "type": "belongsTo", "model": "Worker", @@ -28,3 +31,4 @@ } } } + \ No newline at end of file diff --git a/modules/ticket/back/models/sale-tracking.js b/modules/ticket/back/models/sale-tracking.js index 54a2b5a1a..b5f8aeed5 100644 --- a/modules/ticket/back/models/sale-tracking.js +++ b/modules/ticket/back/models/sale-tracking.js @@ -3,4 +3,6 @@ module.exports = Self => { require('../methods/sale-tracking/listSaleTracking')(Self); require('../methods/sale-tracking/new')(Self); require('../methods/sale-tracking/delete')(Self); + require('../methods/sale-tracking/updateTracking')(Self); + require('../methods/sale-tracking/setPicked')(Self); }; diff --git a/modules/ticket/back/models/sale-tracking.json b/modules/ticket/back/models/sale-tracking.json index 4a103ea15..5e512f844 100644 --- a/modules/ticket/back/models/sale-tracking.json +++ b/modules/ticket/back/models/sale-tracking.json @@ -26,6 +26,9 @@ }, "originalQuantity": { "type": "number" + }, + "isScanned": { + "type": "number" } }, "relations": { diff --git a/modules/ticket/back/models/sale.js b/modules/ticket/back/models/sale.js index 22ad40184..1b4d8e31c 100644 --- a/modules/ticket/back/models/sale.js +++ b/modules/ticket/back/models/sale.js @@ -12,6 +12,7 @@ module.exports = Self => { require('../methods/sale/canEdit')(Self); require('../methods/sale/usesMana')(Self); require('../methods/sale/clone')(Self); + require('../methods/sale/getFromSectorCollection')(Self); Self.validatesPresenceOf('concept', { message: `Concept cannot be blank` diff --git a/modules/ticket/back/models/ticket.js b/modules/ticket/back/models/ticket.js index 1930765fb..51a8372e3 100644 --- a/modules/ticket/back/models/ticket.js +++ b/modules/ticket/back/models/ticket.js @@ -1,4 +1,5 @@ module.exports = Self => { require('./ticket-methods')(Self); require('../methods/ticket/state')(Self); + require('../methods/ticket/addSaleByCode')(Self); }; diff --git a/modules/ticket/front/sale-tracking/index.js b/modules/ticket/front/sale-tracking/index.js index 6c0e7232e..095d581a1 100644 --- a/modules/ticket/front/sale-tracking/index.js +++ b/modules/ticket/front/sale-tracking/index.js @@ -100,7 +100,7 @@ class Controller extends Section { saleTrackingDel(sale, stateCode) { const params = { saleFk: sale.saleFk, - stateCode: stateCode + stateCodes: [stateCode] }; this.$http.post(`SaleTrackings/delete`, params).then(() => { this.vnApp.showSuccess(this.$t('Data saved!')); diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index e12ceada5..e1a47b7e9 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -53,6 +53,9 @@ "Time": { "dataSource": "vn" }, + "WorkerAppTester": { + "dataSource": "vn" + }, "WorkCenter": { "dataSource": "vn" }, diff --git a/modules/worker/back/models/department.json b/modules/worker/back/models/department.json index edeba74f7..0245a7486 100644 --- a/modules/worker/back/models/department.json +++ b/modules/worker/back/models/department.json @@ -62,6 +62,11 @@ "type": "belongsTo", "model": "Worker", "foreignKey": "workerFk" + }, + "workerActivity": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerActivityTypeFk" } } -} +} \ No newline at end of file diff --git a/modules/worker/back/models/operator.js b/modules/worker/back/models/operator.js index db1ac7e49..cf6c198b6 100644 --- a/modules/worker/back/models/operator.js +++ b/modules/worker/back/models/operator.js @@ -1,4 +1,4 @@ -module.exports = function(Self) { +module.exports = Self => { Self.observe('after save', async function(ctx) { const instance = ctx.data || ctx.instance; const models = Self.app.models; diff --git a/modules/worker/back/models/operator.json b/modules/worker/back/models/operator.json index 6da3945fc..a2f3ee01c 100644 --- a/modules/worker/back/models/operator.json +++ b/modules/worker/back/models/operator.json @@ -43,6 +43,12 @@ "type": "belongsTo", "model": "Printer", "foreignKey": "labelerFk" + }, + "itemPackingType": { + "type": "belongsTo", + "model": "ItemPackingType", + "foreignKey": "itemPackingTypeFk", + "primaryKey": "code" } } } diff --git a/modules/worker/back/models/worker-app-tester.json b/modules/worker/back/models/worker-app-tester.json new file mode 100644 index 000000000..7e9706dcb --- /dev/null +++ b/modules/worker/back/models/worker-app-tester.json @@ -0,0 +1,22 @@ +{ + "name": "WorkerAppTester", + "base": "VnModel", + "options": { + "mysql": { + "table": "vn.workerAppTester" + } + }, + "properties": { + "workerFk": { + "id": true, + "type": "number" + } + }, + "relations": { + "worker": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerFk" + } + } +} \ No newline at end of file diff --git a/myt.config.yml b/myt.config.yml index 0b1d62d25..d7d1ad181 100755 --- a/myt.config.yml +++ b/myt.config.yml @@ -179,7 +179,6 @@ localFixtures: - claimLog - claimObservation - claimRatio - - claimRma - claimState - client - clientConfig diff --git a/package.json b/package.json index 6956cabeb..9e897823d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "24.10.0", + "version": "24.12.0", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", diff --git a/print/templates/reports/cmr/assets/css/style.css b/print/templates/reports/cmr/assets/css/style.css index 201afc3b6..8b007b3b0 100644 --- a/print/templates/reports/cmr/assets/css/style.css +++ b/print/templates/reports/cmr/assets/css/style.css @@ -3,7 +3,7 @@ html { margin: 10px; font-size: 22px; } -.mainTable, .specialTable, .categoryTable { +.mainTable, .specialTable, .categoryTable, .observationTable { width: 100%; border-collapse: collapse; font-size: inherit; @@ -98,4 +98,19 @@ img { #merchandiseLabels td { padding-bottom: 11px; max-width: 300px; +} + +.observationTable tr td { + border: none; + padding: 5px; +} + +#qrSection { + text-align: center; + width: 30%; +} + +#truckPlateQr { + width: 125px; + margin-bottom: 10px; } \ No newline at end of file diff --git a/print/templates/reports/cmr/cmr.html b/print/templates/reports/cmr/cmr.html index c6a9e79d6..a8f302086 100644 --- a/print/templates/reports/cmr/cmr.html +++ b/print/templates/reports/cmr/cmr.html @@ -30,8 +30,11 @@ 16. Transportista / Transporteur / Carrier
{{data.carrierName}}
- {{data.carrierStreet}}
- {{data.carrierPostalCode}} {{data.carrierCity}} {{(data.carrierCountry) ? `(${data.carrierCountry})` : null}} + {{data.carrierStreet}} {{data.carrierPostalCode}} + {{data.carrierCity}} {{(data.carrierCountry) + ? `(${data.carrierCountry})` + : null}}
+ CIF: {{data.carrierCif}} @@ -71,8 +74,19 @@ Carrier's reservations and observations
- {{data.truckPlate}}
- {{data.observations}} + + + + + +
+ {{data.observations}} + + +
+ {{data.truckPlate}} +
+ diff --git a/print/templates/reports/cmr/cmr.js b/print/templates/reports/cmr/cmr.js index c939e5152..ef99a08a0 100644 --- a/print/templates/reports/cmr/cmr.js +++ b/print/templates/reports/cmr/cmr.js @@ -2,44 +2,51 @@ const config = require(`vn-print/core/config`); const vnReport = require('../../../core/mixins/vn-report.js'); const md5 = require('md5'); const fs = require('fs-extra'); +const qrcode = require('qrcode'); const prefixBase64 = 'data:image/png;base64,'; module.exports = { - name: 'cmr', - mixins: [vnReport], - async serverPrefetch() { - this.data = await this.findOneFromDef('data', [this.id]); - if (this.data.ticketFk) { - this.merchandises = await this.rawSqlFromDef('merchandise', [this.data.ticketFk]); - this.signature = await this.findOneFromDef('signature', [this.data.ticketFk]); - } else - this.merchandises = null; + name: 'cmr', + mixins: [vnReport], + async serverPrefetch() { + this.data = await this.findOneFromDef('data', [this.id]); + if (this.data.ticketFk) { + this.merchandises = await this.rawSqlFromDef('merchandise', [this.data.ticketFk]); + this.signature = await this.findOneFromDef('signature', [this.data.ticketFk]); + } else + this.merchandises = null; - this.senderStamp = (this.data.senderStamp) - ? `${prefixBase64} ${this.data.senderStamp.toString('base64')}` - : null; - this.deliveryStamp = (this.data.deliveryStamp) - ? `${prefixBase64} ${this.data.deliveryStamp.toString('base64')}` - : null; - }, - props: { - id: { - type: Number, - required: true, - description: 'The cmr id' - }, - }, - computed: { - signPath() { - if (!this.signature) return; + this.senderStamp = (this.data.senderStamp) + ? `${prefixBase64} ${this.data.senderStamp.toString('base64')}` + : null; + this.deliveryStamp = (this.data.deliveryStamp) + ? `${prefixBase64} ${this.data.deliveryStamp.toString('base64')}` + : null; + this.truckPlateQr = await this.getQR(this.data.truckPlate); + }, + props: { + id: { + type: Number, + required: true, + description: 'The cmr id' + }, + }, + computed: { + signPath() { + if (!this.signature) return; - const signatureName = this.signature.signature - const hash = md5(signatureName.toString()).substring(0, 3); - const file = `${config.storage.root}/${hash}/${signatureName}.png`; - if (!fs.existsSync(file)) return null; + const signatureName = this.signature.signature; + const hash = md5(signatureName.toString()).substring(0, 3); + const file = `${config.storage.root}/${hash}/${signatureName}.png`; + if (!fs.existsSync(file)) return null; - return `${prefixBase64} ${Buffer.from(fs.readFileSync(file), 'utf8').toString('base64')}`; - }, - } -}; \ No newline at end of file + return `${prefixBase64} ${Buffer.from(fs.readFileSync(file), 'utf8').toString('base64')}`; + }, + }, + methods: { + getQR(id) { + return qrcode.toDataURL(String(id), {margin: 0}); + }, + } +}; diff --git a/print/templates/reports/cmr/sql/data.sql b/print/templates/reports/cmr/sql/data.sql index 9708c4483..e9500cc4b 100644 --- a/print/templates/reports/cmr/sql/data.sql +++ b/print/templates/reports/cmr/sql/data.sql @@ -10,6 +10,7 @@ SELECT c.id cmrFk, c.merchandiseDetail, c.ead, s.name carrierName, + s.nif carrierCif, s.street carrierStreet, s.postCode carrierPostCode, s.city carrierCity, From a00e363fd59d7e0929237c6ee06d45a2b39f4faa Mon Sep 17 00:00:00 2001 From: alexm Date: Thu, 14 Mar 2024 08:40:25 +0100 Subject: [PATCH 122/183] refs #7033 deploy: init version 2414 --- CHANGELOG.md | 8 ++++++++ package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f48811338..4eed71921 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2414.01] - 2024-04-04 + +### Added + +### Changed + +### Fixed + ## [2408.01] - 2024-02-22 ### Added diff --git a/package.json b/package.json index 9e897823d..6aecaccdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "24.12.0", + "version": "24.14.0", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", From 4ad562a4daa5268408d374d6cb601463e635ca82 Mon Sep 17 00:00:00 2001 From: alexm Date: Thu, 14 Mar 2024 09:12:19 +0100 Subject: [PATCH 123/183] fix: refs #6925 transalation --- modules/ticket/front/descriptor-menu/locale/es.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ticket/front/descriptor-menu/locale/es.yml b/modules/ticket/front/descriptor-menu/locale/es.yml index d0802fc4d..111fc2702 100644 --- a/modules/ticket/front/descriptor-menu/locale/es.yml +++ b/modules/ticket/front/descriptor-menu/locale/es.yml @@ -14,8 +14,8 @@ Refund all...: Abonar todo... with warehouse: con almacén without warehouse: sin almacén Invoice sent: Factura enviada -The following refund ticket have been created: "Se ha creado siguiente ticket de abono: {{ticketId}}" -The following refund tickets have been created: "Se ha creado los siguientes tickets de abono: {{ticketId}}" +The following refund ticket have been created: "Se ha creado el siguiente ticket de abono: {{ticketId}}" +The following refund tickets have been created: "Se han creado los siguientes tickets de abono: {{ticketId}}" Transfer client: Transferir cliente Send SMS...: Enviar SMS... Notify changes: Notificar cambios From ad7b7be661df76210ca4e063847efad39295edd8 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Mar 2024 09:15:19 +0100 Subject: [PATCH 124/183] refs #6875 Fix version --- db/versions/10892-yellowGerbera/00-firstScript.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/versions/10892-yellowGerbera/00-firstScript.sql b/db/versions/10892-yellowGerbera/00-firstScript.sql index 76c0cb46d..1795300f2 100644 --- a/db/versions/10892-yellowGerbera/00-firstScript.sql +++ b/db/versions/10892-yellowGerbera/00-firstScript.sql @@ -1,3 +1,5 @@ +SET @isTriggerDisabled := TRUE; + UPDATE vn.buy SET packing = 1 WHERE packing IS NULL @@ -8,6 +10,8 @@ UPDATE vn.itemShelving WHERE packing IS NULL OR NOT packing; +SET @isTriggerDisabled := FALSE; + ALTER TABLE vn.buy MODIFY COLUMN packing int(11) NOT NULL CHECK(packing > 0); ALTER TABLE vn.itemShelving MODIFY COLUMN packing int(11) NOT NULL CHECK(packing > 0); From fbeb9b058d4ca6367b4e003142b29c4ec09ffb5c Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Mar 2024 09:34:37 +0100 Subject: [PATCH 125/183] hotfix: itemProposal added optimizer_search_depth --- db/routines/vn/procedures/itemProposal.sql | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/db/routines/vn/procedures/itemProposal.sql b/db/routines/vn/procedures/itemProposal.sql index 0dc04124d..da9e757aa 100644 --- a/db/routines/vn/procedures/itemProposal.sql +++ b/db/routines/vn/procedures/itemProposal.sql @@ -18,21 +18,17 @@ BEGIN DECLARE vCalcFk INT; DECLARE vTypeFk INT; DECLARE vPriority INT DEFAULT 1; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; SELECT warehouseFk, shipped INTO vWarehouseFk, vShipped FROM ticket WHERE id = vTicketFk; - START TRANSACTION; - CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, vShipped); + SET @_optimizer_search_depth = @@optimizer_search_depth; + SET SESSION optimizer_search_depth = 0; + WITH itemTags AS ( SELECT i.id, typeFk, @@ -99,6 +95,7 @@ BEGIN match7 DESC, (i.tag8 = its.tag8) DESC, match8 DESC; - COMMIT; + + SET SESSION optimizer_search_depth = @_optimizer_search_depth; END$$ DELIMITER ; From dd7c70013055f9bb199a867a9c629920ff9000de Mon Sep 17 00:00:00 2001 From: carlossa Date: Thu, 14 Mar 2024 09:53:50 +0100 Subject: [PATCH 126/183] refs #6755 fix test --- db/dump/fixtures.before.sql | 3 ++ .../front/descriptor-menu/index.spec.js | 37 ------------------- 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 35de9dd47..8ea0baff2 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -3731,3 +3731,6 @@ INSERT INTO vn.report (name) VALUES ('LabelCollection'); INSERT INTO vn.parkingLog(originFk, userFk, `action`, creationDate, description, changedModel,oldInstance, newInstance, changedModelId, changedModelValue) VALUES(1, 18, 'update', util.VN_CURDATE(), NULL, 'SaleGroup', '{"parkingFk":null}', '{"parkingFk":1}', 1, NULL); + +INSERT INTO vn.ticketLog (originFk,userFk,`action`,creationDate,changedModel,newInstance,changedModelId,changedModelValue) + VALUES (18,9,'insert','2001-01-01 11:01:00.000','Ticket','{"isDeleted":true}',45,'Super Man'); diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js index 6d74881b8..80ad9a33a 100644 --- a/modules/ticket/front/descriptor-menu/index.spec.js +++ b/modules/ticket/front/descriptor-menu/index.spec.js @@ -40,29 +40,6 @@ describe('Ticket Component vnTicketDescriptorMenu', () => { controller.ticket = ticket; })); - describe('canRestoreTicket() getter', () => { - it('should return true for a ticket deleted within the last hour', () => { - controller.ticket.isDeleted = true; - controller.ticket.updated = Date.vnNew(); - - const result = controller.canRestoreTicket; - - expect(result).toBeTruthy(); - }); - - it('should return false for a ticket deleted more than one hour ago', () => { - const pastHour = Date.vnNew(); - pastHour.setHours(pastHour.getHours() - 2); - - controller.ticket.isDeleted = true; - controller.ticket.updated = pastHour; - - const result = controller.canRestoreTicket; - - expect(result).toBeFalsy(); - }); - }); - describe('addTurn()', () => { it('should make a query and call $.addTurn.hide() and vnApp.showSuccess()', () => { controller.$.addTurn = {hide: () => {}}; @@ -105,20 +82,6 @@ describe('Ticket Component vnTicketDescriptorMenu', () => { }); }); - describe('restoreTicket()', () => { - it('should make a query to restore the ticket and call vnApp.showSuccess()', () => { - jest.spyOn(controller, 'reload').mockReturnThis(); - jest.spyOn(controller.vnApp, 'showSuccess'); - - $httpBackend.expectPOST(`Tickets/${ticket.id}/restore`).respond(); - controller.restoreTicket(); - $httpBackend.flush(); - - expect(controller.reload).toHaveBeenCalled(); - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - describe('showPdfDeliveryNote()', () => { it('should open a new window showing a delivery note PDF document', () => { jest.spyOn(window, 'open').mockReturnThis(); From 184a3a3c7a453a1337e171d02970ecce9fb32db1 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Mar 2024 10:05:25 +0100 Subject: [PATCH 127/183] refs #6395 Requested changes --- db/routines/vn/triggers/buy_beforeInsert.sql | 9 ++++++++- db/routines/vn/triggers/buy_beforeUpdate.sql | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/triggers/buy_beforeInsert.sql b/db/routines/vn/triggers/buy_beforeInsert.sql index c698e23e6..a05f2810b 100644 --- a/db/routines/vn/triggers/buy_beforeInsert.sql +++ b/db/routines/vn/triggers/buy_beforeInsert.sql @@ -9,6 +9,7 @@ trig: BEGIN DECLARE vGroupingMode TINYINT; DECLARE vGenericFk INT; DECLARE vGenericInDate BOOL; + DECLARE vBuyerFk INT; IF @isModeInventory THEN LEAVE trig; @@ -19,7 +20,13 @@ trig: BEGIN END IF; SET NEW.editorFk = account.myUser_getId(); - SET NEW.buyerFk = NEW.editorFk; + + SELECT it.workerFk INTO vBuyerFk + FROM item i + JOIN itemType it ON it.id = i.typeFk + WHERE i.id = NEW.itemFk; + + SET NEW.buyerFk = vBuyerFk; CALL buy_checkGrouping(NEW.`grouping`); diff --git a/db/routines/vn/triggers/buy_beforeUpdate.sql b/db/routines/vn/triggers/buy_beforeUpdate.sql index b41418bcc..40e0df984 100644 --- a/db/routines/vn/triggers/buy_beforeUpdate.sql +++ b/db/routines/vn/triggers/buy_beforeUpdate.sql @@ -7,6 +7,7 @@ trig:BEGIN DECLARE vGenericInDate BOOL; DECLARE vIsInventory BOOL; DECLARE vDefaultEntry INT; + DECLARE vBuyerFk INT; IF @isTriggerDisabled THEN LEAVE trig; @@ -66,7 +67,12 @@ trig:BEGIN END IF; IF NOT (NEW.itemFk <=> OLD.itemFk) THEN - SET NEW.buyerFk = NEW.editorFk; + SELECT it.workerFk INTO vBuyerFk + FROM item i + JOIN itemType it ON it.id = i.typeFk + WHERE i.id = NEW.itemFk; + + SET NEW.buyerFk = vBuyerFk; END IF; IF NOT (NEW.itemFk <=> OLD.itemFk) OR From a7faf4e325544ad8f8605156dc92555038c925d4 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 14 Mar 2024 13:05:39 +0000 Subject: [PATCH 128/183] refs #6930 perf: logout update --- front/core/services/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/core/services/auth.js b/front/core/services/auth.js index 8727f92bc..753bc3fba 100644 --- a/front/core/services/auth.js +++ b/front/core/services/auth.js @@ -99,7 +99,7 @@ export default class Auth { logout() { this.$http.post('Accounts/logout', null, {headers: {'Authorization': this.vnToken.tokenMultimedia}, - }); + }).catch(() => {}); let promise = this.$http.post('VnUsers/logout', null, { headers: {Authorization: this.vnToken.token} From d8a5bf8c840c0a6b3689547267a68a7f9d48ac3c Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 14 Mar 2024 15:04:35 +0100 Subject: [PATCH 129/183] style: #6556 set default user image, set users image --- .gitignore | 1 - db/dump/fixtures.before.sql | 24 +++++++++--------- storage/image/user/1600x1600/1101.png | Bin 0 -> 1284841 bytes storage/image/user/1600x1600/1102.png | Bin 0 -> 996133 bytes storage/image/user/1600x1600/1103.png | Bin 0 -> 1710079 bytes storage/image/user/1600x1600/1104.png | Bin 0 -> 942401 bytes storage/image/user/1600x1600/1105.png | Bin 0 -> 794855 bytes storage/image/user/1600x1600/1106.png | Bin 0 -> 1569698 bytes storage/image/user/1600x1600/1107.png | Bin 0 -> 1315339 bytes storage/image/user/1600x1600/1108.png | Bin 0 -> 2089354 bytes storage/image/user/1600x1600/1109.png | Bin 0 -> 1288737 bytes storage/image/user/1600x1600/1110.png | Bin 0 -> 1611861 bytes storage/image/user/1600x1600/1111.png | Bin 0 -> 213750 bytes storage/image/user/1600x1600/1112.png | Bin 0 -> 213750 bytes .../4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd.png | Bin 112140 -> 10119 bytes storage/image/user/160x160/1101.png | Bin 0 -> 32343 bytes storage/image/user/160x160/1102.png | Bin 0 -> 24693 bytes storage/image/user/160x160/1103.png | Bin 0 -> 35365 bytes storage/image/user/160x160/1104.png | Bin 0 -> 24907 bytes storage/image/user/160x160/1105.png | Bin 0 -> 19515 bytes storage/image/user/160x160/1106.png | Bin 0 -> 35166 bytes storage/image/user/160x160/1107.png | Bin 0 -> 32684 bytes storage/image/user/160x160/1108.png | Bin 0 -> 41555 bytes storage/image/user/160x160/1109.png | Bin 0 -> 31447 bytes storage/image/user/160x160/1110.png | Bin 0 -> 43211 bytes storage/image/user/160x160/1111.png | Bin 0 -> 6941 bytes storage/image/user/160x160/1112.png | Bin 0 -> 6941 bytes .../4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd.png | Bin 63093 -> 10119 bytes storage/image/user/520x520/1101.png | Bin 0 -> 239289 bytes storage/image/user/520x520/1102.png | Bin 0 -> 185171 bytes storage/image/user/520x520/1103.png | Bin 0 -> 313680 bytes storage/image/user/520x520/1104.png | Bin 0 -> 176139 bytes storage/image/user/520x520/1105.png | Bin 0 -> 150385 bytes storage/image/user/520x520/1106.png | Bin 0 -> 294955 bytes storage/image/user/520x520/1107.png | Bin 0 -> 253694 bytes storage/image/user/520x520/1108.png | Bin 0 -> 379609 bytes storage/image/user/520x520/1109.png | Bin 0 -> 236996 bytes storage/image/user/520x520/1110.png | Bin 0 -> 305484 bytes storage/image/user/520x520/1111.png | Bin 0 -> 38746 bytes storage/image/user/520x520/1112.png | Bin 0 -> 38746 bytes .../4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd.png | Bin 112140 -> 10119 bytes storage/image/user/full/1101.png | Bin 0 -> 163235 bytes storage/image/user/full/1102.png | Bin 0 -> 126933 bytes storage/image/user/full/1103.png | Bin 0 -> 224523 bytes storage/image/user/full/1104.png | Bin 0 -> 119519 bytes storage/image/user/full/1105.png | Bin 0 -> 107375 bytes storage/image/user/full/1106.png | Bin 0 -> 211860 bytes storage/image/user/full/1107.png | Bin 0 -> 181710 bytes storage/image/user/full/1108.png | Bin 0 -> 251207 bytes storage/image/user/full/1109.png | Bin 0 -> 162780 bytes storage/image/user/full/1110.png | Bin 0 -> 210671 bytes storage/image/user/full/1111.png | Bin 0 -> 18862 bytes storage/image/user/full/1112.png | Bin 0 -> 18862 bytes .../4fa3ada0-3ac4-11eb-9ab8-27f6fc3b85fd.png | Bin 112140 -> 10119 bytes 54 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 storage/image/user/1600x1600/1101.png create mode 100644 storage/image/user/1600x1600/1102.png create mode 100644 storage/image/user/1600x1600/1103.png create mode 100644 storage/image/user/1600x1600/1104.png create mode 100644 storage/image/user/1600x1600/1105.png create mode 100644 storage/image/user/1600x1600/1106.png create mode 100644 storage/image/user/1600x1600/1107.png create mode 100644 storage/image/user/1600x1600/1108.png create mode 100644 storage/image/user/1600x1600/1109.png create mode 100644 storage/image/user/1600x1600/1110.png create mode 100644 storage/image/user/1600x1600/1111.png create mode 100644 storage/image/user/1600x1600/1112.png create mode 100644 storage/image/user/160x160/1101.png create mode 100644 storage/image/user/160x160/1102.png create mode 100644 storage/image/user/160x160/1103.png create mode 100644 storage/image/user/160x160/1104.png create mode 100644 storage/image/user/160x160/1105.png create mode 100644 storage/image/user/160x160/1106.png create mode 100644 storage/image/user/160x160/1107.png create mode 100644 storage/image/user/160x160/1108.png create mode 100644 storage/image/user/160x160/1109.png create mode 100644 storage/image/user/160x160/1110.png create mode 100644 storage/image/user/160x160/1111.png create mode 100644 storage/image/user/160x160/1112.png create mode 100644 storage/image/user/520x520/1101.png create mode 100644 storage/image/user/520x520/1102.png create mode 100644 storage/image/user/520x520/1103.png create mode 100644 storage/image/user/520x520/1104.png create mode 100644 storage/image/user/520x520/1105.png create mode 100644 storage/image/user/520x520/1106.png create mode 100644 storage/image/user/520x520/1107.png create mode 100644 storage/image/user/520x520/1108.png create mode 100644 storage/image/user/520x520/1109.png create mode 100644 storage/image/user/520x520/1110.png create mode 100644 storage/image/user/520x520/1111.png create mode 100644 storage/image/user/520x520/1112.png create mode 100644 storage/image/user/full/1101.png create mode 100644 storage/image/user/full/1102.png create mode 100644 storage/image/user/full/1103.png create mode 100644 storage/image/user/full/1104.png create mode 100644 storage/image/user/full/1105.png create mode 100644 storage/image/user/full/1106.png create mode 100644 storage/image/user/full/1107.png create mode 100644 storage/image/user/full/1108.png create mode 100644 storage/image/user/full/1109.png create mode 100644 storage/image/user/full/1110.png create mode 100644 storage/image/user/full/1111.png create mode 100644 storage/image/user/full/1112.png diff --git a/.gitignore b/.gitignore index b741a2d44..6232a0e99 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ coverage node_modules dist -storage .idea npm-debug.log .eslintcache diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 4ad007f5c..0fc2b7b6d 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -118,18 +118,18 @@ INSERT INTO `hedera`.`tpvConfig`(`id`, `currency`, `terminal`, `transactionType` INSERT INTO `account`.`user`(`id`,`name`,`nickname`, `password`,`role`,`active`,`email`,`lang`, `image`) VALUES - (1101, 'BruceWayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'BruceWayne@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1102, 'PetterParker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'PetterParker@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1103, 'ClarkKent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'ClarkKent@mydomain.com', 'fr', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1104, 'TonyStark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'TonyStark@mydomain.com', 'es', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1105, 'MaxEisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1106, 'DavidCharlesHaller', 'David Charles Haller', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1107, 'HankPym', 'Hank Pym', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'HankPym@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1108, 'CharlesXavier', 'Charles Xavier', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'CharlesXavier@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1109, 'BruceBanner', 'Bruce Banner', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'BruceBanner@mydomain.com', 'en', 'e7723f0b24ff05b32ed09d95196f2f29'), - (1110, 'JessicaJones', 'Jessica Jones', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'JessicaJones@mydomain.com', 'en', NULL), - (1111, 'Missing', 'Missing', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL), - (1112, 'Trash', 'Trash', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en', NULL); + (1101, 'BruceWayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'BruceWayne@mydomain.com', 'es','1101'), + (1102, 'PetterParker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'PetterParker@mydomain.com', 'en','1102'), + (1103, 'ClarkKent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'ClarkKent@mydomain.com', 'fr','1103'), + (1104, 'TonyStark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'TonyStark@mydomain.com', 'es','1104'), + (1105, 'MaxEisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt','1105'), + (1106, 'DavidCharlesHaller', 'David Charles Haller', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'DavidCharlesHaller@mydomain.com', 'en','1106'), + (1107, 'HankPym', 'Hank Pym', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'HankPym@mydomain.com', 'en','1107'), + (1108, 'CharlesXavier', 'Charles Xavier', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'CharlesXavier@mydomain.com', 'en','1108'), + (1109, 'BruceBanner', 'Bruce Banner', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'BruceBanner@mydomain.com', 'en','1109'), + (1110, 'JessicaJones', 'Jessica Jones', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 1, 1, 'JessicaJones@mydomain.com', 'en','1110'), + (1111, 'Missing', 'Missing', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en','1111'), + (1112, 'Trash', 'Trash', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 0, NULL, 'en','1112'); UPDATE account.`user` SET passExpired = DATE_SUB(util.VN_CURDATE(), INTERVAL 1 YEAR) diff --git a/storage/image/user/1600x1600/1101.png b/storage/image/user/1600x1600/1101.png new file mode 100644 index 0000000000000000000000000000000000000000..aaf3ed5666248ae7c4fdf4e4b29d7e92c9c27450 GIT binary patch literal 1284841 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 z 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 M3vRa=UH6DST(u|6mc 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

*8LPst!hvs{J-I$@cTVi$A z<2yxo=Em++xgSnPRIXSUu(aMq)wbiQ+S!#d#N%$RO(lFu{ev|D4kzeSMPFyuu%YKJ zij_?iv8~Y&h}DJTuU?XyeYVC$xCbG2J~Hp;iX@+MnvvlZlU?gM-Y`=+XmEeE*l;BWi=uqI|=;GaM?Z^x!ExGnl6U& zxNi}}9+`xO#NdDN0Wf;X<_MEd$&W?=Xv$K>L(d3dk*?_Rw##?CV4GsP?ATHByKDj0 z$0FNQi(1bBN7w$ru5V+xA6oUuN(2K^F+vlrMC5k5K8;VU=GCBUk?lIuT~I1k*3NP1 zvW1GtO!`DI!&v8V^+mc`V3}JFZ?Q}-c`t@c4b~Qy@c5uz34|A4-J>)fckFB`ED)LA z9*D@Wg5`^8`o{f>i^IRgwO%vLLr7!aQvFG9SOqlS%pvCJGQJ2sH6xUIFDOkY^z^Y! zWo?0NEC{N%>jw`G6L)L{)AN<;c>GX97GG;RQqC7aqiB3X<6$<3e;lyl=5%z%?Q+sk z4-=Rke&abnKMlra>axQH`3C7NWK&?pq(!CnwYsm5=#h~~`xf|bna#LuqxA^WAF@~6 zof9FcNV>o`oiLp4sG&^xn|*M6MX$^M36FQn6l&3oKjg=ij*b{wephP*ZL6P3t1kSY zC9bn(UCPYI1Ztc&>`i>%IS%9*2o3?JhS0?^?x5ggUDgB1X~MJjL9yp;aqC39WxAke|Q&`^iW= zc2+TLldgaI%v74gq}{6DiNUC@O(McE5@ehtLz_I4&M4^Ds`?Fr*Nlv>Zl=ANKd#nX z4c(|MA5Tr!W8* zV4v{8pMy6cyD0u{#rKsqen%4rau=_85DX51k7HZxmc=MtZxVL}6bnq+WU%|3@ z5u^)^#gO!}7IJ?-{DLh%#_@q31=@p!^FwniuM2?Edb!3!MyWg$2BnH2+Hzos1`6@( z>0Iy1hD^-5RFcbtnRH9`AHdQ&g%JLg%Ek_bF#eO#(g%U)ygg|HdtJ;6k>{Xhyb^l2 zjvT4EG;CglSC`W4IT_JJFn#niN%Xtfq(5Dw#$ev`PgzFuj;$jFb-W(*CVl6MzTecB ziN|=?D7LfmJ+_#3H3%z%%)LambMS%=Vc0lG(_T{UHZ~N&eeh2}N()aj1H?RiV<~D8 zxRupY<3Zwb@(vq7br66}h7rHZY1 zQjuntrqT=wt4)+uzqP4|urY7F2?ZqYXFflrsu%zBv>0l%)EL~b} zTucKvrTWjOKJx~=*(%P8TXfY9FV*2$Z&YyE{7FsNqB00TDo6xAT~6@-2Eb6ybEQ#j zQV44ddSur*QNL0J#v?N(%p?OYY^4&0biTu`*T=W7-nTK=~gO@N*Z}^-Dx0h4seogCI<>e9;|qvFosPiZ;a0g z_^J`7h83u1tu`xjNgj8fhxXg@k6 zOTu_SB{J;n#dHk6&Lc*;#b=Jf15PCHaM05UPI4UTi@LqW%4~gR zA%zmM>AuI0y5P~m-*yZwk6Bu@y^<$;S6!_s1Z`dqfji%v&^-Scbl42kF;4OcbCx{a z|4Ild(4_18gAyh|`?&Zki1lLQX6Nh1uR#ZlV1-h^cq&6M2&t~xZT+qA3{MqX} zqlSx{;i9ut;|Ka1lh)v8>fKoY3BDmZE%q@z$K|=ka)s;a|(yy#-Yg@2_;~ z1ApMXboy@k_p>B_0HXn~h9NeYSMeeGxo)Gi;Z{`}@)spPoBn*;k7m9Dw=q2HrCaVT z7-r+xtd}A>^YT(wH$dcDc3fAQSV8_!)6|mrgxhLqhcF9*Y%} zo>Ih?s4kfvu_Z6?`KTwk5xzRnOUAC(G47>`5pY`#*B0yJ=^0T9FxAe%*JS#p8QL5Fr-GBV9fR82yb(0$5h7#vtRL9IWLyIBzT%;RYEK)cq( zLr=a^-Yc~>nHm8E8vf0bJCU$y{%w}g(y?T!byA}Mi0~ngV`ZDau6i_&k6C;y`hFO8 za1Co+y)>vvSR=E6;Kw_VvH7)*btUqpO3*hl9CO`4rbZOoR20J9}C`A9%|_1K$fL z=)3TMPOmavRbOc3Y`B*ZmHa$BHeXv2*4z0n-HA=t)Wy79`HOBEaJq2jP-oj&qk~Ef z14(r~H2WMnut^8H2X_AV>;2jA<>wcU=hg|@+q*kK;KteiX4m|;sDZ5FzV*YY^1IXP zF891Q3Ips7^$1wZQF^-m$MAXwu74=DKoc&o^eFkL0!1#NwnMsprnRRoQQB68hILU1 zSwy^)$mi=Ww348d2WMG+Sl9^eX(*!`0?(gv4>tSxZ9PKhsx>KPDFobyDbfb|xK~Gq zS@b0mbzO{LlQXs$*&ZRuzhGS1(VDC0(h=+`Ts7C61U*ZHR4+}4-)!Zy_KA*DY-h}n zq=pD#XUKTa*G3!qcxVbC=C0IADh{c5;Z~tKrvsBn+=O&cdhB3A7Hlb+!$2zuELYwH zKwJ`%s)%e^p%i?Y;yPDp%Q_>+Pa#*;(%BB%viAarZL+D1k6kN;u&OM?&H{UNbk}C@ z9D1n|F#}OA$3G^eS1R>K8|3jhj$K9Gs44;#(}1rqrbDAk0-bvBnl>P;gkh1|s7JM^ zRLhlWaHprX;xmrBU7cb0!vmHyiNPT;5D9PAxS}u}$SKFbfgsCV{^!q%5%tO+Ie4?1 zrsWpr%1nc*iEF|!vAm-k{e6I4c$!AmCZUt);{H;-o(SEa*hd`x~JcQ@2}EDWw-D_mlmSnI>JEM6*vDW|K^wT}Xy= z8lf+6pg^-^K6;v!)mGQc*qMC#0&iw_QX%4<%R;t^Qg_hL%ZYwI@qA;*q&kw@LqEZ5JAXw$kWkbO6}k8xzK=zwYRn zG*yWyM=qjJ-c}e9kWX}sca00z=1PB%4K!-xTDZ&&6CXnKZuS%r0p?1LffqPPTG<0b z7;&PIOk`$mb*BXGA+rfww#qlCIR|;&IO?amq@vIeerDM?=AXYp_zh0<^&m1|(xZ7& zkx$skDqP%>PlF+dWiiGRCm&TD!>?&U_g^7avOLoFigaP^Ns$SXdrpr6TmK$*@_Nk_ z!@!hdjdfxgkm{%=y-!ew46%o>lL*>WYJN4R7x@5~nv1KbN}3>Pd&;ttsn21&vJ2S* zl2AdYCbpk<6q9F%LncVIFtI#yOmXs3ugKoAI(y#-K7`u$?{8xp;_v6J&;H*3he-3^ zeg?n#<%{=S+TWee>zy3{cY8?^Ukzw*2SnCSFayE@Exwz3EOHIJ6pjT}f6UCg(KUa5 z>H5qwyRbvt<58_l1Rhb_+BA&jDyu?y$|IQ9*hT%-foP!R9~LG2P450vN|(5b&*rqM z)iyPblQe>g`t5HWqb(58_VMJ9?Th^iIU7mGYz1N9ZMgqU_F154Q5=89!^B_-Vsc_Y zPhGdVWW-gPghcwl`q1Y*ZSv_9(JdvPV{XKIh7xy)KVBw6Cnb=Ofb;v0b7>HIu-II+>(1 z4K=VVe0NkKM(qT10oTTP;wXD}&Uaygi$q@P6aaRU_)pv@(npFAMRYUB z?>0y}CjvFYGba|1!`)qH=uR~7usrhKhFj*t2~yTjcuC3Y66lb8whYp8kr03KY77Q6 zA&S$s50fa*n5_ka7W&%grvX8luB`)p3$U^DTyNCc+)3RUNP0ZFpk;W+l&Hw6ayxBp zbtb49NG1D?gTwVh)i63E`C;0Z{p{s2JEoREBQ3t+<7TLEDe3w?@0BoBX;Jdv_&F-5 zWO#=d*}=IVX_2(ooLReR4|&W%Rz9I9A>p6;>U>8zVgg}v>MEJoNb3Fw52ydh{J;)r zTXAOW%*JTrR;8`d)TB{?GPpF%|I$Cm?k9Yj{|74dT!9|&VDCbHs?o?R`;_RuVfDX?vMov6vJgHofpw`C)A>Fml7K zeH1SK6{Cea?#cb6vGDGIw~9%hY~Lz0gm{nv3}7Sikaf0clW$9^NkweTRKRBCxNb0m zjY^Q%;(E@4jx_FE;wdLzLh@weIk?k>h|9^Q+m0Y$7;Ba@B~MpX%Yd?&rczmZ9e?Q1 zNIJY!lLRjUU%U;BDE=P*8R>_WiyLvyaMD2UtEi%zDVqH1l5l274veZQIB4&2G$u%&BaPijOpt1==o^P%ytRscFa8 zcis-AG_oBmzRTb)^f0I^oEWrD(`=YYw|y@V(gob4{9EZQ^q}&>*50iDkQk`#y}?Gfb0&d=YdT62$+4J+I+!!7|B zwtLJ}Y~R}Dl>kU$*tl^X6`zt`k}`f4tDL7R0njNTb4bIrKye*pWo z(AK4(#$8yZ9-}T8fOylf70VnnWNrd)^B>LiExvgVBTD*QC;lHz!CA<+oRXB#7Z|K$ zBZJh>{%21m}yM;EhD1(=B(xiFsGLGG7M^8-;nfWGvqEKqsQ6%8{M_y_#s93)R+#9YmP8}b5BKj;MAPXT0zER zX0FNKM?^5hBVNvxl~BH0DpXF9`0}iCFY45Tul~%z#K`N&8owl+RF6W@Kai;b`rZm9 zj`mCF#za>!^)*v&M$liSH7>Th74;gdy#=SFOunfF z;k!+1vtw(FAz~R%74lD>@xGy<8nhj@KIe!7s|5v?_4O$ABA=(8iOvVFm$ie0oKA0% z_j}!sqp|<6dB&)E89cTL`l!89T~S@}QW1#?w`kAAJz;5+BKS*QvTge>iChA%v|tfG zhjS@DYMDzNi67@};sdipLd|kVj@>JS62o4W+@4CJ0OV zUgXKm(nSxB4;j-J?A``7FF*KKCK@ypqjH26n$zsjAr&Ur8ir@N-OJc;m-)or&1YQW zvsJF#Kh$CsqG+G%&ny?N1KkW!@Vh5}-d?T=EOBhn%=CY28z|8*P*n#mzWkk`3BgbalTJ7Sa`$3{(EkO0gX11q z+lJtb`}aRi0UmnNzcmq=K=l%@PX4m=6V3J=bt8%;9*si!WR5045vWwyfc{fK$zRft+uxu@Gi9rpHj9`WrnRD5}jDs77F%Z!_&cKh2n#p2pn~_ z-x*3Hr)w%ZGp(`d8-o*U6`pkLjkE*o_H!u6XC4Rz~;Gy&2 zA}BoO!DFNs`D5FVOwoTMU(4WdGGd7`+7OoRmP)|T!8nH%?^#Mm=RqNao77dA#*yg- zz{)os>p!T8Pr`dj*CHRB$3E2-XOL)5tecxf5@Ej2VN}bGrmj~h8{(d@yU&El+gvLYw&<-i+&8C4qUKv~Cvx_l zH{N|-Uq4iSrzBNPaP$8;1y-@~d+L0vy0U*=5<=nZeLw4bVZG{n{Q8DQ%*skhY)`C% z7|+{=AwEz*=#Yv-{N2k1;2z7p%|3+TueSFTukuP_=Irk#UEoTv4G_ivuxKtErI|KJ+BR+u}(vB&?Ni(_lO0p=?FN|CvtJ zPA`NST^?fz4)_-4atE}m=;Hgzrpe80b&u(8TRjmGUV9v(4{gDmR9GBzui2~1_}yR# zLl4lq2p!Wj3|?Z;q1GlxbfUhJaPf&HvDbM0E`2XyFse&6sQ9s-fBunq9puPx498aO zTo;n#ydaFM0*?(}o`0}J%~#_%UzTiJxf<^jbmxv3#22uX8BX1)X@!9bzt zdI{xs4viP-RXNfzsrD3rMmVVE>Dd9XfrZ0%QB*emo{0oFeCg_#lle5;H{y~)?BQzE zzS{O$V92~cY8vVE$1|>1vm-*d-wASSd&Dt>fl(Mk{Il12-OXj?Uo}(44m$`pinG@U zCjaInEh~@5Xe4F{7n9pOuTV75otelCJ5^GB>s;%vNJ&=|lB;PJEiw{x8DuD0UW$T{ zARHM(wKCT;c5zJ7#YZDfFQCq)oh)X5-rQM;9HonhGDA{-8Qblrt3jO!6As8#jwZ!s zxrH35L}>|eF=&}~Xf(0NKR@2+pN|F6m!@Yky^H$4^7)>1nM16FocE zbb=5BP61Q6(hTNl;fj63QgD|hEZgv=P_&p~=B%YN$VNVSPKTjRRwS_eGzsyX)JMo~ zUc~=4si=`&@C#_N5%?%)LOvEljWVV+KXtY0!D%|QHrTymzG~)LWpE4@PhjSr5#nW5 zlb5ZinkFm5sB9Lx*O)r6+q>)H2(x_^KW+mknbYP#$aFk4wGrx*T#5^xWEjL&cC4K6?Dm+@zq`7XPoYt| zU<`_y((0_8M$2e8eVQL<9tgK(KZ1A*=DfT-arosAFI;q5YBpSCPyBzq;_dSLozVNl zl;25Hm*0L)_xtUFABhlV_sC8F*74S_hM=}@$9-WuNTNX7s?3*7vB97oNlo8WZH}PS z91zD-Tt!w-IxGbaQyjN971;&!BrXbrVn4K+19LNz5(QxG8}0QDs((I2=sw7tJ*#rl za@Y4lHp1n6)Tj}LMh|bwa@!c;If0^Ub1riKIEMCL9qpaeLr^~0=<`DNg^2H$s zxpCm($8~>k^Ux47+c`b`+JOV~-f=fciz=|-IF33ZmYp_w`bx1X8}f(<9~5=mR)Uy zZJQ3krMSDhTXA=HFB&`)r%)*Fl;Z9!?gT5vp}0el0L87iyG-VtnKkQqzT^k&mA$Te zU-x+)M@&ZV*E|$dO()J>lo|uC{YAa6Z#aiHnSm5~RtwYDQqF>Zs8Pt`!BLw%@1vUK z>1G&uJguXP1aTeUiQIZ+L1Q?3JaM}h9ORazNsU35v)^Nhx}I5bcAWt_NY=dd9+ic+ zuhcBX-rF_2=R$wTwk70S;NxZ;pjUdX?$uy&CZ>ZRBF~c<()>9m%^7cy>4D&W!{cn) zKA|zfFp3N&01SP_M&rq&H(ZkLMMCAxZ;yY!ekCxz5b*IP9R2s-`CSKPEmiXbK2sAmS}!Cy|{8C%?~8Gli>pPMaBZlD9!kGClQcd#Qn*{niB zB8vFyR6G1%Y`3Ixp0b+;YAa|$e@F_XVw?|Rya+M~13B)}N;V}PLHpQHWX;PZ<&cU+ z_KUs~FVQs|Jrc<+x?@1lKZeYS7X2<~EYl#6HzsRg$*OqMlUimR!5^g@lgBJK_*}&m z&XDd~U^-fY&+=t0z4*@B_N2GT&BTIh@B5!c148u{s5SjZKjKzBT3j|=Fp~`AnC2F% zQrgoQvh)?)SZU&-(1bL-43Wai$`YLg;ZUzdWtdneRT)Et*5eLy;XNeZ0e2pbeQz7~ z4`ZI0of6H2lB%AK;R08bl-P{rg*~GxEa7T_ZmM%}oqfUzE-QGSJ1$-0*p zQM{X|UMhH(q)Z{@{;Fh1=j?FUMsu06r>__ECGUY+29s=vcuZJ`!E{;VqUa0r1q0jQ zfnkEq#BY?x&zq{Xh`I`VIb;6Muu$GacxBUm%G6YWU!oqMuHxYMe=y?zp8=s*dSUUH zv3Cd4Xa?Nh;}j@0Em-Ei71_x?NDK0bN=cxIDM=_v$oZn!1`vpR3XM$Kqe&OskPbv~ zN3$1<39C>8f+)4V1KGgOvBLW)xmTcUR5T}ji9qSlM@*Wz}8vC+=7Ki<7a8_8|@9}A)L)_|7 zwd!N6;<}{u9|koIxazGCR9Z#L<=3UrV&TDpmGBBoCh28>68STJBW`VHDrT<4HWcWD zi>;<1NkT935N!ywujHhjTsN-xoFSuTcf>Dh{E|Cdly{vuX^~a99fO@W|FARxHIk`Q z?PmU+mSzU1{E`T=huD7@cg61>ZoMI znU7Jt;5svLnvmNu0iu5ejh=cZar(C_Aq$V0Rd~?!kp_)gvAjR;P4n;3XFf~gtsKIqLmXwA8&6+ot(Y=hf@3w> zDJGrMlrsdo=zc3?4fF;op>yba(UHdE#9-(Hp=^I6?_)O)ag=brrySOLK;F_p= z1$zf15A>mmPs$vU0w&D((}}^!Q4i@pcqCT~zX3KdHE^RQQvV`lw!tu6ie_jRew5%w z!B(Aail|f*m66fXC(aRJCCVz_g0@Qrtf#G6a9|r(s+ga^M}H3-d7#U_E%3u5PJ0vo zqx=Cc(Y&;7u2V@g2SS)1*5w@11CvO^7Ik9U+&)|dDu({>5#Nt3G;TQe1KX3C*$pIp zU1e^pX1qM+nka5h(GMFTeZrl$vR@L-rkw6~%j{cb{zYsb*<|0eGzRy9;8<2i=(v7C zyw4z$KoHVKTcN{{(gH9W0??}bc{##PgM<#gY|UkSiKTf)G)2rbeP@b0WbBfJGx$nx z6NZQ0a7uU$m;_wA3oYR1$IF1#tXVJ(+8^QdPuywUaeoc40xDVn5B%y|0SfC%CFq50 zD|*V6j07L^w~PeI`NE`H*45{$AG~>4&C?{?;kyhmR2c1$milyfT$VWsztMgGgK=@_8H|Ga)s zNiXcTe1)*5N|Sc5D6iG|vhQpI1sn17niu})nyIThoj>Hm+&K>gjGT$@B0@)gjl(*q zOMt&Jp=LPLac%7g-xEVaO1@Iyqi1LBh7>=#%@1!H*eH4uC^^^mION9_34JaI-k_KI zEGdr9CQ5Uvn#h&{hvS!yFzy2r?oUB_}9eM zKyyFXP4C8-W{2EpUhq-?=zAAX@lPxbBCFDkU&_<-4z#GuPQth8kU>9eROg}JzEZfW z@~^7RzP8g9*`TiYzUlRW)Yq3PhhJg>802SnfkR{NS>l~raQ!d+rta*v`% zz)C_)7aBdE=+}}0kRb?#eC!8wx6k;)CR1i~UQ1Y26VxJ=2`-u9qUAOv)-J8?Xj(SN zGA$0FV|;x9{loK)-S)E@j8duf3XVbtVjRbGb-bdj>Vc6OlhL6oieaxh1|naZFtW9^>dsexKE z_UHT3vFe}X`Bzu61m1EZ?JlWA#CN%YyDed9BWqi% zUYSIet}VZ1XwiMfvK<}MqU9KM{1DZie!Szpci5gW>F24cw4IcUGNk@QA*ZzX?e%)p z!SK6yfergLg4e(iq7pQl{swufQ3~n$xk{Z-I0;Tn7r1R9qO$tnPC(Utx-#fO*lefwE<@e0cc;Ik64W z%UFak+-r;Q)UNZ-Gcr4kIJ^%q*1a7azcIqzp)QV8JlpkOK>@35GROxT&g@|oK7san zBDDwlI3OAI!Om%=x>XjL8zzrMf%tB4CWH48bZ>Yv=lj@GE3yF*gPBzXm*X3RbH~4R z%FjPU$+`cMwM!+%m|-gQ4BG^rW5FROTVVgABVa*dHzkx_J7o8S~Q ze;bZ-R(Ai07U$aAJO@E(u}JFQUu79H+!ChQfE(~ zh}K)TjY!leA!@-iP=|*X6o1aW)y^g&eiB5L%I#13-bVi_N&>Lgok57`Rm+1LOa#T> zsiz4Jq$?@7#h9RuMw*aY499L(UNrPt8m_7mS4PLE1p8&1Iv~@MZ*4s@`4=-Q zM*c=-3mkoyDSOwc+NdlF045w34J87lAlg!Pyyoh7wG~0zgXiXc6>j@~;Us8VgH9}- z7Bzwo-!A9M8vebWiY~XVUs@?tUfx{U`@OtASq;5CE(4k>?j25GEn4h*z{a-k5;EXy z;`qaRF(qd_|D1bj<*nHxQuJkthz4^UyPEj05M*zsQAH^@250%hYTc=>aUYSE0+hs# zJ0k7O*&1oEs>U7?Z^swAXj%V;UTB~OL~nWGIHedQEm2t2*OUOe&HJ%f=(!RdQBxU! zOBJYOKRU#$9}F$+1vd&cuy2&xPRGbMoNQ^JzpKs#xBYq^dHK}b|GnvA)Caw7^fS6&f?9<7 zOE0$AJIeK#4KdJ)F*~Z3bkhSxw${p*5+t%M5)d3lQSgL`Vl}OrQ9)7NT z`pC#AwjV9}hNCl$`O)K1T|ci(w2doJ$_2U<8aY&VwKL^+Ne8NJXfH%5qJ`TTJ-gte zIIq{zEUM9`Ox)>1oOd{Q1uJZFnUg_8^drmvqKDjJFBPRrfcQ7~8j3kWW<648%IMew zobXpL#R-%KcW216i|NKJf>F+SXmmch9!8k-Fd*}ve-E)}f7j0WPBqp1Dp2zZjDXRI z^k>df5})my(x@_65l@VCW_dXOUtjMb-wmtoG{{bN`pPLhoIi9S^330N-M^cnu*)ow zYD{7#b|M2WzlK3SHR`Go?!fb_Big@6{rLi(hu!_ngU$BiEvYT)#r;0L<8uQEIRne; zW;frzpWOEH%w{O<$WU<$L~C4&+~{=`!Vdl7$AsQSyqq|NY$s3#4)i`S0&_H!=#1UI zJuK`^4HM8(zM)oLGTLJl*Zy4S^W1zfYpp%0nOwXIz?!80m+hI1%MJC-`tX%%N)6re zF}ZsyZNP?ep?vq99~b10lj9NgSSrqz^q=&F>;+QF1o(s@8`yJ`o*fj=bwX-Yf+UGH zqhRORaGQo}@X{@0W;HehwkX9u?qjF_yx3W_Z|0w}^FA3r9|;B0U-s9YeKA6pXcw7T zH5|^v`{hv-7*VIXdMb@`x-(rj;$=)*SPj}#Z??r}0^16<5J1%C*fvLZ`{gbDms4!H z*U+-sK}J^oib>L-D(PfflC7@Cn|@E68WB{c4XH3~H(x@O5^2o-qK_pEzG&zS!Y||_$cx?fb^@HK@}p)5f4|>Pp&qyVl%T=eeE28lE;{^uzSEjHpW1VT6$;V_V{mr zdH?5LyXY4MyAnpcY76Eagl?7TLwS@0V{IaNONZuYPgp5f2Nr9bCix|D@`G{HCIa;(19ntO13*^=vyIu9K$KxF*?hb7J#1HOj1WMX+7qpxqZd zK?b!fWVO*q>CYH_+wK@-h19a4fEaMeUu)*d!h+X;DaW$A+~1Wbuo}F!_F1~lrj3N? zS}FOcGUvIIMZItjejCAF;K|yZf2ej9Nnm!rp~TRAYfJPU>Ub^Ml~zB$`x6PL@ec%F zg5t=#er*m*2i~nf#K^%&g)k{;QKW|=ie=liR$&gONrZaq0^$cY@YqLJpg%xQR0Mfh zw3@19+}1}L+eqj5Ch1n3&mX);Z!}Ul;^WfxHucO*wv+mBk8DT@tY_i)K}sq7)2OQX zN7UaGBjNZMU z0sAcQ3P78lI@gtgagSxRC02f^<%py=9~I)pA~L8qeF zqjhEso-Pa-s8uk0j&uMyvPp`3Ac9t%prmd>y@w%T?@%p5cpaKIui+CK(OCpaL;U#? zUtdSJQcJNK8sysOiaCX1o6x%J1kc`Jv}uFXsr{84Em7+a<^VlSCAVRrc4$*dytJw# zpXXV+GWJi7lY{cgqC~RA^hl`Ymj4cKLIBc79qVSiJNXun6dNBtu8@m+v)Ml>hsXQphq1B!#eGpe|3$gAqnS0y zZ`)t+{1%6aC_uxq!N|i6KjDEmI31ls|2@5noVuUKx&t2DgDw^W-_eG?z3w8uJQT;A z3+que4TUYh)+hY2Pg2P(-4IJc1JX5 za_f2myj$k#@%3DkLdL7G&gI;|)J#(?)+E6VUm1-Vu=*a061n+I8U3;>m?iBbq$*3x z_mPi4N*fH)IWhY4mIaoF=*?NZK zSimdPdY;$b+emaf(zc6bzUoPc)oLxW)$y0iA_F$ADna6KN?Kf4jid^VH1B~4M;|D} zv*_LzV{1D}Igwhj1WuvMjDJ3S`aWs4Nf}@94Vj~Dv?nR5< z1>qonB16n`sg#@+Z9;8&&;RdKc*>>1I17QfXw++kiYYPo4|-wCr`|uVwr^!(8nQ&c z<;24H&I(sNIe|{ud;h*j{I=^SBn)^Z{l#MP^N-RPrgQ6}sq(tC7Y0PvF6py&5b>m^ zHe;j472}xyMA|Z*Q~?Rh>p~1SZVe>3;74piIuc3{JeFyNZN= zXw8yO2L84AplRS+Hp2Gd2l>aErz6I?{#M%KtL2;mHllAkH#Wz@%hl<1l>?p^vd#Xf z6#x?0?6OvWMUyX!}gA4mIO;^|M13|Zy%jp(mzKlwtM<^|2nxH8f z@(f!_+F{1ivnh|!N7{OywP=*Svn~bsX{-INk(}s=*L#MTcBVD+-=fYUJI70;QU_|n zO=+W+L;rtQ(+j%!oT(&j2)>r1Y1 zoo0GAGx)JI+d(h=U6gssn!o>-FO(MM7BDB3Ul(8FT}|^H{o4DaJDHC6EqDA+unb2} z*bY2-R(x1gF_>)ozw9_vleb}1&l_HDFS|jn1yN0rXWdVjl8-Y9=g5*TEYqZV;Voui zTh80mGL+%=G)=w1W=;JVq)A<2Q@xa_~K#g4tVq+E7bq@1jm z2@F4!)h)4RMAB(HOQ%TeQbe@33-_u-(qB0a1?x-aOO?Nz?)7tXddRjUUXU+l!KtUO z+2CQy)l`xdlb)DR))I#?+|!HwKc0F%4s> zZbUv1H;_D!f@Ww=JJrcRWs@p)ZxfE|#aeWQHUZfs0pE@#2J3 zr9Ha=9U#&FKCeKxC0CAxsChX`Zo#>`LtOw7M_BK-M=B5 zymwR@16L~Y3r(-gLT+sd;-CCzdB(7!tSW3lHgW?a^Bb|M$A|FfjgcY+zsDQe>xq;1YciZ>3MX6;C>4Eq+!d3W_E02$sxd6_2i(kf>aObMc9c+csSs zbh#<|($UJ)KY2>aYG4NH>BUEay3d>MxICO+2~U(4C-ggb)^1e}Wxp9xQXEKrtszF7YD zqqD=Gsry>BoBr)8=*A-L?Iq}*$_d*wXp`$1@%es8au8;mOc>e@(JYWi`?s_H^6BmG zQ}CDnNDFrxo#eQ7u>=v~JRjD*vQiF(P`$04ZC>~Sim9r-R0iN*iRB*|UxhGy%c1?2 zSbY9H-4+(^06KI8DdiwBDjyH*vffGgt6i4Se@C%;JO+hg1tWn-4@p(TbO+0vC^;|K zjmWi{Twcp0L-}<{A=EIOEZngimZMl#bz$VOzJ;cxI^9al;=O0k%hkT}E!JnG zUDl;kth$gNZioeE2|qE3ry|W;*%22?OSe(+{0?J;>I(d96#@0`Yj);HL-A zNEJH2IAmxNyuY8sRso#1s@3wtEyLEny3`Sy3l-zhmE~iJBA}f)YIc+(w6Du4kp^xR zYVfYZA_uWp%^S0-F1umbR_&-N81C;>&b~%H>o$`XWzt>}L*sLQBVziaGYg?q10K=p z>Cgu7gsq9gsl;!jw_&$1tw*(8CS~rJF{US;^?_QSs4!5zE4M0X|7j`keeg2l5e=WL z-Is~*b&XL4Z};`VG!i5&@H=pAANmoVrSZG@>B#SEh42zJ99r2DlbNi88C#l#PCsN? z*uKFEJkSfVd|!zb$iB!37F`@2vhiZ<6^aScI9uD0tn5hdJXQ%pIM={HN9_m_6COJO z{rvo{y~HGK2VM#C#WTLlXea-s**41qslji7ODxFj+3YOJJ~_SJ_bEw>07~Ei-}}N6 zVS^dr$BA*!aA5~*F)@%B!@%iHLnK{dEZCXJ_B z-Mlg~%5KM9L$yzH>Ptx0fSY4?tgR!yuxj$W&_`jRE8AiGg!K5X%D+xa;&#^i|N8=X zpWfcCH(oMhkdNV#9;HP((=R9&tz;bMGIdCLdPGIdxnc&DD9OYyBaT0@iK4D0wd^q~ z?n}S~8V^PqtL@4s4_z}d`1mvoGq4aRuE@s{wr*p66y9nnpn zXiviGzZ5o2;RkZ1!hUG>xAjf@zxet2y>1{&9&|smb${=EAOph4tbOI#;e9 zejgpNDgDyl`mcZ^(a)C#$y*r9OQ~EYaMv&pG3cc3ML<{IU!veP;7jxVmE&@|BP5p_ zwlxoC+*Sjr&u3>*B8ghw0^G2D-Ns+~dBPd-I+2_x2kk2K;9Fgixiiii@-D2GF6%h8 zP7swOu?$>6a45)`daNEdY?aZv@-;I0rE}U0Qq@T7`QQ?TgDd7PRb=)L!AoM9t_Els z2lIyYSEzc5Acck}69ehS$1afRc$^Ugd5?gz7+IIwtBXl(P}y`ru}il|3@)w%bVgSF z(U4N3ea-p8%I;gLT2QOL5SM6e7NoO>0+X8HKzE;8IgW!pFo_Nwu$M1-$ry9RG|pY#i)<2tiR8P^i+Qb$k4=U9O9o_uW|ssFNsyiz@w?BD9e4GZS^C{_9RlR*od|$`R~-DBgwBcpveB7nvp}GS8KhBB~5EU67aJcFh4?@~PghNY3He7;k`+D9N)_rV?ZFODw7u zS@0s@V%K+a!`EfvY55*Q9c0UzrvzV(_DPvFSFXN^lMeg=ap3E)&SZ+D!d~=OZl9o6 zS)o+UB);HHG7Dg4V$1FWYi9$&J^qwI_?E*tUkyi5ip(L8l-cnPO zHh@!n*mt6mp^Ed**ZS{=$#Oem2Gfb7Ug`Gs4WDyIQ@bFNP0kQPn`ONCtT5eycD)jM zX@O`A+TUVCps#;b>XS5pk2!KHyzo;4;X&QF9<<)GjQ8OM)b z-!Upd-Oc<(EZVaZQtXgYkQ|X_l2*b%7A0S_Xf<&!115p+d;?ZP_0C?q8b(4UWU&&F z6R_|*bLecvVec`SquHN{bn*`=@nlT>LTqh1^CZcPq z&Q$U{jnOax1$3UOAPnG0TQ}q`CK+%)9dxhSU0l%hpb&I+7epm_zln8n7xZkS>fC*D zIQw5GZ!XZ&cF=P|hGgr)-d*>tbGKcMfCTLCvpYugbh#S`b4xp%#XS>mpv!^HtX)9e=(IR_wz;p&MPJ8UX!{bOhv@h# z-y+Nx8rrFO9#C7#l~2s>qi1Jd(hr#)(f1U}OZDV#b)jPAY?v;B_8`%REN7vNgtTrL z%x7aQ+<4n{XA$g(!;!7tD6#~Iq2PZ&wr(%1>$2;;zT%@qEMERH`p-vT&p_cY;hth1 zZihKah2Aialef~mF0NMK32yzMY^JV=*s2hUG%1Gir?Lh;?z^L|=D?EX_Lx}`53qOc zriEjJL_n%zYj;~%hqaFd9a*S7{okN0C)^)Om4u!7Z?2WWXIB=)O9fS7gQzse$oH5IW-!AUY z9O)NE0q(Ze<^`P0@Vnv8i>Rsz2lE;+&LExO`zMzz`e=GG!4(v2Z}g6f)x0qi?v$=L zd{I*tS{yFA47f(1C_6<7-eK(E_t$9eX}0SK=;!KW8n37C4W)woh6C4=SHKMR212Fo zRD>d6mXG~RS)Wrvenqf623m-{c`6F?;t_wXM7tg}i@md*=+`#Rt#6+hrF8aGFJ60f zkf)Uu8Rrl3BN9>9mNJ$Gc0jh`{&Dx^S9I5#M0h&-zumM1|HcJk^!>yyK2sDIl&9nh-g!O+ z+Mjvuv$x?b^0&q^V6l91B4Mj!@E2jkWvp#~5V5j$a7lD0brKSABlJ30D!7w4hR=cs zuO4!KQ&HQzbG~=F42Rz=(~fTX<=_J%>8U-z%iq`A3yaGty6vXQa*Qb`Z3N-d)Gm}659;+moMdlM?4 z);7TuqwiL|te0ix*)D8|3S5#H3DFWKZVyKlAJBS!g6FU$BW-z@@Z5t0#yW~b?3J_Hsj z=!q+)br{o%Up{%(IV}9@#=E#k&~hAluOLg~p%MWJgL5mvHH@xH*4lnH|7|wXR9!#b z=oWiMOvIA)WyfA}oo|gx{9ky7@w7*%2y1kTawu`3dQ>H?9!HPkw*n`@f-4XC z_jdtQ-X)RyKg!Y6R>;3wEixn-51g29itWoqzYJT`6r*P!_s(R74L;*so&C%R8+Ss@ z<(pAf0p%1WV^|&{4A--wq08}c_SLS22@HPX{y3QcsSc9*-iAnMqcKyo%B(VCq#NP+ z+(L~55s?i&AZ0Ee5I^6yxO$R+v*R^Qf6=66&Hj3{SUOQi<0S-{A}R-|(nv8@(8hqw zUtE(kKXNhCxhnrT+3{&-C|vfNJW}{+Wsq$;HJadJ+cs|eMEc;aQ_5fpsp`N4N6@Ae zD)=8Q|I>|isEegtxR>u}PDaP7!Rab7I zy7ncy*~?@&9AnBG+lU$c1&u~TSa{Cbg7-iiCJ#k^K;_>k`*xxBhBHm;Bu~CmpqMXe z;jR0}nV4d_n>{+@9H!OOTK(0$K8Sx~XmqE5%4nuijL>i+E|&eyqCAfGZ7dXb4nkzv zPMBr#EsV3(n{ekd*&WftqBwq7m*UZPJ;Mk^&^v`L;$y@fRY<=G;ClaxrLL|HDLG*X z{%pNFDtbc*(;xP3ekttwpUdR`C+)E~_R()nd07p*{z0{Q_qKs`{`b@R=Gf6u;&RT6 zc;rim5}KlC>Rg;LGYv|QVW07&c^_A{X1L2G+ zaXw;W_@k?4&)|@s+$6^78eWzS&k7aiQ!P9rrV>!+%)F2IoTIOt!#JwsDxGZd(i;V> z3}ZNaBx!kx1czX^%YN~JJOrMYz@Fp`Ps(IvV|)XOfm4oz5T_eRkIctA9>lx+j}n@k z47pkf-GN3(yIMQf*>hts_w~OuXn2fb#L2a>=F4jJ=kK0J+ZxijfO$N)6zMh+q;GLj z$Hi+(J)*4-beDW+{vU$dTMMFA$azr_TN8_N#^1@SZzsanHuaWV*0CZ zOG?f5hpiYQKG3Rd^rXI%S(nyVYaR!vKKT}px}nGMni+a0bfbF%72P@nr38egq+tkP zX&tJnaQD0*4~^ja{X-F8tA6uZKV<2^4z&gBo9$-Q6kNvo)Jga^;3V%>ac>vRU6W*4$qmRe;HJ%OnyKu3E!0)P{n2cXw6|CGl4h=)ubz z@%oUxzD`J}iD|$}x4kP?Mhv)yt$5gZkBY(A=@;;ZidnbPn2+8?--aN)qjE@P9Fx>B zV3sQ_PlEb4XckQs_#_AP;P~NhV+8qifkl?*m&AqsCc|Y^Y*gCVfk3XiRbz~Y?6J9UKJsePZ8kl(wY5#4F00rY{8|=Tr3XzfridV!>eHo z&Rlsa&BOakhKW~!)MphWl*Tin2&d@6duk+bWVSE|!oBfbRGD{yqj%G3H_%8>rGB(rok9AK1wSv)ayWe!h1ShIcUZx^5=Qdr$@nD#LcvzfT1%JaGgL zi&IRmNcKCNu=#)1)Z(=Xv<_<^91&<&I8jIK47R5OxJh^ue}qu<{D|p@K9Be<3OoaJ z@NH0FaH(`mAIryM3HURgb8m1r+EvaLXgZyNX53c9xfA1f6cXuVU{);PddTZK! zV|ss)5CmTT@+O{NS7+C$m`VHZpFch9fNs83QCS?#tY(Q%N2YwSqiYzoR9!1iEACV) z2VC6_)(h=>n~_k(G%%=>Ft>DTK8jhaNb5Z{}+$RzTc5j7buN_TG}5*v|3>#>4? zA=Qh>z?)$vERA+GV(6pm$nTTN0A^+ytc$_gxGyr+YH zk!n34^KO%wid@oNYrQflD>|HsDMECU^dyKtj+X8d%qP*DhhW@0$aYPx&yqepoOy~gx>YxX01)HW-$n=jd8#i@CO@yHW%(Boe-f?iY$oCtRMIaK|8q}Q)ylcA;4&+!- zp#AMlu_$Ai-wPxI_2@?$P&%_c=Z@I9z%9N@62Qwawp$ow=sFH6@sJM2XRH3nc(EF4 znWvWl1O=Z)nxjcuzg91*fQ`J=Wl+&m7iy$rPnt@EEDD}e)IZd-Pgfqw>YO5$EbC8n zaH{%gMsn~~ehaY`HoPj<*rg`h$R(gUd?2orb~B;1D$ORt+n#-ZS&Lpu6n7(t%{Hjc~~e{&IZbx|4{kUgy|gcd7)(i_%en7^@C z2DCv(zb_fX7G4yS`#Ji!Z}8bAH$+VHUm2{K@px9jk9P0pD}PhMt@FHzD{81ad%nw7 zA?c--o;?l1#)|`BKzJ|R_P)(#F}RP_)>FU>uKe+;+arlNls^9f?7gE4CsA%<x$iw1=^8CKsAS(S=HYe7?f4OWnTR32w)^CX7?bhS20vdk#p`$B*XLIn zlMyW=hJ_f;v(tivrI8!6J#jpOCMZwsA@o!WRS^@=LwjQ)5SZgq0ut1ke)xMhD0)Bh z;kM%!VNM+%+h!=CH6rH_E%yOEB8oz5w-ABfOab;IY)qyHD|cD}M}k`;-sHw%qb{a^rQC}JZlJ2WO6biL=c(s+BVH}H2MnZEeZPsP0#NU-#=nz zppGK$RB>*VDWm1CqheRziDxQn$Y|+F&s#;L$!uMDw-gKUajkIy>WQ+W=f!}P!bzQd zi&MUBd3;@2P6uNG)vOhs=EzJW2B_z0uIW0ti9c4dIJw_16q%$m=FANb9I#Qzdh4p? z{VCah$QqM zo>77pb#Rh6eiLKrnB67`8^(;l&!}|er@cD35;Ug@OzDuDMLc#_zW&_t1)rp#D;Eck zG8P*dMAj(78nJ1qi_oda<)YTewPjxsE6DrnjgsqLy8a>Ay1iza_a4LRn#XvVU}GEC z{-)Nk0(F5~-r+Vw8klGo@wfB_wO^tTz`qAJ2jMoX>WN4xsj2v3m{P6Ag*P_)vH6nP{ENFi@4l`-YB21pH8 zPLTI-*^U|P8TyQ(W9NnFK8F+WFJui%EFp4#X4+rY^)CT6ns>Gh;$P02A*BIgITf@1 zB0z)kti0gxCM!W=ZNTaRa@Cc>I|V8O4i|K6yV1WwZQI8A+v0`q_bNbejMd>QCX)!i zbg%Y&csPa`N}Kspvsdo9=%+px^ka^-NS(3=^Jk(BW6sZLo5U?*KCvL=)4n)tliI3wX@_wi!$}LnZAu4oSE$(KM|4nxO6-uSp<#!9pw>gF z0l7J5Pfa+PE7Fv(M~FOmmZwlzKjeQnR%Wlb{u#2cA^?I+juq{0MATRS4y`1Oc#~_< zV2_w|#Iy+{`fw-i!7Fo0YsKEqP zbNw!^tC2YtjZN?eLy)qO%gJRaysG05mMHnMSxE9F>DhV=PoEh2_+kdT_C%Z0z~w)^ zS>3v!Rn3RadRx(l#@kCZ_!&3tr&RpR>4x_Pf4HAi^deYYZq81rc&Y~48!@KVW?-Z` zi5FpH3d%*Z`uuSW2Wu@y8|Nfcg8t#?oF`4VTx>kYk;im) zM!&fXvwo;Z-vx_P5?&$W;B`?6o5DcDm(Hw%e3i3r;izB=O70r+TJ?QaBOTS%iAv|! zCj&CID(v{4A zATgZq&%WSf$`1RHRtoq``4d#LT+m{fb-&azWHqmWLb_25vo!efOS=MHtU?&HDov+p zK49e#n(V>0GvHA&*QJ6{ZztDnjaVDtWiKW^ZkX8&dC)3oREm!KPMcoAeJhb7?Y zd!Wr^6`O16TwJZby{)L${u;&tku`1p*rIGcux>L8F1xl$G688s;L%n!HVfRK|DAoD z@qtvBV3wd*Mug^1#TxUK^EGlStBO~w#Z`Uvb-kZJ`2l@(6SK;pnfcy7oz$d1q$}Af z6$?pe0Of)-B3q*LJy-SOvD_670y{I)p!CjSQ;V#H7nSj<&|g^0WckEM8i2Xq1cDEw ze}uiw&vc4y1Ume2jfzgkpPGu7)Y`OK2r$Qa$OII)Ezl$7S4UN$LfVZz*%hVox7d3w#@ z00Jfro2k-cOD2(a3l!Nqap_OC3yq(Y&OYLx)jyc*elc$`DOI!n*HkkfPk89uDosIu zw0dCY+*rb>ufH#bp`{)>)P{|oXAUe9lu;o?Dp(tz4z}{#{b>ddMPS~Esv8Se6hBSK zdH(qy3mwU(lf}T3#cBVcpl7NV#ruMnf0FT^Y8ohzBghF2%&*Zfl$#T4MyREgV!!cw zk&tg(^vA)3UPjw$w4ZoIQ#H7v<$Y)X3g293cUXSm zl;-Tpd*opYrARGu327z*DU2X)PSHxqxQC>u4?%QLX{81Iv2vv%4izR(3Qs8ySfUCI zCJlha!oz+|7qGVW*{QDr_<~yu{t^zqPRrSoAuRnhpG|;6f39xy)~wTsfiJ?4esU1r zF78`i$9PbXKt2;mC^#qz^|b=-Z#O3UgN#7LiHxl!)9wkk^!JqKq%>)dze6dsbPp=( zWAzWbEYI^@3T}+`LWZWAg`ChE%hnTjYfF=z2(0p*erXFt0#Rpnuf`uSe> z3AmWd8R2CLiY-%1`T)ZjG4+-a>T(dEKk&X192j8_43P=(@tc@VQPD>t7Ix`-KY8fv z?Pq4l(SBVyX?_+4Y7MmrLiM8c+(f|DJ%8=WC(Gu(GZ(hi7hNV^?1dcuSk8y%ma9uw z`(>|ZW&8=Xs#BY!MNl^&Mxt*#B<;i_YaYKqw&T>8nmqA)Ukx$Glocjea|?bBDZ#O3 zc>GW+-MFFKnH63Q)BmRy@L^S#Ps)i?Ay3q0&n6SM6lfL2d_g~xdXSWm9`Yv(5to5! z%g0sF1+i$mtDN)~sTY2+nloi5S{>(=7ekpl@VD_k180s@R|EE3b*0?974u`YOg#N~ zy<_F8&&g;Gw;jBeQyj5o1z?WiigGwlvBes@=9W;?mI`;>VJF%jlg?09rScu*l=pV- zt#J>kC_F46Gdx2j0z{=eywGO@0WT(LPISD){nGcuF-`A9gKU>mM1#BS{l-Xbww}y5 zSae($rp#E~JqyOuEp~>>3tjx==2*Wb3OWFbic+YbqA~7-ztuKHizQz8Y7A8G9g|gm zhYxlrAFY;5>TqC;AH9YXSPYLCVK4bCW1@t zcvmkX?F&T@1d`u@8aj16J8>OpAvN#cKe+!#b|@%%w^D_m1-nwK~3^2d=pZ-KW1ufpRt*c(UG2E<+-{TT3n$MOElkD36;_4mS z;|%w=?O54>l2*U@5FKJ zyFk)T&$*+oq6mhg`FEH)4y3yLoCOCi9J~z0zSgb!zWTIIz7V5E;RkKe8(b12WR&xACpq z01l`JOnwJJMXXN>-JtKKMJq%gj^Ps_hZk&yR~xU+a*GWxhwIkf>S*c=szsCl2@jA| zDIq~hh~Iu3fDXL#%c)jC-L!QhowB|YA}4Ts%wsHIJ*S&r^mIXt;NV;&wmG70PT@eP zLsNmiU{!IJ*Q;rLZ*Ua|tC$``Q)i)azSkwrFJ8o8_$ z3uqca>PLR3#UFr~@*}8cXJSu<@LOOE^ob>aNO(Nqe9 zMVo*Ft=6(L0zZugglsq;5wE;1CQeS>fjwGfkO#GsBuK$2$xbP`m#qY{nx*m%J7uvY zb;R%VGb?YHl zISG5Hen-eY=Mqv}+p*#xllJj}hC#J;#Di5bPwCFARIp-PHhp(#0xG)_n9a#2atqaz zv|hu(VQu*BC33x@C36YrafZ3X#O&i;UnZ*n#{hG4=2{a3@DSRS7=Yo3n5&_MwNjE( zmn3j#mwpfUwCGaGJ8C?Az%bO2B4wyr7>z-IBzJ#Gyn|pAWP=|k##t-jU82J&&dFK( zK&ti=mq@s{=yLZs*PMS{58Cm+SLwIqA1^~cGW`#E1YS|PpUPhzE-5h*KE|erf9m%F z9b!vI{@I2!UCx;xaa18SnJ^UZ$ty*Kz|yr8lT?H)qz6Ni7$xa5 zjffToBW4F=B(lc(QZPK+h&id#s6no7I%Z>^TeaB^(W`JhMMc12iY(svhHMeb-_3Xd zbK{A`8&}gSFf%vtQki)%wY#RJnGs;+_|d?D>mX4h?#hViNmJd7JLzTnJI&;nvOd-Ssj zD5-L%>N#@PE&~o}k>d}0>!0*W6YYT3mXQK_))Wp6HIq*Bztjw)`bg91!kGu({8u=Q z-}C`1POyWYb+9GD??7Sn_qU4=`7K{19x+IkmkMV?(X?*amCf7}aS=Wb8j3X2g7vRp zyYZgBnahlO!{aiqp`~RsLpc3txd9b}ZDj(#(+k>P7#cgYkTeV|R}E37G|DnNcp~2B zu9&g5(6{XPp@j+SB@vzIW4^f3q)MDIq_myYs~1DkG49X&4A*F69X6JY##4?XM|=vD zM9uQn)+e!sYN^p5gjJvJ&~} zBa@KXzICnIaq%@)Qt3luu8c)Bxj5{Ku~mer5i)&!CQ?!*fZSvC$K$JCMPO!4PB|?7 zd4M$0yS<+UrenT3yst8|6>c$fSK-LBSOf;;wJ6)brU z;e`x3yFVz&QQ`dz&*hrv)KVuND8k7~W6~gQwbkghv%;+13C_4-*Zjx1uVGFYa9$Ym z4f}RLDlYLsMJ6~SwwrhyGq9Sg0Bug%JL^7(0Pz0~l&Al(OJYbqTfVjWo!z+koy5Lh zLjSx)Cu;ZYQ>buL6;WuMHlI=S^1AaCc)pIK%|OQB4Ob*( z<3(>7uhaz;q2NlYfjY9BRiPh|t5`w3kUZCk02wW>rsJV zI$dDoiIPSQUJG)LYO>hdfidpz0p{1u>*zz^rQhX8V9LUIE1B9km6e*$NH7vb2+g7z ztBynaA@%6vb2_T3p3oP+7iLxu`?(owzBWQW+4ECy*TYy4o|NBdo#AL}$6pGxrVIDj zo)>3_P)LhACFE0E7g6e{nOm3Tr!2392j9+V_dwtA!IBxKOSQbN)@|0e#dkDIL?7*{ zS>Nzzk|7Q60{~!iUM+c1$qCEK59hD#91pqZS@wv3VZN@o6e;F}g$oz!Aa}kiHcB4g z^6`VnxPBT?1Kak!id3R6lh2L9CR$n%b#Dsk?nI z{8p-{hZc}XWS@%7S3d{hp3hBEQ(Bsw5>ty!3*$|{_R27-j+sov!8z!Vu2>E`;`fQ97$sUCFCo#1NrX{f-kx zt}Yd~flZZ28gMj>@-pDdlL#B79leS)oyz&;x@hF6raa%-@3k#Yu5q#HYaco5DHBrz zyR7XBBfb%hZjR4!`igD65X*uRG=qOq{&nTciE2t}@rpDnc6k5efz11sBjm&Py1KnB zjk$4sZQ14f-g(1nDB(q*PP$fGh87C@XM5@S();f2$(xJ{g90Onv~0fZuD~nKKnVkl zO~Ek+wt^&|vjsDSmlt=nuDTxDRfyXs1Zp&_|N7WWtk5FFJL`o9&X{j;fW&}^thW!F z=E(gN{tpcsP<)*zx>3St=ct2(&w9cA!!}V1O>~E+GghZ3N=>W;ohXc;DDp;$rTBxL z2ZsdHKvx8}4^S#52$w`a9QNhgFOmo!Iil4YiFz0hty(r5WbFZjU;2^mhpmKi;Kx!! z0xv3hZgyBBkdayi;|UBQ5fzejT+!i4n520EdXI6~Y!UNxoyC?b@XKPv%fWBt`Le*$ zomZxh;2FjoB0RTq8EhYcDMzd#l?hvCHSinZh6;$-DftIdv_-VfEy(Fx5gkrAX^LG+ zjuQ&nzMeli!E|bW&n^!<(iYVqRBAwf`ANo3q!+@Q$_Ib`z<2#A5$uuf0vqQ=ICeazLdA<0+r3}kB$P3!Q;8Jb_^9aXDXe-@a>G5e2B)R z0aK$|C^m8}v5)s+wb@qwqMdBhUHprkK%#$!&+iZ~2-Gu=P3C}X>_-t@;v#OdkyVyD z;klVt_4gh!QM|FfWEOYa^BYjlM$wwSWy)gDaq+1+XqKW~N;kI+dcqEtgG1#&&^slGo%B7z`GW5W`k)B{vlod7F$+p;)5&wD>Y@ zLrwOLFORDguT3U#t7d)m)k6N&$ii&@Lh&;DnO23D&+0fMTzIPK%|#{=Ek{2LTarIh z5PiH_MyGYjo7vv6JDVre>k$LOJD*T26^tb=m1^Tj?DZ>4b-T`A?5d=Cs9E#LjO+E+ zOj%cgvD(&%J-95j+21l0!Q;X9lV04Cpvj0HQ-#^@-T4Q~L9&fmjs2$!HuN;VINWUA z=AN~G37w52bT5PEq4Ykw$j6+g0}%9GF|bt$N){{W-^qX;A5<%jqv zwh0?5J_-Lg-B?;yB44&mmnOQQfNI7zITqlBAuEi)xX_P2wpn7c7?A*t9oDLfR?K;0 zPxfi`{mzowwp%jL9wjAIqv!kZpD0qvm;K_rUB*ls!EgJRs`7W(yFP~9@4BNz@TSz8 zrux$LX8Lij5gu)4)Cu;r|CnDZv1&MtOCcH`IeX0N>FSs7Q%--pf3aUrvz$Jqz)&%YZe1a=1Op-}B7O$f;4dS^iJ|MFCFtXY@pW`Bg*k!{IDb&d zkMp7q;(tf!g+oTdY9)mR34pWyXa^(wT}(rcE5uI&Ab#8(MhA~^Ar>soQK_of%v6op z1lX%m=;exMGv1}0-Sg4}XQReTCH!8{aoz>Uz%i-_>J?S`?%s2Xodp5DBj{>tHfq?O zyIRS^IaWyvM5M=;WOfkYD!IsbHi+$GRIj-(O6(th#UNwujdlQat@B{j4j zRQ=AnMnDnkWY{#cc()yl9zgEXej8W?WqAMO?;o>ioh{=%=2FS4OyTNX06alNX6K&M zpT3FjmtMP_zqtyVa-s{Y$scacG*`GcIjP@@4EXt3IrG>%Di7?mPC?` zBt~5j;bd{9n9`)p@(`8rBNDyru~lLG7bI(lXGi~~6ByUSzxG}Iy;ko#ve1&uR`;0F z5!`+osiG)f{L+n5{O{qd zd@GJcw^s1h)#1SnZ!A}oBRrFmEcE+k`Un|t1-^+F7yy{K9<{jHtK60bqmI8{O%B}`kURsA4SzYZ)4(Kdzz zHM-p+tYE%req_S0ciU}x3+l&>ql$L{u&J+9WiSP}V zMA;V(mdM8`<_p&AITqL7{Ro{dOef1h68F~=RdSLg5m&=FVnFre_|h4<-+O{&e_qiK zc$RB2%7sx)#FeN%M}|-LH7#C!D*Ur{=`A$TbplDfd0Mb!Z6f z?f9>NN3`~VNe#S?`vwaAtD_CLP`PZx{-1?OlNBCz%;!TvJ~iNJ;y>o%a(r1c~F zs)f46yi%n`ks}Ur>wYx%piJ16-ZT{8#1#XH*W>~r3`HoFZY93gbiGLIspnSYh;+I6)vv;9=J!s zFS^f+zjJ|sX;7-o-Sv-L-sg>$Fom%lfL*mXs!+>&LvrO)s9cjkA!JgxJ(F!G%M4zc z+)w^g#K~enC-6%((F8njSLhh$1Oc036A)qsC#FU@=wz{y*aEQ?NEeRbwy7Yie>b}d zvg9W#eI!jrynJrOBIkWKr7xaB=BbUDVUUokUVzA&Tx zGBSGU1&1#0Dq!6ux6`wi)gAhNAn(uIx83&_eWNCe5_(VWRu?SfWbJ?D8(B8eO<=5A z!vxA<_Y$jxbS~wx>rkc@a`ht<371VGlo5|nq}n~|yF{C{6*=hZexl`+7oQw%o?(qI zuanC={@1HeTN785f;deg(`~a^2ruR(*|n64p{Ir`(9bf7otrbiksMFqd+z-9NK%oF zbgeSR3{&VOq^O*?Ci2NI_FHz-mR>_?Ze4A0x zk~j&f!L8YGx!Z?wX1+`ZJAB*aU6@%Sem&2`Y21sfs96qI-qa8pv>rh1)o{PsTVuO( z5j{c7!-XJSF60>c#MD81Ga@Z({@gkD(8`_2CnDX}^Eo|haKu=v&|bPL15}ZyHNRdg z^xf8d`V4anC&_Z^Gbmx-&{&lGOfrBeE#-NFM_p-{&xh;q6*;>ANnxeqm)!b2;kd6K z5A>0SV|a9oz+C}H@V z_1BwXcV2Yw_f@xtx94-_NMs|||Ci_a&-V^R#{VlE)g75}qN$c3B1*uL=mrG{1Liz^ z#0!cX^@Ef|IU1|DQ_yf1zvBgUj^_S>T=*!M9_5wgm;D8o>hofRa){{+nz<`J2TW-* z&RuQRY8>EY1Ta#MNLiiC!>x$Ym0ebGU*Y2Chqia&EA2NOGp9oSRBv5yam0?4p3=1b{V5tml$2d2e`OTab|rGJn>lA+SZ zVogY~U3Ewq#BZm;K3yu#r<{NMck|g9$aY?MBx{ zHJB|;?7ph2W)L!iqM*4eV~b9gG-yYP0HPq&6l95XOZ$m`v6lj2TJX(CWP5+U+n7n8 z#wuv)$XCV>OHD3g>2N#Z#454zsL0A1qg_v?ao_C6eYpy5fy~TsjGy-cFzU0CXDhOj zS>m@q^PN1)gnq6KqGiG0xP61KONMYAbXz^yRSIxrct*~?I97c`CSCLRjnFYJ?9QsR zC{S&D*8bsiWI* zQ(o0_a*7reoE>4u@aUWrbN8eqinH#r>W zx;qM}$Xjr1^{06~0;|wUchhBmUHDtAwItrh`2D|x85|20Tt$QghD}>*TdP6B7-LC7t1fMF^SA~v7wajgb5qtc{=AV)cAK3CM3Hm3@TW{_9iMjd zA?o8lbzQ|&w2*0$g1 zC8Rc`@Qd18$e{iN{nHZDk5s>MH$l7L3|Qv*5}{q|%5?p#HqxTKvhbZfw;V&fARVcv zmFt@dG#%SdjLNaMr!mO7Pgu^|!|>hnhfz(6^Ert8ebM(SF~`4>XwWI}pX|o}(0);7 zSSaqbm%s~{jS$c|k~i=XYlk*w_=}kDOfb3R1J-~Sr`M03s8XR!z;}Ic zL%H**yks7H;^udjEwTZ)4n>44=bkm6BxX3-P|%Kqky%E8Lg2)op(xBro?O~oZ&DWQ zk$nct#7x7uNrGl4=&@^Fw(DQ~q**woRmIJnXv71Nm`Z;*0(jlx4w2n;TT$y) zF4!s%%+z@SBgsKpubuK4$_9#GtHA+X6jfafj&T8OhAd!B2NP&~`LbGH_frT}OA6ItBV9|5rcp(`~1cDM0 z(fqn-bEY4z5xf#6-kx}kTIw@WP2nYa!?-9Y{G|b|Mw1}i1x8`CvtJOdMtFZ>$ij%2 z#zfo?gfe-Wk!*De*;>)u>4f4}&nXj^K}PT(H!Br)HRg{&e2WY{v1HMTi}Sx)9G4(- z14NTDw%UJ4e{V53WCe#asctt=Ke>&AMtv}qY?!d6*!praj4Z(J`@xt8`o&v{Y9j45 zW&WT21#7?0%^$8q?#~JXglPhT*sB48ICHn1^vmi)0w&1c5N!QpybiCcXu|zWX2t4& z@vwn-Q!7+~=ju%&bv-6-aB>(|1+n}0wN~jip4b6wNpfg6VGRWuC@UFWIL$H~SpaxN zL6IfS$O>JE8CbDa*rtlaoOEGPLyni&YAQ=DIeld5(?3}+J8LAAMIq*E@3j3)@|NCX z{zJnBqST*$((A&!(0`dmVt@Z#ym#LpbJ2hSG$xRLCpTMqV~A&ZHA6^oT&fU4NTB}K z>ZkOb8%i#1+hY;7D7emSkPDphz00p&$xLtCT#tC)D@nBMgZ+4=!E0FHOYS4qWSi3p zP8u8e$F2o}gZlB?aczqKrs2{!vZS`*om8ojzJRI9hemL%A!>CAnm-!pG7$Tgi8l=n z5Kq9dM-|Pho>*ow)v3u5Gz;4WjyU@bPrdC+E2?zPO|QM`8AD+8PmTRn6DfXD*4r#% zw~?EER=2+)z4Wqi=_!vq6OWF`){f| z6!ys()Os59fMtQBlK6hRC@UHZnjj*Jg4#6Mpe6e-PMl)~2&>`4sq!0C_wz@qr1=Ax zfAOm97fJphTYDI7UJr~#SX>4!{ig`_pReyGVw_VQS;80b+gBDfx_3!aH|f7!!4wa#EaB@t)XHyusra$XZBKSUIgly8T1&od zBb-kO9f*|48j18qvbm#8zn|Et?K`HB;}SZ8y$j6o*`nRUI_G>2*=HCMbTg@zgS>4F zKEZ`3AfMayMM^@cR`(vZa`(7nXyyP*WT0Qn8Q_?9CBhk{23`+zyx;ZI0!c<$g_&v? z(A<4KTtd|&P~g9oaTY8JUQ{!V&pN{7c>mpnQZdH$9`F9+(c z?60STVDkJpmLLGu`!W(<*4hK3uoDDwa`}$TO;avj@fSGuVisAlm@ZXgOdF>X?#n0YCD`i~-Bag&9a9FD}nN zP8;K(EXDZLg=BI+d*tT(Onp~*K)%sAkUtx;BcD@G&VAfhW2G0{q(K)t4g)Q3H5?v9 z{(FRx--PCOYSx0Lgn9RR&d6P#N()|@$@nf$nE8TWf2uXw?5$U1{c=3cXDMp3+KR$& zQHbnP(>*%Sb+OyO7jc?Th>dO#8{Oo~B(O7$OvRDx7D#O*8<_%`LquuhoGEp2HTT;9 zM|y8gNR@_iC7Efa^suJd=5s!QOLY&Qk}uf5WJWY3qC2zti!hAX>nPcn*5RoBMr^T} z0M*0KAxE+QNK@jcH`QiC|0@E+){Ur8S{=gd%(n!Y49rPl57wWqAfOt7R7H+y>RBlC z&%;BV<7;1n74uleDb)O6{>@{6=Qhs$)-WJVKy|Ef;!Mra(Sp-mVOqS)E_Z!~9^*0;pXvr6|(-;tGwg()+@Xbg(&2E zjplpxdjD|t2*`xWd*9A^yD9!wIeEQUiuvC)&a*pVi$oL{2~PwWtMi+V7>f@DxmTPw z^aXkk0t~sRFX}BqF*YCv>KUrv>wT2~3Zn;|(|Qm3ponWHR@K9fgZs9QL0w*HKvM@y z*2zjeLJYR!S8-JnKhYt6F3RG{<$*;`dl|`iVO%M5yx8OOUfJ6;A_$xIp5H$7INf<- z!*JqH4f+Z_ZvB_i2ZrW{aXTslZz6lj%O!IVaF?wO9Ck)~4)`E+5oXGgt}wi_fe|E+ z9g#L@xq@s8KYH~bLvgy>^L;OQs4T5QjG}VIs1iwkBW$2_i3kWHy4=wH`02Ga5vcB$ z(7W&0smYD3d@t-zPrs3@ztdDv}Fk4pAUieJ~jXZ5K(xjbwr#sWscP-lo=?YYLjTh^VRZYv9Zer8r4`>{JVnB#9 z)H4F#E~#Kw);!NUrc8{*V#(EZF%)Lco}^^@;Xt+GqLf-6x4OTn_$lN;Yx=)T@HzBZ zz=&wia}Ay$fNzT}R3zRc7FTv(vfX3H?~vofTC$4av= z@X<-@`FuWsgdSCFPNRRO6-$Q*_o(29AGI|Z=(C*Am-m--%D2&SIH{X4IOB_1q2w`v zXO&RhRT>AG2ghboxkGeLhmu#=!9a$^1ky-2LKNtPSutV?o~Od@5_DoFB^Rw_d5Uv( zmE>&SAK-dCyoBX^Y@qF0ff@NPXuHzhT`PN-FXaIV$p?}y9?n{dV+%SS=z^uD@|b+{ z_a0f@AR(J)GRf~I=2cU?V6UQRigMLD&)sOj(I$(_t>@no(;l%CVzTY=SY1O5HCSuJ zB0sp1y%lJ+N%4Q~rHEQ*b!yUm(}bjm1uBkik3knL47paWu9t@n4U<7sn7I~E6YmI8 zO?zxo$3{mmb9#KZ;jHb@4-K@Hn3mECkwA;7v+)8t83wXJyw&|Gf(3&S(p}*M{Bb4BN!>)qKwaZYkh|0J})PAK!1K3@Rd892< ztuXoG_jdG7N`pCu#cG2TJVH!$=LQL4he1LU=soC!AIqrB^W)&_=>0sCGba2p9V?Ne z?BVfl&{eX`DC=<_6MKJt+TZT>kn=Js9O1XW{^)jb?02QS_2YH2J3{z=|Lvd8#{ZN- z1wI0Ib&!!aLcoZz1*=pSAo(%jq$vtBZt;@Y2?AjImJWPZ^8kC;1*H_oI5#EVL zz_&9J)Tn@&j9_uW8*1ty4Zh4|R-&)_cB0#~26}m*jOsh^!3~k?NN;Z9O(er&6vUo} zz6A?Gc9O%Cth&-^>lQ*$KukvxEQO5A96TZwCsS57o_vaPpg1roB0DIUZVqEIQ$<%Q z5(5+gF}drqZ5(eVNR-7I;FTrYd?Zt>6q7mep$f~^w z+O5QQK64M{2vWHg)=!l=EoT=bUOT5I*`fb5mqaep4U3o%)0nrof>qddz(Vp6q-Xf7 z?TQ~X{YRz*Q@UVZqNS}I!|(a9jmwEMmBY>g6=L)uZ&;kY>aads{rN1+VaY4FN8}U& zTce1l3{ynv`Qbq(URQ=O`bp7f%wNDEljvTb*fPoxL?U*2r)9b(%MiDnnzt)j6TYmX z2Pc|`c6Xw3=kgxcBX0~6YB9&B=72EpMBv(!$fGx?K%%1H)_*0bqlrc zx=c$&;HBB0b4(L|4P03Fbo^9LFb|Qb4$`*;IwMwCYEG>4x`y;T-pjgZaqX-bs&-Qb zB(pR1)eK&ci9($#7j8_acn~#gmW}6K$Uf%azB&hZWUk4JTu{FQjvT;+ec2or8tjrm{8O>CpSj*%>ozYIiKzs)u? z4CHv28o|JQ1Qz8?JdDC4U45W{10E#$5rTaDR}7)u{oTzh@e7~6$rE8)_=kJ$J|@Ie zkI69tMh=ga{Hdr%T#-|`sZ(r!PSO6JIgEH*{C4aAC40rXstL-Ns)o7@QsFOvSCIoH z%ImDho2o0AoTI_`ucOX&rTQ2Z_G=A`LSsP(m42P$-jPB&<2fT?Jo?txZyc4T5FFaulb8D#&Jr;k&N+d@jV3r^j|euc<83DA>2VToDqpgag;VSx*7gj z8b+{poHjM{mKrr?3}#WkW&ct+7B2Ug+2obEo&Ze1YBY?Ib&5nICi~bMf>C~IXL@Rg znChft*JXdW>qKaf@<}W2FWoxDZ+RIW+V#FIDft>viaH0zrlGP=`px5wWOtq_yMEGP zr(hpXX75~)mW}&fx-MJS+crkVfDx}_%vyBXJ<0F%3b#tn2y#N?zvjBfsVau=HF?DXMPot>NPU@yZ>=rj)>6a@+`i#_ zyZ4&nn&KFxsoT|>U@B7SDr8S8zi<(#hB8Xz{e=NzrUM9FE>QiuK31Wh!ysWt?uNQRQ%SMCcxQGL_(EO)bD4FK^%huvDQLEXz1MyMxS~{5Wtm&s~Ni4}F z8jUMcUkpaSW++d3==(u<6y9M=3<~9Em`c}3ek`?!+m6cCF^l@iA^Xm^F3?$Ur~U|B zs_zg~hOx?s8iGxOtj1coCEB4>(r!o8i_mFds3?Uh2&gEy9 zyef-$-6p5Hzzjc@o%Lnlgb)pYmc6v=j2ZLYxlx~#!1`P5=$O?wsQ_!TN-=iEa<@)X zV!cJ!vyeyg;^edApZ#1so+;;8p8ASUh~oR&lox>6{ePuUS01S+U{MzC`#{rksFGGi zW9{D|`3XYzs#>H8hOB7hV(4%nfx<4cFmF>~+{FY!E=u zLuPUJ0Z_YsxLVrTU5&fz?pWmK6pHB=@_9-+3tJ64{cq*X@cP@9;gkGB^V_5!4*UjY z@4aCclynOsQQilNNQHmm1a5#I>OAjBl!6>O8tO(FN(lK;H3B2J6M<>TaMORhYJ8YWMgx?SQIBW4%EYZJ1O2XG@n>_03Rnn!&aLvT)<_ z(fh7LtKN%IJ~PS5I0{znF!W|`XCk>yyEc08wtyKm4s8@l?Va;csGor%lg^QskOzr4cI)=`q^2R&*ZFvkV5})R z|1|vE8*_jyFRE%&Lo%BJg`h5LO9s0oA>+-ATnfz3ghGnzz!87MWI!WYk9vHW`^Pc9 zfe%ja8$(mh>EXh$Z#t7q6r~}N^|||o5aYVRv#jx(P%1Ox<~P*zKF;eSpH1sO-EnnM zn!LnbKiojdBn34M0`@mvJ9vdeTXfA3AG#ggxIx?7=c`WpGxktB5xE#hc0?iy{?@)Z znp1vk6GK1RT#;QVw>I;hna4ZAWf?J6oz@Sh1dS*&X;lCXcCI$Q?`qzaE_7Y?z5-7! zCVu)X$m)lLf*u%aOG10L4@v%H7`5e%;nJA%*@9lC26}hF8cY*3_Es0?>>2-FJFofS z)1c9F!wWt|P8JK!UG#HUVO>H^uO7>gWijWUX_XaRs2%8FG492ai_dr5v#1=a7sGM# zP&z&mIYfggLD%%wGHpS_<*mrosGNX{`lII)!Lveu@47uHhsmGFlHwLr8@)GHyRui* zp#`2}x0d;o;|s|^1Pm_=D?(2%(i&k$MOJM;v60#j%$wmDXo!o@1_NP5^~JS6n89N8Tm?9!1s6E?8Kyw?#Lg`}b0`FU877Pgrrkp1xb+v4qcMIIUs3P7R zd;v)efl;z{ARM-(zcD4Yt0P5N_P%#=;%#5HY0Qa#a&C;oJW%h|4AYd1<-Xl^Wi#_P zhi72uVBm216wZh*NZ2>!M95rSMRV5$zMN{;JE?2|brZgr-hv3V^6gaoxi^(GgP$WpYQ`T>Z7w{ceG|cZHi- zKq;W~G8GV>f2`(@%2=_l5_FRdRrduE^DDG(HW${sC+J{V`KWHS$qanejC8`%ep@eB zc2fXIifj-K#)X>(4~?n)1svo=M3^Hra9Fz@m(MSQ^y89CPH3n;?XskLZ&CBHRaK<>_UnAwp>-BG-w&FC8Zcgyu++YZ)4j zekC3VxQyIhbJ_DFba~(3JST2z76PiH}jvD3Kkwo0h?p- z3F-6*%tmHR!8=Mm;bXN(33wRV%lpQc=yX_Y-fi%ysx5(PooGI`fg5(=PSVC#k~pC# z{hhv3F9l9LIrL1t7%f2fBZ>HUehpw>9)=>{AfunTPwpB~l;hrd2Q*g!}5^q>!0S!Nrfv(3!RcUF>HvQsw!+8L!=htQ=dN|=lQwFZRiPNHagd* zgS6rRdL?g}Cy7tXNiOIxk#cgB<)f99yw@WQ+K-Q!(pcC*+e9H&8_*XY&cy4@bfR$yO$T8Ztr_izZ?E;b@=)97d^jYA)EikrwG5@4ZoNA zA?JMb#k-%C-_>7o-fwb-hKEI)Xy9XBFlPEEK1R4n&qpSsUkb4;-4~m9CoKHUZ|V6L z>39Cs32#|got(<9|8&f?|J6FfOC@r|>cqu(VdB(b%D1AE%yfc%$PM(O z9ZVkl0vtdINAUmX+)CuBM9SX(B+PEgw-ltfN2P*nzAzKJ^MA8-fFXFGrWE8ejX1_$)aYrd;NwnX$;2KiILjqd6fa z+UAqFhVcrYWk%2s%?7B1Ea1aGgUmGg+%|gQO8W4%LC^?-fKFf1SOj@8fSbrO9(3Ql zVa6)tq}oYOaQz3h_|^g;{4Be07<&QDW0spp`Tm;#0+QpF07fRnl3Mh}2C^V@u&`GD z@X6H^40g<}c%<|cONK2$l>$*-=e7XP0Pd1fTsx!Ac>c{bSA{y7K*cyi3mTazarI-99V>BtGGXIo?#c_ zm@o5P(=rht3KZR|51lQ}kWPe+RLZ0^DrP?V$sweb@k=R^u${7<)}_Ti-uEI;JunZ# zTS&|r$!|ww^=WX4X|PPU!cs4D5~L7={8o=^sS3_P7+XRts`qfq;&FjV)sL7#TBv#p z=hl`!CjJdquf>=O`YX1yZr>$nw2!3Sh^4+;@^BY?1>~AiszcExG1j8OM|Sp-QD5|E z5_%4{YRtsKB2gnjQrmO*!eKT+u*v|xY!m&NPC#s4IU%=CTmD5>x3$zYsgtHnE;mVJOdv)5hL zyMEs%+TJ`POlsf}N4Hg1Nce_;p53|*lA^kvPu)M=Ax3Kp_85<_g=uIfAuX1+hzmbY z{sm6UT9^z7aqeBkLLs3M9Lcpak(^`oo=HZ=lS2tiQk(Fflm#wCvt6%pP&;S2h^MBr^-p*Fu zx4R!$FWz4X-eIUNb6ybMq5YmVf9vSgr{;;MwxKRtl{`vQ3aOp)C#}=9A9Yh1S{Xg+Pm8d}Gp=_aw_g%uh;)70$MuHAP z^3-CVRD97dMsO(NUq(zPMsWCYcqHu;cs%my9Jv1!X-S8%nbV{F`K2OAhNr(LBdg>h z)qF#54p70^Le21+!9!oY`hNZ5%uyZQjL1OwT<|%g;O_^4@+d>rf00UXXvJ~SG@c!2 zR1VH`pkpa~u+PMDjhEkMQ;wgip zlkGP2-JJIlZ|?Hf^jQW=3=n)zw)*Qv>qy)j$Irz!vHYJ-WB{4-uvyQFqdIk{Un~6< z>MkNx(lartrTz1M(UBq6vs9QS!swYdu$@OY<8U{V!;9t;QKkc|`dFWK_;>VLdL zo`DVCdITsr;IpfNp!4S(D-0L|v`dSwCHFeXudCG^QgC*0GmCp}0F?}|u^;Wri#t&s z=Ub%o zYtirc%2tx}IUpnXFI%**=wDMJ*G|EV_ls8JjhMzP_dPdFS4LkIs)Y_f8?vdBs?i z4_bJC;(w4@GqUmJ-Vxm>i{($&G7BpJM0{Up#fc9R2WIvkNc-=YWV z(=43`gE4ZA;>ayDqo^b(mT|pLJOo~qxD*8XRAao+v9|NiJl_Vx;STM{NV zd^ddC6dt(Dd9^f!Ts__<8?I%m>0!Y}VIiPm_+vnkFAuwE_D^*eZ??;Q{1b?Tq3*;+ zf<7Ga1+ryfu%R;LA=H)SY)Tw9|DNs4nt6R7UAaLKGT;-c#Pj;~qyfc|u}-twu$2Lz zu1&;x2W6-m$20%Azh+kT{+GJOWn1`(JG6}**Lh@-W*^jKCzSizY>PF@AAM`p;<8#W z1HIY77=||BN^NFSZjnx&XPVg3ukqya7BD0uCk$Jbc-}|`R}=*>=%0UdjR#!hY9%BQ z8IVFP!i(|46po-OmMyT6H9TTdE2Gm-S4dbe$GiF7k`C9c*)7qu&ir31cbvb#}+(}!g9#O)yLP; zK6uBlZwMUUl52X!yo{_f_79a}qb2>_;}awQ;m(iVLHc{y=zD4L{Jw;%S}~S2nnpE6 zCrM;HJARWudMZKwsSfV9_W2?XBus}UtpepQ*u}#9r!GgC)GF$hutZ=12Z2CF&?46N z#XZsJvI{BSpZkv`!}J`CHG-QTA|pF?!dXS3v{6q(C!i-n1)eHWU4h8ICkbNhavL3f zsZ1f!wp%^h$QU`$pm);!ha@C*{%7h=k4RyLZXUs4O?8g$`lVBzUaI*exS1??ZvT0Q zw~n^RbD{b>Xxg(0;dd1d7uGI`tCs1@BtWM8<nXI;MV0PEsq&)4yl@QtvqyA^$MUqgAfnaoTolQ15y z;xD~kir2d79#T5IJf_6~sVqM^E`u*vpQru_7uvKip18P?KEsu>Ruen&XH}-=i&ij%hUm0M5;G;r>^6srZ&6Seg!L{tENKH zS={+==5ZZw!v@5{Kho{Eg)I?qcBC(5qzjeqtLH%WuWxU?pI;tdZdTUESl^GTPyC+t z-~ai(mK$#V@VjMvUU)x#_xv&R-**Q0>yBi7evgK)S`S{r@4Ro1e(&qshHuw?F~U!y z$`=cMuM014yCK4_Z(hb&s&)QM^BqR?0swdR{wNr7#OH54Za|^Fi)mDHygO)JaR`#2 z2!8q4(cjvZBW@H;l|H%?umZ9O`~2bJl7X?#qL*5}9`?hL_U%Tnvd%qm3})u{-kIl4 zIwa2@yC>w?Z-4Y0r*%$CvQPV^sze&D15ti7Y@&3>i8+Nek4gTkWuB0(6VLTh?!Gi@ zVI)%>Z4zBwS<#Y(MCYtKb3kuWk}L&yuhD!zpE(JJ4Nq>LwvZJwaxR%-hWkxYaMY@W zrY!uV)5@S*-op>Q^`+gpELO=xM#ay52Zasb-!2dmZ95G#+9;E3hr^$fZc}Dto9c+K zLPcyc{ZLDrz2CZX+h~Yep(JWnQpvn}2FgW64kwaloWvW6&e*n(6dL4>huWjBqDe3? z6LxAw=I}%*z=eB0#}PgppW3wP%QbiN-P)vx573KvU|V7x(9?&N2ut8Wol?nY#+YLd ztfM%z!r?Iqrgw%ir7^E9m#$Q&no_cX%CaU1+=bq35QddgjhYW}|*m?GN`rWfcF*sN0s$kHl z*9^wt_nZj9u-U!675Bab7<$RZ@RN>H*)gM#U%sWUGhDcQ_+NONJ+@sDd#3~nN^$sT zrvHztvka;u=(hI3-6c2&cXxLW&cR&{PVgYX2^O3{a3{FCySoN=cX#=?b-(-LeXC~X zch}VPbno43t>^p+s0O@FhgdEWN9QOFmMP{|>!yzE~w^ zyPJXsn?fBWo3dkuhWN+0SNlc;UaZ#4=AT78X958Kt+h16%WwextVoCIFTvo~-J$@` zgh7|x!IykY;vLTq&v17aVUEIwjTY$Q2y80H21|tkoM2kG&C}sjzFK)k$;15c3HlqQ z#S7|5{DE@RV44Z6ij8`wkwsbfK9x^co@cG8F0KlNUg-JSvzLsv&+iggvl2x6{nIhF zKh|$MbPIpC1Dnb)^~$;VT&3AlMU~bISD~BYEpVt>y>G_O+j~;JC%`N+cL2@KRT8S2(}647V5L? ze^c9m1bYa6ukTKCaS9db7s`7Fx0RwQh|X+Zb3c@s^AS29G*x`(Si=8@Lq|hp-cWa< zRJeGZ)M%i}!7lvVk~MK3+nqWhI62e|+Il6|*R4GN{oHl)1N|Es+2ka-CB}3ov((vH zl;2b3JC3m5d*sIJ^FQ~C|N0xCDfz#C^Sk=;INJHD@Z;$fpH#$m_v0z%BU$9*GQd4k zEjmw@FG4j!6LJUO7`7$0Y0~v;jwqHod_acd#VP^~e4neyA(B~@w?CMg949_;=L^R- zT8BlDW<9OS)TXPqw7qsJ)`tqFyU+H5lb_~}Lh7EOU(JW(G1Qmolru%d3Wm##zm^;~ zjjf+3xg$Cx0nA|VMu z;@*4a5+w&_Tt2toKyfHOKIY{UE@p3*jI?+qfdlYny3|zwo>#W+X#g7biLI7ovVSL_6SCnk({_}azb?+y5+l+Sos?HO z8!9xwvOS;R8fk^xfi(TT&M2D)_6KG{Z8KIwV+A|+Mv!@ldqSp?+c%{oHbT8Bfd+k6 zixbC)X(RntZeJR&RG#%w+`S1Yr;-z>DYz^h z%>9J_T0rN*IL4Jx=T_?ts4QS8l1KXahf{bu>l*=&!QWW6RJiV?uLw+4PxQ0W6(Qu4 zu^t-~Kf0Rkh}hhAs?T`g3m5E8Vr(7?&vbYP>oMpj8aUOzq(@g)QZg6);X|4@uq}}) zjG8QqM>~mtcE+;q4!{%GzY*9cs;y?Roy;PE%UqMcV!T-bee+&6$_#f)IpMKDr1-O5 zx&N%DJz1MTAT3kl@k_lY>MSumWX|KXr0nt-g>dAnQQ!8#vpnLbuqpHe!Wy5%|K3_k zWnMe|;qP+%Qf^VCZEDd(%9EN?`xmdeg>6)Um*uYUr!a0e-?8MAn?;4OFZbFb$O!ZX zTF`U9GbmmL)(k5T=fJH?|K5%lAl7hyDWdSLSH}2Atv)+YA;~rRbKg+O^bROUI{K^7 zxfnW`tGwmsRh5>s9=r9c=tPqx_Tu^D5H0N57rI^c?ko&lb3rn zV(y)mJxheL?)O4TPxr2-J|RI_oj;m+cK$OY_T^iO?Bn$lM?SV-mU0BVNL!oAg!=8% z={r`xB>j^ZpQs?bFuWk34bKY~UO0IP4)jB18Lph{2(5@1fM{$Q{QEcsO1Ade3g>cL zHoDq#h9LLEr)qAAchR)Jt_14&FO)-2fx|;Cpbs<=^)OgR5ylxo3CLmqq$T1GJKJbW zSfgr3kHj!k`G?^`8HQKyXIBxDlbzxXhD_cU^{c2iW#n%BPW@bL0q|^$@pi>fu8B_F z*CPzVxm*j#3_=N9WR0K^7fla_p}x81 z#c0(@NtaV4EKU=mbRl9>JicePBfweF2jjJ)J(*`$DOvI7VH()FAE7_M0JoG41O}8wH}ZCBPvX+Zv8_YT8hj34q1ibXO3;v41ehv zs21rMVvZh?sb6Qo8kwE@fNp(a9KHO$g(`%~SiT3&Qb~p{1V*!A-O29Ya^}IrVr@K-uRDG%c07kb3sFd@?u zKoE~hot_R%Vpz=AQ|M*O)vo(}yc48Ti4%Gfq#k7&4LI5v`*i)a=Bmu6t}WMD2;3pR z{bhIte+=ScUl_eu3Lnhh4p+kl{acNC540(|@Dnb5!z{^_ne;l1*}=V^E>h;4{PStZITKWe^5i8{Y5ABipijr0ImQ@%&bmsZi=Qp!26P|qHu z%}`T>Yfl01V@8ainP%Uv~hDcv= zivU&Lkmi{u`d_LUP}d-*F|~;$#%QdVh3kZW&i=XS^F+)Pva}kultUEv*sF-L?d{OC z?*0dgTe`_g)~FY-ogTN?r970SChSS|bbc1(lX=&0E~U#^cHvy-j|FB7eaHFI>yEIq zZk?*vcp_g&)^NIKoq(EloGRaxvt*%oZ5EG>$;iIO1~tl&@-LPTKr)<)m9D8iA8oJe zr;35yJnwvCC&k7;u=;!9m#OUY zaw``RR!qO1IqA*e`yXLIogdt zCvTRtDP$QcU8%^X_S4WGU#QW2irgg@D6vD$73eBLE4v3EfF6ncp7OXyE3L?pwp0QMVl=S7z>oUo3k z(Apk?2#f*6owA`{0XfqbDYQbBxe)t7&`t|@hQyfmU0|td#>Asp60t8N^z;dbr;N|d zzNU|!{)LmcRk%K&x41#OP7dsnj464ZMFT}(&VI1LUMojfs*L>Hi0c046z!^(tE+n(Sww9D@%ln7Hk+2uTuW6aGinpVHK*((+;EXkmO*N6^ z>9YkK_TbI-jXn95f%$%ns4A4chGP=s?7GnYQ;zpt==+A8B&ux-0U`^bLJ9tWJ&EfX z=&4FISri<*xP5tQh2C;PEyff&OmOSwujEW%NyVLuY%G&LG)5NZvfPj1!Oa!ss`gEz zzf!*7+m`6{In%_@p| zERwqD0Tsb=ge>Z0?T1Q7j-XP#gJ^Ov$?wSKv-;;h!R}&@_TJCoJI@* zTucxcZY-0lN^b9mcY=6H>XqQ+3gpRubnAUT&d$!5USD2c@v(C{I@Aae#N)9sASC6A zmq=;-i2*Uv{zO(;)*g6gDtltpK_PH3gBpHwn>Qg#&ICzz++%!LqR=z1N%eVRE@;WJ z;g3GgU(sYd%r|A%E~fP~!x=R>)+Zu_)4D$@B+bb*d)-7GLNdNXLa$?yq(#bnplBfw zF$7gkg;=qQHg-pv!+&=)1Ih;;H1=OgqiGOY;*()@vui+~M7Lv*Rc{l0Wj2g77C91n zQ+NDUhd*o2jDWNAh`->DB*9BQo`!-(!@=X(dSGi6U zJ=r5+)jry}!5I7WE>oG8Xlw8UryQpxX@DYgkn#B0At2M+`&WPIIC&7sFY)CqnQOB@ z3V{xV12E7=UUn))UrU>g@Us|PFuL&Sb%u4%YLx{0i`l&DTPYX|Gm^%C#C9i0yBI zq)>j^CO^IDQb^ep7bcxCK}cuZ?jrM%k?e= zQ>*RV9rADs4MLEJUZnkyD3`4x0Vbb{c){fA-oQ!&gdva_uz-Pj3lNS*_+MnB5g?he z>mRFRqY-;B9JcMFU>8$gI}@Iv=vca?lVJY3bxqXJ>ru3s6$H1%$-^{2$X@CFg}~*| zAY*YCzf9r`e}(ri^Xt_f$9I-b@(8jL;<}MIWK@nnmROMgjtV0Sg-R?+9X)lKvwG9l z1o+(1X2OUl2AvA2g=Vx537)T{5s=Z&)ZEQLAcWGQVJhgu+ z!f&uziR1)5M+#Og7--c14KJ93)9a4EefoCMcLPNs+Ju=u5nlm?j8r|?4|&2F#CcL` zNmD(68*-+hzu!9-`kaSJCIPVn_-m3dUs67Jf|p(()Bcb6tB9ndYftW1iwV=pKOKn8 zxb2gzfc+Up6=Orrv(t3eN%||ZIty!qye-v)ND4NucrSTT1xetd2lFt17Qs6t2Uwgxg|nt^_>7xmU(a1sy@VBM zM*d#+g2O!3=jTf~T(rgi#$K|2n1$pj8}opbn@^^)6bqC2uaQ0N? zOtdb!^fQ78Ozhg#aSwHAjYn@SGm}RP6PZnNwwkw7&hwc{8iThvnUUsUQ`rNbvIxwu z5=9J)acAY!d3;FTwqtdPv~(@8Y?&b~Ezp;Sgzw!J{wvGmVI3D{$a5hoo_<6} zQ9o@afR$pL)?ZudI2arREyiL)lTVcp0S_Glsa-sRk)&#@-#aO>=Qz$|2XbT{^LD^Z zy>Q=vcEW@=ugsTDC|ZGZ-ebKovF^7q>y-webgq>bBsQr?!YTlr0NjL_JEiS!)HHg~ zCT5;o4K%%o;NO3l12P+)v=%9idi~&63aK8QHAD9hyWe?cFYuuNs-u>;SN|AKg+k;PYxSSXF(fGGPI zY;wnbFi2Qw8R6Jeb7-rGWiQ>+o7IVK50Xur`D8ZpvUcDYg1mo1K{PY6r-caU1GBc)rq< zYu!b}pjC zQZp36t#QD4hl+<^i0f(x9O?)B#T-=eZaJQL$xnig=qTKxA7(`ZCEGiDPMe?CmB*$P z>HJ@7OyH!ZQY8!A?GI#zhKluUAZS2q+ny{ON-W5v6%>KI!dBS_UCl!4cyp>ju7jlT zFK6s>le^X;owKHy6K6;@(76Qpq<2|M1DPI%-k;8L!%foAmFfBvieM#1HNO z(m%=LME1INT=xzYK8r1`wU0>q(b`NXy>1jz={aZ{;1WH`R*if=i# zNor#do}rK?$d>0q1_t|sM}u?fX6GTb8>xIYzU74hoXI&y;grhUk@5R&!l^di`z_>6onAA3+6AqvC=gngqiT^;>$QT(vx_G zotk6Vl>Dh$ooQ$$f(}IO0@$ zaI6~SV8nE8Y^m-*2EFKeMz);VF&k(K_&haQ&T8%(g|(e(Od_dW-u%ypsvJ6ro4hHN zsB9`1lPah`)_m1v^*;@l@3BmPYs!4imuO~nVdZ1a=ZgGL9W6iEkFl1QLR!Rpxq>K| zIwfCt>l}~O(A%eDW~8m|_Uy)QWBBwRVRcs?mL_Y7KrHhr@GKj|key%st{3Y*d$3}y zjB_YQ@3GN(w-|>((5Q8B>Z}RtZI}4+^qZa?eV|1m)OVs|K4PvRdvM@0x^->QdlyMj zbkk10scA4z`q@Zya(q<)p|Mk(3BCrTu}tCXWfJsk!)MQbeSX?SL|5|ZubGy`t7ZI=bO;As z5(Qj===hV_sBRn1;D~fN)~rYc;dJiFjw+>5)#$VhlJQ25LR*6o1)7TkPfxq?xw!ySW?Q`84dH0Q5UHmY+p>t%)X^o3tL|)PM!FAJ0yEPp9ZE*ICw43*Fxd z)-sL~51n7PURQUKw~+0|!4QY>pRuTGs_rV!NTSD7PSvBy z>%$QoqHMzd*Y`$Q$8-uRUlO60%s-Ql6pxT|gQmsii}+2h7VIqh9riF%uThXYFLio+ zuI>B!f3|wztVxA`gaz5x2GWCh$1Z2!j6s4~lc>YL6lctSOdWW`|Aei^^)aS~)c$#F zg;H79QHr-22sg14Lan(GpE~l1TyuAWvAjMpST-5YHt0l|5W8gFCs-CqKbDYyv4Sr9 zP6|(U`W|EFkcu_@`%DcMVwLax%k5qoXh{#&er&%?uNYy=bdqijl!rU_gu z&Jl!#l`RfW_Y-c>9?A~=pU;R9VI^J@9?~W}w3j|+uP~{20A^8}gO)!!t4@{$uK?q` z%CKH|EPnF2gtZJ6W82S-v1C47W<`)cFH8a}k@v$3Yb9c^qBsEH50H}-(+JLv6pTZ4 zH@84*zr$f%l#ueKC&!NVW^a&)?1&Iv>+OgAg&Yyf3YaksUD4>CvG9AGT6AO7Kk4W$ z7kG1CFU3i(g~EiYd!B?sZWhV}u>DD6Pb4J~WQGFXB9i2w)Q2}BrUh)w?}r!p8AS(v z&O}m@7X8Eg$h7~bE6bv8k64Q`^O z3CBIz7zFS+6Pa7}f-&7%;V#Rx{4>JZX7}}xNFxgcm5rt-V@~wCj;8fot`h+P#+d`D z%qL(A7`~cx-Wze&gLsnH@{%-Ga4=DAhP^5<3xC5~CNP=4&QUcWeLoD{&8!^1P7lee zbwbi_3ghOMw&g|2ej{_F5}Yye_yR&8SG*HDT*3}2BWJUJQh!h0f{)XlW1ly~ExU-- zv?b!=5Rh#?;KA7%lW>+t(oQn{ zxye#_!7R&7#T~@UU7u_-8(DEAk}7#7Nc0IfnbeNt#`LCqBiPN;nCarJv>sQrR@Nuf zE1BU~cpq~Uz4!(a7hzX46$*9Pt0nT>ku6Ed6SrDvu=vGO7;=8|n=igJVUj2=mXkoS z{3JqBQl73LOcuk0jBk!K0~%q8A?SNeyC6!R)x15F?Ds@(631)$V3jK>EElXe zU4?z|JN75Ga>wOP?>ij&DU)qR-H^^kUZi~Z-!oX8t+57Usit0}SLx`)4X+GOY}`Dk z*rT|*Ra~2_!DN3cpB%X1H3e#tJe*~F{- z`q)UMsokdL2&5PJ>t5qsP6_ywl zzlRZ%1ovulkLwF&FmCu+&bw$$5C?5;PjS%0wy^YYsXB={q~yFx1V}(SZT*S=bO_x4 zf&7y6_m#HS>o1Yw+tmz0EL`+X(Q%9#0y+iI{{3vXYlk=0=na`6boA;FS1nPNSGQrh zjchq62Fiqiwq7kqX^k0a5N>R?Siy_*;$L;vOVIH?K%r0 zLui$`Namh~6s(c;J8=%~l4j8=+(?YlC&fg+Ga^KLWV?zq`oLVA5oY{LD1EH>V%H+0-6bRNzMzZ`(@|9{nPDmBS2g(CG)Gq_mwZu zc@87TNoq=-Gv3flu*Pt1`jk~6;tsCSEzp(?D129-?v*7L)qYetu7Da_G z3kP-)4M)@aXoBM7JT{2RzQHI>KpjqVh3I+i&u~5&{fTe)_6UNZOJIuq?<+=mq};$f zH2elf+#AMWrmJehQUc0h>@a=^1f+n2^-S`3QlDQ3JyHh!HUN~6c5zf5_cX~rabm^p zqBzjZs8jUasRaq>?OscvPaVH1zlD+U1D4oj2dn-W0j?5-WD%Lew*27ZUjSTcC?|J@ybBicngiaU&E zRPE3}rew-@TJow53((8MYTLHBH9#_YIOxXFVp&p|af<hr>Y0N4Zb~=J|z*2Lt~6`I7_Si_Qc4{np%D`3+4kT5a?1ju-WC2Lixb zp!x8S*FmqeH763XmNnUMj1QX$$kF2C zx(k(rk>x9~k&1|9b6Z^Zkhd5sMSfd^^X|38{|pR87EMxjReVCY0Hv{cOtU{y?W)?c5*_I}Qme z2CM5Gc`~lp9eykm1iKu%{RyVr)+ymHF=MRv_K?_8vrTyXhOp^{F^FUFL%H;`<&mYV zQUXR6dS0EIlgyH6(Qhz<@>Zi3HQ-hY6X_Z%jUQ=^@rYE??~<+D+&wL8@I_&o`VOd- zS7@r;7B1Zl(ODg&+$KPY2CSf8>J7qY?p_&lC(x4Vg&rUVjD^OedD1Ttr+gFHpIn5S zI`4nw^ViRQ@mvmX8wfb|(6$uK&pwAIh9|cE;5@uq2>hClS9(h_k@U4)4SPO@y6VdK zY6nzX1kSyz;yCqTfe7D$fgI(as4GYNffXs~Q)=OJ_y0Mo{6AE}McLc-mrnSPBs9|F zo|iL}=RG7tg4(OSSsH?2mPwjU!K^+{cX2aX(M9ozf;dv_hB7qy@0C^~Xr>NLhuk!O zeW1LL$H=Vx$kj>>gdAreU`Mw~!f%HNfoP~PliTnZ#(>~n!tXn1?Xj3pWA*UJdS%W$ zdQ7ONgzj*q{eAU5nxVh?pa{)Zi(sh6UZs}hQ6#q_XoMF=+?oJJS)D0o8T?HSZ7P+! z9OR)hd5{+KGkdXW2pC86?Gxwpi$TW2L@Dm%+zca3_MDBvcO1#Dc!oE95|p&!{O~+s z$+$Lr(R5i?Fc8}i6)7-PCBZ+W7}VC`YJ?)}@p!aUQv&W7&MEhOSYdf7?%HE(w;7Fz zXxTE!b_(o2$6$Ks&8fP@jN+m3t_!){el|zV0^Lqu8!**-(ra-Kgv?p8$qQVKg0{Zb z0=;bod1d@eZ=Kz)q52UGm!P;*w;)z^a+Do9X+QJ@ye{L?z{woYwb#em3sMT-f8`5o zHdOgZ23fK4ekzt}chx|_x!U|qu30f_>53XJu@|LRZizJG6}@4^FdGK=Ag_b^v-|KQ z-IG^%T;eNGEs?YYGC{5l<|+~&2$Bmh?ba;89An>a+$mZjy`zXD-S+Z^+CVzdzT=H% z`*3rv(Djm|5Q=_U!UBR-($AJMZonAgKWUeNY&a^Mk)`!U%Hpk9I0lMZNWdRBJTfrN zp0->v^1mic_`#Q+TK=vpMF`qhHsh)CDn4GDAS@@MtMsz_Dy#OxxPZR%t&_8MFK)b@ zQY|$N*h9G+lYfp4sy;-EW8a8l9hzbCy1FuWs@c%DD@csr!S&Bu$WY%V#hF|iEr=dq zNRn{*4a@N~?DVtzYD)yTEhxloU}uX1JKP0Z>$BzS`bW5Blyr9HTU`!Qlgx#R(n@;C zWeFg7?D?qTXmno^ynQ}xFY)({HreuLwj)XR>uoheio635N@^3V2ZN@x=%ME!TU478-oBwF_Tv~X6&SX!RnR4+}PPy#cj|DEmUM?n;KnYP|P z1WVIPBJQR(%G9Pj&64_Lam?1%{B5~5wU57tTDa%1;SwmU*)PrYj&}3)+j`*lJ!_!X z@(GarSg|VS{}nFnn@PcE#m!<#<2EBz!7^`GoywI|HO-Kx)I*KXLnpPeg!#Xo!?pi& z3HerjhTiQelS5ozt9>b)q?uqby8LX21Fv?_L`3C&c=_xV{?ppJq2rx2?NU9fJpCUW zt}HGFpQJ~athJ;p10}oCFF54*JP>}(%icpoM~iz_;sTC#F`y=Nvm=o;Eb#-Ue#H0( zbPLTBM(_BWw=z=sX5lH1+IZe*%`+5(VKUj=(RwX~(43AEC3MhI12{oFo?B5EI<-5~ z#sU3BNbSyWgd#^9LKfu|yRG4G^@iNiLq0pt~iUjY`ez;%$4 z+ia=D&*~at9Z%}0)h}XnyAhKMjBAgKwf7cfVIv6|i zegLn!hZ9BsF`Vo+cEB-T$+Q53n%n`DObWCtT*Jir0VqdJWjDMQCVmBIKCZ*Zw#%Kk zdRglPDzfVexJtq7TC?iQe8YuqkJ#V>iRO%JAxexyCSN$Fi8rp?H5$)Ynb z+Mr(&E1fLUbekPIu|h=8`V?btY9nAhR@bc1%)4ozBvv9rg96mWG%b+yI>PVJ65gIw z%^)J0i7=nLtKoE-`69S)xERgl`&1koMUy4X;vjNgs+nRz$;Ty`F9A{P{Mu^!ceYxt z-wTFR3{usj`b=Y~B-an)Ad+dUOAo)8Er-HFL*p6+eum=E|f!D;=Bl zdW`AMl{jTI(k|8Fn4^J}6F!5{*yTq6H)fw1#PHt-1|aLp4_;s^&#%*2v);PheOOn} z|7#Au8=onE+$vK*TzhDU?mY!}v~Lw|_{GGqusq&vyfbBjAMavBu6ab>WqqH>c_+a> z7I57`U1WWEv1k}1YP+;*pUt4Mcq>iM2Lz!koJCb)(D&u8Zgn<0WIzxtFc-x?#ch%N zkN2%8riX1xnb)E1(~;PDDQBVmPu@`q>MWlR-!=DcxHq?Pzty(=bbq9)!J=mcXjwE6 zw_;{L@zSO5H&2^;nH#TG+)A`5f zSARHjLj47Z3g>JhG(i#;55Z`;K;F_)Pl#HSl#rbtK4qGKe|kwf*Otuii++x9kY2NK6^>V)Vv$DP-y2P?R7)dT zJKg;A$Upb zcAY-H-F2M=&HHT)%qEXU!i|!cE@+F<$L49U;=2uP#1pC(M9p=%c49RAe>(*}UA_?> zD^=a*ziRnR`7b*m%B27d9O%thykLLr@lf8KC~Na=qF*oVScL#j&iG{eo-!YWo!277 zRFLVWRrg+j2Bf4d-m}J<5dGD37aEFgGQ%XJ~6hWF~i=XhlXgl(~ZVZ-^pShbH?i%8w*t>r}$_R?5FBgSc-z?vY< zov6hhmh|2xt76b)O#n7-o!7@E%O7=I`5{)DnP4y|VLKA9E;gN1m`lrFo8vVdYe8OE z4pD4fzLGE7D?goHzfjaBYZkAN&Z9R!yyIy>gF9;4-DKd$BZXRQ1ybhtlE*Oi?0x5? zsN11QJ7t|@HM7uweyFYI&7ffWf*`69T2DmW<5!Tn&YES-Cj5fEf^u2{?0z}n)1H(` zF>AA$#5Td+`D^KI!q5E0rrNPzlKM#+LIG7M>tO=Zy1>C_8%I3|3ATc&TdN!tw>mfY zA7J;ljJm9k*Mm5KHQC``L?7X+o2(C_4ZjCs5>kaR@BM=e!XGjnT z;Tlg#v?nx-sNlC+v;=Lzxi=_>1~xgfG#QL4yEfLX+y5Jre3r1iTOBKymD2B^iR?7X zC(#OCVvthoc|cU~imW5|d!YM1w?+v+H>M9(z?RNgkJx+y&|xFI-A!~1ms<>W@4%$nD(^U9yX^QIyIQ1mOFe zp=}!e7pf)KrsgPV{dPYMtvAGAZV+R9eW*<(6mU6ubqn0DW#~Nq=ab940Yn(@`yj`P z4s4*Z581)QHA4gt7oAJw^8H2}i@l)MND446AYt=03ie8~vdeNsNSx~TZ3 zMW(_}OW;NT#cKjp%o&mhTP31Tn`VysowZwFQyS>~s!kR8{58}wun5S;d5 zZyn?H<+a&>RExGC#Wfm5$*S5(M*z~`OQYKNGQ>uw9*hAgmhunJY z9Hm8I;aT=?c{N!IQFQoN{)MD#BE;r%-}x8gMyF!qV`RDub9cJIs*Y4XVo*U2ZmrE6 z#+;pI*qa%dm^{^ApZ5Wvy6!~p(Y|fV4~(l#fx-+TgfIvigv|7XjNW7Uc=1vUXhZm| zCSmIZFJi{CNxvaY$4N*7qf>~%_D-e!nYDY$rkhyTKK=u* zz!yHh#zTBc#2rb_A*B?TaGW4``1Ji6^}D0hwY+H#3VX>{FJ+m+h4ckR~N`@Lg(uJZKAFx;}*Q{xi! z-j*5DEW#&S_FC7LpYd75Yi!%lk;jNcu5a)z8ne@EY9^qi0bJ49mm<`?^vRSX$(Z}s zSf#HNxX^b0ShYlMJVku$j44DkR?^XbktE?yTqr&-t7C+re$!H@JboP^;+fAf)M1Ki zvd0Y*dt$pDZK54>1O4H^9m5M{((0^OQ%IVSP2#97_%iai(di=gUqxoVb;9X)RtZVk z!GLQI75SVnc<&S{6?g$rqIpOp5P~>2AtNpZ9XYw0yxSLXCVLIJdmseh4CHDB4A!hX zBFRVWD$B;!f>30H=#lk5rnlbM1$&^oNcc)(nx7|PYoGnJTRZ)ky<;BWR*!H=Il3nk zYON3AVxAyNAl-##N>N2|neTzZTegcI7hec9KJb}TWUK3Esl^f3M2GfHupU$^SBEZu zvM-19+)u2N?^7p6*k*WQsG|!h_>jzc#`p03jmWN<^^6+`6$w~RuV>}SfCtrjN}Tt) zNWk-<&r$4x`~{MxocHr5Hk?MS9d?exd)G#HSJ9OHWl`O}9PnjuZ$nEDIiX=@NrmZ` ztqRhxhf}Ob>>671A=F(lEI!Ur@}WIBDiaOUs;97>x*60uaO!U_B-03inN6TA-~i#>J*u%x79&s;=(CVE zS7XL(y1XZ+ihfdj#pYdy@ni9uWq=4GMa%PtdG|=jqlRzf5>z2df%u}TDh2fI z`u;Cfjq-?S-*86nr#lyJi15iHbX_%C|FC>d?mIRuwNT>P{%3A|P6BO2H_B^ifRWyj ziI~t#y}tC9oHlSjUBqr^xprYvIV~St)&>qoH{;MmF7$n5U0zk6-d2|8wVIE+3*TJP$&7bnuXw zfV_SPT5&~hgKPJtD7cEMG)A~m1ZGdt=QiFt0alvM&z>I4m=YdTFE*fH8SdafZ}|{Y z>Kxcy=~6j`Y3kyzUC_C|DCnq*PQpJtx$@~WqyJuJf4a~QbnF|)TqVHdx_Vp+EZ7ir zq6*zQsObe=b(~xW2=*=>K+$Nk_+h5kw#ZW^9%U|zuW0DZO6`GHUWs2*8p7Cre>YqI zJANSF-qy3kfeP7;JL7f$!)rh3<*P*5wU0h?u8t-eQoBgt{^V-LEdCxR<;vxAG+^8t zn5y}U$+j;81xIREgZUKQU;`~8`n_zF(pG5i%llf;sv9Z#ZH4?K9k>a?OXz_<-Hc}Z zz#!W~mJ=jCnRN0%HGsnlv#vqPOr%KTTnCnLb1SqTT9NyG|CHUS`i4**rz0LlP==8~ zouR!2bXFoOQVWl{`T9h+o}X9+9@j+h2$(cJ3OMV&wn+$z8${wjo_AGI=h5kaTB{24amDFtYhSAcaC>?WU#hQ3p?#y5i|%{#IETdgKZCtQ6>lm)|RV@xqi~4-tshXXI@g2z%whi*gz) zj&AM>f2|T0yMaRip0n3B3Xyi~*p{dG|U4 zdEi9Frk;D|z63*D>0*Kn?Eyzq=lJ7w)$2LVVuv#CrNb>#iaRTQ7d+Vs19S4`ZIQ|) z&`(BJu53Yy%&zC)EZ-`TDVAgj)1`~J_In4?O=e;fTQWA&FH?1Pp8!t#AvR?m$DNkW z=Eko>SyWYfsmrD#AB(i#d&t;Vb2p(Lg*)RM{uDT!r+u(O&R=2*6^h&VXu#6#(?@0; zD{%J-^lr+9E!M&8AU~tH3$*91VVrDj3>#Kst-E9@WS--SHIgU%$d>JegkjyDyWLFf z`90nVgEzfacCW_><5d?k$Oex#k9c_ha2AoU<48LGw*(&QiTlOC>3BFP0u-nvXG`zB!$A;;vU(4DoU5hBxYA<045Ogo;ZFi8eCx*KM+-<~j+K zMnprsCHWGfUFc~ZxUv4%;pVFzs?NR23H;ij?eAW?@I$ zBG_r^YkoPXd&yrs@yWX|<#Jp*gOtkGd^FM2Q?e~m@<>N<{g=bbJ5P_dA^K?Flugzf zkGgqD8P=E+2XI7P!AVIXE%+2atA`T=Cdu4YNpXdgLTgkCJ8kXPs&xh^n~&2BT`iyj z*z;LEc+q?8@ml-E>)A1W`#LaVKm5pKRZaIHEHn&oX&H+_2$i3up7+(#@A`(enK3^U zvn^r{ofYG9_C#9V;)gCe(dp}yExw8#iXGXX%eWjSrEpjZaM`wvM%d``{aPO?;U{fz zeIc8D3LmRe9nEyPWj}RFZ?=2Ak@>pmW*FSrfErB72UT8+79XO|u|$l_R_&@K=0NgW zf4DbYFp!AXMxAx{Y4DAhs|-7~Syh2s^e@X%^wu7q2(?DK;Wer2qFOCNPWgP%D3y5| zwIK%Q^X@->HYkMn8C_$eQuc?3sVFTU|7&g;zHfyThs4NZ+}e3G&Rz}QjY%uzO?lr~KB?Li~w~|bT*^NQgOBl-xqmy9&_|y4_F8Kfw zI1SRfv8*Tn{;4IQz)F)a!np%k@_d^9|6}VNyEBctZQUofZ9A#hHY&Dl+qRultcq>h zw(X>18z*b6wohyOUHjAh2j;lv7=4c3uN2LzH#snihTKF84G!wuCMp7LiaTmVWXgGF zFOFWhxRlTDRepzJFXn3x<>-MWsRp*=!X!3Ah{3b}d>BxsHk(?aw65PtqaE7w` z+<(dtubk%HDss;wW0TK|3%%w9xb$SRC^Z_{b=<_E0u z%?x?wu@w^~zZsb$ypi2Dgj;)ltxay4+k2A<1@@b3N=dy(+2Wm1QQ}pH&tE_R)xCYh zhc=i|ky`c3!;;D}ZdtcWTZxUeDR}GuR(D6-%3!+S97R;HuqrM4WvZzc+El5v65Y1K zl7uQ5vQyeur*JEfPMwBmv zT9y5{ew_MmTe7}f#>s;kJ$(*G)&s7^Y6?SlA`CpVIeum&pvT>$Px|5L2 zs(oJo2c^zLR^6ChEZl23Rk|7+B10XZ z0_cW@knU-?=22L6_-lo6$b(DJQId}hBmx}&SUMQ}L-N8bc-?sfB*c=WC{UFk80K7# z{*JmsEm@-@DRM!Fe{q*|MBe5XDZD{D)!gyNV9k{bY$2j*+x(ou977QPsq2BK=}M7YvrNEkHrq;#U|Fe0mTzWG+N{F=_J}_UC*hzXD zoS!wgX0Qbh-aKwTz|d;#!NOG8Xda9Q%p1ojh5$Btb0V&k!}7Zizg(N#18FIni4K2^ zOpPkK?Oy^oR-fCdV^COFkFvZyPg1(_XnAaCf0X-;gO4e2UIm+iUC2bhm_R83p*LF} z7rD+6mx&3++7dRCb>6Y}j3B57@*s)>%vxvs3Tzlt1V?qcm5mSE*kU@&{MfMok0~-s zQpN=6!F3Ju+aYOnquSN;$rN1Cq)5%V9P=}+IF>ST@IT&|W9vcM=SM$jh2<(zkcDaG^iDqu7#FbS@lnKeCc zu}$SC*SVs)bu~D&a0;VeRJJvR(VT&N+!H8S=v{}yTvnik@A`La(^Ulp2@3Y!Ypm|Ank7F$l-N48#7@6o*0{w z->&94;;Hff*1k1Cm8Vsf^RGwY}IxV=pXj6IWQtMQS>3OOknO_LObhF5CtLcPBDmbMi zf|VP(YacCY-sYvXQ7U$G=wMMXAVQap>pAT**R?v9%d%V8#=wv$kXcfQaLszhJRdd@9Lf>)vk4s`TuHQ;oj`h-R=UmlVgAVXZgU$yZ)JChKyg@Q* z+Bv^tYu(X(t|oAAOBGIop_eBxqPph*9P&sNw`Uz=kw{|!YNUdIMqI3*jKy+Wg;L5x zz&L zkDecV;gEsauO}h!+=)fWbJ?c_DtJk!8KcVW;p((rBzaUeCc;PHjs83;D_CX_k5gI}OsY{dI2|aPZtkltn*Q;f5bDFnr0nv=6&6SS8 zaQf)L{}RFjxAe@oyI+0Lb-wF;5(%g}q}%^rG*GC=-snHfWc1qj1 zu+f05WW(9~S;HwX#qj&IH2X47O>t~#8^z_?WiA}Xb&SNiI~mR|rt(Ro2?K32;yd+w zA7Kw=Z&Q%wSK3HixKF&NVD z=EvyR6xkw9>53R4X>KPHmZal#^1)gz^2!A%)0FWei`oT!Ie$3-#c0wYl|OXZ&?LTp zSG;T59_a}F{eSQ#y=;!|PhPIOckK>GG$Jix7}Qu7O3E#shv9rtN%ph4)+-+7e^RXJ(wj|?mhRTs~{6^i(s%sHciH7T}pmh%Se<8dB7o$UmT4*2!JcPFGA-qz^ z6dlm%7o*K@cE$*75`h(f#L?Nzb`HUkCoIt18HcW^0;)8m#~}Y;4I;a@mvdaNU3ax) zAE9Ll{WbG@fIby-evvxGchuD+(=%vPjno*6Q0{+l_d_Ub@3&|pL*Yu$hXQJdVmO0w zUlE`71`+5qj(mw}gBX5W+03BTi5I!{vjgoja-(}DtC&gQ{jL+nkgeH(A7(LPNGU3|R5&{5w%|K_t=D-< zB>;<}532B0%3b87uJZ7wqsMf2mHS|h|0+l!y{e8d+zy?LX&6zUtCeaIJu|k;%!I(y z0g`G)G{)RBax6-iEMftEN5qr@QNw{eg+>i^F{I#=nyGcvP@O8SO(Y=u*wiYYlc5b* zyoR2E1MubwrzaOz?Q+h09|uT)PYkSTG+_7h3xNljS5&b%MV479I*_s3Y-9%UvEU{J zSv;?eMKsqMI5qhoU~J-_1gF!nDEoKj9bFpov^?W`MctR2=aK-ns+Kz8mhPytM8Zq7 zz=4u>sIz-!UJ{F=&-}kIX%c_Be5vRK(^0ZIS7R3$8A!T>LF^M6*P>z}m+6W1@N7k} z1tpl3h4QA24Gl=&XAk=%)O5cZQxfwmVt>sB+X*LkrAhf!98atavg6e%4ajT7Ak zq@!Nv(HH`MTI;8Zueoz+mX{dsfu@VMD`^k3v?saYlSTHPl3Fkkg#bulT37_~k!{QyFCp>+6e_kN(?w0-kkUht1eE*Z8os7(eQDn&2wyZ2vPAbmBiT}ucs9LhJi0i`B~JTLZ|OYJtw_0-&@ zc~WqgE_qu3d$ANO!F!;D=^P@Dx93i1dao8~|LDyKu{79;gu@+Mn&oDJLFv3GQRD!e z&DNm7#9qQ{89SIV;FpZiA7cRyUnaWAjU}RA_%B+AK1v@BlEf`cU@X+YR6NXO6^sE# z%T>ssSx=c)WS}IGJF^qm;9S026z}u$xU|Q%quCxaHKX84o?Vfs+udDB6Uo&vw0kCDUDrTgR)WvNJ1amWYe8X{5w z8$|Hbmyyzz(fLp!(yy6Rhh9}ghJfb=D&axT(i){b(1NxjKNg(c3^m3ScVM#taI?5YHzhXT-Iw44q(_dajpNTv-h$kmoARWdc>f?w% z>sYcWb5*6QIjkL7ztQtE8^Wiz4Ly)s2Jfp&iJ`9N?G_RUveOY|C39jI0YP_yZ*1~={Y)RagI0mZA)SEydfYyWLVQLX})B%kR2Tkh3_Txfm*n&jIK~k*WJ;SR@oV zgtM0bF%$jy{a7)a_Lr&en2| zLHdKl6TccDYfcQbV{pyLLOe$d)x{~QTgq` zdV7l5R^#FSUd)pBqFKvW|5-}_^0fXfnSK)@fZ1BX0tSr}_i>|{3Lu;;*Du-4r=YK| zk)@s~{{9*|0o^bt^M2B|^5wNgMb=0NL|pioIvfFYQ$D4o#~zc)%rNiAQc zvhtQ8vX1lwNTIAe-yFY6a9ZwpEgad~Tv}2sZuPBRQ@Vyhhm^-Dc=exNWZGp`wnWX2E z7k)|Wp66|N&oIMqsC**i*PO-KZf zAh>!MNOVP~e^Gs?MEO$<`F(gUFzD%@77l9VPAtgK_P73HqN2Y%+3_Rz`rO*U8HCk~ z{V{T4bozXl&y0ZRP2RjdqWy%!^_`zv?LfxxruCVNWoT}Bsene7P|q}k)h*A8q6iV5 zZvI{+WgWBx5LHosd*CwX)!Gar_Ai|uM-wY0@+T9r31M`QYFDWiTC`Z63beOW+N;ED zonTlvng0SgWHR2mcF-KUD&2-?$+N3`Y9Hl>datxlA&zc?xP7c9imuzUIbn2U0X7LN zHg2sRe_&HiB4of2i$=ptHTFSECYatf_Say&Y0-*xL9P;Gl`3sV|A(%*aAl%dF%>82 z4jFsPzV&8_QVY|f(Q*pnQ&*F{eY|~arp*1upmW6Y!N5RW91}^7&SZ;Vi#_ve)3cDB*rZTya6VMqHcw?Lu2IWD= zF($~crfVg{f&u9Ij&VicUD>T@Hel-ydLC4rkFyz#OPQ?)#qL0SKqrhkdd7l6B|hQQ zd&qwbdqBWLDKc+M?D+Ot#}c&-`D4AoK|`Q@EnGEan8({0!wn)SY<&0QcET9M$`+b| zcsuqEN37)&pv~;fMN2jq!Swi5eDSy1_uPm?f7Xebaa;pQa>4(Sb#6l0Um2#-w`_fN z0}`!Zy*`a(zJyvXG$i@ZVJ(4K0f_0onB2gGWJ9P>3*dm|chDXb1VE}jG*P94XIRDn zZ}sAR3wY}>qR-qeMV`Mgd6MxEzwff)wg%mUaO3?IN5t4dp^4)O22ryXGhruwKAWdq zms}MHHBAz*u4~n@mD{c0s}9d$}Y#wC_QpuygJ zk{exFI&F;<{U;0#Z|<886B-c@-4N5SL}HwKCAVL*bq9f&JkOgU2-ouL%X;A?K%`=alN>UbHBK}dQ#kQ8r-LR@lT5X-Yp#f&{@dCr$yz-*?iYeZ zo`l(+;yJ7ob6Fb!x@m{09~hbdlqCf(WefmG0f{qC@qq*0hX?;@@3!{3=Y87uYaw_4 z>XX}JqdR06Ct#f$`!I-J>%U=NHEHt`8PkZvL8ubuPsJ!n@`h}K6OZY;XF zIkl0~2@pv@Z+XRKEq5LTfY#>X?WB%Vx#UjX4CNi+$+%}*De|a)w2Hu*{&M?bC z8=>6eou;}O6{cigkmQ7Hb6~@uuHQDWprMfqS|%~%H!)x5cRhr52bXyJosqZnk?4b~ z+jE8*3LWZg3%lW&E z&rKEH&-zZ#z0IKbV0Q!DWV2b15lTfj8&Gf;qj4~KzY+q`vvfh1mZwwk9zAIH>|KkhaJCE z8ddK>Z))R%IfaJEM`7)}STXBOv>}57qNC3^nbJahr4J#DOH^7T7wbNmrS!gb-}Ai! zlU^nWI&383Z9|rpV7hlUia7@QS)D|YZafUjly~t&qgvR^l$?5rflyPspH{i-BLms>7CdA&Q=a1 zL)Cw;>;FDnuHJdq?#vM%%yT_mX@pA4B^L_S!hpl*YWTEQl(&^ENyE zyI{6HmcvXPOvQXNGx}4qUFhp_KQ4lK1C!~aUWHiAyn9(OAFi4bP&uT^ zkENAADy!&+oqFqjdN2Ut^ZGK^{k}GHVdnQ%@^t+%N3i#@2jTs-RP(>84G1!x|GnYn z`VYOH1T!B2!pGqN1fTCMOls~2XpfK2(S+VNt4hkuz4dskl&^V1AS)}hq*2uXJElsE z8N?EIycINj+#VFD`d#0pO1U`I>;dEsznobG8XE~4WW3T0cKdqgq!q&(DU5zFni|oH z4KQ2Z=^A>k5WtgM@VI!V|9B(BimA8W!0Ci$Nl2wf_*WX6S$!FcET+%!(sAfS0GjW; z*0mD6)=WxaUHQ%|`)4&Zoce_j&n{DW!tak$pragtT7`sC68G*6kOyePYcf5lvQ$-& z(tsB=pr*p%ng1!i+l7o`;8^@Z4QHgHfP48=lBvITyH+RX`23}_6`YR|ooVGcP zdg}yG34)QkyvT!HwjjZ{HfZ7Zyc>8L>vB7SpoG z0*}K|hQS{l%8$p?IsW+4z~V9u5=mt69D(BvN)+E^D5$AfQu{ACCF3)I3NG0g-P0~B zYg;Mr4Jq3x-q}yRp4cOe*j8T6%3=3k1lZjk&$+|-XqVsw6QFHgp*yit$blMU-nJo| zma%X#oGd4iA&sseX=lzj!4-{F0@Vpq=>K6(gjt;9qVdrlC$8D%M3*b|bUO$&(l$

&Z4UK7o*?|r3{Fmj;&U4V`X7i6%1 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 Mea;h8Sd7A0lh;o&DK;`pbZb>nS<)HI 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

V@ph35sbwuTgwev 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

^VEQ2xYd0ZCDhPtb|0(A^}{rI*R_J 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