const strftime = require('strftime'); const database = require(`${appPath}/lib/database`); const config = require(`${appPath}/lib/config.js`); const UserException = require(`${appPath}/lib/exceptions/userException`); const md5 = require('md5'); module.exports = { name: 'rpt-delivery-note', async asyncData(ctx, params) { Object.assign(this, this.methods); const [[client]] = await this.fetchClient(params.ticketFk); const [[ticket]] = await this.fetchTicket(params.ticketFk); const [[address]] = await this.fetchAddress(params.ticketFk); const [[signature]] = await this.fetchSignature(params.ticketFk); const [[taxes]] = await this.fetchTaxes(params.ticketFk); const [sales] = await this.fetchSales(params.ticketFk); const [packagings] = await this.fetchPackagings(params.ticketFk); const [services] = await this.fetchServices(params.ticketFk); if (!ticket) throw new UserException('No ticket data found'); return {client, ticket, address, sales, taxes, packagings, services, signature}; }, created() { if (this.client.locale) this.$i18n.locale = this.client.locale; }, 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`; }, shipped() { return strftime('%d-%m-%Y', this.ticket.shipped); }, serviceTotal() { let total = 0.00; this.services.forEach(service => { total += parseFloat(service.price) * service.quantity; }); return total; } }, filters: { currency(input, currency = 'EUR') { return new Intl.NumberFormat('es', { style: 'currency', currency }).format(parseFloat(input)); }, percent(input) { return new Intl.NumberFormat('es', { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(parseFloat(input)); }, date(input) { return strftime('%d-%m-%Y %H:%I:%S', input); } }, methods: { fetchClient(ticketFk) { return database.pool.query( `SELECT c.id, c.email AS recipient, c.socialName, c.street, c.fi, u.lang locale FROM ticket t JOIN client c ON c.id = t.clientFk JOIN account.user u ON u.id = c.id WHERE t.id = ?`, [ticketFk]); }, fetchTicket(ticketFk) { return database.pool.query( `SELECT t.id, t.shipped, t.companyFk FROM ticket t JOIN client c ON c.id = t.clientFk JOIN account.user u ON u.id = c.id WHERE t.id = ?`, [ticketFk]); }, fetchAddress(ticketFk) { return database.pool.query( `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 = ?`, [ticketFk]); }, fetchSales(ticketFk) { return database.pool.query( `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`, [ticketFk]); }, fetchTaxes(ticketFk) { return database.pool.query( `CALL vn.ticketGetTaxAdd(?)`, [ticketFk]); }, fetchPackagings(ticketFk) { return database.pool.query( `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`, [ticketFk]); }, fetchServices(ticketFk) { return database.pool.query( `SELECT tc.description taxDescription, ts.description, ts.quantity, ts.price FROM ticketService ts JOIN taxClass tc ON tc.id = ts.taxClassFk WHERE ts.ticketFk = ?`, [ticketFk]); }, fetchSignature(ticketFk) { return database.pool.query( `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 = ?`, [ticketFk]); }, 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': require('../report-header'), 'report-footer': require('../report-footer'), }, };