Merge branch 'dev' into 8573-addFkExpeditionHost
gitea/salix/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Ivan Mas 2025-02-14 06:55:47 +00:00
commit 5a37bd332e
4 changed files with 102 additions and 95 deletions

View File

@ -33,25 +33,52 @@ module.exports = Self => {
const emailUser = const emailUser =
await Self.app.models.EmailUser.findById(userId, {fields: ['email']}); await Self.app.models.EmailUser.findById(userId, {fields: ['email']});
let html = `<h2>Motivo: ${reason}</h2>`; const tableStyle = 'width:100%; border-collapse: collapse; text-align: left;';
html += `<h3>Usuario: ${userId} ${emailUser.email}</h3>`; const thStyle = 'padding: 8px; border: 1px solid #ddd; background-color: #f4f4f4;';
html += `<h3>Additional Data:</h3>`; const tdStyle = 'padding: 8px; border: 1px solid #ddd;';
html += '<ul>'; const tdBoldStyle = 'padding: 8px; border: 1px solid #ddd; font-weight: bold;';
const subTdStyle = 'padding: 6px; border: 1px solid #ddd;';
const subTdBoldStyle = 'padding: 6px; border: 1px solid #ddd; font-weight: bold;';
let html = `
<h2>Motivo: ${reason}</h2>
<h3>Usuario: ${userId} ${emailUser.email}</h3>
<h3>Additional Data:</h3>
<table style="${tableStyle}">
<thead>
<tr>
<th style="${thStyle}">Clave</th><th style="${thStyle}">Valor</th></tr>
</thead>
<tbody>`;
for (const [key, val] of Object.entries(additionalData)) { for (const [key, val] of Object.entries(additionalData)) {
if (key !== 'config') html += `<li>${key}: ${parse(val)}</li>`; if (key !== 'config') {
else { html += `<tr>
html += `<li>${key}:</li><ul style="list-style-type: square;">`; <td style="${tdBoldStyle}">${key}</td>
for (const [confKey, confVal] of Object.entries(val)) <td style="${tdStyle}">${parse(val)}</td>
html += `<li>${confKey}: ${parse(confVal)}</li>`; </tr>`;
html += '</ul>'; } else {
html += `<tr>
<td style="${tdBoldStyle}">${key}</td>
<td style="${tdStyle}">
<table style="${tableStyle}">
<tbody>`;
for (const [confKey, confVal] of Object.entries(val)) {
html += `<tr>
<td style="${subTdBoldStyle}">${confKey}</td>
<td style="${subTdStyle}">${parse(confVal)}</td>
</tr>`;
}
html += `</tbody></table></td></tr>`;
} }
} }
html += '</ul>'; html += `</tbody></table>`;
const {message, path, name} = additionalData; const {message, path, name} = additionalData;
const err = name && message ? `${name}: ${message}` : name || message || '';
await smtp.send({ await smtp.send({
to: `${config.app.reportEmail}, ${emailUser.email}`, to: `${config.app.reportEmail}, ${emailUser.email}`,
subject: `[Support-Salix] ${path} ${name}: ${message}`, subject: `[Support-Salix] ${path.split('?')[0]} ${err}`,
html html
}); });
}; };

View File

@ -9,15 +9,11 @@ BEGIN
*/ */
DECLARE vDone BOOL; DECLARE vDone BOOL;
DECLARE vClientFk INT; DECLARE vClientFk INT;
DECLARE vCurTicketFk INT; DECLARE vCurTicketFk INT;
DECLARE vIsTaxDataChecked BOOL;
DECLARE vCompanyFk INT;
DECLARE vShipped DATE;
DECLARE vNewInvoiceId INT; DECLARE vNewInvoiceId INT;
DECLARE vHasDailyInvoice BOOL; DECLARE vHasDailyInvoice BOOL;
DECLARE vWithPackage BOOL; DECLARE vWithPackage BOOL;
DECLARE vHasToInvoice BOOL; DECLARE vHasToInvoice BOOL;
DECLARE vSerial VARCHAR(2);
DECLARE vStateCode VARCHAR(45); DECLARE vStateCode VARCHAR(45);
DECLARE cur CURSOR FOR DECLARE cur CURSOR FOR
@ -39,18 +35,11 @@ BEGIN
LEAVE proc; LEAVE proc;
END IF; END IF;
SELECT SELECT c.id,
c.id,
c.isTaxDataChecked,
t.companyFk,
t.shipped,
c.hasDailyInvoice, c.hasDailyInvoice,
w.isManaged, w.isManaged,
c.hasToInvoice c.hasToInvoice
INTO vClientFk, INTO vClientFk,
vIsTaxDataChecked,
vCompanyFk,
vShipped,
vHasDailyInvoice, vHasDailyInvoice,
vWithPackage, vWithPackage,
vHasToInvoice vHasToInvoice
@ -60,7 +49,7 @@ BEGIN
WHERE t.id = vCurTicketFk; WHERE t.id = vCurTicketFk;
INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity) INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
(SELECT vCurTicketFk, p.id, COUNT(*) SELECT vCurTicketFk, p.id, COUNT(*)
FROM expedition e FROM expedition e
JOIN packaging p ON p.id = e.packagingFk JOIN packaging p ON p.id = e.packagingFk
JOIN ticket t ON t.id = e.ticketFk JOIN ticket t ON t.id = e.ticketFk
@ -69,26 +58,35 @@ BEGIN
WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable
AND vWithPackage AND vWithPackage
AND NOT dm.`code`= 'PICKUP' AND NOT dm.`code`= 'PICKUP'
GROUP BY p.itemFk); GROUP BY p.itemFk;
-- No retornables o no catalogados -- No retornables o no catalogados
INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed) INSERT INTO sale (
(SELECT e.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1 itemFk,
ticketFk,
concept,
quantity,
price, isPriceFixed
)SELECT e.freightItemFk,
vCurTicketFk,
i.name,
COUNT(*) amount,
getSpecialPrice(e.freightItemFk, vClientFk),
TRUE
FROM expedition e FROM expedition e
JOIN item i ON i.id = e.freightItemFk JOIN item i ON i.id = e.freightItemFk
LEFT JOIN packaging p ON p.itemFk = i.id LEFT JOIN packaging p ON p.itemFk = i.id
WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0 WHERE e.ticketFk = vCurTicketFk
AND (p.isPackageReturnable = 0 OR p.isPackageReturnable IS NULL)
AND getSpecialPrice(e.freightItemFk, vClientFk) > 0 AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
GROUP BY e.freightItemFk); GROUP BY e.freightItemFk;
IF vHasDailyInvoice AND vHasToInvoice THEN IF vHasDailyInvoice AND vHasToInvoice THEN
SET vStateCode = 'DELIVERED'; SET vStateCode = 'DELIVERED';
ELSE ELSE
SELECT vn.getAlert3State(vCurTicketFk) INTO vStateCode; SELECT getAlert3State(vCurTicketFk) INTO vStateCode;
END IF; END IF;
CALL ticket_setState(vCurTicketFk, vStateCode); CALL ticket_setState(vCurTicketFk, vStateCode);
END LOOP; END LOOP;
CLOSE cur; CLOSE cur;

View File

@ -37,35 +37,51 @@ module.exports = Self => {
const toDate = Date.vnNew(); const toDate = Date.vnNew();
toDate.setHours(0, 0, 0, 0); toDate.setHours(0, 0, 0, 0);
toDate.setDate(toDate.getDate() - 1); toDate.setDate(toDate.getDate() - 1);
const [{dateFrom, dateTo}] = await Self.rawSql(`
SELECT ? - INTERVAL closureDaysAgo DAY dateFrom,
util.dayEnd(?) dateTo
FROM ticketConfig
LIMIT 1`, [toDate, toDate], myOptions);
await Self.rawSql(` await Self.rawSql(`
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_close; DROP TEMPORARY TABLE IF EXISTS tmp.ticket_close;
CREATE TEMPORARY TABLE tmp.ticket_close CREATE TEMPORARY TABLE tmp.ticket_close
ENGINE = MEMORY ENGINE = MEMORY
SELECT WITH wTickets AS(
DISTINCT t.id ticketFk, SELECT t.id ticketFk
t.clientFk,
c.name clientName,
c.email recipient,
eu.email salesPersonEmail,
t.addressFk,
c.hasDailyInvoice,
c.hasToInvoiceByAddress,
t.totalWithVat,
t.companyFk
FROM ticket t FROM ticket t
JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN warehouse wh ON wh.id = t.warehouseFk AND wh.hasComission JOIN warehouse wh ON wh.id = t.warehouseFk AND wh.hasComission
JOIN ticketState ts ON ts.ticketFk = t.id WHERE t.shipped BETWEEN ? AND ?
JOIN alertLevel al ON al.id = ts.alertLevel AND t.refFk IS NULL
JOIN client c ON c.id = t.clientFk ), wTicketsTracking AS(
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk SELECT wt.ticketFk, MAX(tt.id) maxTracking
JOIN ticketConfig tc ON TRUE FROM wTickets wt
WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered')) JOIN ticketTracking tt ON tt.ticketFk = wt.ticketFk
AND t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?) GROUP BY tt.ticketFk
AND t.refFk IS NULL; ), wTicketsLastState AS(
CALL ticket_close(); SELECT wt.ticketFk, tt.stateFk
`, [toDate, toDate], myOptions); FROM wTicketsTracking wt
JOIN ticketTracking tt ON tt.id = wt.maxTracking
) SELECT tls.ticketFk,
t.clientFk,
c.name clientName,
c.email recipient,
eu.email salesPersonEmail,
t.addressFk,
c.hasDailyInvoice,
c.hasToInvoiceByAddress,
t.totalWithVat,
t.companyFk
FROM wTicketsLastState tls
JOIN ticket t ON t.id = tls.ticketFk
JOIN state s ON s.id =tls.stateFk
JOIN alertLevel al ON al.id = s.alertLevel
JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN client c ON c.id = t.clientFk
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'));
CALL ticket_close();
`, [dateFrom, dateTo], myOptions);
await Self.rawSql(` await Self.rawSql(`
UPDATE ticket t UPDATE ticket t
@ -76,11 +92,11 @@ module.exports = Self => {
JOIN ticketConfig tc ON TRUE JOIN ticketConfig tc ON TRUE
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
SET t.routeFk = NULL SET t.routeFk = NULL
WHERE t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?) WHERE t.shipped BETWEEN ? AND ?
AND al.code NOT IN ('DELIVERED', 'PACKED') AND al.code NOT IN ('DELIVERED', 'PACKED')
AND NOT t.packages AND NOT t.packages
AND tob.id IS NULL AND tob.id IS NULL
AND t.routeFk`, [toDate, toDate], myOptions); AND t.routeFk`, [dateFrom, dateTo], myOptions);
const [clients] = await Self.rawSql(` const [clients] = await Self.rawSql(`
SELECT clientFk clientId, SELECT clientFk clientId,
@ -93,8 +109,8 @@ module.exports = Self => {
'quick' serialType 'quick' serialType
FROM tmp.ticket_close FROM tmp.ticket_close
WHERE hasDailyInvoice WHERE hasDailyInvoice
GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk
HAVING total > 0; HAVING total > 0;
DROP TEMPORARY TABLE tmp.ticket_close; DROP TEMPORARY TABLE tmp.ticket_close;
`, [], myOptions); `, [], myOptions);
@ -102,7 +118,6 @@ module.exports = Self => {
await tx.commit(); await tx.commit();
const failedClients = []; const failedClients = [];
// Only for testing
const nestedTransaction = options?.transaction ? myOptions : {}; const nestedTransaction = options?.transaction ? myOptions : {};
for (const client of clients) { for (const client of clients) {
ctx.args = { ctx.args = {

View File

@ -284,39 +284,6 @@
} }
} }
}, },
{
"relation": "business",
"scope": {
"fields": [
"id",
"started",
"ended",
"reasonEndFk",
"departmentFk",
"workerBusinessProfessionalCategoryFk"
],
"include":[
{
"relation": "department",
"scope": {
"fields": ["id", "name"]
}
},
{
"relation": "reasonEnd",
"scope": {
"fields": ["id", "reason"]
}
},
{
"relation": "workerBusinessProfessionalCategory",
"scope": {
"fields": ["id", "description"]
}
}
]
}
},
{ {
"relation": "boss", "relation": "boss",
"scope": { "scope": {