# W1-NUT — Standalone measurements page · Ramadan print labels · weights notes (full-stack, Nutrition)

Migration timestamp range: `2026_11_25_200001…200099`. Read `_COMMON.md` first.

## 1. Separate measurements page for reception/nursing (client: «فصل صفحة القياسات عن الكشوفات، لأن القياسات بيعملها الاستقبال أو التمريض، الكشوفات فقط اللي عند الطبيب»)
Today: the nutrition visit has a «البيانات والقياسات» tab inside `/clinic/encounter/:id` (`features/clinic/clinical-types/clinical-types.ts:46-50`, `features/clinic/encounter/consultation.component.html:319-336`, shell card `features/clinic/visit-shell/specialties/nutrition.cards.ts:60-71`) with permission `nutrition.visit.measure` (granted to receptionist + nurse in `Core/database/seeders/StandardRolesSeeder.php:59,75`). But the route needs `clinic.encounters.view`, which those roles lack → they can't reach it. Nurse worklist `/clinic/stations/vitals` hosts the general vitals panel only.
Build:
- Route `/clinic/stations/measurements` («القياسات») guarded by `nutrition.visit.measure` (+ sidebar entry under Clinic for that permission). Worklist = today's nutrition-department appointments/visits (arrived / waiting / in-progress, filter by doctor, search patient), each row shows measured ✓/✗ and last weight; opening a row shows the SAME nutrition measurements panel the visit uses (reuse the component — do not fork it), with save, then back to the list. Measurements recorded here appear in the doctor's visit immediately (same data).
- If the encounter doesn't exist yet when reception measures (patient arrived, doctor hasn't opened), make it work: either measurements attach to the patient/appointment and the encounter picks them up, or the page opens/ensures the encounter via the existing `ensureForAppointment` path without changing its status for the doctor. Pick the approach that matches how Nutrition stores measurements (check Nutrition controllers/services for body composition / weights — FK to encounter? patient?). Note: another agent (W1-CL) is adding a pay-before-start gate on encounter open/begin — measurement must NOT trip that gate (don't call begin; if you must ensure an encounter, use a path that doesn't "start" the consult, and say which in your report).
- BE: make the measurement read/write endpoints authorize with `nutrition.visit.measure` (without requiring `clinic.encounters.view`), company-scoped. Add a small worklist endpoint if needed (`GET nutrition/measurement-worklist?date=&doctor_id=`).
- Doctor side: optional setting `nutrition.measurements.doctor_tab` (default true) — keep the tab for the doctor (read + edit) so nothing is lost.

## 2. Ramadan print (client: «لما تختار سحور وإفطار… الإفطار يكون سحور، والغداء يكون إفطار، والعشاء ميطلعش في الطباعة»)
Today: `features/nutrition/plans/print/plan-print-builder.ts:203-214 fastingSection()`, `dailyShape(..., fasting)` ~:257 — the fasting shape («صيام (سحور / إفطار)», ar.json:15061, `print_shape` per patient plan, `PatientPlanController.php:99`) changes colours/layout only. Meal names are free text per PlanMeal (no meal type); dinner hidden only if empty. Meal types `suhoor`/`iftar` exist in `Nutrition/app/Support/NutritionMeta.php:37-38`.
Build: in the fasting print shape, map meal labels — breakfast (فطار/إفطار/الفطور/breakfast) → «سحور»; lunch (غداء/الغداء/lunch) → «إفطار»; dinner (عشاء/العشاء/dinner) → not printed at all (even with items). Snacks unchanged. Matching: normalise Arabic (strip ال, hamza variants, spaces) + English, case-insensitive. Put the map in one small pure function with the label sets as constants; if PlanMeal has a meal type/slot field anywhere use it first. Apply to every print path that renders meals in fasting shape (daily + weekly shapes). Only the print, not the stored plan.

## 3. Weights notes (client: «جزء الأوزان يكون فيه ملاحظات… موجودة فعلاً بس مش بتظهر… نقلل مساحة خانات الأرقام والباقي لصالح الملاحظات»)
Today: `features/nutrition/visit/cards/board-weights.component.ts:72,104` has a notes column; `board-weights.component.scss:80-84` hides `.col-notes/.note-cell` at ≤1600px; `.note-cell` max 220px (:38). The note shown = encounter chief complaint (`Nutrition/app/Services/Visit/VisitTimelineService.php:71`).
Fix: never hide notes; number columns compact (fixed narrow width, tabular numerals, ~56–72px), notes column takes the remaining width with wrap (2-line clamp + full text on hover/tap). Also check the measurements entry form (the panel in item 1): if there's a notes field for the measurement, give it the wide column there too; if body composition/weights have no notes field (`Nutrition/app/Models/BodyComposition.php:30` has none) add a `notes` text column (migration) + input in the panel, and show THAT note in the weights board (fallback to chief complaint when empty).

## Acceptance
- Receptionist/nurse (roles from StandardRolesSeeder) open `/clinic/stations/measurements`, record weights, the doctor sees them in the visit.
- Fasting print shows سحور/إفطار and no dinner.
- Weights board shows notes on a 1366px laptop.
- Tests: endpoint auth with measure-only role; label mapper (if you add a BE part); notes column persists.
