CSV refactor
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
parent
3b0f1efbf4
commit
21bb95fc88
|
@ -10,7 +10,7 @@ class Email {
|
||||||
/**
|
/**
|
||||||
* Sends an email displaying a notification when it's sent.
|
* Sends an email displaying a notification when it's sent.
|
||||||
*
|
*
|
||||||
* @param {String} template The email report name
|
* @param {String} path The email report name
|
||||||
* @param {Object} params The email parameters
|
* @param {Object} params The email parameters
|
||||||
* @return {Promise} Promise resolved when it's sent
|
* @return {Promise} Promise resolved when it's sent
|
||||||
*/
|
*/
|
||||||
|
@ -18,18 +18,6 @@ class Email {
|
||||||
return this.$http.post(path, params)
|
return this.$http.post(path, params)
|
||||||
.then(() => this.vnApp.showMessage(this.$t('Notification sent!')));
|
.then(() => this.vnApp.showMessage(this.$t('Notification sent!')));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sends an email displaying a notification when it's sent.
|
|
||||||
*
|
|
||||||
* @param {String} template The email report name
|
|
||||||
* @param {Object} params The email parameters
|
|
||||||
* @return {Promise} Promise resolved when it's sent
|
|
||||||
*/
|
|
||||||
sendCsv(template, params) {
|
|
||||||
return this.$http.get(`csv/${template}/send`, {params})
|
|
||||||
.then(() => this.vnApp.showMessage(this.$t('Notification sent!')));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Email.$inject = ['$http', '$translate', 'vnApp'];
|
Email.$inject = ['$http', '$translate', 'vnApp'];
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Report {
|
||||||
* Shows a report in another window, automatically adds the authorization
|
* Shows a report in another window, automatically adds the authorization
|
||||||
* token to params.
|
* token to params.
|
||||||
*
|
*
|
||||||
* @param {String} report The report name
|
* @param {String} path The report name
|
||||||
* @param {Object} params The report parameters
|
* @param {Object} params The report parameters
|
||||||
*/
|
*/
|
||||||
show(path, params) {
|
show(path, params) {
|
||||||
|
@ -20,21 +20,6 @@ class Report {
|
||||||
const serializedParams = this.$httpParamSerializer(params);
|
const serializedParams = this.$httpParamSerializer(params);
|
||||||
window.open(`api/${path}?${serializedParams}`);
|
window.open(`api/${path}?${serializedParams}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Shows a report in another window, automatically adds the authorization
|
|
||||||
* token to params.
|
|
||||||
*
|
|
||||||
* @param {String} report The report name
|
|
||||||
* @param {Object} params The report parameters
|
|
||||||
*/
|
|
||||||
showCsv(report, params) {
|
|
||||||
params = Object.assign({
|
|
||||||
authorization: this.vnToken.token
|
|
||||||
}, params);
|
|
||||||
const serializedParams = this.$httpParamSerializer(params);
|
|
||||||
window.open(`api/csv/${report}/download?${serializedParams}`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Report.$inject = ['$httpParamSerializer', 'vnToken'];
|
Report.$inject = ['$httpParamSerializer', 'vnToken'];
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
/**
|
||||||
|
* Transforms an object to a raw data CSV file.
|
||||||
|
*
|
||||||
|
* @param {Object} rows Data
|
||||||
|
* @return {String} Formatted CSV data
|
||||||
|
*/
|
||||||
function toCSV(rows) {
|
function toCSV(rows) {
|
||||||
const [columns] = rows;
|
const [columns] = rows;
|
||||||
let content = Object.keys(columns).join('\t');
|
let content = Object.keys(columns).join('\t');
|
|
@ -0,0 +1,85 @@
|
||||||
|
const {toCSV} = require('vn-loopback/util/csv');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('invoiceCsv', {
|
||||||
|
description: 'Returns the delivery note csv',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'reference',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
description: 'The invoice reference',
|
||||||
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipientId',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The client id',
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: [
|
||||||
|
{
|
||||||
|
arg: 'body',
|
||||||
|
type: 'file',
|
||||||
|
root: true
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Type',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Disposition',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: '/:reference/invoice-csv',
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.invoiceCsv = async reference => {
|
||||||
|
const sales = await Self.rawSql(`
|
||||||
|
SELECT io.ref Invoice,
|
||||||
|
io.issued InvoiceDate,
|
||||||
|
s.ticketFk Ticket,
|
||||||
|
s.itemFk Item,
|
||||||
|
s.concept Description,
|
||||||
|
i.size,
|
||||||
|
i.subName Producer,
|
||||||
|
s.quantity Quantity,
|
||||||
|
s.price Price,
|
||||||
|
s.discount Discount,
|
||||||
|
s.created Created,
|
||||||
|
tc.code Taxcode,
|
||||||
|
tc.description TaxDescription,
|
||||||
|
i.tag5,
|
||||||
|
i.value5,
|
||||||
|
i.tag6,
|
||||||
|
i.value6,
|
||||||
|
i.tag7,
|
||||||
|
i.value7,
|
||||||
|
i.tag8,
|
||||||
|
i.value8,
|
||||||
|
i.tag9,
|
||||||
|
i.value9,
|
||||||
|
i.tag10,
|
||||||
|
i.value10
|
||||||
|
FROM sale s
|
||||||
|
JOIN ticket t ON t.id = s.ticketFk
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN supplier s2 ON s2.id = t.companyFk
|
||||||
|
JOIN itemTaxCountry itc ON itc.itemFk = i.id
|
||||||
|
AND itc.countryFk = s2.countryFk
|
||||||
|
JOIN taxClass tc ON tc.id = itc.taxClassFk
|
||||||
|
JOIN invoiceOut io ON io.ref = t.refFk
|
||||||
|
WHERE t.refFk = ?
|
||||||
|
ORDER BY s.ticketFk, s.created`, [reference]);
|
||||||
|
|
||||||
|
const content = toCSV(sales);
|
||||||
|
|
||||||
|
return [content, 'text/csv', `inline; filename="doc-${reference}.pdf"`];
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,117 @@
|
||||||
|
const {Email} = require('vn-print');
|
||||||
|
const {toCSV} = require('vn-loopback/util/csv');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('invoiceCsvEmail', {
|
||||||
|
description: 'Returns the delivery note csv',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'reference',
|
||||||
|
type: 'string',
|
||||||
|
required: true,
|
||||||
|
description: 'The invoice reference',
|
||||||
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipient',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The recipient email',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'replyTo',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The sender email to reply to',
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipientId',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The client id',
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: [
|
||||||
|
{
|
||||||
|
arg: 'body',
|
||||||
|
type: 'file',
|
||||||
|
root: true
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Type',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Disposition',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: '/:reference/invoice-csv-email',
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.invoiceCsvEmail = async(ctx, reference) => {
|
||||||
|
const args = Object.assign({}, ctx.args);
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
recipient: args.recipient,
|
||||||
|
lang: ctx.req.getLocale()
|
||||||
|
};
|
||||||
|
|
||||||
|
delete args.ctx;
|
||||||
|
for (const param in args)
|
||||||
|
params[param] = args[param];
|
||||||
|
|
||||||
|
const sales = await Self.rawSql(`
|
||||||
|
SELECT io.ref Invoice,
|
||||||
|
io.issued InvoiceDate,
|
||||||
|
s.ticketFk Ticket,
|
||||||
|
s.itemFk Item,
|
||||||
|
s.concept Description,
|
||||||
|
i.size,
|
||||||
|
i.subName Producer,
|
||||||
|
s.quantity Quantity,
|
||||||
|
s.price Price,
|
||||||
|
s.discount Discount,
|
||||||
|
s.created Created,
|
||||||
|
tc.code Taxcode,
|
||||||
|
tc.description TaxDescription,
|
||||||
|
i.tag5,
|
||||||
|
i.value5,
|
||||||
|
i.tag6,
|
||||||
|
i.value6,
|
||||||
|
i.tag7,
|
||||||
|
i.value7,
|
||||||
|
i.tag8,
|
||||||
|
i.value8,
|
||||||
|
i.tag9,
|
||||||
|
i.value9,
|
||||||
|
i.tag10,
|
||||||
|
i.value10
|
||||||
|
FROM sale s
|
||||||
|
JOIN ticket t ON t.id = s.ticketFk
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN supplier s2 ON s2.id = t.companyFk
|
||||||
|
JOIN itemTaxCountry itc ON itc.itemFk = i.id
|
||||||
|
AND itc.countryFk = s2.countryFk
|
||||||
|
JOIN taxClass tc ON tc.id = itc.taxClassFk
|
||||||
|
JOIN invoiceOut io ON io.ref = t.refFk
|
||||||
|
WHERE t.refFk = ?
|
||||||
|
ORDER BY s.ticketFk, s.created`, [reference]);
|
||||||
|
|
||||||
|
const content = toCSV(sales);
|
||||||
|
const fileName = `invoice_${reference}.csv`;
|
||||||
|
const email = new Email('invoice', params);
|
||||||
|
|
||||||
|
return email.send({
|
||||||
|
overrideAttachments: true,
|
||||||
|
attachments: [{
|
||||||
|
filename: fileName,
|
||||||
|
content: content
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
|
@ -12,4 +12,6 @@ module.exports = Self => {
|
||||||
require('../methods/invoiceOut/invoiceEmail')(Self);
|
require('../methods/invoiceOut/invoiceEmail')(Self);
|
||||||
require('../methods/invoiceOut/exportationPdf')(Self);
|
require('../methods/invoiceOut/exportationPdf')(Self);
|
||||||
require('../methods/invoiceOut/sendQueued')(Self);
|
require('../methods/invoiceOut/sendQueued')(Self);
|
||||||
|
require('../methods/invoiceOut/invoiceCsv')(Self);
|
||||||
|
require('../methods/invoiceOut/invoiceCsvEmail')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -81,13 +81,6 @@ class Controller extends Section {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
showCsvInvoice() {
|
|
||||||
this.vnReport.showCsv('invoice', {
|
|
||||||
recipientId: this.invoiceOut.client.id,
|
|
||||||
refFk: this.invoiceOut.ref
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
sendPdfInvoice($data) {
|
sendPdfInvoice($data) {
|
||||||
if (!$data.email)
|
if (!$data.email)
|
||||||
return this.vnApp.showError(this.$t(`The email can't be empty`));
|
return this.vnApp.showError(this.$t(`The email can't be empty`));
|
||||||
|
@ -98,14 +91,19 @@ class Controller extends Section {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showCsvInvoice() {
|
||||||
|
this.vnReport.show(`InvoiceOuts/${this.invoiceOut.ref}/invoice-csv`, {
|
||||||
|
recipientId: this.invoiceOut.client.id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
sendCsvInvoice($data) {
|
sendCsvInvoice($data) {
|
||||||
if (!$data.email)
|
if (!$data.email)
|
||||||
return this.vnApp.showError(this.$t(`The email can't be empty`));
|
return this.vnApp.showError(this.$t(`The email can't be empty`));
|
||||||
|
|
||||||
return this.vnEmail.sendCsv('invoice', {
|
return this.vnEmail.send(`InvoiceOuts/${this.invoiceOut.ref}/invoice-csv-email`, {
|
||||||
recipientId: this.invoiceOut.client.id,
|
recipientId: this.invoiceOut.client.id,
|
||||||
recipient: $data.email,
|
recipient: $data.email
|
||||||
refFk: this.invoiceOut.ref
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
const {toCSV} = require('vn-loopback/util/csv');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('deliveryNoteCsv', {
|
||||||
|
description: 'Returns the delivery note csv',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The ticket id',
|
||||||
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipientId',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The client id',
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: [
|
||||||
|
{
|
||||||
|
arg: 'body',
|
||||||
|
type: 'file',
|
||||||
|
root: true
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Type',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Disposition',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: '/:id/delivery-note-csv',
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.deliveryNoteCsv = async id => {
|
||||||
|
const sales = await Self.rawSql(`
|
||||||
|
SELECT io.ref Invoice,
|
||||||
|
io.issued InvoiceDate,
|
||||||
|
s.ticketFk Ticket,
|
||||||
|
s.itemFk Item,
|
||||||
|
s.concept Description,
|
||||||
|
i.size,
|
||||||
|
i.subName Producer,
|
||||||
|
s.quantity Quantity,
|
||||||
|
s.price Price,
|
||||||
|
s.discount Discount,
|
||||||
|
s.created Created,
|
||||||
|
tc.code Taxcode,
|
||||||
|
tc.description TaxDescription,
|
||||||
|
i.tag5,
|
||||||
|
i.value5,
|
||||||
|
i.tag6,
|
||||||
|
i.value6,
|
||||||
|
i.tag7,
|
||||||
|
i.value7,
|
||||||
|
i.tag8,
|
||||||
|
i.value8,
|
||||||
|
i.tag9,
|
||||||
|
i.value9,
|
||||||
|
i.tag10,
|
||||||
|
i.value10
|
||||||
|
FROM vn.sale s
|
||||||
|
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.supplier s2 ON s2.id = t.companyFk
|
||||||
|
JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id
|
||||||
|
AND itc.countryFk = s2.countryFk
|
||||||
|
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
|
||||||
|
LEFT JOIN vn.invoiceOut io ON io.id = t.refFk
|
||||||
|
WHERE s.ticketFk = ?
|
||||||
|
ORDER BY s.ticketFk, s.created`, [id]);
|
||||||
|
const content = toCSV(sales);
|
||||||
|
|
||||||
|
return [content, 'text/csv', `inline; filename="doc-${id}.pdf"`];
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,117 @@
|
||||||
|
const {Email} = require('vn-print');
|
||||||
|
const {toCSV} = require('vn-loopback/util/csv');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('deliveryNoteCsvEmail', {
|
||||||
|
description: 'Returns the delivery note csv',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The ticket id',
|
||||||
|
http: {source: 'path'}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipient',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The recipient email',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'replyTo',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The sender email to reply to',
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipientId',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The client id',
|
||||||
|
required: false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: [
|
||||||
|
{
|
||||||
|
arg: 'body',
|
||||||
|
type: 'file',
|
||||||
|
root: true
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Type',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}, {
|
||||||
|
arg: 'Content-Disposition',
|
||||||
|
type: 'String',
|
||||||
|
http: {target: 'header'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: '/:id/delivery-note-csv-email',
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.deliveryNoteCsvEmail = async(ctx, id) => {
|
||||||
|
const args = Object.assign({}, ctx.args);
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
recipient: args.recipient,
|
||||||
|
lang: ctx.req.getLocale()
|
||||||
|
};
|
||||||
|
|
||||||
|
delete args.ctx;
|
||||||
|
for (const param in args)
|
||||||
|
params[param] = args[param];
|
||||||
|
|
||||||
|
const sales = await Self.rawSql(`
|
||||||
|
SELECT io.ref Invoice,
|
||||||
|
io.issued InvoiceDate,
|
||||||
|
s.ticketFk Ticket,
|
||||||
|
s.itemFk Item,
|
||||||
|
s.concept Description,
|
||||||
|
i.size,
|
||||||
|
i.subName Producer,
|
||||||
|
s.quantity Quantity,
|
||||||
|
s.price Price,
|
||||||
|
s.discount Discount,
|
||||||
|
s.created Created,
|
||||||
|
tc.code Taxcode,
|
||||||
|
tc.description TaxDescription,
|
||||||
|
i.tag5,
|
||||||
|
i.value5,
|
||||||
|
i.tag6,
|
||||||
|
i.value6,
|
||||||
|
i.tag7,
|
||||||
|
i.value7,
|
||||||
|
i.tag8,
|
||||||
|
i.value8,
|
||||||
|
i.tag9,
|
||||||
|
i.value9,
|
||||||
|
i.tag10,
|
||||||
|
i.value10
|
||||||
|
FROM vn.sale s
|
||||||
|
JOIN vn.ticket t ON t.id = s.ticketFk
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.supplier s2 ON s2.id = t.companyFk
|
||||||
|
JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id
|
||||||
|
AND itc.countryFk = s2.countryFk
|
||||||
|
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
|
||||||
|
LEFT JOIN vn.invoiceOut io ON io.id = t.refFk
|
||||||
|
WHERE s.ticketFk = ?
|
||||||
|
ORDER BY s.ticketFk, s.created`, [id]);
|
||||||
|
|
||||||
|
const content = toCSV(sales);
|
||||||
|
const fileName = `ticket_${id}.csv`;
|
||||||
|
const email = new Email('delivery-note', params);
|
||||||
|
|
||||||
|
return email.send({
|
||||||
|
overrideAttachments: true,
|
||||||
|
attachments: [{
|
||||||
|
filename: fileName,
|
||||||
|
content: content
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
|
@ -27,6 +27,8 @@ module.exports = function(Self) {
|
||||||
require('../methods/ticket/refund')(Self);
|
require('../methods/ticket/refund')(Self);
|
||||||
require('../methods/ticket/deliveryNotePdf')(Self);
|
require('../methods/ticket/deliveryNotePdf')(Self);
|
||||||
require('../methods/ticket/deliveryNoteEmail')(Self);
|
require('../methods/ticket/deliveryNoteEmail')(Self);
|
||||||
|
require('../methods/ticket/deliveryNoteCsv')(Self);
|
||||||
|
require('../methods/ticket/deliveryNoteCsvEmail')(Self);
|
||||||
require('../methods/ticket/closeAll')(Self);
|
require('../methods/ticket/closeAll')(Self);
|
||||||
require('../methods/ticket/closeByTicket')(Self);
|
require('../methods/ticket/closeByTicket')(Self);
|
||||||
require('../methods/ticket/closeByAgency')(Self);
|
require('../methods/ticket/closeByAgency')(Self);
|
||||||
|
|
|
@ -140,17 +140,15 @@ class Controller extends Section {
|
||||||
}
|
}
|
||||||
|
|
||||||
showCsvDeliveryNote() {
|
showCsvDeliveryNote() {
|
||||||
this.vnReport.showCsv('delivery-note', {
|
this.vnReport.show(`tickets/${this.id}/delivery-note-csv`, {
|
||||||
recipientId: this.ticket.client.id,
|
recipientId: this.ticket.client.id
|
||||||
ticketId: this.id,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
sendCsvDeliveryNote($data) {
|
sendCsvDeliveryNote($data) {
|
||||||
return this.vnEmail.sendCsv('delivery-note', {
|
return this.vnEmail.send(`tickets/${this.id}/delivery-note-csv-email`, {
|
||||||
recipientId: this.ticket.client.id,
|
recipientId: this.ticket.client.id,
|
||||||
recipient: $data.email,
|
recipient: $data.email
|
||||||
ticketId: this.id
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
const db = require('./database');
|
|
||||||
|
|
||||||
module.exports = app => {
|
|
||||||
const routes = require('../methods/routes');
|
|
||||||
|
|
||||||
const paths = routes.map(route => route.url);
|
|
||||||
|
|
||||||
app.use(paths, async function(request, response, next) {
|
|
||||||
try {
|
|
||||||
const token = getToken(request);
|
|
||||||
const query = `SELECT at.id, at.userId, eu.email, u.lang, at.ttl, at.created
|
|
||||||
FROM salix.AccessToken at
|
|
||||||
JOIN account.user u ON u.id = at.userid
|
|
||||||
JOIN account.emailUser eu ON eu.userFk = u.id
|
|
||||||
WHERE at.id = ?`;
|
|
||||||
|
|
||||||
const auth = await db.findOne(query, [token]);
|
|
||||||
|
|
||||||
if (!auth || isTokenExpired(auth.created, auth.ttl))
|
|
||||||
throw new Error('Invalid authorization token');
|
|
||||||
|
|
||||||
const args = Object.assign({}, request.query);
|
|
||||||
const props = Object.assign(args, request.body);
|
|
||||||
props.authorization = auth.id;
|
|
||||||
|
|
||||||
response.locals = props;
|
|
||||||
response.locals.auth = {
|
|
||||||
userId: auth.userId,
|
|
||||||
token: auth.id,
|
|
||||||
email: auth.email,
|
|
||||||
locale: auth.lang
|
|
||||||
};
|
|
||||||
|
|
||||||
next();
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Register routes
|
|
||||||
for (let route of routes)
|
|
||||||
app.use(route.url, route.cb);
|
|
||||||
|
|
||||||
function getToken(request) {
|
|
||||||
const headers = request.headers;
|
|
||||||
const queryParams = request.query;
|
|
||||||
|
|
||||||
return headers.authorization || queryParams.authorization;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isTokenExpired(created, ttl) {
|
|
||||||
const date = new Date(created);
|
|
||||||
const currentDate = new Date();
|
|
||||||
|
|
||||||
date.setSeconds(date.getSeconds() + ttl);
|
|
||||||
|
|
||||||
if (currentDate > date)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,24 +0,0 @@
|
||||||
const path = require('path');
|
|
||||||
const db = require('vn-print/core/database');
|
|
||||||
|
|
||||||
const {toCSV} = require('../csv');
|
|
||||||
const sqlPath = path.join(__dirname, 'sql');
|
|
||||||
|
|
||||||
module.exports = async function(request, response, next) {
|
|
||||||
try {
|
|
||||||
const reqArgs = request.query;
|
|
||||||
if (!reqArgs.ticketId)
|
|
||||||
throw new Error('The argument ticketId is required');
|
|
||||||
|
|
||||||
const ticketId = reqArgs.ticketId;
|
|
||||||
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [ticketId]);
|
|
||||||
const content = toCSV(sales);
|
|
||||||
const fileName = `ticket_${ticketId}.csv`;
|
|
||||||
|
|
||||||
response.setHeader('Content-type', 'text/csv');
|
|
||||||
response.setHeader('Content-Disposition', `inline; filename="${fileName}"`);
|
|
||||||
response.end(content);
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,40 +0,0 @@
|
||||||
const path = require('path');
|
|
||||||
const db = require('vn-print/core/database');
|
|
||||||
const Email = require('vn-print/core/email');
|
|
||||||
|
|
||||||
const {toCSV} = require('../csv');
|
|
||||||
const sqlPath = path.join(__dirname, 'sql');
|
|
||||||
|
|
||||||
module.exports = async function(request, response, next) {
|
|
||||||
try {
|
|
||||||
const reqArgs = request.query;
|
|
||||||
if (!reqArgs.ticketId)
|
|
||||||
throw new Error('The argument ticketId is required');
|
|
||||||
|
|
||||||
const ticketId = reqArgs.ticketId;
|
|
||||||
const ticket = await db.findOneFromDef(`${sqlPath}/ticket`, [ticketId]);
|
|
||||||
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [ticketId]);
|
|
||||||
|
|
||||||
const args = Object.assign({
|
|
||||||
ticketId: (String(ticket.id)),
|
|
||||||
recipientId: ticket.clientFk,
|
|
||||||
recipient: ticket.recipient,
|
|
||||||
replyTo: ticket.salesPersonEmail
|
|
||||||
}, response.locals);
|
|
||||||
|
|
||||||
const content = toCSV(sales);
|
|
||||||
const fileName = `ticket_${ticketId}.csv`;
|
|
||||||
const email = new Email('delivery-note', args);
|
|
||||||
await email.send({
|
|
||||||
overrideAttachments: true,
|
|
||||||
attachments: [{
|
|
||||||
filename: fileName,
|
|
||||||
content: content
|
|
||||||
}]
|
|
||||||
});
|
|
||||||
|
|
||||||
response.status(200).json({message: 'Success'});
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,35 +0,0 @@
|
||||||
SELECT io.ref Invoice,
|
|
||||||
io.issued InvoiceDate,
|
|
||||||
s.ticketFk Ticket,
|
|
||||||
s.itemFk Item,
|
|
||||||
s.concept Description,
|
|
||||||
i.size,
|
|
||||||
i.subName Producer,
|
|
||||||
s.quantity Quantity,
|
|
||||||
s.price Price,
|
|
||||||
s.discount Discount,
|
|
||||||
s.created Created,
|
|
||||||
tc.code Taxcode,
|
|
||||||
tc.description TaxDescription,
|
|
||||||
i.tag5,
|
|
||||||
i.value5,
|
|
||||||
i.tag6,
|
|
||||||
i.value6,
|
|
||||||
i.tag7,
|
|
||||||
i.value7,
|
|
||||||
i.tag8,
|
|
||||||
i.value8,
|
|
||||||
i.tag9,
|
|
||||||
i.value9,
|
|
||||||
i.tag10,
|
|
||||||
i.value10
|
|
||||||
FROM vn.sale s
|
|
||||||
JOIN vn.ticket t ON t.id = s.ticketFk
|
|
||||||
JOIN vn.item i ON i.id = s.itemFk
|
|
||||||
JOIN vn.supplier s2 ON s2.id = t.companyFk
|
|
||||||
JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id
|
|
||||||
AND itc.countryFk = s2.countryFk
|
|
||||||
JOIN vn.taxClass tc ON tc.id = itc.taxClassFk
|
|
||||||
LEFT JOIN vn.invoiceOut io ON io.id = t.refFk
|
|
||||||
WHERE s.ticketFk = ?
|
|
||||||
ORDER BY s.ticketFk, s.created
|
|
|
@ -1,9 +0,0 @@
|
||||||
SELECT
|
|
||||||
t.id,
|
|
||||||
t.clientFk,
|
|
||||||
c.email recipient,
|
|
||||||
eu.email salesPersonEmail
|
|
||||||
FROM ticket t
|
|
||||||
JOIN client c ON c.id = t.clientFk
|
|
||||||
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
|
||||||
WHERE t.id = ?
|
|
|
@ -1,9 +0,0 @@
|
||||||
const express = require('express');
|
|
||||||
const router = new express.Router();
|
|
||||||
|
|
||||||
router.get('/delivery-note/download', require('./delivery-note/download'));
|
|
||||||
router.get('/delivery-note/send', require('./delivery-note/send'));
|
|
||||||
router.get('/invoice/download', require('./invoice/download'));
|
|
||||||
router.get('/invoice/send', require('./invoice/send'));
|
|
||||||
|
|
||||||
module.exports = router;
|
|
|
@ -1,24 +0,0 @@
|
||||||
const path = require('path');
|
|
||||||
const db = require('vn-print/core/database');
|
|
||||||
|
|
||||||
const {toCSV} = require('../csv');
|
|
||||||
const sqlPath = path.join(__dirname, 'sql');
|
|
||||||
|
|
||||||
module.exports = async function(request, response, next) {
|
|
||||||
try {
|
|
||||||
const reqArgs = request.query;
|
|
||||||
if (!reqArgs.refFk)
|
|
||||||
throw new Error('The argument refFk is required');
|
|
||||||
|
|
||||||
const refFk = reqArgs.refFk;
|
|
||||||
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [refFk]);
|
|
||||||
const content = toCSV(sales);
|
|
||||||
const fileName = `invoice_${refFk}.csv`;
|
|
||||||
|
|
||||||
response.setHeader('Content-type', 'text/csv');
|
|
||||||
response.setHeader('Content-Disposition', `inline; filename="${fileName}"`);
|
|
||||||
response.end(content);
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,40 +0,0 @@
|
||||||
const path = require('path');
|
|
||||||
const db = require('vn-print/core/database');
|
|
||||||
const Email = require('vn-print/core/email');
|
|
||||||
|
|
||||||
const {toCSV} = require('../csv');
|
|
||||||
const sqlPath = path.join(__dirname, 'sql');
|
|
||||||
|
|
||||||
module.exports = async function(request, response, next) {
|
|
||||||
try {
|
|
||||||
const reqArgs = request.query;
|
|
||||||
if (!reqArgs.refFk)
|
|
||||||
throw new Error('The argument refFk is required');
|
|
||||||
|
|
||||||
const refFk = reqArgs.refFk;
|
|
||||||
const invoice = await db.findOneFromDef(`${sqlPath}/invoice`, [refFk]);
|
|
||||||
const sales = await db.rawSqlFromDef(`${sqlPath}/sales`, [refFk]);
|
|
||||||
|
|
||||||
const args = Object.assign({
|
|
||||||
refFk: invoice.refFk,
|
|
||||||
recipientId: invoice.clientFk,
|
|
||||||
recipient: invoice.recipient,
|
|
||||||
replyTo: invoice.salesPersonEmail
|
|
||||||
}, response.locals);
|
|
||||||
|
|
||||||
const content = toCSV(sales);
|
|
||||||
const fileName = `invoice_${refFk}.csv`;
|
|
||||||
const email = new Email('invoice', args);
|
|
||||||
await email.send({
|
|
||||||
overrideAttachments: true,
|
|
||||||
attachments: [{
|
|
||||||
filename: fileName,
|
|
||||||
content: content
|
|
||||||
}]
|
|
||||||
});
|
|
||||||
|
|
||||||
response.status(200).json({message: 'Success'});
|
|
||||||
} catch (error) {
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,10 +0,0 @@
|
||||||
SELECT
|
|
||||||
io.id,
|
|
||||||
io.clientFk,
|
|
||||||
c.email recipient,
|
|
||||||
eu.email salesPersonEmail
|
|
||||||
FROM invoiceOut io
|
|
||||||
JOIN client c ON c.id = io.clientFk
|
|
||||||
LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
|
|
||||||
LEFT JOIN ticket t ON t.refFk = io.ref
|
|
||||||
WHERE t.refFk = ?
|
|
|
@ -1,35 +0,0 @@
|
||||||
SELECT io.ref Invoice,
|
|
||||||
io.issued InvoiceDate,
|
|
||||||
s.ticketFk Ticket,
|
|
||||||
s.itemFk Item,
|
|
||||||
s.concept Description,
|
|
||||||
i.size,
|
|
||||||
i.subName Producer,
|
|
||||||
s.quantity Quantity,
|
|
||||||
s.price Price,
|
|
||||||
s.discount Discount,
|
|
||||||
s.created Created,
|
|
||||||
tc.code Taxcode,
|
|
||||||
tc.description TaxDescription,
|
|
||||||
i.tag5,
|
|
||||||
i.value5,
|
|
||||||
i.tag6,
|
|
||||||
i.value6,
|
|
||||||
i.tag7,
|
|
||||||
i.value7,
|
|
||||||
i.tag8,
|
|
||||||
i.value8,
|
|
||||||
i.tag9,
|
|
||||||
i.value9,
|
|
||||||
i.tag10,
|
|
||||||
i.value10
|
|
||||||
FROM sale s
|
|
||||||
JOIN ticket t ON t.id = s.ticketFk
|
|
||||||
JOIN item i ON i.id = s.itemFk
|
|
||||||
JOIN supplier s2 ON s2.id = t.companyFk
|
|
||||||
JOIN itemTaxCountry itc ON itc.itemFk = i.id
|
|
||||||
AND itc.countryFk = s2.countryFk
|
|
||||||
JOIN taxClass tc ON tc.id = itc.taxClassFk
|
|
||||||
JOIN invoiceOut io ON io.ref = t.refFk
|
|
||||||
WHERE t.refFk = ?
|
|
||||||
ORDER BY s.ticketFk, s.created
|
|
|
@ -1,6 +0,0 @@
|
||||||
module.exports = [
|
|
||||||
{
|
|
||||||
url: '/api/csv',
|
|
||||||
cb: require('./csv')
|
|
||||||
}
|
|
||||||
];
|
|
Loading…
Reference in New Issue