Appearance
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
- Who uses what
- Open Schedule & roster
- Shift schedule — the main planning grid
- Cell colours and what they mean
- Manager workflow — plan and publish a week
- Bulk edit, copy schedule, and export
- Time off — staff submit, managers approve
- Today's roster
- Calendar tab (read-only view)
- Staff mobile — My schedule
Part B — Salinity
- What salinity checks are for
- Open Salinity and the three tabs
- Initial setup — pho types then branch settings
- Slot statuses explained
- Today's checks — live timeline and history
- Notifications — who gets reminded and when
- Staff mobile — record a check
- Acknowledge a missed slot
Reference
Part A — Scheduling
1. Who uses what
| Who | Where | What they do |
|---|---|---|
| Restaurant Manager / Head Chef | Desktop → Schedule & roster | Plan hours, publish shifts, approve time off, export CSV |
| Floor & kitchen staff | Phone → Schedule tab or My schedule | See published shifts and day status (off, time off, unscheduled, etc.) |
| Staff (time off) | Phone → Time off tab or /my-schedule | Submit leave requests; track approval status |
| Any manager | Today's roster tab | Quick 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
- Sign in on a computer with a manager account (Digital Manager layout).
- Click the calendar icon on the left rail →
/schedule. - Page title: Schedule & roster.
Tabs at the top
| Tab | Purpose |
|---|---|
| Shift schedule (default) | Main planning grid — set OFF / hours per person per day, publish drafts |
| Calendar | Read-only time-grid view (day / week / month) |
| Today's roster | Who is on the floor today |
| Time off | Approve 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
| Control | What it does |
|---|---|
| Branch | Required — loads employees for that location |
| All positions | Filter by job title (Server, Grill, etc.) |
| All departments | Filter by department |
| Schedule range | Whole month · 1 week · 2 weeks · 3 weeks |
| ◀ Today ▶ | Move the visible date window |
| Publish ({n} drafts) | Makes draft shifts visible on staff phones |
| Bulk edit | Apply OFF / Hours / Unscheduled to many cells at once |
| Export CSV | Download roster spreadsheet with hours |
| Copy schedule | Copy OFF/hours pattern from a prior week or month |
Tap a cell (employee × day)
A dialog opens with three modes:
| Mode | Effect |
|---|---|
| Unscheduled | Clear override — grey default (not yet planned) |
| OFF | Explicit day off — rose colour |
| Hours | One 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 / style | Label | Meaning |
|---|---|---|
| Grey | Unscheduled | No plan yet for that day |
| Rose | OFF | Marked off (or weekly day-off leave) |
| Sky blue | Scheduled | Availability hours set; no shift record yet |
| Amber | Planned (draft) | Shift exists but not published — invisible on staff phones |
| Green | Published | Shift is live — staff see it on mobile |
| Violet | Time off | Approved non-annual leave |
| Fuchsia | Annual leave | Approved annual leave |
| Dashed amber | Pending | Time-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
- Schedule & roster → Shift schedule tab.
- Select Keangnam branch.
- Choose 1 week range; navigate to the target week.
Step 2 — Set availability
For each employee-day:
- Tap the cell.
- Choose OFF, Hours, or leave Unscheduled.
- For Hours, enter start/end (add multiple blocks if split shift).
- 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
- Click Publish ({n} drafts) in the toolbar.
- Confirm. Toast: Published N shift(s). Staff can see them on mobile.
- 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
- Tap the employee-day cell.
- If locked, click Unpublish first.
- Edit hours or mark OFF.
- Publish again when ready.
6. Bulk edit, copy schedule, and export
Bulk edit
- Click Bulk edit.
- Select multiple employee-day cells.
- Choose Unscheduled, OFF, or Hours template.
- Apply schedule.
Useful when many people share the same day-off or opening hours pattern.
Copy schedule
- Click Copy schedule.
- Pick source period (e.g. last week, last month).
- 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.
- Choose leave type: Annual leave or Other (multi-day).
- Select branch, start date, end date, optional reason.
- 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.
- Filter by Branch.
- Status: Pending only (default) or All statuses.
- Each card shows employee, dates, leave type, day count, reason, status badge.
- Optional Review note.
- Approve or Reject.
| Status | Meaning |
|---|---|
| Pending | Awaiting manager decision |
| Approved | Blocks scheduling; shows as leave on grid |
| Rejected | Request denied |
| Cancelled | Withdrawn 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).
| Control | Purpose |
|---|---|
| Day / Week / Month | Change time scale |
| Branch · Position filters | Narrow the view |
| Published / unpublished filter | Show draft vs live shifts |
| Export spreadsheet | CSV 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:
| Pill | Meaning |
|---|---|
| Published / shift cards | Normal working shift |
| Scheduled | Hours set by manager; not yet a published shift |
| Unscheduled | No plan yet |
| OFF | Marked off |
| Annual leave / Time off | Approved leave |
| Pending | Time-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-schedulealso 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
- Sign in on desktop (Digital Manager).
- Click the droplet icon →
/salinity.
Tabs
| Tab | Purpose |
|---|---|
| Today's checks | Live slot timeline or historical records |
| Pho types | Brand-wide broth catalog: interval, grace, targets, active window |
| Branch settings | Enable 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:
| Field | Typical value | Meaning |
|---|---|---|
| Enabled | On | When off, no slots anywhere for this type |
| Name | e.g. "Pho broth" | Display label |
| Interval (minutes) | 60 | Time between slot starts within the active window |
| Grace after slot (minutes) | 15 | Minutes after slot start before status becomes Missed |
| Reminder before check (minutes) | 15 | Pre-slot push/email lead time; 0 = off |
| Target min / max | e.g. 1.70 – 1.90 | Acceptable reading (% or °Bx) |
| Active from / until | e.g. 07:00 – 22:00 | Daily 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
Select branch from the dropdown.
Check Enable salinity checks.
Under Pho types for this branch, tick which types apply at this location.
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.
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:
| Status | Label | Meaning |
|---|---|---|
| Upcoming | Upcoming | Slot hasn't started yet |
| Due now | Due now | Slot started; still within grace period; no check recorded |
| Checked | Checked | Reading + photo submitted for this slot |
| Missed | Missed | Grace expired, no check — needs manager follow-up |
| Missed — acknowledged | Missed — acknowledged | Manager 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
| Filter | Effect |
|---|---|
| From / To | Date range (defaults: today) |
| Branch | One branch or All branches |
| Broth type | Optional filter when multiple types exist |
Views by filter combination
| When | What you see |
|---|---|
| Today + one branch | Live slot timeline — each slot row with status, reading, photo, Acknowledge button |
| Today + all branches | Merged timeline across branches |
| Past date range + one branch | Day status summary (checked/missed/acknowledged counts per day) + records table |
| Past range, all branches | Records 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)
| Type | When it fires | Who receives it |
|---|---|---|
| Reminder | reminderLeadMinutes before slot start, while slot is still upcoming | Notify-list employees on shift for that slot |
| Missed alert | Slot 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
Home → tap Salinity check tile.
Tile status: On schedule / Check due now / Missed checks today.Today's salinity schedule modal opens — slots grouped by pho type.
Filter chips: All · Upcoming · Uploaded · Missed.
Tap Record check on a Due now or Missed row, or use the footer Record check button.
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.
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).
- Find a row with status Missed.
- Click Acknowledge.
- Enter an optional note in the prompt (e.g. "Equipment failure — retrained team").
- Confirm.
Status changes to Missed — acknowledged. This does not create a check record — it records managerial follow-up only.
19. Permissions by role
Scheduling
| Action | Typical roles |
|---|---|
| View Schedule & roster | Restaurant Manager, Head Chef, Brand Manager, IT Admin |
| Edit grid, publish, approve time off | Roles with schedule update (managers) |
| View own schedule on mobile | Server and all staff roles |
| Submit time off | All staff on mobile |
Branch-scoped managers (Restaurant Manager, Head Chef) only see their assigned branches in filters.
Salinity
| Action | Requirement |
|---|---|
Open /salinity hub (desktop) | Admin shell + salinity read |
| View checks / timeline | Authenticated manager in branch scope |
| Configure pho types & branch settings | salinity update or admin shell |
| Acknowledge missed slots | Same as settings |
| Record check on mobile | salinity 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
| Problem | Likely cause | Fix |
|---|---|---|
| Staff schedule empty | Shifts not published | Manager: Publish ({n} drafts) on Shift schedule |
| Staff schedule empty | Wrong branch on employee card | Settings → Employees → correct branch |
| Can't edit a cell | Day has published shift | Unpublish first, then edit |
| Time off not blocking grid | Request still Pending | Manager: approve on Time off tab |
| Times off by ~14 hours | Timezone mismatch | IT: confirm SCHEDULE_TIMEZONE = Asia/Ho_Chi_Minh |
| OT warnings everywhere | Hours exceed limits | Review blocks; adjust or accept planned OT |
Salinity
| Problem | Likely cause | Fix |
|---|---|---|
| No Salinity icon on desktop | No admin shell or salinity read | Adjust role permissions |
| Staff don't see salinity tile | Branch disabled or no pho types | Branch settings → Enable + assign types |
| No reminders / missed alerts | Push/email not configured; empty notify list; reminder = 0 | IT: configure VAPID/SMTP; add notify recipients; set reminder lead |
| Alerts not reaching someone | Off shift, notifications off, or not on notify list | Check roster overlap, device settings, notify list |
| Can't submit check | No photo | Take meter photo before submit |
| "Slot already checked" (409) | Duplicate submit | Refresh; don't double-tap Submit |
| Late check on wrong slot | Mobile uses current slot at submit time | Record during due window; acknowledge true misses |
| Historical misses not visible | Viewing records only or all-branches | Select one branch + past date range for day-status table |
| Can't acknowledge | Slot not missed yet, or no update permission | Wait for missed status; use manager account |
Quick reference — weekly rhythm
| Day | Manager | Kitchen staff |
|---|---|---|
| Monday | Plan week on Shift schedule; copy last week if helpful | Set availability if hours changed |
| Before service | Glance Today's roster | Check Schedule tab for today's shift |
| During service | Monitor Salinity → Today's checks | Record check when tile shows due/missed |
| After missed slot | Acknowledge with note; follow up in person | — |
| End of week | Export CSV if payroll needs hours | Submit time off for next week early |
Related links
- Manager & staff guide — full Digital Manager overview
- Floor employee guide — mobile tasks, schedule, salinity capture
- Task Manager guide — playbooks auto-assigned from shifts
- Use cases by role — what each role does day to day