Skip to content

rimiti/invoice-it

Repository files navigation

invoice-it

Dependencies Code Climate score Code Climate coverage Code Climate coverage Build Status MIT License PRs Welcome

Generate your orders and you invoices and export them easily. If you want some examples, check tests.

Install

$ npm install @rimiti/invoice-it --save

Features

  • Generate order / invoice
  • Export to HTML / PDF / Stream
  • Easy to use it
  • Robust implementation with good unit test coverage.

Demonstration

Usage

Importation

From import

import invoiceIt from '@rimiti/invoice-it';

From require

const invoiceIt = require('@rimiti/invoice-it').default;

Order

To generate an order:

import invoiceIt from '@rimiti/invoice-it';

  const recipient = {
    company_name: 'Receiver company',
    first_name: 'Will',
    last_name: 'Jameson',
    street_number: '20',
    street_name: 'Rue Victor Hugo',
    zip_code: '77340',
    city: 'Pontault-Combault',
    country: 'France',
    phone: '06 00 00 00 00',
    mail: 'will.jameson@test.com'
  };

  const emitter = {
    name: 'Dim Solution',
    street_number: '15',
    street_name: 'Rue Jean Jaures',
    zip_code: '75012',
    city: 'Paris',
    country: 'France',
    phone: '01 00 00 00 00',
    mail: 'contact@dimsolution.com',
    website: 'www.dimsolution.com'
  };

  const order = invoiceIt.create(recipient, emitter);

You can also use getter / setters like that

const order = invoiceIt.create();

order.recipient.company_name = 'Receiver company';
order.recipient.first_name = 'Will';
order.recipient.last_name = 'Jameson';
order.recipient.street_number = '20';
order.recipient.street_name = 'Rue Victor Hugo';
order.recipient.zip_code = '77340';
order.recipient.city = 'Pontault-Combault';
order.recipient.country = 'France';
order.recipient.phone = '06 00 00 00 00';
order.recipient.mail = 'will.jameson@test.com';

order.emitter.name = 'Dim Solution';
order.emitter.street_number = '15';
order.emitter.street_name = 'Rue Jean Jaures';
order.emitter.zip_code = '75012';
order.emitter.city = 'Paris';
order.emitter.country = 'France';
order.emitter.phone = '01 00 00 00 00';
order.emitter.mail = 'contact@dimsolution.com';
order.emitter.website = 'www.dimsolution.com';

Return order object

order.getOrder();

Return html order

order.getOrder().toHTML();

Save html order into file (default filepath: 'order.html')

order.getOrder().toHTML().toFile('./order.html')
  .then(() => {
      console.log('HTML file created.');
  });

Save html order into file (default filepath: 'order.pdf')

order.getOrder().toPDF().toFile('./order.pdf')
  .then(() => {
     console.log('PDF file created.');
  });

Invoice

To generate an invoice:

import invoiceIt from '@rimiti/invoice-it';

  const recipient = {
    company_name: 'Receiver company',
    first_name: 'Will',
    last_name: 'Jameson',
    street_number: '20',
    street_name: 'Rue Victor Hugo',
    zip_code: '77340',
    city: 'Pontault-Combault',
    country: 'France',
    phone: '06 00 00 00 00',
    mail: 'will.jameson@test.com'
  };

  const emitter = {
    name: 'Dim Solution',
    street_number: '15',
    street_name: 'Rue Jean Jaures',
    zip_code: '75012',
    city: 'Paris',
    country: 'France',
    phone: '01 00 00 00 00',
    mail: 'contact@dimsolution.com',
    website: 'www.dimsolution.com'
  };

  const invoice = invoiceIt.create(recipient, emitter);

You can also use getter / setters like that

const invoice = invoiceIt.create();

invoice.recipient.company_name = 'Receiver company';
invoice.recipient.first_name = 'Will';
invoice.recipient.last_name = 'Jameson';
invoice.recipient.street_number = '20';
invoice.recipient.street_name = 'Rue Victor Hugo';
invoice.recipient.zip_code = '77340';
invoice.recipient.city = 'Pontault-Combault';
invoice.recipient.country = 'France';
invoice.recipient.phone = '06 00 00 00 00';
invoice.recipient.mail = 'will.jameson@test.com';

invoice.emitter.name = 'Dim Solution';
invoice.emitter.street_number = '15';
invoice.emitter.street_name = 'Rue Jean Jaures';
invoice.emitter.zip_code = '75012';
invoice.emitter.city = 'Paris';
invoice.emitter.country = 'France';
invoice.emitter.phone = '01 00 00 00 00';
invoice.emitter.mail = 'contact@dimsolution.com';
invoice.emitter.website = 'www.dimsolution.com';

Return invoice object

invoice.getInvoice();

Return html invoice

invoice.getInvoice().toHTML();

Save html invoice into file (default filepath: 'invoice.html')

invoice.getInvoice().toHTML().toFile('./invoice.html')
  .then(() => {
      console.log('HTML file created.');
  });

Save html invoice into file (default filepath: 'invoice.pdf')

invoice.getInvoice().toPDF().toFile('./invoice.pdf')
  .then(() => {
      console.log('PDF file created.');
  });

Add custom fields to invoice

const paymentId = {
  key: 'invoice_header_paymentId_value',
  value: paymentRef
};
const phrases = ['invoice_header_payment_reference', paymentId];
invoice.getInvoice(phrases).toPDF()

Customization

All below globals attributes are totally customizable from the .configure() method or from setters:

From .configure()

The configure method can override all default attributes presents in this file.

Customization example:

To generate and export in PDF an invoice with: - Logo url: http://example.com/logo.png - Date format: YYYY-MM-DD - Your invoice pattern: INVOICE-1901_00001 - Invoice note: It's my custom node!

import invoiceIt from '@rimiti/invoice-it';

invoiceIt.configure({
  global: {
    logo: 'http://example.com/logo.png',
    invoice_reference_pattern: '$prefix{INVOICE}$date{YYMM}$separator{_}$id{00000}',
    invoice_note: 'It\'s my custom node!',
    date_format: 'YYYY-MM-DD',
  },
});

const recipient = {
  company_name: 'Receiver company',
  first_name: 'Will',
  last_name: 'Jameson',
  street_number: '20',
  street_name: 'Rue Victor Hugo',
  zip_code: '77340',
  city: 'Pontault-Combault',
  country: 'France',
  phone: '06 00 00 00 00',
  mail: 'will.jameson@test.com'
};

const emitter = {
  name: 'Dim Solution',
  street_number: '73',
  street_name: 'Rue Jean Jaures',
  zip_code: '75012',
  city: 'Paris',
  country: 'France',
  phone: '01 00 00 00 00',
  mail: 'contact@dimsolution.com',
  website: 'www.dimsolution.com'
};

const invoice = invoiceIt.create(recipient, emitter);

invoice.id = 1;
order.getInvoice().toPDF().toFile();

From setters

import invoiceIt from '@rimiti/invoice-it';

const recipient = {
  company_name: 'Receiver company',
  first_name: 'Will',
  last_name: 'Jameson',
  street_number: '20',
  street_name: 'Rue Victor Hugo',
  zip_code: '77340',
  city: 'Pontault-Combault',
  country: 'France',
  phone: '06 00 00 00 00',
  mail: 'will.jameson@test.com'
};

const emitter = {
  name: 'Dim Solution',
  street_number: '73',
  street_name: 'Rue Jean Jaures',
  zip_code: '75012',
  city: 'Paris',
  country: 'France',
  phone: '01 00 00 00 00',
  mail: 'contact@dimsolution.com',
  website: 'www.dimsolution.com'
};

const invoice = invoiceIt.create(recipient, emitter);

invoice.global.logo = 'http://example.com/logo.png';
invoice.global.invoice_reference_pattern = '$prefix{INVOICE}$date{YYMM}$separator{_}$id{00000}';
invoice.global.invoice_note = 'It\'s my custom node!';
invoice.global.date_format = 'YYYY-MM-DD';
invoice.id = 1;
order.getInvoice().toPDF().toFile();

i18n

To add more language:

import invoiceIt from '@rimiti/invoice-it';

invoiceIt.configure({
  language: {
    locales: ['en', 'pl'],
    directory: `${__dirname}/path/to/locales`,
    defaultLocale: 'en'
  }
});

Scripts

Run using npm run <script> command.

clean - remove coverage data, Jest cache and transpiled files,
test - run tests with coverage,
test:watch - interactive watch mode to automatically re-run tests,
build - compile source files,
build:watch - interactive watch mode, compile sources on change.

License

MIT © Dimitri DO BAIRRO