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);
});