Skip to main content

Command Palette

Search for a command to run...

Oracle APEX Invoice Generator: Simple Invoicing for Small Teams and Projects

Updated
4 min read
Oracle APEX Invoice Generator: Simple Invoicing for Small Teams and Projects

Invoicing should not be complicated. You did the work, now you need a document with your details, the client's details, the services you provided, and a total. That is it.

The Oracle APEX Invoice Generator is an open-source application designed to make that process as simple as possible. Register your business and your clients once, then creating an invoice is just a few clicks: pick the client, pick your business, add service lines, done. Preview it, print it, or save it as PDF straight from the browser.

It is built entirely in Oracle APEX — no external tools or extra licenses required. If you want to understand the printing technique behind it (HTML + CSS + window.print()), the companion post Zero-cost print in Oracle APEX: HTML and CSS only covers that in detail. This post focuses on the application itself — the data model, the API, and the user experience.


How it works

The idea is: set up your data once, then reuse it on every invoice.

Lookup tables — you register your businesses (name, address, email, phone), your clients, and your bank/payment details. These are filled once and selected from dropdowns when you create an invoice.

Bank Details report

Invoices — pick a client, a business, optionally a bank account, set the issue date, payment terms, tax rate, and any notes. Then add service lines — each with a description and an amount. The app calculates subtotal, tax, and total automatically.

Print — open a modal preview and click Print. The browser handles the rest.


The page flow

The app has five pages with a straightforward flow:

Invoices list (100) → Create/Edit Invoice (110) → Add Line (115, modal)
                                                 → Print (120, modal)

The invoices list is your home base — all invoices in one Interactive Report:

Invoices Interactive Report

Click any row to open the invoice form. The header fields and the service lines live on the same page, so you see everything at a glance:

Invoice detail — form and lines

From here you can add or edit lines (opens a modal), or hit the print icon to preview and print:

Print Invoice modal preview Browser print dialog — Save as PDF

Database design

Five tables, each with a clear responsibility:

invg_businesses ──┐
                  ├──► invg_invoices ◄── invg_clients
invg_bank_details ┘          │
                             │
                    invg_invoice_lines

invg_businesses, invg_clients, and invg_bank_details are lookup tables. invg_invoices is the invoice header (references the three lookups by FK, plus dates, terms, tax, notes). invg_invoice_lines holds the service lines.

All tables follow the same conventions: identity primary keys, audit columns populated via compound triggers, soft delete with active_yn, and char semantics on all varchar2 columns.


The PL/SQL API

All business logic lives in one package: invg_invoice_api (spec). It handles soft delete, invoice number generation (YYYY-NNN format), and the HTML rendering.

The key function is render_invoice_html: it fetches the invoice with all its joins (client, business, bank), loops over the service lines, computes the totals, and returns a complete HTML fragment inside a clob. Sections like bank details and notes are conditionally included only when present. All user data is escaped with apex_escape.html.

Insert and update operations use APEX's native Automatic Row Processing — no custom DML needed.


Deployment

The repository includes a release/_release.sql script that runs everything in the correct order — views, packages, triggers, seed data, and the APEX application import:

cd release
sqlcl user/pass@db @_release.sql

Log in to APEX and your invoicing app is ready.


Why use this

  • Simple — the whole point is reducing friction. A few clicks to create an invoice, one click to print or save as PDF.

  • Self-contained — runs entirely inside Oracle APEX. No external services, no integrations to maintain.

  • Yours to extend — add a logo, change colors, add currency support, status workflows (Draft/Sent/Paid), email delivery via apex_mail. The codebase is small and readable.

  • Open source — fork it, adapt it, make it yours.


Get the code

Clone, run the release script, and go send that invoice.


#oracle-apex #apex #apexworld #apex-tips #oracle #orclapex #invoicing #plsql #open-source

More from this blog