At a Glance
Module purpose: Internal stock movement document —Issue(to a direct-cost destination) orTransfer(location-to-location) with approval workflow and three-quantity tracking (requested / approved / issued) · Audience: Outlet Manager / Requester, Approver, Store Keeper / Fulfiller, Receiver, Inventory Controller, Finance · Key entities/tables:tb_store_requisition,tb_store_requisition_detail,StockMovement,JournalEntry,enum_doc_status,enum_sr_type· Sub-pages: 15


A Store Requisition (SR) is an internal document that one location uses to draw stock from another — typically a consuming outlet (kitchen, bar, restaurant, banquet) requesting goods from a central or main store. Each SR carries a header (reference number, date, requesting/source location, destination location, movement type, description, status, totals) and one or more item lines that specify the product, unit of measure, requested quantity, approved quantity, issued quantity, unit cost, and line total. The movement type — Issue (consumption to a direct-cost destination) or Transfer (location-to-location inventory move) — drives both the stock-movement records and the journal entries that posting generates.
SRs progress through a controlled lifecycle: Draft (editable, no impact) → In Process (submitted for approval) → Approved (approver may reduce requested quantities or reject lines) → Issued (source location commits stock OUT and the system writes the stock-movement record) → Received / Complete at the destination, or Reject / Void for terminal cancellations. The flow supports partial fulfillment at the line level, so a 10-unit request may be issued as 8 with the remainder rejected or back-ordered, and every transition is logged with user, timestamp, and notes for audit.
The SR module is the system of record for internal stock movement between locations. It enforces approval routing, reserves inventory once approved, validates availability at the source before issue, records the OUT movement at source and the IN movement at destination on transfer, and generates the cost-allocation journal entries that move expense from the central store's inventory account to the consuming outlet's cost centre.
In a hospitality operation, the central store buys and holds inventory in bulk, but the cost of goods actually consumed must land on the outlet that consumed them — the kitchen, the bar, the banquet operation. The Store Requisition is the control that lets the central store release stock to a consuming location while creating the paper trail that attributes the cost to the right cost-centre. Without this control, food cost reporting per outlet is impossible; with it, every issued ingredient is traceable from store shelf to plate, and every outlet manager can be held accountable for the cost they draw against budget.
The approval workflow exists because internal stock is real money. Outlets do not get to pull from the central store at will — requests are reviewed against operational need, par levels, current on-hand at the source, and budget. Approvers can trim requested quantities before issue, reject lines that are not justified, or return the document with a comment. This both prevents over-issue (which inflates outlet cost or leaves the store short for other outlets) and creates segregation of duties between the staff requesting the stock and the staff releasing it.
Financially, every posted issuance generates journal entries that credit the source location's inventory account and either debit the destination's inventory account (for a Transfer) or debit the destination's consumption expense account on its cost-centre (for an Issue). Costing uses the source location's current method — weighted-average or FIFO — so the value moved is consistent with how the source values its remaining stock, and food-cost reporting per outlet rolls up cleanly from the SR-driven journal entries.
movement.source / movement.sourceName. The source's costing method (weighted-average or FIFO) determines the unit cost applied to each issued line, and availability at the source is validated both at creation (SR_CRT_006) and again at the moment of issue to prevent negative stock.movement.destination / movement.destinationName. The destination's locationType (direct for cost-centre consumption, inventory for an onward inventory holding) is what gates the allowed movement type: Issue requires a direct-cost destination, Transfer requires an inventory destination.Issue posts a single stock OUT at source and routes the value to the destination's consumption expense account — used when stock leaves inventory and is immediately consumed (kitchen pull, bar pull). Transfer posts a stock OUT at source and a paired stock IN at destination — used when stock physically moves between two inventory-holding locations without yet being consumed. The choice determines which journal entries are written and which downstream documents (e.g. a paired GRN) may be involved.Approve, Reject (with mandatory reason), Split & Reject (partially approve), or Send Back for correction. Approvers may modify qtyApproved downward from qtyRequired but never above it. Approval history — actor, action, timestamp, comment — is persisted for audit, and approval can be delegated.qtyRequired is what the outlet asked for; qtyApproved is what the approver authorised (≤ qtyRequired); qtyIssued is what the store keeper actually released at fulfillment (≤ qtyApproved). These three numbers, taken across many SRs, drive variance analysis and supply-planning decisions.StockMovement row capturing commitDate, postingDate, source and destination location, movement type, inQty / outQty, unitCost, totalCost, lot detail (for lot-tracked items), and a reference back to the originating SR. This is the immutable record the inventory sub-ledger reconciles against.JournalEntry rows that credit the source's inventory GL account and debit either the destination's inventory account (Transfer) or the destination's consumption expense account on its cost-centre (Issue). Entries must balance (debits = credits) and are blocked if the posting date falls in a closed period.| Role | Responsibility |
|---|---|
| Outlet Manager / Requester | Identifies stock needs at the consuming location, creates the SR, adds items with requested quantities and required dates, attaches supporting notes, and submits the document for approval. Tracks status until receipt at the outlet. |
| Approver / Department Head | Reviews submitted requisitions against operational need, par levels, and source availability; approves, trims qtyApproved down from qtyRequired, rejects lines with a reason, splits a request, or sends it back for correction. Approval signature is persisted for audit. |
| Store Keeper / Fulfiller | Receives approved requisitions at the source location, picks the items, records qtyIssued per line (which may be less than qtyApproved if stock is short), commits the stock-movement, and releases the goods. May select specific lots for lot-controlled items. |
| Receiver | Confirms physical receipt of the issued goods at the destination, flags discrepancies between issued and received quantities, and closes out the requisition. |
| Inventory Controller / Manager | Oversees the entire SR flow, monitors variance and partial-fulfillment patterns, reconciles inventory sub-ledger against GL postings, manages approval thresholds, and signs off on period-end activity. |
| Finance Team | Verifies cost-centre mapping and journal entries, reconciles outlet food-cost reports against SR postings, and ensures cost allocation between departments is accurate at period close. |
Cross-module flow:
Master configuration:
../carmen/docs/store-requisitions/../carmen-inventory-frontend/../carmen-turborepo-backend-v2/../carmen-turborepo-backend-bruno/../carmen-inventory-frontend-e2e/tb_store_requisition, tb_store_requisition_detail, comment tables), enums (enum_doc_status, enum_sr_type), relationships, and divergences from carmen/docs.enum_comment_type user/system tagging.SR_VAL_*), calculation (SR_CALC_*, quantity invariant), authorization (SR_AUTH_*, SoD), posting (SR_POST_*, single posting event at in_progress → completed), and cross-module rules (SR_XMOD_*).issued_qty, selects lots, commits.