Procurement App =============== **Purpose**: Manage material catalog, inventory, stock allocation, and local procurement when stock is unavailable. Responsibilities ---------------- - Maintain material catalog (chargers, cables, mounting hardware, electrical components) - Track stock levels per zone - Check material availability for installations - Allocate materials from zone stock to specific installations - Create local procurement requests when stock is insufficient - Manage vendor directory - Coordinate with Finance for vendor payments Dependencies ------------ - **installations** — MaterialAllocation and ProcurementRequest are linked to installations - **finance** — Vendor payment triggered after local procurement - **accounts** — Procurement staff, zone-based stock locations Key Models ---------- - **Material** — Catalog item with SKU, category, and unit of measurement. - **MaterialStock** — Inventory levels per material per zone. Includes reorder thresholds. - **MaterialAllocation** — Records material allocated to a specific installation. Tracks dispatch and delivery status. - **ProcurementRequest** — Request to procure materials locally when zone stock is insufficient. Tracks cost estimates and vendor assignment. - **Vendor** — Local vendors for material procurement. Stores payment details (UPI ID, bank account). Business Rules -------------- - Stock is zone-scoped — an installation in Zone A can only use stock from Zone A. - When stock falls below ``reorder_level``, an alert should be generated (future: auto-procurement request). - Local procurement requires a vendor to be assigned before proceeding. - Estimated cost must be provided before procurement is approved. - After materials are received, actual cost is recorded for Finance to process payment. - Materials can be returned to stock if an installation is cancelled (via ``returned`` allocation status).