Invoice Management Platform
A Laravel platform that retires four years of Word files and Excel sheets. UK-to-Sri Lanka vehicle export documentation, branded PDFs, multi-template email, a full audit trail.
The Call
Every export started in Word. Every send-off ended in Gmail. No record, no search, no trail. Finding invoice DMC338 meant scrolling through a shared folder.
The Answer
Laravel 11 · DomPDF · Live in 2025
By the Numbers
Live at dapper.oreno.lk, processing real transactions for real vehicles crossing the Indian Ocean. The system that retired four years of manual invoice creation.
Inside the System
Every screen, in motion. Tap a tab — or let it auto-advance. This is what the DMC team sees when they log in to send an export invoice.
Email + password, or Google OAuth. Google never auto-creates users — admin must pre-register every account. No public signup. Ever.
Two-column layout. FOB + Freight = CFR Total, calculated live. Amount-in-words generated automatically by GbpToWords. Save as Draft or Unpaid.
DomPDF renders the Blade template. Seal embedded as base64. Streamed fresh on every request. Never stored on disk.
Template pre-filled with placeholders. Edit before sending if needed. Sent timestamp logged on the invoice record forever.
Text, status, date, price, creator, email status — all combinable. Soft deletes preserve data. Excel export pulls every matching row.
Company info, email templates, seal upload, SMTP config, staff permissions, appearance. Everything an admin needs — nothing they don't.
Click a tab — or watch it cycle
Architecture
A classic Laravel MVC flow — router, middleware, thin controllers, services, Eloquent, Blade. No SPA, no API layer, no over-engineering. The simplest thing that could possibly work.
Tech Stack
No npm, no Node.js, no compiled assets. Everything is CDN-loaded or server-rendered. Deploy by uploading a zip to cPanel. The entire pipeline is "upload and extract."
| Backend | Laravel 11 · PHP 8.3 | Mature MVC with first-class PDF, mail, and auth support. Runs on shared cPanel hosting without Docker. |
| Database | MariaDB 10.11 | Six normalized tables, foreign keys, soft deletes. No NoSQL, no Redis, no extras. |
| Templating | Blade | Server-rendered HTML. The PDF template uses inline styles only — DomPDF ignores external CSS. |
| Frontend CSS | Tailwind (CDN) | CSS custom properties for theming. Dark mode via class toggle. No PostCSS, no build config. |
| Reactivity | Alpine.js (CDN) | Dropdowns, modals, date pickers, live CFR calc, collapsible filter panel — about 200 lines total. |
| PDF Engine | barryvdh/laravel-dompdf | Converts Blade templates to A4 PDFs on the fly. Seal embedded as base64. Never stored on disk. |
| Laravel Mail · SMTP | Sends invoices with PDF attached. SMTP config stored in DB, editable from Settings. Synchronous — no queues. | |
| Auth | Session + Google OAuth | Dual login. Google OAuth never auto-creates users. Admin must pre-register every account. |
| Export | maatwebsite/laravel-excel | Export filtered invoice lists to .xlsx. All matching rows, not just the current page. |
| Hosting | cPanel · Shared LAMP | PHP 8.3, MariaDB, no SSH. Deploy via File Manager zip upload. Live at dapper.oreno.lk. |
Data Model
Users, permissions, the pivot, invoices, templates, and a singleton settings row. Foreign keys enforce referential integrity. Soft deletes preserve every record. The database is the contract.
Access Control
Every action is one of ten named permissions. The CheckPermission middleware enforces them on every route. No one sees a screen they don't need; no one touches a button they don't own.
| Capability | Admin | Staff |
|---|---|---|
| invoices.view | ||
| invoices.create | ||
| invoices.edit | ||
| invoices.delete | ||
| invoices.export | ||
| invoices.email | ||
| invoices.pdf | ||
| dashboard.view | ||
| settings.view | ||
| settings.edit |
Engineered by ØRENO
We build purpose-built systems that retire manual processes entirely. No generic SaaS. No subscription. Your system, your data, your domain.