Skip to content
← All work

Financial Systems

Fiscal Desk

Production — actively evolving

A desktop application for business and personal financial records that also issues my consulting invoices. It turns reviewed time from TaskDesk and client disbursements into numbered invoices, and reconciles bank transactions against their supporting documents. Python and PostgreSQL, in production use.

Professional-services billing mixes time-based fees, pass-through disbursements and a tax treatment that differs between them. The invoice also has to stay connected to the time entries and supporting documents behind it, and the books have to reconcile against bank activity. The products I evaluated treated these as separate problems, so I built one application around the whole chain from recorded time to reconciled deposit.

From recorded hour to reconciled deposit

  1. Time is recorded

    Work is logged in TaskDesk against a client, task and billable rate.

  2. Narratives are reviewed

    Every line needs a reviewed description. AI may draft wording but cannot change minutes.

  3. The invoice is issued

    Numbered inside a database transaction, with GST on services and the service fee only.

  4. Copies are delivered

    A client PDF, an accountant PDF, an Outlook draft and a SharePoint copy.

  5. The deposit is reconciled

    The payment is matched to the invoice and its supporting documents.

What it solves

  • Invoices assembled by hand from time records, receipts and email, with billing narratives written from memory.
  • Disbursements paid on a client’s behalf that are billed late, billed twice or not billed at all.
  • GST applying to fees and a service fee but not to pass-through disbursements.
  • Business bank transactions with no easy way to show which document supports each one.

Technology stack

PythonPySide6 desktop UIPostgreSQLSQLMicrosoft Graph / SharePointPDF generationOutlook integration

My role

I designed and built Fiscal Desk and use it for my own invoicing and records. Time and tasks stay in TaskDesk; Fiscal Desk is the system of record for invoices.

Highlights

Invoice generation from reviewed time

Time comes from TaskDesk and expense lines come from the client’s documents in SharePoint. Every line needs a reviewed narrative before the invoice can be issued, and the AI that polishes narratives is not allowed to change minutes.

Disbursements and tax treatment

GST is applied to professional services and the service fee, while client disbursements are passed through at cost. Discount and adjustment lines are supported, and the invoice summary shows each component separately.

Transaction-safe numbering and full reversal

Invoice numbers are assigned inside a database transaction, and the numbering year follows the year the work was performed. A finalized invoice can be reversed, which unwinds the number, the locked time entries and the tagged documents.

Delivery

Each issued invoice produces a client-facing PDF and a separate accountant PDF with supporting detail, an Outlook draft for the client email, and an upload of the accountant copy to SharePoint.

Business reconciliation

Bank transactions are matched against SharePoint-held source documents, chargebacks and deposits. Transfers between my own accounts are treated as neither income nor expense, and an expected-no-document reason can be recorded instead of leaving an item unexplained.

Imports, forecasting and close

Statement imports keep their lineage and can be rolled back, with duplicate detection and categorization rules. Recurring forecasts, budget variance, account reconciliation, month-end close and a tax-year package for my accountant sit on the same data.

Key decisions

Billing eligibility follows the work, not the task

Work becomes billable because time was recorded in the period, not because its parent task has a particular status. A status filter had quietly hidden billable work on tasks that were still open, so revenue never reached an invoice and nothing showed that it was missing.

Write-offs are audited and reversible

Suppressing unbillable time is a recorded write-off with a reason, an actor and a timestamp that can be restored later. It is never a silent flag on the time entry.

Nothing is issued without review

The review step requires a human-approved description on every line. The application can draft the wording, but a person owns what the client reads.

Tests cannot reach real data

Tests that change data must use a dedicated test database and refuse to run without an explicit test connection, a rule added after a review showed a way for a test run to reach the live database.

Why a custom application

The chain from a recorded hour to a reconciled deposit crosses time tracking, billing, document storage and banking. Building it as one application on one PostgreSQL database lets each step check the one before it, and lets the decisions along the way be written down and enforced in code.

How it is built

The application is organized into services for imports, reconciliation, invoicing, forecasting and reporting over a PostgreSQL schema, with more than 500 automated tests. Product and architecture rulings are kept in a dated decision log so the reasoning survives the branch it was made on.

Current status

Fiscal Desk is in production and in active use. It continues to evolve as billing and financial-record requirements develop. It also includes personal and household modules, such as investments, debts and shared costs, which are separate from the invoicing story.

Outcomes

  • Invoices start from recorded time and reviewed narratives rather than reconstruction.
  • Each issued invoice leaves a client PDF, an accountant PDF with supporting detail and a numbered, reversible record.
  • Unreconciled bank items and missing supporting documents are visible in one work queue instead of being found at year end.

Screenshots

Review and issue: every line needs a reviewed narrative, and GST applies to services and the service fee only. Demonstration data.
The invoice register, with actions to generate, reverse and produce PDFs. Demonstration data.
Business reconciliation: linking bank transactions to their supporting documents. Demonstration data.
The work queue gathers reconciliation, review and missing-document items in one place. Demonstration data.

The overview image at the top has client and vendor details blurred. The screenshots below were captured from a disposable database with synthetic demonstration data.

Have a similar problem to solve?
Let’s talk about what a practical solution would look like for your organization.
Discuss a project