Skip to content

Scheduling & salinity guide ​

Tiếng Việt: Hướng dẫn Lịch ca & Độ mặn

This handbook covers the two workforce hubs managers use most for who works when and broth quality checks:

  • Schedule & roster (/schedule) — plan shifts, publish them to staff phones, handle time off, and review today's floor.
  • Salinity (/salinity) — configure pho/broth check schedules, notify the right people, record readings, and follow up on missed slots.

Related guides: Manager & staff guide · Floor employee guide (mobile schedule & salinity capture) · Task Manager guide (playbooks tied to shifts)

All calendar days and shift times use Asia/Ho_Chi_Minh (Hanoi, UTC+7) unless IT overrides SCHEDULE_TIMEZONE.


Table of contents ​

Part A — Scheduling ​

  1. Who uses what
  2. Open Schedule & roster
  3. Shift schedule — the main planning grid
  4. Cell colours and what they mean
  5. Manager workflow — plan and publish a week
  6. Bulk edit, copy schedule, and export
  7. Time off — staff submit, managers approve
  8. Today's roster
  9. Calendar tab (read-only view)
  10. Staff mobile — My schedule

Part B — Salinity ​

  1. What salinity checks are for
  2. Open Salinity and the three tabs
  3. Initial setup — pho types then branch settings
  4. Slot statuses explained
  5. Today's checks — live timeline and history
  6. Notifications — who gets reminded and when
  7. Staff mobile — record a check
  8. Acknowledge a missed slot

Reference ​

  1. Permissions by role
  2. Troubleshooting

Part A — Scheduling ​

1. Who uses what ​

WhoWhereWhat they do
Restaurant Manager / Head ChefDesktop → Schedule & rosterPlan hours, publish shifts, approve time off, export CSV
Floor & kitchen staffPhone → Schedule tab or My scheduleSee published shifts and day status (off, time off, unscheduled, etc.)
Staff (time off)Phone → Time off tab or /my-scheduleSubmit leave requests; track approval status
Any managerToday's roster tabQuick headcount for today

Staff cannot edit the team calendar. They set availability and time-off requests; managers build the roster from that input.


2. Open Schedule & roster ​

  1. Sign in on a computer with a manager account (Digital Manager layout).
  2. Click the calendar icon on the left rail → /schedule.
  3. Page title: Schedule & roster.

Tabs at the top ​

TabPurpose
Shift schedule (default)Main planning grid — set OFF / hours per person per day, publish drafts
CalendarRead-only time-grid view (day / week / month)
Today's rosterWho is on the floor today
Time offApprove or reject staff leave requests

Note: Shift-change and payroll tabs may appear in future releases; they are hidden in the current build.


3. Shift schedule — the main planning grid ​

This is where managers spend most of their scheduling time.

Toolbar ​

ControlWhat it does
BranchRequired — loads employees for that location
All positionsFilter by job title (Server, Grill, etc.)
All departmentsFilter by department
Schedule rangeWhole month · 1 week · 2 weeks · 3 weeks
◀ Today ▶Move the visible date window
Publish ({n} drafts)Makes draft shifts visible on staff phones
Bulk editApply OFF / Hours / Unscheduled to many cells at once
Export CSVDownload roster spreadsheet with hours
Copy scheduleCopy OFF/hours pattern from a prior week or month

Tap a cell (employee × day) ​

A dialog opens with three modes:

ModeEffect
UnscheduledClear override — grey default (not yet planned)
OFFExplicit day off — rose colour
HoursOne or more time blocks (start/end), optional cover branch, optional note

When a shift record exists for that day, the dialog also shows:

  • Publish shift — staff can see it on mobile
  • Unpublish — revert to draft (required before editing locked days)
  • Save

Locked cells: If any shift on that day is already published, availability editing is blocked until you Unpublish first.


4. Cell colours and what they mean ​

The grid uses the same colour language on the manager screen and on staff My schedule status pills.

Colour / styleLabelMeaning
GreyUnscheduledNo plan yet for that day
RoseOFFMarked off (or weekly day-off leave)
Sky blueScheduledAvailability hours set; no shift record yet
AmberPlanned (draft)Shift exists but not published — invisible on staff phones
GreenPublishedShift is live — staff see it on mobile
VioletTime offApproved non-annual leave
FuchsiaAnnual leaveApproved annual leave
Dashed amberPendingTime-off request awaiting manager approval

Legend hint on the grid: Grey = not yet set · Rose = OFF · Amber = draft · Green = published · Fuchsia = annual leave

Overtime: Cells with planned hours above limits show an amber OT ring. A banner appears when days in view exceed 8 hours. Employee sidebar shows month/year OT totals (40h / month, 200h / year limits).

Public holidays are highlighted in column headers when configured.


5. Manager workflow — plan and publish a week ​

Example: Linh, Restaurant Manager, plans next week for Keangnam branch.

Step 1 — Open the grid ​

  1. Schedule & roster → Shift schedule tab.
  2. Select Keangnam branch.
  3. Choose 1 week range; navigate to the target week.

Step 2 — Set availability ​

For each employee-day:

  1. Tap the cell.
  2. Choose OFF, Hours, or leave Unscheduled.
  3. For Hours, enter start/end (add multiple blocks if split shift).
  4. Save.

Shortcut: Use Copy schedule to roll last week's OFF/hours pattern forward, then adjust exceptions.

Step 3 — Review drafts ​

  • Amber cells = draft shifts (created when hours are saved).
  • Check OT warnings and pending time-off cells (dashed amber / violet / fuchsia).

Step 4 — Publish ​

  1. Click Publish ({n} drafts) in the toolbar.
  2. Confirm. Toast: Published N shift(s). Staff can see them on mobile.
  3. Cells turn green (Published).

Step 5 — Verify on staff side ​

Ask a team member to open Schedule on their phone — published shifts should appear with start/end times and branch name.

Unpublish or fix a mistake ​

  1. Tap the employee-day cell.
  2. If locked, click Unpublish first.
  3. Edit hours or mark OFF.
  4. Publish again when ready.

6. Bulk edit, copy schedule, and export ​

Bulk edit ​

  1. Click Bulk edit.
  2. Select multiple employee-day cells.
  3. Choose Unscheduled, OFF, or Hours template.
  4. Apply schedule.

Useful when many people share the same day-off or opening hours pattern.

Copy schedule ​

  1. Click Copy schedule.
  2. Pick source period (e.g. last week, last month).
  3. Confirm. Copies OFF/hours/notes; skips locked published past days.

Export CSV ​

  • Export CSV on Shift schedule — employee roster grid with position and month hours columns.
  • Export spreadsheet on Calendar tab — time-grid export for the visible day/week/month view.

7. Time off — staff submit, managers approve ​

Staff side ​

Where: Phone → Time off tab, or full-page My schedule (/my-schedule) at the bottom.

  1. Choose leave type: Annual leave or Other (multi-day).
  2. Select branch, start date, end date, optional reason.
  3. Submit time-off request.

Annual leave shows balance: used / pending / remaining / total.

Staff can Cancel pending requests. Approved leave appears as violet/fuchsia cells on the manager grid.

Manager side ​

Where: Schedule & roster → Time off tab.

  1. Filter by Branch.
  2. Status: Pending only (default) or All statuses.
  3. Each card shows employee, dates, leave type, day count, reason, status badge.
  4. Optional Review note.
  5. Approve or Reject.
StatusMeaning
PendingAwaiting manager decision
ApprovedBlocks scheduling; shows as leave on grid
RejectedRequest denied
CancelledWithdrawn by staff

Approved time off prevents scheduling on those days and appears on staff My schedule as a status pill when no shift is published.


8. Today's roster ​

Tab: Today's roster

Quick answer to "Who is on the floor right now?"

  • Summary: N people scheduled · N shift blocks
  • Filters: Branch · Position · Individual
  • List: name, role, shift time range
  • Auto-refreshes every 60 seconds
  • Empty: No shifts match these filters today.

Use this at shift change or before a salinity walk-through to see who is physically scheduled.


9. Calendar tab (read-only view) ​

Tab: Calendar

A traditional time-grid calendar for browsing shifts — view only in the current hub (no drag-and-drop editing here).

ControlPurpose
Day / Week / MonthChange time scale
Branch · Position filtersNarrow the view
Published / unpublished filterShow draft vs live shifts
Export spreadsheetCSV for visible range

Week view: click a day header → drill to day view.
Month view: tap a day → day view.

Managers who need to edit shifts use the Shift schedule tab, not Calendar.


10. Staff mobile — My schedule ​

Where: Bottom bar Schedule tab, or account menu → My schedule (full page).

What staff see ​

  • Window: 7 days past → 21 days future — every day shows something (shift card or status pill).
  • Published shifts only — draft shifts never appear on phones.
  • Today badge on the current day.
  • Each shift card: time range, branch, optional internal tags.

When there is no shift that day ​

A status pill shows the day's state:

PillMeaning
Published / shift cardsNormal working shift
ScheduledHours set by manager; not yet a published shift
UnscheduledNo plan yet
OFFMarked off
Annual leave / Time offApproved leave
PendingTime-off request awaiting approval

Legend at the top matches manager grid colours.

Time off from mobile ​

  • Time off tab (bottom bar or account menu) — submit and track requests.
  • Full-page /my-schedule also embeds the request form at the bottom.

Part B — Salinity ​

11. What salinity checks are for ​

Salinity (broth density) checks ensure pho broth stays within target range throughout service. Nexus:

  • Generates time slots per pho/broth type (often hourly during an active window).
  • Lets floor/kitchen staff record a reading + meter photo on mobile.
  • Sends reminders before each slot and missed alerts after grace expires.
  • Lets managers review, acknowledge misses, and audit historical compliance.

Acceptable reading ranges are set per pho type (brand-wide), not per branch.


12. Open Salinity and the three tabs ​

  1. Sign in on desktop (Digital Manager).
  2. Click the droplet icon → /salinity.

Tabs ​

TabPurpose
Today's checksLive slot timeline or historical records
Pho typesBrand-wide broth catalog: interval, grace, targets, active window
Branch settingsEnable branch, assign pho types, notify list

Subtitle: Hourly broth salinity checks with photo evidence.


13. Initial setup — pho types then branch settings ​

Setup is always two steps: define types globally, then enable each branch.

Step 1 — Pho types (brand-wide) ​

Tab: Pho types

Create or edit each broth type:

FieldTypical valueMeaning
EnabledOnWhen off, no slots anywhere for this type
Namee.g. "Pho broth"Display label
Interval (minutes)60Time between slot starts within the active window
Grace after slot (minutes)15Minutes after slot start before status becomes Missed
Reminder before check (minutes)15Pre-slot push/email lead time; 0 = off
Target min / maxe.g. 1.70 – 1.90Acceptable reading (% or °Bx)
Active from / untile.g. 07:00 – 22:00Daily window when slots are generated

Click Save broth type per card. Use Add broth type for new entries.

Step 2 — Branch settings (per branch) ​

Tab: Branch settings

  1. Select branch from the dropdown.

  2. Check Enable salinity checks.

  3. Under Pho types for this branch, tick which types apply at this location.

  4. Under Notify on missed check, search and tick employees who should receive reminders and missed alerts.

    Choose anyone from Employees. They get a push and email before each check and when a slot is missed — only if they have a scheduled shift overlapping that slot. Recipients must enable notifications on their device.

  5. Click Save.

Maintaining the notify list ​

  • Add all kitchen-eligible staff who might do salinity checks.
  • You do not need to update the list every schedule publish — roster overlap filters who actually gets pinged each slot.
  • Do update when people join, leave kitchen duty, or change branches.

Repeat branch settings for each location that runs salinity checks.


14. Slot statuses explained ​

Each pho type generates slots across its active window at the configured interval. Every slot has one status:

StatusLabelMeaning
UpcomingUpcomingSlot hasn't started yet
Due nowDue nowSlot started; still within grace period; no check recorded
CheckedCheckedReading + photo submitted for this slot
MissedMissedGrace expired, no check — needs manager follow-up
Missed — acknowledgedMissed — acknowledgedManager acknowledged after follow-up (no check row created)

In range / out of range: When a reading exists, Nexus compares it to the pho type's target min/max and flags out-of-range rows (check is still saved).

Priority in tables: Missed → Acknowledged → Due → Checked → Upcoming, then by time.


15. Today's checks — live timeline and history ​

Tab: Today's checks

Filters ​

FilterEffect
From / ToDate range (defaults: today)
BranchOne branch or All branches
Broth typeOptional filter when multiple types exist

Views by filter combination ​

WhenWhat you see
Today + one branchLive slot timeline — each slot row with status, reading, photo, Acknowledge button
Today + all branchesMerged timeline across branches
Past date range + one branchDay status summary (checked/missed/acknowledged counts per day) + records table
Past range, all branchesRecords table only (submitted checks)

Summary line: e.g. 5 / 8 checked · 2 missed · 1 acknowledged

Rose banner when missed slots exist.

Historical day status (new) ​

When From or To is not today and a single branch is selected, a day status table reconstructs slot outcomes for past days — including missed slots that never created a check record.

Columns: Date · Broth type · Checked (n/total) · Missed · Acknowledged

Set both dates to today for the live timeline with Acknowledge actions.


16. Notifications — who gets reminded and when ​

Notifications require web push and/or email to be configured by IT. Recipients must enable alerts on their device and not opt out in Settings → Notifications.

Two automatic watchers (every ~60 seconds) ​

TypeWhen it firesWho receives it
ReminderreminderLeadMinutes before slot start, while slot is still upcomingNotify-list employees on shift for that slot
Missed alertSlot becomes missed (grace expired, no check)Same filter: notify list ∩ on shift

How "on shift" is determined ​

Nexus looks at published scheduled shifts at the branch whose times overlap the salinity slot window. Only those employees receive push/email.

This means:

  • Rotating kitchen staff are covered automatically if they're on the notify list and scheduled.
  • Someone on the notify list but off shift won't get pinged (by design).
  • Someone on shift but not on the notify list won't get alerts (but can still submit a check).

Message examples ​

  • Reminder: "Salinity check coming up — {branch} · {broth type} · {time} check in 15 min"
  • Missed: "Salinity check missed — {branch} · {broth type} · {time} slot was not completed"

17. Staff mobile — record a check ​

Where: Staff mobile Home → Salinity check tile (only when branch is enabled and pho types are assigned).

Visibility ​

Staff need salinity create permission. The tile is hidden when the branch is disabled or has no assigned pho types.

Step-by-step ​

  1. Home → tap Salinity check tile.
    Tile status: On schedule / Check due now / Missed checks today.

  2. Today's salinity schedule modal opens — slots grouped by pho type.

  3. Filter chips: All · Upcoming · Uploaded · Missed.

  4. Tap Record check on a Due now or Missed row, or use the footer Record check button.

  5. Record salinity check modal:

    • Confirm branch and target range for the pho type.
    • Select pho type (if multiple).
    • Take photo of the meter (camera; HEIC supported).
    • Optional: Read with AI to suggest a reading from the photo.
    • Enter Salinity reading (% or °Bx).
    • Submit check.
  6. Success closes the modal and refreshes the schedule. Slot shows Checked with reading and photo.

Requirements: Photo is mandatory. Out-of-range readings are flagged but still saved.

Tip: Submit during the due window. Late submissions attach to the current slot, not a past missed row — managers should acknowledge true misses separately.


18. Acknowledge a missed slot ​

Who: Head Chef, Restaurant Manager, or anyone with salinity update permission.

Where: Salinity → Today's checks → live timeline (today, single branch or all branches).

  1. Find a row with status Missed.
  2. Click Acknowledge.
  3. Enter an optional note in the prompt (e.g. "Equipment failure — retrained team").
  4. Confirm.

Status changes to Missed — acknowledged. This does not create a check record — it records managerial follow-up only.


19. Permissions by role ​

Scheduling ​

ActionTypical roles
View Schedule & rosterRestaurant Manager, Head Chef, Brand Manager, IT Admin
Edit grid, publish, approve time offRoles with schedule update (managers)
View own schedule on mobileServer and all staff roles
Submit time offAll staff on mobile

Branch-scoped managers (Restaurant Manager, Head Chef) only see their assigned branches in filters.

Salinity ​

ActionRequirement
Open /salinity hub (desktop)Admin shell + salinity read
View checks / timelineAuthenticated manager in branch scope
Configure pho types & branch settingssalinity update or admin shell
Acknowledge missed slotsSame as settings
Record check on mobilesalinity create (e.g. Server, Head Chef)

Head Chef can manage settings and acknowledge. Server can record checks on mobile but not open the desktop hub.

Customize under Settings → Platform roles.


20. Troubleshooting ​

Scheduling ​

ProblemLikely causeFix
Staff schedule emptyShifts not publishedManager: Publish ({n} drafts) on Shift schedule
Staff schedule emptyWrong branch on employee cardSettings → Employees → correct branch
Can't edit a cellDay has published shiftUnpublish first, then edit
Time off not blocking gridRequest still PendingManager: approve on Time off tab
Times off by ~14 hoursTimezone mismatchIT: confirm SCHEDULE_TIMEZONE = Asia/Ho_Chi_Minh
OT warnings everywhereHours exceed limitsReview blocks; adjust or accept planned OT

Salinity ​

ProblemLikely causeFix
No Salinity icon on desktopNo admin shell or salinity readAdjust role permissions
Staff don't see salinity tileBranch disabled or no pho typesBranch settings → Enable + assign types
No reminders / missed alertsPush/email not configured; empty notify list; reminder = 0IT: configure VAPID/SMTP; add notify recipients; set reminder lead
Alerts not reaching someoneOff shift, notifications off, or not on notify listCheck roster overlap, device settings, notify list
Can't submit checkNo photoTake meter photo before submit
"Slot already checked" (409)Duplicate submitRefresh; don't double-tap Submit
Late check on wrong slotMobile uses current slot at submit timeRecord during due window; acknowledge true misses
Historical misses not visibleViewing records only or all-branchesSelect one branch + past date range for day-status table
Can't acknowledgeSlot not missed yet, or no update permissionWait for missed status; use manager account

Quick reference — weekly rhythm ​

DayManagerKitchen staff
MondayPlan week on Shift schedule; copy last week if helpfulSet availability if hours changed
Before serviceGlance Today's rosterCheck Schedule tab for today's shift
During serviceMonitor Salinity → Today's checksRecord check when tile shows due/missed
After missed slotAcknowledge with note; follow up in person—
End of weekExport CSV if payroll needs hoursSubmit time off for next week early

Updated automatically when guides are merged to git.