# 06 · Customer Portal Guide

Everything a customer can do for themselves, written so your customer-service team can walk
someone through it over the phone.

The portal lives at **`/account`**. Customers sign in at **`/customer/login`** — a different door
from staff, on a separate authentication system.

Demo login for training: `ahmed.raza@gmail.com` / `Rusukh#Client2026`

---

## 1. What the portal is for

A bespoke order takes weeks and passes through a dozen hands. The portal exists so the customer
does not have to telephone to find out what is happening — and so your team is not spending its
day answering "is it ready yet?"

A customer can: **track orders**, **record and manage measurements**, **make payments**,
**request alterations**, **book appointments**, **give feedback**, **approve decisions you need
from them**, and **manage their own notification preferences**.

A customer can **never** see another customer's anything. This is enforced per-record, not by
hiding links.

### How they get around

Four primary destinations, and a secondary group for the rest — deliberately, because a thumb bar
with seven icons has stopped being a thumb bar.

| | Destinations |
|---|---|
| **Primary** — side column on desktop, bottom tab bar on a phone | Orders · Measurements · Appointments · Account |
| **Secondary** — under the four on desktop, a wrapped footer group below `lg` | Payments · Approvals · Alterations · Feedback · Notifications |

Until 2026-09-05, **Approvals was linked from nowhere at all** — fully built, permissioned and
tested, but reachable only by typing the URL. That is the screen a patron uses to sign off their own
specification, and it holds gate G3 and therefore the cutting table: an order could sit waiting on an
approval the customer had no way to give. The other four were reachable, but only from the dashboard
— not from any navigation, so a patron anywhere else in the portal had no route to them.

Nothing caught it because every test navigated to these screens directly, which proves a screen works
and says nothing about whether anyone can find it.
`tests/Feature/CustomerPortal/PortalReachabilityTest` now starts at `/account` and follows links, so
an orphaned screen fails the build instead of hiding in it.

---

## 2. Dashboard — `/account`

The landing screen. Their wardrobe of orders with current status, what needs their attention, and
quick actions.

Anything **waiting on the customer** is surfaced here first — an approval they must give, a
balance due, an appointment to confirm. If a customer says "nobody told me you needed something",
this is the screen to point them at.

---

## 3. Orders — `/account/orders`

Each order opens a tracker showing where the garment actually is: consultation, cutting, stitching,
quality control, packing, delivery.

The stages shown are the real production stages, not a decorative progress bar — the garment moves
when the workshop moves it.

### Approvals — `/account/orders/approvals`

Seven points require the customer's explicit agreement before work continues:

1. Fabric and colour
2. Style and quantity
3. Measurements or reference fit
4. Price and charges
5. Delivery date
6. Design changes
7. Any additional cost

**Work genuinely stops until these are answered** — this is why an order can sit "waiting for
customer approval" while nobody in the workshop is doing anything wrong. Each carries its own SLA
clock, and any unapproved design change invalidates the earlier approval and must be re-confirmed.

---

## 4. Measurements — `/account/measurements`

The customer's stored measurement profile, with history.

**Measurement history is append-only.** Editing never overwrites: a new version is created, and
every order stays pinned to the exact version it was cut from. A customer who loses weight in
March does not retroactively change a suit cut in January.

### The self-measurement studio — `/account/measurements/new`

A guided 17-step wizard for customers who want to measure themselves rather than book a visit. It
covers **14 of the 24 dimensions** in a full bespoke profile — the ones a person can reliably take
alone with a tape.

The remaining 10, and posture assessment, need a measurement rep. The wizard says so rather than
pretending self-measurement is equivalent.

Each step explains what to measure and how. Values are validated as they are entered, so an
implausible number is caught at the step rather than at cutting.

> Steps saved by a customer are marked as self-reported. Staff can see the distinction, which
> matters when a fit dispute arises later.

---

## 5. Payments — `/account/payments`

Shows what is paid, what is outstanding, and the full transaction history.

Three ways to pay:

| Method | How it works |
|---|---|
| **PayFast** | Card or wallet, online, immediate |
| **Bank transfer** | Customer transfers, then uploads the deposit slip. Finance verifies it before it counts as paid. |
| **Cash on delivery** | The rider collects on handover |

**Advance policy** — for a cloth-and-stitching order the advance is 100% of fabric plus 50% of
stitching. Different order types have different rules, and the screen shows the customer the
figure rather than making them work it out.

An uploaded bank-transfer proof sits in a **verification queue** until finance confirms it. The
customer sees "awaiting verification", which is honest — the money is not recognised yet.

---

## 6. Alterations — `/account/alterations`

Customers request alterations here, within the fit guarantee period.

The critical distinction, which the screen makes explicit:

- **Our error** — wrong measurement applied, construction fault, specification not followed →
  **always free.** The system will not let it be charged.
- **Customer preference change** — a changed mind about fit or style → chargeable, quoted first.

That distinction is decided by the assessment, not by whoever answers the phone.

---

## 7. Appointments — `/account/appointments`

Book, reschedule or cancel a home visit or studio appointment.

The booking checks the address against the serviceable area and refuses politely if it falls
outside — with a message that says so, rather than accepting a booking no rep can attend.

Reminders arrive by email the day before and three hours before.

---

## 8. Feedback — `/account/feedback`

Rating across nine categories plus free text, collected after delivery. Feeds the recommendation
score and review-collection metrics management sees.

---

## 9. Profile and notifications

**`/account/profile`** — contact details, preferred contact method, password.

**`/account/notifications`** — which emails they receive.

> **Email only.** Rusukh sends **no SMS and no WhatsApp**, anywhere, ever. This is a deliberate
> architectural decision, not a missing feature. If a customer asks to be texted, the honest answer
> is that the system does not do that. There are 21 notification types and every one is email.

Customers can mute optional notifications. **Transactional messages they cannot mute** — payment
receipts, approval requests, delivery confirmations — because those are records, not marketing.

---

## 10. Helping a customer over the phone

| They say | Look at | Likely answer |
|---|---|---|
| "I can't log in" | `/admin/identity/users` | Wrong door — they are trying `/login` instead of `/customer/login` |
| "Nothing is happening with my order" | Their approvals | An approval is waiting on **them** |
| "I paid but it says unpaid" | `/admin/payments/desk` | A bank transfer awaiting finance verification |
| "I never got the email" | `/admin/notifications/logs`, then `/admin/queue` | Check it was sent; if the queue is stalled, no email went out |
| "Can you text me instead?" | — | The system is email-only by design |
| "My measurements are wrong" | Their measurement history | Check which **version** the order was pinned to |
| "Why am I being charged for an alteration?" | The alteration assessment | Only preference changes are chargeable; our errors never are |
| "I want to change the design" | Their approvals | A design change invalidates the prior approval and needs re-confirmation |

### Seeing exactly what they see

Super root can impersonate a customer from `/admin/identity/impersonation` — the fastest way to
resolve "the button isn't there" without a screen-share.

The session is time-limited, fully logged, and **financial actions are blocked while
impersonating**. You can see their screen; you cannot spend their money.
