From dbbd2c7947c7e81f3e828a382972166b892354ba Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 30 Sep 2024 08:04:01 +0200 Subject: [PATCH] feat(ClaimBeginning): throw error when quantity claimed is greater than quantity of line --- loopback/locale/en.json | 4 +- loopback/locale/es.json | 3 +- loopback/locale/fr.json | 4 +- loopback/locale/pt.json | 3 +- .../specs/claim-beginning.spec.js | 55 +++++++++++++++++++ modules/claim/back/models/claim-beginning.js | 17 ++++-- 6 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 modules/claim/back/methods/claim-beginning/specs/claim-beginning.spec.js diff --git a/loopback/locale/en.json b/loopback/locale/en.json index d9d9c8511..f0b7d6eca 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -236,6 +236,6 @@ "Cannot send mail": "Cannot send mail", "CONSTRAINT `chkParkingCodeFormat` failed for `vn`.`parking`": "CONSTRAINT `chkParkingCodeFormat` failed for `vn`.`parking`", "This postcode already exists": "This postcode already exists", - "Original invoice not found": "Original invoice not found" - + "Original invoice not found": "Original invoice not found", + "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index b9933f596..84722ea5d 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -372,5 +372,6 @@ "The entry not have stickers": "La entrada no tiene etiquetas", "Too many records": "Demasiados registros", "Original invoice not found": "Factura original no encontrada", - "The entry has no lines or does not exist": "La entrada no tiene lineas o no existe" + "The entry has no lines or does not exist": "La entrada no tiene lineas o no existe", + "The quantity claimed cannot be greater than the quantity of the line": "La cantidad reclamada no puede ser mayor que la cantidad de la línea" } diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 601fe35f5..a6648b186 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -361,6 +361,6 @@ "The invoices have been created but the PDFs could not be generated": "La facture a été émise mais le PDF n'a pas pu être généré", "It has been invoiced but the PDF of refund not be generated": "Il a été facturé mais le PDF de remboursement n'a pas été généré", "Cannot send mail": "Impossible d'envoyer le mail", - "Original invoice not found": "Facture originale introuvable" - + "Original invoice not found": "Facture originale introuvable", + "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne" } diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index a6a65710f..a43f0e780 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -361,5 +361,6 @@ "The invoices have been created but the PDFs could not be generated": "Foi faturado, mas o PDF não pôde ser gerado", "It has been invoiced but the PDF of refund not be generated": "Foi faturado mas não foi gerado o PDF do reembolso", "Original invoice not found": "Fatura original não encontrada", - "Cannot send mail": "Não é possível enviar o email" + "Cannot send mail": "Não é possível enviar o email", + "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha" } diff --git a/modules/claim/back/methods/claim-beginning/specs/claim-beginning.spec.js b/modules/claim/back/methods/claim-beginning/specs/claim-beginning.spec.js new file mode 100644 index 000000000..b7974ad23 --- /dev/null +++ b/modules/claim/back/methods/claim-beginning/specs/claim-beginning.spec.js @@ -0,0 +1,55 @@ +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); + +describe('ClaimBeginning model()', () => { + const claimFk = 1; + const activeCtx = { + accessToken: {userId: 18}, + headers: {origin: 'localhost:5000'}, + __: () => {} + }; + + beforeEach(() => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + + it('should change quantity claimed', async() => { + const tx = await models.ClaimBeginning.beginTransaction({}); + + let error; + try { + const options = {transaction: tx}; + const claim = await models.ClaimBeginning.findOne({where: {claimFk}}, options); + const sale = await models.Sale.findById(claim.saleFk, {}, options); + await claim.updateAttribute('quantity', sale.quantity - 1, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error).toBeUndefined(); + }); + + it('should throw error when quantity claimed is greater than quantity of the sale', async() => { + const tx = await models.ClaimBeginning.beginTransaction({}); + + let error; + try { + const options = {transaction: tx}; + const claim = await models.ClaimBeginning.findOne({where: {claimFk}}, options); + const sale = await models.Sale.findById(claim.saleFk, {}, options); + await claim.updateAttribute('quantity', sale.quantity + 1, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error.toString()).toContain('The quantity claimed cannot be greater than the quantity of the line'); + }); +}); diff --git a/modules/claim/back/models/claim-beginning.js b/modules/claim/back/models/claim-beginning.js index d269b2285..3dc9261c3 100644 --- a/modules/claim/back/models/claim-beginning.js +++ b/modules/claim/back/models/claim-beginning.js @@ -10,16 +10,21 @@ module.exports = Self => { }); Self.observe('before save', async ctx => { + const options = ctx.options; + const models = Self.app.models; + const saleFk = ctx?.currentInstance?.saleFk || ctx?.instance?.saleFk; + const sale = await models.Sale.findById(saleFk, {fields: ['ticketFk', 'quantity']}, options); + if (ctx.isNewInstance) { - const models = Self.app.models; - const options = ctx.options; - const instance = ctx.instance; - const ticket = await models.Sale.findById(instance.saleFk, {fields: ['ticketFk']}, options); - const claim = await models.Claim.findById(instance.claimFk, {fields: ['ticketFk']}, options); - if (ticket.ticketFk != claim.ticketFk) + const claim = await models.Claim.findById(ctx.instance.claimFk, {fields: ['ticketFk']}, options); + if (sale.ticketFk != claim.ticketFk) throw new UserError(`Cannot create a new claimBeginning from a different ticket`); } + await claimIsEditable(ctx); + + if (sale?.quantity && ctx.data?.quantity && ctx.data.quantity > sale?.quantity) + throw new UserError('The quantity claimed cannot be greater than the quantity of the line'); }); Self.observe('before delete', async ctx => { -- 2.40.1