Production Schedule
Production Schedule is where you plan what to bake and when, track each run from Planned through In Progress to Done, and — when a run finishes — confirm the actual yield and let BazaarPOS automatically deduct the linked recipe's ingredients from stock.
Overview
Every row is a production run: a recipe (or free-text item name) scheduled for a date and time with a planned quantity, optionally assigned to a staff member.
Runs move through a simple status flow — Planned → In Progress → Done — or can be Cancelled at any point before Done.
Marking a recipe-based run Done opens a Confirm Completion modal that deducts every linked ingredient from Inventory in one step, auto-calculates the batch's expiry date from the recipe's shelf life, and lets you record any yield variance.
Two extra tools sit above the run list: a Demand Forecast panel that suggests quantities based on recent sales history, and a Today's Bake List panel that aggregates demand from Cake Orders and Standing Orders due today, with a one-click Suggest PO for any ingredient shortfall.
Before You Start
- Recipes should exist first (Recipes page) if you want ingredient-linked stock deduction and expiry auto-fill; runs can also be scheduled as free text with no recipe, in which case no stock is touched on completion.
- Demand Forecast needs recent sales history against a recipe to produce a suggestion — brand-new recipes show "No sales history found".
Step-by-Step Guide
1 Schedule a production run
- Click Schedule Production (or the equivalent header button).
- Pick a Recipe from the dropdown, or leave it as "— No recipe (free text) —" and type an Item/Product Name instead.
- Set Date * (required), Start Time, Quantity to Produce and Assigned To (staff name), plus any Notes.
- If a recipe is selected, a live "Ingredients needed for N units" preview appears below, scaled automatically from the recipe's own yield — ingredients without a linked product show an orange ⚠ warning that stock will not auto-deduct for that line.
- Click Schedule.
2 Advance a run through its status
- Click Start on a Planned run to move it to In Progress.
- Click Mark Done on an In Progress run — if the run has a linked recipe, this opens the Confirm Completion modal instead of updating instantly; for a free-text run with no recipe it advances directly to Done.
3 Confirm completion and deduct ingredients
- In the Confirm Completion modal, review the Planned Qty and adjust Actual Qty Produced if the real yield differed — a variance badge (▲/▼ with a percentage) appears automatically when they differ.
- Confirm or adjust the Expiry Date, pre-filled from the recipe's Shelf Life Days (or the run's own existing expiry if the recipe has none set); leave blank if not applicable.
- Add optional Completion Notes, e.g. "Oven ran hot".
- Review the Materials to Deduct list — each ingredient's quantity is the recipe's ingredient quantity × planned quantity; ingredients with no linked product show a warning that stock will not change.
- Click Confirm & Deduct.
4 Use the Demand Forecast to schedule ahead
- Choose a forecast window — Next 3, 7, 14 or 30 days — and click Generate.
- BazaarPOS looks at recent sales history per recipe and suggests a daily quantity; recipes with no sales history are simply omitted from the list.
- Click Schedule next to any suggestion to open the Schedule Production Run form pre-filled with that recipe and its suggested quantity, dated for tomorrow.
5 Follow Today's Bake List
- The Bake List panel (only shown when there is at least one item needed) aggregates demand from today's Cake Orders and any Standing Orders due today into one combined list per product, with small tags showing which customer or order contributed to each quantity.
- Click Schedule next to any line to open a pre-filled production run for that product, dated today.
6 Turn ingredient shortfalls into a Purchase Order
- Click Suggest PO in the Bake List panel header.
- BazaarPOS analyses every planned run for that date and lists any ingredient that does not have enough current stock, showing how much is needed versus what is currently on hand.
- Pick a Supplier from the dropdown (or type a name manually if none exist yet) and an Expected Delivery Date.
- Click Create PO (N items) — only ingredients linked to a real Product are added; unlinked shortfalls are shown for visibility but excluded from the purchase order.
7 Print a batch label
- Once a run is Done, click the tag icon to open the Product Label preview — showing the recipe name, batch (production) date, Best Before date if an expiry was set, quantity, prepared-by staff name, and an allergen warning line if the recipe has any tagged allergens.
- Click Print to send it to your label or receipt printer.
8 Filter and clean up the run list
- Use the date picker to jump to any day, or click All dates to see every run regardless of date.
- Use the status tabs — All / Planned / In Progress / Done / Cancelled — to narrow the list.
- Delete a Done or Cancelled run permanently using the × icon once you no longer need it in the list.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Schedule Production (header button) | Opens the Schedule Production Run form. |
Date filter + All dates | Restricts the list to one date, or clears the date filter entirely. |
Status tabs | All / Planned / In Progress / Done / Cancelled. |
Demand Forecast panel | Day-window selector (3/7/14/30 days) and Generate button; suggests quantities per recipe from recent sales history. |
Today's Bake List panel + Suggest PO | Combined demand list from Cake Orders and Standing Orders due today; Suggest PO opens the shortfall-based purchase order helper. |
Date / Recipe-Item / Planned / Actual / Time / Assigned To / Status / Actions columns | The production run table. |
Start | Advances a Planned run to In Progress. |
Mark Done | Advances an In Progress run to Done — opens Confirm Completion first if the run has a linked recipe. |
Cancel (ban icon) | Cancels a run that has not yet been marked Done; no stock is affected. |
Print label (tag icon) | Only shown on Done runs; opens the batch label preview and print dialog. |
Delete (× icon) | Only shown on Done or Cancelled runs; permanently removes the run from the list. |
Recipe dropdown / Item-Product Name | Pick an existing recipe, or type a free-text item name if none applies. |
Date * / Start Time / Quantity to Produce / Assigned To / Notes | The core fields of the Schedule Production Run form. |
Scaled ingredient preview | Live ingredient quantities scaled from the recipe's yield to the entered production quantity, shown while scheduling. |
Actual Qty Produced * | Entered in the Confirm Completion modal; compared against Planned Qty to compute the yield variance. |
Yield variance badge | ▲ or ▼ with a percentage, shown whenever Actual Qty differs from Planned Qty. |
Expiry Date (completion) | Pre-filled from the recipe's Shelf Life Days; editable or can be left blank. |
Completion Notes | Free-text notes recorded against the completed run. |
Materials to Deduct list | Shows exactly what will be deducted from Inventory before you confirm. |
Confirm & Deduct | Applies the completion — deducts linked ingredients, sets status to Done, records actual quantity and expiry. |
Suggest PO shortfall list + Supplier + Expected Delivery Date + Create PO | The Bake Plan PO helper — analyses planned runs, lists ingredient shortfalls, and creates a purchase order for the linked ones. |
Tips & Best Practices
- Schedule production the evening before for anything needing a shelf-life-based expiry the next morning — the "1 day before delivery" convention used when scheduling straight from a Cake Order keeps this consistent.
- Always confirm the Actual Qty Produced honestly, even when it matches the plan exactly — the variance history is what makes recipe yields reliable over time.
- Check the Bake List's Suggest PO before a big order weekend — it turns your planned runs directly into a ready-to-send purchase order instead of manually re-counting ingredients.
- Print batch labels the moment a run is marked Done, while the tray or rack is still in front of you, to avoid mixing up batch dates later.
Troubleshooting & FAQ
Marking a run Done didn't ask me anything, it just changed status.
Some ingredients weren't deducted after I completed a run.
The Expiry Date field was empty when I opened Confirm Completion.
Suggest PO shows a shortfall but I can't add it to the PO.
I don't see a Demand Forecast suggestion for a recipe I know sells well.
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/fnb/ProductionPage.jsx
Backend endpoints used:
GET /bakery/productionPOST /bakery/productionPUT /bakery/production/:idDELETE /bakery/production/:idPOST /bakery/production/:id/completeGET /bakery/production/demand-forecastGET /bakery/production/bake-planGET /bakery/production/bake-plan-poGET /recipesGET /recipes/:idGET /suppliersPOST /purchaseorders
Related tables (db-core repositories):
ProductionRunRecipeInventoryStockMovementCakeOrderStandingOrderSupplierPurchaseOrder
Redux slices:
None — local component state only
Feature flag key: production
Exported as FnbProductionPage from pos-react-lib. The label print uses a React portal (ReactDOM.createPortal) rendered directly under <body> together with a print-only CSS rule that hides everything else on the page during window.print(), so only the label itself is sent to the printer. Deduction quantities are always recipe ingredient quantity × the run's planned quantityToBake — entering a different Actual Qty Produced only affects the recorded variance, not how much stock is deducted.