fix: refs #7844 salesFilter and tmp.ticket_problems.totalProblems
gitea/salix/pipeline/head This commit looks good Details
gitea/salix/pipeline/pr-test This commit looks good Details

This commit is contained in:
Guillermo Bonet 2024-09-03 12:06:31 +02:00
parent 6f97d1b83a
commit 0c3349dc03
4 changed files with 46 additions and 86 deletions

View File

@ -35,6 +35,7 @@ BEGIN
saleFk INT(11), saleFk INT(11),
isFreezed INTEGER(1) DEFAULT 0, isFreezed INTEGER(1) DEFAULT 0,
risk DECIMAL(10,1) DEFAULT 0, risk DECIMAL(10,1) DEFAULT 0,
hasRisk TINYINT(1) DEFAULT 0,
hasHighRisk TINYINT(1) DEFAULT 0, hasHighRisk TINYINT(1) DEFAULT 0,
hasTicketRequest INTEGER(1) DEFAULT 0, hasTicketRequest INTEGER(1) DEFAULT 0,
itemShortage VARCHAR(255), itemShortage VARCHAR(255),
@ -52,6 +53,7 @@ BEGIN
saleFk, saleFk,
isFreezed, isFreezed,
risk, risk,
hasRisk,
hasHighRisk, hasHighRisk,
hasTicketRequest, hasTicketRequest,
isTaxDataChecked, isTaxDataChecked,
@ -62,6 +64,7 @@ BEGIN
s.id, s.id,
IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed, IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed,
t.risk, t.risk,
IF(FIND_IN_SET('hasRisk', t.problem), TRUE, FALSE) hasRisk,
IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk, IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk,
IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest, IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest,
IF(FIND_IN_SET('isTaxDataChecked', t.problem), FALSE, TRUE) isTaxDataChecked, IF(FIND_IN_SET('isTaxDataChecked', t.problem), FALSE, TRUE) isTaxDataChecked,

View File

@ -18,6 +18,7 @@ BEGIN
SELECT ticketFk, SELECT ticketFk,
MAX(isFreezed) isFreezed, MAX(isFreezed) isFreezed,
MAX(risk) risk, MAX(risk) risk,
MAX(hasRisk) hasRisk,
MAX(hasHighRisk) hasHighRisk, MAX(hasHighRisk) hasHighRisk,
MAX(hasTicketRequest) hasTicketRequest, MAX(hasTicketRequest) hasTicketRequest,
MAX(itemShortage) itemShortage, MAX(itemShortage) itemShortage,
@ -32,19 +33,19 @@ BEGIN
FROM tmp.sale_problems FROM tmp.sale_problems
GROUP BY ticketFk; GROUP BY ticketFk;
UPDATE tmp.ticket_problems tp UPDATE tmp.ticket_problems
SET tp.totalProblems = ( SET totalProblems = (
(tp.isFreezed) + (isFreezed) +
IF(tp.risk,TRUE, FALSE) + (hasRisk) +
(tp.hasTicketRequest) + (hasTicketRequest) +
(tp.isTaxDataChecked = 0) + (isTaxDataChecked) +
(tp.hasComponentLack) + (hasComponentLack) +
(tp.itemDelay) + (itemDelay IS NOT NULL) +
(tp.isTooLittle) + (isTooLittle) +
(tp.itemLost) + (itemLost IS NOT NULL) +
(tp.hasRounding) + (hasRounding IS NOT NULL) +
(tp.itemShortage) + (itemShortage IS NOT NULL) +
(tp.isVip) (isVip)
); );
DROP TEMPORARY TABLE tmp.sale_problems; DROP TEMPORARY TABLE tmp.sale_problems;

View File

@ -238,45 +238,6 @@ module.exports = Self => {
stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`); stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`);
// Get client debt balance
stmts.push(`
CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt
(PRIMARY KEY (clientFk))
ENGINE = MEMORY
SELECT DISTINCT clientFk FROM tmp.filter`);
stmt = new ParameterizedSQL('CALL client_getDebt(?)', [args.to]);
stmts.push(stmt);
stmts.push('DROP TEMPORARY TABLE tmp.clientGetDebt');
stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.tickets
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT f.*, r.risk AS debt
FROM tmp.filter f
LEFT JOIN tmp.risk r ON f.clientFk = r.clientFk`);
stmts.push(stmt);
// Sum risk to future
stmts.push(`SET @client:= 0`);
stmts.push('SET @risk := 0');
stmts.push(`
UPDATE tmp.tickets
SET debt = IF(@client <> @client:= clientFk,
-totalWithVat + @risk:= - debt + totalWithVat,
-totalWithVat + @risk:= @risk + totalWithVat
)
ORDER BY clientFk, shipped DESC
`);
// Remove positive risks
stmts.push(`
UPDATE tmp.tickets t
SET debt = 0
WHERE t.debt + t.credit >= 0
`);
stmt = new ParameterizedSQL(` stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
(INDEX (ticketFk)) (INDEX (ticketFk))
@ -290,15 +251,6 @@ module.exports = Self => {
stmts.push('CALL ticket_getProblems(FALSE)'); stmts.push('CALL ticket_getProblems(FALSE)');
stmts.push(`
INSERT INTO tmp.ticket_problems (ticketFk, risk, totalProblems)
SELECT t.id, t.debt + t.credit AS risk, 1
FROM tmp.tickets t
WHERE (t.debt + t.credit) < 0
ON DUPLICATE KEY UPDATE
risk = t.debt + t.credit, totalProblems = totalProblems + 1
`);
stmt = new ParameterizedSQL(` stmt = new ParameterizedSQL(`
CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getWarnings CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getWarnings
(INDEX (ticketFk, agencyModeFk)) (INDEX (ticketFk, agencyModeFk))
@ -311,14 +263,18 @@ module.exports = Self => {
stmts.push('CALL ticket_getWarnings()'); stmts.push('CALL ticket_getWarnings()');
stmt = new ParameterizedSQL(` stmt = new ParameterizedSQL(`
SELECT t.*, UPDATE tmp.ticket_problems
tp.*, SET risk = IF(hasRisk AND risk > 0, risk, 0)
tp.hasHighRisk,
tw.*
FROM tmp.tickets t
LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = t.id
LEFT JOIN tmp.ticket_warnings tw ON tw.ticketFk = t.id
`); `);
stmts.push(stmt);
stmt = new ParameterizedSQL(`
SELECT *
FROM tmp.filter f
LEFT JOIN tmp.ticket_problems tp ON tp.ticketFk = f.id
LEFT JOIN tmp.ticket_warnings tw ON tw.ticketFk = f.id
`);
stmts.push(stmt);
const hasProblems = args.problems; const hasProblems = args.problems;
if (hasProblems != undefined && (!args.from && !args.to)) if (hasProblems != undefined && (!args.from && !args.to))
@ -354,23 +310,23 @@ module.exports = Self => {
switch (param) { switch (param) {
case 'search': case 'search':
return /^\d+$/.test(value) return /^\d+$/.test(value)
? {'t.id': {inq: value}} ? {'f.id': {inq: value}}
: {'t.nickname': {like: `%${value}%`}}; : {'f.nickname': {like: `%${value}%`}};
case 'nickname': case 'nickname':
return {'t.nickname': {like: `%${value}%`}}; return {'f.nickname': {like: `%${value}%`}};
case 'refFk': case 'refFk':
return {'t.refFk': value}; return {'f.refFk': value};
case 'provinceFk': case 'provinceFk':
return {'t.provinceFk': value}; return {'f.provinceFk': value};
case 'stateFk': case 'stateFk':
return {'t.stateFk': value}; return {'f.stateFk': value};
case 'alertLevel': case 'alertLevel':
return {'t.alertLevel': value}; return {'f.alertLevel': value};
case 'pending': case 'pending':
if (value) { if (value) {
return {'t.alertLevelCode': {inq: [ return {'f.alertLevelCode': {inq: [
'FIXING', 'FIXING',
'FREE', 'FREE',
'NOT_READY', 'NOT_READY',
@ -380,7 +336,7 @@ module.exports = Self => {
'WAITING_FOR_PAYMENT' 'WAITING_FOR_PAYMENT'
]}}; ]}};
} else { } else {
return {'t.alertLevelCode': {inq: [ return {'f.alertLevelCode': {inq: [
'ON_PREPARATION', 'ON_PREPARATION',
'ON_CHECKING', 'ON_CHECKING',
'CHECKED', 'CHECKED',
@ -404,7 +360,7 @@ module.exports = Self => {
} }
case 'agencyModeFk': case 'agencyModeFk':
case 'warehouseFk': case 'warehouseFk':
param = `t.${param}`; param = `f.${param}`;
return {[param]: value}; return {[param]: value};
} }
}); });
@ -417,14 +373,14 @@ module.exports = Self => {
stmt.merge(conn.makeLimit(filter)); stmt.merge(conn.makeLimit(filter));
const ticketsIndex = stmts.push(stmt) - 1; const ticketsIndex = stmts.push(stmt) - 1;
stmts.push( stmts.push(`
`DROP TEMPORARY TABLE DROP TEMPORARY TABLE
tmp.filter, tmp.filter,
tmp.ticket_problems, tmp.ticket_problems,
tmp.sale_getProblems, tmp.sale_getProblems,
tmp.sale_getWarnings, tmp.sale_getWarnings,
tmp.ticket_warnings, tmp.ticket_warnings
tmp.risk`); `);
const sql = ParameterizedSQL.join(stmts, ';'); const sql = ParameterizedSQL.join(stmts, ';');
const result = await conn.executeStmt(sql, myOptions); const result = await conn.executeStmt(sql, myOptions);

View File

@ -39,7 +39,7 @@ describe('SalesMonitor salesFilter()', () => {
const filter = {}; const filter = {};
const result = await models.SalesMonitor.salesFilter(ctx, filter, options); const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
expect(result.length).toBeGreaterThan(11); expect(result.length).toBeGreaterThan(10);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -68,7 +68,7 @@ describe('SalesMonitor salesFilter()', () => {
const filter = {}; const filter = {};
const result = await models.SalesMonitor.salesFilter(ctx, filter, options); const result = await models.SalesMonitor.salesFilter(ctx, filter, options);
expect(result.length).toEqual(0); expect(result.length).toEqual(4);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {
@ -218,8 +218,8 @@ describe('SalesMonitor salesFilter()', () => {
const firstTicket = result.shift(); const firstTicket = result.shift();
const secondTicket = result.shift(); const secondTicket = result.shift();
expect(firstTicket.totalProblems).toEqual(1); expect(firstTicket.totalProblems).toEqual(4);
expect(secondTicket.totalProblems).toEqual(1); expect(secondTicket.totalProblems).toEqual(4);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {