5
📦

Inventory Management — Forms

Purchases · donations-in-kind · dispense · stock levels

Inventory Management — Form Specifications

Module slug: inventory · UX/forms agent · 2026-05-02 Models the flow of consumables — samagri (rice, ghee, flowers, dhoop, oils), kitchen supplies, books, prasadam ingredients — through purchase, donation-in-kind, dispense, and event-driven kits. Sanskrit terminology preserved per framework HTML; samagri kit names match the framework's dropdown options.


Form 5.1 — Inventory Item Master

Purpose: Register a stock-keeping unit (SKU) with category, unit of measure, and stock thresholds. Who fills: Stores manager · once per item · revisited if thresholds change or item discontinued.

Field Type Required Options / Validation Default Help
SKU text Yes uppercase alphanum + hyphen, unique per tenant auto: INV-{seq} E.g. INV-RICE-PR
Item Name text Yes 255 chars — E.g. Rice (Sona Masuri)
Item Name (Sanskrit) text No Devanagari, VijayaDV preserved — E.g. तण्डुल
Samagri Category dropdown Yes Samagri / Kitchen-Raw / Kitchen-Spice / Flowers / Dhoop-Incense / Oils-Ghee / Books / Cleaning / Office-Supply / Prasadam-Ingredient / Other — Drives reports
Sub-category text No 40 chars — E.g. grain, pulse
Unit of Measure (primary) dropdown Yes kg / g / litre / ml / piece / packet / metre / bundle / dozen kg Internal stock UoM
Secondary UoM dropdown No same options — E.g. packet
Conversion Factor (primary per secondary) number conditional required if Secondary set; step 0.0001 1 E.g. 1 packet = 0.5 kg → 0.5
Is Perishable checkbox No — unchecked If checked, batch/expiry capture mandatory at GRN
Shelf Life (days) number conditional required if Perishable —
HSN Code text No 20 chars — For GST
GST Rate (%) number No 0.00–28.00 step 0.01 0
Minimum Threshold (qty) number No step 0.001 ≥ 0 — Triggers low-stock alert
Maximum Threshold (qty) number No step 0.001 ≥ Min —
Reorder Quantity number No step 0.001 ≥ 0 — Suggested PO size
80G Eligible (donation-in-kind) checkbox No — unchecked Disallowed for jewellery, perishables
Active checkbox Yes — checked
Notes textarea No 1000 chars —

Submit action: POST /api/inventory/items. Creates row in inventory_items. Stock-level rows are created lazily per branch on first movement. Related forms: Vendor Catalog Entry (5.2) attaches per-vendor rates; Samagri Kit Template Editor (5.8) lists items.


Form 5.2 — Vendor Catalog Entry

Purpose: Record a vendor's rate for a specific inventory item, with payment terms and lead time. Who fills: Procurement officer · per vendor-item pair · revisited when rate changes.

Field Type Required Options / Validation Default Help
Vendor lookup Yes from Vitta vendors master — Single vendor master across modules
Item lookup Yes from inventory_items —
Rate per UoM (INR) number Yes step 0.0001 ≥ 0 — Per primary UoM of item
Currency dropdown No INR / USD INR Future-proofing
Minimum Order Qty number No step 0.001 ≥ 0 —
Lead Time (days) number No 0–365 — Days from PO to delivery
Last Purchased On date No ≤ today — Auto-populated from latest GRN
Payment Terms dropdown Yes Advance / Net-7 / Net-15 / Net-30 / COD Net-15
Is Preferred Vendor checkbox No — unchecked Only one preferred per item; UI enforces
Notes textarea No 500 chars —

Submit action: POST /api/inventory/vendors/{vendor_id}/catalog. Upsert on (vendor_id, item_id). Related forms: Purchase Order Compose (5.3) auto-fills rate from this catalog.


Form 5.3 — Purchase Order Compose

Purpose: Create a PO for one vendor with multiple item lines; supports event-triggered POs. Who fills: Procurement officer · per PO · revisited at approval / send / cancel.

Field Type Required Options / Validation Default Help
PO Number text Yes unique per tenant auto: PO-{YY}-{seq}
PO Date date Yes ≤ today today
Branch dropdown Yes tenant's branches current Procuring branch
Vendor lookup Yes from vendors —
Expected Delivery Date date No ≥ PO Date PO Date + vendor lead time Auto-suggested
Fund Tag dropdown Yes General / Annadana / Building / FCRA / Endowment General Mirrors Vitta fund segregation
Triggered by Event lookup No from event_instances — Set when generated from event indent
Triggered by Indent lookup No from event_samagri_indents — Set automatically when from indent
Notes textarea No 1000 chars —

Sub-form (line items, repeatable):

Field Type Required Options / Validation Default Help
Item lookup Yes from inventory_items —
Quantity number Yes step 0.001 > 0 —
UoM read-only Yes from item primary —
Rate number Yes step 0.0001 ≥ 0 from vendor catalog Editable override
Line Total read-only computed qty × rate —

Footer: Subtotal · Tax (GST computed from item rates) · Total — all read-only.

Submit action: POST /api/inventory/purchase-orders saves as draft. Approval (separate action) sets status to approved. Send action triggers Comms email to vendor with PDF attachment ("Purchase Order on Letterhead" template). Related forms: Vendor Catalog (5.2) auto-populates rates; Goods Receipt (5.4) closes the loop.


Form 5.4 — Goods Receipt (GRN)

Purpose: Record items physically received against a PO; reconcile expected vs actual quantity. Who fills: Stores in-charge · per delivery · revisited only for inspection-failure correction.

Field Type Required Options / Validation Default Help
GRN Number text Yes unique per tenant auto: GRN-{YY}-{seq}
Linked PO lookup Yes active POs of vendor — Disables already-completed POs
Receipt Date date Yes ≤ today today
Received By (Staff Member) lookup Yes from members current user's member-id
Vendor Invoice Number text No 63 chars — For Vitta payable
Vendor Invoice Date date No ≤ today —
Inspection OK checkbox Yes — checked Uncheck triggers rejection notes
Rejection Notes textarea conditional required if not OK —
Vehicle / Mode of Delivery text No 127 chars — E.g. KA-09-XX-1234, Hand-carried
Notes textarea No 1000 chars —

Sub-form (line items pre-populated from PO, editable):

Field Type Required Options / Validation Default Help
Item read-only Yes from PO line —
Ordered Qty read-only — — —
Received Qty number Yes step 0.001 ≥ 0 ≤ Ordered Ordered Variance highlighted
Condition dropdown Yes Good / Damaged / Partially-Damaged Good
Batch Number text conditional required if item perishable —
Expiry Date date conditional required if item perishable; ≥ today —
Line Notes text No 255 chars —

Submit action: POST /api/inventory/purchase-orders/{po_id}/receipts. Increments stock_levels per line. Auto-creates vendor_payables row in Vitta tagged with PO's fund. Updates PO line received_quantity and PO status (partially-received or completed). Related forms: Purchase Order (5.3) is parent; Stock Level View (5.7) reflects new balances.


Form 5.5 — Donation-In-Kind Entry

Purpose: Register a donor's contribution of physical goods (samagri, food, books, equipment); 80G eligible if item category permits. Who fills: Reception / store officer · per donation event · final-state.

Field Type Required Options / Validation Default Help
Donor (Member) lookup Yes from members (search/create) — If new, opens member-create modal first
Donation Date date Yes ≤ today today
Branch dropdown Yes tenant's branches current Receiving branch
Item lookup Yes from inventory_items —
Quantity number Yes step 0.001 > 0 —
UoM read-only Yes from item primary —
Fair Market Value (INR) number conditional required if 80G — For 80G certificate
80G Eligible checkbox conditional enabled only if item category permits depends on item Auto-disabled for jewellery, perishables
Receipt Number text conditional auto-generated if 80G auto: DKR-{YY}-{seq} Reserved on save
Occasion text No 127 chars — E.g. Datta Jayanti, daughter's wedding
In the Name Of text No 255 chars — If donation is in another's name (memorial)
Acknowledgement Channel dropdown No Email / WhatsApp / Postal / In-Person / None Email Triggers Comms send
Notes textarea No 1000 chars —

Submit action: POST /api/inventory/donations-in-kind. Increments stock_levels. If 80G, generates certificate via Vitta and queues acknowledgement via Comms. Donor tagged with donor-in-kind. Related forms: Inventory Item Master (5.1) — is_80g_eligible cascades; Stock Level View (5.7) reflects increment.


Form 5.6 — Dispense Record

Purpose: Issue stock from inventory for a stated purpose — event, daily nitya pooja, kitchen, gift, sale, maintenance, or wastage. Who fills: Stores in-charge · per dispense (often barcode/QR-driven later) · daily volume.

Field Type Required Options / Validation Default Help
Item lookup Yes from inventory_items with current stock — Shows balance
Branch dropdown Yes tenant's branches current Dispensing branch
Dispense Date date Yes ≤ today today
Quantity number Yes step 0.001 > 0; ≤ current stock (soft warn if exceeds) —
UoM read-only Yes from item primary —
Purpose dropdown Yes Event / Daily-Nitya / Kitchen / Gift / Sale / Maintenance / Wastage — Drives next-fields
Linked Event lookup conditional required if Purpose = Event — from event_instances
Linked Indent lookup conditional optional if Purpose = Event — from event_samagri_indents
Issued To (Member) lookup No from members — E.g. archaka, kitchen-staff
Recipient Description text conditional required if Purpose = Gift / Sale and recipient not a member — E.g. visiting acharya
Force-Negative override checkbox (admin) No — unchecked If checked, allows dispense exceeding stock; audit-logged
Notes textarea No 1000 chars —

Submit action: POST /api/inventory/dispense. Decrements stock_levels. Rejects on negative balance unless force-negative is set (then logs audit_event). Related forms: Generate Samagri Indent (5.9) often pre-populates dispense; Maintenance Completion (Form 6.3) writes purpose=Maintenance dispenses.


Form 5.7 — Stock Level View (Filter Form)

Purpose: Browse current stock with filters; trigger reorder POs from low-stock results. Who fills: Stores manager · query-only · daily glance.

Field Type Required Options / Validation Default Help
Branch dropdown No tenant's branches + "All" All
Category dropdown (multi) No same as item category —
Sub-category text No partial match —
Show only Low-Stock checkbox No — unchecked Items below minimum_threshold
Show only Perishables checkbox No — unchecked
Search by Name / SKU text No partial match —
As-of Date date No ≤ today today Computes historical stock

Output table columns: SKU · Name · Category · Branch · Current Qty · UoM · Min · Max · Reorder Qty · Last Movement · Status badge (OK / Low / Out / Over).

Submit action: GET /api/inventory/stock-levels with query params. From a low-stock row, "Reorder" button opens Form 5.3 pre-filled with item, suggested vendor (preferred from catalog), suggested qty (reorder_quantity). Related forms: Purchase Order Compose (5.3) is the reorder destination.


Form 5.8 — Samagri Kit Template Editor

Purpose: Define a reusable kit of items needed for a specific seva or festival; multipliable per event. Who fills: Pradhana Archaka or Procurement officer · once per kit · revisited rarely.

Field Type Required Options / Validation Default Help
Kit Code text Yes unique per tenant auto: KIT-{seq}
Kit Name dropdown (with "Custom") Yes Maha Ganapati Homa Kit / Marriage Kit (Bride Side) / Marriage Kit (Groom Side) / Maha Shivaratri Abhisheka / Custom — "Custom" reveals free-text Kit Name input
Kit Name (Sanskrit) text No Devanagari, VijayaDV preserved — E.g. महागणपतिहोमसामग्री
Description textarea No 2000 chars — What ritual/event this serves
Bound Seva lookup No from sevas (existing DISA) — Optional bind for auto-pull on event
Bound Seva Category lookup No from sevaCategories — Broader bind
Active checkbox Yes — checked

Sub-form (line items, repeatable; drag-and-drop ordering):

Field Type Required Options / Validation Default Help
Item lookup Yes from inventory_items — Type-ahead search
Quantity per Unit-Event number Yes step 0.001 > 0 — E.g. 0.5 kg per kalyanotsavam
UoM read-only Yes from item primary —
Is Critical checkbox No — unchecked If missing, ritual cannot proceed; flagged red
Substitute Items lookup (multi) No from inventory_items — Acceptable substitutes
Line Notes text No 255 chars — E.g. yellow only, fresh

Submit action: POST /api/inventory/samagri-kits. PATCH replaces all lines. Preview pane shows "what gets bought when this kit fires for 1 event" with vendor rate compare. Related forms: Generate Samagri Indent (5.9) consumes this kit; Inventory Item Master (5.1) is the line source.


Form 5.9 — Generate Samagri Indent (from Kit + Event)

Purpose: Produce an indent worksheet for an event from a kit template × multiplier; show stock vs shortfall, route to dispense / PO. Who fills: Event coordinator (post event-confirmation) · per event · revisited if event scope changes.

Field Type Required Options / Validation Default Help
Event lookup Yes from event_instances (status confirmed or planned) —
Kit Template lookup conditional required unless seva-bound kit auto-resolved from event's seva → kit Override allowed
Quantity Multiplier number Yes step 0.01 > 0 1 E.g. 50 kalyanotsavams × 1 kit = 50
Indent Generation Date date Yes ≤ Event Date − 1 day today
Branch dropdown Yes tenant's branches event's branch
Notes textarea No 1000 chars —

Output worksheet (per kit line): Item · Required Qty · Current Stock at Branch · Shortfall · Suggested Action (Dispense / PO) · Suggested Vendor · Suggested Rate · Estimated Cost.

Worksheet actions per row: Dispense (calls Form 5.6) · Add to PO (groups by suggested vendor and opens Form 5.3 pre-filled).

Submit action: POST /api/inventory/events/{event_id}/generate-indent. Creates event_samagri_indents parent + lines. Status starts draft. Approval moves to approved. Fulfilment can be dispense-from-stock, purchase-order, or mixed. Critical lines block fulfilment until resolved. Related forms: Samagri Kit Template (5.8) is the source; Purchase Order (5.3) and Dispense Record (5.6) are downstream.


Workflow notes

  1. First-time setup order: 5.1 (items) → 5.2 (vendor rates) → 5.8 (kit templates). Then transactional forms (5.3, 5.4, 5.5, 5.6) flow as operations occur.
  2. Stock movement chain: every PO line eventually closes via 5.4 (GRN) → stock incremented; every dispense via 5.6 → stock decremented; donations-in-kind (5.5) → stock incremented.
  3. 80G eligibility logic: items must have is_80g_eligible=true AND donor must consent. Jewellery and perishables auto-disable.
  4. Force-negative dispense: allowed only with admin role; every such dispense gets an audit_event row.
  5. Event-driven flow: Event (Form 7.x) → Indent (5.9) → branches into Dispense (5.6) for stocked items + PO (5.3) for shortfalls.
  6. Kit critical lines: if marked critical and stock + PO won't arrive in time → blocks event confirmation in the Events module.