diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 4480759f4..0bf363a0c 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -9,6 +9,7 @@ export default { invoiceOutButton: '.modules-menu > li[ui-sref="invoiceOut.index"]', claimsButton: '.modules-menu > li[ui-sref="claim.index"]', returnToModuleIndexButton: 'a[ui-sref="order.index"]', + homeButton: 'vn-topbar > div.side.start > a', userMenuButton: '#user', userLocalWarehouse: '.user-popover vn-autocomplete[ng-model="$ctrl.localWarehouseFk"]', userLocalBank: '.user-popover vn-autocomplete[ng-model="$ctrl.localBankFk"]', @@ -630,6 +631,16 @@ export default { createButton: 'button[type=submit]', cancelButton: 'vn-button[href="#!/client/index"]' }, + orderSummary: { + header: 'vn-order-summary h5', + id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span', + alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span', + consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(3) span', + subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)', + vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)', + total: 'vn-order-summary vn-one.taxes > p:nth-child(3)', + sale: 'vn-order-summary vn-tbody > vn-tr', + }, orderCatalog: { plantRealmButton: 'vn-order-catalog > vn-side-menu vn-icon[icon="icon-plant"]', type: 'vn-autocomplete[data="$ctrl.itemTypes"]', @@ -700,6 +711,17 @@ export default { firstTicketDeleteButton: 'vn-route-tickets vn-tr:nth-child(1) vn-icon[icon="delete"]', confirmButton: '.vn-confirm.shown button[response="accept"]' }, + workerSummary: { + header: 'vn-worker-summary h5', + id: 'vn-worker-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) > section > span', + email: 'vn-worker-summary vn-one:nth-child(1) > vn-label-value:nth-child(3) > section > span', + department: 'vn-worker-summary vn-one:nth-child(1) > vn-label-value:nth-child(4) > section > span', + userId: 'vn-worker-summary vn-one:nth-child(2) > vn-label-value:nth-child(2) > section > span', + userName: 'vn-worker-summary vn-one:nth-child(2) > vn-label-value:nth-child(3) > section > span', + role: 'vn-worker-summary vn-one:nth-child(2) > vn-label-value:nth-child(4) > section > span', + extension: 'vn-worker-summary vn-one:nth-child(2) > vn-label-value:nth-child(5) > section > span', + + }, workerBasicData: { name: 'vn-worker-basic-data vn-textfield[ng-model="$ctrl.worker.firstName"]', surname: 'vn-worker-basic-data vn-textfield[ng-model="$ctrl.worker.lastName"]', @@ -783,6 +805,21 @@ export default { ticketOne: 'vn-invoice-out-summary > vn-card > vn-horizontal > vn-auto > vn-table > div > vn-tbody > vn-tr:nth-child(1)', ticketTwo: 'vn-invoice-out-summary > vn-card > vn-horizontal > vn-auto > vn-table > div > vn-tbody > vn-tr:nth-child(2)' }, + travelBasicDada: { + reference: 'vn-travel-basic-data vn-textfield[ng-model="$ctrl.travel.ref"]', + agency: 'vn-travel-basic-data vn-autocomplete[ng-model="$ctrl.travel.agencyModeFk"]', + shippingDate: 'vn-travel-basic-data vn-date-picker[ng-model="$ctrl.travel.shipped"]', + deliveryDate: 'vn-travel-basic-data vn-date-picker[ng-model="$ctrl.travel.landed"]', + outputWarehouse: 'vn-travel-basic-data vn-autocomplete[ng-model="$ctrl.travel.warehouseOutFk"]', + inputWarehouse: 'vn-travel-basic-data vn-autocomplete[ng-model="$ctrl.travel.warehouseInFk"]', + delivered: 'vn-travel-basic-data vn-check[ng-model="$ctrl.travel.isDelivered"]', + received: 'vn-travel-basic-data vn-check[ng-model="$ctrl.travel.isReceived"]', + save: 'vn-travel-basic-data vn-submit[label="Save"]', + undoChanges: 'vn-travel-basic-data vn-button[label="Undo changes"]' + }, + travelLog: { + firstLogFirstTD: 'vn-travel-log vn-tbody > vn-tr > vn-td:nth-child(1) > div' + }, travelThermograph: { add: 'vn-travel-thermograph-index vn-float-button[icon="add"]', thermographID: 'vn-travel-thermograph-create vn-autocomplete[ng-model="$ctrl.dms.thermographId"]', @@ -806,5 +843,10 @@ export default { header: 'vn-entry-summary > vn-card > h5', reference: 'vn-entry-summary vn-label-value[label="Reference"]', confirmed: 'vn-entry-summary vn-check[label="Confirmed"]', + }, + entryDescriptor: { + agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(3) span', + travelsQuicklink: 'vn-entry-descriptor vn-quick-links > a:nth-child(1)', + entriesQuicklink: 'vn-entry-descriptor vn-quick-links > a:nth-child(2)' } }; diff --git a/e2e/paths/02-client/08_add_notes.spec.js b/e2e/paths/02-client/08_add_notes.spec.js index 8f1a9244d..b759cbd07 100644 --- a/e2e/paths/02-client/08_add_notes.spec.js +++ b/e2e/paths/02-client/08_add_notes.spec.js @@ -16,6 +16,12 @@ describe('Client Add notes path', () => { await browser.close(); }); + it(`should reach the notes index`, async() => { + let url = await page.expectURL('/note'); + + expect(url).toBe(true); + }); + it(`should click on the add note button`, async() => { await page.waitToClick(selectors.clientNotes.addNoteFloatButton); let url = await page.expectURL('/note/create'); diff --git a/e2e/paths/03-worker/01_summary.spec.js b/e2e/paths/03-worker/01_summary.spec.js new file mode 100644 index 000000000..86a95eee3 --- /dev/null +++ b/e2e/paths/03-worker/01_summary.spec.js @@ -0,0 +1,71 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Worker summary path', () => { + let browser; + let page; + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('employee', 'worker'); + await page.accessToSearchResult('agencyNick'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should reach the employee summary section', async() => { + const url = await page.expectURL('#!/worker/3/summary'); + + expect(url).toBe(true); + }); + + it('should check the summary contains the name and userName on the header', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.header, 'innerText'); + + expect(result).toEqual('agency agency'); + }); + + it('should check the summary contains the basic data id', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.id, 'innerText'); + + expect(result).toEqual('3'); + }); + + it('should check the summary contains the basic data email', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.email, 'innerText'); + + expect(result).toEqual('agency@verdnatura.es'); + }); + + it('should check the summary contains the basic data department', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.department, 'innerText'); + + expect(result).toEqual('CAMARA'); + }); + + it('should check the summary contains the user data id', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.userId, 'innerText'); + + expect(result).toEqual('3'); + }); + + it('should check the summary contains the user data name', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.userName, 'innerText'); + + expect(result).toEqual('agency'); + }); + + it('should check the summary contains the user data role', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.role, 'innerText'); + + expect(result).toEqual('agency'); + }); + + it('should check the summary contains the user data extension', async() => { + const result = await page.waitToGetProperty(selectors.workerSummary.extension, 'innerText'); + + expect(result).toEqual('1101'); + }); +}); diff --git a/e2e/paths/03-worker/01_basicData.spec.js b/e2e/paths/03-worker/02_basicData.spec.js similarity index 100% rename from e2e/paths/03-worker/01_basicData.spec.js rename to e2e/paths/03-worker/02_basicData.spec.js diff --git a/e2e/paths/03-worker/02_time_control.spec.js b/e2e/paths/03-worker/04_time_control.spec.js similarity index 100% rename from e2e/paths/03-worker/02_time_control.spec.js rename to e2e/paths/03-worker/04_time_control.spec.js diff --git a/e2e/paths/07-order/01_summary.spec.js b/e2e/paths/07-order/01_summary.spec.js new file mode 100644 index 000000000..cba56bf70 --- /dev/null +++ b/e2e/paths/07-order/01_summary.spec.js @@ -0,0 +1,65 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Order summary path', () => { + let browser; + let page; + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('employee', 'order'); + await page.accessToSearchResult('16'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should reach the order summary section', async() => { + const url = await page.expectURL('#!/order/16/summary'); + + expect(url).toBe(true); + }); + + it('should check the summary contains the order id', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.id, 'innerText'); + + expect(result).toEqual('16'); + }); + + it('should check the summary contains the order alias', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.alias, 'innerText'); + + expect(result).toEqual('address 26'); + }); + + it('should check the summary contains the order consignee', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.consignee, 'innerText'); + + expect(result).toEqual('Many places - Silla (Province one)'); + }); + + it('should check the summary contains the order subtotal', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.subtotal, 'innerText'); + + expect(result.length).toBeGreaterThan(1); + }); + + it('should check the summary contains the order vat', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.vat, 'innerText'); + + expect(result.length).toBeGreaterThan(1); + }); + + it('should check the summary contains the order total', async() => { + const result = await page.waitToGetProperty(selectors.orderSummary.total, 'innerText'); + + expect(result.length).toBeGreaterThan(1); + }); + + it('should check the summary contains the order sales', async() => { + const result = await page.countElement(selectors.orderSummary.sale); + + expect(result).toBeGreaterThan(0); + }); +}); diff --git a/e2e/paths/07-order/01_edit_basic_data.spec.js b/e2e/paths/07-order/02_basic_data.spec.js similarity index 100% rename from e2e/paths/07-order/01_edit_basic_data.spec.js rename to e2e/paths/07-order/02_basic_data.spec.js diff --git a/e2e/paths/07-order/02_catalog.spec.js b/e2e/paths/07-order/04_catalog.spec.js similarity index 100% rename from e2e/paths/07-order/02_catalog.spec.js rename to e2e/paths/07-order/04_catalog.spec.js diff --git a/e2e/paths/10-travel/02_basic_data_and_log.spec.js b/e2e/paths/10-travel/02_basic_data_and_log.spec.js new file mode 100644 index 000000000..a835df2a2 --- /dev/null +++ b/e2e/paths/10-travel/02_basic_data_and_log.spec.js @@ -0,0 +1,102 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Travel basic data path', () => { + let browser; + let page; + + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('buyer', 'travel'); + await page.accessToSearchResult('3'); + await page.accessToSection('travel.card.basicData'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should reach the thermograph section', async() => { + const result = await page.expectURL('/basic-data'); + + expect(result).toBe(true); + }); + + it('should set a wrong delivery date then receive an error on submit', async() => { + await page.datePicker(selectors.travelBasicDada.deliveryDate, -1, null); + await page.waitToClick(selectors.travelBasicDada.save); + const result = await page.waitForLastSnackbar(); + + expect(result).toEqual('Landing cannot be lesser than shipment'); + }); + + it('should undo the changes', async() => { + await page.waitToClick(selectors.travelBasicDada.undoChanges); + await page.waitToClick(selectors.travelBasicDada.save); + const result = await page.waitForLastSnackbar(); + + expect(result).toEqual('No changes to save'); + }); + + it('should now edit the whole form then save', async() => { + await page.clearInput(selectors.travelBasicDada.reference); + await page.write(selectors.travelBasicDada.reference, 'new reference!'); + await page.waitFor(2000); + await page.autocompleteSearch(selectors.travelBasicDada.agency, 'Entanglement'); + await page.autocompleteSearch(selectors.travelBasicDada.outputWarehouse, 'Warehouse Three'); + await page.autocompleteSearch(selectors.travelBasicDada.inputWarehouse, 'Warehouse Four'); + await page.waitToClick(selectors.travelBasicDada.delivered); + await page.waitToClick(selectors.travelBasicDada.received); + await page.waitToClick(selectors.travelBasicDada.save); + const result = await page.waitForLastSnackbar(); + + expect(result).toEqual('Data saved!'); + }); + + it('should reload the section and check the reference was saved', async() => { + await page.reloadSection('travel.card.basicData'); + const result = await page.waitToGetProperty(selectors.travelBasicDada.reference, 'value'); + + expect(result).toEqual('new reference!'); + }); + + it('should check the agency was saved', async() => { + const result = await page.waitToGetProperty(selectors.travelBasicDada.agency, 'value'); + + expect(result).toEqual('Entanglement'); + }); + + it('should check the output warehouse date was saved', async() => { + const result = await page.waitToGetProperty(selectors.travelBasicDada.outputWarehouse, 'value'); + + expect(result).toEqual('Warehouse Three'); + }); + + it('should check the input warehouse date was saved', async() => { + const result = await page.waitToGetProperty(selectors.travelBasicDada.inputWarehouse, 'value'); + + expect(result).toEqual('Warehouse Four'); + }); + + it(`should check the delivered checkbox was saved even tho it doesn't make sense`, async() => { + await page.waitForClassPresent(selectors.travelBasicDada.delivered, 'checked'); + }); + + it(`should check the received checkbox was saved even tho it doesn't make sense`, async() => { + await page.waitForClassPresent(selectors.travelBasicDada.received, 'checked'); + }); + + it('should navigate to the travel logs', async() => { + await page.accessToSection('travel.card.log'); + const result = await page.expectURL('/log'); + + expect(result).toBe(true); + }); + + it('should check the 1st log contains details from the changes made', async() => { + const result = await page.waitToGetProperty(selectors.travelLog.firstLogFirstTD, 'innerText'); + + expect(result).toContain('new reference!'); + }); +}); diff --git a/e2e/paths/12-entry/02_descriptor.spec.js b/e2e/paths/12-entry/02_descriptor.spec.js new file mode 100644 index 000000000..8fa0d2a4f --- /dev/null +++ b/e2e/paths/12-entry/02_descriptor.spec.js @@ -0,0 +1,61 @@ +import selectors from '../../helpers/selectors.js'; +import getBrowser from '../../helpers/puppeteer'; + +describe('Entry descriptor path', () => { + let browser; + let page; + + beforeAll(async() => { + browser = await getBrowser(); + page = browser.page; + await page.loginAndModule('buyer', 'entry'); + await page.accessToSearchResult('2'); + }); + + afterAll(async() => { + await browser.close(); + }); + + it('should reach the second entry summary section', async() => { + let url = await page.expectURL('#!/entry/2/summary'); + + expect(url).toBe(true); + }); + + it('should show some entry information', async() => { + const result = await page.waitToGetProperty(selectors.entryDescriptor.agency, 'innerText'); + + expect(result).toContain('inhouse pickup'); + }); + + it('should click the travels button to be redirected to the travels index filtered by the current agency', async() => { + await page.waitToClick(selectors.entryDescriptor.travelsQuicklink); + const url = await page.expectURL('/travel/index'); + const filter = await page.expectURL('agencyFk'); + + expect(url).toBe(true); + expect(filter).toBe(true); + }); + + it('should go back to the entry summary', async() => { + await page.waitToClick(selectors.globalItems.homeButton); + await page.selectModule('entry'); + await page.accessToSearchResult('2'); + let url = await page.expectURL('#!/entry/2/summary'); + + expect(url).toBe(true); + }); + + it('should click the entries button to be redirected to the entries index filtered by the current supplier', async() => { + await page.waitToClick(selectors.entryDescriptor.entriesQuicklink); + const url = await page.expectURL('/entry/index'); + const supplierFilter = await page.expectURL('supplierFk'); + const toFilter = await page.expectURL('to'); + const fromFilter = await page.expectURL('from'); + + expect(url).toBe(true); + expect(supplierFilter).toBe(true); + expect(toFilter).toBe(true); + expect(fromFilter).toBe(true); + }); +}); diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index fa3067c17..aff26c63e 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -67,6 +67,10 @@ module.exports = Self => { arg: 'problems', type: 'Boolean', description: `Whether to show only tickets with problems` + }, { + arg: 'pending', + type: 'Boolean', + description: `Whether to show only tickets with state 'Pending'` }, { arg: 'mine', type: 'Boolean', @@ -130,7 +134,7 @@ module.exports = Self => { dateTo.setHours(23, 59, 0, 0); } - let where = buildFilter(ctx.args, (param, value) => { + const where = buildFilter(ctx.args, (param, value) => { switch (param) { case 'search': return /^\d+$/.test(value) @@ -155,6 +159,17 @@ module.exports = Self => { return {'c.salesPersonFk': {inq: teamIds}}; case 'alertLevel': return {'ts.alertLevel': value}; + case 'pending': + if (value) { + return {and: [ + {'st.alertLevel': 0}, + {'st.code': {neq: 'OK'}} + ]}; + } else { + return {and: [ + {'st.alertLevel': {gt: 0}} + ]}; + } case 'id': case 'clientFk': case 'agencyModeFk': @@ -244,7 +259,6 @@ module.exports = Self => { LEFT JOIN tmp.ticketProblems tp ON tp.ticketFk = f.id LEFT JOIN tmp.ticketTotal tt ON tt.ticketFk = f.id`); - let condition; let hasProblem; let range; diff --git a/modules/ticket/back/methods/ticket/specs/filter.spec.js b/modules/ticket/back/methods/ticket/specs/filter.spec.js index 656f99d65..faaeb82c0 100644 --- a/modules/ticket/back/methods/ticket/specs/filter.spec.js +++ b/modules/ticket/back/methods/ticket/specs/filter.spec.js @@ -41,6 +41,34 @@ describe('ticket filter()', () => { const firstRow = result[0]; expect(result.length).toEqual(1); - expect(firstRow.ticketFk).toEqual(11); + expect(firstRow.id).toEqual(11); + }); + + it('should return the tickets with grouped state "Pending" and not "Ok"', async() => { + const ctx = {req: {accessToken: {userId: 9}}, args: {pending: true}}; + const filter = {}; + const result = await app.models.Ticket.filter(ctx, filter); + const firstRow = result[0]; + const secondRow = result[1]; + const thirdRow = result[2]; + + expect(result.length).toEqual(3); + expect(firstRow.state).toEqual('Arreglar'); + expect(secondRow.state).toEqual('Arreglar'); + expect(thirdRow.state).toEqual('Arreglar'); + }); + + it('should return the tickets that are not pending', async() => { + const ctx = {req: {accessToken: {userId: 9}}, args: {pending: false}}; + const filter = {}; + const result = await app.models.Ticket.filter(ctx, filter); + const firstRow = result[0]; + const secondRow = result[1]; + const thirdRow = result[2]; + + expect(result.length).toEqual(13); + expect(firstRow.state).toEqual('Entregado'); + expect(secondRow.state).toEqual('Entregado'); + expect(thirdRow.state).toEqual('Entregado'); }); }); diff --git a/modules/ticket/front/search-panel/index.html b/modules/ticket/front/search-panel/index.html index ae5e152c6..e2d831994 100644 --- a/modules/ticket/front/search-panel/index.html +++ b/modules/ticket/front/search-panel/index.html @@ -113,10 +113,16 @@ + + diff --git a/modules/ticket/front/search-panel/locale/es.yml b/modules/ticket/front/search-panel/locale/es.yml index 0fcfdaa58..2f303ff2d 100644 --- a/modules/ticket/front/search-panel/locale/es.yml +++ b/modules/ticket/front/search-panel/locale/es.yml @@ -10,4 +10,6 @@ Province: Provincia My team: Mi equipo Order id: Id pedido Grouped States: Estado agrupado -Days onward: Días adelante \ No newline at end of file +Days onward: Días adelante +With problems: Con problemas +Pending: Pendientes \ No newline at end of file diff --git a/print/common/css/layout.css b/print/common/css/layout.css index 6be065a14..b85589a81 100644 --- a/print/common/css/layout.css +++ b/print/common/css/layout.css @@ -157,6 +157,22 @@ table { border-spacing: 0; } +/** + * Prevent page break fix + */ +tbody { + page-break-inside: avoid; + break-inside: avoid; + display: block; + width: 100% +} + +thead, tbody tr { + table-layout: fixed; + display: table; + width: 100%; +} + .row-oriented, .column-oriented { text-align: left; width: 100% @@ -181,6 +197,10 @@ table { background-color: #e5e5e5 } +.column-oriented tbody { + border-bottom: 1px solid #DDD; +} + .column-oriented tfoot { border-top: 2px solid #808080; } @@ -190,7 +210,6 @@ table { } .column-oriented .description { - border-bottom: 1px solid #DDD; font-size: 0.8em } diff --git a/print/common/css/misc.css b/print/common/css/misc.css index 093d5a974..09d7706b3 100644 --- a/print/common/css/misc.css +++ b/print/common/css/misc.css @@ -42,6 +42,7 @@ font-weight: bold } -.non-page-break { +.no-page-break { page-break-inside: avoid; + break-inside: avoid } \ No newline at end of file diff --git a/print/templates/reports/campaign-metrics/campaign-metrics.html b/print/templates/reports/campaign-metrics/campaign-metrics.html index 7a0f30948..ee1908164 100644 --- a/print/templates/reports/campaign-metrics/campaign-metrics.html +++ b/print/templates/reports/campaign-metrics/campaign-metrics.html @@ -59,37 +59,35 @@ {{$t('Code')}} {{$t('Quantity')}} - {{$t('Concept')}} + {{$t('Concept')}} - - + + + {{sale.itemFk}} + {{Math.trunc(sale.subtotal)}} + {{sale.concept}} + + + +
+ {{sale.tag5}} + {{sale.value5}} +
+ + +
+ {{sale.tag6}} + {{sale.value6}} +
+ + +
+ {{sale.tag7}} + {{sale.value7}} +
+ + diff --git a/print/templates/reports/claim-pickup-order/claim-pickup-order.html b/print/templates/reports/claim-pickup-order/claim-pickup-order.html index 9c6b0fa4e..c5e2d05f3 100644 --- a/print/templates/reports/claim-pickup-order/claim-pickup-order.html +++ b/print/templates/reports/claim-pickup-order/claim-pickup-order.html @@ -64,8 +64,8 @@ {{$t('concept')}} - - + + {{sale.id}} {{sale.quantity}} {{sale.claimQuantity}} diff --git a/print/templates/reports/delivery-note/delivery-note.html b/print/templates/reports/delivery-note/delivery-note.html index 77f214c07..719397c08 100644 --- a/print/templates/reports/delivery-note/delivery-note.html +++ b/print/templates/reports/delivery-note/delivery-note.html @@ -76,53 +76,48 @@ {{$t('reference')}} {{$t('quantity')}} - {{$t('concept')}} + {{$t('concept')}} {{$t('price')}} {{$t('discount')}} {{$t('vat')}} {{$t('amount')}} - - - - + + + {{sale.itemFk}} + {{sale.quantity}} + {{sale.concept}} + {{sale.price | currency('EUR', locale)}} + {{(sale.discount / 100) | percentage}} + {{sale.vatType}} + {{sale.price * sale.quantity * (1 - sale.discount / 100) | currency('EUR', locale)}} + + + +
+ {{sale.tag5}} + {{sale.value5}} +
+ + +
+ {{sale.tag6}} + {{sale.value6}} +
+ + +
+ {{sale.tag7}} + {{sale.value7}} +
+ + + + + {{sale.ediBotanic}} {{sale.denomination}} {{sale.countryCode}}-{{sale.passportNumber}} + ZP + @@ -138,7 +133,7 @@
-
+

{{$t('services')}}

@@ -168,29 +163,35 @@ -
+

{{$t('taxBreakdown')}}

- - + + - - + + - - + + @@ -204,7 +205,7 @@ -
+

{{$t('packagings')}}

{{$t('type')}}{{$t('taxBase')}}{{$t('type')}} + {{$t('taxBase')}} + {{$t('tax')}} {{$t('fee')}}
{{tax.name}}{{tax.Base | currency('EUR', locale)}}{{tax.name}} + {{tax.Base | currency('EUR', locale)}} + {{tax.vatPercent | percentage}} {{tax.tax | currency('EUR', locale)}}
{{$t('subtotal')}}{{getTotalBase() | currency('EUR', locale)}}{{$t('subtotal')}} + {{getTotalBase() | currency('EUR', locale)}} + {{getTotalTax()| currency('EUR', locale)}}
@@ -226,7 +227,7 @@ -
+
{{$t('digitalSignature')}}
diff --git a/print/templates/reports/driver-route/driver-route.html b/print/templates/reports/driver-route/driver-route.html index 6d3b840df..ba9a339da 100644 --- a/print/templates/reports/driver-route/driver-route.html +++ b/print/templates/reports/driver-route/driver-route.html @@ -84,14 +84,14 @@
-
+
- + @@ -100,7 +100,7 @@ - + - +
{{$t('order')}} {{$t('ticket')}}{{$t('client')}}{{$t('client')}} {{$t('address')}} {{$t('packages')}}
{{ticket.priority}} {{ticket.id}}{{ticket.clientFk}} {{ticket.addressName}}{{ticket.clientFk}} {{ticket.addressName}} {{ticket.addressFk.toString().substr(0, ticket.addressFk.toString().length - 3)}} @@ -141,7 +141,7 @@
{{$t('import')}}{{ticket.import}}{{ticket.import | currency('EUR', locale)}}
diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index cbb0de0d5..094936fd0 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -63,45 +63,43 @@ - + - + - - + + + + + + + + + + + + + + @@ -115,7 +113,7 @@
-
+

{{$t('notes')}}

diff --git a/print/templates/reports/letter-debtor/letter-debtor.html b/print/templates/reports/letter-debtor/letter-debtor.html index 93e59bba1..534798f5e 100644 --- a/print/templates/reports/letter-debtor/letter-debtor.html +++ b/print/templates/reports/letter-debtor/letter-debtor.html @@ -25,7 +25,7 @@
- + @@ -61,8 +61,8 @@ - - + + diff --git a/print/templates/reports/letter-debtor/locale/es.yml b/print/templates/reports/letter-debtor/locale/es.yml index 09a31ee5b..a9bd8c796 100644 --- a/print/templates/reports/letter-debtor/locale/es.yml +++ b/print/templates/reports/letter-debtor/locale/es.yml @@ -2,7 +2,7 @@ title: Extracto claimId: Reclamación clientId: Cliente clientData: Datos del cliente -dated: Fecha +date: Fecha concept: Concepto invoiced: Facturado payed: Pagado
{{$t('boxes')}}{{$t('boxes')}} {{$t('packing')}}{{$t('concept')}}{{$t('concept')}} {{$t('quantity')}} {{$t('price')}} {{$t('amount')}}
{{buy.box}}{{buy.packing}}{{buy.itemName}}{{buy.quantity}}{{buy.buyingValue | currency('EUR', locale)}}{{buy.buyingValue * buy.quantity | currency('EUR', locale)}}
+
+ {{buy.tag5}} + {{buy.value5}} +
+
+
+ {{buy.tag6}} + {{buy.value6}} +
+
+
+ {{buy.tag7}} + {{buy.value7}} +
+
{{client.id}}
{{$t('dated')}}{{$t('date')}} {{dated}}
{{$t('balance')}}
{{sale.issued | date('%d-%m-%Y')}} {{sale.ref}} {{sale.debtOut}}