UNPKG

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
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;