Reverse-engineered from the 10 Oct 2026 demo recording

Cares ERP Teardown

A rebuild spec for the oats-production ERP that Cares Limited (Foodcare and Nutino brands) runs today. Everything here comes from the 24-minute Google Meet screen share, its audio, and the Gemini meeting notes. Items marked proposed are my recommendation for the rebuild, not something observed in the current system.

Current system cloudmvc.clouderp.com.bd ("DEMO") Company Cares Limited, Benapole warehouse Presented by Israil Hossain (Accountants role) Attendees anirruzzaman anir, Mohammad Ali Recorded 18:35–19:00, 10 Oct 2026

What the factory does

  • Buys raw material (oats) and packing material (jars, labels, cartons, induction foil).
  • Issues them to production lines against a daily floor requisition.
  • Packs finished goods in many SKUs, from 40 g sachets up to 10 kg bags.
  • Sells to dealers and distributors on credit. Deliveries go out with a challan and gate pass, then accounts verifies the challan and records payment.

Sample product catalogue (seen in the Sales Order item picker)

  • 100010001 Foodcare Oats-1 Kg
  • 100010002 Foodcare Oats (Pouch)-900g
  • 100010003 Foodcare Oats-500g
  • 100010004 Foodcare Oats(Pouch)-400g
  • 100010005 Foodcare Oats and Chia seeds-500g
  • 100010006 Foodcare Oats-10 Kg
  • 100010007 Foodcare Oats-40 g Shaset
  • 100010008 Foodcare Oats Atta
  • 100010009 Ausimex Baby Oats-500gm
  • 100010011 Nutino Oats Khichuri-500g
  • 100010012 Nutino Oat Bran
  • 1100010002 Nutino Oats Khichuri-45g

Business flows

The demo walked these three chains end to end. Each arrow is a screen in the current system, and each step has its own status column (unfinished, unapproved, approved, checked).

Procure to stock

flowchart LR
  PR["Purchase Requisition (PR / MR)
Purchase › Product PR"] --> PO["Purchase Order
Purchase › Product PO"] PO --> APO["Approve PO
Purchase › Approve PO"] APO --> UP["Upcoming PO Receive
Warehouse › Purchase Receive"] UP --> QC["QC Inspection
Warehouse › QC Inspection"] QC --> GRN["PO Receive / MRR
stock +"] GRN --> AP["Supplier payable
Accounts › Payment Voucher"] GRN -. reject .-> RET["GRN-wise Return
stock −"]

Plan to produce

flowchart LR
  BOM["BOM entry
product + line + qty"] --> STR["Daily Floor Requisition (STR)
Production"] STR --> WIS["Warehouse issues RM/PM
Production Line Issue (PI)"] WIS --> RCV["Line confirms & receives PI
RM stock − / WIP +"] RCV --> BAT["Batch Assignment"] BAT --> FG["Production Receive (FG)
batch-wise"] FG --> FGI["FG Issue to warehouse
FG stock +"]

Order to cash

flowchart LR
  SO["Sales Order
header → items → Confirm"] --> ASO["Approve SO
Unapproved SO List"] ASO --> DC["Delivery Challan + Gate Pass
Warehouse, FG stock −"] DC --> INV["Invoice Bill print
customer copy"] INV --> CV["Challan Verification
Accounts › Sales Chalan Verification"] CV --> RV["Receipt Voucher
cash or bank"] RV --> GL["General Ledger / Party Balance"] DC -. return .-> SR["Invoice-wise / Bulk Sales Return"]
BOM sample from the Production Line Issue screen, for Foodcare Oats-1 Kg on Section 1, 1,125 units: Oats 1,125 kg · JAR-1 KG 1,125 pcs · Label-1 Kg 1,125 · 1 Kg Carton 94 pcs (12 jars per carton) · Induction Foil 1 Kg (wax lamination, 104 mm) 1,125 pcs.

Architecture

Current system (observed)

  • Server-rendered PHP pages. One file per screen, e.g. /app/views/sales_mod/wo/do_fcare.php.
  • One folder per module: auth, mis_mod, purchase_mod, warehouse_mod, production_mod, sales_mod, acc_mod.
  • Dashboards are picked by ?mod_id=: 2 Accounts, 3 Purchase, 4 Warehouse, 5 Sales, 9 Production, 10 MIS.
  • Multi-tenant login: Company ID + username + password. The header shows the company and warehouse ("Cares Limited, Benapole") and the user's IP.
  • Access control: a user has a level (1–5) and a checklist of menu items per module (MIS › User Management).
  • Documents (challan, invoice) are HTML print views with barcodes, printed from the browser.
  • Some query strings carry customer-specific flags (_fcare.php, mhafuz=2), so the code looks forked per client.
  • The database is not visible. MySQL is the usual pairing with this stack, but that is a guess.

Proposed rebuild proposed

flowchart TB
  subgraph Clients
    WEB["Web app (React SPA)
role-based menus"] MOB["Mobile / tablet
QC, gate, delivery"] end WEB --> GW MOB --> GW GW["API gateway
auth (JWT), tenant, rate limit"] --> API subgraph API["Modular monolith (REST /api/v1)"] AUTH["Auth & MIS
users, roles, permissions, audit"] MD["Master data
items, units, parties, territory"] PUR["Purchase"] WH["Warehouse / Inventory
stock ledger"] PRD["Production
BOM, STR, batch"] SAL["Sales"] ACC["Accounts
GL, vouchers"] POST["Posting engine
doc → stock + GL entries"] end PUR --> POST WH --> POST PRD --> POST SAL --> POST POST --> ACC API --> DB[("PostgreSQL
one schema, tenant_id on every row")] API --> RDS[("Redis
cache, queues")] API --> OBJ[("Object storage
attachments")] RDS --> JOBS["Workers
PDF challans/invoices, reports, exports"] JOBS --> OBJ

Key design choices

  • All stock lives in one stock_ledger (signed quantity per item, warehouse and batch). Balances are summed or cached from it, never edited directly. This prevents the negative-stock problem visible in the demo.
  • Every document follows one lifecycle: draft → submitted → approved → posted → cancelled. Posting writes stock and GL rows in one transaction.
  • Cancelling posts a reversal entry, so the MIS "delete" and "recalculate" tools are no longer needed.

Cross-cutting

  • Permissions are stored as codes (sales.so.approve) rather than menu IDs, and each menu item maps to one.
  • Number series per document type and year (e.g. SO26…, challan 2610000…).
  • Audit log on every write. Attachments go to object storage.
  • Bangla and English labels. Amounts in BDT with taka-in-words on printouts.

Modules & menus

The complete sidebar tree for each module, transcribed from every menu state opened in the recording. Spelling follows the current system ("Roll" means Role, "Chalan" means Challan). Badge counts like "Product PR 5" are pending-item counters.

Pages: screenshot + sketch

30 distinct screens appear in the recording. Each one shows the screen as captured (click to enlarge) beside a wireframe of its layout. Screens that were opened but never shown (Payment Voucher, Cash Book and others) are listed in the menus above but have no screenshot.

Database tables proposed

Tables and columns needed to support every screen above. Every table also carries tenant_id, created_by, created_at, updated_at, so those are left out of the lists. PK marks the primary key, and → table marks a foreign key.

API routes proposed

A REST API under /api/v1, grouped by module. Click any route to see an example payload and response. List routes accept ?from=&to=&status=&q=&page=&per_page= and return { data: [...], meta: { page, per_page, total } }. Errors return { error: { code, message, fields } }.

Coverage proposed

Every sidebar menu item from the recording, with the tables it reads or writes and the API routes behind it. The delete and recalculate tools in MIS map to cancel and reverse routes, because the rebuild never hard-deletes posted documents.

Findings & open questions

Problems visible in the demo

  • Negative stock. The Warehouse dashboard shows Present Stock −125,954.67 and Inventory Value −400,471,591.89. The system lets issues and deliveries go through without enough stock.
  • Accounts dashboard never loads. Its cards stayed on "Checking..." for the whole session.
  • Fixing mistakes means deleting. MIS holds delete and recalculate tools (Challan Delete, SR Delete, MRR Delete, Voucher Delete). The presenter said forgotten sales orders get deleted through Super Admin by SO number.
  • Bank receipts are typed in by hand. The bank sends the details and accounts enters each receipt voucher manually.
  • Broken logo image ("this is img"), plus inconsistent labels and typos throughout.

Questions to settle before building

  • One company or several? Login asks for a Company ID, and the address on the printouts is Mirpur, Dhaka, while the warehouse is Benapole.
  • Which depots and warehouses exist? The menus include Depot Transfer and a "Foodcare BD (Uttara)" customer.
  • Is the BOM fixed per SKU, or entered for each run? The BOM screen asks for product, line and quantity each time.
  • Batch and expiry tracking for finished goods: is it required for food-safety recalls?
  • VAT, AIT and Mushak (NBR) invoice formats: are they needed on the invoice?
  • Approval chains: who approves PR, PO, SO and returns, and at which amount limits?
  • Is POS / local sales in scope? The Sales dashboard shows a "Total POS Sales" tile.
  • Bank integration: could receipts be imported from bank statements instead of typed?
  • Which reports matter most? The meeting ended with a plan to analyse first and come back.
The Gemini notes list "Remove duplicate items" as a next step. In the recording this is the presenter reading out the MIS menu item Item Management › Duplicate Item Remove. It is a feature of the system, not an agreed action.

Transcript

The meeting audio is Bengali. This is a machine translation into English, made in 25-second chunks. Loops where the speech model repeated itself have been trimmed, and very short filler lines dropped. The wording is rough: use it to find the moment something was said, and use the screenshots for the facts. The On screen column is the page that was showing at that time.

TimeOn screenWhat was said (English, machine-translated)
Gemini's own transcript (in the attached meeting notes) heard the Bengali as English and is mostly fragments. It does identify the speakers: Israil Hossain is presenting, and anirruzzaman anir and Mohammad Ali are asking the questions.