diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index da8f65be2..a2add2e82 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -88,6 +88,11 @@ module.exports = Self => { type: 'boolean', description: `Whether to show only tickets with route` }, + { + arg: 'hasInvoice', + type: 'boolean', + description: `Whether to show only tickets with invoice` + }, { arg: 'pending', type: 'boolean', @@ -199,6 +204,10 @@ module.exports = Self => { if (value == true) return {'t.routeFk': {neq: null}}; return {'t.routeFk': null}; + case 'hasInvoice': + if (value == true) + return {'t.refFk': {neq: null}}; + return {'t.refFk': null}; case 'pending': return {'st.isNotValidated': value}; case 'id': diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js index 008068ff2..eb0fe85da 100644 --- a/modules/ticket/back/methods/ticket/specs/filter.spec.js +++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js @@ -39,7 +39,7 @@ describe('ticket filter()', () => { const filter = {}; const result = await models.Ticket.filter(ctx, filter, options); - expect(result.length).toEqual(6); + expect(result.length).toBeGreaterThan(3); await tx.rollback(); } catch (e) { @@ -278,4 +278,42 @@ describe('ticket filter()', () => { throw e; } }); + + it('should return the tickets with the invoice on false', async() => { + const tx = await models.Ticket.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const ctx = {req: {accessToken: {userId: 9}}, args: {hasInvoice: true}}; + const filter = {}; + const result = await models.Ticket.filter(ctx, filter, options); + + expect(result.length).toEqual(6); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should return the tickets with the invoice on null', async() => { + const tx = await models.Ticket.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const ctx = {req: {accessToken: {userId: 9}}, args: {hasInvoice: null}}; + const filter = {}; + const result = await models.Ticket.filter(ctx, filter, options); + + expect(result.length).toBeGreaterThanOrEqual(27); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); }); diff --git a/modules/ticket/front/search-panel/index.html b/modules/ticket/front/search-panel/index.html index b0d4963bd..7002f3dd6 100644 --- a/modules/ticket/front/search-panel/index.html +++ b/modules/ticket/front/search-panel/index.html @@ -141,6 +141,11 @@ ng-model="filter.hasRoute" triple-state="true"> + diff --git a/modules/ticket/front/search-panel/locale/es.yml b/modules/ticket/front/search-panel/locale/es.yml index 52cc04d6e..1d1c82d1a 100644 --- a/modules/ticket/front/search-panel/locale/es.yml +++ b/modules/ticket/front/search-panel/locale/es.yml @@ -13,6 +13,7 @@ Grouped States: Estado agrupado Days onward: Días adelante With problems: Con problemas Has route: Con ruta +Has invoice: Con factura Pending: Pendiente FREE: Libre DELIVERED: Servido