diff --git a/CHANGELOG.md b/CHANGELOG.md
index 73ebecabc..67ffe9f12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,134 @@
+# Version 25.00 - 2025-01-14
+
+### Added 🆕
+
+- feat: refs #7235 add serialType parameter to getInvoiceDate and implement corresponding tests by:jgallego
+- feat: refs #7301 update lastEntriesFilter to include landedDate and enhance test cases (origin/7301-removeRedundantInventories) by:pablone
+- feat: refs #7880 error code and translations by:ivanm
+- feat: refs #7924 add isCustomInspectionRequired field to item and update related logic by:jgallego
+- feat: refs #8167 update canBeInvoiced method to include active status check and improve test cases by:jgallego
+- feat: refs #8167 update locale and improve invoicing logic with error handling by:jgallego
+- feat: refs #8246 added relation for the front's new field by:Jon
+- feat: refs #8266 added itemFk and needed fixtures by:jtubau
+- feat: refs #8324 country unique by:Carlos Andrés
+
+### Changed 📦
+
+
+### Fixed 🛠️
+
+- feat: refs #8266 added itemFk and needed fixtures by:jtubau
+- fix: add isCustomInspectionRequired column to item table for customs inspection indication by:jgallego
+- fix: canBeInvoiced only in makeInvoice by:alexm
+- fix: hotFix getMondayWeekYear by:alexm
+- fix: refs #6598 update ACL property assignment by:jorgep
+- fix: refs #6861 refs#6861 addPrevOK by:sergiodt
+- fix: refs #7301 remove debug console log and update test cases in lastEntriesFilter by:pablone
+- fix: refs #7301 update SQL fixtures and improve lastEntriesFilter logic by:pablone
+
+# Version 24.52 - 2024-01-07
+
+### Added 🆕
+
+- chore: pullinfo by:alexm
+- chore: refs #8002 drop comments by:jorgep
+- chore: refs #8002 drop useless code by:jorgep
+- feat: added translations and show error in item-type by:Jon
+- feat: modified data to be equal as the updated back by:Jon
+- feat: refs #4460 invoiceIn refund by:Carlos Andrés
+- feat: refs #4466 invoiceIn refund by:Carlos Andrés
+- feat: refs #6583 add new opt in where builder by:jorgep
+- feat: refs #6583 add tests by:jorgep
+- feat: refs #6583 retrieve cloned sale by:jorgep
+- feat: refs #6583 rollback by:jorgep
+- feat: refs #7301 add inventory-config and acl by:pablone
+- feat: refs #7301 update SQL fixtures and enhance lastEntriesFilter logic by:pablone
+- feat: refs #7882 Added locationiq service by:guillermo
+- feat: refs #7882 Added osrm service by:guillermo
+- feat: refs #7882 Added tests by:guillermo
+- feat: refs #7882 Fixed problems osrm service by:guillermo
+- feat: refs #7882 Osrm service by:guillermo
+- feat: refs #7882 Reequested changes by:guillermo
+- feat: refs #7882 Requested changes by:guillermo
+- feat: refs #7936 add back test for updateInvoiceIn by:jorgep
+- feat: refs #7936 add company filter by:jorgep
+- feat: refs #7936 add currency check to updateInvoiceIn by:jorgep
+- feat: refs #7936 add currency handling in invoiceIn trigger by:jorgep
+- feat: refs #7936 add locale by:jorgep
+- feat: refs #7936 add minimum due date by:jorgep
+- feat: refs #7936 add reference rates for currency in fixtures by:jorgep
+- feat: refs #7936 add save validation by:jorgep
+- feat: refs #7936 add SiiTypeInvoiceIn model and update invoice correction logic by:jorgep
+- feat: refs #7936 add tests for invoiceIn by:jorgep
+- feat: refs #7936 add tests for invoiceIn filter by:jorgep
+- feat: refs #7936 add validation to InvoiceIn & InvoiceInTax by:jorgep
+- feat: refs #7936 return country code & is vies fields by:jorgep
+- feat: refs #8002 adjust to lilium by:jorgep
+- feat: refs #8002 drop support btn by:jorgep
+- feat: refs #8174 Changed datatype incompatibility access by:guillermo
+- feat: refs #8174 Created table sim by:guillermo
+- feat: refs #8174 create table simsupplier by:Jbreso
+- feat: refs #8174 fix by:Jbreso
+- feat: refs#8174 simSupplier by:Jbreso
+- feat: refs #8190 entry_getCommission by:robert
+- feat: refs #8190 entry_getCommission change request by:robert
+- feat: refs #8218 Added time and code in mistakeType by:guillermo
+- feat: refs #8293 include zone data by:Jtubau
+- refactor: refs #6583 entry report table style by:jorgep
+
+### Changed 📦
+
+- refactor: refs #6583 entry report table style by:jorgep
+- refactor: refs #6583 use warehouseId var by:jorgep
+- refactor: refs #7301 update entry and item filter tests to validate results against specific criteria by:pablone
+- refactor: refs #7882 Added ACL's by:guillermo
+- refactor: refs #7882 Deleted quadminds files by:guillermo
+- refactor: refs #7936 add transaction & tests by:jorgep
+- refactor: refs #7936 remove old trigger and add isRaid column to travel table by:jorgep
+- refactor: refs #7936 remove schema by:jorgep
+- refactor: refs #8002 use loop wip by:jorgep
+- refactor: refs #8004 simplify SQL query by removing redundant aliases by:pablone
+- refactor: refs #8262 Deprecated inventoryFailure by:guillermo
+- refactor: refs #8266 changed expedition item name by:Jtubau
+- refactor: refs #8272 delete bi.rotacion by:ivanm
+
+### Fixed 🛠️
+
+- feat: refs #7301 update SQL fixtures and enhance lastEntriesFilter logic by:pablone
+- feat: refs #7936 add reference rates for currency in fixtures by:jorgep
+- feat: refs #8174 fix by:Jbreso
+- fix: 8174 pasar PIN a CHAR by:Jbreso
+- fix: monitorPayMethodFilter by:carlossa
+- fix: refs #6389 back by:carlossa
+- fix: refs #6389 filter by:carlossa
+- fix: refs #6389 packing by:carlossa
+- fix: refs #6389 saleMonitor filter by:carlossa
+- fix: refs #6389 salesFilter by:carlossa
+- fix: refs #6583 drop focus by:jorgep
+- fix: refs #6583 update onlyWithDestination logic to handle null values correctly by:jorgep
+- fix: refs #7028 fix confirm deny by:carlossa
+- fix: refs #7028 fix pr by:carlossa
+- fix: refs #7028 fix tback findById by:carlossa
+- fix: refs #7028 fix userError by:carlossa
+- fix: refs #7028 remove ifs by:carlossa
+- fix: refs #7028 requesterId fix by:carlossa
+- fix: refs #7028 requesterId fix salesPerson by:carlossa
+- fix: refs #7031 fix vnPrice by:carlossa
+- fix: refs #7031 remove check by:carlossa
+- fix: refs #7301 update ACL insertion to use INSERT IGNORE and refine property value by:pablone
+- fix: refs #7936 add IF NOT EXISTS to isRaid column in travel table by:jorgep
+- fix: refs #7936 change type by:jorgep
+- fix: refs #7936 check if insert in hook & change test description by:jorgep
+- fix: refs #7936 conflicts by:jorgep
+- fix: refs #7936 locale by:jorgep
+- fix: refs #7936 update Spanish locale for SII terms by:jorgep
+- fix: refs #8174 fix by:Jbreso
+- fix: refs#8174 fix by:Jbreso
+- fix: refs8174 pasar a char el PIN by:Jbreso
+- fix: refs #8174 Version by:guillermo
+- fix: refs #8251 add eng template by:carlossa
+- fix: refs #8315 fixture claimDevelopment by:alexm
+
# Version 24.48 - 2024-11-25
### Added 🆕
diff --git a/Jenkinsfile b/Jenkinsfile
index 19f47c5b0..06addc940 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -7,7 +7,8 @@ def RUN_BUILD
def BRANCH_ENV = [
test: 'test',
- master: 'production'
+ master: 'production',
+ beta: 'production'
]
node {
@@ -18,7 +19,8 @@ node {
PROTECTED_BRANCH = [
'dev',
'test',
- 'master'
+ 'master',
+ 'beta'
].contains(env.BRANCH_NAME)
FROM_GIT = env.JOB_NAME.startsWith('gitea/')
@@ -62,6 +64,18 @@ pipeline {
PROJECT_NAME = 'salix'
}
stages {
+ stage('Version') {
+ when {
+ expression { RUN_BUILD }
+ }
+ steps {
+ script {
+ def packageJson = readJSON file: 'package.json'
+ def version = "${packageJson.version}-build${env.BUILD_ID}"
+ writeFile(file: 'VERSION.txt', text: version)
+ }
+ }
+ }
stage('Install') {
environment {
NODE_ENV = ''
@@ -118,11 +132,10 @@ pipeline {
when {
expression { RUN_BUILD }
}
+ environment {
+ VERSION = readFile 'VERSION.txt'
+ }
steps {
- script {
- def packageJson = readJSON file: 'package.json'
- env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
- }
sh 'docker-compose build back'
}
}
@@ -156,11 +169,10 @@ pipeline {
when {
expression { RUN_BUILD }
}
+ environment {
+ VERSION = readFile 'VERSION.txt'
+ }
steps {
- script {
- def packageJson = readJSON file: 'package.json'
- env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
- }
sh 'gulp build'
sh 'docker-compose build front'
}
@@ -175,12 +187,9 @@ pipeline {
}
environment {
CREDENTIALS = credentials('docker-registry')
+ VERSION = readFile 'VERSION.txt'
}
steps {
- script {
- def packageJson = readJSON file: 'package.json'
- env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
- }
sh 'docker login --username $CREDENTIALS_USR --password $CREDENTIALS_PSW $REGISTRY'
sh 'docker-compose push'
}
@@ -207,11 +216,10 @@ pipeline {
when {
expression { FROM_GIT }
}
+ environment {
+ VERSION = readFile 'VERSION.txt'
+ }
steps {
- script {
- def packageJson = readJSON file: 'package.json'
- env.VERSION = "${packageJson.version}-build${env.BUILD_ID}"
- }
withKubeConfig([
serverUrl: "$KUBERNETES_API",
credentialsId: 'kubernetes',
diff --git a/back/methods/chat/sendCheckingPresence.js b/back/methods/chat/sendCheckingPresence.js
index 7ab5d63fe..955ed0240 100644
--- a/back/methods/chat/sendCheckingPresence.js
+++ b/back/methods/chat/sendCheckingPresence.js
@@ -27,38 +27,46 @@ module.exports = Self => {
});
Self.sendCheckingPresence = async(ctx, recipientId, message) => {
- if (!recipientId) return false;
- const models = Self.app.models;
-
const userId = ctx.req.accessToken.userId;
- const sender = await models.VnUser.findById(userId, {fields: ['id']});
- const recipient = await models.VnUser.findById(recipientId, null);
-
- // Prevent sending messages to yourself
- if (recipientId == userId) return false;
- if (!recipient)
- throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`);
-
- if (!isProduction())
- message = `[Test:Environment to user ${userId}] ` + message;
-
- const chat = await models.Chat.create({
- senderFk: sender.id,
- recipient: `@${recipient.name}`,
- dated: Date.vnNew(),
- checkUserStatus: 1,
- message: message,
- status: 'sending',
- attempts: 0
- });
-
try {
- await Self.sendCheckingUserStatus(chat);
- await Self.updateChat(chat, 'sent');
- } catch (error) {
- await Self.updateChat(chat, 'error', error);
- }
+ const models = Self.app.models;
+ const sender = await models.VnUser.findById(userId, {fields: ['id']});
+ const error = `Could not send message from user ${userId}`;
- return true;
+ if (!recipientId) throw new Error(error);
+ const recipient = await models.VnUser.findById(recipientId, null);
+ if (!recipient)
+ throw new Error(error);
+
+ // Prevent sending messages to yourself
+ if (recipientId == userId) return false;
+
+ if (!isProduction())
+ message = `[Test:Environment to user ${userId}] ` + message;
+
+ const chat = await models.Chat.create({
+ senderFk: sender.id,
+ recipient: `@${recipient.name}`,
+ dated: Date.vnNew(),
+ checkUserStatus: 1,
+ message: message,
+ status: 'sending',
+ attempts: 0
+ });
+
+ try {
+ await Self.sendCheckingUserStatus(chat);
+ await Self.updateChat(chat, 'sent');
+ } catch (error) {
+ await Self.updateChat(chat, 'error', error);
+ }
+
+ return true;
+ } catch (e) {
+ await Self.rawSql(`
+ INSERT INTO util.debug (variable, value)
+ VALUES ('sendCheckingPresence_error', ?)
+ `, [`User: ${userId}, recipient: ${recipientId}, message: ${message}, error: ${e}`]);
+ }
};
};
diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js
index 677c9e444..85d1111df 100644
--- a/back/methods/collection/getTickets.js
+++ b/back/methods/collection/getTickets.js
@@ -40,6 +40,7 @@ module.exports = Self => {
const sales = await Self.rawSql(`
SELECT s.ticketFk,
+ NULL ticketOrder,
sgd.saleGroupFk,
s.id saleFk,
s.itemFk,
@@ -83,6 +84,7 @@ module.exports = Self => {
GROUP BY s.id, ish.id, p.code, p2.code
UNION ALL
SELECT s.ticketFk,
+ DENSE_RANK() OVER (ORDER BY ss.id),
sgd.saleGroupFk,
s.id saleFk,
s.itemFk,
diff --git a/back/methods/mrw-config/cancelShipment.js b/back/methods/mrw-config/cancelShipment.js
index 98aa8be39..e96d6d694 100644
--- a/back/methods/mrw-config/cancelShipment.js
+++ b/back/methods/mrw-config/cancelShipment.js
@@ -24,12 +24,13 @@ module.exports = Self => {
Self.cancelShipment = async expeditionFk => {
const models = Self.app.models;
-
const mrw = await models.MrwConfig.findOne();
const {externalId} = await models.Expedition.findById(expeditionFk);
const clientType = await models.MrwConfig.getClientType(expeditionFk);
const template = fs.readFileSync(__dirname + '/cancelShipment.ejs', 'utf-8');
const renderedXml = ejs.render(template, {mrw, externalId, clientType});
+
+ await Self.rawSql('CALL util.debugAdd(?,?);', ['cancelShipment', renderedXml]);
const response = await axios.post(mrw.url, renderedXml, {
headers: {
'Content-Type': 'application/soap+xml; charset=utf-8'
@@ -37,12 +38,11 @@ module.exports = Self => {
});
const xmlString = response.data;
+ await Self.rawSql('CALL util.debugAdd(?,?);', ['cancelShipmentResponse', xmlString]);
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
- await Self.rawSql('CALL util.debugAdd(?,?);', ['cancelShipment', xmlDoc]);
-
const result = xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
- return result.toLowerCase().includes('se ha cancelado correctamente');
+ return ['no se ha encontrado', 'se ha cancelado correctamente'].some(res => result.toLowerCase().includes(res));
};
};
diff --git a/back/methods/osrm-config/optimize.js b/back/methods/osrm-config/optimize.js
new file mode 100644
index 000000000..e0412c74c
--- /dev/null
+++ b/back/methods/osrm-config/optimize.js
@@ -0,0 +1,112 @@
+const UserError = require('vn-loopback/util/user-error');
+const axios = require('axios');
+
+module.exports = Self => {
+ Self.remoteMethod('optimize', {
+ description: 'Return optimized coords',
+ accessType: 'READ',
+ accepts: [{
+ arg: 'addressIds',
+ type: 'array',
+ required: true
+ }, {
+ arg: 'firstAddressId',
+ type: 'number',
+ required: false
+ }, {
+ arg: 'lastAddressId',
+ type: 'number',
+ required: false
+ }],
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: `/optimize`,
+ verb: 'GET'
+ }
+ });
+
+ Self.optimize = async(addressIds, firstAddressId, lastAddressId) => {
+ const models = Self.app.models;
+ try {
+ const osrmConfig = await models.OsrmConfig.findOne();
+ if (!osrmConfig) throw new UserError(`OSRM service is not configured`);
+
+ let coords = [];
+ if (firstAddressId) {
+ const address = await models.Address.findById(firstAddressId);
+ if (address.latitude && address.longitude) {
+ coords.push({
+ addressId: address.id,
+ latitude: address.latitude.toFixed(6),
+ longitude: address.longitude.toFixed(6)
+ });
+ }
+ }
+
+ for (const addressId of addressIds) {
+ const address = await models.Address.findById(addressId);
+ if (address.latitude && address.longitude) {
+ coords.push({
+ addressId,
+ latitude: address.latitude.toFixed(6),
+ longitude: address.longitude.toFixed(6)
+ });
+ }
+ }
+
+ if (lastAddressId) {
+ const firstAddress = await models.Address.findById(lastAddressId);
+ if (firstAddress.latitude && firstAddress.longitude) {
+ coords.push({
+ addressId: firstAddress.id,
+ latitude: firstAddress.latitude.toFixed(6),
+ longitude: firstAddress.longitude.toFixed(6)
+ });
+ }
+ }
+
+ if (!coords.length) throw new UserError('No address has coordinates');
+
+ const concatCoords = coords
+ .map(coord => `${coord.longitude},${coord.latitude}`)
+ .join(';');
+ const response = await axios.post(`
+ ${osrmConfig.url}/trip/v1/driving/${concatCoords}?source=first&destination=last&roundtrip=true
+ `);
+ const tolerance = osrmConfig.tolerance;
+ for (const waypoint of response.data.waypoints) {
+ const longitude = waypoint.location[0];
+ const latitude = waypoint.location[1];
+
+ const matchedAddress = coords.find(coord =>
+ coord.position === undefined &&
+ Math.abs(coord.latitude - latitude) <= tolerance &&
+ Math.abs(coord.longitude - longitude) <= tolerance
+ );
+ if (matchedAddress)
+ matchedAddress.position = waypoint.waypoint_index;
+ }
+ coords.sort((a, b) => {
+ const posA = a.position !== undefined ? a.position : Infinity;
+ const posB = b.position !== undefined ? b.position : Infinity;
+ return posA - posB;
+ });
+
+ return coords;
+ } catch (err) {
+ switch (err.response?.data?.code) {
+ case 'NoTrips':
+ throw new UserError('No trips found because input coordinates are not connected');
+ case 'NotImplemented':
+ throw new UserError('This request is not supported');
+ case 'InvalidOptions':
+ throw new UserError('Invalid options or too many coordinates');
+ default:
+ throw err;
+ }
+ }
+ };
+};
diff --git a/back/methods/osrm-config/specs/optimize.spec.js b/back/methods/osrm-config/specs/optimize.spec.js
new file mode 100644
index 000000000..9f2adccc6
--- /dev/null
+++ b/back/methods/osrm-config/specs/optimize.spec.js
@@ -0,0 +1,33 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('osrmConfig optimize()', function() {
+ it('should send coords, receive OSRM response, and return a correctly ordered result', async function() {
+ const result = await models.OsrmConfig.optimize([4, 3], 1, 2);
+
+ // Verifications
+ expect(Array.isArray(result)).toBe(true);
+ expect(result.length).toBe(4);
+
+ // Check the order
+ expect(result[0].addressId).toBe(1);
+ expect(result[1].addressId).toBe(4);
+ expect(result[2].addressId).toBe(3);
+ expect(result[3].addressId).toBe(2);
+
+ // Check the coordinates format
+ expect(result[0].latitude).toBe('10.111111');
+ expect(result[0].longitude).toBe('-74.111111');
+ });
+
+ it('should throw an error if no addresses are provided', async function() {
+ let error;
+ try {
+ await models.OsrmConfig.optimize([], null);
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error).toBeDefined();
+ expect(error.message).toBe('No address has coordinates');
+ });
+});
diff --git a/back/methods/osticket/sendToSupport.js b/back/methods/osticket/sendToSupport.js
index e17093839..dabd35f80 100644
--- a/back/methods/osticket/sendToSupport.js
+++ b/back/methods/osticket/sendToSupport.js
@@ -29,35 +29,34 @@ module.exports = Self => {
});
Self.sendToSupport = async(ctx, reason, additionalData) => {
+ const userId = ctx.req.accessToken.userId;
const emailUser =
- await Self.app.models.EmailUser.findById(ctx.req.accessToken.userId, {fields: ['email']});
+ await Self.app.models.EmailUser.findById(userId, {fields: ['email']});
- let html = `Motivo:
${reason}
`;
- html += `Usuario:
${ctx.req.accessToken.userId} ${emailUser.email}
`;
+ let html = `
Motivo: ${reason}
`;
+ html += `Usuario: ${userId} ${emailUser.email}
`;
+ html += `Additional Data:
`;
+ html += '';
+ for (const [key, val] of Object.entries(additionalData)) {
+ if (key !== 'config') html += `- ${key}: ${parse(val)}
`;
+ else {
+ html += `- ${key}:
`;
+ for (const [confKey, confVal] of Object.entries(val))
+ html += `- ${confKey}: ${parse(confVal)}
`;
+ html += '
';
+ }
+ }
+ html += '
';
- delete additionalData.backError.config.headers.Authorization;
- const httpRequest = JSON.parse(additionalData?.httpRequest);
-
- if (httpRequest)
- delete httpRequest.config.headers.Authorization;
- additionalData.httpRequest = httpRequest;
-
- for (const data in additionalData)
- html += `${data}:
${tryParse(additionalData[data])}
`;
-
- const subjectReason = httpRequest?.data?.error;
+ const {message, path, name} = additionalData;
await smtp.send({
to: `${config.app.reportEmail}, ${emailUser.email}`,
- subject:
- '[Support-Salix] ' +
- additionalData?.frontPath + ' ' +
- subjectReason?.name + ':' +
- subjectReason?.message,
+ subject: `[Support-Salix] ${path} ${name}: ${message}`,
html
});
};
- function tryParse(value) {
+ function parse(value) {
try {
try {
value = JSON.parse(value);
diff --git a/back/methods/quadminds-api-config/sendOrders.js b/back/methods/quadminds-api-config/sendOrders.js
deleted file mode 100644
index 760d622b6..000000000
--- a/back/methods/quadminds-api-config/sendOrders.js
+++ /dev/null
@@ -1,88 +0,0 @@
-const axios = require('axios');
-const UserError = require('vn-loopback/util/user-error');
-const moment = require('moment');
-
-module.exports = Self => {
- Self.remoteMethod('sendOrders', {
- description: 'Sends a set of orders',
- accessType: 'WRITE',
- accepts: [{
- arg: 'tickets',
- type: ['number'],
- required: true
- }
- ],
- returns: {
- type: 'string',
- root: true
- },
- http: {
- path: `/sendOrders`,
- verb: 'POST'
- }
- });
- Self.sendOrders = async tickets => {
- const config = await Self.app.models.QuadmindsApiConfig.findOne();
- if (!config) throw new UserError('Config params not set');
-
- if (tickets.length > config.maxObjects)
- throw new UserError(`Quadminds does not support more than ${config.maxObjects} tickets`);
-
- let poisData = [];
- let isOk;
- for (let offset = 0; !isOk; offset = offset + config.limit) {
- const pois = await axios.get(`${config.url}pois/search?limit=${config.limit}&offset=${offset}`, {
- headers: {
- 'Accept': 'application/json',
- 'X-Saas-Apikey': config.key
- }
- });
- pois.data.data.length ? poisData.push(...pois.data.data) : isOk = true;
- }
-
- const poiMap = new Map(poisData.map(poi => [poi.code, poi._id]));
-
- let orders = await Self.rawSql(`
- SELECT a.id poiCode,
- t.id code,
- t.shipped date,
- 'PEDIDO' operation,
- t.totalWithVat totalAmount,
- t.totalWithoutVat totalAmountWithoutTaxes,
- SUM(sv.volume) volume
- FROM ticket t
- JOIN address a ON a.id = t.addressFk
- JOIN saleVolume sv ON sv.ticketFk = t.id
- WHERE t.id IN (?)
- GROUP BY t.id
- `, [tickets]);
-
- // Transformo code en string ya que lo obtenermos como integer
- orders = orders.map(order => {
- return {
- ...order,
- poiId: poiMap.get(order.poiCode.toString()) || undefined,
- code: order.code.toString(),
- date: moment(order.date).format('YYYY-MM-DD'),
- totalAmount: order.totalAmount || undefined,
- totalAmountWithoutTaxes: order.totalAmountWithoutTaxes || undefined,
- timeWindow: [{
- from: config.orderTimeFrom,
- to: config.orderTimeTo
- }],
- orderMeasures: [{
- constraintId: 3, // Volumen
- value: order.volume
- }]
- };
- });
-
- await axios.post(`${config.url}orders`, orders, {
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- 'X-Saas-Apikey': config.key
- }
- });
- };
-};
diff --git a/back/methods/quadminds-api-config/sendPois.js b/back/methods/quadminds-api-config/sendPois.js
deleted file mode 100644
index cb5eef93e..000000000
--- a/back/methods/quadminds-api-config/sendPois.js
+++ /dev/null
@@ -1,87 +0,0 @@
-const axios = require('axios');
-const UserError = require('vn-loopback/util/user-error');
-
-module.exports = Self => {
- Self.remoteMethod('sendPois', {
- description: 'Sends a set of pois',
- accessType: 'WRITE',
- accepts: [{
- arg: 'tickets',
- type: ['number'],
- required: true
- }
- ],
- returns: {
- type: 'string',
- root: true
- },
- http: {
- path: `/sendPois`,
- verb: 'POST'
- }
- });
- Self.sendPois = async tickets => {
- const config = await Self.app.models.QuadmindsApiConfig.findOne();
- if (!config) throw new UserError('Config params not set');
-
- if (tickets.length > config.maxObjects)
- throw new UserError(`Quadminds does not support more than ${config.maxObjects} tickets`);
-
- let pois = await Self.rawSql(`
- WITH deliveryNotes AS (
- SELECT t.id, t.routeFk, tn.description
- FROM ticket t
- JOIN ticketObservation tn ON tn.ticketFk = t.id
- JOIN observationType ot ON ot.id = tn.observationTypeFk
- WHERE ot.code = 'delivery'
- )
- SELECT a.id code,
- c.socialName name,
- IF(ABS(a.latitude - ROUND(a.latitude)) < 0.000001, NULL, a.latitude) latitude,
- IF(ABS(a.longitude - ROUND(a.longitude)) < 0.000001, NULL, a.longitude) longitude,
- a.street,
- a.city locality,
- p.name state,
- co.name country,
- CONCAT_WS(', ', IFNULL(a.street, ''), IFNULL(a.city, ''), IFNULL(p.name, '')) longAddress,
- CONCAT(IFNULL(a.mobile, c.mobile)) phoneNumber,
- dn.description poiDeliveryComments,
- c.email email
- FROM ticket t
- JOIN address a ON a.id = t.addressFk
- JOIN province p ON p.id = a.provinceFk
- JOIN country co ON co.id = p.countryFk
- JOIN client c ON c.id = t.clientFk
- LEFT JOIN deliveryNotes dn ON dn.id = t.id
- WHERE t.id IN (?)
- GROUP BY t.id
- `, [tickets]);
-
- // Transformo code en string ya que lo obtenermos como integer
- pois = pois.map(poi => {
- return {
- ...poi,
- code: poi.code.toString(),
- latitude: poi.latitude || undefined,
- longitude: poi.longitude || undefined,
- address: {
- street: poi.street || undefined,
- locality: poi.locality || undefined,
- state: poi.state || undefined,
- country: poi.country || undefined
- },
- poiDeliveryComments: poi.poiDeliveryComments || undefined,
- phoneNumber: poi.phoneNumber || undefined,
- email: poi.email || undefined
- };
- });
-
- await axios.post(`${config.url}pois`, pois, {
- headers: {
- 'Accept': 'application/json',
- 'Content-Type': 'application/json',
- 'X-Saas-Apikey': config.key
- }
- });
- };
-};
diff --git a/back/methods/vn-user/acls.js b/back/methods/vn-user/acls.js
index 7da75ed2c..347cfa426 100644
--- a/back/methods/vn-user/acls.js
+++ b/back/methods/vn-user/acls.js
@@ -19,7 +19,7 @@ module.exports = Self => {
if (acl.principalType == 'ROLE' && acl.permission == 'ALLOW') {
const staticAcl = {
model: model.name,
- property: '*',
+ property: acl.property,
accessType: acl.accessType,
permission: acl.permission,
principalType: acl.principalType,
diff --git a/back/methods/vn-user/update-user.js b/back/methods/vn-user/update-user.js
index 2bb390cf9..32bad0f17 100644
--- a/back/methods/vn-user/update-user.js
+++ b/back/methods/vn-user/update-user.js
@@ -22,7 +22,7 @@ module.exports = Self => {
description: 'The user email'
}, {
arg: 'lang',
- type: 'string',
+ type: 'any',
description: 'The user lang'
}, {
arg: 'twoFactor',
diff --git a/back/methods/workerActivity/specs/add.spec.js b/back/methods/workerActivity/specs/add.spec.js
index 352d67723..751cce009 100644
--- a/back/methods/workerActivity/specs/add.spec.js
+++ b/back/methods/workerActivity/specs/add.spec.js
@@ -10,10 +10,10 @@ describe('workerActivity insert()', () => {
try {
await models.WorkerActivityType.create(
- {'code': 'STOP', 'description': 'STOP'}, options
+ {'code': 'TEST', 'description': 'TEST'}, options
);
- await models.WorkerActivity.add(ctx, 'STOP', 'APP', options);
+ await models.WorkerActivity.add(ctx, 'TEST', 'APP', options);
count = await models.WorkerActivity.count(
{'workerFK': 1106}, options
diff --git a/back/model-config.json b/back/model-config.json
index b543071c9..2ced867f7 100644
--- a/back/model-config.json
+++ b/back/model-config.json
@@ -88,6 +88,9 @@
"Language": {
"dataSource": "vn"
},
+ "OsrmConfig": {
+ "dataSource": "vn"
+ },
"Machine": {
"dataSource": "vn"
},
@@ -121,18 +124,21 @@
"Province": {
"dataSource": "vn"
},
- "QuadmindsApiConfig": {
- "dataSource": "vn"
- },
"Autonomy": {
"dataSource": "vn"
},
"Payment": {
"dataSource": "vn"
},
+ "PbxConfig": {
+ "dataSource": "vn"
+ },
"Postcode": {
"dataSource": "vn"
},
+ "Prefix": {
+ "dataSource": "vn"
+ },
"ReferenceRate": {
"dataSource": "vn"
},
diff --git a/back/models/osrm-config.js b/back/models/osrm-config.js
new file mode 100644
index 000000000..f738f305c
--- /dev/null
+++ b/back/models/osrm-config.js
@@ -0,0 +1,4 @@
+module.exports = Self => {
+ require('../methods/osrm-config/optimize')(Self);
+};
+
diff --git a/back/models/osrm-config.json b/back/models/osrm-config.json
new file mode 100644
index 000000000..ae712ba05
--- /dev/null
+++ b/back/models/osrm-config.json
@@ -0,0 +1,24 @@
+{
+ "name": "OsrmConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "osrmConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "required": true
+ },
+ "url": {
+ "type": "string",
+ "required": true
+ },
+ "tolerance": {
+ "type": "number",
+ "required": false
+ }
+ }
+}
diff --git a/back/models/pbx-config.json b/back/models/pbx-config.json
new file mode 100644
index 000000000..44137b55d
--- /dev/null
+++ b/back/models/pbx-config.json
@@ -0,0 +1,27 @@
+{
+ "name": "PbxConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "pbx.config"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true
+ },
+ "defaultPrefix": {
+ "type": "string"
+ }
+ },
+ "acls": [
+ {
+ "property": "*",
+ "accessType": "READ",
+ "principalType": "ROLE",
+ "principalId": "employee",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/back/models/prefix.json b/back/models/prefix.json
new file mode 100644
index 000000000..762354caa
--- /dev/null
+++ b/back/models/prefix.json
@@ -0,0 +1,27 @@
+{
+ "name": "Prefix",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "pbx.prefix"
+ }
+ },
+ "properties": {
+ "country": {
+ "type": "string",
+ "id": true
+ },
+ "prefix": {
+ "type": "string"
+ }
+ },
+ "acls": [
+ {
+ "property": "*",
+ "accessType": "READ",
+ "principalType": "ROLE",
+ "principalId": "employee",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/back/models/production-config.json b/back/models/production-config.json
index 2fc6d71ff..048264e8c 100644
--- a/back/models/production-config.json
+++ b/back/models/production-config.json
@@ -20,6 +20,9 @@
},
"backupPrinterNotificationDelay": {
"type": "string"
+ },
+ "itemOrderReviewHours": {
+ "type": "number"
}
}
}
\ No newline at end of file
diff --git a/back/models/quadminds-api-config.js b/back/models/quadminds-api-config.js
deleted file mode 100644
index c2773fa0b..000000000
--- a/back/models/quadminds-api-config.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = Self => {
- require('../methods/quadminds-api-config/sendPois')(Self);
- require('../methods/quadminds-api-config/sendOrders')(Self);
-};
diff --git a/back/models/quadminds-api-config.json b/back/models/quadminds-api-config.json
deleted file mode 100644
index 4001badf3..000000000
--- a/back/models/quadminds-api-config.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "QuadmindsApiConfig",
- "base": "VnModel",
- "options": {
- "mysql": {
- "table": "quadmindsApiConfig"
- }
- },
- "properties": {
- "id": {
- "type": "number",
- "id": true,
- "required": true
- },
- "url": {
- "type": "string"
- },
- "key": {
- "type": "string"
- },
- "maxObjects": {
- "type": "number"
- },
- "limit": {
- "type": "number"
- },
- "orderTimeFrom": {
- "type": "string"
- },
- "orderTimeTo": {
- "type": "string"
- }
- }
-}
diff --git a/db/.pullinfo.json b/db/.pullinfo.json
index 5b75584d1..b890ffc31 100644
--- a/db/.pullinfo.json
+++ b/db/.pullinfo.json
@@ -9,7 +9,7 @@
},
"vn": {
"view": {
- "expeditionPallet_Print": "99f75145ac2e7b612a6d71e74b6e55f194a465780fd9875a15eb01e6596b447e"
+ "expeditionPallet_Print": "04fc5f2967ce53bfbb85f7f48b9a3dca4a4f7111ac41e1775f4cc7d6538774b2"
}
}
}
diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql
index 4700d0066..b95890b0d 100644
--- a/db/dump/.dump/data.sql
+++ b/db/dump/.dump/data.sql
@@ -4,7 +4,7 @@ USE `util`;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-INSERT INTO `version` VALUES ('vn-database','11358','45f7b60f1b43b24505a3e9abc6738dc484ad4fd5','2024-11-26 12:27:58','11365');
+INSERT INTO `version` VALUES ('vn-database','11391','43edb1f82e88dcc44eedc8501b93c1fac66d71e9','2025-01-14 07:32:09','11407');
INSERT INTO `versionLog` VALUES ('vn-database','10107','00-firstScript.sql','jenkins@10.0.2.69','2022-04-23 10:53:53',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','10112','00-firstScript.sql','jenkins@10.0.2.69','2022-05-09 09:14:53',NULL,NULL);
@@ -1072,21 +1072,27 @@ INSERT INTO `versionLog` VALUES ('vn-database','11300','00-firstScript.sql','jen
INSERT INTO `versionLog` VALUES ('vn-database','11302','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 08:00:57',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11308','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-10-23 12:41:55',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11311','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 08:00:57',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11312','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11314','00-restrictedAsterisk.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11315','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11316','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11317','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11319','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11320','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:07',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11321','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11322','00-entryAcl.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11324','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-13 10:49:47',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11325','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11326','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11327','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:24',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11330','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11331','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11332','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11336','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11337','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11338','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 09:14:12',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11339','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11341','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11342','00-itemShelving.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:06:34',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11342','01-itemShelving.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:06:35',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11342','02-itemShelving.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:06:37',NULL,NULL);
@@ -1105,10 +1111,38 @@ INSERT INTO `versionLog` VALUES ('vn-database','11347','00-firstScript.sql','jen
INSERT INTO `versionLog` VALUES ('vn-database','11348','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:14',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11349','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:14',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11350','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:14',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11351','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11352','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:24',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11353','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:14',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11354','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11355','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:14',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11357','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:16',NULL,NULL);
INSERT INTO `versionLog` VALUES ('vn-database','11358','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:28:21',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11359','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11362','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-28 08:52:33',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11363','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11366','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11367','00-deprecate.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11368','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11368','01-acls.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11369','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:05',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11371','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:05',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11371','01-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:47',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11371','02-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:22:29',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11371','03-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:22:31',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11372','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-09 13:30:30',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11373','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-02 16:09:01',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11375','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-03 08:58:20',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11376','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11377','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:22:31',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11378','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11379','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11379','01-secScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11384','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11385','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:33',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11390','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11391','00-itemAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL);
+INSERT INTO `versionLog` VALUES ('vn-database','11400','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-09 09:55:24',NULL,NULL);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
@@ -1485,6 +1519,7 @@ INSERT INTO `roleInherit` VALUES (378,101,15,19294);
INSERT INTO `roleInherit` VALUES (379,103,121,19294);
INSERT INTO `roleInherit` VALUES (381,119,123,19295);
INSERT INTO `roleInherit` VALUES (382,48,72,783);
+INSERT INTO `roleInherit` VALUES (383,114,111,19295);
INSERT INTO `userPassword` VALUES (1,7,1,0,2,1);
@@ -1666,7 +1701,6 @@ INSERT INTO `ACL` VALUES (209,'Ticket','recalculateComponents','WRITE','ALLOW','
INSERT INTO `ACL` VALUES (211,'TravelLog','*','READ','ALLOW','ROLE','buyer',NULL);
INSERT INTO `ACL` VALUES (212,'Thermograph','*','*','ALLOW','ROLE','buyer',NULL);
INSERT INTO `ACL` VALUES (213,'TravelThermograph','*','WRITE','ALLOW','ROLE','buyer',NULL);
-INSERT INTO `ACL` VALUES (214,'Entry','*','*','ALLOW','ROLE','buyer',NULL);
INSERT INTO `ACL` VALUES (216,'TravelThermograph','*','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (218,'Intrastat','*','*','ALLOW','ROLE','buyer',NULL);
INSERT INTO `ACL` VALUES (221,'UserConfig','getUserConfig','READ','ALLOW','ROLE','guest',NULL);
@@ -1695,7 +1729,6 @@ INSERT INTO `ACL` VALUES (258,'PayDem','*','READ','ALLOW','ROLE','employee',NULL
INSERT INTO `ACL` VALUES (259,'Client','createReceipt','*','ALLOW','ROLE','salesAssistant',NULL);
INSERT INTO `ACL` VALUES (260,'PrintServerQueue','*','WRITE','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (261,'SupplierAccount','*','WRITE','ALLOW','ROLE','administrative',783);
-INSERT INTO `ACL` VALUES (262,'Entry','*','*','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (263,'InvoiceIn','*','READ','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (264,'StarredModule','*','*','ALLOW','ROLE','$authenticated',NULL);
INSERT INTO `ACL` VALUES (265,'ItemBotanical','*','WRITE','ALLOW','ROLE','logisticBoss',NULL);
@@ -2012,7 +2045,7 @@ INSERT INTO `ACL` VALUES (605,'Ticket','sendSms','WRITE','ALLOW','ROLE','employe
INSERT INTO `ACL` VALUES (606,'Ticket','isLocked','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (607,'Ticket','freightCost','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (608,'Ticket','getComponentsSum','READ','ALLOW','ROLE','employee',NULL);
-INSERT INTO `ACL` VALUES (609,'Ticket','updateAttributes','WRITE','ALLOW','ROLE','deliveryAssistant',10578);
+INSERT INTO `ACL` VALUES (609,'Ticket','updateAttributes','WRITE','ALLOW','ROLE','delivery',19295);
INSERT INTO `ACL` VALUES (610,'Ticket','deliveryNoteCsv','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (611,'State','find','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (612,'State','findById','READ','ALLOW','ROLE','employee',NULL);
@@ -2110,7 +2143,7 @@ INSERT INTO `ACL` VALUES (746,'Claim','getSummary','READ','ALLOW','ROLE','claimV
INSERT INTO `ACL` VALUES (747,'CplusRectificationType','*','READ','ALLOW','ROLE','administrative',NULL);
INSERT INTO `ACL` VALUES (748,'SiiTypeInvoiceOut','*','READ','ALLOW','ROLE','salesPerson',NULL);
INSERT INTO `ACL` VALUES (749,'InvoiceCorrectionType','*','READ','ALLOW','ROLE','salesPerson',NULL);
-INSERT INTO `ACL` VALUES (750,'InvoiceOut','transferInvoice','WRITE','ALLOW','ROLE','administrative',NULL);
+INSERT INTO `ACL` VALUES (750,'InvoiceOut','transfer','WRITE','ALLOW','ROLE','administrative',13657);
INSERT INTO `ACL` VALUES (751,'Application','executeProc','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (752,'Application','executeFunc','*','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (753,'NotificationSubscription','getList','READ','ALLOW','ROLE','employee',NULL);
@@ -2248,9 +2281,9 @@ INSERT INTO `ACL` VALUES (895,'ItemShelvingLog','*','READ','ALLOW','ROLE','produ
INSERT INTO `ACL` VALUES (901,'WorkerTimeControl','sendMail','WRITE','ALLOW','ROLE','system',NULL);
INSERT INTO `ACL` VALUES (902,'Entry','filter','READ','ALLOW','ROLE','supplier',NULL);
INSERT INTO `ACL` VALUES (903,'Entry','getBuys','READ','ALLOW','ROLE','supplier',NULL);
-INSERT INTO `ACL` VALUES (904,'Entry','buyLabelSupplier','READ','ALLOW','ROLE','supplier',10578);
+INSERT INTO `ACL` VALUES (904,'Entry','buyLabelSupplier','READ','ALLOW','ROLE','supplier',19295);
INSERT INTO `ACL` VALUES (905,'AddressWaste','*','READ','ALLOW','ROLE','production',NULL);
-INSERT INTO `ACL` VALUES (906,'Entry','print','READ','ALLOW','ROLE','supplier',NULL);
+INSERT INTO `ACL` VALUES (906,'Entry','labelSupplier','READ','ALLOW','ROLE','supplier',19295);
INSERT INTO `ACL` VALUES (907,'Expedition_PrintOut','*','*','ALLOW','ROLE','production',NULL);
INSERT INTO `ACL` VALUES (908,'Docuware','upload','WRITE','ALLOW','ROLE','hrBuyer',13657);
INSERT INTO `ACL` VALUES (909,'Entry','getBuysCsv','READ','ALLOW','ROLE','supplier',19295);
@@ -2283,9 +2316,9 @@ INSERT INTO `ACL` VALUES (938,'Worker','__get__mail','READ','ALLOW','ROLE','hr',
INSERT INTO `ACL` VALUES (939,'Machine','*','*','ALLOW','ROLE','productionBoss',10578);
INSERT INTO `ACL` VALUES (940,'ItemTypeLog','find','READ','ALLOW','ROLE','employee',10578);
INSERT INTO `ACL` VALUES (941,'Entry','buyLabel','READ','ALLOW','ROLE','employee',10578);
-INSERT INTO `ACL` VALUES (942,'Cmr','filter','READ','ALLOW','ROLE','production',10578);
-INSERT INTO `ACL` VALUES (943,'Cmr','downloadZip','READ','ALLOW','ROLE','production',10578);
-INSERT INTO `ACL` VALUES (944,'Cmr','print','READ','ALLOW','ROLE','production',10578);
+INSERT INTO `ACL` VALUES (942,'Cmr','filter','READ','ALLOW','ROLE','employee',19295);
+INSERT INTO `ACL` VALUES (943,'Cmr','downloadZip','READ','ALLOW','ROLE','employee',19295);
+INSERT INTO `ACL` VALUES (944,'Cmr','print','READ','ALLOW','ROLE','employee',19295);
INSERT INTO `ACL` VALUES (945,'Collection','create','WRITE','ALLOW','ROLE','productionBoss',10578);
INSERT INTO `ACL` VALUES (946,'Collection','upsert','WRITE','ALLOW','ROLE','productionBoss',10578);
INSERT INTO `ACL` VALUES (947,'Collection','replaceById','WRITE','ALLOW','ROLE','productionBoss',10578);
@@ -2298,6 +2331,64 @@ INSERT INTO `ACL` VALUES (953,'RouteAction','find','READ','ALLOW','ROLE','delive
INSERT INTO `ACL` VALUES (954,'RouteComplement','find','READ','ALLOW','ROLE','delivery',10578);
INSERT INTO `ACL` VALUES (955,'RouteComplement','create','WRITE','ALLOW','ROLE','delivery',10578);
INSERT INTO `ACL` VALUES (956,'RouteComplement','deleteById','WRITE','ALLOW','ROLE','delivery',10578);
+INSERT INTO `ACL` VALUES (957,'SaleGroup','find','READ','ALLOW','ROLE','production',10578);
+INSERT INTO `ACL` VALUES (959,'WorkerRelative','updateAttributes','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (960,'WorkerRelative','crud','WRITE','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (961,'WorkerRelative','findById','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (962,'WorkerRelative','find','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (963,'WorkerRelative','upsert','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (964,'WorkerRelative','filter','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (965,'WorkerIrpf','updateAttributes','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (966,'WorkerIrpf','crud','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (967,'WorkerIrpf','findById','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (968,'WorkerIrpf','find','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (969,'WorkerIrpf','upsert','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (970,'WorkerIrpf','filter','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (971,'DisabilityGrade','updateAttributes','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (972,'DisabilityGrade','crud','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (973,'DisabilityGrade','findById','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (974,'DisabilityGrade','find','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (975,'DisabilityGrade','upsert','*','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (976,'Entry','upsert','WRITE','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (977,'Entry','updateAttributes','WRITE','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (978,'Entry','isBooked','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (979,'Entry','findById','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (980,'Entry','find','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (981,'Entry','filter','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (982,'Entry','count','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (983,'Entry','getEntry','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (984,'Entry','getBuys','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (985,'Entry','findOne','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (986,'Entry','deleteBuys','WRITE','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (987,'Entry','editLatestBuys','WRITE','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (988,'Entry','importBuys','WRITE','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (989,'Entry','importBuysPreview','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (990,'Entry','lastItemBuys','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (991,'Entry','latestBuysFilter','READ','ALLOW','ROLE','administrative',10578);
+INSERT INTO `ACL` VALUES (992,'Entry','upsert','WRITE','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (993,'Entry','updateAttributes','WRITE','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (994,'Entry','findById','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (995,'Entry','find','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (996,'Entry','filter','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (997,'Entry','count','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (998,'Entry','getEntry','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (999,'Entry','getBuys','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1000,'Entry','findOne','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1001,'Entry','deleteBuys','WRITE','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1002,'Entry','editLatestBuys','WRITE','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1003,'Entry','importBuys','WRITE','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1004,'Entry','importBuysPreview','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1005,'Entry','lastItemBuys','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1006,'Entry','latestBuysFilter','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1007,'ItemShelving','getItemsByReviewOrder','READ','ALLOW','ROLE','production',19294);
+INSERT INTO `ACL` VALUES (1008,'Entry','buyLabelSupplier','READ','ALLOW','ROLE','employee',19295);
+INSERT INTO `ACL` VALUES (1009,'Entry','buyLabel','READ','ALLOW','ROLE','supplier',19295);
+INSERT INTO `ACL` VALUES (1010,'InventoryConfig','find','READ','ALLOW','ROLE','buyer',10578);
+INSERT INTO `ACL` VALUES (1011,'SiiTypeInvoiceIn','find','READ','ALLOW','ROLE','salesPerson',10578);
+INSERT INTO `ACL` VALUES (1012,'OsrmConfig','optimize','READ','ALLOW','ROLE','employee',10578);
+INSERT INTO `ACL` VALUES (1013,'Route','optimizePriority','*','ALLOW','ROLE','employee',10578);
+INSERT INTO `ACL` VALUES (1014,'Worker','canModifyAbsenceInPast','WRITE','ALLOW','ROLE','hr',10578);
+INSERT INTO `ACL` VALUES (1015,'Worker','__get__sip','READ','ALLOW','ROLE','employee',19294);
INSERT INTO `fieldAcl` VALUES (1,'Client','name','update','employee');
INSERT INTO `fieldAcl` VALUES (2,'Client','contact','update','employee');
@@ -2454,9 +2545,8 @@ INSERT INTO `companyI18n` VALUES (442,'en','In compliance with the provisions of
INSERT INTO `companyI18n` VALUES (442,'fr','Conformément aux dispositions de la loi organique 15/1999 sur la protection des données personnelles, nous vous informons que les données personnelles que vous fournissez seront incluses dans des dossiers. VERDNATURA LEVANTE S.L., vous pouvez à tout moment, exercer les droits d``accès, de rectification, d``annulation et d``opposition, en communiquant par écrit au siège social de la société. Le dossier a pour objet la gestion administrative, la comptabilité et la facturation.');
INSERT INTO `companyI18n` VALUES (442,'pt','Em cumprimento do disposto na lei Orgânica 15/1999, de Protecção de Dados de Carácter Pessoal, comunicamos que os dados pessoais que facilite se incluirão nos ficheiros automatizados de VERDNATURA LEVANTE S.L., podendo em todo momento exercer os direitos de acesso, rectificação, cancelação e oposição, comunicando por escrito ao domicílio social da entidade. A finalidade do ficheiro é a gestão administrativa, contabilidade e facturação.');
-INSERT INTO `cplusRectificationType` VALUES (1,'Campo vacio');
+INSERT INTO `cplusRectificationType` VALUES (1,'S – Por sustitución');
INSERT INTO `cplusRectificationType` VALUES (2,'I – Por diferencias');
-INSERT INTO `cplusRectificationType` VALUES (3,'S – Por sustitución');
INSERT INTO `cplusSubjectOp` VALUES (1,'Campo vacio');
INSERT INTO `cplusSubjectOp` VALUES (2,'S1 – Sujeta – No exenta');
@@ -2472,70 +2562,47 @@ INSERT INTO `cplusTaxBreak` VALUES (7,'E6 - Exenta por otros');
INSERT INTO `claimResponsible` VALUES (1,'Compradores',0,'buy');
INSERT INTO `claimResponsible` VALUES (2,'Proveedor',0,'sup');
-INSERT INTO `claimResponsible` VALUES (3,'Entradores',0,'ent');
INSERT INTO `claimResponsible` VALUES (4,'Camareros',0,'bar');
INSERT INTO `claimResponsible` VALUES (6,'Sacadores',0,'pic');
INSERT INTO `claimResponsible` VALUES (7,'Revisadores',0,'chk');
-INSERT INTO `claimResponsible` VALUES (8,'Calidad general',0,'qas');
INSERT INTO `claimResponsible` VALUES (9,'Encajadores',0,'pck');
INSERT INTO `claimResponsible` VALUES (10,'Clima',0,'wea');
INSERT INTO `claimResponsible` VALUES (11,'Comerciales',1,'com');
INSERT INTO `claimResponsible` VALUES (12,'Clientes',1,'cli');
-INSERT INTO `claimResponsible` VALUES (13,'Administración',0,'adm');
INSERT INTO `claimResponsible` VALUES (14,'Agencia',0,'age');
INSERT INTO `claimResponsible` VALUES (15,'Repartidores',0,'del');
INSERT INTO `claimResponsible` VALUES (16,'Informatica',0,'ite');
INSERT INTO `claimResponsible` VALUES (17,'Transp.origen',0,'tra');
INSERT INTO `claimResponsible` VALUES (18,'Confeccion',0,'con');
INSERT INTO `claimResponsible` VALUES (19,'OTROS',0,'oth');
-INSERT INTO `claimResponsible` VALUES (21,'Gerencia',0,'man');
INSERT INTO `claimResponsible` VALUES (22,'Paletizadores',0,'pal');
INSERT INTO `claimResponsible` VALUES (23,'Preparación Previa',0,'pre');
-INSERT INTO `claimResponsible` VALUES (24,'Almacén PCA',0,'war');
INSERT INTO `claimResponsible` VALUES (25,'Huelga',0,'str');
-INSERT INTO `claimResponsible` VALUES (27,'Prep. por caja',0,'');
+INSERT INTO `claimResponsible` VALUES (27,'Prep. por caja',0,'pbb');
INSERT INTO `claimResponsible` VALUES (45,'Negativo',0,'neg');
-INSERT INTO `claimReason` VALUES (1,'Prisas',0);
-INSERT INTO `claimReason` VALUES (2,'Novato',0);
INSERT INTO `claimReason` VALUES (3,'Exceso de confianza',0);
-INSERT INTO `claimReason` VALUES (4,'Exceso de celo',0);
-INSERT INTO `claimReason` VALUES (5,'Indiferencia',0);
INSERT INTO `claimReason` VALUES (6,'Extraviado o Hurto',0);
INSERT INTO `claimReason` VALUES (7,'Incompetencia',0);
-INSERT INTO `claimReason` VALUES (8,'Ubicación erronea',0);
-INSERT INTO `claimReason` VALUES (9,'Dat.Inctos/Pak.conf',0);
-INSERT INTO `claimReason` VALUES (10,'Datos duplicados',0);
-INSERT INTO `claimReason` VALUES (11,'Fallo stock',0);
-INSERT INTO `claimReason` VALUES (12,'Innovación',0);
INSERT INTO `claimReason` VALUES (13,'Distracción',1);
-INSERT INTO `claimReason` VALUES (15,'Portes indebidos',0);
INSERT INTO `claimReason` VALUES (16,'Baja calidad',0);
INSERT INTO `claimReason` VALUES (17,'Defectuoso',0);
-INSERT INTO `claimReason` VALUES (19,'Endiñado',0);
INSERT INTO `claimReason` VALUES (20,'Calor',0);
INSERT INTO `claimReason` VALUES (21,'Frio',0);
INSERT INTO `claimReason` VALUES (22,'Cambiado',0);
-INSERT INTO `claimReason` VALUES (24,'Cansancio',1);
INSERT INTO `claimReason` VALUES (25,'Mal etiquetado',1);
-INSERT INTO `claimReason` VALUES (26,'Cantidad malentendido',0);
-INSERT INTO `claimReason` VALUES (30,'No revisado',1);
INSERT INTO `claimReason` VALUES (34,'Error fotografia',0);
INSERT INTO `claimReason` VALUES (40,'Fallo Personal VN',0);
-INSERT INTO `claimReason` VALUES (41,'Fallo Personal Cliente',0);
INSERT INTO `claimReason` VALUES (42,'Otros',0);
INSERT INTO `claimReason` VALUES (43,'Precio alto',0);
-INSERT INTO `claimReason` VALUES (44,'Abuso de confianza',0);
INSERT INTO `claimReason` VALUES (45,'Retraso Agencia',0);
INSERT INTO `claimReason` VALUES (46,'Delicado',0);
-INSERT INTO `claimReason` VALUES (47,'Seco',0);
INSERT INTO `claimReason` VALUES (48,'Retraso Reparto',0);
INSERT INTO `claimReason` VALUES (49,'Mal Embalado',0);
INSERT INTO `claimReason` VALUES (50,'Tumbado',0);
INSERT INTO `claimReason` VALUES (51,'Enfermo/Plaga',0);
INSERT INTO `claimReason` VALUES (52,'Mala gestión comercial',0);
INSERT INTO `claimReason` VALUES (53,'Mala gestión comprador',0);
-INSERT INTO `claimReason` VALUES (54,'A2',0);
INSERT INTO `claimReason` VALUES (55,'Entrega 48h o más',0);
INSERT INTO `claimReason` VALUES (56,'Error cliente',0);
INSERT INTO `claimReason` VALUES (57,'A2/B1',0);
@@ -2549,7 +2616,6 @@ INSERT INTO `claimRedelivery` VALUES (5,'Tour');
INSERT INTO `claimRedelivery` VALUES (6,'Fuera Peninsula');
INSERT INTO `claimRedelivery` VALUES (7,'Francia');
-INSERT INTO `claimResult` VALUES (1,'Otros daños');
INSERT INTO `claimResult` VALUES (2,'Roces');
INSERT INTO `claimResult` VALUES (3,'Humedad');
INSERT INTO `claimResult` VALUES (4,'Deshidratacion');
@@ -2558,26 +2624,22 @@ INSERT INTO `claimResult` VALUES (6,'Incompleto (Faltas)');
INSERT INTO `claimResult` VALUES (7,'Error packing');
INSERT INTO `claimResult` VALUES (8,'Error color');
INSERT INTO `claimResult` VALUES (9,'Error medida');
-INSERT INTO `claimResult` VALUES (10,'Error origen');
INSERT INTO `claimResult` VALUES (11,'Envejecido');
-INSERT INTO `claimResult` VALUES (12,'Venta Perdida');
INSERT INTO `claimResult` VALUES (13,'Duplicacion');
INSERT INTO `claimResult` VALUES (14,'Rechazado');
INSERT INTO `claimResult` VALUES (15,'Rotura');
INSERT INTO `claimResult` VALUES (16,'Deterioro/Estropeado');
INSERT INTO `claimResult` VALUES (17,'Podrido');
-INSERT INTO `claimResult` VALUES (18,'Baboso');
-INSERT INTO `claimResult` VALUES (19,'Cocido');
INSERT INTO `claimResult` VALUES (20,'Congelado');
INSERT INTO `claimResult` VALUES (21,'Machacado');
-INSERT INTO `claimResult` VALUES (22,'Error precio');
INSERT INTO `claimResult` VALUES (23,'Manchado');
INSERT INTO `claimResult` VALUES (24,'No entregado');
-INSERT INTO `claimResult` VALUES (25,'Cobro indebido');
INSERT INTO `claimResult` VALUES (26,'Decepcion/Esperaba mas');
INSERT INTO `claimResult` VALUES (27,'Otros');
INSERT INTO `claimResult` VALUES (28,'Baboso/Cocido');
-INSERT INTO `claimResult` VALUES (29,'Video Camara');
+INSERT INTO `claimResult` VALUES (29,'Videocámaras');
+INSERT INTO `claimResult` VALUES (30,'Manipulado');
+INSERT INTO `claimResult` VALUES (31,'ReclamReclamado PR/AG');
INSERT INTO `component` VALUES (10,'Precios Especiales',4,NULL,NULL,1,'specialPrices',0);
INSERT INTO `component` VALUES (14,'porte extra por dia semana',6,NULL,NULL,1,'extraCostPerWeekDay',0);
@@ -2625,64 +2687,71 @@ INSERT INTO `continent` VALUES (3,'África','AF');
INSERT INTO `continent` VALUES (4,'Europa','EU');
INSERT INTO `continent` VALUES (5,'Oceanía','OC');
-INSERT INTO `department` VALUES (1,'VN','VERDNATURA',1,116,763,0,0,0,0,26,NULL,'/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (1,'VN','VERDNATURA',1,130,763,0,0,0,0,26,NULL,'/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (22,'shopping','COMPRAS',2,5,NULL,72,0,0,1,1,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (23,'CMA','CAMARA',15,16,NULL,72,1,1,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,'PREVIOUS');
INSERT INTO `department` VALUES (31,'it','INFORMATICA',6,7,NULL,72,0,0,1,0,1,'/1/','informatica-cau',1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (34,'accounting','CONTABILIDAD',8,9,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (35,'finance','FINANZAS',10,11,NULL,0,0,0,1,0,1,'/1/',NULL,1,'begonya@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (36,'labor','LABORAL',12,13,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (36,'labor','LABORAL',12,13,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (37,'PROD','PRODUCCION',14,37,NULL,72,1,1,1,11,1,'/1/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (38,'picking','SACADO',17,18,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,0,1,NULL,NULL,NULL,'ON_PREPARATION');
INSERT INTO `department` VALUES (39,'packing','ENCAJADO',19,20,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'PACKING');
INSERT INTO `department` VALUES (41,'administration','ADMINISTRACION',38,39,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (43,'VT','VENTAS',40,75,NULL,0,0,0,1,17,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (44,'management','GERENCIA',76,77,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (45,'logistic','LOGISTICA',78,79,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (46,'delivery','REPARTO',80,81,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'DELIVERY');
-INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',82,83,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'STORAGE');
-INSERT INTO `department` VALUES (49,NULL,'PROPIEDAD',84,85,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (52,NULL,'CARGA AEREA',86,87,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (43,'VT','VENTAS',40,89,NULL,0,0,0,1,24,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (44,'management','GERENCIA',90,91,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (45,'logistic','LOGISTICA',92,93,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (46,'delivery','REPARTO',94,95,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'DELIVERY');
+INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',96,97,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'STORAGE');
+INSERT INTO `department` VALUES (49,NULL,'PROPIEDAD',98,99,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (52,NULL,'CARGA AEREA',100,101,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (53,'marketing','MARKETING Y COMUNICACIÓN',41,42,NULL,72,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (54,NULL,'ORNAMENTALES',88,89,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (54,NULL,'ORNAMENTALES',102,103,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (55,NULL,'TALLER NATURAL',21,22,14548,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1118,NULL,NULL,NULL);
INSERT INTO `department` VALUES (56,NULL,'TALLER ARTIFICIAL',23,24,8470,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1927,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (58,'CMP','CAMPOS',90,93,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'FIELD');
-INSERT INTO `department` VALUES (59,'maintenance','MANTENIMIENTO',94,95,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (58,'CMP','CAMPOS',104,107,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'FIELD');
+INSERT INTO `department` VALUES (59,'maintenance','MANTENIMIENTO',108,109,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (60,'claims','RECLAMACIONES',43,44,NULL,72,0,0,2,0,43,'/1/43/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'CLAIM');
-INSERT INTO `department` VALUES (61,NULL,'VNH',96,99,NULL,73,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (66,NULL,'VERDNAMADRID',100,101,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (61,NULL,'VNH',110,113,NULL,73,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (66,NULL,'VERDNAMADRID',114,115,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (68,NULL,'COMPLEMENTOS',25,26,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (69,NULL,'VERDNABARNA',102,103,NULL,74,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',45,46,4250,0,0,0,2,0,43,'/1/43/','es5_equipo',1,'es5@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL);
-INSERT INTO `department` VALUES (86,NULL,'LIMPIEZA',104,105,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (89,NULL,'COORDINACION',106,107,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (90,NULL,'TRAILER',97,98,NULL,0,0,0,2,0,61,'/1/61/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (69,NULL,'VERDNABARNA',116,117,NULL,74,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',45,46,4250,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (86,NULL,'LIMPIEZA',118,119,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (89,NULL,'COORDINACION',120,121,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (90,NULL,'TRAILER',111,112,NULL,0,0,0,2,0,61,'/1/61/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (91,'artificial','ARTIFICIAL',27,28,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PREVIOUS');
INSERT INTO `department` VALUES (92,NULL,'EQUIPO SILVERIO',47,48,1203,0,0,0,2,0,43,'/1/43/','sdc_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',49,50,3797,0,0,0,2,0,43,'/1/43/','es2_equipo',1,'es2@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL);
-INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',51,52,24065,0,0,0,2,0,43,'/1/43/','es1_equipo',1,'es1@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL);
+INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',49,50,3797,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',51,52,24065,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (96,NULL,'EQUIPO C LOPEZ',53,54,4661,0,0,0,2,0,43,'/1/43/','cla_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (115,NULL,'EQUIPO CLAUDI',55,56,3810,0,0,0,2,0,43,'/1/43/','csr_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (123,NULL,'EQUIPO ELENA BASCUÑANA',57,58,7102,0,0,0,2,0,43,'/1/43/','ebt_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',108,109,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/','es3_equipo',1,'es3@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL);
+INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',122,123,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (126,NULL,'PRESERVADO',29,30,NULL,0,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (128,NULL,'PALETIZADO',31,32,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PALLETIZING');
-INSERT INTO `department` VALUES (130,NULL,'REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING');
-INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',91,92,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (130,'reviewers','REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING');
+INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',105,106,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (132,NULL,'EQUIPO DC',61,62,1731,0,0,0,2,0,43,'/1/43/','dc_equipo',1,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (133,'franceTeam','EQUIPO FRANCIA',63,64,1731,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL);
-INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',65,66,6264,0,0,0,2,0,43,'/1/43/','pt_equipo',1,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL);
-INSERT INTO `department` VALUES (135,'routers','ENRUTADORES',110,111,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (136,'heavyVehicles','VEHICULOS PESADOS',112,113,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (137,'sorter','SORTER',114,115,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',67,68,3803,0,0,0,2,0,43,'/1/43/','es4_equipo',1,'es4@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL);
+INSERT INTO `department` VALUES (133,'franceTeamManagement','EQUIPO GESTIÓN FRANCIA',63,64,9751,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL);
+INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',65,66,8964,0,0,0,2,0,43,'/1/43/','pt_equipo',1,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL);
+INSERT INTO `department` VALUES (135,'routers','ENRUTADORES',124,125,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (136,'heavyVehicles','VEHICULOS PESADOS',126,127,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (137,'sorter','SORTER',128,129,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',67,68,3803,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (140,'internationalTeam','EQUIPO INTERNACIONAL',69,70,24065,0,0,0,2,0,43,'/1/43/','int_equipo',1,'international@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL);
INSERT INTO `department` VALUES (141,NULL,'PREVIA',35,36,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'PREVIOUS');
INSERT INTO `department` VALUES (146,NULL,'VERDNACOLOMBIA',3,4,NULL,72,0,0,2,0,22,'/1/22/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL);
-INSERT INTO `department` VALUES (147,'spainTeamAsia','EQUIPO ESPAÑA ASIA',71,72,40214,0,0,0,2,0,43,'/1/43/','esA_equipo',0,'esA@verdnatura.es',0,0,0,0,NULL,NULL,'5500',NULL);
-INSERT INTO `department` VALUES (148,NULL,'CAPTATION FRANCIA',73,74,NULL,0,0,0,2,0,43,'/1/43/',NULL,0,NULL,0,0,0,0,NULL,NULL,'6000',NULL);
+INSERT INTO `department` VALUES (147,'spainTeamAsia','EQUIPO ESPAÑA ASIA',71,72,40214,0,0,0,2,0,43,'/1/43/','esA_equipo',1,'esA@verdnatura.es',0,0,0,0,NULL,NULL,'5500',NULL);
+INSERT INTO `department` VALUES (148,'franceTeamCatchment','EQUIPO CAPTACIÓN FRANCIA',73,74,25178,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,'6000',NULL);
+INSERT INTO `department` VALUES (149,'spainTeamCatchment','EQUIPO ESPAÑA CAPTACIÓN',75,76,1203,0,0,0,2,0,43,'/1/43/','es_captacion_equipo',1,'es_captacion@verdnatura.es',0,0,0,0,NULL,NULL,'5700',NULL);
+INSERT INTO `department` VALUES (150,'spainTeamLevanteIslands','EQUIPO ESPAÑA LEVANTE',77,78,1118,0,0,0,2,0,43,'/1/43/','es_levante_equipo',1,'es_levante@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL);
+INSERT INTO `department` VALUES (151,'spainTeamNorthwest','EQUIPO ESPAÑA NOROESTE',79,80,7102,0,0,0,2,0,43,'/1/43/','es_noroeste_equipo',1,'es_noroeste@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL);
+INSERT INTO `department` VALUES (152,'spainTeamNortheast','EQUIPO ESPAÑA NORESTE',81,82,1118,0,0,0,2,0,43,'/1/43/','es_noreste_equipo',1,'es_noreste@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL);
+INSERT INTO `department` VALUES (153,'spainTeamSouth','EQUIPO ESPAÑA SUR',83,84,36578,0,0,0,2,0,43,'/1/43/','es_sur_equipo',1,'es_sur@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL);
+INSERT INTO `department` VALUES (154,'spainTeamCenter','EQUIPO ESPAÑA CENTRO',85,86,4661,0,0,0,2,0,43,'/1/43/','es_centro_equipo',1,'es_centro@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL);
+INSERT INTO `department` VALUES (155,'spainTeamVip','EQUIPO ESPAÑA VIP',87,88,5432,0,0,0,2,0,43,'/1/43/','es_vip_equipo',1,'es_vip@verdnatura.es',0,0,0,0,NULL,NULL,'5600',NULL);
INSERT INTO `docuware` VALUES (1,'deliveryNote','Albaranes cliente','find','find','N__ALBAR_N',NULL);
INSERT INTO `docuware` VALUES (2,'deliveryNote','Albaranes cliente','store','Archivar','N__ALBAR_N',NULL);
@@ -2784,7 +2853,6 @@ INSERT INTO `state` VALUES (7,'Sin Acabar',1,0,'NOT_READY',7,0,0,0,0,0,0,4,1,'al
INSERT INTO `state` VALUES (8,'Revisado',8,2,'CHECKED',8,0,1,0,3,0,0,1,0,'warning');
INSERT INTO `state` VALUES (9,'Encajando',9,3,'PACKING',9,0,1,0,0,0,0,1,0,NULL);
INSERT INTO `state` VALUES (10,'Encajado',10,3,'PACKED',10,0,1,0,0,0,0,0,0,NULL);
-INSERT INTO `state` VALUES (11,'Facturado',0,4,'INVOICED',11,0,1,0,0,0,0,0,0,NULL);
INSERT INTO `state` VALUES (12,'Bloqueado',0,0,'BLOCKED',12,0,0,0,0,0,0,4,1,'alert');
INSERT INTO `state` VALUES (13,'En Reparto',11,4,'ON_DELIVERY',13,0,1,0,0,0,0,0,0,NULL);
INSERT INTO `state` VALUES (14,'Preparado',6,2,'PREPARED',14,0,1,0,2,0,0,1,0,'warning');
@@ -2797,19 +2865,15 @@ INSERT INTO `state` VALUES (23,'URGENTE',5,2,'LAST_CALL',23,1,0,1,0,0,0,4,1,'suc
INSERT INTO `state` VALUES (24,'Encadenado',4,0,'CHAINED',24,0,0,0,0,0,0,3,1,'success');
INSERT INTO `state` VALUES (25,'Embarcando',3,0,'BOARDING',25,1,0,0,0,0,0,3,0,'alert');
INSERT INTO `state` VALUES (26,'Prep Previa',5,0,'PREVIOUS_PREPARATION',28,1,0,0,1,0,0,2,0,'warning');
-INSERT INTO `state` VALUES (27,'Prep Asistida',5,2,'ASSISTED_PREPARATION',27,0,0,0,0,0,0,2,0,'success');
INSERT INTO `state` VALUES (28,'Previa OK',3,0,'OK PREVIOUS',28,1,0,1,1,1,1,3,0,'warning');
INSERT INTO `state` VALUES (29,'Previa Impreso',4,0,'PRINTED PREVIOUS',29,1,0,1,0,0,1,2,0,'success');
-INSERT INTO `state` VALUES (30,'Embarcado',4,2,'BOARD',30,0,0,0,2,0,0,3,0,'success');
INSERT INTO `state` VALUES (31,'Polizon Impreso',4,2,'PRINTED STOWAWAY',29,1,0,1,0,0,1,2,0,'success');
-INSERT INTO `state` VALUES (32,'Polizon OK',3,2,'OK STOWAWAY',31,1,0,0,1,1,1,3,0,'warning');
INSERT INTO `state` VALUES (33,'Auto_Impreso',4,0,'PRINTED_AUTO',29,1,0,1,0,0,1,2,0,'success');
INSERT INTO `state` VALUES (34,'Pte Pago',3,0,'WAITING_FOR_PAYMENT',34,0,0,0,0,0,0,4,1,'alert');
INSERT INTO `state` VALUES (35,'Semi-Encajado',9,3,'HALF_PACKED',10,0,1,0,0,0,0,1,0,NULL);
INSERT INTO `state` VALUES (36,'Previa Revisando',3,0,'PREVIOUS_CONTROL',37,1,0,0,4,0,1,2,0,'warning');
INSERT INTO `state` VALUES (37,'Previa Revisado',3,0,'PREVIOUS_CONTROLLED',29,1,0,1,0,0,1,2,0,'warning');
INSERT INTO `state` VALUES (38,'Prep Cámara',6,2,'COOLER_PREPARATION',14,0,0,0,2,0,0,2,0,'warning');
-INSERT INTO `state` VALUES (41,'Prep Parcial',6,2,'PARTIAL_PREPARATION',14,0,0,0,2,0,0,2,0,'warning');
INSERT INTO `state` VALUES (42,'Entregado en parte',13,3,'PARTIAL_DELIVERED',16,0,1,0,0,0,0,0,0,NULL);
INSERT INTO `state` VALUES (43,'Preparación por caja',6,2,'BOX_PICKING',42,0,0,0,2,0,0,2,0,'warning');
@@ -2820,6 +2884,17 @@ INSERT INTO `ticketCanAdvanceConfig` VALUES (1,5);
INSERT INTO `volumeConfig` VALUES (2.67,1.60,0.8,150,0.30,120,57,2.0,50,200,10,167.0);
+INSERT INTO `workerActivityType` VALUES ('CLAIM','RECLAMACIONES');
+INSERT INTO `workerActivityType` VALUES ('DELIVERY','REPARTO');
+INSERT INTO `workerActivityType` VALUES ('FIELD','CAMPOS');
+INSERT INTO `workerActivityType` VALUES ('ON_CHECKING','REVISION');
+INSERT INTO `workerActivityType` VALUES ('ON_PREPARATION','SACADO');
+INSERT INTO `workerActivityType` VALUES ('PACKING','ENCAJADO');
+INSERT INTO `workerActivityType` VALUES ('PALLETIZING','PALETIZADO');
+INSERT INTO `workerActivityType` VALUES ('PREVIOUS','ARTIFICIAL-CÁMARA');
+INSERT INTO `workerActivityType` VALUES ('STOP','PARADA');
+INSERT INTO `workerActivityType` VALUES ('STORAGE','ALMACENAJE');
+
INSERT INTO `workCenter` VALUES (1,'Silla',20,859,1,'Av espioca 100',552703,NULL);
INSERT INTO `workCenter` VALUES (2,'Mercaflor',19,NULL,NULL,NULL,NULL,NULL);
INSERT INTO `workCenter` VALUES (3,'Marjales',26,20008,NULL,NULL,NULL,NULL);
@@ -2977,6 +3052,7 @@ INSERT INTO `message` VALUES (20,'clientNotVerified','Incomplete tax data, pleas
INSERT INTO `message` VALUES (21,'quantityLessThanMin','The quantity cannot be less than the minimum');
INSERT INTO `message` VALUES (22,'ORDER_ROW_UNAVAILABLE','The ordered quantity exceeds the available');
INSERT INTO `message` VALUES (23,'AMOUNT_NOT_MATCH_GROUPING','The quantity ordered does not match the grouping');
+INSERT INTO `message` VALUES (24,'orderLinesWithZero','There are empty lines. Please delete them');
INSERT INTO `metatag` VALUES (2,'title','Verdnatura Levante SL, mayorista de flores, plantas y complementos para floristería y decoración');
INSERT INTO `metatag` VALUES (3,'description','Verdnatura Levante SL, mayorista de flores, plantas y complementos para floristería y decoración. Envío a toda España, pedidos por internet o por teléfono.');
@@ -3149,6 +3225,7 @@ USE `sage`;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
INSERT INTO `TiposIva` VALUES (2,0,'Operaciones no sujetas',0.0000000000,0.0000000000,0.0000000000,'','4770000020','','','','','','','95B21A93-5910-489D-83BB-C32788C9B19D','','','','','','','','','',0);
+INSERT INTO `TiposIva` VALUES (3,0,'IVA ESPECIAL 2%',0.0000000000,2.0000000000,0.0000000000,'4720000002','4770000012','','','','','','','9E6160D5-984E-4643-ACBC-1EBC3BF73360','','','','','','','','','',0);
INSERT INTO `TiposIva` VALUES (4,0,'I.V.A. 4%',0.0000000000,4.0000000000,0.0000000000,'4720000004','4770000004','','6310000000','','','','','9E6160D5-984E-4643-ACBC-1EBC3BF73360','','','','','','','','','',0);
INSERT INTO `TiposIva` VALUES (5,0,'I.V.A. 4% y R.E. 0.5%',0.0000000000,4.0000000000,0.5000000000,'','4770000504','4770000405','','','','','','DBEFA562-63FB-4FFC-8171-64F0C6F065FF','','','','','','','','','',0);
INSERT INTO `TiposIva` VALUES (6,0,'H.P. IVA 4% CEE',0.0000000000,4.0000000000,0.0000000000,'4721000004','4771000004','','','','','','','DD0ECBA8-2EF5-425E-911B-623580BADA77','','','','','','','','','',0);
diff --git a/db/dump/.dump/privileges.sql b/db/dump/.dump/privileges.sql
index d754e62c5..598bfdf75 100644
--- a/db/dump/.dump/privileges.sql
+++ b/db/dump/.dump/privileges.sql
@@ -805,7 +805,7 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','edi','grafana','supplyResponse','ju
INSERT IGNORE INTO `tables_priv` VALUES ('','cache','customer','last_buy','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesAssistant','client','carlosap@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','invoiceInTax','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesAssistant','workerTeam','juan@10.5.1.2','0000-00-00 00:00:00','Select,Insert,Update','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesAssistant','workerTeam','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','postgresql','hr','profile_type','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','postgresql','hr','profile_media','alexm@%','0000-00-00 00:00:00','Select,Insert','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','recovery','alexm@%','0000-00-00 00:00:00','Select','');
@@ -835,7 +835,6 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','bi','salesPerson','tarifa_component
INSERT IGNORE INTO `tables_priv` VALUES ('','srt','employee','expeditionLog','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','bs','salesPerson','clientNewBorn','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','saleItemShelving__','alexm@%','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesBoss','workerTeam','juan@10.5.1.2','0000-00-00 00:00:00','Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','srt','employee','expedition','alexm@%','0000-00-00 00:00:00','Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemShelvingStock','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','saleParking__','alexm@%','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
@@ -887,7 +886,6 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','ticketDms','alexm@%
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesPerson','ektEntryAssign','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select,Insert','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','intrastat','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','productionAssi','supplierAgencyTerm','alexm@%','0000-00-00 00:00:00','Update','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','coolerAssist','entryConfig','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','packager','franceExpressConfig','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','manager','ticketLog','juan@10.5.1.2','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','productionAssi','ticketCollection','alexm@%','0000-00-00 00:00:00','Delete','');
@@ -945,7 +943,7 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','role','alexm@%','00
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','clientCredit','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','worker','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','coolerAssist','workerAppTester','alexm@%','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','propertyGroup','alexm@%','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financial','propertyGroup','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','worker','alexm@%','0000-00-00 00:00:00','Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','workerBusinessType','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','workerDepartment','alexm@%','0000-00-00 00:00:00','Select','');
@@ -964,7 +962,6 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','workerMana','alexm@%',
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','salesPerson','workerMana','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','claimManager','ticketPackaging','alexm@%','0000-00-00 00:00:00','Insert','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','claimManager','ticketPackagingStartingStock','alexm@%','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','claimManager','entryConfig','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','officeBoss','ticketPackagingStartingStock','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','workerRelatives','guillermo@db-proxy1.static.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','productionAssi','ticketPackagingStartingStock','alexm@%','0000-00-00 00:00:00','Select','');
@@ -982,7 +979,7 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','bi','officeBoss','Greuge_Evolution'
INSERT IGNORE INTO `tables_priv` VALUES ('','bi','claimManager','rotacion','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','bs','grafana','sale','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','zonePromo__','alexm@%','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','accountingConfig','alexm@%','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','accountingConfig','carlosap@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','accountingType','alexm@%','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logistic','agencyMode','alexm@%','0000-00-00 00:00:00','Insert,Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','cache','employee','visible','juan@10.5.1.2','0000-00-00 00:00:00','Select','');
@@ -1246,6 +1243,7 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','bs','deliveryAssistant','m3','alexm
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryAssistant','ticketDms','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryAssistant','time','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','deliveryAssistant','v_Articles_botanical','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','inventoryConfig','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryAssistant','workerDepartment','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryAssistant','zoneEvent','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','bi','deliveryAssistant','rotacion','alexm@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select','');
@@ -1418,9 +1416,12 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','financialBoss','accountDetail'
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','adminOfficer','accountDetail','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','maintenanceBoss','project','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','maintenanceBoss','machineDetail','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyerSalesAssistant','route','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','workerActivityType','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','delivery','zoneConfig','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyerSalesAssistant','route','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','workCenter','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','buyerSalesAssistant','Rutas','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','marketingBoss','specialPrice','alexm@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','genericAllocation','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','businessReasonEnd','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','buyer','buy_edi','alexm@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
@@ -1480,7 +1481,6 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemStateTag'
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','material','alexm@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','saleUnit','alexm@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','origin','alexm@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update,Delete','');
-INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','itemType','jgallego@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','deliveryAssistant','delivery','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemFarmingTag','jenkins@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemWrappingTag','jenkins@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
@@ -1490,6 +1490,14 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemBaseTag',
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemBreederTag','jenkins@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemShelvingLog','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemTextureTag','jenkins@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','travelThermograph','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','thermograph','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','buyerSalesAssistant','Tickets','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','sim','jenkins@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','zoneGeo','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
+INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','campaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select','');
/*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */;
/*!40000 ALTER TABLE `columns_priv` DISABLE KEYS */;
@@ -1875,6 +1883,7 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','salesAssistant','subordinateget
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','buyer','buy_afterUpsert','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','util','grafana','dayend','FUNCTION','juan@db-proxy2.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','production','buffer_settypebyname','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
+INSERT IGNORE INTO `procs_priv` VALUES ('','vn','grafana','clientGetMana','FUNCTION','guillermo@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','barcodeToItem','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','ticket_splititempackingtype','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','entry_getCommission','FUNCTION','alexm@%','Execute','0000-00-00 00:00:00');
@@ -1911,7 +1920,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','util','android','debugadd','PROCEDUR
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','copyComponentsFromSaleList','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','duaEntryValueUpdate','PROCEDURE','alexm@%','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','duaInvoiceInBooking','PROCEDURE','carlosap@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
-INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','itemshelvinglog_get','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','production','expedition_getstate','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','production','expedition_scan','PROCEDURE','alexm@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','productionBoss','saleSplit','PROCEDURE','guillermo@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
@@ -2134,7 +2142,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','buffer_settypebynam
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','expedition_getstate','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','expedition_scan','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_get','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
-INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelvinglog_get','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_add','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_getsaledate','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_filterbuyer','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
@@ -2154,6 +2161,7 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','sectorcollection_new
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','sectorcollection_get','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','setparking','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','shelvingparking_get','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
+INSERT IGNORE INTO `procs_priv` VALUES ('','vn','employee','buy_getLastWithoutInventory','FUNCTION','guillermo@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','saletracking_addprevok','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','sectorcollectionsalegroup_add','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','saletracking_updateischecked','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
@@ -2162,6 +2170,7 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','travel_updatepacking
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','freelance_getinfo','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','company_getfiscaldata','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','expedition_getfromroute','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
+INSERT IGNORE INTO `procs_priv` VALUES ('','vn','salesAssistant','zone_getPostalCode','PROCEDURE','guillermo@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemplacementsupplyaiming','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','expeditionstate_addbypallet','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','expeditionloading_add','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00');
@@ -2254,7 +2263,7 @@ INSERT IGNORE INTO `global_priv` VALUES ('','buyerBoss','{\"access\": 0, \"versi
INSERT IGNORE INTO `global_priv` VALUES ('','buyerSalesAssistant','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
INSERT IGNORE INTO `global_priv` VALUES ('','claimManager','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
INSERT IGNORE INTO `global_priv` VALUES ('','cooler','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
-INSERT IGNORE INTO `global_priv` VALUES ('','coolerAssist','{\"access\":0,\"version_id\":100707,\"is_role\":true}');
+INSERT IGNORE INTO `global_priv` VALUES ('','coolerAssist','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
INSERT IGNORE INTO `global_priv` VALUES ('','coolerBoss','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
INSERT IGNORE INTO `global_priv` VALUES ('','customer','{\"access\": 0, \"max_questions\": 0, \"max_updates\": 30000, \"max_connections\": 300000, \"max_user_connections\": 400, \"max_statement_time\": 0.000000, \"is_role\": true,\"version_id\":100707}');
INSERT IGNORE INTO `global_priv` VALUES ('','delivery','{\"access\":0,\"version_id\":101106,\"is_role\":true}');
diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql
index c3f622d5f..58f1e7591 100644
--- a/db/dump/.dump/structure.sql
+++ b/db/dump/.dump/structure.sql
@@ -75,26 +75,6 @@ SET character_set_client = utf8;
1 AS `password` */;
SET character_set_client = @saved_cs_client;
---
--- Table structure for table `accountLog__`
---
-
-DROP TABLE IF EXISTS `accountLog__`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `accountLog__` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `msg` varchar(255) NOT NULL,
- `pid` varchar(255) NOT NULL,
- `user` varchar(255) NOT NULL,
- `host` varchar(255) NOT NULL,
- `rhost` varchar(255) NOT NULL,
- `time` varchar(255) NOT NULL,
- `summaryId` varchar(30) DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='@deprecated 2024-09-02 refs #7819';
-/*!40101 SET character_set_client = @saved_cs_client */;
-
--
-- Temporary table structure for view `emailUser`
--
@@ -2589,28 +2569,6 @@ SET character_set_client = utf8;
1 AS `Consumo` */;
SET character_set_client = @saved_cs_client;
---
--- Temporary table structure for view `rotacion`
---
-
-DROP TABLE IF EXISTS `rotacion`;
-/*!50001 DROP VIEW IF EXISTS `rotacion`*/;
-SET @saved_cs_client = @@character_set_client;
-SET character_set_client = utf8;
-/*!50001 CREATE VIEW `rotacion` AS SELECT
- 1 AS `Id_Article`,
- 1 AS `warehouse_id`,
- 1 AS `total`,
- 1 AS `rotacion`,
- 1 AS `cm3`,
- 1 AS `almacenaje`,
- 1 AS `manipulacion`,
- 1 AS `auxiliar`,
- 1 AS `mermas`,
- 1 AS `cm3reparto`,
- 1 AS `grams` */;
-SET character_set_client = @saved_cs_client;
-
--
-- Table structure for table `rutasBoard`
--
@@ -3538,14 +3496,14 @@ BEGIN
bultos)
SELECT r.id,
r.agencyModeFk,
- r.created,
+ r.dated,
SUM(sv.volume / ebv.m3)
FROM vn.route r
JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
JOIN vn.saleVolume sv ON sv.ticketFk = t.id
JOIN vn.expeditionBoxVol ebv ON ebv.code = 'transportBox'
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND z.isVolumetric
GROUP BY r.id;
@@ -3557,12 +3515,12 @@ BEGIN
Bultos)
SELECT r.id,
r.agencyModeFk,
- r.created,
+ r.dated,
SUM(t.packages)
FROM vn.route r
JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND NOT z.isVolumetric
GROUP BY r.id
ON DUPLICATE KEY UPDATE Bultos = Bultos + VALUES(Bultos);
@@ -3579,7 +3537,7 @@ BEGIN
JOIN vn.component c ON c.id = sc.componentFk
JOIN vn.componentType ct ON ct.id = c.typeFk
WHERE ct.code = 'freight'
- AND r.created BETWEEN vDatedFrom AND vDatedTo
+ AND r.dated BETWEEN vDatedFrom AND vDatedTo
GROUP BY r.id
) sub ON sub.routeFk = r.Id_Ruta
SET r.practico = IFNULL(sub.totalPractice / r.Bultos, 0);
@@ -3596,7 +3554,7 @@ BEGIN
JOIN vn.address ad ON ad.id = t.addressFk
JOIN vn.client c ON c.id = ad.clientFk
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND NOT z.isVolumetric
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
@@ -3612,7 +3570,7 @@ BEGIN
JOIN vn.saleVolume sf ON sf.ticketFk = t.id
JOIN vn.client c ON c.id = t.clientFk
JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND z.isVolumetric
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
@@ -3627,7 +3585,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
JOIN vn.greuge g ON g.ticketFk = t.id
JOIN vn.greugeType gt ON gt.id = g.greugeTypeFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND gt.code = 'freightDifference'
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
@@ -6291,19 +6249,27 @@ BEGIN
* @param vDateFrom Fecha desde
* @param vDateTo Fecha hasta
*/
- IF vDateFrom IS NULL THEN
- SET vDateFrom = util.VN_CURDATE() - INTERVAL WEEKDAY(util.VN_CURDATE()) DAY;
+ DECLARE vDaysInYear INT;
+ SET vDaysInYear = DATEDIFF(util.lastDayOfYear(CURDATE()), util.firstDayOfYear(CURDATE()));
+
+ SET vDateFrom = COALESCE(vDateFrom, util.VN_CURDATE());
+ SET vDateTo = COALESCE(vDateTo, util.VN_CURDATE());
+
+ IF DATEDIFF(vDateTo, vDateFrom) > vDaysInYear THEN
+ CALL util.throw('The period cannot be longer than one year');
END IF;
- IF vDateTo IS NULL THEN
- SET vDateTo = vDateFrom + INTERVAL 6 DAY;
- END IF;
+ -- Obtiene el primer día de la semana de esa fecha
+ SET vDateFrom = DATE_SUB(vDateFrom, INTERVAL ((WEEKDAY(vDateFrom) + 1) % 7) DAY);
+
+ -- Obtiene el último día de la semana de esa fecha
+ SET vDateTo = DATE_ADD(vDateTo, INTERVAL (6 - ((WEEKDAY(vDateTo) + 1) % 7)) DAY);
CALL cache.last_buy_refresh(FALSE);
REPLACE bs.waste
- SELECT YEAR(t.shipped),
- WEEK(t.shipped, 4),
+ SELECT YEARWEEK(t.shipped, 6) DIV 100,
+ WEEK(t.shipped, 6),
it.workerFk,
it.id,
s.itemFk,
@@ -6349,9 +6315,9 @@ BEGIN
JOIN cache.last_buy lb ON lb.item_id = i.id
AND lb.warehouse_id = w.id
JOIN vn.buy b ON b.id = lb.buy_id
- WHERE t.shipped BETWEEN vDateFrom AND vDateTo
+ WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDateTo)
AND w.isManaged
- GROUP BY YEAR(t.shipped), WEEK(t.shipped, 4), i.id;
+ GROUP BY YEARWEEK(t.shipped, 6) DIV 100, WEEK(t.shipped, 6), i.id;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -13849,7 +13815,7 @@ BEGIN
) INTO vHas0Amount;
IF vHas0Amount THEN
- CALL util.throw('Hay líneas vacías. Por favor, elimínelas');
+ CALL util.throw('orderLinesWithZero');
END IF;
START TRANSACTION;
@@ -17501,10 +17467,10 @@ BEGIN
/**
* Traslada la info de contabilidad relacionada con las facturas recibidas
*
- * @vInvoiceInFk Factura recibida
- * @vXDiarioFk Id tabla XDiario
+ * @param vInvoiceInFk Factura recibida
+ * @param vXDiarioFk Id tabla XDiario
*/
- DECLARE vInvoiceInOriginalFk INT;
+ DECLARE vInvoiceInOriginalFk INT;
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vBase DOUBLE;
DECLARE vVat DOUBLE;
@@ -17522,8 +17488,8 @@ BEGIN
DECLARE vIsInformativeExportation BOOL DEFAULT FALSE;
DECLARE vCursor CURSOR FOR
- SELECT it.taxableBase,
- CAST((( it.taxableBase / 100) * t.PorcentajeIva) AS DECIMAL (10,2)),
+ SELECT SUM(it.taxableBase),
+ CAST(SUM((( it.taxableBase / 100) * t.PorcentajeIva)) AS DECIMAL (10,2)),
t.PorcentajeIva,
it.transactionTypeSageFk,
it.taxTypeSageFk,
@@ -17536,7 +17502,8 @@ BEGIN
JOIN TiposTransacciones tt ON tt.CodigoTransaccion = it.transactionTypeSageFk
LEFT JOIN vn.dua d ON d.id = vInvoiceInFk
WHERE i.id = vInvoiceInFk
- AND d.id IS NULL;
+ AND d.id IS NULL
+ GROUP BY it.taxTypeSageFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
@@ -17700,32 +17667,31 @@ BEGIN
FROM vn.invoiceInCorrection
WHERE correctingFk = vInvoiceInFk;
- IF vInvoiceInOriginalFk THEN
-
+ IF vInvoiceInOriginalFk THEN
UPDATE movContaIVA mci
- JOIN vn.invoiceInRefund iir ON iir.invoiceInRefundFk = vInvoiceInFk
+ JOIN vn.invoiceInCorrection iic ON iic.correctingFk = vInvoiceInFk
+ JOIN vn.siiTypeInvoiceIn st ON st.id = iic.siiTypeInvoiceInFk
JOIN (SELECT issued,
- SUM(sub.taxableBase) taxableBase,
+ SUM(sub.taxableBase) taxableBase,
SUM(ROUND((sub.taxableBase * sub.PorcentajeIva) / 100 , 2)) vat
FROM(SELECT issued,
- SUM(iit.taxableBase) taxableBase,
+ SUM(iit.taxableBase) taxableBase,
ti.PorcentajeIva
- FROM vn.invoiceIn i
+ FROM vn.invoiceIn i
JOIN vn.invoiceInTax iit ON iit.invoiceInFk = i.id
- JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
+ JOIN TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
WHERE i.id = vInvoiceInOriginalFk
GROUP BY ti.CodigoIva)sub
)invoiceInOriginal
JOIN ClavesOperacion co ON co.Descripcion = 'Factura rectificativa'
SET mci.TipoRectificativa = iir.refundCategoryFk,
- mci.ClaseAbonoRectificativas = iir.refundType,
+ mci.ClaseAbonoRectificativas = iir.refundType,
mci.FechaFacturaOriginal = invoiceInOriginal.issued,
mci.FechaOperacion = invoiceInOriginal.issued,
mci.BaseImponibleOriginal = invoiceInOriginal.taxableBase,
mci.CuotaIvaOriginal = invoiceInOriginal.vat,
mci.ClaveOperacionFactura = co.ClaveOperacionFactura_
WHERE mci.id = vXDiarioFk;
-
END IF;
END ;;
DELIMITER ;
@@ -18197,6 +18163,7 @@ BEGIN
UPDATE movContaIVA mci
JOIN vn.invoiceOut i ON i.id = vInvoiceOutCorrectedFk
JOIN vn.invoiceCorrection ic ON ic.correctedFk = vInvoiceOutCorrectedFk
+ JOIN vn.siiTypeInvoiceOut st ON st.id = ic.siiTypeInvoiceOutFk
JOIN (SELECT SUM(IF(IFNULL(e.vatFk, TRUE), iot.taxableBase, 0)) taxableBase,
SUM(IF(IFNULL(e.vatFk, TRUE), iot.vat, 0)) vat,
SUM(IF(IFNULL(e.vatFk, TRUE), 0, iot.vat)) equ
@@ -18205,8 +18172,8 @@ BEGIN
WHERE iot.invoiceOutFk = vInvoiceOutCorrectedFk
) tax
JOIN ClavesOperacion co ON co.Descripcion = 'Factura rectificativa'
- SET mci.TipoRectificativa = 2,
- mci.ClaseAbonoRectificativas = 1,
+ SET mci.TipoRectificativa = ic.cplusRectificationTypeFk,
+ mci.ClaseAbonoRectificativas = REGEXP_REPLACE(st.`code`, '[^0-9]', ''),
mci.FechaFacturaOriginal = i.issued,
mci.FechaOperacion = i.issued,
mci.BaseImponibleOriginal = tax.taxableBase,
@@ -22756,8 +22723,7 @@ BEGIN
DROP TEMPORARY TABLE IF EXISTS tValues;
CREATE TEMPORARY TABLE tValues
ENGINE = MEMORY
- SELECT
- b.id buyFk,
+ SELECT b.id buyFk,
e.id entryFk,
t.id travelFk,
b.itemFk,
@@ -23439,8 +23405,6 @@ DROP TABLE IF EXISTS `config`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `config` (
`id` int(10) unsigned NOT NULL,
- `dbVersion__` char(11) DEFAULT NULL COMMENT '@deprecated 2024-09-02 refs #7819',
- `hasTriggersDisabled__` tinyint(1) NOT NULL DEFAULT 0 COMMENT '@deprecated 2024-09-02 refs #7819',
`environment` varchar(45) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'The current Database environment',
`lastDump` datetime DEFAULT NULL COMMENT 'Timestamp of the last data dump',
`mockUtcTime` datetime DEFAULT NULL,
@@ -26125,7 +26089,6 @@ CREATE TABLE `agencyMode` (
`inflation` decimal(5,2) NOT NULL DEFAULT 0.00 COMMENT 'Este valor se utiliza para aumentar el valor del componente porte.',
`isVolumetric` tinyint(1) NOT NULL DEFAULT 0,
`reportMail` varchar(100) DEFAULT NULL,
- `showAgencyName__` tinyint(1) DEFAULT 1 COMMENT '@deprecated 2024-09-24',
`isActive` tinyint(1) NOT NULL DEFAULT 1,
`isExternalAgency` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'obsoleta',
`flag` blob DEFAULT NULL COMMENT 'obsoleta',
@@ -28967,6 +28930,7 @@ CREATE TABLE `country` (
`isSocialNameUnique` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `country_unique` (`code`),
+ UNIQUE KEY `country_unique_name` (`name`),
KEY `currency_id_fk_idx` (`currencyFk`),
KEY `country_Ix4` (`name`),
KEY `continent_id_fk_idx` (`continentFk`),
@@ -29075,13 +29039,11 @@ DROP TABLE IF EXISTS `creditInsurance`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `creditInsurance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `creditClassification__` int(11) DEFAULT NULL COMMENT '@deprecated 2024-09-11',
`credit` int(11) DEFAULT NULL,
`creationDate` timestamp NOT NULL DEFAULT current_timestamp(),
`grade` tinyint(1) DEFAULT NULL,
`creditClassificationFk` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
- KEY `CreditInsurance_Fk1_idx` (`creditClassification__`),
KEY `creditInsurance_creditClassificationFk` (`creditClassificationFk`),
CONSTRAINT `creditInsurance_creditClassificationFk` FOREIGN KEY (`creditClassificationFk`) REFERENCES `creditClassification` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Detalla los clientes que tienen seguro de credito';
@@ -29553,14 +29515,16 @@ CREATE TABLE `deviceProductionUser` (
`userFk` int(10) unsigned NOT NULL,
`created` timestamp NULL DEFAULT current_timestamp(),
`editorFk` int(10) unsigned DEFAULT NULL,
- `simSerialNumber` text DEFAULT NULL,
+ `simFk` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `deviceProductionUser_unique` (`deviceProductionFk`),
KEY `userFgn_idx` (`userFk`),
KEY `deviceProductionUser_fk_editor` (`editorFk`),
+ KEY `deviceProductionUser_sim_FK` (`simFk`),
CONSTRAINT `deviceProductionUser_PK` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `deviceProductionUser_deviceProduction_FK` FOREIGN KEY (`deviceProductionFk`) REFERENCES `deviceProduction` (`id`),
- CONSTRAINT `deviceProductionUser_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`)
+ CONSTRAINT `deviceProductionUser_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`),
+ CONSTRAINT `deviceProductionUser_sim_FK` FOREIGN KEY (`simFk`) REFERENCES `sim` (`code`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -29803,7 +29767,7 @@ CREATE TABLE `duaInvoiceIn` (
`duaFk` int(11) NOT NULL,
`invoiceInFk` mediumint(8) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
- UNIQUE KEY `duaFk_UNIQUE` (`duaFk`,`invoiceInFk`),
+ UNIQUE KEY `duaInvoiceIn_unique` (`invoiceInFk`),
KEY `duaInvoiceIn_fk1_idx` (`duaFk`),
KEY `duaInvoiceIn_fk2_idx` (`invoiceInFk`),
CONSTRAINT `duaInvoiceIn_fk1` FOREIGN KEY (`duaFk`) REFERENCES `dua` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
@@ -31379,13 +31343,27 @@ CREATE TABLE `inventoryConfig` (
/*!40101 SET character_set_client = @saved_cs_client */;
--
--- Table structure for table `inventoryFailure`
+-- Table structure for table `inventoryFailureCause__`
--
-DROP TABLE IF EXISTS `inventoryFailure`;
+DROP TABLE IF EXISTS `inventoryFailureCause__`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `inventoryFailure` (
+CREATE TABLE `inventoryFailureCause__` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `description` varchar(100) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='@deprecated 2024-12-16';
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Table structure for table `inventoryFailure__`
+--
+
+DROP TABLE IF EXISTS `inventoryFailure__`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `inventoryFailure__` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dated` date NOT NULL,
`itemFk` int(11) NOT NULL,
@@ -31406,22 +31384,8 @@ CREATE TABLE `inventoryFailure` (
CONSTRAINT `inventoryFailure_fk2` FOREIGN KEY (`throwerFk`) REFERENCES `worker` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `inventoryFailure_fk3` FOREIGN KEY (`guiltyFk`) REFERENCES `worker` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `inventoryFailure_fk4` FOREIGN KEY (`warehouseFk`) REFERENCES `warehouse` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
- CONSTRAINT `inventoryFailure_fk5` FOREIGN KEY (`causeFk`) REFERENCES `inventoryFailureCause` (`id`) ON UPDATE CASCADE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Table structure for table `inventoryFailureCause`
---
-
-DROP TABLE IF EXISTS `inventoryFailureCause`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `inventoryFailureCause` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `description` varchar(100) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+ CONSTRAINT `inventoryFailure_fk5` FOREIGN KEY (`causeFk`) REFERENCES `inventoryFailureCause__` (`id`) ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='@deprecated 2024-12-16';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -31579,18 +31543,18 @@ CREATE TABLE `invoiceInCorrection` (
`correctingFk` mediumint(8) unsigned NOT NULL COMMENT 'Factura rectificativa',
`correctedFk` mediumint(8) unsigned NOT NULL COMMENT 'Factura rectificada',
`cplusRectificationTypeFk` int(10) unsigned NOT NULL,
- `siiTypeInvoiceOutFk` int(10) unsigned NOT NULL,
+ `siiTypeInvoiceInFk` int(10) unsigned NOT NULL,
`invoiceCorrectionTypeFk` int(11) NOT NULL DEFAULT 3,
PRIMARY KEY (`correctingFk`),
KEY `invoiceInCorrection_correctedFk` (`correctedFk`),
KEY `invoiceInCorrection_cplusRectificationTypeFk` (`cplusRectificationTypeFk`),
- KEY `invoiceInCorrection_siiTypeInvoiceOut` (`siiTypeInvoiceOutFk`),
+ KEY `invoiceInCorrection_siiTypeInvoiceIn` (`siiTypeInvoiceInFk`),
KEY `invoiceInCorrection_invoiceCorrectionTypeFk` (`invoiceCorrectionTypeFk`),
CONSTRAINT `invoiceInCorrection_correctedFk` FOREIGN KEY (`correctedFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `invoiceInCorrection_correctingFk` FOREIGN KEY (`correctingFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `invoiceInCorrection_cplusRectificationTypeFk` FOREIGN KEY (`cplusRectificationTypeFk`) REFERENCES `cplusRectificationType` (`id`) ON UPDATE CASCADE,
CONSTRAINT `invoiceInCorrection_invoiceCorrectionTypeFk` FOREIGN KEY (`invoiceCorrectionTypeFk`) REFERENCES `invoiceCorrectionType` (`id`) ON UPDATE CASCADE,
- CONSTRAINT `invoiceInCorrection_siiTypeInvoiceOut` FOREIGN KEY (`siiTypeInvoiceOutFk`) REFERENCES `siiTypeInvoiceOut` (`id`) ON UPDATE CASCADE
+ CONSTRAINT `invoiceInCorrection_siiTypeInvoiceIn` FOREIGN KEY (`siiTypeInvoiceInFk`) REFERENCES `siiTypeInvoiceIn` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -32016,6 +31980,7 @@ CREATE TABLE `item` (
`value12` varchar(50) DEFAULT NULL,
`tag13` varchar(20) DEFAULT NULL,
`value13` varchar(50) DEFAULT NULL,
+ `isCustomInspectionRequired` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Indicates if the item requires physical inspection at customs',
PRIMARY KEY (`id`),
UNIQUE KEY `item_supplyResponseFk_idx` (`supplyResponseFk`),
KEY `Color` (`inkFk`),
@@ -32259,6 +32224,7 @@ CREATE TABLE `itemConfig` (
`defaultPriority` int(11) NOT NULL DEFAULT 2,
`warehouseFk` smallint(6) unsigned DEFAULT NULL,
`downloadMaxAttempts` tinyint(3) DEFAULT NULL COMMENT 'Intentos máximos para que se borre',
+ `defaultPackingTypeFk` varchar(1) DEFAULT 'H',
PRIMARY KEY (`id`),
KEY `itemConfig_FK` (`defaultTag`),
CONSTRAINT `itemConfig_FK` FOREIGN KEY (`defaultTag`) REFERENCES `tag` (`id`),
@@ -32706,13 +32672,13 @@ SET character_set_client = utf8;
SET character_set_client = @saved_cs_client;
--
--- Table structure for table `itemShelvingLog`
+-- Table structure for table `itemShelvingLog__`
--
-DROP TABLE IF EXISTS `itemShelvingLog`;
+DROP TABLE IF EXISTS `itemShelvingLog__`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `itemShelvingLog` (
+CREATE TABLE `itemShelvingLog__` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`itemShelvingFk` int(10) unsigned DEFAULT NULL,
`workerFk` int(11) DEFAULT NULL,
@@ -32730,7 +32696,7 @@ CREATE TABLE `itemShelvingLog` (
KEY `itemShelving_Log_FK` (`itemShelvingFk`),
KEY `itemShelvingLog_itemFk_IDX` (`itemFk`) USING BTREE,
KEY `itemShelvingLog_shelvingFk_IDX` (`shelvingFk`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='@deprecated 2024-11-26';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -33861,7 +33827,9 @@ DROP TABLE IF EXISTS `mistakeType`;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `mistakeType` (
`id` int(11) NOT NULL AUTO_INCREMENT,
+ `code` varchar(50) DEFAULT NULL,
`description` varchar(45) NOT NULL,
+ `time` int(10) DEFAULT NULL COMMENT 'Segundos que se suelen tardar en arreglar el fallo',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -34228,6 +34196,22 @@ CREATE TABLE `osTicketConfig` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
+--
+-- Table structure for table `osrmConfig`
+--
+
+DROP TABLE IF EXISTS `osrmConfig`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `osrmConfig` (
+ `id` int(10) unsigned NOT NULL,
+ `url` varchar(100) NOT NULL COMMENT 'Dirección base de la API',
+ `tolerance` decimal(6,6) NOT NULL DEFAULT 0.000000 COMMENT 'Tolerancia entre las coordenadas enviadas y las retornadas',
+ PRIMARY KEY (`id`),
+ CONSTRAINT `osrmConfig_check` CHECK (`id` = 1)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
--
-- Table structure for table `outgoingInvoiceVat`
--
@@ -35429,6 +35413,7 @@ CREATE TABLE `productionConfig` (
`orderMode` enum('Location','Age') NOT NULL DEFAULT 'Location',
`editorFk` int(10) unsigned DEFAULT NULL,
`minPlantTrayLength` int(11) NOT NULL DEFAULT 53 COMMENT 'minimum length for plant tray restriction. Avoid to make collection of the ticket with this kind of item',
+ `itemOrderReviewHours` int(11) DEFAULT 24 COMMENT 'Horas que no se tienen en cuenta para comprobar orden en el almacén, null para desactivar revisión',
PRIMARY KEY (`id`),
KEY `productionConfig_FK` (`shortageAddressFk`),
KEY `productionConfig_FK_1` (`clientSelfConsumptionFk`),
@@ -35786,26 +35771,6 @@ CREATE TABLE `punchState` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Table for storing punches that have cars with errors';
/*!40101 SET character_set_client = @saved_cs_client */;
---
--- Table structure for table `quadmindsApiConfig`
---
-
-DROP TABLE IF EXISTS `quadmindsApiConfig`;
-/*!40101 SET @saved_cs_client = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `quadmindsApiConfig` (
- `id` int(10) unsigned NOT NULL,
- `url` varchar(255) DEFAULT NULL,
- `key` varchar(255) DEFAULT NULL,
- `maxObjects` int(11) DEFAULT NULL COMMENT 'Número máximo de objetos en el array por petición',
- `limit` int(11) DEFAULT NULL COMMENT 'Limite de objetos solicitados por petición',
- `orderTimeFrom` varchar(5) DEFAULT NULL COMMENT 'Inicio de ventana horaria de pedido',
- `orderTimeTo` varchar(5) DEFAULT NULL COMMENT 'Fin de ventana horaria de pedido',
- PRIMARY KEY (`id`),
- CONSTRAINT `quadMindsConfig_check` CHECK (`id` = 1)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
--
-- Table structure for table `quality`
--
@@ -36253,7 +36218,7 @@ CREATE TABLE `route` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`workerFk` int(10) unsigned DEFAULT NULL,
`firstEditorFk` int(10) unsigned DEFAULT NULL,
- `created` date NOT NULL,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
`vehicleFk` int(10) unsigned DEFAULT NULL,
`agencyModeFk` int(11) DEFAULT NULL,
`time` datetime DEFAULT NULL,
@@ -36272,6 +36237,7 @@ CREATE TABLE `route` (
`beachFk` int(11) DEFAULT NULL,
`commissionWorkCenterFk` int(11) DEFAULT NULL COMMENT 'WorkerCenter que gestiona la ruta',
`editorFk` int(10) unsigned DEFAULT NULL,
+ `dated` date NOT NULL,
PRIMARY KEY (`id`),
KEY `Id_Agencia` (`agencyModeFk`),
KEY `Fecha` (`created`),
@@ -37565,20 +37531,20 @@ CREATE TABLE `siiTypeInvoiceOut` (
/*!40101 SET character_set_client = @saved_cs_client */;
--
--- Table structure for table `silexACL__`
+-- Table structure for table `sim`
--
-DROP TABLE IF EXISTS `silexACL__`;
+DROP TABLE IF EXISTS `sim`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `silexACL__` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `module` varchar(50) NOT NULL,
- `method` varchar(50) NOT NULL,
- `role` varchar(20) NOT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `module_UNIQUE` (`module`,`method`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='@deprecated 2024-08-05 refs #7820';
+CREATE TABLE `sim` (
+ `code` varchar(25) NOT NULL COMMENT 'No se ha puesto BIGINT por incompatibilidad con Access',
+ `line` varchar(15) NOT NULL CHECK (`line` regexp '^[0-9]+$'),
+ `ext` int(4) NOT NULL,
+ `pin` varchar(4) NOT NULL CHECK (`pin` regexp '^[0-9]+$'),
+ `puk` varchar(15) NOT NULL CHECK (`pin` regexp '^[0-9]+$'),
+ PRIMARY KEY (`code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -38628,7 +38594,7 @@ CREATE TABLE `ticket` (
CONSTRAINT `ticket_ibfk_8` FOREIGN KEY (`agencyModeFk`) REFERENCES `agencyMode` (`id`),
CONSTRAINT `ticket_ibfk_9` FOREIGN KEY (`routeFk`) REFERENCES `route` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT `ticket_invoiceOut_FK` FOREIGN KEY (`refFk`) REFERENCES `invoiceOut` (`ref`) ON UPDATE CASCADE,
- CONSTRAINT `tickets_zone_fk` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON UPDATE CASCADE
+ CONSTRAINT `tickets_zone_fk` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -40329,6 +40295,8 @@ CREATE TABLE `workCenterCommission` (
`distributionM3Category2` decimal(5,2) DEFAULT NULL,
`distributionCat4M3` decimal(5,2) DEFAULT NULL COMMENT 'Comisión por gestión de la distribución Cat IV',
`distributionCat5M3` decimal(5,2) DEFAULT NULL COMMENT 'Comisión por gestión de la distribución Cat V',
+ `deliveryM3Cat4` decimal(5,2) DEFAULT NULL,
+ `deliveryM3Cat5` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`workCenterFk`),
CONSTRAINT `workCenterCommission_workCenterFk` FOREIGN KEY (`workCenterFk`) REFERENCES `workCenter` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
@@ -40370,7 +40338,6 @@ CREATE TABLE `worker` (
`hasMachineryAuthorized` tinyint(2) DEFAULT 0,
`seniority` date DEFAULT NULL,
`isTodayRelative` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Para el F11. Calcula los problemas de visiblidad en funcion del dia actual',
- `isF11Allowed__` tinyint(1) NOT NULL DEFAULT 0 COMMENT '@deprecated 2024-09-22',
`maritalStatus` enum('S','M') NOT NULL,
`originCountryFk` mediumint(8) unsigned DEFAULT NULL COMMENT 'País de origen',
`educationLevelFk` smallint(6) DEFAULT NULL,
@@ -40922,9 +40889,7 @@ CREATE TABLE `workerRelatives` (
`updated` timestamp NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
KEY `workerRelatives_disabilityGradeFk` (`disabilityGradeFk`),
- KEY `workerRelatives_workerFk` (`workerFk`),
- CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE,
- CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE
+ KEY `workerRelatives_workerFk` (`workerFk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Modelo 145 IRPF apartado 2 y 3';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -41144,13 +41109,13 @@ CREATE TABLE `workerTimeControlMail` (
/*!40101 SET character_set_client = @saved_cs_client */;
--
--- Table structure for table `workerTimeControlParams`
+-- Table structure for table `workerTimeControlParams__`
--
-DROP TABLE IF EXISTS `workerTimeControlParams`;
+DROP TABLE IF EXISTS `workerTimeControlParams__`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `workerTimeControlParams` (
+CREATE TABLE `workerTimeControlParams__` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dayBreak` int(11) NOT NULL,
`weekBreak` int(11) NOT NULL,
@@ -41166,7 +41131,7 @@ CREATE TABLE `workerTimeControlParams` (
`mailErrorFolder` varchar(45) NOT NULL,
`mailUser` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='All values in seconds';
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='@deprecated 2024-11-19';
/*!40101 SET character_set_client = @saved_cs_client */;
--
@@ -41295,7 +41260,7 @@ CREATE TABLE `zone` (
`hour` datetime NOT NULL,
`agencyModeFk` int(11) NOT NULL,
`travelingDays` int(11) NOT NULL DEFAULT 1,
- `price` double NOT NULL DEFAULT 0 CHECK (`price` > 0),
+ `price` decimal(10,2) DEFAULT NULL,
`bonus` double NOT NULL DEFAULT 0,
`isVolumetric` tinyint(1) NOT NULL DEFAULT 0,
`inflation` decimal(5,2) NOT NULL DEFAULT 1.00,
@@ -41304,11 +41269,14 @@ CREATE TABLE `zone` (
`code` varchar(45) DEFAULT NULL,
`editorFk` int(10) unsigned DEFAULT NULL,
`itemMaxLength` int(11) DEFAULT NULL COMMENT 'Longitud maxima para articulos acostados que esa agencia puede transportar',
+ `addressFk` int(11) DEFAULT NULL COMMENT 'Punto de distribución de donde salen para repartir',
PRIMARY KEY (`id`),
KEY `fk_zone_2_idx` (`agencyModeFk`),
KEY `zone_name_idx` (`name`),
KEY `zone_fk_editor` (`editorFk`),
+ KEY `zone_address_FK` (`addressFk`),
CONSTRAINT `fk_zone_2` FOREIGN KEY (`agencyModeFk`) REFERENCES `agencyMode` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
+ CONSTRAINT `zone_address_FK` FOREIGN KEY (`addressFk`) REFERENCES `address` (`id`) ON UPDATE CASCADE,
CONSTRAINT `zone_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -41358,7 +41326,10 @@ CREATE TABLE `zoneConfig` (
`id` int(10) unsigned NOT NULL,
`scope` int(10) unsigned NOT NULL,
`forwardDays` int(10) NOT NULL DEFAULT 7 COMMENT 'days forward to show zone_upcomingDeliveries',
+ `defaultAddressFk` int(11) DEFAULT NULL COMMENT 'Punto de distribución por defecto',
PRIMARY KEY (`id`),
+ KEY `zoneConfig_address_FK` (`defaultAddressFk`),
+ CONSTRAINT `zoneConfig_address_FK` FOREIGN KEY (`defaultAddressFk`) REFERENCES `address` (`id`) ON UPDATE CASCADE,
CONSTRAINT `zoneConfig_check` CHECK (`id` = 1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -42227,6 +42198,49 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
+/*!50003 DROP FUNCTION IF EXISTS `buy_getLastWithoutInventory` */;
+/*!50003 SET @saved_cs_client = @@character_set_client */ ;
+/*!50003 SET @saved_cs_results = @@character_set_results */ ;
+/*!50003 SET @saved_col_connection = @@collation_connection */ ;
+/*!50003 SET character_set_client = utf8mb4 */ ;
+/*!50003 SET character_set_results = utf8mb4 */ ;
+/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
+DELIMITER ;;
+CREATE DEFINER=`vn`@`localhost` FUNCTION `buy_getLastWithoutInventory`(vItemFk INT,
+ vWarehouseFk INT
+) RETURNS int(11)
+ DETERMINISTIC
+BEGIN
+/**
+ * Retorna la última compra que no sea inventario.
+ *
+ * @param vItemFk Id del artículo
+ * @param vWarehouseFk Id del almacén
+ * @return Id de compra
+ */
+ DECLARE vBuyFk INT;
+
+ SELECT b.id INTO vBuyFk
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ WHERE e.id <> (SELECT defaultEntry FROM entryConfig)
+ AND e.supplierFk <> (SELECT supplierFk FROM inventoryConfig)
+ AND e.typeFk <> 'inventory'
+ AND b.itemFk = vItemFk
+ AND (t.warehouseInFk = vWarehouseFk OR t.warehouseInFk IS NULL)
+ ORDER BY ABS(DATEDIFF(util.VN_CURDATE(), t.landed)), e.created DESC
+ LIMIT 1;
+
+ RETURN vBuyFk;
+END ;;
+DELIMITER ;
+/*!50003 SET sql_mode = @saved_sql_mode */ ;
+/*!50003 SET character_set_client = @saved_cs_client */ ;
+/*!50003 SET character_set_results = @saved_cs_results */ ;
+/*!50003 SET collation_connection = @saved_col_connection */ ;
+/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
+/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP FUNCTION IF EXISTS `buy_getUltimate` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -43241,6 +43255,7 @@ BEGIN
DECLARE vCurrentCommission INT;
DECLARE vIsNotEUR INT;
DECLARE vLastEntryFk INT;
+ DECLARE vLanded INT;
SELECT count(*) INTO vIsNotEUR
FROM currency c
@@ -43256,23 +43271,25 @@ BEGIN
RETURN IFNULL(vCommission, 0);
ELSE
+ SELECT landed INTO vLanded
+ FROM travel
+ WHERE id = vTravelFk;
+
SELECT e.id INTO vLastEntryFk
FROM `entry` e
JOIN travel tr ON tr.id = e.travelFk
- WHERE e.supplierFk = vSupplierFk
- ORDER BY tr.landed DESC
- LIMIT 1;
+ WHERE e.supplierFk = vSupplierFk
+ ORDER BY (vLanded <= tr.landed), tr.landed DESC
+ LIMIT 1;
IF vLastEntryFk THEN
SELECT commission INTO vCurrentCommission
FROM `entry`
WHERE id = vLastEntryFk;
-
ELSE
SELECT commission INTO vCurrentCommission
FROM supplier s
WHERE s.id = vSupplierFk;
-
END IF;
RETURN vCurrentCommission;
@@ -44838,7 +44855,7 @@ BEGIN
JOIN cache.zoneAgencyFriendship zf ON zf.agencyModeFk = r.agencyModeFk
WHERE friendship >= vSignificativeFriendship
AND zf.zoneFk = vZoneFk
- AND r.created = vLanded
+ AND r.dated = vLanded
ORDER BY friendship;
-- Se eliminan aquellas que superan el volumen máximo
@@ -44904,7 +44921,7 @@ BEGIN
JOIN cache.zoneAgencyFriendship zf ON zf.agencyModeFk = r.agencyModeFk
WHERE friendship >= vSignificativeFriendship
AND zf.zoneFk = vZoneFk
- AND r.created = vLanded
+ AND r.dated = vLanded
ORDER BY friendship;
-- Se eliminan aquellas que superan el volumen máximo
@@ -45982,82 +45999,6 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-/*!50003 DROP FUNCTION IF EXISTS `timeWorkerControl_getDirection` */;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` FUNCTION `timeWorkerControl_getDirection`(vUserFk INT, vTimed DATETIME) RETURNS varchar(6) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci
- READS SQL DATA
-BEGIN
-/**
- * Verifica la dirección de la fichada
- * @param vUserFk Identificador del trabajador
- * @param vTimed Hora de la fichada
- * @return Retorna sentido de la fichada 'in, out, middle'
- */
-
- DECLARE vPrevious DATETIME ;
- DECLARE vNext DATETIME ;
- DECLARE vPreviousDirection VARCHAR(3) ;
- DECLARE vNextDirection VARCHAR(3) ;
- DECLARE vDayStayMax INT;
- DECLARE vTimedSeconds INT;
- DECLARE vLastTimeIn INT;
-
- SELECT UNIX_TIMESTAMP(vTimed) INTO vTimedSeconds;
-
- SELECT dayStayMax INTO vDayStayMax
- FROM vn.workerTimeControlParams;
-
- SELECT timed, direction INTO vNext,vNextDirection
- FROM vn.workerTimeControl
- WHERE userFk = vUserFk
- AND direction IN ('in','out')
- AND timed > vTimed
- ORDER BY timed ASC
- LIMIT 1;
-
- SELECT timed, direction INTO vPrevious, vPreviousDirection
- FROM vn.workerTimeControl
- WHERE userFk = vUserFk
- AND direction IN ('in','out')
- AND timed < vTimed
- ORDER BY timed DESC
- LIMIT 1;
-
- IF (vTimedSeconds - UNIX_TIMESTAMP(vPrevious) + UNIX_TIMESTAMP(vNext) - vTimedSeconds)<= vDayStayMax AND vPreviousDirection = 'in' AND vNextDirection = 'out' THEN
- RETURN 'middle';
- END IF;
-
-
- IF (vTimedSeconds> UNIX_TIMESTAMP(vPrevious)) THEN
- IF vPreviousDirection = 'in' THEN
- RETURN 'out';
- ELSE
- SELECT UNIX_TIMESTAMP(MAX(timed)) INTO vLastTimeIn
- FROM vn.workerTimeControl
- WHERE userFk = vUserFk
- AND direction ='in'
- AND timed < vPrevious;
- IF vTimedSeconds - vLastTimeIn <= vDayStayMax THEN
- RETURN 'out';
- END IF;
- END IF;
- END IF;
-
- RETURN 'in';
-END ;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP FUNCTION IF EXISTS `time_getSalesYear` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -49528,7 +49469,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
@@ -49553,7 +49494,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved'
AND c.isChargedToMana;
@@ -49564,7 +49505,7 @@ BEGIN
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
SET ce.isGreuge = TRUE
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
@@ -49643,7 +49584,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND cs.code = 'resolved'
AND c.ticketCreated >= util.VN_CURDATE() - INTERVAL 1 YEAR
GROUP BY c.clientFk
@@ -55131,17 +55072,19 @@ BEGIN
*
* @param vSelf Id de entrada
*/
- DECLARE vIsEditable BOOL;
+ DECLARE vIsNotEditable BOOL DEFAULT FALSE;
- SELECT e.isBooked INTO vIsEditable
+ SELECT TRUE INTO vIsNotEditable
FROM `entry` e
- JOIN entryType et ON et.code = e.typeFk
- WHERE NOT et.isInformal
- AND e.id = vSelf;
+ LEFT JOIN entryType et ON et.code = e.typeFk
+ WHERE e.id = vSelf
+ AND e.isBooked
+ AND (e.typeFk IS NULL OR NOT et.isInformal);
- IF vIsEditable AND NOT IFNULL(@isModeInventory, FALSE) THEN
+ IF vIsNotEditable AND NOT IFNULL(@isModeInventory, FALSE) THEN
CALL util.throw(CONCAT('Entry ', vSelf, ' is not editable'));
END IF;
+
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -55486,12 +55429,13 @@ BEGIN
LEAST(bb.stickers, FLOOR(ish.visible / ish.packing)) ishStickers,
bb.stickers buyStickers
FROM itemShelving ish
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN (SELECT b.id, b.itemFk, b.stickers
FROM buy b
WHERE b.entryFk = vFromEntryFk
ORDER BY b.stickers DESC
LIMIT 10000000000000000000) bb ON bb.itemFk = ish.itemFk
- WHERE ish.shelvingFk = vShelvingCode COLLATE utf8_general_ci
+ WHERE sh.code = vShelvingCode COLLATE utf8_general_ci
AND NOT ish.isSplit
GROUP BY ish.id;
@@ -56397,7 +56341,7 @@ BEGIN
WHERE expeditionFk = e.id)
LEFT JOIN expeditionState es2 ON es2.id = es.id
WHERE t.routeFk = vRouteFk AND e.freightItemFk <> FALSE
- ORDER BY r.created, t.priority DESC;
+ ORDER BY r.dated, t.priority DESC;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -56539,7 +56483,9 @@ proc:BEGIN
WHERE shipped BETWEEN vCreated AND util.dayEnd(vCreated)
AND clientFk = vClientFk
AND addressFk = vAddressFk
- AND warehouseFk = vWarehouseFk;
+ AND warehouseFk = vWarehouseFk
+ AND nickname = 'CAJAS AUTOCONSUMO'
+ LIMIT 1;
IF vTicketFk IS NULL AND vAction = 'add' THEN
INSERT INTO ticket(clientFk, warehouseFk, shipped, nickname, addressFk)
@@ -56925,67 +56871,6 @@ BEGIN
UPDATE greugeConfig
SET lastNotifyCheck = vTimeEnd;
-END ;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-/*!50003 DROP PROCEDURE IF EXISTS `inventoryFailureAdd` */;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `inventoryFailureAdd`()
-BEGIN
-
-DECLARE done BOOL DEFAULT FALSE;
-DECLARE vTicketFk INT;
-
-DECLARE rs CURSOR FOR
- SELECT id FROM vn.ticket
- WHERE shipped = util.yesterday()
- AND clientFk = 400
- AND warehouseFk IN (1,44);
-
-DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-
-OPEN rs;
-
-FETCH rs INTO vTicketFk;
-
-WHILE NOT done DO
-
- INSERT INTO vn.inventoryFailure(dated, itemFk, quantity, value, warehouseFk, throwerFk)
- SELECT t.shipped,
- s.itemFk,
- s.quantity,
- b.buyingValue + b.freightValue + b.packageValue + b.comissionValue,
- t.warehouseFk,
- w.id
- FROM vn.ticket t
- JOIN vn.sale s ON s.ticketFk = t.id
- LEFT JOIN cache.last_buy lb ON lb.warehouse_id = t.warehouseFk AND item_id = s.itemFk
- LEFT JOIN vn.buy b ON b.id = lb.buy_id
- LEFT JOIN vn.worker w ON w.code = LEFT(s.concept, 3)
- WHERE t.id = vTicketFk
- AND s.quantity > 0;
-
- FETCH rs INTO vTicketFk;
-
-END WHILE;
-
-
-CLOSE rs;
-
-
-
-
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -57995,7 +57880,7 @@ BEGIN
ii.cplusTaxBreakFk,
ii.cplusSubjectOpFk,
ii.siiTypeInvoiceInFk,
- ii.cplusRectificationTypeFk,
+ ic.cplusRectificationTypeFk,
ii.booked,
IFNULL(a.isUeeMember, c.isUeeMember) isUeeMember,
(c.id = cc.id) isSameCountry,
@@ -58018,6 +57903,7 @@ BEGIN
e.name expenseName
FROM invoiceIn ii
JOIN supplier s ON s.id = ii.supplierFk
+ LEFT JOIN invoiceInCorrection ic ON ic.correctingFk = ii.id
LEFT JOIN province p ON p.id = s.provinceFk
LEFT JOIN autonomy a ON a.id = p.autonomyFk
JOIN country c ON c.id = s.countryFk
@@ -58171,7 +58057,7 @@ BEGIN
) eWithheld ON TRUE
WHERE tii.taxTypeSageFk IS NOT NULL
AND (tii.taxCode IS NULL OR tii.taxCode NOT IN ('import10', 'import21'))
- GROUP BY tii.PorcentajeIva, tii.expenseFk;
+ GROUP BY tii.CuentaIvaRepercutido;
-- Línea iva inversor sujeto pasivo
INSERT INTO XDiario(
@@ -58236,7 +58122,7 @@ BEGIN
AND NOT(tii.isVies
AND c.nontaxableTransactionTypeFk = tii.transactionTypeSageFk
AND tii.taxCode = 'nonTaxable')
- GROUP BY tii.PorcentajeIva, tii.expenseFk;
+ GROUP BY tii.CuentaIvaRepercutido;
-- Actualización del registro original
UPDATE invoiceIn ii
@@ -59843,55 +59729,6 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-/*!50003 DROP PROCEDURE IF EXISTS `itemShelvingLog_get` */;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingLog_get`(
- vShelvingCode VARCHAR(10)
-)
-BEGIN
-/**
- * Devuelve el log de los item en cada carro
- *
- * @param vShelvingCode Matrícula del carro
- *
- */
- SELECT isl.itemShelvingFk,
- isl.created,
- isl.accion,
- isl.itemFk,
- isl.shelvingFk,
- isl.quantity,
- isl.visible,
- isl.available,
- isl.grouping,
- isl.packing,
- isl.stars,
- item.longName,
- item.size,
- item.subName,
- worker.code,
- isl.accion
- FROM item
- JOIN itemShelvingLog isl ON item.id = isl.itemFk
- JOIN worker ON isl.workerFk = worker.id
- JOIN shelving sh ON sh.id = isl.shelvingFk
- WHERE sh.code = vShelvingCode COLLATE utf8mb3_unicode_ci
- OR isl.itemFk = vShelvingCode -- ?? Respeto porque ya estaba
- ORDER BY isl.created DESC;
-END ;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `itemShelvingMatch` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -62764,10 +62601,6 @@ BEGIN
SET itemFk = vItemNew
WHERE itemFk = vItemOld;
- UPDATE inventoryFailure
- SET itemFk = vItemNew
- WHERE itemFk = vItemOld;
-
UPDATE genericAllocation
SET itemFk = vItemNew
WHERE itemFk = vItemOld;
@@ -68021,7 +67854,7 @@ BEGIN
rm.ticketFree = 0,
rm.ticketProduction = 0,
rm.ticketPacked = 0,
- rm.dated = r.created;
+ rm.dated = r.dated;
UPDATE routesMonitor rm
JOIN (
@@ -68181,7 +68014,7 @@ BEGIN
DECLARE vIsKmTruckRate BOOL;
DECLARE vCountryFk INT;
- SELECT r.created >= rc.cutoffDated INTO vIsUpdatable
+ SELECT r.dated >= rc.cutoffDated INTO vIsUpdatable
FROM route r
JOIN routeConfig rc
WHERE r.id = vSelf;
@@ -68190,14 +68023,15 @@ BEGIN
DELETE FROM routeCommission
WHERE routeFk = vSelf;
- SELECT w.isFreelance, v.isKmTruckRate, c.countryFk INTO vIsFreelance, vIsKmTruckRate, vCountryFk
+ SELECT w.isFreelance, v.isKmTruckRate, p.countryFk INTO vIsFreelance, vIsKmTruckRate, vCountryFk
FROM route r
JOIN worker w ON w.id = r.workerFk
JOIN vehicle v ON v.id = r.vehicleFk
LEFT JOIN ticket t ON t.routeFk = r.id
- LEFT JOIN client c ON c.id = t.clientFk
+ LEFT JOIN address a ON a.id = t.addressFk
+ LEFT JOIN province p ON p.id = a.provinceFk
WHERE r.id = vSelf
- GROUP BY c.countryFk
+ GROUP BY p.countryFk
ORDER BY COUNT(*) DESC
LIMIT 1;
@@ -68257,7 +68091,9 @@ BEGIN
(r.kmEnd - r.kmStart) *
IF(v.isKmTruckRate, rc.kmHeavy, rc.kmLight),
IFNULL(r.m3, 0) *
- IF(v.isKmTruckRate, rc.deliveryM3Cat5, rc.deliveryM3Cat4),
+ IF(v.isKmTruckRate,
+ IFNULL(wc.deliveryM3Cat5, rc.deliveryM3Cat5),
+ IFNULL(wc.deliveryM3Cat4, rc.deliveryM3Cat4)),
(r.kmEnd - r.kmStart) * rc.kmYearly,
IFNULL(r.m3, 0) * rc.m3Yearly,
IFNULL(wc.distributionCat4M3, rc.distributionCat4M3) * IFNULL(r.m3, 0),
@@ -68835,10 +68671,11 @@ BEGIN
TRUE,
sc.userFk,
s.id
- FROM vn.sectorCollection sc
- JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
- JOIN vn.saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk
- JOIN vn.state s ON s.code = 'OK PREVIOUS'
+ FROM sectorCollection sc
+ JOIN sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
+ JOIN saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk
+ JOIN state s ON s.code = 'OK PREVIOUS'
+ JOIN itemShelvingSale iss ON iss.saleFk = sgd.saleFk
WHERE sc.id = vSectorCollectionFk;
END ;;
DELIMITER ;
@@ -73439,7 +73276,8 @@ BEGIN
IFNULL(dest.nickname, origin.nickname) nickname,
dest.landed,
dest.preparation,
- origin.departmentFk
+ origin.departmentFk,
+ origin.saleClonedFk
FROM (
SELECT s.ticketFk,
c.salesPersonFk workerFk,
@@ -73460,11 +73298,13 @@ BEGIN
t.warehouseFk,
t.companyFk,
t.agencyModeFk,
- wd.departmentFk
+ wd.departmentFk,
+ sc.saleClonedFk
FROM ticket t
JOIN client c ON c.id = t.clientFk
JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
JOIN sale s ON s.ticketFk = t.id
+ LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id
JOIN saleVolume sv ON sv.saleFk = s.id
JOIN item i ON i.id = s.itemFk
JOIN ticketState ts ON ts.ticketFk = t.id
@@ -76663,123 +76503,123 @@ CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_splitItemPackingType`(
)
BEGIN
/**
- * Clona y reparte las ventas de un ticket en funcion del tipo de empaquetado.
- * Respeta el id inicial para el tipo propuesto.
+ * Separa en diferentes tickets según el tipo de empaquetado
+ * El ticket original conserva las líneas del tipo de empaquetado especificado
+ * Las líneas sin tipo de empaquetado se asignan al ticket del tipo por defecto.
*
- * @param vSelf Id ticket
- * @param vOriginalItemPackingTypeFk Tipo para el que se reserva el número de ticket original
+ * @param vSelf Id del ticket original
+ * @param vOriginalItemPackingTypeFk Tipo de empaquetado a mantener en el ticket original
* @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk)
*/
- DECLARE vItemPackingTypeFk VARCHAR(1) DEFAULT 'H';
+ DECLARE vIsDone BOOLEAN DEFAULT FALSE;
+ DECLARE vCurrentPackingType VARCHAR(1);
+ DECLARE vDefaultPackingType VARCHAR(1);
+ DECLARE vHasOriginalPackingType BOOLEAN;
DECLARE vNewTicketFk INT;
- DECLARE vPackingTypesToSplit INT;
- DECLARE vDone INT DEFAULT FALSE;
+ DECLARE vTicketFk INT;
- DECLARE vSaleGroup CURSOR FOR
- SELECT itemPackingTypeFk
- FROM tSaleGroup
- WHERE itemPackingTypeFk IS NOT NULL
- ORDER BY (itemPackingTypeFk = vOriginalItemPackingTypeFk) DESC;
+ DECLARE vItemPackingTypes CURSOR FOR
+ SELECT DISTINCT itemPackingTypeFk FROM tSalesToMove;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vIsDone = TRUE;
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ CREATE OR REPLACE TEMPORARY TABLE tSalesToMove (
+ ticketFk INT,
+ saleFk INT,
+ itemPackingTypeFk VARCHAR(1)
+ ) ENGINE=MEMORY;
+
+ SELECT COALESCE(MAX(ic.defaultPackingTypeFk), MAX(i.itemPackingTypeFk)) INTO vDefaultPackingType
+ FROM vn.sale s
+ JOIN item i ON i.id = s.itemFk
+ LEFT JOIN itemConfig ic ON ic.defaultPackingTypeFk = i.itemPackingTypeFk
+ WHERE s.ticketFk = vSelf
+ GROUP BY s.ticketFk;
+
+ SELECT EXISTS (
+ SELECT TRUE
+ FROM sale s
+ JOIN item i ON i.id = s.itemFk
+ WHERE s.ticketFk = vSelf
+ AND i.itemPackingTypeFk = vOriginalItemPackingTypeFk
+ ) INTO vHasOriginalPackingType;
+
+ IF vOriginalItemPackingTypeFk IS NULL OR NOT vHasOriginalPackingType THEN
+ SET vOriginalItemPackingTypeFk = vDefaultPackingType;
+ END IF;
START TRANSACTION;
- SELECT id
- FROM sale
- WHERE ticketFk = vSelf
- AND NOT quantity
+ SELECT t.id INTO vTicketFk
+ FROM ticket t
+ JOIN sale s ON s.id = t.id
+ WHERE t.id = vSelf
FOR UPDATE;
- DELETE FROM sale
- WHERE NOT quantity
- AND ticketFk = vSelf;
-
- CREATE OR REPLACE TEMPORARY TABLE tSale
- (PRIMARY KEY (id))
- ENGINE = MEMORY
- SELECT s.id, i.itemPackingTypeFk, IFNULL(sv.litros, 0) litros
+ INSERT INTO tSalesToMove (saleFk, itemPackingTypeFk)
+ SELECT s.id, i.itemPackingTypeFk
FROM sale s
JOIN item i ON i.id = s.itemFk
- LEFT JOIN saleVolume sv ON sv.saleFk = s.id
- WHERE s.ticketFk = vSelf;
+ WHERE s.ticketFk = vSelf
+ AND i.itemPackingTypeFk <> vOriginalItemPackingTypeFk;
- CREATE OR REPLACE TEMPORARY TABLE tSaleGroup
- ENGINE = MEMORY
- SELECT itemPackingTypeFk, SUM(litros) totalLitros
- FROM tSale
- GROUP BY itemPackingTypeFk;
+ OPEN vItemPackingTypes;
+ l: LOOP
+ SET vIsDone = FALSE;
+ FETCH vItemPackingTypes INTO vCurrentPackingType;
- SELECT COUNT(*) INTO vPackingTypesToSplit
- FROM tSaleGroup
- WHERE itemPackingTypeFk IS NOT NULL;
+ IF vIsDone THEN
+ LEAVE l;
+ END IF;
- CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT(
- ticketFk INT,
- itemPackingTypeFk VARCHAR(1)
- ) ENGINE = MEMORY;
+ CALL ticket_Clone(vSelf, vNewTicketFk);
- CASE vPackingTypesToSplit
- WHEN 0 THEN
- INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
- VALUES(vSelf, vItemPackingTypeFk);
- WHEN 1 THEN
- INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
- SELECT vSelf, itemPackingTypeFk
- FROM tSaleGroup
- WHERE itemPackingTypeFk IS NOT NULL;
- ELSE
- OPEN vSaleGroup;
- FETCH vSaleGroup INTO vItemPackingTypeFk;
+ SELECT id INTO vTicketFk
+ FROM ticket t
+ WHERE t.id = vNewTicketFk
+ FOR UPDATE;
- INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
- VALUES(vSelf, vItemPackingTypeFk);
+ UPDATE tSalesToMove
+ SET ticketFk = vNewTicketFk
+ WHERE itemPackingTypeFk = vCurrentPackingType;
- l: LOOP
- SET vDone = FALSE;
- FETCH vSaleGroup INTO vItemPackingTypeFk;
+ IF vCurrentPackingType = vDefaultPackingType THEN
+ INSERT INTO tSalesToMove (ticketFk, saleFk, itemPackingTypeFk)
+ SELECT vNewTicketFk, s.id, i.itemPackingTypeFk
+ FROM sale s
+ JOIN item i ON i.id = s.itemFk
+ WHERE s.ticketFk = vSelf
+ AND i.itemPackingTypeFk IS NULL;
+ END IF;
- IF vDone THEN
- LEAVE l;
- END IF;
+ END LOOP;
+ CLOSE vItemPackingTypes;
- CALL ticket_Clone(vSelf, vNewTicketFk);
+ UPDATE sale s
+ JOIN tSalesToMove t ON t.saleFk = s.id
+ SET s.ticketFk = t.ticketFk;
- INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
- VALUES(vNewTicketFk, vItemPackingTypeFk);
- END LOOP;
-
- CLOSE vSaleGroup;
-
- SELECT s.id
- FROM sale s
- JOIN tSale ts ON ts.id = s.id
- JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
- FOR UPDATE;
-
- UPDATE sale s
- JOIN tSale ts ON ts.id = s.id
- JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
- SET s.ticketFk = t.ticketFk;
-
- SELECT itemPackingTypeFk INTO vItemPackingTypeFk
- FROM tSaleGroup sg
- WHERE sg.itemPackingTypeFk IS NOT NULL
- ORDER BY sg.itemPackingTypeFk
- LIMIT 1;
-
- UPDATE sale s
- JOIN tSale ts ON ts.id = s.id
- JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = vItemPackingTypeFk
- SET s.ticketFk = t.ticketFk
- WHERE ts.itemPackingTypeFk IS NULL;
- END CASE;
+ CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT
+ ENGINE=MEMORY
+ SELECT s.ticketFk, MAX(i.itemPackingTypeFk) itemPackingTypeFk
+ FROM sale s
+ JOIN item i ON i.id = s.itemFk
+ WHERE s.ticketFk = vSelf
+ GROUP BY s.ticketFk
+ UNION
+ SELECT ticketFk, MAX(itemPackingTypeFk)
+ FROM tSalesToMove
+ GROUP BY ticketFk;
COMMIT;
- DROP TEMPORARY TABLE
- tSale,
- tSaleGroup;
+ DROP TEMPORARY TABLE tSalesToMove;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -77861,8 +77701,8 @@ BEGIN
* @param vIsRaid idRaid value
* @param vDaysInForward daysInForward value
*/
- IF (NOT vIsRaid AND vDaysInForward IS NOT NULL) OR (vIsRaid AND vDaysInForward IS NULL) THEN
- CALL util.throw('The raid information is not correct');
+ IF NOT vIsRaid AND vDaysInForward THEN
+ CALL util.throw('If daysInForward has a value, the raid cannot be unchecked');
END IF;
END ;;
DELIMITER ;
@@ -78229,22 +78069,15 @@ BEGIN
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vBuyerEmail VARCHAR(40);
DECLARE vTravelLink TEXT;
- DECLARE vMailBody TEXT DEFAULT '';
+ DECLARE vMailBody TEXT;
+ DECLARE vDaysBetweenDates INT;
+ DECLARE vSubject VARCHAR(30);
- DECLARE vCur CURSOR FOR
- SELECT GROUP_CONCAT(DISTINCT
- CONCAT('https://salix.verdnatura.es/#!/travel/',
- ttm.travelFk,
- '/summary ')
- ORDER BY ttm.travelFk SEPARATOR '\n\r') travelLink,
- CONCAT(u.name, '@verdnatura.es') buyerEmail
- FROM tTravelToMove ttm
- JOIN entry e ON e.travelFk = ttm.travelFk
- JOIN buy b ON b.entryFk = e.id
- JOIN item i ON i.id = b.itemFk
- JOIN itemType it ON it.id = i.typeFk
- JOIN account.user u ON u.id = it.workerFk
- GROUP BY u.name;
+ DECLARE vTravels CURSOR FOR
+ SELECT GROUP_CONCAT(DISTINCT travelLink ORDER BY id SEPARATOR '\n\r'),
+ buyerEmail
+ FROM tTravelToMove
+ GROUP BY buyerEmail;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
@@ -78255,35 +78088,50 @@ BEGIN
END;
CREATE OR REPLACE TEMPORARY TABLE tTravelToMove
- SELECT id travelFk,
- util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded
- FROM travel
+ WITH travels AS (
+ SELECT id,
+ CONCAT('https://salix.verdnatura.es/#!/travel/', id,'/summary') travelLink,
+ util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded,
+ util.VN_CURDATE() - INTERVAL DATEDIFF(landed, shipped) + daysInForward DAY newShipped
+ FROM vn.travel
WHERE isRaid
- AND daysInForward;
+ AND daysInForward
+ )SELECT t.id,
+ t.travelLink,
+ t.newLanded,
+ t.newShipped,
+ CONCAT(u.name, '@verdnatura.es') buyerEmail
+ FROM travels t
+ STRAIGHT_JOIN vn.entry e ON e.travelFk = t.id
+ JOIN vn.buy b ON b.entryFk = e.id
+ JOIN vn.item i ON i.id = b.itemFk
+ JOIN vn.itemType it ON it.id = i.typeFk
+ JOIN account.user u ON u.id = it.workerFk
+ GROUP BY t.id;
START TRANSACTION;
UPDATE travel tr
- JOIN tTravelToMove ttm ON ttm.travelFk = tr.id
- SET tr.landed = ttm.newLanded;
+ JOIN tTravelToMove ttm ON ttm.id = tr.id
+ SET tr.landed = ttm.newLanded,
+ tr.shipped = ttm.newShipped;
- OPEN vCur;
+ OPEN vTravels;
l: LOOP
SET vDone = FALSE;
- FETCH vCur INTO vTravelLink, vBuyerEmail;
+ FETCH vTravels INTO vTravelLink, vBuyerEmail;
IF vDone THEN
LEAVE l;
END IF;
- CALL `vn`.`mail_insert`(
- vBuyerEmail,
- 'noreply@verdnatura.es',
- 'Cambio de fecha en Redadas',
- CONCAT('Se ha movido los siguientes travels: \n\r ', vTravelLink));
+ SET vSubject = 'Cambio de fecha en Redadas',
+ vMailBody = CONCAT('Se ha movido los siguientes travels: \n\r ', vTravelLink);
+
+ CALL mail_insert(vBuyerEmail, 'noreply@verdnatura.es', vSubject, vMailBody);
END LOOP;
- CLOSE vCur;
+ CLOSE vTravels;
COMMIT;
DROP TEMPORARY TABLE tTravelToMove;
END ;;
@@ -79744,187 +79592,6 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-/*!50003 DROP PROCEDURE IF EXISTS `workerTimeControl_check` */;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `workerTimeControl_check`(vUserFk INT, vDated DATE,vTabletFk VARCHAR(100))
-proc: BEGIN
-/**
- * Verifica si el empleado puede fichar en el momento actual, si puede fichar llama a workerTimeControlAdd
- *
- * @param vUserFk Identificador del trabajador
- * @return Retorna si encuentra un problema 'odd','maxTimeWork','breakDay','breakWeek' ;
- * En caso de tener algun problema retorna el primero que encuentra
- */
- DECLARE vLastIn DATETIME ;
- DECLARE vLastOut DATETIME ;
- DECLARE vDayWorkMax INT;
- DECLARE vDayBreak INT;
- DECLARE vWeekBreak INT ;
- DECLARE vWeekScope INT;
- DECLARE vDayStayMax INT;
- DECLARE vProblem VARCHAR(20) DEFAULT NULL;
- DECLARE vTimedWorked INT;
- DECLARE vCalendarStateType VARCHAR(20) DEFAULT NULL;
- DECLARE vDepartmentFk INT;
- DECLARE vTo VARCHAR(50) DEFAULT NULL;
- DECLARE vUserName VARCHAR(50) DEFAULT NULL;
- DECLARE vBody VARCHAR(255) DEFAULT NULL;
-
- SELECT dayBreak, weekBreak, weekScope, dayWorkMax, dayStayMax
- INTO vDayBreak, vWeekBreak, vWeekScope, vDayWorkMax, vDayStayMax
- FROM workerTimeControlParams;
-
- SELECT MAX(timed) INTO vLastIn
- FROM workerTimeControl
- WHERE userFk = vUserFk
- AND direction = 'in';
-
- SELECT MAX(timed) INTO vLastOut
- FROM workerTimeControl
- WHERE userFk = vUserFk
- AND direction = 'out';
-
- SELECT CONCAT(u.name,'@verdnatura.es') INTO vTo
- FROM account.user u
- WHERE u.id = (SELECT bossFk FROM worker WHERE id = vUserFk);
-
- SELECT CONCAT(firstName,' ',lastName) INTO vUserName
- FROM worker w
- WHERE w.id = vUserFk;
-
-
- IF UNIX_TIMESTAMP(util.VN_NOW()) - UNIX_TIMESTAMP(vLastIn) > vDayStayMax THEN -- NUEVA JORNADA
-
- -- VERIFICAR DESCANSO DIARIO
- IF UNIX_TIMESTAMP(util.VN_NOW()) - UNIX_TIMESTAMP(vLastOut) < vDayBreak THEN
- SELECT "Descansos 12 h" AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"Descansos 12 h") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
- END IF;
-
- -- VERIFICAR FICHADAS IMPARES DEL ÚLTIMO DÍA QUE SE FICHÓ
- IF (SELECT MOD(COUNT(*),2) -- <>0
- FROM workerTimeControl
- WHERE userFk = vUserFk
- AND timed >= vLastIn
- ) THEN
- SELECT "Dias con fichadas impares" AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"Dias con fichadas impares") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
- END IF;
-
- -- VERIFICAR VACACIONES
- SELECT at2.name INTO vCalendarStateType
- FROM calendar c
- JOIN business b ON b.id = c.businessFk
- JOIN absenceType at2 ON at2.id = c.dayOffTypeFk
- WHERE c.dated = util.VN_CURDATE()
- AND at2.isAllowedToWork = FALSE
- AND b.workerFk = vUserFk
- LIMIT 1;
-
- IF(LENGTH(vCalendarStateType)) THEN
- SELECT vCalendarStateType AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"Vacaciones") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
-
- END IF;
-
- -- VERIFICAR CONTRATO EN VIGOR
- IF (SELECT COUNT(*)
- FROM business b
- WHERE b.workerFk = vUserFk
- AND b.started <= vDated
- AND IFNULL(b.ended, vDated) >= vDated
- ) = 0 THEN
- SELECT "No hay un contrato en vigor" AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"No hay un contrato en vigor") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
-
- END IF;
-
- -- VERIFICAR DESCANSO SEMANAL
- SET @vHasBreakWeek:= FALSE;
- SET @vLastTimed:= UNIX_TIMESTAMP((util.VN_NOW() - INTERVAL vWeekScope SECOND));
-
- DROP TEMPORARY TABLE IF EXISTS tmp.trash;
- CREATE TEMPORARY TABLE tmp.trash
- SELECT IF(vWeekBreak-(UNIX_TIMESTAMP(timed)-@vLastTimed) <= 0, @vHasBreakWeek:=TRUE, TRUE) alias,
- @vLastTimed:= UNIX_TIMESTAMP(timed)
- FROM workerTimeControl
- WHERE timed>= (util.VN_NOW() - INTERVAL vWeekScope SECOND)
- AND userFk= vUserFk
- AND direction IN ('in','out')
- ORDER BY timed ASC;
-
- IF UNIX_TIMESTAMP(util.VN_NOW()) - UNIX_TIMESTAMP(vLastOut) < vWeekBreak AND @vHasBreakWeek = FALSE THEN -- REVISA SI EL DESCANSO SE HA REALIZADO DESPUÉS DE LA ÚLTIMA FICHADA
- SELECT "Descansos 36 h" AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"Descansos 36 h") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
- END IF;
-
- DROP TEMPORARY TABLE tmp.trash;
-
- ELSE -- DIA ACTUAL
-
- -- VERIFICA QUE EL TIEMPO EFECTIVO NO SUPERE EL MÁXIMO
- SELECT IFNULL(SUM(if( mod(wtc.order,2)=1, -UNIX_TIMESTAMP(timed), UNIX_TIMESTAMP(timed))),0) - IF( MOD(COUNT(*),2), UNIX_TIMESTAMP(util.VN_NOW()), 0) INTO vTimedWorked
- FROM workerTimeControl wtc
- WHERE userFk = vUserFk
- AND timed >= vLastIn
- ORDER BY timed;
-
- IF vTimedWorked > vDayWorkMax THEN
- SELECT "Jornadas" AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No ha podido fichar por el siguiente problema: ',"Jornadas") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
- END IF;
-
- END IF;
-
- -- VERIFICAR DEPARTAMENTO
- /* IF vTabletFk IS NOT NULL THEN
- SELECT wtcu.departmentFk INTO vDepartmentFk
- FROM workerTimeControlUserInfo wtcu
- WHERE wtcu.userFk = vUserFk;
- IF (SELECT COUNT(td.tabletFk)
- FROM tabletDepartment td
- WHERE td.tabletFk = vTabletFk AND td.departmentFk = vDepartmentFk
- ) = 0 THEN
- SELECT "No perteneces a este departamento." AS problem;
- -- ENVIAMOS CORREO AL BOSSFK
- SELECT CONCAT(vUserName,' No a podido fichar por el siguiente problema: ',"No perteneces a este departamento.") INTO vBody;
- CALL mail_insert(vTo,vTo,'error al fichar',vBody);
- LEAVE proc;
- END IF;
- END IF;*/
-
-END ;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `workerTimeControl_checkBreak` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -85913,24 +85580,6 @@ USE `bi`;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
---
--- Final view structure for view `rotacion`
---
-
-/*!50001 DROP VIEW IF EXISTS `rotacion`*/;
-/*!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_unicode_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `rotacion` AS select `ic`.`itemFk` AS `Id_Article`,`ic`.`warehouseFk` AS `warehouse_id`,`ic`.`quantity` AS `total`,`ic`.`rotation` AS `rotacion`,`ic`.`cm3` AS `cm3`,`ic`.`storage` AS `almacenaje`,`ic`.`handling` AS `manipulacion`,`ic`.`extraCharge` AS `auxiliar`,`ic`.`wasted` AS `mermas`,`ic`.`cm3delivery` AS `cm3reparto`,`ic`.`grams` AS `grams` from `vn`.`itemCost` `ic` */;
-/*!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 `tarifa_componentes`
--
@@ -87336,7 +86985,7 @@ USE `vn`;
/*!50001 SET collation_connection = utf8mb4_unicode_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`vn`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `expeditionPallet_Print` AS select `rs2`.`description` AS `truck`,`t`.`routeFk` AS `routeFk`,`r`.`description` AS `zone`,count(`es`.`id`) AS `eti`,`ep`.`id` AS `palletFk`,`rs`.`id` <=> `rm`.`roadmapStopFk` AS `isMatch`,`t`.`warehouseFk` AS `warehouseFk`,if(`r`.`created` > `util`.`VN_CURDATE`() + interval 1 day,ucase(dayname(`r`.`created`)),NULL) AS `nombreDia` from (((((((`roadmapStop` `rs` join `expeditionPallet` `ep` on(`ep`.`truckFk` = `rs`.`id`)) join `expeditionScan` `es` on(`es`.`palletFk` = `ep`.`id`)) join `expedition` `e` on(`e`.`id` = `es`.`expeditionFk`)) join `ticket` `t` on(`t`.`id` = `e`.`ticketFk`)) join `route` `r` on(`r`.`id` = `t`.`routeFk`)) left join `routesMonitor` `rm` on(`rm`.`routeFk` = `r`.`id`)) left join `roadmapStop` `rs2` on(`rs2`.`id` = `rm`.`roadmapStopFk`)) group by `ep`.`id`,`t`.`routeFk` */;
+/*!50001 VIEW `expeditionPallet_Print` AS select `rs2`.`description` AS `truck`,`t`.`routeFk` AS `routeFk`,`r`.`description` AS `zone`,count(`es`.`id`) AS `eti`,`ep`.`id` AS `palletFk`,`rs`.`id` <=> `rm`.`roadmapStopFk` AS `isMatch`,`t`.`warehouseFk` AS `warehouseFk`,if(`r`.`dated` > `util`.`VN_CURDATE`() + interval 1 day,ucase(dayname(`r`.`dated`)),NULL) AS `nombreDia` from (((((((`roadmapStop` `rs` join `expeditionPallet` `ep` on(`ep`.`truckFk` = `rs`.`id`)) join `expeditionScan` `es` on(`es`.`palletFk` = `ep`.`id`)) join `expedition` `e` on(`e`.`id` = `es`.`expeditionFk`)) join `ticket` `t` on(`t`.`id` = `e`.`ticketFk`)) join `route` `r` on(`r`.`id` = `t`.`routeFk`)) left join `routesMonitor` `rm` on(`rm`.`routeFk` = `r`.`id`)) left join `roadmapStop` `rs2` on(`rs2`.`id` = `rm`.`roadmapStopFk`)) 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 */;
@@ -87354,7 +87003,7 @@ USE `vn`;
/*!50001 SET collation_connection = utf8mb4_unicode_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`vn`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `expeditionRoute_Monitor` AS select `r`.`id` AS `routeFk`,count(distinct if(`e`.`id` is null,`t`.`id`,NULL)) AS `tickets`,count(distinct `e`.`id`) AS `expeditions`,count(distinct `es`.`id`) AS `scanned`,max(`e`.`created`) AS `lastPacked`,`r`.`created` AS `created` from (((((`route` `r` left join `routesMonitor` `rm` on(`r`.`id` = `rm`.`routeFk`)) left join `roadmapStop` `rs` on(`rs`.`id` = `rm`.`roadmapStopFk`)) join `ticket` `t` on(`t`.`routeFk` = `r`.`id`)) left join `expedition` `e` on(`e`.`ticketFk` = `t`.`id`)) left join `expeditionScan` `es` on(`es`.`expeditionFk` = `e`.`id`)) where `r`.`created` >= `util`.`yesterday`() group by `r`.`id` */;
+/*!50001 VIEW `expeditionRoute_Monitor` AS select `r`.`id` AS `routeFk`,count(distinct if(`e`.`id` is null,`t`.`id`,NULL)) AS `tickets`,count(distinct `e`.`id`) AS `expeditions`,count(distinct `es`.`id`) AS `scanned`,max(`e`.`created`) AS `lastPacked`,`r`.`dated` AS `created` from (((((`route` `r` left join `routesMonitor` `rm` on(`r`.`id` = `rm`.`routeFk`)) left join `roadmapStop` `rs` on(`rs`.`id` = `rm`.`roadmapStopFk`)) join `ticket` `t` on(`t`.`routeFk` = `r`.`id`)) left join `expedition` `e` on(`e`.`ticketFk` = `t`.`id`)) left join `expeditionScan` `es` on(`es`.`expeditionFk` = `e`.`id`)) where `r`.`dated` >= `util`.`yesterday`() 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 */;
@@ -89394,7 +89043,7 @@ USE `vn2008`;
/*!50001 SET collation_connection = utf8mb4_unicode_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `Rutas` AS select `r`.`id` AS `Id_Ruta`,`r`.`workerFk` AS `Id_Trabajador`,`r`.`created` AS `Fecha`,`r`.`vehicleFk` AS `Id_Vehiculo`,`r`.`agencyModeFk` AS `Id_Agencia`,`r`.`time` AS `Hora`,`r`.`isOk` AS `ok`,`r`.`kmStart` AS `km_start`,`r`.`kmEnd` AS `km_end`,`r`.`started` AS `date_start`,`r`.`finished` AS `date_end`,`r`.`gestdocFk` AS `gestdoc_id`,`r`.`cost` AS `cost`,`r`.`m3` AS `m3`,`r`.`description` AS `description` from `vn`.`route` `r` */;
+/*!50001 VIEW `Rutas` AS select `r`.`id` AS `Id_Ruta`,`r`.`workerFk` AS `Id_Trabajador`,`r`.`dated` AS `Fecha`,`r`.`vehicleFk` AS `Id_Vehiculo`,`r`.`agencyModeFk` AS `Id_Agencia`,`r`.`time` AS `Hora`,`r`.`isOk` AS `ok`,`r`.`kmStart` AS `km_start`,`r`.`kmEnd` AS `km_end`,`r`.`started` AS `date_start`,`r`.`finished` AS `date_end`,`r`.`gestdocFk` AS `gestdoc_id`,`r`.`cost` AS `cost`,`r`.`m3` AS `m3`,`r`.`description` AS `description` from `vn`.`route` `r` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
@@ -91244,4 +90893,4 @@ USE `vn2008`;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2024-11-26 12:08:52
+-- Dump completed on 2025-01-14 6:39:04
diff --git a/db/dump/.dump/triggers.sql b/db/dump/.dump/triggers.sql
index 8f8fe9670..fb72e9899 100644
--- a/db/dump/.dump/triggers.sql
+++ b/db/dump/.dump/triggers.sql
@@ -5701,7 +5701,7 @@ BEGIN
SET NEW.editorFk = account.myUser_getId();
- IF (SELECT COUNT(*) FROM vn.invoiceIn
+ IF (SELECT COUNT(*) FROM invoiceIn
WHERE supplierRef = NEW.supplierRef
AND supplierFk = NEW.supplierFk
AND YEAR(issued) = YEAR(NEW.issued)
@@ -5713,7 +5713,7 @@ BEGIN
IF NEW.supplierFk != OLD.supplierFk THEN
CALL supplier_checkIsActive(NEW.supplierFk);
SELECT withholdingSageFk INTO vWithholdingSageFk
- FROM vn.supplier
+ FROM supplier
WHERE id = NEW.supplierFk;
SET NEW.withholdingSageFk = vWithholdingSageFk;
END IF;
@@ -5737,25 +5737,31 @@ DELIMITER ;;
AFTER UPDATE ON `invoiceIn`
FOR EACH ROW
BEGIN
- IF NEW.issued != OLD.issued
- OR NEW.currencyFk != OLD.currencyFk THEN
+ DECLARE vIsEuro BOOL;
+
+ SELECT `code` = 'EUR' INTO vIsEuro
+ FROM currency
+ WHERE id = NEW.currencyFk;
+
+ IF (NOT NEW.issued <=> OLD.issued
+ OR NEW.currencyFk <> OLD.currencyFk) THEN
UPDATE invoiceInTax iit
JOIN invoiceIn ii ON ii.id = iit.invoiceInFk
LEFT JOIN referenceRate rr ON rr.dated = ii.issued
AND rr.currencyFk = ii.currencyFk
- SET iit.taxableBase = IF(iit.foreignValue IS NULL, iit.taxableBase, iit.foreignValue / rr.value)
+ SET iit.taxableBase = IF(vIsEuro, iit.taxableBase, iit.foreignValue / rr.value),
+ iit.foreignValue = IF(vIsEuro, NULL, iit.foreignValue)
WHERE ii.id = NEW.id;
UPDATE invoiceInDueDay iidd
JOIN invoiceIn ii ON ii.id = iidd.invoiceInFk
LEFT JOIN referenceRate rr ON rr.dated = ii.issued
AND rr.currencyFk = ii.currencyFk
- SET iidd.amount = IF(iidd.foreignValue IS NULL, iidd.amount, iidd.foreignValue / rr.value)
+ SET iidd.amount = IF(vIsEuro, iidd.amount, iidd.foreignValue / rr.value),
+ iidd.foreignValue = IF(vIsEuro, NULL, iidd.foreignValue)
WHERE ii.id = NEW.id;
-
END IF;
-
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -6447,7 +6453,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND ic.itemFk = NEW.itemFk
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
IF NEW.cm3Delivery = 0 AND NEW.warehouseFk = 60 THEN
CALL mail_insert(
@@ -6546,36 +6552,6 @@ BEGIN
SET NEW.userFk = account.myUser_getId();
SET NEW.available = NEW.visible;
-END */;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-DELIMITER ;;
-/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`itemShelving_afterInsert`
- AFTER INSERT ON `itemShelving`
- FOR EACH ROW
-BEGIN
- INSERT INTO itemShelvingLog
- SET itemShelvingFk = NEW.id,
- workerFk = account.myUser_getId(),
- accion = 'CREA REGISTRO',
- itemFk = NEW.itemFk,
- shelvingFk = NEW.shelvingFk,
- visible = NEW.visible,
- `grouping` = NEW.`grouping`,
- packing = NEW.packing,
- available = NEW.available;
-
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -6619,63 +6595,6 @@ DELIMITER ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
-/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`itemShelving_afterUpdate`
- AFTER UPDATE ON `itemShelving`
- FOR EACH ROW
-BEGIN
- INSERT INTO itemShelvingLog
- SET itemShelvingFk = NEW.id,
- workerFk = account.myUser_getId(),
- accion = 'CAMBIO',
- itemFk = NEW.itemFk,
- shelvingFk = NEW.shelvingFk,
- visible = NEW.visible,
- `grouping` = NEW.`grouping`,
- packing = NEW.packing,
- available = NEW.available;
-
-END */;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-DELIMITER ;;
-/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`itemShelving_beforeDelete`
- BEFORE DELETE ON `itemShelving`
- FOR EACH ROW
-INSERT INTO vn.itemShelvingLog(itemShelvingFk,
- workerFk,
- accion,
- shelvingFk,
- itemFk)
- VALUES( OLD.id,
- account.myUser_getId(),
- 'ELIMINADO',
- OLD.shelvingFk,
- OLD.itemFk) */;;
-DELIMITER ;
-/*!50003 SET sql_mode = @saved_sql_mode */ ;
-/*!50003 SET character_set_client = @saved_cs_client */ ;
-/*!50003 SET character_set_results = @saved_cs_results */ ;
-/*!50003 SET collation_connection = @saved_col_connection */ ;
-/*!50003 SET @saved_cs_client = @@character_set_client */ ;
-/*!50003 SET @saved_cs_results = @@character_set_results */ ;
-/*!50003 SET @saved_col_connection = @@collation_connection */ ;
-/*!50003 SET character_set_client = utf8mb4 */ ;
-/*!50003 SET character_set_results = utf8mb4 */ ;
-/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
-/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
-/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;
-DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`itemShelving_afterDelete`
AFTER DELETE ON `itemShelving`
FOR EACH ROW
@@ -8138,7 +8057,7 @@ BEGIN
SELECT IFNULL(b.workCenterFK, r.defaultWorkCenterFk)
FROM vn.routeConfig r
LEFT JOIN vn.business b ON b.workerFk = vUserFk
- AND NEW.created BETWEEN b.started AND IFNULL(b.ended, NEW.created));
+ AND NEW.dated BETWEEN b.started AND IFNULL(b.ended, NEW.dated));
IF ISNULL(NEW.agencyModeFk) THEN
SELECT r.agencyModeFk INTO vDefaultAgencyModeFk
@@ -8248,6 +8167,7 @@ BEGIN
OR !(NEW.workerFk <=> OLD.workerFk)
OR !(NEW.m3 <=> OLD.m3)
OR !(NEW.agencyModeFk <=> OLD.agencyModeFk)
+ OR !(NEW.dated <=> OLD.dated)
OR !(NEW.vehicleFk <=> OLD.vehicleFk)THEN
CALL route_calcCommission(NEW.id);
END IF;
@@ -8400,7 +8320,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
END */;;
@@ -8508,7 +8428,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
@@ -8550,7 +8470,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = OLD.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
END */;;
@@ -9657,7 +9577,7 @@ BEGIN
FROM `route`
WHERE NOT isOk
AND id IN (OLD.routeFk, NEW.routeFk)
- AND created >= util.VN_CURDATE()
+ AND dated >= util.VN_CURDATE()
GROUP BY id;
END IF;
@@ -9680,7 +9600,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND t.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
SET NEW.shipped = DATE_FORMAT(NEW.shipped, '2000-%m-%d %T');
SET NEW.landed = DATE_FORMAT(NEW.landed, '2000-%m-%d %T');
@@ -9759,7 +9679,7 @@ BEGIN
FROM vn.route r
WHERE r.isOk = FALSE
AND r.id = OLD.routeFk
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
DELETE FROM sale WHERE ticketFk = OLD.id;
@@ -11579,4 +11499,4 @@ USE `vn2008`;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2024-11-26 12:09:13
+-- Dump completed on 2025-01-14 6:39:25
diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql
index 2762a4828..2380f5eab 100644
--- a/db/dump/fixtures.before.sql
+++ b/db/dump/fixtures.before.sql
@@ -426,50 +426,50 @@ INSERT INTO `vn`.`clientConfig`(`id`, `riskTolerance`, `maxCreditRows`, `maxPric
(1, 200, 10, 0.25, 2, 4, 5, 300.00, 1, 1, 2);
-INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress`)
+INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress`, `customsAgentFk`)
VALUES
- (1, 'Bruce Wayne', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 1),
- (2, 'Petter Parker', '20 Ingram Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 1),
- (3, 'Clark Kent', '344 Clinton Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 1),
- (4, 'Tony Stark', '10880 Malibu Point', 'Gotham', 46460, 1, 1111111111, 222222222, 1 , 1104, 2, NULL, NULL, 0, 1),
- (5, 'Max Eisenhardt', 'Unknown Whereabouts', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 1),
- (6, 'DavidCharlesHaller', 'Evil hideout', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 1),
- (7, 'Hank Pym', 'Anthill', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 1),
- (8, 'Charles Xavier', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 1),
- (9, 'Bruce Banner', 'Somewhere in New York', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 1),
- (10, 'Jessica Jones', 'NYCC 2015 Poster', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 1),
- (11, 'Missing', 'The space', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1111, 10, NULL, NULL, 0, 1),
- (12, 'Trash', 'New York city', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1112, 10, NULL, NULL, 0, 1),
- (101, 'Somewhere in Thailand', 'address 01', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (102, 'Somewhere in Poland', 'address 02', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0),
- (103, 'Somewhere in Japan', 'address 03', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0),
- (104, 'Somewhere in Spain', 'address 04', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0),
- (105, 'Somewhere in Potugal', 'address 05', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0),
- (106, 'Somewhere in UK', 'address 06', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0),
- (107, 'Somewhere in Valencia', 'address 07', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0),
- (108, 'Somewhere in Gotham', 'address 08', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0),
- (109, 'Somewhere in London', 'address 09', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (110, 'Somewhere in Algemesi', 'address 10', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (111, 'Somewhere in Carlet', 'address 11', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (112, 'Somewhere in Campanar', 'address 12', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (113, 'Somewhere in Malilla', 'address 13', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (114, 'Somewhere in France', 'address 14', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (115, 'Somewhere in Birmingham', 'address 15', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (116, 'Somewhere in Scotland', 'address 16', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (117, 'Somewhere in nowhere', 'address 17', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (118, 'Somewhere over the rainbow', 'address 18', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (119, 'Somewhere in Alberic', 'address 19', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (120, 'Somewhere in Montortal', 'address 20', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0),
- (121, 'the bat cave', 'address 21', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 0),
- (122, 'NY roofs', 'address 22', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 0),
- (123, 'The phone box', 'address 23', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, NULL, NULL, 0, 0),
- (124, 'Stark tower Gotham', 'address 24', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1104, 2, NULL, NULL, 0, 0),
- (125, 'The plastic cell', 'address 25', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 0),
- (126, 'Many places', 'address 26', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 0),
- (127, 'Your pocket', 'address 27', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 0),
- (128, 'Cerebro', 'address 28', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 0),
- (129, 'Luke Cages Bar', 'address 29', 'Gotham', 'EC170150', 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 0),
- (130, 'Non valid address', 'address 30', 'Gotham', 46460, 1, 1111111111, 222222222, 0, 1101, 2, NULL, NULL, 0, 0);
+ (1, 'Bruce Wayne', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, -74.1111111, 10.1111111, 0, 1, 1),
+ (2, 'Petter Parker', '20 Ingram Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, -74.2222222, 10.2222222, 0, 1, NULL),
+ (3, 'Clark Kent', '344 Clinton Street', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, -74.3333333, 10.3333333, 0, 1, NULL),
+ (4, 'Tony Stark', '10880 Malibu Point', 'Gotham', 46460, 1, 1111111111, 222222222, 1 , 1104, 2, -74.4444444, 10.4444444, 0, 1, NULL),
+ (5, 'Max Eisenhardt', 'Unknown Whereabouts', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 1, NULL),
+ (6, 'DavidCharlesHaller', 'Evil hideout', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 1, NULL),
+ (7, 'Hank Pym', 'Anthill', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 1, NULL),
+ (8, 'Charles Xavier', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 1, NULL),
+ (9, 'Bruce Banner', 'Somewhere in New York', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 1, NULL),
+ (10, 'Jessica Jones', 'NYCC 2015 Poster', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 1, NULL),
+ (11, 'Missing', 'The space', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1111, 10, NULL, NULL, 0, 1, NULL),
+ (12, 'Trash', 'New York city', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1112, 10, NULL, NULL, 0, 1, NULL),
+ (101, 'Somewhere in Thailand', 'address 01', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (102, 'Somewhere in Poland', 'address 02', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (103, 'Somewhere in Japan', 'address 03', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (104, 'Somewhere in Spain', 'address 04', 'Gotham', 46460, 1, 3333333333, 444444444, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (105, 'Somewhere in Potugal', 'address 05', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (106, 'Somewhere in UK', 'address 06', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (107, 'Somewhere in Valencia', 'address 07', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (108, 'Somewhere in Gotham', 'address 08', 'Gotham', 46460, 1, 5555555555, 666666666, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (109, 'Somewhere in London', 'address 09', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (110, 'Somewhere in Algemesi', 'address 10', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (111, 'Somewhere in Carlet', 'address 11', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (112, 'Somewhere in Campanar', 'address 12', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (113, 'Somewhere in Malilla', 'address 13', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (114, 'Somewhere in France', 'address 14', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (115, 'Somewhere in Birmingham', 'address 15', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (116, 'Somewhere in Scotland', 'address 16', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (117, 'Somewhere in nowhere', 'address 17', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (118, 'Somewhere over the rainbow', 'address 18', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (119, 'Somewhere in Alberic', 'address 19', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (120, 'Somewhere in Montortal', 'address 20', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1109, 2, NULL, NULL, 0, 0, NULL),
+ (121, 'the bat cave', 'address 21', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1101, 2, NULL, NULL, 0, 0, NULL),
+ (122, 'NY roofs', 'address 22', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1102, 2, NULL, NULL, 0, 0, NULL),
+ (123, 'The phone box', 'address 23', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1103, 2, -74.555555, 10.555555, 0, 0, NULL),
+ (124, 'Stark tower Gotham', 'address 24', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1104, 2, NULL, NULL, 0, 0, NULL),
+ (125, 'The plastic cell', 'address 25', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1105, 2, NULL, NULL, 0, 0, NULL),
+ (126, 'Many places', 'address 26', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1106, 2, NULL, NULL, 0, 0, NULL),
+ (127, 'Your pocket', 'address 27', 'Gotham', 46460, 1, 1111111111, 222222222, 1, 1107, 2, NULL, NULL, 0, 0, NULL),
+ (128, 'Cerebro', 'address 28', 'Gotham', 46460, 5, 1111111111, 222222222, 1, 1108, 2, NULL, NULL, 0, 0, NULL),
+ (129, 'Luke Cages Bar', 'address 29', 'Gotham', 'EC170150', 1, 1111111111, 222222222, 1, 1110, 2, NULL, NULL, 0, 0, NULL),
+ (130, 'Non valid address', 'address 30', 'Gotham', 46460, 1, 1111111111, 222222222, 0, 1101, 2, NULL, NULL, 0, 0, NULL);
INSERT INTO `vn`.`address`( `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `isActive`, `clientFk`, `agencyModeFk`, `isDefaultAddress`)
SELECT name, CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, 1, id, 2, 1
@@ -648,13 +648,13 @@ INSERT INTO `vn`.`invoiceOutSerial`
('X', 'Exportación global', 0, 'WORLD', 0, 'global'),
('N', 'Múltiple Intracomunitaria', 0, 'CEE', 1, 'multiple');
-INSERT INTO `vn`.`invoiceOut`(`id`, `serial`, `amount`, `issued`,`clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `hasPdf`)
+INSERT INTO `vn`.`invoiceOut`(`id`, `serial`, `amount`, `issued`,`clientFk`, `created`, `companyFk`, `dued`, `booked`, `bankFk`, `hasPdf`, `customsAgentFk`, `incotermsFk`)
VALUES
- (1, 'T', 1026.24, util.VN_CURDATE(), 1101, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0),
- (2, 'T', 121.36, util.VN_CURDATE(), 1102, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0),
- (3, 'T', 8.88, util.VN_CURDATE(), 1103, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0),
- (4, 'T', 8.88, util.VN_CURDATE(), 1104, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0),
- (5, 'A', 8.88, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1103, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 442, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 0);
+ (1, 'E', 1026.24, util.VN_CURDATE(), 1101, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0, 1, 'FAS'),
+ (2, 'T', 121.36, util.VN_CURDATE(), 1102, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0, NULL, NULL),
+ (3, 'T', 8.88, util.VN_CURDATE(), 1103, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0, NULL, NULL),
+ (4, 'T', 8.88, util.VN_CURDATE(), 1104, util.VN_CURDATE(), 442, util.VN_CURDATE(), util.VN_CURDATE(), 1, 0, NULL, NULL),
+ (5, 'A', 8.88, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1103, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 442, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 0, NULL, NULL);
UPDATE `vn`.`invoiceOut` SET ref = 'T1111111' WHERE id = 1;
UPDATE `vn`.`invoiceOut` SET ref = 'T2222222' WHERE id = 2;
@@ -745,15 +745,15 @@ INSERT INTO `vn`.`zoneClosure` (`zoneFk`, `dated`, `hour`)
INSERT INTO `vn`.`zoneConfig` (`id`, `scope`) VALUES (1, '1');
-INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk`)
+INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk`, `dated`)
VALUES
- (1, '1899-12-30 12:15:00', 56, util.VN_CURDATE(), 1, 1, 'first route', 1.8, 10, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1),
- (2, '1899-12-30 13:20:00', 56, util.VN_CURDATE(), 1, 2, 'second route', 0.2, 20, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 9),
- (3, '1899-12-30 14:30:00', 56, util.VN_CURDATE(), 2, 3, 'third route', 0.5, 30, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 10),
- (4, '1899-12-30 15:45:00', 56, util.VN_CURDATE(), 3, 4, 'fourth route', 0, 40, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 12),
- (5, '1899-12-30 16:00:00', 56, util.VN_CURDATE(), 4, 5, 'fifth route', 0.1, 50, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 13),
- (6, NULL, 57, util.VN_CURDATE(), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 3),
- (7, NULL, 57, util.VN_CURDATE(), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 5);
+ (1, '1899-12-30 12:15:00', 56, util.VN_CURDATE(), 1, 1, 'first route', 1.8, 10, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1, util.VN_CURDATE()),
+ (2, '1899-12-30 13:20:00', 56, util.VN_CURDATE(), 1, 2, 'second route', 0.2, 20, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 9, util.VN_CURDATE()),
+ (3, '1899-12-30 14:30:00', 56, util.VN_CURDATE(), 2, 3, 'third route', 0.5, 30, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 10, util.VN_CURDATE()),
+ (4, '1899-12-30 15:45:00', 56, util.VN_CURDATE(), 3, 4, 'fourth route', 0, 40, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 12, util.VN_CURDATE()),
+ (5, '1899-12-30 16:00:00', 56, util.VN_CURDATE(), 4, 5, 'fifth route', 0.1, 50, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 13, util.VN_CURDATE()),
+ (6, NULL, 57, util.VN_CURDATE(), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 3, util.VN_CURDATE()),
+ (7, NULL, 57, util.VN_CURDATE(), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 5, util.VN_CURDATE());
INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `currencyFk`, `created`, `weight`, `cmrFk`, `problem`, `risk`)
VALUES
@@ -974,26 +974,30 @@ INSERT INTO `vn`.`itemFamily`(`code`, `description`)
('SER', 'Services'),
('VT', 'Sales');
-INSERT INTO `vn`.`item`(`id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenseFk`,
- `comment`, `relevancy`, `image`, `subName`, `minPrice`, `family`, `isFloramondo`, `genericFk`, `itemPackingTypeFk`, `hasMinPrice`, `weightByPiece`)
- VALUES
- (1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 'EMB', 0, NULL, 'V', 0, 3),
- (2, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '2', NULL, 0, 'VT', 0, NULL, 'H', 0, 2),
- (3, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '3', NULL, 0, 'VT', 0, NULL, NULL, 0, 5),
- (4, 1, 1, 1, 'Increases block', 1, 05080000, 4751000000, NULL, 0, '4', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (5, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '5', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (6, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '6', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (7, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '7', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (8, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '8', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (9, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '9', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL),
- (10, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '10', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (11, 1, 1, 1, NULL, 1, 05080000, 4751000000, NULL, 0, '11', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (12, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '12', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL),
- (13, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 1, 'VT', 1, NULL, NULL, 1, NULL),
- (14, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL),
- (15, 4, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL),
- (16, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL),
- (71, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL);
+INSERT INTO `vn`.`item`(
+ `id`, `typeFk`, `stems`, `originFk`, `description`, `producerFk`, `intrastatFk`, `expenseFk`,
+ `comment`, `relevancy`, `image`, `subName`, `minPrice`, `family`, `isFloramondo`, `genericFk`,
+ `itemPackingTypeFk`, `hasMinPrice`, `weightByPiece`, `isCustomInspectionRequired`
+)
+VALUES
+ (1, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '1', NULL, 0, 'EMB', 0, NULL, 'V', 0, 3, 1),
+ (2, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '2', NULL, 0, 'VT', 0, NULL, 'H', 0, 2, 1),
+ (3, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '3', NULL, 0, 'VT', 0, NULL, NULL, 0, 5, 0),
+ (4, 1, 1, 1, 'Increases block', 1, 05080000, 4751000000, NULL, 0, '4', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (5, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '5', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (6, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '6', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (7, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '7', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (8, 2, 1, 1, NULL, 1, 06021010, 2000000000, NULL, 0, '8', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (9, 2, 1, 2, NULL, 1, 06021010, 2000000000, NULL, 0, '9', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL, 0),
+ (10, 1, 1, 3, NULL, 1, 05080000, 4751000000, NULL, 0, '10', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (11, 1, 1, 1, NULL, 1, 05080000, 4751000000, NULL, 0, '11', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (12, 3, 1, 2, NULL, 2, 06021010, 4751000000, NULL, 0, '12', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0),
+ (13, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '13', NULL, 1, 'VT', 1, NULL, NULL, 1, NULL, 0),
+ (14, 5, 1, 2, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 1, NULL, NULL, 0, NULL, 0),
+ (15, 4, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL, 0),
+ (16, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'EMB', 0, NULL, NULL, 0, NULL, 0),
+ (71, 6, NULL, 1, NULL, NULL, 06021010, 4751000000, NULL, 0, '', NULL, 0, 'VT', 0, NULL, NULL, 0, NULL, 0);
+
-- Update the taxClass after insert of the items
UPDATE `vn`.`itemTaxCountry` SET `taxClassFk` = 2
@@ -1516,21 +1520,24 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10, FALSE, NULL),
(10, DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), 5, 1, 1, 50.00, 500, 'nineth travel', 1, 2, 10, TRUE, 2),
(11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
- (12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL);
+ (12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL),
+ (13, util.VN_CURDATE() - INTERVAL 1 MONTH - INTERVAL 1 DAY, util.VN_CURDATE() - INTERVAL 1 MONTH, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL);
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `evaNotes`, `typeFk`)
VALUES
- (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, '', 'packaging'),
- (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 'observation two', 'product'),
+ (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, '', 'packaging'),
+ (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 'observation two' , 'product'),
(3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 'observation three', 'product'),
- (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 'observation four', 'product'),
- (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 'observation five', 'product'),
- (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 'observation six', 'product'),
+ (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 'observation four' , 'product'),
+ (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 'observation five' , 'product'),
+ (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 'observation six' , 'product'),
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 'observation seven', 'product'),
- (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, '', 'product'),
- (9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, '', 'product'),
- (10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 10', 1, '', 'product'),
- (99, 69, util.VN_CURDATE() - INTERVAL 1 MONTH, 11, 0, 442, 'IN2009', 'Movement 99', 0, '', 'product');
+ (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, '', 'product'),
+ (9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, '', 'product'),
+ (10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2010', 'Movement 10',1, '', 'product'),
+ (11, 4, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 1, 442, 'IN2011', 'Movement 11',0, '', 'product'),
+ (12, 4, util.VN_CURDATE() - INTERVAL 1 MONTH, 13, 1, 442, 'IN2012', 'Movement 12',0, '', 'product'),
+ (99, 69, util.VN_CURDATE() - INTERVAL 1 MONTH, 11, 0, 442, 'IN2009', 'Movement 99',0, '', 'product');
INSERT INTO `vn`.`entryConfig` (`defaultEntry`, `inventorySupplierFk`, `defaultSupplierFk`)
VALUES (2, 4, 1);
@@ -1570,7 +1577,9 @@ INSERT INTO `bs`.`waste`(`buyerFk`, `year`, `week`, `itemFk`, `itemTypeFk`, `sal
(13, 7, 1, 50, 0, 3, 1, 2.000, 2.000, 0.000, 1, 1, 'packing', NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE()),
(14, 7, 2, 5, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 'grouping', NULL, 0.00, 7.30, 7.00, 0, 1, 0, 4, util.VN_CURDATE()),
(15, 7, 4, 1.25, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 'grouping', NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()),
- (16, 99,1,50.0000, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 'packing', NULL, 0.00, 99.60, 99.40, 0, 1, 0, 1.00, '2024-07-30 08:13:51.000');
+ (16, 99,1,50.0000, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 'packing', NULL, 0.00, 99.60, 99.40, 0, 1, 0, 1.00, '2024-07-30 08:13:51.000'),
+ (17, 11, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 'packing', NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE() - INTERVAL 2 MONTH),
+ (18, 12, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 'grouping', NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE() - INTERVAL 2 MONTH);
INSERT INTO `hedera`.`order`(`id`, `date_send`, `customer_id`, `delivery_method_id`, `agency_id`, `address_id`, `company_id`, `note`, `source_app`, `confirmed`,`total`, `date_make`, `first_row_stamp`, `confirm_date`)
VALUES
@@ -1920,7 +1929,7 @@ INSERT INTO `vn`.`claimDestination`(`id`, `description`, `addressFk`)
INSERT INTO `vn`.`claimDevelopment`(`id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk`)
VALUES
- (1, 1, 1, 21, 1, 1, 2, 5),
+ (1, 1, 1, 21, 7, 1, 2, 5),
(2, 1, 2, 21, 7, 2, 2, 5),
(3, 2, 7, 21, 9, 3, 2, 5),
(4, 3, 7, 21, 15, 8, 2, 5),
@@ -2040,7 +2049,7 @@ INSERT INTO `vn`.`ticketService`(`id`, `description`, `quantity`, `price`, `taxC
INSERT INTO `pbx`.`config` (id,defaultPrefix)
VALUES (1,'0034');
-INSERT INTO `pbx`.`prefix` (country, prefix)
+INSERT IGNORE INTO `pbx`.`prefix` (country, prefix)
VALUES
('es', '0034'),
('fr', '0033'),
@@ -3772,7 +3781,8 @@ VALUES
(999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL),
(1000000, 18, 25, '2023-09-21', 25, 500, NULL, 103, NULL),
(999996, 19, 5, '2023-09-27', 1, 5, NULL, 103, NULL),
- (999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL);
+ (999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL),
+ (1000000, 16, 25, '2023-08-21',25, 500, NULL, NULL, NULL);
-- Previous for Bolas de madera
INSERT IGNORE INTO vn.sectorCollection
@@ -3962,7 +3972,7 @@ VALUES(1, '');
INSERT INTO dipole.expedition_PrintOut (expeditionFk, ticketFk, addressFk, street, postalCode, city, shopName, isPrinted, created, printerFk, routeFk, parkingCode,
truckName, clientFk, phone, province, agency, m3, workerCode, itemFk, quantity, longName, shelvingFk, comments)
-VALUES(1, 1, 0, ' ', ' ', ' ', ' ', 0, '2001-01-01 00:00:00', 1, 0, ' ', ' ', 0, NULL, '', NULL, 0.000, NULL, 10, NULL, NULL, 'NCC', NULL);
+VALUES(1, 1, 0, ' ', ' ', ' ', ' ', 0, '2001-01-01 00:00:00', 1, 0, ' ', ' ', 0, NULL, '', NULL, 0.000, NULL, 10, NULL, 'Ranged Reinforced weapon sniper rifle 700mm' , 'NCC', NULL);
INSERT INTO vn.accountDetail
(id, value, accountDetailTypeFk, supplierAccountFk)
@@ -4026,10 +4036,23 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c
INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel)
VALUES (19, '1169'),
- (8, '1183');
+ (8, '1183'),
+ (1, '1320');
INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel)
- VALUES ('saysimle-url-mock', 1320);
+ VALUES ('saysimle-url-mock', '1819');
INSERT INTO vn.workerIrpf (workerFk,spouseNif, geographicMobilityDate)
VALUES (1106,'26493101E','2019-09-20');
+
+INSERT INTO vn.referenceRate (currencyFk, dated, value)
+ VALUES (2, '2000-12-01', 1.0495),
+ (2, '2001-01-01', 1.0531),
+ (2, '2001-02-01', 7.6347);
+
+INSERT IGNORE INTO vn.osrmConfig (id,url,tolerance)
+ VALUES (1,'https://router.project-osrm.org', 0.002);
+
+INSERT IGNORE INTO vn.inventoryConfig
+ SET id = 1,
+ supplierFk = 4;
diff --git a/db/routines/bi/procedures/rutasAnalyze.sql b/db/routines/bi/procedures/rutasAnalyze.sql
index e277968bf..1f103bde0 100644
--- a/db/routines/bi/procedures/rutasAnalyze.sql
+++ b/db/routines/bi/procedures/rutasAnalyze.sql
@@ -19,14 +19,14 @@ BEGIN
bultos)
SELECT r.id,
r.agencyModeFk,
- r.created,
+ r.dated,
SUM(sv.volume / ebv.m3)
FROM vn.route r
JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
JOIN vn.saleVolume sv ON sv.ticketFk = t.id
JOIN vn.expeditionBoxVol ebv ON ebv.code = 'transportBox'
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND z.isVolumetric
GROUP BY r.id;
@@ -38,12 +38,12 @@ BEGIN
Bultos)
SELECT r.id,
r.agencyModeFk,
- r.created,
+ r.dated,
SUM(t.packages)
FROM vn.route r
JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND NOT z.isVolumetric
GROUP BY r.id
ON DUPLICATE KEY UPDATE Bultos = Bultos + VALUES(Bultos);
@@ -60,7 +60,7 @@ BEGIN
JOIN vn.component c ON c.id = sc.componentFk
JOIN vn.componentType ct ON ct.id = c.typeFk
WHERE ct.code = 'freight'
- AND r.created BETWEEN vDatedFrom AND vDatedTo
+ AND r.dated BETWEEN vDatedFrom AND vDatedTo
GROUP BY r.id
) sub ON sub.routeFk = r.Id_Ruta
SET r.practico = IFNULL(sub.totalPractice / r.Bultos, 0);
@@ -77,7 +77,7 @@ BEGIN
JOIN vn.address ad ON ad.id = t.addressFk
JOIN vn.client c ON c.id = ad.clientFk
LEFT JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND NOT z.isVolumetric
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
@@ -93,7 +93,7 @@ BEGIN
JOIN vn.saleVolume sf ON sf.ticketFk = t.id
JOIN vn.client c ON c.id = t.clientFk
JOIN vn.`zone` z ON z.id = t.zoneFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND z.isVolumetric
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
@@ -108,7 +108,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
JOIN vn.greuge g ON g.ticketFk = t.id
JOIN vn.greugeType gt ON gt.id = g.greugeTypeFk
- WHERE r.created BETWEEN vDatedFrom AND vDatedTo
+ WHERE r.dated BETWEEN vDatedFrom AND vDatedTo
AND gt.code = 'freightDifference'
GROUP BY t.routeFk
) sub ON r.Id_Ruta = sub.routeFk
diff --git a/db/routines/bi/views/rotacion.sql b/db/routines/bi/views/rotacion.sql
deleted file mode 100644
index 65a5db923..000000000
--- a/db/routines/bi/views/rotacion.sql
+++ /dev/null
@@ -1,15 +0,0 @@
-CREATE OR REPLACE DEFINER=`root`@`localhost`
- SQL SECURITY DEFINER
- VIEW `bi`.`rotacion`
-AS SELECT `ic`.`itemFk` AS `Id_Article`,
- `ic`.`warehouseFk` AS `warehouse_id`,
- `ic`.`quantity` AS `total`,
- `ic`.`rotation` AS `rotacion`,
- `ic`.`cm3` AS `cm3`,
- `ic`.`storage` AS `almacenaje`,
- `ic`.`handling` AS `manipulacion`,
- `ic`.`extraCharge` AS `auxiliar`,
- `ic`.`wasted` AS `mermas`,
- `ic`.`cm3delivery` AS `cm3reparto`,
- `ic`.`grams` AS `grams`
-FROM `vn`.`itemCost` `ic`
diff --git a/db/routines/bs/procedures/waste_addSales.sql b/db/routines/bs/procedures/waste_addSales.sql
index ea4adbc27..4a34d74b3 100644
--- a/db/routines/bs/procedures/waste_addSales.sql
+++ b/db/routines/bs/procedures/waste_addSales.sql
@@ -10,19 +10,27 @@ BEGIN
* @param vDateFrom Fecha desde
* @param vDateTo Fecha hasta
*/
- IF vDateFrom IS NULL THEN
- SET vDateFrom = util.VN_CURDATE() - INTERVAL WEEKDAY(util.VN_CURDATE()) DAY;
+ DECLARE vDaysInYear INT;
+ SET vDaysInYear = DATEDIFF(util.lastDayOfYear(CURDATE()), util.firstDayOfYear(CURDATE()));
+
+ SET vDateFrom = COALESCE(vDateFrom, util.VN_CURDATE());
+ SET vDateTo = COALESCE(vDateTo, util.VN_CURDATE());
+
+ IF DATEDIFF(vDateTo, vDateFrom) > vDaysInYear THEN
+ CALL util.throw('The period cannot be longer than one year');
END IF;
- IF vDateTo IS NULL THEN
- SET vDateTo = vDateFrom + INTERVAL 6 DAY;
- END IF;
+ -- Obtiene el primer día de la semana de esa fecha
+ SET vDateFrom = DATE_SUB(vDateFrom, INTERVAL ((WEEKDAY(vDateFrom) + 1) % 7) DAY);
+
+ -- Obtiene el último día de la semana de esa fecha
+ SET vDateTo = DATE_ADD(vDateTo, INTERVAL (6 - ((WEEKDAY(vDateTo) + 1) % 7)) DAY);
CALL cache.last_buy_refresh(FALSE);
REPLACE bs.waste
- SELECT YEAR(t.shipped),
- WEEK(t.shipped, 4),
+ SELECT YEARWEEK(t.shipped, 6) DIV 100,
+ WEEK(t.shipped, 6),
it.workerFk,
it.id,
s.itemFk,
@@ -68,8 +76,8 @@ BEGIN
JOIN cache.last_buy lb ON lb.item_id = i.id
AND lb.warehouse_id = w.id
JOIN vn.buy b ON b.id = lb.buy_id
- WHERE t.shipped BETWEEN vDateFrom AND vDateTo
+ WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDateTo)
AND w.isManaged
- GROUP BY YEAR(t.shipped), WEEK(t.shipped, 4), i.id;
+ GROUP BY YEARWEEK(t.shipped, 6) DIV 100, WEEK(t.shipped, 6), i.id;
END$$
DELIMITER ;
diff --git a/db/routines/hedera/procedures/order_confirmWithUser.sql b/db/routines/hedera/procedures/order_confirmWithUser.sql
index 3a2c4c3c8..b82694e56 100644
--- a/db/routines/hedera/procedures/order_confirmWithUser.sql
+++ b/db/routines/hedera/procedures/order_confirmWithUser.sql
@@ -112,7 +112,7 @@ BEGIN
) INTO vHas0Amount;
IF vHas0Amount THEN
- CALL util.throw('Hay líneas vacías. Por favor, elimínelas');
+ CALL util.throw('orderLinesWithZero');
END IF;
START TRANSACTION;
diff --git a/db/routines/sage/procedures/invoiceIn_add.sql b/db/routines/sage/procedures/invoiceIn_add.sql
index 1d411cfd0..8fdbb9ce3 100644
--- a/db/routines/sage/procedures/invoiceIn_add.sql
+++ b/db/routines/sage/procedures/invoiceIn_add.sql
@@ -4,10 +4,10 @@ BEGIN
/**
* Traslada la info de contabilidad relacionada con las facturas recibidas
*
- * @vInvoiceInFk Factura recibida
- * @vXDiarioFk Id tabla XDiario
+ * @param vInvoiceInFk Factura recibida
+ * @param vXDiarioFk Id tabla XDiario
*/
- DECLARE vInvoiceInOriginalFk INT;
+ DECLARE vInvoiceInOriginalFk INT;
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vBase DOUBLE;
DECLARE vVat DOUBLE;
@@ -25,7 +25,7 @@ BEGIN
DECLARE vIsInformativeExportation BOOL DEFAULT FALSE;
DECLARE vCursor CURSOR FOR
- SELECT it.taxableBase,
+ SELECT SUM(it.taxableBase),
CAST(SUM((( it.taxableBase / 100) * t.PorcentajeIva)) AS DECIMAL (10,2)),
t.PorcentajeIva,
it.transactionTypeSageFk,
@@ -204,32 +204,31 @@ BEGIN
FROM vn.invoiceInCorrection
WHERE correctingFk = vInvoiceInFk;
- IF vInvoiceInOriginalFk THEN
-
+ IF vInvoiceInOriginalFk THEN
UPDATE movContaIVA mci
- JOIN vn.invoiceInRefund iir ON iir.invoiceInRefundFk = vInvoiceInFk
+ JOIN vn.invoiceInCorrection iic ON iic.correctingFk = vInvoiceInFk
+ JOIN vn.siiTypeInvoiceIn st ON st.id = iic.siiTypeInvoiceInFk
JOIN (SELECT issued,
- SUM(sub.taxableBase) taxableBase,
+ SUM(sub.taxableBase) taxableBase,
SUM(ROUND((sub.taxableBase * sub.PorcentajeIva) / 100 , 2)) vat
FROM(SELECT issued,
- SUM(iit.taxableBase) taxableBase,
+ SUM(iit.taxableBase) taxableBase,
ti.PorcentajeIva
- FROM vn.invoiceIn i
+ FROM vn.invoiceIn i
JOIN vn.invoiceInTax iit ON iit.invoiceInFk = i.id
- JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
+ JOIN TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
WHERE i.id = vInvoiceInOriginalFk
GROUP BY ti.CodigoIva)sub
)invoiceInOriginal
JOIN ClavesOperacion co ON co.Descripcion = 'Factura rectificativa'
SET mci.TipoRectificativa = iir.refundCategoryFk,
- mci.ClaseAbonoRectificativas = iir.refundType,
+ mci.ClaseAbonoRectificativas = iir.refundType,
mci.FechaFacturaOriginal = invoiceInOriginal.issued,
mci.FechaOperacion = invoiceInOriginal.issued,
mci.BaseImponibleOriginal = invoiceInOriginal.taxableBase,
mci.CuotaIvaOriginal = invoiceInOriginal.vat,
mci.ClaveOperacionFactura = co.ClaveOperacionFactura_
WHERE mci.id = vXDiarioFk;
-
END IF;
END$$
-DELIMITER ;
\ No newline at end of file
+DELIMITER ;
diff --git a/db/routines/sage/procedures/invoiceOut_add.sql b/db/routines/sage/procedures/invoiceOut_add.sql
index 95d6a56dd..f9c6f6b87 100644
--- a/db/routines/sage/procedures/invoiceOut_add.sql
+++ b/db/routines/sage/procedures/invoiceOut_add.sql
@@ -169,6 +169,7 @@ BEGIN
UPDATE movContaIVA mci
JOIN vn.invoiceOut i ON i.id = vInvoiceOutCorrectedFk
JOIN vn.invoiceCorrection ic ON ic.correctedFk = vInvoiceOutCorrectedFk
+ JOIN vn.siiTypeInvoiceOut st ON st.id = ic.siiTypeInvoiceOutFk
JOIN (SELECT SUM(IF(IFNULL(e.vatFk, TRUE), iot.taxableBase, 0)) taxableBase,
SUM(IF(IFNULL(e.vatFk, TRUE), iot.vat, 0)) vat,
SUM(IF(IFNULL(e.vatFk, TRUE), 0, iot.vat)) equ
@@ -177,8 +178,8 @@ BEGIN
WHERE iot.invoiceOutFk = vInvoiceOutCorrectedFk
) tax
JOIN ClavesOperacion co ON co.Descripcion = 'Factura rectificativa'
- SET mci.TipoRectificativa = 2,
- mci.ClaseAbonoRectificativas = 1,
+ SET mci.TipoRectificativa = ic.cplusRectificationTypeFk,
+ mci.ClaseAbonoRectificativas = REGEXP_REPLACE(st.`code`, '[^0-9]', ''),
mci.FechaFacturaOriginal = i.issued,
mci.FechaOperacion = i.issued,
mci.BaseImponibleOriginal = tax.taxableBase,
diff --git a/db/routines/vn/functions/buy_getLastWithoutInventory.sql b/db/routines/vn/functions/buy_getLastWithoutInventory.sql
new file mode 100644
index 000000000..ac19fe416
--- /dev/null
+++ b/db/routines/vn/functions/buy_getLastWithoutInventory.sql
@@ -0,0 +1,32 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`buy_getLastWithoutInventory`(
+ vItemFk INT,
+ vWarehouseFk INT
+)
+ RETURNS int(11)
+ DETERMINISTIC
+BEGIN
+/**
+ * Retorna la última compra que no sea inventario.
+ *
+ * @param vItemFk Id del artículo
+ * @param vWarehouseFk Id del almacén
+ * @return Id de compra
+ */
+ DECLARE vBuyFk INT;
+
+ SELECT b.id INTO vBuyFk
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ WHERE e.id <> (SELECT defaultEntry FROM entryConfig)
+ AND e.supplierFk <> (SELECT supplierFk FROM inventoryConfig)
+ AND e.typeFk <> 'inventory'
+ AND b.itemFk = vItemFk
+ AND (t.warehouseInFk = vWarehouseFk OR t.warehouseInFk IS NULL)
+ ORDER BY ABS(DATEDIFF(util.VN_CURDATE(), t.landed)), e.created DESC
+ LIMIT 1;
+
+ RETURN vBuyFk;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/functions/entry_getCommission.sql b/db/routines/vn/functions/entry_getCommission.sql
index a4afdabd4..f8c1ce3b4 100644
--- a/db/routines/vn/functions/entry_getCommission.sql
+++ b/db/routines/vn/functions/entry_getCommission.sql
@@ -11,6 +11,7 @@ BEGIN
DECLARE vCurrentCommission INT;
DECLARE vIsNotEUR INT;
DECLARE vLastEntryFk INT;
+ DECLARE vLanded INT;
SELECT count(*) INTO vIsNotEUR
FROM currency c
@@ -26,23 +27,25 @@ BEGIN
RETURN IFNULL(vCommission, 0);
ELSE
+ SELECT landed INTO vLanded
+ FROM travel
+ WHERE id = vTravelFk;
+
SELECT e.id INTO vLastEntryFk
FROM `entry` e
JOIN travel tr ON tr.id = e.travelFk
- WHERE e.supplierFk = vSupplierFk
- ORDER BY tr.landed DESC
- LIMIT 1;
+ WHERE e.supplierFk = vSupplierFk
+ ORDER BY (vLanded <= tr.landed), tr.landed DESC
+ LIMIT 1;
IF vLastEntryFk THEN
SELECT commission INTO vCurrentCommission
FROM `entry`
WHERE id = vLastEntryFk;
-
ELSE
SELECT commission INTO vCurrentCommission
FROM supplier s
WHERE s.id = vSupplierFk;
-
END IF;
RETURN vCurrentCommission;
diff --git a/db/routines/vn/functions/routeProposal.sql b/db/routines/vn/functions/routeProposal.sql
index 14b626a39..70a1eaae4 100644
--- a/db/routines/vn/functions/routeProposal.sql
+++ b/db/routines/vn/functions/routeProposal.sql
@@ -26,7 +26,7 @@ BEGIN
JOIN cache.zoneAgencyFriendship zf ON zf.agencyModeFk = r.agencyModeFk
WHERE friendship >= vSignificativeFriendship
AND zf.zoneFk = vZoneFk
- AND r.created = vLanded
+ AND r.dated = vLanded
ORDER BY friendship;
-- Se eliminan aquellas que superan el volumen máximo
diff --git a/db/routines/vn/functions/routeProposal_beta.sql b/db/routines/vn/functions/routeProposal_beta.sql
index d6db4d361..f5c347a5b 100644
--- a/db/routines/vn/functions/routeProposal_beta.sql
+++ b/db/routines/vn/functions/routeProposal_beta.sql
@@ -26,7 +26,7 @@ BEGIN
JOIN cache.zoneAgencyFriendship zf ON zf.agencyModeFk = r.agencyModeFk
WHERE friendship >= vSignificativeFriendship
AND zf.zoneFk = vZoneFk
- AND r.created = vLanded
+ AND r.dated = vLanded
ORDER BY friendship;
-- Se eliminan aquellas que superan el volumen máximo
diff --git a/db/routines/vn/procedures/claimRatio_add.sql b/db/routines/vn/procedures/claimRatio_add.sql
index 8c3213644..5e2e66a8e 100644
--- a/db/routines/vn/procedures/claimRatio_add.sql
+++ b/db/routines/vn/procedures/claimRatio_add.sql
@@ -46,7 +46,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
@@ -71,7 +71,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved'
AND c.isChargedToMana;
@@ -82,7 +82,7 @@ BEGIN
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
SET ce.isGreuge = TRUE
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND NOT ce.isGreuge
AND cs.code = 'resolved';
@@ -161,7 +161,7 @@ BEGIN
JOIN claimDestination cd ON cd.id = ce.claimDestinationFk
JOIN claim c ON c.id = ce.claimFk
JOIN claimState cs ON cs.id = c.claimStateFk
- WHERE cd.description NOT IN ('Bueno', 'Corregido')
+ WHERE cd.code NOT IN ('good', 'corrected', 'supplierClaim')
AND cs.code = 'resolved'
AND c.ticketCreated >= util.VN_CURDATE() - INTERVAL 1 YEAR
GROUP BY c.clientFk
diff --git a/db/routines/vn/procedures/expedition_getFromRoute.sql b/db/routines/vn/procedures/expedition_getFromRoute.sql
index 8c2ab057d..932f614b6 100644
--- a/db/routines/vn/procedures/expedition_getFromRoute.sql
+++ b/db/routines/vn/procedures/expedition_getFromRoute.sql
@@ -41,6 +41,6 @@ BEGIN
WHERE expeditionFk = e.id)
LEFT JOIN expeditionState es2 ON es2.id = es.id
WHERE t.routeFk = vRouteFk AND e.freightItemFk <> FALSE
- ORDER BY r.created, t.priority DESC;
+ ORDER BY r.dated, t.priority DESC;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql b/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql
index 327934a43..166ec476c 100644
--- a/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql
+++ b/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql
@@ -54,7 +54,9 @@ proc:BEGIN
WHERE shipped BETWEEN vCreated AND util.dayEnd(vCreated)
AND clientFk = vClientFk
AND addressFk = vAddressFk
- AND warehouseFk = vWarehouseFk;
+ AND warehouseFk = vWarehouseFk
+ AND nickname = 'CAJAS AUTOCONSUMO'
+ LIMIT 1;
IF vTicketFk IS NULL AND vAction = 'add' THEN
INSERT INTO ticket(clientFk, warehouseFk, shipped, nickname, addressFk)
diff --git a/db/routines/vn/procedures/inventoryFailureAdd.sql b/db/routines/vn/procedures/inventoryFailureAdd.sql
deleted file mode 100644
index e2b5fa4a0..000000000
--- a/db/routines/vn/procedures/inventoryFailureAdd.sql
+++ /dev/null
@@ -1,48 +0,0 @@
-DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`inventoryFailureAdd`()
-BEGIN
-
-DECLARE done BOOL DEFAULT FALSE;
-DECLARE vTicketFk INT;
-
-DECLARE rs CURSOR FOR
- SELECT id FROM vn.ticket
- WHERE shipped = util.yesterday()
- AND clientFk = 400
- AND warehouseFk IN (1,44);
-
-DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-
-OPEN rs;
-
-FETCH rs INTO vTicketFk;
-
-WHILE NOT done DO
-
- INSERT INTO vn.inventoryFailure(dated, itemFk, quantity, value, warehouseFk, throwerFk)
- SELECT t.shipped,
- s.itemFk,
- s.quantity,
- b.buyingValue + b.freightValue + b.packageValue + b.comissionValue,
- t.warehouseFk,
- w.id
- FROM vn.ticket t
- JOIN vn.sale s ON s.ticketFk = t.id
- LEFT JOIN cache.last_buy lb ON lb.warehouse_id = t.warehouseFk AND item_id = s.itemFk
- LEFT JOIN vn.buy b ON b.id = lb.buy_id
- LEFT JOIN vn.worker w ON w.code = LEFT(s.concept, 3)
- WHERE t.id = vTicketFk
- AND s.quantity > 0;
-
- FETCH rs INTO vTicketFk;
-
-END WHILE;
-
-
-CLOSE rs;
-
-
-
-
-END$$
-DELIMITER ;
diff --git a/db/routines/vn/procedures/invoiceIn_booking.sql b/db/routines/vn/procedures/invoiceIn_booking.sql
index cfe3adb0b..ef68e4804 100644
--- a/db/routines/vn/procedures/invoiceIn_booking.sql
+++ b/db/routines/vn/procedures/invoiceIn_booking.sql
@@ -43,7 +43,7 @@ BEGIN
ii.cplusTaxBreakFk,
ii.cplusSubjectOpFk,
ii.siiTypeInvoiceInFk,
- ii.cplusRectificationTypeFk,
+ ic.cplusRectificationTypeFk,
ii.booked,
IFNULL(a.isUeeMember, c.isUeeMember) isUeeMember,
(c.id = cc.id) isSameCountry,
@@ -66,6 +66,7 @@ BEGIN
e.name expenseName
FROM invoiceIn ii
JOIN supplier s ON s.id = ii.supplierFk
+ LEFT JOIN invoiceInCorrection ic ON ic.correctingFk = ii.id
LEFT JOIN province p ON p.id = s.provinceFk
LEFT JOIN autonomy a ON a.id = p.autonomyFk
JOIN country c ON c.id = s.countryFk
diff --git a/db/routines/vn/procedures/invoiceOut_new.sql b/db/routines/vn/procedures/invoiceOut_new.sql
index 723f33df5..1f20fb5fc 100644
--- a/db/routines/vn/procedures/invoiceOut_new.sql
+++ b/db/routines/vn/procedures/invoiceOut_new.sql
@@ -34,6 +34,7 @@ BEGIN
DECLARE vMaxShipped DATE;
DECLARE vDone BOOL;
DECLARE vTicketFk INT;
+ DECLARE vAddressFk INT;
DECLARE vCursor CURSOR FOR
SELECT id
FROM tmp.ticketToInvoice;
@@ -48,11 +49,13 @@ BEGIN
DATE(vInvoiceDate) >= invoiceOut_getMaxIssued(
vSerial,
t.companyFk,
- YEAR(vInvoiceDate))
+ YEAR(vInvoiceDate)),
+ t.addressFk
INTO vClientFk,
vCompanyFk,
vMaxShipped,
- vIsCorrectInvoiceDate
+ vIsCorrectInvoiceDate,
+ vAddressFk
FROM tmp.ticketToInvoice tt
JOIN ticket t ON t.id = tt.id;
@@ -105,7 +108,9 @@ BEGIN
clientFk,
dued,
companyFk,
- siiTypeInvoiceOutFk
+ siiTypeInvoiceOutFk,
+ customsAgentFk,
+ incotermsFk
)
SELECT
1,
@@ -118,9 +123,12 @@ BEGIN
vCplusCorrectingInvoiceTypeFk,
IF(vSerial = vSimplifiedSerial,
vCplusSimplifiedInvoiceTypeFk,
- vCplusStandardInvoiceTypeFk))
- FROM client
- WHERE id = vClientFk;
+ vCplusStandardInvoiceTypeFk)),
+ a.customsAgentFk,
+ a.incotermsFk
+ FROM client c
+ JOIN address a ON a.id = vAddressFk
+ WHERE c.id = vClientFk;
SET vNewInvoiceId = LAST_INSERT_ID();
diff --git a/db/routines/vn/procedures/item_cleanFloramondo.sql b/db/routines/vn/procedures/item_cleanFloramondo.sql
index 849cfe93d..21d8ebe3c 100644
--- a/db/routines/vn/procedures/item_cleanFloramondo.sql
+++ b/db/routines/vn/procedures/item_cleanFloramondo.sql
@@ -164,10 +164,6 @@ BEGIN
SET itemFk = vItemNew
WHERE itemFk = vItemOld;
- UPDATE inventoryFailure
- SET itemFk = vItemNew
- WHERE itemFk = vItemOld;
-
UPDATE genericAllocation
SET itemFk = vItemNew
WHERE itemFk = vItemOld;
diff --git a/db/routines/vn/procedures/routeMonitor_calculate.sql b/db/routines/vn/procedures/routeMonitor_calculate.sql
index c9a7a9ccf..31667f211 100644
--- a/db/routines/vn/procedures/routeMonitor_calculate.sql
+++ b/db/routines/vn/procedures/routeMonitor_calculate.sql
@@ -27,7 +27,7 @@ BEGIN
rm.ticketFree = 0,
rm.ticketProduction = 0,
rm.ticketPacked = 0,
- rm.dated = r.created;
+ rm.dated = r.dated;
UPDATE routesMonitor rm
JOIN (
diff --git a/db/routines/vn/procedures/route_calcCommission.sql b/db/routines/vn/procedures/route_calcCommission.sql
index 7db0b2682..dc44adb9b 100644
--- a/db/routines/vn/procedures/route_calcCommission.sql
+++ b/db/routines/vn/procedures/route_calcCommission.sql
@@ -14,7 +14,7 @@ BEGIN
DECLARE vIsKmTruckRate BOOL;
DECLARE vCountryFk INT;
- SELECT r.created >= rc.cutoffDated INTO vIsUpdatable
+ SELECT r.dated >= rc.cutoffDated INTO vIsUpdatable
FROM route r
JOIN routeConfig rc
WHERE r.id = vSelf;
diff --git a/db/routines/vn/procedures/saleTracking_addPrevOK.sql b/db/routines/vn/procedures/saleTracking_addPrevOK.sql
index 34d1cfac8..9f823e9a0 100644
--- a/db/routines/vn/procedures/saleTracking_addPrevOK.sql
+++ b/db/routines/vn/procedures/saleTracking_addPrevOK.sql
@@ -16,10 +16,11 @@ BEGIN
TRUE,
sc.userFk,
s.id
- FROM vn.sectorCollection sc
- JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
- JOIN vn.saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk
- JOIN vn.state s ON s.code = 'OK PREVIOUS'
+ FROM sectorCollection sc
+ JOIN sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
+ JOIN saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk
+ JOIN state s ON s.code = 'OK PREVIOUS'
+ JOIN itemShelvingSale iss ON iss.saleFk = sgd.saleFk
WHERE sc.id = vSectorCollectionFk;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/ticket_canAdvance.sql b/db/routines/vn/procedures/ticket_canAdvance.sql
index e8fc70bba..cee706e08 100644
--- a/db/routines/vn/procedures/ticket_canAdvance.sql
+++ b/db/routines/vn/procedures/ticket_canAdvance.sql
@@ -52,7 +52,8 @@ BEGIN
IFNULL(dest.nickname, origin.nickname) nickname,
dest.landed,
dest.preparation,
- origin.departmentFk
+ origin.departmentFk,
+ origin.saleClonedFk
FROM (
SELECT s.ticketFk,
c.salesPersonFk workerFk,
@@ -73,11 +74,13 @@ BEGIN
t.warehouseFk,
t.companyFk,
t.agencyModeFk,
- wd.departmentFk
+ wd.departmentFk,
+ sc.saleClonedFk
FROM ticket t
JOIN client c ON c.id = t.clientFk
JOIN workerDepartment wd ON wd.workerFk = c.salesPersonFk
JOIN sale s ON s.ticketFk = t.id
+ LEFT JOIN saleCloned sc ON sc.saleClonedFk = s.id
JOIN saleVolume sv ON sv.saleFk = s.id
JOIN item i ON i.id = s.itemFk
JOIN ticketState ts ON ts.ticketFk = t.id
diff --git a/db/routines/vn/procedures/travel_checkRaid.sql b/db/routines/vn/procedures/travel_checkRaid.sql
index 64f3355e2..885fc718a 100644
--- a/db/routines/vn/procedures/travel_checkRaid.sql
+++ b/db/routines/vn/procedures/travel_checkRaid.sql
@@ -10,8 +10,8 @@ BEGIN
* @param vIsRaid idRaid value
* @param vDaysInForward daysInForward value
*/
- IF (NOT vIsRaid AND vDaysInForward IS NOT NULL) OR (vIsRaid AND vDaysInForward IS NULL) THEN
- CALL util.throw('The raid information is not correct');
+ IF NOT vIsRaid AND vDaysInForward THEN
+ CALL util.throw('If daysInForward has a value, the raid cannot be unchecked');
END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/travel_moveRaids.sql b/db/routines/vn/procedures/travel_moveRaids.sql
index cf0fce23c..17d7ecc4c 100644
--- a/db/routines/vn/procedures/travel_moveRaids.sql
+++ b/db/routines/vn/procedures/travel_moveRaids.sql
@@ -8,22 +8,15 @@ BEGIN
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vBuyerEmail VARCHAR(40);
DECLARE vTravelLink TEXT;
- DECLARE vMailBody TEXT DEFAULT '';
+ DECLARE vMailBody TEXT;
+ DECLARE vDaysBetweenDates INT;
+ DECLARE vSubject VARCHAR(30);
- DECLARE vCur CURSOR FOR
- SELECT GROUP_CONCAT(DISTINCT
- CONCAT('https://salix.verdnatura.es/#!/travel/',
- ttm.travelFk,
- '/summary ')
- ORDER BY ttm.travelFk SEPARATOR '\n\r') travelLink,
- CONCAT(u.name, '@verdnatura.es') buyerEmail
- FROM tTravelToMove ttm
- JOIN entry e ON e.travelFk = ttm.travelFk
- JOIN buy b ON b.entryFk = e.id
- JOIN item i ON i.id = b.itemFk
- JOIN itemType it ON it.id = i.typeFk
- JOIN account.user u ON u.id = it.workerFk
- GROUP BY u.name;
+ DECLARE vTravels CURSOR FOR
+ SELECT GROUP_CONCAT(DISTINCT travelLink ORDER BY id SEPARATOR '\n\r'),
+ buyerEmail
+ FROM tTravelToMove
+ GROUP BY buyerEmail;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
@@ -34,35 +27,50 @@ BEGIN
END;
CREATE OR REPLACE TEMPORARY TABLE tTravelToMove
- SELECT id travelFk,
- util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded
- FROM travel
+ WITH travels AS (
+ SELECT id,
+ CONCAT('https://salix.verdnatura.es/#!/travel/', id,'/summary') travelLink,
+ util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded,
+ util.VN_CURDATE() - INTERVAL DATEDIFF(landed, shipped) + daysInForward DAY newShipped
+ FROM vn.travel
WHERE isRaid
- AND daysInForward;
+ AND daysInForward
+ )SELECT t.id,
+ t.travelLink,
+ t.newLanded,
+ t.newShipped,
+ CONCAT(u.name, '@verdnatura.es') buyerEmail
+ FROM travels t
+ STRAIGHT_JOIN vn.entry e ON e.travelFk = t.id
+ JOIN vn.buy b ON b.entryFk = e.id
+ JOIN vn.item i ON i.id = b.itemFk
+ JOIN vn.itemType it ON it.id = i.typeFk
+ JOIN account.user u ON u.id = it.workerFk
+ GROUP BY t.id;
START TRANSACTION;
UPDATE travel tr
- JOIN tTravelToMove ttm ON ttm.travelFk = tr.id
- SET tr.landed = ttm.newLanded;
+ JOIN tTravelToMove ttm ON ttm.id = tr.id
+ SET tr.landed = ttm.newLanded,
+ tr.shipped = ttm.newShipped;
- OPEN vCur;
+ OPEN vTravels;
l: LOOP
SET vDone = FALSE;
- FETCH vCur INTO vTravelLink, vBuyerEmail;
+ FETCH vTravels INTO vTravelLink, vBuyerEmail;
IF vDone THEN
LEAVE l;
END IF;
- CALL `vn`.`mail_insert`(
- vBuyerEmail,
- 'noreply@verdnatura.es',
- 'Cambio de fecha en Redadas',
- CONCAT('Se ha movido los siguientes travels: \n\r ', vTravelLink));
+ SET vSubject = 'Cambio de fecha en Redadas',
+ vMailBody = CONCAT('Se ha movido los siguientes travels: \n\r ', vTravelLink);
+
+ CALL mail_insert(vBuyerEmail, 'noreply@verdnatura.es', vSubject, vMailBody);
END LOOP;
- CLOSE vCur;
+ CLOSE vTravels;
COMMIT;
DROP TEMPORARY TABLE tTravelToMove;
END$$
diff --git a/db/routines/vn/triggers/invoiceIn_afterUpdate.sql b/db/routines/vn/triggers/invoiceIn_afterUpdate.sql
index 95b1d98a9..8c2785e38 100644
--- a/db/routines/vn/triggers/invoiceIn_afterUpdate.sql
+++ b/db/routines/vn/triggers/invoiceIn_afterUpdate.sql
@@ -3,24 +3,30 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`invoiceIn_afterUpdate`
AFTER UPDATE ON `invoiceIn`
FOR EACH ROW
BEGIN
- IF NEW.issued != OLD.issued
- OR NEW.currencyFk != OLD.currencyFk THEN
+ DECLARE vIsEuro BOOL;
+
+ SELECT `code` = 'EUR' INTO vIsEuro
+ FROM currency
+ WHERE id = NEW.currencyFk;
+
+ IF (NOT NEW.issued <=> OLD.issued
+ OR NEW.currencyFk <> OLD.currencyFk) THEN
UPDATE invoiceInTax iit
JOIN invoiceIn ii ON ii.id = iit.invoiceInFk
LEFT JOIN referenceRate rr ON rr.dated = ii.issued
AND rr.currencyFk = ii.currencyFk
- SET iit.taxableBase = IF(iit.foreignValue IS NULL, iit.taxableBase, iit.foreignValue / rr.value)
+ SET iit.taxableBase = IF(vIsEuro, iit.taxableBase, iit.foreignValue / rr.value),
+ iit.foreignValue = IF(vIsEuro, NULL, iit.foreignValue)
WHERE ii.id = NEW.id;
UPDATE invoiceInDueDay iidd
JOIN invoiceIn ii ON ii.id = iidd.invoiceInFk
LEFT JOIN referenceRate rr ON rr.dated = ii.issued
AND rr.currencyFk = ii.currencyFk
- SET iidd.amount = IF(iidd.foreignValue IS NULL, iidd.amount, iidd.foreignValue / rr.value)
+ SET iidd.amount = IF(vIsEuro, iidd.amount, iidd.foreignValue / rr.value),
+ iidd.foreignValue = IF(vIsEuro, NULL, iidd.foreignValue)
WHERE ii.id = NEW.id;
-
END IF;
-
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/itemCost_beforeUpdate.sql b/db/routines/vn/triggers/itemCost_beforeUpdate.sql
index bd5fde85a..8de288a92 100644
--- a/db/routines/vn/triggers/itemCost_beforeUpdate.sql
+++ b/db/routines/vn/triggers/itemCost_beforeUpdate.sql
@@ -16,7 +16,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND ic.itemFk = NEW.itemFk
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
IF NEW.cm3Delivery = 0 AND NEW.warehouseFk = 60 THEN
CALL mail_insert(
diff --git a/db/routines/vn/triggers/route_afterUpdate.sql b/db/routines/vn/triggers/route_afterUpdate.sql
index 447608acc..a15c1a4b7 100644
--- a/db/routines/vn/triggers/route_afterUpdate.sql
+++ b/db/routines/vn/triggers/route_afterUpdate.sql
@@ -22,6 +22,7 @@ BEGIN
OR !(NEW.workerFk <=> OLD.workerFk)
OR !(NEW.m3 <=> OLD.m3)
OR !(NEW.agencyModeFk <=> OLD.agencyModeFk)
+ OR !(NEW.dated <=> OLD.dated)
OR !(NEW.vehicleFk <=> OLD.vehicleFk)THEN
CALL route_calcCommission(NEW.id);
END IF;
diff --git a/db/routines/vn/triggers/route_beforeInsert.sql b/db/routines/vn/triggers/route_beforeInsert.sql
index 788efe662..0afc9617e 100644
--- a/db/routines/vn/triggers/route_beforeInsert.sql
+++ b/db/routines/vn/triggers/route_beforeInsert.sql
@@ -14,7 +14,7 @@ BEGIN
SELECT IFNULL(b.workCenterFK, r.defaultWorkCenterFk)
FROM vn.routeConfig r
LEFT JOIN vn.business b ON b.workerFk = vUserFk
- AND NEW.created BETWEEN b.started AND IFNULL(b.ended, NEW.created));
+ AND NEW.dated BETWEEN b.started AND IFNULL(b.ended, NEW.dated));
IF ISNULL(NEW.agencyModeFk) THEN
SELECT r.agencyModeFk INTO vDefaultAgencyModeFk
diff --git a/db/routines/vn/triggers/sale_afterInsert.sql b/db/routines/vn/triggers/sale_afterInsert.sql
index f15b17722..1a9ef240a 100644
--- a/db/routines/vn/triggers/sale_afterInsert.sql
+++ b/db/routines/vn/triggers/sale_afterInsert.sql
@@ -23,7 +23,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
END$$
diff --git a/db/routines/vn/triggers/sale_afterUpdate.sql b/db/routines/vn/triggers/sale_afterUpdate.sql
index 82da55486..49e5383d0 100644
--- a/db/routines/vn/triggers/sale_afterUpdate.sql
+++ b/db/routines/vn/triggers/sale_afterUpdate.sql
@@ -54,7 +54,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
diff --git a/db/routines/vn/triggers/sale_beforeDelete.sql b/db/routines/vn/triggers/sale_beforeDelete.sql
index ad97f8b55..0f72d788b 100644
--- a/db/routines/vn/triggers/sale_beforeDelete.sql
+++ b/db/routines/vn/triggers/sale_beforeDelete.sql
@@ -11,7 +11,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND s.id = OLD.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
END IF;
END$$
diff --git a/db/routines/vn/triggers/ticket_beforeDelete.sql b/db/routines/vn/triggers/ticket_beforeDelete.sql
index 953fa509a..2115175b5 100644
--- a/db/routines/vn/triggers/ticket_beforeDelete.sql
+++ b/db/routines/vn/triggers/ticket_beforeDelete.sql
@@ -8,7 +8,7 @@ BEGIN
FROM vn.route r
WHERE r.isOk = FALSE
AND r.id = OLD.routeFk
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
DELETE FROM sale WHERE ticketFk = OLD.id;
diff --git a/db/routines/vn/triggers/ticket_beforeUpdate.sql b/db/routines/vn/triggers/ticket_beforeUpdate.sql
index 3208a93d0..f86f50485 100644
--- a/db/routines/vn/triggers/ticket_beforeUpdate.sql
+++ b/db/routines/vn/triggers/ticket_beforeUpdate.sql
@@ -22,7 +22,7 @@ BEGIN
FROM `route`
WHERE NOT isOk
AND id IN (OLD.routeFk, NEW.routeFk)
- AND created >= util.VN_CURDATE()
+ AND dated >= util.VN_CURDATE()
GROUP BY id;
END IF;
@@ -45,7 +45,7 @@ BEGIN
JOIN vn.route r ON r.id = t.routeFk
WHERE r.isOk = FALSE
AND t.id = NEW.id
- AND r.created >= util.VN_CURDATE()
+ AND r.dated >= util.VN_CURDATE()
GROUP BY r.id;
SET NEW.shipped = DATE_FORMAT(NEW.shipped, '2000-%m-%d %T');
SET NEW.landed = DATE_FORMAT(NEW.landed, '2000-%m-%d %T');
diff --git a/db/routines/vn/triggers/travel_beforeUpdate.sql b/db/routines/vn/triggers/travel_beforeUpdate.sql
index 256dd35f8..5a27b43b4 100644
--- a/db/routines/vn/triggers/travel_beforeUpdate.sql
+++ b/db/routines/vn/triggers/travel_beforeUpdate.sql
@@ -20,6 +20,10 @@ BEGIN
CALL travel_checkWarehouseIsFeedStock(NEW.warehouseInFk);
END IF;
+ IF NOT (NEW.isRaid <=> OLD.isRaid) OR NOT (NEW.daysInForward <=> OLD.daysInForward) THEN
+ CALL travel_checkRaid(NEW.isRaid, NEW.daysInForward);
+ END IF;
+
IF NOT (NEW.awbFk <=> OLD.awbFk)THEN
SELECT COUNT(*) INTO vHasAnyInvoiceBooked
FROM travel t
diff --git a/db/routines/vn/triggers/workerManaExcluded_beforeInsert.sql b/db/routines/vn/triggers/workerManaExcluded_beforeInsert.sql
new file mode 100644
index 000000000..824f0982b
--- /dev/null
+++ b/db/routines/vn/triggers/workerManaExcluded_beforeInsert.sql
@@ -0,0 +1,9 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeInsert`
+ BEFORE INSERT ON `workerManaExcluded`
+ FOR EACH ROW
+BEGIN
+ DELETE FROM workerMana
+ WHERE workerFk = NEW.workerFk;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/triggers/workerManaExcluded_beforeUpdate.sql b/db/routines/vn/triggers/workerManaExcluded_beforeUpdate.sql
new file mode 100644
index 000000000..83d73e131
--- /dev/null
+++ b/db/routines/vn/triggers/workerManaExcluded_beforeUpdate.sql
@@ -0,0 +1,9 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerManaExcluded_beforeUpdate`
+ BEFORE UPDATE ON `workerManaExcluded`
+ FOR EACH ROW
+BEGIN
+ DELETE FROM workerMana
+ WHERE workerFk = NEW.workerFk;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/triggers/workerMana_beforeInsert.sql b/db/routines/vn/triggers/workerMana_beforeInsert.sql
new file mode 100644
index 000000000..2d27004e3
--- /dev/null
+++ b/db/routines/vn/triggers/workerMana_beforeInsert.sql
@@ -0,0 +1,10 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeInsert`
+ BEFORE INSERT ON `workerMana`
+ FOR EACH ROW
+BEGIN
+ IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
+ CALL util.throw('Worker is excluded from mana');
+ END IF;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/triggers/workerMana_beforeUpdate.sql b/db/routines/vn/triggers/workerMana_beforeUpdate.sql
new file mode 100644
index 000000000..6916733cb
--- /dev/null
+++ b/db/routines/vn/triggers/workerMana_beforeUpdate.sql
@@ -0,0 +1,10 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerMana_beforeUpdate`
+ BEFORE UPDATE ON `workerMana`
+ FOR EACH ROW
+BEGIN
+ IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN
+ CALL util.throw('Worker is excluded from mana');
+ END IF;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql
index 27432fccb..96db381b5 100644
--- a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql
+++ b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql
@@ -3,10 +3,12 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerTimeControl_after
AFTER DELETE ON `workerTimeControl`
FOR EACH ROW
BEGIN
- INSERT INTO workerLog
- SET `action` = 'delete',
- `changedModel` = 'WorkerTimeControl',
- `changedModelId` = OLD.id,
- `userFk` = account.myUser_getId();
+ IF account.myUser_getId() IS NOT NULL THEN
+ INSERT INTO workerLog
+ SET `action` = 'delete',
+ `changedModel` = 'WorkerTimeControl',
+ `changedModelId` = OLD.id,
+ `userFk` = account.myUser_getId();
+ END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/views/expeditionPallet_Print.sql b/db/routines/vn/views/expeditionPallet_Print.sql
index 7b933a0a1..0a445a4a6 100644
--- a/db/routines/vn/views/expeditionPallet_Print.sql
+++ b/db/routines/vn/views/expeditionPallet_Print.sql
@@ -9,8 +9,8 @@ AS SELECT `rs2`.`description` AS `truck`,
`rs`.`id` <=> `rm`.`roadmapStopFk` AS `isMatch`,
`t`.`warehouseFk` AS `warehouseFk`,
IF(
- `r`.`created` > `util`.`VN_CURDATE`() + INTERVAL 1 DAY,
- ucase(dayname(`r`.`created`)),
+ `r`.`dated` > `util`.`VN_CURDATE`() + INTERVAL 1 DAY,
+ ucase(dayname(`r`.`dated`)),
NULL
) AS `nombreDia`
FROM (
diff --git a/db/routines/vn/views/expeditionRoute_Monitor.sql b/db/routines/vn/views/expeditionRoute_Monitor.sql
index 9b46c8237..716702753 100644
--- a/db/routines/vn/views/expeditionRoute_Monitor.sql
+++ b/db/routines/vn/views/expeditionRoute_Monitor.sql
@@ -6,7 +6,7 @@ AS SELECT `r`.`id` AS `routeFk`,
COUNT(DISTINCT `e`.`id`) AS `expeditions`,
COUNT(DISTINCT `es`.`id`) AS `scanned`,
max(`e`.`created`) AS `lastPacked`,
- `r`.`created` AS `created`
+ `r`.`dated` AS `created`
FROM (
(
(
@@ -23,5 +23,5 @@ FROM (
)
LEFT JOIN `vn`.`expeditionScan` `es` ON(`es`.`expeditionFk` = `e`.`id`)
)
-WHERE `r`.`created` >= `util`.`yesterday`()
+WHERE `r`.`dated` >= `util`.`yesterday`()
GROUP BY `r`.`id`
diff --git a/db/routines/vn2008/views/Rutas.sql b/db/routines/vn2008/views/Rutas.sql
index 78b3bb471..c8ade24e9 100644
--- a/db/routines/vn2008/views/Rutas.sql
+++ b/db/routines/vn2008/views/Rutas.sql
@@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost`
VIEW `vn2008`.`Rutas`
AS SELECT `r`.`id` AS `Id_Ruta`,
`r`.`workerFk` AS `Id_Trabajador`,
- `r`.`created` AS `Fecha`,
+ `r`.`dated` AS `Fecha`,
`r`.`vehicleFk` AS `Id_Vehiculo`,
`r`.`agencyModeFk` AS `Id_Agencia`,
`r`.`time` AS `Hora`,
diff --git a/db/versions/11269-wheatBirch/00-firstScript.sql b/db/versions/11269-wheatBirch/00-firstScript.sql
new file mode 100644
index 000000000..9432d131b
--- /dev/null
+++ b/db/versions/11269-wheatBirch/00-firstScript.sql
@@ -0,0 +1,15 @@
+ALTER TABLE vn.invoiceOut ADD COLUMN IF NOT EXISTS customsAgentFk INT(11) DEFAULT NULL AFTER siiTrascendencyInvoiceOutFk;
+ALTER TABLE vn.invoiceOut ADD COLUMN IF NOT EXISTS incotermsFk varchar(3) DEFAULT NULL AFTER customsAgentFk;
+
+ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_customsAgentFk FOREIGN KEY (customsAgentFk)
+ REFERENCES vn.customsAgent (id) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_incotermsFk FOREIGN KEY (incotermsFk)
+ REFERENCES vn.incoterms (`code`) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+UPDATE vn.invoiceOut io
+ JOIN vn.client c ON c.id = io.clientFk
+ JOIN vn.ticket t ON t.clientFk = c.id
+ JOIN vn.address a ON a.id = t.addressFk
+ SET io.customsAgentFk = a.customsAgentFk,
+ io.incotermsFk = a.incotermsFk;
\ No newline at end of file
diff --git a/db/versions/11320-salmonRose/00-firstScript.sql b/db/versions/11320-salmonRose/00-firstScript.sql
new file mode 100644
index 000000000..cd3431fee
--- /dev/null
+++ b/db/versions/11320-salmonRose/00-firstScript.sql
@@ -0,0 +1,11 @@
+INSERT INTO hedera.message (code, description)
+ VALUES ('orderLinesWithZero','There are empty lines. Please delete them');
+
+INSERT INTO hedera.messageI18n (code, lang, description)
+ VALUES ('orderLinesWithZero','es','Hay líneas vacías. Por favor, elimínelas');
+
+INSERT INTO hedera.messageI18n (code, lang, description)
+ VALUES ('orderLinesWithZero','fr','Il y a des lignes vides. Veuillez les supprimer');
+
+INSERT INTO hedera.messageI18n (code, lang, description)
+ VALUES ('orderLinesWithZero','pt','Existem linhas vazias. Por favor, apague-os');
\ No newline at end of file
diff --git a/db/versions/11327-maroonOak/00-firstScript.sql b/db/versions/11327-maroonOak/00-firstScript.sql
new file mode 100644
index 000000000..a51ee3fff
--- /dev/null
+++ b/db/versions/11327-maroonOak/00-firstScript.sql
@@ -0,0 +1,185 @@
+CREATE TABLE IF NOT EXISTS `vn`.`sim` (
+ `code` VARCHAR(25) COMMENT 'No se ha puesto BIGINT por incompatibilidad con Access',
+ `line` VARCHAR(15) NOT NULL CHECK (`line` REGEXP '^[0-9]+$'),
+ `ext` INT(4) NOT NULL,
+ `pin` VARCHAR(4) NOT NULL CHECK (`pin` REGEXP '^[0-9]+$'),
+ `puk` VARCHAR(15) NOT NULL CHECK (`pin` REGEXP '^[0-9]+$'),
+ PRIMARY KEY (`code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+ALTER TABLE vn.deviceProductionUser CHANGE simSerialNumber simFk VARCHAR(25) DEFAULT NULL NULL;
+ALTER TABLE vn.deviceProductionUser MODIFY COLUMN simFk VARCHAR(25) DEFAULT NULL NULL;
+
+INSERT IGNORE INTO `vn`.`sim` (`line`, `ext`, `pin`, `code`, `puk`) VALUES
+ ('621188151', 2209, '1486', '3456985220092508','14213470'),
+ ('621188152', 2210, '8765', '3456985220092509','99473093'),
+ ('621188153', 2211, '3064', '3456985220092510','52967210'),
+ ('621188759', 2081, '3700', '3456985220123637','56600999'),
+ ('621188760', 2082, '3259', '345698522023638','87492404'),
+ ('621188761', 2083, '2790', '3456985220123639','94009456'),
+ ('621188762', 2084, '2480', '3456985220123644','1484999'),
+ ('621188763', 2085, '6876', '3456985220123641','36577064'),
+ ('621188766', 2086, '7775', '3456985220123642','80761698'),
+ ('621188769', 2088, '4027', '3456985220123643','37921712'),
+ ('621188771', 2089, '8797', '3456985220123640','63092540'),
+ ('621188772', 2090, '8404', '3456985220123645','21014997'),
+ ('621188773', 2091, '5481', '3456985220123646','16317277'),
+ ('621188774', 2092, '9632', '3456985220123647','22235994'),
+ ('621188775', 2093, '4654', '3456985220123648','28506486'),
+ ('621188838', 2094, '1392', '3456985220123649','29498627'),
+ ('621188839', 2095, '7774', '3456985220123650','46263490'),
+ ('621188840', 2096, '7304', '3456985220123658','8212044'),
+ ('621188841', 2097, '5569', '3456985220123652','81597658'),
+ ('621188842', 2098, '4944', '3456985220123653','24961501'),
+ ('621188843', 2099, '5142', '3456985220123654','17035634'),
+ ('621188844', 2111, '7245', '3456985220123655','90231951'),
+ ('621188846', 2110, '6590', '3456985220123656','72201537'),
+ ('667680207', 2564, '4042', '34569832200759166','48401979'),
+ ('667680315', 2565, '7143', '34569832200759372','32143252'),
+ ('667680318', 2566, '6342', '34569832200759364','39597112'),
+ ('667680413', 2567, '5580', '34569832200759356','32786992'),
+ ('667680463', 2568, '0171', '34569832200759349','34240853'),
+ ('667688217', 2569, '2500', '34569832200759331','5687589'),
+ ('633603945', 2212, '7129', '34569832200759323','51554019'),
+ ('622130186', 2213, '4826', '34569832200759307','19623551'),
+ ('633973424', 2214, '8535', '34569832200759299','94619307'),
+ ('633703828', 2215, '8628', '34569832200759281','22468012'),
+ ('622025110', 2216, '2399', '34569832200759273','34602918'),
+ ('622924867', 2217, '5665', '34569832200759265','26920216'),
+ ('722409630', 2218, '5211', '34569832200759240','93750137'),
+ ('623590529', 2219, '0493', '34569832200759208','47077088'),
+ ('633243462', 2220, '6902', '34569832200759174','6421962'),
+ ('633047286', 2221, '5592', '34569832200759182','32069439'),
+ ('744716801', 2112, '9184', '34569832200759190','57049814'),
+ ('655995021', 2131, '8896', '34569852202049093','19497356'),
+ ('685522718', 2132, '1955', '34569852202049101','28519879'),
+ ('674587213', 2994, '2006', '34569332200223743','62360135'),
+ ('674587227', 2993, '9271', '34569332200223750','81628192'),
+ ('674587229', 2993, '0900', '34569332200223768','91119071'),
+ ('674587231', 2992, '5007', '34569332200223776','45826232'),
+ ('674587234', 2991, '1378', '34569332200223784','91245744'),
+ ('674587240', 2990, '0905', '34569332200223792','13083224'),
+ ('674587245', 2989, '9059', '34569332200223800','15291807'),
+ ('674587250', 2988, '8188', '34569332200223818','83017918'),
+ ('674587254', 2987, '2962', '34569332200223826','92809271'),
+ ('674587256', 2986, '0358', '34569332200223834','81067040'),
+ ('674592713', 2570, '2537', '34569332200230672','82325850'),
+ ('697832478', 2579, '0936', '34568732200494825','49658372'),
+ ('697832176', 2571, '5944', '34568732200494742','19039461'),
+ ('697832477', 2572, '5138', '34568732200494759','25712504'),
+ ('697832178', 2573, '4597', '34568732200494767','66241760'),
+ ('697832182', 2574, '9241', '34568732200494775','07342562'),
+ ('697832196', 2575, '2995', '34568732200494783','53929026'),
+ ('697832214', 2576, '7434', '34568732200494791','49698432'),
+ ('697832230', 2577, '7004', '34568732200494809','21578612'),
+ ('697832235', 2578, '9674', '34568732200494817','93090700'),
+ ('673420375', 2599, '5430', '34562052300117259','35911412'),
+ ('673420367', 2598, '8402', '34562052300117242','924654'),
+ ('673420361', 2597, '5125', '34562052300117234','12027970'),
+ ('673420355', 2596, '5069', '34562052300117226','34978149'),
+ ('673420348', 2595, '8911', '34562052300117218','4228121'),
+ ('673420346', 2594, '2461', '34562052300117200','67670772'),
+ ('673420345', 2593, '2226', '34562052300117192','90586404'),
+ ('673420306', 2592, '3355', '34562052300117184','97850017'),
+ ('673420257', 2591, '9395', '34562052300117176','50713786'),
+ ('673420231', 2590, '1378', '34562052300117168','50151763'),
+ ('673420223', 2589, '9580', '34562052300117150','99534550'),
+ ('673420216', 2588, '4955', '34562052300117143','317554'),
+ ('673420203', 2587, '6742', '34562052300117135','69321531'),
+ ('673420201', 2586, '1659', '34562052300117127','54720480'),
+ ('673420199', 2585, '7823', '34562052300117119','22923796'),
+ ('673420198', 2584, '1787', '34562052300117101','54414630'),
+ ('673420168', 2583, '6334', '34562052300117093','50694894'),
+ ('673420147', 2582, '8951', '34562052300117085','1402535'),
+ ('673420125', 2581, '3068', '34562052300117077','86216200'),
+ ('673420124', 2580, '9517', '34562052300117069','42504099'),
+ ('600294609', 2715, '7474', '34569832304894588','55923317'),
+ ('600084713', 2703, '8342', '34569832304894570','8392636'),
+ ('600084732', 2704, '1625', '34569832304894513','75477452'),
+ ('600084850', 2705, '9896', '34569832304894653','28589813'),
+ ('600084951', 2706, '5520', '34569832304894661','75353012'),
+ ('600084978', 2707, '2698', '34569832304894679','9005523'),
+ ('600085403', 2708, '0837', '34569832304894646','77051152'),
+ ('600085513', 2709, '3106', '34569832304894687','41571002'),
+ ('600293916', 2712, '8990', '34569832304894620','95188676'),
+ ('600294160', 2714, '6376', '34569832304894703','79879896'),
+ ('671919529', 2975, '9184', '34569832304806236','7535392'),
+ ('671919942', 2981, '0328', '34569832304806269','31052894'),
+ ('671919530', 2976, '0344', '34569832304806251','89860304'),
+ ('671919533', 2977, '0668', '34569832304806244','42921771'),
+ ('671919535', 2978, '0105', '34569832304806277','31009417'),
+ ('671919537', 2979, '0881', '34569832304806285','33479769'),
+ ('671919540', 2980, '9874', '34569832304806293','14103929'),
+ ('671919525', 2972, '2089', '34569832304806301','45903729'),
+ ('671919527', 2973, '8206', '34569832304806368','1586035'),
+ ('671919528', 2974, '2532', '34569832304806327','62310124'),
+ ('673668717', 2836, '7973', '34562032301044223','15635496'),
+ ('673668734', 2837, '4457', '34562032301044231','18313118'),
+ ('673668738', 2824, '2911', '34562032301044249','30875583'),
+ ('673668745', 2838, '7253', '34562032301044256','62754222'),
+ ('673668796', 2839, '0068', '34562032301044264','15556829'),
+ ('673668803', 2840, '2386', '34562032301044272','17572287'),
+ ('673669591', 2850, '3833', '34562032301044280','34828896'),
+ ('673668808', 2841, '3584', '34562032301044298','16234497'),
+ ('673670102', 2851, '3554', '34562032301044306','23652625'),
+ ('673670131', 2852, '4412', '34562032301044314','88611709'),
+ ('673670135', 2827, '6058', '34562032301044322','53918579'),
+ ('673670201', 2828, '8066', '34562032301044330','92369343'),
+ ('673670225', 2829, '4592', '34562032301044348','24126635'),
+ ('673670236', 2830, '2974', '34562032301044355','88608465'),
+ ('673671485', 2849, '0349', '34562032301044363','44944874'),
+ ('673461977', 2871, '1728', '34562032400157090','46975780'),
+ ('673461975', 2870, '4734', '34562032400157082','69628432'),
+ ('673461972', 2867, '6276', '34562032400157058','53338365'),
+ ('673461979', 2872, '6043', '34562032400157108','36525197'),
+ ('673461958', 2859, '3164', '34562032400156977','58947831'),
+ ('673461957', 2857, '8685', '34562032400156969','15826386'),
+ ('673461944', 2853, '1073', '34562032400156910','20452195'),
+ ('673461974', 2869, '7121', '34562032400157074','32044645'),
+ ('673461973', 2868, '8022', '34562032400157066','29282044'),
+ ('673461971', 2866, '3089', '34562032400157041','66149978'),
+ ('673461969', 2865, '7555', '34562032400157033','78391293'),
+ ('673461960', 2860, '5203', '34562032400156985','37138232'),
+ ('673461952', 2855, '6915', '34562032400156936','62724661'),
+ ('673461949', 2854, '8706', '34562032400156928','5594345'),
+ ('673461966', 2863, '2496', '34562032400157017','93450666'),
+ ('673461968', 2864, '3703', '34562032400157025','23208841'),
+ ('673461963', 2862, '9364', '34562032400157009','29712130'),
+ ('673462719', 2873, '9387', '34562032400156951','50434348'),
+ ('673461962', 2861, '8441', '34562032400156993','39686909'),
+ ('673461956', 2826, '5392', '34562032400156944','5496107'),
+ ('673465284', 2694, '1523', '34562032400171349','14554994'),
+ ('673465282', 2692, '4645', '34562032400171323','24871187'),
+ ('673465283', 2693, '5253', '34562032400171331','28303238'),
+ ('673465841', 2696, '0849', '34562032400171257','21673222'),
+ ('673465258', 2679, '4140', '34562032400171174','39793881'),
+ ('673465263', 2680, '6922', '34562032400171182','12253261'),
+ ('673465265', 2681, '9112', '34562032400171190','93894366'),
+ ('673465267', 2682, '3259', '34562032400171208','2342189'),
+ ('673465268', 2683, '8540', '34562032400171216','63886925'),
+ ('673465285', 2695, '4167', '34562032400171356','79227618'),
+ ('673465270', 2684, '4292', '34562032400171224','19216349'),
+ ('673465272', 2685, '4007', '34562032400171232','14396903'),
+ ('673465273', 2686, '6894', '34562032400171240','13569394'),
+ ('673465274', 2687, '5268', '34562032400171265','59453667'),
+ ('673465275', 2688, '0232', '34562032400171273','62324713'),
+ ('673465276', 2689, '2720', '34562032400171281','65977200'),
+ ('673465843', 2698, '4773', '34562032400171364','78387158'),
+ ('673465842', 2697, '3729', '34562032400171315','94201789'),
+ ('673465280', 2691, '0503', '34562032400171307','12298533'),
+ ('673465279', 2690, '8239', '34562032400171299','76183877');
+
+UPDATE vn.deviceProductionUser
+ SET simFk = NULL
+ WHERE id IN (
+ SELECT dpu.id
+ FROM vn.deviceProductionUser dpu
+ LEFT JOIN vn.sim s ON s.code = dpu.simFk
+ WHERE s.code IS NULL
+ AND dpu.simFk IS NOT NULL
+ );
+
+ALTER TABLE vn.deviceProductionUser ADD CONSTRAINT deviceProductionUser_sim_FK
+ FOREIGN KEY (simFk) REFERENCES vn.sim(code) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+GRANT SELECT, INSERT, DELETE, UPDATE ON TABLE vn.sim TO hr;
diff --git a/db/versions/11352-blackErica/00-firstScript.sql b/db/versions/11352-blackErica/00-firstScript.sql
new file mode 100644
index 000000000..659f50161
--- /dev/null
+++ b/db/versions/11352-blackErica/00-firstScript.sql
@@ -0,0 +1,3 @@
+-- Place your SQL code here
+INSERT IGNORE INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+ VALUES('InventoryConfig', 'find', 'READ', 'ALLOW', 'ROLE', 'buyer');
\ No newline at end of file
diff --git a/db/versions/11368-whiteAspidistra/00-firstScript.sql b/db/versions/11368-whiteAspidistra/00-firstScript.sql
new file mode 100644
index 000000000..f36832805
--- /dev/null
+++ b/db/versions/11368-whiteAspidistra/00-firstScript.sql
@@ -0,0 +1,48 @@
+ USE vn;
+
+ DROP TRIGGER IF EXISTS invoiceIn_beforeUpdate;
+
+ UPDATE invoiceIn
+ SET cplusRectificationTypeFk = NULL
+ WHERE cplusRectificationTypeFk = 1;
+
+ DELETE IGNORE FROM cplusRectificationType WHERE id = 1;
+
+ UPDATE cplusRectificationType
+ SET id = 1
+ WHERE id = 3;
+
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`invoiceIn_beforeUpdate`
+ BEFORE UPDATE ON `invoiceIn`
+ FOR EACH ROW
+BEGIN
+ DECLARE vWithholdingSageFk INT;
+
+ IF NOT (NEW.supplierRef <=> OLD.supplierRef) AND NOT util.checkPrintableChars(NEW.supplierRef) THEN
+ CALL util.throw('The invoiceIn reference contains invalid characters');
+ END IF;
+
+ SET NEW.editorFk = account.myUser_getId();
+
+ IF (SELECT COUNT(*) FROM invoiceIn
+ WHERE supplierRef = NEW.supplierRef
+ AND supplierFk = NEW.supplierFk
+ AND YEAR(issued) = YEAR(NEW.issued)
+ AND id <> NEW.id
+ ) THEN
+ CALL util.throw('reference duplicated');
+ END IF;
+
+ IF NEW.supplierFk != OLD.supplierFk THEN
+ CALL supplier_checkIsActive(NEW.supplierFk);
+ SELECT withholdingSageFk INTO vWithholdingSageFk
+ FROM supplier
+ WHERE id = NEW.supplierFk;
+ SET NEW.withholdingSageFk = vWithholdingSageFk;
+ END IF;
+
+END$$
+DELIMITER ;
+
+
diff --git a/db/versions/11368-whiteAspidistra/01-acls.sql b/db/versions/11368-whiteAspidistra/01-acls.sql
new file mode 100644
index 000000000..6ac98db43
--- /dev/null
+++ b/db/versions/11368-whiteAspidistra/01-acls.sql
@@ -0,0 +1,23 @@
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+ VALUES('SiiTypeInvoiceIn', 'find', 'READ', 'ALLOW', 'ROLE', 'salesPerson');
+
+DROP TABLE IF EXISTS vn.invoiceInCorrection;
+
+CREATE TABLE `invoiceInCorrection` (
+ `correctingFk` mediumint(8) unsigned NOT NULL COMMENT 'Factura rectificativa',
+ `correctedFk` mediumint(8) unsigned NOT NULL COMMENT 'Factura rectificada',
+ `cplusRectificationTypeFk` int(10) unsigned NOT NULL,
+ `siiTypeInvoiceInFk` int(10) unsigned NOT NULL,
+ `invoiceCorrectionTypeFk` int(11) NOT NULL DEFAULT 3,
+ PRIMARY KEY (`correctingFk`),
+ KEY `invoiceInCorrection_correctedFk` (`correctedFk`),
+ KEY `invoiceInCorrection_cplusRectificationTypeFk` (`cplusRectificationTypeFk`),
+ KEY `invoiceInCorrection_siiTypeInvoiceIn` (`siiTypeInvoiceInFk`),
+ KEY `invoiceInCorrection_invoiceCorrectionTypeFk` (`invoiceCorrectionTypeFk`),
+ CONSTRAINT `invoiceInCorrection_correctedFk` FOREIGN KEY (`correctedFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `invoiceInCorrection_correctingFk` FOREIGN KEY (`correctingFk`) REFERENCES `invoiceIn` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT `invoiceInCorrection_cplusRectificationTypeFk` FOREIGN KEY (`cplusRectificationTypeFk`) REFERENCES `cplusRectificationType` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `invoiceInCorrection_invoiceCorrectionTypeFk` FOREIGN KEY (`invoiceCorrectionTypeFk`) REFERENCES `invoiceCorrectionType` (`id`) ON UPDATE CASCADE,
+ CONSTRAINT `invoiceInCorrection_siiTypeInvoiceIn` FOREIGN KEY (`siiTypeInvoiceInFk`) REFERENCES `siiTypeInvoiceIn` (`id`) ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
diff --git a/db/versions/11369-azureChrysanthemum/00-firstScript.sql b/db/versions/11369-azureChrysanthemum/00-firstScript.sql
new file mode 100644
index 000000000..3a86c0c59
--- /dev/null
+++ b/db/versions/11369-azureChrysanthemum/00-firstScript.sql
@@ -0,0 +1,5 @@
+ALTER TABLE vn.duaInvoiceIn DROP KEY IF EXISTS duaFk_UNIQUE;
+ALTER TABLE vn.duaInvoiceIn DROP KEY IF EXISTS duaInvoiceIn_unique;
+ALTER TABLE vn.duaInvoiceIn ADD CONSTRAINT duaInvoiceIn_unique
+ UNIQUE KEY (invoiceInFk);
+
diff --git a/db/versions/11371-salmonRuscus/00-firstScript.sql b/db/versions/11371-salmonRuscus/00-firstScript.sql
new file mode 100644
index 000000000..306ec451e
--- /dev/null
+++ b/db/versions/11371-salmonRuscus/00-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.route ADD dated DATE;
\ No newline at end of file
diff --git a/db/versions/11371-salmonRuscus/01-firstScript.sql b/db/versions/11371-salmonRuscus/01-firstScript.sql
new file mode 100644
index 000000000..14c8989d8
--- /dev/null
+++ b/db/versions/11371-salmonRuscus/01-firstScript.sql
@@ -0,0 +1 @@
+UPDATE vn.route SET dated = created;
\ No newline at end of file
diff --git a/db/versions/11371-salmonRuscus/02-firstScript.sql b/db/versions/11371-salmonRuscus/02-firstScript.sql
new file mode 100644
index 000000000..42666b89c
--- /dev/null
+++ b/db/versions/11371-salmonRuscus/02-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.route
+MODIFY COLUMN dated DATE NOT NULL;
\ No newline at end of file
diff --git a/db/versions/11371-salmonRuscus/03-firstScript.sql b/db/versions/11371-salmonRuscus/03-firstScript.sql
new file mode 100644
index 000000000..b7776d31d
--- /dev/null
+++ b/db/versions/11371-salmonRuscus/03-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.route
+MODIFY COLUMN created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
\ No newline at end of file
diff --git a/db/versions/11372-azureMedeola/00-firstScript.sql b/db/versions/11372-azureMedeola/00-firstScript.sql
new file mode 100644
index 000000000..53295e9f8
--- /dev/null
+++ b/db/versions/11372-azureMedeola/00-firstScript.sql
@@ -0,0 +1,2 @@
+INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
+ VALUES ('Worker','canCreateAbsenceInPast','WRITE','ALLOW','ROLE','hr');
diff --git a/db/versions/11373-pinkMastic/00-firstScript.sql b/db/versions/11373-pinkMastic/00-firstScript.sql
new file mode 100644
index 000000000..2d7cd4dc7
--- /dev/null
+++ b/db/versions/11373-pinkMastic/00-firstScript.sql
@@ -0,0 +1,107 @@
+INSERT IGNORE INTO vn.saySimpleCountry
+ SET countryFk = 1,
+ channel = '1320';
+
+UPDATE vn.saySimpleConfig
+ SET defaultChannel = '1819';
+
+INSERT IGNORE INTO pbx.prefix (country, prefix) VALUES
+ ('ES', '0034'),
+ ('IT', '0039'),
+ ('DE', '0049'),
+ ('RO', '0040'),
+ ('NL', '0031'),
+ ('BE', '0032'),
+ ('RU', '007'),
+ ('PT', '00351'),
+ ('LT', '00370'),
+ ('UA', '00380'),
+ ('CO', '0057'),
+ ('FI', '00358'),
+ ('EC', '00593'),
+ ('LB', '00961'),
+ ('IL', '00972'),
+ ('TH', '0066'),
+ ('PA', '00507'),
+ ('GB', '0044'),
+ ('FR', '0033'),
+ ('PL', '0048'),
+ ('MX', '0052'),
+ ('MA', '00212'),
+ ('AI', '001268'),
+ ('GH', '00233'),
+ ('SE', '0046'),
+ ('AE', '00971'),
+ ('KE', '00254'),
+ ('AD', '00376'),
+ ('AO', '00244'),
+ ('LU', '00352'),
+ ('BY', '00375'),
+ ('MD', '00373'),
+ ('DK', '0045'),
+ ('ET', '00251'),
+ ('AU', '0061'),
+ ('CA', '0001'),
+ ('CL', '0056'),
+ ('CN', '0086'),
+ ('CR', '00506'),
+ ('GT', '00502'),
+ ('CI', '00225'),
+ ('PE', '0051'),
+ ('LK', '0094'),
+ ('ZA', '0027'),
+ ('TR', '0090'),
+ ('ZW', '00263'),
+ ('MY', '0060'),
+ ('NZ', '0064'),
+ ('IE', '00353'),
+ ('MN', '00976'),
+ ('SV', '00503'),
+ ('ZM', '00260'),
+ ('JP', '0081'),
+ ('RW', '00250'),
+ ('AL', '00355'),
+ ('KW', '00965'),
+ ('SG', '0065'),
+ ('SR', '00597'),
+ ('KR', '0082'),
+ ('US', '0001'),
+ ('RS', '00381'),
+ ('AT', '0043'),
+ ('EG', '0020'),
+ ('LV', '00371'),
+ ('CY', '00357'),
+ ('CZ', '00420'),
+ ('BB', '001246'),
+ ('SK', '00421'),
+ ('IN', '0091'),
+ ('DZ', '00213'),
+ ('BR', '0055'),
+ ('GR', '0030'),
+ ('MC', '00377'),
+ ('SI', '00386'),
+ ('GP', '00590'),
+ ('NO', '0047'),
+ ('CH', '0041'),
+ ('AR', '0054'),
+ ('CU', '0053'),
+ ('GQ', '00240'),
+ ('GN', '00224'),
+ ('HN', '00504'),
+ ('ML', '00223'),
+ ('NI', '00505'),
+ ('PK', '0092'),
+ ('PY', '00595'),
+ ('SN', '00221'),
+ ('UY', '00598'),
+ ('VE', '0058'),
+ ('BG', '00359'),
+ ('GE', '00995'),
+ ('EE', '00372'),
+ ('SA', '00966'),
+ ('RN', '00234'),
+ ('HK', '00852'),
+ ('GI', '00350'),
+ ('CM', '00237'),
+ ('HU', '0036'),
+ ('AM', '00374');
\ No newline at end of file
diff --git a/db/versions/11375-navyIvy/00-firstScript.sql b/db/versions/11375-navyIvy/00-firstScript.sql
new file mode 100644
index 000000000..a90aaf519
--- /dev/null
+++ b/db/versions/11375-navyIvy/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.ticket DROP FOREIGN KEY tickets_zone_fk;
+ALTER TABLE vn.ticket ADD CONSTRAINT tickets_zone_fk FOREIGN KEY (zoneFk) REFERENCES vn.`zone`(id) ON DELETE SET NULL ON UPDATE CASCADE;
diff --git a/db/versions/11376-pinkBamboo/00-firstScript.sql b/db/versions/11376-pinkBamboo/00-firstScript.sql
new file mode 100644
index 000000000..0c1e71a2f
--- /dev/null
+++ b/db/versions/11376-pinkBamboo/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.`zone` MODIFY COLUMN `price` DECIMAL(10,2);
+
diff --git a/db/versions/11377-pinkCarnation/00-firstScript.sql b/db/versions/11377-pinkCarnation/00-firstScript.sql
new file mode 100644
index 000000000..fdbd7e836
--- /dev/null
+++ b/db/versions/11377-pinkCarnation/00-firstScript.sql
@@ -0,0 +1,5 @@
+-- Place your SQL code here
+
+
+ALTER TABLE vn.productionConfig ADD IF NOT EXISTS itemOrderReviewHours int(11) DEFAULT 24 NULL
+COMMENT 'Horas que no se tienen en cuenta para comprobar orden en el almacén, null para desactivar revisión';
diff --git a/db/versions/11378-orangeAsparagus/00-firstScript.sql b/db/versions/11378-orangeAsparagus/00-firstScript.sql
new file mode 100644
index 000000000..a030b7e05
--- /dev/null
+++ b/db/versions/11378-orangeAsparagus/00-firstScript.sql
@@ -0,0 +1 @@
+DROP TABLE vn.quadmindsApiConfig;
diff --git a/db/versions/11379-yellowCordyline/00-firstScript.sql b/db/versions/11379-yellowCordyline/00-firstScript.sql
new file mode 100644
index 000000000..8d90ee90c
--- /dev/null
+++ b/db/versions/11379-yellowCordyline/00-firstScript.sql
@@ -0,0 +1,20 @@
+CREATE TABLE `vn`.`osrmConfig` (
+ `id` int(10) unsigned NOT NULL,
+ `url` varchar(100) NOT NULL COMMENT 'Dirección base de la API',
+ `tolerance` decimal(6,6) NOT NULL DEFAULT 0 COMMENT 'Tolerancia entre las coordenadas enviadas y las retornadas',
+ PRIMARY KEY (`id`),
+ CONSTRAINT `osrmConfig_check` CHECK (`id` = 1)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+-- Para que no de error al añadir la FK de zone
+UPDATE vn.zone
+ SET price = 0.1
+ WHERE price = 0;
+
+ALTER TABLE vn.`zone`
+ ADD addressFk int(11) DEFAULT NULL COMMENT 'Punto de distribución de donde salen para repartir',
+ ADD CONSTRAINT zone_address_FK FOREIGN KEY (addressFk) REFERENCES vn.address(id) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+ALTER TABLE vn.zoneConfig
+ ADD defaultAddressFk int(11) DEFAULT NULL NULL COMMENT 'Punto de distribución por defecto',
+ ADD CONSTRAINT zoneConfig_address_FK FOREIGN KEY (defaultAddressFk) REFERENCES vn.address(id) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/db/versions/11379-yellowCordyline/01-secScript.sql b/db/versions/11379-yellowCordyline/01-secScript.sql
new file mode 100644
index 000000000..30479229e
--- /dev/null
+++ b/db/versions/11379-yellowCordyline/01-secScript.sql
@@ -0,0 +1,5 @@
+INSERT IGNORE INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
+ VALUES ('OsrmConfig','optimize','READ','ALLOW','ROLE','employee'),
+ ('Route', 'optimizePriority','*','ALLOW','ROLE','employee');
+INSERT IGNORE INTO vn.osrmConfig (id,url,tolerance)
+ VALUES (1,'https://router.project-osrm.org', 0.002);
diff --git a/db/versions/11384-grayAnthurium/00-firstScript.sql b/db/versions/11384-grayAnthurium/00-firstScript.sql
new file mode 100644
index 000000000..b3a7f3da2
--- /dev/null
+++ b/db/versions/11384-grayAnthurium/00-firstScript.sql
@@ -0,0 +1,3 @@
+ALTER TABLE vn.mistakeType
+ ADD `time` int(10) NULL COMMENT 'Segundos que se suelen tardar en arreglar el fallo',
+ ADD code varchar(50) DEFAULT NULL NULL AFTER id;
diff --git a/db/versions/11385-yellowOrchid/00-firstScript.sql b/db/versions/11385-yellowOrchid/00-firstScript.sql
new file mode 100644
index 000000000..287e9fcab
--- /dev/null
+++ b/db/versions/11385-yellowOrchid/00-firstScript.sql
@@ -0,0 +1,5 @@
+RENAME TABLE vn.inventoryFailure TO vn.inventoryFailure__;
+ALTER TABLE vn.inventoryFailure__ COMMENT='@deprecated 2024-12-16';
+
+RENAME TABLE vn.inventoryFailureCause TO vn.inventoryFailureCause__;
+ALTER TABLE vn.inventoryFailureCause__ COMMENT='@deprecated 2024-12-16';
diff --git a/db/versions/11387-whiteDendro/00-firstScript.sql b/db/versions/11387-whiteDendro/00-firstScript.sql
new file mode 100644
index 000000000..4e9f1d217
--- /dev/null
+++ b/db/versions/11387-whiteDendro/00-firstScript.sql
@@ -0,0 +1,8 @@
+CREATE TABLE IF NOT EXISTS vn.productionCountry(
+ countryFk MEDIUMINT(8) UNSIGNED NOT NULL,
+ volumeGrowthEstimatePercent DECIMAL(6, 2) COMMENT 'Porcentaje estimado de crecimiento del volumen',
+ PRIMARY KEY (countryFk),
+ CONSTRAINT productionCountryVolume_countryFK
+ FOREIGN KEY (countryFk) REFERENCES vn.country (id)
+ ON DELETE RESTRICT ON UPDATE CASCADE
+) COMMENT = 'Datos de producción por país'
\ No newline at end of file
diff --git a/db/versions/11390-goldenPalmetto/00-firstScript.sql b/db/versions/11390-goldenPalmetto/00-firstScript.sql
new file mode 100644
index 000000000..adcc76e4f
--- /dev/null
+++ b/db/versions/11390-goldenPalmetto/00-firstScript.sql
@@ -0,0 +1,3 @@
+
+ALTER TABLE vn.country
+ ADD CONSTRAINT country_unique_name UNIQUE KEY (name);
diff --git a/db/versions/11391-redPalmetto/00-itemAlter.sql b/db/versions/11391-redPalmetto/00-itemAlter.sql
new file mode 100644
index 000000000..fc47d5fc0
--- /dev/null
+++ b/db/versions/11391-redPalmetto/00-itemAlter.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `vn`.`item`
+ADD COLUMN `isCustomInspectionRequired` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Indicates if the item requires physical inspection at customs';
diff --git a/db/versions/11396-blueErica/00-firstScript.sql b/db/versions/11396-blueErica/00-firstScript.sql
new file mode 100644
index 000000000..b21965fe8
--- /dev/null
+++ b/db/versions/11396-blueErica/00-firstScript.sql
@@ -0,0 +1,5 @@
+DELETE FROM vn.workerMana
+ WHERE workerFk IN (
+ SELECT workerFk
+ FROM vn.workerManaExcluded
+ );
diff --git a/db/versions/11400-turquoiseChrysanthemum/00-firstScript.sql b/db/versions/11400-turquoiseChrysanthemum/00-firstScript.sql
new file mode 100644
index 000000000..f3e0355a8
--- /dev/null
+++ b/db/versions/11400-turquoiseChrysanthemum/00-firstScript.sql
@@ -0,0 +1,4 @@
+DELETE FROM salix.ACL WHERE property = 'canCreateAbsenceInPast';
+
+INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
+ VALUES ('Worker','canModifyAbsenceInPast','WRITE','ALLOW','ROLE','hr');
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 0a3892c86..52177b231 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -791,7 +791,7 @@ export default {
},
createRouteView: {
worker: 'vn-route-create vn-worker-autocomplete[ng-model="$ctrl.route.workerFk"]',
- createdDatePicker: 'vn-route-create vn-date-picker[ng-model="$ctrl.route.created"]',
+ createdDatePicker: 'vn-route-create vn-date-picker[ng-model="$ctrl.route.dated"]',
vehicleAuto: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]',
agency: 'vn-route-create vn-autocomplete[ng-model="$ctrl.route.agencyModeFk"]',
description: 'vn-route-create [ng-model="$ctrl.route.description"]',
diff --git a/front/core/components/snackbar/snackbar.js b/front/core/components/snackbar/snackbar.js
index b380c47c3..cce285d14 100644
--- a/front/core/components/snackbar/snackbar.js
+++ b/front/core/components/snackbar/snackbar.js
@@ -27,18 +27,6 @@ export default class Controller extends Component {
setTimeout(() => element.classList.add('shown'), 30);
shape.element = element;
- if (data.additionalData && this.vnToken.token) {
- this.additionalData = data.additionalData;
- let supportButton = document.createElement('i');
- supportButton.setAttribute('class', 'material-icons clickable');
- supportButton.addEventListener('click', () => this.$.supportDialog.show());
- element.appendChild(supportButton);
-
- let buttonIcon = 'support_agent';
- buttonIcon = document.createTextNode(buttonIcon);
- supportButton.appendChild(buttonIcon);
- }
-
if (shape.type)
element.classList.add(shape.type);
diff --git a/front/core/components/support-dialog/index.js b/front/core/components/support-dialog/index.js
index d15c14b4a..82f086184 100644
--- a/front/core/components/support-dialog/index.js
+++ b/front/core/components/support-dialog/index.js
@@ -9,13 +9,6 @@ export default class Controller extends Dialog {
responseHandler(response) {
if (response !== 'accept')
return super.responseHandler(response);
-
- this.$http.post('Ostickets/send-to-support', {
- reason: this.reason,
- additionalData: this.additionalData
- })
- .then(() => super.responseHandler(response))
- .then(() => this.vnApp.showSuccess(this.$t('Email sended!')));
}
}
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 6756db37d..8d5eab4bc 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -211,6 +211,7 @@
"Name should be uppercase": "Name should be uppercase",
"You cannot update these fields": "You cannot update these fields",
"CountryFK cannot be empty": "Country cannot be empty",
+ "No tickets to invoice": "There are no tickets to invoice that meet the invoicing requirements",
"You are not allowed to modify the alias": "You are not allowed to modify the alias",
"You already have the mailAlias": "You already have the mailAlias",
"This machine is already in use.": "This machine is already in use.",
@@ -246,5 +247,9 @@
"ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}",
"The raid information is not correct": "The raid information is not correct",
"Payment method is required": "Payment method is required",
- "Sales already moved": "Sales already moved"
+ "Sales already moved": "Sales already moved",
+ "Holidays to past days not available": "Holidays to past days not available",
+ "Price cannot be blank": "Price cannot be blank",
+ "There are tickets to be invoiced": "There are tickets to be invoiced",
+ "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent"
}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 0b10d4702..cde81e0cb 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -339,7 +339,7 @@
"Incorrect pin": "Pin incorrecto.",
"You already have the mailAlias": "Ya tienes este alias de correo",
"The alias cant be modified": "Este alias de correo no puede ser modificado",
- "No tickets to invoice": "No hay tickets para facturar",
+ "No tickets to invoice": "No hay tickets para facturar que cumplan los requisitos de facturación",
"this warehouse has not dms": "El Almacén no acepta documentos",
"This ticket already has a cmr saved": "Este ticket ya tiene un cmr guardado",
"Name should be uppercase": "El nombre debe ir en mayúscula",
@@ -388,7 +388,15 @@
"You do not have permission to modify the booked field": "No tienes permisos para modificar el campo contabilizada",
"ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}",
"The web user's email already exists": "El correo del usuario web ya existe",
- "Sales already moved": "Ya han sido transferidas",
- "The raid information is not correct": "La información de la redada no es correcta"
+ "Sales already moved": "Ya han sido transferidas",
+ "The raid information is not correct": "La información de la redada no es correcta",
+ "No trips found because input coordinates are not connected": "No se encontraron rutas porque las coordenadas de entrada no están conectadas",
+ "This request is not supported": "Esta solicitud no es compatible",
+ "Invalid options or too many coordinates": "Opciones invalidas o demasiadas coordenadas",
+ "No address has coordinates": "Ninguna dirección tiene coordenadas",
+ "An item type with the same code already exists": "Un tipo con el mismo código ya existe",
+ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles",
+ "All tickets have a route order": "Todos los tickets tienen orden de ruta",
+ "Price cannot be blank": "Price cannot be blank",
+ "There are tickets to be invoiced": "La zona tiene tickets por facturar"
}
-
diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json
index 9941358be..f49196a8f 100644
--- a/loopback/locale/fr.json
+++ b/loopback/locale/fr.json
@@ -339,7 +339,7 @@
"Incorrect pin": "Pin incorrect.",
"You already have the mailAlias": "Vous avez déjà cet alias de courrier",
"The alias cant be modified": "Cet alias de courrier ne peut pas être modifié",
- "No tickets to invoice": "Pas de tickets à facturer",
+ "No tickets to invoice": "Il n'y a pas de tickets à facturer qui répondent aux exigences de facturation",
"this warehouse has not dms": "L'entrepôt n'accepte pas les documents",
"This ticket already has a cmr saved": "Ce ticket a déjà un cmr enregistré",
"Name should be uppercase": "Le nom doit être en majuscules",
diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json
index e84b30f3d..e2374d35f 100644
--- a/loopback/locale/pt.json
+++ b/loopback/locale/pt.json
@@ -339,7 +339,7 @@
"Incorrect pin": "PIN incorreto.",
"You already have the mailAlias": "Você já tem o alias de e-mail",
"The alias cant be modified": "O alias não pode ser modificado",
- "No tickets to invoice": "Não há tickets para faturar",
+ "No tickets to invoice": "Não há bilhetes para faturar que atendam aos requisitos de faturamento",
"this warehouse has not dms": "Este armazém não tem DMS",
"This ticket already has a cmr saved": "Este ticket já tem um CMR salvo",
"Name should be uppercase": "O nome deve estar em maiúsculas",
diff --git a/modules/account/back/methods/account/sync.js b/modules/account/back/methods/account/sync.js
index 1026c5020..b38e4dd37 100644
--- a/modules/account/back/methods/account/sync.js
+++ b/modules/account/back/methods/account/sync.js
@@ -29,14 +29,14 @@ module.exports = Self => {
const models = Self.app.models;
const myOptions = {};
let tx;
-
+
if (typeof options == 'object')
Object.assign(myOptions, options);
if (!myOptions.transaction) {
tx = await Self.beginTransaction({});
myOptions.transaction = tx;
- };
+ }
try {
const user = await models.VnUser.findOne({
diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js
index f60b6572e..bacdd4021 100644
--- a/modules/claim/back/methods/claim/filter.js
+++ b/modules/claim/back/methods/claim/filter.js
@@ -80,6 +80,12 @@ module.exports = Self => {
description: 'The claimResponsible id',
http: {source: 'query'}
},
+ {
+ arg: 'zoneFk',
+ type: 'string',
+ description: 'The zone name',
+ http: {source: 'query'}
+ },
{
arg: 'myTeam',
type: 'boolean',
@@ -174,6 +180,8 @@ module.exports = Self => {
to.setHours(23, 59, 59, 999);
return {'cl.created': {between: [value, to]}};
+ case 'zoneFk':
+ return {'t.zoneFk': value};
case 'myTeam':
if (value)
return {'cl.workerFk': {inq: teamMembersId}};
@@ -195,11 +203,15 @@ module.exports = Self => {
u.name AS workerName,
cs.code stateCode,
cs.description stateDescription,
- cl.created
+ cl.created,
+ z.name zoneName,
+ z.id zoneId
FROM claim cl
LEFT JOIN client c ON c.id = cl.clientFk
LEFT JOIN account.user u ON u.id = cl.workerFk
- LEFT JOIN claimState cs ON cs.id = cl.claimStateFk`
+ LEFT JOIN claimState cs ON cs.id = cl.claimStateFk
+ LEFT JOIN ticket t ON t.id = cl.ticketFk
+ LEFT JOIN zone z ON z.id = t.zoneFk`
);
stmt.merge(conn.makeSuffix(filter));
diff --git a/modules/client/back/methods/client/canBeInvoiced.js b/modules/client/back/methods/client/canBeInvoiced.js
index cdb865500..536606b0b 100644
--- a/modules/client/back/methods/client/canBeInvoiced.js
+++ b/modules/client/back/methods/client/canBeInvoiced.js
@@ -2,7 +2,7 @@ const UserError = require('vn-loopback/util/user-error');
module.exports = function(Self) {
Self.remoteMethod('canBeInvoiced', {
- description: 'Change property isEqualizated in all client addresses',
+ description: 'Check if a client can be invoiced',
accessType: 'READ',
accepts: [
{
@@ -38,7 +38,7 @@ module.exports = function(Self) {
Object.assign(myOptions, options);
const client = await models.Client.findById(id, {
- fields: ['id', 'isTaxDataChecked', 'hasToInvoice', 'payMethodFk'],
+ fields: ['id', 'isTaxDataChecked', 'hasToInvoice', 'payMethodFk', 'isActive'],
include:
{
relation: 'payMethod',
@@ -53,9 +53,6 @@ module.exports = function(Self) {
if (client.payMethod().code === 'wireTransfer' && !company.supplierAccountFk)
throw new UserError('The company has not informed the supplier account for bank transfers');
- if (client.isTaxDataChecked && client.hasToInvoice)
- return true;
-
- return false;
+ return client.isTaxDataChecked && client.hasToInvoice && client.isActive;
};
};
diff --git a/modules/client/back/methods/client/specs/canBeInvoiced.spec.js b/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
index 397be3c92..4012b7409 100644
--- a/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
+++ b/modules/client/back/methods/client/specs/canBeInvoiced.spec.js
@@ -8,6 +8,8 @@ describe('client canBeInvoiced()', () => {
const activeCtx = {
accessToken: {userId: userId}
};
+ let tx;
+ let options;
beforeAll(async() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
@@ -15,60 +17,45 @@ describe('client canBeInvoiced()', () => {
});
});
+ beforeEach(async() => {
+ tx = await models.Client.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
it('should return falsy for a client without the data checked', async() => {
- const tx = await models.Client.beginTransaction({});
+ const client = await models.Client.findById(clientId, null, options);
+ await client.updateAttribute('isTaxDataChecked', false, options);
- try {
- const options = {transaction: tx};
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
- const client = await models.Client.findById(clientId, null, options);
- await client.updateAttribute('isTaxDataChecked', false, options);
+ expect(canBeInvoiced).toEqual(false);
+ });
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
+ it('should return falsy for a client not active', async() => {
+ const client = await models.Client.findById(clientId, null, options);
+ await client.updateAttribute('isActive', false, options);
- expect(canBeInvoiced).toEqual(false);
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
+ expect(canBeInvoiced).toEqual(false);
});
it('should return falsy for a client with invoicing disabled', async() => {
- const tx = await models.Client.beginTransaction({});
+ const client = await models.Client.findById(clientId, null, options);
+ await client.updateAttribute('hasToInvoice', false, options);
- try {
- const options = {transaction: tx};
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
- const client = await models.Client.findById(clientId, null, options);
- await client.updateAttribute('hasToInvoice', false, options);
-
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
-
- expect(canBeInvoiced).toEqual(false);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
+ expect(canBeInvoiced).toEqual(false);
});
it('should return truthy for an invoiceable client', async() => {
- const tx = await models.Client.beginTransaction({});
+ const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
- try {
- const options = {transaction: tx};
-
- const canBeInvoiced = await models.Client.canBeInvoiced(clientId, companyId, options);
-
- expect(canBeInvoiced).toEqual(true);
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
+ expect(canBeInvoiced).toEqual(true);
});
});
diff --git a/modules/client/back/methods/client/specs/updateAddress.spec.js b/modules/client/back/methods/client/specs/updateAddress.spec.js
index 68981f8b7..0453332d7 100644
--- a/modules/client/back/methods/client/specs/updateAddress.spec.js
+++ b/modules/client/back/methods/client/specs/updateAddress.spec.js
@@ -1,7 +1,7 @@
const models = require('vn-loopback/server/server').models;
describe('Address updateAddress', () => {
- const clientId = 1101;
- const addressId = 1;
+ const clientId = 1102;
+ const addressId = 2;
const provinceId = 5;
const incotermsId = 'FAS';
const customAgentOneId = 1;
diff --git a/modules/client/back/methods/client/summary.js b/modules/client/back/methods/client/summary.js
index 9242fbd44..9c1420b61 100644
--- a/modules/client/back/methods/client/summary.js
+++ b/modules/client/back/methods/client/summary.js
@@ -54,7 +54,7 @@ module.exports = Self => {
{
relation: 'country',
scope: {
- fields: ['id', 'name'],
+ fields: ['id', 'name', 'code'],
include: {
relation: 'saySimpleCountry',
}
diff --git a/modules/client/back/methods/client/updateAddress.js b/modules/client/back/methods/client/updateAddress.js
index 7342b28f1..efef83d6b 100644
--- a/modules/client/back/methods/client/updateAddress.js
+++ b/modules/client/back/methods/client/updateAddress.js
@@ -72,6 +72,14 @@ module.exports = function(Self) {
{
arg: 'isLogifloraAllowed',
type: 'boolean'
+ },
+ {
+ arg: 'longitude',
+ type: 'any',
+ },
+ {
+ arg: 'latitude',
+ type: 'any',
}
],
returns: {
diff --git a/modules/client/back/models/address.json b/modules/client/back/models/address.json
index e8bf8d8a0..2d11b7745 100644
--- a/modules/client/back/models/address.json
+++ b/modules/client/back/models/address.json
@@ -84,6 +84,11 @@
"type": "belongsTo",
"model": "CustomsAgent",
"foreignKey": "customsAgentFk"
+ },
+ "postcode": {
+ "type": "belongsTo",
+ "model": "Postcode",
+ "foreignKey": "postalCode"
}
}
}
diff --git a/modules/entry/back/methods/entry/buyLabelSupplier.js b/modules/entry/back/methods/entry/buyLabelSupplier.js
index 61938f2f8..23806f561 100644
--- a/modules/entry/back/methods/entry/buyLabelSupplier.js
+++ b/modules/entry/back/methods/entry/buyLabelSupplier.js
@@ -9,6 +9,10 @@ module.exports = Self => {
required: true,
description: 'The entry id',
http: {source: 'path'}
+ }, {
+ arg: 'showEntryLines',
+ type: 'boolean',
+ required: false
}
],
returns: [
diff --git a/modules/entry/back/methods/entry/print.js b/modules/entry/back/methods/entry/labelSupplier.js
similarity index 85%
rename from modules/entry/back/methods/entry/print.js
rename to modules/entry/back/methods/entry/labelSupplier.js
index 5b9de9a69..07107d032 100644
--- a/modules/entry/back/methods/entry/print.js
+++ b/modules/entry/back/methods/entry/labelSupplier.js
@@ -1,6 +1,6 @@
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
- Self.remoteMethodCtx('print', {
+ Self.remoteMethodCtx('labelSupplier', {
description: 'Print stickers of all entries',
accessType: 'READ',
accepts: [
@@ -28,13 +28,13 @@ module.exports = Self => {
}
],
http: {
- path: '/:id/print',
+ path: '/:id/labelSupplier',
verb: 'GET'
},
accessScopes: ['DEFAULT', 'read:multimedia']
});
- Self.print = async function(ctx, id, options) {
+ Self.labelSupplier = async function(ctx, id, options) {
const models = Self.app.models;
const myOptions = {};
if (typeof options == 'object')
@@ -47,8 +47,8 @@ module.exports = Self => {
for (const buy of buys) {
if (buy.stickers < 1) continue;
- ctx.args.id = buy.id;
- const pdfBuffer = await models.Entry.buyLabel(ctx, myOptions);
+ ctx.args = {...ctx.args, id: buy.id, showEntryLines: true};
+ const pdfBuffer = await models.Entry.buyLabelSupplier(ctx, myOptions);
await merger.add(new Uint8Array(pdfBuffer[0]));
}
diff --git a/modules/entry/back/methods/entry/specs/filter.spec.js b/modules/entry/back/methods/entry/specs/filter.spec.js
index 4bf5127b0..b139b00b6 100644
--- a/modules/entry/back/methods/entry/specs/filter.spec.js
+++ b/modules/entry/back/methods/entry/specs/filter.spec.js
@@ -38,8 +38,9 @@ describe('Entry filter()', () => {
};
const result = await models.Entry.filter(ctx, options);
+ const resultWithCurrency = result.filter(entry => entry.currencyFk === 1);
- expect(result.length).toEqual(12);
+ expect(result.length).toEqual(resultWithCurrency.length);
await tx.rollback();
} catch (e) {
@@ -141,18 +142,21 @@ describe('Entry filter()', () => {
it('should return the entry matching the company', async() => {
const tx = await models.Entry.beginTransaction({});
const options = {transaction: tx};
+ const companyFk = 442;
try {
const ctx = {
args: {
- companyFk: 442
+ companyFk
},
req: {accessToken: {userId: 9}}
};
const result = await models.Entry.filter(ctx, options);
- expect(result.length).toEqual(11);
+ const resultWithCurrency = result.filter(entry => entry.companyFk === companyFk);
+
+ expect(result.length).toEqual(resultWithCurrency.length);
await tx.rollback();
} catch (e) {
diff --git a/modules/entry/back/model-config.json b/modules/entry/back/model-config.json
index 5c45b6e07..49c2df2db 100644
--- a/modules/entry/back/model-config.json
+++ b/modules/entry/back/model-config.json
@@ -28,5 +28,8 @@
},
"StockBought": {
"dataSource": "vn"
+ },
+ "InventoryConfig": {
+ "dataSource": "vn"
}
}
diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js
index 593f3fdcc..55a23bb0a 100644
--- a/modules/entry/back/models/entry.js
+++ b/modules/entry/back/models/entry.js
@@ -12,7 +12,8 @@ module.exports = Self => {
require('../methods/entry/addFromPackaging')(Self);
require('../methods/entry/addFromBuy')(Self);
require('../methods/entry/buyLabel')(Self);
- require('../methods/entry/print')(Self);
+ require('../methods/entry/labelSupplier')(Self);
+ require('../methods/entry/buyLabelSupplier')(Self);
Self.observe('before save', async function(ctx, options) {
if (ctx.isNewInstance) return;
diff --git a/modules/entry/back/models/inventory-config.json b/modules/entry/back/models/inventory-config.json
new file mode 100644
index 000000000..caa39db88
--- /dev/null
+++ b/modules/entry/back/models/inventory-config.json
@@ -0,0 +1,18 @@
+{
+ "name": "InventoryConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "inventoryConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true
+ },
+ "supplierFk": {
+ "type": "number"
+ }
+ }
+}
diff --git a/modules/invoiceIn/back/locale/invoiceIn/en.yml b/modules/invoiceIn/back/locale/invoiceIn/en.yml
index 9e94eba0d..f590f9656 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/en.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/en.yml
@@ -17,4 +17,6 @@ columns:
isVatDeductible: is VAT deductible
withholdingSageFk: withholding
expenseFkDeductible: expense deductible
- editorFk: editor
\ No newline at end of file
+ editorFk: editor
+ siiTrasCendencyInvoiceInFk: SII tax regime
+ siiTypeInvoiceInFk: SII Type
\ No newline at end of file
diff --git a/modules/invoiceIn/back/locale/invoiceIn/es.yml b/modules/invoiceIn/back/locale/invoiceIn/es.yml
index bd64c4327..64ded6aca 100644
--- a/modules/invoiceIn/back/locale/invoiceIn/es.yml
+++ b/modules/invoiceIn/back/locale/invoiceIn/es.yml
@@ -5,7 +5,7 @@ columns:
serial: serie
supplierFk: proveedor
issued: fecha emisión
- supplierRef: referéncia proveedor
+ supplierRef: referencia proveedor
isBooked: facturado
currencyFk: moneda
created: creado
@@ -17,4 +17,6 @@ columns:
isVatDeductible: impuesto deducible
withholdingSageFk: código de retención
expenseFkDeductible: gasto deducible
- editorFk: editor
\ No newline at end of file
+ editorFk: editor
+ siiTrasCendencyInvoiceInFk: régimen fiscal SII
+ siiTypeInvoiceInFk: tipo SII
\ No newline at end of file
diff --git a/modules/invoiceIn/back/methods/invoice-in/corrective.js b/modules/invoiceIn/back/methods/invoice-in/corrective.js
index 05f632bcd..e7088d201 100644
--- a/modules/invoiceIn/back/methods/invoice-in/corrective.js
+++ b/modules/invoiceIn/back/methods/invoice-in/corrective.js
@@ -44,7 +44,7 @@ module.exports = Self => {
correctingFk: clone.id,
correctedFk: id,
cplusRectificationTypeFk: invoiceType,
- siiTypeInvoiceOutFk: invoiceClass,
+ siiTypeInvoiceInFk: invoiceClass,
invoiceCorrectionTypeFk: invoiceReason
}, myOptions);
diff --git a/modules/invoiceIn/back/methods/invoice-in/filter.js b/modules/invoiceIn/back/methods/invoice-in/filter.js
index 936f7bb6c..f081368e4 100644
--- a/modules/invoiceIn/back/methods/invoice-in/filter.js
+++ b/modules/invoiceIn/back/methods/invoice-in/filter.js
@@ -91,6 +91,10 @@ module.exports = Self => {
{
arg: 'supplierActivityFk',
type: 'string',
+ },
+ {
+ arg: 'companyFk',
+ type: 'number',
}
],
returns: {
@@ -161,8 +165,8 @@ module.exports = Self => {
: {'ii.id': {nin: correcteds.map(x => x.correctingFk)}};
case 'correctedFk':
return {'ii.id': {inq: correctings.map(x => x.correctingFk)}};
- case 'supplierActivityFk':
- return {'s.supplierActivityFk': value};
+ case 'companyFk':
+ return {'ii.companyFk': value};
}
});
@@ -184,7 +188,9 @@ module.exports = Self => {
s.name supplierName,
s.account,
SUM(iid.amount) amount,
- sub.code awbCode
+ sub.code awbCode,
+ c.code,
+ MIN(iid.dueDated) dueDated
FROM invoiceIn ii
JOIN supplier s ON s.id = ii.supplierFk
LEFT JOIN invoiceInDueDay iid ON iid.invoiceInFk = ii.id
@@ -199,7 +205,8 @@ module.exports = Self => {
GROUP BY de.duaFk
) sub ON sub.duaFk = d.id
LEFT JOIN company co ON co.id = ii.companyFk
- LEFT JOIN dms dm ON dm.id = ii.docFk`
+ LEFT JOIN dms dm ON dm.id = ii.docFk
+ JOIN company c ON c.id = ii.companyFk`,
);
const sqlWhere = conn.makeWhere(filter.where);
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js
index c63f02439..aee8d3f2c 100644
--- a/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/corrective.spec.js
@@ -15,11 +15,11 @@ describe('invoiceIn corrective()', () => {
await tx.rollback();
});
- it('La función corrective debería devolver un id cuando se ejecuta correctamente', async() => {
+ it('should return an id when executed correctly', async() => {
const originalId = 1;
const invoiceReason = 3;
const invoiceType = 2;
- const invoiceClass = 1;
+ const invoiceClass = 8;
const cloneId = await models.InvoiceIn.corrective(ctx,
originalId, invoiceReason, invoiceType, invoiceClass, options);
@@ -30,7 +30,7 @@ describe('invoiceIn corrective()', () => {
}, options);
expect(correction.cplusRectificationTypeFk).toEqual(invoiceType);
- expect(correction.siiTypeInvoiceOutFk).toEqual(invoiceClass);
+ expect(correction.siiTypeInvoiceInFk).toEqual(invoiceClass);
expect(correction.invoiceCorrectionTypeFk).toEqual(invoiceReason);
});
});
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
index 48310b32a..beaa608e6 100644
--- a/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/filter.spec.js
@@ -166,4 +166,21 @@ describe('InvoiceIn filter()', () => {
throw e;
}
});
+
+ it('should return the invoice in matching companyFk', async() => {
+ const tx = await models.InvoiceIn.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const company = await models.Company.findOne({}, options);
+ const invoicesByCompany = await models.InvoiceIn.find({where: {companyFk: company.id}}, options);
+ const filteredInvoices = await models.InvoiceIn.filter({args: {companyFk: company.id}}, {}, options);
+
+ expect(filteredInvoices.length).toEqual(invoicesByCompany.length);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
});
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/invoiceIn.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/invoiceIn.spec.js
new file mode 100644
index 000000000..a83aad3b2
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/invoiceIn.spec.js
@@ -0,0 +1,63 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('invoiceIn', () => {
+ let options;
+ let tx;
+ const invoiceId = 1;
+ const supplierId = 791;
+ const currencyId = 1;
+ const companyId = 442;
+
+ beforeEach(async() => {
+ tx = await models.InvoiceIn.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ it('should allow insert for new instance', async() => {
+ const newInvoice = {
+ supplierFk: supplierId,
+ issued: Date.vnNew(),
+ operated: Date.vnNew(),
+ currencyFk: currencyId,
+ companyFk: companyId,
+ isBooked: false
+ };
+
+ const createdInvoice = await models.InvoiceIn.create(newInvoice, options);
+
+ expect(createdInvoice).toBeDefined();
+ expect(createdInvoice.id).toBeDefined();
+ });
+
+ it('should throw an error if trying to update a booked invoice', async() => {
+ const invoice = await models.InvoiceIn.findById(invoiceId, null, options);
+ await invoice.updateAttribute('isBooked', true, options);
+
+ let error;
+ try {
+ await invoice.updateAttribute('supplierFk', supplierId, options);
+ } catch (err) {
+ error = err;
+ }
+
+ expect(error.message).toBe('InvoiceIn is already booked');
+ });
+
+ it('should throw an error if trying to delete a booked invoice', async() => {
+ const invoice = await models.InvoiceIn.findById(invoiceId, null, options);
+ await invoice.updateAttribute('isBooked', true, options);
+
+ let error;
+ try {
+ await models.InvoiceIn.deleteById(invoiceId, options);
+ } catch (err) {
+ error = err;
+ }
+
+ expect(error.message).toBe('InvoiceIn is already booked');
+ });
+});
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/invoiceInTax.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/invoiceInTax.spec.js
new file mode 100644
index 000000000..e822189bd
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/invoiceInTax.spec.js
@@ -0,0 +1,74 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('invoiceInTax', () => {
+ let options;
+ let tx;
+ const invoiceInId = 1;
+ const invoiceInTaxId = 1;
+ beforeEach(async() => {
+ tx = await models.InvoiceInTax.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ it('should throw an error if trying to save a tax from a booked invoice', async() => {
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInId, null, options);
+ await invoiceIn.updateAttributes({isBooked: true}, options);
+ const invoiceInTax = await models.InvoiceInTax.findById(invoiceInTaxId, null, options);
+ let error;
+ try {
+ await invoiceInTax.updateAttribute('taxableBase', 100, options);
+ } catch (err) {
+ error = err;
+ }
+
+ expect(error.message).toBe('InvoiceIn is already booked');
+ });
+
+ it('should allow save if the invoice is not booked', async() => {
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInId, null, options);
+ await invoiceIn.updateAttribute('isBooked', false, options);
+
+ const invoiceInTax = await models.InvoiceInTax.findById(invoiceInTaxId, null, options);
+ await invoiceInTax.updateAttribute('taxableBase', 100, options);
+
+ const updatedInvoiceInTax = await models.InvoiceInTax.findById(invoiceInTaxId, null, options);
+
+ expect(updatedInvoiceInTax.taxableBase).toBe(100);
+ });
+
+ it('should throw an error if trying to delete a tax from a booked invoice', async() => {
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInId, null, options);
+ await invoiceIn.updateAttribute('isBooked', true, options);
+
+ let error;
+ try {
+ await models.InvoiceInTax.destroyById(invoiceInTaxId, options);
+ } catch (err) {
+ error = err;
+ }
+
+ expect(error).toBeDefined();
+ expect(error.message).toBe('InvoiceIn is already booked');
+ });
+
+ it('should allow delete if the invoice is not booked', async() => {
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInId, null, options);
+ await invoiceIn.updateAttribute('isBooked', false, options);
+
+ let error;
+ try {
+ await models.InvoiceInTax.destroyById(invoiceInTaxId, options);
+ } catch (err) {
+ error = err;
+ }
+
+ const deletedInvoiceInTax = await models.InvoiceInTax.findById(invoiceInTaxId, null, options);
+
+ expect(error).toBeUndefined();
+ expect(deletedInvoiceInTax).toBeNull();
+ });
+});
diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/updateInvoiceIn.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/updateInvoiceIn.spec.js
new file mode 100644
index 000000000..773e2ac2f
--- /dev/null
+++ b/modules/invoiceIn/back/methods/invoice-in/specs/updateInvoiceIn.spec.js
@@ -0,0 +1,59 @@
+const models = require('vn-loopback/server/server').models;
+
+const invoiceInId = 1;
+const supplierId = 791;
+describe('invoiceIn updateInvoiceIn()', () => {
+ const ctx = beforeAll.getCtx();
+ let options;
+ let tx;
+
+ beforeEach(async() => {
+ options = {transaction: tx};
+ tx = await models.Sale.beginTransaction({});
+ options.transaction = tx;
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ it('should update the invoice', async() => {
+ const invoiceBefore = await models.InvoiceIn.findById(invoiceInId, null, options);
+ await update(ctx, options);
+ const invoiceAfter = await models.InvoiceIn.findById(invoiceInId, null, options);
+
+ expect(invoiceAfter.supplierFk).not.toBe(invoiceBefore.supplierFk);
+ expect(invoiceAfter.supplierFk).toBe(supplierId);
+ });
+
+ it('should not update the invoice if is booked', async() => {
+ let error;
+ try {
+ await models.InvoiceIn.toBook(ctx, invoiceInId, options);
+ await update(ctx, options);
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error.message).toBe('InvoiceIn is already booked');
+ });
+});
+
+async function update(ctx, opts) {
+ const supplierRef = 'mockRef';
+ const currencyId = 1;
+ await models.InvoiceIn.updateInvoiceIn(ctx,
+ invoiceInId,
+ supplierId,
+ supplierRef,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ currencyId,
+ undefined,
+ undefined,
+ opts);
+}
diff --git a/modules/invoiceIn/back/methods/invoice-in/summary.js b/modules/invoiceIn/back/methods/invoice-in/summary.js
index fe198b2b4..b3fd9ee97 100644
--- a/modules/invoiceIn/back/methods/invoice-in/summary.js
+++ b/modules/invoiceIn/back/methods/invoice-in/summary.js
@@ -37,7 +37,13 @@ module.exports = Self => {
{
relation: 'supplier',
scope: {
- fields: ['id', 'name']
+ fields: ['id', 'name', 'isVies', 'countryFk'],
+ include: [{
+ relation: 'country',
+ scope: {
+ fields: ['id', 'code']
+ }
+ }]
}
},
{
diff --git a/modules/invoiceIn/back/methods/invoice-in/toUnbook.js b/modules/invoiceIn/back/methods/invoice-in/toUnbook.js
index a697e9ddc..c27354d73 100644
--- a/modules/invoiceIn/back/methods/invoice-in/toUnbook.js
+++ b/modules/invoiceIn/back/methods/invoice-in/toUnbook.js
@@ -52,7 +52,8 @@ module.exports = Self => {
accountingEntries = await models.Xdiario.count({ASIEN: asien}, myOptions);
await models.Xdiario.destroyAll({ASIEN: asien}, myOptions);
- await Self.updateAll({id: invoiceInId}, {isBooked: false}, myOptions);
+ const invoiceIn = await Self.findById(invoiceInId, myOptions);
+ await invoiceIn.updateAttribute('isBooked', false, myOptions);
} else {
const linkedBookEntry = await models.Xdiario.findOne({
fields: ['ASIEN'],
diff --git a/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js b/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js
index 92a1ba8ee..2f1b4caca 100644
--- a/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js
+++ b/modules/invoiceIn/back/methods/invoice-in/updateInvoiceIn.js
@@ -82,7 +82,7 @@ module.exports = Self => {
try {
const invoiceIn = await Self.findById(id, null, myOptions);
- invoiceIn.updateAttributes({supplierFk,
+ await invoiceIn.updateAttributes({supplierFk,
supplierRef,
issued,
operated,
@@ -94,6 +94,7 @@ module.exports = Self => {
companyFk,
withholdingSageFk
}, myOptions);
+
if (tx) await tx.commit();
return invoiceIn;
} catch (e) {
diff --git a/modules/invoiceIn/back/models/invoice-in-correction.json b/modules/invoiceIn/back/models/invoice-in-correction.json
index 52e16d420..d353f9e98 100644
--- a/modules/invoiceIn/back/models/invoice-in-correction.json
+++ b/modules/invoiceIn/back/models/invoice-in-correction.json
@@ -28,11 +28,10 @@
"model": "InvoiceCorrectionType",
"foreignKey": "invoiceCorrectionTypeFk"
},
- "siiTypeInvoiceOut": {
+ "siiTypeInvoiceIn": {
"type": "belongsTo",
- "model": "SiiTypeInvoiceOut",
- "foreignKey": "siiTypeInvoiceOutFk"
+ "model": "SiiTypeInvoiceIn",
+ "foreignKey": "siiTypeInvoiceInFk"
}
-
}
}
\ No newline at end of file
diff --git a/modules/invoiceIn/back/models/invoice-in-tax.js b/modules/invoiceIn/back/models/invoice-in-tax.js
new file mode 100644
index 000000000..ce33fe18f
--- /dev/null
+++ b/modules/invoiceIn/back/models/invoice-in-tax.js
@@ -0,0 +1,18 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.observe('before save', async function(ctx) {
+ if (ctx.isNewInstance) return;
+
+ const models = Self.app.models;
+ const invoiceIn = await models.InvoiceIn.findById(ctx.currentInstance.invoiceInFk, null, ctx.options);
+ if (invoiceIn.isBooked) throw new UserError('InvoiceIn is already booked');
+ });
+
+ Self.observe('before delete', async function(ctx) {
+ const models = Self.app.models;
+ const invoiceInTax = await Self.findById(ctx.where.id, null, ctx.options);
+ const invoiceIn = await models.InvoiceIn.findById(invoiceInTax.invoiceInFk, null, ctx.options);
+ if (invoiceIn.isBooked) throw new UserError('InvoiceIn is already booked');
+ });
+};
diff --git a/modules/invoiceIn/back/models/invoice-in-tax.json b/modules/invoiceIn/back/models/invoice-in-tax.json
index 53b5548b6..256ee0553 100644
--- a/modules/invoiceIn/back/models/invoice-in-tax.json
+++ b/modules/invoiceIn/back/models/invoice-in-tax.json
@@ -22,12 +22,11 @@
"type": "number"
},
"expenseFk": {
- "type": "number"
+ "type": "string"
},
"created": {
"type": "date"
}
-
},
"relations": {
"invoiceIn": {
@@ -51,4 +50,4 @@
"foreignKey": "transactionTypeSageFk"
}
}
-}
+}
\ No newline at end of file
diff --git a/modules/invoiceIn/back/models/invoice-in.js b/modules/invoiceIn/back/models/invoice-in.js
index 1e69c0ef8..ca506b54d 100644
--- a/modules/invoiceIn/back/models/invoice-in.js
+++ b/modules/invoiceIn/back/models/invoice-in.js
@@ -19,4 +19,25 @@ module.exports = Self => {
return new UserError(`This invoice has a linked vehicle.`);
return err;
});
+
+ Self.observe('before save', async function(ctx) {
+ if (ctx.isNewInstance) return;
+
+ const changes = ctx.data || ctx.instance;
+ const orgData = ctx.currentInstance;
+ let isNotEditable = orgData.isBooked || (!orgData.isBooked && changes.isBooked);
+
+ if (isNotEditable) {
+ for (const [key, value] of Object.entries(changes)) {
+ if (key !== 'isBooked' && value !== orgData[key])
+ throw new UserError('InvoiceIn is already booked');
+ }
+ }
+ });
+
+ Self.observe('before delete', async function(ctx) {
+ const invoiceIn = await Self.findById(ctx.where.id, null, ctx.options);
+ if (invoiceIn.isBooked) throw new UserError('InvoiceIn is already booked');
+ });
};
+
diff --git a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
index 00757d1ad..357edbde9 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js
@@ -52,7 +52,6 @@ module.exports = Self => {
}
try {
- // Packaging liquidation
const vIsAllInvoiceable = false;
await Self.rawSql('CALL ticketPackaging_add(?, ?, ?, ?, ?)', [
clientId,
@@ -78,9 +77,6 @@ module.exports = Self => {
AND (t.clientFk = ? OR ? IS NULL )
AND t.companyFk = ?
AND t.currencyFk = ?
- AND c.hasToInvoice
- AND c.isTaxDataChecked
- AND c.isActive
AND NOT t.isDeleted
GROUP BY IF(c.hasToInvoiceByAddress, a.id, c.id)
HAVING SUM(t.totalWithVat) > 0;`;
diff --git a/modules/invoiceOut/back/methods/invoiceOut/filter.js b/modules/invoiceOut/back/methods/invoiceOut/filter.js
index 99a80c169..ab6782140 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/filter.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/filter.js
@@ -14,6 +14,12 @@ module.exports = Self => {
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
http: {source: 'query'}
},
+ {
+ arg: 'id',
+ type: 'number',
+ description: 'The invoiceOut id',
+ http: {source: 'query'}
+ },
{
arg: 'search',
type: 'string',
@@ -73,6 +79,12 @@ module.exports = Self => {
type: 'date',
description: 'The due date filter',
http: {source: 'query'}
+ },
+ {
+ arg: 'customsAgentFk',
+ type: 'integer',
+ description: 'The customsAgent id',
+ http: {source: 'query'}
}
],
returns: {
@@ -106,12 +118,15 @@ module.exports = Self => {
return {'i.created': value};
case 'clientFk':
return {'i.clientFk': value};
+ case 'id':
+ return {'i.id': value};
case 'fi':
return {'c.fi': value};
case 'amount':
case 'companyFk':
case 'issued':
case 'dued':
+ case 'customsAgentFk':
param = `i.${param}`;
return {[param]: value};
}
@@ -131,11 +146,14 @@ module.exports = Self => {
i.dued,
i.clientFk,
i.hasPdf,
+ i.customsAgentFk,
c.socialName AS clientSocialName,
- co.code AS companyCode
+ co.code AS companyCode,
+ ca.fiscalName AS customsAgentName
FROM invoiceOut i
LEFT JOIN client c ON c.id = i.clientFk
- LEFT JOIN company co ON co.id = i.companyFk`
+ LEFT JOIN company co ON co.id = i.companyFk
+ LEFT JOIN customsAgent ca ON ca.id = i.customsAgentFk`
);
stmt.merge(conn.makeSuffix(filter));
diff --git a/modules/invoiceOut/back/methods/invoiceOut/getInvoiceDate.js b/modules/invoiceOut/back/methods/invoiceOut/getInvoiceDate.js
index dcc1fa6e8..493f19aa7 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/getInvoiceDate.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/getInvoiceDate.js
@@ -7,7 +7,12 @@ module.exports = Self => {
arg: 'companyFk',
type: 'number',
required: true
- }
+ },
+ {
+ arg: 'serialType',
+ type: 'string',
+ required: true
+ },
],
returns: {
type: ['object'],
@@ -19,16 +24,16 @@ module.exports = Self => {
}
});
- Self.getInvoiceDate = async companyFk => {
+ Self.getInvoiceDate = async(companyFk, serialType) => {
const models = Self.app.models;
const [invoiceDate] = await models.InvoiceOut.rawSql(
`SELECT MAX(io.issued) issued
FROM invoiceOut io
JOIN invoiceOutSerial ios ON ios.code = io.serial
- WHERE ios.type = 'global'
- AND io.issued
+ WHERE ios.type = ?
+ AND io.issued
AND io.companyFk = ?`,
- [companyFk]
+ [serialType, companyFk]
);
return invoiceDate;
};
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js
index 6eaba8c81..825191132 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js
@@ -1,15 +1,16 @@
const models = require('vn-loopback/server/server').models;
+const LoopBackContext = require('loopback-context');
describe('InvoiceOut clientsToInvoice()', () => {
const userId = 1;
const clientId = 1101;
const companyFk = 442;
const currencyFk = 1;
- const maxShipped = new Date();
+ const maxShipped = Date.vnNew();
maxShipped.setMonth(11);
maxShipped.setDate(31);
maxShipped.setHours(23, 59, 59, 999);
- const invoiceDate = new Date();
+ const invoiceDate = Date.vnNew();
const activeCtx = {
getLocale: () => {
return 'en';
@@ -21,6 +22,21 @@ describe('InvoiceOut clientsToInvoice()', () => {
headers: {origin: 'http://localhost'}
};
const ctx = {req: activeCtx};
+ let tx;
+ let options;
+
+ beforeEach(async() => {
+ LoopBackContext.getCurrentContext = () => ({
+ active: activeCtx,
+ });
+
+ tx = await models.InvoiceOut.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
it('should return a list of clients to invoice', async() => {
spyOn(models.InvoiceOut, 'rawSql').and.callFake(query => {
@@ -38,24 +54,14 @@ describe('InvoiceOut clientsToInvoice()', () => {
}
});
- const tx = await models.InvoiceOut.beginTransaction({});
- const options = {transaction: tx};
+ const addresses = await models.InvoiceOut.clientsToInvoice(
+ ctx, clientId, invoiceDate, maxShipped, companyFk, currencyFk, options);
- try {
- const addresses = await models.InvoiceOut.clientsToInvoice(
- ctx, clientId, invoiceDate, maxShipped, companyFk, currencyFk, options);
-
- expect(addresses.length).toBeGreaterThan(0);
- expect(addresses[0].clientId).toBe(clientId);
- expect(addresses[0].clientName).toBe('Test Client');
- expect(addresses[0].id).toBe(1);
- expect(addresses[0].nickname).toBe('Address 1');
-
- await tx.rollback();
- } catch (e) {
- await tx.rollback();
- throw e;
- }
+ expect(addresses.length).toBeGreaterThan(0);
+ expect(addresses[0].clientId).toBe(clientId);
+ expect(addresses[0].clientName).toBe('Test Client');
+ expect(addresses[0].id).toBe(1);
+ expect(addresses[0].nickname).toBe('Address 1');
});
it('should handle errors and rollback transaction', async() => {
@@ -63,15 +69,21 @@ describe('InvoiceOut clientsToInvoice()', () => {
return Promise.reject(new Error('Test Error'));
});
- const tx = await models.InvoiceOut.beginTransaction({});
- const options = {transaction: tx};
-
try {
await models.InvoiceOut.clientsToInvoice(
ctx, clientId, invoiceDate, maxShipped, companyFk, currencyFk, options);
} catch (e) {
expect(e.message).toBe('Test Error');
- await tx.rollback();
}
});
+
+ it('should return all list', async() => {
+ const minShipped = Date.vnNew();
+ minShipped.setFullYear(maxShipped.getFullYear() - 1);
+
+ const toInvoice = await models.InvoiceOut.clientsToInvoice(
+ ctx, null, invoiceDate, maxShipped, companyFk, options);
+
+ expect(toInvoice).toBeDefined();
+ });
});
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/getInvoiceDate.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/getInvoiceDate.spec.js
new file mode 100644
index 000000000..830402250
--- /dev/null
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/getInvoiceDate.spec.js
@@ -0,0 +1,39 @@
+const models = require('vn-loopback/server/server').models;
+const moment = require('moment');
+
+describe('getInvoiceDate()', () => {
+ const companyFk = 442;
+ let tx;
+ let options;
+
+ beforeEach(async() => {
+ tx = await models.InvoiceOut.beginTransaction({});
+ options = {transaction: tx};
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ it('should return a correct date for serialType "global"', async() => {
+ const serialType = 'global';
+ const result = await models.InvoiceOut.getInvoiceDate(companyFk, serialType, options);
+
+ expect(moment(result.issued).format('YYYY-MM-DD')).toEqual('2000-12-01');
+ });
+
+ it('should return null for serialType "multiple"', async() => {
+ const serialType = 'multiple';
+ const result = await models.InvoiceOut.getInvoiceDate(companyFk, serialType, options);
+
+ expect(result.issued).toBeNull();
+ });
+
+ it('should return correct date for serialType "quick"', async() => {
+ const serialType = 'quick';
+ const result = await models.InvoiceOut.getInvoiceDate(companyFk, serialType, options);
+
+ expect(moment(result.issued).format('YYYY-MM-DD')).toEqual('2001-01-01');
+ });
+});
+
diff --git a/modules/invoiceOut/back/model-config.json b/modules/invoiceOut/back/model-config.json
index 9c7512429..710d824c3 100644
--- a/modules/invoiceOut/back/model-config.json
+++ b/modules/invoiceOut/back/model-config.json
@@ -43,5 +43,8 @@
},
"SiiTypeInvoiceOut": {
"dataSource": "vn"
+ },
+ "SiiTypeInvoiceIn": {
+ "dataSource": "vn"
}
-}
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/invoice-out.json b/modules/invoiceOut/back/models/invoice-out.json
index 1ee36accb..2ad13fe3f 100644
--- a/modules/invoiceOut/back/models/invoice-out.json
+++ b/modules/invoiceOut/back/models/invoice-out.json
@@ -66,6 +66,11 @@
"model": "Ticket",
"foreignKey": "refFk",
"primaryKey": "ref"
+ },
+ "customsAgentFk": {
+ "type": "belongsTo",
+ "model": "CustomsAgent",
+ "foreignKey": "customsAgentFk"
}
}
}
diff --git a/modules/invoiceOut/back/models/sii-type-invoice-in.json b/modules/invoiceOut/back/models/sii-type-invoice-in.json
new file mode 100644
index 000000000..a191febb9
--- /dev/null
+++ b/modules/invoiceOut/back/models/sii-type-invoice-in.json
@@ -0,0 +1,22 @@
+{
+ "name": "SiiTypeInvoiceIn",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "siiTypeInvoiceIn"
+ }
+ },
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "code": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/sii-type-invoice-out.json b/modules/invoiceOut/back/models/sii-type-invoice-out.json
index 37fd39c38..89f01bd74 100644
--- a/modules/invoiceOut/back/models/sii-type-invoice-out.json
+++ b/modules/invoiceOut/back/models/sii-type-invoice-out.json
@@ -17,9 +17,6 @@
},
"description": {
"type": "string"
- },
- "code": {
- "type": "string"
}
}
-}
+}
\ No newline at end of file
diff --git a/modules/item/back/locale/item-minimum-quantity/en.yml b/modules/item/back/locale/item-minimum-quantity/en.yml
new file mode 100644
index 000000000..206b1d96b
--- /dev/null
+++ b/modules/item/back/locale/item-minimum-quantity/en.yml
@@ -0,0 +1,5 @@
+name: Minimum Quantity
+columns:
+ ended: Ended
+ code: Code
+ started: Started
\ No newline at end of file
diff --git a/modules/item/back/locale/item-minimum-quantity/es.yml b/modules/item/back/locale/item-minimum-quantity/es.yml
new file mode 100644
index 000000000..68c67eeff
--- /dev/null
+++ b/modules/item/back/locale/item-minimum-quantity/es.yml
@@ -0,0 +1,5 @@
+name: Cantidad Mínima
+columns:
+ ended: Finaliza
+ quantity: Cantidad
+ started: Comienza
diff --git a/modules/item/back/locale/item/en.yml b/modules/item/back/locale/item/en.yml
index ea40fd34b..f5e6fcf9a 100644
--- a/modules/item/back/locale/item/en.yml
+++ b/modules/item/back/locale/item/en.yml
@@ -46,4 +46,4 @@ columns:
itemFk: item
density: density
compression: compression
-
+ minQuantity: min quantity
diff --git a/modules/item/back/locale/item/es.yml b/modules/item/back/locale/item/es.yml
index 973f5e94f..68020d452 100644
--- a/modules/item/back/locale/item/es.yml
+++ b/modules/item/back/locale/item/es.yml
@@ -46,4 +46,4 @@ columns:
itemFk: artículo
density: densidad
compression: compresión
-
+ minQuantity: Cantidad mínima
diff --git a/modules/item/back/methods/item-shelving/getItemsByReviewOrder.js b/modules/item/back/methods/item-shelving/getItemsByReviewOrder.js
new file mode 100644
index 000000000..7a960a8c8
--- /dev/null
+++ b/modules/item/back/methods/item-shelving/getItemsByReviewOrder.js
@@ -0,0 +1,89 @@
+module.exports = Self => {
+ const models = require('vn-loopback/server/server').models;
+ Self.remoteMethod('getItemsByReviewOrder', {
+ description:
+ 'Get list items if they are ordered by pickingOrder and their created regarding where they will be parked',
+ accessType: 'READ',
+ accepts: [{
+ arg: 'shelving',
+ type: 'string',
+ required: true,
+ description: 'Shelving code'
+ },
+ {
+ arg: 'parking',
+ type: 'string',
+ required: true,
+ description: 'Parking code'
+ },
+ {
+ arg: 'itemFk',
+ type: 'number',
+ description: 'Item id'
+ },
+ ],
+ returns: {
+ type: 'Array',
+ root: true
+ },
+ http: {
+ path: `/getItemsByReviewOrder`,
+ verb: 'GET'
+ }
+ });
+
+ Self.getItemsByReviewOrder = async(shelving, parking, itemFk, options) => {
+ const myOptions = {};
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const config = await models.ProductionConfig.findOne();
+ const hoursToCompare = config['itemOrderReviewHours'];
+ if (!hoursToCompare) return [];
+
+ const parkingItem = await models.Parking.findOne({where: {code: parking}}, myOptions);
+ if (!parkingItem) return [];
+ const pickingOrderToCompare = parkingItem['pickingOrder'];
+
+ const result = await Self.rawSql(`
+ WITH currentItemShelving AS (
+ SELECT is2.created, is2.itemFk, sh.code
+ FROM vn.itemShelving is2
+ JOIN vn.shelving sh ON sh.id = is2.shelvingFk
+ LEFT JOIN vn.parking p ON p.id = sh.parkingFk
+ LEFT JOIN vn.sector s ON s.id = p.sectorFk
+ WHERE sh.code = ? AND (? IS NULL OR is2.itemFk = ?)
+ ),
+ itemShelvings AS (
+ SELECT is2.itemFk, is2.created, sh.code, p.pickingOrder, p.code AS parkingFk
+ FROM vn.itemShelving is2
+ JOIN currentItemShelving ai ON is2.itemFk = ai.itemFk
+ JOIN vn.shelving sh ON sh.id = is2.shelvingFk AND ai.code <> sh.code
+ JOIN vn.parking p ON p.id = sh.parkingFk
+ JOIN vn.sector s ON s.id = p.sectorFk
+ ),
+ parkingDestiny AS (
+ SELECT ? AS pickingOrder
+ )
+ SELECT ish.*,
+ CASE
+ WHEN ish.pickingOrder < d.pickingOrder AND aish.created < ish.created
+ AND ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ? THEN "old"
+ WHEN ish.pickingOrder > d.pickingOrder AND aish.created > ish.created
+ AND ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ? THEN "new"
+ END AS itemCreated
+ FROM itemShelvings ish
+ JOIN parkingDestiny d ON d.pickingOrder IS NOT NULL
+ JOIN currentItemShelving aish ON ish.itemFk = aish.itemFk
+ WHERE ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ?
+ AND (
+ (ish.pickingOrder < d.pickingOrder AND aish.created < ish.created)
+ OR
+ (ish.pickingOrder > d.pickingOrder AND aish.created > ish.created)
+ );
+ `,
+ [shelving, itemFk, itemFk, pickingOrderToCompare,
+ hoursToCompare, hoursToCompare, hoursToCompare, hoursToCompare], myOptions);
+ return result;
+ };
+};
diff --git a/modules/item/back/methods/item-shelving/getListItemNewer.js b/modules/item/back/methods/item-shelving/getListItemNewer.js
index 5c4ca277d..c806c0a7e 100644
--- a/modules/item/back/methods/item-shelving/getListItemNewer.js
+++ b/modules/item/back/methods/item-shelving/getListItemNewer.js
@@ -51,7 +51,7 @@ module.exports = Self => {
JOIN vn.productionConfig pc
WHERE sh.code = ? AND s.code = pc.sectorFromCode
), tItemInSector AS (
- SELECT is2.itemFk, is2.created, is2.shelvingFk
+ SELECT is2.itemFk, is2.created, sh.code
FROM vn.itemShelving is2
JOIN vn.shelving sh ON sh.id = is2.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
@@ -59,7 +59,7 @@ module.exports = Self => {
JOIN vn.productionConfig pc
WHERE sh.code <> ?
AND s.code = pc.sectorFromCode)
- SELECT ti.itemFK, tis.shelvingFk
+ SELECT ti.itemFK, tis.code shelvingFk
FROM tItemShelving ti
JOIN tItemInSector tis ON tis.itemFk = ti.itemFk
JOIN vn.productionConfig pc
diff --git a/modules/item/back/methods/item-shelving/specs/getItemsByReviewOrder.spec.js b/modules/item/back/methods/item-shelving/specs/getItemsByReviewOrder.spec.js
new file mode 100644
index 000000000..8f368b57c
--- /dev/null
+++ b/modules/item/back/methods/item-shelving/specs/getItemsByReviewOrder.spec.js
@@ -0,0 +1,123 @@
+
+const {models} = require('vn-loopback/server/server');
+
+describe('itemShelving getItemsByReviewOrder()', () => {
+ it('should return empty because hoursToReview = 0', async() => {
+ const shelving = 'NBB';
+ const parking = '700-01';
+
+ const tx = await models.Sector.beginTransaction({});
+ const myOptions = {transaction: tx};
+
+ try {
+ const config = await models.ProductionConfig.findOne();
+ await config.updateAttributes({
+ itemOrderReviewHours: null,
+ });
+
+ const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, myOptions);
+
+ expect(result.length).toEqual(0);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return an item because you are trying parking a shelving and there is an older item', async() => {
+ const shelving = 'NBB';
+ const parking = 'K-26-2';
+ const itemFk = 1000000;
+
+ const tx = await models.Sector.beginTransaction({});
+ const myOptions = {transaction: tx};
+
+ try {
+ const config = await models.ProductionConfig.findOne();
+ await config.updateAttributes({
+ itemOrderReviewHours: 24,
+ });
+
+ const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
+
+ expect(result.length).toEqual(1);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return an item because you are trying parking a shelving and there is an newer item', async() => {
+ const shelving = 'NBB';
+ const parking = 'K-26-2';
+ const itemFk = 1000000;
+
+ const tx = await models.Sector.beginTransaction({});
+ const myOptions = {transaction: tx};
+
+ try {
+ const config = await models.ProductionConfig.findOne();
+ await config.updateAttributes({
+ itemOrderReviewHours: 24,
+ });
+
+ const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
+
+ expect(result.length).toEqual(1);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return a item list because you are trying parking a shelving and there is an newer item', async() => {
+ const shelving = 'NCC';
+ const parking = 'K-26-2';
+ const itemFk = 1000000;
+
+ const tx = await models.Sector.beginTransaction({});
+ const myOptions = {transaction: tx};
+
+ try {
+ const config = await models.ProductionConfig.findOne();
+ await config.updateAttributes({
+ itemOrderReviewHours: 24,
+ });
+
+ const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
+
+ expect(result.length).toEqual(2);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return empty list because all order is correct', async() => {
+ const shelving = 'NCC';
+ const parking = 'A-01-1';
+ const itemFk = 1000000;
+
+ const tx = await models.Sector.beginTransaction({});
+ const myOptions = {transaction: tx};
+
+ try {
+ const config = await models.ProductionConfig.findOne();
+ await config.updateAttributes({
+ itemOrderReviewHours: 24,
+ });
+
+ const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
+
+ expect(result.length).toEqual(0);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/item/back/methods/item/filter.js b/modules/item/back/methods/item/filter.js
index 54dd975a4..a7fde1e6c 100644
--- a/modules/item/back/methods/item/filter.js
+++ b/modules/item/back/methods/item/filter.js
@@ -178,17 +178,18 @@ module.exports = Self => {
i.isFloramondo,
i.recycledPlastic,
i.nonRecycledPlastic,
- pr.name AS producer,
- it.name AS typeName,
- it.workerFk AS buyerFk,
- u.name AS userName,
- ori.code AS origin,
- ic.name AS category,
+ pr.name producer,
+ it.name typeName,
+ it.workerFk buyerFk,
+ u.name userName,
+ ori.code origin,
+ ic.name category,
i.intrastatFk,
- intr.description AS intrastat,
+ intr.description intrastat,
b.grouping,
b.packing,
- lb.landing AS landed
+ lb.landing landed,
+ it.name typeName
FROM item i
LEFT JOIN itemType it ON it.id = i.typeFk
LEFT JOIN itemCategory ic ON ic.id = it.categoryFk
diff --git a/modules/item/back/methods/item/lastEntriesFilter.js b/modules/item/back/methods/item/lastEntriesFilter.js
index 5aafbb4f6..b038bb155 100644
--- a/modules/item/back/methods/item/lastEntriesFilter.js
+++ b/modules/item/back/methods/item/lastEntriesFilter.js
@@ -29,10 +29,12 @@ module.exports = Self => {
Object.assign(myOptions, options);
const stmt = new ParameterizedSQL(
- `SELECT w.id AS warehouseFk,
- w.name AS warehouse,
- tr.landed,
- b.id AS buyFk,
+ `SELECT i.id itemFk,
+ w.id warehouseFk,
+ w.name warehouse,
+ CAST(tr.landed AS CHAR) landed,
+ tr.landed landedDate,
+ b.id buyFk,
b.entryFk,
b.isIgnored,
b.price2,
@@ -47,14 +49,18 @@ module.exports = Self => {
b.buyingValue +
b.freightValue +
b.comissionValue +
- b.packageValue AS cost,
+ b.packageValue cost,
b.buyingValue,
b.freightValue,
b.comissionValue,
b.packageValue,
b.packagingFk ,
- s.id AS supplierFk,
- s.name AS supplier
+ s.id supplierFk,
+ s.name supplier,
+ b.printedStickers,
+ c.inventoried,
+ ic.supplierFk inventorySupplierFk,
+ s.id = ic.supplierFk isInventorySupplier
FROM itemType it
RIGHT JOIN (entry e
LEFT JOIN supplier s ON s.id = e.supplierFk
@@ -65,9 +71,14 @@ module.exports = Self => {
LEFT JOIN warehouse w ON w.id = tr.warehouseInFk
LEFT JOIN origin o ON o.id = i.originFk
) ON it.id = i.typeFk
- LEFT JOIN edi.ekt ek ON b.ektFk = ek.id`
+ LEFT JOIN edi.ekt ek ON b.ektFk = ek.id
+ JOIN config c
+ JOIN inventoryConfig ic`
);
- stmt.merge(conn.makeSuffix(filter));
+
+ stmt.merge(conn.makeWhere(filter.where));
+ stmt.merge('AND IF(s.id = ic.supplierFk, tr.landed = DATE(c.inventoried), TRUE)');
+ stmt.merge(conn.makePagination(filter));
return conn.executeStmt(stmt, myOptions);
};
diff --git a/modules/item/back/methods/item/specs/lastEntriesFilter.spec.js b/modules/item/back/methods/item/specs/lastEntriesFilter.spec.js
index 2fd30c2ca..b2bfdf59c 100644
--- a/modules/item/back/methods/item/specs/lastEntriesFilter.spec.js
+++ b/modules/item/back/methods/item/specs/lastEntriesFilter.spec.js
@@ -1,16 +1,22 @@
const {models} = require('vn-loopback/server/server');
+const itemFk = 1;
+
+const today = Date.vnNew();
+today.setHours(23, 59, 59, 999);
+
+const twoMonthsAgo = Date.vnNew();
+twoMonthsAgo.setHours(0, 0, 0, 0);
+twoMonthsAgo.setMonth(twoMonthsAgo.getMonth() - 2, 1);
describe('item lastEntriesFilter()', () => {
it('should return two entry for the given item', async() => {
const minDate = Date.vnNew();
minDate.setHours(0, 0, 0, 0);
- const maxDate = Date.vnNew();
- maxDate.setHours(23, 59, 59, 59);
const tx = await models.Item.beginTransaction({});
const options = {transaction: tx};
try {
- const filter = {where: {itemFk: 1, landed: {between: [minDate, maxDate]}}};
+ const filter = {where: {itemFk, landed: {between: [minDate, today]}}};
const result = await models.Item.lastEntriesFilter(filter, options);
expect(result.length).toEqual(2);
@@ -23,21 +29,61 @@ describe('item lastEntriesFilter()', () => {
});
it('should return six entries for the given item', async() => {
- const minDate = Date.vnNew();
- minDate.setHours(0, 0, 0, 0);
- minDate.setMonth(minDate.getMonth() - 2, 1);
-
- const maxDate = Date.vnNew();
- maxDate.setHours(23, 59, 59, 59);
-
const tx = await models.Item.beginTransaction({});
const options = {transaction: tx};
try {
- const filter = {where: {itemFk: 1, landed: {between: [minDate, maxDate]}}};
+ const filter = {where: {itemFk, landed: {between: [twoMonthsAgo, today]}}};
+ const result = await models.Item.lastEntriesFilter(filter, options);
+ const twoMonthsAgoUtc = twoMonthsAgo.getTime();
+ const todayUtc = today.getTime();
+
+ const resultMatch = (
+ await Promise.all(
+ result.map(async item => {
+ const itemRecord = await models.Buy.findOne({
+ fields: ['id'],
+ where: {id: item.id},
+ options,
+ });
+
+ const isItemFkValid = itemRecord?.id === itemFk;
+ const landedDate = Date.vnNew(item.landed).getTime();
+ const isLandedValid = landedDate >= twoMonthsAgoUtc && landedDate <= todayUtc;
+
+ return isItemFkValid && isLandedValid;
+ })
+ )
+ ).filter(Boolean).length;
+
+ expect(result.length).toEqual(resultMatch);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return just the inventoried inventory', async() => {
+ const tx = await models.Item.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const filter = {where: {itemFk, landed: {between: [twoMonthsAgo, today]}}};
const result = await models.Item.lastEntriesFilter(filter, options);
- expect(result.length).toEqual(6);
+ const {supplierFk} = await models.InventoryConfig.findOne(options);
+ const {inventoried} = await models.Config.findOne(options);
+
+ let hasInventoriedDate = false;
+ result.forEach(entry => {
+ if (entry.supplierFk === supplierFk &&
+ entry.landedDate.getTime() === inventoried.getTime()
+ )hasInventoriedDate = true;
+ });
+
+ expect(hasInventoriedDate).toEqual(true);
await tx.rollback();
} catch (e) {
diff --git a/modules/item/back/models/item-shelving.js b/modules/item/back/models/item-shelving.js
index be72dac37..34e18f23f 100644
--- a/modules/item/back/models/item-shelving.js
+++ b/modules/item/back/models/item-shelving.js
@@ -5,4 +5,5 @@ module.exports = Self => {
require('../methods/item-shelving/getAlternative')(Self);
require('../methods/item-shelving/updateFromSale')(Self);
require('../methods/item-shelving/getListItemNewer')(Self);
+ require('../methods/item-shelving/getItemsByReviewOrder')(Self);
};
diff --git a/modules/item/back/models/item-type.js b/modules/item/back/models/item-type.js
new file mode 100644
index 000000000..4dc8adfc9
--- /dev/null
+++ b/modules/item/back/models/item-type.js
@@ -0,0 +1,9 @@
+let UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.rewriteDbError(function(err) {
+ if (err.code === 'ER_DUP_ENTRY')
+ return new UserError(`An item type with the same code already exists`);
+ return err;
+ });
+};
diff --git a/modules/item/back/models/item.json b/modules/item/back/models/item.json
index eda56e938..159883455 100644
--- a/modules/item/back/models/item.json
+++ b/modules/item/back/models/item.json
@@ -154,6 +154,9 @@
},
"photoMotivation": {
"type": "string"
+ },
+ "isCustomInspectionRequired": {
+ "type": "boolean"
}
},
"relations": {
@@ -222,4 +225,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js
index 9f03c57a0..ac8a722bd 100644
--- a/modules/monitor/back/methods/sales-monitor/salesFilter.js
+++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js
@@ -88,6 +88,21 @@ module.exports = Self => {
arg: 'alertLevel',
type: 'number',
description: `The alert level of the tickets`
+ },
+ {
+ arg: 'packing',
+ type: 'string',
+ description: `The packing of the items`
+ },
+ {
+ arg: 'countryFk',
+ type: 'number',
+ description: 'The country id filter'
+ },
+ {
+ arg: 'payMethod',
+ type: 'string',
+ description: 'The payment method filter'
}
],
returns: {
@@ -155,6 +170,8 @@ module.exports = Self => {
case 'clientFk':
param = `t.${param}`;
return {[param]: value};
+ case 'payMethod':
+ return {'c.payMethodFk': value};
}
});
@@ -169,7 +186,7 @@ module.exports = Self => {
stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.filter
(PRIMARY KEY (id))
- ENGINE = MEMORY
+ ENGINE = InnoDB
SELECT t.id,
t.shipped,
CAST(DATE(t.shipped) AS CHAR) shippedDate,
@@ -182,6 +199,7 @@ module.exports = Self => {
t.totalWithVat,
io.id invoiceOutId,
a.provinceFk,
+ p.countryFk,
p.name province,
w.name warehouse,
am.name agencyMode,
@@ -194,10 +212,20 @@ module.exports = Self => {
u.name userName,
c.salesPersonFk,
c.credit,
+ c.payMethodFk payMethodFk,
+ pm.id payMethodId,
+ pm.name payMethod,
z.hour zoneLanding,
z.name zoneName,
z.id zoneFk,
st.classColor,
+ d.id departmentFk,
+ d.name department,
+ (SELECT GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk SEPARATOR ',')
+ FROM sale s
+ JOIN item i ON i.id = s.itemFk
+ WHERE s.ticketFk = t.id
+ ) AS packing,
TIME_FORMAT(t.shipped, '%H:%i') preparationHour,
TIME_FORMAT(z.hour, '%H:%i') theoreticalhour,
TIME_FORMAT(zed.etc, '%H:%i') practicalHour
@@ -211,7 +239,10 @@ module.exports = Self => {
LEFT JOIN ticketState ts ON ts.ticketFk = t.id
LEFT JOIN state st ON st.id = ts.stateFk
LEFT JOIN client c ON c.id = t.clientFk
+ LEFT JOIN payMethod pm ON pm.id = c.payMethodFk
LEFT JOIN worker wk ON wk.id = c.salesPersonFk
+ LEFT JOIN workerDepartment wd ON wd.workerFk = wk.id
+ LEFT JOIN department d ON d.id = wd.departmentFk
LEFT JOIN account.user u ON u.id = wk.id
LEFT JOIN (
SELECT zoneFk,
@@ -356,6 +387,8 @@ module.exports = Self => {
}
case 'agencyModeFk':
case 'warehouseFk':
+ case 'packing':
+ case 'countryFk':
param = `f.${param}`;
return {[param]: value};
}
diff --git a/modules/route/back/methods/agency-term/filter.js b/modules/route/back/methods/agency-term/filter.js
index 9d1268958..d52d93e95 100644
--- a/modules/route/back/methods/agency-term/filter.js
+++ b/modules/route/back/methods/agency-term/filter.js
@@ -66,9 +66,9 @@ module.exports = Self => {
case 'agencyFk':
return {'agencyFk': value};
case 'from':
- return {'created': {gte: value}};
+ return {'dated': {gte: value}};
case 'to':
- return {'created': {lte: value}};
+ return {'dated': {lte: value}};
}
});
@@ -81,7 +81,7 @@ module.exports = Self => {
`SELECT *
FROM (
SELECT r.id routeFk,
- r.created,
+ r.dated,
r.agencyModeFk,
am.name agencyModeName,
am.agencyFk,
@@ -103,7 +103,7 @@ module.exports = Self => {
LEFT JOIN vn.ticket t ON t.routeFk = r.id
LEFT JOIN vn.supplierAgencyTerm sat ON sat.agencyFk = a.id
LEFT JOIN vn.supplier s ON s.id = sat.supplierFk
- WHERE r.created > DATE_ADD(?, INTERVAL -2 MONTH) AND sat.supplierFk IS NOT NULL
+ WHERE r.dated > DATE_ADD(?, INTERVAL -2 MONTH) AND sat.supplierFk IS NOT NULL
GROUP BY r.id
) a`
, [date]);
diff --git a/modules/route/back/methods/route/clone.js b/modules/route/back/methods/route/clone.js
index d56118e08..c5c4d846a 100644
--- a/modules/route/back/methods/route/clone.js
+++ b/modules/route/back/methods/route/clone.js
@@ -10,10 +10,10 @@ module.exports = Self => {
description: 'The routes ids to clone'
},
{
- arg: 'created',
+ arg: 'dated',
type: 'date',
required: true,
- description: 'The created date for all routes'
+ description: 'The date for all routes'
}
],
returns: {
@@ -26,7 +26,7 @@ module.exports = Self => {
}
});
- Self.clone = async(ids, created) => {
+ Self.clone = async(ids, dated) => {
const tx = await Self.beginTransaction({});
try {
const options = {transaction: tx};
@@ -39,7 +39,7 @@ module.exports = Self => {
throw new Error(`The amount of routes found don't match`);
const routes = originalRoutes.map(route => {
- route.created = created;
+ route.dated = dated;
return route;
});
diff --git a/modules/route/back/methods/route/driverRouteEmail.js b/modules/route/back/methods/route/driverRouteEmail.js
index bbac2b0e8..78069683d 100644
--- a/modules/route/back/methods/route/driverRouteEmail.js
+++ b/modules/route/back/methods/route/driverRouteEmail.js
@@ -8,7 +8,7 @@ module.exports = Self => {
arg: 'id',
type: 'number',
required: true,
- description: 'The client id',
+ description: 'The route id',
http: {source: 'path'}
}, {
arg: 'replyTo',
@@ -31,26 +31,13 @@ module.exports = Self => {
});
Self.driverRouteEmail = async(ctx, id) => {
- const models = Self.app.models;
- const {workerFk, agencyMode} = await Self.findById(id, {
- fields: ['workerFk', 'agencyModeFk'],
+ const {agencyMode} = await Self.findById(id, {
+ fields: ['agencyModeFk'],
include: {relation: 'agencyMode'}
});
const {reportMail} = agencyMode();
- let user;
- let account;
-
- if (workerFk) {
- user = await models.VnUser.findById(workerFk, {
- fields: ['active', 'id'],
- include: {relation: 'emailUser'}
- });
- account = await models.Account.findById(workerFk);
- }
-
- if (user?.active && account) ctx.args.recipient = user.emailUser().email;
- else ctx.args.recipient = reportMail;
+ ctx.args.recipient = reportMail;
if (!ctx.args.recipient) throw new UserError('An email is necessary');
return Self.sendTemplate(ctx, 'driver-route');
};
diff --git a/modules/route/back/methods/route/filter.js b/modules/route/back/methods/route/filter.js
index 925927cc8..70bf7ba67 100644
--- a/modules/route/back/methods/route/filter.js
+++ b/modules/route/back/methods/route/filter.js
@@ -93,9 +93,9 @@ module.exports = Self => {
case 'search':
return {'id': value};
case 'from':
- return {'created': {gte: value}};
+ return {'dated': {gte: value}};
case 'to':
- return {'created': {lte: value}};
+ return {'dated': {lte: value}};
case 'description':
return {'description': {like: `%${value}%`}};
case 'isOk':
@@ -119,7 +119,7 @@ module.exports = Self => {
SELECT
r.id,
r.workerFk,
- r.created,
+ r.dated,
r.vehicleFk,
r.agencyModeFk,
r.time,
diff --git a/modules/route/back/methods/route/getByWorker.js b/modules/route/back/methods/route/getByWorker.js
index 5d1881c20..92086bba0 100644
--- a/modules/route/back/methods/route/getByWorker.js
+++ b/modules/route/back/methods/route/getByWorker.js
@@ -46,14 +46,14 @@ module.exports = Self => {
and: [
{
or: [
- {'created': currentDate},
- {'created': nextDay}
+ {'dated': currentDate},
+ {'dated': nextDay}
]
}
]
},
order: [
- 'created ASC',
+ 'dated ASC',
'time ASC',
'agencyName ASC'
]
diff --git a/modules/route/back/methods/route/getSuggestedTickets.js b/modules/route/back/methods/route/getSuggestedTickets.js
index e1b90d359..daaff2bc8 100644
--- a/modules/route/back/methods/route/getSuggestedTickets.js
+++ b/modules/route/back/methods/route/getSuggestedTickets.js
@@ -43,10 +43,10 @@ module.exports = Self => {
for (let zoneAgencyMode of zoneAgencyModes)
zoneIds.push(zoneAgencyMode.zoneFk);
- const minDate = new Date(route.created);
+ const minDate = new Date(route.dated);
minDate.setHours(0, 0, 0, 0);
- const maxDate = new Date(route.created);
+ const maxDate = new Date(route.dated);
maxDate.setHours(23, 59, 59, 59);
let tickets = await Self.app.models.Ticket.find({
diff --git a/modules/route/back/methods/route/insertTicket.js b/modules/route/back/methods/route/insertTicket.js
index 4ac8bad1a..41c910116 100644
--- a/modules/route/back/methods/route/insertTicket.js
+++ b/modules/route/back/methods/route/insertTicket.js
@@ -42,10 +42,10 @@ module.exports = Self => {
try {
const route = await models.Route.findById(routeId, null, myOptions);
- const minDate = new Date(route.created);
+ const minDate = new Date(route.dated);
minDate.setHours(0, 0, 0, 0);
- const maxDate = new Date(route.created);
+ const maxDate = new Date(route.dated);
maxDate.setHours(23, 59, 59, 59);
const ticket = await models.Ticket.findOne({
where: {
diff --git a/modules/route/back/methods/route/optimizePriority.js b/modules/route/back/methods/route/optimizePriority.js
new file mode 100644
index 000000000..56db4ffb5
--- /dev/null
+++ b/modules/route/back/methods/route/optimizePriority.js
@@ -0,0 +1,122 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethod('optimizePriority', {
+ description: 'Updates the ticket priority of tickets without priority',
+ accepts: {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'Route id',
+ http: {source: 'path'}
+ },
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: '/:id/optimizePriority',
+ verb: 'POST'
+ }
+ });
+
+ Self.optimizePriority = async(id, options) => {
+ const models = Self.app.models;
+ const myOptions = {};
+ let tx;
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const tickets = await models.Ticket.find({
+ where: {routeFk: id}
+ }, myOptions);
+
+ let ticketAddress = [];
+ for (const ticket of tickets) {
+ ticketAddress.push({
+ ticketId: ticket.id,
+ addressId: ticket.addressFk,
+ zoneId: ticket.zoneFk,
+ priority: ticket.priority
+ });
+ }
+
+ // Igualamos los priority del mismo addressId
+ const addressPriorityMap = ticketAddress.reduce((acc, {addressId, priority}) => {
+ if (priority !== null) {
+ acc[addressId] = acc[addressId] === undefined
+ ? priority
+ : Math.max(acc[addressId], priority);
+ }
+ return acc;
+ });
+ ticketAddress.forEach(item => {
+ const maxPriority = addressPriorityMap[item.addressId];
+ if (maxPriority) item.priority = maxPriority;
+ });
+
+ // Añadimos las direcciones a optimizar
+ let addressIds = [];
+ ticketAddress.forEach(h => {
+ if (!addressIds.includes(h.addressId) && !h.priority)
+ addressIds.push(h.addressId);
+ });
+ if (!addressIds.length) throw new UserError('All tickets have a route order');
+
+ // Obtenemos el zoneId más frecuente
+ const zoneFrequency = ticketAddress.reduce((acc, {zoneId}) => {
+ if (zoneId != null) acc[zoneId] = (acc[zoneId] || 0) + 1;
+ return acc;
+ }, {});
+ const [mostFrequentZoneId] = Object.entries(zoneFrequency)
+ .reduce((maxEntry, entry) => entry[1] > maxEntry[1] ? entry : maxEntry, [null, 0]);
+
+ // Obtenemos los address inicio y fin
+ const maxPosition = Math.max(...ticketAddress.map(g => g.priority));
+ let firstAddress = (await models.Zone.findById(mostFrequentZoneId, myOptions))?.addressFk
+ || (await models.ZoneConfig.findOne())?.defaultAddressFk;
+ const lastAddress = firstAddress;
+ if (maxPosition) firstAddress = ticketAddress.find(g => g.priority === maxPosition)?.addressId;
+
+ // Revisamos las coincidencias y actualizamos la prioridad en el array
+ const addressPositions = await models.OsrmConfig.optimize(addressIds, firstAddress, lastAddress, myOptions);
+ await Promise.all(ticketAddress.map(async i => {
+ const foundPosition = addressPositions.find(item => item.addressId === i.addressId);
+ if (foundPosition) i.priority = foundPosition.position + (maxPosition + 1);
+ }));
+
+ // Suavizado de prioridad para que no hayan escalones
+ const allPriorities = ticketAddress
+ .map(item => item.priority)
+ .filter(p => p !== null);
+ const uniquePriorities = [...new Set(allPriorities)].sort((a, b) => a - b);
+ const priorityMap = {};
+ uniquePriorities.forEach((p, index) => {
+ priorityMap[p] = index + 1;
+ });
+ ticketAddress.forEach(item => {
+ if (item.priority !== null) item.priority = priorityMap[item.priority];
+ });
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ // Realizamos el update en la base de datos
+ try {
+ await Promise.all(ticketAddress.map(async y => {
+ if (y.priority) {
+ const ticket = await models.Ticket.findById(y.ticketId);
+ await ticket.updateAttribute('priority', y.priority, myOptions);
+ }
+ }));
+ if (tx) await tx.commit();
+ return;
+ } catch (err) {
+ if (tx) await tx.rollback();
+ throw err;
+ }
+ };
+};
diff --git a/modules/route/back/methods/route/specs/optimizePriority.spec.js b/modules/route/back/methods/route/specs/optimizePriority.spec.js
new file mode 100644
index 000000000..c1c2dc45e
--- /dev/null
+++ b/modules/route/back/methods/route/specs/optimizePriority.spec.js
@@ -0,0 +1,36 @@
+const models = require('vn-loopback/server/server').models;
+const routeId = 1;
+
+describe('route optimizePriority())', function() {
+ it('should execute without throwing errors', async function() {
+ const tx = await models.Route.beginTransaction({});
+ let error;
+ try {
+ const options = {transaction: tx};
+ await models.Ticket.updateAll(
+ {routeFk: routeId},
+ {priority: null},
+ options
+ );
+ await models.Route.optimizePriority(routeId, options);
+ await tx.rollback();
+ } catch (e) {
+ error = e;
+ await tx.rollback();
+ }
+
+ expect(error).toBeUndefined();
+ });
+
+ it('should execute with error', async function() {
+ let error;
+ try {
+ await models.Route.optimizePriority(routeId);
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error).toBeDefined();
+ expect(error.message).toBe('All tickets have a route order');
+ });
+});
diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js
index cd8685cec..f73ff3e51 100644
--- a/modules/route/back/models/route.js
+++ b/modules/route/back/models/route.js
@@ -16,4 +16,5 @@ module.exports = Self => {
require('../methods/route/downloadZip')(Self);
require('../methods/route/getExpeditionSummary')(Self);
require('../methods/route/getByWorker')(Self);
+ require('../methods/route/optimizePriority')(Self);
};
diff --git a/modules/route/back/models/route.json b/modules/route/back/models/route.json
index f8be9023c..8f4eab761 100644
--- a/modules/route/back/models/route.json
+++ b/modules/route/back/models/route.json
@@ -15,7 +15,7 @@
"id": true,
"description": "Identifier"
},
- "created": {
+ "dated": {
"type": "date"
},
"time": {
diff --git a/modules/route/front/descriptor/index.html b/modules/route/front/descriptor/index.html
index 4e7e99f1a..0079168a6 100644
--- a/modules/route/front/descriptor/index.html
+++ b/modules/route/front/descriptor/index.html
@@ -32,7 +32,7 @@
+ value="{{$ctrl.route.dated | date: 'dd/MM/yyyy'}}">
+ value="{{$ctrl.summary.route.dated | date: 'dd/MM/yyyy'}}">
diff --git a/modules/ticket/back/methods/expedition/deleteExpeditions.js b/modules/ticket/back/methods/expedition/deleteExpeditions.js
index 75993a485..267811d25 100644
--- a/modules/ticket/back/methods/expedition/deleteExpeditions.js
+++ b/modules/ticket/back/methods/expedition/deleteExpeditions.js
@@ -52,7 +52,8 @@ module.exports = Self => {
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
deletedExpeditions.push(deletedExpedition);
- } catch (e) {
+ } catch (error) {
+ console.error('error: ', error);
notDeletedExpeditions.push(expeditionId);
}
}
diff --git a/modules/ticket/back/methods/expedition/filter.js b/modules/ticket/back/methods/expedition/filter.js
index 43be14349..801d00a9b 100644
--- a/modules/ticket/back/methods/expedition/filter.js
+++ b/modules/ticket/back/methods/expedition/filter.js
@@ -49,7 +49,9 @@ module.exports = Self => {
es.workerFk expeditionScanWorkerFk,
su.name scannerUserName,
es.scanned,
- est.description state
+ est.description state,
+ de.longName,
+ de.itemFk
FROM vn.expedition e
LEFT JOIN vn.expeditionStateType est ON est.id = e.stateTypeFk
INNER JOIN vn.item i1 ON i1.id = e.freightItemFk
@@ -59,6 +61,7 @@ module.exports = Self => {
LEFT JOIN account.user u ON u.id = e.workerFk
LEFT JOIN vn.expeditionScan es ON es.expeditionFk = e.id
LEFT JOIN account.user su ON su.id = es.workerFk
+ LEFT JOIN dipole.expedition_PrintOut de ON de.expeditionFk = e.id
) e
`);
stmt.merge(conn.makeWhere(filter.where));
diff --git a/modules/ticket/back/methods/sale/updateQuantity.js b/modules/ticket/back/methods/sale/updateQuantity.js
index 36d75ffed..4de1bcbd6 100644
--- a/modules/ticket/back/methods/sale/updateQuantity.js
+++ b/modules/ticket/back/methods/sale/updateQuantity.js
@@ -82,7 +82,7 @@ module.exports = Self => {
const message = $t('Changed sale quantity', {
ticketId: sale.ticket().id,
- changes: change,
+ changes: JSON.stringify(change),
ticketUrl: `${url}ticket/${sale.ticket().id}/sale`,
});
diff --git a/modules/ticket/back/methods/ticket-request/confirm.js b/modules/ticket/back/methods/ticket-request/confirm.js
index 7c17d0010..45ee287de 100644
--- a/modules/ticket/back/methods/ticket-request/confirm.js
+++ b/modules/ticket/back/methods/ticket-request/confirm.js
@@ -54,9 +54,17 @@ module.exports = Self => {
throw new UserError(`That item doesn't exists`);
const request = await models.TicketRequest.findById(ctx.args.id, {
- include: {relation: 'ticket'}
+ include: {
+ relation: 'ticket',
+ scope: {
+ include: {
+ relation: 'client',
+ scope: {
+ fields: ['id', 'name', 'salesPersonFk']
+ }
+ }
+ }}
}, myOptions);
-
const itemStock = await models.Item.getVisibleAvailable(
ctx.args.itemFk,
request.ticket().warehouseFk,
@@ -89,19 +97,19 @@ module.exports = Self => {
const query = `CALL vn.sale_calculateComponent(?, NULL)`;
await Self.rawSql(query, [sale.id], myOptions);
- const url = await Self.app.models.Url.getUrl();
- const requesterId = request.requesterFk;
-
- const message = $t('Bought units from buy request', {
- quantity: sale.quantity,
- concept: sale.concept,
- itemId: sale.itemFk,
- ticketId: sale.ticketFk,
- url: `${url}ticket/${sale.ticketFk}/summary`,
- urlItem: `${url}item/${sale.itemFk}/summary`
- });
- await models.Chat.sendCheckingPresence(ctx, requesterId, message, myOptions);
-
+ const salesPerson = request.ticket().client().salesPersonFk;
+ if (salesPerson) {
+ const url = await Self.app.models.Url.getUrl();
+ const message = $t('Bought units from buy request', {
+ quantity: sale.quantity,
+ concept: sale.concept,
+ itemId: sale.itemFk,
+ ticketId: sale.ticketFk,
+ url: `${url}ticket/${sale.ticketFk}/summary`,
+ urlItem: `${url}item/${sale.itemFk}/summary`
+ });
+ await models.Chat.sendCheckingPresence(ctx, salesPerson, message, myOptions);
+ }
if (tx) await tx.commit();
return sale;
diff --git a/modules/ticket/back/methods/ticket-request/deny.js b/modules/ticket/back/methods/ticket-request/deny.js
index 44f1e48a1..26e6f63ff 100644
--- a/modules/ticket/back/methods/ticket-request/deny.js
+++ b/modules/ticket/back/methods/ticket-request/deny.js
@@ -1,18 +1,22 @@
+const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
Self.remoteMethodCtx('deny', {
- description: 'sets a ticket request to denied and returns the changes',
+ description: 'Sets a ticket request to denied and returns the changes',
accessType: 'WRITE',
- accepts: [{
- arg: 'id',
- type: 'number',
- required: true,
- description: 'The request ID',
- }, {
- arg: 'observation',
- type: 'String',
- required: true,
- description: 'The request observation',
- }],
+ accepts: [
+ {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The request ID',
+ },
+ {
+ arg: 'observation',
+ type: 'string',
+ required: true,
+ description: 'The request observation',
+ }
+ ],
returns: {
type: 'number',
root: true
@@ -29,7 +33,7 @@ module.exports = Self => {
const myOptions = {};
let tx;
- if (typeof options == 'object')
+ if (typeof options === 'object')
Object.assign(myOptions, options);
if (!myOptions.transaction) {
@@ -39,7 +43,7 @@ module.exports = Self => {
try {
const userId = ctx.req.accessToken.userId;
- const worker = await Self.app.models.Worker.findOne({where: {id: userId}}, myOptions);
+ const worker = await models.Worker.findById(userId, {fields: ['id']}, myOptions);
const params = {
isOk: false,
@@ -47,19 +51,32 @@ module.exports = Self => {
response: ctx.args.observation,
};
- const request = await Self.app.models.TicketRequest.findById(ctx.args.id, null, myOptions);
- await request.updateAttributes(params, myOptions);
+ const request = await models.TicketRequest.findById(ctx.args.id, {
+ include: {
+ relation: 'ticket',
+ scope: {
+ include: {
+ relation: 'client',
+ scope: {
+ fields: ['id', 'name', 'salesPersonFk']
+ }
+ }
+ }
+ }
+ }, myOptions);
- const url = await Self.app.models.Url.getUrl();
- const requesterId = request.requesterFk;
+ const salesPerson = request.ticket().client().salesPersonFk;
+ if (salesPerson) {
+ const url = await models.Url.getUrl();
+ const message = $t('Deny buy request', {
+ ticketId: request.ticketFk,
+ url: `${url}ticket/${request.ticketFk}/request/index`,
+ observation: params.response
+ });
- const message = $t('Deny buy request', {
- ticketId: request.ticketFk,
- url: `${url}ticket/${request.ticketFk}/request/index`,
- observation: params.response
- });
-
- await models.Chat.sendCheckingPresence(ctx, requesterId, message, myOptions);
+ await models.Chat.sendCheckingPresence(ctx, salesPerson, message, myOptions);
+ await request.updateAttributes(params, myOptions);
+ }
if (tx) await tx.commit();
diff --git a/modules/ticket/back/methods/ticket-request/filter.js b/modules/ticket/back/methods/ticket-request/filter.js
index 53f90b98f..c2edcae81 100644
--- a/modules/ticket/back/methods/ticket-request/filter.js
+++ b/modules/ticket/back/methods/ticket-request/filter.js
@@ -64,6 +64,11 @@ module.exports = Self => {
arg: 'myTeam',
type: 'boolean',
description: `Team partners`
+ },
+ {
+ arg: 'daysOnward',
+ type: 'number',
+ description: 'The days onward'
}
],
returns: {
@@ -104,6 +109,9 @@ module.exports = Self => {
teamMembersId.push(userId);
}
+ const today = Date.vnNew();
+ const future = Date.vnNew();
+
let where = buildFilter(ctx.args, (param, value) => {
switch (param) {
case 'search':
@@ -140,9 +148,13 @@ module.exports = Self => {
return {'tr.requesterFk': {inq: teamMembersId}};
else
return {'tr.requesterFk': {nin: teamMembersId}};
+ case 'daysOnward':
+ today.setHours(0, 0, 0, 0);
+ future.setDate(today.getDate() + value);
+ future.setHours(23, 59, 59, 999);
+ return {'t.shipped': {between: [today, future]}};
}
});
-
if (!where)
where = {};
where['tw.ticketFk'] = null;
diff --git a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
index f160cfaac..2f2a85abb 100644
--- a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
+++ b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js
@@ -30,7 +30,7 @@ module.exports = Self => {
Object.assign(myOptions, options);
const query =
- `SELECT DISTINCT u.id, u.nickname
+ `SELECT DISTINCT u.id, u.nickname, w.firstName, w.lastName
FROM itemType it
JOIN worker w ON w.id = it.workerFk
JOIN account.user u ON u.id = w.id`;
diff --git a/modules/ticket/back/methods/ticket/getTicketsAdvance.js b/modules/ticket/back/methods/ticket/getTicketsAdvance.js
index 41f3ee79a..58d46173c 100644
--- a/modules/ticket/back/methods/ticket/getTicketsAdvance.js
+++ b/modules/ticket/back/methods/ticket/getTicketsAdvance.js
@@ -55,6 +55,11 @@ module.exports = Self => {
type: 'number',
description: 'Department identifier'
},
+ {
+ arg: 'onlyWithDestination',
+ type: 'Boolean',
+ description: 'True when only tickets with destination are returned'
+ },
{
arg: 'filter',
type: 'object',
@@ -103,6 +108,8 @@ module.exports = Self => {
return {'f.isFullMovable': value};
case 'departmentFk':
return {'f.departmentFk': value};
+ case 'onlyWithDestination':
+ return {'f.id': value ? {neq: null} : null};
}
});
diff --git a/modules/ticket/back/methods/ticket/specs/getTicketsAdvance.spec.js b/modules/ticket/back/methods/ticket/specs/getTicketsAdvance.spec.js
index a941013cd..157cdb1ff 100644
--- a/modules/ticket/back/methods/ticket/specs/getTicketsAdvance.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/getTicketsAdvance.spec.js
@@ -8,6 +8,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
tomorrow.setDate(today.getDate() + 1);
const salesDeptId = 43;
const spain1DeptId = 95;
+ const warehouseId = 1;
beforeAll.mockLoopBackContext();
it('should return the tickets passing the required data', async() => {
@@ -19,7 +20,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
const args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
};
ctx.args = args;
@@ -42,7 +43,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
const args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
isFullMovable: true
};
@@ -67,7 +68,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
const args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
isFullMovable: false
};
@@ -92,7 +93,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
const args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
ipt: 'V'
};
@@ -117,7 +118,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
const args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
tfIpt: 'V'
};
@@ -141,7 +142,7 @@ describe('TicketFuture getTicketsAdvance()', () => {
ctx.args = {
dateFuture: tomorrow,
dateToAdvance: today,
- warehouseFk: 1,
+ warehouseFk: warehouseId,
};
await models.Ticket.updateAll({id: {inq: [12, 31]}}, {clientFk: 1}, options);
@@ -167,4 +168,56 @@ describe('TicketFuture getTicketsAdvance()', () => {
throw e;
}
});
+
+ it('should return the tickets with only destination', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const args = {
+ dateFuture: today,
+ dateToAdvance: today.setHours(23, 59, 59, 999),
+ warehouseFk: warehouseId,
+ };
+ ctx.args = args;
+
+ const allTickets = await models.Ticket.getTicketsAdvance(ctx, options);
+ ctx.args.onlyWithDestination = true;
+ const withDestinationTickets = await models.Ticket.getTicketsAdvance(ctx, options);
+
+ expect(allTickets.filter(ticket => ticket.id).length).toBe(withDestinationTickets.length);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should return the tickets without only destination', async() => {
+ const tx = await models.Ticket.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+
+ const args = {
+ dateFuture: today,
+ dateToAdvance: today.setHours(23, 59, 59, 999),
+ warehouseFk: warehouseId,
+ };
+ ctx.args = args;
+
+ const allTickets = await models.Ticket.getTicketsAdvance(ctx, options);
+ ctx.args.onlyWithDestination = false;
+ const withoutDestinationTickets = await models.Ticket.getTicketsAdvance(ctx, options);
+
+ expect(allTickets.filter(ticket => !ticket.id).length).toBe(withoutDestinationTickets.length);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
});
diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
index 88812dc92..f9e4bcac0 100644
--- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
@@ -77,6 +77,8 @@ describe('ticket makeInvoice()', () => {
await tx.rollback();
}
- expect(error.message).toEqual(`The address of the customer must have information about Incoterms and Customs Agent`);
+ expect(error.message).toEqual(
+ `The address of the customer must have information about Incoterms and Customs Agent`
+ );
});
});
diff --git a/modules/ticket/back/models/specs/ticket-service.spec.js b/modules/ticket/back/models/specs/ticket-service.spec.js
new file mode 100644
index 000000000..2691123eb
--- /dev/null
+++ b/modules/ticket/back/models/specs/ticket-service.spec.js
@@ -0,0 +1,64 @@
+const {models} = require('vn-loopback/server/server');
+
+describe('ticketService model ', () => {
+ const originalTicketFk = 1;
+ const refundTicketFk = 11;
+
+ let tx;
+ let opts;
+ let ticketService;
+
+ beforeEach(async() => {
+ tx = await models.Sale.beginTransaction({});
+ opts = {transaction: tx};
+
+ ticketService = await models.TicketService.create({
+ ticketFk: refundTicketFk,
+ description: 'test',
+ quantity: 1,
+ price: 100,
+ taxClassFk: 1,
+ ticketServiceTypeFk: 1
+ }, opts);
+ });
+
+ afterEach(async() => {
+ await tx.rollback();
+ });
+
+ describe('TicketService', () => {
+ it('should allow updating description and quantity for non-refund tickets', async() => {
+ await ticketService.updateAttributes({
+ ticketServiceTypeFk: 2,
+ quantity: 5
+ }, opts);
+
+ const updated = await models.TicketService.findById(ticketService.id, null, opts);
+
+ expect(updated.description).not.toBe('test');
+ expect(updated.quantity).toBe(5);
+ });
+
+ it('should only allow updating description for refund tickets', async() => {
+ await models.TicketRefund.create({
+ refundTicketFk,
+ originalTicketFk
+ }, opts);
+
+ await ticketService.updateAttributes({
+ ticketServiceTypeFk: 2
+ }, opts);
+
+ try {
+ await ticketService.updateAttributes({
+ ticketServiceTypeFk: 3,
+ quantity: 5
+ }, opts);
+
+ fail('Should have thrown error');
+ } catch (e) {
+ expect(e.message).toBe('Only description can be modified in refund tickets');
+ }
+ });
+ });
+});
diff --git a/modules/ticket/back/models/ticket-service.js b/modules/ticket/back/models/ticket-service.js
index 209727ee4..77479498a 100644
--- a/modules/ticket/back/models/ticket-service.js
+++ b/modules/ticket/back/models/ticket-service.js
@@ -10,9 +10,18 @@ module.exports = Self => {
const isLocked = await models.Ticket.isLocked(ticketId);
if (isLocked)
throw new UserError(`The current ticket can't be modified`);
+
+ const isRefund = await models.TicketRefund.findOne({
+ where: {refundTicketFk: ticketId}
+ }, {
+ transaction: ctx.options.transaction
+ });
+
+ if (isRefund && ctx.data && Object.keys(ctx.data).some(field => field !== 'ticketServiceTypeFk'))
+ throw new UserError('Only description can be modified in refund tickets');
}
- if (changes && changes.ticketServiceTypeFk) {
+ if (changes?.ticketServiceTypeFk) {
const ticketServiceType = await models.TicketServiceType.findById(changes.ticketServiceTypeFk);
changes.description = ticketServiceType.name;
}
diff --git a/modules/ticket/front/sale/index.js b/modules/ticket/front/sale/index.js
index 4f8494ed0..3672c467d 100644
--- a/modules/ticket/front/sale/index.js
+++ b/modules/ticket/front/sale/index.js
@@ -387,10 +387,10 @@ class Controller extends Section {
}
newOrderFromTicket() {
- this.$http.post(`Orders/newFromTicket`, {ticketFk: this.ticket.id}).then(res => {
- const path = this.$state.href('order.card.catalog', {id: res.data});
- window.open(path, '_blank');
+ this.$http.post(`Orders/newFromTicket`, {ticketFk: this.ticket.id}).then(async res => {
+ const path = await this.vnApp.getUrl(`order/${res.data}/catalog`);
+ window.open(path, '_blank');
this.vnApp.showSuccess(this.$t('Order created'));
});
}
diff --git a/modules/ticket/front/sale/index.spec.js b/modules/ticket/front/sale/index.spec.js
index 931776619..8ff9aa624 100644
--- a/modules/ticket/front/sale/index.spec.js
+++ b/modules/ticket/front/sale/index.spec.js
@@ -567,14 +567,10 @@ describe('Ticket', () => {
const expectedResponse = {id: 123};
window.open = jasmine.createSpy('open');
- controller.$state.href = jasmine.createSpy('href')
- .and.returnValue('/somePath');
$httpBackend.expect('POST', `Orders/newFromTicket`, expectedParams).respond(expectedResponse);
controller.newOrderFromTicket();
$httpBackend.flush();
-
- expect(window.open).toHaveBeenCalledWith('/somePath', '_blank');
});
});
diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js
index dcb704ff5..2f3f998d6 100644
--- a/modules/travel/back/methods/travel/extraCommunityFilter.js
+++ b/modules/travel/back/methods/travel/extraCommunityFilter.js
@@ -1,4 +1,3 @@
-
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
const buildFilter = require('vn-loopback/util/filter').buildFilter;
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
@@ -87,7 +86,7 @@ module.exports = Self => {
return /^\d+$/.test(value)
? {'t.id': value}
: {'t.ref': {like: `%${value}%`}};
- case 'ref':
+ case 'reference':
return {'t.ref': {like: `%${value}%`}};
case 'shippedFrom':
return {'t.shipped': {gte: value}};
@@ -115,42 +114,39 @@ module.exports = Self => {
`CREATE TEMPORARY TABLE tmp.travel
(INDEX (id))
ENGINE = MEMORY
- SELECT
- t.id,
+ SELECT t.id,
t.ref,
t.shipped,
t.landed,
t.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 cargoSupplierFk,
- s.nickname AS cargoSupplierNickname,
- s.name AS supplierName,
- CAST(SUM(b.weight * b.stickers) as DECIMAL(10,0)) as loadedKg,
+ am.id agencyModeFk,
+ am.name agencyModeName,
+ wo.id warehouseOutFk,
+ wo.name warehouseOutName,
+ w.name warehouseInFk,
+ w.name warehouseInName,
+ SUM(b.stickers) stickers,
+ s.id cargoSupplierFk,
+ s.nickname cargoSupplierNickname,
+ s.name supplierName,
+ CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) loadedKg,
CAST(
SUM(
- vc.aerealVolumetricDensity *
- b.stickers *
+ vc.aerealVolumetricDensity *
+ b.stickers *
IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000
- ) as DECIMAL(10,0)
- ) as volumeKg,
- GREATEST(
- CAST(SUM(b.weight * b.stickers) AS INT),
- CAST(
- SUM(vc.aerealVolumetricDensity *
- b.stickers *
+ ) AS DECIMAL(10,0)
+ ) volumeKg,
+ CAST(
+ GREATEST(
+ SUM(b.weight * b.stickers) ,
+ SUM(vc.aerealVolumetricDensity *
+ b.stickers *
IF(pkg.volume,
pkg.volume,
- pkg.width * pkg.depth * pkg.height
- ) / 1000000
- ) AS INT
- )
- / t.kg * 100, 0) percentageKg
+ pkg.width * pkg.depth * pkg.height) / 1000000)
+ ) / t.kg * 100 AS INT
+ ) percentageKg
FROM travel t
LEFT JOIN supplier s ON s.id = t.cargoSupplierFk
LEFT JOIN entry e ON e.travelFk = t.id
@@ -189,11 +185,12 @@ module.exports = Self => {
CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) as loadedkg,
CAST(
SUM(
- vc.aerealVolumetricDensity *
- b.stickers *
+ vc.aerealVolumetricDensity *
+ b.stickers *
IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000
) AS DECIMAL(10,0)
- ) as volumeKg
+ ) as volumeKg,
+ MAX(i.isCustomInspectionRequired) isCustomInspectionRequired
FROM tmp.travel tr
JOIN entry e ON e.travelFk = tr.id
JOIN buy b ON b.entryFk = e.id
diff --git a/modules/travel/back/methods/travel/filter.js b/modules/travel/back/methods/travel/filter.js
index b96873925..30c1a45fa 100644
--- a/modules/travel/back/methods/travel/filter.js
+++ b/modules/travel/back/methods/travel/filter.js
@@ -83,6 +83,14 @@ module.exports = Self => {
arg: 'daysOnward',
type: 'number',
description: 'The days onward'
+ }, {
+ arg: 'shipped',
+ type: 'date',
+ description: 'The shipped date'
+ }, {
+ arg: 'landed',
+ type: 'date',
+ description: 'The landed date'
}
],
returns: {
@@ -108,6 +116,10 @@ module.exports = Self => {
: {'t.ref': {like: `%${value}%`}};
case 'ref':
return {'t.ref': {like: `%${value}%`}};
+ case 'shipped':
+ return {'t.shipped': value};
+ case 'landed':
+ return {'t.landed': value};
case 'shippedFrom':
return {'t.shipped': {gte: value}};
case 'shippedTo':
diff --git a/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js
index 7e90c7681..8fa013fe4 100644
--- a/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js
+++ b/modules/travel/back/methods/travel/specs/extraCommunityFilter.spec.js
@@ -112,4 +112,17 @@ describe('Travel extraCommunityFilter()', () => {
expect(result.length).toEqual(2);
});
+
+ it('should return field isCustomInspectionRequired true', async() => {
+ const ctx = {
+ args: {
+ id: 2
+ }
+ };
+
+ const result = await app.models.Travel.extraCommunityFilter(ctx, filter);
+
+ expect(result[0].entries[0].isCustomInspectionRequired).toBeTruthy();
+ expect(result[0].entries[1].isCustomInspectionRequired).toBeFalsy();
+ });
});
diff --git a/modules/travel/back/methods/travel/specs/getEntries.spec.js b/modules/travel/back/methods/travel/specs/getEntries.spec.js
index fcaa80d02..9286a9d55 100644
--- a/modules/travel/back/methods/travel/specs/getEntries.spec.js
+++ b/modules/travel/back/methods/travel/specs/getEntries.spec.js
@@ -3,9 +3,10 @@ const models = require('vn-loopback/server/server').models;
describe('travel getEntries()', () => {
const travelId = 1;
it('should check the response contains the id', async() => {
- const entries = await models.Travel.getEntries(travelId);
+ const result = await models.Travel.getEntries(travelId);
+ const entries = await models.Entry.find({where: {travelFk: travelId}});
- expect(entries.length).toEqual(1);
+ expect(entries.length).toEqual(result.length);
expect(entries[0].id).toEqual(1);
});
diff --git a/modules/worker/back/methods/worker-time-control/sendMail.js b/modules/worker/back/methods/worker-time-control/sendMail.js
index 2e1e00d83..5fd5f65ff 100644
--- a/modules/worker/back/methods/worker-time-control/sendMail.js
+++ b/modules/worker/back/methods/worker-time-control/sendMail.js
@@ -41,22 +41,10 @@ module.exports = Self => {
const stmts = [];
let stmt;
- if (!args.week || !args.year) {
- const from = Date.vnNew();
- const to = Date.vnNew();
+ const {date: started, week, year} = Self.getMondayWeekYear(args.week, args.year);
+ args.week = week;
+ args.year = year;
- const time = await models.Time.findOne({
- where: {
- dated: {between: [from.setDate(from.getDate() - 10), to.setDate(to.getDate() - 4)]}
- },
- order: 'week ASC'
- }, myOptions);
-
- args.week = time.week;
- args.year = time.year;
- }
-
- const started = getStartDateOfWeekNumber(args.week, args.year);
started.setHours(0, 0, 0, 0);
const ended = new Date(started);
@@ -388,17 +376,6 @@ module.exports = Self => {
return true;
};
- function getStartDateOfWeekNumber(week, year) {
- const simple = new Date(year, 0, 1 + (week - 1) * 7);
- const dow = simple.getDay();
- const weekStart = simple;
- if (dow <= 4)
- weekStart.setDate(simple.getDate() - simple.getDay() + 1);
- else
- weekStart.setDate(simple.getDate() + 8 - simple.getDay());
- return weekStart;
- }
-
function getTime(timeString) {
const [hours, minutes, seconds] = timeString.split(':');
return [parseInt(hours), parseInt(minutes), parseInt(seconds)];
diff --git a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
index e352eb3cb..eadbecb00 100644
--- a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
+++ b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
@@ -55,8 +55,8 @@ module.exports = Self => {
}
}, myOptions);
- const dated = getMondayDateFromYearWeek(args.year, args.week);
- const timestamp = dated.getTime() / 1000;
+ const {date} = Self.getMondayWeekYear(args.week, args.year);
+ const timestamp = date.getTime() / 1000;
const url = `${salix.url}worker/${args.workerId}/time-control?timestamp=${timestamp}`;
ctx.args.url = url;
@@ -64,23 +64,4 @@ module.exports = Self => {
await models.WorkerTimeControl.updateMailState(ctx, ctx.args.workerId, myOptions);
return Self.sendTemplate(ctx, 'weekly-hour-record');
};
-
- function getMondayDateFromYearWeek(yearNumber, weekNumber) {
- const yearStart = new Date(yearNumber, 0, 1);
- const firstMonday = new Date(yearStart.getTime() + ((7 - yearStart.getDay() + 1) % 7) * 86400000);
- const firstMondayWeekNumber = getWeekNumber(firstMonday);
-
- if (firstMondayWeekNumber > 1)
- firstMonday.setDate(firstMonday.getDate() + 7);
-
- firstMonday.setDate(firstMonday.getDate() + (weekNumber - 1) * 7);
-
- return firstMonday;
- }
-
- function getWeekNumber(date) {
- const firstDayOfYear = new Date(date.getFullYear(), 0, 1);
- const daysPassed = (date - firstDayOfYear) / 86400000;
- return Math.ceil((daysPassed + firstDayOfYear.getDay() + 1) / 7);
- }
};
diff --git a/modules/worker/back/methods/worker/createAbsence.js b/modules/worker/back/methods/worker/createAbsence.js
index 419659083..dc716c95d 100644
--- a/modules/worker/back/methods/worker/createAbsence.js
+++ b/modules/worker/back/methods/worker/createAbsence.js
@@ -58,17 +58,22 @@ module.exports = Self => {
if (!isSubordinate || (isSubordinate && userId == id && !isTeamBoss))
throw new UserError(`You don't have enough privileges`);
+ const now = Date.vnNew();
+ const newDate = new Date(args.dated).getTime();
+
+ if (!await Self.canModifyAbsenceInPast(ctx, newDate))
+ throw new UserError(`Holidays to past days not available`);
+
const labour = await models.WorkerLabour.findById(args.businessFk,
{fields: ['started', 'ended', 'businessFk']}, myOptions);
if (args.dated < labour.started || (labour.ended != null && args.dated > labour.ended))
throw new UserError(`The contract was not active during the selected date`);
- query = `SELECT *
- FROM vn.workerTimeControl
- WHERE userFk = ? AND timed BETWEEN DATE(?) AND CONCAT(DATE(?), ' 23:59:59')
- LIMIT 1;`;
- const [hasHoursRecorded] = await Self.rawSql(query, [id, args.dated, args.dated]);
+ const [hasHoursRecorded] = await Self.rawSql(`SELECT *
+ FROM vn.workerTimeControl
+ WHERE userFk = ? AND timed BETWEEN DATE(?) AND CONCAT(DATE(?), ' 23:59:59')
+ LIMIT 1;`, [id, args.dated, args.dated]);
const absenceType = await models.AbsenceType.findById(args.absenceTypeId, null, myOptions);
@@ -80,7 +85,6 @@ module.exports = Self => {
throw new UserError(`The worker has hours recorded that day`);
const date = Date.vnNew();
- const now = Date.vnNew();
date.setHours(0, 0, 0, 0);
const [result] = await Self.rawSql(
`SELECT COUNT(*) halfHolidayCounter
@@ -122,7 +126,10 @@ module.exports = Self => {
const account = await models.VnUser.findById(userId, null, myOptions);
const subordinated = await models.VnUser.findById(id, null, myOptions);
const worker = await models.Worker.findById(subordinated.id, null, myOptions);
- const departmentBoss = await models.VnUser.findById(worker.bossFk, null, myOptions);
+ const receiver = await models.EmailUser.findOne({
+ fields: ['email'],
+ where: {userFk: worker.bossFk}
+ }, myOptions);
const url = await Self.app.models.Url.getUrl();
const body = $t('Created absence', {
author: account.nickname,
@@ -134,7 +141,7 @@ module.exports = Self => {
await models.Mail.create({
subject: $t('Absence change notification on the labour calendar'),
body: body,
- receiver: departmentBoss.email
+ receiver: receiver.email
}, myOptions);
if (tx) await tx.commit();
diff --git a/modules/worker/back/methods/worker/deleteAbsence.js b/modules/worker/back/methods/worker/deleteAbsence.js
index b71d077a4..596f8f28d 100644
--- a/modules/worker/back/methods/worker/deleteAbsence.js
+++ b/modules/worker/back/methods/worker/deleteAbsence.js
@@ -53,6 +53,10 @@ module.exports = Self => {
}
}
}, myOptions);
+
+ if (!await Self.canModifyAbsenceInPast(ctx, absence.dated.getTime()))
+ throw new UserError(`Holidays to past days not available`);
+
const result = await absence.destroy(myOptions);
const labour = absence.labour();
const department = labour && labour.department();
diff --git a/modules/worker/back/methods/worker/specs/createAbsence.spec.js b/modules/worker/back/methods/worker/specs/createAbsence.spec.js
index fcb1c1633..1c7efcd28 100644
--- a/modules/worker/back/methods/worker/specs/createAbsence.spec.js
+++ b/modules/worker/back/methods/worker/specs/createAbsence.spec.js
@@ -162,4 +162,33 @@ describe('Worker createAbsence()', () => {
expect(error.message).toEqual(`The worker has hours recorded that day`);
});
+
+ it(`Should throw an error when adding a "Vacation" absence on a past day`, async() => {
+ const ctx = {
+ req: {accessToken: {userId: 19}},
+ args: {
+ id: 1110,
+ businessFk: 1110,
+ absenceTypeId: 1,
+ dated: '2000-12-27T23:00:00.000Z',
+ }
+ };
+ const workerId = 19;
+
+ const tx = await app.models.Calendar.beginTransaction({});
+
+ let error;
+ try {
+ const options = {transaction: tx};
+
+ await app.models.Worker.createAbsence(ctx, workerId, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ error = e;
+ }
+
+ expect(error.message).toEqual(`Holidays to past days not available`);
+ });
});
diff --git a/modules/worker/back/methods/worker/specs/deleteAbsence.spec.js b/modules/worker/back/methods/worker/specs/deleteAbsence.spec.js
index 0f3f913dc..c0d05e4a2 100644
--- a/modules/worker/back/methods/worker/specs/deleteAbsence.spec.js
+++ b/modules/worker/back/methods/worker/specs/deleteAbsence.spec.js
@@ -4,6 +4,8 @@ const LoopBackContext = require('loopback-context');
describe('Worker deleteAbsence()', () => {
const businessId = 18;
const workerId = 18;
+ const hrId = 37;
+ const salesBossId = 19;
const activeCtx = {
accessToken: {userId: 1106},
headers: {origin: 'http://localhost'}
@@ -50,16 +52,16 @@ describe('Worker deleteAbsence()', () => {
});
it('should successfully delete an absence', async() => {
- activeCtx.accessToken.userId = 19;
+ activeCtx.accessToken.userId = salesBossId;
const tx = await app.models.Calendar.beginTransaction({});
-
+ const pastDate = new Date(Date.vnNow() + 24 * 60 * 60 * 1000);
try {
const options = {transaction: tx};
const createdAbsence = await app.models.Calendar.create({
businessFk: businessId,
dayOffTypeFk: 1,
- dated: Date.vnNew()
+ dated: pastDate
}, options);
ctx.args = {absenceId: createdAbsence.id};
@@ -76,4 +78,61 @@ describe('Worker deleteAbsence()', () => {
throw e;
}
});
+
+ it('should successfully delete an absence if the user is HR even if the date is in the past', async() => {
+ activeCtx.accessToken.userId = hrId;
+ const tx = await app.models.Calendar.beginTransaction({});
+
+ try {
+ const options = {transaction: tx};
+ const pastDate = new Date(Date.vnNow() - 24 * 60 * 60 * 1000); // Restar un día
+ const createdAbsence = await app.models.Calendar.create({
+ businessFk: businessId,
+ dayOffTypeFk: 1,
+ dated: pastDate
+ }, options);
+
+ ctx.args = {absenceId: createdAbsence.id};
+ await app.models.Worker.deleteAbsence(ctx, workerId, options);
+
+ const deletedAbsence = await app.models.Calendar.findById(createdAbsence.id, null, options);
+
+ expect(deletedAbsence).toBeNull();
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should throw an error if the date is in the past', async() => {
+ activeCtx.accessToken.userId = salesBossId;
+ const tx = await app.models.Calendar.beginTransaction({});
+
+ let error;
+ try {
+ const options = {transaction: tx};
+ const pastDate = new Date(Date.vnNow() - 24 * 60 * 60 * 1000);
+ const createdAbsence = await app.models.Calendar.create({
+ businessFk: businessId,
+ dayOffTypeFk: 1,
+ dated: pastDate
+ }, options);
+
+ ctx.args = {absenceId: createdAbsence.id};
+ await app.models.Worker.deleteAbsence(ctx, workerId, options);
+
+ const deletedAbsence = await app.models.Calendar.findById(createdAbsence.id, null, options);
+
+ expect(deletedAbsence).toBeNull();
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ error = e;
+ }
+
+ expect(error.message).toBe('Holidays to past days not available');
+ });
});
diff --git a/modules/worker/back/models/device-production-user.json b/modules/worker/back/models/device-production-user.json
index a024cc94c..31aaf92d4 100644
--- a/modules/worker/back/models/device-production-user.json
+++ b/modules/worker/back/models/device-production-user.json
@@ -25,7 +25,7 @@
"userFk": {
"type": "number"
},
- "simSerialNumber": {
+ "simFk": {
"type": "string"
},
"created": {
diff --git a/modules/worker/back/models/worker-irpf.json b/modules/worker/back/models/worker-irpf.json
index 65f72a1fd..eafda0596 100644
--- a/modules/worker/back/models/worker-irpf.json
+++ b/modules/worker/back/models/worker-irpf.json
@@ -23,7 +23,7 @@
"type" : "number"
},
"isDependend": {
- "type" : "number"
+ "type" : "boolean"
},
"familySituation": {
"type" : "number"
@@ -35,15 +35,17 @@
"type" : "number"
},
"hasHousingPaymentBefore": {
- "type" : "number"
+ "type" : "boolean"
},
"hasHousingPaymentAfter": {
- "type" : "number"
+ "type" : "boolean"
},
"updated": {
"type" : "date"
+ },
+ "hasExtendedWorking": {
+ "type" : "boolean"
}
-
},
"relations": {
"disabilityGrade": {
diff --git a/modules/worker/back/models/worker-time-control.js b/modules/worker/back/models/worker-time-control.js
index 92f1bacf0..cdf51b712 100644
--- a/modules/worker/back/models/worker-time-control.js
+++ b/modules/worker/back/models/worker-time-control.js
@@ -1,4 +1,5 @@
const UserError = require('vn-loopback/util/user-error');
+const moment = require('moment');
module.exports = Self => {
require('../methods/worker-time-control/filter')(Self);
@@ -19,4 +20,15 @@ module.exports = Self => {
return new UserError(`The introduced hour already exists`);
return err;
});
+
+ Self.getMondayWeekYear = (week, year) => {
+ if (!week || !year) {
+ const today = Date.vnNew();
+ today.setDate(today.getDate() - 7);
+ week = moment(today).isoWeek();
+ year = moment(today).isoWeekYear();
+ }
+ const date = moment(year, 'YYYY').week(week).startOf('isoweek').toDate();
+ return {date, year, week};
+ };
};
diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js
index 3351c348c..2e45b78da 100644
--- a/modules/worker/back/models/worker.js
+++ b/modules/worker/back/models/worker.js
@@ -26,6 +26,13 @@ module.exports = Self => {
message: 'Invalid TIN'
});
+ Self.canModifyAbsenceInPast = async(ctx, time) => {
+ const hasPrivs = await Self.app.models.ACL.checkAccessAcl(ctx, 'Worker', 'canModifyAbsenceInPast', 'WRITE');
+ const today = Date.vnNew();
+ today.setHours(0, 0, 0, 0);
+ return hasPrivs || today.getTime() < time;
+ };
+
async function tinIsValid(err, done) {
const country = await Self.app.models.Country.findOne({
fields: ['code'],
diff --git a/modules/zone/back/methods/zone/deleteZone.js b/modules/zone/back/methods/zone/deleteZone.js
index 7432475b3..a147ee588 100644
--- a/modules/zone/back/methods/zone/deleteZone.js
+++ b/modules/zone/back/methods/zone/deleteZone.js
@@ -51,9 +51,9 @@ module.exports = Self => {
};
const ticketList = await models.Ticket.find(filter, myOptions);
-
- if (ticketList.length > 0)
- throw new UserError('There are tickets for this area, delete them first');
+ const hasRefFk = ticketList.some(ticket => !ticket.refFk);
+ if (hasRefFk)
+ throw new UserError('There are tickets to be invoiced');
await models.Zone.destroyById(id, myOptions);
diff --git a/modules/zone/back/methods/zone/specs/deleteZone.spec.js b/modules/zone/back/methods/zone/specs/deleteZone.spec.js
index aef7fd290..510713f9e 100644
--- a/modules/zone/back/methods/zone/specs/deleteZone.spec.js
+++ b/modules/zone/back/methods/zone/specs/deleteZone.spec.js
@@ -8,14 +8,14 @@ describe('zone deletezone()', () => {
__: value => value
};
const ctx = {req: activeCtx};
- const zoneId = 4;
- const zoneId2 = 3;
let ticketIDs;
beforeAll(async() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
});
+
+ const zoneId = 4;
const originalTickets = await models.Ticket.find({
where: {
zoneFk: zoneId
@@ -29,7 +29,7 @@ describe('zone deletezone()', () => {
it('should delete a zone and update their tickets', async() => {
const tx = await models.Zone.beginTransaction({});
-
+ const zoneId = 4;
try {
const options = {transaction: tx};
await models.Zone.deleteZone(ctx, zoneId, options);
@@ -47,17 +47,18 @@ describe('zone deletezone()', () => {
it('should not delete the zone if it has tickets', async() => {
const tx = await models.Zone.beginTransaction({});
+ const zoneId = 1;
let error;
try {
const options = {transaction: tx};
- await models.Zone.deleteZone(ctx, zoneId2, options);
+ await models.Zone.deleteZone(ctx, zoneId, options);
await tx.rollback();
} catch (e) {
error = e.message;
await tx.rollback();
}
- expect(error).toEqual('There are tickets for this area, delete them first');
+ expect(error).toEqual('There are tickets to be invoiced');
});
});
diff --git a/modules/zone/back/model-config.json b/modules/zone/back/model-config.json
index 3bbbe0d1b..2cd3f9d01 100644
--- a/modules/zone/back/model-config.json
+++ b/modules/zone/back/model-config.json
@@ -17,6 +17,9 @@
"ZoneClosure": {
"dataSource": "vn"
},
+ "ZoneConfig": {
+ "dataSource": "vn"
+ },
"ZoneEvent": {
"dataSource": "vn"
},
diff --git a/modules/zone/back/models/zone-config.json b/modules/zone/back/models/zone-config.json
new file mode 100644
index 000000000..a5da7fe55
--- /dev/null
+++ b/modules/zone/back/models/zone-config.json
@@ -0,0 +1,28 @@
+{
+ "name": "ZoneConfig",
+ "options": {
+ "mysql": {
+ "table": "zoneConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "scope": {
+ "type": "number"
+ },
+ "forwardDays": {
+ "type": "number"
+ }
+ },
+ "relations": {
+ "address": {
+ "type": "belongsTo",
+ "model": "Address",
+ "foreignKey": "defaultAddressFk"
+ }
+ }
+}
diff --git a/modules/zone/back/models/zone.js b/modules/zone/back/models/zone.js
index 6d5a6cdca..7b5cb4301 100644
--- a/modules/zone/back/models/zone.js
+++ b/modules/zone/back/models/zone.js
@@ -14,4 +14,18 @@ module.exports = Self => {
Self.validatesPresenceOf('agencyModeFk', {
message: `Agency cannot be blank`
});
+
+ Self.validatesPresenceOf('price', {
+ message: 'Price cannot be blank'
+ });
+ Self.validateAsync('price', priceIsValid, {
+ message: 'Price must be greater than 0'
+ });
+
+ async function priceIsValid(err, done) {
+ if (this.price <= 0)
+ err();
+
+ done();
+ }
};
diff --git a/modules/zone/back/models/zone.json b/modules/zone/back/models/zone.json
index 5b25e40d1..141b28750 100644
--- a/modules/zone/back/models/zone.json
+++ b/modules/zone/back/models/zone.json
@@ -1,9 +1,9 @@
{
"name": "Zone",
"base": "VnModel",
- "mixins": {
- "Loggable": true
- },
+ "mixins": {
+ "Loggable": true
+ },
"options": {
"mysql": {
"table": "zone"
@@ -48,30 +48,35 @@
}
},
"relations": {
- "agencyMode": {
- "type": "belongsTo",
- "model": "AgencyMode",
- "foreignKey": "agencyModeFk"
+ "agencyMode": {
+ "type": "belongsTo",
+ "model": "AgencyMode",
+ "foreignKey": "agencyModeFk"
},
"events": {
- "type": "hasMany",
- "model": "ZoneEvent",
- "foreignKey": "zoneFk"
- },
+ "type": "hasMany",
+ "model": "ZoneEvent",
+ "foreignKey": "zoneFk"
+ },
"exclusions": {
- "type": "hasMany",
- "model": "ZoneExclusion",
+ "type": "hasMany",
+ "model": "ZoneExclusion",
"foreignKey": "zoneFk"
},
"warehouses": {
"type": "hasMany",
"model": "ZoneWarehouse",
"foreignKey": "zoneFk"
- },
+ },
"closures": {
"type": "hasMany",
"model": "ZoneClosure",
"foreignKey": "zoneFk"
- }
- }
+ },
+ "address": {
+ "type": "belongsTo",
+ "model": "Address",
+ "foreignKey": "addressFk"
+ }
+ }
}
diff --git a/myt.config.yml b/myt.config.yml
index 209686fd4..a947405b3 100755
--- a/myt.config.yml
+++ b/myt.config.yml
@@ -71,6 +71,7 @@ fixtures:
- ticketUpdateAction
- ticketCanAdvanceConfig
- volumeConfig
+ - workerActivityType
- workCenter
- workerTimeControlError
cache:
diff --git a/package.json b/package.json
index ef1dd8f89..e4cbf1406 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "salix-back",
- "version": "24.50.0",
+ "version": "25.04.0",
"author": "Verdnatura Levante SL",
"description": "Salix backend",
"license": "GPL-3.0",
diff --git a/print/templates/email/incoterms-authorization/locale/en.yml b/print/templates/email/incoterms-authorization/locale/en.yml
new file mode 100644
index 000000000..7e1402575
--- /dev/null
+++ b/print/templates/email/incoterms-authorization/locale/en.yml
@@ -0,0 +1,6 @@
+subject: Incoterms Authorization
+title: Incoterms Authorization
+description:
+ dear: Dear customer
+ instructions: Please find attached the Incoterms authorization form, which you must complete and sign.
+ conclusion: Thank you for your attention!
diff --git a/print/templates/reports/balance-compensation/locale/en.yml b/print/templates/reports/balance-compensation/locale/en.yml
new file mode 100644
index 000000000..824127482
--- /dev/null
+++ b/print/templates/reports/balance-compensation/locale/en.yml
@@ -0,0 +1,16 @@
+reportName: balance-compensation
+Place: Algemesí, on
+Compensation: Compensation of debtor and creditor balances
+In one hand: On one hand
+CIF: with CIF
+NIF: with NIF
+Home: and address located at
+In other hand: On the other hand
+Sr: Mr./Ms.
+Agree: Agree
+Date: On the date of
+Compensate: the balance of has been compensated
+From client: from the client/supplier
+Against the balance of: against the balance of
+Reception: Please confirm receipt of this compensation at the email
+Greetings: Best regards,
diff --git a/print/templates/reports/buy-label-barcode/assets/css/style.css b/print/templates/reports/buy-label-barcode/assets/css/style.css
index eece20acb..ce1924878 100644
--- a/print/templates/reports/buy-label-barcode/assets/css/style.css
+++ b/print/templates/reports/buy-label-barcode/assets/css/style.css
@@ -33,7 +33,9 @@ td {
font-size: 26px;
}
.lg-txt {
- font-size: 32px;
+ font-size: 40px;
+ padding: 0px;
+ line-height: 1;
}
.xl-txt {
font-size: 50px;
diff --git a/print/templates/reports/buy-label-barcode/buy-label-barcode.html b/print/templates/reports/buy-label-barcode/buy-label-barcode.html
index c1725f5c0..ebddb60ec 100644
--- a/print/templates/reports/buy-label-barcode/buy-label-barcode.html
+++ b/print/templates/reports/buy-label-barcode/buy-label-barcode.html
@@ -36,12 +36,12 @@
-
+ |
{{formatNumber(buy.itemFk)}}
|
-
+ |
{{`${(packing || buy.packing)} x ${buy.stems || ''}`}}
diff --git a/print/templates/reports/buy-label-barcode/buy-label-barcode.js b/print/templates/reports/buy-label-barcode/buy-label-barcode.js
index a0359acc9..37b618f09 100755
--- a/print/templates/reports/buy-label-barcode/buy-label-barcode.js
+++ b/print/templates/reports/buy-label-barcode/buy-label-barcode.js
@@ -20,7 +20,7 @@ module.exports = {
xmlDocument: document,
format: 'code128',
displayValue: false,
- width: 3.8,
+ width: 3.5,
height: 75,
margin: 0
});
diff --git a/print/templates/reports/buy-label-supplier/assets/css/style.css b/print/templates/reports/buy-label-supplier/assets/css/style.css
index 3b1f2f91e..f64e01688 100644
--- a/print/templates/reports/buy-label-supplier/assets/css/style.css
+++ b/print/templates/reports/buy-label-supplier/assets/css/style.css
@@ -1,7 +1,7 @@
html {
font-family: "Roboto", "Helvetica", "Arial", sans-serif;
margin-top: -7px;
- font-size: 28px;
+ font-size: 20px;
}
table {
border: 1px solid;
@@ -10,22 +10,22 @@ table {
}
td {
border: 1px solid;
- padding: 5px;
+ padding: 2px;
width: 100%;
}
span {
- font-size: 48px;
+ font-size: 34px;
font-weight: bold;
}
.lbl {
color: gray;
font-weight: lighter;
- font-size: 18px;
+ font-size: 12px;
display: block;
}
.cell {
width: 157px;
- height: 50px;
+ height: 35px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
diff --git a/print/templates/reports/buy-label-supplier/buy-label-supplier.html b/print/templates/reports/buy-label-supplier/buy-label-supplier.html
index 5777d34de..31fef38f7 100644
--- a/print/templates/reports/buy-label-supplier/buy-label-supplier.html
+++ b/print/templates/reports/buy-label-supplier/buy-label-supplier.html
@@ -86,7 +86,7 @@
|
{{$t('boxNum')}}
- {{`${buy.labelNum} / ${buy.maxLabelNum}`}}
+ {{getTotal(buy)}}
|
diff --git a/print/templates/reports/buy-label-supplier/buy-label-supplier.js b/print/templates/reports/buy-label-supplier/buy-label-supplier.js
index 3cef5f295..c8af17a5d 100755
--- a/print/templates/reports/buy-label-supplier/buy-label-supplier.js
+++ b/print/templates/reports/buy-label-supplier/buy-label-supplier.js
@@ -9,8 +9,8 @@ module.exports = {
mixins: [vnReport],
async serverPrefetch() {
const buy = await models.Buy.findById(this.id, null);
- this.buys = await this.rawSqlFromDef('buy', [buy.entryFk, buy.entryFk, buy.entryFk, this.id]);
- const date = new Date();
+ this.buys = await this.rawSqlFromDef('buy', [buy.entryFk, buy.entryFk, buy.entryFk, this.id, this.id]);
+ const date = Date.vnNew();
this.weekNum = moment(date).isoWeek();
this.dayNum = moment(date).day();
},
@@ -24,9 +24,15 @@ module.exports = {
format: 'code128',
displayValue: false,
width: 3.8,
- height: 115,
+ height: 60,
+ margin: 3,
});
return new XMLSerializer().serializeToString(svgNode);
+ },
+ getTotal(buy) {
+ return (this.showEntryLines) ?
+ `${buy.entryLabelNum} / ${buy.entryLabels}` :
+ `${buy.buyLabelNum} / ${buy.buyLabels}`;
}
},
props: {
@@ -34,6 +40,10 @@ module.exports = {
type: Number,
required: true,
description: 'The entry id'
+ },
+ showEntryLines: {
+ type: Boolean,
+ required: false
}
}
};
diff --git a/print/templates/reports/buy-label-supplier/options.json b/print/templates/reports/buy-label-supplier/options.json
index 4ed0461b3..a2a781cbf 100644
--- a/print/templates/reports/buy-label-supplier/options.json
+++ b/print/templates/reports/buy-label-supplier/options.json
@@ -1,6 +1,6 @@
{
"width": "10cm",
- "height": "10cm",
+ "height": "6.5cm",
"margin": {
"top": "0.17cm",
"right": "0.2cm",
diff --git a/print/templates/reports/buy-label-supplier/sql/buy.sql b/print/templates/reports/buy-label-supplier/sql/buy.sql
index 26efeb06e..fe001ff10 100644
--- a/print/templates/reports/buy-label-supplier/sql/buy.sql
+++ b/print/templates/reports/buy-label-supplier/sql/buy.sql
@@ -10,7 +10,7 @@ WITH RECURSIVE numbers AS (
)
),
labels AS (
- SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) labelNum,
+ SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) entryLabelNum,
i.name,
i.`size`,
i.category,
@@ -33,6 +33,9 @@ labels AS (
WHERE b.entryFk = ?
AND num.n <= b.stickers
)
-SELECT *, (SELECT SUM(stickers) FROM buy WHERE entryFk = ?) maxLabelNum
+SELECT *,
+ ROW_NUMBER() OVER(ORDER BY entryLabelNum) buyLabelNum,
+ (SELECT SUM(stickers) FROM buy WHERE entryFk = ?) entryLabels,
+ (SELECT stickers FROM buy WHERE id = ?) buyLabels
FROM labels
WHERE id = ?
\ No newline at end of file
diff --git a/print/templates/reports/driver-route/driver-route.html b/print/templates/reports/driver-route/driver-route.html
index 109afd2f5..e3a206656 100644
--- a/print/templates/reports/driver-route/driver-route.html
+++ b/print/templates/reports/driver-route/driver-route.html
@@ -16,7 +16,7 @@
{{$t('date')}} |
- {{formatDate(route.created, '%d-%m-%Y')}} |
+ {{formatDate(route.dated, '%d-%m-%Y')}} |
{{$t('vehicle')}} |
{{route.vehicleTradeMark}} {{route.vehicleModel}} |
diff --git a/print/templates/reports/driver-route/sql/routes.sql b/print/templates/reports/driver-route/sql/routes.sql
index 9d2dd5c13..334f2337d 100644
--- a/print/templates/reports/driver-route/sql/routes.sql
+++ b/print/templates/reports/driver-route/sql/routes.sql
@@ -1,6 +1,6 @@
SELECT r.id,
r.m3,
- r.created,
+ r.dated,
r.time,
u.nickName userNickName,
v.tradeMark vehicleTradeMark,
diff --git a/print/templates/reports/expedition-pallet-label/sql/labelData.sql b/print/templates/reports/expedition-pallet-label/sql/labelData.sql
index 49a4031ae..5ddf8eb6e 100644
--- a/print/templates/reports/expedition-pallet-label/sql/labelData.sql
+++ b/print/templates/reports/expedition-pallet-label/sql/labelData.sql
@@ -4,7 +4,7 @@ SELECT ep.id palletFk,
r.description `zone`,
COUNT(es.id) labels,
t.warehouseFk warehouseFk,
- dayname(r.created) `dayName`,
+ dayname(r.dated) `dayName`,
rs.id <=> rm.roadmapStopFk isMatch
FROM vn.roadmapStop rs
JOIN vn.expeditionPallet ep ON ep.truckFk = rs.id
diff --git a/print/templates/reports/incoterms-authorization/locale/en.yml b/print/templates/reports/incoterms-authorization/locale/en.yml
new file mode 100644
index 000000000..eb6a8a513
--- /dev/null
+++ b/print/templates/reports/incoterms-authorization/locale/en.yml
@@ -0,0 +1,39 @@
+reportName: autorization-incoterms
+description: '{socialName} a duly constituted and responsible company limited
+and registered under corporate law {country} and here represented by {socialName}, with address in {address},
+CIF {fiscalID}. Hereinafter referred to as {name}.'
+issued: 'In {0}, on {1} of {2} of {3}'
+client: 'Customer {0}'
+declaration: '{socialName} hereby declares that:'
+declarations:
+ - 'All purchases made by {socialName} with {companyName} They are delivered according to the conditions defined in the Incoterm.'
+ - '{socialName} recognizes that it is important for {companyName} have
+proof of intra-community delivery of the goods to {destinationCountry} to
+be able to invoice with 0% VAT.'
+ - 'Therefore, by signing this agreement, {socialName} declares that all goods
+purchased from {companyName} will be delivered to {destinationCountry}.'
+ - 'Besides, {socialName} shall, at the first request of {companyName},
+provide proof that all products purchased from {companyName} have
+been delivered in {destinationCountry}.'
+ - 'In addition to the above, {companyName} will provide to {socialName}
+a monthly summary that includes all bills (and corresponding deliveries).
+{socialName} will sign and return the monthly summary to {companyName},
+S.L. within 5 days of receiving the summary.'
+signer:
+ representative: Representative
+ representativeRole: Position of the representative
+ signed: Date of signature
+manager: Manager
+months:
+ - 'January'
+ - 'February'
+ - 'March'
+ - 'April'
+ - 'May'
+ - 'June'
+ - 'July'
+ - 'August'
+ - 'September'
+ - 'October'
+ - 'November'
+ - 'December'
diff --git a/print/templates/reports/invoice-incoterms/sql/incoterms.sql b/print/templates/reports/invoice-incoterms/sql/incoterms.sql
index 016a8342e..535451674 100644
--- a/print/templates/reports/invoice-incoterms/sql/incoterms.sql
+++ b/print/templates/reports/invoice-incoterms/sql/incoterms.sql
@@ -1,9 +1,9 @@
WITH tickets AS(
-SELECT id, packages, addressFk, weight
- FROM ticket
- WHERE refFk= ?
+SELECT id, addressFk, packages, refFk
+ FROM vn.ticket
+ WHERE refFk = ?
), volume AS(
-SELECT SUM(volume) volume
+SELECT SUM(volume) volume, MAX(weight)weight
FROM tickets t
JOIN vn.saleVolume sv ON sv.ticketFk = t.id
), intrastat AS(
@@ -12,10 +12,14 @@ SELECT GROUP_CONCAT(DISTINCT ir.description ORDER BY ir.description SEPARATOR '
JOIN vn.sale s ON t.id = s.ticketFk
JOIN vn.item i ON i.id = s.itemFk
JOIN vn.intrastat ir ON ir.id = i.intrastatFk
-)SELECT SUM(t.packages) packages,
- a.incotermsFk,
+), totalPackages AS(
+SELECT SUM(packages)packages
+ FROM tickets s
+)
+SELECT tp.packages,
+ io.incotermsFk,
ic.name incotermsName,
- MAX(t.weight) weight,
+ v.weight weight,
ca.fiscalName customsAgentName,
ca.street customsAgentStreet,
ca.nif customsAgentNif,
@@ -23,9 +27,10 @@ SELECT GROUP_CONCAT(DISTINCT ir.description ORDER BY ir.description SEPARATOR '
ca.email customsAgentEmail,
CAST(v.volume AS DECIMAL (10,2)) volume,
i.intrastat
- FROM tickets t
- JOIN vn.address a ON a.id = t.addressFk
- JOIN vn.incoterms ic ON ic.code = a.incotermsFk
- LEFT JOIN vn.customsAgent ca ON ca.id = a.customsAgentFk
+ FROM vn.invoiceOut io
+ JOIN vn.incoterms ic ON ic.code = io.incotermsFk
+ LEFT JOIN vn.customsAgent ca ON ca.id = io.customsAgentFk
JOIN volume v
JOIN intrastat i
+ JOIN totalPackages tp
+ WHERE `ref` = (SELECT DISTINCT refFk FROM tickets)
\ No newline at end of file