208 lines
7.5 KiB
JavaScript
Executable File
208 lines
7.5 KiB
JavaScript
Executable File
const config = require(`${appPath}/core/config`);
|
|
const db = require(`${appPath}/core/database`);
|
|
const Component = require(`${appPath}/core/component`);
|
|
const reportHeader = new Component('report-header');
|
|
const reportFooter = new Component('report-footer');
|
|
const md5 = require('md5');
|
|
|
|
module.exports = {
|
|
name: 'delivery-note',
|
|
async serverPrefetch() {
|
|
this.client = await this.fetchClient(this.ticketId);
|
|
this.ticket = await this.fetchTicket(this.ticketId);
|
|
this.sales = await this.fetchSales(this.ticketId);
|
|
this.address = await this.fetchAddress(this.ticketId);
|
|
this.services = await this.fetchServices(this.ticketId);
|
|
this.taxes = await this.fetchTaxes(this.ticketId);
|
|
this.packagings = await this.fetchPackagings(this.ticketId);
|
|
this.signature = await this.fetchSignature(this.ticketId);
|
|
|
|
if (!this.ticket)
|
|
throw new Error('Something went wrong');
|
|
},
|
|
data() {
|
|
return {totalBalance: 0.00};
|
|
},
|
|
computed: {
|
|
dmsPath() {
|
|
const pathHash = md5(this.signature.id.toString()).substring(0, 3);
|
|
const hostPath = `file:///${config.storage.root}/${pathHash}`;
|
|
|
|
if (this.signature && this.signature.id)
|
|
return `${hostPath}/${this.signature.id}.png`;
|
|
},
|
|
serviceTotal() {
|
|
let total = 0.00;
|
|
this.services.forEach(service => {
|
|
total += parseFloat(service.price) * service.quantity;
|
|
});
|
|
|
|
return total;
|
|
}
|
|
},
|
|
methods: {
|
|
fetchClient(ticketId) {
|
|
return db.findOne(
|
|
`SELECT
|
|
c.id,
|
|
c.socialName,
|
|
c.street,
|
|
c.fi
|
|
FROM ticket t
|
|
JOIN client c ON c.id = t.clientFk
|
|
WHERE t.id = ?`, [ticketId]);
|
|
},
|
|
fetchTicket(ticketId) {
|
|
return db.findOne(
|
|
`SELECT
|
|
t.id,
|
|
t.shipped,
|
|
t.companyFk
|
|
FROM ticket t
|
|
WHERE t.id = ?`, [ticketId]);
|
|
},
|
|
fetchAddress(ticketId) {
|
|
return db.findOne(
|
|
`SELECT
|
|
a.nickname,
|
|
a.street,
|
|
a.postalCode,
|
|
a.city,
|
|
p.name province
|
|
FROM ticket t
|
|
JOIN address a ON a.clientFk = t.clientFk
|
|
LEFT JOIN province p ON p.id = a.provinceFk
|
|
WHERE t.id = ?`, [ticketId]);
|
|
},
|
|
|
|
fetchSales(ticketId) {
|
|
return db.rawSql(
|
|
`SELECT
|
|
s.id,
|
|
s.itemFk,
|
|
s.concept,
|
|
s.quantity,
|
|
s.price,
|
|
s.price - SUM(IF(ctr.id = 6,
|
|
sc.value,
|
|
0)) netPrice,
|
|
s.discount,
|
|
i.size,
|
|
i.stems,
|
|
i.category,
|
|
it.id itemTypeId,
|
|
o.code AS origin,
|
|
i.inkFk,
|
|
s.ticketFk,
|
|
tcl.code vatType,
|
|
ibwg.ediBotanic, ppa.denomination, pp.number passportNumber,
|
|
be.isProtectedZone, c.code AS countryCode,
|
|
i.tag5, i.value5,
|
|
i.tag6, i.value6, i.tag7, i.value7
|
|
FROM vn.sale s
|
|
LEFT JOIN saleComponent sc ON sc.saleFk = s.id
|
|
LEFT JOIN component cr ON cr.id = sc.componentFk
|
|
LEFT JOIN componentType ctr ON ctr.id = cr.typeFk
|
|
LEFT JOIN item i ON i.id = s.itemFk
|
|
LEFT JOIN ticket t ON t.id = s.ticketFk
|
|
LEFT JOIN origin o ON o.id = i.originFk
|
|
LEFT JOIN country c ON c.id = o.countryFk
|
|
LEFT JOIN supplier sp ON sp.id = t.companyFk
|
|
LEFT JOIN itemType it ON it.id = i.typeFk
|
|
LEFT JOIN itemTaxCountry itc ON itc.itemFk = i.id
|
|
AND itc.countryFk = sp.countryFk
|
|
LEFT JOIN taxClass tcl ON tcl.id = itc.taxClassFk
|
|
LEFT JOIN plantpassport pp ON pp.producerFk = i.producerFk
|
|
LEFT JOIN plantpassportAuthority ppa ON ppa.id = pp.plantpassportAuthorityFk
|
|
LEFT JOIN itemBotanicalWithGenus ibwg ON ibwg.itemFk = i.id
|
|
LEFT JOIN botanicExport be ON be.restriction = 'pasaporte fitosanitario'
|
|
LEFT JOIN ediGenus eg ON eg.id = be.ediGenusFk
|
|
LEFT JOIN ediSpecie es ON es.id = be.ediSpecieFk
|
|
AND ibwg.ediBotanic LIKE CONCAT(
|
|
IFNULL(eg.latinGenusName, ''),
|
|
IF(es.latinSpeciesName > '',
|
|
CONCAT(' ', es.latinSpeciesName), ''),
|
|
'%')
|
|
WHERE s.ticketFk = ?
|
|
GROUP BY s.id
|
|
ORDER BY (it.isPackaging), s.concept, s.itemFk`, [ticketId]);
|
|
},
|
|
fetchTaxes(ticketId) {
|
|
return db.rawSql(`CALL vn.ticketGetTaxAdd(?)`, [ticketId]).then(rows => {
|
|
return rows[0];
|
|
});
|
|
},
|
|
fetchPackagings(ticketId) {
|
|
return db.rawSql(
|
|
`SELECT
|
|
tp.quantity,
|
|
i.name,
|
|
p.itemFk
|
|
FROM ticketPackaging tp
|
|
JOIN packaging p ON p.id = tp.packagingFk
|
|
JOIN item i ON i.id = p.itemFk
|
|
WHERE tp.ticketFk = ?
|
|
ORDER BY itemFk`, [ticketId]);
|
|
},
|
|
fetchServices(ticketId) {
|
|
return db.rawSql(
|
|
`SELECT
|
|
tc.description taxDescription,
|
|
ts.description,
|
|
ts.quantity,
|
|
ts.price
|
|
FROM ticketService ts
|
|
JOIN taxClass tc ON tc.id = ts.taxClassFk
|
|
WHERE ts.ticketFk = ?`, [ticketId]);
|
|
},
|
|
fetchSignature(ticketId) {
|
|
return db.findOne(
|
|
`SELECT
|
|
d.id,
|
|
d.created
|
|
FROM ticket t
|
|
JOIN ticketDms dt ON dt.ticketFk = t.id
|
|
JOIN dms d ON d.id = dt.dmsFk
|
|
AND d.file LIKE '%.png'
|
|
WHERE t.id = ?`, [ticketId]);
|
|
},
|
|
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();
|
|
},
|
|
},
|
|
components: {
|
|
'report-header': reportHeader.build(),
|
|
'report-footer': reportFooter.build()
|
|
},
|
|
props: {
|
|
ticketId: {
|
|
type: String,
|
|
required: true
|
|
}
|
|
}
|
|
};
|