Finance
Finance in the control panel (/control/finance) shows a shop’s figures from its own records. Managers and above can open it. It is read-only except for operating expenses. The rules are in ADR-018.
The period
Section titled “The period”One filter row sets the period for every tab:
- presets: this month (the default), last month, the last 30 days, this year, last year;
- custom dates, up to about three years.
Periods are whole days in the shop’s timezone. A period of up to two months is charted by day; a longer one is charted by month. The headline figures compare with the same number of days just before.
While the demo shop is loaded, its figures are included and the page says so. A switch hides them.
| Tab | What it shows |
|---|---|
| Overview | Net sales, completed orders, average order and operating profit, each against the previous period. Net sales per day or month (a table view is under the chart). The profit and loss statement |
| Sales | Items, delivery fees and refunds. Material cost, profit, margin and markup of completed orders. By channel (control panel or storefront) and by delivery method. The ten best sellers. Delivery fees against what Uklon charged. CSV of the period’s completed orders |
| Purchases and stock | Purchases per supplier (stems, delivery charges, returns). Write-offs by flower, with the latest entries. Orders cancelled after assembly. Stock on hand now at batch cost, reserved, expiring soon, expired, awaiting review, quarantined, and the flowers holding the most value |
| Payments | Payments recorded in the period by method, with reversals. Completed orders marked paid with no payment recorded. Completed orders customers still owe for, oldest first. Orders not yet completed, by status |
| Expenses | Operating expenses of the period by category, a form to record one, and corrections and removals. CSV of the period’s expenses |
How the figures are made
Section titled “How the figures are made”- An order counts when it is completed: the moment it was marked delivered, picked-up orders included. Its date is that moment in the shop’s timezone.
- Net sales = items + delivery fees − refunds. A refund is a completed order whose payment status is “refunded”.
- Material cost is the cost the order page shows: the batch cost of the stems used once the order was assembled, otherwise the estimate. Like the order page, it excludes labour, delivery and packaging cost.
- Gross profit = net sales − stems used − what Uklon charged.
- Operating profit = gross profit − write-offs − stems lost on orders cancelled after assembly − supplier delivery charges − operating expenses. It is before tax.
- Purchases are not an expense. Stems become a cost when an order uses them or when they are written off; subtracting purchases too would count them twice.
- Unknown, never partial. A sum missing a cost shows “unknown”, the known part and what is missing. Profit built on it is unknown. The material margin is then computed over the orders whose cost is known, and the page says over how many.
- As of now. Stock value, what customers owe and orders not yet completed are today’s figures, whatever the period.
Operating expenses
Section titled “Operating expenses”An expense has:
- a category: rent, wages, utilities, consumables, marketing, transport, equipment, software and services, taxes and fees, or other;
- a description;
- an amount in the shop’s currency (exact, above zero);
- the date it belongs to;
- an optional note.
Correcting one changes the figures at once; removing one soft-deletes it. Recording the first expense locks the shop’s currency like any price (B12).
Labour counts only if wages are recorded here. A shop’s own courier and its wrapping materials are recorded the same way (transport, consumables).
Exports
Section titled “Exports”Both exports cover the selected period. They are UTF-8 with a byte-order mark, so spreadsheets read Cyrillic, and the column names follow the interface language.
- Orders (CSV): one row per completed order, with date, channel, delivery method, customer, items, delivery fee, refund, net sales, material cost and basis, payment status, recorded payments and currency.
- Expenses (CSV): date, category, description, amount, currency and note.
A text cell that starts with =, +, - or @ gets an apostrophe in front, so a spreadsheet never runs a customer’s name as a formula.
| Piece | Where |
|---|---|
| Report | App\Services\Finance\FinanceReport (Period for local-day periods, Tally for sums that may be incomplete) |
| Per-order cost in bulk | OrderCosting::figures() |
| Pages and exports | FinanceController; expenses in ExpenseController, Expense, ExpensePolicy |
| Permissions | finance.view, finance.expenses (manager and above) |
| Tests | tests/Feature/Finance/ |
What it has already found
Section titled “What it has already found”| When | Finding |
|---|---|
| 6 October 2026 | Packaging has no cost. A packaged order’s assembled cost covers stems only and its estimate is unknown, on the order page and in Finance alike. Recorded as a limit in ADR-018. |