print reportEngine fixes & claim report #1044

This commit is contained in:
Joan Sanchez 2019-01-24 15:03:01 +01:00
parent 31dc2bd5e2
commit 74421790db
32 changed files with 2079 additions and 17 deletions

185
print/common/css/layout.css Normal file
View File

@ -0,0 +1,185 @@
.columns {
overflow: hidden
}
.columns .size100 {
width: 100%;
float: left
}
.columns .size75 {
width: 75%;
float: left
}
.columns .size50 {
width: 50%;
float: left
}
.columns .size33 {
width: 33.33%;
float: left
}
.columns .size25 {
width: 25%;
float: left
}
.pull-left {
float: left
}
.pull-right {
float: right
}
.grid {
border-bottom: 3px solid #888888
}
.grid .row {
padding: 5px;
margin-bottom: 0
}
.grid .header {
border-bottom: 1px solid #808080;
border-top: 1px solid #808080;
background-color: #c0c0c0;
}
.grid .row.inline > div {
float: left;
}
.panel {
border: 1px solid #DDD;
margin-bottom: 10px;
position: relative;
padding:10px
}
.panel .header {
font-weight: bold
}
.row {
margin-bottom: 15px;
overflow: hidden
}
.row.small {
margin-bottom: 5px
}
.row .text {
margin-bottom: 5px
}
.row .control {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box
}
.row .text, .row .control {
overflow: hidden
}
.row .description {
position: relative;
padding-top: 2px;
overflow: hidden;
font-size: 9px;
display: block;
color: #999
}
.row .line {
border-bottom: 1px solid #DDD;
border-right: 1px solid #DDD;
border-left: 1px solid #DDD;
margin-top: 10px;
color: #999;
padding: 5px
}
.row .description span {
background-color: #FFF;
margin: -5px 0 0 50px;
display: block;
padding: 5px;
float: left
}
.row:last-child {
margin-bottom: 0
}
.row.inline .text {
margin-bottom: 0;
width: 40%;
float: left
}
.row.inline .control {
font-weight: bold;
padding-left: 20px;
color: #000;
width: 60%;
float: left
}
.row.inline .description {
position: static;
overflow: visible
}
.box {
border-top: 1px solid #CCC;
border-right: 1px solid #CCC;
border-bottom: 1px solid #CCC;
font-weight: bold;
text-align: center;
padding-top: 4px;
width: 25px;
height: 21px;
color: #000;
float: left
}
.box.crossed {
font-weight: 100;
font-size: 16px
}
.pull-left {
float: left
}
.pull-right {
float: right
}
.grid {
border-bottom: 3px solid #888888
}
.grid .row {
padding: 5px;
margin-bottom: 0
}
.grid .header {
border-bottom: 1px solid #808080;
border-top: 1px solid #808080;
background-color: #c0c0c0;
}
.grid .row.inline > div {
float: left;
}

View File

@ -6,6 +6,9 @@
{"type": "email", "name": "letter-debtor-nd"}, {"type": "email", "name": "letter-debtor-nd"},
{"type": "report", "name": "delivery-note"}, {"type": "report", "name": "delivery-note"},
{"type": "report", "name": "invoice"}, {"type": "report", "name": "invoice"},
{"type": "report", "name": "claim-pickup"},
{"type": "static", "name": "email-header"}, {"type": "static", "name": "email-header"},
{"type": "static", "name": "email-footer"} {"type": "static", "name": "email-footer"},
{"type": "static", "name": "report-header"},
{"type": "static", "name": "report-footer"}
] ]

18
print/lib/cssReader.js Normal file
View File

@ -0,0 +1,18 @@
const fs = require('fs-extra');
class CssReader {
constructor(files) {
this.files = files;
this.css = [];
}
mergeStyles() {
this.files.forEach(file => {
this.css.push(fs.readFileSync(file));
});
return this.css.join('\n');
}
}
module.exports = CssReader;

View File

@ -120,10 +120,10 @@ module.exports = {
async attachAssets(component) { async attachAssets(component) {
const localePath = `${this.path}/${component.name}/locale.js`; const localePath = `${this.path}/${component.name}/locale.js`;
const templatePath = `${this.path}/${component.name}/index.html`; const templatePath = `${this.path}/${component.name}/index.html`;
const stylePath = `${this.path}/${component.name}/assets/css/style.css`; const stylePath = `${this.path}/${component.name}/assets/css/index.js`;
const template = await fs.readFile(templatePath, 'utf8'); const template = await fs.readFile(templatePath, 'utf8');
const css = await fs.readFile(stylePath, 'utf8'); const css = require(stylePath);
component.i18n = require(localePath); component.i18n = require(localePath);
component.template = juice.inlineContent(template, css); component.template = juice.inlineContent(template, css);

View File

@ -2,7 +2,8 @@ const Vue = require('vue');
const VueI18n = require('vue-i18n'); const VueI18n = require('vue-i18n');
const renderer = require('vue-server-renderer').createRenderer(); const renderer = require('vue-server-renderer').createRenderer();
const fs = require('fs-extra'); const fs = require('fs-extra');
const pdf = require('phantom-html2pdf'); // const pdf = require('phantom-html2pdf');
const pdf = require('html-pdf');
const juice = require('juice'); const juice = require('juice');
Vue.use(VueI18n); Vue.use(VueI18n);
@ -46,6 +47,7 @@ module.exports = {
let mergedData = {}; let mergedData = {};
let asyncData = {}; let asyncData = {};
let data = {}; let data = {};
let params = {};
if (Object.keys(ctx.body).length > 0) if (Object.keys(ctx.body).length > 0)
params = ctx.body; params = ctx.body;
@ -80,24 +82,31 @@ module.exports = {
}, },
async attachAssets(component) { async attachAssets(component) {
const localePath = `${this.path}/${component.name}/locale.js`; const localePath = `${this.path}/${component.name}/locale`;
const templatePath = `${this.path}/${component.name}/index.html`; const templatePath = `${this.path}/${component.name}/index.html`;
const stylePath = `${this.path}/${component.name}/assets/css/style.css`; const stylePath = `${this.path}/${component.name}/assets/css/index`;
const template = await fs.readFile(templatePath, 'utf8'); const template = await fs.readFile(templatePath, 'utf8');
const css = await fs.readFile(stylePath, 'utf8'); const css = require(stylePath);
component.i18n = require(localePath); component.i18n = require(localePath);
component.template = juice.inlineContent(template, css); component.template = juice.inlineContent(template, css);
}, },
async toPdf(name, ctx) { async toPdf(name, ctx) {
const html = await this.render(name, ctx);
const options = { const options = {
html: await this.render(name, ctx), format: 'A4',
border: '1.5cm',
footer: {
height: '80px',
}
}; };
const result = await pdf.convert(options);
const stream = await result.toStream();
return stream; return new Promise(resolve => {
pdf.create(html, options).toStream((err, stream) => {
resolve(stream);
});
});
}, },
}; };

1499
print/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -14,11 +14,11 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"fs-extra": "^7.0.1", "fs-extra": "^7.0.1",
"html-pdf": "^2.2.0",
"juice": "^5.0.1", "juice": "^5.0.1",
"mysql2": "^1.6.1", "mysql2": "^1.6.1",
"nodemailer": "^4.7.0", "nodemailer": "^4.7.0",
"phantom": "^6.0.3", "strftime": "^0.10.0",
"phantom-html2pdf": "^4.0.1",
"vue": "^2.5.17", "vue": "^2.5.17",
"vue-i18n": "^8.3.1", "vue-i18n": "^8.3.1",
"vue-server-renderer": "^2.5.17" "vue-server-renderer": "^2.5.17"

View File

@ -0,0 +1,6 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([
`${appPath}/common/css/layout.css`,
`${__dirname}/style.css`])
.mergeStyles();

View File

@ -0,0 +1,6 @@
.container {
font-family: arial, sans-serif;
font-size: 16px;
color: #555;
zoom: 0.55
}

View File

@ -0,0 +1,79 @@
<!DOCTYPE html>
<html lang="es">
<body>
<section class="container">
<report-header></report-header>
<section class="main">
<div class="columns">
<div class="size50">
<div class="size75">
<h1 style="margin-top:0" class="font extraLarge">{{$t('title')}}</h1>
<div class="row inline font normal">
<div class="text font gray">{{$t('claimId')}}:</div>
<div class="control">{{claimId}}</div>
</div>
<div class="row inline font normal">
<div class="text font gray">{{$t('clientId')}}:</div>
<div class="control">{{clientId}}</div>
</div>
<div class="row inline font normal">
<div class="text font gray">{{$t('date')}}:</div>
<div class="control">{{dated()}}</div>
</div>
</div>
</div>
<div class="size50">
<div class="panel">
<div class="header">{{$t('clientData')}}</div>
<p>
<strong>{{clientName}}</strong>
</p>
<div>
{{street}}
</div>
<div>
{{postcode}}, {{city}} ({{province}})
</div>
<div>
{{country}}
</div>
</div>
</div>
</div>
<div class="grid" style="margin-top:20px">
<div class="row header inline">
<div style="width: 15%">{{$t('quantity')}}</div>
<div style="width: 15%">{{$t('claims')}}</div>
<div style="width: 20%">{{$t('reference')}}</div>
<div style="width: 50%">{{$t('concept')}}</div>
</div>
<div class="row inline" v-for="sale in sales">
<div class="font bold" style="width: 15%">{{sale.quantity}}&nbsp;</div>
<div class="font bold" style="width: 15%">{{sale.claimQuantity}}&nbsp;</div>
<div class="font bold" style="width: 20%">{{sale.id}}&nbsp;</div>
<div class="font bold" style="width: 50%">{{sale.concept}}&nbsp;</div>
</div>
</div>
<div class="columns" style="margin-top: 50px">
<div class="size25">&nbsp;</div>
<div class="size50">
<div class="panel" style="height: 150px">
<div style="text-align: center">
<h3>{{clientName}}</h3>
</div>
</div>
</div>
<div class="size25">&nbsp;</div>
</div>
<p v-html="$t('sections.agency.description')"></p>
</section>
<report-footer id="pageFooter"
:left-text="$t('claim', [claimId])"
:center-text="clientName">
</report-footer>
</section>
</body>
</html>

View File

@ -0,0 +1,72 @@
const strftime = require('strftime');
const database = require(`${appPath}/lib/database`);
const UserException = require(`${appPath}/lib/exceptions/userException`);
module.exports = {
name: 'claim-pickup',
async asyncData(ctx, params) {
const promises = [];
const data = {};
if (!params.claimFk)
throw new UserException('No claim id specified');
promises.push(this.methods.fetchClaim(params.claimFk));
promises.push(this.methods.fetchSales(params.claimFk));
return Promise.all(promises).then(result => {
const [[claim]] = result[0];
const [sales] = result[1];
Object.assign(data, claim, {sales});
return data;
});
},
created() {
this.$i18n.locale = this.locale;
},
methods: {
dated: () => {
return strftime('%d-%m-%Y', new Date());
},
fetchClaim(claimFk) {
return database.pool.query(
`SELECT
u.lang locale,
c.id clientId,
cl.id claimId,
c.email AS recipient,
c.socialName,
c.name AS clientName,
c.street,
c.postcode,
c.city,
c.fi,
p.name AS province,
ct.country
FROM claim cl
JOIN client c ON c.id = cl.clientFk
JOIN account.user u ON u.id = c.id
JOIN country ct ON ct.id = c.countryFk
LEFT JOIN province p ON p.id = c.provinceFk
WHERE cl.id = ?`, [claimFk]);
},
fetchSales(claimFk) {
return database.pool.query(
`SELECT
s.id,
s.quantity,
s.concept,
cb.quantity claimQuantity
FROM claimBeginning cb
JOIN sale s ON s.id = cb.saleFk
WHERE cb.claimFk = ?`, [claimFk]);
},
},
components: {
'report-header': require('../report-header'),
'report-footer': require('../report-footer'),
},
};

View File

@ -0,0 +1,22 @@
module.exports = {
messages: {
es: {
title: 'ORD. RECOGIDA',
claimId: 'Reclamación',
clientId: 'Cliente',
date: 'Fecha',
clientData: 'Datos del cliente',
quantity: 'Cantidad',
claims: 'Reclama',
reference: 'Referencia',
concept: 'Concepto',
claim: 'Reclamación {0}',
sections: {
agency: {
description: `Para agilizar su recogida, por favor, póngase en contacto con la oficina de integrados. <br/>
Tlf: 96 166 77 88 - Ana Gómez <em>(agomezf@integra2.es)</em>`
}
}
},
},
};

View File

@ -0,0 +1,6 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([
`${appPath}/common/css/layout.css`,
`${__dirname}/style.css`])
.mergeStyles();

View File

@ -13,7 +13,7 @@ module.exports = {
if (!params.clientFk) if (!params.clientFk)
throw new UserException('No client id specified'); throw new UserException('No client id specified');
return this.methods.fetchClientData(params.clientFk) return this.methods.fetchClient(params.clientFk)
.then(([result]) => { .then(([result]) => {
return Object.assign(data, result[0]); return Object.assign(data, result[0]);
}); });
@ -22,7 +22,7 @@ module.exports = {
this.$i18n.locale = this.locale; this.$i18n.locale = this.locale;
}, },
methods: { methods: {
fetchClientData(clientFk) { fetchClient(clientFk) {
return database.pool.query(` return database.pool.query(`
SELECT SELECT
c.id, c.id,

View File

@ -0,0 +1,4 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([`${__dirname}/style.css`])
.mergeStyles();

View File

@ -0,0 +1,4 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([`${__dirname}/style.css`])
.mergeStyles();

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,5 +1,5 @@
<header> <header>
<a href="https://www.verdnatura.es" target="_blank"/> <a href="https://www.verdnatura.es" target="_blank"/>
<img :src="embeded['/assets/images/logo.png']" alt="VerdNatura"/> <img :src="embeded['/assets/images/email-logo.png']" alt="VerdNatura"/>
</a> </a>
</header> </header>

View File

@ -16,7 +16,7 @@ module.exports = {
data() { data() {
return { return {
files: ['/assets/images/logo.png'], files: ['/assets/images/email-logo.png'],
}; };
}, },
}; };

View File

@ -0,0 +1,4 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([`${__dirname}/style.css`])
.mergeStyles();

View File

@ -0,0 +1,22 @@
footer {
font-family: arial, sans-serif;
margin-top: 30px;
font-size: 16px;
color: #555;
zoom: 0.55
}
footer, footer p {
text-align: center;
font-size: 12px
}
footer .page {
border-bottom: 2px solid #CCC;
padding-bottom: 2px
}
footer .page > section {
display: inline-block;
width: 33%
}

View File

@ -0,0 +1,9 @@
<footer>
<section class="page">
<section :if="leftText">{{leftText}}</section>
<section :if="centerText">{{centerText}}</section>
<section class="number">{{$t('numPages')}}</section>
</section>
<p>{{$t('law.phytosanitary')}}</p>
<p>{{$t('law.privacy')}}</p>
</footer>

View File

@ -0,0 +1,4 @@
module.exports = {
name: 'report-footer',
props: ['leftText', 'centerText']
};

View File

@ -0,0 +1,15 @@
module.exports = {
messages: {
es: {
numPages: 'Página {{page}} de {{pages}}',
law: {
phytosanitary: 'VERDNATURA LEVANTE SL - Pasaporte Fitosanitario R.P. Generalitat Valenciana - Nº Comerciante: ES17462130',
privacy: `En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal,
le comunicamos que los datos personales que facilite se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L.,
pudiendo en todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, comunicándolo
por escrito al domicilio social de la entidad. La finalidad del fichero
es la gestión administrativa, contabilidad, y facturación.`,
}
},
},
};

View File

@ -0,0 +1,4 @@
const CssReader = require(`${appPath}/lib/cssReader`);
module.exports = new CssReader([`${__dirname}/style.css`])
.mergeStyles();

View File

@ -0,0 +1,13 @@
header {
border-bottom: 1px solid #DDD;
padding-bottom: 10px;
margin-bottom: 40px;
text-align: center;
font-size: 12px;
color: #555
}
header img {
margin-bottom: 10px;
width: 350px
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" x="0px" y="0px" width="226.229px" height="31.038px" viewBox="0 0 226.229 31.038" enable-background="new 0 0 226.229 31.038" xml:space="preserve" id="svg2" inkscape:version="0.48.1 r9760" sodipodi:docname="logo.svg"><metadata id="metadata61"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs59"/><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1366" inkscape:window-height="710" id="namedview57" showgrid="false" inkscape:zoom="4.0755163" inkscape:cx="138.56745" inkscape:cy="16.509992" inkscape:window-x="0" inkscape:window-y="26" inkscape:window-maximized="1" inkscape:current-layer="svg2"/>
<g id="Background">
</g>
<g id="Guides">
</g>
<g id="Foreground">
<g id="g7">
<g id="g9">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.417,30.321L0,0h8.233l4.26,15.582l0.349,1.276 c0.521,1.866,0.918,3.431,1.191,4.693c0.15-0.618,0.335-1.345,0.555-2.182c0.219-0.837,0.528-1.935,0.925-3.293L19.981,0h8.19 L17.671,30.321H10.417z" id="path11"/>
</g>
<g id="g13">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" d="M139.809,19.787c-0.665,0.357-1.748,0.686-3.25,0.988 c-0.727,0.137-1.283,0.254-1.667,0.35c-0.95,0.247-1.661,0.563-2.134,0.947c-0.472,0.384-0.799,0.899-0.979,1.544 c-0.223,0.796-0.155,1.438,0.204,1.925c0.359,0.488,0.945,0.731,1.757,0.731c1.252,0,2.375-0.36,3.369-1.081 c0.994-0.721,1.653-1.665,1.98-2.831L139.809,19.787z M144.915,30.321h-7.458c0.017-0.356,0.048-0.726,0.094-1.11l0.159-1.192 c-1.318,1.026-2.627,1.786-3.927,2.279c-1.299,0.493-2.643,0.739-4.031,0.739c-2.158,0-3.7-0.593-4.625-1.779 c-0.925-1.187-1.106-2.788-0.542-4.804c0.519-1.851,1.431-3.356,2.737-4.515c1.307-1.159,3.021-1.972,5.142-2.438 c1.169-0.247,2.641-0.515,4.413-0.803c2.646-0.412,4.082-1.016,4.304-1.812l0.151-0.539c0.182-0.65,0.076-1.145-0.317-1.483 c-0.393-0.339-1.071-0.508-2.033-0.508c-1.045,0-1.934,0.214-2.666,0.643c-0.731,0.428-1.289,1.058-1.673,1.887h-6.748 c1.065-2.53,2.64-4.413,4.723-5.65s4.724-1.856,7.923-1.856c1.991,0,3.602,0.241,4.833,0.722s2.095,1.209,2.59,2.185 c0.339,0.701,0.483,1.536,0.432,2.504c-0.052,0.969-0.377,2.525-0.978,4.669l-2.375,8.483c-0.284,1.014-0.416,1.812-0.396,2.395 s0.188,0.962,0.503,1.141L144.915,30.321z" id="path15" style="fill:#8ed300;fill-opacity:1"/>
</g>
<g id="g17">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" d="M185.7,30.321l6.27-22.393h7.049l-1.097,3.918 c1.213-1.537,2.502-2.659,3.867-3.366c1.365-0.707,2.951-1.074,4.758-1.101l-2.03,7.25c-0.304-0.042-0.608-0.072-0.912-0.093 c-0.303-0.02-0.592-0.03-0.867-0.03c-1.126,0-2.104,0.168-2.932,0.504c-0.829,0.336-1.561,0.854-2.197,1.555 c-0.406,0.467-0.789,1.136-1.149,2.007c-0.361,0.872-0.814,2.282-1.359,4.232l-2.104,7.516H185.7z" id="path19" style="fill:#8ed300;fill-opacity:1"/>
</g>
<g id="g21">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" d="M217.631,19.787c-0.664,0.357-1.748,0.686-3.25,0.988 c-0.727,0.137-1.282,0.254-1.667,0.35c-0.95,0.247-1.661,0.563-2.134,0.947c-0.472,0.384-0.799,0.899-0.979,1.544 c-0.223,0.796-0.155,1.438,0.205,1.925c0.359,0.488,0.945,0.731,1.757,0.731c1.252,0,2.375-0.36,3.369-1.081 c0.994-0.721,1.654-1.665,1.98-2.831L217.631,19.787z M222.737,30.321h-7.458c0.017-0.356,0.048-0.726,0.094-1.11l0.159-1.192 c-1.318,1.026-2.627,1.786-3.927,2.279c-1.299,0.493-2.643,0.739-4.031,0.739c-2.158,0-3.7-0.593-4.625-1.779 c-0.926-1.187-1.106-2.788-0.542-4.804c0.519-1.851,1.431-3.356,2.737-4.515c1.306-1.159,3.02-1.972,5.142-2.438 c1.169-0.247,2.641-0.515,4.413-0.803c2.647-0.412,4.082-1.016,4.304-1.812l0.151-0.539c0.182-0.65,0.077-1.145-0.317-1.483 c-0.393-0.339-1.071-0.508-2.033-0.508c-1.045,0-1.934,0.214-2.666,0.643c-0.731,0.428-1.289,1.058-1.672,1.887h-6.748 c1.065-2.53,2.64-4.413,4.723-5.65s4.724-1.856,7.923-1.856c1.99,0,3.601,0.241,4.833,0.722s2.095,1.209,2.591,2.185 c0.339,0.701,0.483,1.536,0.431,2.504c-0.051,0.969-0.377,2.525-0.978,4.669l-2.375,8.483c-0.284,1.014-0.416,1.812-0.396,2.395 c0.02,0.583,0.188,0.962,0.503,1.141L222.737,30.321z" id="path23" style="fill:#8ed300;fill-opacity:1"/>
</g>
<g id="g25">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" d="M188.386,7.928l-6.269,22.393h-7.174l0.864-3.085 c-1.227,1.246-2.476,2.163-3.746,2.751s-2.625,0.882-4.067,0.882c-2.471,0-4.154-0.634-5.048-1.901 c-0.895-1.268-0.993-3.149-0.294-5.644l4.31-15.396h7.338l-3.508,12.53c-0.516,1.842-0.641,3.109-0.375,3.803 s0.967,1.041,2.105,1.041c1.275,0,2.323-0.422,3.142-1.267c0.819-0.845,1.497-2.223,2.031-4.133l3.353-11.974H188.386z" id="path27" style="fill:#8ed300;fill-opacity:1"/>
</g>
<g id="g29">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" d="M149.937,12.356l1.239-4.428h2.995l1.771-6.326h7.338 l-1.771,6.326h3.753l-1.24,4.428h-3.753l-2.716,9.702c-0.416,1.483-0.498,2.465-0.247,2.946c0.25,0.48,0.905,0.721,1.964,0.721 l0.549-0.011l0.39-0.031l-1.31,4.678c-0.811,0.148-1.596,0.263-2.354,0.344c-0.758,0.081-1.48,0.122-2.167,0.122 c-2.543,0-4.108-0.621-4.695-1.863c-0.587-1.242-0.313-3.887,0.82-7.936l2.428-8.672H149.937z" id="path31" style="fill:#8ed300;fill-opacity:1"/>
</g>
<g id="g33">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M73.875,18.896c-0.561,2.004-0.616,3.537-0.167,4.601 s1.375,1.595,2.774,1.595c1.399,0,2.605-0.524,3.62-1.574s1.806-2.59,2.375-4.622c0.526-1.879,0.556-3.334,0.09-4.363 c-0.466-1.029-1.393-1.543-2.778-1.543c-1.304,0-2.487,0.528-3.551,1.585S74.386,17.071,73.875,18.896z M96.513,0l-8.489,30.321 h-7.337l0.824-2.944c-1.166,1.22-2.369,2.121-3.61,2.703s-2.583,0.874-4.025,0.874c-2.802,0-4.772-1.081-5.912-3.243 c-1.139-2.162-1.218-4.993-0.238-8.493c0.988-3.528,2.668-6.404,5.042-8.627c2.374-2.224,4.927-3.336,7.661-3.336 c1.47,0,2.695,0.296,3.676,0.887c0.981,0.591,1.681,1.465,2.099,2.62L89.217,0H96.513z" id="path35"/>
<g id="g37">
<path fill-rule="evenodd" clip-rule="evenodd" d="M73.875,18.896c-0.561,2.004-0.616,3.537-0.167,4.601s1.375,1.595,2.774,1.595 c1.399,0,2.605-0.524,3.62-1.574s1.806-2.59,2.375-4.622c0.526-1.879,0.556-3.334,0.09-4.363 c-0.466-1.029-1.393-1.543-2.778-1.543c-1.304,0-2.487,0.528-3.551,1.585S74.386,17.071,73.875,18.896z M96.513,0l-8.489,30.321 h-7.337l0.824-2.944c-1.166,1.22-2.369,2.121-3.61,2.703s-2.583,0.874-4.025,0.874c-2.802,0-4.772-1.081-5.912-3.243 c-1.139-2.162-1.218-4.993-0.238-8.493c0.988-3.528,2.668-6.404,5.042-8.627c2.374-2.224,4.927-3.336,7.661-3.336 c1.47,0,2.695,0.296,3.676,0.887c0.981,0.591,1.681,1.465,2.099,2.62L89.217,0H96.513z" id="path39"/>
</g>
</g>
<g id="g41">
<path fill-rule="evenodd" clip-rule="evenodd" d="M46.488,30.321l6.269-22.393h7.049l-1.098,3.918 c1.213-1.537,2.502-2.659,3.868-3.366s6.015-1.074,7.822-1.101l-2.03,7.25c-0.304-0.042-0.608-0.072-0.911-0.093 c-0.304-0.02-0.592-0.03-0.867-0.03c-1.126,0-5.167,0.168-5.997,0.504c-0.829,0.336-1.561,0.854-2.196,1.555 c-0.406,0.467-0.789,1.136-1.149,2.007c-0.361,0.872-0.814,2.282-1.36,4.232l-2.104,7.516H46.488z" id="path43"/>
</g>
<g id="g45">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M32.673,16.742l8.351-0.021 c0.375-1.436,0.308-2.558-0.201-3.365s-1.402-1.211-2.68-1.211c-1.209,0-2.285,0.397-3.229,1.19S33.224,15.265,32.673,16.742z M38.817,23.278h7.043c-1.347,2.456-3.172,4.356-5.477,5.7c-2.305,1.345-4.885,2.017-7.74,2.017 c-3.473,0-5.923-1.054-7.351-3.161c-1.427-2.107-1.632-4.98-0.613-8.618c1.038-3.707,2.875-6.641,5.512-8.803 c2.637-2.163,5.678-3.244,9.123-3.244c3.555,0,6.04,1.099,7.456,3.298c1.417,2.198,1.582,5.234,0.498,9.109l-0.239,0.814 l-0.167,0.484H31.721c-0.441,1.575-0.438,2.777,0.01,3.606c0.448,0.829,1.332,1.244,2.65,1.244c0.975,0,1.836-0.206,2.583-0.617 S38.33,24.086,38.817,23.278z" id="path47"/>
<g id="g49">
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.673,16.742l8.351-0.021c0.375-1.436,0.308-2.558-0.201-3.365 s-1.402-1.211-2.68-1.211c-1.209,0-2.285,0.397-3.229,1.19S33.224,15.265,32.673,16.742z M38.817,23.278h7.043 c-1.347,2.456-3.172,4.356-5.477,5.7c-2.305,1.345-4.885,2.017-7.74,2.017c-3.473,0-5.923-1.054-7.351-3.161 c-1.427-2.107-1.632-4.98-0.613-8.618c1.038-3.707,2.875-6.641,5.512-8.803c2.637-2.163,5.678-3.244,9.123-3.244 c3.555,0,6.04,1.099,7.456,3.298c1.417,2.198,1.582,5.234,0.498,9.109l-0.239,0.814l-0.167,0.484H31.721 c-0.441,1.575-0.438,2.777,0.01,3.606c0.448,0.829,1.332,1.244,2.65,1.244c0.975,0,1.836-0.206,2.583-0.617 S38.33,24.086,38.817,23.278z" id="path51"/>
</g>
</g>
<g id="g53">
<path fill="#A0CE67" d="M112.881,30.643l-6.404-18.639l-6.455,18.639h-7.254l9.565-30.321h8.19l4.434,15.582l0.35,1.276 c0.521,1.866,0.917,3.431,1.191,4.693l0.555-2.182c0.219-0.837,0.528-1.935,0.925-3.293l4.468-16.076h8.19l-10.501,30.321 H112.881z" id="path55" style="fill:#8ed300;fill-opacity:1"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@ -0,0 +1,5 @@
<header>
<img :src="embeded['/assets/images/report-logo.svg']" alt="Verdnatura"/>
<section>{{$t('company.registry')}}</section>
<section>{{$t('company.fiscalAddress')}}</section>
</header>

View File

@ -0,0 +1,15 @@
module.exports = {
name: 'report-header',
created() {
const embeded = [];
this.files.map(file => {
embeded[file] = `file://${__dirname + file}`;
});
this.embeded = embeded;
},
data() {
return {
files: ['/assets/images/report-logo.svg'],
};
},
};

View File

@ -0,0 +1,10 @@
module.exports = {
messages: {
es: {
company: {
fiscalAddress: 'VERDNATURA LEVANTE SL, B97367486 Avda. Espioca, 100, 46460 Silla · www.verdnatura.es · clientes@verdnatura.es',
registry: `CIF: B97367486 Registro Mercantil de Valencia, Tomo 8041, Libro 5334, Folio 160, sección 8, Hoja V 102076`,
}
},
},
};