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

6.9 KiB

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

"use client";

export { CustomersPage as default } from "@/src/modules/accounting/pages/customers";

Layout adapter

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