From 31d655b1309233104fc889abb2cbd8272cc28c77 Mon Sep 17 00:00:00 2001 From: Joan Date: Wed, 10 Oct 2018 09:59:42 +0200 Subject: [PATCH 1/2] Create ticket with transaction --- client/order/src/create/card.js | 2 -- client/ticket/src/sale/index.js | 2 +- .../importToNewRefundTicket.js | 28 +++++++++++++++---- .../importToNewRefundTicket.spec.js | 18 ++++++------ .../common/methods/claim/regularizeClaim.js | 4 ++- services/loopback/common/locale/es.json | 3 +- .../common/methods/sale/moveToNewTicket.js | 21 +++++++++----- .../loopback/common/methods/ticket/new.js | 11 ++++++-- .../common/methods/ticket/specs/new.spec.js | 8 +++--- services/loopback/common/models/vn-model.js | 4 +-- services/order/common/methods/order/new.js | 7 +++-- 11 files changed, 72 insertions(+), 36 deletions(-) diff --git a/client/order/src/create/card.js b/client/order/src/create/card.js index ba605ae731..6a477f59ee 100644 --- a/client/order/src/create/card.js +++ b/client/order/src/create/card.js @@ -75,8 +75,6 @@ class Controller { this.$http.post(`order/api/Orders/new`, params).then(res => { this.vnApp.showSuccess(this.translate.instant('Data saved!')); this.$state.go("order.card.catalog", {id: res.data}); - }).catch(e => { - this.vnApp.showError(this.translate.instant(e.data.error.message)); }); } } diff --git a/client/ticket/src/sale/index.js b/client/ticket/src/sale/index.js index 71c17158d9..fd4a7b7053 100644 --- a/client/ticket/src/sale/index.js +++ b/client/ticket/src/sale/index.js @@ -189,7 +189,7 @@ class Controller { let sales = this.getCheckedLines(); this.$http.post(`/api/Sales/MoveToNewTicket`, {ticket: ticket, sales: sales}).then(res => { - let url = this.$state.href("ticket.card.sale", {id: res.data}, {absolute: true}); + let url = this.$state.href("ticket.card.sale", {id: res.data.id}, {absolute: true}); window.open(url, '_blank'); this.$scope.transfer.hide(); this.$scope.model.refresh(); diff --git a/services/claim/common/methods/claim-beginning/importToNewRefundTicket.js b/services/claim/common/methods/claim-beginning/importToNewRefundTicket.js index 16efadb8d4..f2c691a6e4 100644 --- a/services/claim/common/methods/claim-beginning/importToNewRefundTicket.js +++ b/services/claim/common/methods/claim-beginning/importToNewRefundTicket.js @@ -19,12 +19,12 @@ module.exports = Self => { } }); - async function addSalesToTicket(salesToRefund, newRefundTicket, transaction) { + async function addSalesToTicket(salesToRefund, ticketFk, transaction) { let formatedSales = []; salesToRefund.forEach(sale => { let formatedSale = { itemFk: sale.sale().itemFk, - ticketFk: newRefundTicket, + ticketFk: ticketFk, concept: sale.sale().concept, quantity: -Math.abs(sale.quantity), price: sale.sale().price, @@ -113,14 +113,30 @@ module.exports = Self => { try { let newRefundTicket = await models.Ticket.new(params, {transaction: transaction}); - let observation = {description: `Reclama ticket: ${claim.ticketFk}`, ticketFk: newRefundTicket, observationTypeFk: obsevationType.id}; + + let observation = { + description: `Reclama ticket: ${claim.ticketFk}`, + ticketFk: newRefundTicket.id, + observationTypeFk: obsevationType.id + }; await saveObservation(observation, {transaction: transaction}); - await models.TicketTracking.create({ticketFk: newRefundTicket, stateFk: state.id, workerFk: worker.id}, {transaction: transaction}); + + await models.TicketTracking.create({ + ticketFk: newRefundTicket.id, + stateFk: state.id, + workerFk: worker.id + }, {transaction: transaction}); + let salesToRefund = await models.ClaimBeginning.find(salesFilter); - let createdSales = await addSalesToTicket(salesToRefund, newRefundTicket, {transaction: transaction}); + let createdSales = await addSalesToTicket(salesToRefund, newRefundTicket.id, {transaction: transaction}); insertIntoClaimEnd(createdSales, id, worker.id, {transaction: transaction}); - await Self.rawSql('CALL vn.ticketCalculateClon(?, ?)', [newRefundTicket, claim.ticketFk], {transaction: transaction}); + + await Self.rawSql('CALL vn.ticketCalculateClon(?, ?)', [ + newRefundTicket.id, claim.ticketFk + ], {transaction: transaction}); + await transaction.commit(); + return newRefundTicket; } catch (e) { await transaction.rollback(); diff --git a/services/claim/common/methods/claim-beginning/importToNewRefundTicket.spec.js b/services/claim/common/methods/claim-beginning/importToNewRefundTicket.spec.js index e5ae10bf9a..542f5c0e98 100644 --- a/services/claim/common/methods/claim-beginning/importToNewRefundTicket.spec.js +++ b/services/claim/common/methods/claim-beginning/importToNewRefundTicket.spec.js @@ -1,16 +1,16 @@ const app = require(`${servicesDir}/claim/server/server`); describe('claimBeginning', () => { - let ticketId; + let ticket; let refundTicketObservations; let refundTicketSales; let salesInsertedInClaimEnd; afterAll(async() => { let promises = []; - promises.push(app.models.Ticket.destroyById(ticketId)); + promises.push(app.models.Ticket.destroyById(ticket.id)); - promises.push(app.models.Ticket.rawSql(`DELETE FROM vn.orderTicket WHERE ticketFk ='${ticketId}';`)); + promises.push(app.models.Ticket.rawSql(`DELETE FROM vn.orderTicket WHERE ticketFk ='${ticket.id}';`)); await Promise.all(promises); }); @@ -19,11 +19,13 @@ describe('claimBeginning', () => { it('should create a new ticket with negative sales, save an observation, update the state and insert the negative sales into claimEnd', async() => { let ctxOfSalesAssistant = {req: {accessToken: {userId: 21}}}; let claimId = 1; - ticketId = await app.models.ClaimBeginning.importToNewRefundTicket(ctxOfSalesAssistant, claimId); - await app.models.Ticket.findById(ticketId); - refundTicketSales = await app.models.Sale.find({where: {ticketFk: ticketId}}); - refundTicketObservations = await app.models.TicketObservation.find({where: {ticketFk: ticketId}}); - let refundTicketState = await app.models.TicketState.findById(ticketId); + ticket = await app.models.ClaimBeginning.importToNewRefundTicket(ctxOfSalesAssistant, claimId); + + await app.models.Ticket.findById(ticket.id); + + refundTicketSales = await app.models.Sale.find({where: {ticketFk: ticket.id}}); + refundTicketObservations = await app.models.TicketObservation.find({where: {ticketFk: ticket.id}}); + let refundTicketState = await app.models.TicketState.findById(ticket.id); salesInsertedInClaimEnd = await app.models.ClaimEnd.find({where: {claimFk: claimId}}); expect(refundTicketSales.length).toEqual(2); diff --git a/services/claim/common/methods/claim/regularizeClaim.js b/services/claim/common/methods/claim/regularizeClaim.js index 4aedcb45c4..59d8635a5a 100644 --- a/services/claim/common/methods/claim/regularizeClaim.js +++ b/services/claim/common/methods/claim/regularizeClaim.js @@ -133,7 +133,7 @@ module.exports = Self => { } async function createTicket(params, transaction) { - return await Self.app.models.Ticket.new({ + let ticket = await Self.app.models.Ticket.new({ shipped: new Date(), landed: new Date(), clientFk: params.clientFk, @@ -142,6 +142,8 @@ module.exports = Self => { addressFk: params.addressFk, userId: params.userId }, {transaction: transaction}); + + return ticket.id; } async function sendMessage(ctx, params, transaction) { diff --git a/services/loopback/common/locale/es.json b/services/loopback/common/locale/es.json index 1309790efc..bf4bedd4ff 100644 --- a/services/loopback/common/locale/es.json +++ b/services/loopback/common/locale/es.json @@ -52,5 +52,6 @@ "Warehouse cannot be blank": "El almacén no puede quedar en blanco", "Agency cannot be blank": "La agencia no puede quedar en blanco", "You don't have enough privileges to do that": "No tienes permisos para para hacer esto", - "This address doesn't exist": "This address doesn't exist" + "This address doesn't exist": "Este consignatario no existe", + "The sales of this ticket can't be modified": "Los movimientos de este tiquet no pueden ser modificadas" } \ No newline at end of file diff --git a/services/loopback/common/methods/sale/moveToNewTicket.js b/services/loopback/common/methods/sale/moveToNewTicket.js index f692273029..a3cc4c0577 100644 --- a/services/loopback/common/methods/sale/moveToNewTicket.js +++ b/services/loopback/common/methods/sale/moveToNewTicket.js @@ -51,14 +51,21 @@ module.exports = Self => { userId: userId }; - let newTicket = await model.Ticket.new(newTicketParams); + let transaction = await Self.beginTransaction({}); + try { + let newTicket = await model.Ticket.new(newTicketParams, {transaction: transaction}); - let promises = []; - for (let i = 0; i < params.sales.length; i++) { - promises.push(model.Sale.update({id: params.sales[i].id}, {ticketFk: newTicket})); + await model.Sale.updateAll( + {ticketFk: params.ticket.oldTicketFk}, + {ticketFk: newTicket.id}, + {transaction: transaction}); + + await transaction.commit(); + + return newTicket; + } catch (e) { + await transaction.rollback(); + throw e; } - await Promise.all(promises); - - return newTicket; }; }; diff --git a/services/loopback/common/methods/ticket/new.js b/services/loopback/common/methods/ticket/new.js index 890a81b0b1..274224bc6d 100644 --- a/services/loopback/common/methods/ticket/new.js +++ b/services/loopback/common/methods/ticket/new.js @@ -22,7 +22,12 @@ module.exports = Self => { }); Self.new = async(params, transaction) => { - let existsAddress = await Self.app.models.Address.findOne({where: {id: params.addressFk, clientFk: params.clientFk}}); + let existsAddress = await Self.app.models.Address.findOne({ + where: { + id: params.addressFk, + clientFk: params.clientFk} + }); + if (!existsAddress) throw new UserError(`This address doesn't exist`); @@ -40,6 +45,8 @@ module.exports = Self => { params.userId ], transaction); - return result[1][0].newTicketId; + return await Self.findOne({ + where: {id: result[1][0].newTicketId} + }, transaction); }; }; diff --git a/services/loopback/common/methods/ticket/specs/new.spec.js b/services/loopback/common/methods/ticket/specs/new.spec.js index be4c03eb66..cae4fa4cb0 100644 --- a/services/loopback/common/methods/ticket/specs/new.spec.js +++ b/services/loopback/common/methods/ticket/specs/new.spec.js @@ -1,11 +1,11 @@ const app = require(`${servicesDir}/ticket/server/server`); describe('ticket new()', () => { - let ticketId; + let ticket; let today = new Date(); afterAll(async() => { - await app.models.Ticket.destroyById(ticketId); + await app.models.Ticket.destroyById(ticket.id); }); it('should throw an error if the address doesnt exist', async() => { @@ -33,10 +33,10 @@ describe('ticket new()', () => { landed: today }; - ticketId = await app.models.Ticket.new(params); + ticket = await app.models.Ticket.new(params); let newestTicketIdInFixtures = 21; - expect(ticketId).toBeGreaterThan(newestTicketIdInFixtures); + expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures); }); }); diff --git a/services/loopback/common/models/vn-model.js b/services/loopback/common/models/vn-model.js index 2b42d0668b..bccb23a345 100644 --- a/services/loopback/common/models/vn-model.js +++ b/services/loopback/common/models/vn-model.js @@ -187,8 +187,8 @@ module.exports = function(Self) { }); }; - Self.rawStmt = function(stmt) { - return this.rawSql(stmt.sql, stmt.params); + Self.rawStmt = function(stmt, options = {}) { + return this.rawSql(stmt.sql, stmt.params, options); }; Self.escapeName = function(name) { diff --git a/services/order/common/methods/order/new.js b/services/order/common/methods/order/new.js index e951b3033f..f2caf2347e 100644 --- a/services/order/common/methods/order/new.js +++ b/services/order/common/methods/order/new.js @@ -20,8 +20,11 @@ module.exports = Self => { }); Self.new = async params => { - let clientFkByAddress = await Self.app.models.Address.findOne({where: {id: params.addressFk}, fields: 'clientFk'}); - let clientFk = clientFkByAddress.clientFk; + let address = await Self.app.models.Address.findOne({ + where: {id: params.addressFk}, + fields: 'clientFk' + }); + let clientFk = address.clientFk; let client = await Self.app.models.Client.findOne({ where: {id: clientFk}, From d391d86f020f5624e9c0322e931c847251197071 Mon Sep 17 00:00:00 2001 From: Bernat Date: Wed, 10 Oct 2018 11:17:55 +0200 Subject: [PATCH 2/2] update fixtures table orderRow and rowcomponent, fix test --- .../1.2-CHECK/04-ticketCalculateClon.sql | 3 +- services/db/install/dump/fixtures.sql | 88 +++++++++++++++++-- .../methods/order/specs/getTaxes.spec.js | 2 +- .../order/specs/getTotalVolume.spec.js | 2 +- .../methods/order/specs/getVolumes.spec.js | 2 +- 5 files changed, 83 insertions(+), 14 deletions(-) diff --git a/services/db/install/changes/1.2-CHECK/04-ticketCalculateClon.sql b/services/db/install/changes/1.2-CHECK/04-ticketCalculateClon.sql index 6987b126b6..5db48eb69f 100644 --- a/services/db/install/changes/1.2-CHECK/04-ticketCalculateClon.sql +++ b/services/db/install/changes/1.2-CHECK/04-ticketCalculateClon.sql @@ -5,7 +5,6 @@ DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculateClon`(IN vTicketNew INT, vTicketOld INT) BEGIN - /* * @vTicketNew id del nuevo ticket clonado * @vTicketOld id ticket original, a partir del qual se clonara el nuevo @@ -41,7 +40,7 @@ BEGIN SELECT vWarehouse warehouseFk,NULL available,s.itemFk, bu.buyFk FROM sale s LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk - WHERE s.ticketFk = vTicketNew GROUP BY s.itemFk; + WHERE s.ticketFk = vTicketOld GROUP BY s.itemFk; CALL ticketComponentCalculate(vAddress,vAgencyMode); diff --git a/services/db/install/dump/fixtures.sql b/services/db/install/dump/fixtures.sql index 7f9009a040..34252ab3d6 100644 --- a/services/db/install/dump/fixtures.sql +++ b/services/db/install/dump/fixtures.sql @@ -529,12 +529,12 @@ INSERT INTO `vn`.`ticketPackaging`(`id`, `ticketFk`, `packagingFk`, `quantity`, INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created`) VALUES - ( 1, 1, 1 , 'Gem of Time', 5, 9.10, 0, 0, 0, CURDATE()), - ( 2, 2, 1 , 'Gem of Mind', 10, 1.07, 0, 0, 0, CURDATE()), - ( 3, 1, 1 , 'Gem of Time', 2, 9.10, 0, 0, 0, CURDATE()), - ( 4, 4, 1 , 'Mark I' , 20, 3.06, 0, 0, 0, CURDATE()), - ( 5, 1, 2 , 'Gem of Time', 10, 9.10, 0, 0, 0, CURDATE()), - ( 6, 1, 3 , 'Gem of Time', 15, 6.50, 0, 0, 0, CURDATE()), + ( 1, 1, 1 , 'Gem of Time', 5, 9.10, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY)), + ( 2, 2, 1 , 'Gem of Mind', 10, 1.07, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY)), + ( 3, 1, 1 , 'Gem of Time', 2, 9.10, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY)), + ( 4, 4, 1 , 'Mark I' , 20, 3.06, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY)), + ( 5, 1, 2 , 'Gem of Time', 10, 9.10, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -10 DAY)), + ( 6, 1, 3 , 'Gem of Time', 15, 6.50, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -5 DAY)), ( 7, 2, 11, 'Gem of Mind', 15, 1.30, 0, 0, 0, CURDATE()), ( 8, 4, 11, 'Mark I' , 10, 3.26, 0, 0, 0, CURDATE()), ( 9, 1, 16, 'Gem of Time', 5, 9.10, 0, 0, 0, CURDATE()), @@ -837,9 +837,79 @@ INSERT INTO `hedera`.`order`(`id`, `date_send`, `customer_id`, `delivery_method_ INSERT INTO `hedera`.`orderRow`(`id`, `orderFk`, `itemFk`, `warehouseFk`, `shipment`, `amount`, `price`, `rate`, `created`, `saleFk`) VALUES - ( 1, 1, 1, 1 , NULL , 9, 1.5 , 1, CURDATE(), 1), - ( 2, 2, 2, 1 , NULL , 5, 1.23, 2, CURDATE(), 2), - ( 3, 3, 3, 2 , CURDATE(), 3, 0.50, 3, CURDATE(), 3); + ( 1, 1, 1, 1, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 5, 9.10, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 1), + ( 2, 1, 2, 1, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 10, 1.07, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 2), + ( 3, 1, 1, 1, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 2, 9.10, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 3), + ( 4, 1, 4, 1, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 20, 3.06, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY), 4), + ( 5, 2, 1, 1, DATE_ADD(CURDATE(), INTERVAL -10 DAY), 10, 9.10, 0, DATE_ADD(CURDATE(), INTERVAL -10 DAY), 5), + ( 6, 3, 1, 2, DATE_ADD(CURDATE(), INTERVAL -5 DAY), 15, 6.50, 0, DATE_ADD(CURDATE(), INTERVAL -5 DAY), 6), + ( 7, 11, 2, 1, CURDATE(), 15, 1.30, 0, CURDATE(), 7), + ( 8, 11, 4, 1, CURDATE(), 10, 3.26, 0, CURDATE(), 8), + ( 9, 16, 1, 1, CURDATE(), 5, 9.10, 0, CURDATE(), 9), + ( 10, 16, 2, 1, CURDATE(), 10, 1.07, 0, CURDATE(), 10), + ( 11, 16, 1, 1, CURDATE(), 2, 9.10, 0, CURDATE(), 11), + ( 12, 16, 4, 1, CURDATE(), 20, 3.06, 0, CURDATE(), 12); + +INSERT INTO `hedera`.`orderRowComponent`(`rowFk`, `componentFk`, `price`) + VALUES + ( 1, 15, 0.58), + ( 1, 23, 6.5), + ( 1, 28, 20.72), + ( 1, 29, -18.72), + ( 1, 39, 0.02), + ( 2, 15, 0.058), + ( 2, 21, 0.002), + ( 2, 28, 5.6), + ( 2, 29, -4.6), + ( 2, 39, 0.01), + ( 3, 15, 0.58), + ( 3, 23, 6.5), + ( 3, 28, 20.72), + ( 3, 29, -18.72), + ( 3, 39, 0.02), + ( 4, 15, 0.051), + ( 4, 21, -0.001), + ( 4, 28, 20.72), + ( 4, 29, -19.72), + ( 4, 37, 2), + ( 4, 39, 0.01), + ( 5, 15, 0.58), + ( 5, 23, 6.5), + ( 5, 28, 20.72), + ( 5, 29, -18.72), + ( 5, 39, 0.02), + ( 6, 23, 6.5), + ( 7, 15, 0.29), + ( 7, 28, 5.6), + ( 7, 29, -4.6), + ( 7, 39, 0.01), + ( 8, 15, 0.254), + ( 8, 21, -0.004), + ( 8, 28, 20.72), + ( 8, 29, -19.72), + ( 8, 37, 2), + ( 8, 39, 0.01), + ( 9, 15, 0.58), + ( 9, 23, 6.5), + ( 9, 28, 20.72), + ( 9, 29, -18.72), + ( 9, 39, 0.02), + ( 10, 15, 0.058), + ( 10, 21, 0.002), + ( 10, 28, 5.6), + ( 10, 29, -4.6), + ( 10, 39, 0.01), + ( 11, 15, 0.58), + ( 11, 23, 6.5), + ( 11, 28, 20.72), + ( 11, 29, -18.72), + ( 11, 39, 0.02), + ( 12, 15, 0.051), + ( 12, 22, -0.001), + ( 12, 28, 20.72), + ( 12, 29, -19.72), + ( 12, 37, 2), + ( 12, 39, 0.01); INSERT INTO `vn`.`clientContact`(`id`, `clientFk`, `name`, `phone`) VALUES diff --git a/services/order/common/methods/order/specs/getTaxes.spec.js b/services/order/common/methods/order/specs/getTaxes.spec.js index 4d8b30c276..d9ca33ae51 100644 --- a/services/order/common/methods/order/specs/getTaxes.spec.js +++ b/services/order/common/methods/order/specs/getTaxes.spec.js @@ -16,6 +16,6 @@ describe('order getTaxes()', () => { it('should call the getTaxes method and return the taxes if its called with a known id', async() => { let result = await app.models.Order.getTaxes(1); - expect(result.tax).toEqual(0.95); + expect(result.tax).toEqual(9.49); }); }); diff --git a/services/order/common/methods/order/specs/getTotalVolume.spec.js b/services/order/common/methods/order/specs/getTotalVolume.spec.js index d974d99b3c..3e41224bbf 100644 --- a/services/order/common/methods/order/specs/getTotalVolume.spec.js +++ b/services/order/common/methods/order/specs/getTotalVolume.spec.js @@ -4,7 +4,7 @@ describe('order getTotalVolume()', () => { it('should return the total', async() => { let result = await app.models.Order.getTotalVolume(1); - expect(result.totalVolume).toEqual(0.072); + expect(result.totalVolume).toEqual(0.078); expect(result.totalBoxes).toBeFalsy(); }); }); diff --git a/services/order/common/methods/order/specs/getVolumes.spec.js b/services/order/common/methods/order/specs/getVolumes.spec.js index 6d5d4423e2..496be808dc 100644 --- a/services/order/common/methods/order/specs/getVolumes.spec.js +++ b/services/order/common/methods/order/specs/getVolumes.spec.js @@ -4,6 +4,6 @@ describe('order getVolumes()', () => { it('should return the volumes of a given order id', async() => { let [result] = await app.models.Order.getVolumes(1); - expect(result.volume).toEqual(0.072); + expect(result.volume).toEqual(0.04); }); });