diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6db79a40a..74109c7c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,113 @@
+# Version 24.36 - 2024-09-03
+
+### Added 🆕
+
+- chore: refs #7524 WIP limit call by:jorgep
+- chore: refs #7524 modify ormConfig table col (origin/7524-warmfix-modifyColumn) by:jorgep
+- feat(update-user): refs #7848 add twoFactor by:alexm
+- feat: #3199 Requested changes by:guillermo
+- feat: refs #3199 Added more scopes ticket_recalcByScope by:guillermo
+- feat: refs #3199 Added one more scope ticket_recalcByScope by:guillermo
+- feat: refs #3199 Created ticket_recalcItemTaxCountryByScope by:guillermo
+- feat: refs #3199 Requested changes by:guillermo
+- feat: refs #7346 add multiple feature by:jgallego
+- feat: refs #7346 backTest checks new implementation by:jgallego
+- feat: refs #7346 mas intuitivo by:jgallego
+- feat: refs #7514 Changes to put srt log (origin/7514-srtLog) by:guillermo
+- feat: refs #7524 add default limit (origin/7524-limitSelect) by:jorgep
+- feat: refs #7524 add mock limit on find query by:jorgep
+- feat: refs #7524 wip remote hooks by:jorgep
+- feat: refs #7562 Requested changes by:guillermo
+- feat: refs #7567 Changed time to call event by:guillermo
+- feat: refs #7567 Requested changes by:guillermo
+- feat: refs #7710 pr revision by:jgallego
+- feat: refs #7710 test fixed (origin/7710-cloneWithTicketPackaging, 7710-cloneWithTicketPackaging) by:jgallego
+- feat: refs #7712 Fix by:guillermo
+- feat: refs #7712 Unify by:guillermo
+- feat: refs #7712 sizeLimit (origin/7712-sizeLimit) by:guillermo
+- feat: refs #7758 Add code mandateType and accountDetailType by:ivanm
+- feat: refs #7758 Modify code lowerCamelCase and UNIQUE by:ivanm
+- feat: refs #7758 accountDetailType fix deploy error by:ivanm
+- feat: refs #7784 Changes in entry-order-pdf by:guillermo
+- feat: refs #7784 Requested changes by:guillermo
+- feat: refs #7799 Added Fk in vn.item.itemPackingTypeFk by:guillermo
+- feat: refs #7800 Added company Fk by:guillermo
+- feat: refs #7842 Added editorFk in vn.host by:guillermo
+- feat: refs #7860 Update new packagings (origin/7860-newPackaging) by:guillermo
+- feat: refs #7862 roadmap new fields by:ivanm
+- feat: refs #7882 Added quadMindsConfig table by:guillermo
+
+### Changed 📦
+
+- refactor: refs #7567 Fix and improvement by:guillermo
+- refactor: refs #7567 Minor change by:guillermo
+- refactor: refs #7756 Fix tests by:guillermo
+- refactor: refs #7798 Drop bi.Greuges_comercial_detail by:guillermo
+- refactor: refs #7848 adapt to lilium by:alexm
+
+### Fixed 🛠️
+
+- feat: refs #7710 test fixed (origin/7710-cloneWithTicketPackaging, 7710-cloneWithTicketPackaging) by:jgallego
+- feat: refs #7758 accountDetailType fix deploy error by:ivanm
+- fix(salix): #7283 ItemFixedPrice duplicated (origin/7283_itemFixedPrice_duplicated) by:Javier Segarra
+- fix: refs #7346 minor error (origin/7346, 7346) by:jgallego
+- fix: refs #7355 remove and tests accounts (origin/7355-accountMigration2) by:carlossa
+- fix: refs #7355 remove and tests accounts by:carlossa
+- fix: refs #7524 default limit select by:jorgep
+- fix: refs #7756 Foreign keys invoiceOut (origin/7756-fixRefFk) by:guillermo
+- fix: refs #7756 id 0 by:guillermo
+- fix: refs #7800 tpvMerchantEnable PRIMARY KEY (origin/7800-tpvMerchantEnable) by:guillermo
+- fix: refs #7800 tpvMerchantEnable PRIMARY KEY by:guillermo
+- fix: refs #7916 itemShelving_transfer (origin/test, test) by:guillermo
+- fix: refs #pako Deleted duplicated version by:guillermo
+
+# Version 24.34 - 2024-08-20
+
+### Added 🆕
+
+- #6900 feat: clear empty by:jorgep
+- #6900 feat: empty commit by:jorgep
+- chore: refs #6900 beautify code by:jorgep
+- chore: refs #6989 add config model by:jorgep
+- feat workerActivity refs #6078 by:sergiodt
+- feat: #6453 Refactor (origin/6453-orderConfirm) by:guillermo
+- feat: #6453 Rollback always split by itemPackingType by:guillermo
+- feat: deleted worker module code & redirect to Lilium by:Jon
+- feat: refs #6453 Added new ticket search by:guillermo
+- feat: refs #6453 Fixes by:guillermo
+- feat: refs #6453 Minor changes by:guillermo
+- feat: refs #6453 Requested changes by:guillermo
+- feat: refs #6900 drop section by:jorgep
+- feat: refs #7283 order by desc date by:jorgep
+- feat: refs #7323 add locale by:jorgep
+- feat: refs #7323 redirect to lilium by:jorgep
+- feat: refs #7646 delete scannableCodeType by:robert
+- feat: refs #7713 Created ACLLog by:guillermo
+- feat: refs #7774 (origin/7774-ticket_cloneWeekly) by:robert
+- feat: refs #7774 #7774 Changes ticket_cloneWeekly by:guillermo
+- feat: refs #7774 ticket_cloneWeekly by:robert
+
+### Changed 📦
+
+- refactor: refs #6453 Major changes by:guillermo
+- refactor: refs #6453 Minor changes by:guillermo
+- refactor: refs #6453 order_confirmWithUser by:guillermo
+- refactor: refs #7646 #7646 Deleted scannable* variables productionConfig by:guillermo
+- refactor: refs #7820 Deprecated silexACL by:guillermo
+
+### Fixed 🛠️
+
+- #6900 fix: #6900 rectificative filter by:jorgep
+- #6900 fix: empty commit by:jorgep
+- fix(orders_filter): add sourceApp accepts by:alexm
+- fix: refs #6130 commit lint by:pablone
+- fix: refs #6453 order_confirmWithUser by:guillermo
+- fix: refs #7283 sql by:jorgep
+- fix: refs #7713 ACL Log by:guillermo
+- test: fix claim descriptor redirect to lilium by:alexm
+- test: fix ticket redirect to lilium by:alexm
+- test: fix ticket sale e2e by:alexm
+
# Version 24.32 - 2024-08-06
### Added 🆕
diff --git a/back/methods/vn-user/update-user.js b/back/methods/vn-user/update-user.js
index ddaae8548..202b01c65 100644
--- a/back/methods/vn-user/update-user.js
+++ b/back/methods/vn-user/update-user.js
@@ -24,6 +24,10 @@ module.exports = Self => {
arg: 'lang',
type: 'string',
description: 'The user lang'
+ }, {
+ arg: 'twoFactor',
+ type: 'string',
+ description: 'The user twoFactor'
}
],
http: {
@@ -32,8 +36,8 @@ module.exports = Self => {
}
});
- Self.updateUser = async(ctx, id, name, nickname, email, lang) => {
+ Self.updateUser = async(ctx, id, name, nickname, email, lang, twoFactor) => {
await Self.userSecurity(ctx, id);
- await Self.upsertWithWhere({id}, {name, nickname, email, lang});
+ await Self.upsertWithWhere({id}, {name, nickname, email, lang, twoFactor});
};
};
diff --git a/back/model-config.json b/back/model-config.json
index 13c06ef54..cb9ee4fdb 100644
--- a/back/model-config.json
+++ b/back/model-config.json
@@ -118,6 +118,9 @@
"NotificationSubscription": {
"dataSource": "vn"
},
+ "OrmConfig": {
+ "dataSource": "vn"
+ },
"Province": {
"dataSource": "vn"
},
diff --git a/back/models/ormConfig.json b/back/models/ormConfig.json
new file mode 100644
index 000000000..ef4c2b181
--- /dev/null
+++ b/back/models/ormConfig.json
@@ -0,0 +1,26 @@
+{
+ "name": "OrmConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "ormConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true
+ },
+ "selectLimit": {
+ "type": "number"
+ }
+ },
+ "acls": [
+ {
+ "accessType": "*",
+ "principalType": "ROLE",
+ "principalId": "$authenticated",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/back/models/vn-user.js b/back/models/vn-user.js
index 6ec5642a2..531561e04 100644
--- a/back/models/vn-user.js
+++ b/back/models/vn-user.js
@@ -101,9 +101,10 @@ module.exports = function(Self) {
const headers = httpRequest.headers;
const origin = headers.origin;
- const defaultHash = '/reset-password?access_token=$token$';
+ const defaultHash = '!/reset-password?access_token=$token$';
const recoverHashes = {
- hedera: 'verificationToken=$token$'
+ hedera: '!verificationToken=$token$',
+ lilium: '/resetPassword?access_token=$token$'
};
const app = info.options?.app;
@@ -115,7 +116,7 @@ module.exports = function(Self) {
const params = {
recipient: info.email,
lang: user.lang,
- url: origin + '/#!' + recoverHash
+ url: origin + '/#' + recoverHash
};
const options = Object.assign({}, info.options);
diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql
index 37e7835fc..a1c15a30f 100644
--- a/db/dump/.dump/data.sql
+++ b/db/dump/.dump/data.sql
@@ -3,7 +3,7 @@ USE `util`;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-INSERT INTO `version` VALUES ('vn-database','11180','2a5588f013dbb6370e15754e03a6d9f1d74188e2','2024-08-20 08:34:44','11191');
+INSERT INTO `version` VALUES ('vn-database','11209','3cc19549e4a9d61542b5ba906ccaf9fc90a805ce','2024-09-03 15:04:20','11212');
INSERT INTO `versionLog` VALUES ('vn-database','10107','00-firstScript.sql','jenkins@10.0.2.69','2022-04-23 10:53:53',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','10112','00-firstScript.sql','jenkins@10.0.2.69','2022-05-09 09:14:53',NULL,NULL);
@@ -896,6 +896,9 @@ INSERT INTO `versionLog` VALUES ('vn-database','11137','00-firstScript.sql','jen
INSERT INTO `versionLog` VALUES ('vn-database','11138','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-23 08:23:34',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11139','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-07-08 10:58:01',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11140','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-23 08:23:34',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11141','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11142','00-invoiceOutSerialColumn.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11142','01-invoiceOutSerialUpdate.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11145','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-09 13:55:46',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11146','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-08-06 07:53:54',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11149','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-23 08:23:35',NULL,NULL);
@@ -915,10 +918,45 @@ INSERT INTO `versionLog` VALUES ('vn-database','11166','00-firstScript.sql','jen
INSERT INTO `versionLog` VALUES ('vn-database','11168','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-25 08:58:34',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11169','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-07-25 12:38:13',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11170','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-08-09 07:12:38',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11171','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','01-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','02-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','03-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','04-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:07',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','05-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:08',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','06-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:39:08',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','07-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:40:15',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','08-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:54:58',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','09-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:55:00',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','10-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:55:16',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','11-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:20',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','12-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:20',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','13-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:20',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','14-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:25',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11172','15-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:44',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11175','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:44',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11177','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-07-30 12:42:28',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11179','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-08-20 08:34:43',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11180','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-08-20 08:34:43',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11182','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-08-09 08:19:36',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11185','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:44',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11187','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:57:44',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11189','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:00',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11190','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:00',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11191','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:00',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11191','01-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11191','02-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11192','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11193','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11193','01-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11193','02-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11194','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11195','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11197','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11201','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-08-27 13:04:26',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11204','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11209','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-09-03 08:58:01',NULL,NULL);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
@@ -1428,7 +1466,7 @@ INSERT INTO `ACL` VALUES (157,'Calendar','absences','READ','ALLOW','ROLE','emplo
INSERT INTO `ACL` VALUES (158,'ItemTag','*','WRITE','ALLOW','ROLE','accessory',NULL);
INSERT INTO `ACL` VALUES (160,'TicketServiceType','*','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (161,'TicketConfig','*','READ','ALLOW','ROLE','employee',NULL);
-INSERT INTO `ACL` VALUES (162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','invoicing',NULL);
+INSERT INTO `ACL` VALUES (162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','adminBoss',783);
INSERT INTO `ACL` VALUES (163,'InvoiceOut','book','WRITE','ALLOW','ROLE','invoicing',NULL);
INSERT INTO `ACL` VALUES (165,'TicketDms','*','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (167,'Worker','isSubordinate','READ','ALLOW','ROLE','employee',NULL);
@@ -1551,9 +1589,8 @@ INSERT INTO `ACL` VALUES (320,'ItemType','*','WRITE','ALLOW','ROLE','buyer',NULL
INSERT INTO `ACL` VALUES (321,'InvoiceOut','refund','WRITE','ALLOW','ROLE','invoicing',NULL);
INSERT INTO `ACL` VALUES (322,'InvoiceOut','refund','WRITE','ALLOW','ROLE','salesAssistant',NULL);
INSERT INTO `ACL` VALUES (323,'InvoiceOut','refund','WRITE','ALLOW','ROLE','claimManager',NULL);
-INSERT INTO `ACL` VALUES (324,'Ticket','refund','WRITE','ALLOW','ROLE','invoicing',NULL);
-INSERT INTO `ACL` VALUES (325,'Ticket','refund','WRITE','ALLOW','ROLE','salesAssistant',NULL);
-INSERT INTO `ACL` VALUES (326,'Ticket','refund','WRITE','ALLOW','ROLE','claimManager',NULL);
+INSERT INTO `ACL` VALUES (324,'Ticket','cloneAll','WRITE','ALLOW','ROLE','invoicing',10578);
+INSERT INTO `ACL` VALUES (326,'Ticket','cloneAll','WRITE','ALLOW','ROLE','claimManager',10578);
INSERT INTO `ACL` VALUES (327,'Sale','clone','WRITE','ALLOW','ROLE','salesAssistant',NULL);
INSERT INTO `ACL` VALUES (328,'Sale','clone','WRITE','ALLOW','ROLE','claimManager',NULL);
INSERT INTO `ACL` VALUES (329,'TicketRefund','*','WRITE','ALLOW','ROLE','invoicing',NULL);
@@ -1841,7 +1878,7 @@ INSERT INTO `ACL` VALUES (626,'Ticket','collectionLabel','READ','ALLOW','ROLE','
INSERT INTO `ACL` VALUES (628,'Ticket','expeditionPalletLabel','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (629,'Ticket','editDiscount','WRITE','ALLOW','ROLE','artificialBoss',NULL);
INSERT INTO `ACL` VALUES (630,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','salesTeamBoss',NULL);
-INSERT INTO `ACL` VALUES (635,'Ticket','updateAttributes','WRITE','ALLOW','ROLE','administrative',NULL);
+INSERT INTO `ACL` VALUES (635,'Ticket','updateAttributes','WRITE','ALLOW','ROLE','administrative',19295);
INSERT INTO `ACL` VALUES (636,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (637,'Claim','downloadFile','READ','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (638,'Agency','seeExpired','READ','ALLOW','ROLE','artificialBoss',NULL);
@@ -1871,7 +1908,7 @@ INSERT INTO `ACL` VALUES (688,'ClientSms','create','WRITE','ALLOW','ROLE','emplo
INSERT INTO `ACL` VALUES (689,'Vehicle','sorted','WRITE','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (695,'ViaexpressConfig','internationalExpedition','WRITE','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (696,'ViaexpressConfig','renderer','READ','ALLOW','ROLE','employee',NULL);
-INSERT INTO `ACL` VALUES (697,'Ticket','transferClient','WRITE','ALLOW','ROLE','administrative',NULL);
+INSERT INTO `ACL` VALUES (697,'Ticket','transferClient','WRITE','ALLOW','ROLE','claimManager',19295);
INSERT INTO `ACL` VALUES (698,'Ticket','canEditWeekly','WRITE','ALLOW','ROLE','buyer',NULL);
INSERT INTO `ACL` VALUES (699,'TicketSms','find','READ','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (701,'Docuware','upload','WRITE','ALLOW','ROLE','deliveryAssistant',NULL);
@@ -1991,7 +2028,6 @@ INSERT INTO `ACL` VALUES (817,'ParkingLog','*','READ','ALLOW','ROLE','employee',
INSERT INTO `ACL` VALUES (818,'ExpeditionPallet','*','*','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (819,'Ticket','addSaleByCode','WRITE','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (820,'TicketCollection','*','READ','ALLOW','ROLE','production',NULL);
-INSERT INTO `ACL` VALUES (821,'Ticket','clone','WRITE','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (822,'SupplierDms','*','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (823,'MailAlias','*','*','ALLOW','ROLE','developerBoss',NULL);
INSERT INTO `ACL` VALUES (824,'ItemShelving','hasItemOlder','READ','ALLOW','ROLE','production',NULL);
@@ -2012,7 +2048,7 @@ INSERT INTO `ACL` VALUES (840,'Locker','*','*','ALLOW','ROLE','hr',NULL);
INSERT INTO `ACL` VALUES (841,'Locker','*','*','ALLOW','ROLE','productionBoss',NULL);
INSERT INTO `ACL` VALUES (842,'Worker','__get__locker','READ','ALLOW','ROLE','hr',NULL);
INSERT INTO `ACL` VALUES (843,'Worker','__get__locker','READ','ALLOW','ROLE','productionBoss',NULL);
-INSERT INTO `ACL` VALUES (846,'Ticket','refund','WRITE','ALLOW','ROLE','logistic',NULL);
+INSERT INTO `ACL` VALUES (846,'Ticket','cloneAll','WRITE','ALLOW','ROLE','logistic',10578);
INSERT INTO `ACL` VALUES (847,'RouteConfig','*','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (848,'InvoiceIn','updateInvoiceIn','WRITE','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (849,'InvoiceIn','clone','WRITE','ALLOW','ROLE','administrative',NULL);
@@ -2070,6 +2106,7 @@ INSERT INTO `ACL` VALUES (904,'Entry','buyLabel','READ','ALLOW','ROLE','supplier
INSERT INTO `ACL` VALUES (905,'AddressWaste','*','READ','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (906,'Entry','print','READ','ALLOW','ROLE','supplier',NULL);
INSERT INTO `ACL` VALUES (907,'Expedition_PrintOut','*','*','ALLOW','ROLE','production',NULL);
+INSERT INTO `ACL` VALUES (908,'Docuware','upload','WRITE','ALLOW','ROLE','hrBuyer',13657);
INSERT INTO `fieldAcl` VALUES (1,'Client','name','update','employee');
INSERT INTO `fieldAcl` VALUES (2,'Client','contact','update','employee');
@@ -2364,11 +2401,9 @@ INSERT INTO `component` VALUES (39,'maná auto',7,NULL,NULL,1,'autoMana',0);
INSERT INTO `component` VALUES (40,'cambios Santos 2016',4,NULL,NULL,1,NULL,0);
INSERT INTO `component` VALUES (41,'bonificacion porte',6,NULL,NULL,1,'freightCharge',0);
INSERT INTO `component` VALUES (42,'promocion Francia',4,NULL,NULL,1,'frenchOffer',0);
-INSERT INTO `component` VALUES (43,'promocion Floramondo',4,NULL,NULL,1,'floramondoPromo',0);
INSERT INTO `component` VALUES (44,'rappel cadena',2,NULL,NULL,1,'rappel',0);
INSERT INTO `component` VALUES (45,'maná reclamacion',7,4,NULL,0,'manaClaim',0);
INSERT INTO `component` VALUES (46,'recargo a particular',2,NULL,0.25,0,'individual',0);
-INSERT INTO `component` VALUES (47,'promocion Italia',4,NULL,NULL,1,'italianOffer',0);
INSERT INTO `component` VALUES (48,'fusión de lineas',4,NULL,NULL,1,'lineFusion',0);
INSERT INTO `component` VALUES (49,'sustitución',4,NULL,NULL,1,'substitution',0);
@@ -2393,57 +2428,57 @@ INSERT INTO `continent` VALUES (5,'Oceanía','OC');
INSERT INTO `department` VALUES (1,'VN','VERDNATURA',1,112,763,0,0,0,0,26,NULL,'/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (22,'shopping','COMPRAS',2,5,NULL,72,0,0,1,1,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (23,'CMA','CAMARA',15,16,NULL,72,1,1,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (23,'CMA','CAMARA',15,16,NULL,72,1,1,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,'PREVIOUS');
INSERT INTO `department` VALUES (31,'it','INFORMATICA',6,7,NULL,72,0,0,1,0,1,'/1/','informatica-cau',1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (34,'accounting','CONTABILIDAD',8,9,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (35,'finance','FINANZAS',10,11,NULL,0,0,0,1,0,1,'/1/',NULL,1,'begonya@verdnatura.es',1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (36,'labor','LABORAL',12,13,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (37,'PROD','PRODUCCION',14,37,NULL,72,1,1,1,11,1,'/1/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (38,'picking','SACADO',17,18,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (39,'packing','ENCAJADO',19,20,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (38,'picking','SACADO',17,18,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_PREPARATION');
+INSERT INTO `department` VALUES (39,'packing','ENCAJADO',19,20,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'PACKING');
INSERT INTO `department` VALUES (41,'administration','ADMINISTRACION',38,39,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (43,'VT','VENTAS',40,71,NULL,0,0,0,1,15,1,'/1/',NULL,0,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (43,'VT','VENTAS',40,71,NULL,0,0,0,1,15,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (44,'management','GERENCIA',72,73,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (45,'logistic','LOGISTICA',74,75,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (46,'delivery','REPARTO',76,77,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',78,79,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (46,'delivery','REPARTO',76,77,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'DELIVERY');
+INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',78,79,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'STORAGE');
INSERT INTO `department` VALUES (49,NULL,'PROPIEDAD',80,81,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (52,NULL,'CARGA AEREA',82,83,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (53,'marketing','MARKETING Y COMUNICACIÓN',41,42,NULL,72,0,0,2,0,43,'/1/43/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (54,NULL,'ORNAMENTALES',84,85,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (55,NULL,'TALLER NATURAL',21,22,14548,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1118,NULL,NULL,NULL);
INSERT INTO `department` VALUES (56,NULL,'TALLER ARTIFICIAL',23,24,8470,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1927,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (58,'CMP','CAMPOS',86,89,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (58,'CMP','CAMPOS',86,89,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'FIELD');
INSERT INTO `department` VALUES (59,'maintenance','MANTENIMIENTO',90,91,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (60,'claims','RECLAMACIONES',43,44,NULL,72,0,0,2,0,43,'/1/43/',NULL,0,NULL,1,1,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (60,'claims','RECLAMACIONES',43,44,NULL,72,0,0,2,0,43,'/1/43/',NULL,0,NULL,1,1,0,0,NULL,NULL,NULL,'CLAIM');
INSERT INTO `department` VALUES (61,NULL,'VNH',92,95,NULL,73,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (66,NULL,'VERDNAMADRID',96,97,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (68,NULL,'COMPLEMENTOS',25,26,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (69,NULL,'VERDNABARNA',98,99,NULL,74,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',45,46,4250,0,0,0,2,0,43,'/1/43/','es5_equipo',0,'es5@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL);
+INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',45,46,4250,0,0,0,2,0,43,'/1/43/','es5_equipo',1,'es5@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL);
INSERT INTO `department` VALUES (86,NULL,'LIMPIEZA',100,101,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (89,NULL,'COORDINACION',102,103,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (90,NULL,'TRAILER',93,94,NULL,0,0,0,2,0,61,'/1/61/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (91,'artificial','ARTIFICIAL',27,28,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (91,'artificial','ARTIFICIAL',27,28,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PREVIOUS');
INSERT INTO `department` VALUES (92,NULL,'EQUIPO SILVERIO',47,48,1203,0,0,0,2,0,43,'/1/43/','sdc_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',49,50,3797,0,0,0,2,0,43,'/1/43/','es2_equipo',0,'es2@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL);
-INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',51,52,24065,0,0,0,2,0,43,'/1/43/','es1_equipo',0,'es1@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL);
+INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',49,50,3797,0,0,0,2,0,43,'/1/43/','es2_equipo',1,'es2@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL);
+INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',51,52,24065,0,0,0,2,0,43,'/1/43/','es1_equipo',1,'es1@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL);
INSERT INTO `department` VALUES (96,NULL,'EQUIPO C LOPEZ',53,54,4661,0,0,0,2,0,43,'/1/43/','cla_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (115,NULL,'EQUIPO CLAUDI',55,56,3810,0,0,0,2,0,43,'/1/43/','csr_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (123,NULL,'EQUIPO ELENA BASCUÑANA',57,58,7102,0,0,0,2,0,43,'/1/43/','ebt_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',104,105,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/','es3_equipo',0,'es3@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL);
+INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/','es3_equipo',1,'es3@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL);
INSERT INTO `department` VALUES (126,NULL,'PRESERVADO',29,30,NULL,0,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (128,NULL,'PALETIZADO',31,32,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (130,NULL,'REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (128,NULL,'PALETIZADO',31,32,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PALLETIZING');
+INSERT INTO `department` VALUES (130,NULL,'REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING');
INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',87,88,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (132,NULL,'EQUIPO DC',61,62,1731,0,0,0,2,0,43,'/1/43/','dc_equipo',1,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (133,'franceTeam','EQUIPO FRANCIA',63,64,1731,72,0,0,2,0,43,'/1/43/','fr_equipo',0,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL);
-INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',65,66,6264,0,0,0,2,0,43,'/1/43/','pt_equipo',0,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL);
+INSERT INTO `department` VALUES (133,'franceTeam','EQUIPO FRANCIA',63,64,1731,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL);
+INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',65,66,6264,0,0,0,2,0,43,'/1/43/','pt_equipo',1,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL);
INSERT INTO `department` VALUES (135,'routers','ENRUTADORES',106,107,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (136,'heavyVehicles','VEHICULOS PESADOS',108,109,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (137,'sorter','SORTER',110,111,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',67,68,3803,0,0,0,2,0,43,'/1/43/','es4_equipo',0,'es4@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL);
+INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',67,68,3803,0,0,0,2,0,43,'/1/43/','es4_equipo',1,'es4@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL);
INSERT INTO `department` VALUES (140,'hollandTeam','EQUIPO HOLANDA',69,70,NULL,0,0,0,2,0,43,'/1/43/','nl_equipo',1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (141,NULL,'PREVIA',35,36,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (146,NULL,'VERDNACOLOMBIA',3,4,NULL,72,0,0,2,0,22,'/1/22/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
@@ -2575,6 +2610,7 @@ INSERT INTO `state` VALUES (37,'Previa Revisado',3,0,'PREVIOUS_CONTROLLED',2,29,
INSERT INTO `state` VALUES (38,'Prep Cámara',6,2,'COOLER_PREPARATION',7,14,0,0,0,2,0,0,2,0,'warning');
INSERT INTO `state` VALUES (41,'Prep Parcial',6,2,'PARTIAL_PREPARATION',7,14,0,0,0,2,0,0,2,0,'warning');
INSERT INTO `state` VALUES (42,'Entregado en parte',13,3,'PARTIAL_DELIVERED',NULL,16,0,1,0,0,0,0,0,0,NULL);
+INSERT INTO `state` VALUES (43,'Preparación por caja',6,2,'BOX_PICKING',7,42,0,0,0,2,0,0,2,0,'warning');
INSERT INTO `ticketUpdateAction` VALUES (1,'Cambiar los precios en el ticket','renewPrices');
INSERT INTO `ticketUpdateAction` VALUES (2,'Convertir en maná','mana');
diff --git a/db/dump/.dump/privileges.sql b/db/dump/.dump/privileges.sql
index 1af4b446a..96d417ec5 100644
--- a/db/dump/.dump/privileges.sql
+++ b/db/dump/.dump/privileges.sql
@@ -929,16 +929,14 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','tillConfig',
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','till','juan@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','productionAssi','till','alexm@%','0000-00-00 00:00:00','Select,Insert,Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','vehicleState','alexm@%','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','adminOfficer','vehicleInvoiceIn','alexm@%','0000-00-00 00:00:00','Insert,Delete','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','production','sectorCollectionSaleGroup','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','vehicleEvent','alexm@%','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','vehicleDms','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logistic','vehicle','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','vehicle','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','buyer','Agencias','alexm@%','0000-00-00 00:00:00','Insert,Update','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','adminOfficer','vehicleDms','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','production','expeditionStateType','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','ticketState','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','vehicleInvoiceIn','alexm@%','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financialBoss','vehicleNotes','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','adminOfficer','vehicleState','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','volumeConfig','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','coolerBoss','ticketTrackingState','alexm@%','0000-00-00 00:00:00','Select,Insert,Update','');
@@ -1460,6 +1458,12 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','hedera','salesAssistant','orderCon
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemEntryOut','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemEntryIn','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemShelvingSale','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logistic','packaging','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyerBoss','rate','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryBoss','vehicleDms','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryBoss','vehicleInvoiceIn','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryBoss','vehicleNotes','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','productionBoss','saleGroup','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update,Delete','');
/*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */;
/*!40000 ALTER TABLE `columns_priv` DISABLE KEYS */;
diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql
index 1f04c8e78..81441e19f 100644
--- a/db/dump/.dump/structure.sql
+++ b/db/dump/.dump/structure.sql
@@ -2290,23 +2290,6 @@ CREATE TABLE `Greuge_comercial_recobro` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
---
--- Table structure for table `Greuges_comercial_detail`
---
-
-DROP TABLE IF EXISTS `Greuges_comercial_detail`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `Greuges_comercial_detail` (
- `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `Id_Trabajador` int(10) unsigned NOT NULL,
- `Comentario` varchar(45) NOT NULL,
- `Importe` decimal(10,2) NOT NULL,
- `Fecha` datetime DEFAULT NULL,
- PRIMARY KEY (`Id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci ROW_FORMAT=COMPACT;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
--
-- Table structure for table `Ticket_Portes`
--
@@ -12457,10 +12440,11 @@ DROP TABLE IF EXISTS `tpvMerchantEnable`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tpvMerchantEnable` (
`merchantFk` int(10) unsigned NOT NULL DEFAULT 0,
- `companyFk` smallint(6) unsigned NOT NULL,
- PRIMARY KEY (`merchantFk`,`companyFk`),
+ `companyFk` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`merchantFk`),
UNIQUE KEY `company_id` (`companyFk`),
- CONSTRAINT `tpvMerchantEnable_ibfk_1` FOREIGN KEY (`merchantFk`, `companyFk`) REFERENCES `tpvMerchant` (`id`, `companyFk`) ON DELETE CASCADE ON UPDATE CASCADE
+ CONSTRAINT `tpvMerchantEnable_company_FK` FOREIGN KEY (`companyFk`) REFERENCES `vn`.`company` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `tpvMerchantEnable_tpvMerchant_FK` FOREIGN KEY (`merchantFk`) REFERENCES `tpvMerchant` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Virtual TPV enabled providers';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -19323,6 +19307,7 @@ CREATE TABLE `buffer` (
`hasStrapper` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'tiene una flejadora acoplada',
`typeDefaultFk` int(11) NOT NULL DEFAULT 1 COMMENT 'estado por defecto',
`motors` int(11) NOT NULL DEFAULT 1 COMMENT 'número de fotocélulas que corresponden con sectores de motor independientes',
+ `editorFk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `code_UNIQUE` (`code`),
KEY `buffer_FK` (`stateFk`),
@@ -19390,6 +19375,34 @@ CREATE TABLE `bufferGroup` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Agrupación de buffers que sirven de salida para las mismas rutas';
/*!40101 SET character_set_client = @saved_cs_client */;
+--
+-- Table structure for table `bufferLog`
+--
+
+DROP TABLE IF EXISTS `bufferLog`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `bufferLog` (
+ `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('Buffer','Config') NOT NULL DEFAULT 'Buffer',
+ `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,
+ `summaryId` varchar(30) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `logBufferUserFk` (`userFk`),
+ KEY `bufferLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`),
+ KEY `bufferLog_originFk` (`originFk`,`creationDate`),
+ CONSTRAINT `bufferUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
--
-- Table structure for table `bufferPool`
--
@@ -19497,6 +19510,7 @@ CREATE TABLE `config` (
`isBalanced` tinyint(1) NOT NULL DEFAULT 1,
`testMode` tinyint(1) NOT NULL DEFAULT 0,
`isAllowedUnloading` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Permite que se pueda cambiar el mode de los buffers a UNLOADING',
+ `editorFk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `config_check` CHECK (`id` = 1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
@@ -19677,7 +19691,6 @@ CREATE TABLE `moving` (
`created` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `moving_UN` (`expeditionFk`),
- KEY `moving_fk1_idx` (`expeditionFk`),
KEY `moving_fk2_idx` (`bufferFromFk`),
KEY `moving_fk3_idx` (`bufferToFk`),
KEY `moving_FK` (`stateFk`),
@@ -19854,18 +19867,14 @@ DELIMITER ;;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;;
-/*!50003 SET character_set_client = utf8mb3 */ ;;
-/*!50003 SET character_set_results = utf8mb3 */ ;;
-/*!50003 SET collation_connection = utf8mb3_general_ci */ ;;
+/*!50003 SET character_set_client = utf8mb4 */ ;;
+/*!50003 SET character_set_results = utf8mb4 */ ;;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;;
/*!50003 SET @saved_time_zone = @@time_zone */ ;;
/*!50003 SET time_zone = 'SYSTEM' */ ;;
-/*!50106 CREATE*/ /*!50117 DEFINER=`root`@`localhost`*/ /*!50106 EVENT `moving_clean` ON SCHEDULE EVERY 5 MINUTE STARTS '2022-01-21 00:00:00' ON COMPLETION PRESERVE ENABLE COMMENT 'Llama a srt.moving_clean para que elimine y notifique de registr' DO BEGIN
-
- CALL srt.moving_clean();
-
-END */ ;;
+/*!50106 CREATE*/ /*!50117 DEFINER=`root`@`localhost`*/ /*!50106 EVENT `moving_clean` ON SCHEDULE EVERY 15 MINUTE STARTS '2022-01-21 00:00:00' ON COMPLETION PRESERVE ENABLE COMMENT 'Llama a srt.moving_clean para que elimine y notifique de registr' DO CALL srt.moving_clean() */ ;;
/*!50003 SET time_zone = @saved_time_zone */ ;;
/*!50003 SET sql_mode = @saved_sql_mode */ ;;
/*!50003 SET character_set_client = @saved_cs_client */ ;;
@@ -22228,62 +22237,70 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `moving_clean`()
BEGIN
/**
* Elimina movimientos por inactividad
- *
*/
DECLARE vExpeditionFk INT;
- DECLARE vBufferToFk INT;
DECLARE vBufferFromFk INT;
- DECLARE done BOOL DEFAULT FALSE;
-
- DECLARE cur CURSOR FOR
- SELECT m.expeditionFk, m.bufferToFk, m.bufferFromFk
- FROM srt.moving m
- JOIN srt.config c
- JOIN (SELECT bufferFk, SUM(isActive) hasBox
- FROM srt.photocell
- GROUP BY bufferFk) sub ON sub.bufferFk = m.bufferFromFk
- WHERE m.created < TIMESTAMPADD(MINUTE, - c.movingMaxLife , util.VN_NOW())
+ DECLARE vStateOutFk INT
+ DEFAULT (SELECT id FROM expeditionState WHERE `description` = 'OUT');
+ DECLARE vDone BOOL;
+ DECLARE vSorter CURSOR FOR
+ SELECT m.expeditionFk, m.bufferFromFk
+ FROM moving m
+ JOIN (
+ SELECT bufferFk, SUM(isActive) hasBox
+ FROM photocell
+ GROUP BY bufferFk
+ ) sub ON sub.bufferFk = m.bufferFromFk
+ WHERE m.created < (util.VN_NOW() - INTERVAL (SELECT movingMaxLife FROM config) MINUTE)
AND NOT sub.hasBox;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- OPEN cur;
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
- bucle: LOOP
+ OPEN vSorter;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vSorter INTO vExpeditionFk, vBufferFromFk;
- FETCH cur INTO vExpeditionFk, vBufferToFk, vBufferFromFk;
-
- IF done THEN
- LEAVE bucle;
+ IF vDone THEN
+ LEAVE l;
END IF;
- DELETE FROM srt.moving
+ START TRANSACTION;
+
+ SELECT id
+ FROM moving
+ WHERE expeditionFk = vExpeditionFk
+ FOR UPDATE;
+
+ DELETE FROM moving
WHERE expeditionFk = vExpeditionFk;
- UPDATE srt.expedition e
- JOIN srt.expeditionState es ON es.description = 'OUT'
- SET
- bufferFk = NULL,
+ SELECT id
+ FROM expedition
+ WHERE id = vExpeditionFk
+ OR (bufferFk = vBufferFromFk AND `position` > 0)
+ FOR UPDATE;
+
+ UPDATE expedition
+ SET bufferFk = NULL,
`position` = NULL,
- stateFk = es.id
- WHERE e.id = vExpeditionFk;
+ stateFk = vStateOutFk
+ WHERE id = vExpeditionFk;
- UPDATE srt.expedition e
- SET e.`position` = e.`position` - 1
- WHERE e.bufferFk = vBufferFromFk
- AND e.`position` > 0;
-
- CALL vn.mail_insert(
- 'pako@verdnatura.es, carles@verdnatura.es',
- NULL,
- CONCAT('Moving_clean. Expedition: ', vExpeditionFk, ' estaba parada'),
- CONCAT('Expedition: ', vExpeditionFk,' vBufferToFk: ', vBufferToFk)
- );
-
- END LOOP bucle;
-
- CLOSE cur;
+ UPDATE expedition
+ SET `position` = `position` - 1
+ WHERE bufferFk = vBufferFromFk
+ AND `position` > 0;
+ COMMIT;
+ END LOOP l;
+ CLOSE vSorter;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -26234,7 +26251,9 @@ DROP TABLE IF EXISTS `accountDetailType`;
CREATE TABLE `accountDetailType` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`)
+ `code` varchar(45) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -31761,6 +31780,7 @@ CREATE TABLE `host` (
`routeDaysBefore` smallint(6) DEFAULT 2,
`routeDaysAfter` smallint(6) DEFAULT 1,
`updated` timestamp NULL DEFAULT current_timestamp(),
+ `editorFk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `host_UN` (`code`),
KEY `configHost_FK_3` (`companyFk`),
@@ -32014,10 +32034,10 @@ CREATE TABLE `invoiceCorrection` (
KEY `invoiceCorrection_ibfk_1_idx` (`cplusRectificationTypeFk`),
KEY `cplusInvoiceTyoeFk_idx` (`siiTypeInvoiceOutFk`),
KEY `invoiceCorrectionTypeFk_idx` (`invoiceCorrectionTypeFk`),
- CONSTRAINT `corrected_fk` FOREIGN KEY (`correctedFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `correcting_fk` FOREIGN KEY (`correctingFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `cplusRectificationType_FK` FOREIGN KEY (`cplusRectificationTypeFk`) REFERENCES `cplusRectificationType` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceCorrectionType_FK` FOREIGN KEY (`invoiceCorrectionTypeFk`) REFERENCES `invoiceCorrectionType` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `invoiceCorrection_invoiceOut_FK` FOREIGN KEY (`correctingFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `invoiceCorrection_invoiceOut_FK_1` FOREIGN KEY (`correctedFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `siiTypeInvoiceOut_FK` FOREIGN KEY (`siiTypeInvoiceOutFk`) REFERENCES `siiTypeInvoiceOut` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Relacion entre las facturas rectificativas y las rectificadas.';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -32381,8 +32401,8 @@ CREATE TABLE `invoiceOut` (
`cplusTaxBreakFk` int(10) unsigned NOT NULL DEFAULT 1,
`cplusSubjectOpFk` int(10) unsigned NOT NULL DEFAULT 1,
`siiTrascendencyInvoiceOutFk` int(10) unsigned NOT NULL DEFAULT 1,
- PRIMARY KEY (`id`,`ref`),
- UNIQUE KEY `Id_Factura` (`ref`),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `invoiceOut_unique` (`ref`),
KEY `Id_Banco` (`bankFk`),
KEY `Id_Cliente` (`clientFk`),
KEY `empresa_id` (`companyFk`),
@@ -32434,8 +32454,8 @@ CREATE TABLE `invoiceOutExpense` (
PRIMARY KEY (`id`),
KEY `invoiceOutExpence_FK_1_idx` (`invoiceOutFk`),
KEY `invoiceOutExpence_expenceFk_idx` (`expenseFk`),
- CONSTRAINT `invoiceOutExpence_FK_1` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `invoiceOutExpence_expenceFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE
+ CONSTRAINT `invoiceOutExpence_expenceFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `invoiceOutExpense_invoiceOut_FK` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Desglosa la base imponible de una factura en funcion del tipo de gasto/venta';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -32455,8 +32475,9 @@ CREATE TABLE `invoiceOutSerial` (
`cplusInvoiceType477Fk` int(10) unsigned DEFAULT 1,
`footNotes` longtext DEFAULT NULL,
`isRefEditable` tinyint(4) NOT NULL DEFAULT 0,
- `type` enum('global','quick') DEFAULT NULL,
+ `type` enum('global','quick','multiple') DEFAULT NULL,
PRIMARY KEY (`code`),
+ UNIQUE KEY `invoiceOutSerial_taxAreaFk_IDX` (`taxAreaFk`,`type`) USING BTREE,
KEY `taxAreaFk_idx` (`taxAreaFk`),
CONSTRAINT `invoiceOutSeriaTaxArea` FOREIGN KEY (`taxAreaFk`) REFERENCES `taxArea` (`code`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
@@ -32480,8 +32501,8 @@ CREATE TABLE `invoiceOutTax` (
UNIQUE KEY `invoiceOutTax_Resctriccion` (`invoiceOutFk`,`pgcFk`),
KEY `invoiceOutFk_idx` (`invoiceOutFk`),
KEY `pgcFk` (`pgcFk`),
- CONSTRAINT `invoiceOutFk` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `invoiceOutTax_ibfk_1` FOREIGN KEY (`pgcFk`) REFERENCES `pgc` (`code`) ON UPDATE CASCADE
+ CONSTRAINT `invoiceOutTax_ibfk_1` FOREIGN KEY (`pgcFk`) REFERENCES `pgc` (`code`) ON UPDATE CASCADE,
+ CONSTRAINT `invoiceOutTax_invoiceOut_FK` FOREIGN KEY (`invoiceOutFk`) REFERENCES `invoiceOut` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -32607,6 +32628,7 @@ CREATE TABLE `item` (
KEY `item_lastUsed_IDX` (`lastUsed`) USING BTREE,
KEY `item_expenceFk_idx` (`expenseFk`),
KEY `item_fk_editor` (`editorFk`),
+ KEY `item_itemPackingType_FK` (`itemPackingTypeFk`),
CONSTRAINT `item_FK` FOREIGN KEY (`genericFk`) REFERENCES `item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `item_FK_1` FOREIGN KEY (`typeFk`) REFERENCES `itemType` (`id`),
CONSTRAINT `item_expenceFk` FOREIGN KEY (`expenseFk`) REFERENCES `expense` (`id`) ON UPDATE CASCADE,
@@ -32614,6 +32636,7 @@ CREATE TABLE `item` (
CONSTRAINT `item_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
CONSTRAINT `item_ibfk_1` FOREIGN KEY (`originFk`) REFERENCES `origin` (`id`) ON UPDATE CASCADE,
CONSTRAINT `item_ibfk_2` FOREIGN KEY (`intrastatFk`) REFERENCES `intrastat` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `item_itemPackingType_FK` FOREIGN KEY (`itemPackingTypeFk`) REFERENCES `itemPackingType` (`code`) ON UPDATE CASCADE,
CONSTRAINT `itemsupplyResponseFk` FOREIGN KEY (`supplyResponseFk`) REFERENCES `edi`.`supplyResponse` (`ID`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `producer_id` FOREIGN KEY (`producerFk`) REFERENCES `producer` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
@@ -33996,8 +34019,9 @@ DROP TABLE IF EXISTS `mandateType`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `mandateType` (
`id` smallint(5) NOT NULL AUTO_INCREMENT,
- `name` varchar(45) NOT NULL,
- PRIMARY KEY (`id`)
+ `code` varchar(45) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -34459,8 +34483,9 @@ CREATE TABLE `operator` (
`warehouseFk` smallint(6) unsigned NOT NULL DEFAULT 60,
`sectorFk` int(11) DEFAULT NULL,
`labelerFk` int(10) unsigned DEFAULT NULL,
- `linesLimit` int(11) DEFAULT 20 COMMENT 'Límite de lineas en una colección para la asignación de pedidos',
+ `linesLimit` int(10) unsigned DEFAULT 20 COMMENT 'Límite de lineas en una colección para la asignación de pedidos',
`volumeLimit` decimal(10,6) DEFAULT 0.500000 COMMENT 'Límite de volumen en una colección para la asignación de pedidos',
+ `sizeLimit` int(10) unsigned DEFAULT NULL COMMENT 'Límite de altura en una colección para la asignación de pedidos',
`isOnReservationMode` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`workerFk`),
KEY `operator_FK` (`workerFk`),
@@ -34558,6 +34583,21 @@ SET character_set_client = utf8;
1 AS `name` */;
SET character_set_client = @saved_cs_client;
+--
+-- Table structure for table `ormConfig`
+--
+
+DROP TABLE IF EXISTS `ormConfig`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `ormConfig` (
+ `id` int(11) NOT NULL,
+ `selectLimit` int(5) NOT NULL,
+ PRIMARY KEY (`id`),
+ CONSTRAINT `ormConfig_check` CHECK (`id` = 1)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
--
-- Table structure for table `osTicketConfig`
--
@@ -36114,6 +36154,22 @@ CREATE TABLE `punchState` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Table for storing punches that have cars with errors';
/*!40101 SET character_set_client = @saved_cs_client */;
+--
+-- Table structure for table `quadMindsApiConfig`
+--
+
+DROP TABLE IF EXISTS `quadMindsApiConfig`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `quadMindsApiConfig` (
+ `id` int(10) unsigned NOT NULL,
+ `url` varchar(255) DEFAULT NULL,
+ `key` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ CONSTRAINT `quadMindsConfig_check` CHECK (`id` = 1)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
--
-- Table structure for table `quality`
--
@@ -36458,11 +36514,18 @@ CREATE TABLE `roadmap` (
`kmEnd` mediumint(9) DEFAULT NULL,
`started` datetime DEFAULT NULL,
`finished` datetime DEFAULT NULL,
+ `m3` int(10) unsigned DEFAULT NULL,
+ `driver2Fk` int(10) unsigned DEFAULT NULL,
+ `driver1Fk` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `userFk` (`userFk`),
KEY `roadmap_supplierFk` (`supplierFk`),
+ KEY `roadmap_worker_FK` (`driver1Fk`),
+ KEY `roadmap_worker_FK_2` (`driver2Fk`),
CONSTRAINT `roadmap_ibfk_2` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON UPDATE CASCADE,
- CONSTRAINT `roadmap_supplierFk` FOREIGN KEY (`supplierFk`) REFERENCES `supplier` (`id`) ON UPDATE CASCADE
+ CONSTRAINT `roadmap_supplierFk` FOREIGN KEY (`supplierFk`) REFERENCES `supplier` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `roadmap_worker_FK` FOREIGN KEY (`driver1Fk`) REFERENCES `worker` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `roadmap_worker_FK_2` FOREIGN KEY (`driver2Fk`) REFERENCES `worker` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Troncales diarios que se contratan';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -37046,14 +37109,17 @@ CREATE TABLE `saleGroup` (
`sectorFk` int(11) DEFAULT NULL,
`ticketFk` int(11) DEFAULT NULL,
`editorFk` int(10) unsigned DEFAULT NULL,
+ `stateFk` tinyint(3) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `saleGroup_FK` (`ticketFk`),
KEY `saleGroup_userFK` (`userFk`),
KEY `saleGroup_parkingFK` (`parkingFk`),
KEY `saleGroup_sectorFK` (`sectorFk`),
+ KEY `saleGroup_state_FK` (`stateFk`),
CONSTRAINT `saleGroup_FK` FOREIGN KEY (`ticketFk`) REFERENCES `ticket` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `saleGroup_parkingFK` FOREIGN KEY (`parkingFk`) REFERENCES `parking` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `saleGroup_sectorFK` FOREIGN KEY (`sectorFk`) REFERENCES `sector` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `saleGroup_state_FK` FOREIGN KEY (`stateFk`) REFERENCES `state` (`id`) ON UPDATE CASCADE,
CONSTRAINT `saleGroup_userFK` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='agrupa lineas de venta';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -38864,7 +38930,6 @@ CREATE TABLE `ticket` (
KEY `ticket_fk_editor` (`editorFk`),
KEY `ticket_cmrFk` (`cmrFk`),
CONSTRAINT `ticketCompany_Fk` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE,
- CONSTRAINT `ticket_FK` FOREIGN KEY (`refFk`) REFERENCES `invoiceOut` (`ref`) ON UPDATE CASCADE,
CONSTRAINT `ticket_cmrFk` FOREIGN KEY (`cmrFk`) REFERENCES `cmr` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `ticket_customer_id` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON UPDATE CASCADE,
CONSTRAINT `ticket_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
@@ -38872,6 +38937,7 @@ CREATE TABLE `ticket` (
CONSTRAINT `ticket_ibfk_6` FOREIGN KEY (`addressFk`) REFERENCES `address` (`id`) ON UPDATE CASCADE,
CONSTRAINT `ticket_ibfk_8` FOREIGN KEY (`agencyModeFk`) REFERENCES `agencyMode` (`id`),
CONSTRAINT `ticket_ibfk_9` FOREIGN KEY (`routeFk`) REFERENCES `route` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
+ CONSTRAINT `ticket_invoiceOut_FK` FOREIGN KEY (`refFk`) REFERENCES `invoiceOut` (`ref`) ON UPDATE CASCADE,
CONSTRAINT `tickets_zone_fk` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -44423,73 +44489,33 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` FUNCTION `invoiceSerial`(vClientFk INT, vCompanyFk INT, vType CHAR(1)) RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
+CREATE DEFINER=`root`@`localhost` FUNCTION `invoiceSerial`(vClientFk INT, vCompanyFk INT, vType CHAR(15)) RETURNS char(2) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
DETERMINISTIC
BEGIN
/**
- * Obtiene la serie de de una factura
+ * Obtiene la serie de una factura
* dependiendo del area del cliente.
- *
+ *
* @param vClientFk Id del cliente
* @param vCompanyFk Id de la empresa
- * @param vType Tipo de factura ["R", "M", "G"]
- * @return Serie de la factura
+ * @param vType Tipo de factura ['global','multiple','quick']
+ * @return vSerie de la factura
*/
- DECLARE vTaxArea VARCHAR(25);
- DECLARE vSerie CHAR(1);
+ DECLARE vTaxArea VARCHAR(25) COLLATE utf8mb3_general_ci;
+ DECLARE vSerie CHAR(2);
IF (SELECT hasInvoiceSimplified FROM client WHERE id = vClientFk) THEN
RETURN 'S';
END IF;
- SELECT clientTaxArea(vClientFk, vCompanyFk) INTO vTaxArea;
- SELECT invoiceSerialArea(vType,vTaxArea) INTO vSerie;
- RETURN vSerie;
-END ;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-/*!50003 DROP FUNCTION IF EXISTS `invoiceSerialArea` */;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` FUNCTION `invoiceSerialArea`(vType CHAR(1), vTaxArea VARCHAR(25)) RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci
- DETERMINISTIC
-BEGIN
- DECLARE vSerie CHAR(1);
+ SELECT addressTaxArea(defaultAddressFk, vCompanyFk) INTO vTaxArea
+ FROM client
+ WHERE id = vClientFk;
+
+ SELECT code INTO vSerie
+ FROM invoiceOutSerial
+ WHERE `type` = vType AND taxAreaFk = vTaxArea;
- IF vType = 'R' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'H'
- WHEN 'WORLD' THEN 'E'
- ELSE 'T'
- END INTO vSerie;
- -- Factura multiple
- ELSEIF vType = 'M' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'H'
- WHEN 'WORLD' THEN 'E'
- ELSE 'M'
- END INTO vSerie;
- -- Factura global
- ELSEIF vType = 'G' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'V'
- WHEN 'WORLD' THEN 'X'
- ELSE 'A'
- END INTO vSerie;
- END IF;
RETURN vSerie;
END ;;
DELIMITER ;
@@ -46174,14 +46200,21 @@ BEGIN
* @param vSelf Id ticket
* @return BOOL
*/
- DECLARE vIsTooLittle TINYINT(1);
-
+ DECLARE vIsTooLittle BOOL;
+
+ WITH ticketData AS (
+ SELECT addressFk, DATE(shipped) dated
+ FROM vn.ticket
+ WHERE id = vSelf
+ )
SELECT (SUM(IFNULL(sv.litros, 0)) < vc.minTicketVolume
- AND IFNULL(t.totalWithoutVat, 0) < vc.minTicketValue) INTO vIsTooLittle
- FROM ticket t
- LEFT JOIN saleVolume sv ON sv.ticketFk = t.id
- JOIN volumeConfig vc
- WHERE t.id = vSelf;
+ AND SUM(IFNULL(t.totalWithoutVat, 0)) < vc.minTicketValue) INTO vIsTooLittle
+ FROM ticketData td
+ JOIN vn.ticket t ON t.addressFk = td.addressFk
+ LEFT JOIN vn.saleVolume sv ON sv.ticketFk = t.id
+ JOIN vn.volumeConfig vc
+ WHERE t.shipped BETWEEN td.dated AND util.dayEnd(td.dated)
+ AND ticket_isProblemCalcNeeded(t.id);
RETURN vIsTooLittle;
END ;;
@@ -52524,10 +52557,11 @@ BEGIN
DECLARE vWarehouseFk INT;
DECLARE vWagons INT;
DECLARE vTrainFk INT;
- DECLARE vLinesLimit INT DEFAULT NULL;
+ DECLARE vLinesLimit INT;
DECLARE vTicketLines INT;
- DECLARE vVolumeLimit DECIMAL DEFAULT NULL;
+ DECLARE vVolumeLimit DECIMAL;
DECLARE vTicketVolume DECIMAL;
+ DECLARE vSizeLimit INT;
DECLARE vMaxTickets INT;
DECLARE vStateFk VARCHAR(45);
DECLARE vFirstTicketFk INT;
@@ -52592,6 +52626,7 @@ BEGIN
o.trainFk,
o.linesLimit,
o.volumeLimit,
+ o.sizeLimit,
pc.collection_new_lockname
INTO vMaxTickets,
vHasUniqueCollectionTime,
@@ -52603,6 +52638,7 @@ BEGIN
vTrainFk,
vLinesLimit,
vVolumeLimit,
+ vSizeLimit,
vLockName
FROM productionConfig pc
JOIN worker w ON w.id = vUserFk
@@ -52687,6 +52723,14 @@ BEGIN
JOIN state s ON s.id = pb.state
JOIN agencyMode am ON am.id = pb.agencyModeFk
JOIN agency a ON a.id = am.agencyFk
+ LEFT JOIN (
+ SELECT pb.ticketFk, MAX(i.`size`) maxSize
+ FROM tmp.productionBuffer pb
+ JOIN ticket t ON t.id = pb.ticketfk
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ GROUP BY pb.ticketFk
+ ) sub ON sub.ticketFk = pb.ticketFk
JOIN productionConfig pc
WHERE pb.shipped <> util.VN_CURDATE()
OR (pb.ubicacion IS NULL AND a.isOwn)
@@ -52698,8 +52742,9 @@ BEGIN
OR (NOT pb.V AND vItemPackingTypeFk = 'V')
OR (pc.isPreviousPreparationRequired AND pb.previousWithoutParking)
OR LENGTH(pb.problem) > 0
- OR (pb.lines >= vLinesLimit AND vLinesLimit IS NOT NULL)
- OR (pb.m3 >= vVolumeLimit AND vVolumeLimit IS NOT NULL);
+ OR pb.lines > vLinesLimit
+ OR pb.m3 > vVolumeLimit
+ OR sub.maxSize > vSizeLimit;
END IF;
-- Es importante que el primer ticket se coja en todos los casos
@@ -59182,7 +59227,7 @@ BEGIN
AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
THEN
- -- el trigger añade el siguiente Id_Factura correspondiente a la vSerial
+ -- el trigger añade el siguiente ref correspondiente a la vSerial
INSERT INTO invoiceOut(
ref,
serial,
@@ -62222,28 +62267,26 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `itemShelving_transfer`(
)
BEGIN
/**
- * Transfiere producto de una ubicación a otra, fusionando si coincide el
- * packing y la fecha.
+ * Transfiere producto de una ubicación a otra
+ * fusionando si coincide el packing y la fecha.
*
* @param vItemShelvingFk Identificador de itemShelving
* @param vShelvingFk Identificador de shelving
*/
- DECLARE vNewItemShelvingFk INT DEFAULT 0;
+ DECLARE vNewItemShelvingFk INT;
- SELECT MAX(ish.id)
- INTO vNewItemShelvingFk
+ SELECT MAX(ish.id) INTO vNewItemShelvingFk
FROM itemShelving ish
JOIN (
- SELECT
- itemFk,
- packing,
- created,
- buyFk
+ SELECT itemFk,
+ packing,
+ created,
+ buyFk
FROM itemShelving
WHERE id = vItemShelvingFk
) ish2 ON ish2.itemFk = ish.itemFk
AND ish2.packing = ish.packing
- AND date(ish2.created) = date(ish.created)
+ AND DATE(ish2.created) = DATE(ish.created)
AND ish2.buyFk = ish.buyFk
WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci;
@@ -62256,11 +62299,17 @@ BEGIN
DELETE FROM itemShelving
WHERE id = vItemShelvingFk;
ELSE
- UPDATE itemShelving
- SET shelvingFk = vShelvingFk
- WHERE id = vItemShelvingFk;
+ IF (SELECT EXISTS(SELECT id FROM shelving
+ WHERE code = vShelvingFk COLLATE utf8_unicode_ci)) THEN
+
+ UPDATE itemShelving
+ SET shelvingFk = vShelvingFk
+ WHERE id = vItemShelvingFk;
+ ELSE
+ CALL util.throw('The shelving not exists');
+ END IF;
END IF;
- SELECT true;
+ SELECT TRUE;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -63950,7 +63999,7 @@ BEGIN
SELECT * FROM sales
UNION ALL
SELECT * FROM orders
- ORDER BY shipped DESC,
+ ORDER BY shipped,
(inventorySupplierFk = entityId) DESC,
alertLevel DESC,
isTicket,
@@ -67026,11 +67075,6 @@ proc: BEGIN
DECLARE vEndingDate DATETIME;
DECLARE vIsTodayRelative BOOLEAN;
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- RESIGNAL;
- END;
-
SELECT util.dayEnd(util.VN_CURDATE()) + INTERVAL LEAST(vScopeDays, maxProductionScopeDays) DAY
INTO vEndingDate
FROM productionConfig;
@@ -67284,7 +67328,6 @@ proc: BEGIN
DROP TEMPORARY TABLE
tmp.productionTicket,
tmp.ticket,
- tmp.risk,
tmp.ticket_problems,
tmp.ticketWithPrevia,
tItemShelvingStock,
@@ -69809,154 +69852,98 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` PROCEDURE `sale_getProblems`(IN vIsTodayRelative tinyint(1))
+CREATE DEFINER=`root`@`localhost` PROCEDURE `sale_getProblems`(
+ vIsTodayRelative tinyint(1)
+)
BEGIN
/**
* Calcula los problemas de cada venta para un conjunto de tickets.
*
* @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy
- * @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Identificadores de los tickets a calcular
+ * @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Tickets a calcular
* @return tmp.sale_problems
*/
- DECLARE vWarehouseFk INT;
+ DECLARE vWarehouseFk INT;
DECLARE vDate DATE;
- DECLARE vAvailableCache INT;
+ DECLARE vAvailableCache INT;
DECLARE vVisibleCache INT;
DECLARE vDone BOOL;
- DECLARE vRequiredComponent INT;
-
- DECLARE vCursor CURSOR FOR
- SELECT DISTINCT tt.warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(tt.shipped))
- FROM tmp.sale_getProblems tt
- WHERE DATE(tt.shipped) BETWEEN util.VN_CURDATE()
- AND util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY;
+ DECLARE vCursor CURSOR FOR
+ SELECT DISTINCT warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(shipped))
+ FROM tmp.sale_getProblems
+ WHERE shipped BETWEEN util.VN_CURDATE()
+ AND util.dayEnd(util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
DELETE tt.*
FROM tmp.sale_getProblems tt
JOIN ticketObservation tto ON tto.ticketFk = tt.ticketFk
- JOIN observationType ot ON ot.id = tto.observationTypeFk
- WHERE ot.code = 'administrative'
+ JOIN observationType ot ON ot.id = tto.observationTypeFk
+ WHERE ot.code = 'administrative'
AND tto.description = 'Miriam';
- CREATE OR REPLACE TEMPORARY TABLE tmp.sale_problems (
- ticketFk INT(11),
- saleFk INT(11),
- isFreezed INTEGER(1) DEFAULT 0,
- risk DECIMAL(10,1) DEFAULT 0,
- hasHighRisk TINYINT(1) DEFAULT 0,
- hasTicketRequest INTEGER(1) DEFAULT 0,
- itemShortage VARCHAR(255),
- isTaxDataChecked INTEGER(1) DEFAULT 1,
- itemDelay VARCHAR(255),
- itemLost VARCHAR(255),
- hasComponentLack INTEGER(1),
- hasRounding VARCHAR(255),
- isTooLittle BOOL DEFAULT FALSE,
- isVip BOOL DEFAULT FALSE,
- PRIMARY KEY (ticketFk, saleFk)
- ) ENGINE = MEMORY;
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_problems (
+ ticketFk INT(11),
+ saleFk INT(11),
+ isFreezed INTEGER(1) DEFAULT 0,
+ risk DECIMAL(10,1) DEFAULT 0,
+ hasRisk TINYINT(1) DEFAULT 0,
+ hasHighRisk TINYINT(1) DEFAULT 0,
+ hasTicketRequest INTEGER(1) DEFAULT 0,
+ itemShortage VARCHAR(255),
+ isTaxDataChecked INTEGER(1) DEFAULT 1,
+ itemDelay VARCHAR(255),
+ itemLost VARCHAR(255),
+ hasComponentLack INTEGER(1),
+ hasRounding VARCHAR(255),
+ isTooLittle BOOL DEFAULT FALSE,
+ isVip BOOL DEFAULT FALSE,
+ PRIMARY KEY (ticketFk, saleFk)
+ ) ENGINE = MEMORY;
- CREATE OR REPLACE TEMPORARY TABLE tmp.ticket_list
- (PRIMARY KEY (ticketFk))
- ENGINE = MEMORY
- SELECT ticketFk, clientFk
- FROM tmp.sale_getProblems;
+ INSERT INTO tmp.sale_problems(ticketFk,
+ saleFk,
+ isFreezed,
+ risk,
+ hasRisk,
+ hasHighRisk,
+ hasTicketRequest,
+ isTaxDataChecked,
+ hasComponentLack,
+ hasRounding,
+ isTooLittle)
+ SELECT sgp.ticketFk,
+ s.id,
+ IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed,
+ t.risk,
+ IF(FIND_IN_SET('hasRisk', t.problem), TRUE, FALSE) hasRisk,
+ IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk,
+ IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest,
+ IF(FIND_IN_SET('isTaxDataChecked', t.problem), FALSE, TRUE) isTaxDataChecked,
+ IF(FIND_IN_SET('hasComponentLack', s.problem), TRUE, FALSE) hasComponentLack,
+ IF(FIND_IN_SET('hasRounding', s.problem),
+ LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250),
+ NULL
+ ) hasRounding,
+ IF(FIND_IN_SET('isTooLittle', t.problem)
+ AND util.VN_NOW() < (util.VN_CURDATE() + INTERVAL HOUR(zc.`hour`) HOUR) + INTERVAL MINUTE(zc.`hour`) MINUTE,
+ TRUE, FALSE) isTooLittle
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
+ LEFT JOIN sale s ON s.ticketFk = t.id
+ LEFT JOIN item i ON i.id = s.itemFk
+ LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
+ AND zc.dated = util.VN_CURDATE()
+ WHERE s.problem <> '' OR t.problem <> '' OR t.risk
+ GROUP BY t.id, s.id;
- SELECT COUNT(*) INTO vRequiredComponent
- FROM component
- WHERE isRequired;
-
- -- Too Little
- INSERT INTO tmp.sale_problems(ticketFk, isTooLittle)
- SELECT tp.ticketFk, TRUE
- FROM tmp.sale_getProblems tp
- JOIN ticket t ON t.id = tp.ticketFk
- JOIN (
- SELECT t.addressFk,
- SUM(ROUND(`ic`.`cm3delivery` * `s`.`quantity` / 1000, 0)) litros,
- t.totalWithoutVat
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN sale s ON s.ticketFk = t.id
- AND s.quantity > 0
- JOIN itemCost ic ON ic.itemFk = s.itemFk
- AND ic.warehouseFk = t.warehouseFk
- JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
- AND zc.dated = util.VN_CURDATE()
- JOIN agencyMode am ON am.id = t.agencyModeFk
- JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
- WHERE util.VN_NOW() < (util.VN_CURDATE() + INTERVAL HOUR(zc.`hour`) HOUR) + INTERVAL MINUTE(zc.`hour`) MINUTE
- AND dm.code IN ('AGENCY','DELIVERY','PICKUP')
- AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight()
- GROUP BY t.addressFk
- ) sub ON sub.addressFk = t.addressFk
- JOIN volumeConfig vc
- WHERE sub.litros < vc.minTicketVolume
- AND sub.totalWithoutVat < vc.minTicketValue;
-
- -- VIP
INSERT INTO tmp.sale_problems(ticketFk, isVip)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
+ SELECT sgp.ticketFk, TRUE
+ FROM tmp.sale_getProblems sgp
+ JOIN client c ON c.id = sgp.clientFk
WHERE c.businessTypeFk = 'VIP'
- ON DUPLICATE KEY UPDATE isVip = TRUE;
-
- -- Faltan componentes
- INSERT INTO tmp.sale_problems(ticketFk, hasComponentLack, saleFk)
- SELECT t.id, COUNT(c.id) < vRequiredComponent hasComponentLack, s.id
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN sale s ON s.ticketFk = t.id
- JOIN agencyMode am ON am.id = t.agencyModeFk
- JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
- LEFT JOIN saleComponent sc ON sc.saleFk = s.id
- LEFT JOIN component c ON c.id = sc.componentFk
- AND c.isRequired
- WHERE dm.code IN ('AGENCY','DELIVERY','PICKUP')
- AND s.quantity > 0
- GROUP BY s.id
- HAVING hasComponentLack;
-
- -- Cliente congelado
- INSERT INTO tmp.sale_problems(ticketFk, isFreezed)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
- WHERE c.isFreezed
- ON DUPLICATE KEY UPDATE isFreezed = c.isFreezed;
-
- -- Credit exceeded
- CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt
- (PRIMARY KEY (clientFk))
- ENGINE = MEMORY
- SELECT DISTINCT clientFk
- FROM tmp.ticket_list;
-
- CALL client_getDebt(util.VN_CURDATE());
-
- INSERT INTO tmp.sale_problems(ticketFk, risk, hasHighRisk)
- SELECT DISTINCT tl.ticketFk, r.risk, ((r.risk - cc.riskTolerance) > c.credit + 10)
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN agencyMode a ON t.agencyModeFk = a.id
- JOIN tmp.risk r ON r.clientFk = t.clientFk
- JOIN client c ON c.id = t.clientFk
- JOIN clientConfig cc
- WHERE r.risk > c.credit + 10
- AND NOT a.isRiskFree
- ON DUPLICATE KEY UPDATE
- risk = r.risk, hasHighRisk = ((r.risk - cc.riskTolerance) > c.credit + 10);
-
- -- Antiguo COD 100, son peticiones de compra sin terminar
- INSERT INTO tmp.sale_problems(ticketFk, hasTicketRequest)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN ticketRequest tr ON tr.ticketFk = tl.ticketFk
- WHERE tr.isOK IS NULL
- ON DUPLICATE KEY UPDATE hasTicketRequest = TRUE;
+ ON DUPLICATE KEY UPDATE isVIP = TRUE;
CREATE OR REPLACE TEMPORARY TABLE tItemShelvingStock_byWarehouse
(INDEX (itemFk, warehouseFk))
@@ -69968,10 +69955,9 @@ BEGIN
JOIN shelving sh ON sh.code = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
- GROUP BY ish.itemFk,
- s.warehouseFk;
+ GROUP BY ish.itemFk, s.warehouseFk;
- -- Disponible, Faltas, Inventario y Retrasos
+ -- Disponible, faltas, inventario y retrasos
OPEN vCursor;
l: LOOP
SET vDone = FALSE;
@@ -69990,14 +69976,14 @@ BEGIN
INSERT INTO tmp.sale_problems(ticketFk, itemShortage, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
- LEFT(CONCAT('F: ',GROUP_CONCAT(i.id, ' ', i.longName, ' ')),250) problem,
- s.id AS saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ SELECT sgp.ticketFk,
+ LEFT(CONCAT('F: ', GROUP_CONCAT(i.id, ' ', i.longName, ' ')), 250) problem,
+ s.id saleFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = i.id
AND v.calc_id = vVisibleCache
@@ -70005,8 +69991,8 @@ BEGIN
AND av.calc_id = vAvailableCache
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
- WHERE IFNULL(v.visible,0) < s.quantity
- AND IFNULL(av.available ,0) < s.quantity
+ WHERE IFNULL(v.visible, 0) < s.quantity
+ AND IFNULL(av.available, 0) < s.quantity
AND IFNULL(issw.visible, 0) < s.quantity
AND NOT s.isPicked
AND NOT s.reserved
@@ -70015,27 +70001,27 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk) sub
+ GROUP BY sgp.ticketFk) sub
ON DUPLICATE KEY UPDATE itemShortage = sub.problem, saleFk = sub.saleFk;
-- Inventario: Visible suficiente, pero ubicado menor a la cantidad vendida
INSERT INTO tmp.sale_problems(ticketFk, itemLost, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
+ SELECT sgp.ticketFk,
LEFT(GROUP_CONCAT('I: ', i.id, ' ', i.longName, ' '), 250) problem,
s.id saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
AND v.calc_id = vVisibleCache
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
- WHERE IFNULL(v.visible,0) >= s.quantity
+ WHERE IFNULL(v.visible, 0) >= s.quantity
AND IFNULL(issw.visible, 0) < s.quantity
AND s.quantity > 0
AND NOT s.isPicked
@@ -70045,22 +70031,22 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk
+ GROUP BY sgp.ticketFk
) sub
- ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
+ ON DUPLICATE KEY UPDATE itemLost = sub.problem, saleFk = sub.saleFk;
-- Retraso: Disponible suficiente, pero no visible ni ubicado
INSERT INTO tmp.sale_problems(ticketFk, itemDelay, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
+ SELECT sgp.ticketFk,
LEFT(GROUP_CONCAT('R: ', i.id, ' ', i.longName, ' '), 250) problem,
s.id saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
AND v.calc_id = vVisibleCache
@@ -70079,43 +70065,28 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk
+ GROUP BY sgp.ticketFk
) sub
ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
-
- -- Redondeo: Cantidad pedida incorrecta en al grouping de la última compra
- CALL buy_getUltimate(NULL, vWarehouseFk, vDate);
- INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
- SELECT ticketFk, problem ,saleFk
- FROM (
- SELECT tl.ticketFk,
- s.id saleFk,
- LEFT(GROUP_CONCAT('RE: ',i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- AND t.warehouseFk = vWarehouseFk
- JOIN sale s ON s.ticketFk = tl.ticketFk
- JOIN item i ON i.id = s.itemFk
- JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
- JOIN buy b ON b.id = bu.buyFk
- WHERE MOD(s.quantity, b.`grouping`)
- GROUP BY tl.ticketFk
- )sub
- ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
END LOOP;
CLOSE vCursor;
-
- INSERT INTO tmp.sale_problems(ticketFk, isTaxDataChecked)
- SELECT DISTINCT tl.ticketFk, FALSE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
- WHERE NOT c.isTaxDataChecked
- ON DUPLICATE KEY UPDATE isTaxDataChecked = FALSE;
- DROP TEMPORARY TABLE
- tmp.clientGetDebt,
- tmp.ticket_list,
- tItemShelvingStock_byWarehouse;
+ INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
+ SELECT ticketFk, problem, saleFk
+ FROM (
+ SELECT sgp.ticketFk,
+ s.id saleFk,
+ LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
+ JOIN sale s ON s.ticketFk = sgp.ticketFk
+ JOIN item i ON i.id = s.itemFk
+ WHERE FIND_IN_SET('hasRounding', s.problem)
+ GROUP BY sgp.ticketFk
+ ) sub
+ ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
+
+ DROP TEMPORARY TABLE tItemShelvingStock_byWarehouse;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -70140,8 +70111,7 @@ BEGIN
*
* @return Problems result
*/
- DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems;
- CREATE TEMPORARY TABLE tmp.sale_getProblems
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
(INDEX (ticketFk))
ENGINE = MEMORY
SELECT t.id ticketFk, t.clientFk, t.warehouseFk, t.shipped
@@ -70659,6 +70629,94 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+/*!50003 DROP PROCEDURE IF EXISTS `sale_setProblemRoundingByBuy` */;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+DELIMITER ;;
+CREATE DEFINER=`root`@`localhost` PROCEDURE `sale_setProblemRoundingByBuy`(
+ vBuyFk INT
+)
+BEGIN
+/**
+ * Update rounding problem for all sales related to a buy.
+ *
+ * @param vBuyFk Buy id
+ */
+ DECLARE vItemFk INT;
+ DECLARE vWarehouseFk INT;
+ DECLARE vMaxDated DATE;
+ DECLARE vMinDated DATE;
+ DECLARE vLanding DATE;
+ DECLARE vLastBuy INT;
+ DECLARE vCurrentBuy INT;
+ DECLARE vGrouping INT;
+
+ SELECT b.itemFk, t.warehouseInFk
+ INTO vItemFk, vWarehouseFk
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ WHERE b.id = vBuyFk;
+
+ IF vItemFk AND vWarehouseFk THEN
+ SELECT DATE(MAX(t.shipped)) + INTERVAL 1 DAY, DATE(MIN(t.shipped))
+ INTO vMaxDated, vMinDated
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ WHERE t.shipped >= util.VN_CURDATE()
+ AND s.itemFk = vItemFk
+ AND s.quantity > 0;
+
+ CALL buy_getUltimate(vItemFk, vWarehouseFk, vMinDated);
+
+ SELECT bu.buyFk, b.grouping INTO vLastBuy, vGrouping
+ FROM tmp.buyUltimate bu
+ JOIN buy b ON b.id = bu.buyFk;
+
+ DROP TEMPORARY TABLE tmp.buyUltimate;
+
+ SET vLanding = vMaxDated;
+
+ WHILE vCurrentBuy <> vLastBuy OR vLanding > vMinDated DO
+ SET vMaxDated = vLanding - INTERVAL 1 DAY;
+
+ CALL buy_getUltimate(vItemFk, vWarehouseFk, vMaxDated);
+
+ SELECT buyFk, landing
+ INTO vCurrentBuy, vLanding
+ FROM tmp.buyUltimate;
+
+ DROP TEMPORARY TABLE tmp.buyUltimate;
+ END WHILE;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale
+ (INDEX(saleFk, isProblemCalcNeeded))
+ ENGINE = MEMORY
+ SELECT s.id saleFk,
+ MOD(s.quantity, vGrouping) hasProblem,
+ ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ WHERE s.itemFk = vItemFk
+ AND s.quantity > 0
+ AND t.shipped BETWEEN vMinDated AND util.dayEnd(vMaxDated);
+
+ CALL sale_setProblem('hasRounding');
+
+ DROP TEMPORARY TABLE tmp.sale;
+ END IF;
+END ;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `sectorCollectionSaleGroup_add` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -74410,7 +74468,7 @@ DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `ticket_close`()
BEGIN
/**
- * Realiza el cierre de todos los
+ * Realiza el cierre de todos los
* tickets de la tabla tmp.ticket_close.
*
* @table tmp.ticket_close(ticketFk) Identificadores de los tickets a cerrar
@@ -74428,7 +74486,7 @@ BEGIN
DECLARE cur CURSOR FOR
SELECT ticketFk FROM tmp.ticket_close;
-
+
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
RESIGNAL;
@@ -74438,7 +74496,7 @@ BEGIN
proc: LOOP
SET vDone = FALSE;
-
+
FETCH cur INTO vCurTicketFk;
IF vDone THEN
@@ -74455,12 +74513,12 @@ BEGIN
c.hasToInvoice
INTO vClientFk,
vIsTaxDataChecked,
- vCompanyFk,
+ vCompanyFk,
vShipped,
vHasDailyInvoice,
vWithPackage,
vHasToInvoice
- FROM ticket t
+ FROM ticket t
JOIN `client` c ON c.id = t.clientFk
JOIN province p ON p.id = c.provinceFk
LEFT JOIN autonomy a ON a.id = p.autonomyFk
@@ -74470,7 +74528,7 @@ BEGIN
INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
(SELECT vCurTicketFk, p.id, COUNT(*)
- FROM expedition e
+ FROM expedition e
JOIN packaging p ON p.id = e.packagingFk
JOIN ticket t ON t.id = e.ticketFk
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
@@ -74481,15 +74539,15 @@ BEGIN
GROUP BY p.itemFk);
-- No retornables o no catalogados
- INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
+ INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
(SELECT e.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1
- FROM expedition e
+ FROM expedition e
JOIN item i ON i.id = e.freightItemFk
LEFT JOIN packaging p ON p.itemFk = i.id
WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
GROUP BY e.freightItemFk);
-
+
IF(vHasDailyInvoice) AND vHasToInvoice THEN
-- Facturacion rapida
@@ -74497,10 +74555,10 @@ BEGIN
-- Facturar si está contabilizado
IF vIsTaxDataChecked THEN
CALL invoiceOut_newFromClient(
- vClientFk,
- (SELECT invoiceSerial(vClientFk, vCompanyFk, 'M')),
- vShipped,
- vCompanyFk,
+ vClientFk,
+ (SELECT invoiceSerial(vClientFk, vCompanyFk, 'multiple')),
+ vShipped,
+ vCompanyFk,
NULL,
NULL,
vNewInvoiceId);
@@ -75215,7 +75273,9 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` PROCEDURE `ticket_getProblems`(IN vIsTodayRelative tinyint(1))
+CREATE DEFINER=`root`@`localhost` PROCEDURE `ticket_getProblems`(
+ vIsTodayRelative tinyint(1)
+)
BEGIN
/**
* Calcula los problemas para un conjunto de tickets.
@@ -75232,6 +75292,7 @@ BEGIN
SELECT ticketFk,
MAX(isFreezed) isFreezed,
MAX(risk) risk,
+ MAX(hasRisk) hasRisk,
MAX(hasHighRisk) hasHighRisk,
MAX(hasTicketRequest) hasTicketRequest,
MAX(itemShortage) itemShortage,
@@ -75246,19 +75307,19 @@ BEGIN
FROM tmp.sale_problems
GROUP BY ticketFk;
- UPDATE tmp.ticket_problems tp
- SET tp.totalProblems = (
- (tp.isFreezed) +
- IF(tp.risk,TRUE, FALSE) +
- (tp.hasTicketRequest) +
- (tp.isTaxDataChecked = 0) +
- (tp.hasComponentLack) +
- (tp.itemDelay) +
- (tp.isTooLittle) +
- (tp.itemLost) +
- (tp.hasRounding) +
- (tp.itemShortage) +
- (tp.isVip)
+ UPDATE tmp.ticket_problems
+ SET totalProblems = (
+ (isFreezed) +
+ (hasRisk) +
+ (hasTicketRequest) +
+ (!isTaxDataChecked) +
+ (hasComponentLack) +
+ (itemDelay IS NOT NULL) +
+ (isTooLittle) +
+ (itemLost IS NOT NULL) +
+ (hasRounding IS NOT NULL) +
+ (itemShortage IS NOT NULL) +
+ (isVip)
);
DROP TEMPORARY TABLE tmp.sale_problems;
@@ -75895,16 +75956,28 @@ BEGIN
DECLARE vTicketFk INT;
DECLARE cTickets CURSOR FOR
- SELECT id FROM ticket
- WHERE refFk IS NULL
- AND ((vScope = 'client' AND clientFk = vId)
- OR (vScope = 'address' AND addressFk = vId));
+ SELECT DISTINCT t.id
+ FROM ticket t
+ LEFT JOIN tItems ti ON ti.id = t.id
+ WHERE t.refFk IS NULL
+ AND ((vScope = 'client' AND t.clientFk = vId)
+ OR (vScope = 'address' AND t.addressFk = vId)
+ OR (vScope = 'item' AND ti.id)
+ );
- DECLARE CONTINUE HANDLER FOR NOT FOUND
- SET vDone = TRUE;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+ CREATE OR REPLACE TEMPORARY TABLE tItems
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT DISTINCT t.id
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN itemTaxCountry itc ON itc.itemFk = s.itemFk
+ WHERE t.refFk IS NULL
+ AND (vScope = 'item' AND itc.itemFk = vId);
OPEN cTickets;
-
myLoop: LOOP
SET vDone = FALSE;
FETCH cTickets INTO vTicketFk;
@@ -75915,8 +75988,9 @@ BEGIN
CALL ticket_recalc(vTicketFk, NULL);
END LOOP;
-
CLOSE cTickets;
+
+ DROP TEMPORARY TABLE tItems;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -76458,18 +76532,28 @@ BEGIN
*
* @param vSelf Id del ticket
*/
-
+ DECLARE vTicketIsTooLittle BOOL;
+
+ SELECT ticket_isTooLittle(vSelf) INTO vTicketIsTooLittle;
+
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
(INDEX(ticketFk, isProblemCalcNeeded))
ENGINE = MEMORY
- SELECT vSelf ticketFk,
- ticket_isTooLittle(vSelf) hasProblem,
- ticket_isProblemCalcNeeded(vSelf) isProblemCalcNeeded;
-
+ WITH ticketData AS (
+ SELECT addressFk, DATE(shipped) dated
+ FROM vn.ticket
+ WHERE id = vSelf
+ )
+ SELECT t.id ticketFk,
+ vTicketIsTooLittle hasProblem,
+ ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
+ FROM vn.ticket t
+ JOIN ticketData td ON td.addressFk = t.addressFk
+ WHERE t.shipped BETWEEN td.dated AND util.dayEnd(td.dated);
+
CALL ticket_setProblem('isTooLittle');
DROP TEMPORARY TABLE tmp.ticket;
-
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -90739,7 +90823,7 @@ USE `vn2008`;
/*!50001 SET collation_connection = utf8mb4_unicode_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `mandato_tipo` AS select `m`.`id` AS `idmandato_tipo`,`m`.`name` AS `Nombre` from `vn`.`mandateType` `m` */;
+/*!50001 VIEW `mandato_tipo` AS select `m`.`id` AS `idmandato_tipo`,`m`.`code` AS `Nombre` from `vn`.`mandateType` `m` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
@@ -91419,4 +91503,4 @@ USE `vn2008`;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2024-08-20 7:45:07
+-- Dump completed on 2024-09-04 7:00:41
diff --git a/db/dump/.dump/triggers.sql b/db/dump/.dump/triggers.sql
index a968277b9..70ef63cf4 100644
--- a/db/dump/.dump/triggers.sql
+++ b/db/dump/.dump/triggers.sql
@@ -1502,6 +1502,134 @@ USE `srt`;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`buffer_beforeInsert`
+ BEFORE INSERT ON `buffer`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`buffer_beforeUpdate`
+ BEFORE UPDATE ON `buffer`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`buffer_afterDelete`
+ AFTER DELETE ON `buffer`
+ FOR EACH ROW
+BEGIN
+ INSERT INTO buffer
+ SET `action` = 'delete',
+ `changedModel` = 'Buffer',
+ `changedModelId` = OLD.id,
+ `userFk` = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`config_beforeInsert`
+ BEFORE INSERT ON `config`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`config_beforeUpdate`
+ BEFORE UPDATE ON `config`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`config_afterDelete`
+ AFTER DELETE ON `config`
+ FOR EACH ROW
+BEGIN
+ INSERT INTO config
+ SET `action` = 'delete',
+ `changedModel` = 'Config',
+ `changedModelId` = OLD.id,
+ `userFk` = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `srt`.`expedition_beforeUpdate`
BEFORE UPDATE ON `expedition`
FOR EACH ROW
@@ -5419,11 +5547,32 @@ DELIMITER ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `vn`.`host_beforeInsert`
+ BEFORE INSERT ON `host`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `vn`.`host_beforeUpdate`
BEFORE UPDATE ON `host`
FOR EACH ROW
BEGIN
SET new.updated = util.VN_NOW();
+ SET NEW.editorFk = account.myUser_getId();
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -7793,6 +7942,54 @@ DELIMITER ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `vn`.`roadmap_beforeInsert`
+ BEFORE INSERT ON `roadmap`
+ FOR EACH ROW
+BEGIN
+ IF NEW.driver1Fk IS NOT NULL THEN
+ SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
+ ELSE
+ SET NEW.driverName = NULL;
+ END IF;
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
+/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `vn`.`roadmap_beforeUpdate`
+ BEFORE UPDATE ON `roadmap`
+ FOR EACH ROW
+BEGIN
+ IF NEW.driver1Fk IS NOT NULL THEN
+ SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
+ ELSE
+ SET NEW.driverName = NULL;
+ END IF;
+END */;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `vn`.`expeditionTruck_beforeInsert`
BEFORE INSERT ON `roadmapStop` FOR EACH ROW
BEGIN
@@ -11212,4 +11409,4 @@ USE `vn2008`;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2024-08-20 7:45:23
+-- Dump completed on 2024-09-04 7:01:01
diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql
index 6563292dd..9f590233f 100644
--- a/db/dump/fixtures.before.sql
+++ b/db/dump/fixtures.before.sql
@@ -412,7 +412,7 @@ INSERT INTO `vn`.`clientManaCache`(`clientFk`, `mana`, `dated`)
(1103, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
(1104, -30, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH));
-INSERT INTO `vn`.`mandateType`(`id`, `name`)
+INSERT INTO `vn`.`mandateType`(`id`, `code`)
VALUES
(1, 'B2B'),
(2, 'CORE'),
@@ -632,7 +632,7 @@ INSERT INTO `vn`.`invoiceOutSerial` (`code`, `description`, `isTaxed`, `taxAreaF
('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'),
+ ('M', 'Múltiple nacional', 1, 'NATIONAL', 0, 'multiple'),
('R', 'Rectificativa', 1, 'NATIONAL', 0, NULL),
('E', 'Exportación rápida', 0, 'WORLD', 0, 'quick');
@@ -743,45 +743,45 @@ INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agen
(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`, `cmrFk`)
+INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight`, `cmrFk`, `problem`, `risk`)
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),
- (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),
- (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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, NULL),
- (27 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, 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, 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, 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, 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, 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, NULL),
- (33, 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, NULL),
- (34, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1103, 'BEJAR', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
- (35, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Somewhere in Philippines', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
- (36, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Ant-Man Adventure', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
- (37, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1110, 'Deadpool swords', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL);
+ (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, 'hasHighRisk', 901.4),
+ (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, 'hasHighRisk', 901.4),
+ (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, NULL, 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, NULL, 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, NULL, 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, NULL, 'hasHighRisk', 901.4),
+ (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, NULL, 'hasHighRisk', 901.4),
+ (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, NULL, 'hasHighRisk', 901.4),
+ (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, NULL, NULL, 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, NULL, 'isTooLittle', 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, NULL, 'hasTicketRequest', 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, NULL, NULL, 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, NULL, NULL, 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, NULL, NULL, 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, NULL, 'isFreezed', 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, NULL, NULL, 388.7),
+ (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, NULL, NULL, 388.7),
+ (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, NULL, 'isFreezed', 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, NULL, 'isTaxDataChecked', 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, NULL, 'isTaxDataChecked', 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, NULL, 'isTaxDataChecked', 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, NULL, 'isTaxDataChecked', 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, NULL, 'hasTicketRequest, hasHighRisk', 901.4),
+ (24 ,NULL, 8, 1, 7, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
+ (25 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
+ (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, NULL, 'hasHighRisk', 901.4),
+ (27 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, 901.4),
+ (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, NULL, NULL, 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, NULL, NULL, 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, NULL, NULL, 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, NULL, NULL, 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, NULL, NULL, NULL),
+ (33, 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, NULL, NULL, NULL),
+ (34, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1103, 'BEJAR', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
+ (35, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Somewhere in Philippines', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
+ (36, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Ant-Man Adventure', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
+ (37, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1110, 'Deadpool swords', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL);
INSERT INTO `vn`.`ticketObservation`(`id`, `ticketFk`, `observationTypeFk`, `description`)
VALUES
@@ -1059,50 +1059,50 @@ INSERT INTO `vn`.`ticketPackaging`(`id`, `ticketFk`, `packagingFk`, `quantity`,
(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`)
+INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created`, `problem`)
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()),
- (40, 2, 34, 'Melee weapon combat fist 15cm', 10.00, 3.91, 0, 0, 0, util.VN_CURDATE()),
- (41, 2, 35, 'Melee weapon combat fist 15cm', 8.00, 3.01, 0, 0, 0, util.VN_CURDATE()),
- (42, 2, 36, 'Melee weapon combat fist 15cm', 6.00, 2.50, 0, 0, 0, util.VN_CURDATE());
+ (1, 1, 1, 'Ranged weapon longbow 200cm', 5, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (2, 2, 1, 'Melee weapon combat fist 15cm', 10, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (3, 1, 1, 'Ranged weapon longbow 200cm', 2, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (4, 4, 1, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (5, 1, 2, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (6, 1, 3, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 'hasComponentLack'),
+ (7, 2, 11, 'Melee weapon combat fist 15cm', 15, 7.74, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (8, 4, 11, 'Melee weapon heavy shield 100cm', 10, 1.79, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (9, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (10, 2, 16, 'Melee weapon combat fist 15cm', 10, 7.09, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (11, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (12, 4, 16, 'Melee weapon heavy shield 100cm', 20, 1.71, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (13, 2, 8, 'Melee weapon combat fist 15cm', 10, 7.08, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (14, 1, 8, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (15, 1, 19, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (16, 2, 20, 'Melee weapon combat fist 15cm', 20, 7.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (17, 2, 22, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
+ (18, 4, 22, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
+ (19, 1, 4, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 'hasComponentLack'),
+ (20, 1, 5, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 'hasComponentLack'),
+ (21, 1, 6, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
+ (22, 1, 7, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (23, 1, 9, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (24, 1, 10, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (25, 4, 12, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (26, 4, 13, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (27, 4, 14, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (28, 4, 15, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (29, 4, 17, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (30, 4, 18, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (31, 2, 23, 'Melee weapon combat fist 15cm', -5, 7.08, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (32, 1, 24, 'Ranged weapon longbow 200cm', -1, 8.07, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (33, 5, 14, 'Ranged weapon pistol 9mm', 50, 1.79, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (34, 4, 28, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (35, 4, 29, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (37, 4, 31, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), NULL),
+ (36, 4, 30, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (38, 2, 32, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
+ (39, 1, 32, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (40, 2, 34, 'Melee weapon combat fist 15cm', 10.00, 3.91, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (41, 2, 35, 'Melee weapon combat fist 15cm', 8.00, 3.01, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
+ (42, 2, 36, 'Melee weapon combat fist 15cm', 6.00, 2.50, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack');
INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
VALUES
@@ -3945,11 +3945,15 @@ VALUES
(35, 'ES12346B12345679', 3, 241);
INSERT INTO vn.accountDetailType
-(id, description)
+(id, description, code)
VALUES
- (1, 'IBAN'),
- (2, 'SWIFT'),
- (3, 'Referencia Remesas'),
- (4, 'Referencia Transferencias'),
- (5, 'Referencia Nominas'),
- (6, 'ABA');
+ (1, 'IBAN', 'iban'),
+ (2, 'SWIFT', 'swift'),
+ (3, 'Referencia Remesas', 'remRef'),
+ (4, 'Referencia Transferencias', 'trnRef'),
+ (5, 'Referencia Nominas', 'payRef'),
+ (6, 'ABA', 'aba');
+
+INSERT INTO vn.ormConfig SET
+ id = 1,
+ selectLimit = 1000;
\ No newline at end of file
diff --git a/db/routines/srt/events/moving_clean.sql b/db/routines/srt/events/moving_clean.sql
index a6f7792a2..18644a9f8 100644
--- a/db/routines/srt/events/moving_clean.sql
+++ b/db/routines/srt/events/moving_clean.sql
@@ -1,13 +1,9 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `srt`.`moving_clean`
- ON SCHEDULE EVERY 5 MINUTE
+ ON SCHEDULE EVERY 15 MINUTE
STARTS '2022-01-21 00:00:00.000'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Llama a srt.moving_clean para que elimine y notifique de registr'
-DO BEGIN
-
- CALL srt.moving_clean();
-
-END$$
+DO CALL srt.moving_clean()$$
DELIMITER ;
diff --git a/db/routines/srt/procedures/moving_clean.sql b/db/routines/srt/procedures/moving_clean.sql
index b8fae7ff4..a5bbc7e70 100644
--- a/db/routines/srt/procedures/moving_clean.sql
+++ b/db/routines/srt/procedures/moving_clean.sql
@@ -3,61 +3,69 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`moving_clean`()
BEGIN
/**
* Elimina movimientos por inactividad
- *
*/
DECLARE vExpeditionFk INT;
- DECLARE vBufferToFk INT;
DECLARE vBufferFromFk INT;
- DECLARE done BOOL DEFAULT FALSE;
-
- DECLARE cur CURSOR FOR
- SELECT m.expeditionFk, m.bufferToFk, m.bufferFromFk
- FROM srt.moving m
- JOIN srt.config c
- JOIN (SELECT bufferFk, SUM(isActive) hasBox
- FROM srt.photocell
- GROUP BY bufferFk) sub ON sub.bufferFk = m.bufferFromFk
- WHERE m.created < TIMESTAMPADD(MINUTE, - c.movingMaxLife , util.VN_NOW())
+ DECLARE vStateOutFk INT
+ DEFAULT (SELECT id FROM expeditionState WHERE `description` = 'OUT');
+ DECLARE vDone BOOL;
+ DECLARE vSorter CURSOR FOR
+ SELECT m.expeditionFk, m.bufferFromFk
+ FROM moving m
+ JOIN (
+ SELECT bufferFk, SUM(isActive) hasBox
+ FROM photocell
+ GROUP BY bufferFk
+ ) sub ON sub.bufferFk = m.bufferFromFk
+ WHERE m.created < (util.VN_NOW() - INTERVAL (SELECT movingMaxLife FROM config) MINUTE)
AND NOT sub.hasBox;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- OPEN cur;
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
- bucle: LOOP
+ OPEN vSorter;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vSorter INTO vExpeditionFk, vBufferFromFk;
- FETCH cur INTO vExpeditionFk, vBufferToFk, vBufferFromFk;
-
- IF done THEN
- LEAVE bucle;
+ IF vDone THEN
+ LEAVE l;
END IF;
- DELETE FROM srt.moving
+ START TRANSACTION;
+
+ SELECT id
+ FROM moving
+ WHERE expeditionFk = vExpeditionFk
+ FOR UPDATE;
+
+ DELETE FROM moving
WHERE expeditionFk = vExpeditionFk;
- UPDATE srt.expedition e
- JOIN srt.expeditionState es ON es.description = 'OUT'
- SET
- bufferFk = NULL,
+ SELECT id
+ FROM expedition
+ WHERE id = vExpeditionFk
+ OR (bufferFk = vBufferFromFk AND `position` > 0)
+ FOR UPDATE;
+
+ UPDATE expedition
+ SET bufferFk = NULL,
`position` = NULL,
- stateFk = es.id
- WHERE e.id = vExpeditionFk;
+ stateFk = vStateOutFk
+ WHERE id = vExpeditionFk;
- UPDATE srt.expedition e
- SET e.`position` = e.`position` - 1
- WHERE e.bufferFk = vBufferFromFk
- AND e.`position` > 0;
-
- CALL vn.mail_insert(
- 'pako@verdnatura.es, carles@verdnatura.es',
- NULL,
- CONCAT('Moving_clean. Expedition: ', vExpeditionFk, ' estaba parada'),
- CONCAT('Expedition: ', vExpeditionFk,' vBufferToFk: ', vBufferToFk)
- );
-
- END LOOP bucle;
-
- CLOSE cur;
+ UPDATE expedition
+ SET `position` = `position` - 1
+ WHERE bufferFk = vBufferFromFk
+ AND `position` > 0;
+ COMMIT;
+ END LOOP l;
+ CLOSE vSorter;
END$$
DELIMITER ;
diff --git a/db/routines/srt/triggers/buffer_afterDelete.sql b/db/routines/srt/triggers/buffer_afterDelete.sql
new file mode 100644
index 000000000..d554e6364
--- /dev/null
+++ b/db/routines/srt/triggers/buffer_afterDelete.sql
@@ -0,0 +1,12 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_afterDelete`
+ AFTER DELETE ON `buffer`
+ FOR EACH ROW
+BEGIN
+ INSERT INTO buffer
+ SET `action` = 'delete',
+ `changedModel` = 'Buffer',
+ `changedModelId` = OLD.id,
+ `userFk` = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/srt/triggers/buffer_beforeInsert.sql b/db/routines/srt/triggers/buffer_beforeInsert.sql
new file mode 100644
index 000000000..6b1e05362
--- /dev/null
+++ b/db/routines/srt/triggers/buffer_beforeInsert.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_beforeInsert`
+ BEFORE INSERT ON `buffer`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/srt/triggers/buffer_beforeUpdate.sql b/db/routines/srt/triggers/buffer_beforeUpdate.sql
new file mode 100644
index 000000000..86418a551
--- /dev/null
+++ b/db/routines/srt/triggers/buffer_beforeUpdate.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_beforeUpdate`
+ BEFORE UPDATE ON `buffer`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/srt/triggers/config_afterDelete.sql b/db/routines/srt/triggers/config_afterDelete.sql
new file mode 100644
index 000000000..1e4af9104
--- /dev/null
+++ b/db/routines/srt/triggers/config_afterDelete.sql
@@ -0,0 +1,12 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_afterDelete`
+ AFTER DELETE ON `config`
+ FOR EACH ROW
+BEGIN
+ INSERT INTO config
+ SET `action` = 'delete',
+ `changedModel` = 'Config',
+ `changedModelId` = OLD.id,
+ `userFk` = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/srt/triggers/config_beforeInsert.sql b/db/routines/srt/triggers/config_beforeInsert.sql
new file mode 100644
index 000000000..7d8389646
--- /dev/null
+++ b/db/routines/srt/triggers/config_beforeInsert.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_beforeInsert`
+ BEFORE INSERT ON `config`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/srt/triggers/config_beforeUpdate.sql b/db/routines/srt/triggers/config_beforeUpdate.sql
new file mode 100644
index 000000000..0002fb4d6
--- /dev/null
+++ b/db/routines/srt/triggers/config_beforeUpdate.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_beforeUpdate`
+ BEFORE UPDATE ON `config`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/functions/invoiceSerial.sql b/db/routines/vn/functions/invoiceSerial.sql
index 66448ac9c..10ab7a797 100644
--- a/db/routines/vn/functions/invoiceSerial.sql
+++ b/db/routines/vn/functions/invoiceSerial.sql
@@ -1,26 +1,43 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerial`(vClientFk INT, vCompanyFk INT, vType CHAR(1))
- RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
+CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerial`(
+ vClientFk INT,
+ vCompanyFk INT,
+ vType CHAR(15)
+)
+ RETURNS char(2) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
DETERMINISTIC
BEGIN
- /**
- * Obtiene la serie de de una factura
- * dependiendo del area del cliente.
- *
- * @param vClientFk Id del cliente
- * @param vCompanyFk Id de la empresa
- * @param vType Tipo de factura ["R", "M", "G"]
- * @return Serie de la factura
- */
- DECLARE vTaxArea VARCHAR(25);
- DECLARE vSerie CHAR(1);
+/**
+* Obtiene la serie de una factura
+* dependiendo del area del cliente.
+*
+* @param vClientFk Id del cliente
+* @param vCompanyFk Id de la empresa
+* @param vType Tipo de factura (vn.invoiceOutSerial.type[ENUM])
+* @return vSerie de la factura
+*/
+ DECLARE vTaxArea VARCHAR(25) COLLATE utf8mb3_general_ci;
+ DECLARE vTransactionCode INT(2);
+ DECLARE vSerie CHAR(2);
IF (SELECT hasInvoiceSimplified FROM client WHERE id = vClientFk) THEN
RETURN 'S';
END IF;
- SELECT clientTaxArea(vClientFk, vCompanyFk) INTO vTaxArea;
- SELECT invoiceSerialArea(vType,vTaxArea) INTO vSerie;
+ SELECT addressTaxArea(defaultAddressFk, vCompanyFk) INTO vTaxArea
+ FROM client
+ WHERE id = vClientFk;
+
+ SELECT CodigoTransaccion INTO vTransactionCode
+ FROM taxArea
+ WHERE code = vTaxArea;
+
+ SELECT ios.code INTO vSerie
+ FROM invoiceOutSerial ios
+ JOIN taxArea ta ON ta.code = ios.taxAreaFk
+ WHERE ios.`type` = vType
+ AND ta.CodigoTransaccion = vTransactionCode;
+
RETURN vSerie;
END$$
DELIMITER ;
diff --git a/db/routines/vn/functions/invoiceSerialArea.sql b/db/routines/vn/functions/invoiceSerialArea.sql
deleted file mode 100644
index 02edd83f2..000000000
--- a/db/routines/vn/functions/invoiceSerialArea.sql
+++ /dev/null
@@ -1,34 +0,0 @@
-DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerialArea`(vType CHAR(1), vTaxArea VARCHAR(25))
- RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci
- DETERMINISTIC
-BEGIN
- DECLARE vSerie CHAR(1);
-
- IF vType = 'R' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'H'
- WHEN 'WORLD' THEN 'E'
- ELSE 'T'
- END INTO vSerie;
- -- Factura multiple
- ELSEIF vType = 'M' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'H'
- WHEN 'WORLD' THEN 'E'
- ELSE 'M'
- END INTO vSerie;
- -- Factura global
- ELSEIF vType = 'G' THEN
- SELECT
- CASE vTaxArea
- WHEN 'CEE' THEN 'V'
- WHEN 'WORLD' THEN 'X'
- ELSE 'A'
- END INTO vSerie;
- END IF;
- RETURN vSerie;
-END$$
-DELIMITER ;
diff --git a/db/routines/vn/procedures/buy_recalcPrices.sql b/db/routines/vn/procedures/buy_recalcPrices.sql
index 35eb00cf1..b05a9bfa9 100644
--- a/db/routines/vn/procedures/buy_recalcPrices.sql
+++ b/db/routines/vn/procedures/buy_recalcPrices.sql
@@ -2,51 +2,58 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_recalcPrices`()
BEGIN
/**
- * Recalcula los precios para las compras insertadas en tmp.buyRecalc
+ * Recalcula los precios para las compras insertadas en tmp.buyRecalc.
*
* @param tmp.buyRecalc (id)
*/
DECLARE vLanded DATE;
DECLARE vWarehouseFk INT;
- DECLARE vHasNotPrice BOOL;
- DECLARE vBuyingValue DECIMAL(10,4);
- DECLARE vPackagingFk VARCHAR(10);
DECLARE vIsWarehouseFloramondo BOOL;
+ DECLARE vDone BOOL;
+ DECLARE vTravels CURSOR FOR
+ SELECT t.landed, t.warehouseInFk, (w.code = 'flm')
+ FROM tmp.buyRecalc br
+ JOIN buy b ON b.id = br.id
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ JOIN warehouse w ON w.id = t.warehouseInFk
+ GROUP BY t.landed, t.warehouseInFk;
- SELECT t.landed, t.warehouseInFk, (w.`name` = 'Floramondo')
- INTO vLanded, vWarehouseFk, vIsWarehouseFloramondo
- FROM tmp.buyRecalc br
- JOIN buy b ON b.id = br.id
- JOIN entry e ON e.id = b.entryFk
- JOIN travel t ON t.id = e.travelFk
- JOIN warehouse w ON w.id = t.warehouseInFk
- LIMIT 1;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- CALL rate_getPrices(vLanded, vWarehouseFk);
+ OPEN vTravels;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vTravels INTO vLanded, vWarehouseFk, vIsWarehouseFloramondo;
- UPDATE buy b
- JOIN tmp.buyRecalc br ON br.id = b.id AND (@buyId := b.id)
- LEFT JOIN packaging p ON p.id = b.packagingFk
- JOIN item i ON i.id = b.itemFk
- JOIN entry e ON e.id = b.entryFk
- JOIN itemType it ON it.id = i.typeFk
- JOIN travel tr ON tr.id = e.travelFk
- JOIN agencyMode am ON am.id = tr.agencyModeFk
- JOIN tmp.rate r
- JOIN volumeConfig vc
- SET b.freightValue = @PF:= IFNULL(((am.m3 * @m3:= item_getVolume(b.itemFk, b.packagingFk) / 1000000)
- / b.packing) * IF(am.hasWeightVolumetric, GREATEST(b.weight / @m3 / vc.aerealVolumetricDensity, 1), 1), 0),
- b.comissionValue = @CF:= ROUND(IFNULL(e.commission * b.buyingValue / 100, 0), 3),
- b.packageValue = @EF:= IF(vIsWarehouseFloramondo, 0, IFNULL(ROUND(IF(p.isPackageReturnable, p.returnCost / b.packing , p.`value` / b.packing), 3),0)),
- b.price3 = @t3:= IF(r.rate3 = 0, b.buyingValue,ROUND((b.buyingValue + @CF + @EF + @PF) / ((100 - r.rate3 - it.promo ) /100) ,2)), -- He añadido que el coste sea igual a tarifa3 si t3 = 0
- b.price2 = @t2:= round(@t3 * (1 + ((r.rate2 - r.rate3)/100)),2),
- b.price2 = @t2:= IF(@t2 <= @t3,@t3 , @t2);
+ IF vDone THEN
+ LEAVE l;
+ END IF;
- SELECT (b.buyingValue = b.price2), b.buyingValue, b.packagingFk
- INTO vHasNotPrice, vBuyingValue, vPackagingFk
- FROM vn.buy b
- WHERE b.id = @buyId AND b.buyingValue <> 0.01;
+ CALL rate_getPrices(vLanded, vWarehouseFk);
- DROP TEMPORARY TABLE tmp.rate;
+ UPDATE buy b
+ JOIN tmp.buyRecalc br ON br.id = b.id AND (@buyId := b.id)
+ LEFT JOIN packaging p ON p.id = b.packagingFk
+ JOIN item i ON i.id = b.itemFk
+ JOIN entry e ON e.id = b.entryFk
+ JOIN itemType it ON it.id = i.typeFk
+ JOIN travel tr ON tr.id = e.travelFk
+ JOIN agencyMode am ON am.id = tr.agencyModeFk
+ JOIN tmp.rate r
+ JOIN volumeConfig vc
+ SET b.freightValue = @PF:= IFNULL(((am.m3 * @m3:= item_getVolume(b.itemFk, b.packagingFk) / 1000000)
+ / b.packing) * IF(am.hasWeightVolumetric, GREATEST(b.weight / @m3 / vc.aerealVolumetricDensity, 1), 1), 0),
+ b.comissionValue = @CF:= ROUND(IFNULL(e.commission * b.buyingValue / 100, 0), 3),
+ b.packageValue = @EF:= IF(vIsWarehouseFloramondo, 0, IFNULL(ROUND(IF(p.isPackageReturnable, p.returnCost / b.packing , p.`value` / b.packing), 3),0)),
+ b.price3 = @t3:= IF(r.rate3 = 0, b.buyingValue,ROUND((b.buyingValue + @CF + @EF + @PF) / ((100 - r.rate3 - it.promo ) /100) ,2)), -- He añadido que el coste sea igual a tarifa3 si t3 = 0
+ b.price2 = @t2:= round(@t3 * (1 + ((r.rate2 - r.rate3)/100)),2),
+ b.price2 = @t2:= IF(@t2 <= @t3,@t3 , @t2)
+ WHERE tr.landed = vLanded
+ AND tr.warehouseInFk = vWarehouseFk;
+
+ DROP TEMPORARY TABLE tmp.rate;
+ END LOOP;
+ CLOSE vTravels;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/collection_new.sql b/db/routines/vn/procedures/collection_new.sql
index 0bd6e1b25..6e112634e 100644
--- a/db/routines/vn/procedures/collection_new.sql
+++ b/db/routines/vn/procedures/collection_new.sql
@@ -9,10 +9,11 @@ BEGIN
DECLARE vWarehouseFk INT;
DECLARE vWagons INT;
DECLARE vTrainFk INT;
- DECLARE vLinesLimit INT DEFAULT NULL;
+ DECLARE vLinesLimit INT;
DECLARE vTicketLines INT;
- DECLARE vVolumeLimit DECIMAL DEFAULT NULL;
+ DECLARE vVolumeLimit DECIMAL;
DECLARE vTicketVolume DECIMAL;
+ DECLARE vSizeLimit INT;
DECLARE vMaxTickets INT;
DECLARE vStateFk VARCHAR(45);
DECLARE vFirstTicketFk INT;
@@ -77,6 +78,7 @@ BEGIN
o.trainFk,
o.linesLimit,
o.volumeLimit,
+ o.sizeLimit,
pc.collection_new_lockname
INTO vMaxTickets,
vHasUniqueCollectionTime,
@@ -88,6 +90,7 @@ BEGIN
vTrainFk,
vLinesLimit,
vVolumeLimit,
+ vSizeLimit,
vLockName
FROM productionConfig pc
JOIN worker w ON w.id = vUserFk
@@ -172,6 +175,14 @@ BEGIN
JOIN state s ON s.id = pb.state
JOIN agencyMode am ON am.id = pb.agencyModeFk
JOIN agency a ON a.id = am.agencyFk
+ LEFT JOIN (
+ SELECT pb.ticketFk, MAX(i.`size`) maxSize
+ FROM tmp.productionBuffer pb
+ JOIN ticket t ON t.id = pb.ticketfk
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ GROUP BY pb.ticketFk
+ ) sub ON sub.ticketFk = pb.ticketFk
JOIN productionConfig pc
WHERE pb.shipped <> util.VN_CURDATE()
OR (pb.ubicacion IS NULL AND a.isOwn)
@@ -183,8 +194,9 @@ BEGIN
OR (NOT pb.V AND vItemPackingTypeFk = 'V')
OR (pc.isPreviousPreparationRequired AND pb.previousWithoutParking)
OR LENGTH(pb.problem) > 0
- OR (pb.lines >= vLinesLimit AND vLinesLimit IS NOT NULL)
- OR (pb.m3 >= vVolumeLimit AND vVolumeLimit IS NOT NULL);
+ OR pb.lines > vLinesLimit
+ OR pb.m3 > vVolumeLimit
+ OR sub.maxSize > vSizeLimit;
END IF;
-- Es importante que el primer ticket se coja en todos los casos
diff --git a/db/routines/vn/procedures/invoiceOut_new.sql b/db/routines/vn/procedures/invoiceOut_new.sql
index c9b94027e..43d0a09a1 100644
--- a/db/routines/vn/procedures/invoiceOut_new.sql
+++ b/db/routines/vn/procedures/invoiceOut_new.sql
@@ -97,7 +97,7 @@ BEGIN
AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
THEN
- -- el trigger añade el siguiente Id_Factura correspondiente a la vSerial
+ -- el trigger añade el siguiente ref correspondiente a la vSerial
INSERT INTO invoiceOut(
ref,
serial,
diff --git a/db/routines/vn/procedures/itemShelving_transfer.sql b/db/routines/vn/procedures/itemShelving_transfer.sql
index 47a9a7cf0..94d2308a1 100644
--- a/db/routines/vn/procedures/itemShelving_transfer.sql
+++ b/db/routines/vn/procedures/itemShelving_transfer.sql
@@ -5,28 +5,26 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelving_transf
)
BEGIN
/**
- * Transfiere producto de una ubicación a otra, fusionando si coincide el
- * packing y la fecha.
+ * Transfiere producto de una ubicación a otra
+ * fusionando si coincide el packing y la fecha.
*
* @param vItemShelvingFk Identificador de itemShelving
* @param vShelvingFk Identificador de shelving
*/
- DECLARE vNewItemShelvingFk INT DEFAULT 0;
+ DECLARE vNewItemShelvingFk INT;
- SELECT MAX(ish.id)
- INTO vNewItemShelvingFk
+ SELECT MAX(ish.id) INTO vNewItemShelvingFk
FROM itemShelving ish
JOIN (
- SELECT
- itemFk,
- packing,
- created,
- buyFk
+ SELECT itemFk,
+ packing,
+ created,
+ buyFk
FROM itemShelving
WHERE id = vItemShelvingFk
) ish2 ON ish2.itemFk = ish.itemFk
AND ish2.packing = ish.packing
- AND date(ish2.created) = date(ish.created)
+ AND DATE(ish2.created) = DATE(ish.created)
AND ish2.buyFk = ish.buyFk
WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci;
@@ -39,10 +37,16 @@ BEGIN
DELETE FROM itemShelving
WHERE id = vItemShelvingFk;
ELSE
- UPDATE itemShelving
- SET shelvingFk = vShelvingFk
- WHERE id = vItemShelvingFk;
+ IF (SELECT EXISTS(SELECT id FROM shelving
+ WHERE code = vShelvingFk COLLATE utf8_unicode_ci)) THEN
+
+ UPDATE itemShelving
+ SET shelvingFk = vShelvingFk
+ WHERE id = vItemShelvingFk;
+ ELSE
+ CALL util.throw('The shelving not exists');
+ END IF;
END IF;
- SELECT true;
+ SELECT TRUE;
END$$
-DELIMITER ;
\ No newline at end of file
+DELIMITER ;
diff --git a/db/routines/vn/procedures/productionControl.sql b/db/routines/vn/procedures/productionControl.sql
index af6d929d7..84717a19a 100644
--- a/db/routines/vn/procedures/productionControl.sql
+++ b/db/routines/vn/procedures/productionControl.sql
@@ -15,11 +15,6 @@ proc: BEGIN
DECLARE vEndingDate DATETIME;
DECLARE vIsTodayRelative BOOLEAN;
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- RESIGNAL;
- END;
-
SELECT util.dayEnd(util.VN_CURDATE()) + INTERVAL LEAST(vScopeDays, maxProductionScopeDays) DAY
INTO vEndingDate
FROM productionConfig;
@@ -273,7 +268,6 @@ proc: BEGIN
DROP TEMPORARY TABLE
tmp.productionTicket,
tmp.ticket,
- tmp.risk,
tmp.ticket_problems,
tmp.ticketWithPrevia,
tItemShelvingStock,
diff --git a/db/routines/vn/procedures/sale_getProblems.sql b/db/routines/vn/procedures/sale_getProblems.sql
index c881bcf92..7c5204e0d 100644
--- a/db/routines/vn/procedures/sale_getProblems.sql
+++ b/db/routines/vn/procedures/sale_getProblems.sql
@@ -1,40 +1,34 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_getProblems`(IN vIsTodayRelative tinyint(1))
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_getProblems`(
+ vIsTodayRelative tinyint(1)
+)
BEGIN
/**
* Calcula los problemas de cada venta para un conjunto de tickets.
*
* @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy
- * @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Identificadores de los tickets a calcular
+ * @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Tickets a calcular
* @return tmp.sale_problems
*/
- DECLARE vWarehouseFk INT;
+ DECLARE vWarehouseFk INT;
DECLARE vDate DATE;
- DECLARE vAvailableCache INT;
+ DECLARE vAvailableCache INT;
DECLARE vVisibleCache INT;
DECLARE vDone BOOL;
- DECLARE vRequiredComponent INT;
-
- DECLARE vCursor CURSOR FOR
- SELECT DISTINCT tt.warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(tt.shipped))
- FROM tmp.sale_getProblems tt
- WHERE DATE(tt.shipped) BETWEEN util.VN_CURDATE()
- AND util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY;
+ DECLARE vCursor CURSOR FOR
+ SELECT DISTINCT warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(shipped))
+ FROM tmp.sale_getProblems
+ WHERE shipped BETWEEN util.VN_CURDATE()
+ AND util.dayEnd(util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- DELETE tt.*
- FROM tmp.sale_getProblems tt
- JOIN ticketObservation tto ON tto.ticketFk = tt.ticketFk
- JOIN observationType ot ON ot.id = tto.observationTypeFk
- WHERE ot.code = 'administrative'
- AND tto.description = 'Miriam';
-
CREATE OR REPLACE TEMPORARY TABLE tmp.sale_problems (
ticketFk INT(11),
saleFk INT(11),
isFreezed INTEGER(1) DEFAULT 0,
risk DECIMAL(10,1) DEFAULT 0,
+ hasRisk TINYINT(1) DEFAULT 0,
hasHighRisk TINYINT(1) DEFAULT 0,
hasTicketRequest INTEGER(1) DEFAULT 0,
itemShortage VARCHAR(255),
@@ -48,105 +42,48 @@ BEGIN
PRIMARY KEY (ticketFk, saleFk)
) ENGINE = MEMORY;
- CREATE OR REPLACE TEMPORARY TABLE tmp.ticket_list
- (PRIMARY KEY (ticketFk))
- ENGINE = MEMORY
- SELECT ticketFk, clientFk
- FROM tmp.sale_getProblems;
+ INSERT INTO tmp.sale_problems(ticketFk,
+ saleFk,
+ isFreezed,
+ risk,
+ hasRisk,
+ hasHighRisk,
+ hasTicketRequest,
+ isTaxDataChecked,
+ hasComponentLack,
+ hasRounding,
+ isTooLittle)
+ SELECT sgp.ticketFk,
+ s.id,
+ IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed,
+ t.risk,
+ IF(FIND_IN_SET('hasRisk', t.problem), TRUE, FALSE) hasRisk,
+ IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk,
+ IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest,
+ IF(FIND_IN_SET('isTaxDataChecked', t.problem), FALSE, TRUE) isTaxDataChecked,
+ IF(FIND_IN_SET('hasComponentLack', s.problem), TRUE, FALSE) hasComponentLack,
+ IF(FIND_IN_SET('hasRounding', s.problem),
+ LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250),
+ NULL
+ ) hasRounding,
+ IF(FIND_IN_SET('isTooLittle', t.problem)
+ AND util.VN_NOW() < (util.VN_CURDATE() + INTERVAL HOUR(zc.`hour`) HOUR) + INTERVAL MINUTE(zc.`hour`) MINUTE,
+ TRUE, FALSE) isTooLittle
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
+ LEFT JOIN sale s ON s.ticketFk = t.id
+ LEFT JOIN item i ON i.id = s.itemFk
+ LEFT JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
+ AND zc.dated = util.VN_CURDATE()
+ WHERE s.problem <> '' OR t.problem <> '' OR t.risk
+ GROUP BY t.id, s.id;
- SELECT COUNT(*) INTO vRequiredComponent
- FROM component
- WHERE isRequired;
-
- -- Too Little
- INSERT INTO tmp.sale_problems(ticketFk, isTooLittle)
- SELECT tp.ticketFk, TRUE
- FROM tmp.sale_getProblems tp
- JOIN ticket t ON t.id = tp.ticketFk
- JOIN (
- SELECT t.addressFk,
- SUM(ROUND(`ic`.`cm3delivery` * `s`.`quantity` / 1000, 0)) litros,
- t.totalWithoutVat
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN sale s ON s.ticketFk = t.id
- AND s.quantity > 0
- JOIN itemCost ic ON ic.itemFk = s.itemFk
- AND ic.warehouseFk = t.warehouseFk
- JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
- AND zc.dated = util.VN_CURDATE()
- JOIN agencyMode am ON am.id = t.agencyModeFk
- JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
- WHERE util.VN_NOW() < (util.VN_CURDATE() + INTERVAL HOUR(zc.`hour`) HOUR) + INTERVAL MINUTE(zc.`hour`) MINUTE
- AND dm.code IN ('AGENCY','DELIVERY','PICKUP')
- AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight()
- GROUP BY t.addressFk
- ) sub ON sub.addressFk = t.addressFk
- JOIN volumeConfig vc
- WHERE sub.litros < vc.minTicketVolume
- AND sub.totalWithoutVat < vc.minTicketValue;
-
- -- VIP
INSERT INTO tmp.sale_problems(ticketFk, isVip)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
+ SELECT sgp.ticketFk, TRUE
+ FROM tmp.sale_getProblems sgp
+ JOIN client c ON c.id = sgp.clientFk
WHERE c.businessTypeFk = 'VIP'
- ON DUPLICATE KEY UPDATE isVip = TRUE;
-
- -- Faltan componentes
- INSERT INTO tmp.sale_problems(ticketFk, hasComponentLack, saleFk)
- SELECT t.id, COUNT(c.id) < vRequiredComponent hasComponentLack, s.id
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN sale s ON s.ticketFk = t.id
- JOIN agencyMode am ON am.id = t.agencyModeFk
- JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
- LEFT JOIN saleComponent sc ON sc.saleFk = s.id
- LEFT JOIN component c ON c.id = sc.componentFk
- AND c.isRequired
- WHERE dm.code IN ('AGENCY','DELIVERY','PICKUP')
- AND s.quantity > 0
- GROUP BY s.id
- HAVING hasComponentLack;
-
- -- Cliente congelado
- INSERT INTO tmp.sale_problems(ticketFk, isFreezed)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
- WHERE c.isFreezed
- ON DUPLICATE KEY UPDATE isFreezed = c.isFreezed;
-
- -- Credit exceeded
- CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt
- (PRIMARY KEY (clientFk))
- ENGINE = MEMORY
- SELECT DISTINCT clientFk
- FROM tmp.ticket_list;
-
- CALL client_getDebt(util.VN_CURDATE());
-
- INSERT INTO tmp.sale_problems(ticketFk, risk, hasHighRisk)
- SELECT DISTINCT tl.ticketFk, r.risk, ((r.risk - cc.riskTolerance) > c.credit + 10)
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- JOIN agencyMode a ON t.agencyModeFk = a.id
- JOIN tmp.risk r ON r.clientFk = t.clientFk
- JOIN client c ON c.id = t.clientFk
- JOIN clientConfig cc
- WHERE r.risk > c.credit + 10
- AND NOT a.isRiskFree
- ON DUPLICATE KEY UPDATE
- risk = r.risk, hasHighRisk = ((r.risk - cc.riskTolerance) > c.credit + 10);
-
- -- Antiguo COD 100, son peticiones de compra sin terminar
- INSERT INTO tmp.sale_problems(ticketFk, hasTicketRequest)
- SELECT DISTINCT tl.ticketFk, TRUE
- FROM tmp.ticket_list tl
- JOIN ticketRequest tr ON tr.ticketFk = tl.ticketFk
- WHERE tr.isOK IS NULL
- ON DUPLICATE KEY UPDATE hasTicketRequest = TRUE;
+ ON DUPLICATE KEY UPDATE isVIP = TRUE;
CREATE OR REPLACE TEMPORARY TABLE tItemShelvingStock_byWarehouse
(INDEX (itemFk, warehouseFk))
@@ -158,10 +95,9 @@ BEGIN
JOIN shelving sh ON sh.code = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
- GROUP BY ish.itemFk,
- s.warehouseFk;
+ GROUP BY ish.itemFk, s.warehouseFk;
- -- Disponible, Faltas, Inventario y Retrasos
+ -- Disponible, faltas, inventario y retrasos
OPEN vCursor;
l: LOOP
SET vDone = FALSE;
@@ -180,14 +116,14 @@ BEGIN
INSERT INTO tmp.sale_problems(ticketFk, itemShortage, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
- LEFT(CONCAT('F: ',GROUP_CONCAT(i.id, ' ', i.longName, ' ')),250) problem,
- s.id AS saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ SELECT sgp.ticketFk,
+ LEFT(CONCAT('F: ', GROUP_CONCAT(i.id, ' ', i.longName, ' ')), 250) problem,
+ s.id saleFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = i.id
AND v.calc_id = vVisibleCache
@@ -195,8 +131,8 @@ BEGIN
AND av.calc_id = vAvailableCache
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
- WHERE IFNULL(v.visible,0) < s.quantity
- AND IFNULL(av.available ,0) < s.quantity
+ WHERE IFNULL(v.visible, 0) < s.quantity
+ AND IFNULL(av.available, 0) < s.quantity
AND IFNULL(issw.visible, 0) < s.quantity
AND NOT s.isPicked
AND NOT s.reserved
@@ -205,27 +141,27 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk) sub
+ GROUP BY sgp.ticketFk) sub
ON DUPLICATE KEY UPDATE itemShortage = sub.problem, saleFk = sub.saleFk;
-- Inventario: Visible suficiente, pero ubicado menor a la cantidad vendida
INSERT INTO tmp.sale_problems(ticketFk, itemLost, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
+ SELECT sgp.ticketFk,
LEFT(GROUP_CONCAT('I: ', i.id, ' ', i.longName, ' '), 250) problem,
s.id saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
AND v.calc_id = vVisibleCache
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
- WHERE IFNULL(v.visible,0) >= s.quantity
+ WHERE IFNULL(v.visible, 0) >= s.quantity
AND IFNULL(issw.visible, 0) < s.quantity
AND s.quantity > 0
AND NOT s.isPicked
@@ -235,22 +171,22 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk
+ GROUP BY sgp.ticketFk
) sub
- ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
+ ON DUPLICATE KEY UPDATE itemLost = sub.problem, saleFk = sub.saleFk;
-- Retraso: Disponible suficiente, pero no visible ni ubicado
INSERT INTO tmp.sale_problems(ticketFk, itemDelay, saleFk)
SELECT ticketFk, problem, saleFk
FROM (
- SELECT tl.ticketFk,
+ SELECT sgp.ticketFk,
LEFT(GROUP_CONCAT('R: ', i.id, ' ', i.longName, ' '), 250) problem,
s.id saleFk
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
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 itemType it ON it.id = i.typeFk
JOIN itemCategory ic ON ic.id = it.categoryFk
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
AND v.calc_id = vVisibleCache
@@ -269,42 +205,27 @@ BEGIN
AND NOT i.generic
AND util.VN_CURDATE() = vDate
AND t.warehouseFk = vWarehouseFk
- GROUP BY tl.ticketFk
+ GROUP BY sgp.ticketFk
) sub
ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
-
- -- Redondeo: Cantidad pedida incorrecta en al grouping de la última compra
- CALL buy_getUltimate(NULL, vWarehouseFk, vDate);
- INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
- SELECT ticketFk, problem ,saleFk
- FROM (
- SELECT tl.ticketFk,
- s.id saleFk,
- LEFT(GROUP_CONCAT('RE: ',i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
- FROM tmp.ticket_list tl
- JOIN ticket t ON t.id = tl.ticketFk
- AND t.warehouseFk = vWarehouseFk
- JOIN sale s ON s.ticketFk = tl.ticketFk
- JOIN item i ON i.id = s.itemFk
- JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
- JOIN buy b ON b.id = bu.buyFk
- WHERE MOD(s.quantity, b.`grouping`)
- GROUP BY tl.ticketFk
- )sub
- ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
END LOOP;
CLOSE vCursor;
-
- INSERT INTO tmp.sale_problems(ticketFk, isTaxDataChecked)
- SELECT DISTINCT tl.ticketFk, FALSE
- FROM tmp.ticket_list tl
- JOIN client c ON c.id = tl.clientFk
- WHERE NOT c.isTaxDataChecked
- ON DUPLICATE KEY UPDATE isTaxDataChecked = FALSE;
- DROP TEMPORARY TABLE
- tmp.clientGetDebt,
- tmp.ticket_list,
- tItemShelvingStock_byWarehouse;
+ INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
+ SELECT ticketFk, problem, saleFk
+ FROM (
+ SELECT sgp.ticketFk,
+ s.id saleFk,
+ LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
+ FROM tmp.sale_getProblems sgp
+ JOIN ticket t ON t.id = sgp.ticketFk
+ JOIN sale s ON s.ticketFk = sgp.ticketFk
+ JOIN item i ON i.id = s.itemFk
+ WHERE FIND_IN_SET('hasRounding', s.problem)
+ GROUP BY sgp.ticketFk
+ ) sub
+ ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
+
+ DROP TEMPORARY TABLE tItemShelvingStock_byWarehouse;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/sale_getProblemsByTicket.sql b/db/routines/vn/procedures/sale_getProblemsByTicket.sql
index b4aaad7de..f7a066705 100644
--- a/db/routines/vn/procedures/sale_getProblemsByTicket.sql
+++ b/db/routines/vn/procedures/sale_getProblemsByTicket.sql
@@ -7,8 +7,7 @@ BEGIN
*
* @return Problems result
*/
- DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems;
- CREATE TEMPORARY TABLE tmp.sale_getProblems
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
(INDEX (ticketFk))
ENGINE = MEMORY
SELECT t.id ticketFk, t.clientFk, t.warehouseFk, t.shipped
diff --git a/db/routines/vn/procedures/sale_setProblemRoundingByBuy.sql b/db/routines/vn/procedures/sale_setProblemRoundingByBuy.sql
new file mode 100644
index 000000000..b0e286d25
--- /dev/null
+++ b/db/routines/vn/procedures/sale_setProblemRoundingByBuy.sql
@@ -0,0 +1,75 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_setProblemRoundingByBuy`(
+ vBuyFk INT
+)
+BEGIN
+/**
+ * Update rounding problem for all sales related to a buy.
+ *
+ * @param vBuyFk Buy id
+ */
+ DECLARE vItemFk INT;
+ DECLARE vWarehouseFk INT;
+ DECLARE vMaxDated DATE;
+ DECLARE vMinDated DATE;
+ DECLARE vLanding DATE;
+ DECLARE vLastBuy INT;
+ DECLARE vCurrentBuy INT;
+ DECLARE vGrouping INT;
+
+ SELECT b.itemFk, t.warehouseInFk
+ INTO vItemFk, vWarehouseFk
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ WHERE b.id = vBuyFk;
+
+ IF vItemFk AND vWarehouseFk THEN
+ SELECT DATE(MAX(t.shipped)) + INTERVAL 1 DAY, DATE(MIN(t.shipped))
+ INTO vMaxDated, vMinDated
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ WHERE t.shipped >= util.VN_CURDATE()
+ AND s.itemFk = vItemFk
+ AND s.quantity > 0;
+
+ CALL buy_getUltimate(vItemFk, vWarehouseFk, vMinDated);
+
+ SELECT bu.buyFk, b.grouping INTO vLastBuy, vGrouping
+ FROM tmp.buyUltimate bu
+ JOIN buy b ON b.id = bu.buyFk;
+
+ DROP TEMPORARY TABLE tmp.buyUltimate;
+
+ SET vLanding = vMaxDated;
+
+ WHILE vCurrentBuy <> vLastBuy OR vLanding > vMinDated DO
+ SET vMaxDated = vLanding - INTERVAL 1 DAY;
+
+ CALL buy_getUltimate(vItemFk, vWarehouseFk, vMaxDated);
+
+ SELECT buyFk, landing
+ INTO vCurrentBuy, vLanding
+ FROM tmp.buyUltimate;
+
+ DROP TEMPORARY TABLE tmp.buyUltimate;
+ END WHILE;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale
+ (INDEX(saleFk, isProblemCalcNeeded))
+ ENGINE = MEMORY
+ SELECT s.id saleFk,
+ MOD(s.quantity, vGrouping) hasProblem,
+ ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ WHERE s.itemFk = vItemFk
+ AND s.quantity > 0
+ AND t.shipped BETWEEN vMinDated AND util.dayEnd(vMaxDated);
+
+ CALL sale_setProblem('hasRounding');
+
+ DROP TEMPORARY TABLE tmp.sale;
+ END IF;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/ticket_close.sql b/db/routines/vn/procedures/ticket_close.sql
index 7f52e81a7..f8bbe239b 100644
--- a/db/routines/vn/procedures/ticket_close.sql
+++ b/db/routines/vn/procedures/ticket_close.sql
@@ -2,7 +2,7 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_close`()
BEGIN
/**
- * Realiza el cierre de todos los
+ * Realiza el cierre de todos los
* tickets de la tabla tmp.ticket_close.
*
* @table tmp.ticket_close(ticketFk) Identificadores de los tickets a cerrar
@@ -17,10 +17,11 @@ BEGIN
DECLARE vHasDailyInvoice BOOL;
DECLARE vWithPackage BOOL;
DECLARE vHasToInvoice BOOL;
+ DECLARE vSerial VARCHAR(2);
DECLARE cur CURSOR FOR
SELECT ticketFk FROM tmp.ticket_close;
-
+
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
RESIGNAL;
@@ -30,7 +31,7 @@ BEGIN
proc: LOOP
SET vDone = FALSE;
-
+
FETCH cur INTO vCurTicketFk;
IF vDone THEN
@@ -47,12 +48,12 @@ BEGIN
c.hasToInvoice
INTO vClientFk,
vIsTaxDataChecked,
- vCompanyFk,
+ vCompanyFk,
vShipped,
vHasDailyInvoice,
vWithPackage,
vHasToInvoice
- FROM ticket t
+ FROM ticket t
JOIN `client` c ON c.id = t.clientFk
JOIN province p ON p.id = c.provinceFk
LEFT JOIN autonomy a ON a.id = p.autonomyFk
@@ -62,7 +63,7 @@ BEGIN
INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
(SELECT vCurTicketFk, p.id, COUNT(*)
- FROM expedition e
+ FROM expedition e
JOIN packaging p ON p.id = e.packagingFk
JOIN ticket t ON t.id = e.ticketFk
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
@@ -73,26 +74,29 @@ BEGIN
GROUP BY p.itemFk);
-- No retornables o no catalogados
- INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
+ INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
(SELECT e.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1
- FROM expedition e
+ FROM expedition e
JOIN item i ON i.id = e.freightItemFk
LEFT JOIN packaging p ON p.itemFk = i.id
WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
GROUP BY e.freightItemFk);
-
- IF(vHasDailyInvoice) AND vHasToInvoice THEN
- -- Facturacion rapida
+ IF(vHasDailyInvoice) AND vHasToInvoice THEN
+ SELECT invoiceSerial(vClientFk, vCompanyFk, 'quick') INTO vSerial;
+ IF NOT vSerial THEN
+ CALL util.throw('Cannot booking without a serial');
+ END IF;
+
CALL ticket_setState(vCurTicketFk, 'DELIVERED');
- -- Facturar si está contabilizado
+
IF vIsTaxDataChecked THEN
CALL invoiceOut_newFromClient(
- vClientFk,
- (SELECT invoiceSerial(vClientFk, vCompanyFk, 'M')),
- vShipped,
- vCompanyFk,
+ vClientFk,
+ vSerial,
+ vShipped,
+ vCompanyFk,
NULL,
NULL,
vNewInvoiceId);
diff --git a/db/routines/vn/procedures/ticket_getProblems.sql b/db/routines/vn/procedures/ticket_getProblems.sql
index 521e4cf2f..f83351456 100644
--- a/db/routines/vn/procedures/ticket_getProblems.sql
+++ b/db/routines/vn/procedures/ticket_getProblems.sql
@@ -1,5 +1,7 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_getProblems`(IN vIsTodayRelative tinyint(1))
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_getProblems`(
+ vIsTodayRelative tinyint(1)
+)
BEGIN
/**
* Calcula los problemas para un conjunto de tickets.
@@ -16,6 +18,7 @@ BEGIN
SELECT ticketFk,
MAX(isFreezed) isFreezed,
MAX(risk) risk,
+ MAX(hasRisk) hasRisk,
MAX(hasHighRisk) hasHighRisk,
MAX(hasTicketRequest) hasTicketRequest,
MAX(itemShortage) itemShortage,
@@ -30,19 +33,19 @@ BEGIN
FROM tmp.sale_problems
GROUP BY ticketFk;
- UPDATE tmp.ticket_problems tp
- SET tp.totalProblems = (
- (tp.isFreezed) +
- IF(tp.risk,TRUE, FALSE) +
- (tp.hasTicketRequest) +
- (tp.isTaxDataChecked = 0) +
- (tp.hasComponentLack) +
- (tp.itemDelay) +
- (tp.isTooLittle) +
- (tp.itemLost) +
- (tp.hasRounding) +
- (tp.itemShortage) +
- (tp.isVip)
+ UPDATE tmp.ticket_problems
+ SET totalProblems = (
+ (isFreezed) +
+ (hasRisk) +
+ (hasTicketRequest) +
+ (!isTaxDataChecked) +
+ (hasComponentLack) +
+ (itemDelay IS NOT NULL) +
+ (isTooLittle) +
+ (itemLost IS NOT NULL) +
+ (hasRounding IS NOT NULL) +
+ (itemShortage IS NOT NULL) +
+ (isVip)
);
DROP TEMPORARY TABLE tmp.sale_problems;
diff --git a/db/routines/vn/procedures/ticket_recalcByScope.sql b/db/routines/vn/procedures/ticket_recalcByScope.sql
index 41105fe23..ede755187 100644
--- a/db/routines/vn/procedures/ticket_recalcByScope.sql
+++ b/db/routines/vn/procedures/ticket_recalcByScope.sql
@@ -14,16 +14,28 @@ BEGIN
DECLARE vTicketFk INT;
DECLARE cTickets CURSOR FOR
- SELECT id FROM ticket
- WHERE refFk IS NULL
- AND ((vScope = 'client' AND clientFk = vId)
- OR (vScope = 'address' AND addressFk = vId));
+ SELECT DISTINCT t.id
+ FROM ticket t
+ LEFT JOIN tItems ti ON ti.id = t.id
+ WHERE t.refFk IS NULL
+ AND ((vScope = 'client' AND t.clientFk = vId)
+ OR (vScope = 'address' AND t.addressFk = vId)
+ OR (vScope = 'item' AND ti.id)
+ );
- DECLARE CONTINUE HANDLER FOR NOT FOUND
- SET vDone = TRUE;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+ CREATE OR REPLACE TEMPORARY TABLE tItems
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT DISTINCT t.id
+ FROM ticket t
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN itemTaxCountry itc ON itc.itemFk = s.itemFk
+ WHERE t.refFk IS NULL
+ AND (vScope = 'item' AND itc.itemFk = vId);
OPEN cTickets;
-
myLoop: LOOP
SET vDone = FALSE;
FETCH cTickets INTO vTicketFk;
@@ -34,7 +46,8 @@ BEGIN
CALL ticket_recalc(vTicketFk, NULL);
END LOOP;
-
CLOSE cTickets;
+
+ DROP TEMPORARY TABLE tItems;
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/host_beforeInsert.sql b/db/routines/vn/triggers/host_beforeInsert.sql
new file mode 100644
index 000000000..c2cb82334
--- /dev/null
+++ b/db/routines/vn/triggers/host_beforeInsert.sql
@@ -0,0 +1,8 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`host_beforeInsert`
+ BEFORE INSERT ON `host`
+ FOR EACH ROW
+BEGIN
+ SET NEW.editorFk = account.myUser_getId();
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/triggers/host_beforeUpdate.sql b/db/routines/vn/triggers/host_beforeUpdate.sql
index 0b0962e86..dc5a18f3c 100644
--- a/db/routines/vn/triggers/host_beforeUpdate.sql
+++ b/db/routines/vn/triggers/host_beforeUpdate.sql
@@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`host_beforeUpdate`
FOR EACH ROW
BEGIN
SET new.updated = util.VN_NOW();
+ SET NEW.editorFk = account.myUser_getId();
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/roadmap_beforeInsert.sql b/db/routines/vn/triggers/roadmap_beforeInsert.sql
new file mode 100644
index 000000000..df07d5540
--- /dev/null
+++ b/db/routines/vn/triggers/roadmap_beforeInsert.sql
@@ -0,0 +1,12 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`roadmap_beforeInsert`
+ BEFORE INSERT ON `roadmap`
+ FOR EACH ROW
+BEGIN
+ IF NEW.driver1Fk IS NOT NULL THEN
+ SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
+ ELSE
+ SET NEW.driverName = NULL;
+ END IF;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/triggers/roadmap_beforeUpdate.sql b/db/routines/vn/triggers/roadmap_beforeUpdate.sql
new file mode 100644
index 000000000..4905a0442
--- /dev/null
+++ b/db/routines/vn/triggers/roadmap_beforeUpdate.sql
@@ -0,0 +1,12 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`roadmap_beforeUpdate`
+ BEFORE UPDATE ON `roadmap`
+ FOR EACH ROW
+BEGIN
+ IF NEW.driver1Fk IS NOT NULL THEN
+ SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
+ ELSE
+ SET NEW.driverName = NULL;
+ END IF;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn2008/views/mandato_tipo.sql b/db/routines/vn2008/views/mandato_tipo.sql
index a1b5b0a9f..bc3f74632 100644
--- a/db/routines/vn2008/views/mandato_tipo.sql
+++ b/db/routines/vn2008/views/mandato_tipo.sql
@@ -2,5 +2,5 @@ CREATE OR REPLACE DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
VIEW `vn2008`.`mandato_tipo`
AS SELECT `m`.`id` AS `idmandato_tipo`,
- `m`.`name` AS `Nombre`
+ `m`.`code` AS `Nombre`
FROM `vn`.`mandateType` `m`
diff --git a/db/versions/11141-azureRoebelini/00-firstScript.sql b/db/versions/11141-azureRoebelini/00-firstScript.sql
new file mode 100644
index 000000000..fd6d79cfb
--- /dev/null
+++ b/db/versions/11141-azureRoebelini/00-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE srt.moving DROP INDEX moving_fk1_idx;
diff --git a/db/versions/11142-aquaGerbera/00-invoiceOutSerialColumn.sql b/db/versions/11142-aquaGerbera/00-invoiceOutSerialColumn.sql
new file mode 100644
index 000000000..09ac00401
--- /dev/null
+++ b/db/versions/11142-aquaGerbera/00-invoiceOutSerialColumn.sql
@@ -0,0 +1,4 @@
+ALTER TABLE vn.invoiceOutSerial
+ MODIFY COLUMN `type` enum('global','quick','multiple') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL;
+
+CREATE UNIQUE INDEX invoiceOutSerial_taxAreaFk_IDX USING BTREE ON vn.invoiceOutSerial (taxAreaFk,`type`);
diff --git a/db/versions/11142-aquaGerbera/01-invoiceOutSerialUpdate.sql b/db/versions/11142-aquaGerbera/01-invoiceOutSerialUpdate.sql
new file mode 100644
index 000000000..fad33b5dc
--- /dev/null
+++ b/db/versions/11142-aquaGerbera/01-invoiceOutSerialUpdate.sql
@@ -0,0 +1,3 @@
+UPDATE vn.invoiceOutSerial
+ SET `type`='multiple'
+ WHERE `description` LIKE '%Múltiple%';
diff --git a/db/versions/11171-maroonMoss/00-firstScript.sql b/db/versions/11171-maroonMoss/00-firstScript.sql
new file mode 100644
index 000000000..0632239ac
--- /dev/null
+++ b/db/versions/11171-maroonMoss/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.operator
+ ADD COLUMN sizeLimit int(10) unsigned DEFAULT 90 NULL COMMENT 'Límite de altura en una colección para la asignación de pedidos' AFTER volumeLimit,
+ MODIFY COLUMN linesLimit int(10) unsigned DEFAULT 20 NULL COMMENT 'Límite de lineas en una colección para la asignación de pedidos';
diff --git a/db/versions/11172-blueFern/00-firstScript.sql b/db/versions/11172-blueFern/00-firstScript.sql
new file mode 100644
index 000000000..04e0813d5
--- /dev/null
+++ b/db/versions/11172-blueFern/00-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.ticket DROP FOREIGN KEY ticket_FK;
\ No newline at end of file
diff --git a/db/versions/11172-blueFern/01-firstScript.sql b/db/versions/11172-blueFern/01-firstScript.sql
new file mode 100644
index 000000000..64255f9de
--- /dev/null
+++ b/db/versions/11172-blueFern/01-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOut DROP KEY Id_Factura;
diff --git a/db/versions/11172-blueFern/02-firstScript.sql b/db/versions/11172-blueFern/02-firstScript.sql
new file mode 100644
index 000000000..e76b7f7d6
--- /dev/null
+++ b/db/versions/11172-blueFern/02-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOut MODIFY COLUMN id int(10) unsigned NOT NULL;
\ No newline at end of file
diff --git a/db/versions/11172-blueFern/03-firstScript.sql b/db/versions/11172-blueFern/03-firstScript.sql
new file mode 100644
index 000000000..e6def98a4
--- /dev/null
+++ b/db/versions/11172-blueFern/03-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceCorrection DROP FOREIGN KEY corrected_fk;
diff --git a/db/versions/11172-blueFern/04-firstScript.sql b/db/versions/11172-blueFern/04-firstScript.sql
new file mode 100644
index 000000000..a19bc336e
--- /dev/null
+++ b/db/versions/11172-blueFern/04-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceCorrection DROP FOREIGN KEY correcting_fk;
diff --git a/db/versions/11172-blueFern/05-firstScript.sql b/db/versions/11172-blueFern/05-firstScript.sql
new file mode 100644
index 000000000..9f5ec2871
--- /dev/null
+++ b/db/versions/11172-blueFern/05-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOutExpense DROP FOREIGN KEY invoiceOutExpence_FK_1;
diff --git a/db/versions/11172-blueFern/06-firstScript.sql b/db/versions/11172-blueFern/06-firstScript.sql
new file mode 100644
index 000000000..2c16e9b77
--- /dev/null
+++ b/db/versions/11172-blueFern/06-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOutTax DROP FOREIGN KEY invoiceOutFk;
diff --git a/db/versions/11172-blueFern/07-firstScript.sql b/db/versions/11172-blueFern/07-firstScript.sql
new file mode 100644
index 000000000..bec72a131
--- /dev/null
+++ b/db/versions/11172-blueFern/07-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOut DROP PRIMARY KEY;
diff --git a/db/versions/11172-blueFern/08-firstScript.sql b/db/versions/11172-blueFern/08-firstScript.sql
new file mode 100644
index 000000000..316db2e32
--- /dev/null
+++ b/db/versions/11172-blueFern/08-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_pk PRIMARY KEY (id);
diff --git a/db/versions/11172-blueFern/09-firstScript.sql b/db/versions/11172-blueFern/09-firstScript.sql
new file mode 100644
index 000000000..553d7857e
--- /dev/null
+++ b/db/versions/11172-blueFern/09-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_unique UNIQUE KEY (`ref`);
diff --git a/db/versions/11172-blueFern/10-firstScript.sql b/db/versions/11172-blueFern/10-firstScript.sql
new file mode 100644
index 000000000..47ddaff14
--- /dev/null
+++ b/db/versions/11172-blueFern/10-firstScript.sql
@@ -0,0 +1,5 @@
+UPDATE vn.invoiceOut
+ SET id = (SELECT MAX(id) + 1 FROM vn.invoiceOut)
+ WHERE id = 0;
+
+ALTER TABLE vn.invoiceOut MODIFY COLUMN id int(10) unsigned auto_increment NOT NULL;
diff --git a/db/versions/11172-blueFern/11-firstScript.sql b/db/versions/11172-blueFern/11-firstScript.sql
new file mode 100644
index 000000000..e1847a877
--- /dev/null
+++ b/db/versions/11172-blueFern/11-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.ticket ADD CONSTRAINT ticket_invoiceOut_FK
+ FOREIGN KEY (refFk) REFERENCES vn.invoiceOut(`ref`) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/db/versions/11172-blueFern/12-firstScript.sql b/db/versions/11172-blueFern/12-firstScript.sql
new file mode 100644
index 000000000..720b7962e
--- /dev/null
+++ b/db/versions/11172-blueFern/12-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.invoiceCorrection ADD CONSTRAINT invoiceCorrection_invoiceOut_FK
+ FOREIGN KEY (correctingFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/versions/11172-blueFern/13-firstScript.sql b/db/versions/11172-blueFern/13-firstScript.sql
new file mode 100644
index 000000000..35099bd5d
--- /dev/null
+++ b/db/versions/11172-blueFern/13-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.invoiceCorrection ADD CONSTRAINT invoiceCorrection_invoiceOut_FK_1
+ FOREIGN KEY (correctedFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
\ No newline at end of file
diff --git a/db/versions/11172-blueFern/14-firstScript.sql b/db/versions/11172-blueFern/14-firstScript.sql
new file mode 100644
index 000000000..f1aa0a216
--- /dev/null
+++ b/db/versions/11172-blueFern/14-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.invoiceOutExpense ADD CONSTRAINT invoiceOutExpense_invoiceOut_FK
+ FOREIGN KEY (invoiceOutFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/versions/11172-blueFern/15-firstScript.sql b/db/versions/11172-blueFern/15-firstScript.sql
new file mode 100644
index 000000000..ba570e20c
--- /dev/null
+++ b/db/versions/11172-blueFern/15-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.invoiceOutTax ADD CONSTRAINT invoiceOutTax_invoiceOut_FK
+ FOREIGN KEY (invoiceOutFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/versions/11175-pinkChico/00-firstScript.sql b/db/versions/11175-pinkChico/00-firstScript.sql
new file mode 100644
index 000000000..349f4c7f7
--- /dev/null
+++ b/db/versions/11175-pinkChico/00-firstScript.sql
@@ -0,0 +1,8 @@
+USE vn;
+
+CREATE TABLE IF NOT EXISTS ormConfig (
+ id int(5) NOT NULL AUTO_INCREMENT primary key,
+ selectLimit int(5) NOT NULL
+);
+
+INSERT IGNORE INTO ormConfig SET selectLimit = 1000;
\ No newline at end of file
diff --git a/db/versions/11185-maroonArborvitae/00-firstScript.sql b/db/versions/11185-maroonArborvitae/00-firstScript.sql
new file mode 100644
index 000000000..b07126e71
--- /dev/null
+++ b/db/versions/11185-maroonArborvitae/00-firstScript.sql
@@ -0,0 +1 @@
+DROP TABLE bi.Greuges_comercial_detail;
\ No newline at end of file
diff --git a/db/versions/11187-yellowErica/00-firstScript.sql b/db/versions/11187-yellowErica/00-firstScript.sql
new file mode 100644
index 000000000..fb75b1f2f
--- /dev/null
+++ b/db/versions/11187-yellowErica/00-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.host ADD editorFk int(10) unsigned DEFAULT NULL NULL;
diff --git a/db/versions/11189-purplePaniculata/00-firstScript.sql b/db/versions/11189-purplePaniculata/00-firstScript.sql
new file mode 100644
index 000000000..3319bd154
--- /dev/null
+++ b/db/versions/11189-purplePaniculata/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.item
+ ADD CONSTRAINT item_itemPackingType_FK FOREIGN KEY (itemPackingTypeFk)
+ REFERENCES vn.itemPackingType(code) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/db/versions/11190-blueLaurel/00-firstScript.sql b/db/versions/11190-blueLaurel/00-firstScript.sql
new file mode 100644
index 000000000..75e3f8e59
--- /dev/null
+++ b/db/versions/11190-blueLaurel/00-firstScript.sql
@@ -0,0 +1,9 @@
+ALTER TABLE hedera.tpvMerchantEnable
+ DROP FOREIGN KEY tpvMerchantEnable_ibfk_1,
+ DROP PRIMARY KEY,
+ ADD CONSTRAINT tpvMerchantEnable_pk PRIMARY KEY (merchantFk),
+ ADD CONSTRAINT tpvMerchantEnable_tpvMerchant_FK
+ FOREIGN KEY (merchantFk)
+ REFERENCES hedera.tpvMerchant(id)
+ ON DELETE RESTRICT
+ ON UPDATE CASCADE;
diff --git a/db/versions/11191-chocolateBirch/00-firstScript.sql b/db/versions/11191-chocolateBirch/00-firstScript.sql
new file mode 100644
index 000000000..4c9924a42
--- /dev/null
+++ b/db/versions/11191-chocolateBirch/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.mandateType
+ CHANGE name code VARCHAR(45) NOT NULL,
+ ADD UNIQUE (code);
\ No newline at end of file
diff --git a/db/versions/11191-chocolateBirch/01-firstScript.sql b/db/versions/11191-chocolateBirch/01-firstScript.sql
new file mode 100644
index 000000000..c69e92d51
--- /dev/null
+++ b/db/versions/11191-chocolateBirch/01-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.accountDetailType
+ ADD COLUMN code VARCHAR(45),
+ ADD UNIQUE (code);
\ No newline at end of file
diff --git a/db/versions/11191-chocolateBirch/02-firstScript.sql b/db/versions/11191-chocolateBirch/02-firstScript.sql
new file mode 100644
index 000000000..733cffd63
--- /dev/null
+++ b/db/versions/11191-chocolateBirch/02-firstScript.sql
@@ -0,0 +1,9 @@
+UPDATE vn.accountDetailType
+ SET code = CASE description
+ WHEN 'IBAN' THEN 'iban'
+ WHEN 'SWIFT' THEN 'swift'
+ WHEN 'Referencia Remesas' THEN 'remRef'
+ WHEN 'Referencia Transferencias' THEN 'trnRef'
+ WHEN 'Referencia Nominas' THEN 'payRef'
+ WHEN 'ABA' THEN 'aba'
+ END;
\ No newline at end of file
diff --git a/db/versions/11192-maroonSalal/00-firstScript.sql b/db/versions/11192-maroonSalal/00-firstScript.sql
new file mode 100644
index 000000000..ac35a3db3
--- /dev/null
+++ b/db/versions/11192-maroonSalal/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE hedera.tpvMerchantEnable
+ MODIFY COLUMN companyFk int(10) unsigned NOT NULL,
+ ADD CONSTRAINT tpvMerchantEnable_company_FK FOREIGN KEY (companyFk) REFERENCES vn.company(id) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/db/versions/11193-bronzeAspidistra/00-firstScript.sql b/db/versions/11193-bronzeAspidistra/00-firstScript.sql
new file mode 100644
index 000000000..cc837d007
--- /dev/null
+++ b/db/versions/11193-bronzeAspidistra/00-firstScript.sql
@@ -0,0 +1,19 @@
+CREATE OR REPLACE TABLE `srt`.`bufferLog` (
+ `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('Buffer', 'Config') NOT NULL DEFAULT 'Buffer',
+ `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,
+ `summaryId` varchar(30) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `logBufferUserFk` (`userFk`),
+ KEY `bufferLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`),
+ KEY `bufferLog_originFk` (`originFk`,`creationDate`),
+ CONSTRAINT `bufferUserFk` 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;
diff --git a/db/versions/11193-bronzeAspidistra/01-firstScript.sql b/db/versions/11193-bronzeAspidistra/01-firstScript.sql
new file mode 100644
index 000000000..748056f3a
--- /dev/null
+++ b/db/versions/11193-bronzeAspidistra/01-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE srt.buffer ADD editorFk int(10) unsigned DEFAULT NULL NULL;
diff --git a/db/versions/11193-bronzeAspidistra/02-firstScript.sql b/db/versions/11193-bronzeAspidistra/02-firstScript.sql
new file mode 100644
index 000000000..36aa938d5
--- /dev/null
+++ b/db/versions/11193-bronzeAspidistra/02-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE srt.config ADD editorFk int(10) unsigned DEFAULT NULL NULL;
diff --git a/db/versions/11194-orangeOrchid/00-firstScript.sql b/db/versions/11194-orangeOrchid/00-firstScript.sql
new file mode 100644
index 000000000..59a616edf
--- /dev/null
+++ b/db/versions/11194-orangeOrchid/00-firstScript.sql
@@ -0,0 +1,9 @@
+CREATE TABLE vn.quadMindsApiConfig (
+ id int(10) unsigned NULL PRIMARY KEY,
+ `url` varchar(255) DEFAULT NULL NULL,
+ `key` varchar(255) DEFAULT NULL NULL,
+ CONSTRAINT quadMindsConfig_check CHECK (id = 1)
+)
+ENGINE=InnoDB
+DEFAULT CHARSET=utf8mb3
+COLLATE=utf8mb3_unicode_ci;
diff --git a/db/versions/11195-salmonPalmetto/00-firstScript.sql b/db/versions/11195-salmonPalmetto/00-firstScript.sql
new file mode 100644
index 000000000..980b66c8d
--- /dev/null
+++ b/db/versions/11195-salmonPalmetto/00-firstScript.sql
@@ -0,0 +1,6 @@
+ALTER TABLE vn.roadmap
+ ADD COLUMN m3 INT UNSIGNED NULL,
+ ADD COLUMN driver2Fk INT UNSIGNED NULL,
+ ADD COLUMN driver1Fk INT UNSIGNED NULL,
+ ADD CONSTRAINT roadmap_worker_FK FOREIGN KEY (driver1Fk) REFERENCES vn.worker(id) ON DELETE RESTRICT ON UPDATE CASCADE,
+ ADD CONSTRAINT roadmap_worker_FK_2 FOREIGN KEY (driver2Fk) REFERENCES vn.worker(id) ON DELETE RESTRICT ON UPDATE CASCADE;
\ No newline at end of file
diff --git a/db/versions/11197-aquaSalal/00-firstScript.sql b/db/versions/11197-aquaSalal/00-firstScript.sql
new file mode 100644
index 000000000..f07368d3e
--- /dev/null
+++ b/db/versions/11197-aquaSalal/00-firstScript.sql
@@ -0,0 +1,24 @@
+DELETE FROM `salix`.`ACL`
+ WHERE `model` = 'Ticket'
+ AND `property` = 'refund'
+ AND `accessType` = 'WRITE'
+ AND `permission` = 'ALLOW'
+ AND `principalType` = 'ROLE'
+ AND `principalId` = 'salesAssistant';
+
+UPDATE `salix`.`ACL`
+ SET `property` = 'cloneAll'
+ WHERE `model` = 'Ticket'
+ AND `property` = 'refund'
+ AND `accessType` = 'WRITE'
+ AND `permission` = 'ALLOW'
+ AND `principalType` = 'ROLE'
+ AND `principalId` IN ('invoicing', 'claimManager', 'logistic');
+
+DELETE FROM `salix`.`ACL`
+ WHERE `model` = 'Ticket'
+ AND `property` = 'clone'
+ AND `accessType` = 'WRITE'
+ AND `permission` = 'ALLOW'
+ AND `principalType` = 'ROLE'
+ AND `principalId` = 'administrative';
diff --git a/db/versions/11204-navyMonstera/00-firstScript.sql b/db/versions/11204-navyMonstera/00-firstScript.sql
new file mode 100644
index 000000000..492e3d607
--- /dev/null
+++ b/db/versions/11204-navyMonstera/00-firstScript.sql
@@ -0,0 +1,5 @@
+ALTER TABLE vn.ormConfig
+MODIFY COLUMN id INT NOT NULL,
+DROP PRIMARY KEY,
+ADD CONSTRAINT ormConfig_check CHECK (id = 1),
+ADD PRIMARY KEY (id);
\ No newline at end of file
diff --git a/db/versions/11205-grayCymbidium/00-firstScript.sql b/db/versions/11205-grayCymbidium/00-firstScript.sql
new file mode 100644
index 000000000..ba3ab60e1
--- /dev/null
+++ b/db/versions/11205-grayCymbidium/00-firstScript.sql
@@ -0,0 +1,2 @@
+-- Place your SQL code here
+ALTER TABLE dipole.expedition_PrintOut MODIFY COLUMN isPrinted int(11) DEFAULT 0 NOT NULL COMMENT '0.- Not Printed ; 1.- Printed; 2.- Selected ; 3.- Error ; 4.- Waiting to be printed';
diff --git a/db/versions/11208-limeRoebelini/00-firstScript.vn.sql b/db/versions/11208-limeRoebelini/00-firstScript.vn.sql
new file mode 100644
index 000000000..22b3dc924
--- /dev/null
+++ b/db/versions/11208-limeRoebelini/00-firstScript.vn.sql
@@ -0,0 +1,7 @@
+UPDATE vn.packaging SET id='25E' WHERE id='cactus200';
+UPDATE vn.packaging SET id='35E' WHERE id='kalan330';
+UPDATE vn.packaging SET id='45E' WHERE id='kalan400';
+UPDATE vn.packaging SET id='60E' WHERE id='kalan577';
+UPDATE vn.packaging SET id='60A' WHERE id='guzma650';
+UPDATE vn.packaging SET id='120A' WHERE id='guzma1200';
+UPDATE vn.packaging SET id='140A' WHERE id='guzma1400';
diff --git a/db/versions/11209-pinkOrchid/00-firstScript.sql b/db/versions/11209-pinkOrchid/00-firstScript.sql
new file mode 100644
index 000000000..92a7a7569
--- /dev/null
+++ b/db/versions/11209-pinkOrchid/00-firstScript.sql
@@ -0,0 +1,6 @@
+ALTER TABLE vn.operator
+ MODIFY COLUMN sizeLimit int(10) unsigned DEFAULT NULL NULL COMMENT 'Límite de altura en una colección para la asignación de pedidos';
+
+UPDATE vn.operator
+ SET sizeLimit = 90
+ WHERE itemPackingTypeFk = 'V';
diff --git a/db/versions/11213-aquaCarnation/00-firstScript.sql b/db/versions/11213-aquaCarnation/00-firstScript.sql
new file mode 100644
index 000000000..9e744b66c
--- /dev/null
+++ b/db/versions/11213-aquaCarnation/00-firstScript.sql
@@ -0,0 +1,129 @@
+
+use vn;
+
+CREATE TABLE IF NOT EXISTS `material` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `name_UNIQUE` (`name`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+INSERT IGNORE INTO `material` (`name`) VALUES ('Abedul');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Acacia');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Acero');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Acero Galvanizado');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Acetato');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Acrílico');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Alambre');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Algodón');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Aluminio');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Antracita');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Arcilla');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Bambú');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Banano');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Canneté');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cartón');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cartulina');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Celofán');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cemento');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cera');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cerámica');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Chapa');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Chenilla');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cloruro de polivinilo');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cobre');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Corcho');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cordel');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cotton');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cotton Chess');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cristal');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cubo Asa');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cuerda');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Cuero');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Doble Raso');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Doble Velvet');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Eco Glass');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Encaje');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Esparto');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Espuma');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Felpa');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Fibra');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Fibra de Coco');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Fibra de Vidrio y Resina');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Fieltro');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Foam');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Gamuza');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Gasa');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Glass');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Goma');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Grafito');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Hierro');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Hoja Carbono');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Hoja de Mirto');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Hormigón');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Jute');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Kraft');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Lana');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Látex');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Latrix');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Lienzo');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Lino');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Lurex');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Madera');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Metacrilato');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Metal');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Mimbre');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Musgo');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Nonwoven');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Nylon');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Organza');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Paja');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Pana');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Papel');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Paperweb');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Paulownia');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Peluche');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Piedra');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Pizarra');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Plástico');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Poliestireno');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Polipropileno');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Poliresina');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Polyester');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Porcelana');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Puntilla');
+INSERT IGNORE INTO `material` (`name`) VALUES ('PVC');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Rafia');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Rama');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Raso');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Rattan');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Rayon');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Reciclable');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Red');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Resina');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Roca');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Rope');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Saco');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Salim');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Seagrass');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Silicona');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Sisal');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Tejido');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Tela');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Terciopelo');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Terracota');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Textil');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Titanio');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Tul');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Velvet');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Vidrio');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Yute');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Zinc');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Base de goma');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Base de madera');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Plumas');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Protección Uva');
+INSERT IGNORE INTO `material` (`name`) VALUES ('Purpurina');
+
+UPDATE vn.tag SET isFree=0,sourceTable='material' WHERE name= 'Material';
+UPDATE vn.tag SET isFree=0,sourceTable='material' WHERE name='Material secundario';
\ No newline at end of file
diff --git a/e2e/paths/14-account/01_create_and_basic_data.spec.js b/e2e/paths/14-account/01_create_and_basic_data.spec.js
deleted file mode 100644
index e2c069d80..000000000
--- a/e2e/paths/14-account/01_create_and_basic_data.spec.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account create and basic data path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('itManagement', 'account');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should open the new account form by clicking the add button', async() => {
- await page.waitToClick(selectors.accountIndex.addAccount);
- await page.waitForState('account.create');
- });
-
- it('should fill the form and then save it by clicking the create button', async() => {
- await page.write(selectors.accountIndex.newName, 'remy');
- await page.write(selectors.accountIndex.newNickname, 'Gambit');
- await page.write(selectors.accountIndex.newEmail, 'RemyEtienneLeBeau@verdnatura.es');
- await page.autocompleteSearch(selectors.accountIndex.newRole, 'Trainee');
- await page.write(selectors.accountIndex.newPassword, 'cestlavie');
- await page.waitToClick(selectors.accountIndex.createAccountButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should redirect the user to the created account basic data section', async() => {
- await page.waitForState('account.card.basicData');
- });
-
- it('should check the name is as expected', async() => {
- const result = await page.waitToGetProperty(selectors.accountBasicData.name, 'value');
-
- expect(result).toEqual('remy');
- });
-
- it('should check the nickname is as expected', async() => {
- const result = await page.waitToGetProperty(selectors.accountBasicData.nickname, 'value');
-
- expect(result).toEqual('Gambit');
- });
-
- it('should check the email is as expected', async() => {
- const result = await page.waitToGetProperty(selectors.accountBasicData.email, 'value');
-
- expect(result).toEqual('RemyEtienneLeBeau@verdnatura.es');
- });
-
- it('should navigate to the roles section to check the roles are correct', async() => {
- await page.accessToSection('account.card.roles');
- const rolesCount = await page.countElement(selectors.accountRoles.anyResult);
-
- expect(rolesCount).toEqual(3);
- });
-
- describe('Descriptor option', () => {
- describe('activate account', () => {
- it(`should check the active account icon isn't present in the descriptor`, async() => {
- await page.waitForNumberOfElements(selectors.accountDescriptor.activeAccountIcon, 0);
- });
-
- it('should activate the account using the descriptor menu', async() => {
- await page.waitToClick(selectors.accountDescriptor.menuButton);
- await page.waitToClick(selectors.accountDescriptor.activateAccount);
- await page.waitToClick(selectors.accountDescriptor.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Account enabled!');
- });
-
- it('should check the active account icon is now present in the descriptor', async() => {
- await page.waitForSelector(selectors.accountDescriptor.activeAccountIcon, {visible: false});
- });
- });
-
- describe('deactivate user', () => {
- it(`should check the inactive user icon isn't present in the descriptor just yet`, async() => {
- await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 0);
- });
-
- it('should deactivate the user using the descriptor menu', async() => {
- await page.waitToClick(selectors.accountDescriptor.menuButton);
- await page.waitToClick(selectors.accountDescriptor.deactivateUser);
- await page.waitToClick(selectors.accountDescriptor.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('User deactivated!');
- });
-
- it('should check the inactive user icon is now present', async() => {
- await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 1);
- });
- });
-
- describe('activate user', () => {
- it('should activate the user using the descriptor menu', async() => {
- await page.waitToClick(selectors.accountDescriptor.menuButton);
- await page.waitToClick(selectors.accountDescriptor.activateUser);
- await page.waitToClick(selectors.accountDescriptor.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('User activated!');
- });
-
- it('should check the inactive user icon is not present anymore', async() => {
- await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 0);
- });
- });
-
- describe('mail forwarding', () => {
- it('should activate the mail forwarding and set the recipent email', async() => {
- await page.accessToSection('account.card.mailForwarding');
- await page.waitToClick(selectors.accountMailForwarding.mailForwardingCheckbox);
- await page.write(selectors.accountMailForwarding.email, 'someEmail@someDomain.es');
- await page.waitToClick(selectors.accountMailForwarding.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
- });
-
- describe('Set password', () => {
- it('should set the password using the descriptor menu', async() => {
- const newPassword = 'quantum.12345';
-
- await page.waitToClick(selectors.accountDescriptor.menuButton);
- await page.waitToClick(selectors.accountDescriptor.setPassword);
- await page.write(selectors.accountDescriptor.newPassword, newPassword);
- await page.write(selectors.accountDescriptor.repeatPassword, newPassword);
- await page.waitToClick(selectors.accountDescriptor.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Password changed succesfully!');
- });
-
- // cant log into created account for unknown reasons
- // it('should login into the created account with the new password', async() => {
- // await page.loginAndModule('Remy', 'quantum.crypt0graphy');
- // });
- });
-
- describe('delete account', () => {
- // it('should navigate to the account basic data section', async() => {
- // });
-
- it('should delete the account using the descriptor menu', async() => {
- await page.waitToClick(selectors.accountDescriptor.menuButton);
- await page.waitToClick(selectors.accountDescriptor.deleteAccount);
- await page.waitToClick(selectors.accountDescriptor.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('User removed');
- });
- });
- });
-});
diff --git a/e2e/paths/14-account/02_alias_create_and_basic_data.spec.js b/e2e/paths/14-account/02_alias_create_and_basic_data.spec.js
deleted file mode 100644
index 840fb8afe..000000000
--- a/e2e/paths/14-account/02_alias_create_and_basic_data.spec.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account Alias create and basic data path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('itManagement', 'account');
- await page.accessToSection('account.alias');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should open the new account alias form by clicking the add button', async() => {
- await page.waitToClick(selectors.accountAliasIndex.addAlias);
- await page.waitForState('account.alias.create');
- });
-
- it('should fill the form and then save it by clicking the create alias button', async() => {
- await page.write(selectors.accountAliasIndex.newName, 'Boring alias');
- await page.write(selectors.accountAliasIndex.newDescription, 'Boring description');
- await page.waitToClick(selectors.accountAliasIndex.createAliasButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should redirect the user to the created account alias basic data section', async() => {
- await page.waitForState('account.alias.card.basicData');
- });
-
- it('should edit the alias basic data', async() => {
- await page.overwrite(selectors.accountAliasBasicData.name, 'Psykers');
- await page.overwrite(selectors.accountAliasBasicData.description, 'Email group for psykers');
- await page.waitToClick(selectors.accountAliasBasicData.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reload the basicData section and check the name was edited successfully', async() => {
- await page.reloadSection('account.alias.card.basicData');
- const result = await page.waitToGetProperty(selectors.accountAliasBasicData.name, 'value');
-
- expect(result).toEqual('Psykers');
- });
-
- it('should check the alias description was edited successfully', async() => {
- const result = await page.waitToGetProperty(selectors.accountAliasBasicData.description, 'value');
-
- expect(result).toContain('psykers');
- });
-
- it('should search IT alias then access the user section to check the role listed is the expected one', async() => {
- await page.accessToSearchResult('IT');
- await page.accessToSection('account.alias.card.users');
- const rolesCount = await page.countElement(selectors.accountAliasUsers.anyResult);
-
- expect(rolesCount).toEqual(1);
- });
-});
diff --git a/e2e/paths/14-account/03_role_create_and_basic_data.spec.js b/e2e/paths/14-account/03_role_create_and_basic_data.spec.js
deleted file mode 100644
index 6acf82318..000000000
--- a/e2e/paths/14-account/03_role_create_and_basic_data.spec.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account Role create and basic data path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('it', 'account');
- await page.accessToSection('account.role');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should open the new account role form by clicking the add button', async() => {
- await page.waitToClick(selectors.accountRoleIndex.addRole);
- await page.waitForState('account.role.create');
- });
-
- it('should fill the form and then save it by clicking the create role button', async() => {
- await page.write(selectors.accountRoleIndex.newName, 'boringRole');
- await page.write(selectors.accountRoleIndex.newDescription, 'Boring description');
- await page.waitToClick(selectors.accountRoleIndex.createRoleButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should redirect the user to the created role basic data section', async() => {
- await page.waitForState('account.role.card.basicData');
- });
-
- it('should edit the role basic data', async() => {
- await page.overwrite(selectors.accountRoleBasicData.name, 'psyker');
- await page.overwrite(selectors.accountRoleBasicData.description, 'A role just for psykers');
- await page.waitToClick(selectors.accountRoleBasicData.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reload the role basicData section and check the name was edited successfully', async() => {
- await page.reloadSection('account.role.card.basicData');
- const result = await page.waitToGetProperty(selectors.accountRoleBasicData.name, 'value');
-
- expect(result).toEqual('psyker');
- });
-
- it('should check the role description was edited successfully', async() => {
- const result = await page.waitToGetProperty(selectors.accountRoleBasicData.description, 'value');
-
- expect(result).toContain('psykers');
- });
-
- it('should navigate to the subroles section', async() => {
- await page.accessToSection('account.role.card.subroles');
- });
-
- it('should asign a subrole', async() => {
- await page.waitToClick(selectors.accountSubroles.addSubrole);
- await page.autocompleteSearch(selectors.accountSubroles.role, 'teamManager');
- await page.waitToClick(selectors.accountSubroles.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Role added!');
- });
-
- it('should reload the subroles section and check a role was added', async() => {
- await page.reloadSection('account.role.card.subroles');
- const subrolesCount = await page.countElement(selectors.accountSubroles.anyResult);
-
- expect(subrolesCount).toEqual(1);
- });
-
- it('should access the employee roles inheritance then check the roles listed are the expected ones', async() => {
- await page.accessToSearchResult('employee');
- await page.accessToSection('account.role.card.inherited');
- const rolesCount = await page.countElement(selectors.accountRoleInheritance.anyResult);
-
- expect(rolesCount).toEqual(7);
- });
-});
diff --git a/e2e/paths/14-account/04_acl.spec.js b/e2e/paths/14-account/04_acl.spec.js
deleted file mode 100644
index ce2a63b14..000000000
--- a/e2e/paths/14-account/04_acl.spec.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account ACL path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('developer', 'account');
- await page.accessToSection('account.acl');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should go to create new acl', async() => {
- await page.waitToClick(selectors.accountAcl.addAcl);
- await page.waitForState('account.acl.create');
- });
-
- it('should create new acl', async() => {
- await page.autocompleteSearch(selectors.accountAcl.role, 'sysadmin');
- await page.autocompleteSearch(selectors.accountAcl.model, 'Account');
- await page.autocompleteSearch(selectors.accountAcl.accessType, '*');
- await page.autocompleteSearch(selectors.accountAcl.permission, 'ALLOW');
- await page.waitToClick(selectors.accountAcl.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should navigate to edit', async() => {
- await page.doSearch();
- await page.waitToClick(selectors.accountAcl.thirdAcl);
- await page.waitForState('account.acl.edit');
- });
-
- it('should edit the third acl', async() => {
- await page.autocompleteSearch(selectors.accountAcl.model, 'Supplier');
- await page.autocompleteSearch(selectors.accountAcl.accessType, 'READ');
- await page.waitToClick(selectors.accountAcl.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should delete the third result', async() => {
- const result = await page.waitToGetProperty(selectors.accountAcl.thirdAcl, 'innerText');
- await page.waitToClick(selectors.accountAcl.deleteThirdAcl);
- await page.waitToClick(selectors.globalItems.acceptButton);
- const message = await page.waitForSnackbar();
- const newResult = await page.waitToGetProperty(selectors.accountAcl.thirdAcl, 'innerText');
-
- expect(message.text).toContain('ACL removed');
- expect(result).not.toEqual(newResult);
- });
-});
diff --git a/e2e/paths/14-account/05_connections.spec.js b/e2e/paths/14-account/05_connections.spec.js
deleted file mode 100644
index 49d5f612d..000000000
--- a/e2e/paths/14-account/05_connections.spec.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account Connections path', () => {
- let browser;
- let page;
- const account = 'sysadmin';
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule(account, 'account');
- await page.accessToSection('account.connections');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should check this is the last connection', async() => {
- const firstResult = await page.waitToGetProperty(selectors.accountConnections.firstConnection, 'innerText');
-
- expect(firstResult).toContain(account);
- });
-});
diff --git a/e2e/paths/14-account/06_accounts.spec.js b/e2e/paths/14-account/06_accounts.spec.js
deleted file mode 100644
index 8bd6ea7d5..000000000
--- a/e2e/paths/14-account/06_accounts.spec.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account Accounts path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('sysadmin', 'account');
- await page.accessToSection('account.accounts');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should sync roles', async() => {
- await page.waitToClick(selectors.accountAccounts.syncRoles);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Roles synchronized!');
- });
-
- it('should relogin', async() => {
- await page.loginAndModule('sysadmin', 'account');
- await page.accessToSection('account.accounts');
- });
-
- it('should sync all', async() => {
- await page.waitToClick(selectors.accountAccounts.syncAll);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Synchronizing in the background');
- });
-});
diff --git a/e2e/paths/14-account/07_ldap.spec.js b/e2e/paths/14-account/07_ldap.spec.js
deleted file mode 100644
index eb22f695c..000000000
--- a/e2e/paths/14-account/07_ldap.spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account LDAP path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('sysadmin', 'account');
- await page.accessToSection('account.ldap');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should set data and save', async() => {
- await page.waitToClick(selectors.accountLdap.checkEnable);
- await page.write(selectors.accountLdap.server, '1234');
- await page.write(selectors.accountLdap.rdn, '1234');
- await page.write(selectors.accountLdap.password, 'nightmare');
- await page.write(selectors.accountLdap.userDn, 'sysadmin');
- await page.write(selectors.accountLdap.groupDn, '1234');
- await page.waitToClick(selectors.accountLdap.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reset data', async() => {
- await page.waitToClick(selectors.accountLdap.checkEnable);
- await page.waitToClick(selectors.accountLdap.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/14-account/08_samba.spec.js b/e2e/paths/14-account/08_samba.spec.js
deleted file mode 100644
index a92344acb..000000000
--- a/e2e/paths/14-account/08_samba.spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account Samba path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('sysadmin', 'account');
- await page.accessToSection('account.samba');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should set data and save', async() => {
- await page.waitToClick(selectors.accountSamba.checkEnable);
- await page.write(selectors.accountSamba.adDomain, '1234');
- await page.write(selectors.accountSamba.adController, '1234');
- await page.write(selectors.accountSamba.adUser, 'sysadmin');
- await page.write(selectors.accountSamba.adPassword, 'nightmare');
- await page.write(selectors.accountSamba.userDn, 'testDn');
- await page.waitToClick(selectors.accountSamba.verifyCert);
- await page.waitToClick(selectors.accountSamba.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reset data', async() => {
- await page.waitToClick(selectors.accountSamba.checkEnable);
- await page.waitToClick(selectors.accountSamba.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/14-account/09_privileges.spec.js b/e2e/paths/14-account/09_privileges.spec.js
deleted file mode 100644
index e4b8fb24c..000000000
--- a/e2e/paths/14-account/09_privileges.spec.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Account privileges path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('developer', 'account');
- await page.accessToSearchResult('1101');
- await page.accessToSection('account.card.privileges');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- describe('as developer', () => {
- it('should throw error when give privileges', async() => {
- await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
- await page.waitToClick(selectors.accountPrivileges.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`You don't have grant privilege`);
- });
-
- it('should throw error when change role', async() => {
- await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
- await page.waitToClick(selectors.accountPrivileges.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`You don't have grant privilege`);
- });
- });
-
- describe('as sysadmin', () => {
- beforeAll(async() => {
- await page.loginAndModule('sysadmin', 'account');
- await page.accessToSearchResult('9');
- await page.accessToSection('account.card.privileges');
- });
-
- it('should give privileges', async() => {
- await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
- await page.waitToClick(selectors.accountPrivileges.save);
- const message = await page.waitForSnackbar();
-
- await page.reloadSection('account.card.privileges');
- const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);
-
- expect(message.text).toContain(`Data saved!`);
- expect(result).toBe('checked');
- });
-
- it('should throw error when change role and not own role', async() => {
- await page.autocompleteSearch(selectors.accountPrivileges.role, 'itBoss');
- await page.waitToClick(selectors.accountPrivileges.save);
-
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`You don't own the role and you can't assign it to another user`);
- });
-
- it('should change role to employee', async() => {
- await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
- await page.waitToClick(selectors.accountPrivileges.save);
- const message = await page.waitForSnackbar();
-
- await page.reloadSection('account.card.privileges');
- const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');
-
- expect(message.text).toContain(`Data saved!`);
- expect(result).toContain('employee');
- });
-
- it('should return role to developer', async() => {
- await page.autocompleteSearch(selectors.accountPrivileges.role, 'developer');
- await page.waitToClick(selectors.accountPrivileges.save);
- const message = await page.waitForSnackbar();
-
- await page.reloadSection('account.card.privileges');
- const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');
-
- expect(message.text).toContain(`Data saved!`);
- expect(result).toContain('developer');
- });
- });
-
- describe('as developer again', () => {
- it('should remove privileges', async() => {
- await page.accessToSearchResult('9');
- await page.accessToSection('account.card.privileges');
-
- await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
- await page.waitToClick(selectors.accountPrivileges.save);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`Data saved!`);
- });
-
- it('should logIn in developer', async() => {
- await page.reloadSection('account.card.privileges');
- const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);
-
- expect(result).toBe('unchecked');
- });
- });
-});
diff --git a/loopback/common/models/vn-model.js b/loopback/common/models/vn-model.js
index 22b535f62..a11bed11d 100644
--- a/loopback/common/models/vn-model.js
+++ b/loopback/common/models/vn-model.js
@@ -13,7 +13,6 @@ module.exports = function(Self) {
Object.assign(Self, {
setup() {
Self.super_.setup.call(this);
-
/**
* Setting a global transaction timeout to find out if the service
* is blocked because the connection pool is empty.
@@ -28,6 +27,26 @@ module.exports = function(Self) {
};
});
+ this.beforeRemote('**', async ctx => {
+ if (!this.hasFilter(ctx)) return;
+
+ const defaultLimit = this.app.orm.selectLimit;
+ const filter = ctx.args.filter || {limit: defaultLimit};
+
+ if (filter.limit > defaultLimit) {
+ filter.limit = defaultLimit;
+ ctx.args.filter = filter;
+ }
+ });
+
+ this.afterRemote('**', async ctx => {
+ if (!this.hasFilter(ctx)) return;
+
+ const {result} = ctx;
+ const length = Array.isArray(result) ? result.length : result ? 1 : 0;
+ if (length >= this.app.orm.selectLimit) throw new UserError('Too many records');
+ });
+
// Register field ACL validation
/*
this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx));
@@ -327,6 +346,12 @@ module.exports = function(Self) {
checkInsertAcls(ctx) {
return this.checkAcls(ctx, 'insert');
+ },
+
+ hasFilter(ctx) {
+ return ctx.req.method.toUpperCase() === 'GET' &&
+ ctx.method.accepts.some(x => x.arg === 'filter' && x.type.toLowerCase() === 'object');
}
+
});
};
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index e1f7fd655..377691ae6 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -369,5 +369,6 @@
"Cannot send mail": "Não é possível enviar o email",
"CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos",
"The sale not exists in the item shelving": "La venta no existe en la estantería del artículo",
- "The entry not have stickers": "La entrada no tiene etiquetas"
+ "The entry not have stickers": "La entrada no tiene etiquetas",
+ "Too many records": "Demasiados registros"
}
\ No newline at end of file
diff --git a/loopback/server/boot/orm.js b/loopback/server/boot/orm.js
new file mode 100644
index 000000000..8bbd969e1
--- /dev/null
+++ b/loopback/server/boot/orm.js
@@ -0,0 +1,6 @@
+module.exports = async function(app) {
+ if (!app.orm) {
+ const ormConfig = await app.models.OrmConfig.findOne();
+ app.orm = ormConfig;
+ }
+};
diff --git a/loopback/util/flatten.js b/loopback/util/flatten.js
new file mode 100644
index 000000000..18d682d1f
--- /dev/null
+++ b/loopback/util/flatten.js
@@ -0,0 +1,42 @@
+/**
+ * Flattens an array of objects by converting each object into a flat structure.
+ *
+ * @param {Array} dataArray Array of objects to be flattened
+ * @return {Array} Array of flattened objects
+ */
+function flatten(dataArray) {
+ return dataArray.map(item => flattenObj(item.__data));
+}
+
+/**
+ * Recursively flattens an object, converting nested properties into a single level object
+ * with keys representing the original nested structure.
+ *
+ * @param {Object} data The object to be flattened
+ * @param {String} [prefix=''] Optional prefix for nested keys
+ * @return {Object} Flattened object
+ */
+function flattenObj(data, prefix = '') {
+ let result = {};
+ try {
+ for (let key in data) {
+ if (!data[key]) continue;
+
+ const newKey = prefix ? `${prefix}_${key}` : key;
+ const value = data[key];
+
+ if (typeof value === 'object' && value !== null && !Array.isArray(value))
+ Object.assign(result, flattenObj(value.__data, newKey));
+ else
+ result[newKey] = value;
+ }
+ } catch (error) {
+ console.error(error);
+ }
+
+ return result;
+}
+module.exports = {
+ flatten,
+ flattenObj,
+};
diff --git a/modules/account/front/accounts/index.html b/modules/account/front/accounts/index.html
deleted file mode 100644
index 6847e68d1..000000000
--- a/modules/account/front/accounts/index.html
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
diff --git a/modules/account/front/accounts/index.js b/modules/account/front/accounts/index.js
deleted file mode 100644
index ab19126a1..000000000
--- a/modules/account/front/accounts/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onSynchronizeAll() {
- this.vnApp.showSuccess(this.$t('Synchronizing in the background'));
- this.$http.patch(`Accounts/syncAll`);
- }
-
- onSynchronizeRoles() {
- this.$http.patch(`RoleInherits/sync`)
- .then(() => this.vnApp.showSuccess(this.$t('Roles synchronized!')));
- }
-}
-
-ngModule.component('vnAccountAccounts', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/accounts/locale/es.yml b/modules/account/front/accounts/locale/es.yml
deleted file mode 100644
index 614ade3eb..000000000
--- a/modules/account/front/accounts/locale/es.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-Accounts: Cuentas
-Homedir base: Directorio base para carpetas de usuario
-Shell: Intérprete de línea de comandos
-User and role base id: Id base usuarios y roles
-Synchronize all: Sincronizar todo
-Synchronize roles: Sincronizar roles
-If password is not specified, just user attributes are synchronized: >-
- Si la contraseña no se especifica solo se sincronizarán lo atributos del usuario
-Synchronizing in the background: Sincronizando en segundo plano
-Users synchronized!: ¡Usuarios sincronizados!
-Username: Nombre de usuario
-Synchronize: Sincronizar
-Please enter the username: Por favor introduce el nombre de usuario
-Roles synchronized!: ¡Roles sincronizados!
diff --git a/modules/account/front/acl/create/index.html b/modules/account/front/acl/create/index.html
deleted file mode 100644
index 14332f737..000000000
--- a/modules/account/front/acl/create/index.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
diff --git a/modules/account/front/acl/create/index.js b/modules/account/front/acl/create/index.js
deleted file mode 100644
index fea71991f..000000000
--- a/modules/account/front/acl/create/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- constructor(...args) {
- super(...args);
- this.accessTypes = [
- {name: '*'},
- {name: 'READ'},
- {name: 'WRITE'}
- ];
- this.permissions = [
- {name: 'ALLOW'},
- {name: 'DENY'}
- ];
-
- this.models = [];
- for (let model in window.validations)
- this.models.push({name: model});
-
- this.acl = {
- property: '*',
- principalType: 'ROLE',
- accessType: 'READ',
- permission: 'ALLOW'
- };
- }
-}
-
-ngModule.component('vnAclCreate', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/acl/index.js b/modules/account/front/acl/index.js
deleted file mode 100644
index 8393859a5..000000000
--- a/modules/account/front/acl/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import './main';
-import './index/';
-import './create';
-import './search-panel';
diff --git a/modules/account/front/acl/index/index.html b/modules/account/front/acl/index/index.html
deleted file mode 100644
index af06ec481..000000000
--- a/modules/account/front/acl/index/index.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
-
- {{::row.model}}.{{::row.property}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/acl/index/index.js b/modules/account/front/acl/index/index.js
deleted file mode 100644
index a2aec534a..000000000
--- a/modules/account/front/acl/index/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onDelete(row) {
- return this.$http.delete(`ACLs/${row.id}`)
- .then(() => this.$.model.refresh())
- .then(() => this.vnApp.showSuccess(this.$t('ACL removed')));
- }
-}
-
-ngModule.component('vnAclIndex', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/acl/index/locale/es.yml b/modules/account/front/acl/index/locale/es.yml
deleted file mode 100644
index 8024f804c..000000000
--- a/modules/account/front/acl/index/locale/es.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-New ACL: Nuevo ACL
-Edit ACL: Editar ACL
-ACL will be removed: El ACL será eliminado
-ACL removed: ACL eliminado
diff --git a/modules/account/front/acl/locale/es.yml b/modules/account/front/acl/locale/es.yml
deleted file mode 100644
index ff6a1b41c..000000000
--- a/modules/account/front/acl/locale/es.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-Model: Modelo
-Property: Propiedad
-Access type: Tipo de acceso
-Permission: Permiso
\ No newline at end of file
diff --git a/modules/account/front/acl/main/index.html b/modules/account/front/acl/main/index.html
deleted file mode 100644
index 7767768d9..000000000
--- a/modules/account/front/acl/main/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/acl/main/index.js b/modules/account/front/acl/main/index.js
deleted file mode 100644
index a91a71cb7..000000000
--- a/modules/account/front/acl/main/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import ngModule from '../../module';
-import ModuleMain from 'salix/components/module-main';
-
-export default class ACL extends ModuleMain {
- exprBuilder(param, value) {
- switch (param) {
- case 'search':
- return {model: {like: `%${value}%`}};
- default:
- return {[param]: value};
- }
- }
-}
-
-ngModule.vnComponent('vnAclComponent', {
- controller: ACL,
- template: require('./index.html')
-});
diff --git a/modules/account/front/acl/search-panel/index.html b/modules/account/front/acl/search-panel/index.html
deleted file mode 100644
index a3efab440..000000000
--- a/modules/account/front/acl/search-panel/index.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
diff --git a/modules/account/front/acl/search-panel/index.js b/modules/account/front/acl/search-panel/index.js
deleted file mode 100644
index 4f571059e..000000000
--- a/modules/account/front/acl/search-panel/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import ngModule from '../../module';
-import SearchPanel from 'core/components/searchbar/search-panel';
-
-export default class Controller extends SearchPanel {
- constructor(...args) {
- super(...args);
- this.accessTypes = [
- {name: '*'},
- {name: 'READ'},
- {name: 'WRITE'}
- ];
- this.permissions = [
- {name: 'ALLOW'},
- {name: 'DENY'}
- ];
-
- this.models = [];
- for (let model in window.validations)
- this.models.push({name: model});
- }
-}
-
-ngModule.component('vnAclSearchPanel', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/alias/basic-data/index.html b/modules/account/front/alias/basic-data/index.html
deleted file mode 100644
index 523c9297a..000000000
--- a/modules/account/front/alias/basic-data/index.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/alias/basic-data/index.js b/modules/account/front/alias/basic-data/index.js
deleted file mode 100644
index b7c2db089..000000000
--- a/modules/account/front/alias/basic-data/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {}
-
-ngModule.component('vnAliasBasicData', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- alias: '<'
- }
-});
diff --git a/modules/account/front/alias/card/index.html b/modules/account/front/alias/card/index.html
deleted file mode 100644
index 712147a24..000000000
--- a/modules/account/front/alias/card/index.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/modules/account/front/alias/card/index.js b/modules/account/front/alias/card/index.js
deleted file mode 100644
index fd1a18f6a..000000000
--- a/modules/account/front/alias/card/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../../module';
-import ModuleCard from 'salix/components/module-card';
-
-class Controller extends ModuleCard {
- reload() {
- this.$http.get(`MailAliases/${this.$params.id}`)
- .then(res => this.alias = res.data);
- }
-}
-
-ngModule.vnComponent('vnAliasCard', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/alias/create/index.html b/modules/account/front/alias/create/index.html
deleted file mode 100644
index 4dad1b870..000000000
--- a/modules/account/front/alias/create/index.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
diff --git a/modules/account/front/alias/create/index.js b/modules/account/front/alias/create/index.js
deleted file mode 100644
index c058c3adf..000000000
--- a/modules/account/front/alias/create/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onSubmit() {
- return this.$.watcher.submit().then(res =>
- this.$state.go('account.alias.card.basicData', {id: res.data.id})
- );
- }
-}
-
-ngModule.component('vnAliasCreate', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/alias/descriptor/index.html b/modules/account/front/alias/descriptor/index.html
deleted file mode 100644
index 71b98c6a3..000000000
--- a/modules/account/front/alias/descriptor/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
- Delete
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/alias/descriptor/index.js b/modules/account/front/alias/descriptor/index.js
deleted file mode 100644
index a21baae5a..000000000
--- a/modules/account/front/alias/descriptor/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import ngModule from '../../module';
-import Descriptor from 'salix/components/descriptor';
-
-class Controller extends Descriptor {
- get alias() {
- return this.entity;
- }
-
- set alias(value) {
- this.entity = value;
- }
-
- onDelete() {
- return this.$http.delete(`MailAliases/${this.id}`)
- .then(() => this.$state.go('account.alias'))
- .then(() => this.vnApp.showSuccess(this.$t('Alias removed')));
- }
-}
-
-ngModule.component('vnAliasDescriptor', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- alias: '<'
- }
-});
diff --git a/modules/account/front/alias/descriptor/locale/es.yml b/modules/account/front/alias/descriptor/locale/es.yml
deleted file mode 100644
index 9c6fa0e73..000000000
--- a/modules/account/front/alias/descriptor/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-Alias will be removed: El alias será eliminado
-Alias removed: Alias eliminado
\ No newline at end of file
diff --git a/modules/account/front/alias/index.js b/modules/account/front/alias/index.js
deleted file mode 100644
index 8eed3a3d3..000000000
--- a/modules/account/front/alias/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import './main';
-import './index/';
-import './create';
-import './summary';
-import './card';
-import './descriptor';
-import './create';
-import './basic-data';
-import './users';
diff --git a/modules/account/front/alias/index/index.html b/modules/account/front/alias/index/index.html
deleted file mode 100644
index 7343cb9bd..000000000
--- a/modules/account/front/alias/index/index.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
- {{::alias.alias}}
- {{::alias.description}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/alias/index/index.js b/modules/account/front/alias/index/index.js
deleted file mode 100644
index 44e146fb4..000000000
--- a/modules/account/front/alias/index/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- preview(alias) {
- this.selectedAlias = alias;
- this.$.summary.show();
- }
-}
-
-ngModule.component('vnAliasIndex', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/alias/index/locale/es.yml b/modules/account/front/alias/index/locale/es.yml
deleted file mode 100644
index 4df41c0be..000000000
--- a/modules/account/front/alias/index/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-New alias: Nuevo alias
-View alias: Ver alias
\ No newline at end of file
diff --git a/modules/account/front/alias/locale/es.yml b/modules/account/front/alias/locale/es.yml
deleted file mode 100644
index ecc856fcf..000000000
--- a/modules/account/front/alias/locale/es.yml
+++ /dev/null
@@ -1 +0,0 @@
-Public: Público
\ No newline at end of file
diff --git a/modules/account/front/alias/main/index.html b/modules/account/front/alias/main/index.html
deleted file mode 100644
index 43f6e2f51..000000000
--- a/modules/account/front/alias/main/index.html
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/alias/main/index.js b/modules/account/front/alias/main/index.js
deleted file mode 100644
index 21eed3d85..000000000
--- a/modules/account/front/alias/main/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import ngModule from '../../module';
-import ModuleMain from 'salix/components/module-main';
-
-export default class Alias extends ModuleMain {
- exprBuilder(param, value) {
- switch (param) {
- case 'search':
- return /^\d+$/.test(value)
- ? {id: value}
- : {alias: {like: `%${value}%`}};
- }
- }
-}
-
-ngModule.vnComponent('vnAlias', {
- controller: Alias,
- template: require('./index.html')
-});
diff --git a/modules/account/front/alias/summary/index.html b/modules/account/front/alias/summary/index.html
deleted file mode 100644
index 52ee2813d..000000000
--- a/modules/account/front/alias/summary/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
- {{summary.alias}}
-
-
- Basic data
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/alias/summary/index.js b/modules/account/front/alias/summary/index.js
deleted file mode 100644
index 21bc8d9ba..000000000
--- a/modules/account/front/alias/summary/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import ngModule from '../../module';
-import Component from 'core/lib/component';
-
-class Controller extends Component {
- set alias(value) {
- this._alias = value;
- this.$.summary = null;
- if (!value) return;
-
- this.$http.get(`MailAliases/${value.id}`)
- .then(res => this.$.summary = res.data);
- }
-
- get alias() {
- return this._alias;
- }
-}
-
-ngModule.component('vnAliasSummary', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- alias: '<'
- }
-});
diff --git a/modules/account/front/alias/users/index.html b/modules/account/front/alias/users/index.html
deleted file mode 100644
index 048a702ea..000000000
--- a/modules/account/front/alias/users/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
- {{::row.user.name}}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/alias/users/index.js b/modules/account/front/alias/users/index.js
deleted file mode 100644
index b2446d71b..000000000
--- a/modules/account/front/alias/users/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- let filter = {
- include: {
- relation: 'user',
- scope: {
- fields: ['id', 'name']
- }
- }
- };
- this.$http.get(`MailAliases/${this.$params.id}/accounts`, {filter})
- .then(res => this.$.data = res.data);
- }
-
- onRemove(row) {
- return this.$http.delete(`MailAliases/${this.$params.id}/accounts/${row.id}`)
- .then(() => {
- let index = this.$.data.indexOf(row);
- if (index !== -1) this.$.data.splice(index, 1);
- this.vnApp.showSuccess(this.$t('User removed'));
- });
- }
-}
-
-ngModule.component('vnAliasUsers', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/alias/users/index.spec.js b/modules/account/front/alias/users/index.spec.js
deleted file mode 100644
index d618f1de1..000000000
--- a/modules/account/front/alias/users/index.spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import './index';
-
-describe('component vnAliasUsers', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnAliasUsers', {$element: null});
- controller.$params.id = 1;
- }));
-
- describe('$onInit()', () => {
- it('should delete entity and go to index', () => {
- $httpBackend.expectGET('MailAliases/1/accounts').respond('foo');
- controller.$onInit();
- $httpBackend.flush();
-
- expect(controller.$.data).toBe('foo');
- });
- });
-
- describe('onRemove()', () => {
- it('should call backend method to change role', () => {
- jest.spyOn(controller.vnApp, 'showSuccess');
-
- controller.$.data = [
- {id: 1, alias: 'foo'},
- {id: 2, alias: 'bar'}
- ];
-
- $httpBackend.expectDELETE('MailAliases/1/accounts/1').respond();
- controller.onRemove(controller.$.data[0]);
- $httpBackend.flush();
-
- expect(controller.$.data).toEqual([{id: 2, alias: 'bar'}]);
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-});
diff --git a/modules/account/front/alias/users/locale/es.yml b/modules/account/front/alias/users/locale/es.yml
deleted file mode 100644
index dc24eb318..000000000
--- a/modules/account/front/alias/users/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-User will be removed from alias: El usuario será borrado del alias
-User removed: Usuario borrado
\ No newline at end of file
diff --git a/modules/account/front/aliases/index.html b/modules/account/front/aliases/index.html
deleted file mode 100644
index 4a73ec873..000000000
--- a/modules/account/front/aliases/index.html
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
- {{::row.alias.alias}}
-
-
- {{::row.alias.description}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Account not enabled
-
diff --git a/modules/account/front/aliases/index.js b/modules/account/front/aliases/index.js
deleted file mode 100644
index 0fc806a71..000000000
--- a/modules/account/front/aliases/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- this.refresh();
- }
-
- refresh() {
- let filter = {
- where: {account: this.$params.id},
- include: {
- relation: 'alias',
- scope: {
- fields: ['id', 'alias', 'description']
- }
- }
- };
- return this.$http.get(`MailAliasAccounts`, {filter})
- .then(res => this.$.data = res.data);
- }
-
- onAddClick() {
- this.addData = {account: this.$params.id};
- this.$.dialog.show();
- }
-
- onAddSave() {
- return this.$http.post(`MailAliasAccounts`, this.addData)
- .then(() => this.refresh())
- .then(() => this.vnApp.showSuccess(
- this.$t('Subscribed to alias!'))
- );
- }
-
- onRemove(row) {
- return this.$http.delete(`MailAliasAccounts/${row.id}`)
- .then(() => {
- this.$.data.splice(this.$.data.indexOf(row), 1);
- this.vnApp.showSuccess(this.$t('Unsubscribed from alias!'));
- });
- }
-}
-
-ngModule.component('vnUserAliases', {
- template: require('./index.html'),
- controller: Controller,
- require: {
- card: '^vnUserCard'
- }
-});
diff --git a/modules/account/front/aliases/index.spec.js b/modules/account/front/aliases/index.spec.js
deleted file mode 100644
index 466f1e1e9..000000000
--- a/modules/account/front/aliases/index.spec.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import './index';
-
-describe('component vnUserAliases', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnUserAliases', {$element: null});
- jest.spyOn(controller.vnApp, 'showSuccess');
- }));
-
- describe('refresh()', () => {
- it('should refresh the controller data', () => {
- $httpBackend.expectGET('MailAliasAccounts').respond('foo');
- controller.refresh();
- $httpBackend.flush();
-
- expect(controller.$.data).toBe('foo');
- });
- });
-
- describe('onAddSave()', () => {
- it('should add the new row', () => {
- controller.addData = {account: 1};
-
- $httpBackend.expectPOST('MailAliasAccounts').respond();
- $httpBackend.expectGET('MailAliasAccounts').respond('foo');
- controller.onAddSave();
- $httpBackend.flush();
-
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-
- describe('onRemove()', () => {
- it('shoud remove the passed row remote and locally', () => {
- controller.$.data = [
- {id: 1, alias: 'foo'},
- {id: 2, alias: 'bar'}
- ];
-
- $httpBackend.expectDELETE('MailAliasAccounts/1').respond();
- controller.onRemove(controller.$.data[0]);
- $httpBackend.flush();
-
- expect(controller.$.data).toEqual([{id: 2, alias: 'bar'}]);
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-});
diff --git a/modules/account/front/aliases/locale/es.yml b/modules/account/front/aliases/locale/es.yml
deleted file mode 100644
index 4d1ad76a7..000000000
--- a/modules/account/front/aliases/locale/es.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-Unsubscribe: Desuscribir
-Subscribed to alias!: ¡Suscrito al alias!
-Unsubscribed from alias!: ¡Desuscrito del alias!
\ No newline at end of file
diff --git a/modules/account/front/basic-data/index.html b/modules/account/front/basic-data/index.html
deleted file mode 100644
index 9fd3506fe..000000000
--- a/modules/account/front/basic-data/index.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
diff --git a/modules/account/front/basic-data/index.js b/modules/account/front/basic-data/index.js
deleted file mode 100644
index f6b266bbc..000000000
--- a/modules/account/front/basic-data/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- if (this.$params.emailConfirmed)
- this.vnApp.showSuccess(this.$t('Email verified successfully!'));
- }
-
- onSubmit() {
- this.$.watcher.submit()
- .then(() => this.card.reload());
- }
-}
-
-ngModule.component('vnUserBasicData', {
- template: require('./index.html'),
- controller: Controller,
- require: {
- card: '^vnUserCard'
- },
- bindings: {
- user: '<'
- }
-});
diff --git a/modules/account/front/basic-data/locale/es.yml b/modules/account/front/basic-data/locale/es.yml
deleted file mode 100644
index 2ca7bf698..000000000
--- a/modules/account/front/basic-data/locale/es.yml
+++ /dev/null
@@ -1 +0,0 @@
-Email verified successfully!: Correo verificado correctamente!
diff --git a/modules/account/front/card/index.html b/modules/account/front/card/index.html
deleted file mode 100644
index cba6b93c6..000000000
--- a/modules/account/front/card/index.html
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
diff --git a/modules/account/front/card/index.js b/modules/account/front/card/index.js
deleted file mode 100644
index 2c8cc7637..000000000
--- a/modules/account/front/card/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import ngModule from '../module';
-import ModuleCard from 'salix/components/module-card';
-import './style.scss';
-
-class Controller extends ModuleCard {
- reload() {
- const filter = {
- where: {id: this.$params.id},
- include: {
- relation: 'role',
- scope: {
- fields: ['id', 'name']
- }
- }
- };
-
- return Promise.all([
- this.$http.get(`VnUsers/preview`, {filter})
- .then(res => {
- const [user] = res.data;
- this.user = user;
- }),
- this.$http.get(`Accounts/${this.$params.id}/exists`)
- .then(res => this.hasAccount = res.data.exists)
- ]);
- }
-}
-
-ngModule.vnComponent('vnUserCard', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/card/index.spec.js b/modules/account/front/card/index.spec.js
deleted file mode 100644
index 712d3c1d8..000000000
--- a/modules/account/front/card/index.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import './index';
-
-describe('component vnUserCard', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnUserCard', {$element: null});
- }));
-
- describe('reload()', () => {
- it('should reload the controller data', () => {
- controller.$params.id = 1;
-
- $httpBackend.expectGET('VnUsers/preview').respond('foo');
- $httpBackend.expectGET('Accounts/1/exists').respond({exists: true});
- controller.reload();
- $httpBackend.flush();
-
- expect(controller.user).toBe('f');
- expect(controller.hasAccount).toBeTruthy();
- });
- });
-});
diff --git a/modules/account/front/card/style.scss b/modules/account/front/card/style.scss
deleted file mode 100644
index 4d9d108a0..000000000
--- a/modules/account/front/card/style.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "variables";
-
-.bg-title {
- display: block;
- text-align: center;
- padding: 24px;
- box-sizing: border-box;
- color: $color-font-secondary;
- font-size: 1.375rem;
-}
diff --git a/modules/account/front/connections/index.html b/modules/account/front/connections/index.html
deleted file mode 100644
index d634b7a9f..000000000
--- a/modules/account/front/connections/index.html
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
- {{::row.user.username}}
- {{::row.created | date:'dd/MM HH:mm'}}
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/connections/index.js b/modules/account/front/connections/index.js
deleted file mode 100644
index c4ddd5615..000000000
--- a/modules/account/front/connections/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- constructor(...args) {
- super(...args);
- this.filter = {
- fields: ['id', 'created', 'userId'],
- include: {
- relation: 'user',
- scope: {
- fields: ['username']
- }
- },
- order: 'created DESC'
- };
- }
-
- onDisconnect(row) {
- return this.$http.delete(`AccessTokens/${row.id}`)
- .then(() => this.$.model.refresh())
- .then(() => this.vnApp.showSuccess(this.$t('Session killed')));
- }
-}
-
-ngModule.component('vnConnections', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/connections/locale/es.yml b/modules/account/front/connections/locale/es.yml
deleted file mode 100644
index 41ef18b45..000000000
--- a/modules/account/front/connections/locale/es.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-Go to user: Ir al usuario
-Refresh: Actualizar
-Session will be killed: Se va a matar la sesión
-Kill session: Matar sesión
-Session killed: Sesión matada
\ No newline at end of file
diff --git a/modules/account/front/create/index.html b/modules/account/front/create/index.html
deleted file mode 100644
index 70a518885..000000000
--- a/modules/account/front/create/index.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
diff --git a/modules/account/front/create/index.js b/modules/account/front/create/index.js
deleted file mode 100644
index 01ba7905b..000000000
--- a/modules/account/front/create/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- constructor($element, $) {
- super($element, $);
- this.user = {active: true};
- }
-
- onSubmit() {
- return this.$.watcher.submit().then(res => {
- this.$state.go('account.card.basicData', {id: res.data.id});
- });
- }
-}
-
-ngModule.component('vnUserCreate', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/descriptor/__snapshots__/index.spec.js.snap b/modules/account/front/descriptor/__snapshots__/index.spec.js.snap
deleted file mode 100644
index de5f8e8c2..000000000
--- a/modules/account/front/descriptor/__snapshots__/index.spec.js.snap
+++ /dev/null
@@ -1,5 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`component vnUserDescriptor onPassChange() should throw an error when password is empty 1`] = `"You must enter a new password"`;
-
-exports[`component vnUserDescriptor onPassChange() should throw an error when repeat password not matches new password 1`] = `"Passwords don't match"`;
diff --git a/modules/account/front/descriptor/index.spec.js b/modules/account/front/descriptor/index.spec.js
deleted file mode 100644
index 46c7e376c..000000000
--- a/modules/account/front/descriptor/index.spec.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import './index';
-
-describe('component vnUserDescriptor', () => {
- let controller;
- let $httpBackend;
-
- let user = {id: 1, name: 'foo'};
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- $httpBackend.whenGET('Accounts/1/exists').respond({exists: true});
-
- controller = $componentController('vnUserDescriptor', {$element: null}, {user});
- jest.spyOn(controller, 'emit');
- jest.spyOn(controller.vnApp, 'showSuccess');
- }));
-
- describe('onDelete()', () => {
- it('should delete entity and go to index', () => {
- controller.$state.go = jest.fn();
-
- $httpBackend.expectDELETE('VnUsers/1').respond();
- controller.onDelete();
- $httpBackend.flush();
-
- expect(controller.$state.go).toHaveBeenCalledWith('account.index');
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-
- describe('onPassChange()', () => {
- it('should throw an error when password is empty', () => {
- expect(() => {
- controller.onPassChange();
- }).toThrowErrorMatchingSnapshot();
- });
-
- it('should throw an error when repeat password not matches new password', () => {
- controller.newPassword = 'foo';
- controller.repeatPassword = 'bar';
-
- expect(() => {
- controller.onPassChange();
- }).toThrowErrorMatchingSnapshot();
- });
-
- it('should make a request when password checks passes', () => {
- controller.newPassword = 'foo';
- controller.repeatPassword = 'foo';
-
- $httpBackend.expectPATCH('Accounts/1/setPassword').respond();
- controller.onPassChange();
- $httpBackend.flush();
-
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- expect(controller.emit).toHaveBeenCalledWith('change');
- });
- });
-
- describe('onEnableAccount()', () => {
- it('should make request to enable account', () => {
- $httpBackend.expectPOST('Accounts', {id: 1}).respond();
- controller.onEnableAccount();
- $httpBackend.flush();
-
- expect(controller.hasAccount).toBeTruthy();
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- expect(controller.emit).toHaveBeenCalledWith('change');
- });
- });
-
- describe('onDisableAccount()', () => {
- it('should make request to disable account', () => {
- $httpBackend.expectDELETE('Accounts/1').respond();
- controller.onDisableAccount();
- $httpBackend.flush();
-
- expect(controller.hasAccount).toBeFalsy();
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- expect(controller.emit).toHaveBeenCalledWith('change');
- });
- });
-
- describe('onSetActive()', () => {
- it('should make request to activate/deactivate the user', () => {
- $httpBackend.expectPATCH('VnUsers/1', {active: true}).respond();
- controller.onSetActive(true);
- $httpBackend.flush();
-
- expect(controller.user.active).toBeTruthy();
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- expect(controller.emit).toHaveBeenCalledWith('change');
- });
- });
-});
diff --git a/modules/account/front/index.js b/modules/account/front/index.js
index 4d6aedcae..0f2208862 100644
--- a/modules/account/front/index.js
+++ b/modules/account/front/index.js
@@ -1,24 +1,6 @@
export * from './module';
import './main';
-import './index/';
-import './role';
-import './alias';
-import './connections';
-import './acl';
-import './summary';
-import './card';
import './descriptor';
import './descriptor-popover';
-import './search-panel';
-import './create';
-import './basic-data';
-import './mail-forwarding';
-import './aliases';
-import './roles';
-import './ldap';
-import './samba';
-import './accounts';
-import './privileges';
-import './user-log';
-import './role-log';
+import './summary';
diff --git a/modules/account/front/index/index.html b/modules/account/front/index/index.html
deleted file mode 100644
index 7502c8b3d..000000000
--- a/modules/account/front/index/index.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/index/index.js b/modules/account/front/index/index.js
deleted file mode 100644
index 9324ca740..000000000
--- a/modules/account/front/index/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- preview(user) {
- this.selectedUser = user;
- this.$.summary.show();
- }
-}
-
-ngModule.component('vnUserIndex', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/index/locale/es.yml b/modules/account/front/index/locale/es.yml
deleted file mode 100644
index 074fb054e..000000000
--- a/modules/account/front/index/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-New user: Nuevo usuario
-View user: Ver usuario
\ No newline at end of file
diff --git a/modules/account/front/ldap/index.html b/modules/account/front/ldap/index.html
deleted file mode 100644
index 23356452a..000000000
--- a/modules/account/front/ldap/index.html
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
diff --git a/modules/account/front/ldap/index.js b/modules/account/front/ldap/index.js
deleted file mode 100644
index 40e1e8db1..000000000
--- a/modules/account/front/ldap/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onTestConection() {
- this.$http.get(`LdapConfigs/test`)
- .then(() => this.vnApp.showSuccess(this.$t('LDAP connection established!')));
- }
-}
-
-ngModule.component('vnAccountLdap', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/ldap/locale/es.yml b/modules/account/front/ldap/locale/es.yml
deleted file mode 100644
index 0353d6b72..000000000
--- a/modules/account/front/ldap/locale/es.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-Enable synchronization: Habilitar sincronización
-Server: Servidor
-RDN: RDN
-User DN: DN usuarios
-Filter: Filtro
-Group DN: DN grupos
-Test connection: Probar conexión
-LDAP connection established!: ¡Conexión con LDAP establecida!
diff --git a/modules/account/front/mail-forwarding/index.html b/modules/account/front/mail-forwarding/index.html
deleted file mode 100644
index df5cd80bf..000000000
--- a/modules/account/front/mail-forwarding/index.html
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
- Account not enabled
-
diff --git a/modules/account/front/mail-forwarding/index.js b/modules/account/front/mail-forwarding/index.js
deleted file mode 100644
index 5118e8eab..000000000
--- a/modules/account/front/mail-forwarding/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {}
-
-ngModule.component('vnUserMailForwarding', {
- template: require('./index.html'),
- controller: Controller,
- require: {
- card: '^vnUserCard'
- },
-});
diff --git a/modules/account/front/mail-forwarding/locale/es.yml b/modules/account/front/mail-forwarding/locale/es.yml
deleted file mode 100644
index 688ace6b5..000000000
--- a/modules/account/front/mail-forwarding/locale/es.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-Mail forwarding: Reenvío de correo
-Forward email: Dirección de reenvío
-Enable mail forwarding: Habilitar redirección de correo
-All emails will be forwarded to the specified address.: >
- Todos los correos serán reenviados a la dirección especificada, no se
- mantendrá copia de los mismos en el buzón del usuario.
-You don't have enough privileges: No tienes suficientes permisos
diff --git a/modules/account/front/main/index.html b/modules/account/front/main/index.html
index 36b493ec4..e69de29bb 100644
--- a/modules/account/front/main/index.html
+++ b/modules/account/front/main/index.html
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/main/index.js b/modules/account/front/main/index.js
index a43ffb76b..335d71b42 100644
--- a/modules/account/front/main/index.js
+++ b/modules/account/front/main/index.js
@@ -4,32 +4,10 @@ import ModuleMain from 'salix/components/module-main';
export default class User extends ModuleMain {
constructor($element, $) {
super($element, $);
- this.filter = {
- fields: ['id', 'nickname', 'name', 'role'],
- include: {
- relation: 'role',
- scope: {
- fields: ['id', 'name']
- }
- }
- };
}
-
- exprBuilder(param, value) {
- switch (param) {
- case 'search':
- return /^\d+$/.test(value)
- ? {id: value}
- : {or: [
- {name: {like: `%${value}%`}},
- {nickname: {like: `%${value}%`}}
- ]};
- case 'name':
- case 'nickname':
- return {[param]: {like: `%${value}%`}};
- case 'roleFk':
- return {[param]: value};
- }
+ async $onInit() {
+ this.$state.go('home');
+ window.location.href = await this.vnApp.getUrl(`account/`);
}
}
diff --git a/modules/account/front/main/index.spec.js b/modules/account/front/main/index.spec.js
deleted file mode 100644
index c232aa849..000000000
--- a/modules/account/front/main/index.spec.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import './index';
-
-describe('component vnUser', () => {
- let controller;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject($componentController => {
- controller = $componentController('vnUser', {$element: null});
- }));
-
- describe('exprBuilder()', () => {
- it('should search by id when only digits string is passed', () => {
- let expr = controller.exprBuilder('search', '1');
-
- expect(expr).toEqual({id: '1'});
- });
-
- it('should search by name when non-only digits string is passed', () => {
- let expr = controller.exprBuilder('search', '1foo');
-
- expect(expr).toEqual({or: [
- {name: {like: '%1foo%'}},
- {nickname: {like: '%1foo%'}}
- ]});
- });
- });
-});
diff --git a/modules/account/front/privileges/index.html b/modules/account/front/privileges/index.html
deleted file mode 100644
index 343c179e3..000000000
--- a/modules/account/front/privileges/index.html
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
diff --git a/modules/account/front/privileges/index.js b/modules/account/front/privileges/index.js
deleted file mode 100644
index f69428666..000000000
--- a/modules/account/front/privileges/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- get user() {
- return this._user;
- }
-
- set user(value) {
- this._user = value;
- if (!value) return;
- }
-}
-
-ngModule.component('vnUserPrivileges', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- user: '<'
- }
-});
diff --git a/modules/account/front/privileges/locale/es.yml b/modules/account/front/privileges/locale/es.yml
deleted file mode 100644
index d66a7a6cf..000000000
--- a/modules/account/front/privileges/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-Privileges: Privilegios
-Has grant: Puede delegar privilegios
diff --git a/modules/account/front/role-log/index.html b/modules/account/front/role-log/index.html
deleted file mode 100644
index 9e2b151b5..000000000
--- a/modules/account/front/role-log/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/modules/account/front/role-log/index.js b/modules/account/front/role-log/index.js
deleted file mode 100644
index 02448ccaa..000000000
--- a/modules/account/front/role-log/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-ngModule.vnComponent('vnRoleLog', {
- template: require('./index.html'),
- controller: Section,
-});
diff --git a/modules/account/front/role/basic-data/index.html b/modules/account/front/role/basic-data/index.html
deleted file mode 100644
index 846f8b455..000000000
--- a/modules/account/front/role/basic-data/index.html
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
diff --git a/modules/account/front/role/basic-data/index.js b/modules/account/front/role/basic-data/index.js
deleted file mode 100644
index 4e26906ee..000000000
--- a/modules/account/front/role/basic-data/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {}
-
-ngModule.component('vnRoleBasicData', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- role: '<'
- }
-});
diff --git a/modules/account/front/role/card/index.html b/modules/account/front/role/card/index.html
deleted file mode 100644
index 2f51f88b5..000000000
--- a/modules/account/front/role/card/index.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/modules/account/front/role/card/index.js b/modules/account/front/role/card/index.js
deleted file mode 100644
index 3c7c758ef..000000000
--- a/modules/account/front/role/card/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../../module';
-import ModuleCard from 'salix/components/module-card';
-
-class Controller extends ModuleCard {
- reload() {
- this.$http.get(`VnRoles/${this.$params.id}`)
- .then(res => this.role = res.data);
- }
-}
-
-ngModule.vnComponent('vnRoleCard', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/role/card/index.spec.js b/modules/account/front/role/card/index.spec.js
deleted file mode 100644
index 569fe487d..000000000
--- a/modules/account/front/role/card/index.spec.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import './index';
-
-describe('component vnRoleCard', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnRoleCard', {$element: null});
- }));
-
- describe('reload()', () => {
- it('should reload the controller data', () => {
- controller.$params.id = 1;
-
- $httpBackend.expectGET('VnRoles/1').respond('foo');
- controller.reload();
- $httpBackend.flush();
-
- expect(controller.role).toBe('foo');
- });
- });
-});
diff --git a/modules/account/front/role/create/index.html b/modules/account/front/role/create/index.html
deleted file mode 100644
index 77d6fc2c1..000000000
--- a/modules/account/front/role/create/index.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
diff --git a/modules/account/front/role/create/index.js b/modules/account/front/role/create/index.js
deleted file mode 100644
index 3f7fcc9cf..000000000
--- a/modules/account/front/role/create/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onSubmit() {
- return this.$.watcher.submit().then(res =>
- this.$state.go('account.role.card.basicData', {id: res.data.id})
- );
- }
-}
-
-ngModule.component('vnRoleCreate', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/role/descriptor/index.html b/modules/account/front/role/descriptor/index.html
deleted file mode 100644
index d8bf4857a..000000000
--- a/modules/account/front/role/descriptor/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
- Delete
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/role/descriptor/index.js b/modules/account/front/role/descriptor/index.js
deleted file mode 100644
index 17b585cb7..000000000
--- a/modules/account/front/role/descriptor/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import ngModule from '../../module';
-import Descriptor from 'salix/components/descriptor';
-
-class Controller extends Descriptor {
- get role() {
- return this.entity;
- }
-
- set role(value) {
- this.entity = value;
- }
-
- onDelete() {
- return this.$http.delete(`VnRoles/${this.id}`)
- .then(() => this.$state.go('account.role'))
- .then(() => this.vnApp.showSuccess(this.$t('Role removed')));
- }
-}
-
-ngModule.component('vnRoleDescriptor', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- role: '<'
- }
-});
diff --git a/modules/account/front/role/descriptor/index.spec.js b/modules/account/front/role/descriptor/index.spec.js
deleted file mode 100644
index f3b2e4763..000000000
--- a/modules/account/front/role/descriptor/index.spec.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import './index';
-
-describe('component vnRoleDescriptor', () => {
- let controller;
- let $httpBackend;
-
- let role = {id: 1, name: 'foo'};
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnRoleDescriptor', {$element: null}, {role});
- }));
-
- describe('onDelete()', () => {
- it('should delete entity and go to index', () => {
- controller.$state.go = jest.fn();
- jest.spyOn(controller.vnApp, 'showSuccess');
-
- $httpBackend.expectDELETE('VnRoles/1').respond();
- controller.onDelete();
- $httpBackend.flush();
-
- expect(controller.$state.go).toHaveBeenCalledWith('account.role');
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-});
diff --git a/modules/account/front/role/descriptor/locale/es.yml b/modules/account/front/role/descriptor/locale/es.yml
deleted file mode 100644
index 1ca512e4f..000000000
--- a/modules/account/front/role/descriptor/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-Role will be removed: El rol va a ser eliminado
-Role removed: Rol eliminado
\ No newline at end of file
diff --git a/modules/account/front/role/index.js b/modules/account/front/role/index.js
deleted file mode 100644
index 97a20d3bc..000000000
--- a/modules/account/front/role/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import './main';
-import './index/';
-import './summary';
-import './card';
-import './descriptor';
-import './search-panel';
-import './create';
-import './basic-data';
-import './subroles';
-import './inherited';
diff --git a/modules/account/front/role/index/index.html b/modules/account/front/role/index/index.html
deleted file mode 100644
index 4c4c6b0ad..000000000
--- a/modules/account/front/role/index/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/role/index/index.js b/modules/account/front/role/index/index.js
deleted file mode 100644
index 40773b23b..000000000
--- a/modules/account/front/role/index/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- preview(role) {
- this.selectedRole = role;
- this.$.summary.show();
- }
-}
-
-ngModule.component('vnRoleIndex', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/role/index/locale/es.yml b/modules/account/front/role/index/locale/es.yml
deleted file mode 100644
index 70932e983..000000000
--- a/modules/account/front/role/index/locale/es.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-New role: Nuevo rol
-View role: Ver rol
\ No newline at end of file
diff --git a/modules/account/front/role/inherited/index.html b/modules/account/front/role/inherited/index.html
deleted file mode 100644
index 83ecbbff4..000000000
--- a/modules/account/front/role/inherited/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
- {{::row.inherits.name}}
-
-
- {{::row.inherits.description}}
-
-
-
-
-
-
diff --git a/modules/account/front/role/inherited/index.js b/modules/account/front/role/inherited/index.js
deleted file mode 100644
index 5927493ee..000000000
--- a/modules/account/front/role/inherited/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- let filter = {
- where: {role: this.$params.id},
- include: {
- relation: 'inherits',
- scope: {
- fields: ['id', 'name', 'description']
- }
- }
- };
- this.$http.get('RoleRoles', {filter})
- .then(res => this.$.data = res.data);
- }
-}
-
-ngModule.component('vnRoleInherited', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/role/inherited/index.spec.js b/modules/account/front/role/inherited/index.spec.js
deleted file mode 100644
index 16b0c53b2..000000000
--- a/modules/account/front/role/inherited/index.spec.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import './index';
-
-describe('component vnRoleInherited', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnRoleInherited', {$element: null});
- }));
-
- describe('$onInit()', () => {
- it('should delete entity and go to index', () => {
- $httpBackend.expectGET('RoleRoles').respond('foo');
- controller.$onInit();
- $httpBackend.flush();
-
- expect(controller.$.data).toBe('foo');
- });
- });
-});
diff --git a/modules/account/front/role/locale/es.yml b/modules/account/front/role/locale/es.yml
deleted file mode 100644
index 159fc7f16..000000000
--- a/modules/account/front/role/locale/es.yml
+++ /dev/null
@@ -1 +0,0 @@
-Subroles: Subroles
diff --git a/modules/account/front/role/main/index.html b/modules/account/front/role/main/index.html
deleted file mode 100644
index cfef28e57..000000000
--- a/modules/account/front/role/main/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/role/main/index.js b/modules/account/front/role/main/index.js
deleted file mode 100644
index 77d15cf17..000000000
--- a/modules/account/front/role/main/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import ngModule from '../../module';
-import ModuleMain from 'salix/components/module-main';
-
-export default class Role extends ModuleMain {
- exprBuilder(param, value) {
- switch (param) {
- case 'search':
- return /^\d+$/.test(value)
- ? {id: value}
- : {or: [
- {name: {like: `%${value}%`}},
- {nickname: {like: `%${value}%`}}
- ]};
- case 'name':
- case 'description':
- return {[param]: {like: `%${value}%`}};
- }
- }
-}
-
-ngModule.vnComponent('vnRole', {
- controller: Role,
- template: require('./index.html')
-});
diff --git a/modules/account/front/role/search-panel/index.html b/modules/account/front/role/search-panel/index.html
deleted file mode 100644
index dfea9f01c..000000000
--- a/modules/account/front/role/search-panel/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/role/search-panel/index.js b/modules/account/front/role/search-panel/index.js
deleted file mode 100644
index 35da591ad..000000000
--- a/modules/account/front/role/search-panel/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import ngModule from '../../module';
-import SearchPanel from 'core/components/searchbar/search-panel';
-
-ngModule.component('vnRoleSearchPanel', {
- template: require('./index.html'),
- controller: SearchPanel
-});
diff --git a/modules/account/front/role/subroles/index.html b/modules/account/front/role/subroles/index.html
deleted file mode 100644
index eba1002b0..000000000
--- a/modules/account/front/role/subroles/index.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
- {{::row.inherits.name}}
-
-
- {{::row.inherits.description}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/account/front/role/subroles/index.js b/modules/account/front/role/subroles/index.js
deleted file mode 100644
index b7e1caaa4..000000000
--- a/modules/account/front/role/subroles/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import ngModule from '../../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- this.refresh();
- }
-
- get path() {
- return `RoleInherits`;
- }
-
- refresh() {
- let filter = {
- where: {role: this.$params.id},
- include: {
- relation: 'inherits',
- scope: {
- fields: ['id', 'name', 'description']
- }
- }
- };
- this.$http.get(this.path, {filter})
- .then(res => this.$.data = res.data);
- }
-
- onAddClick() {
- this.addData = {role: this.$params.id};
- this.$.dialog.show();
- }
-
- onAddSave() {
- return this.$http.post(this.path, this.addData)
- .then(() => this.refresh())
- .then(() => this.vnApp.showSuccess(this.$t('Role added! Changes will take a while to fully propagate.')));
- }
-
- onRemove(row) {
- return this.$http.delete(`${this.path}/${row.id}`)
- .then(() => {
- let index = this.$.data.indexOf(row);
- if (index !== -1) this.$.data.splice(index, 1);
- this.vnApp.showSuccess(this.$t('Role removed. Changes will take a while to fully propagate.'));
- });
- }
-}
-
-ngModule.component('vnRoleSubroles', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/role/subroles/index.spec.js b/modules/account/front/role/subroles/index.spec.js
deleted file mode 100644
index e7d9a4d0e..000000000
--- a/modules/account/front/role/subroles/index.spec.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import './index';
-
-describe('component vnRoleSubroles', () => {
- let controller;
- let $httpBackend;
-
- beforeEach(ngModule('account'));
-
- beforeEach(inject(($componentController, _$httpBackend_) => {
- $httpBackend = _$httpBackend_;
- controller = $componentController('vnRoleSubroles', {$element: null});
- jest.spyOn(controller.vnApp, 'showSuccess');
- }));
-
- describe('refresh()', () => {
- it('should delete entity and go to index', () => {
- $httpBackend.expectGET('RoleInherits').respond('foo');
- controller.refresh();
- $httpBackend.flush();
-
- expect(controller.$.data).toBe('foo');
- });
- });
-
- describe('onAddSave()', () => {
- it('should add a subrole', () => {
- controller.addData = {role: 'foo'};
-
- $httpBackend.expectPOST('RoleInherits', {role: 'foo'}).respond();
- $httpBackend.expectGET('RoleInherits').respond();
- controller.onAddSave();
- $httpBackend.flush();
-
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-
- describe('onRemove()', () => {
- it('should remove a subrole', () => {
- controller.$.data = [
- {id: 1, name: 'foo'},
- {id: 2, name: 'bar'}
- ];
-
- $httpBackend.expectDELETE('RoleInherits/1').respond();
- controller.onRemove(controller.$.data[0]);
- $httpBackend.flush();
-
- expect(controller.$.data).toEqual([{id: 2, name: 'bar'}]);
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
-});
diff --git a/modules/account/front/role/subroles/locale/es.yml b/modules/account/front/role/subroles/locale/es.yml
deleted file mode 100644
index 170882405..000000000
--- a/modules/account/front/role/subroles/locale/es.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-Role added! Changes will take a while to fully propagate.: >
- ¡Rol añadido! Los cambios tardaran un tiempo en propagarse completamente.
-Role removed. Changes will take a while to fully propagate.: >
- Rol eliminado. Los cambios tardaran un tiempo en propagarse completamente.
diff --git a/modules/account/front/role/summary/index.html b/modules/account/front/role/summary/index.html
deleted file mode 100644
index f7971190c..000000000
--- a/modules/account/front/role/summary/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
- {{summary.name}}
-
-
- Basic data
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/modules/account/front/role/summary/index.js b/modules/account/front/role/summary/index.js
deleted file mode 100644
index 6c649a68f..000000000
--- a/modules/account/front/role/summary/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import ngModule from '../../module';
-import Component from 'core/lib/component';
-
-class Controller extends Component {
- set role(value) {
- this._role = value;
- this.$.summary = null;
- if (!value) return;
- this.$http.get(`VnRoles/${value.id}`)
- .then(res => this.$.summary = res.data);
- }
-
- get role() {
- return this._role;
- }
-}
-
-ngModule.component('vnRoleSummary', {
- template: require('./index.html'),
- controller: Controller,
- bindings: {
- role: '<'
- }
-});
diff --git a/modules/account/front/roles/index.html b/modules/account/front/roles/index.html
deleted file mode 100644
index 8c8583929..000000000
--- a/modules/account/front/roles/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
- {{::row.role.name}}
-
-
- {{::row.role.description}}
-
-
-
-
-
-
diff --git a/modules/account/front/roles/index.js b/modules/account/front/roles/index.js
deleted file mode 100644
index 0982dcf10..000000000
--- a/modules/account/front/roles/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- $onInit() {
- let filter = {
- where: {
- prindicpalType: 'USER',
- principalId: this.$params.id
- },
- include: {
- relation: 'role',
- scope: {
- fields: ['id', 'name', 'description']
- }
- }
- };
- this.$http.get('RoleMappings', {filter})
- .then(res => this.$.data = res.data);
- }
-}
-
-ngModule.component('vnUserRoles', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/routes.json b/modules/account/front/routes.json
index d7845090b..9eadf2af2 100644
--- a/modules/account/front/routes.json
+++ b/modules/account/front/routes.json
@@ -7,31 +7,6 @@
"menus": {
"main": [
{"state": "account.index", "icon": "face"},
- {"state": "account.role", "icon": "group"},
- {"state": "account.alias", "icon": "email"},
- {"state": "account.accounts", "icon": "accessibility"},
- {"state": "account.ldap", "icon": "account_tree"},
- {"state": "account.samba", "icon": "preview"},
- {"state": "account.acl", "icon": "check"},
- {"state": "account.connections", "icon": "share"}
- ],
- "card": [
- {"state": "account.card.basicData", "icon": "settings"},
- {"state": "account.card.roles", "icon": "group"},
- {"state": "account.card.mailForwarding", "icon": "forward"},
- {"state": "account.card.aliases", "icon": "email"},
- {"state": "account.card.privileges", "icon": "badge"},
- {"state": "account.card.log", "icon": "history"}
- ],
- "role": [
- {"state": "account.role.card.basicData", "icon": "settings"},
- {"state": "account.role.card.subroles", "icon": "groups"},
- {"state": "account.role.card.inherited", "icon": "account_tree"},
- {"state": "account.role.card.log", "icon": "history"}
- ],
- "alias": [
- {"state": "account.alias.card.basicData", "icon": "settings"},
- {"state": "account.alias.card.users", "icon": "groups"}
]
},
"keybindings": [
@@ -50,224 +25,6 @@
"state": "account.index",
"component": "vn-user-index",
"description": "Users"
- },
- {
- "url": "/create",
- "state": "account.create",
- "component": "vn-user-create",
- "description": "New user"
- },
- {
- "url": "/:id",
- "state": "account.card",
- "component": "vn-user-card",
- "abstract": true,
- "description": "Detail"
- },
- {
- "url": "/summary",
- "state": "account.card.summary",
- "component": "vn-user-summary",
- "description": "Summary",
- "params": {
- "user": "$ctrl.user"
- }
- },
- {
- "url": "/basic-data?emailConfirmed",
- "state": "account.card.basicData",
- "component": "vn-user-basic-data",
- "description": "Basic data",
- "params": {
- "user": "$ctrl.user"
- }
- },
- {
- "url" : "/log",
- "state": "account.card.log",
- "component": "vn-user-log",
- "description": "Log"
- },
- {
- "url" : "/log",
- "state": "account.role.card.log",
- "component": "vn-role-log",
- "description": "Log"
- },
- {
- "url": "/roles",
- "state": "account.card.roles",
- "component": "vn-user-roles",
- "description": "Inherited roles"
- },
- {
- "url": "/mail-forwarding",
- "state": "account.card.mailForwarding",
- "component": "vn-user-mail-forwarding",
- "description": "Mail forwarding"
- },
- {
- "url": "/aliases",
- "state": "account.card.aliases",
- "component": "vn-user-aliases",
- "description": "Mail aliases"
- },
- {
- "url": "/privileges",
- "state": "account.card.privileges",
- "component": "vn-user-privileges",
- "description": "Privileges",
- "params": {
- "user": "$ctrl.user"
- }
- },
- {
- "url": "/role?q",
- "state": "account.role",
- "component": "vn-role",
- "description": "Roles",
- "acl": ["it"]
- },
- {
- "url": "/create",
- "state": "account.role.create",
- "component": "vn-role-create",
- "description": "New role",
- "acl": ["it"]
- },
- {
- "url": "/:id",
- "state": "account.role.card",
- "component": "vn-role-card",
- "abstract": true,
- "description": "Detail"
- },
- {
- "url": "/summary",
- "state": "account.role.card.summary",
- "component": "vn-role-summary",
- "description": "Summary",
- "params": {
- "role": "$ctrl.role"
- },
- "acl": ["it"]
- },
- {
- "url": "/basic-data",
- "state": "account.role.card.basicData",
- "component": "vn-role-basic-data",
- "description": "Basic data",
- "params": {
- "role": "$ctrl.role"
- },
- "acl": ["it"]
- },
- {
- "url": "/subroles",
- "state": "account.role.card.subroles",
- "component": "vn-role-subroles",
- "description": "Subroles",
- "acl": ["it"]
- },
- {
- "url": "/inherited",
- "state": "account.role.card.inherited",
- "component": "vn-role-inherited",
- "description": "Inherited roles",
- "acl": ["it"]
- },
- {
- "url": "/alias?q",
- "state": "account.alias",
- "component": "vn-alias",
- "description": "Mail aliases"
- },
- {
- "url": "/create",
- "state": "account.alias.create",
- "component": "vn-alias-create",
- "description": "New alias"
- },
- {
- "url": "/:id",
- "state": "account.alias.card",
- "component": "vn-alias-card",
- "abstract": true,
- "description": "Detail"
- },
- {
- "url": "/summary",
- "state": "account.alias.card.summary",
- "component": "vn-alias-summary",
- "description": "Summary",
- "params": {
- "alias": "$ctrl.alias"
- }
- },
- {
- "url": "/basic-data",
- "state": "account.alias.card.basicData",
- "component": "vn-alias-basic-data",
- "description": "Basic data",
- "params": {
- "alias": "$ctrl.alias"
- }
- },
- {
- "url": "/users",
- "state": "account.alias.card.users",
- "component": "vn-alias-users",
- "description": "Users",
- "acl": ["it"]
- },
- {
- "url": "/accounts",
- "state": "account.accounts",
- "component": "vn-account-accounts",
- "description": "Accounts",
- "acl": ["sysadmin"]
- },
- {
- "url": "/ldap",
- "state": "account.ldap",
- "component": "vn-account-ldap",
- "description": "LDAP",
- "acl": ["sysadmin"]
- },
- {
- "url": "/samba",
- "state": "account.samba",
- "component": "vn-account-samba",
- "description": "Samba",
- "acl": ["sysadmin"]
- },
- {
- "url": "/acl?q",
- "state": "account.acl",
- "component": "vn-acl-component",
- "description": "ACLs",
- "acl": ["developer"]
- },
- {
- "url": "/create",
- "state": "account.acl.create",
- "component": "vn-acl-create",
- "description": "New ACL",
- "acl": ["developer"]
- },
- {
- "url": "/:id/edit",
- "state": "account.acl.edit",
- "component": "vn-acl-create",
- "description": "Edit ACL",
- "acl": ["developer"]
- },
- {
- "url": "/connections",
- "state": "account.connections",
- "component": "vn-connections",
- "description": "Connections",
- "acl": ["developer"]
}
]
}
diff --git a/modules/account/front/samba/index.html b/modules/account/front/samba/index.html
deleted file mode 100644
index 0186cac7c..000000000
--- a/modules/account/front/samba/index.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
-
diff --git a/modules/account/front/samba/index.js b/modules/account/front/samba/index.js
deleted file mode 100644
index 6a4969893..000000000
--- a/modules/account/front/samba/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-export default class Controller extends Section {
- onTestConection() {
- this.$http.get(`SambaConfigs/test`)
- .then(() => this.vnApp.showSuccess(this.$t('Samba connection established!')));
- }
-}
-
-ngModule.component('vnAccountSamba', {
- template: require('./index.html'),
- controller: Controller
-});
diff --git a/modules/account/front/samba/locale/es.yml b/modules/account/front/samba/locale/es.yml
deleted file mode 100644
index efa3b1597..000000000
--- a/modules/account/front/samba/locale/es.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-Enable synchronization: Habilitar sincronización
-Domain controller: Controlador de dominio
-AD domain: Dominio AD
-AD user: Usuario AD
-AD password: Contraseña AD
-User DN (without domain part): DN usuarios (sin la parte del dominio)
-Verify certificate: Verificar certificado
-Test connection: Probar conexión
-Samba connection established!: ¡Conexión con Samba establecida!
diff --git a/modules/account/front/search-panel/index.html b/modules/account/front/search-panel/index.html
deleted file mode 100644
index a539d9657..000000000
--- a/modules/account/front/search-panel/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
diff --git a/modules/account/front/search-panel/index.js b/modules/account/front/search-panel/index.js
deleted file mode 100644
index fff3bf7b9..000000000
--- a/modules/account/front/search-panel/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import ngModule from '../module';
-import SearchPanel from 'core/components/searchbar/search-panel';
-
-ngModule.component('vnUserSearchPanel', {
- template: require('./index.html'),
- controller: SearchPanel
-});
diff --git a/modules/account/front/summary/index.html b/modules/account/front/summary/index.html
index 41632aef6..f3c11f25f 100644
--- a/modules/account/front/summary/index.html
+++ b/modules/account/front/summary/index.html
@@ -1,6 +1,6 @@
\ No newline at end of file
+
diff --git a/modules/account/front/user-log/index.html b/modules/account/front/user-log/index.html
deleted file mode 100644
index 5a77ed7b9..000000000
--- a/modules/account/front/user-log/index.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/modules/account/front/user-log/index.js b/modules/account/front/user-log/index.js
deleted file mode 100644
index 7cd0bb378..000000000
--- a/modules/account/front/user-log/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import ngModule from '../module';
-import Section from 'salix/components/section';
-
-ngModule.vnComponent('vnUserLog', {
- template: require('./index.html'),
- controller: Section,
-});
diff --git a/modules/client/back/models/client-sample.js b/modules/client/back/models/client-sample.js
index 5e4393042..b8ab6cff4 100644
--- a/modules/client/back/models/client-sample.js
+++ b/modules/client/back/models/client-sample.js
@@ -27,7 +27,7 @@ module.exports = Self => {
// Renew mandate
if (mandate) {
const mandateType = await models.MandateType.findOne({
- where: {name: mandate.type}
+ where: {code: mandate.type}
});
const oldMandate = await models.Mandate.findOne({
diff --git a/modules/client/back/models/mandate-type.json b/modules/client/back/models/mandate-type.json
index ec189f089..b481e7c72 100644
--- a/modules/client/back/models/mandate-type.json
+++ b/modules/client/back/models/mandate-type.json
@@ -12,7 +12,7 @@
"type": "number",
"description": "Identifier"
},
- "name": {
+ "code": {
"type": "string"
}
}
diff --git a/modules/client/front/balance/create/index.js b/modules/client/front/balance/create/index.js
index 9113d7605..f4ff0e3aa 100644
--- a/modules/client/front/balance/create/index.js
+++ b/modules/client/front/balance/create/index.js
@@ -23,6 +23,7 @@ class Controller extends Dialog {
}
set clientFk(value) {
+ if (!value) return;
this.receipt.clientFk = value;
const filter = {
@@ -32,6 +33,7 @@ class Controller extends Dialog {
}
};
+ this.getAmountPaid();
this.$http.get(`Clients/findOne`, {filter})
.then(res => {
this.receipt.email = res.data.email;
@@ -50,7 +52,6 @@ class Controller extends Dialog {
set companyFk(value) {
this.receipt.companyFk = value;
- this.getAmountPaid();
}
set description(value) {
@@ -152,7 +153,7 @@ class Controller extends Dialog {
getAmountPaid() {
const filter = {
where: {
- clientFk: this.$params.id,
+ clientFk: this.$params.id ?? this.clientFk,
companyFk: this.receipt.companyFk
}
};
@@ -210,8 +211,8 @@ ngModule.vnComponent('vnClientBalanceCreate', {
payed: '',
bankFk: '',
amountPaid: '',
+ clientFk: '',
companyFk: '',
description: '',
- clientFk: ''
}
});
diff --git a/modules/client/front/mandate/index.html b/modules/client/front/mandate/index.html
index e2f2cd27b..1ee18737f 100644
--- a/modules/client/front/mandate/index.html
+++ b/modules/client/front/mandate/index.html
@@ -26,7 +26,7 @@
{{::mandate.id}}
{{::mandate.company.code}}
- {{::mandate.mandateType.name}}
+ {{::mandate.mandateType.code}}
{{::mandate.created | date:'dd/MM/yyyy HH:mm' | dashIfEmpty}}
{{::mandate.finished | date:'dd/MM/yyyy HH:mm' | dashIfEmpty}}
diff --git a/modules/client/front/mandate/index.js b/modules/client/front/mandate/index.js
index 114e2b570..605ae08cc 100644
--- a/modules/client/front/mandate/index.js
+++ b/modules/client/front/mandate/index.js
@@ -9,7 +9,7 @@ class Controller extends Section {
{
relation: 'mandateType',
scope: {
- fields: ['id', 'name']
+ fields: ['id', 'code']
}
}, {
relation: 'company',
diff --git a/modules/entry/back/methods/entry/getBuysCsv.js b/modules/entry/back/methods/entry/getBuysCsv.js
new file mode 100644
index 000000000..4bd246fa0
--- /dev/null
+++ b/modules/entry/back/methods/entry/getBuysCsv.js
@@ -0,0 +1,44 @@
+const {toCSV} = require('vn-loopback/util/csv');
+const {flatten} = require('vn-loopback/util/flatten');
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('getBuysCsv', {
+ description: 'Returns buys for one entry in CSV file format',
+ accessType: 'READ',
+ accepts: [{
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The entry id',
+ http: {source: 'path'}
+ }
+ ],
+ returns: [
+ {
+ arg: 'body',
+ type: 'file',
+ root: true
+ }, {
+ arg: 'Content-Type',
+ type: 'String',
+ http: {target: 'header'}
+ }, {
+ arg: 'Content-Disposition',
+ type: 'String',
+ http: {target: 'header'}
+ }
+ ],
+ http: {
+ path: `/:id/getBuysCsv`,
+ verb: 'GET'
+ }
+ });
+
+ Self.getBuysCsv = async(ctx, id, options) => {
+ const data = await Self.getBuys(ctx, id, null, options);
+ if (!data.length) throw new UserError('The entry has no lines or does not exist');
+ const dataFlatted = flatten(data);
+ return [toCSV(dataFlatted), 'text/csv', `inline; filename="buys-${id}.csv"`];
+ };
+};
diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js
index b11d64415..8ca79f531 100644
--- a/modules/entry/back/models/entry.js
+++ b/modules/entry/back/models/entry.js
@@ -3,6 +3,7 @@ module.exports = Self => {
require('../methods/entry/filter')(Self);
require('../methods/entry/getEntry')(Self);
require('../methods/entry/getBuys')(Self);
+ require('../methods/entry/getBuysCsv')(Self);
require('../methods/entry/importBuys')(Self);
require('../methods/entry/importBuysPreview')(Self);
require('../methods/entry/lastItemBuys')(Self);
diff --git a/modules/invoiceIn/back/methods/invoice-in/filter.js b/modules/invoiceIn/back/methods/invoice-in/filter.js
index 8a884e211..936f7bb6c 100644
--- a/modules/invoiceIn/back/methods/invoice-in/filter.js
+++ b/modules/invoiceIn/back/methods/invoice-in/filter.js
@@ -138,9 +138,9 @@ module.exports = Self => {
? {'ii.id': value}
: {'s.name': {like: `%${value}%`}};
case 'from':
- return {'ii.created': {gte: value}};
+ return {'ii.issued': {gte: value}};
case 'to':
- return {'ii.created': {lte: value}};
+ return {'ii.issued': {lte: value}};
case 'fi':
return {'s.nif': value};
case 'account':
@@ -173,7 +173,6 @@ module.exports = Self => {
const stmt = new ParameterizedSQL(
`SELECT
ii.id,
- ii.serialNumber,
ii.serial,
ii.issued,
ii.isBooked,
diff --git a/modules/invoiceIn/back/methods/invoice-in/getSerial.js b/modules/invoiceIn/back/methods/invoice-in/getSerial.js
index dcc1fbc3c..29c7cae2f 100644
--- a/modules/invoiceIn/back/methods/invoice-in/getSerial.js
+++ b/modules/invoiceIn/back/methods/invoice-in/getSerial.js
@@ -46,7 +46,7 @@ module.exports = Self => {
}
});
- filter = mergeFilters(args.filter, {where});
+ const filter = mergeFilters(args.filter, {where});
const stmt = new ParameterizedSQL(
`SELECT i.serial, SUM(IF(i.isBooked, 0,1)) pending, COUNT(*) total
diff --git a/modules/invoiceIn/back/methods/invoice-in/getTotals.js b/modules/invoiceIn/back/methods/invoice-in/getTotals.js
index 7bef9f7e9..c4e73abc2 100644
--- a/modules/invoiceIn/back/methods/invoice-in/getTotals.js
+++ b/modules/invoiceIn/back/methods/invoice-in/getTotals.js
@@ -27,10 +27,12 @@ module.exports = Self => {
const [result] = await Self.rawSql(`
SELECT iit.*,
- SUM(iidd.amount) totalDueDay
+ SUM(iidd.amount) totalDueDay,
+ SUM(iidd.foreignValue) totalDueDayForeignValue
FROM vn.invoiceIn ii
LEFT JOIN (
SELECT SUM(iit.taxableBase) totalTaxableBase,
+ SUM(iit.foreignValue) totalTaxableBaseForeignValue,
CAST(
SUM(IFNULL(iit.taxableBase * (1 + (ti.PorcentajeIva / 100)), iit.taxableBase))
AS DECIMAL(10, 2)
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
index ff2164783..48310b32a 100644
--- a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
@@ -47,29 +47,6 @@ describe('InvoiceIn filter()', () => {
}
});
- it('should return the invoice in matching the serial number', async() => {
- const tx = await models.InvoiceIn.beginTransaction({});
- const options = {transaction: tx};
-
- try {
- const ctx = {
- args: {
- serialNumber: '1002',
- }
- };
-
- const result = await models.InvoiceIn.filter(ctx, {}, options);
-
- expect(result.length).toEqual(1);
- expect(result[0].serialNumber).toEqual(1002);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
- });
-
it('should return the invoice in matching the account', async() => {
const tx = await models.InvoiceIn.beginTransaction({});
const options = {transaction: tx};
@@ -158,7 +135,7 @@ describe('InvoiceIn filter()', () => {
const result = await models.InvoiceIn.filter(ctx, {}, options);
- expect(result.length).toEqual(5);
+ expect(result.length).toEqual(6);
await tx.rollback();
} catch (e) {
diff --git a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
index 63b00fe38..5526d214a 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
@@ -75,7 +75,7 @@ module.exports = Self => {
AND c.isTaxDataChecked
AND c.isActive
AND NOT t.isDeleted
- GROUP BY c.id, IF(c.hasToInvoiceByAddress, a.id, TRUE)
+ GROUP BY IF(c.hasToInvoiceByAddress, a.id, c.id)
HAVING SUM(t.totalWithVat) > 0;`;
const addresses = await Self.rawSql(query, [
diff --git a/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js b/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
index 530b02353..2c44cef34 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/invoiceClient.js
@@ -28,6 +28,11 @@ module.exports = Self => {
type: 'number',
description: 'The company id to invoice',
required: true
+ }, {
+ arg: 'serialType',
+ type: 'string',
+ description: 'Invoice serial number type (see vn.invoiceOutSerial.type enum)',
+ required: true
}
],
returns: {
@@ -39,12 +44,10 @@ module.exports = Self => {
verb: 'POST'
}
});
-
Self.invoiceClient = async(ctx, options) => {
const args = ctx.args;
const models = Self.app.models;
- options = typeof options == 'object'
- ? Object.assign({}, options) : {};
+ options = typeof options === 'object' ? {...options} : {};
options.userId = ctx.req.accessToken.userId;
let tx;
@@ -74,10 +77,9 @@ module.exports = Self => {
], options);
}
- const invoiceType = 'G';
const invoiceId = await models.Ticket.makeInvoice(
ctx,
- invoiceType,
+ args.serialType,
args.companyFk,
args.invoiceDate,
null,
diff --git a/modules/invoiceOut/back/methods/invoiceOut/refund.js b/modules/invoiceOut/back/methods/invoiceOut/refund.js
index 1b7ccc1e4..4f43a7a84 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/refund.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/refund.js
@@ -43,7 +43,7 @@ module.exports = Self => {
const tickets = await models.Ticket.find(filter, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
- const refundedTickets = await models.Ticket.refund(ctx, ticketsIds, withWarehouse, myOptions);
+ const refundedTickets = await models.Ticket.cloneAll(ctx, ticketsIds, withWarehouse, true, myOptions);
if (tx) await tx.commit();
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js
new file mode 100644
index 000000000..470690c5a
--- /dev/null
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js
@@ -0,0 +1,75 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('InvoiceOut clientsToInvoice()', () => {
+ const userId = 1;
+ const clientId = 1101;
+ const companyFk = 442;
+ const maxShipped = new Date();
+ maxShipped.setMonth(11);
+ maxShipped.setDate(31);
+ maxShipped.setHours(23, 59, 59, 999);
+ const invoiceDate = new Date();
+ const activeCtx = {
+ getLocale: () => {
+ return 'en';
+ },
+ accessToken: {userId: userId},
+ __: value => {
+ return value;
+ },
+ headers: {origin: 'http://localhost'}
+ };
+ const ctx = {req: activeCtx};
+
+ it('should return a list of clients to invoice', async() => {
+ spyOn(models.InvoiceOut, 'rawSql').and.callFake(query => {
+ if (query.includes('ticketPackaging_add'))
+ return Promise.resolve(true);
+ else if (query.includes('SELECT c.id clientId')) {
+ return Promise.resolve([
+ {
+ clientId: clientId,
+ clientName: 'Test Client',
+ id: 1,
+ nickname: 'Address 1'
+ }
+ ]);
+ }
+ });
+
+ const tx = await models.InvoiceOut.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const addresses = await models.InvoiceOut.clientsToInvoice(
+ ctx, clientId, invoiceDate, maxShipped, companyFk, options);
+
+ expect(addresses.length).toBeGreaterThan(0);
+ expect(addresses[0].clientId).toBe(clientId);
+ expect(addresses[0].clientName).toBe('Test Client');
+ expect(addresses[0].id).toBe(1);
+ expect(addresses[0].nickname).toBe('Address 1');
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should handle errors and rollback transaction', async() => {
+ spyOn(models.InvoiceOut, 'rawSql').and.callFake(() => {
+ return Promise.reject(new Error('Test Error'));
+ });
+
+ const tx = await models.InvoiceOut.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ await models.InvoiceOut.clientsToInvoice(ctx, clientId, invoiceDate, maxShipped, companyFk, options);
+ } catch (e) {
+ expect(e.message).toBe('Test Error');
+ await tx.rollback();
+ }
+ });
+});
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/invoiceClient.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/invoiceClient.spec.js
index 0faa8fe1a..c731912ec 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/specs/invoiceClient.spec.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/invoiceClient.spec.js
@@ -1,16 +1,16 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('InvoiceOut invoiceClient()', () => {
const userId = 1;
const clientId = 1101;
- const addressId = 121;
+ const addressFk = 121;
const companyFk = 442;
const minShipped = Date.vnNew();
minShipped.setFullYear(minShipped.getFullYear() - 1);
minShipped.setMonth(1);
minShipped.setDate(1);
minShipped.setHours(0, 0, 0, 0);
- const invoiceSerial = 'A';
const activeCtx = {
getLocale: () => {
return 'en';
@@ -23,9 +23,14 @@ describe('InvoiceOut invoiceClient()', () => {
};
const ctx = {req: activeCtx};
+ beforeAll(() => {
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
- it('should make a global invoicing', async() => {
- spyOn(models.InvoiceOut, 'makePdf').and.returnValue(new Promise(resolve => resolve(true)));
+ it('should make a global invoicing by address and verify billing status', async() => {
+ spyOn(models.InvoiceOut, 'makePdf').and.returnValue(Promise.resolve(true));
spyOn(models.InvoiceOut, 'invoiceEmail');
const tx = await models.InvoiceOut.beginTransaction({});
@@ -34,20 +39,96 @@ describe('InvoiceOut invoiceClient()', () => {
try {
ctx.args = {
clientId: clientId,
- addressId: addressId,
+ addressId: addressFk,
invoiceDate: Date.vnNew(),
maxShipped: Date.vnNew(),
companyFk: companyFk,
- minShipped: minShipped
+ serialType: 'global'
};
+
const invoiceOutId = await models.InvoiceOut.invoiceClient(ctx, options);
+
const invoiceOut = await models.InvoiceOut.findById(invoiceOutId, null, options);
- const [firstTicket] = await models.Ticket.find({
+
+ expect(invoiceOutId).toBeGreaterThan(0);
+
+ const allClientTickets = await models.Ticket.find({
+ where: {
+ clientFk: clientId,
+ or: [
+ {refFk: null},
+ {refFk: invoiceOut.ref}
+ ]
+ }
+ }, options);
+
+ const billedTickets = await models.Ticket.find({
where: {refFk: invoiceOut.ref}
}, options);
+ const allBilledTicketsHaveCorrectAddress = billedTickets.every(ticket => ticket.addressFk === addressFk);
+
+ expect(allBilledTicketsHaveCorrectAddress).toBe(true);
+
+ const addressTickets = allClientTickets.filter(ticket => ticket.addressFk === addressFk);
+
+ const allAddressTicketsBilled = addressTickets.every(ticket => ticket.refFk === invoiceOut.ref);
+
+ expect(allAddressTicketsBilled).toBe(true);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should invoice all tickets regardless of address when hasToInvoiceByAddress is false', async() => {
+ spyOn(models.InvoiceOut, 'makePdf').and.returnValue(Promise.resolve(true));
+ spyOn(models.InvoiceOut, 'invoiceEmail');
+
+ const tx = await models.InvoiceOut.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const client = await models.Client.findById(clientId, null, options);
+ await client.updateAttribute('hasToInvoiceByAddress', false, options);
+
+ ctx.args = {
+ clientId: clientId,
+ invoiceDate: Date.vnNew(),
+ maxShipped: Date.vnNew(),
+ companyFk: companyFk,
+ serialType: 'global'
+ };
+
+ const invoiceOutId = await models.InvoiceOut.invoiceClient(ctx, options);
+
+ const invoiceOut = await models.InvoiceOut.findById(invoiceOutId, null, options);
+
expect(invoiceOutId).toBeGreaterThan(0);
- expect(firstTicket.refFk).toContain(invoiceSerial);
+
+ const allClientTickets = await models.Ticket.find({
+ where: {
+ clientFk: clientId,
+ or: [
+ {refFk: null},
+ {refFk: invoiceOut.ref}
+ ]
+ }
+ }, options);
+
+ const billedTickets = await models.Ticket.find({
+ where: {refFk: invoiceOut.ref}
+ }, options);
+
+ const allTicketsBilled = allClientTickets.every(ticket => ticket.refFk === invoiceOut.ref);
+
+ expect(allTicketsBilled).toBe(true);
+
+ const billedAddresses = new Set(billedTickets.map(ticket => ticket.addressFk));
+
+ expect(billedAddresses.size).toBeGreaterThan(1);
await tx.rollback();
} catch (e) {
diff --git a/modules/invoiceOut/back/methods/invoiceOut/transferInvoice.js b/modules/invoiceOut/back/methods/invoiceOut/transferInvoice.js
index 0c86e5810..c31f381d9 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/transferInvoice.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/transferInvoice.js
@@ -82,20 +82,12 @@ module.exports = Self => {
myOptions.transaction = tx;
}
try {
- const filterRef = {where: {refFk: refFk}};
- const tickets = await models.Ticket.find(filterRef, myOptions);
+ const tickets = await models.Ticket.find({where: {refFk}}, myOptions);
const ticketsIds = tickets.map(ticket => ticket.id);
- const refundTickets = await models.Ticket.refund(ctx, ticketsIds, null, myOptions);
+ const refundTickets = await models.Ticket.cloneAll(ctx, ticketsIds, false, true, myOptions);
- const filterTicket = {where: {ticketFk: {inq: ticketsIds}}};
+ const clonedTickets = await models.Ticket.cloneAll(ctx, ticketsIds, false, false, myOptions);
- const services = await models.TicketService.find(filterTicket, myOptions);
- const servicesIds = services.map(service => service.id);
-
- const sales = await models.Sale.find(filterTicket, myOptions);
- const salesIds = sales.map(sale => sale.id);
-
- const clonedTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, false, myOptions);
const clonedTicketIds = [];
for (const clonedTicket of clonedTickets) {
diff --git a/modules/invoiceOut/back/models/invoice-out-serial.json b/modules/invoiceOut/back/models/invoice-out-serial.json
index 912269fd7..30e1f1b39 100644
--- a/modules/invoiceOut/back/models/invoice-out-serial.json
+++ b/modules/invoiceOut/back/models/invoice-out-serial.json
@@ -20,6 +20,9 @@
},
"isCEE": {
"type": "boolean"
+ },
+ "type": {
+ "type": "string"
}
},
"relations": {
@@ -35,4 +38,4 @@
"principalId": "$everyone",
"permission": "ALLOW"
}]
-}
\ No newline at end of file
+}
diff --git a/modules/invoiceOut/front/descriptor-menu/index.html b/modules/invoiceOut/front/descriptor-menu/index.html
index da04c8e72..335ab87cc 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.html
+++ b/modules/invoiceOut/front/descriptor-menu/index.html
@@ -88,28 +88,7 @@
translate>
Show CITES letter
-
- Refund...
-
-
-
- with warehouse
-
-
- without warehouse
-
-
-
-
+
{
- 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(',')
- }));
- if (refundTickets.length == 1)
- this.$state.go('ticket.card.sale', {id: refundTickets[0]});
- });
- }
-
transferInvoice() {
const params = {
id: this.invoiceOut.id,
diff --git a/modules/invoiceOut/front/descriptor-menu/index.spec.js b/modules/invoiceOut/front/descriptor-menu/index.spec.js
index d2ccfa117..a22ca7c2a 100644
--- a/modules/invoiceOut/front/descriptor-menu/index.spec.js
+++ b/modules/invoiceOut/front/descriptor-menu/index.spec.js
@@ -105,17 +105,4 @@ describe('vnInvoiceOutDescriptorMenu', () => {
expect(controller.vnApp.showMessage).toHaveBeenCalled();
});
});
-
- describe('refundInvoiceOut()', () => {
- it('should make a query and show a success message', () => {
- jest.spyOn(controller.vnApp, 'showSuccess');
- const params = {ref: controller.invoiceOut.ref};
-
- $httpBackend.expectPOST(`InvoiceOuts/refund`, params).respond([{id: 1}, {id: 2}]);
- controller.refundInvoiceOut();
- $httpBackend.flush();
-
- expect(controller.vnApp.showSuccess).toHaveBeenCalled();
- });
- });
});
diff --git a/modules/item/back/methods/fixed-price/filter.js b/modules/item/back/methods/fixed-price/filter.js
index 9c91886c1..edc804dc4 100644
--- a/modules/item/back/methods/fixed-price/filter.js
+++ b/modules/item/back/methods/fixed-price/filter.js
@@ -1,4 +1,3 @@
-
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
const buildFilter = require('vn-loopback/util/filter').buildFilter;
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
@@ -134,7 +133,7 @@ module.exports = Self => {
const stmts = [];
const stmt = new ParameterizedSQL(`
- SELECT fp.id,
+ SELECT DISTINCT fp.id,
fp.itemFk,
fp.warehouseFk,
fp.rate2,
diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js
index 33b37d8a4..8ef51a0d1 100644
--- a/modules/monitor/back/methods/sales-monitor/salesFilter.js
+++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js
@@ -238,51 +238,8 @@ module.exports = Self => {
stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`);
- // Get client debt balance
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.clientGetDebt');
- stmts.push(`
- CREATE TEMPORARY TABLE tmp.clientGetDebt
- (PRIMARY KEY (clientFk))
- ENGINE = MEMORY
- SELECT DISTINCT clientFk FROM tmp.filter`);
-
- stmt = new ParameterizedSQL('CALL client_getDebt(?)', [args.to]);
- stmts.push(stmt);
- stmts.push('DROP TEMPORARY TABLE tmp.clientGetDebt');
-
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.tickets');
stmt = new ParameterizedSQL(`
- CREATE TEMPORARY TABLE tmp.tickets
- (PRIMARY KEY (id))
- ENGINE = MEMORY
- SELECT f.*, r.risk AS debt
- FROM tmp.filter f
- LEFT JOIN tmp.risk r ON f.clientFk = r.clientFk`);
- stmts.push(stmt);
-
- // Sum risk to future
- stmts.push(`SET @client:= 0`);
- stmts.push('SET @risk := 0');
- stmts.push(`
- UPDATE tmp.tickets
- SET debt = IF(@client <> @client:= clientFk,
- -totalWithVat + @risk:= - debt + totalWithVat,
- -totalWithVat + @risk:= @risk + totalWithVat
- )
- ORDER BY clientFk, shipped DESC
- `);
-
- // Remove positive risks
- stmts.push(`
- UPDATE tmp.tickets t
- SET debt = 0
- WHERE t.debt + t.credit >= 0
- `);
-
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems');
-
- stmt = new ParameterizedSQL(`
- CREATE TEMPORARY TABLE tmp.sale_getProblems
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
(INDEX (ticketFk))
ENGINE = MEMORY
SELECT f.id ticketFk, f.clientFk, f.warehouseFk, f.shipped
@@ -294,36 +251,30 @@ module.exports = Self => {
stmts.push('CALL ticket_getProblems(FALSE)');
- stmts.push(`
- INSERT INTO tmp.ticket_problems (ticketFk, risk, totalProblems)
- SELECT t.id, t.debt + t.credit AS risk, 1
- FROM tmp.tickets t
- WHERE (t.debt + t.credit) < 0
- ON DUPLICATE KEY UPDATE
- risk = t.debt + t.credit, totalProblems = totalProblems + 1
- `);
-
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.sale_getWarnings');
-
stmt = new ParameterizedSQL(`
- CREATE TEMPORARY TABLE tmp.sale_getWarnings
- (INDEX (ticketFk, agencyModeFk))
- ENGINE = MEMORY
- SELECT f.id ticketFk, f.agencyModeFk
- FROM tmp.filter f`);
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getWarnings
+ (INDEX (ticketFk, agencyModeFk))
+ ENGINE = MEMORY
+ SELECT f.id ticketFk, f.agencyModeFk
+ FROM tmp.filter f
+ `);
stmts.push(stmt);
stmts.push('CALL ticket_getWarnings()');
stmt = new ParameterizedSQL(`
- SELECT t.*,
- tp.*,
- ((tp.risk) + cc.riskTolerance < 0) AS hasHighRisk,
- tw.*
- FROM tmp.tickets t
- LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = t.id
- LEFT JOIN tmp.ticket_warnings tw ON tw.ticketFk = t.id
- JOIN clientConfig cc`);
+ UPDATE tmp.ticket_problems
+ SET risk = IF(hasRisk, risk, 0)
+ `);
+ stmts.push(stmt);
+
+ stmt = new ParameterizedSQL(`
+ SELECT *
+ FROM tmp.filter f
+ LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id
+ LEFT JOIN tmp.ticket_warnings tw ON tw.ticketFk = f.id
+ `);
+ stmts.push(stmt);
const hasProblems = args.problems;
if (hasProblems != undefined && (!args.from && !args.to))
@@ -359,23 +310,23 @@ module.exports = Self => {
switch (param) {
case 'search':
return /^\d+$/.test(value)
- ? {'t.id': {inq: value}}
- : {'t.nickname': {like: `%${value}%`}};
+ ? {'f.id': {inq: value}}
+ : {'f.nickname': {like: `%${value}%`}};
case 'nickname':
- return {'t.nickname': {like: `%${value}%`}};
+ return {'f.nickname': {like: `%${value}%`}};
case 'refFk':
- return {'t.refFk': value};
+ return {'f.refFk': value};
case 'provinceFk':
- return {'t.provinceFk': value};
+ return {'f.provinceFk': value};
case 'stateFk':
- return {'t.stateFk': value};
+ return {'f.stateFk': value};
case 'alertLevel':
- return {'t.alertLevel': value};
+ return {'f.alertLevel': value};
case 'pending':
if (value) {
- return {'t.alertLevelCode': {inq: [
+ return {'f.alertLevelCode': {inq: [
'FIXING',
'FREE',
'NOT_READY',
@@ -385,7 +336,7 @@ module.exports = Self => {
'WAITING_FOR_PAYMENT'
]}};
} else {
- return {'t.alertLevelCode': {inq: [
+ return {'f.alertLevelCode': {inq: [
'ON_PREPARATION',
'ON_CHECKING',
'CHECKED',
@@ -409,7 +360,7 @@ module.exports = Self => {
}
case 'agencyModeFk':
case 'warehouseFk':
- param = `t.${param}`;
+ param = `f.${param}`;
return {[param]: value};
}
});
@@ -422,14 +373,14 @@ module.exports = Self => {
stmt.merge(conn.makeLimit(filter));
const ticketsIndex = stmts.push(stmt) - 1;
- stmts.push(
- `DROP TEMPORARY TABLE
+ stmts.push(`
+ DROP TEMPORARY TABLE
tmp.filter,
tmp.ticket_problems,
tmp.sale_getProblems,
tmp.sale_getWarnings,
- tmp.ticket_warnings,
- tmp.risk`);
+ tmp.ticket_warnings
+ `);
const sql = ParameterizedSQL.join(stmts, ';');
const result = await conn.executeStmt(sql, myOptions);
diff --git a/modules/monitor/back/methods/sales-monitor/specs/salesFilter.spec.js b/modules/monitor/back/methods/sales-monitor/specs/salesFilter.spec.js
index c3da7f08b..9460addfa 100644
--- a/modules/monitor/back/methods/sales-monitor/specs/salesFilter.spec.js
+++ b/modules/monitor/back/methods/sales-monitor/specs/salesFilter.spec.js
@@ -39,7 +39,7 @@ describe('SalesMonitor salesFilter()', () => {
const filter = {};
const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
- expect(result.length).toBeGreaterThan(11);
+ expect(result.length).toBeGreaterThan(10);
await tx.rollback();
} catch (e) {
@@ -68,7 +68,7 @@ describe('SalesMonitor salesFilter()', () => {
const filter = {};
const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
- expect(result.length).toEqual(0);
+ expect(result.length).toEqual(4);
await tx.rollback();
} catch (e) {
@@ -218,8 +218,8 @@ describe('SalesMonitor salesFilter()', () => {
const firstTicket = result.shift();
const secondTicket = result.shift();
- expect(firstTicket.totalProblems).toEqual(1);
- expect(secondTicket.totalProblems).toEqual(1);
+ expect(firstTicket.totalProblems).toEqual(3);
+ expect(secondTicket.totalProblems).toEqual(3);
await tx.rollback();
} catch (e) {
diff --git a/modules/ticket/back/methods/sale/clone.js b/modules/ticket/back/methods/sale/clone.js
index 9185a6e75..24346f3ba 100644
--- a/modules/ticket/back/methods/sale/clone.js
+++ b/modules/ticket/back/methods/sale/clone.js
@@ -1,40 +1,25 @@
module.exports = Self => {
Self.remoteMethodCtx('clone', {
- description: 'Clone sales and services provided',
+ description: 'Clone sales, services, and ticket packaging provided',
accessType: 'WRITE',
accepts: [
- {
- arg: 'salesIds',
- type: ['number'],
- }, {
- arg: 'servicesIds',
- type: ['number']
- }, {
- arg: 'withWarehouse',
- type: 'boolean',
- required: true
- }, {
- arg: 'negative',
- type: 'boolean'
- }
+ {arg: 'salesIds', type: ['number']},
+ {arg: 'servicesIds', type: ['number']},
+ {arg: 'ticketPackagingIds', type: ['number']},
+ {arg: 'withWarehouse', type: 'boolean', required: true},
+ {arg: 'negative', type: 'boolean'}
],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/clone`,
- verb: 'POST'
- }
+ returns: {type: ['object'], root: true},
+ http: {path: `/clone`, verb: 'POST'}
});
- Self.clone = async(ctx, salesIds, servicesIds, withWarehouse, negative, options) => {
+
+ Self.clone = async(ctx, salesIds, servicesIds, ticketPackagingIds, withWarehouse, negative, options) => {
const models = Self.app.models;
const myOptions = {};
let tx;
const newTickets = [];
- if (typeof options == 'object')
- Object.assign(myOptions, options);
+ if (typeof options === 'object') Object.assign(myOptions, options);
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
@@ -44,8 +29,9 @@ module.exports = Self => {
try {
let sales;
let services;
+ let ticketPackaging;
- if (salesIds && salesIds.length) {
+ if (salesIds?.length) {
sales = await models.Sale.find({
where: {id: {inq: salesIds}},
include: {
@@ -57,12 +43,18 @@ module.exports = Self => {
}, myOptions);
}
- if (servicesIds && servicesIds.length) {
+ if (servicesIds?.length) {
services = await models.TicketService.find({
where: {id: {inq: servicesIds}}
}, myOptions);
}
+ if (ticketPackagingIds?.length) {
+ ticketPackaging = await models.TicketPackaging.find({
+ where: {id: {inq: ticketPackagingIds}}
+ }, myOptions);
+ }
+
let ticketsIds = sales ?
[...new Set(sales.map(sale => sale.ticketFk))] :
[...new Set(services.map(service => service.ticketFk))];
@@ -74,12 +66,12 @@ module.exports = Self => {
ctx,
ticketId,
withWarehouse,
- negative,
myOptions
);
newTickets.push(newTicket);
mappedTickets.set(ticketId, newTicket.id);
}
+
if (sales) {
for (const sale of sales) {
const newTicketId = mappedTickets.get(sale.ticketFk);
@@ -107,7 +99,7 @@ module.exports = Self => {
await models.TicketService.create({
description: service.description,
- quantity: negative ? - service.quantity : service.quantity,
+ quantity: negative ? -service.quantity : service.quantity,
price: service.price,
taxClassFk: service.taxClassFk,
ticketFk: newTicketId,
@@ -116,6 +108,18 @@ module.exports = Self => {
}
}
+ if (ticketPackaging) {
+ for (const packaging of ticketPackaging) {
+ const newTicketId = mappedTickets.get(packaging.ticketFk);
+
+ await models.TicketPackaging.create({
+ ticketFk: newTicketId,
+ packagingFk: packaging.packagingFk,
+ quantity: negative ? -packaging.quantity : packaging.quantity
+ }, myOptions);
+ }
+ }
+
if (tx) await tx.commit();
return newTickets;
@@ -124,13 +128,7 @@ module.exports = Self => {
throw e;
}
- async function createTicket(
- ctx,
- ticketId,
- withWarehouse,
- negative,
- myOptions
- ) {
+ async function createTicket(ctx, ticketId, withWarehouse, myOptions) {
const models = Self.app.models;
const now = Date.vnNew();
diff --git a/modules/ticket/back/methods/sale/specs/clone.spec.js b/modules/ticket/back/methods/sale/specs/clone.spec.js
index 5b0dc84a7..1738cc08c 100644
--- a/modules/ticket/back/methods/sale/specs/clone.spec.js
+++ b/modules/ticket/back/methods/sale/specs/clone.spec.js
@@ -20,7 +20,7 @@ describe('Ticket cloning - clone function', () => {
const servicesIds = [];
const withWarehouse = true;
const negative = false;
- const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, withWarehouse, negative, options);
+ const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, withWarehouse, negative, options);
expect(newTickets).toBeDefined();
expect(newTickets.length).toBeGreaterThan(0);
@@ -30,7 +30,7 @@ describe('Ticket cloning - clone function', () => {
const negative = true;
const salesIds = [7, 8];
const servicesIds = [];
- const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, false, negative, options);
+ const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, false, negative, options);
for (const ticket of newTickets) {
const sales = await models.Sale.find({where: {ticketFk: ticket.id}}, options);
@@ -43,7 +43,7 @@ describe('Ticket cloning - clone function', () => {
it('should create new components and services for cloned tickets', async() => {
const servicesIds = [2];
const salesIds = [5];
- const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, false, false, options);
+ const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, false, false, options);
for (const ticket of newTickets) {
const sale = await models.Sale.findOne({where: {ticketFk: ticket.id}}, options);
@@ -58,7 +58,7 @@ describe('Ticket cloning - clone function', () => {
it('should create a ticket without sales', async() => {
const servicesIds = [4];
- const tickets = await models.Sale.clone(ctx, null, servicesIds, false, false, options);
+ const tickets = await models.Sale.clone(ctx, null, servicesIds, null, false, false, options);
const refundedTicket = await getTicketRefund(tickets[0].id, options);
expect(refundedTicket).toBeDefined();
diff --git a/modules/ticket/back/methods/ticket/clone.js b/modules/ticket/back/methods/ticket/clone.js
deleted file mode 100644
index 93bc2a94e..000000000
--- a/modules/ticket/back/methods/ticket/clone.js
+++ /dev/null
@@ -1,54 +0,0 @@
-module.exports = Self => {
- Self.remoteMethodCtx('clone', {
- description: 'clone a ticket and return the new ticket id',
- accessType: 'WRITE',
- accepts: [{
- arg: 'id',
- type: 'number',
- required: true,
- description: 'The ticket id',
- http: {source: 'path'}
- }, {
- arg: 'shipped',
- type: 'date',
- }, {
- arg: 'withWarehouse',
- type: 'boolean',
- }
- ],
- returns: {
- type: 'number',
- root: true
- },
- http: {
- path: `/:id/clone`,
- verb: 'POST'
- }
- });
-
- Self.clone = async(ctx, id, shipped, withWarehouse, options) => {
- const myOptions = {userId: ctx.req.accessToken.userId};
- let tx;
-
- if (typeof options == 'object')
- Object.assign(myOptions, options);
-
- if (!myOptions.transaction) {
- tx = await Self.beginTransaction({});
- myOptions.transaction = tx;
- }
-
- try {
- const [, [{clonedTicketId}]] = await Self.rawSql(`
- CALL vn.ticket_cloneAll(?, ?, ?, @clonedTicketId);
- SELECT @clonedTicketId clonedTicketId;`,
- [id, shipped, withWarehouse], myOptions);
-
- if (tx) await tx.commit();
- return clonedTicketId;
- } catch (e) {
- if (tx) await tx.rollback();
- throw e;
- }
- };
-};
diff --git a/modules/ticket/back/methods/ticket/cloneAll.js b/modules/ticket/back/methods/ticket/cloneAll.js
new file mode 100644
index 000000000..cf99a7edc
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/cloneAll.js
@@ -0,0 +1,77 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('cloneAll', {
+ description: 'Clone tickets, sales, services and packages',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'ticketsIds',
+ type: ['number'],
+ required: true,
+ description: 'IDs of the tickets to clone'
+ },
+ {
+ arg: 'withWarehouse',
+ type: 'boolean',
+ required: true,
+ description: 'true: keep original warehouse; false: set to null'
+ },
+ {
+ arg: 'negative',
+ type: 'boolean',
+ required: true,
+ description: 'true: invert quantities; false: keep as is.'
+ }
+ ],
+ returns: {
+ type: ['object'],
+ root: true,
+ description: 'The cloned tickets with associated data'
+ },
+ http: {
+ path: `/cloneAll`,
+ verb: 'POST'
+ }
+ });
+
+ Self.cloneAll = async(ctx, ticketsIds, withWarehouse, negative, options) => {
+ const models = Self.app.models;
+ const myOptions = typeof options == 'object' ? {...options} : {};
+ let tx;
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ const filter = {where: {ticketFk: {inq: ticketsIds}}};
+
+ const [sales, services, ticketPackaging] = await Promise.all([
+ models.Sale.find(filter, myOptions),
+ models.TicketService.find(filter, myOptions),
+ models.TicketPackaging.find(filter, myOptions)
+ ]);
+
+ const salesIds = sales.map(({id}) => id);
+ const servicesIds = services.map(({id}) => id);
+ const ticketPackagingIds = ticketPackaging.map(({id}) => id);
+
+ const clonedTickets = await models.Sale.clone(
+ ctx,
+ salesIds,
+ servicesIds,
+ ticketPackagingIds,
+ withWarehouse,
+ negative,
+ myOptions
+ );
+
+ if (tx) await tx.commit();
+
+ return clonedTickets;
+ } 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 9d0aa8c13..143c0a3f0 100644
--- a/modules/ticket/back/methods/ticket/closeAll.js
+++ b/modules/ticket/back/methods/ticket/closeAll.js
@@ -93,8 +93,8 @@ module.exports = Self => {
SUM(t.isDeleted) hasErrorDeleted,
SUM(itc.id IS NULL) hasErrorItemTaxCountry,
SUM(a.id IS NULL) hasErrorAddress,
- SUM(ios.code IS NOT NULL
- AND(ad.customsAgentFk IS NULL
+ SUM(ios.code IS NOT NULL
+ AND(ad.customsAgentFk IS NULL
OR ad.incotermsFk IS NULL)) hasErrorInfoTaxAreaWorld,
t.clientFk clientFk
FROM ticket t
@@ -113,24 +113,24 @@ module.exports = Self => {
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
LEFT JOIN itemTaxCountry itc ON itc.itemFk = i.id
AND itc.countryFk = su.countryFk
- LEFT JOIN vn.invoiceOutSerial ios ON ios.taxAreaFk = 'WORLD'
- AND ios.code = invoiceSerial(t.clientFk, t.companyFk, 'M')
+ LEFT JOIN vn.invoiceOutSerial ios ON ios.taxAreaFk = 'WORLD'
+ AND ios.code = invoiceSerial(t.clientFk, t.companyFk, 'multiple')
WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'))
AND DATE(t.shipped) BETWEEN ? - INTERVAL 2 DAY AND util.dayEnd(?)
AND t.refFk IS NULL
AND IFNULL(a.hasDailyInvoice, co.hasDailyInvoice)
- GROUP BY ticketFk
- HAVING hasErrorToInvoice
- OR hasErrorTaxDataChecked
- OR hasErrorDeleted
- OR hasErrorItemTaxCountry
- OR hasErrorAddress
+ GROUP BY ticketFk
+ HAVING hasErrorToInvoice
+ OR hasErrorTaxDataChecked
+ OR hasErrorDeleted
+ OR hasErrorItemTaxCountry
+ OR hasErrorAddress
OR hasErrorInfoTaxAreaWorld
)sub
)sub2
) SELECT IF(errors = '{"tickets": null}',
'No errors',
- util.notification_send('invoice-ticket-closure', errors, NULL))
+ util.notification_send('invoice-ticket-closure', errors, NULL))
FROM ticketNotInvoiceable`, [toDate, toDate]);
await closure(ctx, Self, tickets);
diff --git a/modules/ticket/back/methods/ticket/closure.js b/modules/ticket/back/methods/ticket/closure.js
index fba39f18f..89343b193 100644
--- a/modules/ticket/back/methods/ticket/closure.js
+++ b/modules/ticket/back/methods/ticket/closure.js
@@ -13,23 +13,20 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) {
const failedtickets = [];
for (const ticket of tickets) {
try {
- await Self.app.models.InvoiceOut.getSerial(ticket.clientFk, ticket.companyFk, ticket.addressFk, 'M');
+ await Self.app.models.InvoiceOut.getSerial(ticket.clientFk, ticket.companyFk, ticket.addressFk, 'quick');
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,
@@ -104,17 +101,14 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) {
}
// Incoterms authorization
- 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],
- );
+ 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]);
if (firstOrder == 1) {
const args = {
@@ -129,26 +123,17 @@ module.exports = async function(ctx, Self, tickets, reqArgs = {}) {
const email = new Email('incoterms-authorization', args);
await email.send();
- const [sample] = await Self.rawSql(
- `SELECT id
+ const [sample] = await Self.rawSql(`
+ SELECT id
FROM sample
- WHERE code = 'incoterms-authorization'
- `,
- );
+ 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) {
- await Self.rawSql(`
- INSERT INTO util.debug (variable, value)
- VALUES ('invoicingTicketError', ?)
- `, [ticket.id + ' - ' + error]);
// Domain not found
if (error.responseCode == 450) {
await invalidEmail(ticket);
diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js
index 0823b38b8..2209c8df4 100644
--- a/modules/ticket/back/methods/ticket/filter.js
+++ b/modules/ticket/back/methods/ticket/filter.js
@@ -224,16 +224,14 @@ module.exports = Self => {
const stmts = [];
let stmt;
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.filter');
- stmt = new ParameterizedSQL(
- `CREATE TEMPORARY TABLE tmp.filter
+ stmt = new ParameterizedSQL(`
+ CREATE OR REPLACE TEMPORARY TABLE tmp.filter
(INDEX (id))
ENGINE = MEMORY
- SELECT
- t.id,
+ SELECT t.id,
t.shipped,
- CAST(DATE(t.shipped) AS CHAR) AS shippedDate,
- HOUR(t.shipped) AS shippedHour,
+ CAST(DATE(t.shipped) AS CHAR) shippedDate,
+ HOUR(t.shipped) shippedHour,
t.nickname,
t.refFk,
t.routeFk,
@@ -241,26 +239,26 @@ module.exports = Self => {
t.clientFk,
t.totalWithoutVat,
t.totalWithVat,
- io.id AS invoiceOutId,
+ io.id invoiceOutId,
a.provinceFk,
- p.name AS province,
- w.name AS warehouse,
- am.name AS agencyMode,
- am.id AS agencyModeFk,
- st.name AS state,
+ p.name province,
+ w.name warehouse,
+ am.name agencyMode,
+ am.id agencyModeFk,
+ st.name state,
st.classColor,
- wk.lastName AS salesPerson,
- ts.stateFk AS stateFk,
- ts.alertLevel AS alertLevel,
- ts.code AS alertLevelCode,
- u.name AS userName,
+ wk.lastName salesPerson,
+ ts.stateFk stateFk,
+ ts.alertLevel alertLevel,
+ ts.code alertLevelCode,
+ u.name userName,
c.salesPersonFk,
- z.hour AS zoneLanding,
- HOUR(z.hour) AS zoneHour,
- MINUTE(z.hour) AS zoneMinute,
- z.name AS zoneName,
- z.id AS zoneFk,
- CAST(z.hour AS CHAR) AS hour
+ z.hour zoneLanding,
+ HOUR(z.hour) zoneHour,
+ MINUTE(z.hour) zoneMinute,
+ z.name zoneName,
+ z.id zoneFk,
+ CAST(z.hour AS CHAR) hour
FROM ticket t
LEFT JOIN invoiceOut io ON t.refFk = io.ref
LEFT JOIN zone z ON z.id = t.zoneFk
@@ -273,7 +271,8 @@ module.exports = Self => {
LEFT JOIN client c ON c.id = t.clientFk
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
LEFT JOIN account.user u ON u.id = wk.id
- LEFT JOIN route r ON r.id = t.routeFk`);
+ LEFT JOIN route r ON r.id = t.routeFk
+ `);
if (args.orderFk) {
stmt.merge({
@@ -293,25 +292,31 @@ module.exports = Self => {
stmt.merge(conn.makeWhere(filter.where));
stmts.push(stmt);
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems');
-
stmt = new ParameterizedSQL(`
- CREATE TEMPORARY TABLE tmp.sale_getProblems
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
(INDEX (ticketFk))
ENGINE = MEMORY
SELECT f.id ticketFk, f.clientFk, f.warehouseFk, f.shipped
FROM tmp.filter f
LEFT JOIN alertLevel al ON al.id = f.alertLevel
WHERE (al.code = 'FREE' OR f.alertLevel IS NULL)
- AND f.shipped >= ?`, [date]);
- stmts.push(stmt);
+ AND f.shipped >= ?
+ `, [date]);
+ stmts.push(stmt);
stmts.push('CALL ticket_getProblems(FALSE)');
+ stmt = new ParameterizedSQL(`
+ UPDATE tmp.ticket_problems
+ SET risk = IF(hasRisk, risk, 0)
+ `);
+ stmts.push(stmt);
+
stmt = new ParameterizedSQL(`
SELECT f.*, tp.*
- FROM tmp.filter f
- LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id`);
+ FROM tmp.filter f
+ LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id
+ `);
if (args.problems != undefined && (!args.from && !args.to))
throw new UserError('Choose a date range or days forward');
diff --git a/modules/ticket/back/methods/ticket/getTicketsFuture.js b/modules/ticket/back/methods/ticket/getTicketsFuture.js
index ab5071be4..9f455ec03 100644
--- a/modules/ticket/back/methods/ticket/getTicketsFuture.js
+++ b/modules/ticket/back/methods/ticket/getTicketsFuture.js
@@ -145,24 +145,30 @@ module.exports = Self => {
stmts.push(stmt);
- stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems');
-
stmt = new ParameterizedSQL(`
- CREATE TEMPORARY TABLE tmp.sale_getProblems
- (INDEX (ticketFk))
- ENGINE = MEMORY
- SELECT f.id ticketFk, f.clientFk, f.warehouseFk, f.shipped, f.lines, f.liters
- FROM tmp.filter f
- LEFT JOIN alertLevel al ON al.id = f.alertLevel
- WHERE (al.code = 'FREE' OR f.alertLevel IS NULL)`);
- stmts.push(stmt);
+ CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
+ (INDEX (ticketFk))
+ ENGINE = MEMORY
+ SELECT f.id ticketFk, f.clientFk, f.warehouseFk, f.shipped, f.lines, f.liters
+ FROM tmp.filter f
+ LEFT JOIN alertLevel al ON al.id = f.alertLevel
+ WHERE (al.code = 'FREE' OR f.alertLevel IS NULL)
+ `);
+ stmts.push(stmt);
stmts.push('CALL ticket_getProblems(FALSE)');
+ stmt = new ParameterizedSQL(`
+ UPDATE tmp.ticket_problems
+ SET risk = IF(hasRisk, risk, 0)
+ `);
+ stmts.push(stmt);
+
stmt = new ParameterizedSQL(`
SELECT f.*, tp.*
- FROM tmp.filter f
- LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id`);
+ FROM tmp.filter f
+ LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id
+ `);
if (args.problems != undefined && (!args.originDated && !args.futureDated))
throw new UserError('Choose a date range or days forward');
diff --git a/modules/ticket/back/methods/ticket/invoiceTickets.js b/modules/ticket/back/methods/ticket/invoiceTickets.js
index 53400e724..3c725c4a7 100644
--- a/modules/ticket/back/methods/ticket/invoiceTickets.js
+++ b/modules/ticket/back/methods/ticket/invoiceTickets.js
@@ -95,7 +95,7 @@ module.exports = function(Self) {
FROM vn.ticket
WHERE id IN (?)
`, [ticketsIds], myOptions);
- return models.Ticket.makeInvoice(ctx, 'R', companyId, Date.vnNew(), invoiceCorrection, myOptions);
+ return models.Ticket.makeInvoice(ctx, 'quick', companyId, Date.vnNew(), invoiceCorrection, myOptions);
}
};
diff --git a/modules/ticket/back/methods/ticket/refund.js b/modules/ticket/back/methods/ticket/refund.js
deleted file mode 100644
index 7365f34df..000000000
--- a/modules/ticket/back/methods/ticket/refund.js
+++ /dev/null
@@ -1,58 +0,0 @@
-module.exports = Self => {
- Self.remoteMethodCtx('refund', {
- description: 'Create refund tickets with all their sales and services',
- accessType: 'WRITE',
- accepts: [
- {
- arg: 'ticketsIds',
- type: ['number'],
- required: true
- },
- {
- arg: 'withWarehouse',
- type: 'boolean',
- required: true
- }
- ],
- returns: {
- type: ['object'],
- root: true
- },
- http: {
- path: `/refund`,
- verb: 'POST'
- }
- });
-
- Self.refund = async(ctx, ticketsIds, withWarehouse, 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 filter = {where: {ticketFk: {inq: ticketsIds}}};
- const sales = await models.Sale.find(filter, myOptions);
- const salesIds = sales.map(sale => sale.id);
-
- const services = await models.TicketService.find(filter, myOptions);
- const servicesIds = services.map(service => service.id);
-
- const refundedTickets = await models.Sale.clone(ctx, salesIds, servicesIds, withWarehouse, true, myOptions);
-
- if (tx) await tx.commit();
-
- return refundedTickets;
- } catch (e) {
- if (tx) await tx.rollback();
- throw e;
- }
- };
-};
diff --git a/modules/ticket/back/methods/ticket/specs/clone.spec.js b/modules/ticket/back/methods/ticket/specs/clone.spec.js
deleted file mode 100644
index ccc0dcdf3..000000000
--- a/modules/ticket/back/methods/ticket/specs/clone.spec.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const models = require('vn-loopback/server/server').models;
-
-describe('Ticket cloning - clone function', () => {
- const ctx = beforeAll.getCtx();
- let options;
- let tx;
- const ticketId = 1;
- const shipped = Date.vnNew();
-
- beforeEach(async() => {
- options = {transaction: tx};
- tx = await models.Ticket.beginTransaction({});
- options.transaction = tx;
- });
-
- afterEach(async() => {
- await tx.rollback();
- });
-
- it('should clone a new ticket without warehouse', async() => {
- const originalTicket = await models.Ticket.findById(ticketId, null, options);
-
- const newTicketId = await models.Ticket.clone(ctx, ticketId, shipped, false, options);
- const newTicket = await models.Ticket.findById(newTicketId, null, options);
-
- expect(newTicket.clientFk).toEqual(originalTicket.clientFk);
- expect(newTicket.companyFk).toEqual(originalTicket.companyFk);
- expect(newTicket.addressFk).toEqual(originalTicket.addressFk);
- expect(newTicket.warehouseFk).toBeFalsy();
- });
-
- it('should clone a new ticket with warehouse', async() => {
- const originalTicket = await models.Ticket.findById(ticketId, null, options);
-
- const newTicketId = await models.Ticket.clone(ctx, ticketId, shipped, true, options);
- const newTicket = await models.Ticket.findById(newTicketId, null, options);
-
- expect(newTicket.clientFk).toEqual(originalTicket.clientFk);
- expect(newTicket.companyFk).toEqual(originalTicket.companyFk);
- expect(newTicket.addressFk).toEqual(originalTicket.addressFk);
- expect(newTicket.warehouseFk).toEqual(originalTicket.warehouseFk);
- });
-});
diff --git a/modules/ticket/back/methods/ticket/specs/cloneAll.spec.js b/modules/ticket/back/methods/ticket/specs/cloneAll.spec.js
new file mode 100644
index 000000000..4788df2c2
--- /dev/null
+++ b/modules/ticket/back/methods/ticket/specs/cloneAll.spec.js
@@ -0,0 +1,53 @@
+const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
+
+describe('Ticket cloning - cloneAll function', () => {
+ const activeCtx = {
+ accessToken: {userId: 1},
+ http: {
+ req: {
+ headers: {origin: 'http://localhost'}
+ }
+ }
+ };
+ const ctx = {req: activeCtx};
+ let options;
+ let tx;
+ const ticketIds = [1, 2];
+ const withWarehouse = true;
+ const negative = false;
+
+ beforeEach(async() => {
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({active: ctx.req});
+ tx = await models.Ticket.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ if (tx)
+ await tx.rollback();
+ });
+
+ it('should clone all provided tickets with their associated sales, services, and packages', async() => {
+ const originalTickets = await models.Ticket.find({where: {id: {inq: ticketIds}}}, options);
+ const originalSales = await models.Sale.find({where: {ticketFk: {inq: ticketIds}}}, options);
+ const originalServices = await models.TicketService.find({where: {ticketFk: {inq: ticketIds}}}, options);
+ const originalTicketPackaging =
+ await models.TicketPackaging.find({where: {ticketFk: {inq: ticketIds}}}, options);
+
+ // Pass the ctx correctly to the cloneAll function
+ const clonedTickets = await models.Ticket.cloneAll(ctx, ticketIds, withWarehouse, negative, options);
+
+ expect(clonedTickets.length).toEqual(originalTickets.length);
+
+ const clonedSales = await models.Sale.find({where: {ticketFk: {inq: clonedTickets.map(t => t.id)}}}, options);
+ const clonedServices =
+ await models.TicketService.find({where: {ticketFk: {inq: clonedTickets.map(t => t.id)}}}, options);
+ const clonedTicketPackaging =
+ await models.TicketPackaging.find({where: {ticketFk: {inq: clonedTickets.map(t => t.id)}}}, options);
+
+ expect(clonedSales.length).toEqual(originalSales.length);
+ expect(clonedServices.length).toEqual(originalServices.length);
+ expect(clonedTicketPackaging.length).toEqual(originalTicketPackaging.length);
+ });
+});
diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js
index 1d050931b..72249fe5d 100644
--- a/modules/ticket/back/methods/ticket/specs/filter.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js
@@ -71,7 +71,7 @@ describe('ticket filter()', () => {
const filter = {};
const result = await models.Ticket.filter(ctx, filter, options);
- expect(result.length).toEqual(10);
+ expect(result.length).toEqual(11);
await tx.rollback();
} catch (e) {
diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
index fea8b2096..88812dc92 100644
--- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
@@ -3,7 +3,7 @@ const LoopBackContext = require('loopback-context');
describe('ticket makeInvoice()', () => {
const userId = 19;
- const invoiceType = 'R';
+ const invoiceType = 'quick';
const companyFk = 442;
const invoiceDate = Date.vnNew();
const activeCtx = {
diff --git a/modules/ticket/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js
index 5582dde5c..462862cb3 100644
--- a/modules/ticket/back/models/ticket-methods.js
+++ b/modules/ticket/back/models/ticket-methods.js
@@ -26,7 +26,7 @@ module.exports = function(Self) {
require('../methods/ticket/isLocked')(Self);
require('../methods/ticket/freightCost')(Self);
require('../methods/ticket/getComponentsSum')(Self);
- require('../methods/ticket/refund')(Self);
+ require('../methods/ticket/cloneAll')(Self);
require('../methods/ticket/deliveryNotePdf')(Self);
require('../methods/ticket/deliveryNoteEmail')(Self);
require('../methods/ticket/deliveryNoteCsv')(Self);
@@ -46,5 +46,4 @@ module.exports = function(Self) {
require('../methods/ticket/invoiceTicketsAndPdf')(Self);
require('../methods/ticket/docuwareDownload')(Self);
require('../methods/ticket/myLastModified')(Self);
- require('../methods/ticket/clone')(Self);
};
diff --git a/modules/ticket/back/models/ticket.json b/modules/ticket/back/models/ticket.json
index d8a3206c6..3f073806e 100644
--- a/modules/ticket/back/models/ticket.json
+++ b/modules/ticket/back/models/ticket.json
@@ -69,6 +69,9 @@
},
"cmrFk": {
"type": "number"
+ },
+ "problem": {
+ "type": "string"
}
},
"relations": {
diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js
index 32f245454..93948def2 100644
--- a/modules/ticket/front/descriptor-menu/index.js
+++ b/modules/ticket/front/descriptor-menu/index.js
@@ -287,15 +287,24 @@ class Controller extends Section {
}
refund(withWarehouse) {
- const params = {ticketsIds: [this.id], withWarehouse: withWarehouse};
- const query = 'Tickets/refund';
+ const params = {
+ ticketsIds: [this.id],
+ withWarehouse: withWarehouse,
+ negative: true // Asumimos que queremos cantidades negativas para reembolsos
+ };
+ const query = 'Tickets/cloneAll';
return this.$http.post(query, params)
.then(res => {
const [refundTicket] = res.data;
- this.vnApp.showSuccess(this.$t('The following refund ticket have been created', {
+ this.vnApp.showSuccess(this.$t('The following refund ticket has been created', {
ticketId: refundTicket.id
}));
this.$state.go('ticket.card.sale', {id: refundTicket.id});
+ })
+ .catch(error => {
+ this.vnApp.showError(this.$t('Error creating refund ticket', {
+ error: error.data?.error?.message || 'Unknown error'
+ }));
});
}
diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js
index 94a991db8..cffbad62e 100644
--- a/modules/ticket/front/descriptor-menu/index.spec.js
+++ b/modules/ticket/front/descriptor-menu/index.spec.js
@@ -217,24 +217,6 @@ describe('Ticket Component vnTicketDescriptorMenu', () => {
});
});
- describe('refund()', () => {
- it('should make a query and go to ticket.card.sale', () => {
- controller.$state.go = jest.fn();
-
- controller._id = ticket.id;
-
- const params = {
- ticketsIds: [16]
- };
- const response = {id: 99};
- $httpBackend.expectPOST('Tickets/refund', params).respond([response]);
- controller.refund();
- $httpBackend.flush();
-
- expect(controller.$state.go).toHaveBeenCalledWith('ticket.card.sale', response);
- });
- });
-
describe('sendChangesSms()', () => {
it('should make a query and open the sms dialog', () => {
controller.$.sms = {open: () => {}};
diff --git a/modules/ticket/front/descriptor/index.html b/modules/ticket/front/descriptor/index.html
index 75bcd2801..32a30833b 100644
--- a/modules/ticket/front/descriptor/index.html
+++ b/modules/ticket/front/descriptor/index.html
@@ -58,7 +58,7 @@
+ ng-if="$ctrl.ticket.problem.includes('hasRisk')">
-
-
-
-
@@ -208,7 +198,7 @@
-
+
{{$t('title')}}
+
-
{{$t('title')}}
- {{$t('entryId')}} |
+ {{$t('entryId')}} |
{{entry.id}} |
- {{$t('date')}} |
+ {{$t('date')}} |
{{formatDate(entry.landed,'%d-%m-%Y')}} |
- {{$t('ref')}} |
- {{entry.invoiceNumber}} |
+ {{$t('ref')}} |
+ {{entry.invoiceNumber | dashIfEmpty}} |
@@ -38,42 +38,56 @@
-
+
{{$t('boxes')}} |
+ |
{{$t('packing')}} |
- {{$t('concept')}} |
+ {{$t('concept')}} |
+ {{$t('reference')}} |
+ {{$t('tags')}} |
{{$t('quantity')}} |
+ |
{{$t('price')}} |
+ |
{{$t('amount')}} |
- {{buy.box}} |
+ {{buy.stickers}} |
+ x |
{{buy.packing}} |
- {{buy.itemName}} |
+ {{buy.name}} |
+ {{buy.comment}} |
+
+ {{buy.tag5}} → {{buy.value5}}
+ {{buy.tag6}} → {{buy.value6}}
+ {{buy.tag7}} → {{buy.value7}}
+ |
{{buy.quantity | number($i18n.locale)}} |
+ x |
{{buy.buyingValue | currency('EUR', $i18n.locale)}} |
+ = |
{{buy.buyingValue * buy.quantity | currency('EUR', $i18n.locale)}}
|
-
-
- {{buy.tag5}} {{buy.value5}}
- {{buy.tag6}} {{buy.value6}}
- {{buy.tag7}} {{buy.value7}}
- |
-
-
-
- {{$t('total')}}
- |
- {{getTotal() | currency('EUR', $i18n.locale)}} |
+
+ {{getTotalBy('stickers')}} |
+ |
+ |
+ |
+ |
+ |
+ {{getTotalBy('quantity') | number($i18n.locale)}} |
+ |
+ |
+ |
+ {{getTotalBy('amount') | currency('EUR', $i18n.locale)}} |
diff --git a/print/templates/reports/entry-order/entry-order.js b/print/templates/reports/entry-order/entry-order.js
index d31ad1a36..56356e068 100755
--- a/print/templates/reports/entry-order/entry-order.js
+++ b/print/templates/reports/entry-order/entry-order.js
@@ -13,13 +13,17 @@ module.exports = {
return {totalBalance: 0.00};
},
methods: {
- getTotal() {
- let total = 0.00;
- this.buys.forEach(buy => {
- total += buy.quantity * buy.buyingValue;
- });
-
- return total;
+ getTotalBy(property) {
+ return this.buys.reduce((total, buy) => {
+ switch (property) {
+ case 'amount':
+ return total + buy.quantity * buy.buyingValue;
+ case 'quantity':
+ return total + buy.quantity;
+ case 'stickers':
+ return total + buy.stickers;
+ }
+ }, 0);
}
},
props: {
diff --git a/print/templates/reports/entry-order/locale/es.yml b/print/templates/reports/entry-order/locale/es.yml
index 5c633aeaa..5a6716ba1 100644
--- a/print/templates/reports/entry-order/locale/es.yml
+++ b/print/templates/reports/entry-order/locale/es.yml
@@ -2,7 +2,7 @@ reportName: pedido-de-entrada
title: Pedido
supplierName: Proveedor
supplierStreet: Dirección
-entryId: Referencia interna
+entryId: Nº Entrada
date: Fecha
ref: Nº Factura
boxes: Cajas
@@ -14,4 +14,6 @@ concept: Descripción
total: Total
entry: Entrada {0}
supplierData: Datos del proveedor
-notes: Notas
\ No newline at end of file
+notes: Notas
+reference: Referencia
+tags: Tags
\ No newline at end of file
diff --git a/print/templates/reports/entry-order/sql/buys.sql b/print/templates/reports/entry-order/sql/buys.sql
index 5bf9f2dfe..92c055483 100644
--- a/print/templates/reports/entry-order/sql/buys.sql
+++ b/print/templates/reports/entry-order/sql/buys.sql
@@ -1,16 +1,17 @@
-SELECT
- b.itemFk,
- b.quantity,
- b.buyingValue,
- b.stickers box,
- b.packing,
- i.name itemName,
- i.tag5,
- i.value5,
- i.tag6,
- i.value6,
- i.tag7,
- i.value7
-FROM buy b
- JOIN item i ON i.id = b.itemFk
-WHERE b.entryFk = ?
\ No newline at end of file
+SELECT b.itemFk,
+ b.quantity,
+ b.buyingValue,
+ b.stickers,
+ b.packing,
+ i.name,
+ IFNULL(i2.comment, i.comment) comment,
+ i.tag5,
+ i.value5,
+ i.tag6,
+ i.value6,
+ i.tag7,
+ i.value7
+ FROM buy b
+ JOIN item i ON i.id = b.itemFk
+ LEFT JOIN item i2 ON i2.id = b.itemOriginalFk
+ WHERE b.entryFk = ?
diff --git a/print/templates/reports/entry-order/sql/entry.sql b/print/templates/reports/entry-order/sql/entry.sql
index c30eebca8..2ab599123 100644
--- a/print/templates/reports/entry-order/sql/entry.sql
+++ b/print/templates/reports/entry-order/sql/entry.sql
@@ -1,9 +1,8 @@
-SELECT
- e.id,
- e.invoiceNumber,
- c.code companyCode,
- t.landed
-FROM entry e
- JOIN travel t ON t.id = e.travelFk
- JOIN company c ON c.id = e.companyFk
-WHERE e.id = ?
+SELECT e.id,
+ e.invoiceNumber,
+ c.code companyCode,
+ t.landed
+ FROM entry e
+ JOIN travel t ON t.id = e.travelFk
+ JOIN company c ON c.id = e.companyFk
+ WHERE e.id = ?
diff --git a/print/templates/reports/entry-order/sql/supplier.sql b/print/templates/reports/entry-order/sql/supplier.sql
index 81ed7e883..214f7913f 100644
--- a/print/templates/reports/entry-order/sql/supplier.sql
+++ b/print/templates/reports/entry-order/sql/supplier.sql
@@ -1,11 +1,10 @@
-SELECT
- s.name,
- s.street,
- s.nif,
- s.postCode,
- s.city,
- p.name province
-FROM supplier s
- JOIN entry e ON e.supplierFk = s.id
- LEFT JOIN province p ON p.id = s.provinceFk
-WHERE e.id = ?
+SELECT s.name,
+ s.street,
+ s.nif,
+ s.postCode,
+ s.city,
+ p.name province
+ FROM supplier s
+ JOIN entry e ON e.supplierFk = s.id
+ LEFT JOIN province p ON p.id = s.provinceFk
+ WHERE e.id = ?
diff --git a/print/templates/reports/sepa-core/sql/supplier.sql b/print/templates/reports/sepa-core/sql/supplier.sql
index da543147a..e7bede26d 100644
--- a/print/templates/reports/sepa-core/sql/supplier.sql
+++ b/print/templates/reports/sepa-core/sql/supplier.sql
@@ -7,8 +7,8 @@ SELECT m.code mandateCode,
sp.name province,
ad.value accountDetailValue
FROM client c
- JOIN mandate m ON m.clientFk = c.id
- JOIN mandateType mt ON mt.id = m.mandateTypeFk
+ JOIN mandate m ON m.clientFk = c.id
+ JOIN mandateType mt ON mt.id = m.mandateTypeFk
JOIN supplier s ON s.id = m.companyFk
LEFT JOIN country sc ON sc.id = s.countryFk
LEFT JOIN province sp ON sp.id = s.provinceFk
@@ -18,7 +18,7 @@ SELECT m.code mandateCode,
WHERE m.companyFk = ?
AND m.finished IS NULL
AND c.id = ?
- AND mt.name = 'CORE'
+ AND mt.code = 'CORE'
AND adt.description = 'Referencia Remesas'
GROUP BY m.id, ad.value
- ORDER BY m.created DESC
\ No newline at end of file
+ ORDER BY m.created DESC