Add --print to regenerate PDFs from invoices.json without ledger writes. Support optional dueDate on ledger rows (default remains invoice date + 14 days) and persist dueDate when saving new production rows. Data: limmud_fsu_canada client with invoiceFileName, cruise_event_av_it product, 2026-LFSU01 sample invoice, Levkin contact fields in sender.json. README and project.md describe CLI, schema, and May 2026 changelog. Co-authored-by: Cursor <cursoragent@cursor.com>
3.7 KiB
Invoice Generator
A command-line tool for generating professional PDF invoices from JSON data files. Features interactive and non-interactive modes with preview-first workflow.
Quick Start
-
Install dependencies:
npm install -
Generate an invoice:
npm start
Usage Options
Interactive Mode (Recommended)
npm start
Guided wizard to select sender, client, and products.
Non-Interactive Mode
npm run generate -- --sender levkin --client levitin --products linkedin_scraper web_design
Test Mode
npm run test-invoice
Uses first available options for testing.
Reprint an existing invoice (from ledger)
Generates a PDF from data/invoices.json only — does not change the ledger or run the preview prompt:
node index.js --print 2026-LFSU01
Output path: invoice/<senderKey>/<filenamePrefix>_<number>.pdf. The filename prefix is the client’s optional invoiceFileName in client.json, otherwise the client key.
Due date on the PDF: Each ledger row can include optional "dueDate": "YYYY-MM-DD". If omitted, the tool uses invoice date plus 14 days.
All data is stored in the data/ directory:
data/sender.json - Your Company Profiles
{
"levkin": {
"company": "Levkin Inc.",
"contactName": "Ilia Dobkin",
"phone": "647 987 2792",
"email": "idobkin@gmail.com",
"address": "6 Keefer Court",
"zip": "L4J 5Y4",
"city": "Thornhill, ON",
"country": "Canada",
"taxName": "HST",
"taxNumber": "79438 2895 RT0001",
"paymentInfo": "Bank transfer details..."
}
}
data/client.json - Client Information
{
"levitin": {
"company": "LEVITIN EMPLOYMENT LAWYERS",
"address": "#2809 - 330 Richmond Street West",
"zip": "M5V 0M4",
"city": "Toronto, ON",
"country": "Canada"
}
}
data/products.json - Services/Products Catalog
{
"linkedin_scraper": {
"description": "LinkedIn Scraper Bot",
"price": 250,
"taxRate": 13
},
"web_design": {
"description": "Website Design",
"price": 1200,
"taxRate": 13
}
}
Workflow
- Preview Generation: Creates a development preview PDF first
- Review: Check the preview in
invoice/<sender>/<client>_<year>-DEV-PREVIEW.pdf - Confirmation: Choose to create the production invoice or keep only the preview
- Production: Generates final invoice with sequential numbering and saves to ledger
Output Structure
invoice/
├── levkin/
│ ├── levitin_2025-0007.pdf # Production invoice
│ └── levitin_2025-DEV-PREVIEW.pdf # Preview
└── dobit/
└── ...
Testing
npm test
Tests cover invoice numbering logic including year resets and sequential ordering.
Key Features
- Safe Preview-First: Always generates preview before production
- Automatic Numbering: Sequential invoice numbers (YYYY-0001, YYYY-0002...)
- Year Reset: Invoice numbers reset annually
- Organized Output: PDFs stored by sender in separate folders
- Tax Support: Configurable tax rates per product
- Payment Info: Custom payment instructions in footer
- Ledger Tracking: All invoices automatically recorded in
data/invoices.json - Reprint mode (
--print): PDF from ledger without editing it - Optional
dueDateon ledger rows for custom payment deadlines when reprinting
See project.md for full schema, CLI details, and changelog.
Requirements
- Node.js v16+
- npm