diff --git a/BACKEND_SETUP.md b/BACKEND_SETUP.md index b8d3de0..82fe63e 100644 --- a/BACKEND_SETUP.md +++ b/BACKEND_SETUP.md @@ -78,7 +78,6 @@ erp-backend/ │ │ │ ├── warehouses/ │ │ │ ├── payment-terms/ │ │ │ ├── delivery-terms/ -│ │ │ ├── asset-categories/ │ │ │ ├── departments/ │ │ │ ├── designations/ │ │ │ ├── plants/ @@ -1180,7 +1179,7 @@ module.exports = router; ### 9.4 Masters module pattern -Every master (UOM, Item Categories, Brands, GST Rates, Warehouses, Payment Terms, Delivery Terms, Asset Categories, Departments, Designations, Plants, etc.) follows the **same four-file pattern as Vendors**, scaled down — simple `name`/`code` fields, no document-number generation, RBAC permission code `MASTERS`. Build one master fully (UOM is simplest) as the template, then replicate for the rest. +Every master (UOM, Item Categories, Brands, GST Rates, Warehouses, Payment Terms, Delivery Terms, Departments, Designations, Plants, etc.) follows the **same four-file pattern as Vendors**, scaled down — simple `name`/`code` fields, no document-number generation, RBAC permission code `MASTERS`. Build one master fully (UOM is simplest) as the template, then replicate for the rest. Assets use the same item category / subcategory masters (no separate asset category APIs). `src/modules/masters/index.js` aggregates all sub-routers: @@ -1197,7 +1196,6 @@ router.use('/gst-rates', require('./gst-rates/gst-rates.routes')); router.use('/warehouses', require('./warehouses/warehouses.routes')); router.use('/payment-terms', require('./payment-terms/payment-terms.routes')); router.use('/delivery-terms', require('./delivery-terms/delivery-terms.routes')); -router.use('/asset-categories', require('./asset-categories/asset-categories.routes')); router.use('/departments', require('./departments/departments.routes')); router.use('/designations', require('./designations/designations.routes')); router.use('/plants', require('./plants/plants.routes')); @@ -1276,7 +1274,6 @@ BigInt.prototype.toJSON = function () { /api/v1/masters/warehouses /api/v1/masters/payment-terms /api/v1/masters/delivery-terms -/api/v1/masters/asset-categories /api/v1/masters/departments /api/v1/masters/designations /api/v1/masters/plants diff --git a/BACKEND_TASKS.md b/BACKEND_TASKS.md index b7dfedc..cd3082c 100644 --- a/BACKEND_TASKS.md +++ b/BACKEND_TASKS.md @@ -162,15 +162,15 @@ Each sub-master supports: `GET /` (list), `GET /:id`, `POST /`, `PUT /:id`, `DEL | Status | Sub-master | Base path | |--------|------------|-----------| | [x] | UOM | `/masters/uom` | -| [x] | Item Categories | `/masters/item-categories` | -| [x] | Item Subcategories | `/masters/item-subcategories` | +| [x] | Item Categories | `/masters/item-categories` | Optional asset defaults: `code_prefix`, `default_useful_life_years`, `default_depreciation_method` | +| [x] | Item Subcategories | `/masters/item-subcategories` | Filter: `item_category_id` — shared by items + assets | | [x] | Items | `/masters/items` | | [x] | Brands | `/masters/brands` | | [x] | GST Rates | `/masters/gst-rates` | | [x] | Payment Terms | `/masters/payment-terms` | | [x] | Delivery Terms | `/masters/delivery-terms` | -| [x] | Asset Categories | `/masters/asset-categories` | -| [x] | Asset Subcategories | `/masters/asset-subcategories` | Filter: `asset_category_id` | +| [~] | Asset Categories | removed — use Item Categories | +| [~] | Asset Subcategories | removed — use Item Subcategories | | [x] | Departments | `/masters/departments` | | [x] | Designations | `/masters/designations` | | [x] | Locations | `/masters/locations` | Unified plants + warehouses (`type`: `plant` \| `warehouse`) | @@ -178,7 +178,7 @@ Each sub-master supports: `GET /` (list), `GET /:id`, `POST /`, `PUT /:id`, `DEL | [x] | Warehouses | `/masters/warehouses` | Alias — warehouse locations only | | [x] | Document Series | `/masters/document-series` | -**Masters total:** 14 modules × 5 endpoints = **70 APIs** [x] +**Masters total:** 12 modules × 5 endpoints (+ plants/warehouses aliases) — asset category masters retired; assets use item categories --- diff --git a/docs/MODULE_DATA_FLOW.html b/docs/MODULE_DATA_FLOW.html index 2dbff02..bd10b60 100644 --- a/docs/MODULE_DATA_FLOW.html +++ b/docs/MODULE_DATA_FLOW.html @@ -210,27 +210,36 @@ } .diagram-viewport { - overflow: auto; - max-height: 70vh; - padding: 1rem; - cursor: grab; + position: relative; + overflow: hidden; + height: min(70vh, 560px); + min-height: 280px; background: #fafbfc; + touch-action: none; + user-select: none; } + .diagram-viewport.can-pan { cursor: grab; } .diagram-viewport.is-panning { cursor: grabbing; } + .diagram-stage { + position: absolute; + inset: 0; + overflow: hidden; + } + .diagram-canvas { display: inline-block; - min-width: 100%; transform-origin: 0 0; - transition: transform 0.12s ease-out; + will-change: transform; } .diagram-canvas .mermaid, .diagram-canvas svg { display: block; - margin: 0 auto; + margin: 0; max-width: none !important; + pointer-events: none; } .diagram-fullscreen { @@ -302,25 +311,36 @@ .diagram-fullscreen-viewport { flex: 1; - overflow: auto; - padding: 2rem; - cursor: grab; - display: flex; - align-items: flex-start; - justify-content: center; + position: relative; + overflow: hidden; + background: #0f172a; + touch-action: none; + user-select: none; } + .diagram-fullscreen-viewport.can-pan { cursor: grab; } .diagram-fullscreen-viewport.is-panning { cursor: grabbing; } + .diagram-fullscreen-stage { + position: absolute; + inset: 0; + overflow: hidden; + } + .diagram-fullscreen-canvas { display: inline-block; - transform-origin: center center; + transform-origin: 0 0; + will-change: transform; background: var(--surface); border-radius: 8px; padding: 1.5rem; box-shadow: 0 25px 50px rgba(0, 0, 0, 0.35); } + .diagram-fullscreen-canvas svg { + pointer-events: none; + } + .diagram-fullscreen-hint { position: absolute; bottom: 1rem; @@ -357,7 +377,9 @@ main { margin-left: 0; max-width: 100%; } .diagram { break-inside: avoid; } .diagram-toolbar { display: none; } - .diagram-viewport { max-height: none; overflow: visible; } + .diagram-viewport { height: auto; min-height: 0; overflow: visible; } + .diagram-stage { position: static; overflow: visible; } + .diagram-canvas { transform: none !important; } } @@ -462,7 +484,7 @@ flowchart LR M2[item-categories / subcategories / items] M3[brands / gst-rates] M4[payment-terms / delivery-terms] - M5[asset-categories / subcategories] + M5[item-categories / subcategories] M6[departments / designations] M7[locations / plants / warehouses] M8[document-series] @@ -565,7 +587,10 @@ flowchart TD PT --> PO DT[delivery_terms] --> PO - ACAT[asset_categories] --> ASUB[asset_subcategories] + ICAT[item_categories] --> ISUB[item_subcategories] + ISUB --> ITEMS[items] + ICAT --> ASSETS[assets] + ISUB --> ASSETS ACAT --> ASSET ACAT --> GRN_AUTO[GRN auto-asset creation] ASUB --> ASSET @@ -646,12 +671,12 @@ stateDiagram-v2
asset_codedocument_series via ASSET_{category.code}asset_name#N if qty > 1)asset_category_id / asset_subcategory_iditem_category_id / item_subcategory_idplant_idwarehouse_id, vendor_id, po_id, grn_id, grn_item_idpurchase_dategrn.grn_datepurchase_costgrn_items.rateuseful_life_years, depreciation_methodasset_categories defaultsuseful_life_years, depreciation_methoditem_categories defaultsconditionNEWstatusIN_USE
flowchart TD
subgraph Inputs
- CAT[asset_categories defaults]
+ CAT[item_categories defaults]
FORM[User form fields]
end
@@ -951,9 +976,11 @@ erDiagram
items ||--o{ purchase_order_items : ordered
items ||--o{ grn_items : received
- asset_categories ||--o{ asset_subcategories : has
- asset_categories ||--o{ assets : classifies
- asset_subcategories ||--o{ assets : sub_classifies
+ item_categories ||--o{ item_subcategories : has
+ item_categories ||--o{ items : classifies
+ item_categories ||--o{ assets : classifies
+ item_subcategories ||--o{ items : sub_classifies
+ item_subcategories ||--o{ assets : sub_classifies
assets ||--o{ asset_amc_contracts : has
assets ||--o{ asset_insurance_policies : insured_by
@@ -1039,15 +1066,17 @@ erDiagram
- Fullscreen: scroll to zoom · drag to pan · + / − / 0 keys · Esc to exit
+ Drag to move · Scroll or Ctrl+scroll to zoom · + / − / 0 keys · Esc to exit