Merge branch 'dev' into 7716-travel_setDelivered
gitea/salix/pipeline/pr-dev This commit looks good
Details
gitea/salix/pipeline/pr-dev This commit looks good
Details
This commit is contained in:
commit
6cef9175c0
|
@ -63,8 +63,7 @@ module.exports = Self => {
|
|||
iss.isPicked
|
||||
FROM ticketCollection tc
|
||||
LEFT JOIN collection c ON c.id = tc.collectionFk
|
||||
JOIN ticket t ON t.id = tc.ticketFk
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
JOIN sale s ON s.ticketFk = tc.ticketFk
|
||||
LEFT JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
|
||||
LEFT JOIN saleGroup sg ON sg.id = sgd.saleGroupFk
|
||||
LEFT JOIN parking p2 ON p2.id = sg.parkingFk
|
||||
|
@ -103,9 +102,8 @@ module.exports = Self => {
|
|||
FROM sectorCollection sc
|
||||
JOIN sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id
|
||||
JOIN saleGroup sg ON sg.id = ss.saleGroupFk
|
||||
JOIN ticket t ON t.id = sg.ticketFk
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
LEFT JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
|
||||
LEFT JOIN saleGroupDetail sgd ON sgd.saleGroupFk = sg.id
|
||||
JOIN sale s ON s.id = sgd.saleFk
|
||||
LEFT JOIN parking p2 ON p2.id = sg.parkingFk
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN itemShelvingSale iss ON iss.saleFk = s.id
|
||||
|
|
|
@ -24,7 +24,7 @@ module.exports = Self => {
|
|||
|
||||
try {
|
||||
const options = {transaction: tx, userId: ctx.req.accessToken.userId};
|
||||
const files = await Self.rawSql('SELECT name, checksum, keyValue FROM edi.fileConfig', null, options);
|
||||
const files = await Self.rawSql('SELECT name, checksum, keyValue FROM edi.fileMultiConfig', null, options);
|
||||
|
||||
const updatableFiles = [];
|
||||
for (const file of files) {
|
||||
|
@ -54,7 +54,7 @@ module.exports = Self => {
|
|||
|
||||
const tables = await Self.rawSql(`
|
||||
SELECT fileName, toTable, file
|
||||
FROM edi.tableConfig
|
||||
FROM edi.tableMultiConfig
|
||||
WHERE file IN (?)`, [fileNames], options);
|
||||
|
||||
for (const table of tables) {
|
||||
|
@ -85,9 +85,9 @@ module.exports = Self => {
|
|||
for (const file of updatableFiles) {
|
||||
console.log(`Updating file ${file.name} checksum...`);
|
||||
await Self.rawSql(`
|
||||
UPDATE edi.fileConfig
|
||||
SET checksum = ?
|
||||
WHERE name = ?`,
|
||||
UPDATE edi.fileMultiConfig
|
||||
SET checksum = ?
|
||||
WHERE name = ?`,
|
||||
[file.checksum, file.name], options);
|
||||
}
|
||||
|
||||
|
@ -228,7 +228,7 @@ module.exports = Self => {
|
|||
|
||||
await Self.rawSql(sqlTemplate, [filePath], options);
|
||||
await Self.rawSql(`
|
||||
UPDATE edi.tableConfig
|
||||
UPDATE edi.tableMultiConfig
|
||||
SET updated = ?
|
||||
WHERE fileName = ?
|
||||
`, [Date.vnNew(), baseName], options);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<soap:Header>
|
||||
<mrw:AuthInfo>
|
||||
<mrw:CodigoFranquicia><%= mrw.franchiseCode %></mrw:CodigoFranquicia>
|
||||
<mrw:CodigoAbonado><%= mrw.subscriberCode %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoAbonado><%= clientType %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoDepartamento/>
|
||||
<mrw:UserName><%= mrw.user %></mrw:UserName>
|
||||
<mrw:Password><%= mrw.password %></mrw:Password>
|
||||
|
|
|
@ -13,7 +13,7 @@ module.exports = Self => {
|
|||
required: true
|
||||
}],
|
||||
returns: {
|
||||
type: ['object'],
|
||||
type: 'boolean',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
|
@ -27,9 +27,9 @@ module.exports = Self => {
|
|||
|
||||
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});
|
||||
const renderedXml = ejs.render(template, {mrw, externalId, clientType});
|
||||
const response = await axios.post(mrw.url, renderedXml, {
|
||||
headers: {
|
||||
'Content-Type': 'application/soap+xml; charset=utf-8'
|
||||
|
@ -39,6 +39,7 @@ module.exports = Self => {
|
|||
const xmlString = response.data;
|
||||
const parser = new DOMParser();
|
||||
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
|
||||
return xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
|
||||
const result = xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
|
||||
return result.toLowerCase().includes('se ha cancelado correctamente');
|
||||
};
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<soap:Header>
|
||||
<mrw:AuthInfo>
|
||||
<mrw:CodigoFranquicia><%= mrw.franchiseCode %></mrw:CodigoFranquicia>
|
||||
<mrw:CodigoAbonado><%= expeditionData.clientType %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoAbonado><%= clientType %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoDepartamento/>
|
||||
<mrw:UserName><%= mrw.user %></mrw:UserName>
|
||||
<mrw:Password><%= mrw.password %></mrw:Password>
|
||||
|
|
|
@ -22,6 +22,7 @@ module.exports = Self => {
|
|||
Self.createShipment = async expeditionFk => {
|
||||
const models = Self.app.models;
|
||||
const mrw = await Self.getConfig();
|
||||
const clientType = await models.MrwConfig.getClientType(expeditionFk);
|
||||
|
||||
const today = Date.vnNew();
|
||||
const [hours, minutes] = mrw?.expeditionDeadLine ? mrw.expeditionDeadLine.split(':').map(Number) : [0, 0];
|
||||
|
@ -52,8 +53,7 @@ module.exports = Self => {
|
|||
CONCAT( e.ticketFk, LPAD(e.counter, mc.counterWidth, '0')) reference,
|
||||
LPAD(IF(mw.serviceType IS NULL, ms.serviceType, mw.serviceType), mc.serviceTypeWidth, '0') serviceType,
|
||||
IF(mw.weekdays, 'S', 'N') weekDays,
|
||||
oa.description deliveryObservation,
|
||||
LPAD(ms.clientType, mc.clientTypeWidth, '0') clientType
|
||||
oa.description deliveryObservation
|
||||
FROM expedition e
|
||||
JOIN ticket t ON e.ticketFk = t.id
|
||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||
|
@ -63,8 +63,7 @@ module.exports = Self => {
|
|||
JOIN client c ON t.clientFk = c.id
|
||||
JOIN address a ON t.addressFk = a.id
|
||||
LEFT JOIN addressObservation oa ON oa.addressFk = a.id
|
||||
LEFT JOIN observationType ot ON ot.id = oa.observationTypeFk
|
||||
AND ot.code = 'delivery'
|
||||
AND oa.observationTypeFk IN (SELECT id FROM observationType ot WHERE ot.code = 'delivery')
|
||||
JOIN province p ON a.provinceFk = p.id
|
||||
JOIN country co ON co.id = p.countryFk
|
||||
JOIN mrwConfig mc
|
||||
|
@ -73,22 +72,19 @@ module.exports = Self => {
|
|||
|
||||
const [expeditionData] = await Self.rawSql(query, [expeditionFk]);
|
||||
|
||||
if (!expeditionData)
|
||||
throw new UserError(`This expedition is not a MRW shipment`);
|
||||
|
||||
if (expeditionData?.shipped.setHours(0, 0, 0, 0) < today.setHours(0, 0, 0, 0))
|
||||
throw new UserError(`This ticket has a shipped date earlier than today`);
|
||||
|
||||
const shipmentResponse = await Self.sendXmlDoc(
|
||||
__dirname + `/createShipment.ejs`,
|
||||
{mrw, expeditionData},
|
||||
{mrw, expeditionData, clientType},
|
||||
'application/soap+xml'
|
||||
);
|
||||
const shipmentId = Self.getTextByTag(shipmentResponse, 'NumeroEnvio');
|
||||
|
||||
if (!shipmentId) throw new UserError(Self.getTextByTag(shipmentResponse, 'Mensaje'));
|
||||
|
||||
const file = await models.MrwConfig.getLabel(shipmentId);
|
||||
const file = await models.MrwConfig.getLabel(shipmentId, clientType);
|
||||
|
||||
return {shipmentId, file};
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<soapenv:Header>
|
||||
<mrw:AuthInfo>
|
||||
<mrw:CodigoFranquicia><%= mrw.franchiseCode %></mrw:CodigoFranquicia>
|
||||
<mrw:CodigoAbonado><%= mrw.subscriberCode %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoAbonado><%= clientType %></mrw:CodigoAbonado>
|
||||
<mrw:CodigoDepartamento/>
|
||||
<mrw:UserName><%= mrw.user %></mrw:UserName>
|
||||
<mrw:Password><%= mrw.password %></mrw:Password>
|
||||
|
|
|
@ -6,7 +6,13 @@ module.exports = Self => {
|
|||
arg: 'shipmentId',
|
||||
type: 'string',
|
||||
required: true
|
||||
}],
|
||||
},
|
||||
{
|
||||
arg: 'clientType',
|
||||
type: 'string',
|
||||
required: true
|
||||
},
|
||||
],
|
||||
returns: {
|
||||
type: 'string',
|
||||
root: true
|
||||
|
@ -17,10 +23,14 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.getLabel = async shipmentId => {
|
||||
Self.getLabel = async(shipmentId, clientType) => {
|
||||
const mrw = await Self.getConfig();
|
||||
|
||||
const getLabelResponse = await Self.sendXmlDoc(__dirname + `/getLabel.ejs`, {mrw, shipmentId}, 'text/xml');
|
||||
const getLabelResponse = await Self.sendXmlDoc(
|
||||
__dirname + `/getLabel.ejs`,
|
||||
{mrw, shipmentId, clientType},
|
||||
'text/xml'
|
||||
);
|
||||
|
||||
return Self.getTextByTag(getLabelResponse, 'EtiquetaFile');
|
||||
};
|
||||
|
|
|
@ -40,15 +40,12 @@ describe('MRWConfig createShipment()', () => {
|
|||
|
||||
);
|
||||
|
||||
await models.MrwService.create(
|
||||
{'agencyModeCodeFk': 'mrw', 'clientType': '000001', 'serviceType': 105, 'kg': 10}
|
||||
);
|
||||
|
||||
await createMrwConfig();
|
||||
|
||||
await models.Application.rawSql(
|
||||
`INSERT INTO vn.mrwService
|
||||
SET agencyModeCodeFk = 'mrw',
|
||||
clientType = 1,
|
||||
serviceType = 1,
|
||||
kg = 1`, null
|
||||
);
|
||||
await models.Ticket.create(ticket1);
|
||||
await models.Expedition.create(expedition1);
|
||||
});
|
||||
|
@ -82,7 +79,8 @@ describe('MRWConfig createShipment()', () => {
|
|||
'user': 'user',
|
||||
'password': 'password',
|
||||
'franchiseCode': 'franchiseCode',
|
||||
'subscriberCode': 'subscriberCode'
|
||||
'subscriberCode': 'subscriberCode',
|
||||
'clientTypeWidth': 6
|
||||
}
|
||||
);
|
||||
}
|
||||
|
@ -115,10 +113,10 @@ describe('MRWConfig createShipment()', () => {
|
|||
|
||||
it('should fail if expeditionFk is not a MrwExpedition', async() => {
|
||||
let error;
|
||||
await models.MrwConfig.createShipment(undefined).catch(e => {
|
||||
await models.MrwConfig.createShipment(15).catch(e => {
|
||||
error = e;
|
||||
}).finally(async() => {
|
||||
expect(error.message).toEqual(`This expedition is not a MRW shipment`);
|
||||
expect(error.message).toEqual(`ClientType not available`);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.renderer = async (expeditionFk) => {
|
||||
Self.renderer = async expeditionFk => {
|
||||
const models = Self.app.models;
|
||||
|
||||
const viaexpressConfig = await models.ViaexpressConfig.findOne({
|
||||
|
@ -109,7 +109,7 @@ module.exports = Self => {
|
|||
const ticket = expedition.ticket();
|
||||
const sender = ticket.company().client();
|
||||
const shipped = ticket.shipped.toISOString();
|
||||
const isInterdia = (ticket.agencyModeFk === viaexpressConfig.agencyModeFk)
|
||||
const isInterdia = (ticket.agencyModeFk === viaexpressConfig.agencyModeFk);
|
||||
const data = {
|
||||
viaexpressConfig,
|
||||
sender,
|
||||
|
|
|
@ -192,5 +192,8 @@
|
|||
},
|
||||
"RouteConfig": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"MrwService": {
|
||||
"dataSource": "vn"
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
"base": "VnModel",
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "salix.defaultViewConfig"
|
||||
"table": "salix.defaultViewMultiConfig"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
|
|
|
@ -31,5 +31,30 @@ module.exports = Self => {
|
|||
});
|
||||
return parser.parseFromString(data.data, 'text/xml');
|
||||
};
|
||||
|
||||
Self.getClientType = async function(expeditionFk) {
|
||||
if (!expeditionFk) throw new UserError(`No expeditionFk defined`);
|
||||
|
||||
const {clientTypeWidth} = await Self.getConfig();
|
||||
const result = await Self.app.models.Expedition.findById(expeditionFk,
|
||||
{include: [{
|
||||
relation: 'ticket',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'agencyMode',
|
||||
scope: {
|
||||
include: {
|
||||
relation: 'mrwService',
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}]}
|
||||
);
|
||||
const clientType = result?.ticket()?.agencyMode()?.mrwService()?.clientType;
|
||||
if (!clientType || !clientTypeWidth) throw new UserError(`ClientType not available`);
|
||||
|
||||
return clientType.toString().padStart(clientTypeWidth, '0');
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -45,6 +45,9 @@
|
|||
},
|
||||
"notified":{
|
||||
"type": "date"
|
||||
},
|
||||
"clientTypeWidth": {
|
||||
"type": "number"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "MrwService",
|
||||
"base": "VnModel",
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "mrwService"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"agencyModeCodeFk": {
|
||||
"id": true,
|
||||
"type": "string",
|
||||
"required": true
|
||||
},
|
||||
"clientType": {
|
||||
"type": "number",
|
||||
"required": true
|
||||
},
|
||||
"serviceType": {
|
||||
"type": "number"
|
||||
},
|
||||
"kg": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"agency": {
|
||||
"type": "hasOne",
|
||||
"model": "AgencyMode",
|
||||
"foreignKey": "code"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
"base": "VnModel",
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "userConfig"
|
||||
"table": "userMultiConfig"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
|
|
|
@ -10,9 +10,6 @@ SET foreign_key_checks = 0;
|
|||
INSERT INTO util.config (id, environment, mockTime, mockUtcTime, mockEnabled)
|
||||
VALUES (1, 'local', '2001-01-01 12:00:00', '2001-01-01 11:00:00', TRUE);
|
||||
|
||||
INSERT INTO util.binlogQueue (code,logName, `position`)
|
||||
VALUES ('mylogger', 'bin.000001', 4);
|
||||
|
||||
/* #5483
|
||||
INSERT INTO vn.entryConfig (defaultEntry, mailToNotify, inventorySupplierFk, maxLockTime, defaultSupplierFk)
|
||||
VALUES(1, NULL, 1, 300, 1);
|
||||
|
@ -314,5 +311,4 @@ INSERT INTO mysql.roles_mapping (`User`, `Host`, `Role`, `Admin_option`)
|
|||
SELECT SUBSTR(`User`, @prefixLen + 1), `Host`, `Role`, `Admin_option`
|
||||
FROM mysql.roles_mapping
|
||||
WHERE `User` LIKE @prefixedLike AND `Host` = @genRoleHost;
|
||||
|
||||
FLUSH PRIVILEGES;
|
||||
|
|
|
@ -121,7 +121,7 @@ INSERT INTO hedera.orderConfig (`id`, `employeeFk`, `defaultAgencyFk`, `guestMet
|
|||
INSERT INTO `account`.`user`(`id`,`name`,`nickname`, `password`,`role`,`active`,`email`,`lang`, `image`)
|
||||
VALUES
|
||||
(1101, 'brucewayne', 'Bruce Wayne', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'BruceWayne@mydomain.com', 'es','1101'),
|
||||
(1102, 'petterparker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'PetterParker@mydomain.com', 'en','1102'),
|
||||
(1102, 'petterparker', 'Petter Parker', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 131, 1, 'PetterParker@mydomain.com', 'en','1102'),
|
||||
(1103, 'clarkkent', 'Clark Kent', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'ClarkKent@mydomain.com', 'fr','1103'),
|
||||
(1104, 'tonystark', 'Tony Stark', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'TonyStark@mydomain.com', 'es','1104'),
|
||||
(1105, 'maxeisenhardt', 'Max Eisenhardt', '$2b$10$UzQHth.9UUQ1T5aiQJ21lOU0oVlbxoqH4PFM9V8T90KNSAcg0eEL2', 2, 1, 'MaxEisenhardt@mydomain.com', 'pt','1105'),
|
||||
|
@ -995,11 +995,11 @@ INSERT INTO `vn`.`priceFixed`(`id`, `itemFk`, `rate0`, `rate1`, `rate2`, `rate3`
|
|||
|
||||
INSERT INTO `vn`.`itemMinimumQuantity`(`itemFk`, `quantity`, `started`, `ended`, `warehouseFk`)
|
||||
VALUES
|
||||
(1, 5, util.VN_CURDATE() - INTERVAL 2 MONTH, util.VN_CURDATE() + INTERVAL 1 MONTH, 1),
|
||||
(2, 10, util.VN_CURDATE() - INTERVAL 2 DAY, NULL, 2),
|
||||
(1, 5, util.VN_CURDATE() - INTERVAL 2 MONTH, util.VN_CURDATE() + INTERVAL 1 MONTH, 1),
|
||||
(2, 10, util.VN_CURDATE() - INTERVAL 2 DAY, util.VN_CURDATE() - INTERVAL 1 DAY, 2),
|
||||
(3, 15, util.VN_CURDATE() + INTERVAL 3 DAY, util.VN_CURDATE() + INTERVAL 2 WEEK, 3),
|
||||
(2, 10, util.VN_CURDATE() + INTERVAL 2 MONTH, NULL, 5),
|
||||
(4, 8, util.VN_CURDATE() - INTERVAL 3 MONTH, NULL, NULL);
|
||||
(4, 8, util.VN_CURDATE() - INTERVAL 3 MONTH, NULL, NULL);
|
||||
|
||||
INSERT INTO `vn`.`expeditionBoxVol`(`boxFk`, `m3`, `ratio`)
|
||||
VALUES
|
||||
|
@ -1500,7 +1500,8 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO
|
|||
(5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5),
|
||||
(6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6),
|
||||
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7),
|
||||
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10);
|
||||
(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),
|
||||
(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);
|
||||
|
||||
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`)
|
||||
VALUES
|
||||
|
@ -1511,25 +1512,27 @@ INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed
|
|||
(5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five'),
|
||||
(6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six'),
|
||||
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven'),
|
||||
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '');
|
||||
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, ''),
|
||||
(9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, 1, ''),
|
||||
(10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, 1, '');
|
||||
|
||||
INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`)
|
||||
INSERT INTO `bs`.`waste`(`buyerFk`, `year`, `week`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleQuantity`, `saleInternalWaste`, `saleExternalWaste`)
|
||||
VALUES
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation', 1, 1, '1062', '51', '4.8'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Colombia', 2, 1, '35074', '687', '2.0'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Mini', 3, 1, '1777', '13', '0.7'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Carnation Short', 4, 1, '3182', '59', '0.6'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Crisantemo', 5, 1, '1747', '13', '0.7'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Lilium Oriental', 6, 1, '7182', '59', '0.6'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Alstroemeria', 7, 1, '1777', '13', '0.7'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Cymbidium', 1, 1, '4181', '59', '0.6'),
|
||||
('CharlesXavier', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Cymbidium', 2, 1, '7268', '59', '0.6'),
|
||||
('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Containers', 2, 1, '-74', '0', '0.0'),
|
||||
('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Packagings', 3, 1, '-7', '0', '0.0'),
|
||||
('DavidCharlesHaller', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Freight', 4, 1, '1100', '0', '0.0'),
|
||||
('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Funeral Accessories', 5, 1, '848', '-187', '-22.1'),
|
||||
('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Miscellaneous Accessories', 6, 1, '186', '0', '0.0'),
|
||||
('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Adhesives', 7, 1, '277', '0', '0.0');
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 1, 1, '1062', '51', '56.20', '56.20'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 2, 1, '35074', '687', '53.12', '89.69'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 3, 1, '1777', '13', '12.02', '53.12'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 4, 1, '3182', '59', '51', '56.20'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 5, 1, '1747', '13', '53.12', '53.12'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 6, 1, '7182', '59', '51', '53.12'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 7, 1, '1777', '13', '89.69', '89.69'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 8, 1, '4181', '59', '53.12', '53.12'),
|
||||
('35', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 9, 1, '7268', '59', '12.02', '56.20'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 2, 1, '-74', '0', '51', '89.69'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 3, 1, '-7', '0', '12.02', '53.12'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 4, 1, '1100', '0', '51', '56.20'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 5, 1, '848', '-187', '12.02', '89.69'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 6, 1, '186', '0', '51', '53.12'),
|
||||
('103', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 7, 1, '277', '0', '53.12', '56.20');
|
||||
|
||||
INSERT INTO `vn`.`buy`(`id`,`entryFk`,`itemFk`,`buyingValue`,`quantity`,`packagingFk`,`stickers`,`freightValue`,`packageValue`,`comissionValue`,`packing`,`grouping`,`groupingMode`,`location`,`price1`,`price2`,`price3`, `printedStickers`,`isChecked`,`isIgnored`,`weight`, `created`)
|
||||
VALUES
|
||||
|
@ -1965,7 +1968,7 @@ INSERT INTO `vn`.`orderTicket`(`orderFk`, `ticketFk`)
|
|||
(21, 21),
|
||||
(22, 22);
|
||||
|
||||
INSERT INTO `vn`.`userConfig` (`userFk`, `warehouseFk`, `companyFk`)
|
||||
INSERT INTO `vn`.`userMultiConfig` (`userFk`, `warehouseFk`, `companyFk`)
|
||||
VALUES
|
||||
(1, 1, 69),
|
||||
(5, 1, 442),
|
||||
|
|
|
@ -1,31 +1,50 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`waste_addSales`()
|
||||
BEGIN
|
||||
DECLARE vWeek INT;
|
||||
DECLARE vYear INT;
|
||||
DECLARE vDateFrom DATE DEFAULT util.VN_CURDATE() - INTERVAL WEEKDAY(CURDATE()) DAY;
|
||||
DECLARE vDateTo DATE DEFAULT vDateFrom + INTERVAL 6 DAY;
|
||||
|
||||
CALL cache.last_buy_refresh(FALSE);
|
||||
|
||||
SELECT week, year
|
||||
INTO vWeek, vYear
|
||||
FROM vn.time
|
||||
WHERE dated = util.VN_CURDATE();
|
||||
|
||||
REPLACE bs.waste
|
||||
SELECT *, 100 * mermas / total as porcentaje
|
||||
FROM (
|
||||
SELECT buyer,
|
||||
year,
|
||||
week,
|
||||
family,
|
||||
itemFk,
|
||||
itemTypeFk,
|
||||
floor(sum(value)) as total,
|
||||
floor(sum(IF(typeFk = 'loses', value, 0))) as mermas
|
||||
FROM vn.saleValue
|
||||
where year = vYear and week = vWeek
|
||||
|
||||
GROUP BY family, itemFk
|
||||
|
||||
) sub
|
||||
ORDER BY mermas DESC;
|
||||
SELECT YEAR(t.shipped),
|
||||
WEEK(t.shipped, 4),
|
||||
it.workerFk,
|
||||
it.id,
|
||||
s.itemFk,
|
||||
SUM(s.quantity),
|
||||
SUM((b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity) `value`,
|
||||
SUM (
|
||||
IF(
|
||||
aw.`type` = 'internal',
|
||||
(b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity,
|
||||
0
|
||||
)
|
||||
) internalWaste,
|
||||
SUM (
|
||||
IF(
|
||||
aw.`type` = 'external',
|
||||
(b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity,
|
||||
IF(c.code = 'manaClaim',
|
||||
sc.value * s.quantity,
|
||||
0
|
||||
)
|
||||
)
|
||||
) externalWaste
|
||||
FROM vn.sale s
|
||||
JOIN vn.item i ON i.id = s.itemFk
|
||||
JOIN vn.itemType it ON it.id = i.typeFk
|
||||
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||
JOIN vn.address a FORCE INDEX (PRIMARY) ON a.id = t.addressFk
|
||||
LEFT JOIN vn.addressWaste aw ON aw.addressFk = a.id
|
||||
JOIN vn.warehouse w ON w.id = t.warehouseFk
|
||||
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
|
||||
LEFT JOIN vn.saleComponent sc ON sc.saleFk = s.id
|
||||
LEFT JOIN vn.component c ON c.id = sc.componentFk
|
||||
WHERE t.shipped BETWEEN vDateFrom AND vDateTo
|
||||
AND w.isManaged
|
||||
GROUP BY it.id, i.id;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -56,13 +56,21 @@ BEGIN
|
|||
CALL util.throw ('ORDER_ROW_UNAVAILABLE');
|
||||
END IF;
|
||||
|
||||
SELECT quantity INTO vMinQuantity
|
||||
WITH itemMinQuantityPriority AS (
|
||||
SELECT quantity,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY itemFk
|
||||
ORDER BY warehouseFk IS NULL
|
||||
) priority
|
||||
FROM vn.itemMinimumQuantity
|
||||
WHERE itemFk = vItem
|
||||
AND `started` <= vShipment
|
||||
AND (`ended` >= vShipment OR `ended` IS NULL)
|
||||
AND (warehouseFk = vWarehouse OR warehouseFk IS NULL)
|
||||
LIMIT 1;
|
||||
)
|
||||
SELECT quantity INTO vMinQuantity
|
||||
FROM itemMinQuantityPriority
|
||||
WHERE priority = 1;
|
||||
|
||||
IF vAmount < LEAST(IFNULL(vMinQuantity, 0), vAvailable) THEN
|
||||
CALL util.throw ('quantityLessThanMin');
|
||||
|
|
|
@ -10,5 +10,5 @@ AS SELECT `q`.`name` AS `name`,
|
|||
`c`.`ringInUse` AS `ringinuse`
|
||||
FROM (
|
||||
`pbx`.`queue` `q`
|
||||
JOIN `pbx`.`queueConfig` `c` ON(`q`.`config` = `c`.`id`)
|
||||
JOIN `pbx`.`queueMultiConfig` `c` ON(`q`.`config` = `c`.`id`)
|
||||
)
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`ticket_isProblemCalcNeeded`(
|
||||
vSelf INT
|
||||
)
|
||||
RETURNS BOOL
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
/**
|
||||
* Check if the ticket requires to update column vn.ticket.problem
|
||||
*
|
||||
* @param vSelf Id ticket
|
||||
* @return BOOL
|
||||
*/
|
||||
DECLARE vIsProblemCalcNeeded BOOL;
|
||||
|
||||
SELECT COUNT(*) INTO vIsProblemCalcNeeded
|
||||
FROM ticket t
|
||||
JOIN client c ON c.id = t.clientFk
|
||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||
JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
||||
WHERE t.id = vSelf
|
||||
AND dm.code IN ('AGENCY','DELIVERY','PICKUP')
|
||||
AND c.typeFk = 'normal';
|
||||
|
||||
RETURN vIsProblemCalcNeeded;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -1,5 +1,8 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimate`(vWarehouseFk SMALLINT, vDated DATE)
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimate`(
|
||||
vWarehouseFk SMALLINT,
|
||||
vDated DATE
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Calcula las últimas compras realizadas hasta una fecha
|
||||
|
@ -19,21 +22,22 @@ BEGIN
|
|||
FROM cache.last_buy
|
||||
WHERE warehouse_id = vWarehouseFk OR vWarehouseFk IS NULL;
|
||||
|
||||
CALL buyUltimateFromInterval(vWarehouseFk, util.VN_CURDATE(), vDated);
|
||||
IF vDated >= util.VN_CURDATE() THEN
|
||||
CALL buyUltimateFromInterval(vWarehouseFk, util.VN_CURDATE(), vDated);
|
||||
|
||||
REPLACE INTO tmp.buyUltimate
|
||||
SELECT itemFk, buyFk, warehouseFk, landed landing
|
||||
FROM tmp.buyUltimateFromInterval
|
||||
WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL)
|
||||
AND landed <= vDated
|
||||
AND NOT isIgnored;
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimate
|
||||
SELECT itemFk, buyFk, warehouseFk, landed landing
|
||||
FROM tmp.buyUltimateFromInterval
|
||||
WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL)
|
||||
AND landed > vDated
|
||||
ORDER BY isIgnored = FALSE DESC;
|
||||
REPLACE INTO tmp.buyUltimate
|
||||
SELECT itemFk, buyFk, warehouseFk, landed landing
|
||||
FROM tmp.buyUltimateFromInterval
|
||||
WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL)
|
||||
AND landed <= vDated
|
||||
AND NOT isIgnored;
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimate
|
||||
SELECT itemFk, buyFk, warehouseFk, landed landing
|
||||
FROM tmp.buyUltimateFromInterval
|
||||
WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL)
|
||||
AND landed > vDated
|
||||
ORDER BY isIgnored = FALSE DESC;
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimateFromInterval`(vWarehouseFk SMALLINT, vStarted DATE, vEnded DATE)
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimateFromInterval`(
|
||||
vWarehouseFk SMALLINT,
|
||||
vStarted DATE,
|
||||
vEnded DATE
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Calcula las últimas compras realizadas
|
||||
|
@ -21,12 +25,13 @@ BEGIN
|
|||
-- Item
|
||||
DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval;
|
||||
CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval
|
||||
(PRIMARY KEY (itemFk, warehouseFk), INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk))
|
||||
(PRIMARY KEY (itemFk, warehouseFk),
|
||||
INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk))
|
||||
ENGINE = MEMORY
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
MAX(landed) landed,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
|
@ -45,93 +50,117 @@ BEGIN
|
|||
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT
|
||||
b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed > vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
GROUP BY itemFk, warehouseInFk;
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed > vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemFk, warehouseFk;
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT
|
||||
b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.quantity = 0
|
||||
GROUP BY itemFk, warehouseInFk;
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.quantity = 0
|
||||
ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemFk, warehouseFk;
|
||||
|
||||
-- ItemOriginal
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
MAX(landed) landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
itemOriginalFk,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
AND b.quantity > 0
|
||||
AND itemOriginalFk
|
||||
ORDER BY t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemOriginalFk, warehouseFk;
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
itemOriginalFk,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
AND b.quantity > 0
|
||||
AND itemOriginalFk
|
||||
ORDER BY t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemFk, warehouseFk;
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM (SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed > vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
AND itemOriginalFk
|
||||
ORDER BY t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemFk, warehouseFk;
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT
|
||||
b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed > vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.price2 > 0
|
||||
AND NOT b.isIgnored
|
||||
AND itemOriginalFk
|
||||
GROUP BY itemOriginalFk, warehouseInFk;
|
||||
|
||||
INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored)
|
||||
SELECT
|
||||
b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.quantity = 0
|
||||
AND itemOriginalFk
|
||||
GROUP BY itemOriginalFk, warehouseInFk;
|
||||
SELECT itemFk,
|
||||
warehouseFk,
|
||||
buyFk,
|
||||
landed,
|
||||
isIgnored
|
||||
FROM
|
||||
(SELECT b.itemFk,
|
||||
t.warehouseInFk warehouseFk,
|
||||
b.id buyFk,
|
||||
t.landed,
|
||||
b.isIgnored
|
||||
FROM buy b
|
||||
JOIN entry e ON e.id = b.entryFk
|
||||
JOIN travel t ON t.id = e.travelFk
|
||||
WHERE t.landed BETWEEN vStarted AND vEnded
|
||||
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
|
||||
AND b.quantity = 0
|
||||
AND itemOriginalFk
|
||||
ORDER BY t.landed DESC, b.id DESC
|
||||
LIMIT 10000000000000000000) sub
|
||||
GROUP BY itemFk, warehouseFk;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -180,15 +180,24 @@ BEGIN
|
|||
GROUP BY itemFk
|
||||
) bl ON bl.itemFk = tl.itemFk
|
||||
LEFT JOIN (
|
||||
SELECT itemFk, quantity, warehouseFk
|
||||
FROM itemMinimumQuantity
|
||||
WITH itemMinQuantityPriority AS (
|
||||
SELECT itemFk,
|
||||
quantity,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY itemFk
|
||||
ORDER BY warehouseFk IS NULL
|
||||
) priority
|
||||
FROM vn.itemMinimumQuantity
|
||||
WHERE `started` <= vShipped
|
||||
AND (`ended` >= vShipped OR `ended` IS NULL)
|
||||
GROUP BY itemFk, warehouseFk
|
||||
ORDER BY warehouseFk DESC
|
||||
AND (warehouseFk = vWarehouseFk OR warehouseFk IS NULL)
|
||||
)
|
||||
SELECT itemFk, quantity
|
||||
FROM itemMinQuantityPriority
|
||||
WHERE priority = 1
|
||||
) mq ON mq.itemFk = tl.itemFk
|
||||
AND (mq.warehouseFk = tl.warehouseFk OR mq.warehouseFk IS NULL)
|
||||
WHERE tl.zoneFk = vZoneFk AND tl.warehouseFk = vWarehouseFk
|
||||
WHERE tl.zoneFk = vZoneFk
|
||||
AND tl.warehouseFk = vWarehouseFk
|
||||
GROUP BY tl.itemFk
|
||||
ON DUPLICATE KEY UPDATE available = available + VALUES(available);
|
||||
END LOOP;
|
||||
|
|
|
@ -34,20 +34,25 @@ BEGIN
|
|||
DECLARE vIsTaxDataChecked TINYINT(1);
|
||||
DECLARE vHasCoreVnl BOOLEAN;
|
||||
DECLARE vMandateTypeFk INT;
|
||||
DECLARE vHasDailyInvoice BOOLEAN;
|
||||
|
||||
SELECT defaultPayMethodFk,
|
||||
defaultDueDay,
|
||||
defaultCredit,
|
||||
defaultIsTaxDataChecked,
|
||||
defaultHasCoreVnl,
|
||||
defaultMandateTypeFk
|
||||
SELECT cc.defaultPayMethodFk,
|
||||
cc.defaultDueDay,
|
||||
cc.defaultCredit,
|
||||
cc.defaultIsTaxDataChecked,
|
||||
cc.defaultHasCoreVnl,
|
||||
cc.defaultMandateTypeFk,
|
||||
c.hasDailyInvoice
|
||||
INTO vPayMethodFk,
|
||||
vDueDay,
|
||||
vDefaultCredit,
|
||||
vIsTaxDataChecked,
|
||||
vHasCoreVnl,
|
||||
vMandateTypeFk
|
||||
FROM clientConfig;
|
||||
vMandateTypeFk,
|
||||
vHasDailyInvoice
|
||||
FROM clientConfig cc
|
||||
LEFT JOIN province p ON p.id = vProvinceFk
|
||||
LEFT JOIN country c ON c.id = p.countryFk;
|
||||
|
||||
INSERT INTO `client`
|
||||
SET id = vUserFk,
|
||||
|
@ -65,7 +70,8 @@ BEGIN
|
|||
credit = vDefaultCredit,
|
||||
isTaxDataChecked = vIsTaxDataChecked,
|
||||
hasCoreVnl = vHasCoreVnl,
|
||||
isEqualizated = FALSE
|
||||
isEqualizated = FALSE,
|
||||
hasDailyInvoice = vHasDailyInvoice
|
||||
ON duplicate KEY UPDATE
|
||||
payMethodFk = vPayMethodFk,
|
||||
dueDay = vDueDay,
|
||||
|
|
|
@ -7,7 +7,7 @@ DECLARE vCompanyFk INT;
|
|||
SELECT IFNULL(uc.companyFk, rc.defaultCompanyFk)
|
||||
INTO vCompanyFk
|
||||
FROM vn.routeConfig rc
|
||||
LEFT JOIN userConfig uc ON uc.userFk = workerFk;
|
||||
LEFT JOIN userMultiConfig uc ON uc.userFk = workerFk;
|
||||
|
||||
|
||||
SELECT
|
||||
|
|
|
@ -216,7 +216,7 @@ BEGIN
|
|||
i.transactionTypeSageFk,
|
||||
@vTaxCodeGeneral := i.taxClassCodeFk
|
||||
FROM tmp.ticketServiceTax tst
|
||||
JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code
|
||||
JOIN invoiceOutTaxMultiConfig i ON i.taxClassCodeFk = tst.code
|
||||
WHERE i.isService
|
||||
HAVING taxableBase
|
||||
) sub;
|
||||
|
@ -229,7 +229,7 @@ BEGIN
|
|||
i.taxTypeSageFk ,
|
||||
i.transactionTypeSageFk
|
||||
FROM tmp.ticketTax tt
|
||||
JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code
|
||||
JOIN invoiceOutTaxMultiConfig i ON i.taxClassCodeFk = tt.code
|
||||
WHERE !i.isService
|
||||
GROUP BY tt.pgcFk
|
||||
HAVING taxableBase
|
||||
|
|
|
@ -1,102 +1,114 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_addBySale`(
|
||||
vSaleFk INT
|
||||
)
|
||||
proc: BEGIN
|
||||
/**
|
||||
* Reserva una línea de venta en la ubicación más óptima
|
||||
*
|
||||
* @param vSaleFk Id de sale
|
||||
* @param vItemShelvingSaleFk Id de reserva
|
||||
*/
|
||||
DECLARE vLastPickingOrder INT;
|
||||
DECLARE vDone INT DEFAULT FALSE;
|
||||
DECLARE vItemShelvingFk INT;
|
||||
DECLARE vAvailable INT;
|
||||
DECLARE vReservedQuantity INT;
|
||||
DECLARE vOutStanding INT;
|
||||
DECLARE vUserFk INT;
|
||||
|
||||
DECLARE vItemShelvingAvailable CURSOR FOR
|
||||
SELECT ish.id itemShelvingFk,
|
||||
ish.available
|
||||
FROM sale s
|
||||
JOIN itemShelving ish ON ish.itemFk = s.itemFk
|
||||
JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||
JOIN parking p ON p.id = sh.parkingFk
|
||||
JOIN sector sc ON sc.id = p.sectorFk
|
||||
JOIN productionConfig pc
|
||||
WHERE s.id = vSaleFk
|
||||
AND NOT sc.isHideForPickers
|
||||
ORDER BY s.id,
|
||||
p.pickingOrder >= vLastPickingOrder,
|
||||
sh.priority DESC,
|
||||
ish.available >= s.quantity DESC,
|
||||
s.quantity MOD ish.grouping = 0 DESC,
|
||||
ish.grouping DESC,
|
||||
IF(pc.orderMode = 'Location', p.pickingOrder, ish.created);
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||
BEGIN
|
||||
ROLLBACK;
|
||||
RESIGNAL;
|
||||
END;
|
||||
|
||||
SELECT MAX(p.pickingOrder), s.quantity - SUM(IFNULL(iss.quantity, 0))
|
||||
INTO vLastPickingOrder, vOutStanding
|
||||
FROM sale s
|
||||
LEFT JOIN itemShelvingSale iss ON iss.saleFk = s.id
|
||||
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
|
||||
LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||
LEFT JOIN parking p ON p.id = sh.parkingFk
|
||||
WHERE s.id = vSaleFk;
|
||||
|
||||
IF vOutStanding <= 0 THEN
|
||||
LEAVE proc;
|
||||
END IF;
|
||||
|
||||
SELECT getUser() INTO vUserFk;
|
||||
|
||||
OPEN vItemShelvingAvailable;
|
||||
l: LOOP
|
||||
SET vDone = FALSE;
|
||||
FETCH vItemShelvingAvailable INTO vItemShelvingFk, vAvailable;
|
||||
|
||||
IF vOutStanding <= 0 OR vDone THEN
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
START TRANSACTION;
|
||||
|
||||
SELECT id INTO vItemShelvingFk
|
||||
FROM itemShelving
|
||||
WHERE id = vItemShelvingFk
|
||||
FOR UPDATE;
|
||||
|
||||
SELECT LEAST(vOutStanding, vAvailable) INTO vReservedQuantity;
|
||||
SET vOutStanding = vOutStanding - vReservedQuantity;
|
||||
|
||||
IF vReservedQuantity > 0 THEN
|
||||
|
||||
INSERT INTO itemShelvingSale(
|
||||
itemShelvingFk,
|
||||
saleFk,
|
||||
quantity,
|
||||
userFk)
|
||||
SELECT vItemShelvingFk,
|
||||
vSaleFk,
|
||||
vReservedQuantity,
|
||||
vUserFk;
|
||||
|
||||
UPDATE itemShelving
|
||||
SET available = available - vReservedQuantity
|
||||
WHERE id = vItemShelvingFk;
|
||||
|
||||
END IF;
|
||||
|
||||
COMMIT;
|
||||
END LOOP;
|
||||
CLOSE vItemShelvingAvailable;
|
||||
END$$
|
||||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_addBySale`(
|
||||
vSaleFk INT
|
||||
)
|
||||
proc: BEGIN
|
||||
/**
|
||||
* Reserva una línea de venta en la ubicación más óptima
|
||||
*
|
||||
* @param vSaleFk Id de sale
|
||||
* @param vItemShelvingSaleFk Id de reserva
|
||||
*/
|
||||
DECLARE vLastPickingOrder INT;
|
||||
DECLARE vDone INT DEFAULT FALSE;
|
||||
DECLARE vItemShelvingFk INT;
|
||||
DECLARE vAvailable INT;
|
||||
DECLARE vReservedQuantity INT;
|
||||
DECLARE vOutStanding INT;
|
||||
DECLARE vUserFk INT;
|
||||
DECLARE vTotalReservedQuantity INT;
|
||||
DECLARE vSaleQuantity INT;
|
||||
|
||||
DECLARE vItemShelvingAvailable CURSOR FOR
|
||||
SELECT ish.id itemShelvingFk,
|
||||
ish.available
|
||||
FROM sale s
|
||||
JOIN itemShelving ish ON ish.itemFk = s.itemFk
|
||||
JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||
JOIN parking p ON p.id = sh.parkingFk
|
||||
JOIN sector sc ON sc.id = p.sectorFk
|
||||
JOIN productionConfig pc
|
||||
WHERE s.id = vSaleFk
|
||||
AND NOT sc.isHideForPickers
|
||||
ORDER BY s.id,
|
||||
p.pickingOrder >= vLastPickingOrder,
|
||||
sh.priority DESC,
|
||||
ish.available >= s.quantity DESC,
|
||||
s.quantity MOD ish.grouping = 0 DESC,
|
||||
ish.grouping DESC,
|
||||
IF(pc.orderMode = 'Location', p.pickingOrder, ish.created);
|
||||
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||
BEGIN
|
||||
ROLLBACK;
|
||||
RESIGNAL;
|
||||
END;
|
||||
|
||||
SELECT MAX(p.pickingOrder), s.quantity - SUM(IFNULL(iss.quantity, 0)), s.quantity
|
||||
INTO vLastPickingOrder, vOutStanding, vSaleQuantity
|
||||
FROM sale s
|
||||
LEFT JOIN itemShelvingSale iss ON iss.saleFk = s.id
|
||||
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
|
||||
LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||
LEFT JOIN parking p ON p.id = sh.parkingFk
|
||||
WHERE s.id = vSaleFk;
|
||||
|
||||
IF vOutStanding <= 0 THEN
|
||||
LEAVE proc;
|
||||
END IF;
|
||||
|
||||
SELECT getUser() INTO vUserFk;
|
||||
|
||||
OPEN vItemShelvingAvailable;
|
||||
l: LOOP
|
||||
SET vDone = FALSE;
|
||||
FETCH vItemShelvingAvailable INTO vItemShelvingFk, vAvailable;
|
||||
|
||||
IF vOutStanding <= 0 OR vDone THEN
|
||||
SELECT SUM(IFNULL(quantity, 0))
|
||||
INTO vTotalReservedQuantity
|
||||
FROM itemShelvingSale
|
||||
WHERE saleFk = vSaleFk;
|
||||
|
||||
IF vTotalReservedQuantity <> vSaleQuantity THEN
|
||||
UPDATE sale
|
||||
SET quantity = vTotalReservedQuantity
|
||||
WHERE id = vSaleFk;
|
||||
END IF;
|
||||
LEAVE l;
|
||||
END IF;
|
||||
|
||||
START TRANSACTION;
|
||||
|
||||
SELECT id INTO vItemShelvingFk
|
||||
FROM itemShelving
|
||||
WHERE id = vItemShelvingFk
|
||||
FOR UPDATE;
|
||||
|
||||
SELECT LEAST(vOutStanding, vAvailable) INTO vReservedQuantity;
|
||||
SET vOutStanding = vOutStanding - vReservedQuantity;
|
||||
|
||||
IF vReservedQuantity > 0 THEN
|
||||
|
||||
INSERT INTO itemShelvingSale(
|
||||
itemShelvingFk,
|
||||
saleFk,
|
||||
quantity,
|
||||
userFk)
|
||||
SELECT vItemShelvingFk,
|
||||
vSaleFk,
|
||||
vReservedQuantity,
|
||||
vUserFk;
|
||||
|
||||
UPDATE itemShelving
|
||||
SET available = available - vReservedQuantity
|
||||
WHERE id = vItemShelvingFk;
|
||||
|
||||
END IF;
|
||||
|
||||
COMMIT;
|
||||
END LOOP;
|
||||
CLOSE vItemShelvingAvailable;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -21,6 +21,7 @@ BEGIN
|
|||
DECLARE vRemainingQuantity INT;
|
||||
DECLARE vItemFk INT;
|
||||
DECLARE vTotalQuantity INT;
|
||||
DECLARE vStateCode VARCHAR(45);
|
||||
|
||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||
BEGIN
|
||||
|
@ -32,10 +33,19 @@ BEGIN
|
|||
CALL util.throw('Reservation completed');
|
||||
END IF;
|
||||
|
||||
SELECT s.itemFk, iss.saleFk, iss.itemShelvingFk, SUM(IFNULL(iss.quantity,0))
|
||||
INTO vItemFk, vSaleFk, vItemShelvingFk, vReservedQuantity
|
||||
SELECT s.itemFk,
|
||||
iss.saleFk,
|
||||
iss.itemShelvingFk,
|
||||
SUM(IFNULL(iss.quantity,0)),
|
||||
IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED')
|
||||
INTO vItemFk,
|
||||
vSaleFk,
|
||||
vItemShelvingFk,
|
||||
vReservedQuantity,
|
||||
vStateCode
|
||||
FROM itemShelvingSale iss
|
||||
JOIN sale s ON s.id = iss.saleFk
|
||||
LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk
|
||||
WHERE iss.id = vItemShelvingSaleFk
|
||||
AND NOT iss.isPicked;
|
||||
|
||||
|
@ -74,7 +84,7 @@ BEGIN
|
|||
vTotalQuantity,
|
||||
`account`.`myUser_getId`(),
|
||||
NULL,
|
||||
'PREPARED',
|
||||
vStateCode,
|
||||
TRUE);
|
||||
|
||||
UPDATE sale s
|
||||
|
|
|
@ -10,19 +10,20 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_comparative`(
|
|||
)
|
||||
proc: BEGIN
|
||||
/**
|
||||
* Genera una tabla de comparativa de artículos por itemType/comprador/fecha.
|
||||
* Los datos se calculan en función de los parámetros proporcionados.
|
||||
* Generates a comparison table of items by itemType/buyer/date.
|
||||
* The data is calculated based on the provided parameters.
|
||||
*
|
||||
* @param vDate La fecha para la cual se generará la comparativa.
|
||||
* @param vDayRange El rango de días a considerar para la comparativa.
|
||||
* @param vWarehouseFk El identificador del almacén para filtrar los artículos.
|
||||
* @param vAvailableSince La fecha de disponibilidad desde la cual se consideran los artículos disponibles.
|
||||
* @param vBuyerFk El identificador del comprador para filtrar los artículos.
|
||||
* @param vIsFloramondo Indica si se deben incluir solo los artículos de Floramondo (opcional).
|
||||
* @param vCountryFk El identificador del país.
|
||||
* @param tmp.comparativeFilterType(filterFk INT ,itemTypeFk INT)
|
||||
* @param vDate The date for which the comparison will be generated.
|
||||
* @param vDayRange The range of days to consider for the comparison.
|
||||
* @param vWarehouseFk The warehouse identifier to filter the items.
|
||||
* @param vAvailableSince The availability date from which the items are considered available.
|
||||
* @param vBuyerFk The buyer identifier to filter the items.
|
||||
* @param vIsFloramondo Indicates whether only Floramondo items should be included (optional).
|
||||
* @param vCountryFk The country identifier.
|
||||
* @param tmp.comparativeFilterType(filterFk INT, itemTypeFk INT)
|
||||
* @return tmp.comparative
|
||||
*/
|
||||
|
||||
DECLARE vDayRangeStart DATE;
|
||||
DECLARE vDayRangeEnd DATE;
|
||||
DECLARE w1, w2, w3, w4, w5, w6, w7 INT;
|
||||
|
|
|
@ -42,7 +42,7 @@ BEGIN
|
|||
END IF;
|
||||
|
||||
SELECT warehouseFk INTO vWarehouseFk
|
||||
FROM userConfig
|
||||
FROM userMultiConfig
|
||||
WHERE userFk = account.myUser_getId();
|
||||
|
||||
IF NOT vWarehouseFk OR vWarehouseFk IS NULL THEN
|
||||
|
|
|
@ -46,12 +46,18 @@ BEGIN
|
|||
i.tag8 = JSON_VALUE(vTags, '$.8'),
|
||||
i.tag9 = JSON_VALUE(vTags, '$.9'),
|
||||
i.tag10 = JSON_VALUE(vTags, '$.10'),
|
||||
i.tag11 = JSON_VALUE(vTags, '$.11'),
|
||||
i.tag12 = JSON_VALUE(vTags, '$.12'),
|
||||
i.tag13 = JSON_VALUE(vTags, '$.13'),
|
||||
i.value5 = JSON_VALUE(vValues, '$.5'),
|
||||
i.value6 = JSON_VALUE(vValues, '$.6'),
|
||||
i.value7 = JSON_VALUE(vValues, '$.7'),
|
||||
i.value8 = JSON_VALUE(vValues, '$.8'),
|
||||
i.value9 = JSON_VALUE(vValues, '$.9'),
|
||||
i.value10 = JSON_VALUE(vValues, '$.10'),
|
||||
i.value11 = JSON_VALUE(vValues, '$.11'),
|
||||
i.value12 = JSON_VALUE(vValues, '$.12'),
|
||||
i.value13 = JSON_VALUE(vValues, '$.13'),
|
||||
i.producerFk = p.id,
|
||||
i.inkFk = k.id,
|
||||
i.originFk = IFNULL(o.id, i.originFk)
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_updateM3`(vRoute INT)
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`route_updateM3`(
|
||||
vSelf INT
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Actualiza el volumen de la ruta.
|
||||
*
|
||||
* @param vSelf Id ruta
|
||||
*/
|
||||
DECLARE vVolume DECIMAL(10,1)
|
||||
DEFAULT (SELECT SUM(volume) FROM saleVolume WHERE routeFk = vSelf);
|
||||
|
||||
UPDATE vn.route r
|
||||
LEFT JOIN (
|
||||
SELECT routeFk, SUM(volume) AS m3
|
||||
FROM saleVolume
|
||||
WHERE routeFk = vRoute
|
||||
) v ON v.routeFk = r.id
|
||||
SET r.m3 = IFNULL(v.m3,0)
|
||||
WHERE r.id =vRoute;
|
||||
UPDATE `route`
|
||||
SET m3 = IFNULL(vVolume, 0)
|
||||
WHERE id = vSelf;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -19,21 +19,20 @@ BEGIN
|
|||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
(saleFk INT PRIMARY KEY)
|
||||
SELECT
|
||||
s.ticketFk,
|
||||
s.id saleFk,
|
||||
s.itemFk,
|
||||
s.concept,
|
||||
s.quantity,
|
||||
MAKETIME(pb.HH,pb.mm,0) etd,
|
||||
pb.routeFk,
|
||||
FLOOR(s.quantity / IF(i.isBoxPickingMode, ish.packing, i.packingOut)) stickers,
|
||||
IF(i.isBoxPickingMode, ish.packing, i.packingOut) packing,
|
||||
b.packagingFk
|
||||
SELECT s.ticketFk,
|
||||
s.id saleFk,
|
||||
s.itemFk,
|
||||
s.concept,
|
||||
s.quantity,
|
||||
MAKETIME(pb.HH,pb.mm,0) etd,
|
||||
pb.routeFk,
|
||||
FLOOR(s.quantity / IF(i.isBoxPickingMode, ish.packing, i.packingOut)) stickers,
|
||||
IF(i.isBoxPickingMode, ish.packing, i.packingOut) packing,
|
||||
IF(pa.isPackageReturnable, pc.defaultBigPackageFk, b.packagingFk) packagingFk
|
||||
FROM sale s
|
||||
JOIN item i ON i.id = s.itemFk
|
||||
JOIN itemShelving ish ON ish.itemFk = s.itemFk
|
||||
LEFT JOIN ( SELECT iss.itemShelvingFk,
|
||||
LEFT JOIN ( SELECT iss.itemShelvingFk,
|
||||
s.itemFk,
|
||||
SUM(iss.quantity) reserve
|
||||
FROM itemShelvingSale iss
|
||||
|
@ -52,6 +51,8 @@ BEGIN
|
|||
LEFT JOIN ticketState ts ON ts.ticketFk = s.ticketFk
|
||||
LEFT JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = vWarehouseFk
|
||||
LEFT JOIN buy b ON b.id = lb.buy_id
|
||||
LEFT JOIN packaging pa ON pa.id = b.packagingFk
|
||||
JOIN packagingConfig pc
|
||||
WHERE IF(i.isBoxPickingMode, ish.packing, i.packingOut)
|
||||
<= LEAST(s.quantity, ish.visible - IFNULL(tISS.reserve,0))
|
||||
AND NOT pb.problem
|
||||
|
|
|
@ -7,7 +7,7 @@ BEGIN
|
|||
* Update column sale.problem with a problem code
|
||||
*
|
||||
* @param vProblemCode Code to set or unset
|
||||
* @table tmp.sale(saleFk, hasProblem)
|
||||
* @table tmp.sale(saleFk, hasProblem, isProblemCalcNeeded)
|
||||
*/
|
||||
DECLARE vSaleFk INT;
|
||||
DECLARE vHasProblem INT;
|
||||
|
|
|
@ -10,9 +10,13 @@ BEGIN
|
|||
* @param vSelf Id del sale
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
(INDEX(saleFk))
|
||||
(INDEX(saleFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT vSelf saleFk, sale_hasComponentLack(vSelf) hasProblem;
|
||||
SELECT vSelf saleFk,
|
||||
sale_hasComponentLack(vSelf) hasProblem,
|
||||
ticket_isProblemCalcNeeded(ticketFk) isProblemCalcNeeded
|
||||
FROM sale
|
||||
WHERE id = vSelf;
|
||||
|
||||
CALL sale_setProblem('hasComponentLack');
|
||||
|
||||
|
|
|
@ -10,11 +10,13 @@ BEGIN
|
|||
* @param vComponentFk Id component
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
(INDEX(saleFk))
|
||||
(INDEX(saleFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT saleFk, sale_hasComponentLack(saleFk)hasProblem
|
||||
SELECT saleFk,
|
||||
sale_hasComponentLack(saleFk) hasProblem,
|
||||
ticket_isProblemCalcNeeded(ticketFk) isProblemCalcNeeded
|
||||
FROM (
|
||||
SELECT s.id saleFk
|
||||
SELECT s.id saleFk, s.ticketFk
|
||||
FROM ticket t
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
LEFT JOIN saleComponent sc ON sc.saleFk = s.id
|
||||
|
|
|
@ -11,9 +11,10 @@ BEGIN
|
|||
DECLARE vWarehouseFk INT;
|
||||
DECLARE vShipped DATE;
|
||||
DECLARE vQuantity INT;
|
||||
DECLARE vIsProblemCalcNeeded BOOL;
|
||||
|
||||
SELECT s.itemFk, t.warehouseFk, t.shipped, s.quantity
|
||||
INTO vItemFk, vWarehouseFk, vShipped, vQuantity
|
||||
SELECT s.itemFk, t.warehouseFk, t.shipped, s.quantity, ticket_isProblemCalcNeeded(t.id)
|
||||
INTO vItemFk, vWarehouseFk, vShipped, vQuantity, vIsProblemCalcNeeded
|
||||
FROM sale s
|
||||
JOIN ticket t ON t.id = s.ticketFk
|
||||
WHERE s.id = vSelf;
|
||||
|
@ -21,7 +22,9 @@ BEGIN
|
|||
CALL buyUltimate(vWarehouseFk, vShipped);
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
SELECT vSelf saleFk, MOD(vQuantity, b.`grouping`) hasProblem
|
||||
SELECT vSelf saleFk,
|
||||
MOD(vQuantity, b.`grouping`) hasProblem,
|
||||
vIsProblemCalcNeeded isProblemCalcNeeded
|
||||
FROM tmp.buyUltimate bu
|
||||
JOIN buy b ON b.id = bu.buyFk
|
||||
WHERE bu.itemFk = vItemFk;
|
||||
|
|
|
@ -44,14 +44,14 @@ BEGIN
|
|||
t.shipped,
|
||||
IFNULL(a.hasDailyInvoice, co.hasDailyInvoice),
|
||||
w.isManaged,
|
||||
c.hasToInvoice
|
||||
c.hasToInvoice
|
||||
INTO vClientFk,
|
||||
vIsTaxDataChecked,
|
||||
vCompanyFk,
|
||||
vShipped,
|
||||
vHasDailyInvoice,
|
||||
vWithPackage,
|
||||
vHasToInvoice
|
||||
vHasToInvoice
|
||||
FROM ticket t
|
||||
JOIN `client` c ON c.id = t.clientFk
|
||||
JOIN province p ON p.id = c.provinceFk
|
||||
|
@ -64,8 +64,12 @@ BEGIN
|
|||
(SELECT vCurTicketFk, p.id, COUNT(*)
|
||||
FROM expedition e
|
||||
JOIN packaging p ON p.id = e.packagingFk
|
||||
JOIN ticket t ON t.id = e.ticketFk
|
||||
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
|
||||
LEFT JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
||||
WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable
|
||||
AND vWithPackage
|
||||
AND NOT dm.`code`= 'PICKUP'
|
||||
GROUP BY p.itemFk);
|
||||
|
||||
-- No retornables o no catalogados
|
||||
|
|
|
@ -4,10 +4,11 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_setProblem`(
|
|||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Update column ticket.problem with a problem code
|
||||
* Update column ticket.problem with a problem code and SET NULL when
|
||||
* the problem is not requiered
|
||||
*
|
||||
* @param vProblemCode Code to set or unset
|
||||
* @table tmp.ticket(ticketFk, hasProblem)
|
||||
* @table tmp.ticket(ticketFk, hasProblem, isProblemCalcNeeded)
|
||||
*/
|
||||
DECLARE vTicketFk INT;
|
||||
DECLARE vHasProblem INT;
|
||||
|
|
|
@ -9,9 +9,11 @@ BEGIN
|
|||
* @param vClientFk Id Cliente, if NULL all clients
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
(INDEX(ticketFk))
|
||||
(INDEX(ticketFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT t.id ticketFk, FALSE hasProblem
|
||||
SELECT t.id ticketFk,
|
||||
FALSE hasProblem,
|
||||
ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
|
||||
FROM ticket t
|
||||
WHERE t.shipped >= util.VN_CURDATE()
|
||||
AND (vClientFk IS NULL OR t.clientFk = vClientFk);
|
||||
|
@ -21,7 +23,7 @@ BEGIN
|
|||
JOIN client c ON c.id = ti.clientFk
|
||||
SET t.hasProblem = TRUE
|
||||
WHERE c.isFreezed;
|
||||
|
||||
|
||||
CALL ticket_setProblem('isFreezed');
|
||||
|
||||
DROP TEMPORARY TABLE tmp.ticket;
|
||||
|
|
|
@ -9,9 +9,11 @@ BEGIN
|
|||
* @param vSelf Id ticket, if NULL ALL tickets
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
(INDEX(ticketFk))
|
||||
(INDEX(ticketFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT t.id ticketFk, FALSE hasProblem
|
||||
SELECT t.id ticketFk,
|
||||
FALSE hasProblem,
|
||||
ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
|
||||
FROM ticket t
|
||||
WHERE t.shipped >= util.VN_CURDATE()
|
||||
AND (vSelf IS NULL OR t.id = vSelf);
|
||||
|
|
|
@ -10,21 +10,30 @@ BEGIN
|
|||
*/
|
||||
DECLARE vHasRisk BOOL;
|
||||
DECLARE vHasHighRisk BOOL;
|
||||
DECLARE vIsProblemCalcNeeded BOOL;
|
||||
|
||||
SELECT t.risk > (c.credit + 10), ((t.risk - cc.riskTolerance) > (c.credit + 10))
|
||||
INTO vHasRisk, vHasHighRisk
|
||||
SELECT t.risk > (c.credit + 10),
|
||||
(t.risk - cc.riskTolerance) > (c.credit + 10),
|
||||
ticket_isProblemCalcNeeded(t.id)
|
||||
INTO vHasRisk, vHasHighRisk, vIsProblemCalcNeeded
|
||||
FROM client c
|
||||
JOIN ticket t ON t.clientFk = c.id
|
||||
JOIN clientConfig cc
|
||||
WHERE t.id = vSelf;
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
SELECT vSelf ticketFk, vHasRisk hasProblem;
|
||||
ENGINE = MEMORY
|
||||
SELECT vSelf ticketFk,
|
||||
vHasRisk hasProblem,
|
||||
vIsProblemCalcNeeded isProblemCalcNeeded;
|
||||
|
||||
CALL ticket_setProblem('hasRisk');
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
SELECT vSelf ticketFk, vHasHighRisk hasProblem;
|
||||
ENGINE = MEMORY
|
||||
SELECT vSelf ticketFk,
|
||||
vHasHighRisk hasProblem,
|
||||
vIsProblemCalcNeeded isProblemCalcNeeded;
|
||||
|
||||
CALL ticket_setProblem('hasHighRisk');
|
||||
|
||||
|
|
|
@ -18,8 +18,11 @@ BEGIN
|
|||
|
||||
CALL buyUltimate(vWarehouseFk, vDated);
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
SELECT s.id saleFk , MOD(s.quantity, b.`grouping`) hasProblem
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||
(INDEX(saleFk, isProblemCalcNeeded))
|
||||
SELECT s.id saleFk ,
|
||||
MOD(s.quantity, b.`grouping`) hasProblem,
|
||||
ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
|
||||
FROM ticket t
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
|
||||
|
|
|
@ -9,9 +9,11 @@ BEGIN
|
|||
* @param vClientFk Id cliente, if NULL all clients
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
(INDEX(ticketFk))
|
||||
(INDEX(ticketFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT t.id ticketFk, IF(c.isTaxDataChecked, FALSE, TRUE) hasProblem
|
||||
SELECT t.id ticketFk,
|
||||
IF(c.isTaxDataChecked, FALSE, TRUE) hasProblem,
|
||||
ticket_isProblemCalcNeeded(t.id) isProblemCalcNeeded
|
||||
FROM ticket t
|
||||
JOIN client c ON c.id = t.clientFk
|
||||
WHERE t.shipped >= util.VN_CURDATE()
|
||||
|
|
|
@ -8,13 +8,17 @@ BEGIN
|
|||
*
|
||||
* @param vSelf Id del ticket
|
||||
*/
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
(INDEX(ticketFk))
|
||||
(INDEX(ticketFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
SELECT vSelf ticketFk, ticket_isTooLittle(vSelf) hasProblem;
|
||||
SELECT vSelf ticketFk,
|
||||
ticket_isTooLittle(vSelf) hasProblem,
|
||||
ticket_isProblemCalcNeeded(vSelf) isProblemCalcNeeded;
|
||||
|
||||
CALL ticket_setProblem('isTooLittle');
|
||||
|
||||
DROP TEMPORARY TABLE tmp.ticket;
|
||||
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -10,7 +10,7 @@ BEGIN
|
|||
* @param vItemFk Id del item, NULL ALL items
|
||||
*/
|
||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket
|
||||
(INDEX(ticketFk))
|
||||
(INDEX(ticketFk, isProblemCalcNeeded))
|
||||
ENGINE = MEMORY
|
||||
WITH tickets AS(
|
||||
SELECT t.id ticketFk
|
||||
|
@ -19,7 +19,9 @@ BEGIN
|
|||
WHERE t.shipped >= util.VN_CURDATE()
|
||||
AND (s.itemFk = vItemFk OR vItemFk IS NULL)
|
||||
GROUP BY t.id
|
||||
)SELECT ticketFk, ticket_isTooLittle(ticketFk) hasProblem
|
||||
)SELECT ticketFk,
|
||||
ticket_isTooLittle(ticketFk) hasProblem,
|
||||
ticket_isProblemCalcNeeded(ticketFk) isProblemCalcNeeded
|
||||
FROM tickets;
|
||||
|
||||
CALL ticket_setProblem('isTooLittle');
|
||||
|
|
|
@ -8,6 +8,7 @@ BEGIN
|
|||
* @param vClientFk Id cliente
|
||||
*/
|
||||
DECLARE vHasDebt BOOL;
|
||||
DECLARE vStarted DATETIME;
|
||||
|
||||
SELECT COUNT(*) INTO vHasDebt
|
||||
FROM `client`
|
||||
|
@ -16,22 +17,24 @@ BEGIN
|
|||
|
||||
IF vHasDebt THEN
|
||||
|
||||
SELECT util.VN_CURDATE() - INTERVAL riskScope MONTH INTO vStarted
|
||||
FROM clientConfig;
|
||||
|
||||
CREATE OR REPLACE TEMPORARY TABLE tTicketRisk
|
||||
(KEY (ticketFk))
|
||||
ENGINE = MEMORY
|
||||
WITH ticket AS(
|
||||
SELECT id ticketFk, companyFk, DATE(shipped) dated
|
||||
FROM vn.ticket t
|
||||
SELECT id ticketFk,
|
||||
companyFk,
|
||||
DATE(shipped) dated,
|
||||
totalWithVat,
|
||||
ticket_isProblemCalcNeeded(id) isProblemCalcNeeded
|
||||
FROM vn.ticket
|
||||
WHERE clientFk = vClientFk
|
||||
AND refFk IS NULL
|
||||
AND NOT isDeleted
|
||||
AND totalWithoutVat <> 0
|
||||
), dated AS(
|
||||
SELECT t.companyFk, MIN(DATE(t.dated) - INTERVAL cc.riskScope MONTH) started,
|
||||
MAX(DATE(t.dated)) ended
|
||||
FROM ticket t
|
||||
JOIN vn.clientConfig cc
|
||||
GROUP BY t.companyFk
|
||||
AND IFNULL(totalWithVat, 0) <> 0
|
||||
AND shipped > vStarted
|
||||
), balance AS(
|
||||
SELECT SUM(amount)amount, companyFk
|
||||
FROM (
|
||||
|
@ -49,15 +52,11 @@ BEGIN
|
|||
WHERE companyFk
|
||||
GROUP BY companyFk
|
||||
), uninvoiced AS(
|
||||
SELECT t.companyFk, DATE(t.shipped) dated, SUM(IFNULL(t.totalWithVat, 0)) amount
|
||||
FROM vn.ticket t
|
||||
JOIN dated d
|
||||
WHERE t.clientFk = vClientFk
|
||||
AND t.refFk IS NULL
|
||||
AND t.shipped BETWEEN d.started AND d.ended
|
||||
GROUP BY t.companyFk, DATE(t.shipped)
|
||||
SELECT companyFk, dated, SUM(totalWithVat) amount
|
||||
FROM ticket
|
||||
GROUP BY companyFk, dated
|
||||
), receipt AS(
|
||||
SELECT companyFk,DATE(payed) dated, SUM(amountPaid) amount
|
||||
SELECT companyFk, DATE(payed) dated, SUM(amountPaid) amount
|
||||
FROM vn.receipt
|
||||
WHERE clientFk = vClientFk
|
||||
AND payed > util.VN_CURDATE()
|
||||
|
@ -73,13 +72,21 @@ BEGIN
|
|||
LEFT JOIN receipt r ON r.dated > ui.dated AND r.companyFk = ui.companyFk
|
||||
GROUP BY b.companyFk, ui.dated
|
||||
)
|
||||
SELECT ti.ticketFk, r.amount
|
||||
SELECT ti.ticketFk, r.amount, ti.isProblemCalcNeeded
|
||||
FROM ticket ti
|
||||
JOIN risk r ON r.dated = ti.dated AND r.companyFk = ti.companyFk;
|
||||
|
||||
UPDATE ticket t
|
||||
JOIN tTicketRisk tr ON tr.ticketFk = t.id
|
||||
SET t.risk = tr.amount;
|
||||
SET t.risk = tr.amount
|
||||
WHERE tr.isProblemCalcNeeded
|
||||
ORDER BY t.id;
|
||||
|
||||
UPDATE ticket t
|
||||
JOIN tTicketRisk tr ON tr.ticketFk = t.id
|
||||
SET t.risk = NULL
|
||||
WHERE tr.isProblemCalcNeeded
|
||||
ORDER BY t.id;
|
||||
|
||||
DROP TEMPORARY TABLE tTicketRisk;
|
||||
END IF;
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
ALTER TABLE bs.waste ADD buyerFk int(10) unsigned NOT NULL;
|
||||
|
||||
UPDATE bs.waste w
|
||||
JOIN account.`user` u ON u.name = w.buyer COLLATE utf8mb3_unicode_ci
|
||||
SET w.buyerFk = u.id;
|
||||
|
||||
ALTER TABLE bs.waste
|
||||
DROP PRIMARY KEY,
|
||||
DROP COLUMN family,
|
||||
DROP COLUMN rate,
|
||||
DROP COLUMN buyer;
|
||||
|
||||
ALTER TABLE bs.waste CHANGE buyerFk buyerFk int(10) unsigned NOT NULL AFTER `week`;
|
||||
ALTER TABLE bs.waste ADD CONSTRAINT waste_user_FK FOREIGN KEY (buyerFk) REFERENCES account.user(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
|
||||
ALTER TABLE bs.waste ADD saleQuantity int(11) DEFAULT NULL NULL;
|
||||
ALTER TABLE bs.waste MODIFY COLUMN saleTotal decimal(10,2) DEFAULT NULL NULL;
|
||||
ALTER TABLE bs.waste MODIFY COLUMN saleWaste decimal(10,2) DEFAULT NULL NULL;
|
||||
ALTER TABLE bs.waste CHANGE saleWaste saleInternalWaste decimal(10,2) DEFAULT NULL NULL;
|
||||
ALTER TABLE bs.waste ADD saleExternalWaste decimal(10,2) DEFAULT NULL NULL;
|
||||
ALTER TABLE bs.waste CHANGE saleQuantity saleQuantity decimal(10,2) DEFAULT NULL NULL AFTER itemTypeFk;
|
||||
ALTER TABLE bs.waste CHANGE itemFk itemFk int(11) DEFAULT 0 NOT NULL AFTER itemTypeFk;
|
||||
ALTER TABLE bs.waste ADD CONSTRAINT waste_pk PRIMARY KEY (`year`, `week`, buyerFk, itemTypeFk, itemFk);
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE `vn`.`client`
|
||||
ADD COLUMN `hasDailyInvoice` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice';
|
|
@ -0,0 +1,11 @@
|
|||
RENAME TABLE hedera.shelfConfig TO hedera.shelfMultiConfig ;
|
||||
RENAME TABLE pbx.queueConfig TO pbx.queueMultiConfig ;
|
||||
RENAME TABLE salix.defaultViewConfig TO salix.defaultViewMultiConfig;
|
||||
RENAME TABLE edi.fileConfig TO edi.fileMultiConfig;
|
||||
RENAME TABLE edi.imapConfig TO edi.imapMultiConfig;
|
||||
RENAME TABLE edi.tableConfig TO edi.tableMultiConfig;
|
||||
RENAME TABLE vn.invoiceOutTaxConfig TO vn.invoiceOutTaxMultiConfig;
|
||||
RENAME TABLE vn.userConfig TO vn.userMultiConfig;
|
||||
RENAME TABLE vn.conveyorConfig TO vn.conveyorMultiConfig;
|
||||
|
||||
GRANT SELECT ON TABLE hedera.shelfMultiConfig TO employee;
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE vn.itemMinimumQuantity
|
||||
ADD CONSTRAINT itemMinimumQuantity_check CHECK (quantity > 0);
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
ALTER TABLE vn.ticketLastState MODIFY COLUMN name varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL;
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
INSERT INTO vn.state ( name, `order`, alertLevel, code, sectorProdPriority, nextStateFk, isPreviousPreparable, isPicked, isPreparable, semaphore, isPrintable, isOK, graphCategory, isNotValidated, classColor) VALUES('Entregado en parte', 13, 3, 'PARTIAL_DELIVERED', NULL, 16, 0, 1, 0, 0, 0, 0, 0, 0, NULL);
|
|
@ -0,0 +1,8 @@
|
|||
ALTER TABLE vn.item ADD IF NOT EXISTS tag11 varchar(20) DEFAULT NULL NULL;
|
||||
ALTER TABLE vn.item ADD IF NOT EXISTS value11 varchar(50) DEFAULT NULL NULL;
|
||||
|
||||
ALTER TABLE vn.item ADD IF NOT EXISTS tag12 varchar(20) DEFAULT NULL NULL;
|
||||
ALTER TABLE vn.item ADD IF NOT EXISTS value12 varchar(50) DEFAULT NULL NULL;
|
||||
|
||||
ALTER TABLE vn.item ADD IF NOT EXISTS tag13 varchar(20) DEFAULT NULL NULL;
|
||||
ALTER TABLE vn.item ADD IF NOT EXISTS value13 varchar(50) DEFAULT NULL NULL;
|
|
@ -57,7 +57,7 @@ describe('Ticket List sale path', () => {
|
|||
let searchValue = 'Melee weapon heavy shield 100cm';
|
||||
await page.autocompleteSearch(selectors.ticketSales.secondSaleIdAutocomplete, searchValue);
|
||||
await page.waitToClick(selectors.ticketSales.secondSaleQuantityCell);
|
||||
await page.type(selectors.ticketSales.secondSaleQuantity, '1');
|
||||
await page.type(selectors.ticketSales.secondSaleQuantity, '8');
|
||||
await page.keyboard.press('Enter');
|
||||
const message = await page.waitForSnackbar();
|
||||
|
||||
|
|
|
@ -99,6 +99,10 @@ module.exports = Self => {
|
|||
{
|
||||
arg: 'hasElectronicInvoice',
|
||||
type: 'boolean'
|
||||
},
|
||||
{
|
||||
arg: 'hasDailyInvoice',
|
||||
type: 'boolean'
|
||||
}
|
||||
],
|
||||
returns: {
|
||||
|
@ -117,8 +121,6 @@ module.exports = Self => {
|
|||
const myOptions = {};
|
||||
const models = Self.app.models;
|
||||
const args = ctx.args;
|
||||
const userId = ctx.req.accessToken.userId;
|
||||
const $t = ctx.req.__;
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
|
|
@ -60,7 +60,7 @@ module.exports = Self => {
|
|||
DISTINCT c.id clientFk,
|
||||
c.name clientName,
|
||||
c.salesPersonFk,
|
||||
c.businessTypeFk,
|
||||
c.businessTypeFk = 'worker' isWorker,
|
||||
u.name salesPersonName,
|
||||
d.amount,
|
||||
co.created,
|
||||
|
@ -71,14 +71,23 @@ module.exports = Self => {
|
|||
d.defaulterSinced,
|
||||
cn.name country,
|
||||
c.countryFk,
|
||||
pm.name payMethod
|
||||
FROM vn.defaulter d
|
||||
JOIN vn.client c ON c.id = d.clientFk
|
||||
JOIN vn.country cn ON cn.id = c.countryFk
|
||||
JOIN vn.payMethod pm ON pm.id = c.payMethodFk
|
||||
LEFT JOIN vn.clientObservation co ON co.clientFk = c.id
|
||||
pm.name payMethod,
|
||||
r.finished IS NULL hasRecovery,
|
||||
dp.id departmentFk,
|
||||
dp.name departmentName
|
||||
FROM defaulter d
|
||||
JOIN client c ON c.id = d.clientFk
|
||||
JOIN country cn ON cn.id = c.countryFk
|
||||
JOIN payMethod pm ON pm.id = c.payMethodFk
|
||||
LEFT JOIN clientObservation co ON co.clientFk = c.id
|
||||
LEFT JOIN account.user u ON u.id = c.salesPersonFk
|
||||
LEFT JOIN account.user uw ON uw.id = co.workerFk
|
||||
LEFT JOIN (
|
||||
SELECT MAX(started), clientFk, finished
|
||||
FROM recovery
|
||||
) r ON r.clientFk = c.id
|
||||
LEFT JOIN workerDepartment wd ON wd.workerFk = u.id
|
||||
JOIN department dp ON dp.id = wd.departmentFk
|
||||
WHERE
|
||||
d.created = ?
|
||||
AND d.amount > 0
|
||||
|
|
|
@ -144,6 +144,9 @@
|
|||
},
|
||||
"recommendedCredit": {
|
||||
"type": "number"
|
||||
},
|
||||
"hasDailyInvoice": {
|
||||
"type": "boolean"
|
||||
}
|
||||
|
||||
},
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
<vn-autocomplete vn-one
|
||||
ng-model="$ctrl.location.countryFk"
|
||||
url="Countries"
|
||||
show-field="country"
|
||||
show-field="name"
|
||||
value-field="id"
|
||||
label="Country">
|
||||
</vn-autocomplete>
|
||||
|
|
|
@ -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;
|
||||
|
@ -95,6 +94,11 @@ module.exports = Self => {
|
|||
arg: 'to',
|
||||
type: 'date',
|
||||
description: `The to date filter`
|
||||
},
|
||||
{
|
||||
arg: 'days',
|
||||
type: 'number',
|
||||
description: `N days interval`
|
||||
}
|
||||
],
|
||||
returns: {
|
||||
|
@ -192,6 +196,15 @@ module.exports = Self => {
|
|||
JOIN vn.currency cu ON cu.id = e.currencyFk`
|
||||
);
|
||||
|
||||
if (ctx.args.days) {
|
||||
stmt.merge({
|
||||
sql: `
|
||||
AND t.shipped <= util.VN_CURDATE() + INTERVAL ? DAY
|
||||
AND t.shipped >= util.VN_CURDATE()
|
||||
`,
|
||||
params: [ctx.args.days]
|
||||
});
|
||||
}
|
||||
stmt.merge(conn.makeSuffix(filter));
|
||||
const itemsIndex = stmts.push(stmt) - 1;
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ module.exports = Self => {
|
|||
'stickers',
|
||||
'packing',
|
||||
'grouping',
|
||||
'packing',
|
||||
'groupingMode',
|
||||
'quantity',
|
||||
'packagingFk',
|
||||
|
@ -80,7 +81,9 @@ module.exports = Self => {
|
|||
fields: [
|
||||
'id',
|
||||
'typeFk',
|
||||
'stems',
|
||||
'name',
|
||||
'category',
|
||||
'subName',
|
||||
'size',
|
||||
'minPrice',
|
||||
|
@ -96,14 +99,31 @@ module.exports = Self => {
|
|||
'value9',
|
||||
'tag10',
|
||||
'value10',
|
||||
'groupingMode'
|
||||
'groupingMode',
|
||||
'inkFk',
|
||||
'originFk',
|
||||
'producerFk'
|
||||
],
|
||||
include: {
|
||||
relation: 'itemType',
|
||||
scope: {
|
||||
fields: ['code', 'description']
|
||||
include: [
|
||||
{
|
||||
relation: 'itemType',
|
||||
scope: {
|
||||
fields: ['code', 'description']
|
||||
}
|
||||
},
|
||||
{
|
||||
relation: 'origin',
|
||||
scope: {
|
||||
fields: ['code']
|
||||
}
|
||||
},
|
||||
{
|
||||
relation: 'producer',
|
||||
scope: {
|
||||
fields: ['name']
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}]
|
||||
};
|
||||
|
|
|
@ -39,7 +39,7 @@ describe('Entry filter()', () => {
|
|||
|
||||
const result = await models.Entry.filter(ctx, options);
|
||||
|
||||
expect(result.length).toEqual(9);
|
||||
expect(result.length).toEqual(11);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -55,13 +55,13 @@ describe('Entry filter()', () => {
|
|||
|
||||
try {
|
||||
const ctx = {
|
||||
args: {},
|
||||
args: {days: 6},
|
||||
req: {accessToken: {userId: 1102}}
|
||||
};
|
||||
|
||||
const result = await models.Entry.filter(ctx, options);
|
||||
|
||||
expect(result.length).toEqual(6);
|
||||
expect(result.length).toEqual(2);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -84,7 +84,7 @@ describe('Entry filter()', () => {
|
|||
|
||||
const result = await models.Entry.filter(ctx, options);
|
||||
|
||||
expect(result.length).toEqual(6);
|
||||
expect(result.length).toEqual(8);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -107,7 +107,7 @@ describe('Entry filter()', () => {
|
|||
|
||||
const result = await models.Entry.filter(ctx, options);
|
||||
|
||||
expect(result.length).toEqual(6);
|
||||
expect(result.length).toEqual(8);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
@ -131,7 +131,7 @@ describe('Entry filter()', () => {
|
|||
|
||||
const result = await models.Entry.filter(ctx, options);
|
||||
|
||||
expect(result.length).toEqual(8);
|
||||
expect(result.length).toEqual(10);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -27,28 +27,42 @@ module.exports = Self => {
|
|||
});
|
||||
|
||||
Self.getWasteByItem = async(buyer, family, options) => {
|
||||
const models = Self.app.models;
|
||||
const myOptions = {};
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
const user = await models.VnUser.findOne({
|
||||
fields: ['id'],
|
||||
where: {name: buyer}
|
||||
});
|
||||
|
||||
const itemType = await models.ItemType.findOne({
|
||||
fields: ['id'],
|
||||
where: {name: family}
|
||||
}, options);
|
||||
|
||||
const date = Date.vnNew();
|
||||
date.setHours(0, 0, 0, 0);
|
||||
const wastes = await Self.rawSql(`
|
||||
SELECT *, 100 * dwindle / total AS percentage
|
||||
FROM (
|
||||
SELECT buyer,
|
||||
ws.family,
|
||||
ws.itemFk,
|
||||
sum(ws.saleTotal) AS total,
|
||||
sum(ws.saleWaste) AS dwindle
|
||||
FROM bs.waste ws
|
||||
WHERE buyer = ? AND family = ?
|
||||
AND year = YEAR(TIMESTAMPADD(WEEK,-1, ?))
|
||||
AND week = WEEK(TIMESTAMPADD(WEEK,-1, ?), 1)
|
||||
GROUP BY buyer, itemFk
|
||||
) sub
|
||||
ORDER BY family, percentage DESC`, [buyer, family, date, date], myOptions);
|
||||
SELECT *, 100 * dwindle / total percentage
|
||||
FROM (
|
||||
SELECT u.name buyer,
|
||||
it.name family,
|
||||
w.itemFk,
|
||||
SUM(w.saleTotal) total,
|
||||
SUM(w.saleInternalWaste + w.saleExternalWaste) dwindle
|
||||
FROM bs.waste w
|
||||
JOIN account.user u ON u.id = w.buyerFk
|
||||
JOIN vn.itemType it ON it.id = w.itemTypeFk
|
||||
WHERE w.buyerFk = ? AND w.itemTypeFk = ?
|
||||
AND w.year = YEAR(TIMESTAMPADD(WEEK, -1, ?))
|
||||
AND w.week = WEEK(TIMESTAMPADD(WEEK, -1, ?), 1)
|
||||
GROUP BY w.buyerFk, w.itemFk
|
||||
) sub
|
||||
ORDER BY family, percentage DESC
|
||||
`, [user.id, itemType.id, date, date], myOptions);
|
||||
|
||||
const details = [];
|
||||
|
||||
|
|
|
@ -22,31 +22,37 @@ module.exports = Self => {
|
|||
const date = Date.vnNew();
|
||||
date.setHours(0, 0, 0, 0);
|
||||
const wastes = await Self.rawSql(`
|
||||
SELECT *, 100 * dwindle / total AS percentage
|
||||
FROM (
|
||||
SELECT buyer,
|
||||
ws.family,
|
||||
sum(ws.saleTotal) AS total,
|
||||
sum(ws.saleWaste) AS dwindle
|
||||
FROM bs.waste ws
|
||||
WHERE year = YEAR(TIMESTAMPADD(WEEK,-1, ?))
|
||||
AND week = WEEK(TIMESTAMPADD(WEEK,-1, ?), 1)
|
||||
GROUP BY buyer, family
|
||||
) sub
|
||||
ORDER BY percentage DESC`, [date, date], myOptions);
|
||||
SELECT *, 100 * dwindle / total percentage
|
||||
FROM (
|
||||
SELECT u.name buyer,
|
||||
it.name family,
|
||||
w.itemFk,
|
||||
SUM(w.saleTotal) total,
|
||||
SUM(w.saleInternalWaste + w.saleExternalWaste) dwindle
|
||||
FROM bs.waste w
|
||||
JOIN account.user u ON u.id = w.buyerFk
|
||||
JOIN vn.itemType it ON it.id = w.itemTypeFk
|
||||
WHERE year = YEAR(TIMESTAMPADD(WEEK, -1, ?))
|
||||
AND week = WEEK(TIMESTAMPADD(WEEK, -1, ?), 1)
|
||||
GROUP BY buyerFk, itemTypeFk
|
||||
) sub
|
||||
ORDER BY percentage DESC
|
||||
`, [date, date], myOptions);
|
||||
|
||||
const wastesTotal = await Self.rawSql(`
|
||||
SELECT *, 100 * dwindle / total AS percentage
|
||||
SELECT *, 100 * dwindle / total percentage
|
||||
FROM (
|
||||
SELECT buyer,
|
||||
sum(ws.saleTotal) AS total,
|
||||
sum(ws.saleWaste) AS dwindle
|
||||
FROM bs.waste ws
|
||||
WHERE year = YEAR(TIMESTAMPADD(WEEK,-1, ?))
|
||||
AND week = WEEK(TIMESTAMPADD(WEEK,-1, ?), 1)
|
||||
GROUP BY buyer
|
||||
SELECT u.name buyer,
|
||||
SUM(w.saleTotal) total,
|
||||
SUM(w.saleInternalWaste + w.saleExternalWaste) dwindle
|
||||
FROM bs.waste w
|
||||
JOIN account.user u ON u.id = w.buyerFk
|
||||
WHERE w.year = YEAR(TIMESTAMPADD(WEEK, -1, ?))
|
||||
AND w.week = WEEK(TIMESTAMPADD(WEEK, -1, ?), 1)
|
||||
GROUP BY w.buyerFk
|
||||
) sub
|
||||
ORDER BY percentage DESC`, [date, date], myOptions);
|
||||
ORDER BY percentage DESC
|
||||
`, [date, date], myOptions);
|
||||
|
||||
const details = [];
|
||||
|
||||
|
|
|
@ -6,13 +6,13 @@ describe('Item getWasteByItem()', () => {
|
|||
const options = {transaction: tx};
|
||||
|
||||
try {
|
||||
const result = await models.Item.getWasteByItem('CharlesXavier', 'Cymbidium', options);
|
||||
const result = await models.Item.getWasteByItem('buyer', 'Crisantemo', options);
|
||||
|
||||
const length = result.length;
|
||||
const anyResult = result[Math.floor(Math.random() * Math.floor(length))];
|
||||
|
||||
expect(anyResult.buyer).toEqual('CharlesXavier');
|
||||
expect(anyResult.family).toEqual('Cymbidium');
|
||||
expect(anyResult.buyer).toEqual('buyer');
|
||||
expect(anyResult.family).toEqual('Crisantemo');
|
||||
expect(anyResult.lines.length).toBeGreaterThanOrEqual(2);
|
||||
|
||||
await tx.rollback();
|
||||
|
|
|
@ -11,9 +11,9 @@ describe('Item getWasteByWorker()', () => {
|
|||
const length = result.length;
|
||||
const anyResult = result[Math.floor(Math.random() * Math.floor(length))];
|
||||
|
||||
expect(anyResult.buyer).toMatch(/(CharlesXavier|HankPym|DavidCharlesHaller)/);
|
||||
expect(anyResult.buyer).toMatch(/(buyer|it)/);
|
||||
expect(anyResult.total).toBeGreaterThanOrEqual(1000);
|
||||
expect(anyResult.lines.length).toBeGreaterThanOrEqual(3);
|
||||
expect(anyResult.lines.length).toBeGreaterThanOrEqual(1);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
|
|
|
@ -48,7 +48,7 @@ module.exports = Self => {
|
|||
LEFT JOIN vn.expeditionStateType est ON est.id = e.stateTypeFk
|
||||
JOIN vn.agencyMode am ON am.id = r.agencyModeFk
|
||||
JOIN vn.agency ag ON ag.id = am.agencyFk
|
||||
LEFT JOIN vn.userConfig uc ON uc.userFk = account.myUser_getId()
|
||||
LEFT JOIN vn.userMultiConfig uc ON uc.userFk = account.myUser_getId()
|
||||
WHERE t.routeFk = ?
|
||||
GROUP BY t.addressFk, e.itemPackingTypeFk
|
||||
) sub
|
||||
|
|
|
@ -35,10 +35,10 @@
|
|||
</vn-one>
|
||||
<vn-one>
|
||||
<vn-label-value label="Starting time"
|
||||
value="{{$ctrl.summary.route.time | date: 'HH:MM'}}">
|
||||
value="{{$ctrl.summary.route.started | date: 'HH:mm'}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Finishing time"
|
||||
value="{{$ctrl.summary.route.finished | date: 'HH:MM'}}">
|
||||
value="{{$ctrl.summary.route.finished | date: 'HH:mm'}}">
|
||||
</vn-label-value>
|
||||
<vn-label-value label="Km Start"
|
||||
value="{{$ctrl.summary.route.kmStart}}">
|
||||
|
|
|
@ -44,15 +44,21 @@ module.exports = Self => {
|
|||
|
||||
const expedition = await models.Expedition.findOne(filter);
|
||||
const {code} = expedition.agencyMode();
|
||||
let isDeleted = true;
|
||||
|
||||
if (code && code.toLowerCase().substring(0, 10) == 'viaexpress') {
|
||||
const isDeleted = await models.ViaexpressConfig.deleteExpedition(expeditionId);
|
||||
if (code?.toLowerCase()?.includes('mrw')) {
|
||||
const result = await models.MrwConfig.cancelShipment(expeditionId);
|
||||
isDeleted = result;
|
||||
}
|
||||
|
||||
if (isDeleted === 'true') {
|
||||
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
|
||||
deletedExpeditions.push(deletedExpedition);
|
||||
} else notDeletedExpeditions.push(expeditionId);
|
||||
} else {
|
||||
if (code?.toLowerCase()?.substring(0, 10) == 'viaexpress') {
|
||||
const result = await models.ViaexpressConfig.deleteExpedition(expeditionId);
|
||||
if (result !== 'true') isDeleted = false;
|
||||
}
|
||||
|
||||
if (!isDeleted)
|
||||
notDeletedExpeditions.push(expeditionId);
|
||||
else {
|
||||
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
|
||||
deletedExpeditions.push(deletedExpedition);
|
||||
}
|
||||
|
|
|
@ -53,13 +53,22 @@ module.exports = Self => {
|
|||
const stmts = [];
|
||||
|
||||
const stmt = new ParameterizedSQL(
|
||||
`SELECT t.id AS ticketFk, c.id AS clientFk, c.name AS clientName, tw.weekDay,
|
||||
wh.name AS warehouseName, u.id AS workerFk, u.name AS userName, u.nickName, tw.agencyModeFk
|
||||
`SELECT t.id AS ticketFk,
|
||||
c.id AS clientFk,
|
||||
c.name AS clientName,
|
||||
tw.weekDay,
|
||||
wh.name AS warehouseName,
|
||||
u.id AS workerFk,
|
||||
u.name AS userName,
|
||||
u.nickName,
|
||||
tw.agencyModeFk,
|
||||
am.name agencyModeName
|
||||
FROM ticketWeekly tw
|
||||
JOIN ticket t ON t.id = tw.ticketFk
|
||||
JOIN client c ON c.id = t.clientFk
|
||||
JOIN account.user u ON u.id = c.salesPersonFk
|
||||
JOIN warehouse wh ON wh.id = t.warehouseFk`
|
||||
JOIN warehouse wh ON wh.id = t.warehouseFk
|
||||
LEFT JOIN agencyMode am ON am.id = tw.agencyModeFk`
|
||||
);
|
||||
|
||||
stmt.merge(conn.makeSuffix(filter));
|
||||
|
|
|
@ -71,7 +71,8 @@ module.exports = Self => {
|
|||
JSON_ARRAYAGG(
|
||||
JSON_OBJECT(
|
||||
'ticketId', ticketFk,
|
||||
'reason', reason
|
||||
'reason', reason,
|
||||
'clientId', clientFk
|
||||
)
|
||||
)
|
||||
)errors
|
||||
|
@ -83,7 +84,8 @@ module.exports = Self => {
|
|||
IF(hasErrorDeleted, 'Eliminado', NULL),
|
||||
IF(hasErrorItemTaxCountry, 'Impuesto no informado', NULL),
|
||||
IF(hasErrorAddress, 'Sin dirección', NULL),
|
||||
IF(hasErrorInfoTaxAreaWorld, 'Datos exportaciones', NULL)) reason
|
||||
IF(hasErrorInfoTaxAreaWorld, 'Datos exportaciones', NULL)) reason,
|
||||
clientFk
|
||||
FROM (
|
||||
SELECT t.id ticketFk,
|
||||
SUM(NOT c.hasToInvoice) hasErrorToInvoice,
|
||||
|
@ -93,7 +95,8 @@ module.exports = Self => {
|
|||
SUM(a.id IS NULL) hasErrorAddress,
|
||||
SUM(ios.code IS NOT NULL
|
||||
AND(ad.customsAgentFk IS NULL
|
||||
OR ad.incotermsFk IS NULL)) hasErrorInfoTaxAreaWorld
|
||||
OR ad.incotermsFk IS NULL)) hasErrorInfoTaxAreaWorld,
|
||||
t.clientFk clientFk
|
||||
FROM ticket t
|
||||
LEFT JOIN address ad ON ad.id = t.addressFk
|
||||
JOIN sale s ON s.ticketFk = t.id
|
||||
|
|
|
@ -140,7 +140,16 @@ module.exports = Self => {
|
|||
await models.TicketDms.create({ticketFk: ticket.id, dmsFk: dms[0].id}, myOptions);
|
||||
await ticket.updateAttribute('isSigned', true, myOptions);
|
||||
|
||||
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticketId, 'DELIVERED'], myOptions);
|
||||
const [{stateCode}] = await Self.rawSql(`
|
||||
SELECT
|
||||
IF((SUM(CASE WHEN est.code = 'DELIVERED' THEN 1 ELSE 0 END) = COUNT(*)),
|
||||
'DELIVERED','PARTIAL_DELIVERED') stateCode
|
||||
FROM vn.expedition e
|
||||
JOIN vn.expeditionStateType est ON est.id = e.stateTypeFk
|
||||
WHERE e.ticketFk = ?;
|
||||
`, [ticketId], myOptions);
|
||||
|
||||
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticketId, stateCode], myOptions);
|
||||
|
||||
if (ticket?.address()?.province()?.country()?.code != 'ES' && ticket.cmrFk) {
|
||||
await models.Ticket.saveCmr(ctx, [ticketId], myOptions);
|
||||
|
|
|
@ -26,4 +26,36 @@ describe('Ticket saveSign()', () => {
|
|||
|
||||
expect(error).toBeDefined();
|
||||
});
|
||||
|
||||
it('should change state for ticket', async() => {
|
||||
const tx = await models.Ticket.beginTransaction({});
|
||||
const ticketWithPackedState = 7;
|
||||
const ticketStateId = 16;
|
||||
const ticketCode = 'PARTIAL_DELIVERED';
|
||||
spyOn(models.Dms, 'uploadFile').and.returnValue([{id: 1}]);
|
||||
let ticketTrackingAfter;
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
const tickets = [ticketWithPackedState];
|
||||
|
||||
const state = await models.State.findById(ticketStateId, null, options);
|
||||
await state.updateAttributes({
|
||||
code: ticketCode,
|
||||
name: ticketCode
|
||||
}, options);
|
||||
|
||||
await models.Ticket.saveSign(ctx, tickets, null, null, options);
|
||||
ticketTrackingAfter = await models.TicketLastState.findOne({
|
||||
where: {ticketFk: ticketWithPackedState}
|
||||
}, options);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
|
||||
expect(ticketTrackingAfter.name).toBe('PARTIAL_DELIVERED');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -88,8 +88,8 @@ module.exports = Self => {
|
|||
|
||||
if (await models.ACL.checkAccessAcl(ctx, 'Ticket', 'isRoleAdvanced', '*')) return;
|
||||
|
||||
const minQuantity = await models.ItemMinimumQuantity.findOne({
|
||||
fields: ['quantity'],
|
||||
const itemMinimalQuantity = await models.ItemMinimumQuantity.find({
|
||||
fields: ['quantity', 'warehouseFk'],
|
||||
where: {
|
||||
itemFk: itemId,
|
||||
started: {lte: ticket.shipped},
|
||||
|
@ -103,9 +103,14 @@ module.exports = Self => {
|
|||
{warehouseFk: null}
|
||||
]
|
||||
},
|
||||
limit: 1
|
||||
}, ctx.options);
|
||||
|
||||
const minQuantity = itemMinimalQuantity.reduce((selected, item) => {
|
||||
if (item.warehouseFk === ticket.warehouseFk) return item;
|
||||
if (item.warehouseFk === null && !selected) return item;
|
||||
return selected;
|
||||
}, null);
|
||||
|
||||
if (newQuantity < minQuantity?.quantity && newQuantity != available)
|
||||
throw new UserError('The amount cannot be less than the minimum');
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ describe('Travel extraCommunityFilter()', () => {
|
|||
|
||||
const result = await app.models.Travel.extraCommunityFilter(ctx, filter);
|
||||
|
||||
expect(result.length).toEqual(8);
|
||||
expect(result.length).toEqual(9);
|
||||
});
|
||||
|
||||
it('should return the travel matching "cargoSupplierFk"', async() => {
|
||||
|
@ -110,6 +110,6 @@ describe('Travel extraCommunityFilter()', () => {
|
|||
|
||||
const result = await app.models.Travel.extraCommunityFilter(ctx, filter);
|
||||
|
||||
expect(result.length).toEqual(1);
|
||||
expect(result.length).toEqual(2);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -50,7 +50,7 @@ describe('Travel filter()', () => {
|
|||
|
||||
const result = await app.models.Travel.filter(ctx);
|
||||
|
||||
expect(result.length).toEqual(5);
|
||||
expect(result.length).toEqual(6);
|
||||
});
|
||||
|
||||
it('should return the routes matching "shipped from" and "shipped to"', async() => {
|
||||
|
@ -80,6 +80,6 @@ describe('Travel filter()', () => {
|
|||
|
||||
const result = await app.models.Travel.filter(ctx);
|
||||
|
||||
expect(result.length).toEqual(5);
|
||||
expect(result.length).toEqual(6);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -171,8 +171,8 @@ module.exports = Self => {
|
|||
const address = await models.Address.create({
|
||||
clientFk: user.id,
|
||||
street: street,
|
||||
city: city,
|
||||
provinceFk: provinceFk,
|
||||
city,
|
||||
provinceFk,
|
||||
postalCode: postcode,
|
||||
mobile: phone,
|
||||
nickname: nickname,
|
||||
|
@ -193,7 +193,13 @@ module.exports = Self => {
|
|||
}
|
||||
|
||||
await user.updateAttribute('email', email, myOptions);
|
||||
|
||||
let countryFk;
|
||||
if (provinceFk) {
|
||||
const province = await Self.app.models.Province.findById(provinceFk, {
|
||||
fields: ['countryFk']
|
||||
});
|
||||
countryFk = province.countryFk;
|
||||
}
|
||||
await models.Worker.create({
|
||||
id: user.id,
|
||||
firstName,
|
||||
|
@ -202,7 +208,7 @@ module.exports = Self => {
|
|||
bossFk,
|
||||
fi,
|
||||
birth,
|
||||
|
||||
originCountryFk: countryFk
|
||||
}, myOptions);
|
||||
|
||||
if (tx) await tx.commit();
|
||||
|
@ -212,11 +218,8 @@ module.exports = Self => {
|
|||
const message = e.sqlMessage;
|
||||
|
||||
if (e.message && e.message.includes(`Email already exists`)) throw new UserError(`This personal mail already exists`);
|
||||
|
||||
if (code === 'ER_DUP_ENTRY' && message.includes(`CodigoTrabajador_UNIQUE`)) throw new UserError(`This worker code already exists`);
|
||||
|
||||
if (code === 'ER_DUP_ENTRY' && message.includes(`PRIMARY`)) throw new UserError(`This worker already exists`);
|
||||
|
||||
throw e;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,11 +27,10 @@ module.exports = Self => {
|
|||
});
|
||||
|
||||
async function tinIsValid(err, done) {
|
||||
const filter = {
|
||||
const country = await Self.app.models.Country.findOne({
|
||||
fields: ['code'],
|
||||
where: {id: this.countryFk}
|
||||
};
|
||||
const country = await Self.app.models.Country.findOne(filter);
|
||||
where: {id: this.originCountryFk}
|
||||
});
|
||||
const code = country ? country.code.toLowerCase() : null;
|
||||
|
||||
if (!this.fi || !validateTin(this.fi, code))
|
||||
|
|
|
@ -60,6 +60,11 @@
|
|||
"type": "hasMany",
|
||||
"model": "Zone",
|
||||
"foreignKey": "agencyModeFk"
|
||||
},
|
||||
"mrwService": {
|
||||
"type": "belongsTo",
|
||||
"model": "MrwService",
|
||||
"foreignKey": "code"
|
||||
}
|
||||
},
|
||||
"acls": [
|
||||
|
|
|
@ -42,7 +42,7 @@ fixtures:
|
|||
- ACL
|
||||
- fieldAcl
|
||||
- module
|
||||
- defaultViewConfig
|
||||
- defaultViewMultiConfig
|
||||
vn:
|
||||
- alertLevel
|
||||
- bookingPlanner
|
||||
|
@ -363,7 +363,7 @@ localFixtures:
|
|||
- travelConfig
|
||||
- travelRecalc
|
||||
- travelThermograph
|
||||
- userConfig
|
||||
- userMultiConfig
|
||||
- vehicle
|
||||
- wagonConfig
|
||||
- wagonType
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "salix-back",
|
||||
"version": "24.30.0",
|
||||
"version": "24.32.0",
|
||||
"author": "Verdnatura Levante SL",
|
||||
"description": "Salix backend",
|
||||
"license": "GPL-3.0",
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
SELECT *, 100 * dwindle / total AS percentage
|
||||
SELECT *, 100 * dwindle / total `percentage`
|
||||
FROM (
|
||||
SELECT buyer,
|
||||
sum(saleTotal) as total,
|
||||
sum(saleWaste) as dwindle
|
||||
SELECT u.name buyer,
|
||||
SUM(saleTotal) total,
|
||||
SUM(w.saleInternalWaste + w.saleExternalWaste) dwindle
|
||||
FROM bs.waste w
|
||||
JOIN vn.time t ON w.year = t.year AND w.week = t.week
|
||||
WHERE t.dated = DATE_ADD(CURDATE(), INTERVAL -1 WEEK)
|
||||
GROUP BY buyer
|
||||
JOIN account.user u ON u.id = w.buyerFk
|
||||
JOIN vn.itemType it ON it.id = w.itemTypeFk
|
||||
WHERE w.year = YEAR(util.VN_CURDATE() - INTERVAL 1 WEEK)
|
||||
AND w.week = WEEK(util.VN_CURDATE() - INTERVAL 1 WEEK, 4)
|
||||
GROUP BY buyerFk
|
||||
) sub
|
||||
ORDER BY percentage DESC;
|
||||
ORDER BY `percentage` DESC;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<div v-for="ticket in tickets" class="grid-block vn-px-ml">
|
||||
<p v-if="ticket.ticketId"><b>{{ $t('ticketId') }}:</b> {{ticket.ticketId}}</p>
|
||||
<p v-if="ticket.reason"><b>{{ $t('reason') }}:</b> {{ticket.reason}}</p>
|
||||
<p v-if="ticket.clientId"><b>{{ $t('clientId')}}</b>{{ticket.clientId}}</p>
|
||||
<hr>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
subject: Nightly ticket closing process report
|
||||
title: Nightly ticket closing process report
|
||||
reason: Reason
|
||||
ticketId: Ticket
|
||||
ticketId: Ticket
|
||||
clientId: Client
|
|
@ -1,4 +1,5 @@
|
|||
subject: Informe proceso de cierre de tickets nocturno
|
||||
title: Informe proceso de cierre de tickets nocturno
|
||||
reason: Motivo
|
||||
ticketId: Ticket
|
||||
ticketId: Ticket
|
||||
clientId: Cliente
|
Loading…
Reference in New Issue