feat: refs #5926 pdaPDF report
This commit is contained in:
parent
a3a46d28be
commit
7042d96aca
|
@ -7,3 +7,5 @@ ALTER TABLE vn.docuware ADD CONSTRAINT docuware_module_FK FOREIGN KEY (modelFk)
|
||||||
-- Auto-generated SQL script #202405201951
|
-- Auto-generated SQL script #202405201951
|
||||||
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
|
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
|
||||||
VALUES ('Worker','isPDASigned','READ','ALLOW','ROLE','hr');
|
VALUES ('Worker','isPDASigned','READ','ALLOW','ROLE','hr');
|
||||||
|
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
|
||||||
|
VALUES ('Worker','signPdaPdf','READ','ALLOW','ROLE','hr');
|
||||||
|
|
|
@ -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');
|
||||||
|
};
|
|
@ -19,6 +19,7 @@ module.exports = Self => {
|
||||||
require('../methods/worker/deallocatePDA')(Self);
|
require('../methods/worker/deallocatePDA')(Self);
|
||||||
require('../methods/worker/allocatePDA')(Self);
|
require('../methods/worker/allocatePDA')(Self);
|
||||||
require('../methods/worker/signedPDA')(Self);
|
require('../methods/worker/signedPDA')(Self);
|
||||||
|
require('../methods/worker/signPdaPdf')(Self);
|
||||||
require('../methods/worker/search')(Self);
|
require('../methods/worker/search')(Self);
|
||||||
require('../methods/worker/isAuthorized')(Self);
|
require('../methods/worker/isAuthorized')(Self);
|
||||||
require('../methods/worker/setPassword')(Self);
|
require('../methods/worker/setPassword')(Self);
|
||||||
|
|
|
@ -52,7 +52,7 @@ class Report extends Component {
|
||||||
options.headerTemplate = '\n';
|
options.headerTemplate = '\n';
|
||||||
options.footerTemplate = footer;
|
options.footerTemplate = footer;
|
||||||
|
|
||||||
const buffer = await page.content();
|
const buffer = await page.pdf(options);
|
||||||
resolve(buffer);
|
resolve(buffer);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
|
|
|
@ -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 {
|
.description strong {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
|
@ -18,32 +8,18 @@ h2 {
|
||||||
color: #555
|
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 {
|
.column-oriented {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.report-info {
|
||||||
|
font-size: 20px
|
||||||
|
}
|
||||||
|
.row-oriented > tbody > tr > th {
|
||||||
|
padding-left: 30px;
|
||||||
|
width: 20%
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-block {
|
||||||
|
font-size: 1.2em
|
||||||
|
}
|
||||||
|
|
|
@ -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.
|
|
@ -1,50 +1,14 @@
|
||||||
reportName: sign-pda
|
reportName: pda
|
||||||
deliveryNote: Sign PDA
|
signNote: Recepción PDA
|
||||||
proforma: Proforma
|
date: Fecha
|
||||||
withoutPrices: Sign PDA
|
deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material
|
||||||
clientId: Client
|
pdaModel: PDA Modelo
|
||||||
deliveryAddress: Delivery address
|
pdaSerie: Serie PDA
|
||||||
fiscalData: Fiscal data
|
sim: sim vodafone
|
||||||
saleLines: Line items
|
pin: pin
|
||||||
date: Date
|
puk: puk
|
||||||
reference: Ref.
|
label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa.
|
||||||
quantity: Qty.
|
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.
|
||||||
concept: Concept
|
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.
|
||||||
price: PSP/u
|
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.
|
||||||
discount: Disc.
|
label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal.
|
||||||
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
|
|
||||||
|
|
|
@ -1,2 +1,14 @@
|
||||||
reportName: pda
|
reportName: pda
|
||||||
signNote: Recepción 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.
|
||||||
|
|
|
@ -1,51 +1,14 @@
|
||||||
reportName: bon-de-livraison
|
reportName: pda
|
||||||
deliveryNote: Bon de livraison
|
signNote: Recepción PDA
|
||||||
proforma: Proforma
|
date: Fecha
|
||||||
withoutPrices: Bon de livraison
|
deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material
|
||||||
clientId: Client
|
pdaModel: PDA Modelo
|
||||||
deliveryAddress: Adresse de livraison
|
pdaSerie: Serie PDA
|
||||||
fiscalData: Coordonnées
|
sim: sim vodafone
|
||||||
saleLines: Lignes de la commande
|
pin: pin
|
||||||
date: Date
|
puk: puk
|
||||||
reference: Ref.
|
label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa.
|
||||||
quantity: Quant.
|
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.
|
||||||
concept: Concept
|
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.
|
||||||
price: PRIX/u
|
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.
|
||||||
discount: Remise
|
label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal.
|
||||||
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
|
|
||||||
|
|
|
@ -1,51 +1,14 @@
|
||||||
reportName: nota-de-entrega
|
reportName: pda
|
||||||
deliveryNote: Nota de Entrega
|
signNote: Recepción PDA
|
||||||
proforma: Proforma
|
date: Fecha
|
||||||
withoutPrices: Nota de Entrega
|
deviceRecieved: He recibido de Verdnatura Levante SL, el siguiente material
|
||||||
clientId: Cliente
|
pdaModel: PDA Modelo
|
||||||
deliveryAddress: Morada de Entrega
|
pdaSerie: Serie PDA
|
||||||
fiscalData: Dados Fiscais
|
sim: sim vodafone
|
||||||
saleLines: Linhas da encomenda
|
pin: pin
|
||||||
date: Data
|
puk: puk
|
||||||
reference: Ref.
|
label1: El terminal es propiedad de Verdnatura Levante SL y debe ser utilizado exclusivamente para las funciones y aplicaciones determinadas por la empresa.
|
||||||
quantity: Qtde.
|
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.
|
||||||
concept: Conceito
|
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.
|
||||||
price: PVP/u
|
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.
|
||||||
discount: Dto.
|
label5: Mediante este contrato me comprometo a usar la funda, y protector de pantalla en todo momento para minimizar daños en el terminal.
|
||||||
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
|
|
||||||
|
|
|
@ -1,252 +1,56 @@
|
||||||
<report-body v-bind="$props">
|
<report-body v-bind="$props">
|
||||||
<template v-slot:header>
|
<template v-slot:header>
|
||||||
<report-header v-bind="$props" v-bind:company-code="ticket.companyCode"> </report-header>
|
<report-header v-bind="$props"> </report-header>
|
||||||
</template>
|
</template>
|
||||||
<div class="grid-row">
|
<div class="grid-row">
|
||||||
<div class="grid-block">
|
<div class="grid-block">
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
<div class="size50">
|
<div class="body">
|
||||||
<div class="size75 vn-mt-ml">
|
<span>{{$t('date')}}:{{formatDate(new Date(), '%d-%m-%Y')}}</span>
|
||||||
<h1 class="title uppercase">{{$t(deliverNoteType)}}</h1>
|
<p>
|
||||||
<table class="row-oriented ticket-info">
|
{{$t('deviceRecieved')}}:
|
||||||
<tbody>
|
</p>
|
||||||
<tr>
|
<table class="row-oriented report-info">
|
||||||
<td class="font gray uppercase">{{$t('clientId')}}</td>
|
|
||||||
<th>{{client.id}}</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="font gray uppercase">{{$t(deliverNoteType)}}</td>
|
|
||||||
<th>{{ticket.id}}</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="font gray uppercase">{{$t('date')}}</td>
|
|
||||||
<th>{{formatDate(ticket.shipped, '%d-%m-%Y')}}</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td class="font gray uppercase">{{$t('packages')}}</td>
|
|
||||||
<th>{{ticket.packages}}</th>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="size50">
|
|
||||||
<div class="panel">
|
|
||||||
<div class="header">{{$t('deliveryAddress')}}</div>
|
|
||||||
<div class="body" v-if="address">
|
|
||||||
<h3 class="uppercase">{{address.nickname}}</h3>
|
|
||||||
<div>{{address.street}}</div>
|
|
||||||
<div>{{address.postalCode}}, {{address.city}} ({{address.province}})</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel">
|
|
||||||
<div class="header">{{$t('fiscalData')}}</div>
|
|
||||||
<div class="body">
|
|
||||||
<div>{{client.socialName}}</div>
|
|
||||||
<div>{{client.street}}</div>
|
|
||||||
<div>{{client.fi}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2>{{$t('saleLines')}}</h2>
|
|
||||||
<table class="column-oriented">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th width="5%">{{$t('reference')}}</th>
|
|
||||||
<th class="number">{{$t('quantity')}}</th>
|
|
||||||
<th width="50%">{{$t('concept')}}</th>
|
|
||||||
<th class="number" v-if="showPrices">{{$t('price')}}</th>
|
|
||||||
<th class="centered" width="5%" v-if="showPrices">{{$t('discount')}}</th>
|
|
||||||
<th class="centered" v-if="showPrices">{{$t('vat')}}</th>
|
|
||||||
<th class="number" v-if="showPrices">{{$t('amount')}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody v-for="sale in sales" class="no-page-break">
|
|
||||||
<tr>
|
|
||||||
<td width="5%">{{sale.itemFk}}</td>
|
|
||||||
<td class="number">{{sale.quantity}}</td>
|
|
||||||
<td width="50%">{{sale.concept}}</td>
|
|
||||||
<td class="number" v-if="showPrices">{{sale.price | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
<td class="centered" width="5%" v-if="showPrices">{{(sale.discount / 100) | percentage}}</td>
|
|
||||||
<td class="centered" v-if="showPrices">{{sale.vatType}}</td>
|
|
||||||
<td class="number" v-if="showPrices">
|
|
||||||
{{sale.price * sale.quantity * (1 - sale.discount / 100) | currency('EUR', $i18n.locale)}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="description font light-gray">
|
|
||||||
<td colspan="7">
|
|
||||||
<span v-if="sale.value5"> <strong>{{sale.tag5}}</strong> {{sale.value5}} </span>
|
|
||||||
<span v-if="sale.value6"> <strong>{{sale.tag6}}</strong> {{sale.value6}} </span>
|
|
||||||
<span v-if="sale.value7"> <strong>{{sale.tag7}}</strong> {{sale.value7}} </span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
<tfoot v-if="showPrices">
|
|
||||||
<tr>
|
|
||||||
<td colspan="6" class="font bold">
|
|
||||||
<span class="pull-right">{{$t('subtotal')}}</span>
|
|
||||||
</td>
|
|
||||||
<td class="number">{{getSubTotal() | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="columns vn-mb-ml">
|
|
||||||
<div class="size100 no-page-break" v-if="services.length > 0">
|
|
||||||
<h2>{{$t('services.title')}}</h2>
|
|
||||||
<table class="column-oriented">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th width="5%"></th>
|
|
||||||
<th class="number">{{$t('services.theader.quantity')}}</th>
|
|
||||||
<th width="50%">{{$t('services.theader.concept')}}</th>
|
|
||||||
<th class="number">{{$t('services.theader.price')}}</th>
|
|
||||||
<th class="centered" width="5%"></th>
|
|
||||||
<th class="centered">{{$t('services.theader.vat')}}</th>
|
|
||||||
<th class="number">{{$t('services.theader.amount')}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="service in services">
|
|
||||||
<td width="5%"></td>
|
|
||||||
<td class="number">{{service.quantity}}</td>
|
|
||||||
<td width="50%">{{service.description}}</td>
|
|
||||||
<td class="number">{{service.price | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
<td class="centered" width="5%"></td>
|
|
||||||
<td class="centered">{{service.taxDescription}}</td>
|
|
||||||
<td class="number">{{service.total | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
<tfoot>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="6" class="font bold">
|
<td class="font gray uppercase">{{$t('pdaModel')}}</td>
|
||||||
<span class="pull-right">{{$t('services.tfoot.subtotal')}}</span>
|
<th>{{device.modelFk}}</th>
|
||||||
</td>
|
|
||||||
<td class="number">{{serviceTotal | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
<span class="font gray">* {{ $t('services.warning') }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div id="packagings" class="size100 no-page-break" v-if="packagings.length > 0">
|
|
||||||
<h2>{{$t('packagings.title')}}</h2>
|
|
||||||
<table class="column-oriented">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{$t('packagings.theader.reference')}}</th>
|
<td class="font gray uppercase">{{$t('pdaSerie')}}</td>
|
||||||
<th class="number">{{$t('packagings.theader.quantity')}}</th>
|
<th>{{device.serialNumber}}</th>
|
||||||
<th wihth="75%">{{$t('packagings.theader.concept')}}</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
<tr>
|
||||||
<tbody>
|
<td class="font gray uppercase">{{$t('sim')}}</td>
|
||||||
<tr v-for="packaging in packagings">
|
<th>{{device.sim}}</th>
|
||||||
<td>{{packaging.itemFk}}</td>
|
</tr>
|
||||||
<td class="number">{{packaging.quantity}}</td>
|
<tr>
|
||||||
<td width="85%">{{packaging.name}}</td>
|
<td class="font gray uppercase">{{$t('pin')}}</td>
|
||||||
|
<th>{{device.pin}}</th>
|
||||||
|
<td class="font gray uppercase">{{$t('puk')}}</td>
|
||||||
|
<th>{{device.puk}}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="columns vn-mt-xl" v-if="showPrices">
|
|
||||||
<div id="taxes" class="size50 pull-right no-page-break" v-if="taxes">
|
|
||||||
<table class="column-oriented">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th colspan="4">{{$t('taxes.title')}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<thead class="light">
|
|
||||||
<tr>
|
|
||||||
<th width="45%">{{$t('taxes.theader.type')}}</th>
|
|
||||||
<th width="25%" class="number">{{$t('taxes.theader.taxBase')}}</th>
|
|
||||||
<th>{{$t('taxes.theader.tax')}}</th>
|
|
||||||
<th class="number">{{$t('taxes.theader.fee')}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr v-for="tax in taxes">
|
|
||||||
<td width="45%">{{tax.name}}</td>
|
|
||||||
<td width="25%" class="number">{{tax.Base | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
<td>{{tax.vatPercent | percentage}}</td>
|
|
||||||
<td class="number">{{tax.tax | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
<tfoot>
|
|
||||||
<tr class="font bold">
|
|
||||||
<td width="45%">{{$t('subtotal')}}</td>
|
|
||||||
<td width="20%" class="number">{{getTotalBase() | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
<td></td>
|
|
||||||
<td class="number">{{getTotalTax()| currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="font bold">
|
|
||||||
<td colspan="2">{{$t('total')}}</td>
|
|
||||||
<td colspan="2" class="number">{{getTotal() | currency('EUR', $i18n.locale)}}</td>
|
|
||||||
</tr>
|
|
||||||
</tfoot>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="phytosanitary" class="size50 pull-left no-page-break">
|
<p>{{$t('label1')}}
|
||||||
<div class="panel">
|
</p>
|
||||||
<div class="body">
|
<p>
|
||||||
<div class="flag">
|
{{$t('label2')}}
|
||||||
<div class="columns">
|
</p>
|
||||||
<div class="size25">
|
<p>
|
||||||
<img v-bind:src="getReportSrc('europe.png')" />
|
{{$t('label3')}}
|
||||||
</div>
|
</p>
|
||||||
<div class="size75 flag-text"><strong>{{$t('plantPassport')}}</strong><br /></div>
|
|
||||||
</div>
|
<p> {{$t('label4')}}
|
||||||
</div>
|
</p>
|
||||||
<div class="phytosanitary-info">
|
<p> {{$t('label5')}}
|
||||||
<div>
|
</p>
|
||||||
<strong>A</strong>
|
|
||||||
<span>{{getBotanical()}}</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>B</strong>
|
|
||||||
<span>ES17462130</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>C</strong>
|
|
||||||
<span>{{ticket.id}}</span>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>D</strong>
|
|
||||||
<span>ES</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="size50 pull-left no-page-break">
|
|
||||||
<div id="signature" class="panel" v-if="signature && signature.id">
|
|
||||||
<div class="header">{{$t('digitalSignature')}}</div>
|
|
||||||
<div class="body centered">
|
|
||||||
<img v-bind:src="dmsPath" />
|
|
||||||
<div>{{formatDate(signature.created, '%d-%m-%Y')}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="columns vn-mb-ml" v-if="hasObservations">
|
|
||||||
<div class="size100 no-page-break">
|
|
||||||
<h2>{{$t('observations')}}</h2>
|
|
||||||
<p class="observations">{{ticket.description}}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<template v-slot:footer>
|
<template v-slot:footer>
|
||||||
<report-footer id="pageFooter" v-bind:company-code="ticket.companyCode" v-bind:left-text="footerType"
|
<report-footer id="pageFooter" v-bind="$props"> </report-footer>
|
||||||
v-bind:center-text="client.socialName" v-bind="$props">
|
|
||||||
</report-footer>
|
|
||||||
</template>
|
</template>
|
||||||
</report-body>
|
</report-body>
|
|
@ -1,100 +1,15 @@
|
||||||
const config = require(`vn-print/core/config`);
|
|
||||||
const vnReport = require('../../../core/mixins/vn-report.js');
|
const vnReport = require('../../../core/mixins/vn-report.js');
|
||||||
const md5 = require('md5');
|
|
||||||
const fs = require('fs-extra');
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
name: 'delivery-note',
|
name: 'sign-pda',
|
||||||
mixins: [vnReport],
|
mixins: [vnReport],
|
||||||
async serverPrefetch() {
|
async serverPrefetch() {
|
||||||
this.ticket = await this.findOneFromDef('ticket', [this.id]);
|
this.device = await this.findOneFromDef('device', [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};
|
|
||||||
},
|
},
|
||||||
|
data() {},
|
||||||
computed: {
|
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: {
|
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: {
|
props: {
|
||||||
id: {
|
id: {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
SELECT * FROM vn.deviceProduction WHERE id = 3
|
Loading…
Reference in New Issue