Temă
Workspace: Backoffice and CRM
Both apps share one login and one layout (packages/ui/src/workspace, design taken from the prototype).
Login
- Work email and password.
- Six-digit code from an authenticator app (Google / Microsoft Authenticator…). The first time, the screen shows a QR code (generated locally) and the key to type in by hand. "Ține-mă minte" skips the code on that device for 30 days.
The session cookie is shared: logging in to the Backoffice also logs you in to the CRM (and the other way round). Someone without access to an app sees "Nu ai acces" with a link to the app they can use.
Demo team (password Taraba2026!, authenticator key KRAXEQSBJ5EUKQ2PKJCVKRCF, add it to any authenticator app):
| Person | Role | Backoffice | CRM |
|---|---|---|---|
| ana.moraru@taraba.ro | Admin | everything | yes |
| victor.nastase@taraba.ro | Moderator | moderation, reports, users (suspend), orders (view) | no |
| laura.preda@taraba.ro | Support | tickets, disputes, reports, users and orders (view) | no |
| monica.barbu@taraba.ro | Finance | orders (cancel and refund), disputes | no |
| radu.pavel@taraba.ro | Marketing | dashboard | yes |
| sorin.dragomir@taraba.ro | Support | as Laura; sets up two-step at first login (QR) | no |
Permissions are enforced by the API on every operation (@RequirePermissions), the menu only hides what you cannot use.
Backoffice pages
| URL | What |
|---|---|
/ | Today's numbers and the queues waiting for a decision |
/moderation | Pending listings, oldest first, with photos and automatic risk signals. Approve (goes online for 30 days), request changes or reject with a note the seller sees. Keys: A approve, M request changes, R reject, J/K next/previous |
/trust | Reports (urgent first): no violation / remove listing / suspend seller / duplicates removed. Disputes: full refund, partial refund or in the seller's favour; money and payouts follow |
/support, /support/:code | Tickets from the contact page; public reply (emailed) or internal note; resolve |
/orders, /orders/:code | Search by code, email or AWB; payments, refunds, timeline; cancel with full refund (finance) |
/users, /users/:id | Search by name, email, phone, id; suspend for 1/7/30 days or until reactivated (logs the person out and hides their listings) |
/listings | Every listing in any status; remove with a reason (seller notified), restore |
/payouts | Totals per status; pay what is due (also hourly, automatically); retry failed payouts. Without an IBAN a payout fails with a reason and the seller is told to add one |
/reports | Orders, sales, Taraba revenue (protection fees + promotions), average order, cancel rate; daily charts; per category; 7/30/90 days |
/categories | Order in the site menu, edit, hide; only empty categories can be deleted |
/settings | Fees, listing rules, promotion packages (money in lei, percentages in %), banned words. Validated, effective at once, audited with before/after |
/team | Invite (one-time link, 7 days; first login sets up two-step), change role, disable (logs out at once), reset two-step; nobody changes themselves and the last administrator stays. Audit log with filters |
/accept-invitation?token= | Public: the invited colleague chooses a password |
/system | Service health and test email / SMS / push |
Every decision is written to the audit log (audit_logs), and the people concerned get a notification.
CRM
See docs/CRM.md.