## 1. Database

- [x] 1.1 Add migration: `lunch_items.price` nullable decimal(12,2), backfill all existing rows to 32000.
- [x] 1.2 Add migration: `lunch_orders.price` nullable decimal(12,2), backfill from each order's `lunch_items.price` (via join, only where currently null).

## 2. Models

- [x] 2.1 Add `price` to `LunchItem::$fillable` and cast it to float.
- [x] 2.2 Add `price` to `LunchOrder::$fillable` and cast it to float.
- [x] 2.3 Add `total_amount` (sum of `active_orders().price`) to `LunchBookingMenu::getSummary()`.

## 3. Item creation/update

- [x] 3.1 `LunchItemController::store()`: add `price` validation rule (`nullable|numeric|min:0`) and update the OpenAPI doc block.
- [x] 3.2 `LunchItemController::update()`: same validation + doc update.

## 4. Menu creation (custom items)

- [x] 4.1 `LunchMenuController::store()`: change `custom_items` validation from `array|required_without:items` (of strings) to `custom_items.*.name` (required string) + `custom_items.*.price` (nullable numeric), and update the OpenAPI doc block.
- [x] 4.2 `LunchMenuController::store()`: update the custom-items loop to read `name`/`price` from each object and pass `price` into `LunchItem::create()`.
- [x] 4.3 Add `price` to the item column selects in `LunchMenuController::report()` and `LunchMenuController::getOrdersByMenu()` so item price is visible in those responses.
- [x] 4.4 Fix: when a `custom_items` entry matches an existing item by name, backfill that item's price from the request if the item currently has no price (do not overwrite an item that already has a price).

## 5. Order snapshot logic

- [x] 5.1 `LunchOrderController::store()`: after validation and before `LunchOrder::create()`, set `$data['price']` from the ordered item's current price.
- [x] 5.2 `LunchOrderController::update()`: when `item_id` is present in the update payload, refresh `$data['price']` from the new item's current price.
- [x] 5.3 `LunchOrderController::createByAdmin()`: same snapshot as 5.1.
- [x] 5.4 `LunchOrderController::updateByAdmin()`: same snapshot as 5.2 when `item_id` changes.

## 6. Reporting

- [x] 6.1 `LunchOrderController::ordersReport()`: add `sum(price) as total_amount` to the existing per-employee `selectRaw` aggregation, alongside `number_orders`.
- [x] 6.2 `OrderExport::transformData()`: add the order's `price` to each exported row.

## 7. Verification

- [x] 7.1 Manually exercise: create item with/without price, create menu with a custom item + price, place an order, change the order's item, and confirm `GET /admin/lunch-orders/report` returns the expected `total_amount` for the test employee.
- [x] 7.2 Run `openspec validate add-lunch-item-price --strict` and fix any reported issues.
