Easily generate PDF invoices which are emailed automatically to the client. From a simple YAML file, a PDF invoice is generated and sent to the client.
Example:
to:
name: Alice Smith
email: [email protected]
items:
- name: Development
description: Website design and development.
qtyHrs: 65
unitPrice: 100
- name: Domain hosting
description: 1 year
qtyHrs: 1
unitPrice: 180See examples for complete exampes.
- User-friendly templating
- The invoice and email templates use Mustache for easy customization
- Automatic emailing
- The invoice is automatically sent to the client from your account.
- Type-safe YAML parsing
- For example,
qtyHrs(quantity/hours) is supposed to be a number, so if any other type of value is given (e.g.,abc), the parsing will fail and show a helpful error message. Likewise, any missing parameters will be caught.
- For example,
- Type-safe money operations
- The safe-money Haskell library offers type-safe and lossless encoding and operations for monetary values in all world currencies. This means that rounding errors won’t occur when calculating the invoice prices.
This project uses nix. It also depends on wkhtmltopdf, which will be installed with the resulting application.
To include it in your nix environment, add it to your list of packages in your configuration:
{ pkgs, ... }:
let
easy-invoice-maker = (import (builtins.fetchGit {
name = "easy-invoice-maker";
url = "https://github.com/SlimTim10/easy-invoice-maker/";
}));
in
{
environment.systemPackages = with pkgs; [
easy-invoice-maker
];
}Or, use Nix flakes and add it as an input:
{
inputs = {
# ...
easy-invoice-maker = {
url = "github:SlimTim10/easy-invoice-maker";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { easy-invoice-maker , ... }: {
# ...
easy-invoice-maker.packages."${pkgs.system}".easy-invoice-maker
};
}Add or edit the parameter files (see following sections)
defaults.yaml0047.yaml(a file with the invoice number as its name)email.yaml
Create an invoice:
$ easy-invoice-maker 0047.yamlThis will create the invoice file 0047.pdf.
Build:
$ nix-buildOr, using Nix flakes:
$ nix buildAdd or edit the parameter files (see following sections)
defaults.yaml0047.yaml(a file with the invoice number as its name)email.yaml
Use the resulting binary:
$ ./result/bin/easy-invoice-maker 0047.yamlThis will create the invoice file 0047.pdf.
The invoice body information must be in YAML format (e.g., see 0047.yaml). The file should be provided as an argument to easy-invoice-maker. A second file, defaults.yaml should be located in the same directory as the invoice body file. See defaults.yaml and 0047.yaml for basic example.
defaults.yaml is for setting the default from and notes (string, optional) information to use in every invoice. These can be overridden by providing values in the invoice body.
The invoice body contains:
- date (string, optional)
- from (optional)
- name (string)
- website (string, optional)
- email (string)
- to
- name (string)
- email (string)
- items (list)
- name (string)
- description (string, optional)
- qtyHrs (number)
- unitPrice (number)
Put email and SMTP information in email.yaml, in the same directory as the invoice body. For Gmail, create an app password (help center).
- Update easy-invoice-maker.cabal
- Update easy-invoice-maker.nix
If the package is not found, get it from GitHub:
$ cabal2nix --no-check https://github.com/JustusAdam/mustache.git --revision 530c0f10188fdaead9688d56f728b87fabcb228b > nix/mustache.nix- Update default.nix
For more information, read: https://github.com/Gabriella439/haskell-nix/tree/main/project1
- Allow confirmation before emailing PDF
