| 04-inventory-expenses-and-financial-reports |
03 |
expenses, accounting |
| expense-tracking |
| vendor-management |
| journal-entries |
| double-entry |
| approval-workflow |
| prisma |
|
| phase |
provides |
| 02-subscriber-and-billing-core |
JournalEntryService, Chart of Accounts, accounting period management |
|
| phase |
provides |
| 01-foundation |
Tenant provisioning, CASL permissions, withTenantContext |
|
|
| Vendor model and VendorService (CRUD) |
| ExpenseCategory model with 9 pre-seeded ISP categories |
| Expense model with ExpenseService (create, approve, post, void) |
| Automatic JE posting on expense post (DR expense account, CR cash/bank) |
| Optional approval workflow (DRAFT -> APPROVED -> POSTED) |
| API routes for expenses, categories, and vendors |
| COA accounts 5080 Fuel/Transportation, 5085 Rent Expense (31 total) |
|
| 04-05-financial-reports |
| 05-dashboard |
|
| added |
patterns |
|
|
| Expense JE pattern: DR category.accountCode, CR 1010/1020 based on paymentMethod |
| Optional approval workflow via requireApproval flag |
| ExpensePaymentMethod enum determines CR account (CASH->1010, BANK_TRANSFER/CHECK->1020) |
|
|
| created |
modified |
| src/lib/services/expense-service.ts |
| src/lib/services/vendor-service.ts |
| src/app/api/expenses/route.ts |
| src/app/api/expenses/[id]/route.ts |
| src/app/api/expenses/[id]/approve/route.ts |
| src/app/api/expenses/categories/route.ts |
| src/app/api/expenses/categories/[id]/route.ts |
| src/app/api/vendors/route.ts |
| src/app/api/vendors/[id]/route.ts |
| src/lib/__tests__/expense-service.test.ts |
| prisma/migrations/20260305_add_expense_vendor_models/migration.sql |
|
| prisma/schema.prisma |
| src/lib/tenant.ts |
| src/lib/accounting/chart-of-accounts.ts |
| src/lib/casl/types.ts |
| src/lib/casl/permissions.ts |
|
|
| ExpensePaymentMethod determines CR account: CASH->1010, BANK_TRANSFER/CHECK->1020 |
| Default behavior is immediate post (no approval required); requireApproval flag enables DRAFT-only creation |
| System expense categories (isSystemCategory=true) cannot be deleted; custom categories can be deleted if no expenses reference them |
| Vendor subject added to CASL types; OFFICE_STAFF gets manage permissions for Expense and Vendor |
| COA now has 31 accounts (added 5080 Fuel/Transportation, 5085 Rent Expense) |
| Expense cleanup order: expenses -> vendors -> expenseCategories (non-system) -> journalEntryLines -> null reversesEntryId -> journalEntries -> accountingPeriods -> accounts -> ticketCategories -> expenseCategories (system) -> users -> tenant |
|
| Expense JE: DR category expense account (from accountCode), CR cash/bank account |
| Optional approval workflow pattern: requireApproval flag on create, approveExpense triggers post |
| Category-to-COA linking via accountCode field on ExpenseCategory |
|
17min |
2026-03-05 |