Document Details
Purpose
This catalog defines rules governing recipe composition, menu planning, production records, forecasting, inventory, and review workflows.
View or Download
Document Preview
Business Rules
| ID | Rule Statement | Enforcement Point | Evidence | Evidence Quality | Exceptions / Notes |
|---|---|---|---|---|---|
| BR-001 | Item names are required and normalized for uniqueness. | src/services/item_service.py |
normalize_item_name, duplicate-name tests |
Observed | Duplicate suggestions use suffixes such as Name (1). |
| BR-002 | Item type is constrained to recipe or base food. | database/schema.sql, item services |
item.item_type, tests |
Observed | Future customizable item types are deferred in docs. |
| BR-003 | Recipes require yield quantity/unit, ingredients, instructions, and primary cooking method. | src/services/recipe_service.py |
recipe validation tests; docs/agent_context/recipe_collection.md |
Observed | Base foods are intentionally lighter weight. |
| BR-004 | Base foods do not require recipe yield, serving fields, or cooking method in MVP. | Schema/tests/docs | tests/test_db_init.py; docs/agent_context/recipe_collection.md |
Observed | Base-food authority fields support later scaling and inventory. |
| BR-005 | Advanced hotel-pan units are allowed for live scaling and Forecasting, not recipe/base-food authoring. | Unit config and validation services | src/config/units.py; docs/agent_context/recipe_collection.md; route/service tests |
Observed | They remain available in Forecasting and live detail views. |
| BR-006 | Workflow statuses are submitted, reviewed, approved, analyzed, live, and rejected. |
src/config/statuses.py, src/services/workflow_service.py |
Status config and workflow tests | Observed | returned to submitter is represented through status and resubmission flag, not a separate status. |
| BR-007 | Reviewer, dietitian, admin, and super user roles have distinct workflow portal access. | src/config/roles.py, src/services/workflow_service.py |
Portal definitions and policy tests | Observed | Mock auth supplies current user context in MVP. |
| BR-008 | Some workflow actions require reason text, including returns/send-backs/rejections. | src/services/workflow_service.py |
requires_reason action definitions; workflow tests |
Observed | Reason labels vary by action. |
| BR-009 | A recipe must have both mass and volume yield data before it can go live. | transition_item_status |
src/services/workflow_service.py; route test test_go_live_requires_recipe_mass_and_volume_measurements |
Observed | Applies to recipes when action code is go_live. |
| BR-010 | Menu concepts, meal periods, days, and menu statuses are controlled lists. | src/config/menu_builder.py |
Menu config and tests | Observed | Concept order affects display order, not slot identity. |
| BR-011 | Menu slot assignments must use live items. | src/services/menu_service.py |
test_replace_menu_slot_items_rejects_non_live_items |
Observed | Supports both recipes and base foods. |
| BR-012 | Forecasting is assignment-oriented; production summary is item-oriented. | src/services/menu_forecast_service.py |
docs/agent_context/menu_builder.md; forecast tests |
Observed | One item may roll up across assignments. |
| BR-013 | Forecast case mode stores visible case quantity separately from calculated production yield. | src/services/menu_forecast_service.py, schema |
Forecast tests and docs | Observed | Advanced case mode can link to recipe ingredient basis. |
| BR-014 | Batch split percentages must total 100. | src/services/menu_forecast_service.py |
test_save_menu_forecast_batch_splits_requires_total_100 |
Observed | Batch split rows can also carry planned time. |
| BR-015 | Production forecast accuracy is calculated against implied demand, not raw production. | src/services/production_record_service.py |
docs/agent_context/menu_builder.md |
Observed | Implied demand equals actual production minus signed end-service variance. |
| BR-016 | Posted production facts exclude draft records. | src/services/production_record_service.py |
test_posted_production_facts_exclude_drafts |
Observed | Posted facts contract is versioned as v1. |
| BR-017 | Inventory counts are live operational counts, not finalized accounting periods. | Inventory docs and services | docs/agent_context/inventory.md; README.md |
Observed | Weekly finance/accounting finalization is future scope. |
| BR-018 | Current on hand sums active location item rows after normalizing each/case entry. | src/services/inventory_service.py |
inventory service tests | Observed | Display may prefer case display for case-counted rows. |
| BR-019 | Inventory catalog identity is separate from Recipe Collection culinary identity. | database/schema.sql, bridge service |
inventory_catalog_item, inventory_item_match; inventory docs |
Observed | Current count entry still accepts live base-food item_id for compatibility. |
| BR-020 | Catalog review default scope is demand-driven, not all live base foods. | src/services/inventory_bridge_service.py, docs |
get_inventory_catalog_review_page; README |
Observed | scope=all exists for audit/debug. |
| BR-021 | One active preferred substitute is allowed per inventory catalog item. | Schema and bridge service | idx_inventory_catalog_substitute_preferred; substitute tests |
Observed | Non-preferred active substitutes are available for manual override. |
| BR-022 | Vendor invoice staging supports manual, CSV fixture, vendor API, PDF, and email source types at schema level. | database/schema.sql |
inventory_vendor_invoice.source_type check |
Observed | Current implementation supports manual/CSV fixture/dev generation. |
| BR-023 | Invoice line matching currently uses vendor-code/catalog links and manual review. | src/services/inventory_invoice_service.py |
invoice service tests and inventory docs | Observed | Name/category fallback matching is documented as later work. |
| BR-024 | Invoice placement is not an accounting post or finalized receiving workflow. | Inventory docs and service behavior | docs/agent_context/inventory.md |
Observed | It seeds a count row using invoice quantity/unit. |
| BR-025 | Planning uses vendor/category preferences when configured and a marked 7-day default when not configured. | src/services/inventory_ordering_service.py, src/services/inventory_usage_service.py |
planning tests and README | Observed | Future item-level vendor resolution is still needed. |
BA Alignment
- Activity areas: Analyze requirements and define design options; manage requirements lifecycle.
- Techniques used: Business rules analysis, document analysis, interface analysis, acceptance criteria extraction.