invoice-fs
Version:
Nostalgic command-line invoicing application producing plain text invoices and JSON data structures. Uses the file system as a database
74 lines (60 loc) • 2.29 kB
JavaScript
var Api = require('invoice-api'),
obj = require('javascript-object-paraphernalia'),
state = require('./state'),
paths = state.get('paths'),
invoiceNumberGenerator = require('./invoiceNumberGenerator'),
issuer = require('./issuer'),
Customer = require('./customer'),
fs = require('fs'),
out = require('./out'),
writeDataSync = require('./writeDataSync');
try { fs.lstatSync(paths.invoices); } catch (e) { fs.mkdirSync(paths.invoices); }
try { fs.lstatSync(paths.finished); } catch (e) { fs.mkdirSync(paths.finished); }
function Invoice(number) {
if (number !== undefined) {
this.open(number);
}
}
Invoice.prototype.paid = function(callback) {
this.data.status = "PAID";
writeDataSync(paths.invoices + this.data.number.toUpperCase() + ".json", this.data, callback);
};
Invoice.prototype.lock = function(callback) {
this.save(true, callback);
};
Invoice.prototype.unlock = function(callback) {
this.save(false, callback);
};
Invoice.prototype.new = function(customer) {
if (customer === undefined) {
throw new Error("A new invoice must be provided a customer");
}
var invoiceNumber = invoiceNumberGenerator.getInvoiceNumber();
try {
this.data = new Api.Invoice(JSON.parse(fs.readFileSync(paths.invoices + invoiceNumber.toUpperCase() + '.json', 'utf8')));
} catch (e) {
this.data = new Api.Invoice({
number: invoiceNumber,
issuer: issuer.data,
customer: new Customer(customer).data
});
state.set('invoice', invoiceNumber.toUpperCase());
this.save();
return;
}
throw new Error("Invoice already exists");
};
Invoice.prototype.open = function(number) {
this.data = new Api.Invoice(JSON.parse(fs.readFileSync(paths.invoices + number.toUpperCase() + '.json', 'utf8')));
state.set('invoice', number.toUpperCase());
};
Invoice.prototype.save = function(lock, callback) {
lock ? this.data.lock() : this.data.unlock();
writeDataSync(paths.invoices + this.data.number.toUpperCase() + ".json", this.data, callback);
};
Invoice.prototype.add = function(item) {
if (this.data.status !== "LOCKED") {
this.data.add(new Api.InvoiceItem(item));
}
};
module.exports = Invoice;