From a0d50410aa19de2babe937a7010b514f92f727f9 Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 11 Nov 2020 12:34:07 +0100 Subject: [PATCH 01/35] Added section --- .../travel/front/extra-community/index.html | 32 +++++++++++++++++++ modules/travel/front/extra-community/index.js | 8 +++++ .../front/extra-community/locale/es.yml | 1 + .../travel/front/extra-community/style.scss | 25 +++++++++++++++ modules/travel/front/routes.json | 13 +++++++- 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 modules/travel/front/extra-community/index.html create mode 100644 modules/travel/front/extra-community/index.js create mode 100644 modules/travel/front/extra-community/locale/es.yml create mode 100644 modules/travel/front/extra-community/style.scss diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html new file mode 100644 index 000000000..d363f0ce0 --- /dev/null +++ b/modules/travel/front/extra-community/index.html @@ -0,0 +1,32 @@ + + + + +
+ +
{{detail.buyer}}
+
+ + + + Family + Percentage + Dwindle + Total + + + + + {{::waste.family}} + {{::(waste.percentage / 100) | percentage: 2}} + {{::waste.dwindle | currency: 'EUR'}} + {{::waste.total | currency: 'EUR'}} + + + +
+
+
diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js new file mode 100644 index 000000000..685958909 --- /dev/null +++ b/modules/travel/front/extra-community/index.js @@ -0,0 +1,8 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; +import './style.scss'; + +ngModule.vnComponent('vnTravelExtraCommunity', { + template: require('./index.html'), + controller: Section +}); diff --git a/modules/travel/front/extra-community/locale/es.yml b/modules/travel/front/extra-community/locale/es.yml new file mode 100644 index 000000000..aa231d3be --- /dev/null +++ b/modules/travel/front/extra-community/locale/es.yml @@ -0,0 +1 @@ +Family: Familia \ No newline at end of file diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss new file mode 100644 index 000000000..55a6eb2ef --- /dev/null +++ b/modules/travel/front/extra-community/style.scss @@ -0,0 +1,25 @@ +@import "variables"; + +vn-item-waste { + .header { + margin-bottom: 16px; + text-transform: uppercase; + font-size: 1.25rem; + line-height: 1; + padding: 7px; + padding-bottom: 7px; + padding-bottom: 4px; + font-weight: lighter; + background-color: #fde6ca; + border-bottom: 1px solid #f7931e; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + vn-table vn-th.waste-family, + vn-table vn-td.waste-family { + max-width: 64px; + width: 64px + } +} \ No newline at end of file diff --git a/modules/travel/front/routes.json b/modules/travel/front/routes.json index 5fa43fd1d..30792278e 100644 --- a/modules/travel/front/routes.json +++ b/modules/travel/front/routes.json @@ -6,7 +6,8 @@ "dependencies": ["worker", "entry"], "menus": { "main": [ - {"state": "travel.index", "icon": "local_airport"} + {"state": "travel.index", "icon": "local_airport"}, + {"state": "travel.extraCommunity", "icon": "directions_boat"} ], "card": [ {"state": "travel.card.basicData", "icon": "settings"}, @@ -90,6 +91,16 @@ "travel": "$ctrl.travel" }, "acl": ["buyer"] + }, + { + "url": "/extra-community", + "state": "travel.extraCommunity", + "component": "vn-travel-extra-community", + "description": "Extra community", + "acl": ["buyer"], + "params": { + "travel": "$ctrl.travel" + } } ] } \ No newline at end of file From 4acdfd6d4e80659cff5d6a54f167438f85bebca4 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 13 Nov 2020 09:30:40 +0100 Subject: [PATCH 02/35] Th refactor --- db/changes/10250-curfew/00-travelDetail.sql | 94 ++++++++ front/core/components/table/style.scss | 23 +- front/core/components/th/index.html | 4 +- front/core/components/th/index.js | 17 +- front/core/components/th/style.scss | 33 +++ modules/entry/back/models/buy.json | 10 +- .../methods/travel/extraCommunityFilter.js | 227 ++++++++++++++++++ modules/travel/back/models/travel.js | 1 + .../travel/front/extra-community/index.html | 29 ++- .../travel/front/extra-community/style.scss | 2 +- modules/travel/front/index.js | 1 + 11 files changed, 400 insertions(+), 41 deletions(-) create mode 100644 db/changes/10250-curfew/00-travelDetail.sql create mode 100644 front/core/components/th/style.scss create mode 100644 modules/travel/back/methods/travel/extraCommunityFilter.js diff --git a/db/changes/10250-curfew/00-travelDetail.sql b/db/changes/10250-curfew/00-travelDetail.sql new file mode 100644 index 000000000..673044b9e --- /dev/null +++ b/db/changes/10250-curfew/00-travelDetail.sql @@ -0,0 +1,94 @@ +drop procedure `vn2008`.travelDetail; + +create definer = root@`%` procedure `vn2008`.travelDetail__() +BEGIN + + DECLARE vDateFrom DATE DEFAULT TIMESTAMPADD(WEEK,-12,CURDATE()); + + SELECT IFNULL(CONCAT(" ",Entrada),travel) travelAndEntry, + travel, + Entrada, + IsTravel, + Agencia, + ref, + shipment, + OrigenCajas, + landing, + Destino, + Etiquetas, + Notas_Eva, + kg, + loadedKg, + volumeKg, + loadPriority, + Notas, + Carguera + FROM(SELECT + 1 as IsTravel, + tr.id as travel, + NULL as Entrada, + ag.Agencia, + tr.ref, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(c.Etiquetas) as Etiquetas, + NULL as Notas_Eva, + kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + NULL as loadPriority, + NULL as Notas, + pc.Alias as Carguera + FROM travel tr + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + LEFT JOIN Entradas e ON e.travel_id = tr.id + LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + LEFT JOIN Articles a ON a.Id_Article = c.Id_Article + LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id + WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY tr.id + + UNION ALL + + SELECT + 0 as IsTravel, + e.travel_id as travel, + e.Id_Entrada, + p.Proveedor, + e.Referencia, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(Etiquetas) as Etiquetas, + e.Notas_Eva, + NULL as kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + loadPriority, + e.Notas, + pc.Alias as carguera + + FROM Entradas e + JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + JOIN Articles a ON a.Id_Article = c.Id_Article + JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor + JOIN travel tr ON tr.id = e.travel_id + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY e.Id_Entrada + ) sub + ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; + +END; + diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss index 7dd69d89f..8d35c374c 100644 --- a/front/core/components/table/style.scss +++ b/front/core/components/table/style.scss @@ -22,28 +22,7 @@ vn-table { & > * > vn-th[field] { position: relative; overflow: visible; - cursor: pointer; - - &.active > :after { - color: $color-font; - opacity: 1; - } - &.desc > :after { - content: 'arrow_drop_down'; - } - &.asc > :after { - content: 'arrow_drop_up'; - } - & > :after { - font-family: 'Material Icons'; - content: 'arrow_drop_down'; - position: absolute; - color: $color-spacer; - opacity: 0; - } - &:hover > :after { - opacity: 1; - } + cursor: pointer } } & > vn-tbody, diff --git a/front/core/components/th/index.html b/front/core/components/th/index.html index 28d80695d..281c6866c 100644 --- a/front/core/components/th/index.html +++ b/front/core/components/th/index.html @@ -1,3 +1 @@ -
- -
\ No newline at end of file +
\ No newline at end of file diff --git a/front/core/components/th/index.js b/front/core/components/th/index.js index b8260bd74..838431714 100644 --- a/front/core/components/th/index.js +++ b/front/core/components/th/index.js @@ -1,10 +1,19 @@ import ngModule from '../../module'; +import Component from '../../lib/component'; +import './style.scss'; + +export default class Th extends Component { + constructor($element, $, $transclude) { + super($element, $); -export default class Th { - constructor($element) { this._order = 'ASC'; this.column = $element[0]; $element.on('click', () => this.onToggleOrder()); + + $transclude($clone => { + const text = this.$t($clone.text()); // Not updating translations + $element.append(text ? text : $clone); + }); } /** @@ -54,7 +63,6 @@ export default class Th { else this.table.setOrder(this.field, this.order); - this.updateArrow(); this.table.applyOrder(this.field, this.order); @@ -73,10 +81,9 @@ export default class Th { } } -Th.$inject = ['$element']; +Th.$inject = ['$element', '$scope', '$transclude']; ngModule.vnComponent('vnTh', { - template: require('./index.html'), transclude: true, controller: Th, bindings: { diff --git a/front/core/components/th/style.scss b/front/core/components/th/style.scss new file mode 100644 index 000000000..6f575a02e --- /dev/null +++ b/front/core/components/th/style.scss @@ -0,0 +1,33 @@ +@import "effects"; +@import "variables"; + +vn-th { + font-weight: normal; +} + +vn-th[field] { + &.active:after { + color: $color-font; + opacity: 1; + } + &.desc:after { + content: 'arrow_drop_down'; + } + &.asc:after { + content: 'arrow_drop_up'; + } + + &:after { + font-family: 'Material Icons'; + content: 'arrow_drop_down'; + position: absolute; + color: $color-spacer; + font-size: 1.5em; + margin-top: -2px; + opacity: 0 + + } + &:hover:after { + opacity: 1; + } +} \ No newline at end of file diff --git a/modules/entry/back/models/buy.json b/modules/entry/back/models/buy.json index 56f1eef4f..65bf15fa4 100644 --- a/modules/entry/back/models/buy.json +++ b/modules/entry/back/models/buy.json @@ -34,9 +34,6 @@ "stickers": { "type": "number" }, - "packageFk": { - "type": "number" - }, "groupingMode": { "type": "number" }, @@ -68,6 +65,11 @@ "model": "Item", "foreignKey": "itemFk", "required": true - } + }, + "package": { + "type": "belongsTo", + "model": "Packaging", + "foreignKey": "packageFk" + } } } \ No newline at end of file diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js new file mode 100644 index 000000000..5b095328b --- /dev/null +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -0,0 +1,227 @@ + +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; +const buildFilter = require('vn-loopback/util/filter').buildFilter; +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethodCtx('extraCommunityFilter', { + description: 'Find all instances of the model matched by filter from the data source.', + accessType: 'READ', + accepts: [ + { + arg: 'filter', + type: 'Object', + description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', + http: {source: 'query'} + }, { + arg: 'search', + type: 'String', + description: 'Searchs the travel by id', + http: {source: 'query'} + }, { + arg: 'id', + type: 'Integer', + description: 'The travel id', + http: {source: 'query'} + }, { + arg: 'shippedFrom', + type: 'Date', + description: 'The shipped from date filter', + http: {source: 'query'} + }, { + arg: 'shippedTo', + type: 'Date', + description: 'The shipped to date filter', + http: {source: 'query'} + }, { + arg: 'landedFrom', + type: 'Date', + description: 'The landed from date filter', + http: {source: 'query'} + }, { + arg: 'landedTo', + type: 'Date', + description: 'The landed to date filter', + http: {source: 'query'} + }, { + arg: 'agencyFk', + type: 'Number', + description: 'The agencyModeFk id', + http: {source: 'query'} + }, { + arg: 'warehouseOutFk', + type: 'Number', + description: 'The warehouseOutFk filter', + http: {source: 'query'} + }, { + arg: 'warehouseInFk', + type: 'Number', + description: 'The warehouseInFk filter', + http: {source: 'query'} + }, { + arg: 'totalEntries', + type: 'Number', + description: 'The totalEntries filter', + http: {source: 'query'} + }, { + arg: 'ref', + type: 'string', + description: 'The reference' + } + ], + returns: { + type: ['Object'], + root: true + }, + http: { + path: `/extraCommunityFilter`, + verb: 'GET' + } + }); + + Self.extraCommunityFilter = async(ctx, filter) => { + let conn = Self.dataSource.connector; + let where = buildFilter(ctx.args, (param, value) => { + switch (param) { + case 'search': + return /^\d+$/.test(value) + ? {'t.id': value} + : {'t.ref': {like: `%${value}%`}}; + case 'ref': + return {'t.ref': {like: `%${value}%`}}; + case 'shippedFrom': + return {'t.shipped': {gte: value}}; + case 'shippedTo': + return {'t.shipped': {lte: value}}; + case 'landedFrom': + return {'t.landed': {gte: value}}; + case 'landedTo': + return {'t.landed': {lte: value}}; + case 'id': + case 'agencyFk': + case 'warehouseOutFk': + case 'warehouseInFk': + case 'totalEntries': + param = `t.${param}`; + return {[param]: value}; + } + }); + + filter = mergeFilters(ctx.args.filter, {where}); + + let stmts = []; + let stmt; + stmt = new ParameterizedSQL( + `SELECT + tr.id, + tr.ref, + tr.shipped, + tr.landed, + tr.kg, + am.id AS agencyModeFk, + am.name AS agencyModeName, + wo.id AS warehouseOutFk, + wo.name AS warehouseOutName, + w.name AS warehouseInFk, + w.name AS warehouseInName, + SUM(b.stickers) AS stickers, + s.id AS supplierFk, + s.nickname AS supplierNickname + FROM travel tr + LEFT JOIN supplier s ON s.id = tr.cargoSupplierFk + LEFT JOIN entry e ON e.travelFk = tr.id + LEFT JOIN buy b ON b.entryFk = e.id + LEFT JOIN packaging p ON p.id = b.packageFk + LEFT JOIN item i ON i.id = b.itemFk + LEFT JOIN itemType it ON it.id = i.typeFk + JOIN warehouse w ON w.id = tr.warehouseInFk + JOIN warehouse wo ON wo.id = tr.warehouseOutFk + JOIN agencyMode am ON am.id = tr.agencyFk` + ); + + /* cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + pc.Alias as Carguera */ + + // WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + + stmt.merge('GROUP BY tr.id'); + // stmt.merge(conn.makeSuffix(filter)); + const itemsIndex = stmts.push(stmt) - 1; + + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql); + return itemsIndex === 0 ? result : result[itemsIndex]; + + /* + SET @vDateFrom:= TIMESTAMPADD(WEEK,-12,CURDATE()); + + SELECT + 1 as IsTravel, + tr.id as travel, + NULL as Entrada, + ag.Agencia, + tr.ref, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(c.Etiquetas) as Etiquetas, + NULL as Notas_Eva, + kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + NULL as loadPriority, + NULL as Notas, + pc.Alias as Carguera + FROM travel tr + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + LEFT JOIN Entradas e ON e.travel_id = tr.id + LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + LEFT JOIN Articles a ON a.Id_Article = c.Id_Article + LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id + WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY tr.id + + UNION ALL + + SELECT + 0 as IsTravel, + e.travel_id as travel, + e.Id_Entrada, + p.Proveedor, + e.Referencia, + tr.shipment, + wo.name as OrigenCajas, + tr.landing, + w.name as Destino, + sum(Etiquetas) as Etiquetas, + e.Notas_Eva, + NULL as kg, + cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, + loadPriority, + e.Notas, + pc.Alias as carguera + + FROM Entradas e + JOIN Compres c ON c.Id_Entrada = e.Id_Entrada + JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo + JOIN Articles a ON a.Id_Article = c.Id_Article + JOIN Tipos tp ON tp.tipo_id = a.tipo_id + JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor + JOIN travel tr ON tr.id = e.travel_id + LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk + JOIN warehouse w ON w.id = tr.warehouse_id + JOIN warehouse wo ON wo.id = tr.warehouse_id_out + WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + GROUP BY e.Id_Entrada + ) sub + ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; */ + }; +}; + diff --git a/modules/travel/back/models/travel.js b/modules/travel/back/models/travel.js index b47742c26..b8a1a24b3 100644 --- a/modules/travel/back/models/travel.js +++ b/modules/travel/back/models/travel.js @@ -7,6 +7,7 @@ module.exports = Self => { require('../methods/travel/createThermograph')(Self); require('../methods/travel/deleteThermograph')(Self); require('../methods/travel/updateThermograph')(Self); + require('../methods/travel/extraCommunityFilter')(Self); Self.rewriteDbError(function(err) { if (err.code === 'ER_DUP_ENTRY') diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index d363f0ce0..1007f223a 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,15 +1,32 @@ + url="Travels/extraCommunityFilter" + data="travels"> + + + + -
+
-
{{detail.buyer}}
+ + + + {{travel.id}} + {{travel.supplierNickname}} + + + +
- +
diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss index 55a6eb2ef..5a929908c 100644 --- a/modules/travel/front/extra-community/style.scss +++ b/modules/travel/front/extra-community/style.scss @@ -1,6 +1,6 @@ @import "variables"; -vn-item-waste { +vn-travel-extra-community { .header { margin-bottom: 16px; text-transform: uppercase; diff --git a/modules/travel/front/index.js b/modules/travel/front/index.js index 28ec27693..410cbe219 100644 --- a/modules/travel/front/index.js +++ b/modules/travel/front/index.js @@ -13,3 +13,4 @@ import './thermograph/index/'; import './thermograph/create/'; import './thermograph/edit/'; import './descriptor-popover'; +import './extra-community'; From 0ff931b71b36b0045e641c3ab3ce8cdb50c60101 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 13 Nov 2020 09:31:10 +0100 Subject: [PATCH 03/35] Increased jest workers --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e5f668581..d87695cc4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -65,7 +65,7 @@ pipeline { stage('Frontend') { steps { nodejs('node-lts') { - sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=1' + sh 'jest --ci --reporters=default --reporters=jest-junit --maxWorkers=2' } } } From d17a61d4c1c4d1c79b7e161e870d11ec0bb4174b Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 16 Nov 2020 08:45:20 +0100 Subject: [PATCH 04/35] Version merge --- db/changes/10250-curfew/00-ACL.sql | 11 ++- .../00-claimState.sql | 0 .../00-observationType.sql | 0 .../00-supplierLog.sql | 0 .../00-ticket_beforeUpdate.sql | 0 .../00-ticket_componentPreview.sql | 0 db/changes/10250-curfew/00-travelDetail.sql | 94 ------------------- db/changes/10250-toqueDeQueda/00-ACL.sql | 10 -- 8 files changed, 10 insertions(+), 105 deletions(-) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-claimState.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-observationType.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-supplierLog.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-ticket_beforeUpdate.sql (100%) rename db/changes/{10250-toqueDeQueda => 10250-curfew}/00-ticket_componentPreview.sql (100%) delete mode 100644 db/changes/10250-curfew/00-travelDetail.sql delete mode 100644 db/changes/10250-toqueDeQueda/00-ACL.sql diff --git a/db/changes/10250-curfew/00-ACL.sql b/db/changes/10250-curfew/00-ACL.sql index 90f673c67..46921e575 100644 --- a/db/changes/10250-curfew/00-ACL.sql +++ b/db/changes/10250-curfew/00-ACL.sql @@ -1,4 +1,13 @@ + +UPDATE `salix`.`ACL` SET `principalId` = 'deliveryBoss' WHERE (`id` = '194'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '97'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '100'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '103'); +UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '202'); + INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Supplier', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Supplier', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierLog', '*', 'READ', 'ALLOW', 'ROLE', 'employee'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); \ No newline at end of file +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Town', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); +INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Province', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); \ No newline at end of file diff --git a/db/changes/10250-toqueDeQueda/00-claimState.sql b/db/changes/10250-curfew/00-claimState.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-claimState.sql rename to db/changes/10250-curfew/00-claimState.sql diff --git a/db/changes/10250-toqueDeQueda/00-observationType.sql b/db/changes/10250-curfew/00-observationType.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-observationType.sql rename to db/changes/10250-curfew/00-observationType.sql diff --git a/db/changes/10250-toqueDeQueda/00-supplierLog.sql b/db/changes/10250-curfew/00-supplierLog.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-supplierLog.sql rename to db/changes/10250-curfew/00-supplierLog.sql diff --git a/db/changes/10250-toqueDeQueda/00-ticket_beforeUpdate.sql b/db/changes/10250-curfew/00-ticket_beforeUpdate.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-ticket_beforeUpdate.sql rename to db/changes/10250-curfew/00-ticket_beforeUpdate.sql diff --git a/db/changes/10250-toqueDeQueda/00-ticket_componentPreview.sql b/db/changes/10250-curfew/00-ticket_componentPreview.sql similarity index 100% rename from db/changes/10250-toqueDeQueda/00-ticket_componentPreview.sql rename to db/changes/10250-curfew/00-ticket_componentPreview.sql diff --git a/db/changes/10250-curfew/00-travelDetail.sql b/db/changes/10250-curfew/00-travelDetail.sql deleted file mode 100644 index 673044b9e..000000000 --- a/db/changes/10250-curfew/00-travelDetail.sql +++ /dev/null @@ -1,94 +0,0 @@ -drop procedure `vn2008`.travelDetail; - -create definer = root@`%` procedure `vn2008`.travelDetail__() -BEGIN - - DECLARE vDateFrom DATE DEFAULT TIMESTAMPADD(WEEK,-12,CURDATE()); - - SELECT IFNULL(CONCAT(" ",Entrada),travel) travelAndEntry, - travel, - Entrada, - IsTravel, - Agencia, - ref, - shipment, - OrigenCajas, - landing, - Destino, - Etiquetas, - Notas_Eva, - kg, - loadedKg, - volumeKg, - loadPriority, - Notas, - Carguera - FROM(SELECT - 1 as IsTravel, - tr.id as travel, - NULL as Entrada, - ag.Agencia, - tr.ref, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(c.Etiquetas) as Etiquetas, - NULL as Notas_Eva, - kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - NULL as loadPriority, - NULL as Notas, - pc.Alias as Carguera - FROM travel tr - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - LEFT JOIN Entradas e ON e.travel_id = tr.id - LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - LEFT JOIN Articles a ON a.Id_Article = c.Id_Article - LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id - WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY tr.id - - UNION ALL - - SELECT - 0 as IsTravel, - e.travel_id as travel, - e.Id_Entrada, - p.Proveedor, - e.Referencia, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(Etiquetas) as Etiquetas, - e.Notas_Eva, - NULL as kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - loadPriority, - e.Notas, - pc.Alias as carguera - - FROM Entradas e - JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - JOIN Articles a ON a.Id_Article = c.Id_Article - JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor - JOIN travel tr ON tr.id = e.travel_id - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - WHERE tr.landing >= vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY e.Id_Entrada - ) sub - ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; - -END; - diff --git a/db/changes/10250-toqueDeQueda/00-ACL.sql b/db/changes/10250-toqueDeQueda/00-ACL.sql deleted file mode 100644 index 4cdadfd04..000000000 --- a/db/changes/10250-toqueDeQueda/00-ACL.sql +++ /dev/null @@ -1,10 +0,0 @@ -UPDATE `salix`.`ACL` SET `principalId` = 'deliveryBoss' WHERE (`id` = '194'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '97'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '100'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '103'); -UPDATE `salix`.`ACL` SET `principalId` = 'claimManager' WHERE (`id` = '202'); - -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Town', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Province', '*', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('supplier', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); -INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('SupplierContact', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative'); From f64a566447f251edc02b7c8d6d27a4ff8f7600a8 Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 20 Nov 2020 12:12:06 +0100 Subject: [PATCH 05/35] route.ticket drag and drop validation --- .../methods/route/specs/ticketToRoute.spec.js | 52 +++++++++++++++++++ .../route/back/methods/route/ticketToRoute.js | 51 ++++++++++++++++++ modules/route/back/models/route.js | 5 +- modules/route/front/tickets/index.js | 6 ++- modules/route/front/tickets/index.spec.js | 4 +- modules/route/front/tickets/locale/es.yml | 3 +- .../methods/zone/specs/deleteZone.spec.js | 5 ++ 7 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 modules/route/back/methods/route/specs/ticketToRoute.spec.js create mode 100644 modules/route/back/methods/route/ticketToRoute.js diff --git a/modules/route/back/methods/route/specs/ticketToRoute.spec.js b/modules/route/back/methods/route/specs/ticketToRoute.spec.js new file mode 100644 index 000000000..86206ab42 --- /dev/null +++ b/modules/route/back/methods/route/specs/ticketToRoute.spec.js @@ -0,0 +1,52 @@ +const app = require('vn-loopback/server/server'); +const LoopBackContext = require('loopback-context'); + +describe('route ticketToRoute()', () => { + const deliveryId = 56; + let originalTicket; + const routeId = 2; + const activeCtx = { + accessToken: {userId: deliveryId}, + }; + + beforeAll(async done => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + + done(); + }); + + afterAll(async done => { + try { + await originalTicket.updateAttribute('routeFk', null); + } catch (error) { + console.error(error); + } + done(); + }); + + it('should add the ticket in a route', async() => { + originalTicket = await app.models.Ticket.findById(14); + + const ticketId = 14; + const result = await app.models.Route.ticketToRoute(ticketId, routeId); + + expect(result.routeFk).toEqual(2); + }); + + it('should throw and error if the ticket is not suitable for the route', async() => { + const ticketId = 23; + let error; + + try { + await app.models.Route.ticketToRoute(ticketId, routeId); + } catch (e) { + error = e.message; + } + + expect(error).toBeDefined(); + expect(error).toEqual('The selected ticket is not suitable for this route'); + }); +}); + diff --git a/modules/route/back/methods/route/ticketToRoute.js b/modules/route/back/methods/route/ticketToRoute.js new file mode 100644 index 000000000..93b270015 --- /dev/null +++ b/modules/route/back/methods/route/ticketToRoute.js @@ -0,0 +1,51 @@ +const UserError = require('vn-loopback/util/user-error'); + +module.exports = Self => { + Self.remoteMethod('ticketToRoute', { + description: 'Check if the ticket can be insert into the route and insert it', + accessType: 'READ', + accepts: [{ + arg: 'ticketId', + type: 'number', + required: true, + description: 'ticketId ', + http: {source: 'path'} + }, + { + arg: 'routeId', + type: 'number', + required: true + }], + returns: { + type: 'object', + root: true + }, + http: { + path: `/:ticketId/ticketToRoute`, + verb: 'PATCH' + } + }); + + Self.ticketToRoute = async(ticketId, routeId) => { + const models = Self.app.models; + + const route = await models.Route.findById(routeId); + const minDate = new Date(route.finished); + minDate.setHours(0, 0, 0, 0); + + const maxDate = new Date(route.finished); + maxDate.setHours(23, 59, 59, 59); + const ticket = await models.Ticket.findOne({ + where: { + id: ticketId, + zoneFk: route.zoneFk, + routeFk: null, + landed: {between: [minDate, maxDate]}, + } + }); + if (!ticket) + throw new UserError('The selected ticket is not suitable for this route'); + + return await ticket.updateAttribute('routeFk', route.id); + }; +}; diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js index 6d93cfe40..cdb51c609 100644 --- a/modules/route/back/models/route.js +++ b/modules/route/back/models/route.js @@ -5,6 +5,7 @@ module.exports = Self => { require('../methods/route/guessPriority')(Self); require('../methods/route/updateVolume')(Self); require('../methods/route/getDeliveryPoint')(Self); + require('../methods/route/ticketToRoute')(Self); Self.validate('kmStart', validateDistance, { message: 'Distance must be lesser than 1000' @@ -17,9 +18,7 @@ module.exports = Self => { function validateDistance(err) { const routeTotalKm = this.kmEnd - this.kmStart; const routeMaxKm = 1000; - if ( routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) + if (routeTotalKm > routeMaxKm || this.kmStart > this.kmEnd) err(); } }; - - diff --git a/modules/route/front/tickets/index.js b/modules/route/front/tickets/index.js index a811d6d88..49ca8d60f 100644 --- a/modules/route/front/tickets/index.js +++ b/modules/route/front/tickets/index.js @@ -162,8 +162,10 @@ class Controller extends Section { } insert(id) { - const params = {routeFk: this.route.id}; - this.$http.patch(`Tickets/${id}`, params).then(() => { + const params = {routeId: this.route.id}; + const query = `Routes/${id}/ticketToRoute`; + + return this.$http.patch(query, params).then(() => { this.vnApp.showSuccess(this.$t('Data saved!')); this.$.model.refresh(); this.card.reload(); diff --git a/modules/route/front/tickets/index.spec.js b/modules/route/front/tickets/index.spec.js index a32b368ba..a1b9229b7 100644 --- a/modules/route/front/tickets/index.spec.js +++ b/modules/route/front/tickets/index.spec.js @@ -309,8 +309,8 @@ describe('Route', () => { jest.spyOn(controller.vnApp, 'showSuccess'); const ticketId = 11; - - $httpBackend.expect('PATCH', `Tickets/11`).respond({id: 11}); + const data = {routeId: 1}; + $httpBackend.expect('PATCH', `Routes/11/ticketToRoute`, data).respond(); controller.insert(ticketId); $httpBackend.flush(); diff --git a/modules/route/front/tickets/locale/es.yml b/modules/route/front/tickets/locale/es.yml index b9892a299..836dfe595 100644 --- a/modules/route/front/tickets/locale/es.yml +++ b/modules/route/front/tickets/locale/es.yml @@ -6,4 +6,5 @@ Delete ticket from route?: ¿Quitar el ticket de la ruta? Sort routes: Ordenar rutas Add ticket: Añadir ticket Tickets to add: Tickets a añadir -Ticket not found: No se ha encontrado el ticket \ No newline at end of file +Ticket not found: No se ha encontrado el ticket +The selected ticket is not suitable for this route: El ticket seleccionado no es apto para esta ruta \ No newline at end of file diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js index 8722837af..79d672f38 100644 --- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js +++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js @@ -14,6 +14,7 @@ describe('zone deletezone()', () => { let ticketIDs; let originalZoneIncluded; let originalTicketStates; + let originalRoutes; beforeAll(async done => { spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ @@ -27,6 +28,7 @@ describe('zone deletezone()', () => { zoneFk: zoneId } }); + originalRoutes = await app.models.Route.find({where: {zoneFk: zoneId}}); ticketIDs = originalTickets.map(ticket => ticket.id); originalZoneIncluded = await app.models.ZoneIncluded.find({where: {zoneFk: zoneId}}); originalTicketStates = await app.models.TicketState.find({where: { @@ -44,6 +46,9 @@ describe('zone deletezone()', () => { await originalZone.save(); await app.models.ZoneWarehouse.create(originalZoneWarehouses); + for (route of originalRoutes) + await route.updateAttributes({zoneFk: zoneId}); + for (ticket of originalTickets) await ticket.updateAttributes({zoneFk: zoneId}); From 4d91b26537c9b9747df777a1e27bf4c80f31dc9b Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 20 Nov 2020 13:35:01 +0100 Subject: [PATCH 06/35] checkinbox moved to worker --- back/model-config.json | 6 ------ back/models/worker-time-control-params.js | 3 --- .../back/methods/worker-time-control-mail}/checkInbox.js | 4 ++++ modules/worker/back/model-config.json | 6 ++++++ modules/worker/back/models/worker-time-control-mail.js | 3 +++ .../worker/back}/models/worker-time-control-mail.json | 0 .../worker/back}/models/worker-time-control-params.json | 0 7 files changed, 13 insertions(+), 9 deletions(-) delete mode 100644 back/models/worker-time-control-params.js rename {back/methods/imap-time-control => modules/worker/back/methods/worker-time-control-mail}/checkInbox.js (97%) create mode 100644 modules/worker/back/models/worker-time-control-mail.js rename {back => modules/worker/back}/models/worker-time-control-mail.json (100%) rename {back => modules/worker/back}/models/worker-time-control-params.json (100%) diff --git a/back/model-config.json b/back/model-config.json index da9feaa1f..f0032edab 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -76,12 +76,6 @@ }, "UserLog": { "dataSource": "vn" - }, - "WorkerTimeControlParams": { - "dataSource": "vn" - }, - "WorkerTimeControlMail": { - "dataSource": "vn" } } diff --git a/back/models/worker-time-control-params.js b/back/models/worker-time-control-params.js deleted file mode 100644 index c71d4c237..000000000 --- a/back/models/worker-time-control-params.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = Self => { - require('../methods/imap-time-control/checkInbox')(Self); -}; diff --git a/back/methods/imap-time-control/checkInbox.js b/modules/worker/back/methods/worker-time-control-mail/checkInbox.js similarity index 97% rename from back/methods/imap-time-control/checkInbox.js rename to modules/worker/back/methods/worker-time-control-mail/checkInbox.js index 9411b95e5..fa42f8135 100644 --- a/back/methods/imap-time-control/checkInbox.js +++ b/modules/worker/back/methods/worker-time-control-mail/checkInbox.js @@ -35,6 +35,10 @@ module.exports = Self => { imap.once('ready', function() { openInbox(function(err, box) { if (err) throw err; + const totalMessages = box.messages.total; + if (totalMessages == 0) + imap.end(); + let f = imap.seq.fetch('1:*', { bodies: ['HEADER.FIELDS (FROM SUBJECT)', '1'], struct: true diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index 7a498fce7..e35e39721 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -55,6 +55,12 @@ }, "WorkerLog": { "dataSource": "vn" + }, + "WorkerTimeControlParams": { + "dataSource": "vn" + }, + "WorkerTimeControlMail": { + "dataSource": "vn" } } diff --git a/modules/worker/back/models/worker-time-control-mail.js b/modules/worker/back/models/worker-time-control-mail.js new file mode 100644 index 000000000..36f3851b6 --- /dev/null +++ b/modules/worker/back/models/worker-time-control-mail.js @@ -0,0 +1,3 @@ +module.exports = Self => { + require('../methods/worker-time-control-mail/checkInbox')(Self); +}; diff --git a/back/models/worker-time-control-mail.json b/modules/worker/back/models/worker-time-control-mail.json similarity index 100% rename from back/models/worker-time-control-mail.json rename to modules/worker/back/models/worker-time-control-mail.json diff --git a/back/models/worker-time-control-params.json b/modules/worker/back/models/worker-time-control-params.json similarity index 100% rename from back/models/worker-time-control-params.json rename to modules/worker/back/models/worker-time-control-params.json From 7693a1c449a0a6a93599a56cda637ce9a81044db Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 20 Nov 2020 15:05:57 +0100 Subject: [PATCH 07/35] 2569 - Section changes --- back/model-config.json | 3 + back/models/continent.json | 27 +++ db/changes/10250-curfew/03-continent.sql | 20 +++ db/changes/10250-curfew/04-country.sql | 13 ++ db/config.ini | 1 + db/dump/fixtures.sql | 42 ++--- front/core/components/th/index.html | 4 +- front/core/components/th/index.js | 16 +- front/core/components/th/style.scss | 10 +- front/salix/components/descriptor/index.html | 2 +- loopback/server/connectors/vn-mysql.js | 26 +++ .../back/methods/item/specs/getDiary.spec.js | 6 +- .../methods/travel/extraCommunityFilter.js | 162 ++++++++---------- .../travel/specs/extraCommunityFilter.spec.js | 66 +++++++ modules/travel/front/descriptor/locale/es.yml | 4 +- .../extra-community-search-panel/index.html | 91 ++++++++++ .../extra-community-search-panel/index.js | 7 + .../travel/front/extra-community/index.html | 120 +++++++++---- modules/travel/front/extra-community/index.js | 85 ++++++++- .../front/extra-community/index.spec.js | 47 +++++ .../front/extra-community/locale/es.yml | 9 +- .../travel/front/extra-community/style.scss | 40 ++++- modules/travel/front/index.js | 1 + modules/travel/front/routes.json | 2 +- modules/travel/front/summary/locale/es.yml | 4 +- 25 files changed, 635 insertions(+), 173 deletions(-) create mode 100644 back/models/continent.json create mode 100644 db/changes/10250-curfew/03-continent.sql create mode 100644 db/changes/10250-curfew/04-country.sql create mode 100644 modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js create mode 100644 modules/travel/front/extra-community-search-panel/index.html create mode 100644 modules/travel/front/extra-community-search-panel/index.js create mode 100644 modules/travel/front/extra-community/index.spec.js diff --git a/back/model-config.json b/back/model-config.json index da9feaa1f..277f933e1 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -20,6 +20,9 @@ "Container": { "dataSource": "storage" }, + "Continent": { + "dataSource": "vn" + }, "Collection": { "dataSource": "vn" }, diff --git a/back/models/continent.json b/back/models/continent.json new file mode 100644 index 000000000..090bada09 --- /dev/null +++ b/back/models/continent.json @@ -0,0 +1,27 @@ +{ + "name": "Continent", + "base": "VnModel", + "options": { + "mysql": { + "table": "continent" + } + }, + "properties": { + "id": { + "type": "number" + }, + "name": { + "type": "string" + }, + "code": { + "id": true, + "type": "string" + } + }, + "acls": [{ + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }] +} \ No newline at end of file diff --git a/db/changes/10250-curfew/03-continent.sql b/db/changes/10250-curfew/03-continent.sql new file mode 100644 index 000000000..279a73669 --- /dev/null +++ b/db/changes/10250-curfew/03-continent.sql @@ -0,0 +1,20 @@ +CREATE TABLE `vn`.continent +( + id TINYINT(4) AUTO_INCREMENT, + name VARCHAR(50) NOT NULL, + code VARCHAR(2) NOT NULL COLLATE utf8_general_ci, + CONSTRAINT continent_pk + PRIMARY KEY (id) +) + COMMENT 'World continents'; + +CREATE UNIQUE INDEX continent_name_uindex + ON `vn`.continent (name); + +INSERT IGNORE INTO `vn`.continent (`name`, `code`) + VALUES + ('Asia', 'AS'), + ('América', 'AM'), + ('África', 'AF'), + ('Europa', 'EU'), + ('Oceanía', 'OC'); \ No newline at end of file diff --git a/db/changes/10250-curfew/04-country.sql b/db/changes/10250-curfew/04-country.sql new file mode 100644 index 000000000..e7ffbc67f --- /dev/null +++ b/db/changes/10250-curfew/04-country.sql @@ -0,0 +1,13 @@ +ALTER TABLE `vn`.`country` + ADD COLUMN `continentFk` TINYINT(4) NULL AFTER `ibanLength`, + ADD INDEX `continent_id_fk_idx` (`continentFk` ASC); + +ALTER TABLE `vn`.`country` +ADD CONSTRAINT `continent_id_fk` + FOREIGN KEY (`continentFk`) + REFERENCES `vn`.`continent` (`id`) + ON DELETE NO ACTION + ON UPDATE CASCADE; + +UPDATE `vn`.`country` SET `continentFk` = '2' WHERE (`id` = '11'); +UPDATE `vn`.`country` SET `continentFk` = '2' WHERE (`id` = '13'); diff --git a/db/config.ini b/db/config.ini index 7800cadfd..2caf3c2b9 100644 --- a/db/config.ini +++ b/db/config.ini @@ -3,3 +3,4 @@ host = localhost port = 3306 user = root password = root +default-character-set=utf8 diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 2e00878d2..5503a0f7a 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -92,17 +92,17 @@ INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`, `userFk`,`bossF (109, 'HLK', 'Bruce' , 'Banner', 109, 19, 432978109), (110, 'JJJ', 'Jessica' , 'Jones' , 110, 19, 432978110); -INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`) +INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`) VALUES - (1, 'España', 1, 'ES', 1, 24), - (2, 'Italia', 1, 'IT', 1, 27), - (3, 'Alemania', 1, 'DE', 1, 22), - (4, 'Rumania', 1, 'RO', 1, 24), - (5, 'Holanda', 1, 'NL', 1, 18), - (8, 'Portugal', 1, 'PT', 1, 27), - (13,'Ecuador', 0, 'EC', 1, 24), - (19,'Francia', 1, 'FR', 1, 27), - (30,'Canarias', 1, 'IC', 1, 24); + (1, 'España', 1, 'ES', 1, 24, 4), + (2, 'Italia', 1, 'IT', 1, 27, 4), + (3, 'Alemania', 1, 'DE', 1, 22, 4), + (4, 'Rumania', 1, 'RO', 1, 24, 4), + (5, 'Holanda', 1, 'NL', 1, 18, 4), + (8, 'Portugal', 1, 'PT', 1, 27, 4), + (13,'Ecuador', 0, 'EC', 1, 24, 2), + (19,'Francia', 1, 'FR', 1, 27, 4), + (30,'Canarias', 1, 'IC', 1, 24, 4); INSERT INTO `hedera`.`language` (`code`, `name`, `orgName`, `isActive`) VALUES @@ -118,13 +118,13 @@ INSERT INTO `vn`.`warehouseAlias`(`id`, `name`) (1, 'Main Warehouse'), (2, 'Silla'); -INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`) +INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`, `countryFk`) VALUES - (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2), - (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2), - (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2), - (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2), - (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2); + (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2, 1), + (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2, 13), + (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2, 1), + (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2, 1), + (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2, 1); INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPreparedByPacking`, `code`, `pickingPlacement`, `path`) VALUES @@ -1250,11 +1250,11 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO (1, DATE_ADD(CURDATE(), INTERVAL -2 MONTH), DATE_ADD(CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1), (2, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150, 2000, 'second travel', 2, 2), (3, CURDATE(), CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1), - (4, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 50.00, 500, 'fourth travel', 0, 2), - (5, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 3, 2, 1, 50.00, 500, 'fifth travel', 1, 1), - (6, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 4, 2, 1, 50.00, 500, 'sixth travel', 1, 2), - (7, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 2, 1, 50.00, 500, 'seventh travel', 2, 1), - (8, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 2, 1, 50.00, 500, 'eight travel', 1, 2); + (4, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2), + (5, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1), + (6, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2), + (7, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1), + (8, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2); INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `ref`,`isInventory`, `isRaid`, `notes`, `evaNotes`) VALUES diff --git a/front/core/components/th/index.html b/front/core/components/th/index.html index 281c6866c..28d80695d 100644 --- a/front/core/components/th/index.html +++ b/front/core/components/th/index.html @@ -1 +1,3 @@ -
\ No newline at end of file +
+ +
\ No newline at end of file diff --git a/front/core/components/th/index.js b/front/core/components/th/index.js index 838431714..f815056f6 100644 --- a/front/core/components/th/index.js +++ b/front/core/components/th/index.js @@ -1,19 +1,10 @@ import ngModule from '../../module'; -import Component from '../../lib/component'; -import './style.scss'; - -export default class Th extends Component { - constructor($element, $, $transclude) { - super($element, $); +export default class Th { + constructor($element) { this._order = 'ASC'; this.column = $element[0]; $element.on('click', () => this.onToggleOrder()); - - $transclude($clone => { - const text = this.$t($clone.text()); // Not updating translations - $element.append(text ? text : $clone); - }); } /** @@ -81,9 +72,10 @@ export default class Th extends Component { } } -Th.$inject = ['$element', '$scope', '$transclude']; +Th.$inject = ['$element']; ngModule.vnComponent('vnTh', { + template: require('./index.html'), transclude: true, controller: Th, bindings: { diff --git a/front/core/components/th/style.scss b/front/core/components/th/style.scss index 6f575a02e..4982f8f89 100644 --- a/front/core/components/th/style.scss +++ b/front/core/components/th/style.scss @@ -6,18 +6,18 @@ vn-th { } vn-th[field] { - &.active:after { + &.active > :after { color: $color-font; opacity: 1; } - &.desc:after { + &.desc > :after { content: 'arrow_drop_down'; } - &.asc:after { + &.asc > :after { content: 'arrow_drop_up'; } - &:after { + & > :after { font-family: 'Material Icons'; content: 'arrow_drop_down'; position: absolute; @@ -27,7 +27,7 @@ vn-th[field] { opacity: 0 } - &:hover:after { + &:hover > :after { opacity: 1; } } \ No newline at end of file diff --git a/front/salix/components/descriptor/index.html b/front/salix/components/descriptor/index.html index 39c93006e..9b11c8b7d 100644 --- a/front/salix/components/descriptor/index.html +++ b/front/salix/components/descriptor/index.html @@ -17,7 +17,7 @@ ui-sref="{{::$ctrl.summaryState}}({id: $ctrl.descriptor.id})"> - diff --git a/loopback/server/connectors/vn-mysql.js b/loopback/server/connectors/vn-mysql.js index 5c625be85..4e1345cd6 100644 --- a/loopback/server/connectors/vn-mysql.js +++ b/loopback/server/connectors/vn-mysql.js @@ -84,6 +84,32 @@ class VnMySQL extends MySQL { return wrappedConnector.buildWhere(null, where); } + /** + * Constructs SQL GROUP BY clause from Loopback filter. + * + * @param {Object} group The group by definition + * @return {String} Built SQL group by + */ + makeGroupBy(group) { + if (!group) + return ''; + if (typeof group === 'string') + group = [group]; + + let clauses = []; + + for (let clause of group) { + let sqlGroup = ''; + let t = clause.split(/[\s,]+/); + + sqlGroup += this.escapeName(t[0]); + + clauses.push(sqlGroup); + } + + return `GROUP BY ${clauses.join(', ')}`; + } + /** * Constructs SQL order clause from Loopback filter. * diff --git a/modules/item/back/methods/item/specs/getDiary.spec.js b/modules/item/back/methods/item/specs/getDiary.spec.js index cf9ed9320..2903fc426 100644 --- a/modules/item/back/methods/item/specs/getDiary.spec.js +++ b/modules/item/back/methods/item/specs/getDiary.spec.js @@ -5,10 +5,8 @@ describe('item getBalance()', () => { let params = {where: {itemFk: 1, warehouseFk: 2}}; let result = await app.models.Item.getBalance(params); - expect(result.length).toBe(4); + expect(result.length).toBe(2); expect(result[0].balance).toBe(-100); - expect(result[1].balance).toBe(-110); - expect(result[2].balance).toBe(-110); - expect(result[3].balance).toBe(-210); + expect(result[1].balance).toBe(-200); }); }); diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js index 5b095328b..4a49b4401 100644 --- a/modules/travel/back/methods/travel/extraCommunityFilter.js +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -67,6 +67,10 @@ module.exports = Self => { arg: 'ref', type: 'string', description: 'The reference' + }, { + arg: 'continent', + type: 'string', + description: 'The continent code' } ], returns: { @@ -97,6 +101,8 @@ module.exports = Self => { return {'t.landed': {gte: value}}; case 'landedTo': return {'t.landed': {lte: value}}; + case 'continent': + return {'cnt.code': value}; case 'id': case 'agencyFk': case 'warehouseOutFk': @@ -107,17 +113,21 @@ module.exports = Self => { } }); - filter = mergeFilters(ctx.args.filter, {where}); + filter = mergeFilters(filter, {where}); let stmts = []; let stmt; + stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.travel'); stmt = new ParameterizedSQL( - `SELECT - tr.id, - tr.ref, - tr.shipped, - tr.landed, - tr.kg, + `CREATE TEMPORARY TABLE tmp.travel + (INDEX (id)) + ENGINE = MEMORY + SELECT + t.id, + t.ref, + t.shipped, + t.landed, + t.kg, am.id AS agencyModeFk, am.name AS agencyModeName, wo.id AS warehouseOutFk, @@ -126,102 +136,78 @@ module.exports = Self => { w.name AS warehouseInName, SUM(b.stickers) AS stickers, s.id AS supplierFk, - s.nickname AS supplierNickname - FROM travel tr - LEFT JOIN supplier s ON s.id = tr.cargoSupplierFk - LEFT JOIN entry e ON e.travelFk = tr.id + s.nickname AS cargoSupplierNickname, + CAST(SUM(i.density * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as loadedKg, + CAST(SUM(167.5 * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as volumeKg + FROM travel t + LEFT JOIN supplier s ON s.id = t.cargoSupplierFk + LEFT JOIN entry e ON e.travelFk = t.id LEFT JOIN buy b ON b.entryFk = e.id - LEFT JOIN packaging p ON p.id = b.packageFk + LEFT JOIN packaging pkg ON pkg.id = b.packageFk LEFT JOIN item i ON i.id = b.itemFk LEFT JOIN itemType it ON it.id = i.typeFk - JOIN warehouse w ON w.id = tr.warehouseInFk - JOIN warehouse wo ON wo.id = tr.warehouseOutFk - JOIN agencyMode am ON am.id = tr.agencyFk` + JOIN warehouse w ON w.id = t.warehouseInFk + JOIN warehouse wo ON wo.id = t.warehouseOutFk + JOIN country c ON c.id = wo.countryFk + LEFT JOIN continent cnt ON cnt.id = c.continentFk + JOIN agencyMode am ON am.id = t.agencyFk` ); - /* cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - pc.Alias as Carguera */ + stmt.merge(conn.makeWhere(filter.where)); + stmt.merge(conn.makeGroupBy('t.id')); + stmt.merge(conn.makeLimit(filter)); + stmts.push(stmt); - // WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") + const travelsIndex = stmts.push('SELECT * FROM tmp.travel') - 1; - stmt.merge('GROUP BY tr.id'); - // stmt.merge(conn.makeSuffix(filter)); - const itemsIndex = stmts.push(stmt) - 1; + stmt = new ParameterizedSQL( + `SELECT + e.id, + e.travelFk, + e.ref, + e.loadPriority, + s.name AS supplierName, + SUM(b.stickers) AS stickers, + e.evaNotes, + e.notes, + CAST(SUM(i.density * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as loadedkg, + CAST(SUM(167.5 * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000 ) as DECIMAL(10,0)) as volumeKg + FROM entry e + JOIN tmp.travel tr ON tr.id = e.travelFk + JOIN buy b ON b.entryFk = e.id + JOIN packaging pkg ON pkg.id = b.packageFk + JOIN item i ON i.id = b.itemFk + JOIN itemType it ON it.id = i.typeFk + JOIN supplier s ON s.id = e.supplierFk` + ); + + stmt.merge(conn.makeGroupBy('e.id')); + stmt.merge(conn.makeOrderBy(filter.order)); + const entriesIndex = stmts.push(stmt) - 1; + + stmts.push(`DROP TEMPORARY TABLE tmp.travel`); const sql = ParameterizedSQL.join(stmts, ';'); const result = await conn.executeStmt(sql); - return itemsIndex === 0 ? result : result[itemsIndex]; - /* - SET @vDateFrom:= TIMESTAMPADD(WEEK,-12,CURDATE()); + const travels = result[travelsIndex]; + const entries = result[entriesIndex]; - SELECT - 1 as IsTravel, - tr.id as travel, - NULL as Entrada, - ag.Agencia, - tr.ref, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(c.Etiquetas) as Etiquetas, - NULL as Notas_Eva, - kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedKg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - NULL as loadPriority, - NULL as Notas, - pc.Alias as Carguera - FROM travel tr - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - LEFT JOIN Entradas e ON e.travel_id = tr.id - LEFT JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - LEFT JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - LEFT JOIN Articles a ON a.Id_Article = c.Id_Article - LEFT JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - JOIN Agencias ag ON ag.Id_Agencia = tr.agency_id - WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY tr.id + const travelsMap = new Map(); + for (let travel of travels) + travelsMap.set(travel.id, travel); - UNION ALL + for (let entry of entries) { + const travel = travelsMap.get(entry.travelFk); - SELECT - 0 as IsTravel, - e.travel_id as travel, - e.Id_Entrada, - p.Proveedor, - e.Referencia, - tr.shipment, - wo.name as OrigenCajas, - tr.landing, - w.name as Destino, - sum(Etiquetas) as Etiquetas, - e.Notas_Eva, - NULL as kg, - cast(sum(a.density * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as loadedkg, - cast(sum(167.5 * c.Etiquetas * IF(cb.Volumen, cb.Volumen, cb.X * cb.Y * cb.Z) / 1000000 ) as DECIMAL(10,0)) as volumeKg, - loadPriority, - e.Notas, - pc.Alias as carguera + if (travel) { + if (!travel.entries) travel.entries = []; - FROM Entradas e - JOIN Compres c ON c.Id_Entrada = e.Id_Entrada - JOIN Cubos cb ON cb.Id_Cubo = c.Id_Cubo - JOIN Articles a ON a.Id_Article = c.Id_Article - JOIN Tipos tp ON tp.tipo_id = a.tipo_id - JOIN Proveedores p ON p.Id_Proveedor = e.Id_Proveedor - JOIN travel tr ON tr.id = e.travel_id - LEFT JOIN Proveedores pc ON pc.Id_Proveedor = tr.cargoSupplierFk - JOIN warehouse w ON w.id = tr.warehouse_id - JOIN warehouse wo ON wo.id = tr.warehouse_id_out - WHERE tr.landing >= @vDateFrom AND (wo.name="Colombia" OR wo.name="Ecuador") - GROUP BY e.Id_Entrada - ) sub - ORDER BY landing ASC, shipment ASC,travel, IsTravel DESC, (loadPriority > 0) DESC,loadPriority, Agencia, Notas_Eva ; */ + travel.entries.push(entry); + } + } + + return travels; }; }; diff --git a/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js new file mode 100644 index 000000000..7f42eb5f0 --- /dev/null +++ b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js @@ -0,0 +1,66 @@ +const app = require('vn-loopback/server/server'); + +describe('Travel extraCommunityFilter()', () => { + const filter = { + order: 'landed ASC, shipped ASC, travelFk, loadPriority, agencyModeFk, evaNotes', + }; + it('should return the travel matching "search"', async() => { + const ctx = { + args: { + search: 2 + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + const firstRow = result[0]; + const entries = firstRow.entries; + + expect(result.length).toEqual(1); + expect(firstRow.id).toEqual(2); + expect(entries.length).toEqual(2); + }); + + it('should return the travel matching "search" by ref', async() => { + const ctx = { + args: { + search: 'third' + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + const firstRow = result[0]; + + expect(result.length).toEqual(1); + expect(firstRow.id).toEqual(3); + }); + + it('should return the travel matching "warehouse out"', async() => { + const ctx = { + args: { + warehouseOutFk: 2 + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + + expect(result.length).toEqual(3); + }); + + it('should return the routes matching "landed from" and "landed to"', async() => { + const from = new Date(); + const to = new Date(); + from.setHours(0, 0, 0, 0); + to.setHours(23, 59, 59, 999); + to.setDate(to.getDate() + 14); + const ctx = { + args: { + landedFrom: from, + landedTo: to + } + }; + + const result = await app.models.Travel.extraCommunityFilter(ctx, filter); + + expect(result.length).toEqual(1); + }); +}); diff --git a/modules/travel/front/descriptor/locale/es.yml b/modules/travel/front/descriptor/locale/es.yml index 0ae18fdbf..3e6d62735 100644 --- a/modules/travel/front/descriptor/locale/es.yml +++ b/modules/travel/front/descriptor/locale/es.yml @@ -1,6 +1,6 @@ Reference: Referencia -Wh. In: Almacén entrada -Wh. Out: Almacén salida +Wh. In: Alm. entrada +Wh. Out: Alm. salida Shipped: F. envío Landed: F. entrega Total entries: Entradas totales \ No newline at end of file diff --git a/modules/travel/front/extra-community-search-panel/index.html b/modules/travel/front/extra-community-search-panel/index.html new file mode 100644 index 000000000..85a30907a --- /dev/null +++ b/modules/travel/front/extra-community-search-panel/index.html @@ -0,0 +1,91 @@ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/modules/travel/front/extra-community-search-panel/index.js b/modules/travel/front/extra-community-search-panel/index.js new file mode 100644 index 000000000..63d404b4b --- /dev/null +++ b/modules/travel/front/extra-community-search-panel/index.js @@ -0,0 +1,7 @@ +import ngModule from '../module'; +import SearchPanel from 'core/components/searchbar/search-panel'; + +ngModule.vnComponent('vnExtraCommunitySearchPanel', { + template: require('./index.html'), + controller: SearchPanel +}); diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index 1007f223a..e9f11ba0a 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,49 +1,111 @@ + data="travels" + order="landed ASC, shipped ASC, travelFk, loadPriority, agencyModeFk, evaNotes" + limit="20"> - - -
- - - - - {{travel.id}} - {{travel.supplierNickname}} - - - - - - +
+ + + + + diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js index 685958909..bd362f34f 100644 --- a/modules/travel/front/extra-community/index.js +++ b/modules/travel/front/extra-community/index.js @@ -2,7 +2,90 @@ import ngModule from '../module'; import Section from 'salix/components/section'; import './style.scss'; +class Controller extends Section { + constructor($element, $) { + super($element, $); + + const draggable = this.element.querySelector('.travel-list'); + draggable.addEventListener('dragstart', + event => this.dragStart(event)); + draggable.addEventListener('dragend', + event => this.dragEnd(event)); + + this.draggableElement = 'a[draggable]'; + this.droppableElement = 'vn-table[vn-droppable]'; + + const scopeDays = 14; + const landedFrom = new Date(); + landedFrom.setHours(0, 0, 0, 0); + + const landedTo = new Date(); + landedTo.setDate(landedTo.getDate() + scopeDays); + landedTo.setHours(23, 59, 59, 59); + + this.defaultFilter = { + landedFrom: landedFrom, + landedTo: landedTo, + continent: 'AM' + }; + } + + findDraggable($event) { + const target = $event.target; + const draggable = target.closest(this.draggableElement); + + return draggable; + } + + findDroppable($event) { + const target = $event.target; + const droppable = target.closest(this.droppableElement); + + return droppable; + } + + dragStart($event) { + const draggable = this.findDraggable($event); + draggable.classList.add('dragging'); + + const id = draggable.getAttribute('id'); + this.entryId = id; + this.entry = draggable; + } + + dragEnd($event) { + const draggable = this.findDraggable($event); + draggable.classList.remove('dragging'); + this.entryId = null; + this.entry = null; + } + + onDrop($event) { + const model = this.$.model; + const droppable = this.findDroppable($event); + const travelId = droppable.getAttribute('id'); + + const currentDroppable = this.entry.closest(this.droppableElement); + + if (currentDroppable == droppable) return; + + if (this.entryId && travelId) { + const path = `Entries/${this.entryId}`; + this.$http.patch(path, {travelFk: travelId}) + .then(() => model.refresh()) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } + } + + changeReference(travel) { + const params = {ref: travel.ref}; + const endpoint = `Travels/${travel.id}`; + this.$http.patch(endpoint, params) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } +} + ngModule.vnComponent('vnTravelExtraCommunity', { template: require('./index.html'), - controller: Section + controller: Controller }); diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js new file mode 100644 index 000000000..54f5e505f --- /dev/null +++ b/modules/travel/front/extra-community/index.spec.js @@ -0,0 +1,47 @@ +import './index.js'; + +describe('Travel Component vnTravelExtraCommunity', () => { + let controller; + let $httpBackend; + let travel = { + id: 1, + warehouseInFk: 1, + totalEntries: 3, + isDelivered: false + }; + + beforeEach(ngModule('travel')); + + beforeEach(inject(($componentController, _$httpBackend_) => { + $httpBackend = _$httpBackend_; + const $element = angular.element(''); + controller = $componentController('vnTravelExtraCommunity', {$element}); + controller.$.summary = {show: jasmine.createSpy('show')}; + })); + + describe('changeReference()', () => { + it('should make an HTTP query', () => { + jest.spyOn(controller.vnApp, 'showSuccess'); + + const travel = {id: 1, ref: 'New reference'}; + const expectedData = {ref: 'New reference'}; + $httpBackend.expect('PATCH', `Travels/${travel.id}`, expectedData).respond(200); + controller.changeReference(travel); + $httpBackend.flush(); + + expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Data saved!'); + }); + }); + + xdescribe('changeReference()', () => { + it('should make an HTTP query', () => { + let event = new MouseEvent('click', { + bubbles: true, + cancelable: true + }); + controller.preview(event, travel); + + expect(controller.$.summary.show).toHaveBeenCalledWith(); + }); + }); +}); diff --git a/modules/travel/front/extra-community/locale/es.yml b/modules/travel/front/extra-community/locale/es.yml index aa231d3be..e377a1011 100644 --- a/modules/travel/front/extra-community/locale/es.yml +++ b/modules/travel/front/extra-community/locale/es.yml @@ -1 +1,8 @@ -Family: Familia \ No newline at end of file +Family: Familia +Extra community: Extra comunitarios +Freighter: Transitario +Bl. KG: KG Bloq. +Phy. KG: KG físico +Vol. KG: KG Vol. +Search by travel id or reference: Buscar por id travel o referencia +Continent Out: Continente salida \ No newline at end of file diff --git a/modules/travel/front/extra-community/style.scss b/modules/travel/front/extra-community/style.scss index 5a929908c..e7265781d 100644 --- a/modules/travel/front/extra-community/style.scss +++ b/modules/travel/front/extra-community/style.scss @@ -3,7 +3,6 @@ vn-travel-extra-community { .header { margin-bottom: 16px; - text-transform: uppercase; font-size: 1.25rem; line-height: 1; padding: 7px; @@ -11,15 +10,46 @@ vn-travel-extra-community { padding-bottom: 4px; font-weight: lighter; background-color: #fde6ca; + color: $color-font-light; border-bottom: 1px solid #f7931e; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } - vn-table vn-th.waste-family, - vn-table vn-td.waste-family { - max-width: 64px; - width: 64px + vn-td-editable text { + background-color: transparent; + padding: 0; + border: 0; + border-bottom: 1px dashed $color-active; + border-radius: 0; + color: $color-active + } + + vn-td-editable text:after { + font-family: 'Material Icons'; + content: 'edit'; + position: absolute; + margin-left: 5px; + color: $color-spacer + } + + vn-table[vn-droppable] { + border-radius: 0; + } + + a[draggable] { + transition: all .5s; + cursor: move; + outline: 0; + } + + a[draggable]:hover { + background-color: $color-hover-cd + } + + a[draggable].dragging { + background-color: $color-success-light; + font-weight:bold } } \ No newline at end of file diff --git a/modules/travel/front/index.js b/modules/travel/front/index.js index 410cbe219..60953e9a2 100644 --- a/modules/travel/front/index.js +++ b/modules/travel/front/index.js @@ -14,3 +14,4 @@ import './thermograph/create/'; import './thermograph/edit/'; import './descriptor-popover'; import './extra-community'; +import './extra-community-search-panel'; diff --git a/modules/travel/front/routes.json b/modules/travel/front/routes.json index 30792278e..b2e438c6d 100644 --- a/modules/travel/front/routes.json +++ b/modules/travel/front/routes.json @@ -93,7 +93,7 @@ "acl": ["buyer"] }, { - "url": "/extra-community", + "url": "/extra-community?q", "state": "travel.extraCommunity", "component": "vn-travel-extra-community", "description": "Extra community", diff --git a/modules/travel/front/summary/locale/es.yml b/modules/travel/front/summary/locale/es.yml index 8d2e7e78c..74ddfe03e 100644 --- a/modules/travel/front/summary/locale/es.yml +++ b/modules/travel/front/summary/locale/es.yml @@ -1,6 +1,6 @@ Reference: Referencia -Warehouse In: Almacen entrada -Warehouse Out: Almacen salida +Warehouse In: Almacén entrada +Warehouse Out: Almacén salida Shipped: F. envío Landed: F. entrega Total entries: Entradas totales From 03158f04ae5199fdf43bb46f0f79b4ad66cb20a9 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 08:12:33 +0100 Subject: [PATCH 08/35] Updated front unit tests --- .../back/methods/travel/specs/filter.spec.js | 2 +- modules/travel/front/extra-community/index.js | 4 +- .../front/extra-community/index.spec.js | 112 +++++++++++++++--- 3 files changed, 99 insertions(+), 19 deletions(-) diff --git a/modules/travel/back/methods/travel/specs/filter.spec.js b/modules/travel/back/methods/travel/specs/filter.spec.js index d04b0f093..ababe961e 100644 --- a/modules/travel/back/methods/travel/specs/filter.spec.js +++ b/modules/travel/back/methods/travel/specs/filter.spec.js @@ -38,7 +38,7 @@ describe('Travel filter()', () => { const result = await app.models.Travel.filter(ctx); - expect(result.length).toEqual(8); + expect(result.length).toEqual(3); }); it('should return the travel matching "total entries"', async() => { diff --git a/modules/travel/front/extra-community/index.js b/modules/travel/front/extra-community/index.js index bd362f34f..221d6cb0d 100644 --- a/modules/travel/front/extra-community/index.js +++ b/modules/travel/front/extra-community/index.js @@ -48,7 +48,7 @@ class Controller extends Section { const draggable = this.findDraggable($event); draggable.classList.add('dragging'); - const id = draggable.getAttribute('id'); + const id = parseInt(draggable.id); this.entryId = id; this.entry = draggable; } @@ -63,7 +63,7 @@ class Controller extends Section { onDrop($event) { const model = this.$.model; const droppable = this.findDroppable($event); - const travelId = droppable.getAttribute('id'); + const travelId = parseInt(droppable.id); const currentDroppable = this.entry.closest(this.droppableElement); diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js index 54f5e505f..581002f18 100644 --- a/modules/travel/front/extra-community/index.spec.js +++ b/modules/travel/front/extra-community/index.spec.js @@ -3,20 +3,15 @@ import './index.js'; describe('Travel Component vnTravelExtraCommunity', () => { let controller; let $httpBackend; - let travel = { - id: 1, - warehouseInFk: 1, - totalEntries: 3, - isDelivered: false - }; beforeEach(ngModule('travel')); beforeEach(inject(($componentController, _$httpBackend_) => { $httpBackend = _$httpBackend_; - const $element = angular.element(''); + const $element = angular.element('
'); controller = $componentController('vnTravelExtraCommunity', {$element}); - controller.$.summary = {show: jasmine.createSpy('show')}; + controller.$.model = {}; + controller.$.model.refresh = jest.fn(); })); describe('changeReference()', () => { @@ -33,15 +28,100 @@ describe('Travel Component vnTravelExtraCommunity', () => { }); }); - xdescribe('changeReference()', () => { - it('should make an HTTP query', () => { - let event = new MouseEvent('click', { - bubbles: true, - cancelable: true - }); - controller.preview(event, travel); + describe('findDraggable()', () => { + it('should find the draggable element', () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); - expect(controller.$.summary.show).toHaveBeenCalledWith(); + const $event = new Event('dragstart'); + const target = document.createElement('div'); + draggable.appendChild(target); + target.dispatchEvent($event); + + const result = controller.findDraggable($event); + + expect(result).toEqual(draggable); + }); + }); + + describe('findDroppable()', () => { + it('should find the droppable element', () => { + const droppable = document.createElement('vn-table'); + droppable.setAttribute('vn-droppable', true); + + const $event = new Event('drop'); + const target = document.createElement('div'); + droppable.appendChild(target); + target.dispatchEvent($event); + + const result = controller.findDroppable($event); + + expect(result).toEqual(droppable); + }); + }); + + describe('dragStart()', () => { + it(`should add the class "dragging" to the draggable element + and then set the entryId controller property`, () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); + draggable.setAttribute('id', 3); + + jest.spyOn(controller, 'findDraggable').mockReturnValue(draggable); + + const $event = new Event('dragStart'); + controller.dragStart($event); + + const firstClass = draggable.classList[0]; + + expect(firstClass).toEqual('dragging'); + expect(controller.entryId).toEqual(3); + expect(controller.entry).toEqual(draggable); + }); + }); + + fdescribe('dragEnd()', () => { + it(`should remove the class "dragging" from the draggable element + and then set the entryId controller property to null`, () => { + const draggable = document.createElement('a'); + draggable.setAttribute('draggable', true); + draggable.setAttribute('id', 3); + draggable.classList.add('dragging'); + + jest.spyOn(controller, 'findDraggable').mockReturnValue(draggable); + + const $event = new Event('dragStart'); + controller.dragEnd($event); + + const classList = draggable.classList; + + expect(classList.length).toEqual(0); + expect(controller.entryId).toBeNull(); + expect(controller.entry).toBeNull(); + }); + }); + + describe('onDrop()', () => { + it('should make an HTTP patch query', () => { + const droppable = document.createElement('vn-table'); + droppable.setAttribute('vn-droppable', true); + droppable.setAttribute('id', 1); + + jest.spyOn(controller, 'findDroppable').mockReturnValue(droppable); + + const oldDroppable = document.createElement('vn-table'); + oldDroppable.setAttribute('vn-droppable', true); + const entry = document.createElement('div'); + oldDroppable.appendChild(entry); + + controller.entryId = 3; + controller.entry = entry; + + const $event = new Event('drop'); + const expectedData = {travelFk: 1}; + $httpBackend.expect('PATCH', `Entries/3`, expectedData).respond(200); + controller.onDrop($event); + $httpBackend.flush(); }); }); }); From 4028444d0abc9138d0f15c703399d2cd46a338dc Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 10:03:12 +0100 Subject: [PATCH 09/35] front config refactor + package projects --- jest.config.js | 206 ------------------------------------------- jest.front.config.js | 51 +++++++++++ package.json | 9 +- 3 files changed, 59 insertions(+), 207 deletions(-) delete mode 100644 jest.config.js create mode 100644 jest.front.config.js diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 874d9ac0b..000000000 --- a/jest.config.js +++ /dev/null @@ -1,206 +0,0 @@ -// For a detailed explanation regarding each configuration property, visit: -// https://jestjs.io/docs/en/configuration.html - -module.exports = { - - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // Respect "browser" field in package.json when resolving modules - // browser: false, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/_b/2qg94x6n3kd0h_71bp2426wm0000gn/T/jest_dx", - - // Automatically clear mock calls and instances between every test - // clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: null, - - // The directory where Jest should output its coverage files - coverageDirectory: 'coverage', - - // An array of regexp pattern strings used to skip coverage collection - coveragePathIgnorePatterns: [ - '/node_modules/', - '.spec.js' - ], - - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: null, - - // A path to a custom dependency extractor - // dependencyExtractor: null, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: null, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: null, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: [ - `front`, - `modules`, - `front/node_modules`, - `node_modules`, - `print` - ], - - // An array of file extensions your modules use - moduleFileExtensions: [ - 'js', - // "json", - // "jsx", - // "ts", - // "tsx", - // "node" - ], - - // A map from regular expressions to module names that allow to stub out resources with a single module - moduleNameMapper: { - '\\.(css|scss)$': 'identity-obj-proxy', - '\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/fileMock.js', - }, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - // preset: null, - - // Run tests from one or more projects - // projects: null, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state between every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: null, - - // Automatically restore mock state between every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: null, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - setupFilesAfterEnv: [ - './jest-front.js' - ], - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: 'node', - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - testMatch: [ - '**/front/**/*.spec.js', - '**/print/**/*.spec.js', - // 'loopback/**/*.spec.js', - // 'modules/*/back/**/*.spec.js' - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: null, - - // This option allows use of a custom test runner - // testRunner: "jasmine2", - - // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href - testURL: 'http://localhost', - - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", - - // A map from regular expressions to paths to transformers - transform: { - '^.+\\.js?$': 'babel-jest', - '^.+\\.html$': 'html-loader-jest' - }, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // '/node_modules/' - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - verbose: false, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -}; diff --git a/jest.front.config.js b/jest.front.config.js new file mode 100644 index 000000000..dbea13950 --- /dev/null +++ b/jest.front.config.js @@ -0,0 +1,51 @@ +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + name: 'front end', + displayName: { + name: 'Front end', + color: 'cyan', + }, + testEnvironment: 'jsdom', + setupFilesAfterEnv: [ + './jest-front.js' + ], + testMatch: [ + '**/front/**/*.spec.js', + '**/print/**/*.spec.js', + 'loopback/**/*.spec.js', + 'modules/*/back/**/*.spec.js' + ], + testPathIgnorePatterns: [ + '/node_modules/' + ], + coveragePathIgnorePatterns: [ + '/node_modules/', + '.spec.js' + ], + moduleDirectories: [ + `front`, + `modules`, + `front/node_modules`, + `node_modules`, + `print` + ], + moduleFileExtensions: [ + 'js', + ], + moduleNameMapper: { + '\\.(css|scss)$': 'identity-obj-proxy', + '\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/fileMock.js', + }, + testURL: 'http://localhost', + verbose: false, + errorOnDeprecated: true, + restoreMocks: true, + timers: 'real', + transform: { + '^.+\\.js?$': 'babel-jest', + '^.+\\.html$': 'html-loader-jest' + }, +}; + diff --git a/package.json b/package.json index c59451466..a384e59c7 100644 --- a/package.json +++ b/package.json @@ -101,5 +101,12 @@ "back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back", "lint": "eslint ./ --cache --ignore-pattern .gitignore", "docker": "docker build -t salix-db ./db" - } + }, + + "jest": { + "projects": [ + "jest.front.config.js", + "jest.back.config.js" + ] + } } From 2e644c4c7dc6ac87b32e612ea730014a260b3f8b Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 10:04:11 +0100 Subject: [PATCH 10/35] back end files --- jest-back.js | 0 jest.back.config.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 jest-back.js create mode 100644 jest.back.config.js diff --git a/jest-back.js b/jest-back.js new file mode 100644 index 000000000..e69de29bb diff --git a/jest.back.config.js b/jest.back.config.js new file mode 100644 index 000000000..07d106f97 --- /dev/null +++ b/jest.back.config.js @@ -0,0 +1,43 @@ +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + name: 'Back end', + displayName: { + name: 'Back end', + color: 'blue', + }, + testEnvironment: 'node', + setupFilesAfterEnv: [ + './jest-back.js' + ], + testMatch: [ + 'loopback/**/*.spec.js', + 'modules/*/back/**/*.spec.js' + ], + testPathIgnorePatterns: [ + '/node_modules/' + ], + coveragePathIgnorePatterns: [ + '/node_modules/', + '.spec.js' + ], + moduleFileExtensions: [ + 'js', + ], + moduleNameMapper: { + '\\.(css|scss)$': 'identity-obj-proxy', + '\\.(jpg|ico|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '/fileMock.js', + }, + testURL: 'http://localhost', + verbose: false, + errorOnDeprecated: true, + restoreMocks: true, + timers: 'real', + transform: { + '^.+\\.js?$': 'babel-jest', + '^.+\\.html$': 'html-loader-jest' + }, + +}; + From 37ac312bd5ac190c74c4d32165f2af6713da3810 Mon Sep 17 00:00:00 2001 From: bernat Date: Mon, 23 Nov 2020 13:05:24 +0100 Subject: [PATCH 11/35] pr changes --- modules/route/back/methods/route/specs/ticketToRoute.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/route/back/methods/route/specs/ticketToRoute.spec.js b/modules/route/back/methods/route/specs/ticketToRoute.spec.js index 86206ab42..83c1d5080 100644 --- a/modules/route/back/methods/route/specs/ticketToRoute.spec.js +++ b/modules/route/back/methods/route/specs/ticketToRoute.spec.js @@ -26,7 +26,7 @@ describe('route ticketToRoute()', () => { done(); }); - it('should add the ticket in a route', async() => { + it('should add the ticket to a route', async() => { originalTicket = await app.models.Ticket.findById(14); const ticketId = 14; From c654e14cfe04476038c849efea202a163c284e57 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 13:41:51 +0100 Subject: [PATCH 12/35] 2611 - Summary go to entity --- front/core/styles/font-family.scss | 2 +- .../styles/fonts/MaterialIcons-Regular.woff2 | Bin 0 -> 94744 bytes .../styles/icons/MaterialIcons-Regular.woff2 | Bin 82512 -> 0 bytes front/salix/components/summary/index.js | 8 ++++ front/salix/components/summary/style.scss | 38 ++++++++++++++++ modules/account/front/locale/es.yml | 1 + modules/account/front/summary/index.html | 10 +++- modules/account/front/summary/index.js | 4 +- modules/claim/front/locale/es.yml | 1 + modules/claim/front/summary/index.html | 10 +++- modules/claim/front/summary/index.js | 4 +- modules/client/front/summary/index.html | 12 ++++- modules/client/front/summary/index.js | 4 +- modules/client/front/summary/locale/es.yml | 1 + modules/entry/front/summary/index.html | 10 +++- modules/entry/front/summary/index.js | 4 +- modules/entry/front/summary/locale/es.yml | 2 + modules/invoiceOut/front/summary/index.html | 10 +++- modules/invoiceOut/front/summary/index.js | 4 +- .../invoiceOut/front/summary/locale/es.yml | 3 +- modules/item/front/summary/index.html | 10 +++- modules/item/front/summary/index.js | 4 +- modules/item/front/summary/locale/es.yml | 3 +- modules/order/front/locale/es.yml | 3 +- modules/order/front/summary/index.html | 6 +++ modules/order/front/summary/index.js | 4 +- modules/order/front/summary/style.scss | 15 ------ modules/route/front/summary/index.html | 10 +++- modules/route/front/summary/index.js | 4 +- modules/route/front/summary/locale/es.yml | 3 +- modules/supplier/front/summary/index.html | 10 +++- modules/supplier/front/summary/index.js | 4 +- modules/supplier/front/summary/locale/es.yml | 3 +- modules/ticket/front/summary/index.html | 6 +-- modules/ticket/front/summary/index.js | 4 +- modules/ticket/front/summary/locale/es.yml | 2 +- modules/ticket/front/summary/style.scss | 43 ++---------------- modules/travel/front/summary/index.html | 10 +++- modules/travel/front/summary/index.js | 4 +- modules/travel/front/summary/locale/es.yml | 1 + modules/worker/front/locale/es.yml | 3 +- modules/worker/front/summary/index.html | 10 +++- modules/worker/front/summary/index.js | 4 +- modules/zone/front/index/index.html | 2 +- modules/zone/front/locale/es.yml | 3 +- modules/zone/front/summary/index.html | 10 +++- modules/zone/front/summary/index.js | 4 +- 47 files changed, 208 insertions(+), 105 deletions(-) create mode 100644 front/core/styles/fonts/MaterialIcons-Regular.woff2 delete mode 100644 front/core/styles/icons/MaterialIcons-Regular.woff2 diff --git a/front/core/styles/font-family.scss b/front/core/styles/font-family.scss index 24d9bbe43..91159c5b4 100644 --- a/front/core/styles/font-family.scss +++ b/front/core/styles/font-family.scss @@ -14,7 +14,7 @@ font-family: 'Material Icons'; font-style: normal; font-weight: 400; - src: url('./icons/MaterialIcons-Regular.woff2') format('woff2'); + src: url(./fonts/MaterialIcons-Regular.woff2) format('woff2'); } .material-icons { diff --git a/front/core/styles/fonts/MaterialIcons-Regular.woff2 b/front/core/styles/fonts/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9d1dfcc70d7c7c0fc78aec9d6a46fb4ca50564f9 GIT binary patch literal 94744 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 literal 0 HcmV?d00001 diff --git a/front/core/styles/icons/MaterialIcons-Regular.woff2 b/front/core/styles/icons/MaterialIcons-Regular.woff2 deleted file mode 100644 index 2b86ebfe6826a4ce14ed3682edb20d4d12a88978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82512 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 .vn-summary { + h5 > a[name="goToSummary"], + h5 * > vn-icon-button[icon="more_vert"] { + display: none + } +} + .summary { margin: 0 auto; max-width: 950px; & > h5 { + display: flex; + justify-content: space-between; + align-items: center; + align-content: center; padding: $spacing-sm; border: none; background: $color-main; @@ -15,6 +27,32 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + + & > a > vn-icon-button[icon="launch"] { + @extend %clickable; + color: $color-font-dark; + display: flex; + min-width: 45px; + height: 45px; + box-sizing: border-box; + align-items: center; + justify-content: center; + + & > vn-icon { + padding: 10px; + } + vn-icon { + font-size: 1.75rem; + } + } + + span { + flex: 1; + } + + vn-button { + flex: none + } } & > vn-horizontal { flex-wrap: wrap; diff --git a/modules/account/front/locale/es.yml b/modules/account/front/locale/es.yml index 02c58a8b0..18e2c06a1 100644 --- a/modules/account/front/locale/es.yml +++ b/modules/account/front/locale/es.yml @@ -8,3 +8,4 @@ Role: Rol Mail aliases: Alias de correo Account not enabled: Cuenta no habilitada Inherited roles: Roles heredados +Go to the user: Ir al usuario \ No newline at end of file diff --git a/modules/account/front/summary/index.html b/modules/account/front/summary/index.html index 7f390f17c..9c96a9703 100644 --- a/modules/account/front/summary/index.html +++ b/modules/account/front/summary/index.html @@ -1,5 +1,13 @@ -

{{summary.nickname}}
+
+ + + + {{summary.id}} - {{summary.nickname}} +

Basic data

diff --git a/modules/account/front/summary/index.js b/modules/account/front/summary/index.js index 31c2d7d69..21be84660 100644 --- a/modules/account/front/summary/index.js +++ b/modules/account/front/summary/index.js @@ -1,7 +1,7 @@ import ngModule from '../module'; -import Component from 'core/lib/component'; +import Summary from 'salix/components/summary'; -class Controller extends Component { +class Controller extends Summary { set user(value) { this._user = value; this.$.summary = null; diff --git a/modules/claim/front/locale/es.yml b/modules/claim/front/locale/es.yml index 5570896c1..dcbb2c484 100644 --- a/modules/claim/front/locale/es.yml +++ b/modules/claim/front/locale/es.yml @@ -16,3 +16,4 @@ Search claim by id or client name: Buscar reclamaciones por identificador o nomb Claim deleted!: Reclamación eliminada! claim: reclamación Photos: Fotos +Go to the claim: Ir a la reclamación diff --git a/modules/claim/front/summary/index.html b/modules/claim/front/summary/index.html index 399a6299b..f4e9c1471 100644 --- a/modules/claim/front/summary/index.html +++ b/modules/claim/front/summary/index.html @@ -3,7 +3,15 @@ data="photos"> -
{{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}}
+
+ + + + {{::$ctrl.summary.claim.id}} - {{::$ctrl.summary.claim.client.name}} +
-
{{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}}
+
+ + + + + {{$ctrl.summary.name}} - {{$ctrl.summary.id}} - {{$ctrl.summary.salesPersonUser.name}} + +

Basic data

diff --git a/modules/client/front/summary/index.js b/modules/client/front/summary/index.js index 5737e2df4..cf5991247 100644 --- a/modules/client/front/summary/index.js +++ b/modules/client/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { $onChanges() { if (!this.client) return; diff --git a/modules/client/front/summary/locale/es.yml b/modules/client/front/summary/locale/es.yml index 24068e4ad..0a101f6ef 100644 --- a/modules/client/front/summary/locale/es.yml +++ b/modules/client/front/summary/locale/es.yml @@ -17,3 +17,4 @@ Verdnatura's maximum risk: Riesgo máximo asumido por Verdnatura Solunion's maximum risk: Riesgo máximo asumido por Solunion Invoices minus payments: Facturas menos recibos Deviated invoices minus payments: Facturas fuera de plazo menos recibos +Go to the client: Ir al cliente diff --git a/modules/entry/front/summary/index.html b/modules/entry/front/summary/index.html index d97adfdd7..6d5387459 100644 --- a/modules/entry/front/summary/index.html +++ b/modules/entry/front/summary/index.html @@ -1,5 +1,13 @@ -
Entry #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}}
+
+ + + + #{{$ctrl.entryData.id}} - {{$ctrl.entryData.supplier.nickname}} +
-
{{$ctrl.summary.invoiceOut.ref}} - {{$ctrl.summary.invoiceOut.client.socialName}}
+
+ + + + {{$ctrl.summary.invoiceOut.ref}} - {{$ctrl.summary.invoiceOut.client.socialName}} +
-
{{$ctrl.item.id}} - {{$ctrl.summary.item.name}}
+
+ + + + {{$ctrl.item.id}} - {{$ctrl.summary.item.name}} +
{ this.summary = response.data; diff --git a/modules/item/front/summary/locale/es.yml b/modules/item/front/summary/locale/es.yml index 3324e13d5..28e1e964b 100644 --- a/modules/item/front/summary/locale/es.yml +++ b/modules/item/front/summary/locale/es.yml @@ -1,3 +1,4 @@ Niche: Nichos Barcode: Códigos de barras -Other data: Otros datos \ No newline at end of file +Other data: Otros datos +Go to the item: Ir al artículo \ No newline at end of file diff --git a/modules/order/front/locale/es.yml b/modules/order/front/locale/es.yml index 5ecc1093f..62f711659 100644 --- a/modules/order/front/locale/es.yml +++ b/modules/order/front/locale/es.yml @@ -26,4 +26,5 @@ Confirm lines: Confirmar las lineas Confirm: Confirmar Real hour: Hora real T. Hour: Hora T. -Theoretical hour: Hora Teórica \ No newline at end of file +Theoretical hour: Hora Teórica +Go to the order: Ir al pedido \ No newline at end of file diff --git a/modules/order/front/summary/index.html b/modules/order/front/summary/index.html index e66d1024b..8f78ce460 100644 --- a/modules/order/front/summary/index.html +++ b/modules/order/front/summary/index.html @@ -1,5 +1,11 @@
+ + + Ticket #{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} ({{$ctrl.summary.client.salesPersonFk}}) diff --git a/modules/order/front/summary/index.js b/modules/order/front/summary/index.js index 2ee07872c..cc1df8f5d 100644 --- a/modules/order/front/summary/index.js +++ b/modules/order/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { setSummary() { this.$http.get(`Orders/${this.order.id}/summary`) .then(res => this.summary = res.data); diff --git a/modules/order/front/summary/style.scss b/modules/order/front/summary/style.scss index 63de20fe9..a2537c58f 100644 --- a/modules/order/front/summary/style.scss +++ b/modules/order/front/summary/style.scss @@ -3,21 +3,6 @@ vn-order-summary .summary{ max-width: $width-lg; - h5 { - display: flex; - justify-content: space-between; - align-items: center; - align-content: center; - - - span { - flex: 1; - } - - vn-button { - flex: none - } - } & > vn-horizontal > vn-one { min-width: 160px; diff --git a/modules/route/front/summary/index.html b/modules/route/front/summary/index.html index a6d482a2c..6dd01c8b0 100644 --- a/modules/route/front/summary/index.html +++ b/modules/route/front/summary/index.html @@ -1,5 +1,13 @@ -
{{$ctrl.summary.route.id}} - {{$ctrl.summary.route.description}}
+
+ + + + {{$ctrl.summary.route.id}} - {{$ctrl.summary.route.description}} +
-
{{::$ctrl.summary.name}} - {{::$ctrl.summary.id}}
+
+ + + + {{::$ctrl.summary.name}} - {{::$ctrl.summary.id}} +

Basic data

diff --git a/modules/supplier/front/summary/index.js b/modules/supplier/front/summary/index.js index 2fe289c49..099257848 100644 --- a/modules/supplier/front/summary/index.js +++ b/modules/supplier/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { $onChanges() { if (!this.supplier) return; diff --git a/modules/supplier/front/summary/locale/es.yml b/modules/supplier/front/summary/locale/es.yml index d39d107f8..6afaf857d 100644 --- a/modules/supplier/front/summary/locale/es.yml +++ b/modules/supplier/front/summary/locale/es.yml @@ -5,4 +5,5 @@ Search suppliers by id, name or alias: Busca proveedores por id, nombre o alias Is Farmer: Es agrícola Sage tax type: Tipo de impuesto Sage Sage transaction type: Tipo de transacción Sage -Sage withholding: Retencion Sage \ No newline at end of file +Sage withholding: Retencion Sage +Go to the supplier: Ir al proveedor \ No newline at end of file diff --git a/modules/ticket/front/summary/index.html b/modules/ticket/front/summary/index.html index 5ebfb7638..2faefadf2 100644 --- a/modules/ticket/front/summary/index.html +++ b/modules/ticket/front/summary/index.html @@ -1,10 +1,10 @@
- + name="goToSummary"> + Ticket #{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} diff --git a/modules/ticket/front/summary/index.js b/modules/ticket/front/summary/index.js index 4d8318e32..42e5fcb69 100644 --- a/modules/ticket/front/summary/index.js +++ b/modules/ticket/front/summary/index.js @@ -1,8 +1,8 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; import './style.scss'; -class Controller extends Section { +class Controller extends Summary { get ticket() { return this._ticket; } diff --git a/modules/ticket/front/summary/locale/es.yml b/modules/ticket/front/summary/locale/es.yml index b9848d2cf..afa06f206 100644 --- a/modules/ticket/front/summary/locale/es.yml +++ b/modules/ticket/front/summary/locale/es.yml @@ -2,4 +2,4 @@ Address phone: Tel. consignatario Address mobile: Móv. consignatario Client phone: Tel. cliente Client mobile: Móv. cliente -Go to ticket summary: Ir a la vista previa del ticket \ No newline at end of file +Go to the ticket: Ir al ticket \ No newline at end of file diff --git a/modules/ticket/front/summary/style.scss b/modules/ticket/front/summary/style.scss index d08bf5f54..613d36f55 100644 --- a/modules/ticket/front/summary/style.scss +++ b/modules/ticket/front/summary/style.scss @@ -2,50 +2,13 @@ @import "./variables"; vn-ticket-card vn-ticket-summary { - a[name="goToTicketSummary"], - vn-ticket-descriptor-menu { + /* vn-ticket-descriptor-menu { display: none - } + } */ } + vn-ticket-summary .summary { max-width: $width-lg; - - h5 { - display: flex; - justify-content: space-between; - align-items: center; - align-content: center; - - & > a > vn-icon-button[icon="open_in_full"] { - display: flex; - min-width: 45px; - height: 45px; - box-sizing: border-box; - align-items: center; - justify-content: center; - } - & > a > vn-icon-button[icon="open_in_full"] { - @extend %clickable; - color: $color-font-dark; - - & > vn-icon { - padding: 10px; - } - vn-icon { - font-size: 1.75rem; - } - } - - - span { - flex: 1; - } - - vn-button { - flex: none - } - } - vn-button { max-height: 27px; button { diff --git a/modules/travel/front/summary/index.html b/modules/travel/front/summary/index.html index 18f1af435..8815c09e2 100644 --- a/modules/travel/front/summary/index.html +++ b/modules/travel/front/summary/index.html @@ -1,5 +1,13 @@ -
{{$ctrl.travelData.id}} - {{$ctrl.travelData.ref}}
+
+ + + + {{$ctrl.travelData.id}} - {{$ctrl.travelData.ref}} +
-
{{worker.firstName}} {{worker.lastName}}
+
+ + + + {{worker.firstName}} {{worker.lastName}} +

Basic data

diff --git a/modules/worker/front/summary/index.js b/modules/worker/front/summary/index.js index adc248ee2..178df81a9 100644 --- a/modules/worker/front/summary/index.js +++ b/modules/worker/front/summary/index.js @@ -1,7 +1,7 @@ import ngModule from '../module'; -import Section from 'salix/components/section'; +import Summary from 'salix/components/summary'; -class Controller extends Section { +class Controller extends Summary { get worker() { return this._worker; } diff --git a/modules/zone/front/index/index.html b/modules/zone/front/index/index.html index 7f2540cb7..e75561cd0 100644 --- a/modules/zone/front/index/index.html +++ b/modules/zone/front/index/index.html @@ -20,7 +20,7 @@ + class="clickable vn-tr search-result"> {{::zone.id}} {{::zone.name}} {{::zone.agencyMode.name}} diff --git a/modules/zone/front/locale/es.yml b/modules/zone/front/locale/es.yml index 29f984287..c40dc5c20 100644 --- a/modules/zone/front/locale/es.yml +++ b/modules/zone/front/locale/es.yml @@ -30,4 +30,5 @@ Warehouse: Almacén Warehouses: Almacenes Week days: Días de la semana Zones: Zonas -zone: zona \ No newline at end of file +zone: zona +Go to the zone: Ir a la zona \ No newline at end of file diff --git a/modules/zone/front/summary/index.html b/modules/zone/front/summary/index.html index 20f74916e..9247087e6 100644 --- a/modules/zone/front/summary/index.html +++ b/modules/zone/front/summary/index.html @@ -1,5 +1,13 @@ -
#{{$ctrl.summary.id}} - {{$ctrl.summary.name}}
+
+ + + + #{{$ctrl.summary.id}} - {{$ctrl.summary.name}} +
Date: Mon, 23 Nov 2020 14:02:07 +0100 Subject: [PATCH 13/35] Removed commented code --- modules/ticket/front/summary/style.scss | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/ticket/front/summary/style.scss b/modules/ticket/front/summary/style.scss index 613d36f55..e92ff0d42 100644 --- a/modules/ticket/front/summary/style.scss +++ b/modules/ticket/front/summary/style.scss @@ -1,12 +1,6 @@ @import "./effects"; @import "./variables"; -vn-ticket-card vn-ticket-summary { - /* vn-ticket-descriptor-menu { - display: none - } */ -} - vn-ticket-summary .summary { max-width: $width-lg; vn-button { From 52eb39ccdaba85e669060c52b679510058fa294b Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 23 Nov 2020 14:12:43 +0100 Subject: [PATCH 14/35] Removed autoload from crud-model --- modules/travel/front/extra-community/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/travel/front/extra-community/index.html b/modules/travel/front/extra-community/index.html index e9f11ba0a..84e6fcb85 100644 --- a/modules/travel/front/extra-community/index.html +++ b/modules/travel/front/extra-community/index.html @@ -1,4 +1,4 @@ - Date: Mon, 23 Nov 2020 18:27:32 +0100 Subject: [PATCH 15/35] e2e path for travel extra community + puppeteer v5 --- e2e/helpers/extensions.js | 42 +-- e2e/helpers/selectors.js | 4 + .../10-travel/04_extra_community.spec.js | 33 ++ package-lock.json | 304 ++++++++++++------ package.json | 2 +- 5 files changed, 256 insertions(+), 129 deletions(-) create mode 100644 e2e/paths/10-travel/04_extra_community.spec.js diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index b8a791191..9ff9b7d53 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -155,7 +155,7 @@ let actions = { document.querySelector(selector).scrollIntoViewIfNeeded(); }, selector); await this.waitToClick(selector); - await this.wait('vn-left-menu .expanded'); + await this.waitForSelector('vn-left-menu .expanded'); } await this.evaluate(state => { @@ -175,7 +175,7 @@ let actions = { forceReloadSection: async function(sectionRoute) { await this.waitToClick('vn-icon[icon="desktop_windows"]'); await this.waitToClick('button[response="accept"]'); - await this.wait('vn-card.summary'); + await this.waitForSelector('vn-card.summary'); await this.waitToClick(`vn-left-menu li > a[ui-sref="${sectionRoute}"]`); }, @@ -190,7 +190,7 @@ let actions = { accessToSearchResult: async function(searchValue) { await this.doSearch(searchValue); - await this.waitFor('.vn-descriptor'); + await this.waitForSelector('.vn-descriptor'); }, getProperty: async function(selector, property) { @@ -272,7 +272,7 @@ let actions = { }, focusElement: async function(selector) { - await this.wait(selector); + await this.waitForSelector(selector); return await this.evaluate(selector => { let element = document.querySelector(selector); element.focus(); @@ -285,8 +285,8 @@ let actions = { }, waitImgLoad: async function(selector) { - await this.wait(selector); - return await this.wait(selector => { + await this.waitForSelector(selector); + return await this.waitForFunction(selector => { const imageReady = document.querySelector(selector).complete; return imageReady; }, {}, selector); @@ -305,16 +305,16 @@ let actions = { }, waitForClassNotPresent: async function(selector, className) { - await this.wait(selector); - return await this.wait((selector, className) => { + await this.waitForSelector(selector); + return await this.waitForFunction((selector, className) => { if (!document.querySelector(selector).classList.contains(className)) return true; }, {}, selector, className); }, waitForClassPresent: async function(selector, className) { - await this.wait(selector); - return await this.wait((elementSelector, targetClass) => { + await this.waitForSelector(selector); + return await this.waitForFunction((elementSelector, targetClass) => { if (document.querySelector(elementSelector).classList.contains(targetClass)) return true; }, {}, selector, className); @@ -387,7 +387,7 @@ let actions = { }, waitForEmptyInnerText: async function(selector) { - return await this.wait(selector => { + return await this.waitFunction(selector => { return document.querySelector(selector).innerText == ''; }, selector); }, @@ -395,7 +395,7 @@ let actions = { hideSnackbar: async function() { // Holds up for the snackbar to be visible for a small period of time. if (process.env.E2E_DEBUG) - await this.waitFor(300); + await this.waitForTimeout(300); await this.evaluate(() => { let hideButton = document @@ -403,7 +403,7 @@ let actions = { if (hideButton) return hideButton.click(); }); - await this.waitFor('vn-snackbar .shape.shown', {hidden: true}); + await this.waitForSelector('vn-snackbar .shape.shown', {hidden: true}); }, waitForSnackbar: async function() { @@ -438,7 +438,7 @@ let actions = { const localDate = (new Date(date.getTime() - timeZoneOffset)) .toISOString().substr(0, 10); - await this.wait(selector); + await this.waitForSelector(selector); await this.evaluate((selector, localDate) => { let input = document.querySelector(selector).$ctrl.input; input.value = localDate; @@ -447,7 +447,7 @@ let actions = { }, pickTime: async function(selector, time) { - await this.wait(selector); + await this.waitForSelector(selector); await this.evaluate((selector, time) => { let input = document.querySelector(selector).$ctrl.input; input.value = time; @@ -510,11 +510,11 @@ let actions = { .includes(searchValue.toLowerCase()); }, {}, builtSelector, searchValue); - await this.waitFor('.vn-drop-down', {hidden: true}); + await this.waitForSelector('.vn-drop-down', {hidden: true}); }, checkboxState: async function(selector) { - await this.wait(selector); + await this.waitForSelector(selector); return await this.evaluate(selector => { let checkbox = document.querySelector(selector); switch (checkbox.$ctrl.field) { @@ -537,7 +537,7 @@ let actions = { }, waitForStylePresent: async function(selector, property, value) { - return await this.wait((selector, property, value) => { + return await this.waitForFunction((selector, property, value) => { const element = document.querySelector(selector); return element.style[property] == value; }, {}, selector, property, value); @@ -548,8 +548,8 @@ let actions = { }, waitForWatcherData: async function(selector) { - await this.wait(selector); - await this.wait(selector => { + await this.waitForSelector(selector); + await this.waitForFunction(selector => { let watcher = document.querySelector(selector); let orgData = watcher.$ctrl.orgData; return !angular.equals({}, orgData) && orgData != null; @@ -596,7 +596,7 @@ let actions = { closePopup: async function() { await Promise.all([ this.keyboard.press('Escape'), - this.waitFor('.vn-popup', {hidden: true}), + this.waitForSelector('.vn-popup', {hidden: true}), ]); }, diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index d0d5be5d5..e698669ab 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -823,6 +823,10 @@ export default { anySearchResult: 'vn-travel-index vn-tbody > a', firstSearchResult: 'vn-travel-index vn-tbody > a:nth-child(1)' }, + travelExtraCommunity: { + firstTravelReference: 'vn-travel-extra-community > vn-data-viewer div > vn-tbody > vn-tr > vn-td-editable', + removeContinentFilter: 'vn-searchbar > form > vn-textfield > div.container > div.prepend > prepend > div > span:nth-child(3) > vn-icon > i' + }, travelBasicDada: { reference: 'vn-travel-basic-data vn-textfield[ng-model="$ctrl.travel.ref"]', agency: 'vn-travel-basic-data vn-autocomplete[ng-model="$ctrl.travel.agencyModeFk"]', diff --git a/e2e/paths/10-travel/04_extra_community.spec.js b/e2e/paths/10-travel/04_extra_community.spec.js new file mode 100644 index 000000000..bc81c086c --- /dev/null +++ b/e2e/paths/10-travel/04_extra_community.spec.js @@ -0,0 +1,33 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Travel extra community path', () => { + let browser; + let page; + + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('buyer', 'travel'); + await page.accessToSection('travel.extraCommunity'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should edit the travel reference', async() => { + await page.waitToClick(selectors.travelExtraCommunity.removeContinentFilter); + await page.writeOnEditableTD(selectors.travelExtraCommunity.firstTravelReference, 'edited reference'); + }); + + it('should reload the index and confirm the reference was edited', async() => { + await page.accessToSection('travel.index'); + await page.accessToSection('travel.extraCommunity'); + await page.waitToClick(selectors.travelExtraCommunity.removeContinentFilter); + await page.waitForTextInElement(selectors.travelExtraCommunity.firstTravelReference, 'edited reference'); + const reference = await page.getProperty(selectors.travelExtraCommunity.firstTravelReference, 'innerText'); + + expect(reference).toContain('edited reference'); + }); +}); diff --git a/package-lock.json b/package-lock.json index 6e7a9a665..ff4135141 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5264,6 +5264,16 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -5883,7 +5893,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -6854,7 +6864,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -7175,7 +7185,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -7235,7 +7245,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -7366,7 +7376,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -7436,7 +7446,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -7574,7 +7584,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -8546,6 +8556,12 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "devtools-protocol": { + "version": "0.0.818844", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", + "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "dev": true + }, "diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", @@ -8710,7 +8726,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -9857,47 +9873,40 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "ms": "2.1.2" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { - "pend": "~1.2.0" + "pump": "^3.0.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true } } }, @@ -9981,6 +9990,15 @@ "bser": "^2.0.0" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "feature-policy": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", @@ -10003,7 +10021,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -11189,7 +11207,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -11226,7 +11244,7 @@ }, "globby": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -13346,7 +13364,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { @@ -13376,7 +13394,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" @@ -18776,7 +18794,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -19719,7 +19737,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -19744,7 +19762,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -20193,7 +20211,7 @@ }, "multipipe": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { @@ -21106,7 +21124,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -21122,7 +21140,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -21828,9 +21846,9 @@ } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "prr": { @@ -21914,70 +21932,68 @@ } }, "puppeteer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", - "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", + "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", "dev": true, "requires": { "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^3.0.0", - "mime": "^2.0.3", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "agent-base": "5", + "debug": "4" } }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } }, "ms": { "version": "2.1.2", @@ -21985,14 +22001,44 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } + }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "dev": true } } }, @@ -22306,7 +22352,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -22648,7 +22694,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -22862,7 +22908,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -23078,7 +23124,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -23323,7 +23369,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { "define-property": "^1.0.0", @@ -23374,7 +23420,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -23658,7 +23704,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -24763,7 +24809,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -24960,7 +25006,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { "nopt": "~1.0.10" @@ -25042,7 +25088,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -25143,6 +25189,40 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + } + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -26731,7 +26811,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": { @@ -26908,6 +26988,16 @@ "dev": true } } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/package.json b/package.json index c59451466..1a301afb0 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "node-sass": "^4.14.1", "nodemon": "^1.19.4", "plugin-error": "^1.0.1", - "puppeteer": "^2.0.0", + "puppeteer": "^5.5.0", "raw-loader": "^1.0.0", "sass-loader": "^7.3.1", "style-loader": "^0.23.1", From 6b0f1544a443dcfe6b88eda3ea5c9b6827fab050 Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:28:39 +0100 Subject: [PATCH 16/35] wait and waitFor are now deprecated. Test refactor --- e2e/paths/01-login/01_login.spec.js | 4 +- e2e/paths/02-client/01_create_client.spec.js | 4 +- .../02-client/02_edit_basic_data.spec.js | 2 +- .../02-client/03_edit_fiscal_data.spec.js | 6 +-- e2e/paths/02-client/05_add_address.spec.js | 4 +- e2e/paths/02-client/08_add_notes.spec.js | 2 +- .../12_lock_of_verified_data.spec.js | 10 ++-- e2e/paths/02-client/14_balance.spec.js | 6 +-- e2e/paths/02-client/15_user_config.spec.js | 2 +- e2e/paths/02-client/16_web_payment.spec.js | 4 +- e2e/paths/02-client/18_contacts.spec.js | 2 +- e2e/paths/03-worker/05_calendar.spec.js | 54 +++++++++---------- e2e/paths/04-item/02_basic_data.spec.js | 2 +- e2e/paths/04-item/04_tags.spec.js | 2 +- e2e/paths/04-item/08_create_and_clone.spec.js | 2 +- e2e/paths/04-item/09_regularize.spec.js | 6 +-- e2e/paths/04-item/10_index.spec.js | 6 +-- e2e/paths/04-item/11_item_log.spec.js | 4 +- e2e/paths/04-item/12_descriptor.spec.js | 2 +- .../05-ticket/01-sale/02_edit_sale.spec.js | 28 +++++----- e2e/paths/05-ticket/05_tracking_state.spec.js | 4 +- .../05-ticket/06_basic_data_steps.spec.js | 4 +- e2e/paths/05-ticket/09_weekly.spec.js | 6 +-- e2e/paths/05-ticket/10_request.spec.js | 4 +- e2e/paths/05-ticket/12_descriptor.spec.js | 2 +- e2e/paths/05-ticket/13_services.spec.js | 4 +- e2e/paths/05-ticket/14_create_ticket.spec.js | 2 +- e2e/paths/06-claim/01_basic_data.spec.js | 2 +- e2e/paths/06-claim/03_detail.spec.js | 2 +- e2e/paths/06-claim/04_claim_action.spec.js | 2 +- e2e/paths/07-order/01_summary.spec.js | 2 +- e2e/paths/08-route/03_create.spec.js | 2 +- .../09-invoice-out/02_descriptor.spec.js | 10 ++-- .../10-travel/02_basic_data_and_log.spec.js | 2 +- e2e/paths/12-entry/03_latestBuys.spec.js | 2 +- 35 files changed, 101 insertions(+), 101 deletions(-) diff --git a/e2e/paths/01-login/01_login.spec.js b/e2e/paths/01-login/01_login.spec.js index 35bebcff1..7414856da 100644 --- a/e2e/paths/01-login/01_login.spec.js +++ b/e2e/paths/01-login/01_login.spec.js @@ -45,7 +45,7 @@ describe('Login path', async() => { describe('Successful login', async() => { it('should log in and go to home state', async() => { await page.doLogin('employee'); - await page.waitFor('vn-home'); + await page.waitForSelector('vn-home'); const state = await page.getState(); expect(state).toBe('home'); @@ -58,7 +58,7 @@ describe('Login path', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); await page.waitToClick(selectors.globalItems.logoutButton); - await page.waitFor('vn-login'); + await page.waitForSelector('vn-login'); const state = await page.getState(); expect(state).toBe('login'); diff --git a/e2e/paths/02-client/01_create_client.spec.js b/e2e/paths/02-client/01_create_client.spec.js index 8bdc75556..9029910a7 100644 --- a/e2e/paths/02-client/01_create_client.spec.js +++ b/e2e/paths/02-client/01_create_client.spec.js @@ -124,9 +124,9 @@ describe('Client create path', () => { it('should click on the Clients button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.clientsButton); - await page.wait(selectors.clientsIndex.createClientButton); + await page.waitForSelector(selectors.clientsIndex.createClientButton); await page.waitForState('client.index'); }); diff --git a/e2e/paths/02-client/02_edit_basic_data.spec.js b/e2e/paths/02-client/02_edit_basic_data.spec.js index 8cb39520f..6f331fb23 100644 --- a/e2e/paths/02-client/02_edit_basic_data.spec.js +++ b/e2e/paths/02-client/02_edit_basic_data.spec.js @@ -18,7 +18,7 @@ describe('Client Edit basicData path', () => { describe('as employee', () => { it('should not be able to change the salesPerson', async() => { - await page.wait(selectors.clientBasicData.name); + await page.waitForSelector(selectors.clientBasicData.name); const result = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, `${selectors.clientBasicData.salesPerson} input`); diff --git a/e2e/paths/02-client/03_edit_fiscal_data.spec.js b/e2e/paths/02-client/03_edit_fiscal_data.spec.js index a7bf49eb6..da04c813a 100644 --- a/e2e/paths/02-client/03_edit_fiscal_data.spec.js +++ b/e2e/paths/02-client/03_edit_fiscal_data.spec.js @@ -40,7 +40,7 @@ describe('Client Edit fiscalData path', () => { }); it('should not be able to edit the verified data checkbox', async() => { - await page.wait(selectors.clientFiscalData.verifiedDataCheckbox); + await page.waitForSelector(selectors.clientFiscalData.verifiedDataCheckbox); const result = await page.isDisabled(selectors.clientFiscalData.verifiedDataCheckbox); expect(result).toBeTruthy(); @@ -55,7 +55,7 @@ describe('Client Edit fiscalData path', () => { }); it(`should edit the fiscal data but fail as the fiscal id ain't valid`, async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'SMASH'); await page.clearInput(selectors.clientFiscalData.fiscalId); @@ -159,7 +159,7 @@ describe('Client Edit fiscalData path', () => { }); it('should propagate the Equalization tax changes', async() => { - await page.waitFor(1000); + await page.waitForTimeout(1000); await page.waitToClick(selectors.globalItems.acceptButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/02-client/05_add_address.spec.js b/e2e/paths/02-client/05_add_address.spec.js index f2a7050fe..90cbc15a5 100644 --- a/e2e/paths/02-client/05_add_address.spec.js +++ b/e2e/paths/02-client/05_add_address.spec.js @@ -17,7 +17,7 @@ describe('Client Add address path', () => { }); it(`should click on the add new address button to access to the new address form`, async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.clientAddresses.createAddress); await page.waitForState('client.card.address.create'); }); @@ -81,7 +81,7 @@ describe('Client Add address path', () => { }); it(`should confirm the new address exists and it's the default one`, async() => { - await page.waitFor(2000); // needs more than a single second to load the section + await page.waitForTimeout(2000); // needs more than a single second to load the section const result = await page.waitToGetProperty(selectors.clientAddresses.defaultAddress, 'innerText'); expect(result).toContain('320 Park Avenue New York'); diff --git a/e2e/paths/02-client/08_add_notes.spec.js b/e2e/paths/02-client/08_add_notes.spec.js index 82bc14d0b..d0c483a11 100644 --- a/e2e/paths/02-client/08_add_notes.spec.js +++ b/e2e/paths/02-client/08_add_notes.spec.js @@ -26,7 +26,7 @@ describe('Client Add notes path', () => { }); it(`should create a note`, async() => { - await page.waitFor(selectors.clientNotes.note); + await page.waitForSelector(selectors.clientNotes.note); await page.type(`${selectors.clientNotes.note} textarea`, 'Meeting with Black Widow 21st 9am'); await page.waitToClick(selectors.clientNotes.saveButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/02-client/12_lock_of_verified_data.spec.js b/e2e/paths/02-client/12_lock_of_verified_data.spec.js index 817ba7238..701531c76 100644 --- a/e2e/paths/02-client/12_lock_of_verified_data.spec.js +++ b/e2e/paths/02-client/12_lock_of_verified_data.spec.js @@ -18,15 +18,15 @@ describe('Client lock verified data path', () => { describe('as salesPerson', () => { it('should confirm verified data button is disabled for salesPerson', async() => { - await page.wait(200); - await page.wait(selectors.clientFiscalData.verifiedDataCheckbox); + await page.waitForTimeout(200); + await page.waitForSelector(selectors.clientFiscalData.verifiedDataCheckbox); const result = await page.isDisabled(selectors.clientFiscalData.verifiedDataCheckbox); expect(result).toBeTruthy(); }); it('should edit the social name', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'Captain America Civil War'); await page.waitToClick(selectors.clientFiscalData.saveButton); @@ -75,7 +75,7 @@ describe('Client lock verified data path', () => { }); it('should again edit the social name', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); await page.clearInput(selectors.clientFiscalData.socialName); await page.write(selectors.clientFiscalData.socialName, 'Ant man and the Wasp'); await page.waitToClick(selectors.clientFiscalData.saveButton); @@ -161,7 +161,7 @@ describe('Client lock verified data path', () => { }); it('should confirm the form is enabled for salesPerson', async() => { - await page.wait(selectors.clientFiscalData.socialName); + await page.waitForSelector(selectors.clientFiscalData.socialName); const result = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, 'vn-textfield[ng-model="$ctrl.client.socialName"] > div'); diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index bd00af58e..b069a4cfb 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -113,9 +113,9 @@ describe('Client balance path', () => { it('should now click on the Clients button of the top bar menu', async() => { await page.login('employee'); await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.clientsButton); - await page.wait(selectors.clientsIndex.createClientButton); + await page.waitForSelector(selectors.clientsIndex.createClientButton); await page.waitForState('client.index'); }); @@ -125,6 +125,6 @@ describe('Client balance path', () => { }); it('should not be able to click the new payment button as it isnt present', async() => { - await page.waitFor(selectors.clientBalance.newPaymentButton, {hidden: true}); + await page.waitForSelector(selectors.clientBalance.newPaymentButton, {hidden: true}); }); }); diff --git a/e2e/paths/02-client/15_user_config.spec.js b/e2e/paths/02-client/15_user_config.spec.js index 28f2ef29e..0e18c07ad 100644 --- a/e2e/paths/02-client/15_user_config.spec.js +++ b/e2e/paths/02-client/15_user_config.spec.js @@ -52,7 +52,7 @@ describe('User config', () => { it('should open the user config form to check the settings', async() => { await page.waitToClick(selectors.globalItems.userMenuButton); - await page.waitFor(1000); + await page.waitForTimeout(1000); let expectedLocalWarehouse = await page .expectPropertyValue(selectors.globalItems.userLocalWarehouse, 'value', ''); diff --git a/e2e/paths/02-client/16_web_payment.spec.js b/e2e/paths/02-client/16_web_payment.spec.js index 3a4f50e76..24d802e3e 100644 --- a/e2e/paths/02-client/16_web_payment.spec.js +++ b/e2e/paths/02-client/16_web_payment.spec.js @@ -18,7 +18,7 @@ describe('Client web Payment', () => { describe('as employee', () => { it('should not be able to confirm payments', async() => { - await page.waitFor(selectors.webPayment.confirmFirstPaymentButton, {hidden: true}); + await page.waitForSelector(selectors.webPayment.confirmFirstPaymentButton, {hidden: true}); }); }); @@ -31,7 +31,7 @@ describe('Client web Payment', () => { it('should be able to confirm payments', async() => { await page.waitToClick(selectors.webPayment.confirmFirstPaymentButton); - await page.waitFor(selectors.webPayment.firstPaymentConfirmed, {hidden: true}); + await page.waitForSelector(selectors.webPayment.firstPaymentConfirmed, {hidden: true}); }); }); }); diff --git a/e2e/paths/02-client/18_contacts.spec.js b/e2e/paths/02-client/18_contacts.spec.js index c6dd4e406..49d930435 100644 --- a/e2e/paths/02-client/18_contacts.spec.js +++ b/e2e/paths/02-client/18_contacts.spec.js @@ -28,7 +28,7 @@ describe('Client contacts', () => { }); it('should delete de contact', async() => { - await page.waitFor(3000); + await page.waitForTimeout(3000); await page.waitToClick(selectors.clientContacts.deleteFirstPhone); await page.waitToClick(selectors.clientContacts.saveButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/03-worker/05_calendar.spec.js b/e2e/paths/03-worker/05_calendar.spec.js index 7ebc3badb..e82006b3c 100644 --- a/e2e/paths/03-worker/05_calendar.spec.js +++ b/e2e/paths/03-worker/05_calendar.spec.js @@ -26,33 +26,33 @@ describe('Worker calendar path', () => { it('should set two days as holidays on the calendar and check the total holidays increased by 1.5', async() => { await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.absence); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.marchTwentyThird); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfHoliday); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.furlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayTwelfth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayThirteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfFurlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayEighth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); const result = await page.waitToGetProperty(selectors.workerCalendar.totalHolidaysUsed, 'innerText'); @@ -68,33 +68,33 @@ describe('Worker calendar path', () => { }); it('should undo what was done here', async() => { - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.absence); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.marchTwentyThird); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfHoliday); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.furlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayTwelfth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayThirteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayFourteenth); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.halfFurlough); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.mayEighth); }); @@ -113,9 +113,9 @@ describe('Worker calendar path', () => { }); it('should make a futile attempt to add holidays', async() => { - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.holidays); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); await page.waitToClick(selectors.workerCalendar.januaryThirtyFirst); }); @@ -131,7 +131,7 @@ describe('Worker calendar path', () => { await page.autocompleteSearch(selectors.workerCalendar.year, lastYear); - await page.waitFor(reasonableTimeBetweenClicks); + await page.waitForTimeout(reasonableTimeBetweenClicks); const result = await page.waitToGetProperty(selectors.workerCalendar.totalHolidaysUsed, 'innerText'); expect(result).toContain(' 0 '); diff --git a/e2e/paths/04-item/02_basic_data.spec.js b/e2e/paths/04-item/02_basic_data.spec.js index 6f664cf9b..a728ac717 100644 --- a/e2e/paths/04-item/02_basic_data.spec.js +++ b/e2e/paths/04-item/02_basic_data.spec.js @@ -46,7 +46,7 @@ describe('Item Edit basic data path', () => { await page.write(selectors.itemBasicData.newIntrastatId, '588420239'); await page.write(selectors.itemBasicData.newIntrastatDescription, 'Tropical Flowers'); await page.waitToClick(selectors.itemBasicData.acceptIntrastatButton); // this popover obscures the rest of the form for aprox 2 seconds - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers'); let newcode = await page.waitToGetProperty(selectors.itemBasicData.intrastat, 'value'); diff --git a/e2e/paths/04-item/04_tags.spec.js b/e2e/paths/04-item/04_tags.spec.js index 39d49cd1e..9f2a8e295 100644 --- a/e2e/paths/04-item/04_tags.spec.js +++ b/e2e/paths/04-item/04_tags.spec.js @@ -31,7 +31,7 @@ describe('Item create tags path', () => { it(`should confirm the fourth row data is the expected one`, async() => { await page.reloadSection('item.card.tags'); - await page.wait('vn-item-tags'); + await page.waitForSelector('vn-item-tags'); let result = await page.waitToGetProperty(selectors.itemTags.fourthTag, 'value'); expect(result).toEqual('Ancho de la base'); diff --git a/e2e/paths/04-item/08_create_and_clone.spec.js b/e2e/paths/04-item/08_create_and_clone.spec.js index ac667d123..938f15e3f 100644 --- a/e2e/paths/04-item/08_create_and_clone.spec.js +++ b/e2e/paths/04-item/08_create_and_clone.spec.js @@ -77,7 +77,7 @@ describe('Item Create/Clone path', () => { xdescribe('clone', () => { it('should return to the items index by clicking the return to items button', async() => { await page.waitToClick(selectors.itemBasicData.goToItemIndexButton); - await page.wait(selectors.itemsIndex.createItemButton); + await page.waitForSelector(selectors.itemsIndex.createItemButton); await page.waitForState('item.index'); }); diff --git a/e2e/paths/04-item/09_regularize.spec.js b/e2e/paths/04-item/09_regularize.spec.js index 0bc2c3acf..97c45643f 100644 --- a/e2e/paths/04-item/09_regularize.spec.js +++ b/e2e/paths/04-item/09_regularize.spec.js @@ -56,7 +56,7 @@ describe('Item regularize path', () => { it('should click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await Promise.all([ page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), page.waitToClick(selectors.globalItems.ticketsButton) @@ -96,7 +96,7 @@ describe('Item regularize path', () => { it('should now click on the Items button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.itemsButton); await page.waitForState('item.index'); }); @@ -119,7 +119,7 @@ describe('Item regularize path', () => { it('should again click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await Promise.all([ page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), page.waitToClick(selectors.globalItems.ticketsButton) diff --git a/e2e/paths/04-item/10_index.spec.js b/e2e/paths/04-item/10_index.spec.js index fb4efb5c8..40c567cac 100644 --- a/e2e/paths/04-item/10_index.spec.js +++ b/e2e/paths/04-item/10_index.spec.js @@ -43,7 +43,7 @@ describe('Item index path', () => { await page.waitToClick(selectors.itemsIndex.firstSearchResult); await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); await page.waitToClick(selectors.globalItems.searchButton); - await page.wait(selectors.itemsIndex.searchResult); + await page.waitForSelector(selectors.itemsIndex.searchResult); await page.waitImgLoad(selectors.itemsIndex.firstItemImage); const imageVisible = await page.isVisible(selectors.itemsIndex.firstItemImageTd); @@ -55,7 +55,7 @@ describe('Item index path', () => { }); it('should mark all unchecked boxes to leave the index as it was', async() => { - await page.waitFor(500); // otherwise the snackbar doesnt appear some times. + await page.waitForTimeout(500); // otherwise the snackbar doesnt appear some times. await page.waitToClick(selectors.itemsIndex.fieldsToShowButton); await page.waitToClick(selectors.itemsIndex.idCheckbox); await page.waitToClick(selectors.itemsIndex.stemsCheckbox); @@ -77,7 +77,7 @@ describe('Item index path', () => { await page.waitToClick(selectors.itemsIndex.firstSearchResult); await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); await page.waitToClick(selectors.globalItems.searchButton); - await page.wait(selectors.itemsIndex.searchResult); + await page.waitForSelector(selectors.itemsIndex.searchResult); const idVisible = await page.isVisible(selectors.itemsIndex.firstItemId); expect(idVisible).toBeTruthy(); diff --git a/e2e/paths/04-item/11_item_log.spec.js b/e2e/paths/04-item/11_item_log.spec.js index c0a047051..2a885fe6f 100644 --- a/e2e/paths/04-item/11_item_log.spec.js +++ b/e2e/paths/04-item/11_item_log.spec.js @@ -39,7 +39,7 @@ describe('Item log path', () => { it('should return to the items index by clicking the return to items button', async() => { await page.waitToClick(selectors.itemBasicData.goToItemIndexButton); - await page.wait(selectors.itemsIndex.createItemButton); + await page.waitForSelector(selectors.itemsIndex.createItemButton); await page.waitForState('item.index'); }); @@ -49,7 +49,7 @@ describe('Item log path', () => { }); it(`should confirm the log is showing 5 entries`, async() => { - await page.wait(selectors.itemLog.anyLineCreated); + await page.waitForSelector(selectors.itemLog.anyLineCreated); const anyLineCreatedCount = await page.countElement(selectors.itemLog.anyLineCreated); expect(anyLineCreatedCount).toEqual(5); diff --git a/e2e/paths/04-item/12_descriptor.spec.js b/e2e/paths/04-item/12_descriptor.spec.js index 9e0de8479..7c6fa074c 100644 --- a/e2e/paths/04-item/12_descriptor.spec.js +++ b/e2e/paths/04-item/12_descriptor.spec.js @@ -17,7 +17,7 @@ describe('Item descriptor path', () => { }); it('should check the descriptor inactive icon is dark as the item is active', async() => { - await page.wait(selectors.itemDescriptor.inactiveIcon); + await page.waitForSelector(selectors.itemDescriptor.inactiveIcon); await page.waitForClassNotPresent(selectors.itemDescriptor.inactiveIcon, 'bright'); const darkIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index c3403b371..248f38927 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -24,7 +24,7 @@ describe('Ticket Edit sale path', () => { it('should navigate to the tickets index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -128,7 +128,7 @@ describe('Ticket Edit sale path', () => { it('should return to ticket sales section', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); @@ -143,9 +143,9 @@ describe('Ticket Edit sale path', () => { }); it('should remove 1 from the first sale quantity', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketSales.firstSaleQuantityCell); - await page.waitFor(selectors.ticketSales.firstSaleQuantity); + await page.waitForSelector(selectors.ticketSales.firstSaleQuantity); await page.type(selectors.ticketSales.firstSaleQuantity, '9\u000d'); const message = await page.waitForSnackbar(); @@ -154,7 +154,7 @@ describe('Ticket Edit sale path', () => { it('should update the price', async() => { await page.waitToClick(selectors.ticketSales.firstSalePrice); - await page.waitFor(selectors.ticketSales.firstSalePriceInput); + await page.waitForSelector(selectors.ticketSales.firstSalePriceInput); await page.type(selectors.ticketSales.firstSalePriceInput, '5\u000d'); const message = await page.waitForSnackbar(); @@ -175,7 +175,7 @@ describe('Ticket Edit sale path', () => { it('should update the discount', async() => { await page.waitToClick(selectors.ticketSales.firstSaleDiscount); - await page.waitFor(selectors.ticketSales.firstSaleDiscountInput); + await page.waitForSelector(selectors.ticketSales.firstSaleDiscountInput); await page.type(selectors.ticketSales.firstSaleDiscountInput, '50\u000d'); const message = await page.waitForSnackbar(); @@ -205,7 +205,7 @@ describe('Ticket Edit sale path', () => { it('should click on the Claims button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.claimsButton); await page.waitForState('claim.index'); }); @@ -217,7 +217,7 @@ describe('Ticket Edit sale path', () => { it('should click the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -225,16 +225,16 @@ describe('Ticket Edit sale path', () => { it('should search for a ticket then access to the sales section', async() => { await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); - await page.wait(2000); + await page.waitForTimeout(2000); }); it('should select the third sale and delete it', async() => { await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitToClick(selectors.ticketSales.deleteSaleButton); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitToClick(selectors.globalItems.acceptButton); - await page.wait(2000); + await page.waitForTimeout(2000); await page.waitForSpinnerLoad(); const message = await page.waitForSnackbar(); @@ -260,7 +260,7 @@ describe('Ticket Edit sale path', () => { }); it('should confirm the transfered line is the correct one', async() => { - await page.wait(selectors.ticketSales.secondSaleText); + await page.waitForSelector(selectors.ticketSales.secondSaleText); const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleText, 'innerText'); expect(result).toContain(`Melee weapon heavy shield`); @@ -279,7 +279,7 @@ describe('Ticket Edit sale path', () => { }); it(`should confirm the original ticket has still three lines`, async() => { - await page.wait(selectors.ticketSales.saleLine); + await page.waitForSelector(selectors.ticketSales.saleLine); const result = await page.countElement(selectors.ticketSales.saleLine); expect(result).toEqual(3); diff --git a/e2e/paths/05-ticket/05_tracking_state.spec.js b/e2e/paths/05-ticket/05_tracking_state.spec.js index 1db0144e5..9c8e6d492 100644 --- a/e2e/paths/05-ticket/05_tracking_state.spec.js +++ b/e2e/paths/05-ticket/05_tracking_state.spec.js @@ -48,13 +48,13 @@ describe('Ticket Create new tracking state path', () => { }); it('should now access to the create state view by clicking the create floating button', async() => { - await page.waitFor('.vn-popup', {hidden: true}); + await page.waitForSelector('.vn-popup', {hidden: true}); await page.waitToClick(selectors.ticketTracking.createStateButton); await page.waitForState('ticket.card.tracking.edit'); }); it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => { - await page.waitFor(1500); + await page.waitForTimeout(1500); await page.autocompleteSearch(selectors.createStateView.state, 'Encajado'); await page.waitToClick(selectors.createStateView.saveStateButton); const message = await page.waitForSnackbar(); diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js index f6660ae39..fff6c1264 100644 --- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js +++ b/e2e/paths/05-ticket/06_basic_data_steps.spec.js @@ -34,7 +34,7 @@ describe('Ticket Edit basic data path', () => { it(`should confirm the zone autocomplete is enabled for the role productionBoss`, async() => { await page.waitForSpinnerLoad(); - await page.wait(selectors.ticketBasicData.zone); + await page.waitForSelector(selectors.ticketBasicData.zone); const disabled = await page.evaluate(selector => { return document.querySelector(selector).disabled; }, `${selectors.ticketBasicData.zone} input`); @@ -51,7 +51,7 @@ describe('Ticket Edit basic data path', () => { it(`should edit the ticket agency then check there are no zones for it`, async() => { await page.autocompleteSearch(selectors.ticketBasicData.agency, 'Super-Man delivery'); - await page.waitFor(1000); + await page.waitForTimeout(1000); let emptyZone = await page .expectPropertyValue(selectors.ticketBasicData.zone, 'value', ''); diff --git a/e2e/paths/05-ticket/09_weekly.spec.js b/e2e/paths/05-ticket/09_weekly.spec.js index e1d54e7a4..2392de28f 100644 --- a/e2e/paths/05-ticket/09_weekly.spec.js +++ b/e2e/paths/05-ticket/09_weekly.spec.js @@ -38,7 +38,7 @@ describe('Ticket descriptor path', () => { it('should again click on the Tickets button of the top bar menu', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -52,7 +52,7 @@ describe('Ticket descriptor path', () => { it('should click on the Tickets button of the top bar menu once more', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -73,7 +73,7 @@ describe('Ticket descriptor path', () => { it('should click on the Tickets button of the top bar menu once again', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); diff --git a/e2e/paths/05-ticket/10_request.spec.js b/e2e/paths/05-ticket/10_request.spec.js index 8d9dc6aaa..af73d7081 100644 --- a/e2e/paths/05-ticket/10_request.spec.js +++ b/e2e/paths/05-ticket/10_request.spec.js @@ -18,7 +18,7 @@ describe('Ticket purchase request path', () => { }); it('should add a new request', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketRequests.addRequestButton); await page.write(selectors.ticketRequests.descriptionInput, 'New stuff'); await page.write(selectors.ticketRequests.quantity, '9'); @@ -72,7 +72,7 @@ describe('Ticket purchase request path', () => { it('should check the request was deleted', async() => { await page.reloadSection('ticket.card.request.index'); - await page.wait(selectors.ticketRequests.addRequestButton); + await page.waitForSelector(selectors.ticketRequests.addRequestButton); await page.waitForSelector(selectors.ticketRequests.thirdDescription, {hidden: true}); }); }); diff --git a/e2e/paths/05-ticket/12_descriptor.spec.js b/e2e/paths/05-ticket/12_descriptor.spec.js index c1258f973..c426f7d7f 100644 --- a/e2e/paths/05-ticket/12_descriptor.spec.js +++ b/e2e/paths/05-ticket/12_descriptor.spec.js @@ -92,7 +92,7 @@ describe('Ticket descriptor path', () => { }); await page.waitToClick(selectors.ticketDescriptor.moreMenu); await page.waitToClick(selectors.ticketDescriptor.moreMenuAddStowaway); - await page.wait(selectors.ticketDescriptor.addStowawayDialogFirstTicket); + await page.waitForSelector(selectors.ticketDescriptor.addStowawayDialogFirstTicket); const isVisible = await page.isVisible(selectors.ticketDescriptor.addStowawayDialogFirstTicket); expect(isVisible).toBeTruthy(); diff --git a/e2e/paths/05-ticket/13_services.spec.js b/e2e/paths/05-ticket/13_services.spec.js index 9108f64e4..03e57b588 100644 --- a/e2e/paths/05-ticket/13_services.spec.js +++ b/e2e/paths/05-ticket/13_services.spec.js @@ -22,7 +22,7 @@ describe('Ticket services path', () => { it('should find the add descripton button disabled for this user role', async() => { await page.waitForClassPresent(selectors.ticketService.firstAddServiceTypeButton, 'disabled'); await page.waitToClick(selectors.ticketService.addServiceButton); - await page.wait(selectors.ticketService.firstAddServiceTypeButton); + await page.waitForSelector(selectors.ticketService.firstAddServiceTypeButton); const result = await page.isDisabled(selectors.ticketService.firstAddServiceTypeButton); expect(result).toBe(true); @@ -63,7 +63,7 @@ describe('Ticket services path', () => { it('should click on the add new service type to open the dialog', async() => { await page.waitToClick(selectors.ticketService.firstAddServiceTypeButton); - await page.wait('.vn-dialog.shown'); + await page.waitForSelector('.vn-dialog.shown'); const result = await page.isVisible(selectors.ticketService.newServiceTypeName); expect(result).toBeTruthy(); diff --git a/e2e/paths/05-ticket/14_create_ticket.spec.js b/e2e/paths/05-ticket/14_create_ticket.spec.js index 692354472..4e7d95493 100644 --- a/e2e/paths/05-ticket/14_create_ticket.spec.js +++ b/e2e/paths/05-ticket/14_create_ticket.spec.js @@ -42,7 +42,7 @@ describe('Ticket create path', () => { it('should again open the new ticket form', async() => { await page.waitToClick(selectors.globalItems.returnToModuleIndexButton); - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.ticketsIndex.newTicketButton); await page.waitForState('ticket.create'); }); diff --git a/e2e/paths/06-claim/01_basic_data.spec.js b/e2e/paths/06-claim/01_basic_data.spec.js index efbfd0305..5dfd54c4e 100644 --- a/e2e/paths/06-claim/01_basic_data.spec.js +++ b/e2e/paths/06-claim/01_basic_data.spec.js @@ -45,7 +45,7 @@ describe('Claim edit basic data path', () => { it('should confirm the claim state was edited', async() => { await page.reloadSection('claim.card.basicData'); - await page.wait(selectors.claimBasicData.claimState); + await page.waitForSelector(selectors.claimBasicData.claimState); const result = await page.waitToGetProperty(selectors.claimBasicData.claimState, 'value'); expect(result).toEqual('Gestionado'); diff --git a/e2e/paths/06-claim/03_detail.spec.js b/e2e/paths/06-claim/03_detail.spec.js index 9649d1905..ddcfd9302 100644 --- a/e2e/paths/06-claim/03_detail.spec.js +++ b/e2e/paths/06-claim/03_detail.spec.js @@ -106,7 +106,7 @@ xdescribe('Claim detail', () => { it('should navigate back to claim.detail to confirm the claim contains now two items', async() => { await page.accessToSection('claim.card.detail'); - await page.wait(selectors.claimDetail.claimDetailLine); + await page.waitForSelector(selectors.claimDetail.claimDetailLine); const result = await page.countElement(selectors.claimDetail.claimDetailLine); expect(result).toEqual(2); diff --git a/e2e/paths/06-claim/04_claim_action.spec.js b/e2e/paths/06-claim/04_claim_action.spec.js index c22fe5704..b3fedc9c8 100644 --- a/e2e/paths/06-claim/04_claim_action.spec.js +++ b/e2e/paths/06-claim/04_claim_action.spec.js @@ -27,7 +27,7 @@ describe('Claim action path', () => { it('should import the second importable ticket', async() => { // the animation adding the header element for the claimed total // obscures somehow other elements for about 2 seconds - await page.waitFor(3000); + await page.waitForTimeout(3000); await page.waitToClick(selectors.claimAction.importTicketButton); await page.waitToClick(selectors.claimAction.secondImportableTicket); diff --git a/e2e/paths/07-order/01_summary.spec.js b/e2e/paths/07-order/01_summary.spec.js index f21015c52..1b4776826 100644 --- a/e2e/paths/07-order/01_summary.spec.js +++ b/e2e/paths/07-order/01_summary.spec.js @@ -8,7 +8,7 @@ describe('Order summary path', () => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('employee', 'order'); - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.accessToSearchResult('16'); }); diff --git a/e2e/paths/08-route/03_create.spec.js b/e2e/paths/08-route/03_create.spec.js index ad6fb3991..670f7e17b 100644 --- a/e2e/paths/08-route/03_create.spec.js +++ b/e2e/paths/08-route/03_create.spec.js @@ -17,7 +17,7 @@ describe('Route create path', () => { describe('as employee', () => { it('should click on the add new route button and open the creation form', async() => { - await page.waitFor(500); + await page.waitForTimeout(500); await page.waitToClick(selectors.routeIndex.addNewRouteButton); await page.waitForState('route.create'); }); diff --git a/e2e/paths/09-invoice-out/02_descriptor.spec.js b/e2e/paths/09-invoice-out/02_descriptor.spec.js index aff35ac33..8d403e083 100644 --- a/e2e/paths/09-invoice-out/02_descriptor.spec.js +++ b/e2e/paths/09-invoice-out/02_descriptor.spec.js @@ -26,9 +26,9 @@ describe('InvoiceOut descriptor path', () => { it('should navigate to the invoiceOut index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.invoiceOutButton); - await page.wait(selectors.invoiceOutIndex.topbarSearch); + await page.waitForSelector(selectors.invoiceOutIndex.topbarSearch); await page.waitForState('invoiceOut.index'); }); @@ -59,7 +59,7 @@ describe('InvoiceOut descriptor path', () => { it('should navigate to the ticket index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.ticketsButton); await page.waitForState('ticket.index'); }); @@ -73,7 +73,7 @@ describe('InvoiceOut descriptor path', () => { it('should now navigate to the invoiceOut index', async() => { await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.wait(selectors.globalItems.applicationsMenuVisible); + await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); await page.waitToClick(selectors.globalItems.invoiceOutButton); await page.waitForState('invoiceOut.index'); }); @@ -126,7 +126,7 @@ describe('InvoiceOut descriptor path', () => { it(`should check the salesPerson role doens't see the book option in the more menu`, async() => { await page.waitToClick(selectors.invoiceOutDescriptor.moreMenu); - await page.wait(selectors.invoiceOutDescriptor.moreMenuShowInvoiceOutPdf); + await page.waitForSelector(selectors.invoiceOutDescriptor.moreMenuShowInvoiceOutPdf); await page.waitForSelector(selectors.invoiceOutDescriptor.moreMenuBookInvoiceOut, {hidden: true}); }); diff --git a/e2e/paths/10-travel/02_basic_data_and_log.spec.js b/e2e/paths/10-travel/02_basic_data_and_log.spec.js index f1253cdd7..9c81e6f63 100644 --- a/e2e/paths/10-travel/02_basic_data_and_log.spec.js +++ b/e2e/paths/10-travel/02_basic_data_and_log.spec.js @@ -43,7 +43,7 @@ describe('Travel basic data path', () => { it('should now edit the whole form then save', async() => { await page.clearInput(selectors.travelBasicDada.reference); await page.write(selectors.travelBasicDada.reference, 'new reference!'); - await page.waitFor(2000); + await page.waitForTimeout(2000); await page.autocompleteSearch(selectors.travelBasicDada.agency, 'Entanglement'); await page.autocompleteSearch(selectors.travelBasicDada.outputWarehouse, 'Warehouse Three'); await page.autocompleteSearch(selectors.travelBasicDada.inputWarehouse, 'Warehouse Four'); diff --git a/e2e/paths/12-entry/03_latestBuys.spec.js b/e2e/paths/12-entry/03_latestBuys.spec.js index 33acdb318..8e9de8158 100644 --- a/e2e/paths/12-entry/03_latestBuys.spec.js +++ b/e2e/paths/12-entry/03_latestBuys.spec.js @@ -17,7 +17,7 @@ describe('Entry lastest buys path', () => { it('should access the latest buys seccion and search not seeing the edit buys button yet', async() => { await page.waitToClick(selectors.entryLatestBuys.latestBuysSectionButton); - await page.waitFor(250); + await page.waitForTimeout(250); await page.waitToClick(selectors.globalItems.searchButton); await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: false}); }); From 551af77fc36227c2c05de47c96971f3dbd296824 Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:35:57 +0100 Subject: [PATCH 17/35] extension refactor --- e2e/helpers/extensions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 9ff9b7d53..6aaee64af 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -267,6 +267,7 @@ let actions = { writeOnEditableTD: async function(selector, text) { let builtSelector = await this.selectorFormater(selector); await this.waitToClick(selector); + await this.waitForSelector(builtSelector, {visible: true}); await this.type(builtSelector, text); await this.keyboard.press('Enter'); }, From 1b4635957434c957fedb5ebb85417003a30e518b Mon Sep 17 00:00:00 2001 From: carlosjr Date: Mon, 23 Nov 2020 18:42:11 +0100 Subject: [PATCH 18/35] removed focus on describe --- modules/travel/front/extra-community/index.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/travel/front/extra-community/index.spec.js b/modules/travel/front/extra-community/index.spec.js index 581002f18..2f510f22f 100644 --- a/modules/travel/front/extra-community/index.spec.js +++ b/modules/travel/front/extra-community/index.spec.js @@ -80,7 +80,7 @@ describe('Travel Component vnTravelExtraCommunity', () => { }); }); - fdescribe('dragEnd()', () => { + describe('dragEnd()', () => { it(`should remove the class "dragging" from the draggable element and then set the entryId controller property to null`, () => { const draggable = document.createElement('a'); From 80bae4de0afdd3534441ab076e41e8f794daa886 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 08:22:54 +0100 Subject: [PATCH 19/35] 2607 - Changed preview icon --- e2e/helpers/extensions.js | 4 ++-- e2e/helpers/selectors.js | 4 ++-- front/salix/components/descriptor/index.html | 2 +- modules/account/front/alias/index/index.html | 2 +- modules/account/front/index/index.html | 2 +- modules/account/front/role/index/index.html | 2 +- modules/account/front/routes.json | 2 +- modules/claim/front/index/index.html | 2 +- modules/client/front/credit-insurance/index/index.html | 2 +- modules/client/front/index/index.html | 2 +- modules/invoiceOut/front/index/index.html | 2 +- modules/item/front/index/index.html | 2 +- modules/order/front/index/index.html | 2 +- modules/route/front/index/index.html | 2 +- modules/supplier/front/index/index.html | 2 +- modules/ticket/front/index/index.html | 2 +- modules/travel/front/index/index.html | 2 +- modules/worker/front/index/index.html | 2 +- modules/zone/front/delivery-days/index.html | 2 +- modules/zone/front/index/index.html | 2 +- package-lock.json | 2 +- 21 files changed, 23 insertions(+), 23 deletions(-) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index b8a791191..2a73bc7f3 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -168,12 +168,12 @@ let actions = { }, reloadSection: async function(state) { - await this.click('vn-icon[icon="desktop_windows"]'); + await this.click('vn-icon[icon="preview"]'); await this.accessToSection(state); }, forceReloadSection: async function(sectionRoute) { - await this.waitToClick('vn-icon[icon="desktop_windows"]'); + await this.waitToClick('vn-icon[icon="preview"]'); await this.waitToClick('button[response="accept"]'); await this.wait('vn-card.summary'); await this.waitToClick(`vn-left-menu li > a[ui-sref="${sectionRoute}"]`); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index d0d5be5d5..888200e05 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -211,7 +211,7 @@ export default { newClassificationStartingDate: 'vn-client-credit-insurance-create vn-date-picker[ng-model="$ctrl.creditClassification.started"]', newInsuranceStartingDate: 'vn-client-credit-insurance-insurance-create vn-date-picker[ng-model="$ctrl.insurance.created"]', endCurrentContract: 'vn-client-credit-insurance-index vn-icon-button[icon="lock"]', - firstContratViewCreditButton: 'vn-client-credit-insurance-index vn-card > vn-horizontal:nth-child(1) vn-icon-button[icon="desktop_windows"]', + firstContratViewCreditButton: 'vn-client-credit-insurance-index vn-card > vn-horizontal:nth-child(1) vn-icon-button[icon="preview"]', addNewCredit: 'vn-client-credit-insurance-insurance-index vn-float-button vn-icon[icon="add"]', saveNewContract: 'vn-client-credit-insurance-create vn-submit', saveNewInsuranceCredit: 'vn-client-credit-insurance-insurance-create button[type="submit"]', @@ -228,7 +228,7 @@ export default { createItemButton: `vn-float-button`, firstSearchResult: 'vn-item-index a:nth-child(1)', searchResult: 'vn-item-index a.vn-tr', - firstResultPreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="desktop_windows"]', + firstResultpreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', searchResultCloneButton: 'vn-item-index .buttons > [icon="icon-clone"]', acceptClonationAlertButton: '.vn-confirm.shown [response="accept"]', closeItemSummaryPreview: '.vn-popup.shown', diff --git a/front/salix/components/descriptor/index.html b/front/salix/components/descriptor/index.html index 39c93006e..f888432ed 100644 --- a/front/salix/components/descriptor/index.html +++ b/front/salix/components/descriptor/index.html @@ -15,7 +15,7 @@ - + + icon="preview"> diff --git a/modules/account/front/index/index.html b/modules/account/front/index/index.html index 3c967250d..09d376c02 100644 --- a/modules/account/front/index/index.html +++ b/modules/account/front/index/index.html @@ -26,7 +26,7 @@ + icon="preview"> diff --git a/modules/account/front/role/index/index.html b/modules/account/front/role/index/index.html index 92cca58d9..c58c395e4 100644 --- a/modules/account/front/role/index/index.html +++ b/modules/account/front/role/index/index.html @@ -21,7 +21,7 @@ + icon="preview"> diff --git a/modules/account/front/routes.json b/modules/account/front/routes.json index 1fecb1332..a13092db6 100644 --- a/modules/account/front/routes.json +++ b/modules/account/front/routes.json @@ -11,7 +11,7 @@ {"state": "account.alias", "icon": "email"}, {"state": "account.accounts", "icon": "accessibility"}, {"state": "account.ldap", "icon": "account_tree"}, - {"state": "account.samba", "icon": "desktop_windows"}, + {"state": "account.samba", "icon": "preview"}, {"state": "account.acl", "icon": "check"}, {"state": "account.connections", "icon": "share"} ], diff --git a/modules/claim/front/index/index.html b/modules/claim/front/index/index.html index 0a2624de0..1688cf7c0 100644 --- a/modules/claim/front/index/index.html +++ b/modules/claim/front/index/index.html @@ -46,7 +46,7 @@ + icon="preview"> diff --git a/modules/client/front/credit-insurance/index/index.html b/modules/client/front/credit-insurance/index/index.html index b3ebb070d..51e425414 100644 --- a/modules/client/front/credit-insurance/index/index.html +++ b/modules/client/front/credit-insurance/index/index.html @@ -42,7 +42,7 @@ - +
diff --git a/modules/client/front/index/index.html b/modules/client/front/index/index.html index abbbe60e5..8ea485a73 100644 --- a/modules/client/front/index/index.html +++ b/modules/client/front/index/index.html @@ -47,7 +47,7 @@ + icon="preview"> diff --git a/modules/invoiceOut/front/index/index.html b/modules/invoiceOut/front/index/index.html index b9049a2a2..2d78f89a6 100644 --- a/modules/invoiceOut/front/index/index.html +++ b/modules/invoiceOut/front/index/index.html @@ -49,7 +49,7 @@ + icon="preview"> diff --git a/modules/item/front/index/index.html b/modules/item/front/index/index.html index 01128ed74..0d4ae61f3 100644 --- a/modules/item/front/index/index.html +++ b/modules/item/front/index/index.html @@ -94,7 +94,7 @@ + icon="preview">
diff --git a/modules/order/front/index/index.html b/modules/order/front/index/index.html index 07667f58f..7ad34a501 100644 --- a/modules/order/front/index/index.html +++ b/modules/order/front/index/index.html @@ -58,7 +58,7 @@ diff --git a/modules/route/front/index/index.html b/modules/route/front/index/index.html index 479662944..66e30d839 100644 --- a/modules/route/front/index/index.html +++ b/modules/route/front/index/index.html @@ -50,7 +50,7 @@ + icon="preview"> diff --git a/modules/supplier/front/index/index.html b/modules/supplier/front/index/index.html index 5afd51066..87e822eea 100644 --- a/modules/supplier/front/index/index.html +++ b/modules/supplier/front/index/index.html @@ -47,7 +47,7 @@ + icon="preview"> diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html index 8872b76d7..fe9e98a15 100644 --- a/modules/ticket/front/index/index.html +++ b/modules/ticket/front/index/index.html @@ -133,7 +133,7 @@ + icon="preview"> diff --git a/modules/travel/front/index/index.html b/modules/travel/front/index/index.html index 96a6e3229..d85b62a4c 100644 --- a/modules/travel/front/index/index.html +++ b/modules/travel/front/index/index.html @@ -52,7 +52,7 @@ + icon="preview"> diff --git a/modules/worker/front/index/index.html b/modules/worker/front/index/index.html index c994e7a7b..98df416b4 100644 --- a/modules/worker/front/index/index.html +++ b/modules/worker/front/index/index.html @@ -35,7 +35,7 @@ + icon="preview"> diff --git a/modules/zone/front/delivery-days/index.html b/modules/zone/front/delivery-days/index.html index 5f83eb05e..61c73c9d6 100644 --- a/modules/zone/front/delivery-days/index.html +++ b/modules/zone/front/delivery-days/index.html @@ -90,7 +90,7 @@ + icon="preview"> diff --git a/modules/zone/front/index/index.html b/modules/zone/front/index/index.html index e75561cd0..89f2bfbf9 100644 --- a/modules/zone/front/index/index.html +++ b/modules/zone/front/index/index.html @@ -38,7 +38,7 @@ + icon="preview"> diff --git a/package-lock.json b/package-lock.json index 6e7a9a665..2fcd0e440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23078,7 +23078,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { From 55061bea07ccf666c478c4883a18e06d2d90cdd3 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 09:06:37 +0100 Subject: [PATCH 20/35] Fixed selector --- e2e/helpers/selectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 888200e05..2471cf200 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -228,7 +228,7 @@ export default { createItemButton: `vn-float-button`, firstSearchResult: 'vn-item-index a:nth-child(1)', searchResult: 'vn-item-index a.vn-tr', - firstResultpreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', + firstResultPreviewButton: 'vn-item-index vn-tbody > :nth-child(1) .buttons > [icon="preview"]', searchResultCloneButton: 'vn-item-index .buttons > [icon="icon-clone"]', acceptClonationAlertButton: '.vn-confirm.shown [response="accept"]', closeItemSummaryPreview: '.vn-popup.shown', From cb22112ed4bbc824a55183bc309102b7549dd5e5 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 10:52:30 +0100 Subject: [PATCH 21/35] package update --- package-lock.json | 58 +++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff4135141..99e20a441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5893,7 +5893,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -6864,7 +6864,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -7185,7 +7185,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -7245,7 +7245,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { "base64-js": "^1.0.2", @@ -7376,7 +7376,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -7446,7 +7446,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -7584,7 +7584,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -8726,7 +8726,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -10021,7 +10021,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -11207,7 +11207,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -11244,7 +11244,7 @@ }, "globby": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -13364,7 +13364,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { @@ -13394,7 +13394,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -18794,7 +18794,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -19737,7 +19737,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { @@ -19762,7 +19762,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -20211,7 +20211,7 @@ }, "multipipe": { "version": "0.1.2", - "resolved": "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { @@ -21124,7 +21124,7 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, @@ -21140,7 +21140,7 @@ }, "os-tmpdir": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, @@ -22352,7 +22352,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -22694,7 +22694,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -22908,7 +22908,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -23369,7 +23369,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -23420,7 +23420,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -23704,7 +23704,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -24809,7 +24809,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -25006,7 +25006,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", "dev": true, "requires": { "nopt": "~1.0.10" @@ -25088,7 +25088,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -26811,7 +26811,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": { From d9e14a0c3a3f1cc63dc92fc778440ae76c1c62aa Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 12:10:02 +0100 Subject: [PATCH 22/35] 2629 - Open ticket lines on new window --- front/core/directives/anchor.js | 2 +- modules/ticket/front/index/index.html | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/front/core/directives/anchor.js b/front/core/directives/anchor.js index 9a079affd..b460b3ada 100644 --- a/front/core/directives/anchor.js +++ b/front/core/directives/anchor.js @@ -50,7 +50,7 @@ export function directive($state, $window) { link: function($scope, $element, $attrs) { const data = $scope.$eval($attrs.vnAnchor); $element.on('click', event => { - if (ctrlPressed) + if (ctrlPressed || data.target == '_blank') openNewTab($state, $window, event, data); else changeState($state, event, data); diff --git a/modules/ticket/front/index/index.html b/modules/ticket/front/index/index.html index fe9e98a15..d137d40be 100644 --- a/modules/ticket/front/index/index.html +++ b/modules/ticket/front/index/index.html @@ -126,7 +126,11 @@ From 561991f18cc44c5d8257d14cdd6edea1a8957ceb Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 13:54:31 +0100 Subject: [PATCH 23/35] 2628 - Remove item name from search on tag removal --- modules/order/front/catalog/index.js | 2 +- modules/order/front/summary/index.html | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/order/front/catalog/index.js b/modules/order/front/catalog/index.js index dbb9cf8ea..318f5dbca 100644 --- a/modules/order/front/catalog/index.js +++ b/modules/order/front/catalog/index.js @@ -209,7 +209,7 @@ class Controller extends Section { removeItemName() { this.itemName = null; - this.applyFilters(); + this.$.searchbar.doSearch({}, 'bar'); } applyFilters(filter = {}) { diff --git a/modules/order/front/summary/index.html b/modules/order/front/summary/index.html index 8f78ce460..7165b3ec0 100644 --- a/modules/order/front/summary/index.html +++ b/modules/order/front/summary/index.html @@ -45,6 +45,9 @@ + + From ca4a89199cf2c5c7e6b8eb285e6afcc945ed39c3 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 14:09:05 +0100 Subject: [PATCH 24/35] Updated selector --- e2e/helpers/selectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index eeaaf2702..b37ccd50c 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -636,7 +636,7 @@ export default { orderSummary: { id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span', alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span', - consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(3) span', + consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(4) span', subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)', vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)', total: 'vn-order-summary vn-one.taxes > p:nth-child(3)', From 8eb14a8bdc9245145905f2bd808ac9ca8999b72f Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 24 Nov 2020 14:56:10 +0100 Subject: [PATCH 25/35] 2588 - No ellipsize on summary notes or address --- front/core/components/label-value/style.scss | 7 +++++++ modules/client/front/summary/index.html | 14 +++++++------- modules/invoiceOut/front/summary/index.html | 2 +- modules/order/front/basic-data/index.html | 2 +- modules/order/front/summary/index.html | 17 ++++++++++------- modules/supplier/front/summary/index.html | 8 ++++---- modules/ticket/front/summary/index.html | 8 ++++---- modules/worker/front/summary/index.html | 2 +- 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/front/core/components/label-value/style.scss b/front/core/components/label-value/style.scss index 10f3c016c..d50feffd0 100644 --- a/front/core/components/label-value/style.scss +++ b/front/core/components/label-value/style.scss @@ -6,4 +6,11 @@ vn-label-value > section { color: $color-font-secondary; font-size: 1.2rem } +} + +vn-label-value[no-ellipsize] > section, +vn-label-value.no-ellipsize > section { + text-overflow: ''; + white-space: normal; + overflow: auto; } \ No newline at end of file diff --git a/modules/client/front/summary/index.html b/modules/client/front/summary/index.html index 775911717..50bdd226c 100644 --- a/modules/client/front/summary/index.html +++ b/modules/client/front/summary/index.html @@ -28,7 +28,7 @@ - @@ -50,9 +50,6 @@ - - @@ -65,6 +62,9 @@ + +

Fiscal data

@@ -140,12 +140,12 @@ - - + +

Web access

diff --git a/modules/invoiceOut/front/summary/index.html b/modules/invoiceOut/front/summary/index.html index e0fdd8bd2..452ec23db 100644 --- a/modules/invoiceOut/front/summary/index.html +++ b/modules/invoiceOut/front/summary/index.html @@ -74,7 +74,7 @@ {{ticket.nickname}}
- {{ticket.shipped | date: 'dd/MM/yyyy' | dashIfEmpty} + {{ticket.shipped | date: 'dd/MM/yyyy' | dashIfEmpty}} {{ticket.total | currency: 'EUR': 2}} diff --git a/modules/order/front/basic-data/index.html b/modules/order/front/basic-data/index.html index 8945de2b7..63fb5c1b9 100644 --- a/modules/order/front/basic-data/index.html +++ b/modules/order/front/basic-data/index.html @@ -59,7 +59,7 @@ diff --git a/modules/order/front/summary/index.html b/modules/order/front/summary/index.html index 8f78ce460..6a19b12e3 100644 --- a/modules/order/front/summary/index.html +++ b/modules/order/front/summary/index.html @@ -31,12 +31,12 @@ {{$ctrl.summary.address.nickname}} - - + + - + + value="{{$ctrl.summary.address.phone}}"> + + - diff --git a/modules/supplier/front/summary/index.html b/modules/supplier/front/summary/index.html index c0731a1c1..14168f253 100644 --- a/modules/supplier/front/summary/index.html +++ b/modules/supplier/front/summary/index.html @@ -20,6 +20,10 @@ label="Alias" value="{{::$ctrl.summary.nickname}}"> + + - - diff --git a/modules/ticket/front/summary/index.html b/modules/ticket/front/summary/index.html index 2faefadf2..803734c74 100644 --- a/modules/ticket/front/summary/index.html +++ b/modules/ticket/front/summary/index.html @@ -70,9 +70,6 @@ - - @@ -89,9 +86,12 @@ ng-if="$ctrl.summary.client.mobile != null" value="{{$ctrl.summary.client.mobile}}"> + + - diff --git a/modules/worker/front/summary/index.html b/modules/worker/front/summary/index.html index e44d2a5d1..e816f6cf2 100644 --- a/modules/worker/front/summary/index.html +++ b/modules/worker/front/summary/index.html @@ -14,7 +14,7 @@ - Date: Wed, 25 Nov 2020 07:50:02 +0100 Subject: [PATCH 26/35] Updated selector --- e2e/helpers/selectors.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index eeaaf2702..bc013c5f1 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -636,7 +636,7 @@ export default { orderSummary: { id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span', alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span', - consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(3) span', + consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span', subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)', vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)', total: 'vn-order-summary vn-one.taxes > p:nth-child(3)', @@ -663,7 +663,7 @@ export default { client: 'vn-autocomplete[label="Client"]', address: 'vn-autocomplete[label="Address"]', agency: 'vn-autocomplete[label="Agency"]', - observation: 'vn-textarea[label="Observation"]', + observation: 'vn-textarea[label="Notes"]', saveButton: `button[type=submit]`, acceptButton: '.vn-confirm.shown button[response="accept"]' }, From 27f0a5cd63e7e1bf7008a60e219fc0548693a4b1 Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 25 Nov 2020 07:54:20 +0100 Subject: [PATCH 27/35] Updated Node version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 07cca1b52..2e14b5905 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Salix is also the scientific name of a beautifull tree! :) Required applications. -* Node.js = 12.17.0 LTS +* Node.js = 14.15.1 LTS * Docker You will need to install globally the following items. From 78f25e0b46db3beae3916f721c8a54c2c6a6185d Mon Sep 17 00:00:00 2001 From: bernat Date: Wed, 25 Nov 2020 12:37:44 +0100 Subject: [PATCH 28/35] export production --- db/dump/dumpedFixtures.sql | 64 +- db/dump/fixtures.sql | 14 +- db/dump/structure.sql | 4467 ++++++++++------- db/export-data.sh | 2 + .../specs/activeWorkersWithRole.spec.js | 4 +- .../back/methods/client/specs/getCard.spec.js | 2 +- .../back/methods/client/specs/getDebt.spec.js | 2 +- .../methods/client/specs/listWorkers.spec.js | 2 +- .../back/methods/client/specs/summary.spec.js | 2 +- .../methods/ticket/specs/getTotal.spec.js | 2 +- 10 files changed, 2595 insertions(+), 1966 deletions(-) diff --git a/db/dump/dumpedFixtures.sql b/db/dump/dumpedFixtures.sql index 879b1eb42..da9776316 100644 --- a/db/dump/dumpedFixtures.sql +++ b/db/dump/dumpedFixtures.sql @@ -23,7 +23,7 @@ USE `util`; LOCK TABLES `config` WRITE; /*!40000 ALTER TABLE `config` DISABLE KEYS */; -INSERT INTO `config` VALUES (1,'10230',0,'production',NULL); +INSERT INTO `config` VALUES (1,'10240',0,'production',NULL); /*!40000 ALTER TABLE `config` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -36,7 +36,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:31 +-- Dump completed on 2020-11-25 12:03:51 USE `account`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -61,7 +61,7 @@ USE `account`; LOCK TABLES `role` WRITE; /*!40000 ALTER TABLE `role` DISABLE KEYS */; -INSERT INTO `role` VALUES (0,'root','Rol con todos los privilegios',0,'2018-04-23 14:33:36','2018-04-23 14:33:59'),(1,'employee','Empleado básico',1,'2017-05-19 07:04:58','2017-11-29 10:06:31'),(2,'customer','Privilegios básicos de un cliente',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(3,'agency','Consultar tablas de predicciones de bultos',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(5,'administrative','Tareas relacionadas con la contabilidad',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(6,'guest','Privilegios para usuarios sin cuenta',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(9,'developer','Desarrolladores del sistema',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(11,'account','Privilegios relacionados con el login',0,'2017-05-19 07:04:58','2017-09-20 17:06:35'),(13,'teamBoss','Jefe de departamento',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(15,'logistic','Departamento de compras, responsables de la logistica',1,'2017-05-19 07:04:58','2018-02-12 10:50:10'),(16,'logisticBoss','Jefe del departamento de logística',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(17,'adminBoss','Jefe del departamento de administración',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(18,'salesPerson','Departamento de ventas',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(19,'salesBoss','Jefe del departamento de ventas',1,'2017-05-19 07:04:58','2017-08-16 12:38:27'),(20,'manager','Departamento de gerencia',1,'2017-06-01 14:57:02','2017-06-01 14:57:51'),(21,'salesAssistant','Jefe auxiliar de ventas',1,'2017-08-16 12:40:52','2017-08-16 12:40:52'),(22,'teamManager','Jefe de departamento con privilegios de auxiliar de venta.',1,'2017-09-07 09:08:12','2017-09-07 09:08:12'),(30,'financialBoss','Director finaciero',1,'2017-09-21 11:05:36','2017-09-21 11:05:36'),(31,'freelancer','Trabajadores por cuenta ajena',1,'2017-10-10 12:57:26','2017-10-10 12:59:27'),(32,'ett','Trabajadores de empresa temporal',1,'2017-10-10 12:58:58','2017-10-10 12:59:20'),(33,'invoicing','Personal con acceso a facturación',0,'2018-01-29 16:43:34','2018-01-29 16:43:34'),(34,'agencyBoss','Jefe/a del departamento de agencias',1,'2018-01-29 16:44:39','2018-02-23 07:58:53'),(35,'buyer','Departamento de compras',1,'2018-02-12 10:35:42','2018-02-12 10:35:42'),(36,'replenisher','Trabajadores de camara',1,'2018-02-16 14:07:10','2019-04-12 05:38:08'),(37,'hr','Gestor/a de recursos humanos',1,'2018-02-22 17:34:53','2018-02-22 17:34:53'),(38,'hrBoss','Jefe/a de recursos humanos',1,'2018-02-22 17:35:09','2018-02-22 17:35:09'),(39,'adminAssistant','Jefe auxiliar administrativo',1,'2018-02-23 10:37:36','2018-02-23 10:38:41'),(40,'handmade','Departamento de confección',1,'2018-02-23 11:14:53','2018-02-23 11:39:12'),(41,'handmadeBoss','Jefe de departamento de confección',1,'2018-02-23 11:15:09','2018-02-23 11:39:26'),(42,'artificial','Departamento de artificial',1,'2018-02-23 11:39:59','2018-02-23 11:39:59'),(43,'artificialBoss','Jefe del departamento de artificial',1,'2018-02-23 11:40:16','2018-02-23 11:40:16'),(44,'accessory','Departamento de complementos',1,'2018-02-23 11:41:12','2018-02-23 11:41:12'),(45,'accessoryBoss','Jefe del departamento de complementos',1,'2018-02-23 11:41:23','2018-02-23 11:41:23'),(47,'cooler','Empleados de cámara',1,'2018-02-23 13:08:18','2018-02-23 13:08:18'),(48,'coolerBoss','Jefe del departamento de cámara',1,'2018-02-23 13:12:01','2018-02-23 13:12:01'),(49,'production','Empleado de producción',0,'2018-02-26 15:28:23','2019-01-21 12:57:21'),(50,'productionBoss','Jefe de producción',1,'2018-02-26 15:34:12','2018-02-26 15:34:12'),(51,'marketing','Departamento de marketing',1,'2018-03-01 07:28:39','2018-03-01 07:28:39'),(52,'marketingBoss','Jefe del departamento de marketing',1,'2018-03-01 07:28:57','2018-03-01 07:28:57'),(53,'insurance','Gestor de seguros de cambio',0,'2018-03-05 07:44:35','2019-02-01 13:47:57'),(54,'itemPicker','Sacador en cámara',1,'2018-03-05 12:08:17','2018-03-05 12:08:17'),(55,'itemPickerBoss','Jefe de sacadores',1,'2018-03-05 12:08:31','2018-03-05 12:08:31'),(56,'delivery','Personal de reparto',1,'2018-05-30 06:07:02','2018-05-30 06:07:02'),(57,'deliveryBoss','Jefe de personal de reparto',1,'2018-05-30 06:07:19','2018-05-30 06:07:19'),(58,'packager','Departamento encajadores',1,'2019-01-21 12:43:45','2019-01-21 12:43:45'),(59,'packagerBoss','Jefe departamento encajadores',1,'2019-01-21 12:44:10','2019-01-21 12:44:10'),(60,'productionAssi','Tareas relacionadas con producción y administración',1,'2019-01-29 13:29:01','2019-01-29 13:29:01'),(61,'replenisherBos','Jefe de Complementos/Camara',1,'2019-07-01 06:44:07','2019-07-01 06:44:07'),(62,'noLogin','Role without login access to MySQL',0,'2019-07-01 06:50:19','2019-07-02 13:42:05'),(64,'balanceSheet','Consulta de Balance',0,'2019-07-16 12:12:08','2019-07-16 12:12:08'),(65,'officeBoss','Jefe de filial',1,'2019-08-02 06:54:26','2019-08-02 06:54:26'),(66,'sysadmin','Administrador de sistema',1,'2019-08-08 06:58:56','2019-08-08 06:58:56'),(67,'adminOfficer','categoria profesional oficial de administración',1,'2020-01-03 08:09:23','2020-01-03 08:09:23'),(69,'coolerAssist','Empleado cámara con permiso compras',1,'2020-02-05 12:36:09','2020-02-05 12:36:09'),(70,'trainee','Alumno de prácticas',1,'2020-03-04 11:00:25','2020-03-04 11:00:25'),(71,'checker','Rol de revisor con privilegios de itemPicker',1,'2020-10-02 10:50:07','2020-10-02 10:50:07'),(72,'claimManager','Personal de reclamaciones',1,'2020-10-13 10:01:32','2020-10-26 07:29:46'); +INSERT INTO `role` VALUES (1,'employee','Empleado básico',1,'2017-05-19 07:04:58','2017-11-29 10:06:31'),(2,'customer','Privilegios básicos de un cliente',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(3,'agency','Consultar tablas de predicciones de bultos',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(5,'administrative','Tareas relacionadas con la contabilidad',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(6,'guest','Privilegios para usuarios sin cuenta',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(9,'developer','Desarrolladores del sistema',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(11,'account','Privilegios relacionados con el login',0,'2017-05-19 07:04:58','2017-09-20 17:06:35'),(13,'teamBoss','Jefe de departamento',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(15,'logistic','Departamento de compras, responsables de la logistica',1,'2017-05-19 07:04:58','2018-02-12 10:50:10'),(16,'logisticBoss','Jefe del departamento de logística',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(17,'adminBoss','Jefe del departamento de administración',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(18,'salesPerson','Departamento de ventas',1,'2017-05-19 07:04:58','2017-05-19 07:04:58'),(19,'salesBoss','Jefe del departamento de ventas',1,'2017-05-19 07:04:58','2017-08-16 12:38:27'),(20,'manager','Departamento de gerencia',1,'2017-06-01 14:57:02','2017-06-01 14:57:51'),(21,'salesAssistant','Jefe auxiliar de ventas',1,'2017-08-16 12:40:52','2017-08-16 12:40:52'),(22,'teamManager','Jefe de departamento con privilegios de auxiliar de venta.',1,'2017-09-07 09:08:12','2017-09-07 09:08:12'),(30,'financialBoss','Director finaciero',1,'2017-09-21 11:05:36','2017-09-21 11:05:36'),(31,'freelancer','Trabajadores por cuenta ajena',1,'2017-10-10 12:57:26','2017-10-10 12:59:27'),(32,'ett','Trabajadores de empresa temporal',1,'2017-10-10 12:58:58','2017-10-10 12:59:20'),(33,'invoicing','Personal con acceso a facturación',0,'2018-01-29 16:43:34','2018-01-29 16:43:34'),(34,'agencyBoss','Jefe/a del departamento de agencias',1,'2018-01-29 16:44:39','2018-02-23 07:58:53'),(35,'buyer','Departamento de compras',1,'2018-02-12 10:35:42','2018-02-12 10:35:42'),(36,'replenisher','Trabajadores de camara',1,'2018-02-16 14:07:10','2019-04-12 05:38:08'),(37,'hr','Gestor/a de recursos humanos',1,'2018-02-22 17:34:53','2018-02-22 17:34:53'),(38,'hrBoss','Jefe/a de recursos humanos',1,'2018-02-22 17:35:09','2018-02-22 17:35:09'),(39,'adminAssistant','Jefe auxiliar administrativo',1,'2018-02-23 10:37:36','2018-02-23 10:38:41'),(40,'handmade','Departamento de confección',1,'2018-02-23 11:14:53','2018-02-23 11:39:12'),(41,'handmadeBoss','Jefe de departamento de confección',1,'2018-02-23 11:15:09','2018-02-23 11:39:26'),(42,'artificial','Departamento de artificial',1,'2018-02-23 11:39:59','2018-02-23 11:39:59'),(43,'artificialBoss','Jefe del departamento de artificial',1,'2018-02-23 11:40:16','2018-02-23 11:40:16'),(44,'accessory','Departamento de complementos',1,'2018-02-23 11:41:12','2018-02-23 11:41:12'),(45,'accessoryBoss','Jefe del departamento de complementos',1,'2018-02-23 11:41:23','2018-02-23 11:41:23'),(47,'cooler','Empleados de cámara',1,'2018-02-23 13:08:18','2018-02-23 13:08:18'),(48,'coolerBoss','Jefe del departamento de cámara',1,'2018-02-23 13:12:01','2018-02-23 13:12:01'),(49,'production','Empleado de producción',0,'2018-02-26 15:28:23','2019-01-21 12:57:21'),(50,'productionBoss','Jefe de producción',1,'2018-02-26 15:34:12','2018-02-26 15:34:12'),(51,'marketing','Departamento de marketing',1,'2018-03-01 07:28:39','2018-03-01 07:28:39'),(52,'marketingBoss','Jefe del departamento de marketing',1,'2018-03-01 07:28:57','2018-03-01 07:28:57'),(53,'insurance','Gestor de seguros de cambio',0,'2018-03-05 07:44:35','2019-02-01 13:47:57'),(54,'itemPicker','Sacador en cámara',1,'2018-03-05 12:08:17','2018-03-05 12:08:17'),(55,'itemPickerBoss','Jefe de sacadores',1,'2018-03-05 12:08:31','2018-03-05 12:08:31'),(56,'delivery','Personal de reparto',1,'2018-05-30 06:07:02','2018-05-30 06:07:02'),(57,'deliveryBoss','Jefe de personal de reparto',1,'2018-05-30 06:07:19','2018-05-30 06:07:19'),(58,'packager','Departamento encajadores',1,'2019-01-21 12:43:45','2019-01-21 12:43:45'),(59,'packagerBoss','Jefe departamento encajadores',1,'2019-01-21 12:44:10','2019-01-21 12:44:10'),(60,'productionAssi','Tareas relacionadas con producción y administración',1,'2019-01-29 13:29:01','2019-01-29 13:29:01'),(61,'replenisherBos','Jefe de Complementos/Camara',1,'2019-07-01 06:44:07','2019-07-01 06:44:07'),(62,'noLogin','Role without login access to MySQL',0,'2019-07-01 06:50:19','2019-07-02 13:42:05'),(64,'balanceSheet','Consulta de Balance',0,'2019-07-16 12:12:08','2019-07-16 12:12:08'),(65,'officeBoss','Jefe de filial',1,'2019-08-02 06:54:26','2019-08-02 06:54:26'),(66,'sysadmin','Administrador de sistema',1,'2019-08-08 06:58:56','2019-08-08 06:58:56'),(67,'adminOfficer','categoria profesional oficial de administración',1,'2020-01-03 08:09:23','2020-01-03 08:09:23'),(69,'coolerAssist','Empleado cámara con permiso compras',1,'2020-02-05 12:36:09','2020-02-05 12:36:09'),(70,'trainee','Alumno de prácticas',1,'2020-03-04 11:00:25','2020-03-04 11:00:25'),(71,'checker','Rol de revisor con privilegios de itemPicker',1,'2020-10-02 10:50:07','2020-10-02 10:50:07'),(72,'claimManager','Personal de reclamaciones',1,'2020-10-13 10:01:32','2020-10-26 07:29:46'),(73,'financial','Departamento de finanzas',1,'2020-11-16 09:30:27','2020-11-16 09:30:27'),(100,'root','Rol con todos los privilegios',0,'2018-04-23 14:33:36','2020-11-12 06:50:07'); /*!40000 ALTER TABLE `role` ENABLE KEYS */; UNLOCK TABLES; @@ -71,7 +71,7 @@ UNLOCK TABLES; LOCK TABLES `roleInherit` WRITE; /*!40000 ALTER TABLE `roleInherit` DISABLE KEYS */; -INSERT INTO `roleInherit` VALUES (1,1,2),(2,1,3),(3,1,70),(4,2,11),(5,3,11),(6,5,1),(7,5,21),(8,5,33),(9,9,0),(10,11,6),(11,13,1),(12,15,35),(13,15,57),(14,16,13),(15,16,15),(16,17,20),(17,17,37),(18,17,39),(19,17,64),(20,18,1),(21,19,21),(22,20,13),(23,20,16),(24,20,65),(25,21,13),(26,21,18),(27,21,53),(28,22,13),(29,22,21),(30,30,5),(31,30,20),(32,30,22),(33,30,53),(34,30,64),(35,31,1),(36,32,1),(37,34,1),(38,34,13),(39,34,33),(40,35,1),(41,36,44),(42,36,47),(43,37,1),(44,38,37),(45,38,64),(46,39,5),(47,39,21),(48,39,57),(49,40,1),(50,40,49),(51,41,13),(52,41,35),(53,41,40),(54,42,35),(55,42,49),(56,43,13),(57,43,42),(58,44,1),(59,45,13),(60,45,44),(61,47,1),(62,48,13),(63,48,47),(64,49,36),(65,49,58),(66,50,13),(67,50,21),(68,50,35),(69,50,49),(70,50,57),(71,50,59),(72,51,1),(73,52,13),(74,52,19),(75,52,35),(76,52,51),(77,53,1),(78,54,1),(79,55,13),(80,55,54),(81,56,1),(82,57,13),(83,57,56),(84,58,1),(85,59,13),(86,59,49),(87,60,5),(88,60,37),(89,60,50),(90,60,57),(91,61,13),(92,61,36),(93,65,19),(94,65,35),(95,65,50),(96,66,0),(97,67,5),(98,67,37),(99,69,35),(100,69,47),(101,70,11),(102,71,1),(103,71,58),(104,72,13),(105,72,18); +INSERT INTO `roleInherit` VALUES (1,1,2),(2,1,3),(3,1,70),(4,2,11),(5,3,11),(6,5,1),(7,5,21),(8,5,33),(9,9,100),(10,11,6),(11,13,1),(12,15,35),(13,15,57),(14,16,13),(15,16,15),(16,17,20),(17,17,37),(18,17,39),(19,17,64),(20,18,1),(21,19,21),(22,20,13),(23,20,16),(24,20,65),(25,21,13),(26,21,18),(27,21,53),(28,22,13),(29,22,21),(30,30,5),(31,30,20),(32,30,22),(33,30,53),(34,30,64),(35,31,1),(36,32,1),(37,34,1),(38,34,13),(39,34,33),(40,35,1),(41,36,44),(42,36,47),(43,37,1),(44,38,37),(45,38,64),(46,39,5),(47,39,21),(48,39,57),(49,40,1),(50,40,49),(51,41,13),(52,41,35),(53,41,40),(54,42,35),(55,42,49),(56,43,13),(57,43,42),(58,44,1),(59,45,13),(60,45,44),(61,47,1),(62,48,13),(63,48,47),(64,49,36),(65,49,58),(66,50,13),(67,50,21),(68,50,35),(69,50,49),(70,50,57),(71,50,59),(72,51,1),(73,52,13),(74,52,19),(75,52,35),(76,52,51),(77,53,1),(78,54,1),(79,55,13),(80,55,54),(81,56,1),(82,57,13),(83,57,56),(84,58,1),(85,59,13),(109,59,50),(87,60,5),(88,60,37),(89,60,50),(90,60,57),(91,61,13),(92,61,36),(93,65,19),(94,65,35),(95,65,50),(96,66,100),(97,67,5),(98,67,37),(99,69,35),(100,69,47),(101,70,11),(102,71,1),(103,71,58),(104,72,13),(105,72,18),(106,73,5),(108,73,19),(107,73,64); /*!40000 ALTER TABLE `roleInherit` ENABLE KEYS */; UNLOCK TABLES; @@ -81,7 +81,7 @@ UNLOCK TABLES; LOCK TABLES `roleRole` WRITE; /*!40000 ALTER TABLE `roleRole` DISABLE KEYS */; -INSERT INTO `roleRole` VALUES (0,0),(0,1),(0,2),(0,3),(0,5),(0,6),(0,9),(0,11),(0,13),(0,15),(0,16),(0,17),(0,18),(0,19),(0,20),(0,21),(0,22),(0,30),(0,31),(0,32),(0,33),(0,34),(0,35),(0,36),(0,37),(0,38),(0,39),(0,40),(0,41),(0,42),(0,43),(0,44),(0,45),(0,47),(0,48),(0,49),(0,50),(0,51),(0,52),(0,53),(0,54),(0,55),(0,56),(0,57),(0,58),(0,59),(0,60),(0,61),(0,62),(0,64),(0,65),(0,66),(0,67),(0,69),(0,70),(0,71),(0,72),(1,1),(1,2),(1,3),(1,6),(1,11),(1,70),(2,2),(2,6),(2,11),(3,3),(3,6),(3,11),(5,1),(5,2),(5,3),(5,5),(5,6),(5,11),(5,13),(5,18),(5,21),(5,33),(5,53),(5,70),(6,6),(9,0),(9,1),(9,2),(9,3),(9,5),(9,6),(9,9),(9,11),(9,13),(9,15),(9,16),(9,17),(9,18),(9,19),(9,20),(9,21),(9,22),(9,30),(9,31),(9,32),(9,33),(9,34),(9,35),(9,36),(9,37),(9,38),(9,39),(9,40),(9,41),(9,42),(9,43),(9,44),(9,45),(9,47),(9,48),(9,49),(9,50),(9,51),(9,52),(9,53),(9,54),(9,55),(9,56),(9,57),(9,58),(9,59),(9,60),(9,61),(9,62),(9,64),(9,65),(9,66),(9,67),(9,69),(9,70),(9,71),(9,72),(11,6),(11,11),(13,1),(13,2),(13,3),(13,6),(13,11),(13,13),(13,70),(15,1),(15,2),(15,3),(15,6),(15,11),(15,13),(15,15),(15,35),(15,56),(15,57),(15,70),(16,1),(16,2),(16,3),(16,6),(16,11),(16,13),(16,15),(16,16),(16,35),(16,56),(16,57),(16,70),(17,1),(17,2),(17,3),(17,5),(17,6),(17,11),(17,13),(17,15),(17,16),(17,17),(17,18),(17,19),(17,20),(17,21),(17,33),(17,35),(17,36),(17,37),(17,39),(17,44),(17,47),(17,49),(17,50),(17,53),(17,56),(17,57),(17,58),(17,59),(17,64),(17,65),(17,70),(18,1),(18,2),(18,3),(18,6),(18,11),(18,18),(18,70),(19,1),(19,2),(19,3),(19,6),(19,11),(19,13),(19,18),(19,19),(19,21),(19,53),(19,70),(20,1),(20,2),(20,3),(20,6),(20,11),(20,13),(20,15),(20,16),(20,18),(20,19),(20,20),(20,21),(20,35),(20,36),(20,44),(20,47),(20,49),(20,50),(20,53),(20,56),(20,57),(20,58),(20,59),(20,65),(20,70),(21,1),(21,2),(21,3),(21,6),(21,11),(21,13),(21,18),(21,21),(21,53),(21,70),(22,1),(22,2),(22,3),(22,6),(22,11),(22,13),(22,18),(22,21),(22,22),(22,53),(22,70),(30,1),(30,2),(30,3),(30,5),(30,6),(30,11),(30,13),(30,15),(30,16),(30,18),(30,19),(30,20),(30,21),(30,22),(30,30),(30,33),(30,35),(30,36),(30,44),(30,47),(30,49),(30,50),(30,53),(30,56),(30,57),(30,58),(30,59),(30,64),(30,65),(30,70),(31,1),(31,2),(31,3),(31,6),(31,11),(31,31),(31,70),(32,1),(32,2),(32,3),(32,6),(32,11),(32,32),(32,70),(33,33),(34,1),(34,2),(34,3),(34,6),(34,11),(34,13),(34,33),(34,34),(34,70),(35,1),(35,2),(35,3),(35,6),(35,11),(35,35),(35,70),(36,1),(36,2),(36,3),(36,6),(36,11),(36,36),(36,44),(36,47),(36,70),(37,1),(37,2),(37,3),(37,6),(37,11),(37,37),(37,70),(38,1),(38,2),(38,3),(38,6),(38,11),(38,37),(38,38),(38,64),(38,70),(39,1),(39,2),(39,3),(39,5),(39,6),(39,11),(39,13),(39,18),(39,21),(39,33),(39,39),(39,53),(39,56),(39,57),(39,70),(40,1),(40,2),(40,3),(40,6),(40,11),(40,36),(40,40),(40,44),(40,47),(40,49),(40,58),(40,70),(41,1),(41,2),(41,3),(41,6),(41,11),(41,13),(41,35),(41,36),(41,40),(41,41),(41,44),(41,47),(41,49),(41,58),(41,70),(42,1),(42,2),(42,3),(42,6),(42,11),(42,35),(42,36),(42,42),(42,44),(42,47),(42,49),(42,58),(42,70),(43,1),(43,2),(43,3),(43,6),(43,11),(43,13),(43,35),(43,36),(43,42),(43,43),(43,44),(43,47),(43,49),(43,58),(43,70),(44,1),(44,2),(44,3),(44,6),(44,11),(44,44),(44,70),(45,1),(45,2),(45,3),(45,6),(45,11),(45,13),(45,44),(45,45),(45,70),(47,1),(47,2),(47,3),(47,6),(47,11),(47,47),(47,70),(48,1),(48,2),(48,3),(48,6),(48,11),(48,13),(48,47),(48,48),(48,70),(49,1),(49,2),(49,3),(49,6),(49,11),(49,36),(49,44),(49,47),(49,49),(49,58),(49,70),(50,1),(50,2),(50,3),(50,6),(50,11),(50,13),(50,18),(50,21),(50,35),(50,36),(50,44),(50,47),(50,49),(50,50),(50,53),(50,56),(50,57),(50,58),(50,59),(50,70),(51,1),(51,2),(51,3),(51,6),(51,11),(51,51),(51,70),(52,1),(52,2),(52,3),(52,6),(52,11),(52,13),(52,18),(52,19),(52,21),(52,35),(52,51),(52,52),(52,53),(52,70),(53,1),(53,2),(53,3),(53,6),(53,11),(53,53),(53,70),(54,1),(54,2),(54,3),(54,6),(54,11),(54,54),(54,70),(55,1),(55,2),(55,3),(55,6),(55,11),(55,13),(55,54),(55,55),(55,70),(56,1),(56,2),(56,3),(56,6),(56,11),(56,56),(56,70),(57,1),(57,2),(57,3),(57,6),(57,11),(57,13),(57,56),(57,57),(57,70),(58,1),(58,2),(58,3),(58,6),(58,11),(58,58),(58,70),(59,1),(59,2),(59,3),(59,6),(59,11),(59,13),(59,36),(59,44),(59,47),(59,49),(59,58),(59,59),(59,70),(60,1),(60,2),(60,3),(60,5),(60,6),(60,11),(60,13),(60,18),(60,21),(60,33),(60,35),(60,36),(60,37),(60,44),(60,47),(60,49),(60,50),(60,53),(60,56),(60,57),(60,58),(60,59),(60,60),(60,70),(61,1),(61,2),(61,3),(61,6),(61,11),(61,13),(61,36),(61,44),(61,47),(61,61),(61,70),(62,62),(64,64),(65,1),(65,2),(65,3),(65,6),(65,11),(65,13),(65,18),(65,19),(65,21),(65,35),(65,36),(65,44),(65,47),(65,49),(65,50),(65,53),(65,56),(65,57),(65,58),(65,59),(65,65),(65,70),(66,0),(66,1),(66,2),(66,3),(66,5),(66,6),(66,9),(66,11),(66,13),(66,15),(66,16),(66,17),(66,18),(66,19),(66,20),(66,21),(66,22),(66,30),(66,31),(66,32),(66,33),(66,34),(66,35),(66,36),(66,37),(66,38),(66,39),(66,40),(66,41),(66,42),(66,43),(66,44),(66,45),(66,47),(66,48),(66,49),(66,50),(66,51),(66,52),(66,53),(66,54),(66,55),(66,56),(66,57),(66,58),(66,59),(66,60),(66,61),(66,62),(66,64),(66,65),(66,66),(66,67),(66,69),(66,70),(66,71),(66,72),(67,1),(67,2),(67,3),(67,5),(67,6),(67,11),(67,13),(67,18),(67,21),(67,33),(67,37),(67,53),(67,67),(67,70),(69,1),(69,2),(69,3),(69,6),(69,11),(69,35),(69,47),(69,69),(69,70),(70,6),(70,11),(70,70),(71,1),(71,2),(71,3),(71,6),(71,11),(71,58),(71,70),(71,71),(72,1),(72,2),(72,3),(72,6),(72,11),(72,13),(72,18),(72,70),(72,72); +INSERT INTO `roleRole` VALUES (6839,1,1),(6840,1,2),(6841,1,3),(6844,1,6),(6843,1,11),(6842,1,70),(6762,2,2),(6764,2,6),(6763,2,11),(6672,3,3),(6674,3,6),(6673,3,11),(6647,5,1),(6652,5,2),(6651,5,3),(6646,5,5),(6657,5,6),(6656,5,11),(6653,5,13),(6654,5,18),(6648,5,21),(6649,5,33),(6655,5,53),(6650,5,70),(6904,6,6),(6804,9,1),(6801,9,2),(6790,9,3),(6788,9,5),(6809,9,6),(6781,9,9),(6785,9,11),(6836,9,13),(6818,9,15),(6819,9,16),(6787,9,17),(6834,9,18),(6833,9,19),(6820,9,20),(6832,9,21),(6837,9,22),(6807,9,30),(6808,9,31),(6805,9,32),(6815,9,33),(6791,9,34),(6795,9,35),(6830,9,36),(6812,9,37),(6813,9,38),(6786,9,39),(6810,9,40),(6811,9,41),(6792,9,42),(6793,9,43),(6783,9,44),(6784,9,45),(6798,9,47),(6800,9,48),(6827,9,49),(6829,9,50),(6821,9,51),(6822,9,52),(6814,9,53),(6816,9,54),(6817,9,55),(6802,9,56),(6803,9,57),(6825,9,58),(6826,9,59),(6828,9,60),(6831,9,61),(6823,9,62),(6794,9,64),(6824,9,65),(6835,9,66),(6789,9,67),(6799,9,69),(6838,9,70),(6796,9,71),(6797,9,72),(6806,9,73),(6782,9,100),(6599,11,6),(6598,11,11),(7311,13,1),(7312,13,2),(7313,13,3),(7316,13,6),(7315,13,11),(7310,13,13),(7314,13,70),(6976,15,1),(6980,15,2),(6979,15,3),(6982,15,6),(6981,15,11),(6975,15,13),(6972,15,15),(6973,15,35),(6977,15,56),(6974,15,57),(6978,15,70),(6987,16,1),(6991,16,2),(6990,16,3),(6994,16,6),(6993,16,11),(6984,16,13),(6985,16,15),(6983,16,16),(6986,16,35),(6992,16,56),(6988,16,57),(6989,16,70),(6620,17,1),(6629,17,2),(6628,17,3),(6624,17,5),(6641,17,6),(6638,17,11),(6623,17,13),(6633,17,15),(6622,17,16),(6615,17,17),(6635,17,18),(6632,17,19),(6616,17,20),(6625,17,21),(6634,17,33),(6631,17,35),(6643,17,36),(6617,17,37),(6618,17,39),(6645,17,44),(6644,17,47),(6640,17,49),(6630,17,50),(6636,17,53),(6637,17,56),(6626,17,57),(6642,17,58),(6639,17,59),(6619,17,64),(6621,17,65),(6627,17,70),(7246,18,1),(7247,18,2),(7248,18,3),(7251,18,6),(7250,18,11),(7245,18,18),(7249,18,70),(7239,19,1),(7242,19,2),(7241,19,3),(7244,19,6),(7243,19,11),(7236,19,13),(7237,19,18),(7234,19,19),(7235,19,21),(7238,19,53),(7240,19,70),(7001,20,1),(7008,20,2),(7007,20,3),(7019,20,6),(7016,20,11),(6996,20,13),(7000,20,15),(6997,20,16),(7014,20,18),(6999,20,19),(6995,20,20),(7004,20,21),(7002,20,35),(7012,20,36),(7018,20,44),(7017,20,47),(7009,20,49),(7003,20,50),(7013,20,53),(7015,20,56),(7005,20,57),(7011,20,58),(7010,20,59),(6998,20,65),(7006,20,70),(7228,21,1),(7231,21,2),(7230,21,3),(7233,21,6),(7232,21,11),(7225,21,13),(7226,21,18),(7224,21,21),(7227,21,53),(7229,21,70),(7321,22,1),(7325,22,2),(7324,22,3),(7327,22,6),(7326,22,11),(7318,22,13),(7320,22,18),(7319,22,21),(7317,22,22),(7322,22,53),(7323,22,70),(6877,30,1),(6884,30,2),(6883,30,3),(6868,30,5),(6894,30,6),(6890,30,11),(6874,30,13),(6880,30,15),(6873,30,16),(6881,30,18),(6879,30,19),(6869,30,20),(6876,30,21),(6870,30,22),(6867,30,30),(6875,30,33),(6885,30,35),(6892,30,36),(6896,30,44),(6895,30,47),(6888,30,49),(6886,30,50),(6871,30,53),(6893,30,56),(6889,30,57),(6891,30,58),(6887,30,59),(6872,30,64),(6878,30,65),(6882,30,70),(6898,31,1),(6899,31,2),(6900,31,3),(6903,31,6),(6902,31,11),(6897,31,31),(6901,31,70),(6846,32,1),(6847,32,2),(6848,32,3),(6851,32,6),(6850,32,11),(6845,32,32),(6849,32,70),(6955,33,33),(6676,34,1),(6681,34,2),(6680,34,3),(6683,34,6),(6682,34,11),(6677,34,13),(6678,34,33),(6675,34,34),(6679,34,70),(6714,35,1),(6715,35,2),(6716,35,3),(6719,35,6),(6718,35,11),(6713,35,35),(6717,35,70),(7149,36,1),(7151,36,2),(7150,36,3),(7154,36,6),(7153,36,11),(7146,36,36),(7147,36,44),(7148,36,47),(7152,36,70),(6933,37,1),(6934,37,2),(6935,37,3),(6938,37,6),(6937,37,11),(6932,37,37),(6936,37,70),(6942,38,1),(6944,38,2),(6943,38,3),(6947,38,6),(6946,38,11),(6940,38,37),(6939,38,38),(6941,38,64),(6945,38,70),(6606,39,1),(6612,39,2),(6611,39,3),(6601,39,5),(6614,39,6),(6613,39,11),(6604,39,13),(6607,39,18),(6602,39,21),(6605,39,33),(6600,39,39),(6608,39,53),(6609,39,56),(6603,39,57),(6610,39,70),(6906,40,1),(6909,40,2),(6908,40,3),(6916,40,6),(6915,40,11),(6911,40,36),(6905,40,40),(6914,40,44),(6913,40,47),(6907,40,49),(6912,40,58),(6910,40,70),(6922,41,1),(6925,41,2),(6924,41,3),(6931,41,6),(6930,41,11),(6918,41,13),(6919,41,35),(6926,41,36),(6920,41,40),(6917,41,41),(6929,41,44),(6928,41,47),(6921,41,49),(6927,41,58),(6923,41,70),(6688,42,1),(6692,42,2),(6691,42,3),(6696,42,6),(6695,42,11),(6685,42,35),(6687,42,36),(6684,42,42),(6693,42,44),(6694,42,47),(6686,42,49),(6689,42,58),(6690,42,70),(6701,43,1),(6705,43,2),(6704,43,3),(6711,43,6),(6710,43,11),(6698,43,13),(6700,43,35),(6706,43,36),(6699,43,42),(6697,43,43),(6709,43,44),(6708,43,47),(6702,43,49),(6707,43,58),(6703,43,70),(6583,44,1),(6584,44,2),(6585,44,3),(6588,44,6),(6587,44,11),(6582,44,44),(6586,44,70),(6592,45,1),(6594,45,2),(6593,45,3),(6597,45,6),(6596,45,11),(6590,45,13),(6591,45,44),(6589,45,45),(6595,45,70),(6738,47,1),(6739,47,2),(6740,47,3),(6743,47,6),(6742,47,11),(6737,47,47),(6741,47,70),(6756,48,1),(6758,48,2),(6757,48,3),(6761,48,6),(6760,48,11),(6754,48,13),(6755,48,47),(6753,48,48),(6759,48,70),(7096,49,1),(7099,49,2),(7098,49,3),(7101,49,6),(7100,49,11),(7092,49,36),(7095,49,44),(7094,49,47),(7091,49,49),(7093,49,58),(7097,49,70),(7138,50,1),(7143,50,2),(7142,50,3),(7145,50,6),(7144,50,11),(7127,50,13),(7137,50,18),(7128,50,21),(7129,50,35),(7135,50,36),(7140,50,44),(7139,50,47),(7130,50,49),(7126,50,50),(7136,50,53),(7133,50,56),(7131,50,57),(7134,50,58),(7132,50,59),(7141,50,70),(7021,51,1),(7022,51,2),(7023,51,3),(7026,51,6),(7025,51,11),(7020,51,51),(7024,51,70),(7033,52,1),(7037,52,2),(7036,52,3),(7040,52,6),(7039,52,11),(7028,52,13),(7034,52,18),(7029,52,19),(7032,52,21),(7030,52,35),(7031,52,51),(7027,52,52),(7038,52,53),(7035,52,70),(6949,53,1),(6950,53,2),(6951,53,3),(6954,53,6),(6953,53,11),(6948,53,53),(6952,53,70),(6957,54,1),(6958,54,2),(6959,54,3),(6962,54,6),(6961,54,11),(6956,54,54),(6960,54,70),(6966,55,1),(6968,55,2),(6967,55,3),(6971,55,6),(6970,55,11),(6964,55,13),(6965,55,54),(6963,55,55),(6969,55,70),(6766,56,1),(6767,56,2),(6768,56,3),(6771,56,6),(6770,56,11),(6765,56,56),(6769,56,70),(6775,57,1),(6777,57,2),(6776,57,3),(6780,57,6),(6779,57,11),(6773,57,13),(6774,57,56),(6772,57,57),(6778,57,70),(7065,58,1),(7066,58,2),(7067,58,3),(7070,58,6),(7069,58,11),(7064,58,58),(7068,58,70),(7075,59,1),(7083,59,2),(7082,59,3),(7090,59,6),(7089,59,11),(7072,59,13),(7080,59,18),(7074,59,21),(7076,59,35),(7084,59,36),(7088,59,44),(7087,59,47),(7077,59,49),(7073,59,50),(7079,59,53),(7086,59,56),(7078,59,57),(7085,59,58),(7071,59,59),(7081,59,70),(7110,60,1),(7121,60,2),(7120,60,3),(7103,60,5),(7125,60,6),(7124,60,11),(7107,60,13),(7118,60,18),(7109,60,21),(7108,60,33),(7111,60,35),(7116,60,36),(7104,60,37),(7123,60,44),(7122,60,47),(7112,60,49),(7105,60,50),(7117,60,53),(7114,60,56),(7106,60,57),(7115,60,58),(7113,60,59),(7102,60,60),(7119,60,70),(7159,61,1),(7163,61,2),(7162,61,3),(7165,61,6),(7164,61,11),(7156,61,13),(7157,61,36),(7158,61,44),(7160,61,47),(7155,61,61),(7161,61,70),(7041,62,62),(6712,64,64),(7047,65,1),(7055,65,2),(7054,65,3),(7063,65,6),(7062,65,11),(7046,65,13),(7057,65,18),(7043,65,19),(7048,65,21),(7044,65,35),(7052,65,36),(7061,65,44),(7060,65,47),(7049,65,49),(7045,65,50),(7056,65,53),(7059,65,56),(7050,65,57),(7058,65,58),(7051,65,59),(7042,65,65),(7053,65,70),(7276,66,1),(7272,66,2),(7261,66,3),(7259,66,5),(7281,66,6),(7275,66,9),(7256,66,11),(7307,66,13),(7290,66,15),(7291,66,16),(7258,66,17),(7306,66,18),(7305,66,19),(7292,66,20),(7304,66,21),(7308,66,22),(7279,66,30),(7280,66,31),(7277,66,32),(7287,66,33),(7262,66,34),(7266,66,35),(7302,66,36),(7284,66,37),(7285,66,38),(7257,66,39),(7282,66,40),(7283,66,41),(7263,66,42),(7264,66,43),(7254,66,44),(7255,66,45),(7269,66,47),(7271,66,48),(7299,66,49),(7301,66,50),(7293,66,51),(7294,66,52),(7286,66,53),(7288,66,54),(7289,66,55),(7273,66,56),(7274,66,57),(7297,66,58),(7298,66,59),(7300,66,60),(7303,66,61),(7295,66,62),(7265,66,64),(7296,66,65),(7252,66,66),(7260,66,67),(7270,66,69),(7309,66,70),(7267,66,71),(7268,66,72),(7278,66,73),(7253,66,100),(6662,67,1),(6666,67,2),(6665,67,3),(6659,67,5),(6671,67,6),(6670,67,11),(6667,67,13),(6668,67,18),(6661,67,21),(6663,67,33),(6660,67,37),(6669,67,53),(6658,67,67),(6664,67,70),(6747,69,1),(6749,69,2),(6748,69,3),(6752,69,6),(6751,69,11),(6745,69,35),(6746,69,47),(6744,69,69),(6750,69,70),(7330,70,6),(7329,70,11),(7328,70,70),(6721,71,1),(6724,71,2),(6723,71,3),(6727,71,6),(6726,71,11),(6722,71,58),(6725,71,70),(6720,71,71),(6731,72,1),(6733,72,2),(6732,72,3),(6736,72,6),(6735,72,11),(6729,72,13),(6730,72,18),(6734,72,70),(6728,72,72),(6858,73,1),(6861,73,2),(6860,73,3),(6853,73,5),(6866,73,6),(6865,73,11),(6862,73,13),(6863,73,18),(6854,73,19),(6857,73,21),(6856,73,33),(6864,73,53),(6855,73,64),(6859,73,70),(6852,73,73),(7189,100,1),(7185,100,2),(7174,100,3),(7172,100,5),(7194,100,6),(7188,100,9),(7169,100,11),(7221,100,13),(7203,100,15),(7204,100,16),(7171,100,17),(7219,100,18),(7218,100,19),(7205,100,20),(7217,100,21),(7222,100,22),(7192,100,30),(7193,100,31),(7190,100,32),(7200,100,33),(7175,100,34),(7179,100,35),(7215,100,36),(7197,100,37),(7198,100,38),(7170,100,39),(7195,100,40),(7196,100,41),(7176,100,42),(7177,100,43),(7167,100,44),(7168,100,45),(7182,100,47),(7184,100,48),(7212,100,49),(7214,100,50),(7206,100,51),(7207,100,52),(7199,100,53),(7201,100,54),(7202,100,55),(7186,100,56),(7187,100,57),(7210,100,58),(7211,100,59),(7213,100,60),(7216,100,61),(7208,100,62),(7178,100,64),(7209,100,65),(7220,100,66),(7173,100,67),(7183,100,69),(7223,100,70),(7180,100,71),(7181,100,72),(7191,100,73),(7166,100,100); /*!40000 ALTER TABLE `roleRole` ENABLE KEYS */; UNLOCK TABLES; @@ -124,7 +124,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:34 +-- Dump completed on 2020-11-25 12:03:53 USE `salix`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -149,7 +149,7 @@ USE `salix`; LOCK TABLES `ACL` WRITE; /*!40000 ALTER TABLE `ACL` DISABLE KEYS */; -INSERT INTO `ACL` VALUES (1,'Account','*','*','ALLOW','ROLE','employee'),(3,'Address','*','*','ALLOW','ROLE','employee'),(5,'AgencyService','*','READ','ALLOW','ROLE','employee'),(7,'Client','*','*','ALLOW','ROLE','employee'),(9,'ClientObservation','*','*','ALLOW','ROLE','employee'),(11,'ContactChannel','*','READ','ALLOW','ROLE','trainee'),(13,'Employee','*','READ','ALLOW','ROLE','employee'),(14,'PayMethod','*','READ','ALLOW','ROLE','trainee'),(16,'FakeProduction','*','READ','ALLOW','ROLE','employee'),(17,'Warehouse','* ','READ','ALLOW','ROLE','trainee'),(18,'State','*','READ','ALLOW','ROLE','employee'),(20,'TicketState','*','*','ALLOW','ROLE','employee'),(24,'Delivery','*','READ','ALLOW','ROLE','employee'),(25,'Zone','*','READ','ALLOW','ROLE','employee'),(26,'ClientCredit','*','*','ALLOW','ROLE','employee'),(27,'ClientCreditLimit','*','READ','ALLOW','ROLE','trainee'),(30,'GreugeType','*','READ','ALLOW','ROLE','trainee'),(31,'Mandate','*','READ','ALLOW','ROLE','trainee'),(32,'MandateType','*','READ','ALLOW','ROLE','trainee'),(33,'Company','*','READ','ALLOW','ROLE','trainee'),(34,'Greuge','*','READ','ALLOW','ROLE','trainee'),(35,'AddressObservation','*','*','ALLOW','ROLE','employee'),(36,'ObservationType','*','*','ALLOW','ROLE','employee'),(37,'Greuge','*','WRITE','ALLOW','ROLE','employee'),(38,'AgencyMode','*','READ','ALLOW','ROLE','employee'),(39,'ItemTag','*','WRITE','ALLOW','ROLE','buyer'),(40,'ItemBotanical','*','WRITE','ALLOW','ROLE','buyer'),(41,'ItemBotanical','*','READ','ALLOW','ROLE','employee'),(42,'ItemPlacement','*','WRITE','ALLOW','ROLE','buyer'),(43,'ItemPlacement','*','WRITE','ALLOW','ROLE','replenisher'),(44,'ItemPlacement','*','READ','ALLOW','ROLE','employee'),(45,'ItemBarcode','*','READ','ALLOW','ROLE','employee'),(46,'ItemBarcode','*','WRITE','ALLOW','ROLE','buyer'),(47,'ItemBarcode','*','WRITE','ALLOW','ROLE','replenisher'),(48,'ItemNiche','*','READ','ALLOW','ROLE','employee'),(49,'ItemNiche','*','WRITE','ALLOW','ROLE','buyer'),(50,'ItemNiche','*','WRITE','ALLOW','ROLE','replenisher'),(51,'ItemTag','*','READ','ALLOW','ROLE','employee'),(53,'Item','*','READ','ALLOW','ROLE','employee'),(54,'Item','*','WRITE','ALLOW','ROLE','buyer'),(55,'Recovery','*','READ','ALLOW','ROLE','trainee'),(56,'Recovery','*','WRITE','ALLOW','ROLE','administrative'),(58,'CreditClassification','*','*','ALLOW','ROLE','insurance'),(60,'CreditInsurance','*','*','ALLOW','ROLE','insurance'),(61,'InvoiceOut','*','READ','ALLOW','ROLE','employee'),(62,'Ticket','*','*','ALLOW','ROLE','employee'),(63,'TicketObservation','*','*','ALLOW','ROLE','employee'),(64,'Route','*','READ','ALLOW','ROLE','employee'),(65,'Sale','*','READ','ALLOW','ROLE','employee'),(66,'TicketTracking','*','READ','ALLOW','ROLE','employee'),(68,'TicketPackaging','*','*','ALLOW','ROLE','employee'),(69,'Packaging','*','READ','ALLOW','ROLE','employee'),(70,'Packaging','*','WRITE','ALLOW','ROLE','logistic'),(71,'SaleChecked','*','READ','ALLOW','ROLE','employee'),(72,'SaleComponent','*','READ','ALLOW','ROLE','employee'),(73,'Expedition','*','READ','ALLOW','ROLE','employee'),(74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryBoss'),(75,'Expedition','*','WRITE','ALLOW','ROLE','production'),(76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee'),(77,'WorkerMana','*','READ','ALLOW','ROLE','employee'),(78,'TicketTracking','*','WRITE','ALLOW','ROLE','production'),(79,'TicketTracking','changeState','*','ALLOW','ROLE','employee'),(80,'Sale','deleteSales','*','ALLOW','ROLE','employee'),(81,'Sale','moveToTicket','*','ALLOW','ROLE','employee'),(82,'Sale','updateQuantity','*','ALLOW','ROLE','employee'),(83,'Sale','updatePrice','*','ALLOW','ROLE','employee'),(84,'Sale','updateDiscount','*','ALLOW','ROLE','employee'),(85,'SaleTracking','*','READ','ALLOW','ROLE','employee'),(86,'Order','*','*','ALLOW','ROLE','employee'),(87,'OrderRow','*','*','ALLOW','ROLE','employee'),(88,'ClientContact','*','*','ALLOW','ROLE','employee'),(89,'Sale','moveToNewTicket','*','ALLOW','ROLE','employee'),(90,'Sale','reserve','*','ALLOW','ROLE','employee'),(91,'TicketWeekly','*','READ','ALLOW','ROLE','employee'),(94,'Agency','landsThatDay','*','ALLOW','ROLE','employee'),(96,'ClaimEnd','*','READ','ALLOW','ROLE','employee'),(97,'ClaimEnd','*','WRITE','ALLOW','ROLE','salesAssistant'),(98,'ClaimBeginning','*','*','ALLOW','ROLE','employee'),(99,'ClaimDevelopment','*','READ','ALLOW','ROLE','employee'),(100,'ClaimDevelopment','*','WRITE','ALLOW','ROLE','salesAssistant'),(101,'Claim','*','*','ALLOW','ROLE','employee'),(102,'Claim','createFromSales','*','ALLOW','ROLE','employee'),(103,'ClaimEnd','importTicketSales','WRITE','ALLOW','ROLE','salesAssistant'),(104,'Item','*','WRITE','ALLOW','ROLE','marketingBoss'),(105,'ItemBarcode','*','WRITE','ALLOW','ROLE','marketingBoss'),(106,'ItemBotanical','*','WRITE','ALLOW','ROLE','marketingBoss'),(107,'ItemNiche','*','WRITE','ALLOW','ROLE','marketingBoss'),(108,'ItemPlacement','*','WRITE','ALLOW','ROLE','marketingBoss'),(109,'UserConfig','*','*','ALLOW','ROLE','employee'),(110,'Bank','*','READ','ALLOW','ROLE','trainee'),(111,'ClientLog','*','READ','ALLOW','ROLE','trainee'),(112,'Defaulter','*','READ','ALLOW','ROLE','employee'),(113,'ClientRisk','*','READ','ALLOW','ROLE','trainee'),(114,'Receipt','*','READ','ALLOW','ROLE','trainee'),(115,'Receipt','*','WRITE','ALLOW','ROLE','administrative'),(116,'BankEntity','*','*','ALLOW','ROLE','employee'),(117,'ClientSample','*','*','ALLOW','ROLE','employee'),(118,'WorkerTeam','*','*','ALLOW','ROLE','salesPerson'),(119,'Travel','*','READ','ALLOW','ROLE','employee'),(120,'Travel','*','WRITE','ALLOW','ROLE','buyer'),(121,'Item','regularize','*','ALLOW','ROLE','employee'),(122,'TicketRequest','*','*','ALLOW','ROLE','employee'),(123,'Worker','*','*','ALLOW','ROLE','employee'),(124,'Client','confirmTransaction','WRITE','ALLOW','ROLE','administrative'),(125,'Agency','getAgenciesWithWarehouse','*','ALLOW','ROLE','employee'),(126,'Client','activeWorkersWithRole','*','ALLOW','ROLE','employee'),(127,'TicketLog','*','READ','ALLOW','ROLE','employee'),(129,'TicketService','*','*','ALLOW','ROLE','employee'),(130,'Expedition','*','WRITE','ALLOW','ROLE','packager'),(131,'CreditInsurance','*','READ','ALLOW','ROLE','trainee'),(132,'CreditClassification','*','READ','ALLOW','ROLE','trainee'),(133,'ItemTag','*','WRITE','ALLOW','ROLE','marketingBoss'),(135,'ZoneGeo','*','READ','ALLOW','ROLE','employee'),(136,'ZoneCalendar','*','READ','ALLOW','ROLE','employee'),(137,'ZoneIncluded','*','READ','ALLOW','ROLE','employee'),(138,'LabourHoliday','*','READ','ALLOW','ROLE','employee'),(139,'LabourHolidayLegend','*','READ','ALLOW','ROLE','employee'),(140,'LabourHolidayType','*','READ','ALLOW','ROLE','employee'),(141,'Zone','*','*','ALLOW','ROLE','deliveryBoss'),(142,'ZoneCalendar','*','WRITE','ALLOW','ROLE','deliveryBoss'),(143,'ZoneIncluded','*','*','ALLOW','ROLE','deliveryBoss'),(144,'Stowaway','*','*','ALLOW','ROLE','employee'),(145,'Ticket','getPossibleStowaways','READ','ALLOW','ROLE','employee'),(147,'UserConfigView','*','*','ALLOW','ROLE','employee'),(148,'UserConfigView','*','*','ALLOW','ROLE','employee'),(149,'Sip','*','READ','ALLOW','ROLE','employee'),(150,'Sip','*','WRITE','ALLOW','ROLE','hr'),(151,'Department','*','READ','ALLOW','ROLE','employee'),(152,'Department','*','WRITE','ALLOW','ROLE','hr'),(153,'Route','*','READ','ALLOW','ROLE','employee'),(154,'Route','*','WRITE','ALLOW','ROLE','delivery'),(155,'Calendar','*','READ','ALLOW','ROLE','hr'),(156,'WorkerLabour','*','READ','ALLOW','ROLE','hr'),(157,'Calendar','absences','READ','ALLOW','ROLE','employee'),(158,'ItemTag','*','WRITE','ALLOW','ROLE','accessory'),(160,'TicketServiceType','*','READ','ALLOW','ROLE','employee'),(161,'TicketConfig','*','READ','ALLOW','ROLE','employee'),(162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','invoicing'),(163,'InvoiceOut','book','WRITE','ALLOW','ROLE','invoicing'),(164,'InvoiceOut','regenerate','WRITE','ALLOW','ROLE','invoicing'),(165,'TicketDms','*','READ','ALLOW','ROLE','employee'),(167,'Worker','isSubordinate','READ','ALLOW','ROLE','employee'),(168,'Worker','mySubordinates','READ','ALLOW','ROLE','employee'),(169,'WorkerTimeControl','filter','READ','ALLOW','ROLE','employee'),(170,'WorkerTimeControl','addTime','WRITE','ALLOW','ROLE','employee'),(171,'TicketServiceType','*','WRITE','ALLOW','ROLE','administrative'),(172,'Sms','*','READ','ALLOW','ROLE','employee'),(173,'Sms','send','WRITE','ALLOW','ROLE','employee'),(174,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(175,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(176,'Device','*','*','ALLOW','ROLE','employee'),(177,'Device','*','*','ALLOW','ROLE','employee'),(178,'WorkerTimeControl','*','*','ALLOW','ROLE','employee'),(179,'ItemLog','*','READ','ALLOW','ROLE','employee'),(180,'RouteLog','*','READ','ALLOW','ROLE','employee'),(181,'Dms','removeFile','WRITE','ALLOW','ROLE','employee'),(182,'Dms','uploadFile','WRITE','ALLOW','ROLE','employee'),(183,'Dms','downloadFile','READ','ALLOW','ROLE','employee'),(184,'Client','uploadFile','WRITE','ALLOW','ROLE','employee'),(185,'ClientDms','removeFile','WRITE','ALLOW','ROLE','employee'),(186,'ClientDms','*','READ','ALLOW','ROLE','trainee'),(187,'Ticket','uploadFile','WRITE','ALLOW','ROLE','employee'),(188,'TicketDms','removeFile','WRITE','ALLOW','ROLE','employee'),(189,'TicketDms','*','READ','ALLOW','ROLE','employee'),(190,'Route','updateVolume','WRITE','ALLOW','ROLE','deliveryBoss'),(191,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(192,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(194,'Postcode','*','WRITE','ALLOW','ROLE','employee'),(195,'Ticket','addSale','WRITE','ALLOW','ROLE','employee'),(196,'Dms','updateFile','WRITE','ALLOW','ROLE','employee'),(197,'Dms','*','READ','ALLOW','ROLE','trainee'),(198,'ClaimDms','removeFile','WRITE','ALLOW','ROLE','employee'),(199,'ClaimDms','*','READ','ALLOW','ROLE','employee'),(200,'Claim','uploadFile','WRITE','ALLOW','ROLE','employee'),(201,'Sale','updateConcept','WRITE','ALLOW','ROLE','employee'),(202,'Claim','updateClaimAction','WRITE','ALLOW','ROLE','salesAssistant'),(203,'UserPhone','*','*','ALLOW','ROLE','employee'),(204,'WorkerDms','removeFile','WRITE','ALLOW','ROLE','hr'),(205,'WorkerDms','*','READ','ALLOW','ROLE','hr'),(206,'Chat','*','*','ALLOW','ROLE','employee'),(207,'Chat','sendMessage','*','ALLOW','ROLE','employee'),(208,'Sale','recalculatePrice','WRITE','ALLOW','ROLE','employee'),(209,'Ticket','recalculateComponents','WRITE','ALLOW','ROLE','employee'),(211,'TravelLog','*','READ','ALLOW','ROLE','buyer'),(212,'Thermograph','*','*','ALLOW','ROLE','buyer'),(213,'TravelThermograph','*','WRITE','ALLOW','ROLE','buyer'),(214,'Entry','*','*','ALLOW','ROLE','buyer'),(215,'TicketWeekly','*','WRITE','ALLOW','ROLE','buyer'),(216,'TravelThermograph','*','READ','ALLOW','ROLE','employee'),(218,'Intrastat','*','*','ALLOW','ROLE','buyer'),(219,'Account','acl','READ','ALLOW','ROLE','account'),(220,'Account','getCurrentUserData','READ','ALLOW','ROLE','account'),(221,'UserConfig','getUserConfig','READ','ALLOW','ROLE','account'),(222,'Client','*','READ','ALLOW','ROLE','trainee'),(226,'ClientObservation','*','READ','ALLOW','ROLE','trainee'),(227,'Address','*','READ','ALLOW','ROLE','trainee'),(228,'AddressObservation','*','READ','ALLOW','ROLE','trainee'),(230,'ClientCredit','*','READ','ALLOW','ROLE','trainee'),(231,'ClientContact','*','READ','ALLOW','ROLE','trainee'),(232,'ClientSample','*','READ','ALLOW','ROLE','trainee'),(233,'EntryLog','*','READ','ALLOW','ROLE','buyer'),(234,'WorkerLog','*','READ','ALLOW','ROLE','salesAssistant'),(235,'CustomsAgent','*','*','ALLOW','ROLE','employee'),(236,'Buy','*','*','ALLOW','ROLE','buyer'),(237,'WorkerDms','filter','*','ALLOW','ROLE','employee'); +INSERT INTO `ACL` VALUES (1,'Account','*','*','ALLOW','ROLE','employee'),(3,'Address','*','*','ALLOW','ROLE','employee'),(5,'AgencyService','*','READ','ALLOW','ROLE','employee'),(7,'Client','*','*','ALLOW','ROLE','employee'),(9,'ClientObservation','*','*','ALLOW','ROLE','employee'),(11,'ContactChannel','*','READ','ALLOW','ROLE','trainee'),(13,'Employee','*','READ','ALLOW','ROLE','employee'),(14,'PayMethod','*','READ','ALLOW','ROLE','trainee'),(16,'FakeProduction','*','READ','ALLOW','ROLE','employee'),(17,'Warehouse','* ','READ','ALLOW','ROLE','trainee'),(18,'State','*','READ','ALLOW','ROLE','employee'),(20,'TicketState','*','*','ALLOW','ROLE','employee'),(24,'Delivery','*','READ','ALLOW','ROLE','employee'),(25,'Zone','*','READ','ALLOW','ROLE','employee'),(26,'ClientCredit','*','*','ALLOW','ROLE','employee'),(27,'ClientCreditLimit','*','READ','ALLOW','ROLE','trainee'),(30,'GreugeType','*','READ','ALLOW','ROLE','trainee'),(31,'Mandate','*','READ','ALLOW','ROLE','trainee'),(32,'MandateType','*','READ','ALLOW','ROLE','trainee'),(33,'Company','*','READ','ALLOW','ROLE','trainee'),(34,'Greuge','*','READ','ALLOW','ROLE','trainee'),(35,'AddressObservation','*','*','ALLOW','ROLE','employee'),(36,'ObservationType','*','*','ALLOW','ROLE','employee'),(37,'Greuge','*','WRITE','ALLOW','ROLE','employee'),(38,'AgencyMode','*','READ','ALLOW','ROLE','employee'),(39,'ItemTag','*','WRITE','ALLOW','ROLE','buyer'),(40,'ItemBotanical','*','WRITE','ALLOW','ROLE','buyer'),(41,'ItemBotanical','*','READ','ALLOW','ROLE','employee'),(42,'ItemPlacement','*','WRITE','ALLOW','ROLE','buyer'),(43,'ItemPlacement','*','WRITE','ALLOW','ROLE','replenisher'),(44,'ItemPlacement','*','READ','ALLOW','ROLE','employee'),(45,'ItemBarcode','*','READ','ALLOW','ROLE','employee'),(46,'ItemBarcode','*','WRITE','ALLOW','ROLE','buyer'),(47,'ItemBarcode','*','WRITE','ALLOW','ROLE','replenisher'),(48,'ItemNiche','*','READ','ALLOW','ROLE','employee'),(49,'ItemNiche','*','WRITE','ALLOW','ROLE','buyer'),(50,'ItemNiche','*','WRITE','ALLOW','ROLE','replenisher'),(51,'ItemTag','*','READ','ALLOW','ROLE','employee'),(53,'Item','*','READ','ALLOW','ROLE','employee'),(54,'Item','*','WRITE','ALLOW','ROLE','buyer'),(55,'Recovery','*','READ','ALLOW','ROLE','trainee'),(56,'Recovery','*','WRITE','ALLOW','ROLE','administrative'),(58,'CreditClassification','*','*','ALLOW','ROLE','insurance'),(60,'CreditInsurance','*','*','ALLOW','ROLE','insurance'),(61,'InvoiceOut','*','READ','ALLOW','ROLE','employee'),(62,'Ticket','*','*','ALLOW','ROLE','employee'),(63,'TicketObservation','*','*','ALLOW','ROLE','employee'),(64,'Route','*','READ','ALLOW','ROLE','employee'),(65,'Sale','*','READ','ALLOW','ROLE','employee'),(66,'TicketTracking','*','READ','ALLOW','ROLE','employee'),(68,'TicketPackaging','*','*','ALLOW','ROLE','employee'),(69,'Packaging','*','READ','ALLOW','ROLE','employee'),(70,'Packaging','*','WRITE','ALLOW','ROLE','logistic'),(71,'SaleChecked','*','READ','ALLOW','ROLE','employee'),(72,'SaleComponent','*','READ','ALLOW','ROLE','employee'),(73,'Expedition','*','READ','ALLOW','ROLE','employee'),(74,'Expedition','*','WRITE','ALLOW','ROLE','deliveryBoss'),(75,'Expedition','*','WRITE','ALLOW','ROLE','production'),(76,'AnnualAverageInvoiced','*','READ','ALLOW','ROLE','employee'),(77,'WorkerMana','*','READ','ALLOW','ROLE','employee'),(78,'TicketTracking','*','WRITE','ALLOW','ROLE','production'),(79,'TicketTracking','changeState','*','ALLOW','ROLE','employee'),(80,'Sale','deleteSales','*','ALLOW','ROLE','employee'),(81,'Sale','moveToTicket','*','ALLOW','ROLE','employee'),(82,'Sale','updateQuantity','*','ALLOW','ROLE','employee'),(83,'Sale','updatePrice','*','ALLOW','ROLE','employee'),(84,'Sale','updateDiscount','*','ALLOW','ROLE','employee'),(85,'SaleTracking','*','READ','ALLOW','ROLE','employee'),(86,'Order','*','*','ALLOW','ROLE','employee'),(87,'OrderRow','*','*','ALLOW','ROLE','employee'),(88,'ClientContact','*','*','ALLOW','ROLE','employee'),(89,'Sale','moveToNewTicket','*','ALLOW','ROLE','employee'),(90,'Sale','reserve','*','ALLOW','ROLE','employee'),(91,'TicketWeekly','*','READ','ALLOW','ROLE','employee'),(94,'Agency','landsThatDay','*','ALLOW','ROLE','employee'),(96,'ClaimEnd','*','READ','ALLOW','ROLE','employee'),(97,'ClaimEnd','*','WRITE','ALLOW','ROLE','claimManager'),(98,'ClaimBeginning','*','*','ALLOW','ROLE','employee'),(99,'ClaimDevelopment','*','READ','ALLOW','ROLE','employee'),(100,'ClaimDevelopment','*','WRITE','ALLOW','ROLE','claimManager'),(101,'Claim','*','*','ALLOW','ROLE','employee'),(102,'Claim','createFromSales','*','ALLOW','ROLE','employee'),(103,'ClaimEnd','importTicketSales','WRITE','ALLOW','ROLE','claimManager'),(104,'Item','*','WRITE','ALLOW','ROLE','marketingBoss'),(105,'ItemBarcode','*','WRITE','ALLOW','ROLE','marketingBoss'),(106,'ItemBotanical','*','WRITE','ALLOW','ROLE','marketingBoss'),(107,'ItemNiche','*','WRITE','ALLOW','ROLE','marketingBoss'),(108,'ItemPlacement','*','WRITE','ALLOW','ROLE','marketingBoss'),(109,'UserConfig','*','*','ALLOW','ROLE','employee'),(110,'Bank','*','READ','ALLOW','ROLE','trainee'),(111,'ClientLog','*','READ','ALLOW','ROLE','trainee'),(112,'Defaulter','*','READ','ALLOW','ROLE','employee'),(113,'ClientRisk','*','READ','ALLOW','ROLE','trainee'),(114,'Receipt','*','READ','ALLOW','ROLE','trainee'),(115,'Receipt','*','WRITE','ALLOW','ROLE','administrative'),(116,'BankEntity','*','*','ALLOW','ROLE','employee'),(117,'ClientSample','*','*','ALLOW','ROLE','employee'),(118,'WorkerTeam','*','*','ALLOW','ROLE','salesPerson'),(119,'Travel','*','READ','ALLOW','ROLE','employee'),(120,'Travel','*','WRITE','ALLOW','ROLE','buyer'),(121,'Item','regularize','*','ALLOW','ROLE','employee'),(122,'TicketRequest','*','*','ALLOW','ROLE','employee'),(123,'Worker','*','*','ALLOW','ROLE','employee'),(124,'Client','confirmTransaction','WRITE','ALLOW','ROLE','administrative'),(125,'Agency','getAgenciesWithWarehouse','*','ALLOW','ROLE','employee'),(126,'Client','activeWorkersWithRole','*','ALLOW','ROLE','employee'),(127,'TicketLog','*','READ','ALLOW','ROLE','employee'),(129,'TicketService','*','*','ALLOW','ROLE','employee'),(130,'Expedition','*','WRITE','ALLOW','ROLE','packager'),(131,'CreditInsurance','*','READ','ALLOW','ROLE','trainee'),(132,'CreditClassification','*','READ','ALLOW','ROLE','trainee'),(133,'ItemTag','*','WRITE','ALLOW','ROLE','marketingBoss'),(135,'ZoneGeo','*','READ','ALLOW','ROLE','employee'),(136,'ZoneCalendar','*','READ','ALLOW','ROLE','employee'),(137,'ZoneIncluded','*','READ','ALLOW','ROLE','employee'),(138,'LabourHoliday','*','READ','ALLOW','ROLE','employee'),(139,'LabourHolidayLegend','*','READ','ALLOW','ROLE','employee'),(140,'LabourHolidayType','*','READ','ALLOW','ROLE','employee'),(141,'Zone','*','*','ALLOW','ROLE','deliveryBoss'),(142,'ZoneCalendar','*','WRITE','ALLOW','ROLE','deliveryBoss'),(143,'ZoneIncluded','*','*','ALLOW','ROLE','deliveryBoss'),(144,'Stowaway','*','*','ALLOW','ROLE','employee'),(145,'Ticket','getPossibleStowaways','READ','ALLOW','ROLE','employee'),(147,'UserConfigView','*','*','ALLOW','ROLE','employee'),(148,'UserConfigView','*','*','ALLOW','ROLE','employee'),(149,'Sip','*','READ','ALLOW','ROLE','employee'),(150,'Sip','*','WRITE','ALLOW','ROLE','hr'),(151,'Department','*','READ','ALLOW','ROLE','employee'),(152,'Department','*','WRITE','ALLOW','ROLE','hr'),(153,'Route','*','READ','ALLOW','ROLE','employee'),(154,'Route','*','WRITE','ALLOW','ROLE','delivery'),(155,'Calendar','*','READ','ALLOW','ROLE','hr'),(156,'WorkerLabour','*','READ','ALLOW','ROLE','hr'),(157,'Calendar','absences','READ','ALLOW','ROLE','employee'),(158,'ItemTag','*','WRITE','ALLOW','ROLE','accessory'),(160,'TicketServiceType','*','READ','ALLOW','ROLE','employee'),(161,'TicketConfig','*','READ','ALLOW','ROLE','employee'),(162,'InvoiceOut','delete','WRITE','ALLOW','ROLE','invoicing'),(163,'InvoiceOut','book','WRITE','ALLOW','ROLE','invoicing'),(164,'InvoiceOut','regenerate','WRITE','ALLOW','ROLE','invoicing'),(165,'TicketDms','*','READ','ALLOW','ROLE','employee'),(167,'Worker','isSubordinate','READ','ALLOW','ROLE','employee'),(168,'Worker','mySubordinates','READ','ALLOW','ROLE','employee'),(169,'WorkerTimeControl','filter','READ','ALLOW','ROLE','employee'),(170,'WorkerTimeControl','addTime','WRITE','ALLOW','ROLE','employee'),(171,'TicketServiceType','*','WRITE','ALLOW','ROLE','administrative'),(172,'Sms','*','READ','ALLOW','ROLE','employee'),(173,'Sms','send','WRITE','ALLOW','ROLE','employee'),(174,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(175,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(176,'Device','*','*','ALLOW','ROLE','employee'),(177,'Device','*','*','ALLOW','ROLE','employee'),(178,'WorkerTimeControl','*','*','ALLOW','ROLE','employee'),(179,'ItemLog','*','READ','ALLOW','ROLE','employee'),(180,'RouteLog','*','READ','ALLOW','ROLE','employee'),(181,'Dms','removeFile','WRITE','ALLOW','ROLE','employee'),(182,'Dms','uploadFile','WRITE','ALLOW','ROLE','employee'),(183,'Dms','downloadFile','READ','ALLOW','ROLE','employee'),(184,'Client','uploadFile','WRITE','ALLOW','ROLE','employee'),(185,'ClientDms','removeFile','WRITE','ALLOW','ROLE','employee'),(186,'ClientDms','*','READ','ALLOW','ROLE','trainee'),(187,'Ticket','uploadFile','WRITE','ALLOW','ROLE','employee'),(188,'TicketDms','removeFile','WRITE','ALLOW','ROLE','employee'),(189,'TicketDms','*','READ','ALLOW','ROLE','employee'),(190,'Route','updateVolume','WRITE','ALLOW','ROLE','deliveryBoss'),(191,'Agency','getLanded','READ','ALLOW','ROLE','employee'),(192,'Agency','getShipped','READ','ALLOW','ROLE','employee'),(194,'Postcode','*','WRITE','ALLOW','ROLE','deliveryBoss'),(195,'Ticket','addSale','WRITE','ALLOW','ROLE','employee'),(196,'Dms','updateFile','WRITE','ALLOW','ROLE','employee'),(197,'Dms','*','READ','ALLOW','ROLE','trainee'),(198,'ClaimDms','removeFile','WRITE','ALLOW','ROLE','employee'),(199,'ClaimDms','*','READ','ALLOW','ROLE','employee'),(200,'Claim','uploadFile','WRITE','ALLOW','ROLE','employee'),(201,'Sale','updateConcept','WRITE','ALLOW','ROLE','employee'),(202,'Claim','updateClaimAction','WRITE','ALLOW','ROLE','claimManager'),(203,'UserPhone','*','*','ALLOW','ROLE','employee'),(204,'WorkerDms','removeFile','WRITE','ALLOW','ROLE','hr'),(205,'WorkerDms','*','READ','ALLOW','ROLE','hr'),(206,'Chat','*','*','ALLOW','ROLE','employee'),(207,'Chat','sendMessage','*','ALLOW','ROLE','employee'),(208,'Sale','recalculatePrice','WRITE','ALLOW','ROLE','employee'),(209,'Ticket','recalculateComponents','WRITE','ALLOW','ROLE','employee'),(211,'TravelLog','*','READ','ALLOW','ROLE','buyer'),(212,'Thermograph','*','*','ALLOW','ROLE','buyer'),(213,'TravelThermograph','*','WRITE','ALLOW','ROLE','buyer'),(214,'Entry','*','*','ALLOW','ROLE','buyer'),(215,'TicketWeekly','*','WRITE','ALLOW','ROLE','buyer'),(216,'TravelThermograph','*','READ','ALLOW','ROLE','employee'),(218,'Intrastat','*','*','ALLOW','ROLE','buyer'),(219,'Account','acl','READ','ALLOW','ROLE','account'),(220,'Account','getCurrentUserData','READ','ALLOW','ROLE','account'),(221,'UserConfig','getUserConfig','READ','ALLOW','ROLE','account'),(222,'Client','*','READ','ALLOW','ROLE','trainee'),(226,'ClientObservation','*','READ','ALLOW','ROLE','trainee'),(227,'Address','*','READ','ALLOW','ROLE','trainee'),(228,'AddressObservation','*','READ','ALLOW','ROLE','trainee'),(230,'ClientCredit','*','READ','ALLOW','ROLE','trainee'),(231,'ClientContact','*','READ','ALLOW','ROLE','trainee'),(232,'ClientSample','*','READ','ALLOW','ROLE','trainee'),(233,'EntryLog','*','READ','ALLOW','ROLE','buyer'),(234,'WorkerLog','*','READ','ALLOW','ROLE','salesAssistant'),(235,'CustomsAgent','*','*','ALLOW','ROLE','employee'),(236,'Buy','*','*','ALLOW','ROLE','buyer'),(237,'WorkerDms','filter','*','ALLOW','ROLE','employee'),(238,'Town','*','WRITE','ALLOW','ROLE','deliveryBoss'),(239,'Province','*','WRITE','ALLOW','ROLE','deliveryBoss'),(240,'supplier','*','WRITE','ALLOW','ROLE','administrative'),(241,'SupplierContact','*','WRITE','ALLOW','ROLE','administrative'); /*!40000 ALTER TABLE `ACL` ENABLE KEYS */; UNLOCK TABLES; @@ -172,7 +172,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:35 +-- Dump completed on 2020-11-25 12:03:55 USE `vn`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -257,7 +257,7 @@ UNLOCK TABLES; LOCK TABLES `tag` WRITE; /*!40000 ALTER TABLE `tag` DISABLE KEYS */; -INSERT INTO `tag` VALUES (1,'color','Color',0,0,'ink',NULL,NULL,'inkFk'),(2,NULL,'Forma',1,0,NULL,NULL,NULL,NULL),(3,NULL,'Material',1,0,NULL,NULL,NULL,NULL),(4,NULL,'Longitud',1,1,NULL,'mm',NULL,'size'),(5,NULL,'Diámetro',1,1,NULL,'mm',NULL,'diameter'),(6,NULL,'Perímetro',1,1,NULL,'mm',NULL,NULL),(7,NULL,'Ancho de la base',1,1,NULL,'mm',NULL,NULL),(8,NULL,'Altura',1,1,NULL,'mm',NULL,'size'),(9,NULL,'Volumen',1,1,NULL,'ml',NULL,NULL),(10,NULL,'Densidad',1,1,NULL,NULL,NULL,NULL),(11,NULL,'Calidad',1,0,NULL,NULL,NULL,NULL),(12,NULL,'Textura',1,0,NULL,NULL,NULL,NULL),(13,NULL,'Material del mango',1,0,NULL,NULL,NULL,NULL),(14,NULL,'Compra mínima',1,0,NULL,NULL,NULL,NULL),(15,NULL,'Nº pétalos',1,1,NULL,NULL,NULL,NULL),(16,NULL,'Ancho',1,1,NULL,'mm',NULL,NULL),(18,NULL,'Profundidad',1,1,NULL,'mm',NULL,NULL),(19,NULL,'Largo',1,1,NULL,'mm',NULL,'size'),(20,NULL,'Ancho superior',1,1,NULL,'mm',NULL,NULL),(21,NULL,'Ancho inferior',1,1,NULL,'mm',NULL,NULL),(22,NULL,'Gramaje',1,1,NULL,'g',NULL,NULL),(23,'stems','Tallos',1,1,NULL,NULL,NULL,'stems'),(24,NULL,'Estado',1,0,NULL,NULL,NULL,NULL),(25,NULL,'Color principal',0,0,'ink',NULL,NULL,NULL),(26,NULL,'Color secundario',0,0,'ink',NULL,NULL,NULL),(27,NULL,'Longitud(cm)',1,1,NULL,'cm',NULL,NULL),(28,NULL,'Diámetro base',1,1,'','mm',NULL,'diameter'),(29,NULL,'Colección',1,0,NULL,NULL,NULL,NULL),(30,NULL,'Uds / caja',1,1,NULL,NULL,NULL,NULL),(31,NULL,'Contenido',1,0,NULL,NULL,NULL,NULL),(32,NULL,'Peso',1,1,NULL,'g',NULL,NULL),(33,NULL,'Grosor',1,1,NULL,'mm',NULL,NULL),(34,NULL,'Marca',1,0,NULL,NULL,NULL,NULL),(35,'origin','Origen',0,0,'origin',NULL,NULL,'originFk'),(36,NULL,'Proveedor',1,0,NULL,NULL,NULL,NULL),(37,'producer','Productor',0,0,'producer',NULL,NULL,'producerFk'),(38,NULL,'Duración',1,1,NULL,'s',NULL,NULL),(39,NULL,'Flor',1,0,NULL,NULL,NULL,NULL),(40,NULL,'Soporte',1,0,NULL,NULL,NULL,NULL),(41,NULL,'Tamaño flor',1,0,NULL,NULL,NULL,NULL),(42,NULL,'Apertura',1,0,NULL,NULL,NULL,NULL),(43,NULL,'Tallo',1,0,NULL,NULL,NULL,NULL),(44,NULL,'Nº hojas',1,1,NULL,NULL,NULL,NULL),(45,NULL,'Dimensiones',1,0,NULL,NULL,NULL,NULL),(46,NULL,'Diámetro boca',1,1,NULL,'mm',NULL,NULL),(47,NULL,'Nº flores',1,1,NULL,NULL,NULL,NULL),(48,NULL,'Uds / paquete',1,1,NULL,NULL,NULL,NULL),(49,NULL,'Maceta',1,1,NULL,'cm',NULL,'diameter'),(50,NULL,'Textura flor',1,0,NULL,NULL,NULL,NULL),(51,NULL,'Textura hoja',1,0,NULL,NULL,NULL,NULL),(52,NULL,'Tipo de IVA',1,0,NULL,NULL,NULL,NULL),(53,NULL,'Tronco',1,0,NULL,NULL,NULL,NULL),(54,NULL,'Hoja',1,0,NULL,NULL,NULL,NULL),(55,NULL,'Formato',1,0,NULL,NULL,NULL,NULL),(56,NULL,'Genero',1,0,NULL,NULL,NULL,NULL),(57,NULL,'Especie',1,0,NULL,NULL,NULL,NULL),(58,NULL,'Variedad',1,0,NULL,NULL,NULL,NULL),(59,NULL,'Medida grande',1,0,NULL,NULL,NULL,NULL),(60,NULL,'Medida mediano',1,0,NULL,NULL,NULL,NULL),(61,NULL,'Medida pequeño',1,0,NULL,NULL,NULL,NULL),(63,NULL,'Recipiente interior',1,0,NULL,NULL,NULL,NULL),(64,NULL,'Material secundario',1,0,NULL,NULL,NULL,NULL),(65,NULL,'Colores',1,0,NULL,NULL,NULL,NULL),(66,NULL,'Referencia',1,0,NULL,NULL,NULL,NULL),(67,'category','Categoria',1,0,NULL,NULL,NULL,NULL),(68,NULL,'Amb',1,0,NULL,NULL,NULL,NULL),(69,NULL,'Anchura',1,1,NULL,'cm',NULL,NULL),(70,NULL,'Hueco interior',1,0,NULL,NULL,NULL,NULL),(71,NULL,'Tamaño',1,0,NULL,NULL,NULL,NULL),(72,NULL,'Color botón',1,0,NULL,NULL,NULL,NULL),(73,NULL,'Tamaño minimo del botón',1,0,NULL,NULL,NULL,NULL),(74,NULL,'Obtentor',1,0,NULL,NULL,NULL,NULL),(75,NULL,'Longitud del brote',1,0,NULL,NULL,NULL,NULL),(76,NULL,'Tallos / u.v.',1,0,NULL,NULL,NULL,NULL),(77,NULL,'Madera de',1,0,NULL,NULL,NULL,NULL),(78,NULL,'Unidad de venta',1,0,NULL,NULL,NULL,NULL),(79,NULL,'Temporal',1,0,NULL,NULL,NULL,NULL),(80,NULL,'Gramaje/tallo',1,1,NULL,'g',NULL,NULL),(81,NULL,'Peso/paquete',1,1,NULL,'g',NULL,NULL),(82,NULL,'Flexibilidad del tallo',1,0,NULL,NULL,NULL,NULL),(83,NULL,'Nº planchas',1,1,NULL,NULL,NULL,NULL),(84,NULL,'Nº páginas',1,1,NULL,NULL,NULL,NULL),(85,NULL,'Editorial',1,0,NULL,NULL,NULL,NULL),(86,NULL,'Idioma',1,0,NULL,NULL,NULL,NULL),(87,NULL,'Fecha publicación',1,0,NULL,NULL,NULL,NULL),(88,NULL,'Cubierta',1,0,NULL,NULL,NULL,NULL),(89,NULL,'Encuadernación',1,0,NULL,NULL,NULL,NULL),(90,NULL,'Autor',1,0,NULL,NULL,NULL,NULL),(91,NULL,'Envoltorio',1,0,NULL,NULL,NULL,NULL),(92,NULL,'Nombre temporal',1,0,NULL,NULL,NULL,NULL),(93,NULL,'Modelo',1,0,NULL,NULL,NULL,NULL),(94,NULL,'Producto',1,0,NULL,NULL,NULL,NULL),(95,NULL,'Título',1,0,NULL,NULL,NULL,NULL),(96,NULL,'Tomo',1,0,NULL,NULL,NULL,NULL),(97,NULL,'Articulo',1,0,NULL,NULL,NULL,NULL),(98,NULL,'Metodo de cultivo',1,0,NULL,NULL,NULL,NULL),(99,NULL,'Edad',1,0,NULL,NULL,NULL,NULL),(100,NULL,'Agotado',1,0,NULL,NULL,NULL,NULL),(101,NULL,'Altura con asa',1,1,NULL,'cm',NULL,NULL),(102,NULL,'Nº tallos',1,1,NULL,NULL,NULL,NULL),(103,NULL,'Cultivo',1,0,NULL,NULL,NULL,NULL),(104,NULL,'Sabor',1,0,NULL,NULL,NULL,NULL),(105,NULL,'Talla',1,0,NULL,NULL,NULL,NULL),(106,NULL,'Calibre',1,1,NULL,NULL,NULL,NULL),(107,NULL,'Dulzura',1,1,NULL,'bx',NULL,NULL),(108,NULL,'Piezas',1,0,NULL,NULL,NULL,NULL),(109,NULL,'Altura con patas',1,0,NULL,NULL,NULL,NULL),(110,NULL,'Envase',1,0,NULL,NULL,NULL,NULL),(111,NULL,'Nº piezas',1,0,NULL,NULL,NULL,NULL),(112,NULL,'Uso',1,0,NULL,'cm',NULL,NULL),(113,NULL,'Color luz',1,0,NULL,NULL,NULL,NULL),(114,NULL,'Capacidad',1,0,NULL,NULL,NULL,NULL),(184,NULL,'Tallos por paquete',1,0,NULL,NULL,NULL,NULL),(205,NULL,'Apertura',1,0,NULL,NULL,'S05',NULL),(219,NULL,'Altura',1,0,NULL,NULL,'S20','size'),(552,NULL,'fout kenmerk',1,0,NULL,NULL,'081',NULL),(553,NULL,'Potinhoud',1,0,NULL,NULL,'A01',NULL),(554,NULL,'Marketingconcept',1,0,NULL,NULL,'A02',NULL),(555,NULL,'Leeftijd',1,0,NULL,NULL,'A03',NULL),(556,NULL,'Base',1,0,NULL,NULL,'A04',NULL),(557,NULL,'Kleurbehandeld',1,0,NULL,NULL,'A05','inkFk'),(558,NULL,'Verzorging: Standplaats',1,0,NULL,NULL,'A06',NULL),(559,NULL,'Verzorging: Water',1,0,NULL,NULL,'A07',NULL),(560,NULL,'Verzorging: Voeding',1,0,NULL,NULL,'A08',NULL),(561,NULL,'Verzorging: Temperatuur',1,0,NULL,NULL,'A09',NULL),(562,NULL,'Verzorging: Specifieke in',1,0,NULL,NULL,'A10',NULL),(563,NULL,'Verzorging: Consumptie',1,0,NULL,NULL,'A11',NULL),(564,NULL,'Nabehandeling',1,0,NULL,NULL,'A13',NULL),(565,NULL,'Artikel beeld',1,0,NULL,NULL,'A23',NULL),(566,NULL,'Hoofdkleur 1',1,0,NULL,NULL,'B01',NULL),(567,NULL,'Hoofdkleur 2',1,0,NULL,NULL,'B02',NULL),(568,NULL,'RHS hoofdkleur 1',1,0,NULL,NULL,'B03',NULL),(569,NULL,'RHS hoofdkleur 2',1,0,NULL,NULL,'B04',NULL),(570,NULL,'Hoofdkleur 1 blad',1,0,NULL,NULL,'B05',NULL),(571,NULL,'Hoofdkleur 2 blad',1,0,NULL,NULL,'B06',NULL),(572,NULL,'RHS hoofdkleur 1 blad',1,0,NULL,NULL,'B07',NULL),(573,NULL,'RHS hoofdkleur 2 blad',1,0,NULL,NULL,'B08',NULL),(574,NULL,'Botanisch beeld',1,0,NULL,NULL,'B09',NULL),(575,NULL,'Hoofdkleur bes/vrucht',1,0,NULL,NULL,'B10',NULL),(576,NULL,'RHS hoofdkleur bes/vrucht',1,0,NULL,NULL,'B11',NULL),(577,NULL,'UPOV hoofdkleur 1 bloem',1,0,NULL,NULL,'B12',NULL),(578,NULL,'UPOV hoofdkleur 2 bloem',1,0,NULL,NULL,'B13',NULL),(579,NULL,'UPOV hoofdkleur 1 blad',1,0,NULL,NULL,'B14',NULL),(580,NULL,'UPOV hoofdkleur 2 blad',1,0,NULL,NULL,'B15',NULL),(581,NULL,'UPOV hoofdkleur bes/vruch',1,0,NULL,NULL,'B16',NULL),(582,NULL,'Negatieve keurcode 1',1,0,NULL,NULL,'K01',NULL),(583,NULL,'Negatieve keurcode 2',1,0,NULL,NULL,'K02',NULL),(584,NULL,'Bedrijfskenmerk fytosanit',1,0,NULL,NULL,'K03',NULL),(585,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,'K04',NULL),(586,NULL,'Certificaten MPS-TraceCer',1,0,NULL,NULL,'K05',NULL),(587,NULL,'Overige leveranciersinfor',1,0,NULL,NULL,'K07',NULL),(588,NULL,'Certificaten MPS-GAP',1,0,NULL,NULL,'K08',NULL),(589,NULL,'Betrouwbaarheidsindex kla',1,0,NULL,NULL,'K11',NULL),(590,NULL,'Betrouwbaarheidsindex waa',1,0,NULL,NULL,'K12',NULL),(591,NULL,'Productkwaliteitslabel',1,0,NULL,NULL,'K13',NULL),(592,NULL,'Label Fair Flowers Fair P',1,0,NULL,NULL,'K14',NULL),(593,NULL,'Certificaten Socialy Qual',1,0,NULL,NULL,'K15',NULL),(594,NULL,'Certificaten GlobalGAP',1,0,NULL,NULL,'K16',NULL),(595,NULL,'Certificaten MPS Quality',1,0,NULL,NULL,'K17',NULL),(596,NULL,'Certificaten biologisch',1,0,NULL,NULL,'K18',NULL),(597,NULL,'Certificaten eetbare prod',1,0,NULL,NULL,'K19',NULL),(598,NULL,'Certificaten Florimark',1,0,NULL,NULL,'K20',NULL),(599,NULL,'Certificaten Milieukeur',1,0,NULL,NULL,'K21',NULL),(600,NULL,'Certificaten Kenya Flower',1,0,NULL,NULL,'K22',NULL),(601,NULL,'Certificaten Fairtrade',1,0,NULL,NULL,'K23',NULL),(602,NULL,'Keurmerk MPS-ProductProof',1,0,NULL,NULL,'K24',NULL),(603,NULL,'Certificaten ISO',1,0,NULL,NULL,'K25',NULL),(604,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,'K26',NULL),(605,NULL,'Certificaten Florverde',1,0,NULL,NULL,'K27',NULL),(606,NULL,'Certificaten Ethical Trad',1,0,NULL,NULL,'K28',NULL),(607,NULL,'Certificaten Ethiopian EH',1,0,NULL,NULL,'K29',NULL),(608,NULL,'Certificaten gewasbescher',1,0,NULL,NULL,'K30',NULL),(609,NULL,'Certificaten SAN',1,0,NULL,NULL,'K31',NULL),(610,NULL,'Certificaten GRASP',1,0,NULL,NULL,'K32',NULL),(611,NULL,'Label Fair Flora',1,0,NULL,NULL,'K33',NULL),(612,NULL,'GLobalG.A.P. Chain of Cus',1,0,NULL,NULL,'K34',NULL),(613,NULL,'Fust',1,0,NULL,NULL,'L01',NULL),(614,NULL,'Stapelwagen',1,0,NULL,NULL,'L02',NULL),(615,NULL,'Aantal legborden veilings',1,0,NULL,NULL,'L03',NULL),(616,NULL,'Aantal legborden Deense s',1,0,NULL,NULL,'L04',NULL),(617,NULL,'Aantal onderstellen Deens',1,0,NULL,NULL,'L05',NULL),(618,NULL,'Fustsoort',1,0,NULL,NULL,'L06',NULL),(619,NULL,'Envase',1,0,NULL,NULL,'L07',NULL),(620,NULL,'Aantal legborden Eurostap',1,0,NULL,NULL,'L08',NULL),(621,NULL,'Aantal onderstellen Euros',1,0,NULL,NULL,'L09',NULL),(622,NULL,'Tallos/bolsa',1,0,NULL,NULL,'L11',''),(623,NULL,'Aantal bossen per bundel',1,0,NULL,NULL,'L12',NULL),(624,NULL,'Aantal stuks per fust',1,0,NULL,NULL,'L13',NULL),(625,NULL,'Aantal bossen per fust',1,0,NULL,NULL,'L14',NULL),(626,NULL,'Aantal bundels per fust',1,0,NULL,NULL,'L15',NULL),(627,NULL,'Aantal bossen per hoes',1,0,NULL,NULL,'L16',NULL),(628,NULL,'Aantal bundels per hoes',1,0,NULL,NULL,'L17',NULL),(629,NULL,'Fustlabel',1,0,NULL,NULL,'L18',NULL),(630,NULL,'Karlabel',1,0,NULL,NULL,'L19',NULL),(631,NULL,'Service productlabel',1,0,NULL,NULL,'L20',NULL),(632,NULL,'Service fustlabel',1,0,NULL,NULL,'L21',NULL),(633,NULL,'Service karlabel',1,0,NULL,NULL,'L22',NULL),(634,NULL,'Aantal fusten per laag',1,0,NULL,NULL,'L23',NULL),(635,NULL,'Presentatie per schapm2',1,0,NULL,NULL,'L24',NULL),(636,NULL,'Positieve keurcode fytosa',1,0,NULL,NULL,'P01',NULL),(637,NULL,'Positieve keurcode kwalit',1,0,NULL,NULL,'P02',NULL),(638,NULL,'Positieve keurcode veilin',1,0,NULL,NULL,'P03',NULL),(639,NULL,'Maceta',1,1,NULL,'cm','S01','diameter'),(640,NULL,'Altura',1,0,NULL,NULL,'S02','size'),(641,NULL,'nº plantas',1,0,NULL,NULL,'S03',NULL),(642,NULL,'Diámetro',1,0,NULL,NULL,'S04',NULL),(644,NULL,'Combinatiehoogte',1,0,NULL,NULL,'S06',NULL),(645,NULL,'Plantas/Maceta',1,0,NULL,NULL,'S07',NULL),(646,NULL,'Dikte',1,0,NULL,NULL,'S08',NULL),(647,NULL,'nº flores',1,0,NULL,NULL,'S09',NULL),(648,NULL,'Min aantal bloemtrossen p',1,0,NULL,NULL,'S10',NULL),(649,NULL,'nº ramales',1,0,NULL,NULL,'S11',NULL),(650,NULL,'Minimum aantal bollen per',1,0,NULL,NULL,'S12',NULL),(651,NULL,'Minimum aantal bladeren p',1,0,NULL,NULL,'S13',NULL),(652,NULL,'Minimum stamhoogte',1,0,NULL,NULL,'S14',NULL),(653,NULL,'Altura caja',1,0,NULL,NULL,'S15',NULL),(654,NULL,'Lengte scheuten',1,0,NULL,NULL,'S16',NULL),(655,NULL,'Min aant vertakkingen pr ',1,0,NULL,NULL,'S17',NULL),(656,NULL,'Altura del capullo',1,0,NULL,NULL,'S19',NULL),(658,NULL,'Peso tallo',1,0,NULL,NULL,'S21',NULL),(659,NULL,'nº flores',1,0,NULL,NULL,'S22',NULL),(660,NULL,'Diámetro de la flor',1,0,NULL,NULL,'S23',NULL),(661,NULL,'Minimum bloemschedelengte',1,0,NULL,NULL,'S24',NULL),(662,NULL,'Aantal bloemkoppen per tr',1,0,NULL,NULL,'S25',NULL),(663,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S26',NULL),(664,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S27',NULL),(665,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S28',NULL),(666,NULL,'Longitud inflorescencia',1,0,NULL,NULL,'S29',NULL),(667,NULL,'Verpakkingswijze snijbloe',1,0,NULL,NULL,'S30',NULL),(668,NULL,'Minimum aant bloemen per ',1,0,NULL,NULL,'S31',NULL),(669,NULL,'Longitud',1,0,NULL,NULL,'S32',NULL),(670,NULL,'Jaartal sortering hout',1,0,NULL,NULL,'S33',NULL),(671,NULL,'Diámetro de la hoja',1,0,NULL,NULL,'S34',NULL),(672,NULL,'Peso paquete',1,0,NULL,NULL,'S35',NULL),(673,NULL,'Maximum planthoogte',1,0,NULL,NULL,'S36',NULL),(674,NULL,'Maximum plantdiameter',1,0,NULL,NULL,'S37',NULL),(675,NULL,'Max aantal bloemen/bloeiw',1,0,NULL,NULL,'S38',NULL),(676,NULL,'Maximum aantal takken per',1,0,NULL,NULL,'S39',NULL),(677,NULL,'Maximum aantal bollen per',1,0,NULL,NULL,'S40',NULL),(678,NULL,'Maximum stamhoogte',1,0,NULL,NULL,'S41',NULL),(679,NULL,'Longitud mínima',1,0,NULL,NULL,'S42','size'),(680,NULL,'Maximum aantal knoppen sn',1,0,NULL,NULL,'S43',NULL),(681,NULL,'Maximum bloemdiameter',1,0,NULL,NULL,'S44',NULL),(682,NULL,'Maximum bloeiwijzelengte',1,0,NULL,NULL,'S45',NULL),(683,NULL,'Aantal vruchten / trossen',1,0,NULL,NULL,'S46',NULL),(684,NULL,'Verpakkingswijze',1,0,NULL,NULL,'S47',NULL),(685,NULL,'Minimum vruchtdiameter',1,0,NULL,NULL,'S48',NULL),(686,NULL,'Bolomvang',1,0,NULL,NULL,'S49',NULL),(687,NULL,'Bloem/bes/vruchtkleur 1',1,0,NULL,NULL,'S50',NULL),(688,NULL,'Potvorm',1,0,NULL,NULL,'S51',NULL),(689,NULL,'Potkleur',1,0,NULL,NULL,'S52',NULL),(690,NULL,'Material maceta',1,0,NULL,NULL,'S53',NULL),(691,NULL,'Plantvorm',1,0,NULL,NULL,'S54',NULL),(692,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,'S55',NULL),(693,NULL,'Teeltwijze',1,0,NULL,NULL,'S56',NULL),(694,NULL,'Teeltmedium',1,0,NULL,NULL,'S57',NULL),(695,NULL,'Cubierta',1,0,NULL,NULL,'S58',NULL),(696,NULL,'Hoesvorm',1,0,NULL,NULL,'S59',NULL),(697,NULL,'Hoesbedrukking algemeen',1,0,NULL,NULL,'S60',NULL),(698,NULL,'Extra toevoegingen',1,0,NULL,NULL,'S61',NULL),(699,NULL,'Land van herkomst (bedrij',1,0,NULL,NULL,'S62',NULL),(700,NULL,'Verpakte orchidee',1,0,NULL,NULL,'S63',NULL),(701,NULL,'Hoesbedrukking extra',1,0,NULL,NULL,'S64',NULL),(702,NULL,'Voorbehandeling',1,0,NULL,NULL,'S65',NULL),(703,NULL,'Overige niet in pot',1,0,NULL,NULL,'S66',NULL),(704,NULL,'Forma de la flor',1,0,NULL,NULL,'S67',NULL),(705,NULL,'Flexibilidad',1,0,NULL,NULL,'S68',NULL),(706,NULL,'Hoeskleur',1,0,NULL,NULL,'S69',NULL),(707,NULL,'Extra deco',1,0,NULL,NULL,'S70',NULL),(708,NULL,'Color',1,0,NULL,NULL,'S71','inkFk'),(709,NULL,'Producto',1,0,NULL,NULL,'S72',NULL),(710,NULL,'Altura',1,0,NULL,NULL,'S73',NULL),(711,NULL,'Diametro',1,0,NULL,NULL,'S74',NULL),(712,NULL,'Barcode',1,0,NULL,NULL,'S75',NULL),(713,NULL,'Productlabel',1,0,NULL,NULL,'S76',NULL),(714,NULL,'Eetbaar/ niet eetbaar',1,0,NULL,NULL,'S77',NULL),(715,NULL,'Plantmaat zonder pot',1,0,NULL,NULL,'S78',NULL),(716,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,'S79',NULL),(717,NULL,'Maximum percentage oud ho',1,0,NULL,NULL,'S80',NULL),(718,NULL,'Maximum lengte verschil',1,0,NULL,NULL,'S81',NULL),(719,NULL,'Bladkleur',1,0,NULL,NULL,'S82',NULL),(720,NULL,'Plantgewicht',1,0,NULL,NULL,'S83',NULL),(721,NULL,'Diámetro',1,0,NULL,NULL,'S84',NULL),(722,NULL,'Bloem/bes/vruchtkleur 2',1,0,NULL,NULL,'S85',NULL),(723,NULL,'Winterhardheid (USDA zone',1,0,NULL,NULL,'S86',NULL),(724,NULL,'Kleurbehandeld',1,0,NULL,NULL,'S87','inkFk'),(725,NULL,'Bloem-/bladkleurverdeling',1,0,NULL,NULL,'S88',NULL),(726,NULL,'Diámetro del capullo',1,0,NULL,NULL,'S89',NULL),(727,NULL,'Volume inhoud',1,0,NULL,NULL,'S90',NULL),(728,NULL,'Vruchtbenaming',1,0,NULL,NULL,'S91',NULL),(729,NULL,'Vaaslevenindex',1,0,NULL,NULL,'S92',NULL),(730,NULL,'Overige informatie plante',1,0,NULL,NULL,'S93',NULL),(731,NULL,'Overige informatie snijbl',1,0,NULL,NULL,'S94',NULL),(732,NULL,'Toepassingsmogelijkheid',1,0,NULL,NULL,'S95',NULL),(733,NULL,'Productbeeld aanvoerder',1,0,NULL,NULL,'S96',NULL),(734,NULL,'MPS certificering',1,0,NULL,NULL,'S97',NULL),(735,NULL,'Kwaliteitsgroep',1,0,NULL,NULL,'S98',NULL),(736,NULL,'Artikelomschrijving',1,0,NULL,NULL,'S99',NULL),(737,NULL,'BTW-tarief',1,0,NULL,NULL,'T01',NULL),(738,NULL,'Prijseenheid',1,0,NULL,NULL,'T02',NULL),(739,NULL,'Transactievorm',1,0,NULL,NULL,'T03',NULL),(740,NULL,'Handelsverpakking voorwaa',1,0,NULL,NULL,'T10',NULL),(741,NULL,'Consumentenverpakking voo',1,0,NULL,NULL,'T11',NULL),(742,NULL,'Leveringsvoorwaarden',1,0,NULL,NULL,'T12',NULL),(743,NULL,'PT heffing voorwaarden',1,0,NULL,NULL,'T13',NULL),(744,NULL,'Serviceheffing voorwaarde',1,0,NULL,NULL,'T14',NULL),(745,NULL,'Algemene voorwaarden',1,0,NULL,NULL,'T15',NULL),(746,NULL,'Marktvorm',1,0,NULL,NULL,'T16',NULL),(747,NULL,'Themadagen',1,0,NULL,NULL,'T17',NULL),(748,NULL,'Handelscategorie',1,0,NULL,NULL,'T18',NULL),(749,NULL,'Producentengroepen',1,0,NULL,NULL,'T19',NULL),(750,NULL,'Favorieten Id',1,0,NULL,NULL,'T20',NULL),(751,NULL,'Verkoopeenheid',1,0,NULL,NULL,'T21',NULL),(752,NULL,'Veilgroep voorkeur',1,0,NULL,NULL,'V01',NULL),(753,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V02',NULL),(754,NULL,'Keurmeesternummer FloraHo',1,0,NULL,NULL,'V03',NULL),(755,NULL,'Rijnummer Rijnsburg',1,0,NULL,NULL,'V04',NULL),(756,NULL,'Verwerkingslocatie FloraH',1,0,NULL,NULL,'V05',NULL),(757,NULL,'FloraHolland Financial',1,0,NULL,NULL,'V06',NULL),(758,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V07',NULL),(759,NULL,'Benefiet veiling',1,0,NULL,NULL,'V08',NULL),(760,NULL,'Kloksoort',1,0,NULL,NULL,'V09',NULL),(761,NULL,'Minimumprijs aanvoerder',1,0,NULL,NULL,'V10',NULL),(762,NULL,'Rest aantallen',1,0,NULL,NULL,'V11',NULL),(763,NULL,'Veilsoort',1,0,NULL,NULL,'V12',NULL),(764,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V13',NULL),(765,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V14',NULL),(766,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V15',NULL),(767,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V16',NULL),(768,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V17',NULL),(769,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V18',NULL),(770,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V19',NULL),(771,NULL,'Gereserveerd',1,0,NULL,NULL,'V20',NULL),(772,NULL,'Veilgroep Aalsmeer',1,0,NULL,NULL,'V21',NULL),(773,NULL,'Promotie kenmerk FloraHol',1,0,NULL,NULL,'V22',NULL),(774,NULL,'Verrekening snijbloemenvo',1,0,NULL,NULL,'V23',NULL),(775,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V24',NULL),(776,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V25',NULL),(777,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V26',NULL),(778,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V27',NULL),(779,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V28',NULL),(780,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V29',NULL),(781,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V30',NULL),(782,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V31',NULL),(783,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V32',NULL),(784,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V33',NULL),(785,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V34',NULL),(786,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V35',NULL),(787,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V36',NULL),(788,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V37',NULL),(789,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V38',NULL),(790,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V39',NULL),(791,NULL,'Gereserveerd',1,0,NULL,NULL,'V40',NULL),(792,NULL,'Tussenopslag klok Plantio',1,0,NULL,NULL,'V41',NULL),(793,NULL,'Soort ladingsdrager Plant',1,0,NULL,NULL,'V42',NULL),(794,NULL,'Logistiek middel Plantion',1,0,NULL,NULL,'V43',NULL),(795,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V44',NULL),(796,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V45',NULL),(797,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V46',NULL),(798,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V47',NULL),(799,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V48',NULL),(800,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V49',NULL),(801,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V50',NULL),(802,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V51',NULL),(803,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V52',NULL),(804,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V53',NULL),(805,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V54',NULL),(806,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V55',NULL),(807,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V56',NULL),(808,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V57',NULL),(809,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V58',NULL),(810,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V59',NULL),(811,NULL,'Gereserveerd',1,0,NULL,NULL,'V60',NULL),(812,NULL,'Veilgroep Plantion Ede',1,0,NULL,NULL,'V61',NULL),(813,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V62',NULL),(814,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V63',NULL),(815,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V64',NULL),(816,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V65',NULL),(817,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V66',NULL),(818,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V67',NULL),(819,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V68',NULL),(820,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V69',NULL),(821,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V70',NULL),(822,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V71',NULL),(823,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V72',NULL),(824,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V73',NULL),(825,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V74',NULL),(826,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V75',NULL),(827,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V76',NULL),(828,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V77',NULL),(829,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V78',NULL),(830,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V79',NULL),(831,NULL,'Toegevoegde waardes VRM',1,0,NULL,NULL,'V80',NULL),(832,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V81',NULL),(833,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V82',NULL),(834,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V83',NULL),(835,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V84',NULL),(836,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V85',NULL),(837,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V86',NULL),(838,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V87',NULL),(839,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V88',NULL),(840,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V89',NULL),(841,NULL,'Veiling',1,0,NULL,NULL,'V99',NULL),(842,NULL,'kopersaantallen',1,0,NULL,NULL,'Z01',NULL),(843,NULL,'Caducidad',1,0,NULL,NULL,NULL,NULL),(844,NULL,'Lote',1,0,NULL,NULL,NULL,NULL),(845,NULL,'Uds palet',1,0,NULL,NULL,NULL,NULL); +INSERT INTO `tag` VALUES (1,'color','Color',0,0,'ink',NULL,NULL,'inkFk'),(2,NULL,'Forma',1,0,NULL,NULL,NULL,NULL),(3,NULL,'Material',1,0,NULL,NULL,NULL,NULL),(4,NULL,'Longitud',1,1,NULL,'mm',NULL,'size'),(5,NULL,'Diámetro',1,1,NULL,'mm',NULL,'diameter'),(6,NULL,'Perímetro',1,1,NULL,'mm',NULL,NULL),(7,NULL,'Ancho de la base',1,1,NULL,'mm',NULL,NULL),(8,NULL,'Altura',1,1,NULL,'mm',NULL,'size'),(9,NULL,'Volumen',1,1,NULL,'ml',NULL,NULL),(10,NULL,'Densidad',1,1,NULL,NULL,NULL,NULL),(11,NULL,'Calidad',1,0,NULL,NULL,NULL,NULL),(12,NULL,'Textura',1,0,NULL,NULL,NULL,NULL),(13,NULL,'Material del mango',1,0,NULL,NULL,NULL,NULL),(14,NULL,'Compra mínima',1,0,NULL,NULL,NULL,NULL),(15,NULL,'Nº pétalos',1,1,NULL,NULL,NULL,NULL),(16,NULL,'Ancho',1,1,NULL,'mm',NULL,NULL),(18,NULL,'Profundidad',1,1,NULL,'mm',NULL,NULL),(19,NULL,'Largo',1,1,NULL,'mm',NULL,'size'),(20,NULL,'Ancho superior',1,1,NULL,'mm',NULL,NULL),(21,NULL,'Ancho inferior',1,1,NULL,'mm',NULL,NULL),(22,NULL,'Gramaje',1,1,NULL,'g',NULL,NULL),(23,'stems','Tallos',1,1,NULL,NULL,NULL,'stems'),(24,NULL,'Estado',1,0,NULL,NULL,NULL,NULL),(25,NULL,'Color principal',0,0,'ink',NULL,NULL,NULL),(26,NULL,'Color secundario',0,0,'ink',NULL,NULL,NULL),(27,NULL,'Longitud(cm)',1,1,NULL,'cm',NULL,NULL),(28,NULL,'Diámetro base',1,1,NULL,'mm',NULL,'diameter'),(29,NULL,'Colección',1,0,NULL,NULL,NULL,NULL),(30,NULL,'Uds / caja',1,1,NULL,NULL,NULL,NULL),(31,NULL,'Contenido',1,0,NULL,NULL,NULL,NULL),(32,NULL,'Peso',1,1,NULL,'g',NULL,NULL),(33,NULL,'Grosor',1,1,NULL,'mm',NULL,NULL),(34,NULL,'Marca',1,0,NULL,NULL,NULL,NULL),(35,'origin','Origen',0,0,'origin',NULL,NULL,'originFk'),(36,NULL,'Proveedor',1,0,NULL,NULL,NULL,NULL),(37,'producer','Productor',0,0,'producer',NULL,NULL,'producerFk'),(38,NULL,'Duración',1,1,NULL,'s',NULL,NULL),(39,NULL,'Flor',1,0,NULL,NULL,NULL,NULL),(40,NULL,'Soporte',1,0,NULL,NULL,NULL,NULL),(41,NULL,'Tamaño flor',1,0,NULL,NULL,NULL,NULL),(42,NULL,'Apertura',1,0,NULL,NULL,NULL,NULL),(43,NULL,'Tallo',1,0,NULL,NULL,NULL,NULL),(44,NULL,'Nº hojas',1,1,NULL,NULL,NULL,NULL),(45,NULL,'Dimensiones',1,0,NULL,NULL,NULL,NULL),(46,NULL,'Diámetro boca',1,1,NULL,'mm',NULL,NULL),(47,NULL,'Nº flores',1,1,NULL,NULL,NULL,NULL),(48,NULL,'Uds / paquete',1,1,NULL,NULL,NULL,NULL),(49,NULL,'Maceta',1,1,NULL,'cm',NULL,'diameter'),(50,NULL,'Textura flor',1,0,NULL,NULL,NULL,NULL),(51,NULL,'Textura hoja',1,0,NULL,NULL,NULL,NULL),(52,NULL,'Tipo de IVA',1,0,NULL,NULL,NULL,NULL),(53,NULL,'Tronco',1,0,NULL,NULL,NULL,NULL),(54,NULL,'Hoja',1,0,NULL,NULL,NULL,NULL),(55,NULL,'Formato',1,0,NULL,NULL,NULL,NULL),(56,NULL,'Genero',1,0,NULL,NULL,NULL,NULL),(57,NULL,'Especie',1,0,NULL,NULL,NULL,NULL),(58,NULL,'Variedad',1,0,NULL,NULL,NULL,NULL),(59,NULL,'Medida grande',1,0,NULL,NULL,NULL,NULL),(60,NULL,'Medida mediano',1,0,NULL,NULL,NULL,NULL),(61,NULL,'Medida pequeño',1,0,NULL,NULL,NULL,NULL),(63,NULL,'Recipiente interior',1,0,NULL,NULL,NULL,NULL),(64,NULL,'Material secundario',1,0,NULL,NULL,NULL,NULL),(65,NULL,'Colores',1,0,NULL,NULL,NULL,NULL),(66,NULL,'Referencia',1,0,NULL,NULL,NULL,NULL),(67,'category','Categoria',1,0,NULL,NULL,NULL,NULL),(68,NULL,'Amb',1,0,NULL,NULL,NULL,NULL),(69,NULL,'Anchura',1,1,NULL,'cm',NULL,NULL),(70,NULL,'Hueco interior',1,0,NULL,NULL,NULL,NULL),(71,NULL,'Tamaño',1,0,NULL,NULL,NULL,NULL),(72,NULL,'Color botón',1,0,NULL,NULL,NULL,NULL),(73,NULL,'Tamaño minimo del botón',1,0,NULL,NULL,NULL,NULL),(74,NULL,'Obtentor',1,0,NULL,NULL,NULL,NULL),(75,NULL,'Longitud del brote',1,0,NULL,NULL,NULL,NULL),(76,NULL,'Tallos / u.v.',1,0,NULL,NULL,NULL,NULL),(77,NULL,'Madera de',1,0,NULL,NULL,NULL,NULL),(78,NULL,'Unidad de venta',1,0,NULL,NULL,NULL,NULL),(79,NULL,'Temporal',1,0,NULL,NULL,NULL,NULL),(80,NULL,'Gramaje/tallo',1,1,NULL,'g',NULL,NULL),(81,NULL,'Peso/paquete',1,1,NULL,'g',NULL,NULL),(82,NULL,'Flexibilidad del tallo',1,0,NULL,NULL,NULL,NULL),(83,NULL,'Nº planchas',1,1,NULL,NULL,NULL,NULL),(84,NULL,'Nº páginas',1,1,NULL,NULL,NULL,NULL),(85,NULL,'Editorial',1,0,NULL,NULL,NULL,NULL),(86,NULL,'Idioma',1,0,NULL,NULL,NULL,NULL),(87,NULL,'Fecha publicación',1,0,NULL,NULL,NULL,NULL),(88,NULL,'Cubierta',1,0,NULL,NULL,NULL,NULL),(89,NULL,'Encuadernación',1,0,NULL,NULL,NULL,NULL),(90,NULL,'Autor',1,0,NULL,NULL,NULL,NULL),(91,NULL,'Envoltorio',1,0,NULL,NULL,NULL,NULL),(92,NULL,'Nombre temporal',1,0,NULL,NULL,NULL,NULL),(93,NULL,'Modelo',1,0,NULL,NULL,NULL,NULL),(94,NULL,'Producto',1,0,NULL,NULL,NULL,NULL),(95,NULL,'Título',1,0,NULL,NULL,NULL,NULL),(96,NULL,'Tomo',1,0,NULL,NULL,NULL,NULL),(97,NULL,'Articulo',1,0,NULL,NULL,NULL,NULL),(98,NULL,'Metodo de cultivo',1,0,NULL,NULL,NULL,NULL),(99,NULL,'Edad',1,0,NULL,NULL,NULL,NULL),(100,NULL,'Agotado',1,0,NULL,NULL,NULL,NULL),(101,NULL,'Altura con asa',1,1,NULL,'cm',NULL,'size'),(102,NULL,'Nº tallos',1,1,NULL,NULL,NULL,NULL),(103,NULL,'Cultivo',1,0,NULL,NULL,NULL,NULL),(104,NULL,'Sabor',1,0,NULL,NULL,NULL,NULL),(105,NULL,'Talla',1,0,NULL,NULL,NULL,NULL),(106,NULL,'Calibre',1,1,NULL,NULL,NULL,NULL),(107,NULL,'Dulzura',1,1,NULL,'bx',NULL,NULL),(108,NULL,'Piezas',1,0,NULL,NULL,NULL,NULL),(109,NULL,'Altura con patas',1,0,NULL,'cm',NULL,'size'),(110,NULL,'Envase',1,0,NULL,NULL,NULL,NULL),(111,NULL,'Nº piezas',1,0,NULL,NULL,NULL,NULL),(112,NULL,'Uso',1,0,NULL,'cm',NULL,NULL),(113,NULL,'Color luz',1,0,NULL,NULL,NULL,NULL),(114,NULL,'Capacidad',1,0,NULL,NULL,NULL,NULL),(184,NULL,'Tallos por paquete',1,0,NULL,NULL,NULL,NULL),(205,NULL,'Apertura',1,0,NULL,NULL,NULL,NULL),(219,NULL,'Altura',1,0,NULL,'cm',NULL,'size'),(552,NULL,'fout kenmerk',1,0,NULL,NULL,NULL,NULL),(553,NULL,'Potinhoud',1,0,NULL,NULL,NULL,NULL),(554,NULL,'Marketingconcept',1,0,NULL,NULL,NULL,NULL),(555,NULL,'Leeftijd',1,0,NULL,NULL,NULL,NULL),(556,NULL,'Base',1,0,NULL,NULL,NULL,NULL),(557,NULL,'Kleurbehandeld',1,0,NULL,NULL,NULL,'inkFk'),(558,NULL,'Verzorging: Standplaats',1,0,NULL,NULL,NULL,NULL),(559,NULL,'Verzorging: Water',1,0,NULL,NULL,NULL,NULL),(560,NULL,'Verzorging: Voeding',1,0,NULL,NULL,NULL,NULL),(561,NULL,'Verzorging: Temperatuur',1,0,NULL,NULL,NULL,NULL),(562,NULL,'Verzorging: Specifieke in',1,0,NULL,NULL,NULL,NULL),(563,NULL,'Verzorging: Consumptie',1,0,NULL,NULL,NULL,NULL),(564,NULL,'Nabehandeling',1,0,NULL,NULL,NULL,NULL),(565,NULL,'Artikel beeld',1,0,NULL,NULL,NULL,NULL),(566,NULL,'Hoofdkleur 1',1,0,NULL,NULL,NULL,NULL),(567,NULL,'Hoofdkleur 2',1,0,NULL,NULL,NULL,NULL),(568,NULL,'RHS hoofdkleur 1',1,0,NULL,NULL,NULL,NULL),(569,NULL,'RHS hoofdkleur 2',1,0,NULL,NULL,NULL,NULL),(570,NULL,'Hoofdkleur 1 blad',1,0,NULL,NULL,NULL,NULL),(571,NULL,'Hoofdkleur 2 blad',1,0,NULL,NULL,NULL,NULL),(572,NULL,'RHS hoofdkleur 1 blad',1,0,NULL,NULL,NULL,NULL),(573,NULL,'RHS hoofdkleur 2 blad',1,0,NULL,NULL,NULL,NULL),(574,NULL,'Botanisch beeld',1,0,NULL,NULL,NULL,NULL),(575,NULL,'Hoofdkleur bes/vrucht',1,0,NULL,NULL,NULL,NULL),(576,NULL,'RHS hoofdkleur bes/vrucht',1,0,NULL,NULL,NULL,NULL),(577,NULL,'UPOV hoofdkleur 1 bloem',1,0,NULL,NULL,NULL,NULL),(578,NULL,'UPOV hoofdkleur 2 bloem',1,0,NULL,NULL,NULL,NULL),(579,NULL,'UPOV hoofdkleur 1 blad',1,0,NULL,NULL,NULL,NULL),(580,NULL,'UPOV hoofdkleur 2 blad',1,0,NULL,NULL,NULL,NULL),(581,NULL,'UPOV hoofdkleur bes/vruch',1,0,NULL,NULL,NULL,NULL),(582,NULL,'Negatieve keurcode 1',1,0,NULL,NULL,NULL,NULL),(583,NULL,'Negatieve keurcode 2',1,0,NULL,NULL,NULL,NULL),(584,NULL,'Bedrijfskenmerk fytosanit',1,0,NULL,NULL,NULL,NULL),(585,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,NULL,NULL),(586,NULL,'Certificaten MPS-TraceCer',1,0,NULL,NULL,NULL,NULL),(587,NULL,'Overige leveranciersinfor',1,0,NULL,NULL,NULL,NULL),(588,NULL,'Certificaten MPS-GAP',1,0,NULL,NULL,NULL,NULL),(589,NULL,'Betrouwbaarheidsindex kla',1,0,NULL,NULL,NULL,NULL),(590,NULL,'Betrouwbaarheidsindex waa',1,0,NULL,NULL,NULL,NULL),(591,NULL,'Productkwaliteitslabel',1,0,NULL,NULL,NULL,NULL),(592,NULL,'Label Fair Flowers Fair P',1,0,NULL,NULL,NULL,NULL),(593,NULL,'Certificaten Socialy Qual',1,0,NULL,NULL,NULL,NULL),(594,NULL,'Certificaten GlobalGAP',1,0,NULL,NULL,NULL,NULL),(595,NULL,'Certificaten MPS Quality',1,0,NULL,NULL,NULL,NULL),(596,NULL,'Certificaten biologisch',1,0,NULL,NULL,NULL,NULL),(597,NULL,'Certificaten eetbare prod',1,0,NULL,NULL,NULL,NULL),(598,NULL,'Certificaten Florimark',1,0,NULL,NULL,NULL,NULL),(599,NULL,'Certificaten Milieukeur',1,0,NULL,NULL,NULL,NULL),(600,NULL,'Certificaten Kenya Flower',1,0,NULL,NULL,NULL,NULL),(601,NULL,'Certificaten Fairtrade',1,0,NULL,NULL,NULL,NULL),(602,NULL,'Keurmerk MPS-ProductProof',1,0,NULL,NULL,NULL,NULL),(603,NULL,'Certificaten ISO',1,0,NULL,NULL,NULL,NULL),(604,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,NULL,NULL),(605,NULL,'Certificaten Florverde',1,0,NULL,NULL,NULL,NULL),(606,NULL,'Certificaten Ethical Trad',1,0,NULL,NULL,NULL,NULL),(607,NULL,'Certificaten Ethiopian EH',1,0,NULL,NULL,NULL,NULL),(608,NULL,'Certificaten gewasbescher',1,0,NULL,NULL,NULL,NULL),(609,NULL,'Certificaten SAN',1,0,NULL,NULL,NULL,NULL),(610,NULL,'Certificaten GRASP',1,0,NULL,NULL,NULL,NULL),(611,NULL,'Label Fair Flora',1,0,NULL,NULL,NULL,NULL),(612,NULL,'GLobalG.A.P. Chain of Cus',1,0,NULL,NULL,NULL,NULL),(613,NULL,'Fust',1,0,NULL,NULL,NULL,NULL),(614,NULL,'Stapelwagen',1,0,NULL,NULL,NULL,NULL),(615,NULL,'Aantal legborden veilings',1,0,NULL,NULL,NULL,NULL),(616,NULL,'Aantal legborden Deense s',1,0,NULL,NULL,NULL,NULL),(617,NULL,'Aantal onderstellen Deens',1,0,NULL,NULL,NULL,NULL),(618,NULL,'Fustsoort',1,0,NULL,NULL,NULL,NULL),(619,NULL,'Envase',1,0,NULL,NULL,NULL,NULL),(620,NULL,'Aantal legborden Eurostap',1,0,NULL,NULL,NULL,NULL),(621,NULL,'Aantal onderstellen Euros',1,0,NULL,NULL,NULL,NULL),(622,NULL,'Tallos/bolsa',1,0,NULL,NULL,NULL,''),(623,NULL,'Aantal bossen per bundel',1,0,NULL,NULL,NULL,NULL),(624,NULL,'Aantal stuks per fust',1,0,NULL,NULL,NULL,NULL),(625,NULL,'Aantal bossen per fust',1,0,NULL,NULL,NULL,NULL),(626,NULL,'Aantal bundels per fust',1,0,NULL,NULL,NULL,NULL),(627,NULL,'Aantal bossen per hoes',1,0,NULL,NULL,NULL,NULL),(628,NULL,'Aantal bundels per hoes',1,0,NULL,NULL,NULL,NULL),(629,NULL,'Fustlabel',1,0,NULL,NULL,NULL,NULL),(630,NULL,'Karlabel',1,0,NULL,NULL,NULL,NULL),(631,NULL,'Service productlabel',1,0,NULL,NULL,NULL,NULL),(632,NULL,'Service fustlabel',1,0,NULL,NULL,NULL,NULL),(633,NULL,'Service karlabel',1,0,NULL,NULL,NULL,NULL),(634,NULL,'Aantal fusten per laag',1,0,NULL,NULL,NULL,NULL),(635,NULL,'Presentatie per schapm2',1,0,NULL,NULL,NULL,NULL),(636,NULL,'Positieve keurcode fytosa',1,0,NULL,NULL,NULL,NULL),(637,NULL,'Positieve keurcode kwalit',1,0,NULL,NULL,NULL,NULL),(638,NULL,'Positieve keurcode veilin',1,0,NULL,NULL,NULL,NULL),(639,NULL,'Maceta',1,1,NULL,'cm',NULL,'diameter'),(640,NULL,'Altura',1,0,NULL,'cm',NULL,'size'),(641,NULL,'nº plantas',1,0,NULL,NULL,NULL,NULL),(642,NULL,'Diámetro',1,0,NULL,NULL,NULL,NULL),(644,NULL,'Altura',1,1,NULL,'cm',NULL,'size'),(645,NULL,'Plantas/Maceta',1,0,NULL,NULL,NULL,NULL),(646,NULL,'Dikte',1,0,NULL,NULL,NULL,NULL),(647,NULL,'nº flores',1,0,NULL,NULL,NULL,NULL),(648,NULL,'Min aantal bloemtrossen p',1,0,NULL,NULL,NULL,NULL),(649,NULL,'nº ramales',1,0,NULL,NULL,NULL,NULL),(650,NULL,'Minimum aantal bollen per',1,0,NULL,NULL,NULL,NULL),(651,NULL,'Minimum aantal bladeren p',1,0,NULL,NULL,NULL,NULL),(652,NULL,'Altura tronco',1,1,NULL,'cm',NULL,'size'),(653,NULL,'Altura caja',1,0,NULL,'cm',NULL,'size'),(654,NULL,'Lengte scheuten',1,0,NULL,NULL,NULL,NULL),(655,NULL,'Min aant vertakkingen pr ',1,0,NULL,NULL,NULL,NULL),(656,NULL,'Altura del capullo',1,0,NULL,NULL,NULL,NULL),(658,NULL,'Peso tallo',1,0,NULL,NULL,NULL,NULL),(659,NULL,'nº flores',1,0,NULL,NULL,NULL,NULL),(660,NULL,'Diámetro de la flor',1,0,NULL,NULL,NULL,NULL),(661,NULL,'Minimum bloemschedelengte',1,0,NULL,NULL,NULL,NULL),(662,NULL,'Aantal bloemkoppen per tr',1,0,NULL,NULL,NULL,NULL),(663,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,NULL,NULL),(664,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,NULL,NULL),(665,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,NULL,NULL),(666,NULL,'Longitud inflorescencia',1,0,NULL,NULL,NULL,NULL),(667,NULL,'Verpakkingswijze snijbloe',1,0,NULL,NULL,NULL,NULL),(668,NULL,'Minimum aant bloemen per ',1,0,NULL,NULL,NULL,NULL),(669,NULL,'Longitud',1,0,NULL,NULL,NULL,'size'),(670,NULL,'Jaartal sortering hout',1,0,NULL,NULL,NULL,NULL),(671,NULL,'Diámetro de la hoja',1,0,NULL,NULL,NULL,NULL),(672,NULL,'Peso paquete',1,0,NULL,NULL,NULL,NULL),(673,NULL,'Maximum planthoogte',1,0,NULL,NULL,NULL,NULL),(674,NULL,'Maximum plantdiameter',1,0,NULL,NULL,NULL,NULL),(675,NULL,'Max aantal bloemen/bloeiw',1,0,NULL,NULL,NULL,NULL),(676,NULL,'Maximum aantal takken per',1,0,NULL,NULL,NULL,NULL),(677,NULL,'Maximum aantal bollen per',1,0,NULL,NULL,NULL,NULL),(678,NULL,'Maximum stamhoogte',1,0,NULL,NULL,NULL,NULL),(679,NULL,'Longitud mínima',1,0,NULL,NULL,NULL,'size'),(680,NULL,'Maximum aantal knoppen sn',1,0,NULL,NULL,NULL,NULL),(681,NULL,'Maximum bloemdiameter',1,0,NULL,NULL,NULL,NULL),(682,NULL,'Maximum bloeiwijzelengte',1,0,NULL,NULL,NULL,NULL),(683,NULL,'Aantal vruchten / trossen',1,0,NULL,NULL,NULL,NULL),(684,NULL,'Verpakkingswijze',1,0,NULL,NULL,NULL,NULL),(685,NULL,'Minimum vruchtdiameter',1,0,NULL,NULL,NULL,NULL),(686,NULL,'Medida',1,1,NULL,'cm',NULL,'size'),(687,NULL,'Bloem/bes/vruchtkleur 1',1,0,NULL,NULL,NULL,NULL),(688,NULL,'Potvorm',1,0,NULL,NULL,NULL,NULL),(689,NULL,'Potkleur',1,0,NULL,NULL,NULL,NULL),(690,NULL,'Material maceta',1,0,NULL,NULL,NULL,NULL),(691,NULL,'Plantvorm',1,0,NULL,NULL,NULL,NULL),(692,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,NULL,NULL),(693,NULL,'Teeltwijze',1,0,NULL,NULL,NULL,NULL),(694,NULL,'Teeltmedium',1,0,NULL,NULL,NULL,NULL),(695,NULL,'Cubierta',1,0,NULL,NULL,NULL,NULL),(696,NULL,'Hoesvorm',1,0,NULL,NULL,NULL,NULL),(697,NULL,'Hoesbedrukking algemeen',1,0,NULL,NULL,NULL,NULL),(698,NULL,'Extra toevoegingen',1,0,NULL,NULL,NULL,NULL),(699,NULL,'Land van herkomst (bedrij',1,0,NULL,NULL,NULL,NULL),(700,NULL,'Verpakte orchidee',1,0,NULL,NULL,NULL,NULL),(701,NULL,'Hoesbedrukking extra',1,0,NULL,NULL,NULL,NULL),(702,NULL,'Voorbehandeling',1,0,NULL,NULL,NULL,NULL),(703,NULL,'Overige niet in pot',1,0,NULL,NULL,NULL,NULL),(704,NULL,'Forma de la flor',1,0,NULL,NULL,NULL,NULL),(705,NULL,'Flexibilidad',1,0,NULL,NULL,NULL,NULL),(706,NULL,'Hoeskleur',1,0,NULL,NULL,NULL,NULL),(707,NULL,'Extra deco',1,0,NULL,NULL,NULL,NULL),(708,NULL,'Color',1,0,NULL,NULL,NULL,'inkFk'),(709,NULL,'Producto',1,0,NULL,NULL,NULL,NULL),(710,NULL,'Altura',1,0,NULL,'cm',NULL,'size'),(711,NULL,'Diametro',1,0,NULL,NULL,NULL,NULL),(712,NULL,'Barcode',1,0,NULL,NULL,NULL,NULL),(713,NULL,'Productlabel',1,0,NULL,NULL,NULL,NULL),(714,NULL,'Eetbaar/ niet eetbaar',1,0,NULL,NULL,NULL,NULL),(715,NULL,'Plantmaat zonder pot',1,0,NULL,NULL,NULL,NULL),(716,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,NULL,NULL),(717,NULL,'Maximum percentage oud ho',1,0,NULL,NULL,NULL,NULL),(718,NULL,'Maximum lengte verschil',1,0,NULL,NULL,NULL,NULL),(719,NULL,'Bladkleur',1,0,NULL,NULL,NULL,NULL),(720,NULL,'Plantgewicht',1,0,NULL,NULL,NULL,NULL),(721,NULL,'Diámetro',1,0,NULL,NULL,NULL,NULL),(722,NULL,'Bloem/bes/vruchtkleur 2',1,0,NULL,NULL,NULL,NULL),(723,NULL,'Winterhardheid (USDA zone',1,0,NULL,NULL,NULL,NULL),(724,NULL,'Kleurbehandeld',1,0,NULL,NULL,NULL,'inkFk'),(725,NULL,'Bloem-/bladkleurverdeling',1,0,NULL,NULL,NULL,NULL),(726,NULL,'Diámetro del capullo',1,0,NULL,NULL,NULL,NULL),(727,NULL,'Volume inhoud',1,0,NULL,NULL,NULL,NULL),(728,NULL,'Vruchtbenaming',1,0,NULL,NULL,NULL,NULL),(729,NULL,'Vaaslevenindex',1,0,NULL,NULL,NULL,NULL),(730,NULL,'Overige informatie plante',1,0,NULL,NULL,NULL,NULL),(731,NULL,'Overige informatie snijbl',1,0,NULL,NULL,NULL,NULL),(732,NULL,'Toepassingsmogelijkheid',1,0,NULL,NULL,NULL,NULL),(733,NULL,'Productbeeld aanvoerder',1,0,NULL,NULL,NULL,NULL),(734,NULL,'MPS certificering',1,0,NULL,NULL,NULL,NULL),(735,NULL,'Kwaliteitsgroep',1,0,NULL,NULL,NULL,NULL),(736,NULL,'Artikelomschrijving',1,0,NULL,NULL,NULL,NULL),(737,NULL,'BTW-tarief',1,0,NULL,NULL,NULL,NULL),(738,NULL,'Prijseenheid',1,0,NULL,NULL,NULL,NULL),(739,NULL,'Transactievorm',1,0,NULL,NULL,NULL,NULL),(740,NULL,'Handelsverpakking voorwaa',1,0,NULL,NULL,NULL,NULL),(741,NULL,'Consumentenverpakking voo',1,0,NULL,NULL,NULL,NULL),(742,NULL,'Leveringsvoorwaarden',1,0,NULL,NULL,NULL,NULL),(743,NULL,'PT heffing voorwaarden',1,0,NULL,NULL,NULL,NULL),(744,NULL,'Serviceheffing voorwaarde',1,0,NULL,NULL,NULL,NULL),(745,NULL,'Algemene voorwaarden',1,0,NULL,NULL,NULL,NULL),(746,NULL,'Marktvorm',1,0,NULL,NULL,NULL,NULL),(747,NULL,'Themadagen',1,0,NULL,NULL,NULL,NULL),(748,NULL,'Handelscategorie',1,0,NULL,NULL,NULL,NULL),(749,NULL,'Producentengroepen',1,0,NULL,NULL,NULL,NULL),(750,NULL,'Favorieten Id',1,0,NULL,NULL,NULL,NULL),(751,NULL,'Verkoopeenheid',1,0,NULL,NULL,NULL,NULL),(752,NULL,'Veilgroep voorkeur',1,0,NULL,NULL,NULL,NULL),(753,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(754,NULL,'Keurmeesternummer FloraHo',1,0,NULL,NULL,NULL,NULL),(755,NULL,'Rijnummer Rijnsburg',1,0,NULL,NULL,NULL,NULL),(756,NULL,'Verwerkingslocatie FloraH',1,0,NULL,NULL,NULL,NULL),(757,NULL,'FloraHolland Financial',1,0,NULL,NULL,NULL,NULL),(758,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(759,NULL,'Benefiet veiling',1,0,NULL,NULL,NULL,NULL),(760,NULL,'Kloksoort',1,0,NULL,NULL,NULL,NULL),(761,NULL,'Minimumprijs aanvoerder',1,0,NULL,NULL,NULL,NULL),(762,NULL,'Rest aantallen',1,0,NULL,NULL,NULL,NULL),(763,NULL,'Veilsoort',1,0,NULL,NULL,NULL,NULL),(764,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(765,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(766,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(767,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(768,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(769,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(770,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,NULL,NULL),(771,NULL,'Gereserveerd',1,0,NULL,NULL,NULL,NULL),(772,NULL,'Veilgroep Aalsmeer',1,0,NULL,NULL,NULL,NULL),(773,NULL,'Promotie kenmerk FloraHol',1,0,NULL,NULL,NULL,NULL),(774,NULL,'Verrekening snijbloemenvo',1,0,NULL,NULL,NULL,NULL),(775,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(776,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(777,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(778,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(779,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(780,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(781,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(782,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(783,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(784,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(785,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(786,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(787,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(788,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(789,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(790,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,NULL,NULL),(791,NULL,'Gereserveerd',1,0,NULL,NULL,NULL,NULL),(792,NULL,'Tussenopslag klok Plantio',1,0,NULL,NULL,NULL,NULL),(793,NULL,'Soort ladingsdrager Plant',1,0,NULL,NULL,NULL,NULL),(794,NULL,'Logistiek middel Plantion',1,0,NULL,NULL,NULL,NULL),(795,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(796,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(797,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(798,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(799,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(800,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(801,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(802,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(803,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(804,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(805,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(806,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(807,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(808,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(809,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(810,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(811,NULL,'Gereserveerd',1,0,NULL,NULL,NULL,NULL),(812,NULL,'Veilgroep Plantion Ede',1,0,NULL,NULL,NULL,NULL),(813,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(814,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(815,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(816,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(817,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(818,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(819,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(820,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(821,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(822,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(823,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(824,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(825,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(826,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,NULL,NULL),(827,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,NULL,NULL),(828,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,NULL,NULL),(829,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,NULL,NULL),(830,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,NULL,NULL),(831,NULL,'Toegevoegde waardes VRM',1,0,NULL,NULL,NULL,NULL),(832,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(833,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(834,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(835,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(836,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(837,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(838,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(839,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(840,NULL,'Gereserveerd VRM',1,0,NULL,NULL,NULL,NULL),(841,NULL,'Veiling',1,0,NULL,NULL,NULL,NULL),(842,NULL,'kopersaantallen',1,0,NULL,NULL,NULL,NULL),(843,NULL,'Caducidad',1,0,NULL,NULL,NULL,NULL),(844,NULL,'Lote',1,0,NULL,NULL,NULL,NULL),(845,NULL,'Uds palet',1,0,NULL,NULL,NULL,NULL),(4548,NULL,'fout kenmerk',1,0,NULL,NULL,'081',NULL),(4549,NULL,'Potinhoud',1,0,NULL,NULL,'A01',NULL),(4550,NULL,'Marketingconcept',1,0,NULL,NULL,'A02',NULL),(4551,NULL,'Leeftijd',1,0,NULL,NULL,'A03',NULL),(4552,NULL,'Uitgangsmateriaal',1,0,NULL,NULL,'A04',NULL),(4553,NULL,'Kleurbehandeld',1,0,NULL,NULL,'A05',NULL),(4554,NULL,'Verzorging: Standplaats',1,0,NULL,NULL,'A06',NULL),(4555,NULL,'Verzorging: Water',1,0,NULL,NULL,'A07',NULL),(4556,NULL,'Verzorging: Voeding',1,0,NULL,NULL,'A08',NULL),(4557,NULL,'Verzorging: Temperatuur',1,0,NULL,NULL,'A09',NULL),(4558,NULL,'Verzorging: Specifieke in',1,0,NULL,NULL,'A10',NULL),(4559,NULL,'Verzorging: Consumptie',1,0,NULL,NULL,'A11',NULL),(4560,NULL,'Nabehandeling',1,0,NULL,NULL,'A13',NULL),(4561,NULL,'Artikel beeld',1,0,NULL,NULL,'A23',NULL),(4562,NULL,'Hoofdkleur 1',1,0,NULL,NULL,'B01',NULL),(4563,NULL,'Hoofdkleur 2',1,0,NULL,NULL,'B02',NULL),(4564,NULL,'RHS hoofdkleur 1',1,0,NULL,NULL,'B03',NULL),(4565,NULL,'RHS hoofdkleur 2',1,0,NULL,NULL,'B04',NULL),(4566,NULL,'Hoofdkleur 1 blad',1,0,NULL,NULL,'B05',NULL),(4567,NULL,'Hoofdkleur 2 blad',1,0,NULL,NULL,'B06',NULL),(4568,NULL,'RHS hoofdkleur 1 blad',1,0,NULL,NULL,'B07',NULL),(4569,NULL,'RHS hoofdkleur 2 blad',1,0,NULL,NULL,'B08',NULL),(4570,NULL,'Botanisch beeld',1,0,NULL,NULL,'B09',NULL),(4571,NULL,'Hoofdkleur bes/vrucht',1,0,NULL,NULL,'B10',NULL),(4572,NULL,'RHS hoofdkleur bes/vrucht',1,0,NULL,NULL,'B11',NULL),(4573,NULL,'UPOV hoofdkleur 1 bloem',1,0,NULL,NULL,'B12',NULL),(4574,NULL,'UPOV hoofdkleur 2 bloem',1,0,NULL,NULL,'B13',NULL),(4575,NULL,'UPOV hoofdkleur 1 blad',1,0,NULL,NULL,'B14',NULL),(4576,NULL,'UPOV hoofdkleur 2 blad',1,0,NULL,NULL,'B15',NULL),(4577,NULL,'UPOV hoofdkleur bes/vruch',1,0,NULL,NULL,'B16',NULL),(4578,NULL,'Negatieve keurcode 1',1,0,NULL,NULL,'K01',NULL),(4579,NULL,'Negatieve keurcode 2',1,0,NULL,NULL,'K02',NULL),(4580,NULL,'Bedrijfskenmerk fytosanit',1,0,NULL,NULL,'K03',NULL),(4581,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,'K04',NULL),(4582,NULL,'Certificaten MPS-TraceCer',1,0,NULL,NULL,'K05',NULL),(4583,NULL,'Overige leveranciersinfor',1,0,NULL,NULL,'K07',NULL),(4584,NULL,'Certificaten MPS-GAP',1,0,NULL,NULL,'K08',NULL),(4585,NULL,'Betrouwbaarheidsindex kla',1,0,NULL,NULL,'K11',NULL),(4586,NULL,'Betrouwbaarheidsindex waa',1,0,NULL,NULL,'K12',NULL),(4587,NULL,'Productkwaliteitslabel',1,0,NULL,NULL,'K13',NULL),(4588,NULL,'Label Fair Flowers Fair P',1,0,NULL,NULL,'K14',NULL),(4589,NULL,'Certificaten Socialy Qual',1,0,NULL,NULL,'K15',NULL),(4590,NULL,'Certificaten GlobalGAP',1,0,NULL,NULL,'K16',NULL),(4591,NULL,'Certificaten MPS Quality',1,0,NULL,NULL,'K17',NULL),(4592,NULL,'Certificaten biologisch',1,0,NULL,NULL,'K18',NULL),(4593,NULL,'Certificaten eetbare prod',1,0,NULL,NULL,'K19',NULL),(4594,NULL,'Certificaten Florimark',1,0,NULL,NULL,'K20',NULL),(4595,NULL,'Certificaten Milieukeur',1,0,NULL,NULL,'K21',NULL),(4596,NULL,'Certificaten Kenya Flower',1,0,NULL,NULL,'K22',NULL),(4597,NULL,'Certificaten Fairtrade',1,0,NULL,NULL,'K23',NULL),(4598,NULL,'Keurmerk MPS-ProductProof',1,0,NULL,NULL,'K24',NULL),(4599,NULL,'Certificaten ISO',1,0,NULL,NULL,'K25',NULL),(4600,NULL,'Certificaten aardwarmte',1,0,NULL,NULL,'K26',NULL),(4601,NULL,'Certificaten Florverde',1,0,NULL,NULL,'K27',NULL),(4602,NULL,'Certificaten Ethical Trad',1,0,NULL,NULL,'K28',NULL),(4603,NULL,'Certificaten Ethiopian EH',1,0,NULL,NULL,'K29',NULL),(4604,NULL,'Certificaten gewasbescher',1,0,NULL,NULL,'K30',NULL),(4605,NULL,'Certificaten SAN',1,0,NULL,NULL,'K31',NULL),(4606,NULL,'Certificaten GRASP',1,0,NULL,NULL,'K32',NULL),(4607,NULL,'Label Fair Flora',1,0,NULL,NULL,'K33',NULL),(4608,NULL,'GLobalG.A.P. Chain of Cus',1,0,NULL,NULL,'K34',NULL),(4609,NULL,'Certificaten Vegaplan',1,0,NULL,NULL,'K35',NULL),(4610,NULL,'Floriculture Sustainabili',1,0,NULL,NULL,'K99',NULL),(4611,NULL,'Fust',1,0,NULL,NULL,'L01',NULL),(4612,NULL,'Stapelwagen',1,0,NULL,NULL,'L02',NULL),(4613,NULL,'Aantal legborden veilings',1,0,NULL,NULL,'L03',NULL),(4614,NULL,'Aantal legborden Deense s',1,0,NULL,NULL,'L04',NULL),(4615,NULL,'Aantal onderstellen Deens',1,0,NULL,NULL,'L05',NULL),(4616,NULL,'Fustsoort',1,0,NULL,NULL,'L06',NULL),(4617,NULL,'Fustmateriaal',1,0,NULL,NULL,'L07',NULL),(4618,NULL,'Aantal legborden Eurostap',1,0,NULL,NULL,'L08',NULL),(4619,NULL,'Aantal onderstellen Euros',1,0,NULL,NULL,'L09',NULL),(4620,NULL,'Aantal stelen per bos',1,0,NULL,NULL,'L11',NULL),(4621,NULL,'Aantal bossen per bundel',1,0,NULL,NULL,'L12',NULL),(4622,NULL,'Aantal stuks per fust',1,0,NULL,NULL,'L13',NULL),(4623,NULL,'Aantal bossen per fust',1,0,NULL,NULL,'L14',NULL),(4624,NULL,'Aantal bundels per fust',1,0,NULL,NULL,'L15',NULL),(4625,NULL,'Aantal bossen per hoes',1,0,NULL,NULL,'L16',NULL),(4626,NULL,'Aantal bundels per hoes',1,0,NULL,NULL,'L17',NULL),(4627,NULL,'Fustlabel',1,0,NULL,NULL,'L18',NULL),(4628,NULL,'Karlabel',1,0,NULL,NULL,'L19',NULL),(4629,NULL,'Service productlabel',1,0,NULL,NULL,'L20',NULL),(4630,NULL,'Service fustlabel',1,0,NULL,NULL,'L21',NULL),(4631,NULL,'Service karlabel',1,0,NULL,NULL,'L22',NULL),(4632,NULL,'Aantal fusten per laag',1,0,NULL,NULL,'L23',NULL),(4633,NULL,'Presentatie per schapm2',1,0,NULL,NULL,'L24',NULL),(4634,NULL,'Positieve keurcode fytosa',1,0,NULL,NULL,'P01',NULL),(4635,NULL,'Positieve keurcode kwalit',1,0,NULL,NULL,'P02',NULL),(4636,NULL,'Positieve keurcode veilin',1,0,NULL,NULL,'P03',NULL),(4637,NULL,'Maceta',1,0,NULL,NULL,'S01',NULL),(4638,NULL,'Altura mínima',1,1,NULL,'cm','S02','size'),(4639,NULL,'nº plantas',1,0,NULL,NULL,'S03',NULL),(4640,NULL,'Minimum plantdiameter',1,0,NULL,NULL,'S04',NULL),(4641,NULL,'Madurez',1,0,NULL,NULL,'S05',NULL),(4642,NULL,'Combinatiehoogte',1,0,NULL,NULL,'S06',NULL),(4643,NULL,'Min aantal koppen hoogste',1,0,NULL,NULL,'S07',NULL),(4644,NULL,'Dikte',1,0,NULL,NULL,'S08',NULL),(4645,NULL,'Min aantal bloemen/bloeiw',1,0,NULL,NULL,'S09',NULL),(4646,NULL,'Min aantal bloemtrossen p',1,0,NULL,NULL,'S10',NULL),(4647,NULL,'Minimum aantal takken per',1,0,NULL,NULL,'S11',NULL),(4648,NULL,'Minimum aantal bollen per',1,0,NULL,NULL,'S12',NULL),(4649,NULL,'Minimum aantal bladeren p',1,0,NULL,NULL,'S13',NULL),(4650,NULL,'Altura tronco',1,1,NULL,'cm','S14','size'),(4651,NULL,'Altura transporte',1,0,NULL,'cm','S15','size'),(4652,NULL,'Lengte scheuten',1,0,NULL,NULL,'S16',NULL),(4653,NULL,'Min aant vertakkingen pr ',1,0,NULL,NULL,'S17',NULL),(4654,NULL,'Minimum bloemknophoogte',1,0,NULL,NULL,'S19',NULL),(4655,NULL,'Altura',1,1,NULL,'cm','S20','size'),(4656,NULL,'Gewicht (gemiddeld)',1,0,NULL,NULL,'S21',NULL),(4657,NULL,'Aantal bloemknoppen snijb',1,0,NULL,NULL,'S22',NULL),(4658,NULL,'Minimum bloemdiameter',1,0,NULL,NULL,'S23',NULL),(4659,NULL,'Minimum bloemschedelengte',1,0,NULL,NULL,'S24',NULL),(4660,NULL,'Aantal bloemkoppen per tr',1,0,NULL,NULL,'S25',NULL),(4661,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S26',NULL),(4662,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S27',NULL),(4663,NULL,'Aant.kleuren/cultiv/vorme',1,0,NULL,NULL,'S28',NULL),(4664,NULL,'Minimum bloeiwijzelengte',1,0,NULL,NULL,'S29',NULL),(4665,NULL,'Verpakkingswijze snijbloe',1,0,NULL,NULL,'S30',NULL),(4666,NULL,'Minimum aant bloemen per ',1,0,NULL,NULL,'S31',NULL),(4667,NULL,'Medida',1,0,NULL,'cm','S32','size'),(4668,NULL,'Jaartal sortering hout',1,0,NULL,NULL,'S33',NULL),(4669,NULL,'Minimum bladdiameter',1,0,NULL,NULL,'S34',NULL),(4670,NULL,'Minimum bundelgewicht',1,0,NULL,NULL,'S35',NULL),(4671,NULL,'Altura máxima',1,0,NULL,NULL,'S36',NULL),(4672,NULL,'Maximum plantdiameter',1,0,NULL,NULL,'S37',NULL),(4673,NULL,'Max aantal bloemen/bloeiw',1,0,NULL,NULL,'S38',NULL),(4674,NULL,'Maximum aantal takken per',1,0,NULL,NULL,'S39',NULL),(4675,NULL,'Maximum aantal bollen per',1,0,NULL,NULL,'S40',NULL),(4676,NULL,'Altura máxima',1,0,NULL,NULL,'S41',NULL),(4677,NULL,'Maximum steellengte',1,0,NULL,NULL,'S42',NULL),(4678,NULL,'Maximum aantal knoppen sn',1,0,NULL,NULL,'S43',NULL),(4679,NULL,'Maximum bloemdiameter',1,0,NULL,NULL,'S44',NULL),(4680,NULL,'Maximum bloeiwijzelengte',1,0,NULL,NULL,'S45',NULL),(4681,NULL,'Aantal vruchten / trossen',1,0,NULL,NULL,'S46',NULL),(4682,NULL,'Verpakkingswijze',1,0,NULL,NULL,'S47',NULL),(4683,NULL,'Minimum vruchtdiameter',1,0,NULL,NULL,'S48',NULL),(4684,NULL,'Medida',1,1,NULL,'cm','S49','size'),(4685,NULL,'Bloem/bes/vruchtkleur 1',1,0,NULL,NULL,'S50',NULL),(4686,NULL,'Potvorm',1,0,NULL,NULL,'S51',NULL),(4687,NULL,'Potkleur',1,0,NULL,NULL,'S52',NULL),(4688,NULL,'Potmateriaal',1,0,NULL,NULL,'S53',NULL),(4689,NULL,'Plantvorm',1,0,NULL,NULL,'S54',NULL),(4690,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,'S55',NULL),(4691,NULL,'Teeltwijze',1,0,NULL,NULL,'S56',NULL),(4692,NULL,'Teeltmedium',1,0,NULL,NULL,'S57',NULL),(4693,NULL,'Hoesmateriaal',1,0,NULL,NULL,'S58',NULL),(4694,NULL,'Hoesvorm',1,0,NULL,NULL,'S59',NULL),(4695,NULL,'Hoesbedrukking algemeen',1,0,NULL,NULL,'S60',NULL),(4696,NULL,'Extra toevoegingen',1,0,NULL,NULL,'S61',NULL),(4697,NULL,'Land van herkomst (bedrij',1,0,NULL,NULL,'S62',NULL),(4698,NULL,'Verpakte orchidee',1,0,NULL,NULL,'S63',NULL),(4699,NULL,'Hoesbedrukking extra',1,0,NULL,NULL,'S64',NULL),(4700,NULL,'Voorbehandeling',1,0,NULL,NULL,'S65',NULL),(4701,NULL,'Overige niet in pot',1,0,NULL,NULL,'S66',NULL),(4702,NULL,'Vorm snijbloemen',1,0,NULL,NULL,'S67',NULL),(4703,NULL,'Buigzaamheid bloemsteel',1,0,NULL,NULL,'S68',NULL),(4704,NULL,'Hoeskleur',1,0,NULL,NULL,'S69',NULL),(4705,NULL,'Extra deco materiaal',1,0,NULL,NULL,'S70',NULL),(4706,NULL,'Productkleur',1,0,NULL,NULL,'S71',NULL),(4707,NULL,'Productmateriaal',1,0,NULL,NULL,'S72',NULL),(4708,NULL,'Altura',1,1,NULL,'cm','S73','size'),(4709,NULL,'Materiaaldiameter',1,0,NULL,NULL,'S74',NULL),(4710,NULL,'Barcode',1,0,NULL,NULL,'S75',NULL),(4711,NULL,'Productlabel',1,0,NULL,NULL,'S76',NULL),(4712,NULL,'Eetbaar/ niet eetbaar',1,0,NULL,NULL,'S77',NULL),(4713,NULL,'Plantmaat zonder pot',1,0,NULL,NULL,'S78',NULL),(4714,NULL,'Aantal kleuren/cultiv per',1,0,NULL,NULL,'S79',NULL),(4715,NULL,'Maximum percentage oud ho',1,0,NULL,NULL,'S80',NULL),(4716,NULL,'Maximum lengte verschil',1,0,NULL,NULL,'S81',NULL),(4717,NULL,'Bladkleur',1,0,NULL,NULL,'S82',NULL),(4718,NULL,'Plantgewicht',1,0,NULL,NULL,'S83',NULL),(4719,NULL,'Gemiddelde bloemdiameter',1,0,NULL,NULL,'S84',NULL),(4720,NULL,'Bloem/bes/vruchtkleur 2',1,0,NULL,NULL,'S85',NULL),(4721,NULL,'Winterhardheid (USDA zone',1,0,NULL,NULL,'S86',NULL),(4722,NULL,'Kleurbehandeld',1,0,NULL,NULL,'S87',NULL),(4723,NULL,'Bloem-/bladkleurverdeling',1,0,NULL,NULL,'S88',NULL),(4724,NULL,'Minimum bloemknopdiameter',1,0,NULL,NULL,'S89',NULL),(4725,NULL,'Volume inhoud',1,0,NULL,NULL,'S90',NULL),(4726,NULL,'Vruchtbenaming',1,0,NULL,NULL,'S91',NULL),(4727,NULL,'Vaaslevenindex',1,0,NULL,NULL,'S92',NULL),(4728,NULL,'Overige informatie plante',1,0,NULL,NULL,'S93',NULL),(4729,NULL,'Overige informatie snijbl',1,0,NULL,NULL,'S94',NULL),(4730,NULL,'Toepassingsmogelijkheid',1,0,NULL,NULL,'S95',NULL),(4731,NULL,'Productbeeld aanvoerder',1,0,NULL,NULL,'S96',NULL),(4732,NULL,'MPS certificering',1,0,NULL,NULL,'S97',NULL),(4733,NULL,'Kwaliteitsgroep',1,0,NULL,NULL,'S98',NULL),(4734,NULL,'Artikelomschrijving',1,0,NULL,NULL,'S99',NULL),(4735,NULL,'BTW-tarief',1,0,NULL,NULL,'T01',NULL),(4736,NULL,'Prijseenheid',1,0,NULL,NULL,'T02',NULL),(4737,NULL,'Transactievorm',1,0,NULL,NULL,'T03',NULL),(4738,NULL,'Handelsverpakking voorwaa',1,0,NULL,NULL,'T10',NULL),(4739,NULL,'Consumentenverpakking voo',1,0,NULL,NULL,'T11',NULL),(4740,NULL,'Leveringsvoorwaarden',1,0,NULL,NULL,'T12',NULL),(4741,NULL,'PT heffing voorwaarden',1,0,NULL,NULL,'T13',NULL),(4742,NULL,'Serviceheffing voorwaarde',1,0,NULL,NULL,'T14',NULL),(4743,NULL,'Algemene voorwaarden',1,0,NULL,NULL,'T15',NULL),(4744,NULL,'Marktvorm',1,0,NULL,NULL,'T16',NULL),(4745,NULL,'Themadagen',1,0,NULL,NULL,'T17',NULL),(4746,NULL,'Handelscategorie',1,0,NULL,NULL,'T18',NULL),(4747,NULL,'Producentengroepen',1,0,NULL,NULL,'T19',NULL),(4748,NULL,'Favorieten Id',1,0,NULL,NULL,'T20',NULL),(4749,NULL,'Verkoopeenheid',1,0,NULL,NULL,'T21',NULL),(4750,NULL,'Veilgroep voorkeur',1,0,NULL,NULL,'V01',NULL),(4751,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V02',NULL),(4752,NULL,'Keurmeesternummer FloraHo',1,0,NULL,NULL,'V03',NULL),(4753,NULL,'Rijnummer Rijnsburg',1,0,NULL,NULL,'V04',NULL),(4754,NULL,'Verwerkingslocatie FloraH',1,0,NULL,NULL,'V05',NULL),(4755,NULL,'FloraHolland Financial',1,0,NULL,NULL,'V06',NULL),(4756,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V07',NULL),(4757,NULL,'Benefiet veiling',1,0,NULL,NULL,'V08',NULL),(4758,NULL,'Kloksoort',1,0,NULL,NULL,'V09',NULL),(4759,NULL,'Minimumprijs aanvoerder',1,0,NULL,NULL,'V10',NULL),(4760,NULL,'Rest aantallen',1,0,NULL,NULL,'V11',NULL),(4761,NULL,'Veilsoort',1,0,NULL,NULL,'V12',NULL),(4762,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V13',NULL),(4763,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V14',NULL),(4764,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V15',NULL),(4765,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V16',NULL),(4766,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V17',NULL),(4767,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V18',NULL),(4768,NULL,'Gereserveerd FloraHolland',1,0,NULL,NULL,'V19',NULL),(4769,NULL,'Gereserveerd',1,0,NULL,NULL,'V20',NULL),(4770,NULL,'Veilgroep Aalsmeer',1,0,NULL,NULL,'V21',NULL),(4771,NULL,'Promotie kenmerk FloraHol',1,0,NULL,NULL,'V22',NULL),(4772,NULL,'Verrekening snijbloemenvo',1,0,NULL,NULL,'V23',NULL),(4773,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V24',NULL),(4774,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V25',NULL),(4775,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V26',NULL),(4776,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V27',NULL),(4777,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V28',NULL),(4778,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V29',NULL),(4779,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V30',NULL),(4780,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V31',NULL),(4781,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V32',NULL),(4782,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V33',NULL),(4783,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V34',NULL),(4784,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V35',NULL),(4785,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V36',NULL),(4786,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V37',NULL),(4787,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V38',NULL),(4788,NULL,'Gereserveerd Aalsmeer',1,0,NULL,NULL,'V39',NULL),(4789,NULL,'Gereserveerd',1,0,NULL,NULL,'V40',NULL),(4790,NULL,'Tussenopslag klok Plantio',1,0,NULL,NULL,'V41',NULL),(4791,NULL,'Soort ladingsdrager Plant',1,0,NULL,NULL,'V42',NULL),(4792,NULL,'Logistiek middel Plantion',1,0,NULL,NULL,'V43',NULL),(4793,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V44',NULL),(4794,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V45',NULL),(4795,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V46',NULL),(4796,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V47',NULL),(4797,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V48',NULL),(4798,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V49',NULL),(4799,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V50',NULL),(4800,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V51',NULL),(4801,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V52',NULL),(4802,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V53',NULL),(4803,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V54',NULL),(4804,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V55',NULL),(4805,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V56',NULL),(4806,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V57',NULL),(4807,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V58',NULL),(4808,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V59',NULL),(4809,NULL,'Gereserveerd',1,0,NULL,NULL,'V60',NULL),(4810,NULL,'Veilgroep Plantion Ede',1,0,NULL,NULL,'V61',NULL),(4811,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V62',NULL),(4812,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V63',NULL),(4813,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V64',NULL),(4814,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V65',NULL),(4815,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V66',NULL),(4816,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V67',NULL),(4817,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V68',NULL),(4818,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V69',NULL),(4819,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V70',NULL),(4820,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V71',NULL),(4821,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V72',NULL),(4822,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V73',NULL),(4823,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V74',NULL),(4824,NULL,'Gereserveerd Plantion Ede',1,0,NULL,NULL,'V75',NULL),(4825,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V76',NULL),(4826,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V77',NULL),(4827,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V78',NULL),(4828,NULL,'Gereserveerd Holambra',1,0,NULL,NULL,'V79',NULL),(4829,NULL,'Toegevoegde waardes VRM',1,0,NULL,NULL,'V80',NULL),(4830,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V81',NULL),(4831,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V82',NULL),(4832,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V83',NULL),(4833,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V84',NULL),(4834,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V85',NULL),(4835,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V86',NULL),(4836,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V87',NULL),(4837,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V88',NULL),(4838,NULL,'Gereserveerd VRM',1,0,NULL,NULL,'V89',NULL),(4839,NULL,'Veiling',1,0,NULL,NULL,'V99',NULL),(4840,NULL,'kopersaantallen',1,0,NULL,NULL,'Z01',NULL); /*!40000 ALTER TABLE `tag` ENABLE KEYS */; UNLOCK TABLES; @@ -347,7 +347,7 @@ UNLOCK TABLES; LOCK TABLES `department` WRITE; /*!40000 ALTER TABLE `department` DISABLE KEYS */; -INSERT INTO `department` VALUES (1,'VERDNATURA',1,2,763,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(22,'COMPRAS',3,4,NULL,72,596,2,5,0,0,0,0,NULL,'/',NULL,1,NULL),(23,'CAMARA',14,19,NULL,72,604,2,6,1,0,1,2,37,'/37/',NULL,0,NULL),(31,'INFORMATICA',5,6,NULL,72,127,3,9,0,0,0,0,NULL,'/',NULL,1,NULL),(34,'CONTABILIDAD',7,8,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(35,'FINANZAS',9,10,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(36,'LABORAL',11,12,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(37,'PRODUCCION',13,52,NULL,72,230,3,11,1,0,0,17,NULL,'/',NULL,0,NULL),(38,'SACADO',20,21,NULL,72,230,4,14,1,0,1,0,37,'/37/',NULL,0,NULL),(39,'ENCAJADO',22,23,NULL,72,230,4,12,1,0,1,0,37,'/37/',NULL,0,NULL),(41,'ADMINISTRACION',53,54,NULL,72,599,3,8,0,0,0,0,NULL,'/',NULL,1,NULL),(43,'VENTAS',55,76,NULL,0,NULL,NULL,NULL,0,0,0,10,NULL,'/',NULL,1,'direccioncomercial@verdnatura.es'),(44,'GERENCIA',77,78,NULL,72,300,2,7,0,0,0,0,NULL,'/',NULL,0,NULL),(45,'LOGISTICA',79,80,NULL,72,596,3,19,0,0,0,0,NULL,'/',NULL,1,NULL),(46,'REPARTO',81,84,NULL,72,659,3,10,0,0,0,1,NULL,'/',NULL,0,NULL),(48,'ALMACENAJE',85,86,NULL,0,NULL,NULL,NULL,1,0,0,0,NULL,'/',NULL,0,NULL),(49,'PROPIEDAD',87,88,NULL,72,1008,1,1,0,0,0,0,NULL,'/',NULL,0,NULL),(52,'CARGA AEREA',89,90,NULL,72,163,4,28,0,0,0,0,NULL,'/',NULL,0,NULL),(53,'MARKETING Y COMUNICACIÓN',91,92,NULL,72,1238,0,0,0,0,0,0,NULL,'/',NULL,1,NULL),(54,'ORNAMENTALES',93,94,NULL,72,433,3,21,0,0,0,0,NULL,'/',NULL,0,NULL),(55,'TALLER NATURAL',95,96,NULL,72,695,2,23,0,0,0,0,NULL,'/',NULL,0,NULL),(56,'TALLER ARTIFICIAL',97,98,NULL,72,1780,2,24,0,0,0,0,NULL,'/',NULL,0,NULL),(58,'CAMPOS',99,100,NULL,72,225,2,2,0,0,0,0,NULL,'/',NULL,0,NULL),(59,'MANTENIMIENTO',101,102,NULL,72,1907,4,16,0,0,0,0,NULL,'/',NULL,0,NULL),(60,'RECLAMACIONES',103,104,NULL,72,563,3,20,0,0,0,0,NULL,'/',NULL,1,NULL),(61,'VNH',105,106,NULL,73,1297,3,17,0,0,0,0,NULL,'/',NULL,0,NULL),(63,'VENTAS FRANCIA',56,57,NULL,72,277,2,27,0,0,1,0,43,'/43/',NULL,0,NULL),(66,'VERDNAMADRID',107,108,NULL,72,163,3,18,0,0,0,0,NULL,'/',NULL,0,NULL),(68,'COMPLEMENTOS',24,25,NULL,72,617,3,26,1,0,1,0,37,'/37/',NULL,0,NULL),(69,'VERDNABARNA',109,110,NULL,74,432,3,22,0,0,0,0,NULL,'/',NULL,0,NULL),(77,'PALETIZADO',82,83,NULL,72,230,4,15,1,0,1,0,46,'/46/',NULL,0,NULL),(80,'EQUIPO J VALLES',58,59,NULL,72,693,3,4,0,0,1,0,43,'/43/','jvp_equipo',1,NULL),(86,'LIMPIEZA',111,112,NULL,72,599,0,0,0,0,0,0,NULL,'/',NULL,0,NULL),(89,'COORDINACION',113,114,NULL,0,NULL,NULL,NULL,1,0,0,0,NULL,'/',NULL,0,NULL),(90,'TRAILER',115,116,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(91,'ARTIFICIAL',26,27,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(92,'EQUIPO SILVERIO',60,61,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','sdc_equipo',1,NULL),(93,'CONFECCION',117,118,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(94,'EQUIPO J BROCAL',62,63,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','jes_equipo',1,NULL),(95,'EQUIPO C ZAMBRANO',64,65,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','czg_equipo',1,NULL),(96,'EQUIPO C LOPEZ',66,67,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','cla_equipo',1,NULL),(98,'EQUIPO RODRIGO',68,69,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','rhr_equipo',1,NULL),(101,'EQUIPO J IBAÑEZ',70,71,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','jmi_equipo',1,NULL),(102,'EQ ROJO FV RUBEN C',28,29,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(103,'EQ AZUL FV A FOLQUES',30,31,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(104,'EQ AMARILLO FV NORMAN G',32,33,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(105,'EQ MORADO FV MATOU',34,35,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(106,'EQ VERDE PCA KEVIN GIMENEZ',36,37,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(107,'EQ NARANJA PCA RUBEN ZANON',38,39,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(110,'EQ ROSA PCA J BONDIA',40,41,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(111,'EQ REPONEDOR CAJAS',42,43,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(112,'CAMARA EQ EDGAR LLEO',15,16,NULL,0,NULL,NULL,NULL,1,0,2,0,23,'/37/23/',NULL,0,NULL),(113,'CAMARA EQ MARC ROCA',17,18,NULL,0,NULL,NULL,NULL,1,0,2,0,23,'/37/23/',NULL,0,NULL),(114,'EQ MARRON PCA JL NUEVO',44,45,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(115,'EQUIPO CLAUDI',72,73,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','csr_equipo',1,NULL),(120,'PCA PRODUCCION',46,47,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(121,'FV PRODUCCION',48,49,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(122,'PCA ALMACEN',50,51,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(123,'EQUIPO ELENA BASCUÑANA',74,75,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','ebt_equipo',0,NULL),(124,'CONTROL INTERNO',119,120,NULL,72,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL); +INSERT INTO `department` VALUES (1,'VERDNATURA',1,2,763,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(22,'COMPRAS',3,4,NULL,72,596,2,5,0,0,0,0,NULL,'/',NULL,1,NULL),(23,'CAMARA',14,19,NULL,72,604,2,6,1,0,1,2,37,'/37/',NULL,0,NULL),(31,'INFORMATICA',5,6,NULL,72,127,3,9,0,0,0,0,NULL,'/',NULL,1,NULL),(34,'CONTABILIDAD',7,8,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(35,'FINANZAS',9,10,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(36,'LABORAL',11,12,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL),(37,'PRODUCCION',13,52,NULL,72,230,3,11,1,0,0,17,NULL,'/',NULL,0,NULL),(38,'SACADO',20,21,NULL,72,230,4,14,1,0,1,0,37,'/37/',NULL,0,NULL),(39,'ENCAJADO',22,23,NULL,72,230,4,12,1,0,1,0,37,'/37/',NULL,0,NULL),(41,'ADMINISTRACION',53,54,NULL,72,599,3,8,0,0,0,0,NULL,'/',NULL,1,NULL),(43,'VENTAS',55,76,NULL,0,NULL,NULL,NULL,0,0,0,10,NULL,'/',NULL,1,'direccioncomercial@verdnatura.es'),(44,'GERENCIA',77,78,NULL,72,300,2,7,0,0,0,0,NULL,'/',NULL,0,NULL),(45,'LOGISTICA',79,80,NULL,72,596,3,19,0,0,0,0,NULL,'/',NULL,1,NULL),(46,'REPARTO',81,84,NULL,72,659,3,10,0,0,0,1,NULL,'/',NULL,0,NULL),(48,'ALMACENAJE',85,86,NULL,0,NULL,NULL,NULL,1,0,0,0,NULL,'/',NULL,0,NULL),(49,'PROPIEDAD',87,88,NULL,72,1008,1,1,0,0,0,0,NULL,'/',NULL,0,NULL),(52,'CARGA AEREA',89,90,NULL,72,163,4,28,0,0,0,0,NULL,'/',NULL,0,NULL),(53,'MARKETING Y COMUNICACIÓN',91,92,NULL,72,1238,0,0,0,0,0,0,NULL,'/',NULL,1,NULL),(54,'ORNAMENTALES',93,94,NULL,72,433,3,21,0,0,0,0,NULL,'/',NULL,0,NULL),(55,'TALLER NATURAL',95,96,NULL,72,695,2,23,0,0,0,0,NULL,'/',NULL,0,NULL),(56,'TALLER ARTIFICIAL',97,98,NULL,72,1780,2,24,0,0,0,0,NULL,'/',NULL,0,NULL),(58,'CAMPOS',99,100,NULL,72,225,2,2,0,0,0,0,NULL,'/',NULL,0,NULL),(59,'MANTENIMIENTO',101,102,NULL,72,1907,4,16,0,0,0,0,NULL,'/',NULL,0,NULL),(60,'RECLAMACIONES',103,104,NULL,72,563,3,20,0,0,0,0,NULL,'/',NULL,1,NULL),(61,'VNH',105,106,NULL,73,1297,3,17,0,0,0,0,NULL,'/',NULL,0,NULL),(63,'VENTAS FRANCIA',56,57,NULL,72,277,2,27,0,0,1,0,43,'/43/',NULL,0,NULL),(66,'VERDNAMADRID',107,108,NULL,72,163,3,18,0,0,0,0,NULL,'/',NULL,0,NULL),(68,'COMPLEMENTOS',24,25,NULL,72,617,3,26,1,0,1,0,37,'/37/',NULL,0,NULL),(69,'VERDNABARNA',109,110,NULL,74,432,3,22,0,0,0,0,NULL,'/',NULL,0,NULL),(77,'PALETIZADO',82,83,NULL,72,230,4,15,1,0,1,0,46,'/46/',NULL,0,NULL),(80,'EQUIPO J VALLES',58,59,NULL,72,693,3,4,0,0,1,0,43,'/43/','jvp_equipo',1,NULL),(86,'LIMPIEZA',111,112,NULL,72,599,0,0,0,0,0,0,NULL,'/',NULL,0,NULL),(89,'COORDINACION',113,114,NULL,0,NULL,NULL,NULL,1,0,0,0,NULL,'/',NULL,0,NULL),(90,'TRAILER',115,116,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(91,'ARTIFICIAL',26,27,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(92,'EQUIPO SILVERIO',60,61,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','sdc_equipo',1,NULL),(93,'CONFECCION',117,118,NULL,0,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,0,NULL),(94,'EQUIPO J BROCAL',62,63,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','jes_equipo',1,NULL),(95,'EQUIPO C ZAMBRANO',64,65,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','czg_equipo',1,NULL),(96,'EQUIPO C LOPEZ',66,67,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','cla_equipo',1,NULL),(98,'EQUIPO RODRIGO',68,69,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','rhr_equipo',1,NULL),(101,'EQUIPO J IBAÑEZ',70,71,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','jmi_equipo',1,NULL),(102,'EQ ROJO FV RUBEN C',28,29,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(103,'EQ AZUL FV A FOLQUES',30,31,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(104,'EQ AMARILLO FV NORMAN G',32,33,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(105,'EQ MORADO FV MATOU',34,35,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(106,'EQ VERDE PCA KEVIN GIMENEZ',36,37,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(107,'EQ NARANJA PCA RUBEN ZANON',38,39,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(110,'EQ ROSA PCA J BONDIA',40,41,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(111,'EQ REPONEDOR CAJAS',42,43,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(112,'CAMARA EQ EDGAR LLEO',15,16,NULL,0,NULL,NULL,NULL,1,0,2,0,23,'/37/23/',NULL,0,NULL),(113,'CAMARA EQ MARC ROCA',17,18,NULL,0,NULL,NULL,NULL,1,0,2,0,23,'/37/23/',NULL,0,NULL),(114,'EQ MARRON PCA JL NUEVO',44,45,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(115,'EQUIPO CLAUDI',72,73,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','csr_equipo',1,NULL),(120,'PCA PRODUCCION',46,47,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(121,'FV PRODUCCION',48,49,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(122,'PCA ALMACEN',50,51,NULL,0,NULL,NULL,NULL,1,0,1,0,37,'/37/',NULL,0,NULL),(123,'EQUIPO ELENA BASCUÑANA',74,75,NULL,0,NULL,NULL,NULL,0,0,1,0,43,'/43/','ebt_equipo',1,NULL),(124,'CONTROL INTERNO',119,120,NULL,72,NULL,NULL,NULL,0,0,0,0,NULL,'/',NULL,1,NULL); /*!40000 ALTER TABLE `department` ENABLE KEYS */; UNLOCK TABLES; @@ -357,7 +357,7 @@ UNLOCK TABLES; LOCK TABLES `component` WRITE; /*!40000 ALTER TABLE `component` DISABLE KEYS */; -INSERT INTO `component` VALUES (10,'Precios Especiales',4,NULL,NULL,1,'specialPrices'),(14,'porte extra por dia semana',6,NULL,NULL,1,'extraCostPerWeekDay'),(15,'reparto',6,NULL,NULL,1,'delivery'),(17,'recobro',5,NULL,NULL,1,'debtCollection'),(21,'ajuste',11,NULL,NULL,1,'adjustment'),(22,'venta por paquete',9,1,NULL,0,'salePerPackage'),(23,'venta por caja',9,2,NULL,0,'salePerBox'),(28,'valor de compra',1,NULL,NULL,1,'purchaseValue'),(29,'margen',4,NULL,NULL,1,'margin'),(32,'descuento ultimas unidades',9,3,-0.05,0,'lastUnitsDiscount'),(33,'venta por caja',9,1,NULL,0,'salePerBox'),(34,'descuento comprador',4,NULL,NULL,1,'buyerDiscount'),(35,'cartera comprador',10,NULL,NULL,1,NULL),(36,'descuadre',12,NULL,NULL,1,'imbalance'),(37,'maná',7,4,NULL,0,'mana'),(38,'embolsado',9,NULL,NULL,1,'bagged'),(39,'maná auto',7,NULL,NULL,1,'autoMana'),(40,'cambios Santos 2016',4,NULL,NULL,1,NULL),(41,'bonificacion porte',4,NULL,NULL,1,'freightCharge'); +INSERT INTO `component` VALUES (10,'Precios Especiales',4,NULL,NULL,1,'specialPrices'),(14,'porte extra por dia semana',6,NULL,NULL,1,'extraCostPerWeekDay'),(15,'reparto',6,NULL,NULL,1,'delivery'),(17,'recobro',5,NULL,NULL,1,'debtCollection'),(21,'ajuste',11,NULL,NULL,1,'adjustment'),(22,'venta por paquete',9,1,NULL,0,'salePerPackage'),(23,'venta por caja',9,2,NULL,0,'salePerBox'),(28,'valor de compra',1,NULL,NULL,1,'purchaseValue'),(29,'margen',4,NULL,NULL,1,'margin'),(32,'descuento ultimas unidades',9,3,-0.05,0,'lastUnitsDiscount'),(33,'venta por caja',9,1,NULL,0,'salePerBox'),(34,'descuento comprador',4,NULL,NULL,1,'buyerDiscount'),(35,'cartera comprador',10,NULL,NULL,1,NULL),(36,'descuadre',12,NULL,NULL,1,'imbalance'),(37,'maná',7,4,NULL,0,'mana'),(38,'embolsado',9,NULL,NULL,1,'bagged'),(39,'maná auto',7,NULL,NULL,1,'autoMana'),(40,'cambios Santos 2016',4,NULL,NULL,1,NULL),(41,'bonificacion porte',4,NULL,NULL,1,'freightCharge'),(42,'promocion Francia',4,NULL,NULL,1,'frenchOffer'); /*!40000 ALTER TABLE `component` ENABLE KEYS */; UNLOCK TABLES; @@ -380,7 +380,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:40 +-- Dump completed on 2020-11-25 12:04:00 USE `cache`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -418,7 +418,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:41 +-- Dump completed on 2020-11-25 12:04:01 USE `hedera`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -443,7 +443,7 @@ USE `hedera`; LOCK TABLES `imageCollection` WRITE; /*!40000 ALTER TABLE `imageCollection` DISABLE KEYS */; -INSERT INTO `imageCollection` VALUES (1,'catalog','Artículo',3840,2160,'Item','image','vn','item','image'),(4,'link','Enlace',200,200,'Link','image','hedera','link','image'),(5,'news','Noticias',800,1200,'New','image','hedera','news','image'),('6','user','Usuario','800','1200','Account','image','account','user','image'); +INSERT INTO `imageCollection` VALUES (1,'catalog','Artículo',3840,2160,'Item','image','vn','item','image'),(4,'link','Enlace',200,200,'Link','image','hedera','link','image'),(5,'news','Noticias',800,1200,'New','image','hedera','news','image'),(6,'user','Usuario',800,1200,'Account','image','account','user','image'); /*!40000 ALTER TABLE `imageCollection` ENABLE KEYS */; UNLOCK TABLES; @@ -466,6 +466,16 @@ LOCK TABLES `tpvResponse` WRITE; INSERT INTO `tpvResponse` VALUES (101,'Tarjeta Caducada'),(102,'Tarjeta en excepción transitoria o bajo sospecha de fraude'),(104,'Operación no permitida para esa tarjeta o terminal'),(106,'Intentos de PIN excedidos'),(116,'Disponible Insuficiente'),(118,'Tarjeta no Registrada'),(125,'Tarjeta no efectiva'),(129,'Código de seguridad (CVV2/CVC2) incorrecto'),(180,'Tarjeta ajena al servicio'),(184,'Error en la autenticación del titular'),(190,'Denegación sin especificar motivo'),(191,'Fecha de caducidad errónea'),(202,'Tarjeta en excepción transitoria o bajo sospecha de fraude con retirada de tarjeta'),(904,'Comercio no registrado en FUC'),(909,'Error de sistema'),(912,'Emisor no Disponible'),(913,'Pedido repetido'),(944,'Sesión Incorrecta'),(950,'Operación de devolución no permitida'),(9064,'Número de posiciones de la tarjeta incorrecto'),(9078,'No existe método de pago válido para esa tarjeta'),(9093,'Tarjeta no existente'),(9094,'Rechazo servidores internacionales'),(9104,'A petición del usuario se ha cancelado el pago'),(9218,'El comercio no permite op. seguras por entrada /operaciones'),(9253,'Tarjeta no cumple el check-digit'),(9256,'El comercio no puede realizar preautorizaciones'),(9257,'Esta tarjeta no permite operativa de preautorizaciones'),(9261,'Operación detenida por superar el control de restricciones en la entrada al SIS'),(9912,'Emisor no Disponible'),(9913,'Error en la confirmación que el comercio envía al TPV Virtual (solo aplicable en la opción de sincronización SOAP)'),(9914,'Confirmación “KO” del comercio (solo aplicable en la opción de sincronización SOAP)'),(9915,'A petición del usuario se ha cancelado el pago'),(9928,'Anulación de autorización en diferido realizada por el SIS (proceso batch)'),(9929,'Anulación de autorización en diferido realizada por el comercio'),(9998,'Operación en proceso de solicitud de datos de tarjeta'),(9999,'Operación que ha sido redirigida al emisora autenticar'); /*!40000 ALTER TABLE `tpvResponse` ENABLE KEYS */; UNLOCK TABLES; + +-- +-- Dumping data for table `imageCollectionSize` +-- + +LOCK TABLES `imageCollectionSize` WRITE; +/*!40000 ALTER TABLE `imageCollectionSize` DISABLE KEYS */; +INSERT INTO `imageCollectionSize` VALUES (2,1,50,50,1),(3,1,200,200,1),(5,5,200,200,1),(6,1,70,70,1),(8,5,50,50,1),(9,1,1600,900,0),(13,6,160,160,1),(14,6,520,520,1),(15,6,1600,1600,1); +/*!40000 ALTER TABLE `imageCollectionSize` ENABLE KEYS */; +UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; @@ -476,7 +486,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:42 +-- Dump completed on 2020-11-25 12:04:02 USE `postgresql`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -551,7 +561,7 @@ UNLOCK TABLES; LOCK TABLES `workcenter` WRITE; /*!40000 ALTER TABLE `workcenter` DISABLE KEYS */; -INSERT INTO `workcenter` VALUES (1,'Silla',20,1081,1,'Av espioca 100',552703),(2,'Mercaflor',19,NULL,NULL,NULL,NULL),(3,'Marjales',26,20008,NULL,NULL,NULL),(4,'VNH',NULL,NULL,3,NULL,NULL),(5,'Madrid',28,2853,5,'Av constitución 3',554145),(6,'Vilassar',88,88031,2,'Cami del Crist, 33',556412),(7,'Tenerife',NULL,NULL,10,NULL,NULL); +INSERT INTO `workcenter` VALUES (1,'Silla',20,1082,1,'Av espioca 100',552703),(2,'Mercaflor',19,NULL,NULL,NULL,NULL),(3,'Marjales',26,20008,NULL,NULL,NULL),(4,'VNH',NULL,NULL,3,NULL,NULL),(5,'Madrid',28,2856,5,'Av constitución 3',554145),(6,'Vilassar',88,88031,2,'Cami del Crist, 33',556412),(7,'Tenerife',NULL,NULL,10,NULL,NULL); /*!40000 ALTER TABLE `workcenter` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; @@ -564,7 +574,7 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:44 +-- Dump completed on 2020-11-25 12:04:04 USE `sage`; -- MySQL dump 10.13 Distrib 5.7.28, for osx10.15 (x86_64) -- @@ -614,24 +624,6 @@ INSERT INTO `TiposRetencion` VALUES (1,'RETENCION ESTIMACION OBJETIVA',1.0000000 UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; --- --- Dumping data for table `TiposRetencion` --- - -LOCK TABLES `TiposRetencion` WRITE; -/*!40000 ALTER TABLE `TiposRetencion` DISABLE KEYS */; -INSERT INTO `TiposRetencion` (`CodigoRetencion`, `Retencion`, `PorcentajeRetencion`, `CuentaCargo`, `CuentaAbono`, `ClaveIrpf`, `CuentaCargoANT_`, `CuentaAbonoANT_`, `IdTipoRetencion`) VALUES -(1, 'RETENCION ESTIMACION OBJETIVA', '1.0000000000', '4730000000', '4751000000', NULL, NULL, NULL, '03811652-0F3A-44A1-AE1C-B19624525D7F'), -(2, 'ACTIVIDADES AGRICOLAS O GANADERAS', '2.0000000000', '4730000000', '4751000000', NULL, NULL, NULL, 'F3F91EF3-FED6-444D-B03C-75B639D13FB4'), -(9, 'ACTIVIDADES PROFESIONALES 2 PRIMEROS AÑOS', '9.0000000000', '4730000000', '4751000000', NULL, NULL, NULL, '73F95642-E951-4C91-970A-60C503A4792B'), -(15, 'ACTIVIDADES PROFESIONALES', '15.0000000000', '4730000000', '4751000000', '6', NULL, NULL, 'F6BDE0EE-3B01-4023-8FFF-A73AE9AC50D7'), -(19, 'ARRENDAMIENTO Y SUBARRENDAMIENTO', '19.0000000000', '4730000000', '4751000000', '8', NULL, NULL, '09B033AE-16E5-4057-8D4A-A7710C8A4FB9'); -/*!40000 ALTER TABLE `TiposRetencion` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - - - /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; @@ -640,4 +632,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:45 +-- Dump completed on 2020-11-25 12:04:05 diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index ad8474e38..cffce3ae7 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -92,6 +92,13 @@ INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`, `userFk`,`bossF (109, 'HLK', 'Bruce' , 'Banner', 109, 19, 432978109), (110, 'JJJ', 'Jessica' , 'Jones' , 110, 19, 432978110); +INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) + VALUES + (1, 'EUR', 'Euro', 1), + (2, 'USD', 'Dollar USA', 1.4), + (3, 'GBP', 'Libra', 1), + (4, 'JPY', 'Yen Japones', 1); + INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`) VALUES (1, 'España', 1, 'ES', 1, 24), @@ -149,13 +156,6 @@ INSERT INTO `vn`.`accountingType`(`id`, `description`, `receiptDescription`) (4, 'Stolen Money', ''), (5, 'Miscellaneous', ''); -INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) - VALUES - (1, 'EUR', 'Euro', 1), - (2, 'USD', 'Dollar USA', 1.4), - (3, 'GBP', 'Libra', 1), - (4, 'JPY', 'Yen Japones', 1); - INSERT INTO `vn`.`bank`(`id`, `bank`, `account`, `cash`, `entityFk`, `isActive`, `currencyFk`) VALUES (1, 'Pay on receipt', '0000000000', 3, 0, 1, 1), diff --git a/db/dump/structure.sql b/db/dump/structure.sql index 2573e2b1b..c5303eec2 100644 --- a/db/dump/structure.sql +++ b/db/dump/structure.sql @@ -86,13 +86,13 @@ DROP TABLE IF EXISTS `accountConfig`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `accountConfig` ( `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, - `homedir` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The base folder for users home directories', + `homedir` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The base folder for users home directory', `shell` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The default shell', - `idBase` int(11) NOT NULL, + `idBase` int(11) NOT NULL COMMENT 'Base id for Posix users and groups', `min` smallint(6) NOT NULL, - `max` smallint(6) NOT NULL, - `warn` smallint(6) NOT NULL, - `inact` smallint(6) NOT NULL, + `max` smallint(6) NOT NULL COMMENT 'Maximum password age (seconds)', + `warn` smallint(6) NOT NULL COMMENT 'Warn to change password when elapsed (seconds)', + `inact` smallint(6) NOT NULL COMMENT 'Maximum inactivity time (seconds)', PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Global configuration parameters for accounts'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -151,12 +151,11 @@ DROP TABLE IF EXISTS `ldapConfig`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `ldapConfig` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `host` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The hostname of LDAP server', + `server` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The LDAP server access url', `rdn` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The LDAP user', - `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Base64 encoded password', - `baseDn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'The base DN to do the query', - `filter` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Filter to apply to the query', - `groupDn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The LDAP password', + `userDn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'The base DN for users', + `groupDn` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'The base DN for groups', PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='LDAP server configuration parameters'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -357,10 +356,12 @@ DROP TABLE IF EXISTS `roleRole`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `roleRole` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `role` int(10) unsigned NOT NULL, `inheritsFrom` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), UNIQUE KEY `role` (`role`,`inheritsFrom`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Calculated role inheritance'; +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Calculated role inheritance'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -372,10 +373,11 @@ DROP TABLE IF EXISTS `sambaConfig`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `sambaConfig` ( `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, - `host` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT 'The hosname of Samba server', - `sshUser` varchar(30) CHARACTER SET utf8 DEFAULT NULL COMMENT 'The SSH user to connect to servers', - `sshPass` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'The SSH password base64 encoded', - `uidBase` int(10) unsigned NOT NULL DEFAULT '10000' COMMENT 'The base for Unix uids', + `adDomain` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Active directory domain', + `adController` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The hosname of domain controller', + `adUser` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Active directory user', + `adPassword` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Active directory password', + `verifyCert` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT 'Whether to verify server certificate', PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Global configuration parameters for accounts'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -389,19 +391,22 @@ DROP TABLE IF EXISTS `user`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `realm` varchar(512) CHARACTER SET utf8 DEFAULT NULL, `name` varchar(30) CHARACTER SET utf8 NOT NULL, `nickname` varchar(127) COLLATE utf8_unicode_ci NOT NULL, - `bcryptPassword` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `bcryptPassword` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL, `role` int(10) unsigned NOT NULL DEFAULT '2', `active` tinyint(1) NOT NULL DEFAULT '1', `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL, + `emailVerified` tinyint(1) DEFAULT NULL, + `verificationToken` varchar(512) CHARACTER SET utf8 DEFAULT NULL, `lang` char(2) CHARACTER SET utf8 DEFAULT NULL, - `sync` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Deprecated', `recoverPass` tinyint(3) unsigned NOT NULL DEFAULT '1', `lastPassChange` datetime DEFAULT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `password` char(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Deprecated', + `sync` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Deprecated', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`), KEY `role` (`role`), @@ -556,11 +561,11 @@ DROP TABLE IF EXISTS `userPassword`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `userPassword` ( `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, - `length` tinyint(3) unsigned NOT NULL, - `nAlpha` tinyint(3) unsigned NOT NULL, - `nUpper` tinyint(3) unsigned NOT NULL, - `nDigits` tinyint(3) unsigned NOT NULL, - `nPunct` tinyint(3) unsigned NOT NULL, + `length` tinyint(3) unsigned NOT NULL COMMENT 'Minimal length', + `nAlpha` tinyint(3) unsigned NOT NULL COMMENT 'Minimum of alphabetic characters', + `nUpper` tinyint(3) unsigned NOT NULL COMMENT 'Minimum of uppercase letters', + `nDigits` tinyint(3) unsigned NOT NULL COMMENT 'Minimum of digits', + `nPunct` tinyint(3) unsigned NOT NULL COMMENT 'Minimum of symbols', PRIMARY KEY (`id`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Restrictions on user passwords'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -573,9 +578,9 @@ DROP TABLE IF EXISTS `userSync`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `userSync` ( - `name` varchar(30) NOT NULL, + `name` varchar(30) NOT NULL COMMENT 'The user name', PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Users pending to be synchronized'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -876,52 +881,52 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `passwordGenerate`() RETURNS text CHARSET utf8 COLLATE utf8_unicode_ci READS SQL DATA -BEGIN -/** - * Generates a random password that meets the minimum requirements. - * - * @return Generated password - */ - DECLARE vMinLength TINYINT; - DECLARE vMinAlpha TINYINT; - DECLARE vMinUpper TINYINT; - DECLARE vMinDigits TINYINT; - DECLARE vMinPunct TINYINT; - DECLARE vAlpha TINYINT DEFAULT 0; - DECLARE vUpper TINYINT DEFAULT 0; - DECLARE vDigits TINYINT DEFAULT 0; - DECLARE vPunct TINYINT DEFAULT 0; - DECLARE vRandIndex INT; - DECLARE vPwd TEXT DEFAULT ''; - - DECLARE vAlphaChars TEXT DEFAULT 'abcdefghijklmnopqrstuvwxyz'; - DECLARE vUpperChars TEXT DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - DECLARE vDigitChars TEXT DEFAULT '1234567890'; - DECLARE vPunctChars TEXT DEFAULT '!$%&()=.'; - - SELECT length, nAlpha, nUpper, nDigits, nPunct - INTO vMinLength, vMinAlpha, vMinUpper, vMinDigits, vMinPunct FROM userPassword; - - WHILE LENGTH(vPwd) < vMinLength OR vAlpha < vMinAlpha - OR vUpper < vMinUpper OR vDigits < vMinDigits OR vPunct < vMinPunct DO - SET vRandIndex = FLOOR((RAND() * 4) + 1); - - CASE - WHEN vRandIndex = 1 THEN - SET vPwd = CONCAT(vPwd, SUBSTRING(vAlphaChars, FLOOR((RAND() * 26) + 1), 1)); - SET vAlpha = vAlpha + 1; - WHEN vRandIndex = 2 THEN - SET vPwd = CONCAT(vPwd, SUBSTRING(vUpperChars, FLOOR((RAND() * 26) + 1), 1)); - SET vUpper = vUpper + 1; - WHEN vRandIndex = 3 THEN - SET vPwd = CONCAT(vPwd, SUBSTRING(vDigitChars, FLOOR((RAND() * 10) + 1), 1)); - SET vDigits = vDigits + 1; - WHEN vRandIndex = 4 THEN - SET vPwd = CONCAT(vPwd, SUBSTRING(vPunctChars, FLOOR((RAND() * LENGTH(vPunctChars)) + 1), 1)); - SET vPunct = vPunct + 1; - END CASE; - END WHILE; - RETURN vPwd; +BEGIN +/** + * Generates a random password that meets the minimum requirements. + * + * @return Generated password + */ + DECLARE vMinLength TINYINT; + DECLARE vMinAlpha TINYINT; + DECLARE vMinUpper TINYINT; + DECLARE vMinDigits TINYINT; + DECLARE vMinPunct TINYINT; + DECLARE vAlpha TINYINT DEFAULT 0; + DECLARE vUpper TINYINT DEFAULT 0; + DECLARE vDigits TINYINT DEFAULT 0; + DECLARE vPunct TINYINT DEFAULT 0; + DECLARE vRandIndex INT; + DECLARE vPwd TEXT DEFAULT ''; + + DECLARE vAlphaChars TEXT DEFAULT 'abcdefghijklmnopqrstuvwxyz'; + DECLARE vUpperChars TEXT DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + DECLARE vDigitChars TEXT DEFAULT '1234567890'; + DECLARE vPunctChars TEXT DEFAULT '!$%&()=.'; + + SELECT length, nAlpha, nUpper, nDigits, nPunct + INTO vMinLength, vMinAlpha, vMinUpper, vMinDigits, vMinPunct FROM userPassword; + + WHILE LENGTH(vPwd) < vMinLength OR vAlpha < vMinAlpha + OR vUpper < vMinUpper OR vDigits < vMinDigits OR vPunct < vMinPunct DO + SET vRandIndex = FLOOR((RAND() * 4) + 1); + + CASE + WHEN vRandIndex = 1 THEN + SET vPwd = CONCAT(vPwd, SUBSTRING(vAlphaChars, FLOOR((RAND() * 26) + 1), 1)); + SET vAlpha = vAlpha + 1; + WHEN vRandIndex = 2 THEN + SET vPwd = CONCAT(vPwd, SUBSTRING(vUpperChars, FLOOR((RAND() * 26) + 1), 1)); + SET vUpper = vUpper + 1; + WHEN vRandIndex = 3 THEN + SET vPwd = CONCAT(vPwd, SUBSTRING(vDigitChars, FLOOR((RAND() * 10) + 1), 1)); + SET vDigits = vDigits + 1; + WHEN vRandIndex = 4 THEN + SET vPwd = CONCAT(vPwd, SUBSTRING(vPunctChars, FLOOR((RAND() * LENGTH(vPunctChars)) + 1), 1)); + SET vPunct = vPunct + 1; + END CASE; + END WHILE; + RETURN vPwd; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -1014,11 +1019,11 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `userGetNameFromId__`(vSelf INT) RETURNS varchar(30) CHARSET utf8 COLLATE utf8_unicode_ci DETERMINISTIC -BEGIN -/** - * @deprecated Use user_getNameFromId(); - */ - RETURN user_getNameFromId(vSelf); +BEGIN +/** + * @deprecated Use user_getNameFromId(); + */ + RETURN user_getNameFromId(vSelf); END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -1083,22 +1088,22 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `user_getMysqlRole`(vUserName VARCHAR(255)) RETURNS varchar(255) CHARSET utf8 COLLATE utf8_unicode_ci DETERMINISTIC -BEGIN -/** - * From a username, it returns the associated MySQL wich should be used when - * using external authentication systems. - * - * @param vUserName The user name - * @return The associated MySQL role - */ - DECLARE vRole VARCHAR(255); - - SELECT CONCAT(IF(r.hasLogin, 'z-', ''), r.name) INTO vRole - FROM role r - JOIN user u ON u.role = r.id - WHERE u.name = vUserName; - - RETURN vRole; +BEGIN +/** + * From a username, it returns the associated MySQL wich should be used when + * using external authentication systems. + * + * @param vUserName The user name + * @return The associated MySQL role + */ + DECLARE vRole VARCHAR(255); + + SELECT CONCAT(IF(r.hasLogin, 'z-', ''), r.name) INTO vRole + FROM role r + JOIN user u ON u.role = r.id + WHERE u.name = vUserName; + + RETURN vRole; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -1117,20 +1122,20 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `user_getNameFromId`(vSelf INT) RETURNS varchar(30) CHARSET utf8 COLLATE utf8_unicode_ci DETERMINISTIC -BEGIN -/** - * Gets user name from it's id. - * - * @param vSelf The user id - * @return The user name - */ - DECLARE vName VARCHAR(30); - - SELECT `name` INTO vName - FROM user - WHERE id = vSelf; - - RETURN vName; +BEGIN +/** + * Gets user name from it's id. + * + * @param vSelf The user id + * @return The user name + */ + DECLARE vName VARCHAR(30); + + SELECT `name` INTO vName + FROM user + WHERE id = vSelf; + + RETURN vName; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -1620,8 +1625,13 @@ BEGIN SET vPrefixedLike = CONCAT(vPrefix, '%'); - DELETE FROM mysql.user - WHERE `User` LIKE vPrefixedLike; + IF vIsMysql THEN + DELETE FROM mysql.user + WHERE `User` LIKE vPrefixedLike; + ELSE + DELETE FROM mysql.global_priv + WHERE `User` LIKE vPrefixedLike; + END IF; DELETE FROM mysql.db WHERE `User` LIKE vPrefixedLike; @@ -1789,7 +1799,8 @@ BEGIN JSON_OBJECT( 'mysql_old_password', JSON_VALUE(t.`Priv`, '$.mysql_old_password'), 'mysql_native_password', JSON_VALUE(t.`Priv`, '$.mysql_native_password'), - 'authentication_string', JSON_VALUE(t.`Priv`, '$.authentication_string') + 'authentication_string', JSON_VALUE(t.`Priv`, '$.authentication_string'), + 'ssl_type', JSON_VALUE(t.`Priv`, '$.ssl_type') ) ) FROM tRole r @@ -1800,7 +1811,7 @@ BEGIN ON u.`User` = r.role AND u.`Host` = vRoleHost; END IF; - + INSERT INTO mysql.proxies_priv ( `User`, `Host`, @@ -4741,16 +4752,16 @@ BEGIN * La tabla mana_spellers es una caché * */ - - UPDATE mana_spellers me - JOIN - (SELECT Id_Trabajador, FLOOR(SUM(importe)/12) as pesoCarteraMensual - FROM bs.vendedores - WHERE año * 100 + mes >= (YEAR(CURDATE()) -1) * 100 + MONTH(CURDATE()) - GROUP BY Id_Trabajador - ) lastYearSales USING(Id_Trabajador) - SET me.prices_modifier_rate = GREATEST(me.minRate,LEAST(me.maxRate,ROUND(- me.used/lastYearSales.pesoCarteraMensual,3))) ; - + + UPDATE mana_spellers me + JOIN + (SELECT Id_Trabajador, FLOOR(SUM(importe)/12) as pesoCarteraMensual + FROM bs.vendedores + WHERE año * 100 + mes >= (YEAR(CURDATE()) -1) * 100 + MONTH(CURDATE()) + GROUP BY Id_Trabajador + ) lastYearSales USING(Id_Trabajador) + SET me.prices_modifier_rate = GREATEST(me.minRate,LEAST(me.maxRate,ROUND(- me.used/lastYearSales.pesoCarteraMensual,3))) ; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -5151,6 +5162,62 @@ DO SET vDateStart = DATE_ADD(vDateStart, INTERVAL 1 DAY); END WHILE; +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 DROP PROCEDURE IF EXISTS `saleGraphic` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`z-developer`@`%` PROCEDURE `saleGraphic`(vItemFk INT, + vTypeFk INT, + vCategoryFk INT, + vFromDate DATE, + vToDate DATE, + vProducerFk INT) +BEGIN + + DECLARE vFromDateLastYear DATE; + DECLARE vToDateLastYear DATE; + DECLARE vFromDateTwoYearsAgo DATE; + DECLARE vToDateTwoYearsAgo DATE; + + SET vItemFk = IFNULL(vItemFk,0); + SET vTypeFk = IFNULL(vTypeFk, 0); + SET vCategoryFk = IFNULL(vCategoryFk,0); + SET vFromDate = IFNULL(vFromDate,CURDATE()); + SET vToDate = IFNULL(vToDate,CURDATE()); + SET vProducerFk = IFNULL(vProducerFk,0); + + SET vFromDateLastYear = TIMESTAMPADD(YEAR,-1,vFromDate); + SET vToDateLastYear = TIMESTAMPADD(YEAR,-1,vToDate); + SET vFromDateTwoYearsAgo = TIMESTAMPADD(YEAR,-2,vFromDate); + SET vToDateTwoYearsAgo = TIMESTAMPADD(YEAR,-2,vToDate); + + SELECT s.quantity, CAST(v.importe AS DECIMAL(10,0)) importe, v.fecha + FROM bs.ventas v + JOIN vn.sale s ON s.id = v.Id_Movimiento + JOIN vn.item i ON i.id = s.itemFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.itemCategory ic ON ic.id = it.categoryFk + WHERE vItemFk IN (i.id, 0) + AND vTypeFk IN (i.typeFk, 0) + AND vCategoryFk IN (it.categoryFk, 0) + AND vProducerFk IN (i.producerFk, 0) + AND (v.fecha BETWEEN vFromDate AND vToDate + OR v.fecha BETWEEN vFromDateLastYear AND vToDateLastYear + OR v.fecha BETWEEN vFromDateTwoYearsAgo AND vToDateTwoYearsAgo + ); + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -6999,9 +7066,9 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `cacheCalc_clean`() -BEGIN - DECLARE vCleanTime DATETIME DEFAULT TIMESTAMPADD(MINUTE, -5, NOW()); - DELETE FROM cache_calc WHERE expires < vCleanTime; +BEGIN + DECLARE vCleanTime DATETIME DEFAULT TIMESTAMPADD(MINUTE, -5, NOW()); + DELETE FROM cache_calc WHERE expires < vCleanTime; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7019,27 +7086,27 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `cache_calc_end`(IN `v_calc` INT) -BEGIN - DECLARE v_cache_name VARCHAR(255); - DECLARE v_params VARCHAR(255); - - -- Libera el bloqueo y actualiza la fecha de ultimo refresco. - - UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id - SET - cc.last_refresh = NOW(), - cc.expires = ADDTIME(NOW(), c.lifetime), - cc.connection_id = NULL - WHERE cc.id = v_calc; - - SELECT c.name, ca.params INTO v_cache_name, v_params - FROM cache c - JOIN cache_calc ca ON c.id = ca.cache_id - WHERE ca.id = v_calc; - - IF v_cache_name IS NOT NULL THEN - DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); - END IF; +BEGIN + DECLARE v_cache_name VARCHAR(255); + DECLARE v_params VARCHAR(255); + + -- Libera el bloqueo y actualiza la fecha de ultimo refresco. + + UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id + SET + cc.last_refresh = NOW(), + cc.expires = ADDTIME(NOW(), c.lifetime), + cc.connection_id = NULL + WHERE cc.id = v_calc; + + SELECT c.name, ca.params INTO v_cache_name, v_params + FROM cache c + JOIN cache_calc ca ON c.id = ca.cache_id + WHERE ca.id = v_calc; + + IF v_cache_name IS NOT NULL THEN + DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7057,88 +7124,88 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `cache_calc_start`(OUT `v_calc` INT, INOUT `v_refresh` INT, IN `v_cache_name` VARCHAR(50), IN `v_params` VARCHAR(100)) -proc: BEGIN - DECLARE v_valid BOOL; - DECLARE v_lock_id VARCHAR(100); - DECLARE v_cache_id INT; - DECLARE v_expires DATETIME; - DECLARE v_clean_time DATETIME; - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - IF v_lock_id IS NOT NULL THEN - DO RELEASE_LOCK(v_lock_id); - END IF; - - RESIGNAL; - END; - - SET v_params = IFNULL(v_params, ''); - - -- Si el servidor se ha reiniciado invalida todos los calculos. - - SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid; - - IF !v_valid - THEN - DELETE FROM cache_calc; - INSERT INTO cache_valid (valid) VALUES (TRUE); - END IF; - - -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia. - - SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params); - - IF !GET_LOCK(v_lock_id, 30) - THEN - SET v_calc = NULL; - SET v_refresh = FALSE; - LEAVE proc; - END IF; - - -- Comprueba si el calculo solicitado existe y esta actualizado. - - SELECT c.id, ca.id, ca.expires - INTO v_cache_id, v_calc, v_expires - FROM cache c - LEFT JOIN cache_calc ca - ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci' - WHERE c.name = v_cache_name COLLATE 'utf8_general_ci'; - - -- Si existe una calculo valido libera el bloqueo y devuelve su identificador. - - IF !v_refresh AND NOW() < v_expires - THEN - DO RELEASE_LOCK(v_lock_id); - SET v_refresh = FALSE; - LEAVE proc; - END IF; - - -- Si el calculo no existe le crea una entrada en la tabla de calculos. - - IF v_calc IS NULL - THEN - INSERT INTO cache_calc SET - cache_id = v_cache_id, - cacheName = v_cache_name, - params = v_params, - last_refresh = NULL, - expires = NULL, - connection_id = CONNECTION_ID(); - - SET v_calc = LAST_INSERT_ID(); - ELSE - UPDATE cache_calc - SET - last_refresh = NULL, - expires = NULL, - connection_id = CONNECTION_ID() - WHERE id = v_calc; - END IF; - - -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador. - - SET v_refresh = TRUE; +proc: BEGIN + DECLARE v_valid BOOL; + DECLARE v_lock_id VARCHAR(100); + DECLARE v_cache_id INT; + DECLARE v_expires DATETIME; + DECLARE v_clean_time DATETIME; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + IF v_lock_id IS NOT NULL THEN + DO RELEASE_LOCK(v_lock_id); + END IF; + + RESIGNAL; + END; + + SET v_params = IFNULL(v_params, ''); + + -- Si el servidor se ha reiniciado invalida todos los calculos. + + SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid; + + IF !v_valid + THEN + DELETE FROM cache_calc; + INSERT INTO cache_valid (valid) VALUES (TRUE); + END IF; + + -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia. + + SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params); + + IF !GET_LOCK(v_lock_id, 30) + THEN + SET v_calc = NULL; + SET v_refresh = FALSE; + LEAVE proc; + END IF; + + -- Comprueba si el calculo solicitado existe y esta actualizado. + + SELECT c.id, ca.id, ca.expires + INTO v_cache_id, v_calc, v_expires + FROM cache c + LEFT JOIN cache_calc ca + ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci' + WHERE c.name = v_cache_name COLLATE 'utf8_general_ci'; + + -- Si existe una calculo valido libera el bloqueo y devuelve su identificador. + + IF !v_refresh AND NOW() < v_expires + THEN + DO RELEASE_LOCK(v_lock_id); + SET v_refresh = FALSE; + LEAVE proc; + END IF; + + -- Si el calculo no existe le crea una entrada en la tabla de calculos. + + IF v_calc IS NULL + THEN + INSERT INTO cache_calc SET + cache_id = v_cache_id, + cacheName = v_cache_name, + params = v_params, + last_refresh = NULL, + expires = NULL, + connection_id = CONNECTION_ID(); + + SET v_calc = LAST_INSERT_ID(); + ELSE + UPDATE cache_calc + SET + last_refresh = NULL, + expires = NULL, + connection_id = CONNECTION_ID() + WHERE id = v_calc; + END IF; + + -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador. + + SET v_refresh = TRUE; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7156,24 +7223,24 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `cache_calc_unlock`(IN `v_calc` INT) -proc: BEGIN - DECLARE v_cache_name VARCHAR(50); - DECLARE v_params VARCHAR(100); - - IF v_calc IS NULL THEN - LEAVE proc; - END IF; - - SELECT c.name, ca.params INTO v_cache_name, v_params - FROM cache c - JOIN cache_calc ca ON c.id = ca.cache_id - WHERE ca.id = v_calc; - - DELETE FROM cache_calc WHERE id = v_calc; - - IF v_cache_name IS NOT NULL THEN - DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); - END IF; +proc: BEGIN + DECLARE v_cache_name VARCHAR(50); + DECLARE v_params VARCHAR(100); + + IF v_calc IS NULL THEN + LEAVE proc; + END IF; + + SELECT c.name, ca.params INTO v_cache_name, v_params + FROM cache c + JOIN cache_calc ca ON c.id = ca.cache_id + WHERE ca.id = v_calc; + + DELETE FROM cache_calc WHERE id = v_calc; + + IF v_cache_name IS NOT NULL THEN + DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7192,9 +7259,9 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `cache_clean`() NO SQL -BEGIN - CALL available_clean; - CALL visible_clean; +BEGIN + CALL available_clean; + CALL visible_clean; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7212,13 +7279,13 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `clean`() -BEGIN - - DECLARE vDateShort DATETIME; - - SET vDateShort = TIMESTAMPADD(MONTH, -1, CURDATE()); - - DELETE FROM cache.departure_limit WHERE Fecha < vDateShort; +BEGIN + + DECLARE vDateShort DATETIME; + + SET vDateShort = TIMESTAMPADD(MONTH, -1, CURDATE()); + + DELETE FROM cache.departure_limit WHERE Fecha < vDateShort; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7880,6 +7947,20 @@ DROP TABLE IF EXISTS `VMPSettings`; CREATE TABLE `VMPSettings` ( `VMPID` int(11) NOT NULL, `MessageID` int(11) NOT NULL, + `dateTimeTry` timestamp NULL DEFAULT NULL, + `isVmpBA` tinyint(4) DEFAULT NULL COMMENT 'Basic authentication', + `vmpVersion` int(11) DEFAULT NULL, + `vmpUrl` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `loginName` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, + `loginPassword` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, + `refreshRate` int(11) DEFAULT NULL, + `eanBuyer` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, + `eanSupplier` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, + `eanAgent` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, + `dateTimeLastSync` timestamp NULL DEFAULT NULL, + `closedFrom` int(11) DEFAULT NULL, + `closedTo` int(11) DEFAULT NULL, + `totalRefreshHours` int(11) DEFAULT NULL, PRIMARY KEY (`VMPID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -8276,7 +8357,6 @@ CREATE TABLE `item_groupToOffer` ( KEY `item_groupToOffer_fk2_idx` (`itemTypeFk`), KEY `item_groupToOffer_fk3_idx` (`intrastatFk`), KEY `item_groupToOffer_fk4_idx` (`originFk`), - CONSTRAINT `item_groupToOffer_fk1` FOREIGN KEY (`group_code`) REFERENCES `item_group` (`group_code`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `item_groupToOffer_fk2` FOREIGN KEY (`itemTypeFk`) REFERENCES `vn`.`itemType` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `item_groupToOffer_fk3` FOREIGN KEY (`intrastatFk`) REFERENCES `vn`.`intrastat` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `item_groupToOffer_fk4` FOREIGN KEY (`originFk`) REFERENCES `vn`.`origin` (`id`) ON DELETE CASCADE ON UPDATE CASCADE @@ -8455,11 +8535,11 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER `edi`.`putOrder_AFTER_UPDATE` AFTER UPDATE ON `putOrder` FOR EACH ROW BEGIN @@ -8484,7 +8564,8 @@ BEGIN CONCAT(account.user_getNameFromId(c.salesPersonFk), '@verdnatura.es') ), 'Producto no disponible en Floramondo', - CONCAT('El artículo ', s.concept, ' del ticket ', t.id , ' ha sido cancelado por Floramondo. ', ' Se ha actualizado la cantidad a 0. ', + CONCAT('El artículo ', s.concept, ' del ticket ', t.id , ' ha sido cancelado por Floramondo. ', + ' Se ha actualizado la cantidad de ', OLD.quantity,' a 0. ', IF (u.id IS NOT NULL AND c.email IS NOT NULL , CONCAT('https://verdnatura.es/#!form=ecomerce%2Fticket&ticket=', t.id ), CONCAT('https://salix.verdnatura.es/#!/ticket/', t.id ,'/summary'))) @@ -8642,13 +8723,16 @@ CREATE TABLE `supplyResponse` ( `MarketPlaceID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `MarketFormCode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '"002" Standard Sales\n"005" Catalogue (optional)\n"001" Committed (optional)\n"003" Buffer (optional, Clock Pre Sales) ', `FlowerColor` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `vmpID` int(11) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `ID_UNIQUE` (`ID`), KEY `IX_TransNumber` (`TransactionNumber`) COMMENT 'Agregado por Ernesto 11.6.2019\nSe ejecutaba 1 consulta por segundo desde MAIL y consumia un 20% de CPU de todo el servidor !!!!!\nCPU usada es mas estable que Indice en SendererID, cpu vs espacio que ocupa?\n', KEY `supplyResponse_Ix1` (`Item_ArticleCode`), KEY `supplyResponseMarcketIdx` (`MarketPlaceID`), KEY `supplyResponseNumberOfUnitsIdx` (`NumberOfUnits`), - KEY `supplyResponseEmbalageCodeIdx` (`EmbalageCode`) + KEY `supplyResponseEmbalageCodeIdx` (`EmbalageCode`), + KEY `supplyResponseputOrder_FK` (`vmpID`), + CONSTRAINT `supplyResponseputOrder_FK` FOREIGN KEY (`vmpID`) REFERENCES `VMPSettings` (`VMPID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; @@ -9230,154 +9314,154 @@ CREATE DEFINER=`root`@`%` PROCEDURE `exchange_new`( IN `vAuction` SMALLINT, IN `vPackage` INT, IN `vPutOrderFk` INT) -BEGIN +BEGIN /** * Adds a new exchange, generates it's barcode and * inserts/updates the transaction. When the referenced * transaction exists as provisional, updates it with - * the new values. - */ - DECLARE vEkt INT; - DECLARE vRewriteKop INT DEFAULT NULL; - DECLARE vBarcode CHAR(15) DEFAULT NULL; - DECLARE vIsDuplicated BOOL; + * the new values. + */ + DECLARE vEkt INT; + DECLARE vRewriteKop INT DEFAULT NULL; + DECLARE vBarcode CHAR(15) DEFAULT NULL; + DECLARE vIsDuplicated BOOL; DECLARE vUpdateExistent BOOL DEFAULT FALSE; - DECLARE duplicateKey CONDITION FOR 1062; - - DECLARE CONTINUE HANDLER FOR duplicateKey - SET vIsDuplicated = TRUE; - - -- Generates the barcode - - IF vAgj != 0 AND vAgj IS NOT NULL - THEN - SET vBarcode = CONCAT( - LPAD(vAuction, 2, 0), - LPAD(IFNULL(vClock, 99), 2, 0), - LPAD(DAYOFYEAR(vDate), 3, 0), - IF(vClock IS NULL OR vClock = 99, - LPAD(vAgj, 7, 0), - CONCAT(LPAD(vAgj, 5, 0), '01') - ), - '0' - ); - END IF; - - -- Rewrites the kop parameter - - IF vKop IS NULL THEN - SELECT defaultKop INTO vKop FROM exchangeConfig; - END IF; - - SELECT e.kop INTO vRewriteKop - FROM mailSender e - JOIN mail m ON m.senderFk = e.id - WHERE m.id = vMailFk; - - SET vKop = IFNULL(vRewriteKop, vKop); - - -- Inserts the new transaction + DECLARE duplicateKey CONDITION FOR 1062; - SET vIsDuplicated = FALSE; - INSERT INTO ekt SET - barcode = IFNULL(vBarcode, barcode) - ,deliveryNumber = vDeliveryNumber - ,entryYear = YEAR(vDate) - ,fec = vDate - ,hor = vHour - ,ref = vRef - ,item = vItem - ,agj = vAgj - ,cat = vCat - ,pac = vPac - ,sub = vSub - ,kop = vKop - ,ptd = vPtd - ,pro = vPro - ,ori = vOrigin - ,ptj = vPtj - ,qty = vQuantiy - ,pri = vPrice - ,klo = vClock - ,s1 = vS1 - ,s2 = vS2 - ,s3 = vS3 - ,s4 = vS4 - ,s5 = vS5 - ,s6 = vS6 - ,k1 = vK1 - ,k2 = vK2 - ,k3 = vP1 - ,k4 = vP2 - ,auction = vAuction - ,package = vPackage - ,putOrderFk = vPutOrderFk; - - -- If it exists duplicado updates it - - IF NOT vIsDuplicated - THEN - SET vEkt = LAST_INSERT_ID(); - CALL ekt_load (vEkt); - - ELSEIF vDeliveryNumber != 0 - AND vDeliveryNumber IS NOT NULL - THEN - SELECT id INTO vEkt - FROM ekt - WHERE deliveryNumber = vDeliveryNumber; - - SELECT COUNT(*) = 0 INTO vUpdateExistent - FROM ekt t - JOIN `exchange` b ON b.ektFk = t.id - JOIN exchangeConfig c - WHERE t.deliveryNumber = vDeliveryNumber - AND t.entryYear = YEAR(vDate) - AND b.typeFk != c.presaleFk; - END IF; - - IF vUpdateExistent - THEN - UPDATE ekt SET - barcode = IFNULL(vBarcode, barcode) - ,fec = vDate - ,hor = vHour - ,ref = vRef - ,item = vItem - ,agj = vAgj - ,cat = vCat - ,pac = vPac - ,sub = vSub - ,kop = vKop - ,ptd = vPtd - ,pro = vPro - ,ori = vOrigin - ,ptj = vPtj - ,qty = vQuantiy - ,pri = vPrice - ,klo = vClock - ,s1 = vS1 - ,s2 = vS2 - ,s3 = vS3 - ,s4 = vS4 - ,s5 = vS5 - ,s6 = vS6 - ,k1 = vK1 - ,k2 = vK2 - ,k3 = vP1 - ,k4 = vP2 - ,auction = vAuction - ,package = vPackage - ,putOrderFk = IFNULL(vPutOrderFk, putOrderFk) - WHERE id = vEkt; - END IF; - - -- Registers the exchange - - INSERT INTO `exchange` SET - mailFk = vMailFk - ,typeFk = vType - ,ektFk = vEkt; + DECLARE CONTINUE HANDLER FOR duplicateKey + SET vIsDuplicated = TRUE; + + -- Generates the barcode + + IF vAgj != 0 AND vAgj IS NOT NULL + THEN + SET vBarcode = CONCAT( + LPAD(vAuction, 2, 0), + LPAD(IFNULL(vClock, 99), 2, 0), + LPAD(DAYOFYEAR(vDate), 3, 0), + IF(vClock IS NULL OR vClock = 99, + LPAD(vAgj, 7, 0), + CONCAT(LPAD(vAgj, 5, 0), '01') + ), + '0' + ); + END IF; + + -- Rewrites the kop parameter + + IF vKop IS NULL THEN + SELECT defaultKop INTO vKop FROM exchangeConfig; + END IF; + + SELECT e.kop INTO vRewriteKop + FROM mailSender e + JOIN mail m ON m.senderFk = e.id + WHERE m.id = vMailFk; + + SET vKop = IFNULL(vRewriteKop, vKop); + + -- Inserts the new transaction + + SET vIsDuplicated = FALSE; + INSERT INTO ekt SET + barcode = IFNULL(vBarcode, barcode) + ,deliveryNumber = vDeliveryNumber + ,entryYear = YEAR(vDate) + ,fec = vDate + ,hor = vHour + ,ref = vRef + ,item = vItem + ,agj = vAgj + ,cat = vCat + ,pac = vPac + ,sub = vSub + ,kop = vKop + ,ptd = vPtd + ,pro = vPro + ,ori = vOrigin + ,ptj = vPtj + ,qty = vQuantiy + ,pri = vPrice + ,klo = vClock + ,s1 = vS1 + ,s2 = vS2 + ,s3 = vS3 + ,s4 = vS4 + ,s5 = vS5 + ,s6 = vS6 + ,k1 = vK1 + ,k2 = vK2 + ,k3 = vP1 + ,k4 = vP2 + ,auction = vAuction + ,package = vPackage + ,putOrderFk = vPutOrderFk; + + -- If it exists duplicado updates it + + IF NOT vIsDuplicated + THEN + SET vEkt = LAST_INSERT_ID(); + CALL ekt_load (vEkt); + + ELSEIF vDeliveryNumber != 0 + AND vDeliveryNumber IS NOT NULL + THEN + SELECT id INTO vEkt + FROM ekt + WHERE deliveryNumber = vDeliveryNumber; + + SELECT COUNT(*) = 0 INTO vUpdateExistent + FROM ekt t + JOIN `exchange` b ON b.ektFk = t.id + JOIN exchangeConfig c + WHERE t.deliveryNumber = vDeliveryNumber + AND t.entryYear = YEAR(vDate) + AND b.typeFk != c.presaleFk; + END IF; + + IF vUpdateExistent + THEN + UPDATE ekt SET + barcode = IFNULL(vBarcode, barcode) + ,fec = vDate + ,hor = vHour + ,ref = vRef + ,item = vItem + ,agj = vAgj + ,cat = vCat + ,pac = vPac + ,sub = vSub + ,kop = vKop + ,ptd = vPtd + ,pro = vPro + ,ori = vOrigin + ,ptj = vPtj + ,qty = vQuantiy + ,pri = vPrice + ,klo = vClock + ,s1 = vS1 + ,s2 = vS2 + ,s3 = vS3 + ,s4 = vS4 + ,s5 = vS5 + ,s6 = vS6 + ,k1 = vK1 + ,k2 = vK2 + ,k3 = vP1 + ,k4 = vP2 + ,auction = vAuction + ,package = vPackage + ,putOrderFk = IFNULL(vPutOrderFk, putOrderFk) + WHERE id = vEkt; + END IF; + + -- Registers the exchange + + INSERT INTO `exchange` SET + mailFk = vMailFk + ,typeFk = vType + ,ektFk = vEkt; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -9388,9 +9472,9 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; @@ -9402,6 +9486,8 @@ proc: BEGIN DECLARE vFreeId INT; DECLARE vSupplyResponseFk INT; DECLARE vLastInserted DATETIME; + DECLARE vVNH_WarehouseFk INT; + DECLARE vFloramondo_WarehouseFk INT; DECLARE cur1 CURSOR FOR SELECT id @@ -9419,6 +9505,14 @@ proc: BEGIN END; START TRANSACTION; + + SELECT id INTO vVNH_WarehouseFk + FROM vn.warehouse + WHERE name = 'VNH'; + + SELECT id INTO vFloramondo_WarehouseFk + FROM vn.warehouse + WHERE name = 'Floramondo'; -- select now(),'Antes de borrar'; DELETE itf.* FROM edi.item_free itf @@ -9487,25 +9581,7 @@ proc: BEGIN AND (di.LatestOrderDateTime < NOW() OR di.ID IS NULL) AND it.isInventory ; - -- Actualizamos el campo supplyResponseFk para aquellos articulos que ya estan creados y reutilizamos -/* UPDATE IGNORE edi.offer o - LEFT JOIN vn.item iExist ON iExist.supplyResponseFk = o.srID - JOIN vn.item i - ON i.name = o.product_name - AND i.subname <=> o.company_name - AND i.value5 <=> o.s1Value - AND i.value6 <=> o.s2Value - AND i.value7 <=> o.s3Value - AND i.value8 <=> o.s4Value - AND i.value9 <=> o.s5Value - AND i.value10 <=> o.s6Value - AND i.NumberOfItemsPerCask <=> o.NumberOfItemsPerCask - AND i.EmbalageCode <=> o.EmbalageCode - AND i.quality <=> o.Quality - SET i.supplyResponseFk = o.srID - WHERE iExist.id IS NULL - ; - */ -- select now(),'Antes de crear ITO'; + -- select now(),'Antes de crear ITO'; DROP TEMPORARY TABLE IF EXISTS itemToInsert; CREATE TEMPORARY TABLE itemToInsert ENGINE = MEMORY SELECT o.*, CAST(NULL AS DECIMAL(6,0)) as itemFk @@ -9672,9 +9748,12 @@ proc: BEGIN JOIN marketPlace mp ON mp.id = o.MarketPlaceID WHERE mp.isLatestOrderDateTimeRelevant; - SET @myEntry := vn.floramondo_getEntry(vLanded); + SET @myEntry := vn.floramondo_getEntry(vLanded, vVNH_WarehouseFk); + IF @myEntry THEN + SELECT @myEntry; + -- Elimina la oferta obsoleta DELETE b FROM vn.buy b JOIN vn.item i ON i.id = b.itemFk @@ -9734,7 +9813,79 @@ proc: BEGIN SELECT id from vn.buy where entryFk = @myEntry AND created >= vLastInserted; CALL vn.buy_recalcPrices(); + END IF; + /* + -- Ara la entrada per a Floramondo + SET @myFloramondoEntry := vn.floramondo_getEntry(vLanded, vFloramondo_WarehouseFk); + + IF @myFloramondoEntry THEN + + SELECT @myFloramondoEntry; + + -- Elimina la oferta obsoleta + DELETE b FROM vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN edi.offer o ON i.supplyResponseFk = o.`srId` + LEFT JOIN putOrder po ON b.deliveryFk = po.deliveryInformationID + WHERE b.entryFk = @myFloramondoEntry + AND o.`srId` IS NULL + AND po.id IS NULL; + + UPDATE vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN edi.offer o ON i.supplyResponseFk = o.`srId` + SET b.quantity = 0 + WHERE b.entryFk = @myFloramondoEntry + AND o.`srId` IS NULL; + + -- actualiza la oferta existente + UPDATE vn.buy b + JOIN vn.item i ON i.id = b.itemFk + JOIN edi.offer o ON i.supplyResponseFk = o.`srId` + SET b.quantity = o.NumberOfUnits * o.NumberOfItemsPerCask, + b.buyingValue = o.price + WHERE b.entryFk = @myFloramondoEntry + AND (b.quantity <> o.NumberOfUnits * o.NumberOfItemsPerCask OR b.buyingValue <> o.price); + + SET vLastInserted := NOW(); + -- Inserta la oferta + INSERT INTO vn.buy(entryFk, + itemFk, + quantity, + buyingValue, + stickers, + packing, + `grouping`, + groupingMode, + packageFk, + deliveryFk) + + SELECT @myFloramondoEntry, + i.id, + o.NumberOfUnits * o.NumberOfItemsPerCask as quantity, + o.Price, + o.NumberOfUnits as etiquetas, + o.NumberOfItemsPerCask as packing, + o.MinimumQuantity * o.NumberOfItemsPerCask as `grouping`, + 1, -- Obliga al Packing + o.embalageCode, + o.diId + FROM edi.offer o + JOIN vn.item i ON i.supplyResponseFk = o.srId + LEFT JOIN vn.buy b ON i.id = b.itemFk AND b.entryFk = @myFloramondoEntry + JOIN vn.packaging p ON p.id LIKE o.embalageCode -- llevar esta linea i mirar de crear els packages a temps real + WHERE b.id IS NULL; + + DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc; + CREATE TEMPORARY TABLE tmp.buyRecalc + SELECT id from vn.buy where entryFk = @myFloramondoEntry AND created >= vLastInserted; + + CALL vn.buy_recalcPrices(); + + + END IF; + */ DROP TEMPORARY TABLE edi.offer, itemToInsert; @@ -12156,30 +12307,30 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `item_listAllocation`(IN `vWh` TINYINT, IN `vDate` DATE, IN `vType` INT, IN `vPrefix` VARCHAR(255), IN `vUseIds` BOOLEAN) -BEGIN -/** - * Lists visible items and it's box sizes of the specified - * type at specified date. - * - * @param vWh The warehouse id - * @param vDate The visible date - * @param vType The type id - * @param vPrefix The article prefix to filter or %NULL for all - * @param vUseIds Whether to order the result by item id - * @select List of visible items with it's box sizes - */ - CALL item_getVisible(vWh, vDate, vType, vPrefix); - - IF vUseIds - THEN - SELECT * FROM tmp.itemVisible - ORDER BY Id_Article; - ELSE - SELECT * FROM tmp.itemVisible - ORDER BY Article, packing; - END IF; - - DROP TEMPORARY TABLE tmp.itemVisible; +BEGIN +/** + * Lists visible items and it's box sizes of the specified + * type at specified date. + * + * @param vWh The warehouse id + * @param vDate The visible date + * @param vType The type id + * @param vPrefix The article prefix to filter or %NULL for all + * @param vUseIds Whether to order the result by item id + * @select List of visible items with it's box sizes + */ + CALL item_getVisible(vWh, vDate, vType, vPrefix); + + IF vUseIds + THEN + SELECT * FROM tmp.itemVisible + ORDER BY Id_Article; + ELSE + SELECT * FROM tmp.itemVisible + ORDER BY Article, packing; + END IF; + + DROP TEMPORARY TABLE tmp.itemVisible; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -13677,9 +13828,10 @@ BEGIN END IF; UPDATE order_row SET Id_Movimiento = vSale WHERE id = vRowId; - + SELECT (warehouseInFk = vWarehouse) INTO vIsFloramondoWarehouse FROM vn.floramondoConfig; - IF vIsFloramondoWarehouse THEN + + IF vIsFloramondoWarehouse THEN INSERT INTO edi.putOrder (deliveryInformationID, supplyResponseId, quantity, @@ -13692,13 +13844,13 @@ BEGIN WHERE i.id = vItem -- AND di.LatestDeliveryDateTime > NOW() AND vAmount / sr.NumberOfItemsPerCask LIMIT 1; + END IF; END LOOP; CLOSE cRows; -- Fija el coste - DROP TEMPORARY TABLE IF EXISTS tComponents; CREATE TEMPORARY TABLE tComponents (INDEX (saleFk)) @@ -14113,11 +14265,11 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `order_getTax`() READS SQL DATA @@ -14176,6 +14328,8 @@ BEGIN SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax FROM tmp.orderTax GROUP BY orderFk, `code`; + + DROP TEMPORARY TABLE tmp.addressTaxArea; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -17690,6 +17844,7 @@ TRUNCATE TABLE clientesProveedores; Nacion, Telefono, Telefono2, + CodigoTransaccion, CodigoRetencion, Email1, iban) @@ -17701,7 +17856,7 @@ TRUNCATE TABLE clientesProveedores; cl.street Domicilio, cl.accountingAccount CodigoCuenta, TRIM(IF(co.code = LEFT(cl.fi,2), MID(cl.fi,3, length(cl.fi)-1), cl.fi)) AS CifDni, - TRIM(CONCAT(co.code, IF(co.code = LEFT(cl.fi,2), MID(cl.fi,3, length(cl.fi)-1), cl.fi))) AS CifEuropeo, + IF(sn.NacionCEE,TRIM(CONCAT(co.code, IF(co.code = LEFT(cl.fi,2), MID(cl.fi,3, length(cl.fi)-1), cl.fi))) , "")AS CifEuropeo, cl.postcode CodigoPostal, cl.city Municipio, sp.CodigoProvincia CodigoProvincia, @@ -17710,12 +17865,14 @@ TRUNCATE TABLE clientesProveedores; IF (sn.SiglaNacion = "XB",IF(sp.CodigoProvincia IN (51,52), "XC",IF (sp.CodigoProvincia IN (35,38), "XB", sn.SiglaNacion)), sn.SiglaNacion) SiglaNacion, IF((cl.fi REGEXP '^([[:blank:]]|[[:digit:]])'), 'J','F') PersonaFisicaJuridica, IF((co.id = 1), 1, IF((co.isUeeMember = 1), 2, 4)) TipoDocumentoPersona, - IF(cl.isEqualizated, 'R', IF ((cl.isVies AND cl.countryFk <> 1) OR (NOT co.isUeeMember),'E','I'))AS CodigoIva, - IF(sn.SiglaNacion = "XB", IF(sp.CodigoProvincia IN (51,52), "CEUTA Y MELILLA", IF (sp.CodigoProvincia IN (35,38), "ISLAS CANARIAS",sn.Nacion)) , sn.Nacion) Nacion, + -- IF(cl.isEqualizated, 'R', IF ((cl.isVies AND cl.countryFk <> 1) OR (NOT co.isUeeMember),'E','I'))AS CodigoIva, + cl.taxTypeSageFk CodigoIva, + IF(sn.SiglaNacion = "XB", IF(sp.CodigoProvincia IN (51,52), "CEUTA Y MELILLA", IF (sp.CodigoProvincia IN (35,38), "ISLAS CANARIAS",sn.Nacion)) , sn.Nacion) Nacion, cl.phone Telefono, cl.mobile Telefono2, - 0 CodigoRetencion, - SUBSTR(cl.email, 1, LOCATE(',', CONCAT(cl.email,','))-1) Email1, + cl.transactionTypeSageFk CodigoTransaccion, + 0 CodigoRetencion, + SUBSTR(cl.email, 1, LOCATE(',', CONCAT(cl.email,','))-1) Email1, cl.iban iban FROM vn.client cl JOIN vn2008.v_xsubclien ON v_xsubclien.Id_Cliente = cl.id @@ -17734,7 +17891,7 @@ TRUNCATE TABLE clientesProveedores; s.street Domicilio, s.account CodigoCuenta, TRIM(IF(co.code = LEFT(s.nif,2), MID(s.nif,3, length(s.nif)-1), s.nif)) CifDni, - TRIM(CONCAT(co.code, IF(co.code = LEFT(s.nif,2), MID(s.nif,3, length(s.nif)-1), s.nif))) AS CifEuropeo, + IF(sn.NacionCEE,TRIM(CONCAT(co.code, IF(co.code = LEFT(s.nif,2), MID(s.nif,3, length(s.nif)-1), s.nif))), "") AS CifEuropeo, s.postCode CodigoPostal, s.city Municipio, sp.CodigoProvincia CodigoProvincia, @@ -17743,16 +17900,14 @@ TRUNCATE TABLE clientesProveedores; sn.SiglaNacion SiglaNacion, IF((s.nif REGEXP '^([[:blank:]]|[[:digit:]])'),'J','F') PersonaFisicaJuridica, IF((co.id = 1),1,IF((co.isUeeMember = 1), 2, 4)) TipoDocumentoPersona, - 'I' CodigoIva, + -- 'I' CodigoIva, + s.taxTypeSageFk CodigoIva, sn.Nacion Nacion, con.Telefono Telefono, con.Movil Telefono2, - CASE - WHEN s.account LIKE '_____4____' THEN 2 - WHEN s.account LIKE '_____3____' THEN 18 - ELSE 0 - END CodigoRetencion, - SUBSTR(con.email,1,(COALESCE(NULLIF(LOCATE(',', con.email), 0), 99) - 1)) Email1, + s.transactionTypeSageFk CodigoTransaccion, + s.withholdingSageFk CodigoRetencion, + SUBSTR(con.email,1,(COALESCE(NULLIF(LOCATE(',', con.email), 0), 99) - 1)) Email1, sa.iban iban FROM vn.supplier s JOIN vn2008.v_xsubprov xsp ON xsp.proveedor_id = s.id -- Proveedores activos los últimos 3 meses @@ -17793,8 +17948,8 @@ BEGIN TRUNCATE XDiario_movConta_IVA; DELETE FROM movConta WHERE enlazadoSage = FALSE ; - -- CALL clientesProveedoresAdd; - -- CALL planCuentasPgcAdd; + CALL clientesProveedoresAdd; + CALL planCuentasPgcAdd; CALL XDiario_movConta_IVA_InvoiceOutAdd_Manager; CALL XDiario_movConta_IVA_InvoiceInAdd_Manager; INSERT INTO movConta( @@ -17890,7 +18045,7 @@ BEGIN YEAR(x.FECHA) AS Ejercicio, IF (@@hostname = 'db', c.companyCode, companyCodeTest) AS CodigoEmpresa, -- ENT(2) c.companyCode AS CodigoEmpresa, x.ASIEN AS Asiento, -- LONG(4), nº ASIENTO - IF(EURODEBE IS NULL,"H","D") AS CargoAbono, -- VARCHAR(1) "D" debe ó "H" haber + IF(EURODEBE<>0 OR (EURODEBE=0 AND EUROHABER IS NULL),'D','H')AS CargoAbono, -- IF(EURODEBE IS NULL,"H","D") AS CargoAbono, VARCHAR(1) "D" debe ó "H" haber x.SUBCTA AS CodigoCuenta, -- VARCHAR(15) partida contable x.CONTRA AS Contrapartida, -- VARCHAR(15) partida contable x.FECHA AS FechaAsiento, -- FECHA(8) @@ -17898,7 +18053,7 @@ BEGIN IF(x.EURODEBE,x.EURODEBE,x.EUROHABER) AS ImporteAsiento, -- DOBLE(19) MONTH(x.FECHA) AS NumeroPeriodo, -- ENT(2) "-1" Al informar este valor se calcula automát. A partir de la fecha de asiento IF( sub2.FECREGCON IS NULL, sub2.FECHA_EX, sub2.FECREGCON) FechaGrabacion, -- FECHA(8) - IFNULL(xmi.CodigoDivisa, cu.code) CodigoDivisa, -- VARCHAR(3) + IFNULL(xmi.CodigoDivisa, sub3.code) CodigoDivisa, -- VARCHAR(3) x.CAMBIO AS ImporteCambio, -- DOBLE(19) IFNULL(x.DEBEME,x.HABERME) AS ImporteDivisa, -- DOBLE(19) IF(x.CAMBIO,1,0) AS FactorCambio, -- DOBLE(19) @@ -17982,8 +18137,10 @@ BEGIN ORDER BY ASIEN, FECREGCON DESC, FECHA_EX DESC ) sub GROUP BY ASIEN )sub2 ON sub2.ASIEN = x.ASIEN - LEFT JOIN vn.bank b ON b.account = x.SUBCTA - LEFT JOIN vn.currency cu ON cu.id = b.currencyFk + LEFT JOIN ( SELECT DISTINCT(account),cu.code + FROM vn.bank b + JOIN vn.currency cu ON cu.id = b.currencyFk + )sub3 ON sub3.account = x.SUBCTA WHERE x.enlazadoSage = 0 AND c.companyCode; @@ -19078,7 +19235,7 @@ BEGIN SET xmi.CodigoRetencion = t.CodigoRetencion, xmi.BaseRetencion = IF (t.CodigoRetencion = 2, sub.taxableBase + sub.taxBase, sub.taxableBase), xmi.PorRetencion = t.PorcentajeRetencion, - xmi.ImporteRetencion = iit.taxableBase + xmi.ImporteRetencion = iit.taxableBase * - 1 WHERE xmi.id = vXDiarioId AND iit.expenceFk= 4751000000 ; END ;; @@ -19353,6 +19510,169 @@ BEGIN DROP TEMPORARY TABLE tmp.invoiceDua; DROP TEMPORARY TABLE tmp.invoiceInList; + + -- ASIENTOS CON IVA SOPORTADO 472. y 477. hay que informar 2 líneas la info de facturas una como tipo de factura emitida y otra como recibida + DROP TEMPORARY TABLE IF EXISTS tmp.XDiario_movConta_IVA; + CREATE TEMPORARY TABLE tmp.XDiario_movConta_IVA + SELECT + sub3.id, + mc.CodigoDivisa, + mc.BaseIva1, + mc.PorBaseCorrectora1, + mc.PorIva1, + mc.CuotaIva1, + mc.PorRecargoEquivalencia1, + mc.RecargoEquivalencia1, + mc.CodigoTransaccion1, + mc.CodigoIva1, + mc.BaseIva2, + mc.PorBaseCorrectora2, + mc.PorIva2, + mc.CuotaIva2, + mc.PorRecargoEquivalencia2, + mc.RecargoEquivalencia2, + mc.CodigoTransaccion2, + mc.CodigoIva2, + mc.BaseIva3, + mc.PorBaseCorrectora3, + mc.PorIva3, + mc.CuotaIva3, + mc.PorRecargoEquivalencia3, + mc.RecargoEquivalencia3, + mc.CodigoTransaccion3, + mc.CodigoIva3, + mc.BaseIva4, + mc.PorBaseCorrectora4, + mc.PorIva4, + mc.CuotaIva4, + mc.PorRecargoEquivalencia4, + mc.RecargoEquivalencia4, + mc.CodigoTransaccion4, + mc.CodigoIva4, + mc.Año, + mc.Serie, + mc.Factura, + mc.SuFacturaNo, + mc.FechaFactura, + mc.ImporteFactura, + 'E', + mc.CodigoCuentaFactura, + mc.CifDni, + mc.Nombre, + mc.CodigoRetencion, + mc.BaseRetencion, + mc.PorRetencion, + mc.ImporteRetencion, + mc.SiglaNacion, + mc.EjercicioFactura, + mc.FechaOperacion, + mc.Exclusion347, + mc.MantenerAsiento, + mc.Metalico347, + mc.ClaveOperacionFactura, + mc.TipoRectificativa, + mc.FechaFacturaOriginal, + mc.CuotaIvaOriginal, + mc.BaseImponibleOriginal, + mc.ClaseAbonoRectificativas, + mc.RecargoEquivalenciaOriginal, + mc.LibreA1, + mc.IvaDeducible1, + mc.IvaDeducible2, + mc.IvaDeducible3, + mc.IvaDeducible4, + mc.FechaGrabacion, + mc.Intracomunitaria, + mc.moveData + FROM sage.XDiario_movConta_IVA mc + JOIN vn.XDiario x ON x.id = mc.id + JOIN (SELECT x.ASIEN, x.id + FROM vn.XDiario x + JOIN(SELECT DISTINCT(x.ASIEN) ASIEN + FROM (SELECT DISTINCT(ASIEN) + FROM vn.XDiario x + WHERE SUBCTA LIKE '472%' AND x.enlazadoSage = FALSE + ) sub JOIN vn.XDiario x ON x.ASIEN = sub.ASIEN + WHERE x.SUBCTA LIKE '477%' + )sub2 ON sub2.ASIEN = x.ASIEN + WHERE x.CONTRA IS NOT NULL AND x.SUBCTA LIKE '477%' + GROUP BY x.ASIEN + )sub3 ON sub3.ASIEN = x.ASIEN; + + INSERT INTO sage.XDiario_movConta_IVA + (`id`, + `CodigoDivisa`, + `BaseIva1`, + `PorBaseCorrectora1`, + `PorIva1`, + `CuotaIva1`, + `PorRecargoEquivalencia1`, + `RecargoEquivalencia1`, + `CodigoTransaccion1`, + `CodigoIva1`, + `BaseIva2`, + `PorBaseCorrectora2`, + `PorIva2`, + `CuotaIva2`, + `PorRecargoEquivalencia2`, + `RecargoEquivalencia2`, + `CodigoTransaccion2`, + `CodigoIva2`, + `BaseIva3`, + `PorBaseCorrectora3`, + `PorIva3`, + `CuotaIva3`, + `PorRecargoEquivalencia3`, + `RecargoEquivalencia3`, + `CodigoTransaccion3`, + `CodigoIva3`, + `BaseIva4`, + `PorBaseCorrectora4`, + `PorIva4`, + `CuotaIva4`, + `PorRecargoEquivalencia4`, + `RecargoEquivalencia4`, + `CodigoTransaccion4`, + `CodigoIva4`, + `Año`, + `Serie`, + `Factura`, + `SuFacturaNo`, + `FechaFactura`, + `ImporteFactura`, + `TipoFactura`, + `CodigoCuentaFactura`, + `CifDni`, + `Nombre`, + `CodigoRetencion`, + `BaseRetencion`, + `PorRetencion`, + `ImporteRetencion`, + `SiglaNacion`, + `EjercicioFactura`, + `FechaOperacion`, + `Exclusion347`, + `MantenerAsiento`, + `Metalico347`, + `ClaveOperacionFactura`, + `TipoRectificativa`, + `FechaFacturaOriginal`, + `CuotaIvaOriginal`, + `BaseImponibleOriginal`, + `ClaseAbonoRectificativas`, + `RecargoEquivalenciaOriginal`, + `LibreA1`, + `IvaDeducible1`, + `IvaDeducible2`, + `IvaDeducible3`, + `IvaDeducible4`, + `FechaGrabacion`, + `Intracomunitaria`, + `moveData`) + SELECT * + FROM tmp.XDiario_movConta_IVA; + DROP TEMPORARY TABLE tmp.XDiario_movConta_IVA; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -20050,6 +20370,24 @@ SET character_set_client = utf8; 1 AS `roleId`*/; SET character_set_client = @saved_cs_client; +-- +-- Temporary table structure for view `User` +-- + +DROP TABLE IF EXISTS `User`; +/*!50001 DROP VIEW IF EXISTS `User`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `User` AS SELECT + 1 AS `id`, + 1 AS `realm`, + 1 AS `username`, + 1 AS `password`, + 1 AS `email`, + 1 AS `emailVerified`, + 1 AS `verificationToken`*/; +SET character_set_client = @saved_cs_client; + -- -- Table structure for table `fieldAcl` -- @@ -20067,25 +20405,6 @@ CREATE TABLE `fieldAcl` ( ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; --- --- Table structure for table `user` --- - -DROP TABLE IF EXISTS `user`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `realm` varchar(512) CHARACTER SET utf8 DEFAULT NULL, - `username` varchar(512) CHARACTER SET utf8 DEFAULT NULL, - `password` varchar(512) CHARACTER SET utf8 NOT NULL, - `email` varchar(512) CHARACTER SET utf8 NOT NULL, - `emailVerified` tinyint(1) DEFAULT NULL, - `verificationToken` varchar(512) CHARACTER SET utf8 DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - -- -- Table structure for table `userConfigView` -- @@ -20728,8 +21047,8 @@ DELIMITER ; /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `log_add_beta__`(IN `vTableName` VARCHAR(255), IN `vNewId` VARCHAR(255), IN `vOldId` VARCHAR(255)) -proc: BEGIN - -- XXX: Disabled while testing +proc: BEGIN + -- XXX: Disabled while testing DECLARE vLanded DATE; DECLARE vWarehouseFk INT; DECLARE vBuyerFk INT; @@ -20737,20 +21056,20 @@ proc: BEGIN DECLARE vItemFk INT; DECLARE vItemName VARCHAR(50); - -- LEAVE proc; + -- LEAVE proc; - IF vOldId IS NOT NULL AND !(vOldId <=> vNewId) THEN - INSERT IGNORE INTO `log` SET - tableName = vTableName, - tableId = vOldId, - operation = 'delete'; - END IF; - - IF vNewId IS NOT NULL THEN - INSERT IGNORE INTO `log` SET - tableName = vTableName, - tableId = vNewId, - operation = 'insert'; + IF vOldId IS NOT NULL AND !(vOldId <=> vNewId) THEN + INSERT IGNORE INTO `log` SET + tableName = vTableName, + tableId = vOldId, + operation = 'delete'; + END IF; + + IF vNewId IS NOT NULL THEN + INSERT IGNORE INTO `log` SET + tableName = vTableName, + tableId = vNewId, + operation = 'insert'; END IF; IF vTableName = 'buy' THEN @@ -20780,7 +21099,7 @@ proc: BEGIN END IF; END IF; - + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -21048,29 +21367,29 @@ CREATE DEFINER=`root`@`%` PROCEDURE `log_refreshSale`( BEGIN DROP TEMPORARY TABLE IF EXISTS tValues; CREATE TEMPORARY TABLE tValues - ENGINE = MEMORY - SELECT - m.id saleFk, - m.ticketFk, - m.itemFk, - t.warehouseFk, - t.shipped, + ENGINE = MEMORY + SELECT + m.id saleFk, + m.ticketFk, + m.itemFk, + t.warehouseFk, + t.shipped, ABS(m.quantity) quantity, m.created, TIMESTAMPADD(DAY, tp.life, t.shipped) expired, m.quantity < 0 isIn, - m.isPicked OR s.alertLevel > 1 isPicked - FROM vn.sale m - JOIN vn.ticket t ON t.id = m.ticketFk + m.isPicked OR s.alertLevel > 1 isPicked + FROM vn.sale m + JOIN vn.ticket t ON t.id = m.ticketFk JOIN vn.ticketState s ON s.ticketFk = t.id JOIN vn.item i ON i.id = m.itemFk - JOIN vn.itemType tp ON tp.id = i.typeFk + JOIN vn.itemType tp ON tp.id = i.typeFk WHERE ( - vTableId IS NULL - OR (vTableName = 'ticket' AND t.id = vTableId) - OR (vTableName = 'sale' AND m.id = vTableId) - ) - AND t.shipped >= vn.getInventoryDate() + vTableId IS NULL + OR (vTableName = 'ticket' AND t.id = vTableId) + OR (vTableName = 'sale' AND m.id = vTableId) + ) + AND t.shipped >= vn.getInventoryDate() AND m.quantity != 0; REPLACE INTO inbound ( @@ -21103,7 +21422,7 @@ BEGIN FROM tValues WHERE !isIn; - DROP TEMPORARY TABLE tValues; + DROP TEMPORARY TABLE tValues; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -21530,6 +21849,7 @@ DROP TABLE IF EXISTS `version`; CREATE TABLE `version` ( `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `number` char(11) COLLATE utf8_unicode_ci NOT NULL, + `gitCommit` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; @@ -21546,6 +21866,7 @@ CREATE TABLE `versionUser` ( `code` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `user` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `number` char(11) COLLATE utf8_unicode_ci NOT NULL, + `gitCommit` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`code`,`user`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; @@ -22788,6 +23109,23 @@ SET character_set_client = utf8; 1 AS `holidayEntitlementRate`*/; SET character_set_client = @saved_cs_client; +-- +-- Temporary table structure for view `accounting` +-- + +DROP TABLE IF EXISTS `accounting`; +/*!50001 DROP VIEW IF EXISTS `accounting`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `accounting` AS SELECT + 1 AS `id`, + 1 AS `bank`, + 1 AS `account`, + 1 AS `accountingTypeFk`, + 1 AS `entityFk`, + 1 AS `isActive`*/; +SET character_set_client = @saved_cs_client; + -- -- Table structure for table `accountingType` -- @@ -23380,6 +23718,7 @@ CREATE TABLE `botanicExport` ( `restriction` enum('Sin restriccion','Importacion Prohibida','pasaporte fitosanitario','pasaporte individual','declaracion origen') CHARACTER SET utf8 NOT NULL, `description` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, `isProtectedZone` tinyint(1) NOT NULL DEFAULT '0', + `code` enum('importProhibited','phytosanitaryPassport','individualPassport') COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `Id_Paises` (`countryFk`), KEY `botanicExport_ibfk_2_idx` (`ediGenusFk`), @@ -23725,6 +24064,19 @@ CREATE TABLE `buyMark` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Temporary table structure for view `buyer` +-- + +DROP TABLE IF EXISTS `buyer`; +/*!50001 DROP VIEW IF EXISTS `buyer`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `buyer` AS SELECT + 1 AS `userFk`, + 1 AS `nickname`*/; +SET character_set_client = @saved_cs_client; + -- -- Table structure for table `calendar` -- @@ -24796,6 +25148,26 @@ DELIMITER ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; +-- +-- Table structure for table `cmr_expeditionPallet` +-- + +DROP TABLE IF EXISTS `cmr_expeditionPallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `cmr_expeditionPallet` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cmrFk` int(11) NOT NULL, + `expeditionPalletFk` int(11) NOT NULL, + `scanned` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `cmr_expeditionPallet_fk1_idx` (`cmrFk`), + KEY `cmr_expeditionPallet_fk2_idx` (`expeditionPalletFk`), + CONSTRAINT `cmr_expeditionPallet_fk1` FOREIGN KEY (`cmrFk`) REFERENCES `cmr` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `cmr_expeditionPallet_fk2` FOREIGN KEY (`expeditionPalletFk`) REFERENCES `expeditionPallet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='relaciona los cmr con los pallets de expediciones'; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Temporary table structure for view `cmr_list` -- @@ -24828,6 +25200,7 @@ SET character_set_client = utf8; 1 AS `warehouseAddress`, 1 AS `shipped`, 1 AS `clientOficialName`, + 1 AS `supplierFk`, 1 AS `carrierName`, 1 AS `carrierStreet`, 1 AS `carrierPostCode`, @@ -25366,7 +25739,9 @@ CREATE TABLE `country` ( `isUeeMember` tinyint(4) NOT NULL DEFAULT '0', `ibanLength` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`), - KEY `Id_Paisreal` (`politicalCountryFk`) + KEY `Id_Paisreal` (`politicalCountryFk`), + KEY `currency_id_fk_idx` (`currencyFk`), + CONSTRAINT `currency_id_fk` FOREIGN KEY (`currencyFk`) REFERENCES `currency` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; @@ -26673,13 +27048,13 @@ CREATE TABLE `entryLog` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `entryShelving` +-- Table structure for table `entryShelving__` -- -DROP TABLE IF EXISTS `entryShelving`; +DROP TABLE IF EXISTS `entryShelving__`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `entryShelving` ( +CREATE TABLE `entryShelving__` ( `id` int(11) NOT NULL AUTO_INCREMENT, `entryFk` int(11) NOT NULL DEFAULT '204539', `shelvingFk` varchar(10) CHARACTER SET utf8 NOT NULL, @@ -27405,7 +27780,7 @@ DROP TABLE IF EXISTS `floramondoConfig`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `floramondoConfig` ( - `id` int(11) NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, `entryFk` int(11) DEFAULT NULL COMMENT 'ultima entrada de floramondo', `nextLanded` datetime DEFAULT NULL, `warehouseInFk` smallint(6) unsigned DEFAULT NULL, @@ -27418,8 +27793,26 @@ CREATE TABLE `floramondoConfig` ( CONSTRAINT `floramondoConfigAgencyModeFk` FOREIGN KEY (`agencyModeFk`) REFERENCES `agencyMode` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `floramondoConfigWarehouseInFk` FOREIGN KEY (`warehouseInFk`) REFERENCES `warehouse` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `floramondoConfigWarehouseOutFk` FOREIGN KEY (`warehouseOutFk`) REFERENCES `warehouse` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER `vn`.`floramondoConfig_AFTER_INSERT` AFTER INSERT ON `floramondoConfig` FOR EACH ROW +BEGIN + CALL util.throw ("Tabla config no permite añadir más registros"); +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 */ ; -- -- Table structure for table `fuelType` @@ -27786,6 +28179,24 @@ SET character_set_client = utf8; 1 AS `dua`*/; SET character_set_client = @saved_cs_client; +-- +-- Temporary table structure for view `invoiceInDueDay__` +-- + +DROP TABLE IF EXISTS `invoiceInDueDay__`; +/*!50001 DROP VIEW IF EXISTS `invoiceInDueDay__`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `invoiceInDueDay__` AS SELECT + 1 AS `id`, + 1 AS `invoiceInFk`, + 1 AS `dueDated`, + 1 AS `bankFk`, + 1 AS `amount`, + 1 AS `foreignValue`, + 1 AS `created`*/; +SET character_set_client = @saved_cs_client; + -- -- Temporary table structure for view `invoiceInEntry__` -- @@ -27803,6 +28214,20 @@ SET character_set_client = utf8; 1 AS `isBooked`*/; SET character_set_client = @saved_cs_client; +-- +-- Temporary table structure for view `invoiceInIntrastat__` +-- + +DROP TABLE IF EXISTS `invoiceInIntrastat__`; +/*!50001 DROP VIEW IF EXISTS `invoiceInIntrastat__`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `invoiceInIntrastat__` AS SELECT + 1 AS `invoiceInFk`, + 1 AS `intrastatFk`, + 1 AS `amount`*/; +SET character_set_client = @saved_cs_client; + -- -- Table structure for table `invoiceInSerial` -- @@ -27974,12 +28399,12 @@ DELIMITER ; /*!50003 SET character_set_results = utf8 */ ; /*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER `vn`.`invoiceOut_beforeUpdate` BEFORE UPDATE ON `vn`.`invoiceOut` FOR EACH ROW BEGIN - CALL clientRisk_update (OLD.clientFk, OLD.companyFk, -OLD.amount); - CALL clientRisk_update (NEW.clientFk, NEW.companyFk, NEW.amount); +CALL clientRisk_update (OLD.clientFk, OLD.companyFk, -OLD.amount); +CALL clientRisk_update (NEW.clientFk, NEW.companyFk, NEW.amount); END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -28084,7 +28509,7 @@ CREATE TABLE `item` ( `stems` int(11) DEFAULT '1', `minPrice` double DEFAULT '0', `isToPrint` tinyint(1) NOT NULL DEFAULT '0', - `isDeliveryNote` tinyint(1) NOT NULL DEFAULT '0', + `isDeliveryNote__` tinyint(1) NOT NULL DEFAULT '0', `taxClassFk` tinyint(4) unsigned NOT NULL DEFAULT '1', `family` varchar(3) COLLATE utf8_unicode_ci DEFAULT 'VT', `box` tinyint(1) NOT NULL DEFAULT '0', @@ -28819,6 +29244,7 @@ CREATE TABLE `itemShelving` ( `packagingFk` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, `level` varchar(45) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', `userFk` int(10) unsigned DEFAULT NULL, + `stars` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `itemShelving_fk1_idx` (`itemFk`), KEY `itemShelving_fk2_idx` (`shelvingFk`), @@ -29491,19 +29917,6 @@ SET character_set_client = utf8; 1 AS `newId`*/; SET character_set_client = @saved_cs_client; --- --- Table structure for table `kk` --- - -DROP TABLE IF EXISTS `kk`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `kk` ( - `pasillo` varchar(3) COLLATE utf8_unicode_ci NOT NULL, - PRIMARY KEY (`pasillo`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - -- -- Temporary table structure for view `labelInfo` -- @@ -31902,6 +32315,7 @@ CREATE TABLE `saleMistake` ( `saleFk` int(11) NOT NULL, `userFk` int(11) NOT NULL, `typeFk` int(11) NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `saleMistake_fk1_idx` (`saleFk`), KEY `saleMistake_fk2_idx` (`userFk`), @@ -31912,6 +32326,23 @@ CREATE TABLE `saleMistake` ( ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Temporary table structure for view `saleMistake_list` +-- + +DROP TABLE IF EXISTS `saleMistake_list`; +/*!50001 DROP VIEW IF EXISTS `saleMistake_list`*/; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `saleMistake_list` AS SELECT + 1 AS `saleFk`, + 1 AS `sacador`, + 1 AS `created`, + 1 AS `revisador`, + 1 AS `description`, + 1 AS `controlled`*/; +SET character_set_client = @saved_cs_client; + -- -- Table structure for table `saleState` -- @@ -32709,6 +33140,54 @@ CREATE TABLE `supplierAccount` ( KEY `fk_banco_prov_account_idx` (`bankFk`) ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER supplierAccount_AfterInsert +AFTER INSERT +ON supplierAccount FOR EACH ROW +BEGIN + + INSERT INTO vn.mail(`sender`, subject, `body`) + SELECT 'finanzas@verdnatura.es', + CONCAT('Añadida cuenta bancaria al proveedor: ', NEW.supplierFk), + CONCAT(account.myUserGetName(), ' ha añadido: ', + NEW.iban, ', entidad: ', be.name, ', bic: ', be.bic) + FROM bankEntity be + WHERE be.id = NEW.bankEntityFk; +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 */ ; + +-- +-- Table structure for table `supplierContact` +-- + +DROP TABLE IF EXISTS `supplierContact`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `supplierContact` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `supplierFk` int(11) DEFAULT NULL, + `phone` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL, + `mobile` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL, + `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + `observation` text COLLATE utf8_unicode_ci, + `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `supplier_id` (`supplierFk`), + CONSTRAINT `supplier_id` FOREIGN KEY (`supplierFk`) REFERENCES `supplier` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `supplierExpense` @@ -33103,16 +33582,17 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`%`*/ /*!50003 TRIGGER `ticket_beforeUpdate` BEFORE UPDATE ON `ticket` FOR EACH ROW BEGIN + DECLARE vNewTime TIME; IF !(NEW.shipped <=> OLD.shipped) THEN IF YEAR(NEW.shipped) < 2000 THEN SIGNAL SQLSTATE '46000' @@ -33134,6 +33614,25 @@ BEGIN IF NEW.routeFk AND NEW.isDeleted THEN CALL util.throw ('This ticket is deleted'); END IF; + + IF !(NEW.routeFk <=> OLD.routeFk) AND NEW.routeFk IS NOT NULL THEN + SELECT MAX(TIME(shipped)) INTO vNewTime + FROM vn.ticket + WHERE routeFk = NEW.routeFk + HAVING MAX(TIME(shipped)) > TIME(NEW.shipped); + + IF vNewTime THEN + SET NEW.shipped = TIMESTAMP(DATE(NEW.shipped), vNewTime); + INSERT INTO vn.ticketLog + SET originFk = NEW.id, + userFk = account.myUser_getId(), + `action` = 'update', + description = CONCAT('Cambia la hora por cambio de ruta de ', + TIME(OLD.shipped), + ' a ', + TIME(NEW.shipped)); + END IF; + END IF; END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -33143,9 +33642,9 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; @@ -33158,25 +33657,7 @@ BEGIN OR !(NEW.shipped <=> OLD.shipped) THEN CALL stock.log_add('ticket', NEW.id, OLD.id); END IF; - - IF !(NEW.addressFk <=> OLD.addressFk) THEN - DELETE t - FROM ticketObservation t - JOIN observationType ot ON ot.id = t.observationTypeFk - WHERE t.ticketFk = NEW.id AND - ot.description = 'Repartidor'; - IF ROW_COUNT() > 0 THEN - INSERT INTO ticketLog (originFk, userFk, action, description) - VALUES (NEW.id, account.userGetId(), 'delete', CONCAT ('Notas de repartidor por cambio de consignatario')); - END IF; - INSERT INTO ticketObservation(ticketFk, observationTypeFk, description) - SELECT NEW.id, ao.observationTypeFk, ao.description - FROM addressObservation ao - JOIN address a ON a.id = ao.addressFk - JOIN observationType ot ON ot.id = ao.observationTypeFk - WHERE a.id = NEW.addressFk AND - ot.description = 'Repartidor'; - END IF; + IF NEW.clientFk = 2067 AND !(NEW.clientFk <=> OLD.clientFk) THEN -- Fallo que se insertan no se sabe como tickets en este cliente INSERT INTO vn.mail SET @@ -33834,13 +34315,13 @@ CREATE TABLE `ticketWeekly` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `ticket_print` +-- Table structure for table `ticket_print__` -- -DROP TABLE IF EXISTS `ticket_print`; +DROP TABLE IF EXISTS `ticket_print__`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `ticket_print` ( +CREATE TABLE `ticket_print__` ( `ticketFk` int(11) NOT NULL, `isPrinted` tinyint(1) NOT NULL DEFAULT '0', `counter` int(11) NOT NULL DEFAULT '0', @@ -34386,6 +34867,23 @@ CREATE TABLE `travelThermograph` ( ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Registra cada termografo que se ha introducido en cada travel'; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `trolley` +-- + +DROP TABLE IF EXISTS `trolley`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `trolley` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `workerFk` int(11) DEFAULT NULL, + `coupled` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `trolley_FK` (`workerFk`), + CONSTRAINT `trolley_FK` FOREIGN KEY (`workerFk`) REFERENCES `worker` (`id`) ON DELETE SET NULL ON UPDATE CASCADE +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Temporary table structure for view `user` -- @@ -34510,6 +35008,41 @@ CREATE TABLE `vehicle` ( ) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `wagon` +-- + +DROP TABLE IF EXISTS `wagon`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wagon` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `volume` int(11) NOT NULL DEFAULT '150' COMMENT 'Volumen en litros', + `plate` varchar(10) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Matrícula', + PRIMARY KEY (`id`) +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `wagonVolumetry` +-- + +DROP TABLE IF EXISTS `wagonVolumetry`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `wagonVolumetry` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `level` int(10) unsigned NOT NULL DEFAULT '0', + `lines` int(10) unsigned NOT NULL DEFAULT '1', + `liters` int(10) unsigned NOT NULL DEFAULT '0', + `height` int(10) unsigned NOT NULL DEFAULT '20', + `wagonFk` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `wagonVolumetry_FK` (`wagonFk`), + CONSTRAINT `wagonVolumetry_FK` FOREIGN KEY (`wagonFk`) REFERENCES `wagon` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDBDEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `warehouse` -- @@ -35864,90 +36397,90 @@ DELIMITER ;; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ;; /*!50003 SET @saved_time_zone = @@time_zone */ ;; /*!50003 SET time_zone = 'SYSTEM' */ ;; -/*!50106 CREATE*/ /*!50117 DEFINER=`z-sysadmin`@`%`*/ /*!50106 EVENT `printQueue_check` ON SCHEDULE EVERY 10 MINUTE STARTS '2019-11-08 00:00:00' ON COMPLETION PRESERVE ENABLE COMMENT 'Notifica en caso de que el servidor de impresión este parado' DO BEGIN - - DECLARE vCurrentCount INT; - DECLARE vCheckSum INT; - DECLARE vIsAlreadyNotified BOOLEAN; - DECLARE vTableQueue TEXT; - DECLARE vLineQueue TEXT; - DECLARE vDone BOOL DEFAULT FALSE; - DECLARE vCur CURSOR FOR - SELECT CONCAT(' - ', IFNULL(pq.id, ''), ' - ', IFNULL(p.path, ''),' - ', IFNULL(i.Informe, ''),' - ', IFNULL(e.Estado, ''),' - ', IFNULL(w.firstname, ''), " ", IFNULL(w.lastName, ''),' - ', IFNULL(pq.`error`, ''),' - ') - FROM vn.printingQueue pq - LEFT JOIN vn.worker w ON w.id = pq.worker - LEFT JOIN vn.printer p ON p.id = pq.printer - LEFT JOIN vn2008.Informes i ON i.Id_Informe = pq.report - JOIN vn2008.Estados e ON e.Id_Estado = pq.state - LIMIT 30; - - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET vDone = TRUE; - - SELECT COUNT(*), IFNULL(SUM(id),0) INTO vCurrentCount, vCheckSum - FROM vn.printingQueue WHERE state = 1; - - SELECT isAlreadyNotified INTO vIsAlreadyNotified - FROM printingQueueCheck; - - IF (SELECT lastCount FROM printingQueueCheck) = vCurrentCount AND - (SELECT lastCheckSum FROM printingQueueCheck) = vCheckSum AND - vIsAlreadyNotified = FALSE AND vCurrentCount > 0 - THEN - - SELECT ' - - - - - - - - ' INTO vTableQueue; - - OPEN vCur; - - l: LOOP - - SET vDone = FALSE; - - FETCH vCur INTO vLineQueue; - - IF vDone THEN - LEAVE l; - END IF; - - SELECT CONCAT(vTableQueue, vLineQueue) INTO vTableQueue; - - END LOOP; - - CLOSE vCur; - - INSERT INTO vn2008.mail (`to`, subject, text) - VALUES ('cau@verdnatura.es, sysadmin@verdnatura.es', - 'servidor de impresion parado', - CONCAT('Hay ', vCurrentCount, ' lineas bloqueadas', vTableQueue, '
Id ColaRuta ImpresoraInformeEstadoTrabajadorError
')); - - UPDATE printingQueueCheck SET isAlreadyNotified = TRUE; - END IF; - - IF (SELECT lastCount FROM printingQueueCheck) > vCurrentCount AND - vIsAlreadyNotified = TRUE - THEN - UPDATE printingQueueCheck SET isAlreadyNotified = FALSE; - END IF; - - UPDATE printingQueueCheck - SET lastCount = vCurrentCount, - lastCheckSum = vCheckSum; - +/*!50106 CREATE*/ /*!50117 DEFINER=`z-sysadmin`@`%`*/ /*!50106 EVENT `printQueue_check` ON SCHEDULE EVERY 10 MINUTE STARTS '2019-11-08 00:00:00' ON COMPLETION PRESERVE ENABLE COMMENT 'Notifica en caso de que el servidor de impresión este parado' DO BEGIN + + DECLARE vCurrentCount INT; + DECLARE vCheckSum INT; + DECLARE vIsAlreadyNotified BOOLEAN; + DECLARE vTableQueue TEXT; + DECLARE vLineQueue TEXT; + DECLARE vDone BOOL DEFAULT FALSE; + DECLARE vCur CURSOR FOR + SELECT CONCAT(' + ', IFNULL(pq.id, ''), ' + ', IFNULL(p.path, ''),' + ', IFNULL(i.Informe, ''),' + ', IFNULL(e.Estado, ''),' + ', IFNULL(w.firstname, ''), " ", IFNULL(w.lastName, ''),' + ', IFNULL(pq.`error`, ''),' + ') + FROM vn.printingQueue pq + LEFT JOIN vn.worker w ON w.id = pq.worker + LEFT JOIN vn.printer p ON p.id = pq.printer + LEFT JOIN vn2008.Informes i ON i.Id_Informe = pq.report + JOIN vn2008.Estados e ON e.Id_Estado = pq.state + LIMIT 30; + + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + SELECT COUNT(*), IFNULL(SUM(id),0) INTO vCurrentCount, vCheckSum + FROM vn.printingQueue WHERE state = 1; + + SELECT isAlreadyNotified INTO vIsAlreadyNotified + FROM printingQueueCheck; + + IF (SELECT lastCount FROM printingQueueCheck) = vCurrentCount AND + (SELECT lastCheckSum FROM printingQueueCheck) = vCheckSum AND + vIsAlreadyNotified = FALSE AND vCurrentCount > 0 + THEN + + SELECT ' + + + + + + + + ' INTO vTableQueue; + + OPEN vCur; + + l: LOOP + + SET vDone = FALSE; + + FETCH vCur INTO vLineQueue; + + IF vDone THEN + LEAVE l; + END IF; + + SELECT CONCAT(vTableQueue, vLineQueue) INTO vTableQueue; + + END LOOP; + + CLOSE vCur; + + INSERT INTO vn2008.mail (`to`, subject, text) + VALUES ('cau@verdnatura.es, sysadmin@verdnatura.es', + 'servidor de impresion parado', + CONCAT('Hay ', vCurrentCount, ' lineas bloqueadas', vTableQueue, '
Id ColaRuta ImpresoraInformeEstadoTrabajadorError
')); + + UPDATE printingQueueCheck SET isAlreadyNotified = TRUE; + END IF; + + IF (SELECT lastCount FROM printingQueueCheck) > vCurrentCount AND + vIsAlreadyNotified = TRUE + THEN + UPDATE printingQueueCheck SET isAlreadyNotified = FALSE; + END IF; + + UPDATE printingQueueCheck + SET lastCount = vCurrentCount, + lastCheckSum = vCheckSum; + END */ ;; /*!50003 SET time_zone = @saved_time_zone */ ;; /*!50003 SET sql_mode = @saved_sql_mode */ ;; @@ -36008,6 +36541,45 @@ DELIMITER ;; /*!50003 SET character_set_client = @saved_cs_client */ ;; /*!50003 SET character_set_results = @saved_cs_results */ ;; /*!50003 SET collation_connection = @saved_col_connection */ ;; +/*!50106 DROP EVENT IF EXISTS `workerTimeControl_sendMail` */;; +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 = 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 = 'NO_ENGINE_SUBSTITUTION' */ ;; +/*!50003 SET @saved_time_zone = @@time_zone */ ;; +/*!50003 SET time_zone = 'SYSTEM' */ ;; +/*!50106 CREATE*/ /*!50117 DEFINER=`root`@`%`*/ /*!50106 EVENT `workerTimeControl_sendMail` ON SCHEDULE EVERY 1 WEEK STARTS '2020-11-25 08:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN + DECLARE vDone BOOL; + DECLARE vWeek,vYear INT; + DECLARE rs CURSOR FOR + SELECT week,year + FROM vn.time + WHERE dated IN (DATE_ADD(CURDATE(), INTERVAL -10 DAY), DATE_ADD(CURDATE(), INTERVAL -4 DAY)) + GROUP BY year,week; + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + OPEN rs; + myLoop: LOOP + SET vDone = FALSE; + FETCH rs INTO vWeek, vYear; + IF vDone THEN + LEAVE myLoop; + END IF; + CALL vn.workerTimeControl_sendMail(vWeek, vYear, NULL); + END LOOP; + CLOSE rs; +END */ ;; +/*!50003 SET time_zone = @saved_time_zone */ ;; +/*!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 */ ;; /*!50106 DROP EVENT IF EXISTS `zoneGeo_doCalc` */;; DELIMITER ;; /*!50003 SET @saved_cs_client = @@character_set_client */ ;; @@ -36394,7 +36966,7 @@ BEGIN JOIN itemBotanical ib ON be.ediGenusFk = ib.genusFk AND IFNULL(be.ediSpecieFk, ib.specieFk) = ib.specieFk - AND be.restriction = 'pasaporte fitosanitario' + AND be.`code` = 'phytosanitaryPassport' JOIN item i ON i.id = ib.itemFk JOIN itemType it ON it.id = i.typeFk WHERE ib.itemFk = vItemFk @@ -37381,13 +37953,13 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` FUNCTION `floramondo_getEntry`(vLanded DATETIME) RETURNS int(11) +CREATE DEFINER=`root`@`%` FUNCTION `floramondo_getEntry`(vLanded DATETIME, vWarehouseFk INT) RETURNS int(11) READS SQL DATA BEGIN @@ -37395,9 +37967,10 @@ BEGIN DECLARE vEntryFk INT; DECLARE previousEntryFk INT; - SET vTravelFk = floramondo_getTravel(vLanded); + SET vTravelFk = floramondo_getTravel(vLanded, vWarehouseFk); IF vLanded THEN + SELECT IFNULL(MAX(id),0) INTO vEntryFk FROM vn.entry WHERE travelFk = vTravelFk AND isRaid; @@ -37416,18 +37989,32 @@ BEGIN WHERE travelFk = vTravelFk; END IF; + END IF; - SELECT entryFk INTO previousEntryFk FROM floramondoConfig; + SELECT entryFk INTO previousEntryFk + FROM floramondoConfig + WHERE warehouseInFk = vWarehouseFk; + IF NOT (previousEntryFk <=> vEntryFk) THEN + DELETE FROM buy WHERE entryFk = previousEntryFk; + DELETE FROM entry WHERE id = previousEntryFk; - UPDATE floramondoConfig SET entryFk = vEntryFk; - UPDATE floramondoConfig SET nextLanded = vLanded - WHERE vLanded IS NOT NULL; + + UPDATE floramondoConfig + SET entryFk = vEntryFk + WHERE warehouseInFk = vWarehouseFk; + + UPDATE floramondoConfig + SET nextLanded = vLanded + WHERE vLanded IS NOT NULL + AND warehouseInFk = vWarehouseFk; + END IF; RETURN vEntryFk; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -37438,19 +38025,19 @@ 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 = utf8mb4 */ ; -/*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_general_ci */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` FUNCTION `floramondo_getTravel`(vLanded DATE) RETURNS int(11) +CREATE DEFINER=`root`@`%` FUNCTION `floramondo_getTravel`(vLanded DATE, vWarehouseFk INT) RETURNS int(11) READS SQL DATA BEGIN DECLARE vTravelFk INT; DECLARE vWarehouseOutName VARCHAR(50) DEFAULT 'Holanda'; - DECLARE vWarehouseInName VARCHAR(50) DEFAULT 'VNH'; + -- DECLARE vWarehouseInName VARCHAR(50) DEFAULT 'VNH'; DECLARE vAgencyModeName VARCHAR(50) DEFAULT 'HOLANDA DIRECTO'; IF vLanded THEN @@ -37459,7 +38046,7 @@ BEGIN JOIN vn.warehouse wIn ON wIn.id = tr.warehouseInFk JOIN vn.warehouse wOut ON wOut.id = tr.warehouseOutFk JOIN vn.agencyMode am ON am.id = tr.agencyFk - WHERE wIn.name = vWarehouseInName + WHERE wIn.id = vWarehouseFk AND wOut.name = vWarehouseOutName AND am.name = vAgencyModeName AND landed = vLanded; @@ -37467,22 +38054,24 @@ BEGIN IF NOT vTravelFk THEN INSERT INTO vn.travel(landed, shipped, warehouseInFk, warehouseOutFk, agencyFk) - SELECT vLanded, curdate(), wIn.id, wOut.id, am.id - FROM vn.warehouse wIn - JOIN vn.warehouse wOut ON wOut.name = vWarehouseOutName + SELECT vLanded, curdate(), vWarehouseFk, wOut.id, am.id + FROM vn.warehouse wOut JOIN vn.agencyMode am ON am.name = vAgencyModeName - WHERE wIn.name = vWarehouseInName; + WHERE wOut.name = vWarehouseOutName; SELECT MAX(tr.id) INTO vTravelFk FROM vn.travel tr JOIN vn.warehouse wIn ON wIn.id = tr.warehouseInFk JOIN vn.warehouse wOut ON wOut.id = tr.warehouseOutFk - WHERE wIn.name = vWarehouseInName + WHERE wIn.id = vWarehouseFk AND wOut.name = vWarehouseOutName AND landed = vLanded; END IF; + END IF; + RETURN vTravelFk; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -38717,6 +39306,35 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP FUNCTION IF EXISTS `item_getFhImage` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` FUNCTION `item_getFhImage`(itemFk INT) RETURNS varchar(255) CHARSET utf8 COLLATE utf8_unicode_ci + DETERMINISTIC +BEGIN + DECLARE vImageUrl VARCHAR(255); + SELECT sr.PictureReference INTO vImageUrl + FROM vn.buy b + JOIN edi.ekt e ON b.ektFk = e.id + JOIN edi.supplyResponse sr ON sr.Item_ArticleCode =e.`ref` + JOIN vn.item i ON i.id = b.itemFk + WHERE b.itemFk = itemFk + ORDER BY (sr.EmbalageCode = e.package) DESC + LIMIT 1; + RETURN vImageUrl; +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 DROP FUNCTION IF EXISTS `item_getVolume` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; @@ -38742,7 +39360,7 @@ BEGIN SELECT SUM(IF(p.volume > 0, p.volume, - p.width * p.depth * IF(p.height, p.height, IFNULL(i.size,60) + 10) + p.width * p.depth * IF(IFNULL(p.height,0), p.height, IFNULL(i.size,60) + 10) )) INTO vVolume FROM packaging p JOIN item i ON i.id = vSelf @@ -38995,13 +39613,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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `phytoPassport`(vRef VARCHAR(15)) RETURNS text CHARSET utf8 + DETERMINISTIC BEGIN DECLARE vPhyto TEXT CHARSET utf8 COLLATE utf8_unicode_ci; SELECT @@ -39026,7 +39645,7 @@ FROM JOIN itemBotanicalWithGenus ib ON ib.itemFk = i.id JOIN - botanicExport be ON be.restriction = 'pasaporte fitosanitario' + botanicExport be ON be.`code` = 'phytosanitaryPassport' LEFT JOIN ediGenus eg ON eg.id = be.ediGenusFk LEFT JOIN @@ -40170,11 +40789,11 @@ DELIMITER ; /*!50003 SET character_set_results = utf8 */ ; /*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `addNoteFromDelivery`(idTicket INT,nota TEXT) BEGIN - + DECLARE observationTypeFk INT DEFAULT 3; /*3 = REPARTIDOR*/ INSERT INTO ticketObservation(ticketFk,observationTypeFk,description) @@ -40451,7 +41070,7 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `algemesi_silla` */; +/*!50003 DROP PROCEDURE IF EXISTS `algemesi_silla__` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; @@ -40461,7 +41080,7 @@ DELIMITER ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `algemesi_silla`(vDate DATE, vItemFk INT, vQuantity INT) +CREATE DEFINER=`root`@`%` PROCEDURE `algemesi_silla__`(vDate DATE, vItemFk INT, vQuantity INT) BEGIN DECLARE done INT DEFAULT FALSE; @@ -41843,6 +42462,9 @@ proc: BEGIN DECLARE vDiscountLastItemComponent INT DEFAULT 32; DECLARE vExtraBaggedComponent INT DEFAULT 38; DECLARE vManaAutoComponent INT DEFAULT 39; + DECLARE vFrenchOffer INT DEFAULT 42; + DECLARE vIsFrenchVNHBuyer BOOLEAN DEFAULT FALSE; + DECLARE vVNHWarehouseFk INT DEFAULT 7; SELECT volume INTO vBoxVolume FROM vn.packaging @@ -41851,6 +42473,14 @@ proc: BEGIN SELECT clientFk INTO vClientFK FROM address WHERE id = vAddressFk; + + SELECT (c.country = 'FRANCIA' AND vWarehouseFk = vVNHWarehouseFk) + INTO vIsFrenchVNHBuyer + FROM vn.country c + JOIN vn.province p ON p.countryFk = c.id + JOIN vn.address a ON a.provinceFk = p.id + WHERE a.id = vAddressFk; + SET @rate2 := 0; SET @rate3 := 0; @@ -41889,6 +42519,7 @@ proc: BEGIN WHERE b.buyingValue + b.freightValue + b.packageValue + b.comissionValue > 0.01 AND ic.display <> 0 AND tl.zoneFk = vZoneFk AND tl.warehouseFk = vWarehouseFk; + -- Coste INSERT INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost) SELECT tcc.warehouseFk, @@ -41897,7 +42528,8 @@ proc: BEGIN b.buyingValue + b.freightValue + b.packageValue + b.comissionValue FROM tmp.ticketComponentCalculate tcc JOIN buy b ON b.id = tcc.buyFk; - + + -- Margen INSERT INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost) SELECT tcc.warehouseFk, @@ -41906,6 +42538,19 @@ proc: BEGIN tcc.rate3 - b.buyingValue - b.freightValue - b.packageValue - b.comissionValue FROM tmp.ticketComponentCalculate tcc JOIN buy b ON b.id = tcc.buyFk; + + -- French Offer: revisar a partir de Mayo 2021 + IF vIsFrenchVNHBuyer THEN + + INSERT INTO tmp.ticketComponent(warehouseFk, itemFk, componentFk, cost) + SELECT tcc.warehouseFk, + tcc.itemFk, + vFrenchOffer, + - tcc.rate3 + b.buyingValue + b.freightValue + b.packageValue + b.comissionValue + ((b.buyingValue + b.freightValue + b.packageValue + b.comissionValue) * 0.06) + FROM tmp.ticketComponentCalculate tcc + JOIN buy b ON b.id = tcc.buyFk; + + END IF; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentBase; CREATE TEMPORARY TABLE tmp.ticketComponentBase ENGINE = MEMORY @@ -41951,6 +42596,9 @@ proc: BEGIN LEFT JOIN specialPrice sp ON sp.clientFk = vClientFk AND sp.itemFk = tcc.itemFk WHERE sp.value IS NULL; + + + DROP TEMPORARY TABLE IF EXISTS tmp.zone; CREATE TEMPORARY TABLE IF NOT EXISTS tmp.zone (INDEX (id)) ENGINE = MEMORY @@ -41963,7 +42611,7 @@ proc: BEGIN tcc.itemFk, vDeliveryComponent, vGeneralInflationCoefficient - * ROUND(ic.cm3delivery * IFNULL((zo.price - zo.bonus),50) / vBoxVolume, 4) cost + * ROUND(ic.cm3delivery * (IFNULL(zo.price,5000) - IFNULL(zo.bonus,0)) / vBoxVolume, 4) cost /* * ROUND(( i.compression -- PAK 2020/06/19 @@ -42263,6 +42911,21 @@ BEGIN FROM vn.entry e JOIN tmp.entryToDelete tmp ON tmp.id = e.id; + -- borrar de route registros menores a 4 años + DROP TEMPORARY TABLE IF EXISTS tmp.routeToDelete; + CREATE TEMPORARY TABLE tmp.routeToDelete + SELECT * + FROM vn.route r + WHERE created < TIMESTAMPADD(YEAR,-4,CURDATE()); + + UPDATE tmp.routeToDelete tmp + JOIN vn.dms d ON d.id = tmp.gestdocFk + SET d.dmsTypeFk = vTrashId; + + DELETE r + FROM tmp.routeToDelete tmp + JOIN vn.route r ON r.id = tmp.id; + DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete; DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete; @@ -43207,54 +43870,54 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `clientRemoveWorker__`() -BEGIN - DECLARE done BOOL DEFAULT FALSE; - DECLARE vClientFk INT; - - DECLARE rs CURSOR FOR - SELECT c.clientFk - FROM tmp.clientGetDebt c - LEFT JOIN tmp.risk r ON r.clientFk = c.clientFk - WHERE IFNULL(r.risk,0) = 0; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - DROP TEMPORARY TABLE IF EXISTS tmp.clientGetDebt; - CREATE TEMPORARY TABLE tmp.clientGetDebt - SELECT cd.id as clientFk - FROM bs.clientDied cd - LEFT JOIN vn.clientProtected cp ON cp.clientFk = cd.id - JOIN vn.client c ON c.id = cd.id - JOIN vn.province p ON p.id = c.provinceFk - JOIN vn.country co ON co.id = p.countryFk - WHERE cd.Aviso = 'TERCER AVISO' - AND cp.clientFk IS NULL - AND co.country NOT IN ('Portugal','Francia','España exento') - AND c.salesPersonFk IS NOT NULL; - - CALL vn.clientGetDebt(curdate()); - - DROP TEMPORARY TABLE IF EXISTS tmp.contador; - CREATE TEMPORARY TABLE tmp.contador (id INT) - ENGINE = MEMORY; - - OPEN rs; - FETCH rs INTO vClientFk; - - WHILE NOT done DO - INSERT INTO tmp.contador SET id = vClientFk; - CALL vn.clientGreugeSpray(vClientFk, TRUE, '',TRUE); +BEGIN + DECLARE done BOOL DEFAULT FALSE; + DECLARE vClientFk INT; + + DECLARE rs CURSOR FOR + SELECT c.clientFk + FROM tmp.clientGetDebt c + LEFT JOIN tmp.risk r ON r.clientFk = c.clientFk + WHERE IFNULL(r.risk,0) = 0; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + DROP TEMPORARY TABLE IF EXISTS tmp.clientGetDebt; + CREATE TEMPORARY TABLE tmp.clientGetDebt + SELECT cd.id as clientFk + FROM bs.clientDied cd + LEFT JOIN vn.clientProtected cp ON cp.clientFk = cd.id + JOIN vn.client c ON c.id = cd.id + JOIN vn.province p ON p.id = c.provinceFk + JOIN vn.country co ON co.id = p.countryFk + WHERE cd.Aviso = 'TERCER AVISO' + AND cp.clientFk IS NULL + AND co.country NOT IN ('Portugal','Francia','España exento') + AND c.salesPersonFk IS NOT NULL; + + CALL vn.clientGetDebt(curdate()); + + DROP TEMPORARY TABLE IF EXISTS tmp.contador; + CREATE TEMPORARY TABLE tmp.contador (id INT) + ENGINE = MEMORY; + + OPEN rs; + FETCH rs INTO vClientFk; + + WHILE NOT done DO + INSERT INTO tmp.contador SET id = vClientFk; + CALL vn.clientGreugeSpray(vClientFk, TRUE, '',TRUE); UPDATE vn.client SET salesPersonFk = NULL WHERE id = vClientFk; INSERT INTO vn.clientLog (originFk, userFk, `action`, description) VALUES (vClientFk, account.userGetId(), 'update', CONCAT('Se ha desasignado el cliente por que no ha comprado en 3 meses')); - + REPLACE bs.clientNewBorn(clientFk, shipped) - VALUES(vClientFk, CURDATE()); - FETCH rs INTO vClientFk; - END WHILE; - - CLOSE rs; + VALUES(vClientFk, CURDATE()); + FETCH rs INTO vClientFk; + END WHILE; + + CLOSE rs; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -44703,10 +45366,20 @@ BEGIN DECLARE vClientName VARCHAR(50); DECLARE vConsignatario INT; DECLARE vOriginalQuantity INT; + DECLARE vDescription VARCHAR(100); + DECLARE vConcept VARCHAR(100); + DECLARE vOrigin INT; IF vIsTrash THEN SELECT 200 INTO vClientFk; END IF; + + SELECT concept INTO vConcept FROM vn.sale WHERE id = vSaleFk; + SELECT ticketFk INTO vOrigin FROM vn.sale WHERE id = vSaleFk; + SELECT CONCAT("Cambio cantidad ",vConcept," de ", vQuantity ," a ", vNewQuantity) INTO vDescription; + + INSERT INTO vn.ticketLog (originFk, userFk, action , description) + VALUES(vOrigin, vn.getUser(), 'update', vDescription); SELECT t.id INTO vTicketFk FROM vn.ticket t WHERE t.created > DATE_SUB(NOW(), INTERVAL 1 DAY) AND t.clientFk = vClientFk AND t.warehouseFk = vWarehouseFk LIMIT 1; @@ -44725,7 +45398,7 @@ BEGIN END IF; INSERT INTO vn.sale (itemFk, ticketFk, concept, quantity, originalQuantity, price, discount, priceFixed, reserved, isPicked, isPriceFixed, created, isAdded) - SELECT itemFk, vTicketFk, concept, vQuantity, originalQuantity, price, discount, priceFixed, reserved, isPicked, isPriceFixed, created, isAdded + SELECT itemFk, vTicketFk, CONCAT(concept," ",vn.getWorkerCode(), " ",LEFT(CAST(NOW() AS TIME),5)), vQuantity, originalQuantity, price, discount, priceFixed, reserved, isPicked, isPriceFixed, created, isAdded FROM vn.sale s WHERE s.id = vSaleFk; SELECT quantity INTO vOriginalQuantity FROM vn.sale WHERE id = vSaleFk; @@ -44828,7 +45501,7 @@ proc:BEGIN FROM vn.worker w WHERE w.id = account.myUser_getId(); - IF vWorkerCode = 'LOM' THEN + IF vWorkerCode = 'ATM' THEN SET vMaxTickets = 8; @@ -44869,15 +45542,13 @@ proc:BEGIN AND (r.id IS NOT NULL OR a.isOwn = FALSE OR a.name = 'REC_ALGEMESI') AND s.isPrintable AND (pb.m3 > 0.05 OR s.isOK) - ORDER BY IF(pb.ubicacion IS NOT NULL, 1, 2), - (Hora - 1) * 60 + minuto > hour(now()) * 60 + minute(now()) , + ORDER BY (Hora - 1) * 60 + minuto > hour(now()) * 60 + minute(now()) , s.order DESC, Hora, minuto, IFNULL(r.priority,99999), - IFNULL(r.id,999999) - /*, - pb.m3 DESC*/ + IFNULL(r.id,999999), + pb.m3 DESC LIMIT vMaxTicketPrinted; END IF; @@ -45436,341 +46107,6 @@ proc:BEGIN 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 DROP PROCEDURE IF EXISTS `collection_new_Basic__` */; -/*!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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; -/*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; -DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `collection_new_Basic__`(vSectorFk INT) -proc:BEGIN - - DECLARE vIsPreviousPrepared BOOLEAN; - DECLARE vCollectionFk INT; - DECLARE vWarehouseFk INT; - DECLARE vMaxTickets INT DEFAULT 4; - DECLARE vStateFk INT; - DECLARE vFirstTicketFk INT; - DECLARE vWorkerCode VARCHAR(3); - DECLARE vShelve INT; - DECLARE vTicket INT; - DECLARE myUserIsSalesPersonRole BOOLEAN; - DECLARE vPrintedTickets INT; - DECLARE vMaxTicketPrinted INT DEFAULT 10; - - -- Se comprueba si existe coleccion pendiente, en cuyo caso se devuelve esa colección - SELECT collectionFk INTO vCollectionFk - FROM - ( - SELECT tc.collectionFk, COUNT(*) as lineas, sum(IF(st.id,0,1)) as libres - FROM vn.collection c - JOIN vn.ticketCollection tc ON tc.collectionFk = c.id - JOIN vn.ticket t ON t.id = tc.ticketFk - JOIN vn.sale s ON s.ticketFk = t.id - LEFT JOIN vn.saleTracking st ON st.saleFk = s.id - WHERE c.workerFk = vn.getUser() - AND s.quantity - AND c.created > CURDATE() - GROUP BY c.id - HAVING libres = lineas) sub - LIMIT 1; - - IF vCollectionFk THEN - - SELECT vCollectionFk; - - LEAVE proc; - - END IF; - - IF /*vSectorFk = 37*/ FALSE THEN - - CALL vn.collectionTrain_new(9,3); - - ELSE - - -- Establecemos el almacén y si es un sector de preparación previa, así como el estado para los tickets que se vayan preparando - SELECT isPreviousPrepared, warehouseFk - INTO vIsPreviousPrepared, vWarehouseFk - FROM vn.sector - WHERE id = vSectorFk; - - IF vIsPreviousPrepared THEN - - SELECT id INTO vStateFk - FROM vn.state - WHERE `code` = 'PREVIOUS_PREPARATION'; - ELSE - - SELECT id INTO vStateFk - FROM vn.state - WHERE `code` = 'ON_PREPARATION'; - - END IF; - - -- Averiguamos si es comercial el usuario - SELECT FALSE -- (r.name = 'salesPerson') - INTO myUserIsSalesPersonRole - FROM account.user u - JOIN account.role r ON r.id = u.role - WHERE u.id = vn.getUser(); - - -- Obtenemos el código del usuario - SELECT w.code - INTO vWorkerCode - FROM vn.worker w - WHERE w.id = account.myUserGetId(); - - -- Se obtiene nº de colección y el buffer con los pedidos preparables - INSERT INTO vn.collection - SET workerFk = account.myUserGetId(); - - SELECT LAST_INSERT_ID() INTO vCollectionFk; - - CALL vn2008.production_control_source(vWarehouseFk, 0); - - SELECT COUNT(*) INTO vPrintedTickets - FROM tmp.production_buffer pb - JOIN vn.state s ON s.id = pb.state - WHERE pb.Fecha = CURDATE() - AND s.isPreparable; - - SET vMaxTicketPrinted = vMaxTicketPrinted - vPrintedTickets; - - -- AutoPRINT - - IF vMaxTicketPrinted > 0 THEN - - INSERT INTO vncontrol.inter(state_id, Id_Ticket, Id_Trabajador) - SELECT s2.id, pb.Id_Ticket, vn.getUser() - FROM tmp.production_buffer pb - JOIN vn.agency a ON a.id = pb.agency_id - JOIN vn.warehouse w ON w.id = pb.warehouse_id - JOIN vn.state s ON s.id = pb.state - JOIN vn.state s2 ON s2.code = 'PRINTED_AUTO' - LEFT JOIN vn.route r ON r.id = pb.Id_Ruta - WHERE pb.Fecha = CURDATE() - AND NOT pb.problems - AND a.name != 'REC_SILLA' - AND (pb.ubicacion IS NOT NULL OR a.isOwn = FALSE ) - AND s.isPrintable - AND (pb.m3 > 0.05 OR s.isOK) - ORDER BY - (Hora - 1) * 60 + minuto > hour(now()) * 60 + minute(now()) , - s.order DESC, - Hora, - minuto, - IFNULL(r.priority,99999), - IFNULL(r.id,999999), - pb.m3 DESC - LIMIT vMaxTicketPrinted; - - END IF; - - -- SELECT vMaxTicketPrinted; - -- Se seleccionan los primeros tickets, asignando colección para dejarlos bloqueados a otros sacadores. - - INSERT IGNORE INTO vn.ticketCollection(ticketFk, collectionFk) - SELECT pb.Id_Ticket, - vCollectionFk - FROM tmp.production_buffer pb - JOIN vn.ticketStateToday tst ON tst.ticket = pb.Id_Ticket - JOIN vn.state s ON s.id = tst.state - LEFT JOIN vn.route r ON r.id = pb.Id_Ruta - WHERE pb.collectionFk IS NULL - AND ( - (s.isPreparable AND NOT myUserIsSalesPersonRole AND pb.Agencia != 'REC_SILLA') - OR - (s.code = 'PICKER_DESIGNED' AND pb.CodigoTrabajador = vWorkerCode) - ) - ORDER BY (s.code = 'PICKER_DESIGNED' AND pb.CodigoTrabajador = vWorkerCode) DESC, - pb.Hora, - pb.Minuto, - IF(IFNULL(r.priority,0) = 0, 999, r.priority), - IFNULL(r.id,99999), - pb.m3 DESC - LIMIT vMaxTickets; - - - -- Creamos una tabla temporal con los datos que necesitamos para depurar la colección - DROP TEMPORARY TABLE IF EXISTS tmp.ticket; - CREATE TEMPORARY TABLE tmp.ticket - SELECT pb.Id_Ticket ticketFk, - pb.lines, - pb.m3 * 1000 liters, - 0 as height, - 0 as shelve - FROM tmp.production_buffer pb - JOIN vn.ticketCollection tc ON tc.ticketFk = pb.Id_Ticket - WHERE tc.collectionFk = vCollectionFk; - - SELECT ticketFk - INTO vFirstTicketFk - FROM tmp.ticket - LIMIT 1; - - IF (SELECT pb.Agencia FROM tmp.production_buffer pb WHERE Id_Ticket = vFirstTicketFk) = 'REC_SILLA' THEN - - DELETE FROM tmp.ticket WHERE ticketFk != vFirstTicketFk; - - UPDATE tmp.ticket SET shelve = 1; - -- Como sólo hay un ticket, se le asigna el nivel 1 y acabamos - - ELSE - - -- Eliminamos los de recogida, puesto que el primero sabemos que no es de rec_silla - DELETE t.* - FROM tmp.ticket t - JOIN tmp.production_buffer pb ON pb.Id_Ticket = t.ticketFk - WHERE pb.Agencia = 'REC_SILLA'; - - -- Establece altura máxima por pedido, porque las plantas no se pueden recostar. - UPDATE tmp.ticket t - JOIN - ( SELECT MAX(i.size) maxHeigth, - tc.ticketFk - FROM vn.ticketCollection tc - JOIN vn.sale s ON s.ticketFk = tc.ticketFk - JOIN vn.item i ON i.id = s.itemFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.itemCategory ic ON ic.id = it.categoryFk - WHERE ic.isReclining = FALSE - AND tc.collectionFk = vCollectionFk - GROUP BY tc.ticketFk) sub ON sub.ticketFk = t.ticketFk - SET t.height = sub.maxHeigth; - - -- Vamos a generar una tabla con todas las posibilidades de asignacion de pedido - DROP TEMPORARY TABLE IF EXISTS tmp.ticketShelve; - CREATE TEMPORARY TABLE tmp.ticketShelve - SELECT ticketFk, shelve, linesDif, LitersDif, heightDif - FROM ( - SELECT t.ticketFk, - cv.`level` shelve, - CAST(cv.lines AS SIGNED) - t.lines as linesDif, - CAST(cv.liters AS SIGNED) - t.liters as litersDif, - CAST(cv.height AS SIGNED) - t.height as heightDif - FROM vn.collectionVolumetry cv - JOIN tmp.ticket t - ORDER BY (t.ticketFk = vFirstTicketFk) DESC, linesDif - ) sub - WHERE linesDif >= 0 - AND litersDif >= 0 - AND heightDif >= 0 - ORDER BY linesDif; - - -- Asignamos la primera balda util al primer pedido - SELECT IFNULL(shelve,0) INTO vShelve - FROM tmp.ticketShelve - WHERE ticketFk = vFirstTicketFk - ORDER BY heightDif, litersDif, linesDif - LIMIT 1; - - IF vShelve THEN - - UPDATE tmp.ticket - SET shelve = vShelve - WHERE ticketFk = vFirstTicketFk; - - DELETE FROM tmp.ticketShelve - WHERE ticketFk = vFirstTicketFk - OR shelve = vShelve; - - WHILE (SELECT COUNT(*) FROM tmp.ticketShelve) DO - - SELECT ticketFk, shelve - INTO vTicket, vShelve - FROM tmp.ticketShelve - LIMIT 1; - - UPDATE tmp.ticket - SET shelve = vShelve - WHERE ticketFk = vTicket; - - DELETE FROM tmp.ticketShelve - WHERE ticketFk = vTicket - OR shelve = vShelve; - - END WHILE; - - ELSE - - UPDATE tmp.ticket - SET shelve = 1 - WHERE ticketFk = vFirstTicketFk; - - END IF; - - END IF; - - -- Eliminamos los que se han quedado sin balda - DELETE FROM tmp.ticket WHERE shelve = 0 ; - - -- Elimina los tickets bloqueados que no se van a preparar - DELETE tc.* - FROM vn.ticketCollection tc - LEFT JOIN tmp.ticket t ON t.ticketFk = tc.ticketFk - WHERE tc.collectionFk = vCollectionFk - AND t.ticketFk IS NULL; - - -- Actualiza el estado de la colección - UPDATE vn.collection c - JOIN vn.state st ON st.code = 'ON_PREPARATION' - SET c.stateFk = st.id - WHERE c.id = vCollectionFk; - - -- Asigna las bandejas - UPDATE vn.ticketCollection tc - JOIN tmp.ticket t ON t.ticketFk = tc.ticketFk - SET tc.level = t.shelve; - - -- Actualiza el estado de los tickets - INSERT INTO vncontrol.inter(state_id, Id_Ticket, Id_Trabajador) - SELECT vStateFk, ticketFk, account.myUserGetId() - FROM vn.ticketCollection tc - WHERE tc.collectionFk = vCollectionFk - UNION ALL - SELECT vStateFk, sw.id, account.myUserGetId() - FROM vn.stowaway sw - JOIN vn.ticketCollection tc ON tc.ticketFk = sw.shipFk - WHERE tc.collectionFk = vCollectionFk; - - -- Avisa los preparados previos que hay que bajar del altillo imprimiendo etiqueta - INSERT IGNORE INTO vn.ticketDown(ticketFk) - SELECT DISTINCT tc.ticketFk - FROM vn.ticketCollection tc - JOIN vncontrol.inter vi ON vi.Id_Ticket = tc.ticketFk - JOIN vn.state st ON st.id = vi.state_id - JOIN vn.ticket t ON t.id = tc.ticketFk - JOIN vn.warehouse w ON w.id = t.warehouseFk - WHERE tc.collectionFk = vCollectionFk - AND w.name = 'Silla FV' - AND st.code = 'PREVIOUS_PREPARATION'; - - IF (SELECT COUNT(*) FROM vn.ticketCollection WHERE collectionFk = vCollectionFk) THEN - - CALL vn.salesMerge_byCollection(vCollectionFk); - - SELECT vCollectionFk; - - ELSE - - DELETE FROM vn.collection WHERE id = vCollectionFk; - SELECT 0; - - END IF; - - END IF; - END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -47412,216 +47748,216 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `entryConverter`(IN `vEntry` INT) -BEGIN - - DECLARE vWarehouseIn INT; - DECLARE vWarehouseOut INT; - DECLARE vTravel INT; - - DECLARE done BOOL DEFAULT FALSE; - - DECLARE vId_Entrada INT; - DECLARE vId_Article INT; - DECLARE vEtiquetas INT; - DECLARE vId_Cubo VARCHAR(10); - DECLARE vPacking INT; - DECLARE vGrouping INT; - DECLARE vCantidad INT; - DECLARE vCostefijo DECIMAL(10,3); - DECLARE vPortefijo DECIMAL(10,3); - DECLARE vEmbalajefijo DECIMAL(10); - DECLARE vComisionfija DECIMAL(10,3); - DECLARE vCaja INT; - DECLARE vNicho VARCHAR(5); - DECLARE vTarifa1 DECIMAL(10,2); - DECLARE vTarifa2 DECIMAL(10,2); - DECLARE vTarifa3 DECIMAL(10,2); - DECLARE vPVP DECIMAL(10,2); - DECLARE vCompra INT; - - DECLARE rs CURSOR FOR - SELECT - b.Id_Entrada, - b.Id_Article, - b.Etiquetas, - b.Id_Cubo, - b.Packing, - b.`grouping`, - b.Cantidad, - b.Costefijo, - b.Portefijo, - b.Embalajefijo, - b.Comisionfija, - b.caja, - b.Nicho, - b.Tarifa1, - b.Tarifa2, - b.Tarifa3, - b.PVP - FROM vn2008.Compres b - JOIN vn.itemConversor ic ON ic.espItemFk = b.Id_Article - WHERE Id_Entrada = vEntry; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - SELECT warehouseInFk, warehouseOutFk, tr.id - INTO vWarehouseIn, vWarehouseOut, vTravel - FROM travel tr - JOIN entry e ON e.travelFk = tr.id - WHERE e.id = vEntry; - - UPDATE travel - SET warehouseInFk = vWarehouseOut, - warehouseOutFk = vWarehouseIn - WHERE id = vTravel; - - UPDATE vn2008.Compres c - LEFT JOIN vn.itemConversor ic ON ic.espItemFk = c.Id_Article - SET Etiquetas = 0, Cantidad = 0 - WHERE c.Id_Entrada = vEntry - AND ic.espItemFk IS NULL; - - OPEN rs; - - DELETE FROM vn2008.Compres WHERE Id_Entrada = vEntry; - - FETCH rs INTO - vId_Entrada, - vId_Article, - vEtiquetas, - vId_Cubo, - vPacking, - vGrouping, - vCantidad, - vCostefijo, - vPortefijo, - vEmbalajefijo, - vComisionfija, - vCaja, - vNicho, - vTarifa1, - vTarifa2, - vTarifa3, - vPVP; - - WHILE NOT done DO - - -- Primero la linea original con las cantidades invertidas - INSERT INTO vn2008.Compres - ( - Id_Entrada, - Id_Article, - Etiquetas, - Id_Cubo, - Packing, - `grouping`, - Cantidad, - Costefijo, - Portefijo, - Embalajefijo, - Comisionfija, - caja, - Nicho, - Tarifa1, - Tarifa2, - Tarifa3, - PVP - ) - VALUES - ( - vId_Entrada, - vId_Article, - - vEtiquetas, - vId_Cubo, - vPacking, - vGrouping, - - vCantidad, - vCostefijo, - vPortefijo, - vEmbalajefijo, - vComisionfija, - vCaja, - vNicho, - vTarifa1, - vTarifa2, - vTarifa3, - vPVP); - - -- Ahora la linea nueva, con el item genérico - INSERT INTO vn2008.Compres - ( - Id_Entrada, - Id_Article, - Etiquetas, - Id_Cubo, - Packing, - `grouping`, - Cantidad, - Costefijo, - Portefijo, - Embalajefijo, - Comisionfija, - caja, - Nicho, - Tarifa1, - Tarifa2, - Tarifa3, - PVP - ) - SELECT - vId_Entrada, - genItemFk as Id_Article, - vEtiquetas, - vId_Cubo, - vPacking, - vGrouping, - vCantidad, - vCostefijo, - vPortefijo, - vEmbalajefijo, - vComisionfija, - vCaja, - vNicho, - vTarifa1, - vTarifa2, - vTarifa3, - vPVP - FROM itemConversor - WHERE espItemFk = vId_Article; - - SELECT LAST_INSERT_ID() - INTO vCompra; - - REPLACE vn2008.Compres_mark(Id_Compra,`comment`) - SELECT vCompra, vId_Article; - - - FETCH rs INTO - vId_Entrada, - vId_Article, - vEtiquetas, - vId_Cubo, - vPacking, - vGrouping, - vCantidad, - vCostefijo, - vPortefijo, - vEmbalajefijo, - vComisionfija, - vCaja, - vNicho, - vTarifa1, - vTarifa2, - vTarifa3, - vPVP; - - END WHILE; - - - CLOSE rs; - - - +BEGIN + + DECLARE vWarehouseIn INT; + DECLARE vWarehouseOut INT; + DECLARE vTravel INT; + + DECLARE done BOOL DEFAULT FALSE; + + DECLARE vId_Entrada INT; + DECLARE vId_Article INT; + DECLARE vEtiquetas INT; + DECLARE vId_Cubo VARCHAR(10); + DECLARE vPacking INT; + DECLARE vGrouping INT; + DECLARE vCantidad INT; + DECLARE vCostefijo DECIMAL(10,3); + DECLARE vPortefijo DECIMAL(10,3); + DECLARE vEmbalajefijo DECIMAL(10); + DECLARE vComisionfija DECIMAL(10,3); + DECLARE vCaja INT; + DECLARE vNicho VARCHAR(5); + DECLARE vTarifa1 DECIMAL(10,2); + DECLARE vTarifa2 DECIMAL(10,2); + DECLARE vTarifa3 DECIMAL(10,2); + DECLARE vPVP DECIMAL(10,2); + DECLARE vCompra INT; + + DECLARE rs CURSOR FOR + SELECT + b.Id_Entrada, + b.Id_Article, + b.Etiquetas, + b.Id_Cubo, + b.Packing, + b.`grouping`, + b.Cantidad, + b.Costefijo, + b.Portefijo, + b.Embalajefijo, + b.Comisionfija, + b.caja, + b.Nicho, + b.Tarifa1, + b.Tarifa2, + b.Tarifa3, + b.PVP + FROM vn2008.Compres b + JOIN vn.itemConversor ic ON ic.espItemFk = b.Id_Article + WHERE Id_Entrada = vEntry; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SELECT warehouseInFk, warehouseOutFk, tr.id + INTO vWarehouseIn, vWarehouseOut, vTravel + FROM travel tr + JOIN entry e ON e.travelFk = tr.id + WHERE e.id = vEntry; + + UPDATE travel + SET warehouseInFk = vWarehouseOut, + warehouseOutFk = vWarehouseIn + WHERE id = vTravel; + + UPDATE vn2008.Compres c + LEFT JOIN vn.itemConversor ic ON ic.espItemFk = c.Id_Article + SET Etiquetas = 0, Cantidad = 0 + WHERE c.Id_Entrada = vEntry + AND ic.espItemFk IS NULL; + + OPEN rs; + + DELETE FROM vn2008.Compres WHERE Id_Entrada = vEntry; + + FETCH rs INTO + vId_Entrada, + vId_Article, + vEtiquetas, + vId_Cubo, + vPacking, + vGrouping, + vCantidad, + vCostefijo, + vPortefijo, + vEmbalajefijo, + vComisionfija, + vCaja, + vNicho, + vTarifa1, + vTarifa2, + vTarifa3, + vPVP; + + WHILE NOT done DO + + -- Primero la linea original con las cantidades invertidas + INSERT INTO vn2008.Compres + ( + Id_Entrada, + Id_Article, + Etiquetas, + Id_Cubo, + Packing, + `grouping`, + Cantidad, + Costefijo, + Portefijo, + Embalajefijo, + Comisionfija, + caja, + Nicho, + Tarifa1, + Tarifa2, + Tarifa3, + PVP + ) + VALUES + ( + vId_Entrada, + vId_Article, + - vEtiquetas, + vId_Cubo, + vPacking, + vGrouping, + - vCantidad, + vCostefijo, + vPortefijo, + vEmbalajefijo, + vComisionfija, + vCaja, + vNicho, + vTarifa1, + vTarifa2, + vTarifa3, + vPVP); + + -- Ahora la linea nueva, con el item genérico + INSERT INTO vn2008.Compres + ( + Id_Entrada, + Id_Article, + Etiquetas, + Id_Cubo, + Packing, + `grouping`, + Cantidad, + Costefijo, + Portefijo, + Embalajefijo, + Comisionfija, + caja, + Nicho, + Tarifa1, + Tarifa2, + Tarifa3, + PVP + ) + SELECT + vId_Entrada, + genItemFk as Id_Article, + vEtiquetas, + vId_Cubo, + vPacking, + vGrouping, + vCantidad, + vCostefijo, + vPortefijo, + vEmbalajefijo, + vComisionfija, + vCaja, + vNicho, + vTarifa1, + vTarifa2, + vTarifa3, + vPVP + FROM itemConversor + WHERE espItemFk = vId_Article; + + SELECT LAST_INSERT_ID() + INTO vCompra; + + REPLACE vn2008.Compres_mark(Id_Compra,`comment`) + SELECT vCompra, vId_Article; + + + FETCH rs INTO + vId_Entrada, + vId_Article, + vEtiquetas, + vId_Cubo, + vPacking, + vGrouping, + vCantidad, + vCostefijo, + vPortefijo, + vEmbalajefijo, + vComisionfija, + vCaja, + vNicho, + vTarifa1, + vTarifa2, + vTarifa3, + vPVP; + + END WHILE; + + + CLOSE rs; + + + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -47683,62 +48019,62 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `entryPrepare`(IN `idE` BIGINT) -BEGIN - SELECT - b.quantity / b.packing AS Paquetes, - b.packing AS `Grouping`, - barcode, - 'ASEGURADO' AS asegurado, - ic.name, - ic.order, - s.name AS Consignatario, - e.supplierFk AS Id_Cliente, - e.isOrdered, - e.isConfirmed, - 10 AS Calidad, - LPAD(IFNULL(cpd.id, ip.code), - 5, - '0') AS path, - b.entryFk AS Id_Ticket, - t.landed AS Fecha, - b.itemFk, - b.quantity, - i.name AS Concepte, - i.size, - i.inkFk, - i.category, - o.code AS Origen, - 0 AS Bultos, - wIn.`name` AS Tipo, - 0 AS OK, - 0 AS Reservado, - i.stems, - b.id AS Id_Movimiento, - ip.code, - 'PEDIDO ASEGURADO' AS MSG, - 0 AS Seguro, - i.image, - pr.name AS producer - FROM vn.buy b - JOIN vn.entry e ON b.entryFk = e.id - JOIN vn.travel t ON t.id = e.travelFk - JOIN vn.warehouse wIn ON wIn.id = t.warehouseInFk - JOIN vn.warehouse wOut ON wOut.id = t.warehouseOutFk - JOIN vn.item i ON i.id = b.itemFk - JOIN vn.itemType it ON it.id =i.typeFk - JOIN vn.itemCategory ic ON ic.id = it.categoryFk - JOIN vn.packaging pkg ON pkg.id = b.packageFk - LEFT JOIN vn.itemPlacement ip ON i.id = ip.itemFk AND ip.warehouseFk = wIn.id AND ip.warehouseFk = t.warehouseOutFk - LEFT JOIN (SELECT itemFk, code AS barcode FROM vn.itemBarcode GROUP BY itemFk) ib ON ib.itemFk = b.itemFk - LEFT JOIN vn.origin o ON o.id = i.originFk - LEFT JOIN vn.supplier s ON s.id = e.supplierFk - LEFT JOIN vn.producer pr on pr.id = i.producerFk - LEFT JOIN vn.coolerPathDetail cpd ON LEFT(ip.code, 3) = cpd.hallway - WHERE - NOT wIn.isFeedStock AND NOT e.isInventory AND NOT e.isRaid - AND e.id = 158772 - AND i.typeFk IS NOT NULL - AND ic.merchandise IS NOT FALSE; +BEGIN + SELECT + b.quantity / b.packing AS Paquetes, + b.packing AS `Grouping`, + barcode, + 'ASEGURADO' AS asegurado, + ic.name, + ic.order, + s.name AS Consignatario, + e.supplierFk AS Id_Cliente, + e.isOrdered, + e.isConfirmed, + 10 AS Calidad, + LPAD(IFNULL(cpd.id, ip.code), + 5, + '0') AS path, + b.entryFk AS Id_Ticket, + t.landed AS Fecha, + b.itemFk, + b.quantity, + i.name AS Concepte, + i.size, + i.inkFk, + i.category, + o.code AS Origen, + 0 AS Bultos, + wIn.`name` AS Tipo, + 0 AS OK, + 0 AS Reservado, + i.stems, + b.id AS Id_Movimiento, + ip.code, + 'PEDIDO ASEGURADO' AS MSG, + 0 AS Seguro, + i.image, + pr.name AS producer + FROM vn.buy b + JOIN vn.entry e ON b.entryFk = e.id + JOIN vn.travel t ON t.id = e.travelFk + JOIN vn.warehouse wIn ON wIn.id = t.warehouseInFk + JOIN vn.warehouse wOut ON wOut.id = t.warehouseOutFk + JOIN vn.item i ON i.id = b.itemFk + JOIN vn.itemType it ON it.id =i.typeFk + JOIN vn.itemCategory ic ON ic.id = it.categoryFk + JOIN vn.packaging pkg ON pkg.id = b.packageFk + LEFT JOIN vn.itemPlacement ip ON i.id = ip.itemFk AND ip.warehouseFk = wIn.id AND ip.warehouseFk = t.warehouseOutFk + LEFT JOIN (SELECT itemFk, code AS barcode FROM vn.itemBarcode GROUP BY itemFk) ib ON ib.itemFk = b.itemFk + LEFT JOIN vn.origin o ON o.id = i.originFk + LEFT JOIN vn.supplier s ON s.id = e.supplierFk + LEFT JOIN vn.producer pr on pr.id = i.producerFk + LEFT JOIN vn.coolerPathDetail cpd ON LEFT(ip.code, 3) = cpd.hallway + WHERE + NOT wIn.isFeedStock AND NOT e.isInventory AND NOT e.isRaid + AND e.id = 158772 + AND i.typeFk IS NOT NULL + AND ic.merchandise IS NOT FALSE; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -53554,17 +53890,12 @@ BEGIN FROM vn.worker w JOIN vn.sector s ON s.code = w.code WHERE s.id = vSectorFk; - - IF vWarehouseFk = 1 THEN - - SET vSectorFk = 9; - - ELSEIF vWarehouseFk = 44 THEN - - SET vSectorFk = 6; - - END IF; + SELECT s.id INTO vSectorFk + FROM vn.sector s + WHERE s.warehouseFk = vWarehouseFk + AND s.isMain; + SELECT COUNT(*) INTO hasFatherSector FROM vn.sector WHERE sonFk = vSectorFk; @@ -53572,7 +53903,7 @@ BEGIN SELECT warehouseFk, sonFk INTO vWarehouseFk, vSonSectorFk FROM vn.sector WHERE id = vSectorFk; - + SELECT vSectorFk, vWarehouseFk, hasFatherSector , vSonSectorFk; CALL cache.visible_refresh(vCalcVisibleFk, TRUE, vWarehouseFk); CALL cache.available_refresh(vCalcAvailableFk, FALSE, vWarehouseFk, CURDATE()); @@ -53588,10 +53919,10 @@ BEGIN i.longName, i.size, i.subName producer, - a.available, - SUM(IF(s.sonFk = vSectorFk, iss.visible, 0)) upstairs, - SUM(IF(iss.sectorFk = vSectorFk, iss.visible, 0)) downstairs, - IF(it.isPackaging, NULL, IFNULL(v.visible,0)) as visible, + IFNULL(a.available,0) available, + SUM(IF(s.sonFk = vSectorFk, IFNULL(iss.visible,0), 0)) upstairs, + SUM(IF(iss.sectorFk = vSectorFk, IFNULL(iss.visible,0), 0)) downstairs, + IF(it.isPackaging, null, IFNULL(v.visible,0)) as visible, vSectorFk as sectorFk FROM vn.itemShelvingStock iss @@ -53601,6 +53932,7 @@ BEGIN LEFT JOIN cache.available a ON a.item_id = iss.itemFk AND a.calc_id = vCalcAvailableFk LEFT JOIN cache.visible v ON v.item_id = iss.itemFk AND v.calc_id = vCalcVisibleFk WHERE vSectorFk IN (iss.sectorFk, s.sonFk) + AND it.workerFk != 3366 GROUP BY iss.itemFk @@ -53679,14 +54011,9 @@ BEGIN ) ips ON ips.itemFk = i.id WHERE IFNULL(iss.sectorFk,0) IN (0, vSectorFk) OR iss.sectorFk = vSectorFk; - /* - UPDATE tmp.itemShelvingRadar isr - JOIN vn.itemShelvingStock iss ON iss.itemFk = isr.itemFk - SET isr.dayEndVisible = isr.dayEndVisible + iss.visible, - isr.firstNegative = isr.firstNegative + iss.visible, - isr.itemPlacementVisible = isr.itemPlacementVisible + iss.visible - WHERE iss.sectorFk = vSonSectorFk; - */ + + SELECT * FROM tmp.itemShelvingRadar; + DROP TEMPORARY TABLE IF EXISTS tmp.itemOutTime; CREATE TEMPORARY TABLE tmp.itemOutTime SELECT *,SUM(amount) quantity @@ -53940,6 +54267,89 @@ BEGIN SELECT true; +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 DROP PROCEDURE IF EXISTS `itemShelving_BuyerGet` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `itemShelving_BuyerGet`( ) +BEGIN + + SELECT * FROM vn.buyer; + +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 DROP PROCEDURE IF EXISTS `itemShelving_BuyerTask` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `itemShelving_BuyerTask`(vWorkerFk INT ) +BEGIN + + SELECT ish.id, + ish.itemFk, + i.longName, + i.image, + p.code as parking, + ish.shelvingFk, + ish.visible, + ish.created, + ish.stars + FROM vn.itemShelving ish + JOIN vn.item i ON i.id = ish.itemFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.parking p ON p.id = sh.parkingFk + JOIN vn.sector s ON s.id = p.sectorFk + WHERE s.warehouseFk = 1 + AND it.workerFk = vWorkerFk + AND ish.stars IS NULL + ORDER BY p.pickingOrder; + +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 DROP PROCEDURE IF EXISTS `itemShelving_StarsUpdate` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`z-developer`@`%` PROCEDURE `itemShelving_StarsUpdate`(vId INT, vStars INT) +BEGIN + + UPDATE vn.itemShelving + SET stars = vStars + WHERE id = vId; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -54187,13 +54597,93 @@ 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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `itemTagReorder`(itemTypeFk INT) +BEGIN + + SET @isTriggerDisabled = TRUE; + + -- No se puede usar temporary porque da error Error Code: 1137. No puedo reabrir tabla: 'i + DROP TABLE IF EXISTS tmp.item; + CREATE TABLE tmp.item + SELECT DISTINCT i.id + FROM vn.item i + WHERE i.typeFk = itemTypeFk; + + UPDATE itemTag it + JOIN tmp.item i ON i.id = it.itemFk + JOIN vn.item ON item.id = i.id + JOIN itemTypeTag itt ON itt.itemTypeFk = item.typeFk AND itt.tagFk = it.tagFk + SET it.priority = itt.priority + WHERE itt.itemTypeFk = itemTypeFk; + + CALL item_refreshTags(); + + SET @isTriggerDisabled = FALSE; + + DROP TABLE tmp.item; +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 DROP PROCEDURE IF EXISTS `itemTagReorderByName` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `itemTagReorderByName`(vName VARCHAR(255)) +BEGIN + + SET @isTriggerDisabled = TRUE; + + -- No se puede usar temporary porque da error Error Code: 1137. No puedo reabrir tabla: 'i + DROP TABLE IF EXISTS tmp.item; + CREATE TABLE tmp.item + SELECT DISTINCT i.id + FROM vn.item i + WHERE i.`name` LIKE CONCAT(vName,'%'); + + UPDATE itemTag it + JOIN tmp.item i ON i.id = it.itemFk + JOIN vn.item ON item.id = i.id + JOIN itemTypeTag itt ON itt.itemTypeFk = item.typeFk AND itt.tagFk = it.tagFk + SET it.priority = itt.priority + WHERE itt.itemTypeFk = itemTypeFk; + + CALL item_refreshTags(); + + SET @isTriggerDisabled = FALSE; + + DROP TABLE tmp.item; +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 DROP PROCEDURE IF EXISTS `itemTagReorderByName__` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `itemTagReorderByName__`(vName VARCHAR(255)) BEGIN DECLARE vDone BOOL DEFAULT FALSE; @@ -54205,13 +54695,13 @@ DECLARE vDone BOOL DEFAULT FALSE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - SET @isTriggerDisabled = TRUE; - + SET @isTriggerDisabled = TRUE; + DROP TEMPORARY TABLE IF EXISTS upda; - create temporary table upda + CREATE TEMPORARY TABLE upda SELECT DISTINCT i.id FROM vn.item i - WHERE i.typeFk = itemTypeFk; + WHERE i.name LIKE CONCAT(vName,'%'); UPDATE itemTag it JOIN item i ON i.id = it.itemFk @@ -54236,17 +54726,17 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `itemTagReorderByName` */; +/*!50003 DROP PROCEDURE IF EXISTS `itemTagReorder__` */; /*!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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `itemTagReorderByName`(vName VARCHAR(255)) +CREATE DEFINER=`root`@`%` PROCEDURE `itemTagReorder__`(itemTypeFk INT) BEGIN DECLARE vDone BOOL DEFAULT FALSE; @@ -54258,13 +54748,13 @@ DECLARE vDone BOOL DEFAULT FALSE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - SET @isTriggerDisabled = TRUE; - + SET @isTriggerDisabled = TRUE; + DROP TEMPORARY TABLE IF EXISTS upda; - CREATE TEMPORARY TABLE upda + create temporary table upda SELECT DISTINCT i.id FROM vn.item i - WHERE i.name LIKE CONCAT(vName,'%'); + WHERE i.typeFk = itemTypeFk; UPDATE itemTag it JOIN item i ON i.id = it.itemFk @@ -54387,6 +54877,67 @@ BEGIN DROP TABLE IF EXISTS topSellerMin; DROP TABLE IF EXISTS tmp.topSeller; +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 DROP PROCEDURE IF EXISTS `itemTrash` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `itemTrash`( + vItemFk INT, + vWarehouseFk INT, + vQuantity INT, + vIsTrash BOOLEAN) +BEGIN + + DECLARE vTicketFk INT; + DECLARE vClientFk INT; + DECLARE vCompanyVnlFk INT DEFAULT 442; + DECLARE vAgencyModeOthersFk INT DEFAULT 2; + DECLARE vCurrentTime VARCHAR(5); + DECLARE vCalc INT; + + SELECT vn.barcodeToItem(vItemFk) INTO vItemFk; + + SELECT IF(vIsTrash,200,400) INTO vClientFk; + + SELECT t.id INTO vTicketFk + FROM vn.ticket t + JOIN vn.address a ON a.id=t.addressFk + WHERE t.warehouseFk = vWarehouseFk + AND t.clientFk = vClientFk + AND DATE(t.shipped) = CURDATE() + AND a.isDefaultAddress + LIMIT 1; + + CALL cache.visible_refresh(vCalc, TRUE, vWarehouseFk); + + IF vTicketFk IS NULL THEN + + CALL vn.ticketCreateWithoutZone(vClientFk, CURDATE(), vWarehouseFk, vCompanyVnlFk, NULL, vAgencyModeOthersFk, NULL, CURDATE(), account.userGetId(),vTicketFk); + + END IF; + + INSERT INTO sale(ticketFk, itemFk, concept, quantity, price, discount) + SELECT vTicketFk, vItemFk, CONCAT(longName," ",vn.getWorkerCode(), " ",LEFT(CAST(NOW() AS TIME),5)), vQuantity,0,0 + FROM vn.item + WHERE id = vItemFk; + + UPDATE cache.visible + SET visible = visible - vQuantity + WHERE calc_id = vCalc + AND item_id = vItemFk; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -54726,9 +55277,9 @@ 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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; @@ -54745,7 +55296,6 @@ BEGIN CREATE TEMPORARY TABLE tmp.itemToRefresh SELECT id from tmp.item; - UPDATE item i JOIN tmp.itemToRefresh tmpI ON tmpI.id = i.id LEFT JOIN itemTag it1 ON it1.priority = 1 AND it1.itemFk = i.id @@ -54763,7 +55313,7 @@ BEGIN LEFT JOIN tagAbbreviation ta3 ON ta3.`value` = it3.`value` SET i.`name` = CONCAT_WS(' ', IFNULL(ta1.abbreviation,it1.`value`), - IF(i.id > 400000,'',IFNULL(ta2.abbreviation,it2.`value`)), + IFNULL(ta2.abbreviation,it2.`value`), IF(i.id > 400000,'',IFNULL(ta3.abbreviation,it3.`value`))); UPDATE item i @@ -55431,7 +55981,7 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `kk_` */; +/*!50003 DROP PROCEDURE IF EXISTS `ledger_doCompensation` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; @@ -55439,71 +55989,7 @@ DELIMITER ; /*!50003 SET character_set_results = utf8 */ ; /*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; -DELIMITER ;; -CREATE DEFINER=`z-developer`@`%` PROCEDURE `kk_`() -BEGIN - - DECLARE i INT DEFAULT 1; - DECLARE vPasillos VARCHAR(4) DEFAULT 'ABCD'; - DECLARE vPasilloLetra VARCHAR(1); - DECLARE vPasillo INT DEFAULT 0; - DECLARE vEstanteria INT DEFAULT 0; - DECLARE vEstanteriaMax INT DEFAULT 54; - - WHILE i < 100 DO - - INSERT INTO vn.parking(code, sectorFk, pickingOrder, `column`, `row`) - VALUES(CONCAT('A-',RIGHT(CONCAT('0',i),2)),37,i, 0, i); - - SET i = i + 1; - - END WHILE; - - SET i = 0; - - WHILE vPasillo < LENGTH(vPasillos) DO - - SET vPasillo = vPasillo + 1; - - SET vPasilloLetra = MID(vPasillos,vPasillo,1); - - WHILE vEstanteria < vEstanteriaMax DO - - SET vEstanteria = vEstanteria + 1; - - WHILE i < 4 DO - - SET i = i + 1; - - INSERT INTO vn.parking(code, sectorFk) - VALUES(CONCAT(vPasilloLetra,'-',RIGHT(CONCAT('0',vEstanteria),2),'-',i),37); - - END WHILE; - - SET i = 0; - - END WHILE; - - SET vEstanteria = 0; - - END WHILE; - -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 DROP PROCEDURE IF EXISTS `ledger_doCompensation` */; -/*!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_general_ci */ ; -/*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `ledger_doCompensation`(vDated DATE, vCompensationAccount VARCHAR(10) , vBankFk VARCHAR(10), vConcept VARCHAR(255), vAmount DECIMAL(10,2), vCompanyFk INT, vOriginalAccount VARCHAR(10)) BEGIN @@ -55511,40 +55997,155 @@ BEGIN * Compensa un pago o un recibo insertando en contabilidad * * @param vDated fecha en la cual se anota - * @param vCompensationAccount cuenta contablo contra la que se contabiliza + * @param vCompensationAccount cuenta contable contra la que se compensa * @param vBankFk banco de la compensacion * @param vConcept descripcion * @param vAmount cantidad que se compensa * @param vCompany empresa + * @param vOriginalAccount cuenta contable desde la cual se compensa + * */ DECLARE vNewBookEntry INT; - DECLARE vClientCompensation INT; - DECLARE vSupplierCompensation INT; + DECLARE vIsClientCompensation INT; + DECLARE vClientFk INT; + DECLARE vSupplierFk INT; + DECLARE vIsOriginalAClient BOOL; DECLARE vPayMethodCompensation INT; + DECLARE vAmountCompensation DECIMAL(10,2); - CALL vn.ledger_next(vNewBookEntry); - - INSERT INTO XDiario (ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, empresa_id) - VALUES (vNewBookEntry, vDated, vOriginalAccount, vCompensationAccount, vConcept, vAmount, 0, vCompanyFk), - (vNewBookEntry, vDated, vCompensationAccount, vOriginalAccount, vConcept, 0, vAmount, vCompanyFk); - - SELECT id INTO vClientCompensation FROM vn.`client` WHERE accountingAccount LIKE vCompensationAccount COLLATE utf8_general_ci; - SELECT id INTO vSupplierCompensation FROM vn.supplier WHERE `account` LIKE vCompensationAccount COLLATE utf8_general_ci; + CALL ledger_next(vNewBookEntry); + + SELECT COUNT(id) INTO vIsOriginalAClient FROM client WHERE accountingAccount LIKE vOriginalAccount COLLATE utf8_general_ci; + + SELECT id, COUNT(id) INTO vClientFk, vIsClientCompensation + FROM client + WHERE accountingAccount LIKE vCompensationAccount COLLATE utf8_general_ci; - IF MID(vCompensationAccount, 1, 2) = MID(vOriginalAccount, 1, 2) THEN - SET vAmount = -vAmount; - END IF; + SET @vAmount1:= 0; + SET @vAmount2:= 0; + INSERT INTO XDiario (ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, empresa_id) + VALUES ( vNewBookEntry, + vDated, + vOriginalAccount, + vCompensationAccount, + vConcept, + @vAmount1:= IF( + (vIsOriginalAClient OR NOT vIsOriginalAClient) + AND vAmount > 0, + 0, + ABS(vAmount) + ), + @vAmount2:= IF(@vAmount1, + 0, + ABS(vAmount) + ), + vCompanyFk + ), + ( vNewBookEntry, + vDated, + vCompensationAccount, + vOriginalAccount, + vConcept, + @vAmount2, + @vAmount1, + vCompanyFk); + + IF vIsClientCompensation THEN - IF vClientCompensation THEN INSERT INTO receipt(invoiceFk, amountPaid, payed, bankFk, companyFk, clientFk, isConciliate) - VALUES (vConcept, vAmount, vDated, vBankFk, vCompanyFk, vClientCompensation, TRUE); - END IF; + VALUES (vConcept, vAmount, vDated, vBankFk, vCompanyFk, vClientFk, TRUE); + ELSE - IF vSupplierCompensation THEN + SELECT id INTO vSupplierFk FROM supplier WHERE `account` LIKE vCompensationAccount COLLATE utf8_general_ci; SELECT id INTO vPayMethodCompensation FROM payMethod WHERE `code` = 'compensation'; + INSERT INTO vn2008.pago (fecha, dueDated, id_proveedor, importe, id_banco, pay_met_id, concepte, empresa_id, conciliado) - VALUES(vDated, vDated, vSupplierCompensation, vAmount, vBankFk, vPayMethodCompensation, vConcept, vCompanyFk, TRUE); + VALUES(vDated, vDated, vSupplierFk, vAmount, vBankFk, vPayMethodCompensation, vConcept, vCompanyFk, TRUE); + 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 DROP PROCEDURE IF EXISTS `ledger_doCompensation__` */; +/*!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 = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `ledger_doCompensation__`(vDated DATE, vCompensationAccount VARCHAR(10) , vBankFk VARCHAR(10), vConcept VARCHAR(255), vAmount DECIMAL(10,2), vCompanyFk INT, vOriginalAccount VARCHAR(10)) +BEGIN +/** + * Compensa un pago o un recibo insertando en contabilidad + * + * @param vDated fecha en la cual se anota + * @param vCompensationAccount cuenta contable contra la que se compensa + * @param vBankFk banco de la compensacion + * @param vConcept descripcion + * @param vAmount cantidad que se compensa + * @param vCompany empresa + * @param vOriginalAccount cuenta contable desde la cual se compensa + * + */ + + DECLARE vNewBookEntry INT; + DECLARE vIsClientCompensation INT; + DECLARE vClientFk INT; + DECLARE vSupplierFk INT; + DECLARE vIsOriginalAClient BOOL; + DECLARE vPayMethodCompensation INT; + DECLARE vAmountCompensation INT; + + CALL ledger_next(vNewBookEntry); + + SELECT COUNT(id) INTO vIsOriginalAClient FROM client WHERE accountingAccount LIKE vOriginalAccount COLLATE utf8_general_ci; + + SELECT id, COUNT(id) INTO vClientFk, vIsClientCompensation + FROM client + WHERE accountingAccount LIKE vCompensationAccount COLLATE utf8_general_ci; + + IF vIsOriginalAClient = vIsClientCompensation THEN + SET vAmountCompensation = -vAmount; + ELSE + SET vAmountCompensation = vAmount; + END IF; + + INSERT INTO XDiario (ASIEN, FECHA, SUBCTA, CONTRA, CONCEPTO, EURODEBE, EUROHABER, empresa_id) + VALUES ( vNewBookEntry, + vDated, + vOriginalAccount, + vCompensationAccount, + vConcept, + IF(vIsOriginalAClient, 0, vAmount), + IF(vIsOriginalAClient, vAmount, 0), + vCompanyFk + ), + ( vNewBookEntry, + vDated, + vCompensationAccount, + vOriginalAccount, + vConcept, + IF(vIsClientCompensation, 0, vAmountCompensation), + IF(vIsClientCompensation, vAmountCompensation, 0), + vCompanyFk); + + IF vIsClientCompensation THEN + + INSERT INTO receipt(invoiceFk, amountPaid, payed, bankFk, companyFk, clientFk, isConciliate) + VALUES (vConcept, vAmount, vDated, vBankFk, vCompanyFk, vClientFk, TRUE); + ELSE + + SELECT id INTO vSupplierFk FROM supplier WHERE `account` LIKE vCompensationAccount COLLATE utf8_general_ci; + SELECT id INTO vPayMethodCompensation FROM payMethod WHERE `code` = 'compensation'; + + INSERT INTO vn2008.pago (fecha, dueDated, id_proveedor, importe, id_banco, pay_met_id, concepte, empresa_id, conciliado) + VALUES(vDated, vDated, vSupplierFk, vAmount, vBankFk, vPayMethodCompensation, vConcept, vCompanyFk, TRUE); END IF; END ;; DELIMITER ; @@ -57269,7 +57870,90 @@ DELIMITER ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `rate_getPrices`(vLanded DATE, vWarehouseFk INT) +CREATE DEFINER=`root`@`%` PROCEDURE `rate_getPrices`(vDated DATE, vWarehouseFk INT) +BEGIN +/** + * Prepara una tabla con las tarifas aplicables en funcion de la fecha y el almacén + * + * @param vDated fecha para la cual calcula la tarifa + * @param vWarehouseFk warehouse para el cual calcula la tafia + * @return tmp.rate(rate0, rate1, rate2, rate3) + */ + DROP TEMPORARY TABLE IF EXISTS tRate; + CREATE TEMPORARY TABLE tRate + SELECT rate0, rate1, rate2, rate3 + FROM vn.rate + WHERE dated <= vDated + AND warehouseFk = vWarehouseFk + ORDER BY dated DESC; + + DROP TEMPORARY TABLE IF EXISTS tmp.rate; + CREATE TEMPORARY TABLE tmp.rate + ENGINE = MEMORY + SELECT * FROM + ( + SELECT * FROM tRate + UNION ALL + SELECT rate0, rate1, rate2, rate3 FROM rateConfig + ) sub2 + LIMIT 1; + DROP TEMPORARY TABLE tRate; +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 DROP PROCEDURE IF EXISTS `rate_getPrices2` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `rate_getPrices2`(vLanded DATE, vWarehouseFk INT) +BEGIN + + -- Prepara una tabla con las tarifas aplicables en funcion de la fecha y el almacén + DROP TEMPORARY TABLE IF EXISTS tRate; + CREATE TEMPORARY TABLE tRate + SELECT rate0, rate1, rate2, rate3 + FROM vn.rate + WHERE dated <= vLanded + AND warehouseFk = vWarehouseFk + ORDER BY dated DESC; + + DROP TEMPORARY TABLE IF EXISTS tmp.rate; + CREATE TEMPORARY TABLE tmp.rate + ENGINE = MEMORY + SELECT * FROM + ( + SELECT * FROM tRate + UNION ALL + SELECT rate0, rate1, rate2, rate3 FROM rateConfig + ) sub2 + LIMIT 1; + DROP TEMPORARY TABLE tRate; +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 DROP PROCEDURE IF EXISTS `rate_getPrices__` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `rate_getPrices__`(vLanded DATE, vWarehouseFk INT) BEGIN -- Prepara una tabla con las tarifas aplicables en funcion de la fecha y el almacén @@ -58130,77 +58814,77 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `saleItemShelvingMake`(IN `vTicketFk` INT, IN `vSectorFk` INT) -BEGIN - - SET @rest:= CAST(0 AS DECIMAL(10,0)); - SET @saleFk := CAST(0 AS DECIMAL(10,0)); - SET @reserved := CAST(0 AS DECIMAL(10,0)); - - UPDATE vn.itemShelving ish - JOIN vn.saleItemShelving sis ON sis.itemShelvingFk = ish.id - JOIN sale s ON s.id = sis.saleFk - SET ish.visible = sis.quantity + ish.visible, - ish.available = sis.quantity + ish.visible - WHERE s.ticketFk = vTicketFk; - - DELETE sis.* - FROM saleItemShelving sis - JOIN sale s ON s.id = sis.saleFk - WHERE s.ticketFk = vTicketFk; - - INSERT INTO saleItemShelving( saleFk, - itemShelvingFk, - quantity, - ubication) - SELECT saleFk, - itemShelvingFk, - CAST(Reserved as DECIMAL(10,0)) as Reserved, - ubication - FROM - (SELECT saleFk, - itemShelvingFk, - ubication, - @rest := IF(@saleFk = saleFk, @rest, quantity) as Falta, - @reserved := IF(available < @rest, available, IF(@rest < packing,0,@rest)) as Reserved, - @rest := @rest - @reserved, - @saleFk := saleFk - FROM - ( SELECT s.id as saleFk, - ish.created, - ish.id as itemShelvingFk, - ish.available, - s.quantity, - ish.packing, - CONCAT(p.`column`, '-',p.`row`,': ', sh.code ) as ubication - FROM vn.sale s - JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.sector sc ON sc.warehouseFk = t.warehouseFk - JOIN vn.parking p ON p.sectorFk = sc.id - JOIN vn.shelving sh ON sh.parkingFk = p.id - JOIN vn.itemShelving ish ON ish.shelvingFk = sh.code AND ish.itemFk = s.itemFk - WHERE t.id = vTicketFk - AND sc.id = vSectorFk - AND s.quantity MOD ish.packing = 0 - AND s.quantity >= ish.packing - ORDER BY s.id, - sh.priority DESC, - ish.packing DESC, - ish.created - ) sub - ) sub2 - WHERE Reserved > 0; - - UPDATE vn.itemShelving ish - JOIN vn.saleItemShelving sis ON sis.itemShelvingFk = ish.id - JOIN vn.sale s ON s.id = sis.saleFk - SET ish.available = ish.visible - sis.quantity, - ish.visible = ish.visible - sis.quantity - WHERE s.ticketFk = vTicketFk - AND s.isPicked = FALSE; - - CALL vn.saleItemShelvingIsPicked(vTicketFk, TRUE); - - +BEGIN + + SET @rest:= CAST(0 AS DECIMAL(10,0)); + SET @saleFk := CAST(0 AS DECIMAL(10,0)); + SET @reserved := CAST(0 AS DECIMAL(10,0)); + + UPDATE vn.itemShelving ish + JOIN vn.saleItemShelving sis ON sis.itemShelvingFk = ish.id + JOIN sale s ON s.id = sis.saleFk + SET ish.visible = sis.quantity + ish.visible, + ish.available = sis.quantity + ish.visible + WHERE s.ticketFk = vTicketFk; + + DELETE sis.* + FROM saleItemShelving sis + JOIN sale s ON s.id = sis.saleFk + WHERE s.ticketFk = vTicketFk; + + INSERT INTO saleItemShelving( saleFk, + itemShelvingFk, + quantity, + ubication) + SELECT saleFk, + itemShelvingFk, + CAST(Reserved as DECIMAL(10,0)) as Reserved, + ubication + FROM + (SELECT saleFk, + itemShelvingFk, + ubication, + @rest := IF(@saleFk = saleFk, @rest, quantity) as Falta, + @reserved := IF(available < @rest, available, IF(@rest < packing,0,@rest)) as Reserved, + @rest := @rest - @reserved, + @saleFk := saleFk + FROM + ( SELECT s.id as saleFk, + ish.created, + ish.id as itemShelvingFk, + ish.available, + s.quantity, + ish.packing, + CONCAT(p.`column`, '-',p.`row`,': ', sh.code ) as ubication + FROM vn.sale s + JOIN vn.ticket t ON t.id = s.ticketFk + JOIN vn.sector sc ON sc.warehouseFk = t.warehouseFk + JOIN vn.parking p ON p.sectorFk = sc.id + JOIN vn.shelving sh ON sh.parkingFk = p.id + JOIN vn.itemShelving ish ON ish.shelvingFk = sh.code AND ish.itemFk = s.itemFk + WHERE t.id = vTicketFk + AND sc.id = vSectorFk + AND s.quantity MOD ish.packing = 0 + AND s.quantity >= ish.packing + ORDER BY s.id, + sh.priority DESC, + ish.packing DESC, + ish.created + ) sub + ) sub2 + WHERE Reserved > 0; + + UPDATE vn.itemShelving ish + JOIN vn.saleItemShelving sis ON sis.itemShelvingFk = ish.id + JOIN vn.sale s ON s.id = sis.saleFk + SET ish.available = ish.visible - sis.quantity, + ish.visible = ish.visible - sis.quantity + WHERE s.ticketFk = vTicketFk + AND s.isPicked = FALSE; + + CALL vn.saleItemShelvingIsPicked(vTicketFk, TRUE); + + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -58811,7 +59495,7 @@ DELIMITER ; /*!50003 SET character_set_results = utf8 */ ; /*!50003 SET collation_connection = utf8_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `sale_checkNoComponents`(vCreatedFrom DATETIME, vCreatedTo DATETIME) BEGIN @@ -58823,28 +59507,28 @@ BEGIN */ DECLARE v_done BOOL DEFAULT FALSE; DECLARE vSaleFk INTEGER; - DECLARE vTicketFk INTEGER; - DECLARE vConcept VARCHAR(50); + DECLARE vTicketFk INTEGER; + DECLARE vConcept VARCHAR(50); DECLARE vCur CURSOR FOR - SELECT s.id - FROM sale s - JOIN item i ON i.id = s.itemFk - JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk - LEFT JOIN tmp.coste c ON c.id = s.id - WHERE s.created >= vCreatedFrom AND s.created <= vCreatedTo - AND c.id IS NULL - AND ic.merchandise != FALSE - GROUP BY s.id; - - DECLARE CONTINUE HANDLER FOR NOT FOUND + SELECT s.id + FROM sale s + JOIN item i ON i.id = s.itemFk + JOIN itemType tp ON tp.id = i.typeFk + JOIN itemCategory ic ON ic.id = tp.categoryFk + LEFT JOIN tmp.coste c ON c.id = s.id + WHERE s.created >= vCreatedFrom AND s.created <= vCreatedTo + AND c.id IS NULL + AND ic.merchandise != FALSE + GROUP BY s.id; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; DROP TEMPORARY TABLE IF EXISTS tmp.coste; DROP TEMPORARY TABLE IF EXISTS tmp.coste; CREATE TEMPORARY TABLE tmp.coste - (primary key (id)) ENGINE = MEMORY + (PRIMARY KEY (id)) ENGINE = MEMORY SELECT s.id FROM sale s JOIN item i ON i.id = s.itemFk @@ -58855,7 +59539,7 @@ BEGIN JOIN componentType ct ON ct.id = c.typeFk AND ct.id = 1 WHERE s.created >= vCreatedFrom AND ic.merchandise != FALSE; - + OPEN vCur; l: LOOP @@ -58865,16 +59549,19 @@ BEGIN IF v_done THEN LEAVE l; END IF; - select ticketFk INTO vTicketFk FROM sale where id = vSaleFk; - select concept INTO vConcept FROM sale where id = vSaleFk; - - CALL util.debug(ticketFk, concept); + + SELECT ticketFk, concept + INTO vTicketFk, vConcept + FROM sale + WHERE id = vSaleFk; + + CALL util.debug(vTicketFk, vConcept); -- CALL sale_calculateComponent(vSaleFk, 1); END LOOP; - CLOSE vCur; + CLOSE vCur; DROP TEMPORARY TABLE tmp.coste; - END ;; +END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; /*!50003 SET character_set_client = @saved_cs_client */ ; @@ -58938,33 +59625,33 @@ DELIMITER ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `scanTreeCreate__`() -BEGIN - CALL nestTree( - 'vn2008', - 'scan', - 'vn2008', - 'scanTree' - ); - - UPDATE vn2008.scanTree st - JOIN ( - SELECT sl.scan_id, - MAX(sl.odbc_date) lastScanned, - COUNT(DISTINCT t.routeFk) routeCount, - MIN(t.routeFk) mod 1000 as minRoute, - MAX(t.routeFk) mod 1000 as maxRoute, - COUNT(sl.scan_line_id) as scanned - FROM vn2008.scan_line sl - JOIN expedition e ON e.id = sl.`code` - JOIN ticket t ON t.id = e.ticketFk - WHERE t.routeFk - GROUP BY sl.scan_id - ) rs ON rs.scan_id = st.id - SET st.lastScanned = rs.lastScanned, - st.routeCount = rs.routeCount, - st.minRoute = rs.minRoute, - st.maxRoute = IF(rs.minRoute != rs.maxRoute, rs.maxRoute,NULL), - st.scanned = rs.scanned; +BEGIN + CALL nestTree( + 'vn2008', + 'scan', + 'vn2008', + 'scanTree' + ); + + UPDATE vn2008.scanTree st + JOIN ( + SELECT sl.scan_id, + MAX(sl.odbc_date) lastScanned, + COUNT(DISTINCT t.routeFk) routeCount, + MIN(t.routeFk) mod 1000 as minRoute, + MAX(t.routeFk) mod 1000 as maxRoute, + COUNT(sl.scan_line_id) as scanned + FROM vn2008.scan_line sl + JOIN expedition e ON e.id = sl.`code` + JOIN ticket t ON t.id = e.ticketFk + WHERE t.routeFk + GROUP BY sl.scan_id + ) rs ON rs.scan_id = st.id + SET st.lastScanned = rs.lastScanned, + st.routeCount = rs.routeCount, + st.minRoute = rs.minRoute, + st.maxRoute = IF(rs.minRoute != rs.maxRoute, rs.maxRoute,NULL), + st.scanned = rs.scanned; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -59435,7 +60122,7 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `silla_algemesi` */; +/*!50003 DROP PROCEDURE IF EXISTS `silla_algemesi__` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; @@ -59445,7 +60132,7 @@ DELIMITER ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `silla_algemesi`(vDate DATE, vItemFk INT, vQuantity INT) +CREATE DEFINER=`root`@`%` PROCEDURE `silla_algemesi__`(vDate DATE, vItemFk INT, vQuantity INT) BEGIN DECLARE done INT DEFAULT FALSE; @@ -62389,113 +63076,6 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `ticketGetTax` */; -/*!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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; -/*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; -DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `ticketGetTax`() - READS SQL DATA -BEGIN -/** - * Calcula la base imponible, el IVA y el recargo de equivalencia para - * un conjunto de tickets. - * - * @table tmp.ticket(ticketFk) Identificadores de los tickets a calcular - * @return tmp.ticketAmount - * @return tmp.ticketTax Impuesto desglosado para cada ticket. - - */ - DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; - CREATE TEMPORARY TABLE tmp.addressCompany - (INDEX (addressFk, companyFk)) - ENGINE = MEMORY - SELECT DISTINCT t.addressFk, t.companyFk - FROM tmp.ticket tmpTicket - JOIN ticket t ON t.id = tmpTicket.ticketFk; - - CALL addressTaxArea (); - - - /** Solo se calcula la base imponible (taxableBase) y el impuesto se calculará posteriormente - * No se debería cambiar el sistema por problemas con los decimales - */ - - DROP TEMPORARY TABLE IF EXISTS tmp.ticketTax; - CREATE TEMPORARY TABLE tmp.ticketTax - (INDEX (ticketFk)) - ENGINE = MEMORY - SELECT tmpTicket.ticketFk, - bp.pgcFk, - SUM(s.quantity * s.price * (100 - s.discount)/100 ) AS taxableBase, - pgc.rate, - tc.code - FROM tmp.ticket tmpTicket - JOIN sale s ON s.ticketFk = tmpTicket.ticketFk - JOIN item i ON i.id = s.itemFk - JOIN ticket t ON t.id = tmpTicket.ticketFk - JOIN supplier su ON su.id = t.companyFk - JOIN tmp.addressTaxArea ata - ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk - JOIN itemTaxCountry itc - ON itc.itemFk = i.id AND itc.countryFk = su.countryFk - JOIN bookingPlanner bp - ON bp.countryFk = su.countryFk - AND bp.taxAreaFk = ata.areaFk - AND bp.taxClassFk = itc.taxClassFk - JOIN pgc ON pgc.code = bp.pgcFk - JOIN taxClass tc ON tc.id = bp.taxClassFk - GROUP BY tmpTicket.ticketFk, pgc.code,pgc.rate - HAVING taxableBase != 0; - - DROP TEMPORARY TABLE IF EXISTS tmp.ticketServiceTax; - CREATE TEMPORARY TABLE tmp.ticketServiceTax - (INDEX (ticketFk)) - ENGINE = MEMORY - SELECT tt.ticketFk, - SUM(ts.quantity * ts.price) AS taxableBase, - pgc.rate, - tc.code - FROM tmp.ticketTax tt - JOIN ticketService ts ON ts.ticketFk = tt.ticketFk - JOIN ticket t ON t.id = tt.ticketFk - JOIN supplier su ON su.id = t.companyFk - JOIN tmp.addressTaxArea ata - ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk - JOIN bookingPlanner bp - ON bp.countryFk = su.countryFk - AND bp.taxAreaFk = ata.areaFk - AND bp.taxClassFk = ts.taxClassFk - JOIN pgc ON pgc.code = bp.pgcFk AND pgc.rate = tt.rate - JOIN taxClass tc ON tc.id = bp.taxClassFk - GROUP BY tt.ticketFk, tt.code,tt.rate - HAVING taxableBase != 0; - - UPDATE tmp.ticketTax tt - JOIN tmp.ticketServiceTax ts ON tt.ticketFk = ts.ticketFk AND tt.code = ts.code AND tt.rate = ts.rate - SET tt.taxableBase = tt.taxableBase + ts.taxableBase; - - DROP TEMPORARY TABLE IF EXISTS tmp.ticketAmount; - CREATE TEMPORARY TABLE tmp.ticketAmount - (INDEX (ticketFk)) - ENGINE = MEMORY - SELECT ticketFk, taxableBase, SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax,code - FROM tmp.ticketTax - GROUP BY ticketFk, code; - - DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; - DROP TEMPORARY TABLE IF EXISTS tmp.addressTaxArea; -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 DROP PROCEDURE IF EXISTS `ticketGetTaxAdd` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; @@ -62726,13 +63306,33 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 DROP PROCEDURE IF EXISTS `ticketGetTax__2` */; +/*!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_general_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `ticketGetTax__2`() + READS SQL DATA +BEGIN + CALL ticket_getTax(NULL); +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 DROP PROCEDURE IF EXISTS `ticketGetTotal` */; /*!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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; @@ -62745,8 +63345,8 @@ BEGIN * @table tmp.ticket(ticketFk) Identificadores de los tickets a calcular * @return tmp.ticketTotal Total para cada ticket */ - CALL vn.ticketGetTax(); - + CALL ticket_getTax(NULL); + DROP TEMPORARY TABLE IF EXISTS tmp.ticketTotal; CREATE TEMPORARY TABLE tmp.ticketTotal (INDEX (ticketFk)) @@ -63615,89 +64215,6 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `ticket_checkNoComponents__` */; -/*!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 = utf8 */ ; -/*!50003 SET character_set_results = utf8 */ ; -/*!50003 SET collation_connection = utf8_general_ci */ ; -/*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; -DELIMITER ;; -CREATE DEFINER=`root`@`%` PROCEDURE `ticket_checkNoComponents__`(vShippedFrom DATETIME, vShippedTo DATETIME) -BEGIN - -/** - * Comprueba que los tickets entre un rango de fechas tienen componentes - * - * @param vShippedFrom inicio del rango - * @param vShippedTo fin del rango - */ - DECLARE v_done BOOL DEFAULT FALSE; - DECLARE vSaleFk INTEGER; - DECLARE vTicketFk INTEGER; - DECLARE vConcept VARCHAR(50); - DECLARE vCur CURSOR FOR - SELECT s.id - FROM ticket t - JOIN client clt ON clt.id = t.clientFk - JOIN sale s ON s.ticketFk = t.id - JOIN item i ON i.id = s.itemFk - JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk - LEFT JOIN tmp.coste c ON c.id = s.id - WHERE t.shipped >= vShippedFrom AND t.shipped <= vShippedTo - AND c.id IS NULL - AND clt.isActive != 0 - AND ic.merchandise != 0 - GROUP BY s.id; - - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET v_done = TRUE; - - DROP TEMPORARY TABLE IF EXISTS tmp.coste; - - DROP TEMPORARY TABLE IF EXISTS tmp.coste; - CREATE TEMPORARY TABLE tmp.coste - (primary key (id)) ENGINE = MEMORY - SELECT s.id - FROM ticket t - JOIN client clt ON clt.id = t.clientFk - JOIN sale s ON s.ticketFk = t.id - JOIN item i ON i.id = s.itemFk - JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk - JOIN saleComponent sc ON sc.saleFk = s.id - JOIN component c ON c.id = sc.componentFk - JOIN componentType ct ON ct.id = c.typeFk AND ct.id = 1 - WHERE t.shipped >= vShippedFrom - AND ic.merchandise != 0; - - OPEN vCur; - - l: LOOP - SET v_done = FALSE; - FETCH vCur INTO vSaleFk; - - IF v_done THEN - LEAVE l; - END IF; - select ticketFk INTO vTicketFk FROM sale where id = vSaleFk; - select concept INTO vConcept FROM sale where id = vSaleFk; - - CALL util.debug(ticketFk, concept); - -- CALL sale_calculateComponent(vSaleFk, 1); - END LOOP; - - CLOSE vCur; - DROP TEMPORARY TABLE tmp.coste; - 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 DROP PROCEDURE IF EXISTS `ticket_Clone` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; @@ -64667,91 +65184,93 @@ BEGIN * @return tmp.ticketAmount * @return tmp.ticketTax Impuesto desglosado para cada ticket. */ - DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; - CREATE TEMPORARY TABLE tmp.addressCompany - (INDEX (addressFk, companyFk)) - ENGINE = MEMORY - SELECT DISTINCT t.addressFk, t.companyFk - FROM tmp.ticket tmpTicket - JOIN ticket t ON t.id = tmpTicket.ticketFk; + DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; + CREATE TEMPORARY TABLE tmp.addressCompany + (INDEX (addressFk, companyFk)) + ENGINE = MEMORY + SELECT DISTINCT t.addressFk, t.companyFk + FROM tmp.ticket tmpTicket + JOIN ticket t ON t.id = tmpTicket.ticketFk; - CALL addressTaxArea (); - - IF vTaxArea > '' THEN + CALL addressTaxArea (); + + IF vTaxArea > '' THEN UPDATE tmp.addressTaxArea SET areaFk = vTaxArea; END IF; - /** Solo se calcula la base imponible (taxableBase) y el impuesto se calculará posteriormente - * No se debería cambiar el sistema por problemas con los decimales - */ - - DROP TEMPORARY TABLE IF EXISTS tmp.ticketTax; - CREATE TEMPORARY TABLE tmp.ticketTax - (INDEX (ticketFk)) - ENGINE = MEMORY + /* Solo se calcula la base imponible (taxableBase) y el impuesto se calculará posteriormente + * No se debería cambiar el sistema por problemas con los decimales + */ + + DROP TEMPORARY TABLE IF EXISTS tmp.ticketTax; + CREATE TEMPORARY TABLE tmp.ticketTax + (INDEX (ticketFk)) + ENGINE = MEMORY SELECT * FROM ( SELECT tmpTicket.ticketFk, - bp.pgcFk, - SUM(s.quantity * s.price * (100 - s.discount)/100 ) AS taxableBase, - pgc.rate, - tc.code, - bp.priority - FROM tmp.ticket tmpTicket - JOIN sale s ON s.ticketFk = tmpTicket.ticketFk - JOIN item i ON i.id = s.itemFk - JOIN ticket t ON t.id = tmpTicket.ticketFk - JOIN supplier su ON su.id = t.companyFk - JOIN tmp.addressTaxArea ata - ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk - JOIN itemTaxCountry itc - ON itc.itemFk = i.id AND itc.countryFk = su.countryFk - JOIN bookingPlanner bp - ON bp.countryFk = su.countryFk - AND bp.taxAreaFk = ata.areaFk - AND bp.taxClassFk = itc.taxClassFk - JOIN pgc ON pgc.code = bp.pgcFk - JOIN taxClass tc ON tc.id = bp.taxClassFk - GROUP BY tmpTicket.ticketFk, pgc.code,pgc.rate - HAVING taxableBase != 0) t + bp.pgcFk, + SUM(s.quantity * s.price * (100 - s.discount)/100 ) AS taxableBase, + pgc.rate, + tc.code, + bp.priority + FROM tmp.ticket tmpTicket + JOIN sale s ON s.ticketFk = tmpTicket.ticketFk + JOIN item i ON i.id = s.itemFk + JOIN ticket t ON t.id = tmpTicket.ticketFk + JOIN supplier su ON su.id = t.companyFk + JOIN tmp.addressTaxArea ata + ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk + JOIN itemTaxCountry itc + ON itc.itemFk = i.id AND itc.countryFk = su.countryFk + JOIN bookingPlanner bp + ON bp.countryFk = su.countryFk + AND bp.taxAreaFk = ata.areaFk + AND bp.taxClassFk = itc.taxClassFk + JOIN pgc ON pgc.code = bp.pgcFk + JOIN taxClass tc ON tc.id = bp.taxClassFk + GROUP BY tmpTicket.ticketFk, pgc.code,pgc.rate + HAVING taxableBase != 0) t ORDER BY priority; - DROP TEMPORARY TABLE IF EXISTS tmp.ticketServiceTax; - CREATE TEMPORARY TABLE tmp.ticketServiceTax - (INDEX (ticketFk)) - ENGINE = MEMORY - SELECT tt.ticketFk, - SUM(ts.quantity * ts.price) AS taxableBase, - pgc.rate, - tc.code - FROM tmp.ticketTax tt - JOIN ticketService ts ON ts.ticketFk = tt.ticketFk - JOIN ticket t ON t.id = tt.ticketFk - JOIN supplier su ON su.id = t.companyFk - JOIN tmp.addressTaxArea ata - ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk - JOIN bookingPlanner bp - ON bp.countryFk = su.countryFk - AND bp.taxAreaFk = ata.areaFk - AND bp.taxClassFk = ts.taxClassFk - JOIN pgc ON pgc.code = bp.pgcFk AND pgc.rate = tt.rate - JOIN taxClass tc ON tc.id = bp.taxClassFk - GROUP BY tt.ticketFk, tt.code,tt.rate - HAVING taxableBase != 0; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketServiceTax; + CREATE TEMPORARY TABLE tmp.ticketServiceTax + (PRIMARY KEY (ticketFk, rate,code)) + ENGINE = MEMORY + SELECT tt.ticketFk, + pgc.code pgcFk, + SUM(ts.quantity * ts.price) AS taxableBase, + pgc.rate, + tc.code + FROM tmp.ticket tt + JOIN ticketService ts ON ts.ticketFk = tt.ticketFk + JOIN ticket t ON t.id = tt.ticketFk + JOIN supplier su ON su.id = t.companyFk + JOIN tmp.addressTaxArea ata + ON ata.addressFk = t.addressFk AND ata.companyFk = t.companyFk + JOIN bookingPlanner bp + ON bp.countryFk = su.countryFk + AND bp.taxAreaFk = ata.areaFk + AND bp.taxClassFk = ts.taxClassFk + JOIN pgc ON pgc.code = bp.pgcFk + JOIN taxClass tc ON tc.id = bp.taxClassFk + GROUP BY tt.ticketFk, pgc.code + HAVING taxableBase != 0; - UPDATE tmp.ticketTax tt - JOIN tmp.ticketServiceTax ts ON tt.ticketFk = ts.ticketFk AND tt.code = ts.code AND tt.rate = ts.rate - SET tt.taxableBase = tt.taxableBase + ts.taxableBase; + INSERT INTO tmp.ticketTax (ticketFk, pgcFk, taxableBase, rate, code) + SELECT ts.ticketFk, ts.pgcFk, ts.taxableBase, ts.rate, ts.code + FROM tmp.ticketServiceTax ts + ON DUPLICATE KEY UPDATE ticketTax.taxableBase = ticketTax.taxableBase + VALUES (taxableBase); - DROP TEMPORARY TABLE IF EXISTS tmp.ticketAmount; - CREATE TEMPORARY TABLE tmp.ticketAmount - (INDEX (ticketFk)) - ENGINE = MEMORY - SELECT ticketFk, taxableBase, SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax,code - FROM tmp.ticketTax - GROUP BY ticketFk, code; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketAmount; + CREATE TEMPORARY TABLE tmp.ticketAmount + (INDEX (ticketFk)) + ENGINE = MEMORY + SELECT ticketFk, taxableBase, SUM(CAST(taxableBase * rate / 100 AS DECIMAL(10, 2))) tax,code + FROM tmp.ticketTax + GROUP BY ticketFk, code; - DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; - DROP TEMPORARY TABLE IF EXISTS tmp.addressTaxArea; + DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; + DROP TEMPORARY TABLE IF EXISTS tmp.addressTaxArea; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -65684,38 +66203,36 @@ BEGIN SET @vDated := NULL; DROP TEMPORARY TABLE IF EXISTS tmp.timeControlCalculate; - + CREATE TEMPORARY TABLE tmp.timeControlCalculate SELECT userFk, dated, IF( timeWork >= 18000, @timeWork:=timeWork + 1200, @timeWork:=timeWork) timeWorkSeconds, SEC_TO_TIME(@timeWork ) timeWorkSexagesimal, @timeWork / 3600 timeWorkDecimal, - timed + timed FROM (SELECT SUM(timeWork) timeWork, userFk, - dated, - GROUP_CONCAT(DATE_FORMAT(sub.timed,"%H:%i") ORDER BY sub.timed ASC SEPARATOR ' - ') timed + dated, + GROUP_CONCAT(DATE_FORMAT(sub.timed,"%H:%i") ORDER BY sub.timed ASC SEPARATOR ' - ') timed FROM (SELECT IF(@vUser = wtc.userFk, @vUser :=@vUser, @vUser := wtc.userFk ), IF(@vIsOdd, @vIsOdd := FALSE, @vIsOdd := TRUE ), IF(direction='in', @vIsOdd := TRUE, @vIsOdd := @vIsOdd ), IF(@vIsOdd, @vLastTimed:=UNIX_TIMESTAMP(timed),@vLastTimed:=@vLastTimed), IF(@vIsOdd, 0, UNIX_TIMESTAMP(timed)-@vLastTimed) timeWork, IF(direction='in', @vDated := DATE(wtc.timed), @vDated :=@vDated) dated, - wtc.userFk, wtc.timed timed, + wtc.userFk, direction - FROM (SELECT wtc.* + FROM (SELECT DISTINCT(wtc.id), wtc.userFk, wtc.timed, wtc.direction FROM workerTimeControl wtc JOIN tmp.`user` w ON w.userFk = wtc.userFk - WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo - ORDER BY userFk, timed ASC + WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo + ORDER BY userFk, timed ASC ) wtc WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo - ORDER BY userFk, timed ASC ) sub GROUP BY userFk, dated - ORDER BY userFk, dated )sub2; END ;; @@ -65900,10 +66417,12 @@ BEGIN dated, IF( timeWork >= 18000, @timeWork:=timeWork + 1200, @timeWork:=timeWork) timeWorkSeconds, SEC_TO_TIME(@timeWork ) timeWorkSexagesimal, - @timeWork / 3600 timeWorkDecimal + @timeWork / 3600 timeWorkDecimal, + timed FROM (SELECT SUM(timeWork) timeWork, userFk, - dated + dated, + GROUP_CONCAT(DATE_FORMAT(sub.timed,"%H:%i") ORDER BY sub.timed ASC SEPARATOR ' - ') timed FROM (SELECT IF(@vUser = wtc.userFk, @vUser :=@vUser, @vUser := wtc.userFk ), IF(@vIsOdd, @vIsOdd := FALSE, @vIsOdd := TRUE ), IF(direction='in', @vIsOdd := TRUE, @vIsOdd := @vIsOdd ), @@ -65913,8 +66432,12 @@ BEGIN wtc.userFk, wtc.timed timed, direction - FROM (SELECT * FROM workerTimeControl ORDER BY userFk, timed ASC) wtc - JOIN tmp.`user` w ON w.userFk = wtc.userFk + FROM (SELECT wtc.* + FROM workerTimeControl wtc + JOIN tmp.`user` w ON w.userFk = wtc.userFk + WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo + ORDER BY userFk, timed ASC + ) wtc WHERE wtc.timed BETWEEN vDatedFrom AND vDatedTo ORDER BY userFk, timed ASC ) sub @@ -68163,15 +68686,19 @@ BEGIN DECLARE vWorkerInfo VARCHAR(90); DECLARE vCursor CURSOR FOR - SELECT CONCAT(u.name, "@verdnatura.es"), u.id, tb.dated, tb.timeWorkDecimal, LEFT(tb.timeWorkSexagesimal,5) timeWorkSexagesimal, + SELECT CONCAT(u.name, '@verdnatura.es'), u.id, tb.dated, tb.timeWorkDecimal, LEFT(tb.timeWorkSexagesimal,5) timeWorkSexagesimal, tb.timeTable, tc.timeWorkDecimal timeWorkedDecimal, LEFT(tc.timeWorkSexagesimal,5) timeWorkedSexagesimal, tb.type, tb.businessFk FROM tmp.timeBusinessCalculate tb JOIN user u ON u.id = tb.userFk JOIN department d ON d.id = tb.departmentFk + JOIN postgresql.business b ON b.business_id = tb.businessFk + JOIN company c ON c.id = b.provider_id LEFT JOIN tmp.timeControlCalculate tc ON tc.userFk = tb.userFk AND tc.dated = tb.dated WHERE d.isTeleworking AND - IFNULL(vWorkerFk,u.id) = u.id + IFNULL(vWorkerFk,u.id) = u.id AND + c.code = 'VNL' ORDER BY u.id, tb.dated; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DROP TABLE IF EXISTS tmp.timeControlCalculate; @@ -68179,7 +68706,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp.timeControlCalculate; DROP TEMPORARY TABLE IF EXISTS tmp.timeBusinessCalculate; - SELECT CONCAT (MIN(dated), " 00:00:00"), CONCAT (MAX(dated), " 23:59:59") INTO vStarted, vEnded + SELECT CONCAT (MIN(dated), ' 00:00:00'), CONCAT (MAX(dated), ' 23:59:59') INTO vStarted, vEnded FROM time WHERE year = vYear AND week = vWeek; @@ -68189,7 +68716,7 @@ BEGIN timed BETWEEN vStarted AND vEnded AND isSendMail; UPDATE workerTimeControlMail - SET updated = NOW(), state="SENDED" + SET updated = NOW(), state = 'SENDED' WHERE year = vYear AND week = vWeek AND IFNULL(vWorkerFk, workerFk) = workerFk ; @@ -68203,7 +68730,7 @@ BEGIN END IF; SET vTimeWorkDecimalTotal = 0; - SET vBody= ""; + SET vBody= ''; OPEN vCursor; FETCH vCursor INTO vSender, vWorkerFk, vDated, vTimeWorkDecimal, vTimeWorkSexagesimal, vTimeTable, vTimeWorkedDecimal, vTimeWorkedSexagesimal, vAbsenceType, vBusinessFk ; SET vWorkerFkOld = vWorkerFk ; @@ -68215,47 +68742,47 @@ BEGIN IF vTimeTable IS NULL AND vTimeWorkDecimal>0 AND vTimeWorkedDecimal IS NULL THEN INSERT INTO workerTimeControl (userFk, timed, manual, direction, isSendMail) - SELECT vWorkerFk, CONCAT(vDated," 08:00"), TRUE, "in", TRUE; + SELECT vWorkerFk, CONCAT(vDated,' 08:00'), TRUE, 'in', TRUE; IF vTimeWorkDecimal >= 5 THEN INSERT INTO workerTimeControl (userFk, timed, manual, direction, isSendMail) - SELECT vWorkerFk, CONCAT(vDated," 09:00"), TRUE, "middle", TRUE; + SELECT vWorkerFk, CONCAT(vDated,' 09:00'), TRUE, 'middle', TRUE; INSERT INTO workerTimeControl (userFk, timed, manual, direction, isSendMail) - SELECT vWorkerFk, CONCAT(vDated," 09:20"), TRUE, "middle", TRUE; + SELECT vWorkerFk, CONCAT(vDated,' 09:20'), TRUE, 'middle', TRUE; END IF; INSERT INTO workerTimeControl (userFk, timed, manual, direction, isSendMail) - SELECT vWorkerFk,CONCAT(vDated," ", LEFT (SEC_TO_TIME(28800 + (vTimeWorkDecimal * 3600)), 5)), TRUE, "out", TRUE; + SELECT vWorkerFk,CONCAT(vDated,' ', LEFT (SEC_TO_TIME(28800 + (vTimeWorkDecimal * 3600)), 5)), TRUE, 'out', TRUE; ELSEIF vTimeWorkDecimal>0 AND vTimeWorkedDecimal IS NULL THEN SELECT SUM(TIME_TO_SEC(j.end)-TIME_TO_SEC(j.start))/3600 INTO vTimeTableDecimal FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; IF vTimeWorkDecimal = vTimeTableDecimal THEN INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", j.start), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', j.start), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", j.end), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', j.end), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; ELSE INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", MIN(j.start)), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', MIN(j.start)), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + (vTimeWorkDecimal * 3600))), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + (vTimeWorkDecimal * 3600))), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; END IF; IF vTimeWorkDecimal >= 5 THEN INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + 3600)), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + 3600)), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; INSERT INTO workerTimeControl (userFk, timed, manual, isSendMail) - SELECT vWorkerFk, CONCAT(vDated, " ", SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + 4800)), TRUE, TRUE + SELECT vWorkerFk, CONCAT(vDated, ' ', SEC_TO_TIME(TIME_TO_SEC(MIN(j.start)) + 4800)), TRUE, TRUE FROM postgresql.journey j WHERE j.business_id = vBusinessFk AND j.day_id = WEEKDAY(vDated)+1; END IF; @@ -68263,18 +68790,18 @@ BEGIN UPDATE workerTimeControl wtc JOIN (SELECT id FROM workerTimeControl WHERE userFk = vWorkerFk AND - timed BETWEEN vDated AND CONCAT(vDated, " 23:59:59") + timed BETWEEN vDated AND CONCAT(vDated, ' 23:59:59') ORDER BY timed ASC LIMIT 1)sub on sub.id= wtc.id - SET direction = "in" ; + SET direction = 'in' ; UPDATE workerTimeControl wtc JOIN (SELECT id FROM workerTimeControl WHERE userFk = vWorkerFk AND - timed BETWEEN vDated AND CONCAT(vDated, " 23:59:59") + timed BETWEEN vDated AND CONCAT(vDated, ' 23:59:59') ORDER BY timed DESC LIMIT 1)sub on sub.id= wtc.id - SET direction = "out" ; + SET direction = 'out' ; END IF; @@ -68301,7 +68828,7 @@ BEGIN FETCH vCursor INTO vSender, vWorkerFk, vDated, vTimeWorkDecimal, vTimeWorkSexagesimal, vTimeTable, vTimeWorkedDecimal, vTimeWorkedSexagesimal, vAbsenceType, vBusinessFk ; IF vWorkerFk <> vWorkerFkOld OR vDone THEN - SELECT CONCAT( IFNULL(nif, ""), " - ", firstName, " ", name ) INTO vWorkerInfo + SELECT CONCAT( IFNULL(nif, ''), ' - ', firstName, ' ', name ) INTO vWorkerInfo FROM postgresql.person WHERE id_trabajador = vWorkerFkOld; SET vHeader = CONCAT("


@@ -68333,11 +68860,11 @@ BEGIN "); INSERT INTO mail(sender, replyto, subject, body) - VALUES (vSenderOld, "timecontrol@verdnatura.es", CONCAT("Registro de horas semana ", vWeek, " año ", vYear) , CONCAT(vHeader," " , vBody," ", vFooter)); + VALUES (vSenderOld, 'timecontrol@verdnatura.es', CONCAT('Registro de horas semana ', vWeek, ' año ', vYear) , CONCAT(vHeader,' ' , vBody,' ', vFooter)); INSERT IGNORE INTO workerTimeControlMail (workerFk, year,week) VALUES(vWorkerFkOld, vYear, vWeek); - SET vBody = ""; + SET vBody = ''; SET vTimeWorkDecimalTotal = 0; SET vWorkerFkOld = vWorkerFk ; SET vSenderOld = vSender; @@ -72246,6 +72773,24 @@ USE `salix`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `User` +-- + +/*!50001 DROP VIEW IF EXISTS `User`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `User` AS select `account`.`user`.`id` AS `id`,`account`.`user`.`realm` AS `realm`,`account`.`user`.`name` AS `username`,`account`.`user`.`bcryptPassword` AS `password`,`account`.`user`.`email` AS `email`,`account`.`user`.`emailVerified` AS `emailVerified`,`account`.`user`.`verificationToken` AS `verificationToken` from `account`.`user` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Current Database: `stock` -- @@ -72300,6 +72845,24 @@ USE `vn`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `accounting` +-- + +/*!50001 DROP VIEW IF EXISTS `accounting`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `accounting` AS select `b`.`Id_Banco` AS `id`,`b`.`Banco` AS `bank`,`b`.`Cuenta` AS `account`,`b`.`cash` AS `accountingTypeFk`,`b`.`entity_id` AS `entityFk`,`b`.`activo` AS `isActive` from `vn2008`.`Bancos` `b` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Final view structure for view `agencyProvince__` -- @@ -72354,6 +72917,24 @@ USE `vn`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `buyer` +-- + +/*!50001 DROP VIEW IF EXISTS `buyer`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `buyer` AS select distinct `u`.`id` AS `userFk`,`u`.`nickname` AS `nickname` from (`account`.`user` `u` join `vn`.`itemType` `it` on((`it`.`workerFk` = `u`.`id`))) where `u`.`active` order by `u`.`nickname` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Final view structure for view `calendar__` -- @@ -72434,12 +73015,12 @@ USE `vn`; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; /*!50001 SET @saved_col_connection = @@collation_connection */; -/*!50001 SET character_set_client = utf8 */; -/*!50001 SET character_set_results = utf8 */; -/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 SET character_set_client = utf8mb4 */; +/*!50001 SET character_set_results = utf8mb4 */; +/*!50001 SET collation_connection = utf8mb4_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ -/*!50001 VIEW `cmr_list` AS select `cmr`.`id` AS `cmrFk`,`cmr`.`ticketFk` AS `ticketFk`,`cmr`.`truckPlate` AS `truckPlate`,`cmr`.`observations` AS `observations`,`cmr`.`senderInstruccions` AS `senderInstruccions`,`cmr`.`paymentInstruccions` AS `paymentInstruccions`,`cmr`.`specialAgreements` AS `specialAgreements`,`cmr`.`created` AS `created`,`cmr`.`packagesList` AS `packagesList`,`aTo`.`nickname` AS `clientName`,`aTo`.`postalCode` AS `clientPostalCode`,`aTo`.`street` AS `clientStreet`,`aTo`.`city` AS `clientCity`,`pTo`.`name` AS `clientProvince`,`cTo`.`country` AS `clientCountry`,`su`.`name` AS `companyName`,`su`.`street` AS `companyStreet`,`su`.`postCode` AS `companyPostCode`,`su`.`city` AS `companyCity`,`cSu`.`country` AS `companyCountry`,concat(`aFrom`.`street`,' ',`aFrom`.`postalCode`,' ',`aFrom`.`city`,' (',`cFrom`.`country`,')') AS `warehouseAddress`,`cmr`.`created` AS `shipped`,`aTo`.`nickname` AS `clientOficialName`,`aSu`.`name` AS `carrierName`,`aSu`.`street` AS `carrierStreet`,`aSu`.`postCode` AS `carrierPostCode`,`aSu`.`city` AS `carrierCity`,`cAs`.`country` AS `carrierCountry`,ifnull(`aTo`.`phone`,`client`.`phone`) AS `phone`,ifnull(`aTo`.`mobile`,`client`.`mobile`) AS `mobile`,`aTo`.`id` AS `addressFk` from (((((((((((`cmr` left join `address` `aTo` on((`aTo`.`id` = `cmr`.`addressToFk`))) left join `province` `pTo` on((`pTo`.`id` = `aTo`.`provinceFk`))) left join `country` `cTo` on((`cTo`.`id` = `pTo`.`countryFk`))) left join `client` on((`client`.`id` = `aTo`.`clientFk`))) left join `supplier` `su` on((`su`.`id` = `cmr`.`companyFk`))) left join `country` `cSu` on((`cSu`.`id` = `su`.`countryFk`))) left join `address` `aFrom` on((`aFrom`.`id` = `cmr`.`addressFromFk`))) left join `province` `pFrom` on((`pFrom`.`id` = `aFrom`.`provinceFk`))) left join `country` `cFrom` on((`cFrom`.`id` = `pFrom`.`countryFk`))) left join `supplier` `aSu` on((`aSu`.`id` = `cmr`.`supplierFk`))) left join `country` `cAs` on((`cAs`.`id` = `aSu`.`countryFk`))) */; +/*!50001 VIEW `cmr_list` AS select `cmr`.`id` AS `cmrFk`,`cmr`.`ticketFk` AS `ticketFk`,`cmr`.`truckPlate` AS `truckPlate`,`cmr`.`observations` AS `observations`,`cmr`.`senderInstruccions` AS `senderInstruccions`,`cmr`.`paymentInstruccions` AS `paymentInstruccions`,`cmr`.`specialAgreements` AS `specialAgreements`,`cmr`.`created` AS `created`,`cmr`.`packagesList` AS `packagesList`,`aTo`.`nickname` AS `clientName`,`aTo`.`postalCode` AS `clientPostalCode`,`aTo`.`street` AS `clientStreet`,`aTo`.`city` AS `clientCity`,`pTo`.`name` AS `clientProvince`,`cTo`.`country` AS `clientCountry`,`su`.`name` AS `companyName`,`su`.`street` AS `companyStreet`,`su`.`postCode` AS `companyPostCode`,`su`.`city` AS `companyCity`,`cSu`.`country` AS `companyCountry`,concat(`aFrom`.`street`,' ',`aFrom`.`postalCode`,' ',`aFrom`.`city`,' (',`cFrom`.`country`,')') AS `warehouseAddress`,`cmr`.`created` AS `shipped`,`aTo`.`nickname` AS `clientOficialName`,`cmr`.`supplierFk` AS `supplierFk`,`aSu`.`name` AS `carrierName`,`aSu`.`street` AS `carrierStreet`,`aSu`.`postCode` AS `carrierPostCode`,`aSu`.`city` AS `carrierCity`,`cAs`.`country` AS `carrierCountry`,ifnull(`aTo`.`phone`,`client`.`phone`) AS `phone`,ifnull(`aTo`.`mobile`,`client`.`mobile`) AS `mobile`,`aTo`.`id` AS `addressFk` from (((((((((((`cmr` left join `address` `aTo` on((`aTo`.`id` = `cmr`.`addressToFk`))) left join `province` `pTo` on((`pTo`.`id` = `aTo`.`provinceFk`))) left join `country` `cTo` on((`cTo`.`id` = `pTo`.`countryFk`))) left join `client` on((`client`.`id` = `aTo`.`clientFk`))) left join `supplier` `su` on((`su`.`id` = `cmr`.`companyFk`))) left join `country` `cSu` on((`cSu`.`id` = `su`.`countryFk`))) left join `address` `aFrom` on((`aFrom`.`id` = `cmr`.`addressFromFk`))) left join `province` `pFrom` on((`pFrom`.`id` = `aFrom`.`provinceFk`))) left join `country` `cFrom` on((`cFrom`.`id` = `pFrom`.`countryFk`))) left join `supplier` `aSu` on((`aSu`.`id` = `cmr`.`supplierFk`))) left join `country` `cAs` on((`cAs`.`id` = `aSu`.`countryFk`))) */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; @@ -72727,7 +73308,7 @@ USE `vn`; /*!50001 SET collation_connection = utf8_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ -/*!50001 VIEW `expeditionPallet_Print` AS select `et2`.`description` AS `truck`,`t`.`routeFk` AS `routeFk`,`r`.`description` AS `zone`,count(`es`.`id`) AS `eti`,`ep`.`id` AS `palletFk`,(`et`.`id` <=> `rm`.`expeditionTruckFk`) AS `isMatch`,37 AS `warehouseFk` from (((((((`vn`.`expeditionTruck` `et` join `vn`.`expeditionPallet` `ep` on((`ep`.`truckFk` = `et`.`id`))) join `vn`.`expeditionScan` `es` on((`es`.`palletFk` = `ep`.`id`))) join `vn`.`expedition` `e` on((`e`.`id` = `es`.`expeditionFk`))) join `vn`.`ticket` `t` on((`t`.`id` = `e`.`ticketFk`))) join `vn`.`route` `r` on((`r`.`id` = `t`.`routeFk`))) left join `vn2008`.`Rutas_monitor` `rm` on((`rm`.`Id_Ruta` = `r`.`id`))) left join `vn`.`expeditionTruck` `et2` on((`et2`.`id` = `rm`.`expeditionTruckFk`))) where (`ep`.`isPrint` = 0) group by `ep`.`id`,`t`.`routeFk` */; +/*!50001 VIEW `expeditionPallet_Print` AS select `et2`.`description` AS `truck`,`t`.`routeFk` AS `routeFk`,`r`.`description` AS `zone`,count(`es`.`id`) AS `eti`,`ep`.`id` AS `palletFk`,(`et`.`id` <=> `rm`.`expeditionTruckFk`) AS `isMatch`,`t`.`warehouseFk` AS `warehouseFk` from (((((((`vn`.`expeditionTruck` `et` join `vn`.`expeditionPallet` `ep` on((`ep`.`truckFk` = `et`.`id`))) join `vn`.`expeditionScan` `es` on((`es`.`palletFk` = `ep`.`id`))) join `vn`.`expedition` `e` on((`e`.`id` = `es`.`expeditionFk`))) join `vn`.`ticket` `t` on((`t`.`id` = `e`.`ticketFk`))) join `vn`.`route` `r` on((`r`.`id` = `t`.`routeFk`))) left join `vn2008`.`Rutas_monitor` `rm` on((`rm`.`Id_Ruta` = `r`.`id`))) left join `vn`.`expeditionTruck` `et2` on((`et2`.`id` = `rm`.`expeditionTruckFk`))) where (`ep`.`isPrint` = 0) group by `ep`.`id`,`t`.`routeFk` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; @@ -72745,7 +73326,7 @@ USE `vn`; /*!50001 SET collation_connection = utf8_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ -/*!50001 VIEW `expeditionRoute_Monitor` AS select `r`.`id` AS `routeFk`,count(distinct if(isnull(`e`.`id`),`t`.`id`,NULL)) AS `tickets`,count(distinct `e`.`id`) AS `expeditions`,count(distinct `es`.`id`) AS `scanned`,max(`e`.`created`) AS `lastPacked` from (((((`vn`.`route` `r` join `vn`.`routesMonitor` `rm` on((`r`.`id` = `rm`.`routeFk`))) join `vn`.`expeditionTruck` `et` on((`et`.`id` = `rm`.`expeditionTruckFk`))) join `vn`.`ticket` `t` on((`t`.`routeFk` = `r`.`id`))) left join `vn`.`expedition` `e` on((`e`.`ticketFk` = `t`.`id`))) left join `vn`.`expeditionScan` `es` on((`es`.`expeditionFk` = `e`.`id`))) where (`et`.`ETD` >= curdate()) group by `r`.`id` */; +/*!50001 VIEW `expeditionRoute_Monitor` AS select `r`.`id` AS `routeFk`,count(distinct if(isnull(`e`.`id`),`t`.`id`,NULL)) AS `tickets`,count(distinct `e`.`id`) AS `expeditions`,count(distinct `es`.`id`) AS `scanned`,max(`e`.`created`) AS `lastPacked` from ((((((`vn`.`route` `r` join `vn`.`routesMonitor` `rm` on((`r`.`id` = `rm`.`routeFk`))) join `vn`.`expeditionTruck` `et` on((`et`.`id` = `rm`.`expeditionTruckFk`))) join `vn`.`ticket` `t` on((`t`.`routeFk` = `r`.`id`))) left join `vn`.`expedition` `e` on((`e`.`ticketFk` = `t`.`id`))) left join `vn`.`expeditionScan` `es` on((`es`.`expeditionFk` = `e`.`id`))) left join `vn`.`stowaway` `st` on((`st`.`id` = `t`.`id`))) where ((`et`.`ETD` >= curdate()) and isnull(`st`.`id`)) group by `r`.`id` */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; @@ -72758,12 +73339,12 @@ USE `vn`; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; /*!50001 SET @saved_col_connection = @@collation_connection */; -/*!50001 SET character_set_client = utf8mb4 */; -/*!50001 SET character_set_results = utf8mb4 */; -/*!50001 SET collation_connection = utf8mb4_general_ci */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ -/*!50001 VIEW `expeditionRoute_freeTickets` AS select `t`.`routeFk` AS `routeFk`,`tss`.`ticket` AS `ticket`,`s`.`name` AS `code`,`w`.`name` AS `almacen`,`tss`.`updated` AS `updated` from (((`vn`.`ticketStateToday` `tss` join `vn`.`ticket` `t` on((`t`.`id` = `tss`.`ticket`))) join `vn`.`warehouse` `w` on((`w`.`id` = `t`.`warehouseFk`))) join `vn`.`state` `s` on((`s`.`id` = `tss`.`state`))) where (ifnull(`t`.`packages`,0) = 0) */; +/*!50001 VIEW `expeditionRoute_freeTickets` AS select `t`.`routeFk` AS `routeFk`,`tss`.`ticket` AS `ticket`,`s`.`name` AS `code`,`w`.`name` AS `almacen`,`tss`.`updated` AS `updated` from ((((`vn`.`ticketStateToday` `tss` join `vn`.`ticket` `t` on((`t`.`id` = `tss`.`ticket`))) join `vn`.`warehouse` `w` on((`w`.`id` = `t`.`warehouseFk`))) join `vn`.`state` `s` on((`s`.`id` = `tss`.`state`))) left join `vn`.`stowaway` `st` on((`st`.`id` = `t`.`id`))) where ((ifnull(`t`.`packages`,0) = 0) and isnull(`st`.`id`)) */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; @@ -73020,6 +73601,24 @@ USE `vn`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `invoiceInDueDay__` +-- + +/*!50001 DROP VIEW IF EXISTS `invoiceInDueDay__`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `invoiceInDueDay__` AS select `r`.`id` AS `id`,`r`.`recibida_id` AS `invoiceInFk`,`r`.`fecha` AS `dueDated`,`r`.`banco_id` AS `bankFk`,`r`.`cantidad` AS `amount`,`r`.`divisa` AS `foreignValue`,`r`.`stamp` AS `created` from `vn2008`.`recibida_vencimiento` `r` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Final view structure for view `invoiceInEntry__` -- @@ -73038,6 +73637,24 @@ USE `vn`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `invoiceInIntrastat__` +-- + +/*!50001 DROP VIEW IF EXISTS `invoiceInIntrastat__`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `invoiceInIntrastat__` AS select `r`.`recibida_id` AS `invoiceInFk`,`r`.`Codintrastat` AS `intrastatFk`,`r`.`importe` AS `amount` from `vn2008`.`recibida_intrastat` `r` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Final view structure for view `itemBotanicalWithGenus` -- @@ -73668,6 +74285,24 @@ USE `vn`; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; +-- +-- Final view structure for view `saleMistake_list` +-- + +/*!50001 DROP VIEW IF EXISTS `saleMistake_list`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = utf8 */; +/*!50001 SET character_set_results = utf8 */; +/*!50001 SET collation_connection = utf8_general_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`z-developer`@`%` SQL SECURITY DEFINER */ +/*!50001 VIEW `saleMistake_list` AS select `st`.`saleFk` AS `saleFk`,concat(`w2`.`firstName`,' ',`w2`.`lastName`) AS `sacador`,`st`.`created` AS `created`,concat(`w`.`firstName`,' ',`w`.`lastName`) AS `revisador`,`mt`.`description` AS `description`,`sm`.`created` AS `controlled` from (((((`vn`.`saleTracking` `st` join `vn`.`worker` `w2` on((`w2`.`id` = `st`.`workerFk`))) join `vncontrol`.`accion` `a` on(((`a`.`accion_id` = `st`.`actionFk`) and (`a`.`accion` = 'SACAR')))) left join `vn`.`saleMistake` `sm` on((`st`.`saleFk` = `sm`.`saleFk`))) left join `vn`.`mistakeType` `mt` on((`mt`.`id` = `sm`.`typeFk`))) left join `vn`.`worker` `w` on((`w`.`id` = `sm`.`userFk`))) where (`st`.`created` > '2020-10-01') */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; + -- -- Final view structure for view `saleValue` -- @@ -74259,4 +74894,4 @@ USE `vncontrol`; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-11-02 10:31:18 +-- Dump completed on 2020-11-25 9:17:08 diff --git a/db/export-data.sh b/db/export-data.sh index db4e2a003..b2ba97569 100755 --- a/db/export-data.sh +++ b/db/export-data.sh @@ -69,6 +69,8 @@ TABLES=( imageCollection tpvError tpvResponse + imageCollectionSize + ) dump_tables ${TABLES[@]} diff --git a/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js b/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js index 8dee7e4c6..fcf871d9b 100644 --- a/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js +++ b/modules/client/back/methods/client/specs/activeWorkersWithRole.spec.js @@ -7,7 +7,7 @@ describe('Client activeWorkersWithRole', () => { let isSalesPerson = await app.models.Account.hasRole(result[0].id, 'salesPerson'); - expect(result.length).toEqual(17); + expect(result.length).toEqual(19); expect(isSalesPerson).toBeTruthy(); }); @@ -17,7 +17,7 @@ describe('Client activeWorkersWithRole', () => { let isBuyer = await app.models.Account.hasRole(result[0].id, 'buyer'); - expect(result.length).toEqual(16); + expect(result.length).toEqual(17); expect(isBuyer).toBeTruthy(); }); }); diff --git a/modules/client/back/methods/client/specs/getCard.spec.js b/modules/client/back/methods/client/specs/getCard.spec.js index 18519d440..e8ac7b3bc 100644 --- a/modules/client/back/methods/client/specs/getCard.spec.js +++ b/modules/client/back/methods/client/specs/getCard.spec.js @@ -7,6 +7,6 @@ describe('Client get', () => { expect(result.id).toEqual(101); expect(result.name).toEqual('Bruce Wayne'); - expect(result.debt).toEqual(889.38); + expect(result.debt).toEqual(887.38); }); }); diff --git a/modules/client/back/methods/client/specs/getDebt.spec.js b/modules/client/back/methods/client/specs/getDebt.spec.js index 9e539c219..9d3061ebb 100644 --- a/modules/client/back/methods/client/specs/getDebt.spec.js +++ b/modules/client/back/methods/client/specs/getDebt.spec.js @@ -4,7 +4,7 @@ describe('client getDebt()', () => { it('should return the client debt', async() => { let result = await app.models.Client.getDebt(101); - expect(result.debt).toEqual(889.38); + expect(result.debt).toEqual(887.38); }); }); diff --git a/modules/client/back/methods/client/specs/listWorkers.spec.js b/modules/client/back/methods/client/specs/listWorkers.spec.js index 68eb84273..271347969 100644 --- a/modules/client/back/methods/client/specs/listWorkers.spec.js +++ b/modules/client/back/methods/client/specs/listWorkers.spec.js @@ -6,7 +6,7 @@ describe('Client listWorkers', () => { .then(result => { let amountOfEmployees = Object.keys(result).length; - expect(amountOfEmployees).toEqual(53); + expect(amountOfEmployees).toEqual(54); done(); }) .catch(done.fail); diff --git a/modules/client/back/methods/client/specs/summary.spec.js b/modules/client/back/methods/client/specs/summary.spec.js index e4ebd9c67..882abcab2 100644 --- a/modules/client/back/methods/client/specs/summary.spec.js +++ b/modules/client/back/methods/client/specs/summary.spec.js @@ -17,7 +17,7 @@ describe('client summary()', () => { it('should return a summary object containing debt', async() => { let result = await app.models.Client.summary(101); - expect(result.debt.debt).toEqual(889.38); + expect(result.debt.debt).toEqual(887.38); }); it('should return a summary object containing averageInvoiced', async() => { diff --git a/modules/ticket/back/methods/ticket/specs/getTotal.spec.js b/modules/ticket/back/methods/ticket/specs/getTotal.spec.js index c3494bba9..d0191e55a 100644 --- a/modules/ticket/back/methods/ticket/specs/getTotal.spec.js +++ b/modules/ticket/back/methods/ticket/specs/getTotal.spec.js @@ -4,7 +4,7 @@ describe('ticket getTotal()', () => { it('should return the total of a ticket', async() => { let result = await app.models.Ticket.getTotal(1); - expect(result).toEqual(893.87); + expect(result).toEqual(891.87); }); it(`should return zero if the ticket doesn't have lines`, async() => { From ba156a2e4207fd6e7eb090867d2e1e9773c8881c Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 27 Nov 2020 11:56:41 +0100 Subject: [PATCH 29/35] log refactor --- loopback/util/log.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/loopback/util/log.js b/loopback/util/log.js index cf12dcb2f..baba3e827 100644 --- a/loopback/util/log.js +++ b/loopback/util/log.js @@ -5,7 +5,6 @@ */ exports.translateValues = async(instance, changes) => { const models = instance.app.models; - function getRelation(instance, property) { const relations = instance.definition.settings.relations; for (let relationName in relations) { @@ -38,12 +37,18 @@ exports.translateValues = async(instance, changes) => { for (let property in properties) { const relation = getRelation(instance, property); const value = properties[property]; - let finalValue = value; + if (relation) { + let fieldsToShow = ['alias', 'name', 'code', 'description']; + const log = instance.definition.settings.log; + + if (log && log.showField) + fieldsToShow = log.showField; + const model = relation.model; const row = await models[model].findById(value, { - fields: ['alias', 'name', 'code', 'description'] + fields: fieldsToShow }); const newValue = getValue(row); if (newValue) finalValue = newValue; From aaee855da3a7c289200bdd784cc80e3b94633f46 Mon Sep 17 00:00:00 2001 From: bernat Date: Thu, 3 Dec 2020 10:26:49 +0100 Subject: [PATCH 30/35] fix ticket component --- modules/ticket/front/component/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/front/component/index.js b/modules/ticket/front/component/index.js index 2a5988719..307f8af15 100644 --- a/modules/ticket/front/component/index.js +++ b/modules/ticket/front/component/index.js @@ -39,7 +39,7 @@ class Controller extends Section { if (!value) return; this.getTheoricalCost(); this.getComponentsSum(); - if (this.ticket.zone.isVolumetric) + if (this.ticket.zone && this.ticket.zone.isVolumetric) this.getTicketVolume(); } From 96f603a44b0fcb2d36b6dafa85bfca38fc2dbf4c Mon Sep 17 00:00:00 2001 From: bernat Date: Fri, 4 Dec 2020 13:40:58 +0100 Subject: [PATCH 31/35] refactor descriptors --- e2e/paths/04-item/12_descriptor.spec.js | 15 +++------------ .../05-ticket/01-sale/02_edit_sale.spec.js | 1 - e2e/paths/05-ticket/12_descriptor.spec.js | 6 +----- front/core/styles/icons/salixfont.css | 14 ++++++++++---- front/core/styles/icons/salixfont.svg | 6 ++++-- front/core/styles/icons/salixfont.ttf | Bin 32980 -> 34968 bytes front/core/styles/icons/salixfont.woff | Bin 33056 -> 35044 bytes front/salix/components/descriptor/style.scss | 8 ++------ modules/account/front/descriptor/index.html | 4 ++-- modules/client/front/descriptor/index.html | 10 +++++----- modules/entry/front/descriptor/index.html | 4 ++-- modules/item/front/descriptor/index.html | 2 +- modules/route/front/descriptor/index.html | 2 +- modules/supplier/front/descriptor/index.html | 4 ++-- modules/ticket/front/descriptor/index.html | 10 +++++----- 15 files changed, 38 insertions(+), 48 deletions(-) diff --git a/e2e/paths/04-item/12_descriptor.spec.js b/e2e/paths/04-item/12_descriptor.spec.js index 7c6fa074c..eb9ed2573 100644 --- a/e2e/paths/04-item/12_descriptor.spec.js +++ b/e2e/paths/04-item/12_descriptor.spec.js @@ -16,14 +16,6 @@ describe('Item descriptor path', () => { await browser.close(); }); - it('should check the descriptor inactive icon is dark as the item is active', async() => { - await page.waitForSelector(selectors.itemDescriptor.inactiveIcon); - await page.waitForClassNotPresent(selectors.itemDescriptor.inactiveIcon, 'bright'); - const darkIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); - - expect(darkIcon).toBeTruthy(); - }); - it('should set the item to inactive', async() => { await page.waitToClick(selectors.itemBasicData.isActiveCheckbox); await page.waitToClick(selectors.itemBasicData.submitBasicDataButton); @@ -32,12 +24,11 @@ describe('Item descriptor path', () => { expect(message.text).toContain('Data saved!'); }); - it('should reload the section and check the inactive icon is bright', async() => { + it('should reload the section and check the inactive icon is visible', async() => { await page.reloadSection('item.card.basicData'); - await page.waitForClassPresent(selectors.itemDescriptor.inactiveIcon, 'bright'); - const brightIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); + const visibleIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); - expect(brightIcon).toBeTruthy(); + expect(visibleIcon).toBeTruthy(); }); it('should set the item back to active', async() => { diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index 248f38927..d0c0cfeda 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -397,6 +397,5 @@ describe('Ticket Edit sale path', () => { it(`should check the ticket is deleted`, async() => { await page.waitForSelector(selectors.ticketDescriptor.isDeletedIcon); - await page.waitForClassPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright'); }); }); diff --git a/e2e/paths/05-ticket/12_descriptor.spec.js b/e2e/paths/05-ticket/12_descriptor.spec.js index c426f7d7f..1c7895382 100644 --- a/e2e/paths/05-ticket/12_descriptor.spec.js +++ b/e2e/paths/05-ticket/12_descriptor.spec.js @@ -56,7 +56,7 @@ describe('Ticket descriptor path', () => { await page.write(selectors.ticketsIndex.topbarSearch, '18'); await page.waitToClick(selectors.globalItems.searchButton); await page.waitForState('ticket.card.summary'); - await page.waitForClassPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright'); + await page.isVisible(selectors.ticketDescriptor.isDeletedIcon); const result = await page.waitToGetProperty(selectors.ticketsIndex.searchResultDate, 'innerText'); expect(result).toContain(2000); @@ -73,10 +73,6 @@ describe('Ticket descriptor path', () => { expect(message.text).toContain('Data saved!'); }); - - it('should make sure the ticketDeleted icon is no longer bright', async() => { - await page.waitForClassNotPresent(selectors.ticketDescriptor.isDeletedIcon, 'bright'); - }); }); describe('Add stowaway', () => { diff --git a/front/core/styles/icons/salixfont.css b/front/core/styles/icons/salixfont.css index aafc549a1..bdd37b290 100644 --- a/front/core/styles/icons/salixfont.css +++ b/front/core/styles/icons/salixfont.css @@ -22,10 +22,18 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } +.icon-invoiceIn:before { + content: "\e960"; + color: #5f5f5f; +} +.icon-invoiceOut:before { + content: "\e961"; + color: #5f5f5f; +} .icon-supplier:before { content: "\e936"; } -.icon-latestBuys:before { +.icon-latestBuy:before { content: "\e95f"; } .icon-zone:before { @@ -99,6 +107,7 @@ } .icon-invoices:before { content: "\e91c"; + color: #5f5f5f; } .icon-pets:before { content: "\e94e"; @@ -295,9 +304,6 @@ .icon-stowaway:before { content: "\e92c"; } -.icon-supplier:before { - content: "\e936"; -} .icon-tags:before { content: "\e937"; } diff --git a/front/core/styles/icons/salixfont.svg b/front/core/styles/icons/salixfont.svg index ee14609a4..ca547518d 100644 --- a/front/core/styles/icons/salixfont.svg +++ b/front/core/styles/icons/salixfont.svg @@ -35,7 +35,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -103,6 +103,8 @@ + + diff --git a/front/core/styles/icons/salixfont.ttf b/front/core/styles/icons/salixfont.ttf index 6958c0e3dd4cfaa662de976ebb1ce9e38a78daec..2d986be4172f153eeb1f7b6d537fcc0461635e00 100644 GIT binary patch delta 3014 zcmb_eZ){Ul6u+nU?Y_R(*KJ+@&2BAgyS|Q&j;`(ciYr}}MbWSbABMUJWD~{+f3~>A zO~QB+1m_14G9}7~eIUjUKr&(zLLxCl6B8pUDlv$OQKBCdqhB!b&sIJ6b(Mi*K-|lH z@7{avJ?EZ#?)m-hyY#&2^&_Ukem#8d3qqil5VCn|_uv55mDnG{+PrngbG>^9KQ&>0 zoRED_^=;|i?D=WaC?Wg5$MIAj3dHvXm5>*>etqB0p^-OUv@~HqhdOWW=zqHVl_yVM zBIE#{e`#m;$N<@IdX|ubXR%+mt9$2`>WzLf-u@k z#JCgTnA!-jWJ@gB%w<_9$+Dnj0S&r+fCVQvV@Vn+s9z3ZvEXXh;tTko6=II&n8R6; z=|!PofZK?t&?L9721Lj~r>rP);iPP_$aC9cT);o3O*8AGSw)f+)nn?EE#dn-sv^&f zNlG?q8e5j-{hXvI(t0kLK5FVzq?s>0s;O6YSS7p6bcy9Cqh%m4_DC0H0tKKV>!21Y zS4g6T3bH_D0Uw~OT(&mY?M|no4!3)O;Uic? zfr;ogx+j!z_i-<{CKJ&$6Qv*s6d#6@a0`;4$gGM1rJ_+l052*Q)dY|#WXXzV6iGCr zO)3a^n{U9Ye~jrlg(=)dR*}cZW=u}aExPe+%kbDj?lOnVX{1|AGNsWbsDQARa=Gnz zlvGW%K^mGh{-)wQPwWo#O>}D%Q`5*oJaUY<+vUIHmQpl(J9MmrJLQziHt z;c*8s zvzCLJY=aci7H-oS!*Jwo;9tg*yA|{(n#nnJL^-0pKuX+z;@Qc_2m&TUr`5{A$N2+3 z6BUZ7fJG2E8I((vk$Z$XRoE=47@VTdPbzlFg(-U8V6>dzEKC)-4Jm~wbSl@?mBZJw zPGmiz*u%ti%wm?Hx5O7=)ID}HK|rri*r<98Rygr5jkF6o(DqsCpc12sgyd1=nk&c^ zMQ-2~E^MX@=HZ5gr~x^00s5izD$}hZ_ZlO*j#D0^tV+IS><)K$vXPZh4ad^7OpI8V zL>3(_I=^u49xjWH79IY3sVxAP#XyV5kR}j~$Ox^V<97)lt==7679B169d5>3;POAv zqH>%_W(zB#W)>|vCfz;2Wzo^HVeUm>R9j*NjRqaca~&QNMSU{(HsS6&ETQ zUWQNDj@qtQRaf;n9(44&*0^4Ez3cv<`mATS=W5N`n$xxE+JoL|@3{Ar?;+nWOMdnz z{gZ+F1D^y3f@kWh>xV+-&{cJxdP=>hPKQ(Bec^KrhZ`<0-5rTF9&h}7nJ4;8^m@}s x)5Yb7Vq?vhd{?ENv;2%un$IAc! delta 965 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 diff --git a/front/salix/components/descriptor/style.scss b/front/salix/components/descriptor/style.scss index 814df2ca5..f7055c0fc 100644 --- a/front/salix/components/descriptor/style.scss +++ b/front/salix/components/descriptor/style.scss @@ -71,13 +71,9 @@ vn-descriptor-content { & > vn-icon { padding: $spacing-xs $spacing-sm; - color: $color-marginal; font-size: 1.5rem; - - &.bright { - color: $color-main; - opacity: 1; - } + color: $color-main; + opacity: 1; } } & > .quicklinks { diff --git a/modules/account/front/descriptor/index.html b/modules/account/front/descriptor/index.html index 50e4d2177..a1ce252a6 100644 --- a/modules/account/front/descriptor/index.html +++ b/modules/account/front/descriptor/index.html @@ -78,12 +78,12 @@ + ng-if="!$ctrl.user.active"> + ng-if="$ctrl.hasAccount"> diff --git a/modules/client/front/descriptor/index.html b/modules/client/front/descriptor/index.html index 634436395..dc79d224b 100644 --- a/modules/client/front/descriptor/index.html +++ b/modules/client/front/descriptor/index.html @@ -47,27 +47,27 @@ + ng-if="$ctrl.client.isActive == false"> + ng-if="$ctrl.client.isFreezed == true"> + ng-if="$ctrl.client.account.active == false"> + ng-if="$ctrl.client.debt > $ctrl.client.credit"> + ng-if="$ctrl.client.isTaxDataChecked == false">