1.0.1¶
Released: staging (target promotion: TBD)
Compared to 1.0.0. Derived from git log --oneline origin/main..staging.
Highlights¶
- Recurring everything: invoices and expenses can now run on a schedule.
- Owner-organization features: per-product margin tracking and a disposable-budget KPI answer "cuánto le estoy ganando" and "cuánto puedo destinar a gastos".
- Bank reconciliation: statement parsing + AI-assisted transaction matching.
- Inventory dimensions: locations, lots, and costing methods.
Added¶
Owner-org features (this release's main theme)¶
unit_cost_snapshotonInvoiceDetail, captured at sale time via a dedicated pre-create handler (InvoiceCostSnapshotHandler).grossMarginAmount/grossMarginPcthybrid properties exposed onInvoiceDetail.getProductMarginReport(startDate, endDate)query — per-item revenue / COGS / margin withcostCoveragePctto flag legacy lines without a snapshot.getDisposableBudget(targetYear, targetMonth, revenueLookbackMonths)— trailing-N-month revenue avg minus projected recurring fixed costs.
Accounting & operations¶
- Recurring invoices — template + cadence; daily worker materializes due rows.
- Recurring expenses — same shape as recurring journals; honours end-date / occurrence-count.
- Opening balances import — validation + skeletal invoice creation for tenant onboarding.
- Bank statements — statement model + parsing task.
- Bank reconciliation — transaction matching enhanced with user and AI identifiers;
LedgerEntryLinejoinedload option. - Ledger audit trail.
- Fiscal years and periods.
- Budgets — per-account, per-period budget + variance reporting.
- Tax filings.
- Payroll.
- Fixed assets.
- Inventory dimensions — locations, lots, costing methods.
- Tag module —
Item.tagsreplaced by first-classTagobjects.
Schema (selected)¶
unitCostSnapshot,grossMarginAmount,grossMarginPctonInvoiceDetail.- New types:
ProductMarginReport,ProductMarginReportRow,DisposableBudgetKPI. tax_rate_idper-line on invoice/supplier-invoice details.
Changed¶
- Tag assignment on items now goes through
Tagobjects rather than free-form strings. BankReconciliationServiceaccepts a joinedload option forLedgerEntryLine.- XLSX parsing streamlined;
LLMServicedependency removed from the parser path.
Fixed¶
unique()applied on the file-hash query to deduplicate joined-eager-load rows.
Migrations¶
Run in order on top of 1.0.0:
add_bank_statementsadd_fiscal_years_and_periodsadd_bank_reconciliationsadd_ledger_audit_logsadd_payrolladd_tax_filingsadd_tax_rate_id_to_detailsadd_recurring_journalsadd_recurring_invoicesadd_recurring_expensesadd_tags_to_items→tag_module(the tag table replaces the inlined strings)add_fixed_assetsadd_budgetsadd_inventory_dimensionsadd_unit_cost_snapshot(this release)- PathPermission backfill (separate one-off script:
scripts/backfill_new_path_permissions.py)
Apply with task migrate-dev against staging, or task migrate-prod once promoted.
Frontend impact¶
Required wiring before this version reaches users:
- Invoice line UI: surface
grossMarginPctnext to subtotal; dim whennulland explain why on hover. - Owner dashboard: new card backed by
getDisposableBudget. Color-band per the disposable-budget doc. - Margin report: new screen backed by
getProductMarginReport. Include thecostCoveragePctbadge so users understand partial coverage on historical sales. - Inventory list: support location / lot / costing-method dimensions (additive, but UX should expose them).
- Tags UI: switch from string input to
Tag-object picker. - Recurring schedules: separate UIs for recurring invoices and recurring expenses (same shape as recurring journals).
- Bank workflow: statement upload, parse-status, reconciliation board with AI-suggested matches.
Versioning notes¶
- This is the first release that maintains a changelog — see index for conventions.
- Bumped via
uv run python scripts/bump_version.py 1.0.1.