# Willow Event Kitchen: costing and daily operations

Fictional restaurant costing, inventory and daily-operations records for the period 2026-08-20 to 2026-09-02 inclusive. Currency CAD. Snapshot 2026-09-08.

## Where the numbers come from

Every figure here is derived from the shared operating model `business-restaurant-catering`, published in this catalog as `/files/data/business-kits-v1/restaurant-catering/operating-model.json`. The same supplier ids, ingredient ids, purchase prices, recipe lines, menu prices, sales rows, staff and shifts are used, so a cost can be traced back to a purchase row by id.

- Purchase rows inside the period: 24, dated 2026-08-26 and 2026-09-02.
- Sales rows inside the period: 56 across 4 menu items.
- Net menu sales in the period: 28781.90 CAD.
- Cost of goods sold: 2106.63 CAD (1100.18 opening + 1886.41 purchases - 879.96 closing).
- Food cost: 7.32 percent of net menu sales.

## Rounding

Every rounding step is half up, at a fixed number of places, and the same rule is written into the workbook formulas so a spreadsheet reproduces the published value:

| Quantity | Rule |
| --- | --- |
| Pack price | pack size times the reference purchase unit price, 2 places |
| Unit cost from pack | pack price divided by pack size, 6 places |
| Cost per recipe unit | unit cost divided by recipe units per stock unit, 8 places |
| As-purchased quantity | recipe quantity divided by the yield fraction, 3 places |
| Line cost | as-purchased quantity times cost per recipe unit, 4 places |
| Plate cost, values, totals | 2 places |

A pack size that is not a whole number of stock units leaves a residual, because the pack price is rounded to the cent before the costing divides it back down. 1 of 6 ingredients here have a non-zero residual; `ingredient-conversions.csv` reports it per ingredient in its last column, to six places.

## Files

| File | What it holds |
| --- | --- |
| `ingredient-conversions.csv` | Purchase pack to stock unit to recipe unit, with the reference purchase behind every price. |
| `plate-costs.csv` | One row per recipe line, with the yield-adjusted quantity and line cost. |
| `plate-costs.json` | The same costing as a nested document, including the rounding rules. |
| `recipe-costing.xlsx` | The costing again as live formulas rather than values. |
| `recipe-costing-report.pdf` | A readable costing report for the same menu items. |
| `yield-tests.csv` | Raw to trimmed to cooked, with the yield factor each test produces. |
| `yield-test-sheet.xlsx` | The yield tests as formulas, with a column that checks each test against the yield the recipe applies. |
| `inventory-count-sheet.csv` | Opening and closing counts, par levels, theoretical closing and variance. |
| `inventory-count-messy.csv` | The same closing counts as a real count sheet arrives: mixed units, blank lines, a mid-shift row and a ragged record. |
| `inventory-variance.xlsx` | Counted against theoretical on hand, priced at standard cost. |
| `cogs-report.xlsx` | Opening plus purchases less closing, with the reconciliation worked out. |
| `cogs-report.json` | The same statement as a document, listing every purchase id it used. |
| `cogs-report-inconsistent.csv` | A cost of goods sold report built on a closing count that contradicts the count sheet. |
| `waste-spoilage-log.csv` | Dated waste entries whose quantities feed the variance sheet. |
| `sales-mix-pmix.csv` | Product mix for the period: quantity, mix percent, margin. |
| `sales-mix-pmix-unknown-items.csv` | A product mix carrying item names the menu does not have. |
| `z-report-daily-cashup.txt` | A printed daily Z-read: covers, voids, comps, tenders, over and short. |
| `z-report-daily-cashup.json` | The same Z-read as structured data. |
| `tip-pool-distribution.csv` | A tip pool split to whole cents that sums to the declared pool. |
| `tip-pool-one-cent-short.csv` | The same pool, one cent short. |
| `labour-schedule.csv` | Shift segments with split shifts and shifts that end the next day. |
| `labour-hours-overtime.xlsx` | Weekly and daily overtime on Monday-start work weeks. |
| `labour-overtime-wrong-week.csv` | The same hours grouped into Sunday-start weeks. |
| `haccp-temperature-log.csv` | Twice-daily unit temperatures with limits and corrective actions. |
| `cleaning-schedule.csv` | Cleaning tasks with frequency, chemical, contact time and next due. |
| `allergen-matrix.csv` | One row per menu item across the fourteen listed allergens. |
| `allergen-matrix-missing-row.csv` | The same matrix with one menu item missing. |
| `circular-reference.xlsx` | A workbook with three intentional circular references. |
| `error-cells.xlsx` | Cached and live cells for every Excel error value. |
| `README.md` | This file. |

## Files that deliberately disagree

Five files in this folder contradict another file on purpose. Each one is internally consistent, so a reader cannot spot it without comparing it against the file named beside it. Two further files are deliberately broken in a way that contradicts nothing: `circular-reference.xlsx` cannot be evaluated at all, and `error-cells.xlsx` is a catalogue of error values. Every other file in this folder agrees with every other file.

1. **`cogs-report-inconsistent.csv` contradicts `inventory-count-sheet.csv` and `cogs-report.xlsx`.** Row 3 reports a closing count of 22.91 kg for ING-03 (Chickpeas), which is the counted figure with the two decimal digits transposed. The count sheet, the variance workbook and `cogs-report.json` all count 22.19 kg. Every derived value in the inconsistent file follows the wrong count, so its total cost of goods sold is 2104.76 CAD against the correct 2106.63 CAD, a difference of -1.87 CAD.

2. **`tip-pool-one-cent-short.csv` does not sum to its own declared pool.** The last allocation row (EMP-04) reads 61.55 where the exact largest-remainder share is 61.56. The allocation rows therefore sum to 234.49 CAD while the total row still declares the pool as 234.50 CAD: a shortfall of 0.01 CAD. `tip-pool-distribution.csv` closes exactly.

3. **`allergen-matrix-missing-row.csv` is missing a menu item that the recipes cost.** MENU-04 (Reception plate) has 5 costed recipe lines in `plate-costs.csv` and appears in `sales-mix-pmix.csv`, but it has no row in the matrix. Its correct row would declare: milk: Yogurt. `allergen-matrix.csv` has all 4 rows.

4. **`labour-overtime-wrong-week.csv` groups work weeks on the wrong day.** It starts each week on Sunday where the declared policy, and `labour-hours-overtime.xlsx`, start on Monday. Grouped correctly, the period carries 5.00 payable overtime hours and 51.50 CAD of premium. Grouped on Sunday it carries 3.00 hours and 31.50 CAD.
   The hours that disappear belong to EMP-01 in the work week beginning 2026-08-24: 46.00 scheduled hours against a 44 hour threshold, which the Sunday grouping splits across two weeks so neither one crosses it.

5. **`sales-mix-pmix-unknown-items.csv` reports items the menu does not contain.** MENU-90 and MENU-91 are not in the menu table, and the first row renames MENU-01 to "Chicken  buffet portion (lunch)" with a doubled space and a suffix. `sales-mix-pmix.csv` uses only the 4 real menu ids and names.

## The messy count sheet

`inventory-count-messy.csv` is not wrong, it is awkward. It holds the same closing counts as `inventory-count-sheet.csv` once the following are applied, and it is the only text file in this folder carrying a byte order mark, a semicolon delimiter or CRLF line endings:

- CRLF line endings and a UTF-8 byte order mark.
- A semicolon delimiter and a decimal comma.
- Two blank lines and one section banner line that is not a data record.
- ING-03 is split across two locations; 7,40 + 14,79 = 22,19 kg.
- ING-02 is counted as 2 x 10,00 kg plus 1,37 kg = 21,37 kg.
- ING-04 has a superseded mid-shift row at 14:20 reading 30,03; only the 21:55 end-of-shift row is authoritative.
- The ING-06 row has an empty bin code and a tenth field ("recount requested") where the header declares nine.
- One row carries trailing whitespace in three fields and a leading-zero bin code that a spreadsheet will silently turn into a number.

## Things worth knowing before using these as a benchmark

- Food cost lands at 7.32 percent, which is well below what a real kitchen of this type would run. The recipe quantities and menu prices come from the shared operating model, which was written to exercise supplier price history rather than to model a calibrated margin. The arithmetic is exact; the business is optimistic.
- Closing stock runs high against menu usage for several ingredients, for the same reason: the purchase volumes in the shared model are not sized against the sales volumes.
- The period opening count is declared by the count sheet, not taken from the shared model, because that model's opening quantity belongs to 2026-07-15 and this period starts on 2026-08-20. The house rule is written into the count sheet: open at twice par, and never below the level that covers period usage and waste while still leaving par on hand at the close, rounded up to the whole stock unit.
- Water, salt and minor seasonings sit outside the shared six-ingredient purchase study, so they sit outside these plate costs too.

## Compliance records

`haccp-temperature-log.csv` holds 84 readings across 3 units, twice a day for fourteen days. 2 readings fall outside their limit (TEMP-038, TEMP-071) and each carries the corrective action that was recorded. The within_limit column is computed from the limits in the same row, so it never disagrees with the reading beside it.

`allergen-matrix.csv` is derived from the recipe lines, not written by hand. If a dish contains a dairy ingredient its milk column reads Y, and the allergen_sources column names the ingredient responsible. Oats are treated as a gluten-containing cereal, and chocolate is declared for soy because of lecithin. This is a data-consistency fixture, not allergen advice, and it covers only the ingredients inside the shared purchase study.

## Scope

All entities, staff, guests, suppliers, prices and transactions are fictional. Recipe quantities are costing inputs, not food-safety or production instructions. The labour files are a scheduling and arithmetic exercise with a declared overtime policy; they are not payroll or employment advice, and they do not model statutory holiday pay, averaging agreements, benefits or deductions.
