Skip to content

Prasada Operations — Mini ERP

From raw material to the devotee’s hands — one ledger for the entire prasada chain, and a disbursal app that honours every receipt exactly once.

Prasada is prepared in a working kitchen, carried to several sales counters and handed out at staff disbursal points — in very large volumes on festival days. Every stage used to keep its own paper register. We replaced them with a single stock ledger that follows each batch from the raw materials that went into it to the counter that sold it.

01

Raw-material issue

Store issues materials to the kitchen against a numbered indent.

02

Production batch

Expected yield computed from inputs; short, excess and wastage recorded per batch.

03

Packing & units

Pieces, packets, trays and baskets — loose pieces kept exactly, never rounded away.

04

Batch transfers

Kitchen to counters, checked against each batch's remaining allowance.

05

Counter sales

One-tap quantities, server-side pricing, cash or UPI, thermal receipt.

06

Disbursal

Receipt QR scanned, entitlement worked out by rules, issue logged.

07

Reconciliation

Daily stock register where every day opens on the previous day's close.

Stock can't go negative — the database won't allow it

Stock is an append-only ledger of events and movements, with balances held per location and in total. Nothing is ever edited or deleted: a correction is a reversal that posts the opposite movement, so the history always adds up.

Every sale, transfer and batch locks the rows it touches inside a single transaction, and a check constraint in the database refuses any balance below zero. Two counters selling the last packet at the same instant can't both succeed — and the test suite proves it.

Wastage rates are set by an administrator but frozen onto each batch when it is recorded, so changing a setting next month never rewrites last month.

Counter abstract report — transaction range, opening and closing stock, transfers, packets sold, cash and UPI split, sales by user
Counter abstract · printed at thermal width or emailed · test data

Counters that can't double-sell

Solution

Prices come from the server, never typed by staff. Sales are idempotent, so a double-tap or a retried request is recorded once. Staff choose a counter per session, and a sale sent from a stale page aimed at another counter is rejected.

Disbursal that survives bad networks

Solution

A native Android scanner reads the receipt QR, routes it to the right source system and snapshots the entitlement so it can't change later. Each issue is logged on the device and retried with its original time. A durable outbox feed carries only receipt IDs and counts — no personal data.

A register auditors recognise

Solution

The month view mirrors the paper register column for column. Closing stock is derived — opening plus production, minus wastage, sales, transfers and every class of issue — with a live preview while entering, stale-edit protection and a full audit trail.

Reports by counter, kitchen or day

Solution

Abstracts for any date range and location: first and last transaction, opening and closing stock, transfers, mixed historical prices, cash and UPI split and a per-staff summary — printed at thermal width, emailed, or exported to CSV.

7Stages on one ledger
4Connected apps · web, Android, dashboards
1×Every sale recorded once · idempotent
0Deleted entries · reversals only
Stock Ledger Batch Traceability Row-level Locking PHP & MySQL Kotlin · CameraX ML Kit QR Flutter UPI QR Payments Thermal Printing Audit Trail
Reading messy receipts

Receipts arrive from three systems with different formats. Configurable patterns route each one to its source, and server-side matching scores seva names against a prasada catalogue to work out exact quantities — packets, cloth, mementos and more — while catching failed payments and out-of-window claims.

Offline-first log

Every handover is logged on the phone with a sync state. When the network drops, staff keep working; pending records retry automatically and carry their original issue time, so the audit trail stays true.

Idempotent by design

The server records a disbursal inside a locked transaction. A replay from a retrying phone returns "already recorded" and keeps the first timestamp — a receipt is honoured once across every device.

Reporting

A date-range admin dashboard covers operations, collections, item abstracts and receipt-level audit with trends and CSV export, plus an emailed day report. An outbox-based feed is built to pass disbursal counts to the stock ledger with retries and acknowledgements.

Handing out the right offering, exactly once, even when the network drops.

Devotees who booked a seva collect their prasada at a staff counter. The entitlement depends on the seva, the amount and the date — and the counter can't afford to argue, guess or hand it out twice. Staff scan the receipt; the app tells them exactly what to hand over and blocks a second claim.

  • Five clear outcomes: valid, already issued, not eligible, invalid, not today
  • Camera QR scanning tuned for a busy counter
  • Remote configuration — rules change without an app update
  • Live in daily use, with documented incident recovery
Kotlin · CameraX ML Kit Offline Sync PHP & MySQL Outbox Pattern Admin Reports

Part of the digital ecosystem we build and run for a major religious institution.

← All work

Need something similar? Let's talk.

Booking systems, ERPs, dashboards — if your bottleneck looks anything like this one, the first conversation is free.

Book a free project consultation