From 7042d96aca40035bc97e293fd183160968ebe2bb Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 22 May 2024 08:39:24 +0200 Subject: [PATCH] feat: refs #5926 pdaPDF report --- .../11062-tealArborvitae/00-firstScript.sql | 2 + .../worker/back/methods/worker/signPdaPdf.js | 35 +++ modules/worker/back/models/worker.js | 1 + print/core/report.js | 2 +- .../reports/sign-pda/assets/css/style.css | 50 +--- .../templates/reports/sign-pda/locale/de.yml | 14 + .../templates/reports/sign-pda/locale/en.yml | 64 +---- .../templates/reports/sign-pda/locale/es.yml | 12 + .../templates/reports/sign-pda/locale/fr.yml | 65 +---- .../templates/reports/sign-pda/locale/pt.yml | 65 +---- .../templates/reports/sign-pda/sign-pda.html | 266 +++--------------- print/templates/reports/sign-pda/sign-pda.js | 91 +----- .../templates/reports/sign-pda/sql/device.sql | 1 + 13 files changed, 159 insertions(+), 509 deletions(-) create mode 100644 modules/worker/back/methods/worker/signPdaPdf.js create mode 100644 print/templates/reports/sign-pda/locale/de.yml create mode 100644 print/templates/reports/sign-pda/sql/device.sql diff --git a/db/versions/11062-tealArborvitae/00-firstScript.sql b/db/versions/11062-tealArborvitae/00-firstScript.sql index c262cf323..f619e8906 100644 --- a/db/versions/11062-tealArborvitae/00-firstScript.sql +++ b/db/versions/11062-tealArborvitae/00-firstScript.sql @@ -7,3 +7,5 @@ ALTER TABLE vn.docuware ADD CONSTRAINT docuware_module_FK FOREIGN KEY (modelFk) -- Auto-generated SQL script #202405201951 INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) VALUES ('Worker','isPDASigned','READ','ALLOW','ROLE','hr'); +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES ('Worker','signPdaPdf','READ','ALLOW','ROLE','hr'); diff --git a/modules/worker/back/methods/worker/signPdaPdf.js b/modules/worker/back/methods/worker/signPdaPdf.js new file mode 100644 index 000000000..e0f075af4 --- /dev/null +++ b/modules/worker/back/methods/worker/signPdaPdf.js @@ -0,0 +1,35 @@ + +module.exports = Self => { + Self.remoteMethodCtx('signPdaPdf', { + description: 'Print pdf to sign PDA', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'The pda id', + http: {source: 'path'} + }], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/sign-pda-pdf', + verb: 'GET' + }, + accessScopes: ['DEFAULT', 'read:multimedia'] + }); + + Self.signPdaPdf = (ctx, id) => Self.printReport(ctx, id, 'sign-pda'); +}; diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js index 6f9c1e239..4e8b22f20 100644 --- a/modules/worker/back/models/worker.js +++ b/modules/worker/back/models/worker.js @@ -19,6 +19,7 @@ module.exports = Self => { require('../methods/worker/deallocatePDA')(Self); require('../methods/worker/allocatePDA')(Self); require('../methods/worker/signedPDA')(Self); + require('../methods/worker/signPdaPdf')(Self); require('../methods/worker/search')(Self); require('../methods/worker/isAuthorized')(Self); require('../methods/worker/setPassword')(Self); diff --git a/print/core/report.js b/print/core/report.js index fbef20a67..23cffac2c 100644 --- a/print/core/report.js +++ b/print/core/report.js @@ -52,7 +52,7 @@ class Report extends Component { options.headerTemplate = '\n'; options.footerTemplate = footer; - const buffer = await page.content(); + const buffer = await page.pdf(options); resolve(buffer); } catch (err) { reject(err); diff --git a/print/templates/reports/sign-pda/assets/css/style.css b/print/templates/reports/sign-pda/assets/css/style.css index 3e1c64d85..4be772dc7 100644 --- a/print/templates/reports/sign-pda/assets/css/style.css +++ b/print/templates/reports/sign-pda/assets/css/style.css @@ -1,13 +1,3 @@ -#signature { - padding-right: 10px -} - -#signature img { - -webkit-filter: brightness(0%); - filter: brightness(0%); - margin-bottom: 10px; - max-width: 150px -} .description strong { text-transform: uppercase; @@ -18,32 +8,18 @@ h2 { color: #555 } -.ticket-info { - font-size: 22px -} - -#phytosanitary { - padding-right: 10px -} - -#phytosanitary .flag img { - width: 100% -} - -#phytosanitary .flag .flag-text { - padding-left: 10px; - box-sizing: border-box; -} - -.phytosanitary-info { - margin-top: 10px -} - -.observations { - text-align: justify; - text-justify: inter-word; -} - .column-oriented { margin-bottom: 5px; -} \ No newline at end of file +} + +.report-info { + font-size: 20px +} +.row-oriented > tbody > tr > th { + padding-left: 30px; + width: 20% +} + +.grid-block { + font-size: 1.2em +} diff --git a/print/templates/reports/sign-pda/locale/de.yml b/print/templates/reports/sign-pda/locale/de.yml new file mode 100644 index 000000000..d43479cc3 --- /dev/null +++ b/print/templates/reports/sign-pda/locale/de.yml @@ -0,0 +1,14 @@ +reportName: pda +signNote: Recepción PDA +date: Fecha +deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material +pdaModel: PDA Modelo +pdaSerie: Serie PDA +sim: sim vodafone +pin: pin +puk: puk +label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa. +label2: Me comprometo a conservar el terminal con su batería, tarjeta SIM, funda y protector de pantalla, y en caso de finalizar mi relación de servicios con la empresa, realizar la devolución en el plazo máximo de 24 horas. +label3: Si el terminal fuese robado, perdido o dañado, me comprometo a abonar el importe íntegro del terminal o su reparación en el centro oficial , así como la funda y el protector de pantalla. +label4: La instalación de App no autorizadas por la empresa, puedan provocar o no un daño al terminal o a la empresa por vulneración de datos, virus, etc, no está autorizado, bajo ningún concepto, el uso de accesorios no originales. +label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal. diff --git a/print/templates/reports/sign-pda/locale/en.yml b/print/templates/reports/sign-pda/locale/en.yml index a1392e15e..d43479cc3 100644 --- a/print/templates/reports/sign-pda/locale/en.yml +++ b/print/templates/reports/sign-pda/locale/en.yml @@ -1,50 +1,14 @@ -reportName: sign-pda -deliveryNote: Sign PDA -proforma: Proforma -withoutPrices: Sign PDA -clientId: Client -deliveryAddress: Delivery address -fiscalData: Fiscal data -saleLines: Line items -date: Date -reference: Ref. -quantity: Qty. -concept: Concept -price: PSP/u -discount: Disc. -vat: VAT -amount: Amount -total: Total -subtotal: Subtotal -vatType: VAT Type -digitalSignature: Digital signature -plantPassport: Plant passport -packages: Packages -services: - title: Services - theader: - quantity: Qty. - concept: Concept - price: PSP/u - vat: VAT - amount: Amount - tfoot: - subtotal: Subtotal - warning: Deposit packaging will be invoiced if they have not been returned after 30 days of their delivery. -packagings: - title: Buckets and packaging - theader: - reference: Reference - quantity: Quantity - concept: Concept -taxes: - title: Tax breakdown - theader: - type: Type - taxBase: Tax base - tax: Tax - fee: Fee - tfoot: - subtotal: Subtotal - total: Total -observations: Observations +reportName: pda +signNote: Recepción PDA +date: Fecha +deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material +pdaModel: PDA Modelo +pdaSerie: Serie PDA +sim: sim vodafone +pin: pin +puk: puk +label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa. +label2: Me comprometo a conservar el terminal con su batería, tarjeta SIM, funda y protector de pantalla, y en caso de finalizar mi relación de servicios con la empresa, realizar la devolución en el plazo máximo de 24 horas. +label3: Si el terminal fuese robado, perdido o dañado, me comprometo a abonar el importe íntegro del terminal o su reparación en el centro oficial , así como la funda y el protector de pantalla. +label4: La instalación de App no autorizadas por la empresa, puedan provocar o no un daño al terminal o a la empresa por vulneración de datos, virus, etc, no está autorizado, bajo ningún concepto, el uso de accesorios no originales. +label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal. diff --git a/print/templates/reports/sign-pda/locale/es.yml b/print/templates/reports/sign-pda/locale/es.yml index 7f5b656c9..d43479cc3 100644 --- a/print/templates/reports/sign-pda/locale/es.yml +++ b/print/templates/reports/sign-pda/locale/es.yml @@ -1,2 +1,14 @@ reportName: pda signNote: Recepción PDA +date: Fecha +deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material +pdaModel: PDA Modelo +pdaSerie: Serie PDA +sim: sim vodafone +pin: pin +puk: puk +label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa. +label2: Me comprometo a conservar el terminal con su batería, tarjeta SIM, funda y protector de pantalla, y en caso de finalizar mi relación de servicios con la empresa, realizar la devolución en el plazo máximo de 24 horas. +label3: Si el terminal fuese robado, perdido o dañado, me comprometo a abonar el importe íntegro del terminal o su reparación en el centro oficial , así como la funda y el protector de pantalla. +label4: La instalación de App no autorizadas por la empresa, puedan provocar o no un daño al terminal o a la empresa por vulneración de datos, virus, etc, no está autorizado, bajo ningún concepto, el uso de accesorios no originales. +label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal. diff --git a/print/templates/reports/sign-pda/locale/fr.yml b/print/templates/reports/sign-pda/locale/fr.yml index 603623a47..d43479cc3 100644 --- a/print/templates/reports/sign-pda/locale/fr.yml +++ b/print/templates/reports/sign-pda/locale/fr.yml @@ -1,51 +1,14 @@ -reportName: bon-de-livraison -deliveryNote: Bon de livraison -proforma: Proforma -withoutPrices: Bon de livraison -clientId: Client -deliveryAddress: Adresse de livraison -fiscalData: Coordonnées -saleLines: Lignes de la commande -date: Date -reference: Ref. -quantity: Quant. -concept: Concept -price: PRIX/u -discount: Remise -vat: TVA -amount: Montant -total: Total -subtotal: Total partiel -vatType: Type de TVA -digitalSignature: Signature numérique -ticket: BL {0} -plantPassport: Passeport phytosanitaire -packages: Paquets -services: - title: Service - theader: - quantity: Quantité - concept: Concept - price: PRIX/u - vat: TVA - amount: Montant - tfoot: - subtotal: Total partiel - warning: Les emballages de consigne seront facturés s'ils n'ont pas été retournés après 30 jours de leur livraison. -packagings: - title: Bacs et emballages - theader: - reference: Référence - quantity: Quantité - concept: Concept -taxes: - title: Répartition taxes - theader: - type: Type - taxBase: Base imposable - tax: Taxe - fee: Quote - tfoot: - subtotal: Total partiel - total: Total -observations: Observations \ No newline at end of file +reportName: pda +signNote: Recepción PDA +date: Fecha +deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material +pdaModel: PDA Modelo +pdaSerie: Serie PDA +sim: sim vodafone +pin: pin +puk: puk +label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa. +label2: Me comprometo a conservar el terminal con su batería, tarjeta SIM, funda y protector de pantalla, y en caso de finalizar mi relación de servicios con la empresa, realizar la devolución en el plazo máximo de 24 horas. +label3: Si el terminal fuese robado, perdido o dañado, me comprometo a abonar el importe íntegro del terminal o su reparación en el centro oficial , así como la funda y el protector de pantalla. +label4: La instalación de App no autorizadas por la empresa, puedan provocar o no un daño al terminal o a la empresa por vulneración de datos, virus, etc, no está autorizado, bajo ningún concepto, el uso de accesorios no originales. +label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal. diff --git a/print/templates/reports/sign-pda/locale/pt.yml b/print/templates/reports/sign-pda/locale/pt.yml index fb49d230b..d43479cc3 100644 --- a/print/templates/reports/sign-pda/locale/pt.yml +++ b/print/templates/reports/sign-pda/locale/pt.yml @@ -1,51 +1,14 @@ -reportName: nota-de-entrega -deliveryNote: Nota de Entrega -proforma: Proforma -withoutPrices: Nota de Entrega -clientId: Cliente -deliveryAddress: Morada de Entrega -fiscalData: Dados Fiscais -saleLines: Linhas da encomenda -date: Data -reference: Ref. -quantity: Qtde. -concept: Conceito -price: PVP/u -discount: Dto. -vat: IVA -amount: Importe -total: Total -subtotal: Sub-total -vatType: Tipo de IVA -digitalSignature: Assinatura digital -ticket: Nota de Entrega {0} -plantPassport: Passaporte vegetal -packages: Pacotes -services: - title: Serviços - theader: - quantity: Quantidade - concept: Conceito - price: PVP/u - vat: IVA - amount: Quantia - tfoot: - subtotal: Subtotal - warning: As embalagens em depósito serão facturadas e cobradas se não são devolvidas 30 dias após a entrega. -packagings: - title: Baldes e Embalagens - theader: - reference: Referência - quantity: Quantidade - concept: Conceito -taxes: - title: Repartição de impostos - theader: - type: Cara - taxBase: Tributável - tax: Taxa - fee: Compartilhado - tfoot: - subtotal: Subtotal - total: Total -observations: Observações \ No newline at end of file +reportName: pda +signNote: Recepción PDA +date: Fecha +deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material +pdaModel: PDA Modelo +pdaSerie: Serie PDA +sim: sim vodafone +pin: pin +puk: puk +label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa. +label2: Me comprometo a conservar el terminal con su batería, tarjeta SIM, funda y protector de pantalla, y en caso de finalizar mi relación de servicios con la empresa, realizar la devolución en el plazo máximo de 24 horas. +label3: Si el terminal fuese robado, perdido o dañado, me comprometo a abonar el importe íntegro del terminal o su reparación en el centro oficial , así como la funda y el protector de pantalla. +label4: La instalación de App no autorizadas por la empresa, puedan provocar o no un daño al terminal o a la empresa por vulneración de datos, virus, etc, no está autorizado, bajo ningún concepto, el uso de accesorios no originales. +label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal. diff --git a/print/templates/reports/sign-pda/sign-pda.html b/print/templates/reports/sign-pda/sign-pda.html index 92dd1b126..1ec7c4964 100644 --- a/print/templates/reports/sign-pda/sign-pda.html +++ b/print/templates/reports/sign-pda/sign-pda.html @@ -1,252 +1,56 @@
-
-
-

{{$t(deliverNoteType)}}

- - - - - - - - - - - - - - - - - - - -
{{$t('clientId')}}{{client.id}}
{{$t(deliverNoteType)}}{{ticket.id}}
{{$t('date')}}{{formatDate(ticket.shipped, '%d-%m-%Y')}}
{{$t('packages')}}{{ticket.packages}}
-
-
-
-
-
{{$t('deliveryAddress')}}
-
-

{{address.nickname}}

-
{{address.street}}
-
{{address.postalCode}}, {{address.city}} ({{address.province}})
-
-
- -
-
{{$t('fiscalData')}}
-
-
{{client.socialName}}
-
{{client.street}}
-
{{client.fi}}
-
-
-
-
- -

{{$t('saleLines')}}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{$t('reference')}}{{$t('quantity')}}{{$t('concept')}}{{$t('price')}}{{$t('discount')}}{{$t('vat')}}{{$t('amount')}}
{{sale.itemFk}}{{sale.quantity}}{{sale.concept}}{{sale.price | currency('EUR', $i18n.locale)}}{{(sale.discount / 100) | percentage}}{{sale.vatType}} - {{sale.price * sale.quantity * (1 - sale.discount / 100) | currency('EUR', $i18n.locale)}} -
- {{sale.tag5}} {{sale.value5}} - {{sale.tag6}} {{sale.value6}} - {{sale.tag7}} {{sale.value7}} -
- {{$t('subtotal')}} - {{getSubTotal() | currency('EUR', $i18n.locale)}}
- -
-
-

{{$t('services.title')}}

- - - - - - - - - - - - +
+ {{$t('date')}}:{{formatDate(new Date(), '%d-%m-%Y')}} +

+ {{$t('deviceRecieved')}}: +

+
{{$t('services.theader.quantity')}}{{$t('services.theader.concept')}}{{$t('services.theader.price')}}{{$t('services.theader.vat')}}{{$t('services.theader.amount')}}
- - - - - - - - - - - - - + + - -
{{service.quantity}}{{service.description}}{{service.price | currency('EUR', $i18n.locale)}}{{service.taxDescription}}{{service.total | currency('EUR', $i18n.locale)}}
- {{$t('services.tfoot.subtotal')}} - {{serviceTotal | currency('EUR', $i18n.locale)}}{{$t('pdaModel')}}{{device.modelFk}}
- * {{ $t('services.warning') }} -
-
-
-
-

{{$t('packagings.title')}}

- - - - - + + - - - - - - + + + + + + + + +
{{$t('packagings.theader.reference')}}{{$t('packagings.theader.quantity')}}{{$t('packagings.theader.concept')}}{{$t('pdaSerie')}}{{device.serialNumber}}
{{packaging.itemFk}}{{packaging.quantity}}{{packaging.name}}
{{$t('sim')}}{{device.sim}}
{{$t('pin')}}{{device.pin}}{{$t('puk')}}{{device.puk}}
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{$t('taxes.title')}}
{{$t('taxes.theader.type')}}{{$t('taxes.theader.taxBase')}}{{$t('taxes.theader.tax')}}{{$t('taxes.theader.fee')}}
{{tax.name}}{{tax.Base | currency('EUR', $i18n.locale)}}{{tax.vatPercent | percentage}}{{tax.tax | currency('EUR', $i18n.locale)}}
{{$t('subtotal')}}{{getTotalBase() | currency('EUR', $i18n.locale)}}{{getTotalTax()| currency('EUR', $i18n.locale)}}
{{$t('total')}}{{getTotal() | currency('EUR', $i18n.locale)}}
-
-
-
-
-
-
-
- -
-
{{$t('plantPassport')}}
-
-
-
-
- A - {{getBotanical()}} -
-
- B - ES17462130 -
-
- C - {{ticket.id}} -
-
- D - ES -
-
-
-
-
-
-
-
-
-
{{$t('digitalSignature')}}
-
- -
{{formatDate(signature.created, '%d-%m-%Y')}}
-
-
-
-
-
-
-

{{$t('observations')}}

-

{{ticket.description}}

+

{{$t('label1')}} +

+

+ {{$t('label2')}} +

+

+ {{$t('label3')}} +

+ +

{{$t('label4')}} +

+

{{$t('label5')}} +

-
\ No newline at end of file + diff --git a/print/templates/reports/sign-pda/sign-pda.js b/print/templates/reports/sign-pda/sign-pda.js index 50d5720ad..844982ad0 100755 --- a/print/templates/reports/sign-pda/sign-pda.js +++ b/print/templates/reports/sign-pda/sign-pda.js @@ -1,100 +1,15 @@ -const config = require(`vn-print/core/config`); const vnReport = require('../../../core/mixins/vn-report.js'); -const md5 = require('md5'); -const fs = require('fs-extra'); module.exports = { - name: 'delivery-note', + name: 'sign-pda', mixins: [vnReport], async serverPrefetch() { - this.ticket = await this.findOneFromDef('ticket', [this.id]); - this.checkMainEntity(this.ticket); - this.client = await this.findOneFromDef('client', [this.id]); - this.sales = await this.rawSqlFromDef('sales', [this.id]); - this.address = await this.findOneFromDef(`address`, [this.id]); - this.services = await this.rawSqlFromDef('services', [this.id]); - this.taxes = await this.findOneFromDef('taxes', [this.id]); - this.packagings = await this.rawSqlFromDef('packagings', [this.id]); - this.signature = await this.findOneFromDef('signature', [this.id]); - }, - data() { - return {totalBalance: 0.00}; + this.device = await this.findOneFromDef('device', [this.id]); }, + data() {}, computed: { - dmsPath() { - if (!this.signature) return; - - const hash = md5(this.signature.id.toString()).substring(0, 3); - const file = `${config.storage.root}/${hash}/${this.signature.id}.png`; - - if (!fs.existsSync(file)) return null; - - const src = fs.readFileSync(file); - const base64 = Buffer.from(src, 'utf8').toString('base64'); - - return `data:image/png;base64, ${base64}`; - }, - deliverNoteType() { - return this.type ? this.type : 'deliveryNote'; - }, - serviceTotal() { - let total = 0.00; - this.services.forEach(service => { - total += parseFloat(service.price) * service.quantity; - }); - - return total; - }, - showPrices() { - return this.deliverNoteType != 'withoutPrices'; - }, - footerType() { - const translatedType = this.$t(this.deliverNoteType); - return `${translatedType} ${this.id}`; - }, - hasObservations() { - return this.ticket.description !== null; - } }, methods: { - getSubTotal() { - let subTotal = 0.00; - this.sales.forEach(sale => { - subTotal += sale.quantity * sale.price * (1 - sale.discount / 100); - }); - - return subTotal; - }, - getTotalBase() { - let totalBase = 0.00; - this.taxes.forEach(tax => { - totalBase += parseFloat(tax.Base); - }); - - return totalBase; - }, - getTotalTax() { - let totalTax = 0.00; - this.taxes.forEach(tax => { - totalTax += parseFloat(tax.tax); - }); - - return totalTax; - }, - getTotal() { - return this.getTotalBase() + this.getTotalTax(); - }, - getBotanical() { - let phytosanitary = []; - this.sales.forEach(sale => { - if (sale.botanical) - phytosanitary.push(sale.botanical); - }); - - return phytosanitary.filter((item, index) => - phytosanitary.indexOf(item) == index - ).join(', '); - } }, props: { id: { diff --git a/print/templates/reports/sign-pda/sql/device.sql b/print/templates/reports/sign-pda/sql/device.sql new file mode 100644 index 000000000..621c9c1fc --- /dev/null +++ b/print/templates/reports/sign-pda/sql/device.sql @@ -0,0 +1 @@ +SELECT * FROM vn.deviceProduction WHERE id = 3