diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 4a5448d34..e42c13c72 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -212,5 +212,6 @@ "You don't have enough privileges to set this credit amount": "No tienes suficientes privilegios para establecer esta cantidad de crédito", "You can't change the credit set to zero from a manager": "No puedes cambiar el cŕedito establecido a cero por un gerente", "The PDF document does not exists": "El documento PDF no existe. Prueba a regenerarlo desde la opción 'Regenerar PDF factura'", - "The type of business must be filled in basic data": "El tipo de negocio debe estar rellenado en datos básicos" + "The type of business must be filled in basic data": "El tipo de negocio debe estar rellenado en datos básicos", + "You can't create a claim from a ticket delivered more than seven days ago": "No puedes crear una reclamación de un ticket entregado hace más de siete días" } \ No newline at end of file diff --git a/modules/claim/back/methods/claim/createFromSales.js b/modules/claim/back/methods/claim/createFromSales.js index f22aabbf3..cdbce865b 100644 --- a/modules/claim/back/methods/claim/createFromSales.js +++ b/modules/claim/back/methods/claim/createFromSales.js @@ -57,8 +57,14 @@ module.exports = Self => { } }, myOptions); + const landedPlusWeek = new Date(ticket.landed); + landedPlusWeek.setDate(landedPlusWeek.getDate() + 7); + const isClaimable = landedPlusWeek >= new Date(); + if (ticket.isDeleted) throw new UserError(`You can't create a claim for a removed ticket`); + if (!isClaimable) + throw new UserError(`You can't create a claim from a ticket delivered more than seven days ago`); const newClaim = await Self.create({ ticketFk: ticketId, diff --git a/modules/claim/back/methods/claim/specs/createFromSales.spec.js b/modules/claim/back/methods/claim/specs/createFromSales.spec.js index 849ccf8f5..8a48b8613 100644 --- a/modules/claim/back/methods/claim/specs/createFromSales.spec.js +++ b/modules/claim/back/methods/claim/specs/createFromSales.spec.js @@ -1,31 +1,40 @@ -const app = require('vn-loopback/server/server'); +const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('Claim createFromSales()', () => { - const ticketId = 2; + const ticketId = 16; const newSale = [{ id: 3, instance: 0, quantity: 10 }]; - const ctx = { - req: { - accessToken: {userId: 1}, - headers: {origin: 'localhost:5000'}, - __: () => {} - } + const activeCtx = { + accessToken: {userId: 1}, + headers: {origin: 'localhost:5000'}, + __: () => {} }; + const ctx = { + req: activeCtx + }; + + beforeEach(() => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: activeCtx + }); + }); + it('should create a new claim', async() => { - const tx = await app.models.Claim.beginTransaction({}); + const tx = await models.Claim.beginTransaction({}); try { const options = {transaction: tx}; - const claim = await app.models.Claim.createFromSales(ctx, ticketId, newSale, options); + const claim = await models.Claim.createFromSales(ctx, ticketId, newSale, options); expect(claim.ticketFk).toEqual(ticketId); - let claimBeginning = await app.models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options); + let claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options); expect(claimBeginning.saleFk).toEqual(newSale[0].id); expect(claimBeginning.quantity).toEqual(newSale[0].quantity); @@ -37,17 +46,42 @@ describe('Claim createFromSales()', () => { } }); - it('should not be able to create a claim if exists that sale', async() => { - const tx = await app.models.Claim.beginTransaction({}); + it('should not be able to create a claim for a ticket delivered more than seven days ago', async() => { + const tx = await models.Claim.beginTransaction({}); let error; try { const options = {transaction: tx}; - await app.models.Claim.createFromSales(ctx, ticketId, newSale, options); + const todayMinusEightDays = new Date(); + todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8); - await app.models.Claim.createFromSales(ctx, ticketId, newSale, options); + const ticket = await models.Ticket.findById(ticketId, options); + await ticket.updateAttribute('landed', todayMinusEightDays, options); + + await models.Claim.createFromSales(ctx, ticketId, newSale, options); + + await tx.rollback(); + } catch (e) { + error = e; + await tx.rollback(); + } + + expect(error.toString()).toContain(`You can't create a claim from a ticket delivered more than seven days ago`); + }); + + it('should not be able to create a claim if exists that sale', async() => { + const tx = await models.Claim.beginTransaction({}); + + let error; + + try { + const options = {transaction: tx}; + + await models.Claim.createFromSales(ctx, ticketId, newSale, options); + + await models.Claim.createFromSales(ctx, ticketId, newSale, options); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/front/sale/index.html b/modules/ticket/front/sale/index.html index cbb95d901..0aa41226b 100644 --- a/modules/ticket/front/sale/index.html +++ b/modules/ticket/front/sale/index.html @@ -469,7 +469,8 @@ + ng-click="$ctrl.createClaim()" + ng-if="$ctrl.isClaimable"> Add claim = new Date(); + } + return false; + } + getSaleTotal(sale) { if (sale.quantity == null || sale.price == null) return null; diff --git a/modules/ticket/front/sale/index.spec.js b/modules/ticket/front/sale/index.spec.js index cee1fe5b4..d543c1b81 100644 --- a/modules/ticket/front/sale/index.spec.js +++ b/modules/ticket/front/sale/index.spec.js @@ -15,7 +15,8 @@ describe('Ticket', () => { const ticket = { id: 1, clientFk: 1101, - shipped: 1, + shipped: new Date(), + landed: new Date(), created: new Date(), client: {salesPersonFk: 1}, address: {mobile: 111111111} @@ -74,6 +75,25 @@ describe('Ticket', () => { }); }); + describe('isClaimable() getter', () => { + it('should return true for a ticket delivered less than seven days ago', () => { + const result = controller.isClaimable; + + expect(result).toEqual(true); + }); + + it('should return false for a ticket delivered more than seven days ago', () => { + const ticket = controller.ticket; + const landedMinusEightDays = new Date(ticket.landed); + landedMinusEightDays.setDate(landedMinusEightDays.getDate() - 8); + ticket.landed = landedMinusEightDays; + + const result = controller.isClaimable; + + expect(result).toEqual(false); + }); + }); + describe('getSaleTotal()', () => { it('should return the sale total amount', () => { const sale = {