diff --git a/back/methods/osticket/sendToSupport.js b/back/methods/osticket/sendToSupport.js
index dabd35f80e..55ac65635b 100644
--- a/back/methods/osticket/sendToSupport.js
+++ b/back/methods/osticket/sendToSupport.js
@@ -33,25 +33,52 @@ module.exports = Self => {
const emailUser =
await Self.app.models.EmailUser.findById(userId, {fields: ['email']});
- let html = `
Motivo: ${reason}
`;
- html += `Usuario: ${userId} ${emailUser.email}
`;
- html += `Additional Data:
`;
- html += '';
+ const tableStyle = 'width:100%; border-collapse: collapse; text-align: left;';
+ const thStyle = 'padding: 8px; border: 1px solid #ddd; background-color: #f4f4f4;';
+ const tdStyle = 'padding: 8px; border: 1px solid #ddd;';
+ 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 = `
+ Motivo: ${reason}
+ Usuario: ${userId} ${emailUser.email}
+ Additional Data:
+
+
+
+ Clave | Valor |
+
+ `;
for (const [key, val] of Object.entries(additionalData)) {
- if (key !== 'config') html += `- ${key}: ${parse(val)}
`;
- else {
- html += `- ${key}:
`;
- for (const [confKey, confVal] of Object.entries(val))
- html += `- ${confKey}: ${parse(confVal)}
`;
- html += '
';
+ if (key !== 'config') {
+ html += `
+ ${key} |
+ ${parse(val)} |
+
`;
+ } else {
+ html += `
+ ${key} |
+
+
+ `;
+ for (const [confKey, confVal] of Object.entries(val)) {
+ html += `
+ ${confKey} |
+ ${parse(confVal)} |
+ `;
+ }
+ html += ` |
`;
}
}
- html += '';
+ html += `
`;
const {message, path, name} = additionalData;
+ const err = name && message ? `${name}: ${message}` : name || message || '';
+
await smtp.send({
to: `${config.app.reportEmail}, ${emailUser.email}`,
- subject: `[Support-Salix] ${path} ${name}: ${message}`,
+ subject: `[Support-Salix] ${path.split('?')[0]} ${err}`,
html
});
};
diff --git a/db/routines/vn/procedures/ticket_close.sql b/db/routines/vn/procedures/ticket_close.sql
index 2b6a33fbaa..c298021a52 100644
--- a/db/routines/vn/procedures/ticket_close.sql
+++ b/db/routines/vn/procedures/ticket_close.sql
@@ -9,15 +9,11 @@ BEGIN
*/
DECLARE vDone BOOL;
DECLARE vClientFk INT;
- DECLARE vCurTicketFk INT;
- DECLARE vIsTaxDataChecked BOOL;
- DECLARE vCompanyFk INT;
- DECLARE vShipped DATE;
+ DECLARE vCurTicketFk INT;
DECLARE vNewInvoiceId INT;
DECLARE vHasDailyInvoice BOOL;
DECLARE vWithPackage BOOL;
- DECLARE vHasToInvoice BOOL;
- DECLARE vSerial VARCHAR(2);
+ DECLARE vHasToInvoice BOOL;
DECLARE vStateCode VARCHAR(45);
DECLARE cur CURSOR FOR
@@ -39,18 +35,11 @@ BEGIN
LEAVE proc;
END IF;
- SELECT
- c.id,
- c.isTaxDataChecked,
- t.companyFk,
- t.shipped,
+ SELECT c.id,
c.hasDailyInvoice,
w.isManaged,
c.hasToInvoice
INTO vClientFk,
- vIsTaxDataChecked,
- vCompanyFk,
- vShipped,
vHasDailyInvoice,
vWithPackage,
vHasToInvoice
@@ -60,7 +49,7 @@ BEGIN
WHERE t.id = vCurTicketFk;
INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
- (SELECT vCurTicketFk, p.id, COUNT(*)
+ SELECT vCurTicketFk, p.id, COUNT(*)
FROM expedition e
JOIN packaging p ON p.id = e.packagingFk
JOIN ticket t ON t.id = e.ticketFk
@@ -69,26 +58,35 @@ BEGIN
WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable
AND vWithPackage
AND NOT dm.`code`= 'PICKUP'
- GROUP BY p.itemFk);
+ GROUP BY p.itemFk;
-- No retornables o no catalogados
- INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed)
- (SELECT e.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1
+ INSERT INTO sale (
+ itemFk,
+ ticketFk,
+ concept,
+ quantity,
+ price, isPriceFixed
+ )SELECT e.freightItemFk,
+ vCurTicketFk,
+ i.name,
+ COUNT(*) amount,
+ getSpecialPrice(e.freightItemFk, vClientFk),
+ TRUE
FROM expedition e
JOIN item i ON i.id = e.freightItemFk
LEFT JOIN packaging p ON p.itemFk = i.id
- WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
+ WHERE e.ticketFk = vCurTicketFk
+ AND (p.isPackageReturnable = 0 OR p.isPackageReturnable IS NULL)
AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
- GROUP BY e.freightItemFk);
-
+ GROUP BY e.freightItemFk;
IF vHasDailyInvoice AND vHasToInvoice THEN
SET vStateCode = 'DELIVERED';
ELSE
- SELECT vn.getAlert3State(vCurTicketFk) INTO vStateCode;
+ SELECT getAlert3State(vCurTicketFk) INTO vStateCode;
END IF;
CALL ticket_setState(vCurTicketFk, vStateCode);
-
END LOOP;
CLOSE cur;
diff --git a/modules/ticket/back/methods/ticket/closeAll.js b/modules/ticket/back/methods/ticket/closeAll.js
index 92d1925995..b645c714c9 100644
--- a/modules/ticket/back/methods/ticket/closeAll.js
+++ b/modules/ticket/back/methods/ticket/closeAll.js
@@ -37,35 +37,51 @@ module.exports = Self => {
const toDate = Date.vnNew();
toDate.setHours(0, 0, 0, 0);
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(`
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_close;
CREATE TEMPORARY TABLE tmp.ticket_close
ENGINE = MEMORY
- SELECT
- DISTINCT t.id ticketFk,
- t.clientFk,
- c.name clientName,
- c.email recipient,
- eu.email salesPersonEmail,
- t.addressFk,
- c.hasDailyInvoice,
- c.hasToInvoiceByAddress,
- t.totalWithVat,
- t.companyFk
+ WITH wTickets AS(
+ SELECT t.id ticketFk
FROM ticket t
- JOIN agencyMode am ON am.id = t.agencyModeFk
JOIN warehouse wh ON wh.id = t.warehouseFk AND wh.hasComission
- JOIN ticketState ts ON ts.ticketFk = t.id
- JOIN alertLevel al ON al.id = ts.alertLevel
- JOIN client c ON c.id = t.clientFk
- LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
- JOIN ticketConfig tc ON TRUE
- WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'))
- AND t.shipped BETWEEN ? - INTERVAL tc.closureDaysAgo DAY AND util.dayEnd(?)
- AND t.refFk IS NULL;
- CALL ticket_close();
- `, [toDate, toDate], myOptions);
+ WHERE t.shipped BETWEEN ? AND ?
+ AND t.refFk IS NULL
+ ), wTicketsTracking AS(
+ SELECT wt.ticketFk, MAX(tt.id) maxTracking
+ FROM wTickets wt
+ JOIN ticketTracking tt ON tt.ticketFk = wt.ticketFk
+ GROUP BY tt.ticketFk
+ ), wTicketsLastState AS(
+ SELECT wt.ticketFk, tt.stateFk
+ 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(`
UPDATE ticket t
@@ -76,11 +92,11 @@ module.exports = Self => {
JOIN ticketConfig tc ON TRUE
LEFT JOIN ticketObservation tob ON tob.ticketFk = t.id
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 NOT t.packages
AND tob.id IS NULL
- AND t.routeFk`, [toDate, toDate], myOptions);
+ AND t.routeFk`, [dateFrom, dateTo], myOptions);
const [clients] = await Self.rawSql(`
SELECT clientFk clientId,
@@ -93,8 +109,8 @@ module.exports = Self => {
'quick' serialType
FROM tmp.ticket_close
WHERE hasDailyInvoice
- GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk
- HAVING total > 0;
+ GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk
+ HAVING total > 0;
DROP TEMPORARY TABLE tmp.ticket_close;
`, [], myOptions);
@@ -102,7 +118,6 @@ module.exports = Self => {
await tx.commit();
const failedClients = [];
- // Only for testing
const nestedTransaction = options?.transaction ? myOptions : {};
for (const client of clients) {
ctx.args = {
diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json
index 2715c233b1..16b3d25025 100644
--- a/modules/worker/back/models/worker.json
+++ b/modules/worker/back/models/worker.json
@@ -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",
"scope": {