Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 1788-remove_autoload_vnTable
gitea/salix/pipeline/head There was a failure building this commit Details

This commit is contained in:
Carlos Jimenez Ruiz 2020-07-13 09:07:38 +02:00
commit 79e6871775
31 changed files with 2377 additions and 1126 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,8 @@ module.exports = Self => {
async function claimIsEditable(ctx) {
const loopBackContext = LoopBackContext.getCurrentContext();
const httpCtx = {req: loopBackContext.active};
const isEditable = await Self.app.models.Claim.isEditable(httpCtx, ctx.where.id);
const claimBeginning = await Self.findById(ctx.where.id);
const isEditable = await Self.app.models.Claim.isEditable(httpCtx, claimBeginning.claimFk);
if (!isEditable)
throw new UserError(`The current claim can't be modified`);

View File

@ -22,16 +22,25 @@ class Controller extends Section {
};
}
set salesClaimed(value) {
this._salesClaimed = value;
get claim() {
return this._claim;
}
set claim(value) {
this._claim = value;
if (value) {
this.calculateTotals();
this.isClaimEditable();
this.isTicketEditable();
}
}
set salesClaimed(value) {
this._salesClaimed = value;
if (value) this.calculateTotals();
}
get salesClaimed() {
return this._salesClaimed;
}

View File

@ -2,6 +2,7 @@
url="Clients/consumption"
link="{clientFk: $ctrl.$params.id}"
filter="::$ctrl.filter"
limit="20"
user-params="::$ctrl.filterParams"
data="sales"
order="itemTypeFk, itemName, itemSize">

View File

@ -51,7 +51,7 @@ module.exports = Self => {
stmt = new ParameterizedSQL(
`SELECT t.id AS ticketFk, c.id AS clientFk, c.name AS clientName, tw.weekDay,
wh.name AS warehouseName, u.id AS workerFk, u.nickName, tw.agencyModeFk
wh.name AS warehouseName, u.id AS workerFk, u.name AS userName, u.nickName, tw.agencyModeFk
FROM ticketWeekly tw
JOIN ticket t ON t.id = tw.ticketFk
JOIN client c ON c.id = t.clientFk

View File

@ -4,6 +4,6 @@ describe('ticket getTaxes()', () => {
it('should return the tax of a given ticket', async() => {
let result = await app.models.Ticket.getTaxes(1);
expect(result[0].tax).toEqual(77.54);
expect(result[0].tax).toEqual(7.1);
});
});

View File

@ -189,28 +189,26 @@
"state": "ticket.weekly.index",
"component": "vn-ticket-weekly-index",
"description": "Weekly tickets"
}, {
"url": "/request",
"state": "ticket.card.request",
"abstract": true,
"component": "ui-view"
}, {
"url": "/service",
"state": "ticket.card.service",
"component": "vn-ticket-service",
"description": "Service"
}, {
"url": "/request",
"state": "ticket.card.request",
"abstract": true,
"component": "ui-view"
}, {
"url" : "/index",
"state": "ticket.card.request.index",
"component": "vn-ticket-request-index",
"description": "Purchase request",
"acl": ["salesPerson"]
"description": "Purchase request"
}, {
"url" : "/create",
"state": "ticket.card.request.create",
"component": "vn-ticket-request-create",
"description": "New purchase request",
"acl": ["salesPerson"]
"description": "New purchase request"
}, {
"url": "/create?clientFk",
"state": "ticket.create",

View File

@ -18,13 +18,13 @@
</vn-portal>
<vn-data-viewer
model="model"
class="vn-w-md vn-mb-xl">
class="vn-w-xl">
<vn-card>
<vn-table model="model">
<vn-thead>
<vn-tr>
<vn-th field="ticketFk" number>Ticket ID</vn-th>
<vn-th field="weekDay">Client</vn-th>
<vn-th field="clientName">Client</vn-th>
<vn-th>Weekday</vn-th>
<vn-th>Agency</vn-th>
<vn-th>Warehouse</vn-th>
@ -53,7 +53,7 @@
</span>
</vn-td>
<vn-td vn-click-stop>
<vn-autocomplete
<vn-autocomplete
vn-id="weekday"
ng-model="weekly.weekDay"
data="$ctrl.weekdays"
@ -82,7 +82,7 @@
<span
vn-click-stop="workerDescriptor.show($event, weekly.workerFk)"
class="link" >
{{::weekly.nickName}}
{{::weekly.userName}}
</span>
</vn-td>
<vn-td shrink>

View File

@ -3,4 +3,5 @@ Weekly tickets: Tickets programados
You are going to delete this weekly ticket: Vas a eliminar este ticket programado
This ticket will be removed from weekly tickets! Continue anyway?: Este ticket se eliminará de tickets programados! ¿Continuar de todas formas?
Search weekly ticket by id or client id: Busca tickets programados por el identificador o el identificador del cliente
Search by weekly ticket: Buscar por tickets programados
Search by weekly ticket: Buscar por tickets programados
weekDay: Dia

View File

@ -157,22 +157,6 @@ 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%
@ -188,6 +172,7 @@ thead, tbody tr {
}
.column-oriented thead {
display: table-header-group;
background-color: #e5e5e5
}
@ -197,18 +182,24 @@ thead, tbody tr {
background-color: #e5e5e5
}
.column-oriented tfoot {
display: table-row-group;
page-break-inside: avoid;
break-inside: avoid;
}
.column-oriented tbody {
border-bottom: 1px solid #DDD;
}
.column-oriented tfoot {
border-top: 2px solid #808080;
}
.column-oriented tfoot tr:first-child td {
padding-top: 20px !important;
}
.column-oriented tfoot tr:first-child {
border-top: 2px solid #808080;
}
.column-oriented .description {
font-size: 0.8em
}

View File

@ -3,12 +3,12 @@
*
*/
body {
zoom: 0.53
zoom: 0.70;
}
.title {
margin-bottom: 20px;
font-weight: 100;
margin-top: 0;
font-size: 2em
font-size: 2em;
margin-top: 0
}

View File

@ -13,10 +13,14 @@
},
"pdf": {
"format": "A4",
"border": "1.5cm",
"footer": {
"height": "55px"
}
"margin": {
"top": "1.5cm",
"right": "1.5cm",
"bottom": "3cm",
"left": "1.5cm"
},
"displayHeaderFooter": true,
"printBackground": true
},
"mysql": {
"host": "localhost",

View File

@ -1,11 +1,13 @@
footer {
.footer {
font-family: "Roboto", "Helvetica", "Arial", sans-serif;
font-size: 0.55em;
margin-left: 2cm;
margin-right: 2cm;
font-size: 10px;
color: #555;
zoom: 0.65
}
footer, footer p {
.footer p {
text-align: center
}
@ -13,12 +15,20 @@ p.privacy {
font-size: 0.8em
}
footer .page {
.footer .page {
border-bottom: 2px solid #CCC;
padding-bottom: 2px
}
footer .page > section {
.page .centerText {
text-align: center
}
.page .pageCount {
text-align: right
}
.footer .page > div {
display: inline-block;
width: 33%
}

View File

@ -1,4 +1,4 @@
numPages: Page {{page}} of {{pages}}
numPages: Page <span class="pageNumber"></span> of <span class="totalPages"></span>
law:
privacy: 'In compliance with the provisions of Organic Law 15/1999, on the
Protection of Personal Data, we inform you that the personal data you provide

View File

@ -1,4 +1,4 @@
numPages: Página {{page}} de {{pages}}
numPages: Página <span class="pageNumber"></span> de <span class="totalPages"></span>
law:
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

View File

@ -1,4 +1,4 @@
numPages: Page {{page}} de {{pages}}
numPages: Page <span class="pageNumber"></span> de <span class="totalPages"></span>
law:
privacy: Conformément aux dispositions de la loi organique 15/1999 sur la protection
des données personnelles, nous vous informons que les données personnelles que

View File

@ -1,4 +1,4 @@
numPages: Página {{page}} de {{pages}}
numPages: Página <span class="pageNumber"></span> de <span class="totalPages"></span>
law:
privacy: Em cumprimento do disposto na lei Orgânica 15/1999, de Protecção de Dados
de Carácter Pessoal, comunicamos que os dados pessoais que facilite se incluirão

View File

@ -1,9 +1,11 @@
<footer>
<section class="page">
<section v-if="leftText">{{leftText}}</section>
<section v-if="centerText" class="uppercase">{{centerText}}</section>
<section class="number">{{$t('numPages')}}</section>
</section>
<p class="phytosanitary" v-if="showPhytosanitary">{{phytosanitary}}</p>
<p class="privacy" v-html="$t('law.privacy')"></p>
</footer>
<div>
<div class="footer">
<div class="page">
<div class="leftText" v-if="leftText">{{leftText}}</div>
<div class="centerText" v-if="centerText" class="uppercase">{{centerText}}</div>
<div class="pageCount" v-html="$t('numPages')"></div>
</div>
<p class="phytosanitary" v-if="showPhytosanitary">{{phytosanitary}}</p>
<p class="privacy" v-html="$t('law.privacy')"></p>
</div>
</div>

View File

@ -4,7 +4,7 @@ header {
padding-bottom: 10px;
margin-bottom: 20px;
text-align: center;
font-size: 0.55em;
font-size: 12px;
color: #555
}

View File

@ -1,5 +1,5 @@
const fs = require('fs');
const pdf = require('html-pdf');
const puppeteer = require('puppeteer');
const path = require('path');
const config = require('./config');
const Component = require('./component');
@ -20,18 +20,36 @@ class Report extends Component {
async toPdfStream() {
const template = await this.render();
let options = config.pdf;
const defaultOptions = Object.assign({}, config.pdf);
const optionsPath = `${this.path}/options.json`;
const fullPath = path.resolve(__dirname, optionsPath);
let options = defaultOptions;
if (fs.existsSync(fullPath))
options = Object.assign(options, require(optionsPath));
options = require(optionsPath);
return new Promise(resolve => {
pdf.create(template, options).toStream((err, stream) => {
resolve(stream);
});
});
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.setContent(template);
const element = await page.$('#pageFooter');
let footer = '\n';
if (element) {
footer = await page.evaluate(el => {
const html = el.innerHTML;
el.remove();
return html;
}, element);
}
options.headerTemplate = '\n';
options.footerTemplate = footer;
const buffer = await page.pdf(options);
await browser.close();
return buffer;
}
}

View File

@ -10,8 +10,7 @@ module.exports = app => {
res.setHeader('Content-type', 'application/pdf');
res.setHeader('Content-Disposition', `inline; filename="${fileName}"`);
stream.pipe(res);
res.end(stream);
} catch (error) {
next(error);
}

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -93,15 +89,11 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -85,15 +81,11 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('claim', [claimId])"
v-bind:center-text="client.name"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('claim', [claimId])"
v-bind:center-text="client.name"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,13 +6,9 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"
v-bind:company-code="ticket.companyCode">
</report-header>
</div>
</div>
<report-header v-bind="$props"
v-bind:company-code="ticket.companyCode">
</report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -241,17 +237,13 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:company-code="ticket.companyCode"
v-bind:show-phytosanitary="true"
v-bind:left-text="$t('ticket', [ticket.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:company-code="ticket.companyCode"
v-bind:show-phytosanitary="true"
v-bind:left-text="$t('ticket', [ticket.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -154,14 +150,10 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('routeId', [route.id])"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('routeId', [route.id])"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,13 +6,9 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"
v-bind:company-code="entry.companyCode">
</report-header>
</div>
</div>
<report-header v-bind="$props"
v-bind:company-code="entry.companyCode">
</report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -126,16 +122,12 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('entry', [entry.id])"
v-bind:company-code="entry.companyCode"
v-bind:center-text="supplier.name"
v-bind:="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('entry', [entry.id])"
v-bind:company-code="entry.companyCode"
v-bind:center-text="supplier.name"
v-bind:="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -1,10 +1,11 @@
{
"format": "A4",
"orientation": "landscape",
"width": "10.4cm",
"height": "4.8cm",
"border": "0cm",
"footer": {
"height": "0"
}
"margin": {
"top": "0cm",
"right": "0cm",
"bottom": "0cm",
"left": "0cm"
},
"printBackground": true
}

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -74,24 +70,23 @@
<tr>
<td></td>
<td></td>
<td class="number"><strong class="pull-left">Total</strong> {{getTotalDebtOut()}}</td>
<td class="number">{{getTotalDebtIn()}}</td>
<td class="number">{{totalBalance}}</td>
<td class="number">
<strong class="pull-left">Total</strong>
{{getTotalDebtOut() | currency('EUR', $i18n.locale)}}
</td>
<td class="number">{{getTotalDebtIn() | currency('EUR', $i18n.locale)}}</td>
<td class="number">{{totalBalance | currency('EUR', $i18n.locale)}}</td>
</tr>
</tfoot>
</table>
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -36,15 +32,11 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('client', [client.id])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>

View File

@ -6,11 +6,7 @@
<tr>
<td>
<!-- Header block -->
<div class="grid-row">
<div class="grid-block">
<report-header v-bind="$props"></report-header>
</div>
</div>
<report-header v-bind="$props"></report-header>
<!-- Block -->
<div class="grid-row">
<div class="grid-block">
@ -166,15 +162,11 @@
</div>
</div>
<!-- Footer block -->
<div class="grid-row">
<div class="grid-block">
<report-footer id="pageFooter"
v-bind:left-text="$t('order', [supplier.mandateCode])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</div>
</div>
<report-footer id="pageFooter"
v-bind:left-text="$t('order', [supplier.mandateCode])"
v-bind:center-text="client.socialName"
v-bind="$props">
</report-footer>
</td>
</tr>
</tbody>