feat: refs #6401 Added QR and CIF in the CMR report #2111

Merged
guillermo merged 2 commits from 6401-cmrQr into dev 2024-03-01 06:29:47 +00:00
4 changed files with 76 additions and 39 deletions

View File

@ -3,7 +3,7 @@ html {
margin: 10px;
font-size: 22px;
}
.mainTable, .specialTable, .categoryTable {
.mainTable, .specialTable, .categoryTable, .observationTable {
width: 100%;
border-collapse: collapse;
font-size: inherit;
@ -99,3 +99,18 @@ img {
padding-bottom: 11px;
max-width: 300px;
}
.observationTable tr td {
border: none;
padding: 5px;
}
#qrSection {
text-align: center;
width: 30%;
}
#truckPlateQr {
width: 125px;
margin-bottom: 10px;
}

View File

@ -30,8 +30,11 @@
<span id="label">16. Transportista / Transporteur / Carrier</span>
<hr>
<b>{{data.carrierName}}</b><br>
{{data.carrierStreet}}<br>
{{data.carrierPostalCode}} {{data.carrierCity}} {{(data.carrierCountry) ? `(${data.carrierCountry})` : null}}
{{data.carrierStreet}} {{data.carrierPostalCode}}
{{data.carrierCity}} {{(data.carrierCountry)
guillermo marked this conversation as resolved
Review

Esta ultima part:
{(data.carrierCountry) ? (${data.carrierCountry}): null}}
No te val fica soles {{data.carrierCountry}} ?

I també podries fer {{ data.carrierCountry ?? null }} si fera falta q fora null i no undefined

Esta ultima part: `{(data.carrierCountry) ? (${data.carrierCountry}): null}}` No te val fica soles `{{data.carrierCountry}}` ? I també podries fer `{{ data.carrierCountry ?? null }}` si fera falta q fora `null` i no `undefined`
Review

Crec que ho vaig ficar aixina perque si era undefined me retornaba error el report

Crec que ho vaig ficar aixina perque si era undefined me retornaba error el report
? `(${data.carrierCountry})`
: null}}<br>
<b>CIF:</b> {{data.carrierCif}}
</td>
</tr>
<tr>
@ -71,8 +74,19 @@
Carrier's reservations and observations
</span>
<hr>
<b>{{data.truckPlate}}</b><br>
{{data.observations}}
<table class="observationTable">
<tr>
<td>
{{data.observations}}
</td>
<td id="qrSection">
<img id="truckPlateQr" v-bind:src="truckPlateQr"/>
<br>
guillermo marked this conversation as resolved
Review

Crec que es mala practica gastar els
de esta manera.
En teoria soles se deuen gastar per a separar parrafos en un

per exemple (https://desarrolloweb-apuntes.blogspot.com/2017/11/errores-o-malas-practicas-en-html.html#:~:text=El%20elemento%20no%20se,decir%2C%20como%20dos%20p%C3%A1rrafos%20independientes.)

Per exemple, jo habria fet que el fora flex column i ja teu fica en una columna. i si volvera separacio ficaria margin fora sols un element o gap si foren varios.

Pero teu dic per a un futur

Crec que es mala practica gastar els <br> de esta manera. En teoria soles se deuen gastar per a separar parrafos en un <p> per exemple (https://desarrolloweb-apuntes.blogspot.com/2017/11/errores-o-malas-practicas-en-html.html#:~:text=El%20elemento%20no%20se,decir%2C%20como%20dos%20p%C3%A1rrafos%20independientes.) Per exemple, jo habria fet que el <td> fora flex column i ja teu fica en una columna. i si volvera separacio ficaria margin fora sols un element o gap si foren varios. Pero teu dic per a un futur
<b>{{data.truckPlate}}</b>
</td>
</tr>
</table>
</td>
</tr>
<tr>

View File

@ -2,44 +2,51 @@ const config = require(`vn-print/core/config`);
const vnReport = require('../../../core/mixins/vn-report.js');
const md5 = require('md5');
const fs = require('fs-extra');
const qrcode = require('qrcode');
const prefixBase64 = 'data:image/png;base64,';
module.exports = {
name: 'cmr',
mixins: [vnReport],
async serverPrefetch() {
this.data = await this.findOneFromDef('data', [this.id]);
if (this.data.ticketFk) {
this.merchandises = await this.rawSqlFromDef('merchandise', [this.data.ticketFk]);
this.signature = await this.findOneFromDef('signature', [this.data.ticketFk]);
} else
this.merchandises = null;
name: 'cmr',
mixins: [vnReport],
async serverPrefetch() {
this.data = await this.findOneFromDef('data', [this.id]);
if (this.data.ticketFk) {
this.merchandises = await this.rawSqlFromDef('merchandise', [this.data.ticketFk]);
this.signature = await this.findOneFromDef('signature', [this.data.ticketFk]);
} else
this.merchandises = null;
this.senderStamp = (this.data.senderStamp)
? `${prefixBase64} ${this.data.senderStamp.toString('base64')}`
: null;
this.deliveryStamp = (this.data.deliveryStamp)
? `${prefixBase64} ${this.data.deliveryStamp.toString('base64')}`
: null;
},
props: {
id: {
type: Number,
required: true,
description: 'The cmr id'
},
},
computed: {
signPath() {
if (!this.signature) return;
this.senderStamp = (this.data.senderStamp)
? `${prefixBase64} ${this.data.senderStamp.toString('base64')}`
: null;
this.deliveryStamp = (this.data.deliveryStamp)
? `${prefixBase64} ${this.data.deliveryStamp.toString('base64')}`
: null;
this.truckPlateQr = await this.getQR(this.data.truckPlate);
},
props: {
id: {
type: Number,
required: true,
description: 'The cmr id'
},
},
computed: {
signPath() {
if (!this.signature) return;
const signatureName = this.signature.signature
const hash = md5(signatureName.toString()).substring(0, 3);
const file = `${config.storage.root}/${hash}/${signatureName}.png`;
if (!fs.existsSync(file)) return null;
const signatureName = this.signature.signature;
const hash = md5(signatureName.toString()).substring(0, 3);
const file = `${config.storage.root}/${hash}/${signatureName}.png`;
if (!fs.existsSync(file)) return null;
return `${prefixBase64} ${Buffer.from(fs.readFileSync(file), 'utf8').toString('base64')}`;
},
}
return `${prefixBase64} ${Buffer.from(fs.readFileSync(file), 'utf8').toString('base64')}`;
},
},
methods: {
getQR(id) {
return qrcode.toDataURL(String(id), {margin: 0});
},
}
};

View File

@ -10,6 +10,7 @@ SELECT c.id cmrFk,
c.merchandiseDetail,
c.ead,
s.name carrierName,
s.nif carrierCif,
s.street carrierStreet,
s.postCode carrierPostCode,
s.city carrierCity,