AAuditPro Suite· Finance manual
Finance manual M11 Invoices

Invoice header — the anatomy

TAX INVOICE
INV/2026/0042 · 12 Apr 2026
SENT
Bill From
Al Musaaid Auditing Bureau
Muscat, Sultanate of Oman
VAT: OM1100012345
Bill To
Al-Bahja Trading LLC
Muscat · CR 1234567
VAT: OM1100098765
DescriptionQtyRateVATTotal
Annual Audit FY 20251.0005,000.000250.0005,250.000
Out-of-pocket — site visits1.000300.00015.000315.000
Subtotal5,300.000
VAT (5%)265.000
Grand TotalOMR 5,565.000
Less: prior advance applied(1,000.000)
Balance DueOMR 4,565.000

Header fields

1invoice_number
Auto · INV/{YYYY}/{NNNN}

Atomic counter. Tax invoices share invoice sequence; proforma + CN + DN have their own sequences.

2doc_type
5 values

tax_invoice (default) · proforma · credit_note · debit_note · receipt. Drives behaviour throughout.

3client_id
Required

Bill-to. Inherits VAT TRN, address, payment terms, T&Cs override (if any).

4job_id
Optional FK

If linked, M07 Job → Invoices tab shows this invoice.

5parent_quote_id
Lineage stamp

If converted from quote, points to the source.

6parent_invoice_id
Lineage stamp

For CN/DN/proforma-converted: points to parent. NULL for primary tax invoices.

7issue_date · due_date
Required

Issue defaults today. Due defaults issue + 30 days (configurable per client/firm).

8status
8 values

draft · sent · partially_paid · paid · overdue · cancelled · written_off · converted

9currency_code · fx_rate · omr_equivalent
Multi-currency

OMR default. Non-OMR captures FX rate at issuance + computes OMR-equivalent for reporting.

10balance_due
Computed

grand_total − allocated payments. Auto-recomputes on every payment allocation change.

11terms_and_conditions
Free text

From client.invoice_terms_override OR firm default (Settings → Company Profile → Invoice defaults).

12internal_notes
Internal only

Never on the PDF. Pricing rationale, partner approvals, internal context.

Lifecycle stamp columns

ColumnStamped on
created_at + byInsert
approved_at + bydraft → sent (or first approve)
sent_at + byStatus flips to sent
paid_in_full_atLast allocation closes balance to 0
cancelled_at + by + reasonMandatory reason
written_off_at + by + reasonMandatory reason; super_admin/partner only
converted_at + byProforma → tax invoice conversion
overdue_flagged_atCron auto-flips sent → overdue

Step-by-step — manually create a tax invoice

  1. Open Invoices → New invoice

    Or from a job → Invoices tab → New from this job. Or from a client → Invoices tab → New for this client.

  2. Header

    Doc type defaults to tax_invoice. Client + job pre-filled if launched from those modules. Issue date = today. Due date = today + 30. T&Cs pre-filled.

  3. Add line items

    Description (datalist autocomplete) · qty · unit_price · discount · VAT category. Header rolls up live.

  4. Save as draft

    Auto-numbered INV/{YYYY}/{NNNN}. Status=draft. PDF generated to cache.

  5. Approve

    Manager/partner clicks Approve. approved_at + by stamped. Now ready to send.

  6. Send

    Click Send. M17 queues email with template invoice.sent + branded PDF attached. Status flips draft → sent. sent_at + by stamped.

  7. Apply prior advances (auto)

    If client has unallocated advance balance, system silently allocates against the new invoice up to min(advance, total). Flash message shows the auto-allocated amount.

  8. Wait for payment

    Or set up dunning auto-reminder (chapter 10).

Editing — what's allowed when

StatusEdit lines?Edit header?
draft
sent✗ (cancel + reissue)Limited (notes only)
partially_paid / paid / overdueNotes only
cancelled / written_off / convertedRead-onlyRead-only

RBAC matrix

Roleviewcreateapprovesendcancelwrite_off
super_admin
partner
admin_staff
accountant
manager✓ (dept)
senior / staff✓ (assigned)
read_only
Try this

Open any open job → Invoices tab → New invoice from this job. Watch the line description's datalist suggest task names from the job + recent invoice descriptions. Add 2 lines, save draft, approve, send. End-to-end in under 90 seconds.

Watch out

Don't write-off an invoice without a real reason. The system enforces a min 50-character reason captured in written_off_reason column. Audit log keeps both the action + the reason permanently. Write-offs are a finance event with tax implications — never use them as a shortcut to "make the AR list cleaner".

Tip — datalist autocomplete

The line description field pulls from 4 sources: job title, template description's first sentence, task names of the linked job, firm-wide recent invoice lines. Use this — typing "Annu..." surfaces "Annual Audit FY 2025" instantly + auto-prefills unit_price from prior similar invoices.