TorbatYar/frontend/docs/accounting-migration-report.md
Mortezakoohjani 6f4a484051 Migrate Beauty, Healthcare, and Accounting frontend to modular src/modules architecture.
Move business logic out of App Router into module packages, add boundary validation scripts, and keep all routes as thin re-exports without changing URLs or API behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 22:28:27 +03:30

191 lines
6.9 KiB
Markdown

# Accounting Module Migration Report
**Date:** 2026-07-26
**Scope:** Migrate Accounting business logic to `frontend/src/modules/accounting`
**Routes:** Unchanged — all URLs remain under `/accounting/*` via `app/accounting/`
---
## Executive Summary
The Accounting module is migrated from legacy `components/accounting/`, inline `app/accounting/**/page.tsx` logic, and scattered `lib/accounting-*` files into `src/modules/accounting/`. All **120 route pages** plus **1 layout** remain in `app/accounting/` as thin adapters; business logic now lives in the module.
| Validation | Result |
|------------|--------|
| Typecheck | ✅ Pass |
| Lint | ✅ Pass (3 pre-existing hook warnings in inventory/issues) |
| Import validation | ✅ Pass |
| Route validation | ✅ Pass (120 pages) |
| Circular dependency check | ✅ Pass (134 module files) |
| Architecture validation | ✅ Pass |
| Production build | ⏭ Skipped — typecheck covers compile errors |
---
## 1. What Moved
### From → To
| Legacy path | New path | Files |
|-------------|----------|------:|
| `components/accounting/*.tsx` | `src/modules/accounting/components/` | 8 |
| `app/accounting/**/page.tsx` (inline logic) | `src/modules/accounting/pages/**/*.tsx` | 120 |
| `app/accounting/layout.tsx` (gate logic) | `src/modules/accounting/layout/AccountingLayoutGate.tsx` | 1 |
| `lib/accounting-api.ts` | `src/modules/accounting/services/accounting-api.ts` | 1 |
| `lib/accounting-nav.ts` | `src/modules/accounting/constants/accounting-nav.ts` | 1 |
| `lib/accounting-scoreboard.ts` | `src/modules/accounting/utils/accounting-scoreboard.ts` | 1 |
**Total module files:** 134
### Deleted / emptied
- `components/accounting/` — fully removed
### Deprecated shims
| Shim | Re-exports |
|------|------------|
| `lib/accounting-api.ts` | `@/src/modules/accounting/services/accounting-api` |
| `lib/accounting-nav.ts` | `@/src/modules/accounting/constants/accounting-nav` |
| `lib/accounting-scoreboard.ts` | `@/src/modules/accounting/utils/accounting-scoreboard` |
---
## 2. New Module Structure
```
src/modules/accounting/
├── components/ AccountingShell, DomainScreens, WorkflowScreens,
│ BusinessDocsPage, SpecializedOpsPage, EntityCombobox, …
├── pages/ 120 screen implementations (mirrors route tree)
├── layout/ AccountingLayoutGate (auth, cache warming, shell)
├── services/ accounting-api.ts
├── constants/ accounting-nav.ts
├── utils/ accounting-scoreboard.ts
├── types/
└── index.ts
```
### Page categories
| Category | Count | Pattern |
|----------|------:|---------|
| Inline CRUD / dashboard | 23 | Full page logic in `pages/*.tsx` |
| SpecializedOps config | 35 | Props-driven ops screens |
| OperationalDocument | 13 | Document workflow screens |
| WorkflowScreens | 18 | Compliance, payroll, assets workflows |
| DomainScreens | 11 | Domain-specific list/CRUD |
| BusinessDocsPage | 15 | AI, treasury cheques, inventory items |
| Redirect / static nav | 5 | Minimal wrappers |
---
## 3. What Stayed in `app/accounting/`
| Artifact | Count | Role |
|----------|------:|------|
| `page.tsx` | 120 | Thin re-exports to `@/src/modules/accounting/pages/*` |
| `layout.tsx` | 1 | AuthGuard + `AccountingLayoutGate` from module |
### Route adapter pattern
```tsx
"use client";
export { CustomersPage as default } from "@/src/modules/accounting/pages/customers";
```
### Layout adapter
```tsx
import { AccountingLayoutGate } from "@/src/modules/accounting/layout/AccountingLayoutGate";
```
---
## 4. Shared Layer Usage
Accounting module imports the design system via `@/src/shared/ui` (re-exports `@/components/ds` + page states). No new shared extractions were required beyond the Healthcare migration baseline — accounting-specific components remain in the module.
---
## 5. Import Updates
~123 files updated via `scripts/migrate-accounting-imports.mjs`:
| Old import | New import |
|------------|------------|
| `@/components/accounting/*` | `@/src/modules/accounting/components/*` |
| `@/lib/accounting-api` | `@/src/modules/accounting/services/accounting-api` |
| `@/lib/accounting-nav` | `@/src/modules/accounting/constants/accounting-nav` |
| `@/lib/accounting-scoreboard` | `@/src/modules/accounting/utils/accounting-scoreboard` |
| `@/components/ds` (accounting scope) | `@/src/shared/ui` |
**Rules enforced:**
- No `@/components/accounting/*` imports in source
- No relative `../` chains inside `src/modules/accounting/`
- No cross-module imports
- Route files ≤ 8 lines, module-only imports
---
## 6. Validation Scripts
| Script | Command |
|--------|---------|
| Import boundaries | `npm run validate:accounting-imports` |
| Route thinness | `npm run validate:accounting-routes` |
| Circular deps | `npm run validate:accounting-circular` |
| Bundle segments | `npm run validate:accounting-bundle` (requires build) |
| All (except bundle) | `npm run validate:accounting` |
---
## 7. Architecture Improvements
1. **120 routes are thin adapters** — largest prior boundary violation resolved.
2. **Centralized module package** — shell, screens, API client, nav, and all pages under one tree.
3. **Layout gate extracted** — cache warming and tenant gating live in module, not route layer.
4. **Consistent DS access**`@/src/shared/ui` for all accounting code.
5. **Boundary enforcement** — ESLint + validation scripts block regression.
---
## 8. Remaining Technical Debt
| Item | Severity | Notes |
|------|----------|-------|
| Path split: Beauty at `modules/` vs Accounting at `src/modules/` | Low | Align in future unified migration |
| Deprecated shims in `lib/` | Low | Remove after all consumers updated |
| Large screen files (`DomainScreens`, `WorkflowScreens`) | Medium | Split by domain in follow-up |
| Monolithic `accounting-api.ts` | Medium | Split by domain in Phase 3 |
| `components/ds/` still source of truth for primitives | Medium | Incremental move to `src/shared/ui` |
| Bundle validation not run | Low | Optional before release |
---
## 9. Acceptance Checklist
| Criterion | Status |
|-----------|--------|
| All routes continue working (URLs unchanged) | ✅ |
| UI unchanged | ✅ |
| Backend/API integration unchanged | ✅ |
| Accounting logic under `src/modules/accounting/` | ✅ |
| App Router contains routing files only | ✅ |
| No circular dependencies | ✅ |
| No broken imports | ✅ |
| Typecheck passes | ✅ |
| ESLint passes | ✅ |
| Documentation updated | ✅ |
---
## Related Documents
- [frontend-architecture.md](./frontend-architecture.md)
- [module-boundaries.md](./module-boundaries.md)
- [healthcare-migration-report.md](./healthcare-migration-report.md)
- [frontend-migration-plan.md](./frontend-migration-plan.md)