Bill of Materials (BOM) — reusable production recipe master data under Inventory. Define finished good, output quantity, components (raw materials + units), and direct costs (overhead, labour) per batch. When creating a Manufacturing entry, select a BOM and enter the production quantity; the system auto-fills all component and direct-cost lines scaled proportionally. BOM does not lock costs — actual unit costs are determined at posting time via WAC. API: GET/POST/PUT/DELETE /api/{businessId}/bom and GET /api/{businessId}/bom/{id}/expand?quantity=X&locationId=Y.
Improvements
CSV Export — All List Pages — CSV export now exports all records (not just the current page), uses semicolon delimiter (compatible with Indonesian/European locale Excel), includes all columns (Tax, WHT, Total, etc.), and formats dates as yyyy-MM-dd. Tax Number (NPWP) is wrapped as an Excel text formula (="...") to prevent scientific notation.
CSV Export — All Report Pages — same delimiter and date format fixes applied to all 31 report pages.
JSON Export Removed from Reports — JSON export option removed from all report pages; CSV and Excel are sufficient for operator use. Master data JSON transfer is handled by the existing Master Data Package feature.
Toast Notifications — replaced plain opacity fade with slide-in from the right using spring easing (cubic-bezier(0.16, 1, 0.3, 1)); added colored left-border accent per intent (success/error/warning/info); smoother exit transition.
Footer — Mobile View — on small screens the footer now shows only the version string, centered. Copyright text and license badge are hidden to keep the footer clean.
Journal / Ledger Tables in Drawers — narration column now wraps instead of expanding horizontally; Debit and Credit columns are pinned at 100 px and always visible without horizontal scroll. Applies to all transaction detail drawers (Sales, Purchase, Payments, Manufacturing, etc.). A min-width: 480px ensures text wraps sensibly and a scrollbar appears on very narrow screens.
Startup Log — suppressed false fail log entry on first boot caused by ALTER TABLE Users ADD COLUMN MustChangePassword. The column is now checked via pragma_table_info before the ALTER is attempted, so EF Core never logs a command failure.