diff --git a/client/client/src/credit-insurance/create/index.spec.js b/client/client/src/credit-insurance/create/index.spec.js index 56739ba55c..82f4c91225 100644 --- a/client/client/src/credit-insurance/create/index.spec.js +++ b/client/client/src/credit-insurance/create/index.spec.js @@ -28,14 +28,15 @@ describe('Client', () => { describe('onSubmit()', () => { it('should perform a POST query', () => { + let started = new Date(); controller.creditClassification = { - started: new Date(), + started: started, credit: 300, grade: 1 }; let newData = { - started: new Date(), + started: started, credit: 300, grade: 1, clientFk: 101 diff --git a/client/core/src/filters/dateTime.js b/client/core/src/filters/dateTime.js new file mode 100644 index 0000000000..5152ee2287 --- /dev/null +++ b/client/core/src/filters/dateTime.js @@ -0,0 +1,15 @@ +import ngModule from '../module'; + +/** + * Returns a formatted date based on input filter. + * + * @return {String} The string result + */ +dateTime.$inject = ['$filter']; + +export default function dateTime($filter) { + return function(input, format) { + return $filter('date')(new Date(input), format); + }; +} +ngModule.filter('dateTime', dateTime); diff --git a/client/core/src/filters/index.js b/client/core/src/filters/index.js index 65d3a996b0..413016d139 100644 --- a/client/core/src/filters/index.js +++ b/client/core/src/filters/index.js @@ -1,3 +1,4 @@ import './phone'; import './ucwords'; import './dash-if-empty'; +import './dateTime'; \ No newline at end of file diff --git a/client/ticket/src/index/index.html b/client/ticket/src/index/index.html index 412f7f23fa..9cd8502a96 100644 --- a/client/ticket/src/index/index.html +++ b/client/ticket/src/index/index.html @@ -21,7 +21,7 @@ - Id + Id Salesperson Date Hour @@ -32,24 +32,24 @@ Warehouse Invoice Route - Total + Total + ui-sref="ticket.card.summary({id: {{::ticket.ticketFk}}})"> - {{::ticket.id}} + {{::ticket.ticketFk}} {{::ticket.salesPerson | dashIfEmpty}} - {{::ticket.shipped | date:'dd/MM/yyyy'}} - {{::ticket.shipped | date:'HH:mm'}} + {{::ticket.shipped | dateTime: 'dd/MM/yyyy'}} + {{::ticket.shipped | dateTime: 'HH:mm'}} c.credit + 10 AND a.deliveryMethodFk != 3; -- para que las recogidas se preparen @@ -76,7 +78,7 @@ BEGIN -- CODIGO 100 INSERT INTO tmp.ticketProblems(ticketFk, problem) SELECT DISTINCT tt.ticketFk, 'Code 100' - FROM tmp.ticket tt + FROM tmp.ticketGetProblems tt JOIN sale s ON s.ticketFk = tt.ticketFk WHERE s.itemFk = 100; @@ -96,7 +98,7 @@ BEGIN -- El disponible es menor que 0 INSERT INTO tmp.ticketProblems(ticketFk, problem) SELECT tt.ticketFk, i.name - FROM tmp.ticket tt + FROM tmp.ticketGetProblems tt JOIN vn.ticket t ON t.id = tt.ticketFk LEFT JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.item i ON i.id = s.itemFk @@ -120,7 +122,7 @@ BEGIN -- Amarillo: El disponible es mayor que cero y la cantidad supera el visible, estando aun sin preparar INSERT INTO tmp.ticketProblems(ticketFk, problem) SELECT tt.ticketFk, CONCAT('Delay', i.name) - FROM tmp.ticket tt + FROM tmp.ticketGetProblems tt JOIN vn.ticket t ON t.id = tt.ticketFk LEFT JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.item i ON i.id = s.itemFk @@ -140,7 +142,9 @@ BEGIN CLOSE vCursor; - DROP TEMPORARY TABLE tmp.ticketListFiltered; + DROP TEMPORARY TABLE + tmp.clientGetDebt, + tmp.ticketListFiltered; END$$ DELIMITER ; diff --git a/services/db/install/changes/1.1.0/06-ticketFilter.sql b/services/db/install/changes/1.1.0/06-ticketFilter.sql deleted file mode 100644 index 32cf249f05..0000000000 --- a/services/db/install/changes/1.1.0/06-ticketFilter.sql +++ /dev/null @@ -1,32 +0,0 @@ -USE `vn`; -DROP procedure IF EXISTS `ticketFilter`; - -DELIMITER $$ -USE `vn`$$ -CREATE DEFINER=`root`@`%` PROCEDURE `ticketFilter`() -BEGIN -/** - * Obtiene un listado de tickets - * junto con el precio total y los problemas - * - * @table tmp.ticket(ticketFk) Identificadores de los tickets a calcular - * @return Listado de tickets - */ - CALL ticketGetTotal(); - CALL ticketGetProblems(); - - DROP TEMPORARY TABLE IF EXISTS tmp.ticketFilter; - CREATE TEMPORARY TABLE tmp.ticketFilter ENGINE = MEMORY - SELECT t.*, tt.total, tp.problem - FROM tmp.ticket t - JOIN tmp.ticketTotal tt ON tt.ticketFk = t.ticketFk - LEFT JOIN tmp.ticketProblems tp ON tp.ticketFk = t.ticketFk; - - DROP TEMPORARY TABLE - tmp.ticket, - tmp.ticketTotal, - tmp.ticketProblems; -END$$ - -DELIMITER ; - diff --git a/services/db/install/changes/1.1.0/11-clientGetDebt.sql b/services/db/install/changes/1.1.0/11-clientGetDebt.sql new file mode 100644 index 0000000000..62ded4d694 --- /dev/null +++ b/services/db/install/changes/1.1.0/11-clientGetDebt.sql @@ -0,0 +1,70 @@ +DROP procedure IF EXISTS vn.`clientGetDebt`; + +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE vn.`clientGetDebt`(vDate DATE) +BEGIN +/** + * Calcula el riesgo para los clientes activos + * + * @table tmp.clientGetDebt(clientFk) + * @param vDate Fecha maxima de los registros + * @return tmp.risk + */ + DECLARE vStarted DATETIME DEFAULT TIMESTAMPADD(DAY, - DAYOFMONTH(CURDATE()) - 5, CURDATE()); + DECLARE vEnded DATETIME; + + SET vEnded = TIMESTAMP(IFNULL(vDate, CURDATE()), '23:59:59'); + + DROP TEMPORARY TABLE IF EXISTS tmp.ticket; + CREATE TEMPORARY TABLE tmp.ticket + (INDEX (ticketFk)) + ENGINE = MEMORY + SELECT id ticketFk, c.clientFk + FROM ticket t + JOIN tmp.clientGetDebt c ON c.clientFk = t.clientFk + WHERE refFk IS NULL + AND shipped BETWEEN vStarted AND vEnded; + + CALL ticketGetTotal(); + + DROP TEMPORARY TABLE IF EXISTS tClientRisk; + CREATE TEMPORARY TABLE tClientRisk + ENGINE = MEMORY + SELECT cr.customer_id clientFk, SUM(cr.amount) amount + FROM bi.customer_risk cr + JOIN tmp.clientGetDebt c ON c.clientFk = cr.customer_id + GROUP BY cr.customer_id; + + INSERT INTO tClientRisk + SELECT c.clientFk, SUM(r.amountPaid) + FROM receipt r + JOIN tmp.clientGetDebt c ON c.clientFk = r.clientFk + WHERE r.payed > vStarted + GROUP BY c.clientFk; + + INSERT INTO tClientRisk + SELECT t.clientFk, CAST(-SUM(t.amount) / 100 AS DECIMAL(10,2)) + FROM hedera.tpvTransaction t + JOIN tmp.clientGetDebt c ON c.clientFk = t.clientFk + WHERE t.receiptFk IS NULL + AND t.status = 'ok' + GROUP BY t.clientFk; + + INSERT INTO tClientRisk + SELECT t.clientFk, total + FROM tmp.ticketTotal tt + JOIN tmp.ticket t ON t.ticketFk = tt.ticketFk; + + DROP TEMPORARY TABLE IF EXISTS tmp.risk; + CREATE TEMPORARY TABLE tmp.risk + (PRIMARY KEY (clientFk)) + ENGINE = MEMORY + SELECT clientFk, SUM(amount) risk + FROM client c + JOIN tClientRisk cr ON cr.clientFk = c.id + WHERE c.isActive + GROUP BY c.id; +END$$ + +DELIMITER ; + diff --git a/services/loopback/common/methods/item/specs/clone.spec.js b/services/loopback/common/methods/item/specs/clone.spec.js index 816a94e7be..137fbc792f 100644 --- a/services/loopback/common/methods/item/specs/clone.spec.js +++ b/services/loopback/common/methods/item/specs/clone.spec.js @@ -20,14 +20,14 @@ describe('item clone()', () => { }); it('should attempt to clone the given item but give an error as it doesnt exist', async() => { - let result; - try { - let itemFk = 999; - result = await app.models.Item.clone(itemFk); - } catch (error) { - expect(error.toString()).toContain('Cannot convert undefined or null to object'); - } + let error; + let itemFk = 999; + await app.models.Item.clone(itemFk) + .catch(e => { + expect(e.message).toContain('Cannot convert undefined or null to object'); + error = e; + }); - expect(result).toBeFalsy(); + expect(error).toBeDefined(); }); }); diff --git a/services/loopback/common/methods/item/specs/updateTaxes.spec.js b/services/loopback/common/methods/item/specs/updateTaxes.spec.js new file mode 100644 index 0000000000..aa30ed8cd6 --- /dev/null +++ b/services/loopback/common/methods/item/specs/updateTaxes.spec.js @@ -0,0 +1,40 @@ +const app = require(`${servicesDir}/item/server/server`); + +describe('item updateTaxes()', () => { + afterAll(async() => { + let taxesInFixtures = [{id: 509368, taxClassFk: 1}]; + + await app.models.Item.updateTaxes(taxesInFixtures); + }); + + it('should throw an error if the taxClassFk is blank', async() => { + let error; + let taxes = [{id: 509368, taxClassFk: undefined}]; + + await app.models.Item.updateTaxes(taxes) + .catch(err => { + expect(err.message).toEqual('Tax class cannot be blank'); + error = err; + }); + + expect(error).toBeDefined(); + }); + + it('should update the tax of a given country of an item', async() => { + let taxCountry = await app.models.ItemTaxCountry.findById(509368); + + expect(taxCountry.taxClassFk).toEqual(1); + + let taxes = [{id: 509368, taxClassFk: 2}]; + + let result = await app.models.Item.updateTaxes(taxes); + + expect(result).toBeTruthy(); + }); + + it('should confirm the tax class was updated', async() => { + let taxCountry = await app.models.ItemTaxCountry.findById(509368); + + expect(taxCountry.taxClassFk).toEqual(2); + }); +}); diff --git a/services/loopback/common/methods/item/updateTaxes.js b/services/loopback/common/methods/item/updateTaxes.js index 02065be20b..53c073dbf7 100644 --- a/services/loopback/common/methods/item/updateTaxes.js +++ b/services/loopback/common/methods/item/updateTaxes.js @@ -11,7 +11,7 @@ module.exports = Self => { description: 'The item id', http: {source: 'path'} }, { - arg: 'niches', + arg: 'taxes', type: ['object'], required: true, description: 'The list of taxes to update', @@ -27,7 +27,7 @@ module.exports = Self => { } }); - Self.updateTaxes = async(id, taxes) => { + Self.updateTaxes = async taxes => { let promises = []; for (let tax of taxes) { if (!tax.taxClassFk) diff --git a/services/loopback/common/methods/ticket/filter.js b/services/loopback/common/methods/ticket/filter.js index 12ae5f30e9..95f553bbc9 100644 --- a/services/loopback/common/methods/ticket/filter.js +++ b/services/loopback/common/methods/ticket/filter.js @@ -27,13 +27,12 @@ module.exports = Self => { let stmts = []; let stmt; - stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.ticket'); + stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.filter'); stmt = new ParameterizedSQL( - `CREATE TEMPORARY TABLE tmp.ticket + `CREATE TEMPORARY TABLE tmp.filter (PRIMARY KEY (ticketFk)) ENGINE = MEMORY - SELECT - t.id, + SELECT t.id AS ticketFk, t.shipped, t.nickname, @@ -49,7 +48,8 @@ module.exports = Self => { w.name AS warehouse, am.name AS agencyMode, st.name AS state, - wk.name AS salesPerson + wk.name AS salesPerson, + 0 AS total FROM ticket t LEFT JOIN address a ON a.id = t.addressFk LEFT JOIN province p ON p.id = a.provinceFk @@ -62,17 +62,45 @@ module.exports = Self => { stmt.merge(Self.buildSuffix(filter, 't')); stmts.push(stmt); - stmts.push('CALL ticketFilter()'); + stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.ticket'); + stmts.push(` + CREATE TEMPORARY TABLE tmp.ticket + (PRIMARY KEY (ticketFk)) ENGINE = MEMORY + SELECT ticketFk FROM tmp.filter`); + stmts.push('CALL ticketGetTotal()'); - stmt = new ParameterizedSQL( - `SELECT * FROM tmp.ticketFilter tfl` - ); - stmt.merge(Self.buildSuffix(filter, 'tfl')); - let rsIndex = stmts.push(stmt) - 1; + stmts.push(` + UPDATE tmp.filter f + JOIN tmp.ticketTotal tt ON f.ticketFk = tt.ticketFk + SET f.total = tt.total`); + + stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.ticketGetProblems'); + stmts.push(` + CREATE TEMPORARY TABLE tmp.ticketGetProblems + (PRIMARY KEY (ticketFk)) ENGINE = MEMORY + SELECT ticketFk, clientFk, warehouseFk, shipped + FROM tmp.filter`); + stmts.push('CALL ticketGetProblems()'); + + stmt = new ParameterizedSQL(` + SELECT + f.*, + tp.problem + FROM tmp.filter f + LEFT JOIN tmp.ticketProblems tp ON tp.ticketFk = f.ticketFk`); + stmt.merge(Self.buildSuffix(filter, 'f')); + let ticketsIndex = stmts.push(stmt) - 1; + + stmts.push( + `DROP TEMPORARY TABLE + tmp.filter, + tmp.ticket, + tmp.ticketTotal, + tmp.ticketGetProblems`); let sql = ParameterizedSQL.join(stmts, ';'); - let tickets = await Self.rawStmt(sql); + let result = await Self.rawStmt(sql); - return tickets[rsIndex]; + return result[ticketsIndex]; }; }; diff --git a/services/loopback/common/methods/ticket/specs/filter.spec.js b/services/loopback/common/methods/ticket/specs/filter.spec.js index 38de4fabe2..e4806a00dd 100644 --- a/services/loopback/common/methods/ticket/specs/filter.spec.js +++ b/services/loopback/common/methods/ticket/specs/filter.spec.js @@ -4,7 +4,7 @@ describe('ticket filter()', () => { it('should call the filter method', async() => { let filter = {order: 'shipped DESC'}; let result = await app.models.Ticket.filter(filter); - let ticketId = result[0].id; + let ticketId = result[0].ticketFk; expect(ticketId).toEqual(15); });