Skip to main content

Command Palette

Search for a command to run...

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

Published
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

A little knowledge to share-Oracle APEX

17 posts

Soy Ingeniero de Aplicaciones desde el 2012, he trabajado con Oracle APEX desde el 2017en versiones 5, 18, 20, 21. En los ultimos años he desarrollado habilidades en CSS, JavaScript, Jquery y PlSql , I specialize in Oracle APEX (Oracle Application Express )