@pingleware/bestbooks-reports
Version:
Reports module for BestBooks Accounting Application Framework
140 lines (124 loc) • 5.02 kB
JavaScript
const BaseReport = require('./report');
const {format, array2xml} = require('./formatReport');
const os = require('os');
const fs = require('fs');
const path = require('path');
class PurchaseOrder extends BaseReport {
constructor() {
super()
}
saveReport(name, contents, type="xml",callback=null){
const filePath = path.join(os.homedir(),`.bestbooks/${name}.${type}`);
// the xslt-processor does not support the XSLT syntax xsl:for-each-group,
// so the XML generated is returned,
// using a free tool like https://xslttest.appspot.com/,
// to copy the .bestbooks/balance-sheet.xslt and .bestbooks/balance-sheet.xml
// to render a HTML
// TODO: implement xsl:for-each-group. callback(format("balanceSheet",formattedData));
fs.writeFileSync(filePath, contents);
callback(filePath)
}
async saveReportSync(name, html, type) {
return new Promise((resolve,reject) => {
try {
this.saveReport(name, html, type, function(filePath){
resolve(filePath);
})
} catch(error) {
reject(error);
}
})
}
async formatHtml(formattedData) {
return format("purchaseOrder",formattedData);
}
async formatXml(contents) {
return array2xml("purchaseOrder",contents);
}
async formatArray(data,notes) {
var lineItems = [];
let subtotal = 0;
let total = 0;
var _data = {
number: data.number,
date: data.date,
company: data.company,
vendor: data.vendor,
shipping: data.shipping,
lineItems: [],
prices: {
subtotal: subtotal,
tax: 0,
shipping: Number(data.prices.shipping).toFixed(2),
other: Number(data.prices.other).toFixed(2),
total: total
},
comments: data.comments,
payment: data.payment,
notes: notes
};
data.lineitems.forEach(function(lineItem){
subtotal += Number(lineItem.amount);
lineItems.push({
quantity: lineItem.quantity,
description: lineItem.description,
unitprice: Number(lineItem.unitprice).toFixed(2),
amount: Number(lineItem.amount).toFixed(2)
})
})
total = Number(subtotal) + (Number(subtotal) * Number(data.prices.tax)) + Number(data.prices.shipping) + Number(data.prices.other);
_data.lineItems = { lineitem: lineItems };
_data.prices.tax = (Number(subtotal) * Number(data.prices.tax)).toFixed(2);
_data.prices.subtotal = Number(subtotal).toFixed(2);
_data.prices.total = Number(total).toFixed(2);
return _data;
}
retrieveReportData(startDate,endDate,callback) {
callback(this.retrieveReportDataSync(startDate, endDate));
}
async retrieveReportDataSync(startDate, endDate, company_id=0, vendor_id=0, metadata=null){
var sql = `SELECT c.name,u.* FROM company c JOIN users u ON c.id=u.company_id WHERE c.id=?`;;
var params = [company_id];
const company = await this.model.querySync(sql,params);
sql = `SELECT * FROM users WHERE id=?`;
params = [vendor_id];
const vendor = await this.model.querySync(sql,params);
return {
number: metadata.number,
date: startDate,
company: {
name: company[0].name,
contact: company[0].display_name,
email: company[0].user_email,
phone: company[0].phone,
website: metadata.company.website,
billing: metadata.company.billing,
shipping: metadata.company.shipping
},
vendor: {
id: 1,
name: vendor[0].display_name,
email: vendor[0].user_email,
contact: vendor[0].display_name,
address1: metadata.vendor.address1,
address2: metadata.vendor.address2,
city: metadata.vendor.city,
state: metadata.vendor.state,
zipcode: metadata.vendor.zipcode,
phone: metadata.vendor.phone,
fax: metadata.vendor.fax
},
shipping: {
service: metadata.shipping.service,
method: metadata.shipping.method,
deliverydate: endDate
},
lineitems: metadata.lineitems,
comments: metadata.comments,
prices: metadata.prices,
payment: metadata.payment
};
}
}
module.exports = PurchaseOrder;