# For AI Agents (/en/docs/ai) This documentation set is designed to be consumed by AI agents as well as people: every page is reachable as clean Markdown, full-text searchable, and queryable through an MCP server. ## Endpoints [#endpoints] | Endpoint | Returns | |---|---| | `/llms.txt` | Curated index of the whole set, grouped by section | | `/llms-full.txt` | The complete documentation as one Markdown document | | `/en/docs/.md` | Any single page as processed Markdown, e.g. `/en/docs/srs/requirements/auth.md` | | `/api/search?query=…` | Full-text search with ranked hits and section anchors | | `/api/mcp` | MCP server (Streamable HTTP, JSON-RPC 2.0) | ## MCP server [#mcp-server] Connect from any MCP client (Claude Desktop, Cursor, …) to `https:///api/mcp`. The server is stateless — no keys, no session. | Tool | Input | Returns | |---|---|---| | `list_docs` | — | All pages with titles, URLs and descriptions | | `search_docs` | `query` | Ranked hits with section anchors (same index as the site search) | | `get_doc` | `path` | The page as full processed Markdown | Example call: ```bash curl -X POST https:///api/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_docs","arguments":{"query":"seat hold"}}}' ``` ## Requirement ID vocabulary [#requirement-id-vocabulary] | Prefix | Meaning | Defined in | |---|---|---| | `FR-` | Functional requirement | Software (SRS) module pages | | `BR-` | Business requirement | Business Requirements and Rules | | `BRL-` | Business rule | Business Requirements and Rules | | `NFR-` | Non-functional requirement | Quality and Interface Requirements | | `DAT-` | Data requirement | Data Requirements | | `OD-` | Open decision | Compliance, Risks and Decisions | | `UF-` | User flow | User Flows | | `D-` | Decision register entry — an external document, not part of this site | — | # Compliance, Risks & Decisions (/en/docs/brd/compliance) ## 8. Compliance, safety and legal [#8-compliance-safety-and-legal] ### 8.1 Child safety [#81-child-safety] - Minors travel on bookings made by a parent or guardian. A child is linked to a parent account only through a booking reference and a guardianship declaration. - Child data is visible only to the linked parent, the owning organization's authorized staff, the assigned moderator for the passenger list, and the platform admin. - Child data is never used for advertising, marketing or model training and never appears in any marketing export or audience. - Child-safety reports create a case routed to a named escalation contact and procedure, which must exist before the phase 3 pilot ([OPEN: D-68]). - Child trip history is kept 1 year. ### 8.2 Driver lab tests and background checks [#82-driver-lab-tests-and-background-checks] - Lab tests (drug screening and/or medical fitness) and background checks run in a market only after a signed legal review for that market. - Drivers consent at registration; consent records keep the type, time and text version. - Tests are free at partner labs; partner labs send results to the platform directly. - Identity documents and lab results are visible only to admins. Retention per market is set by the legal review. ### 8.3 Data protection [#83-data-protection] - Applicable regimes: Egypt's Personal Data Protection Law, Saudi PDPL, UAE data protection law, and GDPR where EU residents' data is processed. - Users can request a copy of their data (delivered within 30 days of a verified request, D-162) and deletion ([BRL-15](/en/docs/brd/requirements#7-business-rules)). - Marketing consent is separate from transactional messages. - Card data is handled only by gateways. - Hosting region and data residency per market are an engineering decision recorded in the SRS. ### 8.4 Tax and invoicing [#84-tax-and-invoicing] - Invoices follow each market's tax rules. VAT rates per market are supplied by Finance ([OD-27](/en/docs/brd/compliance#11-open-decisions)). - ZATCA e-invoicing is out of scope for phases 1 to 4; its scope is decided before the Saudi launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)). - If invoice numbering fails, no invoice is issued, the booking stays Confirmed, numbering retries 3 times and the case goes to finance review (D-179). ### 8.5 Audit and retention [#85-audit-and-retention] | Data | Retention | |---|---| | Audit log (admin actions, permission changes) | 7 years | | Bookings, payments, invoices, ledger and payouts | 7 years ([OD-04](/en/docs/brd/compliance#11-open-decisions), pending legal review) | | Trip records after account deletion | 5 years | | Check-in and check-out events | 1 year | | Raw GPS points | 90 days | | Child trip history | 1 year | | Album download logs | 1 year | | Identity documents and lab results | Per market legal review | ## 9. Assumptions, dependencies and constraints [#9-assumptions-dependencies-and-constraints] ### 9.1 Assumptions [#91-assumptions] - One product, one codebase, multi-tenant data. - Organizations have a verifiable legal entity in their market. - Travelers pay by card, wallet or local cash methods. - Moderators have a smartphone with GPS and mobile data during the trip. - Lab partners exist in each launch market and can send results to the platform. ### 9.2 Dependencies [#92-dependencies] - Payment gateways: Stripe (international cards, Apple Pay, Google Pay, Stripe Connect Express payouts), Paymob or Tap (local cards in MENA), Fawry (cash in Egypt). - SMS and WhatsApp messaging, transactional email, push (FCM and APNS). - Maps and routing. - Lab partner network per market. - Business registry and tax number checks (manual in phase 1; automated provider [OD-16](/en/docs/brd/compliance#11-open-decisions)). ### 9.3 Constraints [#93-constraints] - Arabic and English from the first release, with right-to-left layouts. - Launch order: Egypt pilot in phase 2; Saudi Arabia and the UAE in phase 5 (D-69). - Organizations register on the web only. - Admin console and organization dashboard use separate routes (admin.trips-enjoy.com, business.trips-enjoy.com). - The driver app is mobile; the photographer studio is responsive web in phase 1; the moderator app is an installable web app on phones; the parent tracker is a section of the traveler app (D-86, D-124). - Maintenance windows fall between 01:00 and 03:00 Cairo time, no more than 4 hours per month, with 72 hours' notice (D-303). ## 10. Risks [#10-risks] | ID | Risk | Impact | Mitigation | |---|---|---|---| | RSK-01 | Data leaks between organizations | Loss of trust, legal exposure | Isolation at database, service and API layers; cross-tenant tests and security review each phase | | RSK-02 | Low supplier supply in the pilot | Organizations cannot staff trips | Organization-owned suppliers first (P1 to P3); platform supply in P4 | | RSK-03 | Lab tests or background checks unlawful in a market | Feature blocked, legal exposure | Legal review per market before use (section 8.2) | | RSK-04 | Poor connectivity on buses | Missed check-ins, wrong headcounts | Offline queue with original timestamps; 60-second target after reconnect | | RSK-05 | Coupon abuse | Revenue loss | Scope rules, per-user limits, abuse flags with admin review | | RSK-06 | Payment gateway outage on a launch day | Lost bookings | Several gateways per market; queued callbacks; pending state instead of failure | | RSK-07 | Plan prices not set before P5 | Monetization delayed | [OD-26](/en/docs/brd/compliance#11-open-decisions) owned by Finance with a P4 deadline | | RSK-08 | Design canvas shows values that conflict with decisions (Saudi-first, SAR, ZATCA, monthly payouts) | Wrong build | Design value audit (claude/design-value-conflicts.md) resolved before P2 build | ## 11. Open decisions [#11-open-decisions] Status: Decided (value applied in this BRD), Proposed (working value, needs sign-off), Open (no value). | ID | Topic | Status | Value or note | Owner | |---|---|---|---|---| | [OD-01](/en/docs/brd/compliance#11-open-decisions) | Launch market order | Decided | Egypt pilot P2; Saudi Arabia and UAE P5 (D-69) | Product | | [OD-02](/en/docs/brd/compliance#11-open-decisions) | Drafts when a session ends | Decided | Drafts kept ([BRL-22](/en/docs/brd/requirements#7-business-rules)) | Product | | [OD-03](/en/docs/brd/compliance#11-open-decisions) | Second factor for organization staff | Decided | SMS or authenticator at every sign-in (D-48) | Product | | [OD-04](/en/docs/brd/compliance#11-open-decisions) | Financial record retention | Proposed | 7 years, pending legal review | Legal | | [OD-05](/en/docs/brd/compliance#11-open-decisions) | Child tracking eligibility | Proposed | Parent Explorer or VIP AND organization Growth or Enterprise with trip switch on | Product | | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Plan for moderators | Open | Proposed: covered by the organization's plan, like [OD-19](/en/docs/brd/compliance#11-open-decisions) | Product | | [OD-07](/en/docs/brd/compliance#11-open-decisions) | Refund table and non-refundable fees | Proposed | 80 / 50 / 0 ([BRL-12](/en/docs/brd/requirements#7-business-rules)); no non-refundable fees until set | Operations | | [OD-08](/en/docs/brd/compliance#11-open-decisions) | Priority seat window length | Open | D-316 | Product | | [OD-09](/en/docs/brd/compliance#11-open-decisions) | VIP early-access window | Open | D-146 | Product | | [OD-10](/en/docs/brd/compliance#11-open-decisions) | Saudi e-invoicing (ZATCA) scope | Open | Out of P1 to P4; decide before Saudi launch | Finance | | [OD-11](/en/docs/brd/compliance#11-open-decisions) | Gateway per market | Proposed | Stripe, Paymob or Tap, Fawry (Egypt); Gulf confirmed at launch | Engineering | | [OD-12](/en/docs/brd/compliance#11-open-decisions) | Admin account provisioning | Decided | Created by an existing admin; authenticator on first sign-in | Product | | [OD-13](/en/docs/brd/compliance#11-open-decisions) | Negotiation limit and expiry | Decided | No round limit; 72 hours after last counter ([BRL-26](/en/docs/brd/requirements#7-business-rules)) | Product | | [OD-14](/en/docs/brd/compliance#11-open-decisions) | Annual billing discount | Proposed | 15 percent (D-16) | Finance | | [OD-15](/en/docs/brd/compliance#11-open-decisions) | Commission rates | Proposed | 10 percent of base trip price, per market and deal type (D-15) | Finance | | [OD-16](/en/docs/brd/compliance#11-open-decisions) | Business registry check provider | Open | Manual in P1 | Operations | | [OD-17](/en/docs/brd/compliance#11-open-decisions) | Ratings and reviews | Decided | Out of scope until after P6 | Product | | [OD-18](/en/docs/brd/compliance#11-open-decisions) | CRM targets and webhook policy | Decided (policy), Open (CRM targets) | Signed, 5 retries over 24 hours, 7-day replay, no plan gate (D-62 to D-64) | Product | | [OD-19](/en/docs/brd/compliance#11-open-decisions) | Plan for organization-owned drivers and photographers | Proposed | Covered by the organization's plan; allowance per plan open (D-97) | Product | | [OD-20](/en/docs/brd/compliance#11-open-decisions) | Out-of-scope coupon message | Decided | Generic "not applicable to this booking" | Product | | [OD-21](/en/docs/brd/compliance#11-open-decisions) | Default tier on approval | Decided | Organization Starter (D-24); driver and photographer Basic (D-78); plan chosen at registration with no charge before approval (D-77) | Finance | | [OD-22](/en/docs/brd/compliance#11-open-decisions) | Cancelling a trip in progress | Decided | Not allowed; incident handling only (D-25) | Operations | | [OD-23](/en/docs/brd/compliance#11-open-decisions) | Verification by role | Decided | Travelers one contact; suppliers and owners both (D-20) | Product | | [OD-24](/en/docs/brd/compliance#11-open-decisions) | Lab-test deadline | Decided | 3 days default, admin 1 to 7 (D-21) | Operations | | [OD-25](/en/docs/brd/compliance#11-open-decisions) | Plan gate on program enrollment report | Open | No gate until confirmed | Product | | [OD-26](/en/docs/brd/compliance#11-open-decisions) | Plan prices per role and market | Open | None set in any approved doc | Finance | | [OD-27](/en/docs/brd/compliance#11-open-decisions) | VAT rate per market | Open | Finance to supply, Egypt first | Finance | | [OD-28](/en/docs/brd/compliance#11-open-decisions) | Trial lengths per plan | Open | Configurable; no default | Finance | | [OD-29](/en/docs/brd/compliance#11-open-decisions) | What happens when grace ends | Open | Decision register D-08 says downgrade to the basic tier and block new bookings; [BRL-02](/en/docs/brd/requirements#7-business-rules) requires an active plan for non-travelers, which implies a lockout. Product to reconcile. | Product | | [OD-30](/en/docs/brd/compliance#11-open-decisions) | Webhook endpoints per plan | Open | D-65 | Product | | [OD-31](/en/docs/brd/compliance#11-open-decisions) | Deal fee when cancelled after assignment | Open | D-278 | Finance | | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Changes-requested closure day when the extension is used | Open | Register says day 14; mobile decisions propose day 21 | Product | ## 12. Approval [#12-approval] | Role | Name | Decision | Date | |---|---|---|---| | Product owner | [OPEN] | | | | Finance | [OPEN] | | | | Operations | [OPEN] | | | | Legal | [OPEN] | | | | Engineering lead | [OPEN] | | | # Business Requirements (/en/docs/brd) ## 1. Document control [#1-document-control] **Product** Trips Enjoy (trips-enjoy.com) **Document type** Business Requirements Document **Version** 1.1 **Date** 9 November 2026 **Status** For review. Items marked [OPEN] need a decision. Items marked (placeholder) carry a working value that the named owner must confirm. **Owner** Product (Trips Enjoy) **Approvers** [OPEN: named approvers, D-314] **Companion documents** [SRS](/en/docs/srs) v1.1 (software requirements), [ERD](/en/docs/erd) (data model), user-flows/ (per-app flows), Tasks.md (delivery backlog), trips-enjoy-technical-architecture.md (architecture). **Rule for this document** No code, schemas or diagrams in code form. Those live in the SRS, the ERD and the architecture document. ### 1.1 What changed in v1.1 [#11-what-changed-in-v11] | Change | Reason | |---|---| | Rebuilt the numbered BRD (BR, BRL, OD, RSK IDs) that SRS v1.0 traces to. The v1.0 file was not in the project, so IDs are reconstructed from the SRS traceability matrix and kept stable. | SRS v1.0 cites [BRD](/en/docs/brd) v1.0, which was missing from the project. | | Folded in the October 2026 product rules: country-based market values, active plan required for every non-traveler role, organization CRM and webhooks, B2B and B2C invoices, settlements between all parties, analytics by page, organization, trip, customer and provider, staff switching between organizations, lab tests at any time. | Product decisions recorded October 2026. | | Added BR-MKT, BR-ANL, [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc), [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm), [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org), [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) and [BRL-25](/en/docs/brd/requirements#7-business-rules) to [BRL-30](/en/docs/brd/requirements#7-business-rules). | New scope. | | Applied decided values from the decision register (D-numbers) where the earlier text was open. | Decision register values as quoted in claude/design-value-conflicts.md (17 Oct 2026). | | Fixed the lab-test deadline in [BRL-16](/en/docs/brd/requirements#7-business-rules) (3 days, admin-adjustable 1 to 7). | SRS conflict C-05. | ## 2. Executive summary [#2-executive-summary] ### 2.1 Problem and opportunity [#21-problem-and-opportunity] Organized group trips in Egypt and the Gulf (school trips, company outings, religious and tourism tours, events) are run on spreadsheets, WhatsApp groups and cash. Organizers cannot see which traveler is on which bus, suppliers (drivers and photographers) are booked informally with no record of the agreed price, and parents have no reliable way to know where their children are. Travelers pay without receipts, and organizers have no accounting per trip. Trips Enjoy is a bilingual (Arabic and English), multi-tenant marketplace and operations platform for organized group trips. One trip record covers many vehicles, each with its own driver and moderator. Organizations sell trips and optional programs to travelers, hire independent drivers and photographers through negotiated deals, check every passenger onto the right vehicle, give parents a live view of their own children, and get per-trip accounting, invoices and settlements. ### 2.2 Business objectives and success measures [#22-business-objectives-and-success-measures] | ID | Objective | Measure | Target | |---|---|---|---| | OBJ-01 | Let organizations run multi-vehicle trips from one record | Pilot trip: three buses, about 120 passengers, run end to end in the platform | Passed in phase 3 | | OBJ-02 | Know where every passenger is | Check-in or check-out event logged after physical boarding | Within 60 seconds of boarding, including after short connection loss | | OBJ-03 | Admit suppliers and organizations quickly and safely | Median time from submitted application to decision | 2 working days or less | | OBJ-04 | Make supplier prices transparent | Platform suppliers assigned through a finalized deal with both parties' acceptance | 100 percent | | OBJ-05 | Build recurring revenue | Monthly recurring revenue from plans across all roles | [OPEN: target, D-71] | | OBJ-06 | Keep money correct | Ledger entries balance; exports reconcile with the ledger | 100 percent; daily reconciliation with gateways | | OBJ-07 | Give parents confidence | Parents on eligible plans see their linked children's vehicle, seat, check-in status and programs | Live during the trip | | OBJ-08 | Serve each market correctly | Currency, payment methods and tax rules follow the country of the account | Every amount labeled with its currency | ## 3. Scope [#3-scope] ### 3.1 In scope [#31-in-scope] - Role-specific registration, verification, sign-in and multi-role accounts. - Applications and admin approval for organizations, platform drivers and platform photographers. - Organization workspaces: employees and permissions, fleet and vehicle types, trips and programs, organization-owned drivers and photographers, coupons, plans, invoices, accounting, analytics, CRM and webhooks. - Traveler discovery, booking, seats, programs, coupons, payment, cancellation, refunds, receipts and invoices. - Deal negotiation between organizations and platform suppliers. - Vehicle moderators: check-in, check-out, incidents, end-of-trip report. - Live tracking for operations and for parents of linked children. - Photo albums with three privacy modes. - Driver lab-test workflow. - Plans and subscriptions for every role, feature gates, dunning and overrides. - Ledger, payouts, settlements, reconciliation and exports. - Notifications on email, SMS, WhatsApp, push and in-app. - Market configuration by country. - Platform admin console. ### 3.2 Out of scope (this release) [#32-out-of-scope-this-release] - Ratings and reviews ([OD-17](/en/docs/brd/compliance#11-open-decisions), after phase 6). - Hotel and flight inventory. - In-app purchase of plans on mobile (plans are paid through the gateway's browser page). - Biometric sign-in (no app lock or Face ID in phase 1). - Machine-learning recommendations and fraud scoring. - Saudi ZATCA e-invoicing integration until [OD-10](/en/docs/brd/compliance#11-open-decisions) is decided (phase 5 at the latest). ### 3.3 Delivery phases [#33-delivery-phases] | Phase | Theme | Definition of done | |---|---|---| | P1 Foundation | Accounts, organization applications and approval, tenancy | An organization can apply, be approved and sign in to an empty workspace. | | P2 Single-vehicle pilot (Egypt) | Trip creation, traveler booking, payment in EGP, admin basics | One pilot organization sells one trip to real travelers with real payments. | | P3 Operational depth | Multi-vehicle trips, programs, seat modes, moderator app, check-in | A three-bus trip with about 120 passengers runs end to end. | | P4 Marketplace supply | Platform drivers and photographers, lab tests, negotiation, media | Organizations book platform suppliers through deals and deliver albums with all privacy modes. | | P5 Monetization and Gulf launch | Plans for all roles, feature gates, coupons, full accounting, invoices; Saudi Arabia (SAR) and UAE (AED) | Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once [OD-10](/en/docs/brd/compliance#11-open-decisions) is decided. | | P6 Family and scale | Live tracking, parent tracker, analytics, public API | Parents see their children live; organizations get analytics and integrations. | ## 4. Stakeholders and roles [#4-stakeholders-and-roles] ### 4.1 Roles [#41-roles] | Role | Description | Plan required to use the app | |---|---|---| | Visitor | Not signed in. Browses public trips and registration pages. | No | | Traveler | Books and attends trips. Can be a parent or guardian. | No. Free by default; Explorer and VIP add features. | | Parent or guardian | A traveler who links children to bookings and tracks them. | Explorer or VIP for child tracking | | Organization owner | Registers the organization, pays the plan, runs the workspace. | Yes: Starter, Growth or Enterprise | | Organization employee | Works inside one or more organizations within granted permissions. | Covered by the organization's plan | | Organization-owned driver or photographer | Works for one organization only; invisible to others. | Covered by the organization's plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | | Platform driver | Independent, admin-approved; hired through deals. | Yes: Basic, Professional or Premium | | Platform photographer | Independent, admin-approved; hired through deals. | Yes: Basic, Studio or Pro | | Vehicle moderator | Supervises one vehicle on one trip; checks passengers in and out. | [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)] | | Platform admin | Trips Enjoy staff. Roles: Super admin, Operations, Finance (D-49). | Staff | ### 4.2 Glossary [#42-glossary] | Term | Meaning | |---|---| | Organization | A travel company, school, employer or event organizer that runs trips. Older documents say "Company". Each organization is an isolated tenant. | | Traveler | A person who books and attends trips. Older documents say "User" or "Passenger". | | Trip | One organized trip record. It may run many vehicles. | | Program | An optional or required activity inside a trip, with its own pricing. | | Vehicle type | A reusable seat layout with labeled seats. | | Deal | A negotiated price between an organization and a platform supplier for one vehicle or trip. | | Moderator | The person supervising one vehicle on one trip. | | Market | The country whose currency, payment methods, tax rules and default time zone apply. | | Settlement | The record of amounts owed between the platform, an organization and its suppliers for a trip, tracked until paid. | | Ledger | The double-entry record of every financial event. | | Hold | A temporary 15-minute reservation of a seat during checkout. | | Grace period | 7 days after a failed renewal during which plan features stay active. | ### 4.3 Role journeys at a glance [#43-role-journeys-at-a-glance] The detailed flows are in user-flows/. This table states, for each role, what registration needs, how approval works and what the role can do once active. | Role | Registration needs | Approval | Main actions once active | |---|---|---|---| | Traveler | Name, email and/or phone, password or one-time code, country, language. At least one of email or phone verified (D-20). | None. Active on verification, Free plan. | Browse and book trips, choose programs and seats where allowed, apply coupons, pay, cancel, get receipts and invoices, view albums, link children and track them (Explorer or VIP), upgrade plan, apply for a supplier role. | | Organization | Owner name, email and phone (both verified), country, legal and trade names, commercial registration and tax numbers, registration documents, billing contact, chosen plan (no charge before approval). Web only. | Admin reviews documents and registry check (manual in P1). Approve, request changes (14 days) or reject with reason (re-apply after 30 days, appeal within 14 days). On approval: tenant created, Starter by default (D-24) or the chosen plan. | Run the workspace: employees and permissions, fleet, trips and programs, own drivers and photographers, deals with platform suppliers, seats, coupons, bookings, check-in oversight and live operations, invoices, accounting, settlements, analytics, CRM and webhooks, plan and billing. | | Platform driver | Name, email and phone (both verified), country, national ID and driving license, own-vehicle details where used (plate, model, year, seats, registration, insurance valid 3+ months), consent to lab tests, initial lab result dated within 30 days, service regions, chosen plan. | Admin reviews documents, license, insurance and lab result. Same decision options as organizations. On approval: Basic plan by default (D-78) or the chosen plan. | Set availability, receive and negotiate deals, run assigned vehicles, share GPS during trips, see earnings and weekly payouts, create coupons for own bookings, complete lab tests when requested. | | Platform photographer | Name, email and phone (both verified), country, ID, at least 8 portfolio photos, equipment, service areas, rates, chosen plan. | Admin reviews identity and portfolio. Same decision options. Basic plan by default (D-78) or the chosen plan. | Manage portfolio, rates and availability, negotiate deals, upload albums after the trip with plan-allowed privacy, watermark (Studio and Pro), see earnings, create coupons for own bookings. | | Organization-owned driver or photographer | Invited by the organization by SMS or email (link valid 7 days, D-94). Name, phone, country; driver license for drivers. | No admin approval. Accepted on assignment by the organization ([BRL-05](/en/docs/brd/requirements#7-business-rules)). | Work only on that organization's trips. | | Employee | Invited by email (link valid 7 days, D-286). Sets password and second factor on first sign-in. | Owner grants a permission set. | Act within granted permissions; switch between organizations that list their email. | | Moderator | Phone required. Assigned by the organization to one vehicle on one trip. Staff code valid until 24 hours after trip end, one device at a time (D-107, D-108). | Assignment by the organization. | Manifest, check-in and check-out, incidents, end-of-trip report, for the assigned vehicle only. | | Platform admin | Created by an existing admin (invite valid 72 hours, D-50). Authenticator set up on first sign-in. | Super admin creates. | Review applications and appeals, manage accounts, plans, coupons, templates and flags, request lab tests, handle disputes and refunds outside policy, run payouts, oversee settlements and reconciliation, read the audit log. | ## 5. Commercial model [#5-commercial-model] ### 5.1 Plans [#51-plans] No plan prices are set in any approved document. Prices come from the plan catalog per market and need Finance sign-off ([OD-26](/en/docs/brd/compliance#11-open-decisions)). Trial length is a per-plan setting with no approved default ([OD-28](/en/docs/brd/compliance#11-open-decisions)). **Organization plans** | Feature | Starter | Growth | Enterprise | |---|---|---|---| | Active trips per month (trips Published through Completed that were created this cycle, D-143) | 5 | 20 | Unlimited | | Employees | 5 | 20 | Unlimited | | Vehicles per trip | 2 | 10 | Unlimited | | Programs per trip | 3 | 15 | Unlimited | | Platform drivers and photographers | Own only | Own and platform | Own and platform | | Seat self-selection | No | Yes | Yes | | Child tracking | No | Yes | Yes | | Coupons (active and paused, D-203) | 5 | 20 | Unlimited | | Accounting | Basic | Advanced | Full with export | | Analytics | No | Basic | Full | | Invoices (B2B and B2C) | Yes (D-178) | Yes | Yes | | CRM and webhooks | Yes, no plan gate (D-64); endpoint count per plan [OPEN: D-65] | Yes | Yes | | Priority support | No | No | Yes | | Custom branding | No | No | Yes | **Platform driver plans** | Feature | Basic | Professional | Premium | |---|---|---|---| | Active bookings per month | 3 | 10 | Unlimited | | Profile visibility | Standard | Featured | Top placement | | Deal negotiation | Yes | Yes | Yes | | Coupons | 3 | 10 | Unlimited | | History and reports | Basic | Full | Full with export | | Search priority and verified badge | No | Yes | Yes | | Earnings dashboard | Basic | Advanced | Advanced | | Support | Standard | Priority | Dedicated | **Photographer plans** | Feature | Basic | Studio | Pro | |---|---|---|---| | Active bookings per month | 3 | 10 | Unlimited | | Portfolio images | 10 | 50 | Unlimited | | Albums per trip | 1 | 5 | Unlimited | | Coupons | 3 | 10 | Unlimited | | Album privacy | Public only | Public and shared link | Public, shared link and selected users | | Profile visibility | Standard | Featured | Top placement | | Verified badge and watermarking | No | Yes | Yes | | Earnings and reports | Basic | Full | Full with export | | Support | Standard | Priority | Dedicated | **Traveler plans** | Feature | Free | Explorer | VIP | |---|---|---|---| | Trip bookings | Unlimited | Unlimited | Unlimited | | Program discount (programs only, not the base trip price) | None | 5 percent | 10 percent | | Coupons | Yes | Yes | Yes | | Early access to trips | No | No | Yes (window [OPEN: D-146]) | | Priority seat selection | No | Yes | Yes (window [OPEN: D-316]) | | Child tracking | No | Yes | Yes | | Booking history and receipts | Basic (12 months, proposed) | Full | Full with export | | VIP-only programs | No | No | Yes | | Ad-free | No | Yes | Yes | | Support | Standard | Priority | Dedicated | **Plan lifecycle (all roles)** - Billing monthly or annually. Annual discount placeholder 15 percent (D-16, [OD-14](/en/docs/brd/compliance#11-open-decisions)). - Upgrade takes effect at once, with the prorated difference charged. Downgrade takes effect at the end of the cycle with no proration. A scheduled downgrade can be cancelled ([BRL-13](/en/docs/brd/requirements#7-business-rules)). - Failed renewal: retries on days 1, 3, 5 and 7 with an email at each attempt (D-09); 7-day grace period with features kept ([BRL-14](/en/docs/brd/requirements#7-business-rules)). What happens after grace is [OD-29](/en/docs/brd/compliance#11-open-decisions). - Items above a lower limit after a downgrade keep working; no new items can be added until the count is under the limit (D-144). - Monthly counters reset at 00:00 on the 1st in the organization's time zone (D-218). - Admin overrides need a second admin and an end date, notify the owner, and revert at the end date (D-227, D-230). - If the plan service is down, actions that involve money or limits fail closed; read-only screens stay available (D-224). ### 5.2 Revenue and costs [#52-revenue-and-costs] | Stream | Type | Rule | |---|---|---| | Plan subscriptions (all roles) | Revenue | Recurring, per market currency. | | Booking commission | Revenue | Placeholder 10 percent of the base trip price, configurable per market and per deal type (D-15, [OD-15](/en/docs/brd/compliance#11-open-decisions)). Provider screens show a ledger line without printing the rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is decided. | | Deal commission | Revenue | Per deal type and market ([OD-15](/en/docs/brd/compliance#11-open-decisions)). | | Gateway fees | Cost | Recorded as a platform cost in the ledger. No rate set. | | Supplier payouts | Pass-through | Weekly, Monday 06:00, through Stripe Connect Express, bank transfer or a local provider (D-28). | | Refunds | Reversal | Reverse revenue, commission and coupon redemption. | ### 5.3 Markets [#53-markets] Market values are country-based ([BRL-27](/en/docs/brd/requirements#7-business-rules)). | Market | Phase | Currency | Payment methods | Default time zone | Tax and invoicing | |---|---|---|---|---|---| | Egypt | P2 pilot | EGP | Stripe (international cards, Apple Pay, Google Pay), Paymob or Tap (local cards), Fawry (cash) | Cairo | Egyptian rules; VAT rate to be supplied by Finance ([OD-27](/en/docs/brd/compliance#11-open-decisions)) | | Saudi Arabia | P5 | SAR | Stripe, Paymob or Tap; local methods confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)) | Riyadh | Saudi VAT; ZATCA e-invoicing scope decided before launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | | United Arab Emirates | P5 | AED | Stripe, Paymob or Tap; confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)) | Dubai | UAE VAT ([OD-27](/en/docs/brd/compliance#11-open-decisions)) | - Every amount shows its currency code. Western digits 0 to 9 in both languages (D-159). - Amounts are kept in minor units and rounded half up per line; totals are the sum of the rounded lines (D-157). - A booking is priced and paid in the currency of the organization's market. Cross-currency booking is out of scope. # Business Requirements & Rules (/en/docs/brd/requirements) ## 6. Business requirements [#6-business-requirements] Priority uses MoSCoW: M must, S should, C could. Phase is the delivery phase in section 3.3. ### 6.1 Accounts and access (AUTH) [#61-accounts-and-access-auth] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-AUTH-01](/en/docs/brd/requirements#61-accounts-and-access-auth) | Each role registers through its own path (traveler, driver, photographer, organization). There is no combined onboarding form. | M | P1 | | [BR-AUTH-02](/en/docs/brd/requirements#61-accounts-and-access-auth) | Every registration form records the applicant's country. | M | P1 | | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth) | Accounts verify contact details by one-time code before acting: travelers verify at least one of email or phone; drivers, photographers and organization owners verify both (D-20). | M | P1 | | [BR-AUTH-04](/en/docs/brd/requirements#61-accounts-and-access-auth) | Sign-in strength follows the role: admins use password plus an authenticator; organization staff use password plus an SMS or authenticator code at every sign-in; travelers and suppliers use password or one-time code; moderators use a staff code. | M | P1 | | [BR-AUTH-05](/en/docs/brd/requirements#61-accounts-and-access-auth) | One person can hold several roles (for example traveler and approved photographer) and switch between them without a second account. | M | P1 | | [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth) | Organization staff can switch between the organizations whose access list includes their email, and see no other organization. | M | P1 | | [BR-AUTH-07](/en/docs/brd/requirements#61-accounts-and-access-auth) | Admin can suspend and reinstate any account. Suspension stops access at once and keeps the data. | M | P1 | | [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | A user can request account deletion, with a 30-day grace period during which signing in restores the account. | M | P5 | ### 6.2 Applications and approvals (ONB) [#62-applications-and-approvals-onb] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ONB-01](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Organizations, platform drivers and platform photographers apply before they can act. Supplier actions stay blocked until approval. | M | P1 (organizations), P4 (suppliers) | | [BR-ONB-02](/en/docs/brd/requirements#62-applications-and-approvals-onb) | All applications reach one admin queue with their documents. Admin can approve, request changes or reject; a rejection needs a reason. | M | P1 | | [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | The median decision time is 2 working days or less; overdue applications are flagged. | M | P1 | | [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb) | When changes are requested, the applicant has 14 days to respond, with a reminder on day 7 and one 7-day extension on request (D-235). Unanswered applications close. | M | P1 | | [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb) | A rejected applicant can appeal within 14 days of the notice (statement and up to 5 files, decided within 5 working days, one appeal per rejection, D-237) and can re-apply after 30 days. A closed application counts as rejected. The traveler account keeps working. | M | P1 | | [BR-ONB-06](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Photographer applications include at least 8 portfolio photos. | M | P4 | | [BR-ONB-07](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Drivers using their own vehicle give plate, model, year, seat count, registration and insurance valid for at least 3 more months. | M | P4 | | [BR-ONB-08](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Driver applications record consent to lab tests and include an initial lab result dated within the last 30 days. | M | P4 | | [BR-ONB-09](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Applicants are notified of every status change in their language. | M | P1 | ### 6.3 Organizations and employees (ORG) [#63-organizations-and-employees-org] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ORG-01](/en/docs/brd/requirements#63-organizations-and-employees-org) | Each approved organization gets an isolated workspace that no other organization can see. | M | P1 | | [BR-ORG-02](/en/docs/brd/requirements#63-organizations-and-employees-org) | The owner invites employees and grants each a permission set (trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics). Employee count follows the plan. | M | P1 | | [BR-ORG-03](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations can onboard their own drivers and photographers, visible only to them and accepted on assignment without admin approval. | M | P1 | | [BR-ORG-04](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations register their vehicles (plate, model, year, seats, registration status). | M | P2 | | [BR-ORG-05](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations choose whether travelers can pick their own seats, per trip or for the account, where the plan allows. | M | P3 | | [BR-ORG-06](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations can connect a CRM and send trip, booking and check-in events to external apps through signed webhooks. | S | P6 | | [BR-ORG-07](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations issue B2B and B2C invoices for their trips; corrections are made by credit note. | M | P5 | | [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org) | Enterprise organizations can apply custom branding to traveler-facing trip pages, emails and invoices. | C | P6 | ### 6.4 Trips, programs and fleet (TRIP, PRG, FLT) [#64-trips-programs-and-fleet-trip-prg-flt] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-TRIP-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Organizations create trips through a guided wizard: basics, schedule and route, vehicles, staffing, programs, seating, pricing and capacity, publishing. | M | P2 | | [BR-TRIP-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A trip can be saved as a hidden draft, published publicly, or published to targeted travelers only. | M | P2 | | [BR-TRIP-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A trip can run several vehicles at once, each with one vehicle type, one driver and one moderator. The vehicle count follows the plan. | M | P3 | | [BR-TRIP-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Programs can be added, edited and removed until the trip starts. | M | P3 | | [BR-PRG-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Each program has one pricing model: free, per person, by quantity, per group, or tiered. Program count follows the plan. | M | P3 | | [BR-PRG-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A program can be optional, pre-required (auto-included), capacity-limited or VIP-only. | M | P3 | | [BR-PRG-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Travelers see a live booking total as they add or remove programs, including their plan's program discount. | M | P3 | | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Organizations see who chose each program, quantities and revenue. Report depth by plan is [OD-25](/en/docs/brd/compliance#11-open-decisions). | M | P3 | | [BR-FLT-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Vehicle types are reusable seat layouts with labeled seats. | M | P2 | ### 6.5 Staffing and deals (STF) [#65-staffing-and-deals-stf] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-STF-01](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Each vehicle is driven either by an organization-owned driver or by a platform driver hired through a deal. | M | P3 | | [BR-STF-02](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A trip's photographer is either organization-owned or a platform photographer hired through a deal. | M | P4 | | [BR-STF-03](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Organizations and platform suppliers negotiate the price of a deal: either side proposes, counters or rejects, with no round limit. An offer expires 72 hours after the last counter ([BRL-26](/en/docs/brd/requirements#7-business-rules)). Platform suppliers are available only on plans that include them. | M | P4 | | [BR-STF-04](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A platform supplier is assigned only after both parties accept the same terms. | M | P4 | | [BR-STF-05](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A trip is Ready only when every vehicle has a confirmed driver and moderator and every platform deal is finalized. | M | P3 | | [BR-STF-06](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Suppliers see trip, route, date and pay before they respond to a deal. | M | P4 | ### 6.6 Seats (SEAT) [#66-seats-seat] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-SEAT-01](/en/docs/brd/requirements#66-seats-seat) | Seating is company-assigned by default. Self-selection is available only on Growth and Enterprise and only where the organization enables it. | M | P3 | | [BR-SEAT-02](/en/docs/brd/requirements#66-seats-seat) | With self-selection on, travelers see a live seat map where taken seats show as unavailable immediately. | M | P3 | | [BR-SEAT-03](/en/docs/brd/requirements#66-seats-seat) | Explorer and VIP travelers get a priority window for seat selection (length [OPEN: D-316]). | S | P3 | | [BR-SEAT-04](/en/docs/brd/requirements#66-seats-seat) | A seat chosen at checkout is held for 15 minutes and released automatically if payment does not complete. | M | P3 | ### 6.7 Booking and payment (BKG) [#67-booking-and-payment-bkg] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-BKG-01](/en/docs/brd/requirements#67-booking-and-payment-bkg) | A booking holds the passengers, chosen programs, seats where allowed, at most one coupon unless the coupon is stackable, and a payment method. | M | P2 | | [BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Travelers pay on the gateway's own page or SDK, with the methods of the organization's market. Card data never reaches Trips Enjoy. | M | P2 | | [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg) | A failed payment can be retried without losing the cart while the hold lasts, up to 3 attempts per hold (D-197). A retry after the hold expires re-checks the seats and starts a new hold only if they are free (D-191). | M | P2 | | [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Travelers can cancel a booking and receive a refund under the cancellation policy ([BRL-12](/en/docs/brd/requirements#7-business-rules)). Requests after the cut-off go to the organization, which decides within 2 working days, then to admin (D-151). No cancellation after departure or after check-in (D-152, D-153). | M | P2 | | [BR-BKG-05](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Every confirmed booking yields a receipt and an invoice the traveler can view. A traveler who enters a tax number at checkout gets a B2B invoice ([BRL-28](/en/docs/brd/requirements#7-business-rules)). | M | P2 | ### 6.8 Coupons (CPN) [#68-coupons-cpn] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-CPN-01](/en/docs/brd/requirements#68-coupons-cpn) | Admins, organizations, drivers and photographers create coupons that apply only inside their own scope. | M | P5 | | [BR-CPN-02](/en/docs/brd/requirements#68-coupons-cpn) | Coupon use across entity boundaries is always rejected with a generic message that does not name the other entity ([OD-20](/en/docs/brd/compliance#11-open-decisions)). | M | P5 | | [BR-CPN-03](/en/docs/brd/requirements#68-coupons-cpn) | Coupons support fixed amount, percentage, program-specific, free program, first booking and minimum spend types, and are validated in real time at checkout. | M | P5 | | [BR-CPN-04](/en/docs/brd/requirements#68-coupons-cpn) | Each redemption is recorded against its booking and reversed on refund. | M | P5 | | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn) | Creators see coupon analytics; admin sees platform-wide analytics and abuse flags. Flags never block automatically and are reviewed within 2 working days (D-217). | M | P5 | ### 6.9 Check-in, moderators and tracking (CHK, MOD, TRK) [#69-check-in-moderators-and-tracking-chk-mod-trk] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-CHK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Moderators check each passenger in at boarding and out at each stop and at the destination. | M | P3 | | [BR-CHK-02](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | A passenger can be checked in only to the vehicle they are assigned to. | M | P3 | | [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Every check-in and check-out records time, moderator, vehicle and location where permitted, and reaches the platform within 60 seconds, including after short connection loss. | M | P3 | | [BR-CHK-04](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | A moderator sees and acts on their assigned vehicle only. | M | P3 | | [BR-CHK-05](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Moderators, parents and staff can report incidents and child-safety concerns, which reach the organization's operations team at once. Incident categories: safety, medical, vehicle fault, lost traveler, conduct, other (D-331). | S | P3 | | [BR-MOD-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | At the end of the trip each moderator submits a report with the final headcount; a mismatch needs a reason. | M | P3 | | [BR-TRK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Operations staff see each vehicle's live location and which vehicle each passenger is in. Travelers never see the live vehicle position ([BRL-29](/en/docs/brd/requirements#7-business-rules)). | M | P6 | ### 6.10 Parents and children (PAR) [#610-parents-and-children-par] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-PAR-01](/en/docs/brd/requirements#610-parents-and-children-par) | Parents see only their own linked children: vehicle, seat, check-in status and programs. Child data is never used for marketing, advertising or model training. | M | P6 | | [BR-PAR-02](/en/docs/brd/requirements#610-parents-and-children-par) | Parents link a child to a booking with a valid booking reference and a guardianship declaration (D-126). The link ends when the booking is cancelled or refunded. | M | P6 | | [BR-PAR-03](/en/docs/brd/requirements#610-parents-and-children-par) | Parents are notified when boarding is confirmed, the trip starts, a stop is reached and the trip ends. | M | P6 | | [BR-PAR-04](/en/docs/brd/requirements#610-parents-and-children-par) | Child tracking is available where the parent is on Explorer or VIP and the organization is on Growth or Enterprise with tracking enabled for the trip ([OD-05](/en/docs/brd/compliance#11-open-decisions)). Live position is shown only while the trip is In Progress (D-317). | M | P6 | ### 6.11 Media and photographers (MED, PHO) [#611-media-and-photographers-med-pho] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-MED-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Photographers upload albums after the trip is Completed, within 14 days (D-267). Album count per trip follows the plan. | M | P4 | | [BR-MED-02](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Albums use one of three privacy modes allowed by the photographer's plan: public to trip participants, shared link, or selected users. | M | P4 | | [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Studio and Pro photographers can watermark public copies (bottom right, inset 3 percent, 30 percent opacity, D-275). | S | P4 | | [BR-MED-04](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Signed-in travelers who took the trip view the albums they are allowed to see. Public albums allow download of the watermarked or medium copy; shared-link and selected-user albums do not offer download (D-264, D-266). | M | P4 | | [BR-PHO-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Photographers manage portfolio, rates and availability (dates and ranges, no weekly rules, D-89) and see earnings and payouts. | M | P4 | ### 6.12 Notifications (NTF) [#612-notifications-ntf] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-NTF-01](/en/docs/brd/requirements#612-notifications-ntf) | Notifications go out on the channels each user enables per category: email, SMS, WhatsApp, push and in-app. | M | P1 | | [BR-NTF-02](/en/docs/brd/requirements#612-notifications-ntf) | Notifications use the user's language, with right-to-left layout for Arabic. | M | P1 | | [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf) | SMS and push respect quiet hours 22:00 to 07:00 local time, except urgent messages; deferred messages go at 07:00, and trip-day events older than 2 hours are dropped (D-290). | S | P3 | ### 6.13 Plans and subscriptions (SUB) [#613-plans-and-subscriptions-sub] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-SUB-01](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin defines plans per role and market: limits, features, monthly and annual prices, annual discount and trial length. | M | P5 | | [BR-SUB-02](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Plan limits and features are enforced automatically. A blocked action shows an upgrade prompt. Every non-traveler role needs an active plan to use the app ([BRL-02](/en/docs/brd/requirements#7-business-rules)). | M | P5 | | [BR-SUB-03](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Failed renewals trigger dunning and a 7-day grace period before the account loses plan features. | M | P5 | | [BR-SUB-04](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin sees recurring revenue, churn, upgrades, downgrades and plan distribution. | M | P5 | | [BR-SUB-05](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin can grant, revoke or change a plan for one account, with a reason, a second admin's approval and an end date. | M | P5 | ### 6.14 Accounting, invoices and settlements (ACC) [#614-accounting-invoices-and-settlements-acc] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ACC-01](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Organizations see, per trip, base revenue, program revenue, coupon impact, supplier costs, commission and gateway fees. Depth follows the plan. | M | P5 | | [BR-ACC-02](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Admin sees system-wide finance: subscription revenue, commission, deal audit, coupon redemptions, disputes and payouts. | M | P5 | | [BR-ACC-03](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Suppliers see their earnings and receive weekly payouts. A negative balance is netted against the next payout in the same currency (D-173). | M | P4 | | [BR-ACC-04](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Exports in CSV and PDF follow the plan; admin system-wide exports are CSV only; export files expire after 7 days (D-249). | M | P5 | | [BR-ACC-05](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Every financial event is recorded in a double-entry ledger and reconciled daily with gateway records (D-29). | M | P2 | | [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | The platform records amounts owed between the platform, organizations and suppliers per trip and tracks each settlement to completion. A settlement opens when the trip is Completed and closes when every payout is made and no dispute is open (D-174). | M | P4 | | [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Settlements and invoices cover every party pair: traveler to organization (B2C or B2B), organization to supplier (deal), platform to organization and supplier (commission and payout), and organization or supplier to platform (plan). | M | P5 | ### 6.15 Platform administration (ADM) [#615-platform-administration-adm] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ADM-01](/en/docs/brd/requirements#615-platform-administration-adm) | Admin reviews all applications and appeals from one queue. | M | P1 | | [BR-ADM-02](/en/docs/brd/requirements#615-platform-administration-adm) | Admin manages any account: suspend, reinstate, reset credentials, review deletion and data-copy requests. | M | P1 | | [BR-ADM-03](/en/docs/brd/requirements#615-platform-administration-adm) | Admin can require any approved driver to take a lab test at any time; the driver is paused until the result is accepted ([BRL-16](/en/docs/brd/requirements#7-business-rules), [BRL-17](/en/docs/brd/requirements#7-business-rules)). Lab tests apply to drivers only (D-98). | M | P4 | | [BR-ADM-04](/en/docs/brd/requirements#615-platform-administration-adm) | Admin records disputes, decides outcomes and issues refunds, including refunds outside policy with a reason. | M | P3 | | [BR-ADM-05](/en/docs/brd/requirements#615-platform-administration-adm) | Every admin action and permission change is written to an audit log no one can edit. | M | P1 | | [BR-ADM-06](/en/docs/brd/requirements#615-platform-administration-adm) | Admin manages plans, coupons, notification templates, feature flags and market settings. | M | P1 | | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm) | Disputes are acknowledged within 2 working days and resolved within 10 working days; information requests are answered within 5 working days. Types: booking, payment, refund, supplier conduct, organization conduct, other (D-32, D-254). | M | P3 | ### 6.16 Markets (MKT) [#616-markets-mkt] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt) | Admin configures each market: currency, enabled payment methods and gateways, tax rules and invoice format, default time zone, and plan prices. | M | P2 | | [BR-MKT-02](/en/docs/brd/requirements#616-markets-mkt) | An account's market is set from the country it registered with. An organization's market decides the currency, payment methods and tax rules of its trips. | M | P2 | | [BR-MKT-03](/en/docs/brd/requirements#616-markets-mkt) | Travelers see trips from every market, with prices in the trip's currency, and pay with that market's methods. | M | P5 | | [BR-MKT-04](/en/docs/brd/requirements#616-markets-mkt) | A market can be switched on or off; trips in a market that is off cannot be published. | S | P5 | ### 6.17 Analytics (ANL) [#617-analytics-anl] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl) | Organizations see analytics by trip (views, conversion, bookings, revenue, occupancy, programs), by page (trip page and organization page traffic), by customer (new and returning travelers, repeat rate) and by provider (deals, costs, on-time record). Depth follows the plan (Growth basic, Enterprise full). | M | P6 | | [BR-ANL-02](/en/docs/brd/requirements#617-analytics-anl) | Drivers and photographers see analytics for their own bookings and earnings at the depth of their plan. | S | P6 | | [BR-ANL-03](/en/docs/brd/requirements#617-analytics-anl) | Admin sees platform analytics by market, organization, role and plan. | M | P6 | | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl) | Analytics offer 7, 30 and 90-day presets and a custom range, lag the source by no more than 5 minutes, and exports are ready within 15 minutes (D-177, D-281). | S | P6 | | [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) | Organizations and partners can use a documented public API for trips and bookings. | C | P6 | ## 7. Business rules [#7-business-rules] | ID | Rule | |---|---| | [BRL-01](/en/docs/brd/requirements#7-business-rules) | Trip records are tenant-isolated. Only the owning organization's staff, the platform admin, and the people on a booking within their own scope (traveler, linked parent, assigned moderator, driver or photographer) may see them. | | [BRL-02](/en/docs/brd/requirements#7-business-rules) | Every non-traveler role must hold an active plan to use the app. A traveler can always use the app for free. | | [BRL-03](/en/docs/brd/requirements#7-business-rules) | A coupon applies only inside its creator's scope: admin to any trip; organization to its own trips; driver or photographer to bookings where they are assigned. Cross-entity use is rejected. | | [BRL-04](/en/docs/brd/requirements#7-business-rules) | A platform driver or photographer is assigned only after a finalized deal accepted by both parties. | | [BRL-05](/en/docs/brd/requirements#7-business-rules) | An organization-owned driver or photographer is accepted on assignment and is never visible to other organizations. | | [BRL-06](/en/docs/brd/requirements#7-business-rules) | A rejected supplier or organization application can be re-submitted after 30 days. A closed application counts as rejected. The traveler account keeps working throughout. | | [BRL-07](/en/docs/brd/requirements#7-business-rules) | A trip cannot move to Ready until every vehicle has a driver and a moderator and every platform deal is finalized. | | [BRL-08](/en/docs/brd/requirements#7-business-rules) | A seat hold lasts 15 minutes and is released automatically when it expires. Exception: a Fawry cash voucher holds seats for the voucher's 48-hour window (D-31, D-41). | | [BRL-09](/en/docs/brd/requirements#7-business-rules) | A moderator can check a passenger in only to the vehicle assigned to that passenger on that trip. | | [BRL-10](/en/docs/brd/requirements#7-business-rules) | Parents see data only for children linked to their own bookings. | | [BRL-11](/en/docs/brd/requirements#7-business-rules) | A refund reverses the coupon redemption and frees the traveler's per-user limit. | | [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancellation refund depends on time before departure: 80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours (placeholder, D-07, [OD-07](/en/docs/brd/compliance#11-open-decisions)). All fees are refundable until non-refundable fees are set (D-156). | | [BRL-13](/en/docs/brd/requirements#7-business-rules) | A plan upgrade takes effect at once with proration; a downgrade takes effect at the end of the cycle. | | [BRL-14](/en/docs/brd/requirements#7-business-rules) | A failed renewal starts a 7-day grace period with features kept. | | [BRL-15](/en/docs/brd/requirements#7-business-rules) | Account deletion becomes permanent after a 30-day grace period. Trip records are kept 5 years after deletion. Future bookings are cancelled and refunded; remaining earnings are paid on the next payout date. No booking or payment is allowed during the grace period. | | [BRL-16](/en/docs/brd/requirements#7-business-rules) | A lab test has a deadline of 3 days from request (admin may set 1 to 7 days, D-21). A missed deadline suspends the driver; a suspension longer than 30 days closes the driver account. A second failed result within 12 months closes the account (D-242). | | [BRL-17](/en/docs/brd/requirements#7-business-rules) | A driver whose lab test is requested is paused at once. Upcoming trips return to their organizers. Completed trips are paid; trips not yet completed are held (D-175). | | [BRL-18](/en/docs/brd/requirements#7-business-rules) | Every financial event (booking, refund, coupon, subscription charge, payout, deal cost, commission, invoice) is written to a double-entry ledger. | | [BRL-19](/en/docs/brd/requirements#7-business-rules) | Every admin action and every permission change is written to an immutable audit log. | | [BRL-20](/en/docs/brd/requirements#7-business-rules) | Verification codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. A resend does not reset the wrong-code count; after 3 failed deliveries the code goes by the other channel (D-58, D-59). | | [BRL-21](/en/docs/brd/requirements#7-business-rules) | Accounts lock for 15 minutes after 5 failed sign-in attempts (all roles, D-53). | | [BRL-22](/en/docs/brd/requirements#7-business-rules) | Web sessions end after 12 hours of use. Drafts are kept. | | [BRL-23](/en/docs/brd/requirements#7-business-rules) | Every registration form records the applicant's country. | | [BRL-24](/en/docs/brd/requirements#7-business-rules) | A trip's programs, seat mode or vehicles cannot be changed in a way that breaks a confirmed booking until the traveler is notified and offered a remedy. The traveler has 7 days to choose; then the case goes to admin (D-148). | | [BRL-25](/en/docs/brd/requirements#7-business-rules) | A trip is archived 30 days after Completed, and only once its settlement is closed (D-26). | | [BRL-26](/en/docs/brd/requirements#7-business-rules) | A deal offer expires 72 hours after the last counter-offer and the deal ends as Rejected with reason "expired" (D-14). | | [BRL-27](/en/docs/brd/requirements#7-business-rules) | Market values (currency, payment methods, tax and invoicing rules, default time zone) follow the country: the organization's country for its trips and invoices, and the account's country for its own plan. | | [BRL-28](/en/docs/brd/requirements#7-business-rules) | An invoice is B2B when the buyer gives a tax number, otherwise B2C (D-180). An issued invoice is never edited; a correction is a credit note that references it (D-181). | | [BRL-29](/en/docs/brd/requirements#7-business-rules) | Travelers never see a vehicle's live position. Only operations staff of the owning organization, the platform admin and eligible linked parents do, and parents only while the trip is In Progress (D-317). | | [BRL-30](/en/docs/brd/requirements#7-business-rules) | When an organization cancels a trip, every confirmed booking is refunded in full and coupon redemptions are reversed (D-150). A trip that is In Progress cannot be cancelled; it is handled as an incident (D-25, [OD-22](/en/docs/brd/compliance#11-open-decisions)). | # Applications (/en/docs/erd/domains/applications) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o{ APPLICATIONS : submits APPLICATIONS ||--o{ APPLICATION_DOCUMENTS : attaches APPLICATIONS ||--o{ APPLICATION_DECISIONS : receives APPLICATIONS ||--o| APPEALS : appealed_by APPLICATIONS ||--o| ORGANIZATIONS : creates ``` ## applications [#applications] *(Base +) [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) to [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications)* | Column | Type | Notes | |---|---|---| | applicant_user_id | BIGINT FK users | | | type_id | BIGINT FK lookups | `application_type`: organization, platform_driver, platform_photographer | | status_id | BIGINT FK lookups | `application_status`: draft, submitted, pending_review, changes_requested, approved, rejected, appealed, closed | | country_code | CHAR(2) FK countries | | | requested_plan_id | BIGINT FK plans | Chosen at registration, no charge (D-77) | | payload | JSONB | Role-specific fields (legal names, CR and tax numbers, license, vehicle, rates, service regions) | | submitted_at | TIMESTAMPTZ | | | review_due_at | TIMESTAMPTZ | 2 working days ([FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target)) | | changes_due_at | TIMESTAMPTZ | 14 days, plus one 7-day extension (D-235) | | extension_used | BOOLEAN | | | decided_at | TIMESTAMPTZ | | | reapply_after | DATE | Decision date plus 30 days ([BRL-06](/en/docs/brd/requirements#7-business-rules)) | | previous_application_id | BIGINT FK applications | Re-application chain | **application_documents** (Base +): `application_id FK`, `doc_type_id FK lookups (document_type: id_card, driving_license, vehicle_registration, insurance, lab_result, commercial_registration, tax_certificate, portfolio_photo, other)`, `storage_path TEXT` (restricted bucket, [DAT-04](/en/docs/srs/data#62-data-isolation)), `mime_type VARCHAR(80)`, `size_bytes BIGINT` (10 MB documents, 25 MB photos, D-80, D-81), `valid_until DATE NULL`, `issued_on DATE NULL`, `check_status_id FK lookups (document_check: pending, accepted, rejected)`. **application_decisions** (Base +): `application_id FK`, `decision_id FK lookups (application_decision: approve, request_changes, reject, close, uphold_appeal, overturn)`, `reason_id FK lookups (decision_reason, D-234) NULL`, `message JSONB` (in the applicant's language), `items JSONB` (requested changes), `decided_by BIGINT FK users`. **appeals** (Base +) D-237: `application_id FK UNIQUE`, `statement TEXT`, `files JSONB` (up to 5), `submitted_at`, `due_at` (5 working days), `status_id FK lookups (appeal_status: submitted, upheld, rejected)`. # Booking and payment (/en/docs/erd/domains/booking-and-payment) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIPS ||--o{ BOOKINGS : receives USERS ||--o{ BOOKINGS : makes BOOKINGS ||--o{ BOOKING_PASSENGERS : includes BOOKINGS ||--o{ BOOKING_PROGRAMS : selects PROGRAMS ||--o{ BOOKING_PROGRAMS : chosen_in TRIP_VEHICLES ||--o{ TRIP_SEATS : has BOOKING_PASSENGERS ||--o| TRIP_SEATS : sits_in BOOKINGS ||--o{ PAYMENTS : paid_by PAYMENTS ||--o{ PAYMENT_ATTEMPTS : tried PAYMENTS ||--o{ REFUNDS : refunded_by BOOKINGS ||--o{ BOOKING_REMEDIES : offered ``` ## bookings [#bookings] *(Base +) [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) to [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column | | trip_id | BIGINT FK trips | | | booked_by_user_id | BIGINT FK users | | | reference | VARCHAR(12) | Public booking reference used for child links | | status_id | BIGINT FK lookups | `booking_status`: cart, seats_held, payment_pending, confirmed, payment_failed, checked_in, checked_out, cancelled, refund_pending, refunded | | passenger_count | SMALLINT | | | base_total_minor, programs_total_minor, plan_discount_minor, coupon_discount_minor, total_minor | BIGINT | Price locked when the hold starts (D-192) | | currency_code | CHAR(3) | | | hold_expires_at | TIMESTAMPTZ | 15 minutes; Fawry 48 h | | payment_attempts | SMALLINT | Max 3 per hold (D-197) | | buyer_tax_no | VARCHAR(50) NULL | Present means B2B invoice ([BRL-28](/en/docs/brd/requirements#7-business-rules)) | | confirmed_at, cancelled_at | TIMESTAMPTZ | | | cancel_reason_id | BIGINT FK lookups | `cancel_reason` | | refund_rule_applied | VARCHAR(20) | For example `80_at_48h` | **booking_passengers** (Base +): `organization_id`, `booking_id FK`, `full_name VARCHAR(200)`, `is_child BOOLEAN`, `birth_year SMALLINT NULL`, `trip_vehicle_id FK NULL`, `seat_id FK trip_seats NULL`, `checkin_status_id FK lookups (passenger_checkin: not_boarded, on_board, off_vehicle, completed)`, `boarding_code_hash CHAR(64)`. **booking_programs** (Base +): `organization_id`, `booking_id FK`, `program_id FK`, `program_tier_id FK NULL`, `passenger_id FK booking_passengers NULL`, `quantity INT`, `unit_price_minor BIGINT`, `line_total_minor BIGINT`. ## trip_seats [#trip_seats] *(Base +) [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) to [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_vehicle_id | BIGINT FK trip_vehicles | | | vehicle_type_seat_id | BIGINT FK vehicle_type_seats | | | label | VARCHAR(10) | | | status_id | BIGINT FK lookups | `seat_status`: available, held, reserved, checked_in, checked_out, released | | held_by_booking_id | BIGINT FK bookings NULL | | | held_until | TIMESTAMPTZ | | | reserved_by_passenger_id | BIGINT FK booking_passengers NULL | | Unique `(trip_vehicle_id, label, deleted_at)`. Hold races are resolved with a Redis lock and a conditional update on `status_id`. **payments** (Base +) [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) to [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market): `organization_id NULL` (null for plan charges), `booking_id FK NULL`, `subscription_charge_id FK NULL`, `payer_user_id FK`, `gateway_id FK lookups (gateway)`, `method_id FK lookups (payment_method)`, `amount_minor`, `currency_code`, `status_id FK lookups (payment_status: pending, succeeded, failed, expired, refunded, partially_refunded)`, `gateway_reference VARCHAR(120)` (unique per gateway), `voucher_expires_at TIMESTAMPTZ NULL` (Fawry), `succeeded_at`. **payment_attempts** (Base +): `payment_id FK`, `attempt_no SMALLINT`, `gateway_event_id VARCHAR(120)` (unique, idempotent callbacks), `result_id FK lookups (attempt_result)`, `failure_code VARCHAR(80)`, `raw_status VARCHAR(80)`. **refunds** (Base +) [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy): `organization_id`, `payment_id FK`, `booking_id FK`, `amount_minor`, `currency_code`, `reason_id FK lookups (refund_reason: traveler_cancel, org_cancel, dispute, admin_outside_policy, remedy)`, `policy_rule VARCHAR(20)`, `status_id FK lookups (refund_status: requested, sent, confirmed, failed)`, `gateway_reference`, `retries SMALLINT` (3, D-322), `approved_by FK users NULL`, `dispute_id FK NULL`. **booking_remedies** (Base +) [BRL-24](/en/docs/brd/requirements#7-business-rules): `organization_id`, `booking_id FK`, `change_type_id FK lookups (trip_change_type: program_removed, seat_mode_changed, vehicle_changed, time_changed)`, `options JSONB`, `chosen_option VARCHAR(40)`, `due_at` (7 days, D-148), `status_id FK lookups (remedy_status: offered, chosen, escalated, expired)`. # Coupons (/en/docs/erd/domains/coupons) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram COUPONS ||--o{ COUPON_PROGRAMS : targets COUPONS ||--o{ COUPON_AUDIENCES : offered_to COUPONS ||--o{ COUPON_REDEMPTIONS : redeemed_in BOOKINGS ||--o{ COUPON_REDEMPTIONS : uses COUPONS ||--o{ ABUSE_FLAGS : flagged_by ``` ## coupons [#coupons] *(Base +) [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) to [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan)* | Column | Type | Notes | |---|---|---| | code | VARCHAR(40) | Unique with `deleted_at` (case-insensitive) | | creator_type_id | BIGINT FK lookups | `coupon_creator`: admin, organization, driver, photographer | | creator_user_id | BIGINT FK users | | | organization_id | BIGINT FK organizations NULL | Scope for organization coupons | | scope_user_id | BIGINT FK users NULL | Scope for driver or photographer coupons | | market_id | BIGINT FK markets NULL | Null means all markets (admin only) | | discount_type_id | BIGINT FK lookups | `discount_type`: fixed, percent, program_specific, free_program, first_booking, minimum_spend | | value_minor | BIGINT NULL | Fixed amount | | value_bp | INT NULL | Percentage in basis points | | currency_code | CHAR(3) NULL | | | min_spend_minor | BIGINT NULL | | | usage_limit | INT NULL | | | per_user_limit | INT | Default 1 | | used_count | INT | | | valid_from, valid_until | TIMESTAMPTZ | | | audience_id | BIGINT FK lookups | `coupon_audience`: public, targeted | | is_stackable | BOOLEAN | | | status_id | BIGINT FK lookups | `coupon_status`: draft, active, paused, expired, exhausted, revoked | **coupon_programs** (Base +): `coupon_id FK`, `program_id FK`. **coupon_audiences** (Base +): `coupon_id FK`, `user_id FK NULL`, `segment_code VARCHAR(40) NULL`. **coupon_redemptions** (Base +): `coupon_id FK`, `booking_id FK`, `user_id FK`, `organization_id`, `discount_minor BIGINT`, `currency_code`, `status_id FK lookups (redemption_status: applied, confirmed, reversed)`, `reversed_at`. **abuse_flags** (Base +) D-216, D-217: `subject_type_id FK lookups (flag_subject: coupon, user, booking, deal)`, `subject_id BIGINT`, `rule_code VARCHAR(60)`, `details JSONB`, `status_id FK lookups (flag_status: open, reviewed_ok, actioned)`, `review_due_at` (2 working days), `reviewed_by FK users NULL`. # Deals (/en/docs/erd/domains/deals) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ DEALS : opens USERS ||--o{ DEALS : supplies TRIPS ||--o{ DEALS : for_trip TRIP_VEHICLES ||--o{ DEALS : for_vehicle DEALS ||--o{ DEAL_OFFERS : negotiates ``` ## deals [#deals] *(Base +) [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column; suppliers read through a platform-scoped repository | | trip_id | BIGINT FK trips | | | trip_vehicle_id | BIGINT FK trip_vehicles NULL | Null for photographer deals | | provider_user_id | BIGINT FK users | | | provider_type_id | BIGINT FK lookups | `provider_type`: driver, photographer | | status_id | BIGINT FK lookups | `deal_status`: proposed, countered_by_provider, countered_by_organization, accepted_by_one, finalized, rejected | | current_amount_minor | BIGINT | | | currency_code | CHAR(3) | | | organization_accepted_at, provider_accepted_at | TIMESTAMPTZ | Both set = finalized | | last_offer_at | TIMESTAMPTZ | | | expires_at | TIMESTAMPTZ | last_offer_at plus 72 h ([BRL-26](/en/docs/brd/requirements#7-business-rules)) | | reject_reason_id | BIGINT FK lookups | `deal_end_reason`: rejected, expired, provider_paused, trip_cancelled | | finalized_at | TIMESTAMPTZ | | | flagged_reason | TEXT | Admin flag (D-252) | **deal_offers** (immutable): `id`, `uuid`, `organization_id`, `deal_id FK`, `offered_by_side_id FK lookups (deal_side: organization, provider)`, `amount_minor BIGINT`, `note TEXT`, `action_id FK lookups (deal_action: propose, counter, accept, reject)`, `created_at`, `created_by`. # Finance (/en/docs/erd/domains/finance) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram LEDGER_ACCOUNTS ||--o{ LEDGER_ENTRIES : posts LEDGER_TRANSACTIONS ||--|{ LEDGER_ENTRIES : balances INVOICES ||--|{ INVOICE_LINES : itemizes INVOICES ||--o{ INVOICES : credit_note_of PAYOUT_RUNS ||--o{ PAYOUTS : pays SETTLEMENTS ||--|{ SETTLEMENT_LINES : owes TRIPS ||--o| SETTLEMENTS : settles PAYOUTS ||--o{ SETTLEMENT_LINES : clears DISPUTES ||--o{ DISPUTE_FILES : attaches BOOKINGS ||--o{ DISPUTES : about ``` **ledger_accounts** (Base +): `owner_type_id FK lookups (ledger_owner: platform, organization, supplier, traveler_clearing, gateway)`, `organization_id NULL`, `user_id NULL`, `account_kind_id FK lookups (ledger_account_kind: cash, receivable, payable, revenue, commission, fee_expense, deferred, refund_clearing, tax_payable)`, `currency_code`, `code VARCHAR(60)` unique. **ledger_transactions** (immutable) [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger): `id`, `uuid`, `event_type_id FK lookups (ledger_event: booking_paid, refund, coupon, deal_cost, commission, gateway_fee, plan_charge, payout, invoice, settlement, reversal)`, `source_type VARCHAR(40)`, `source_id BIGINT`, `occurred_at`, `reverses_transaction_id FK NULL`, `created_at`, `created_by`. A check confirms entries sum to zero per currency. **ledger_entries** (immutable): `id`, `uuid`, `transaction_id FK`, `account_id FK`, `organization_id NULL`, `debit_minor BIGINT`, `credit_minor BIGINT` (one is zero), `currency_code`, `trip_id NULL`, `booking_id NULL`, `deal_id NULL`, `gateway_reference NULL`, `created_at`, `created_by`. Retention 7 years. ## invoices [#invoices] *(Base +) [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT NULL | Issuer when the organization invoices a traveler; null for platform-issued | | issuer_type_id | BIGINT FK lookups | `invoice_issuer`: organization, platform, supplier | | buyer_type_id | BIGINT FK lookups | `invoice_buyer`: traveler, organization, supplier | | kind_id | BIGINT FK lookups | `invoice_kind`: b2c, b2b, credit_note | | number | VARCHAR(40) | Unique per issuer and market; null while numbering is retried (D-179) | | market_id | BIGINT FK markets | | | buyer_name, buyer_tax_no, buyer_address | VARCHAR, VARCHAR, JSONB | | | booking_id, subscription_charge_id, deal_id, settlement_id | BIGINT NULL | Source | | original_invoice_id | BIGINT FK invoices NULL | For credit notes ([BRL-28](/en/docs/brd/requirements#7-business-rules)) | | subtotal_minor, tax_minor, total_minor | BIGINT | | | currency_code | CHAR(3) | | | status_id | BIGINT FK lookups | `invoice_status`: pending_number, issued, voided_by_credit, finance_review | | issued_at | TIMESTAMPTZ | | | e_invoice_status_id | BIGINT FK lookups NULL | Reserved for ZATCA ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | | pdf_path | TEXT | | **invoice_lines** (Base +): `invoice_id FK`, `description JSONB`, `quantity NUMERIC(10,2)`, `unit_minor BIGINT`, `tax_rate_bp INT`, `tax_minor BIGINT`, `line_total_minor BIGINT`. **payout_runs** (Base +) [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts): `run_date DATE` (Mondays 06:00, D-28), `market_id FK`, `status_id FK lookups (payout_run_status: draft, approved, submitted, completed, partial)`, `approved_by FK users`. **payouts** (Base +): `payout_run_id FK`, `payee_user_id FK NULL`, `payee_organization_id FK NULL`, `payout_method_id FK`, `amount_minor`, `currency_code`, `status_id FK lookups (payout_status: pending, sent, paid, failed, held)`, `hold_reason_id FK lookups NULL` (lab pause D-175, negative balance D-173), `external_reference VARCHAR(120)`, `paid_at`. **settlements** (Base +) [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [BRL-25](/en/docs/brd/requirements#7-business-rules): `organization_id`, `trip_id FK UNIQUE`, `status_id FK lookups (settlement_status: open, awaiting_payouts, disputed, closed)`, `opened_at` (trip Completed), `closed_at`, `totals JSONB` (gross, commission, fees, supplier costs, net). **settlement_lines** (Base +): `settlement_id FK`, `from_party_type_id FK lookups (party)`, `from_party_id BIGINT`, `to_party_type_id FK lookups (party)`, `to_party_id BIGINT`, `reason_id FK lookups (settlement_reason: trip_revenue, commission, deal_cost, gateway_fee, refund, adjustment)`, `amount_minor`, `currency_code`, `payout_id FK NULL`, `settled_at`. **reconciliation_exceptions** (Base +) [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation): `gateway_id FK lookups`, `report_date DATE`, `gateway_reference VARCHAR(120)`, `kind_id FK lookups (recon_exception: missing_in_ledger, missing_in_gateway, amount_mismatch, currency_mismatch)`, `gateway_amount_minor`, `ledger_amount_minor`, `status_id FK lookups (exception_status: open, resolved, written_off)`, `resolved_by FK users NULL`. **disputes** (Base +) [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling): `organization_id NULL`, `booking_id FK NULL`, `deal_id FK NULL`, `raised_by FK users`, `type_id FK lookups (dispute_type: booking, payment, refund, supplier_conduct, organization_conduct, other)`, `status_id FK lookups (dispute_status: open, information_requested, under_review, resolved, closed)`, `ack_due_at` (2 working days), `resolve_due_at` (10 working days), `outcome TEXT`, `refund_id FK refunds NULL`, `assigned_to FK users NULL`. **dispute_files** (Base +): `dispute_id FK`, `storage_path TEXT`, `size_bytes BIGINT` (up to 5 files of 10 MB, D-259). # Fleet and trips (/en/docs/erd/domains/fleet-and-trips) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ VEHICLE_TYPES : defines VEHICLE_TYPES ||--o{ VEHICLE_TYPE_SEATS : lays_out ORGANIZATIONS ||--o{ VEHICLES : registers VEHICLE_TYPES ||--o{ VEHICLES : typed_as ORGANIZATIONS ||--o{ TRIPS : runs TRIPS ||--o{ TRIP_STOPS : routes TRIPS ||--o{ TRIP_AUDIENCES : targets TRIPS ||--o{ TRIP_VEHICLES : uses VEHICLES ||--o{ TRIP_VEHICLES : assigned_as TRIP_VEHICLES ||--o{ TRIP_STAFF_ASSIGNMENTS : staffed_by TRIPS ||--o{ TRIP_STAFF_ASSIGNMENTS : photographer TRIPS ||--o{ PROGRAMS : offers PROGRAMS ||--o{ PROGRAM_TIERS : priced_by ``` **vehicle_types** (Base +) [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types): `organization_id`, `name JSONB`, `seat_count SMALLINT`, `layout JSONB` (grid rows, columns, aisles, doors), `archived_at TIMESTAMPTZ`. **vehicle_type_seats** (Base +): `organization_id`, `vehicle_type_id FK`, `label VARCHAR(10)` (for example 12B), `row_no SMALLINT`, `col_no SMALLINT`, `seat_kind_id FK lookups (seat_kind: standard, accessible, crew, blocked)`. Unique `(vehicle_type_id, label, deleted_at)`. **vehicles** (Base +) [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry): `organization_id`, `vehicle_type_id FK`, `plate_no VARCHAR(20)`, `model VARCHAR(80)`, `year SMALLINT`, `seat_count SMALLINT` (must equal the type), `registration_status_id FK lookups (registration_status)`, `registration_valid_until DATE`, `provider_vehicle_id FK provider_vehicles NULL` (a platform driver's own vehicle used on a deal). ## trips [#trips] *(Base +) [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) to [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT FK organizations | Tenant column | | market_id | BIGINT FK markets | Copied from the organization at creation | | code | VARCHAR(20) | Human reference, unique per organization | | title, description | JSONB | | | category_id | BIGINT FK lookups | `trip_category` | | status_id | BIGINT FK lookups | `trip_status`: draft, published, negotiating, ready, filling_up, sold_out, in_progress, partially_completed, completed, post_processing, archived, cancelled, refunds_issued | | publish_mode_id | BIGINT FK lookups | `publish_mode`: draft, public, targeted | | timezone | VARCHAR(64) | | | starts_at, ends_at | TIMESTAMPTZ | | | base_price_minor | BIGINT | | | currency_code | CHAR(3) | From market | | capacity_total | INT | Sum of vehicle seats | | seats_reserved | INT | Counter; Filling Up at 80 percent (D-189) | | seat_mode_id | BIGINT FK lookups | `seat_mode`: company_assigned, self_select | | child_tracking_enabled | BOOLEAN | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | | vip_early_access_until | TIMESTAMPTZ NULL | D-146 | | priority_seat_window_until | TIMESTAMPTZ NULL | D-316 | | published_at, cancelled_at, completed_at, archived_at | TIMESTAMPTZ | | | cancel_reason | TEXT | | | counted_in_cycle | DATE | Month counted for the active-trip limit (D-143) | Indexes: `(organization_id, status_id)`, partial `(starts_at)` where published or filling up. **trip_stops** (Base +): `organization_id`, `trip_id FK`, `seq SMALLINT`, `kind_id FK lookups (stop_kind: pickup, stop, destination, dropoff)`, `name JSONB`, `address JSONB`, `lat NUMERIC(10,7)`, `lng NUMERIC(10,7)`, `planned_at TIMESTAMPTZ`. **trip_audiences** (Base +): `organization_id`, `trip_id FK`, `user_id FK NULL`, `email CITEXT NULL`, `phone_hash CHAR(64) NULL`. Targeted publishing list ([FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing)). ## trip_vehicles [#trip_vehicles] *(Base +) [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column | | trip_id | BIGINT FK trips | | | vehicle_id | BIGINT FK vehicles NULL | | | vehicle_type_id | BIGINT FK vehicle_types | | | label | VARCHAR(40) | Bus A, Bus B | | status_id | BIGINT FK lookups | `trip_vehicle_status`: planning, ready, departed, ended | | seat_count | SMALLINT | | | departed_at, ended_at | TIMESTAMPTZ | | | last_lat, last_lng, last_point_at | NUMERIC, NUMERIC, TIMESTAMPTZ | Latest position cache | ## trip_staff_assignments [#trip_staff_assignments] *(Base +) [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) to [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_id | BIGINT FK trips | | | trip_vehicle_id | BIGINT FK trip_vehicles NULL | Null for trip-level photographer | | staff_role_id | BIGINT FK lookups | `staff_role`: driver, moderator, photographer | | user_id | BIGINT FK users | | | track_id | BIGINT FK lookups | `supplier_track`: organization, platform | | deal_id | BIGINT FK deals NULL | Required when track is platform ([BRL-04](/en/docs/brd/requirements#7-business-rules)) | | status_id | BIGINT FK lookups | `assignment_status`: proposed, accepted, replaced, released | | access_until | TIMESTAMPTZ | Moderators: trip end plus 24 h (D-107) | Unique active `(trip_vehicle_id, staff_role_id)` where status accepted. ## programs [#programs] *(Base +) [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) to [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_id | BIGINT FK trips | | | title, description | JSONB | | | pricing_model_id | BIGINT FK lookups | `pricing_model`: free, per_person, by_quantity, per_group, tiered | | price_minor | BIGINT NULL | Null for free and tiered | | currency_code | CHAR(3) | | | is_required | BOOLEAN | Pre-required | | is_vip_only | BOOLEAN | | | capacity | INT NULL | | | enrolled_count | INT | | | starts_at | TIMESTAMPTZ NULL | | **program_tiers** (Base +): `organization_id`, `program_id FK`, `name JSONB`, `price_minor BIGINT`, `sort_by INT`. # Identity and access (/en/docs/erd/domains/identity-and-access) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o{ USER_ROLES : holds USERS ||--o{ AUTH_FACTORS : secures USERS ||--o{ OTP_CHALLENGES : verifies USERS ||--o{ SESSIONS : opens USERS ||--o{ DEVICES : registers USERS ||--o{ CONSENTS : gives USERS ||--o{ NOTIFICATION_PREFERENCES : sets USERS ||--o{ PRIVACY_REQUESTS : files ORGANIZATIONS ||--o{ USER_ROLES : scopes ``` ## users [#users] *(Base +) [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) to [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens)* | Column | Type | Notes | |---|---|---| | full_name | VARCHAR(200) | | | email | CITEXT | Unique with `deleted_at` where not null | | phone_enc | BYTEA | enc; E.164 | | phone_hash | CHAR(64) | Unique with `deleted_at` where not null | | email_verified_at, phone_verified_at | TIMESTAMPTZ | D-20 | | password_hash | VARCHAR(255) | Argon2id; null for code-only accounts | | country_code | CHAR(2) FK countries | [BRL-23](/en/docs/brd/requirements#7-business-rules) | | locale | VARCHAR(5) | en or ar | | timezone | VARCHAR(64) | | | status_id | BIGINT FK lookups | `account_status`: active, suspended, deletion_requested, closed | | suspended_reason_id | BIGINT FK lookups | `suspension_reason` (D-234) | | deletion_requested_at, deletion_due_at | TIMESTAMPTZ | 30-day grace ([BRL-15](/en/docs/brd/requirements#7-business-rules)) | | failed_signins | SMALLINT | Reset on success | | locked_until | TIMESTAMPTZ | [BRL-21](/en/docs/brd/requirements#7-business-rules) | | token_version | INT | Bump to revoke all tokens | | traveler_plan_subscription_id | BIGINT FK subscriptions | Free by default | ## user_roles [#user_roles] *(Base +) [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users | | | role_id | BIGINT FK lookups | `role`: traveler, organization_owner, organization_employee, platform_driver, platform_photographer, org_driver, org_photographer, moderator, admin_super, admin_operations, admin_finance | | organization_id | BIGINT FK organizations NULL | Set for organization-scoped roles | | status_id | BIGINT FK lookups | `role_status`: pending, active, paused, suspended, ended | | started_at, ended_at | TIMESTAMPTZ | | Unique `(user_id, role_id, organization_id, deleted_at)`. **auth_factors** (Base +): `user_id FK`, `factor_type_id FK lookups (auth_factor: totp, sms)`, `secret_enc BYTEA`, `verified_at TIMESTAMPTZ`, `last_used_at TIMESTAMPTZ`. ## otp_challenges [#otp_challenges] *(Base +) [BRL-20](/en/docs/brd/requirements#7-business-rules)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users NULL | Null before the account exists | | channel_id | BIGINT FK lookups | `otp_channel`: sms, whatsapp, email | | destination_hash | CHAR(64) | | | purpose_id | BIGINT FK lookups | `otp_purpose`: verify_email, verify_phone, sign_in, staff_code, password_reset | | code_hash | CHAR(64) | | | expires_at | TIMESTAMPTZ | 5 minutes | | wrong_attempts | SMALLINT | Pause at 5 | | paused_until | TIMESTAMPTZ | 15 minutes | | failed_deliveries | SMALLINT | Switch channel at 3 (D-59) | | consumed_at | TIMESTAMPTZ | | **sessions** (Base +): `user_id FK`, `active_role_id FK user_roles`, `active_organization_id FK organizations NULL`, `refresh_token_hash CHAR(64)`, `device_id FK devices NULL`, `ip INET`, `user_agent TEXT`, `expires_at TIMESTAMPTZ` (web 12 h, [BRL-22](/en/docs/brd/requirements#7-business-rules)), `revoked_at TIMESTAMPTZ`. **devices** (Base +): `user_id FK`, `platform_id FK lookups (device_platform: ios, android, web)`, `push_token TEXT`, `app_version VARCHAR(20)`, `last_seen_at TIMESTAMPTZ`. **consents** (immutable) [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat): `id`, `uuid`, `user_id FK`, `consent_type_id FK lookups (consent_type: lab_test, background_check, child_tracking, guardianship, marketing, terms, privacy)`, `text_version VARCHAR(20)`, `granted BOOLEAN`, `occurred_at TIMESTAMPTZ`, `ip INET`, `created_at`, `created_by`. **notification_preferences** (Base +): `user_id FK`, `category_id FK lookups (notification_category)`, `channel_id FK lookups (notification_channel: email, sms, whatsapp, push, in_app)`, `enabled BOOLEAN`. Unique `(user_id, category_id, channel_id, deleted_at)`. **privacy_requests** (Base +) [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion): `user_id FK`, `type_id FK lookups (privacy_request_type: data_copy, deletion)`, `status_id FK lookups (privacy_request_status: received, verified, in_progress, delivered, cancelled)`, `due_at TIMESTAMPTZ` (30 days, D-162), `file_path TEXT`, `completed_at TIMESTAMPTZ`. # Lookups and markets (/en/docs/erd/domains/lookups-and-markets) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram LOOKUP_TYPES ||--o{ LOOKUPS : contains LOOKUPS ||--o{ LOOKUPS : parent_of COUNTRIES ||--o| MARKETS : configured_as CURRENCIES ||--o{ MARKETS : priced_in MARKETS ||--o{ MARKET_PAYMENT_METHODS : offers MARKETS ||--o{ TAX_RATES : applies ``` ## lookup_types [#lookup_types] *(Base +)* | Column | Type | Notes | |---|---|---| | code | VARCHAR(80) | Unique with `deleted_at`, for example `booking_status` | | name | JSONB | Translatable | | description | JSONB | Translatable | | parent_id | BIGINT FK lookup_types | Optional grouping | | sort_by | INT | | | is_public | BOOLEAN | Shown to clients | | is_system | BOOLEAN | Cannot be edited by admin | ## lookups [#lookups] *(Base +)* | Column | Type | Notes | |---|---|---| | lookup_type_id | BIGINT FK lookup_types | | | code | VARCHAR(80) | Unique with `(lookup_type_id, code, deleted_at)` | | value | VARCHAR(255) | Optional machine value | | name | JSONB | Translatable label | | description | JSONB | | | parent_id | BIGINT FK lookups | For example incident category under a group | | sort_by | INT | | | is_public, is_system | BOOLEAN | | **countries**: `code CHAR(2) PK`, `name JSONB`, `phone_prefix VARCHAR(6)`, `is_active BOOLEAN`. Reference data, no soft delete. **currencies**: `code CHAR(3) PK`, `minor_units SMALLINT`, `symbol JSONB`. Reference data. ## markets [#markets] *(Base +) [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt), [BRL-27](/en/docs/brd/requirements#7-business-rules)* | Column | Type | Notes | |---|---|---| | country_code | CHAR(2) FK countries | Unique | | currency_code | CHAR(3) FK currencies | EGP, SAR, AED | | default_timezone | VARCHAR(64) | Africa/Cairo, Asia/Riyadh, Asia/Dubai (D-282) | | status_id | BIGINT FK lookups | `market_status`: draft, live, paused | | launch_phase | SMALLINT | 2 or 5 | | commission_rate_bp | INT | Basis points; placeholder 1000 (D-15) | | invoice_rules | JSONB | Numbering prefix, required buyer fields, e-invoicing flag ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | **market_payment_methods** (Base +): `market_id FK`, `method_id FK lookups (payment_method: card, apple_pay, google_pay, local_card, fawry_cash)`, `gateway_id FK lookups (gateway: stripe, paymob, tap, fawry)`, `use_for_bookings BOOLEAN`, `use_for_plans BOOLEAN`, `sort_by INT`, `is_active BOOLEAN`. **tax_rates** (Base +): `market_id FK`, `tax_type_id FK lookups (tax_type: vat)`, `rate_bp INT` ([OD-27](/en/docs/brd/compliance#11-open-decisions)), `valid_from DATE`, `valid_to DATE NULL`. # Media (/en/docs/erd/domains/media) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIPS ||--o{ ALBUMS : has USERS ||--o{ ALBUMS : photographs ALBUMS ||--o{ PHOTOS : contains ALBUMS ||--o{ ALBUM_SHARED_LINKS : shared_by ALBUMS ||--o{ ALBUM_MEMBERS : visible_to PHOTOS ||--o{ DOWNLOAD_LOGS : downloaded ``` **albums** (Base +) [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) to [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan): `organization_id`, `trip_id FK`, `photographer_user_id FK`, `title JSONB`, `privacy_mode_id FK lookups (album_privacy: public, shared_link, selected_users)`, `watermark_enabled BOOLEAN`, `status_id FK lookups (album_status: uploading, processing, published, archived)`, `upload_window_ends_at` (trip completion plus 14 days, D-267), `published_at`, `archived_at`. **photos** (Base +): `organization_id`, `album_id FK`, `original_path TEXT`, `variants JSONB` (thumb, medium, large, watermarked), `width`, `height`, `perceptual_hash CHAR(16)`, `processing_status_id FK lookups (processing_status)`, `upload_batch_id UUID`, `client_file_id VARCHAR(120)` (resumable upload, unique per batch). **album_shared_links** (Base +): `album_id FK`, `token_hash CHAR(64)` (32-character token), `revoked_at`. **album_members** (Base +): `album_id FK`, `user_id FK`. Selected-users mode only. **download_logs** (Base +): `photo_id FK`, `user_id FK`, `variant VARCHAR(20)`, `occurred_at`. Retention 1 year. # Operations (/en/docs/erd/domains/operations) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIP_VEHICLES ||--o{ CHECKIN_EVENTS : logs BOOKING_PASSENGERS ||--o{ CHECKIN_EVENTS : about TRIP_VEHICLES ||--o{ TRACKING_POINTS : reports TRIP_VEHICLES ||--o{ INCIDENTS : raises TRIP_VEHICLES ||--o| TRIP_REPORTS : closes USERS ||--o{ CHILD_LINKS : parent_of BOOKING_PASSENGERS ||--o{ CHILD_LINKS : child TRIPS ||--o{ SAFETY_CASES : about ``` ## checkin_events [#checkin_events] *(immutable hypertable) [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) to [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue)* | Column | Type | Notes | |---|---|---| | id, uuid | BIGSERIAL, UUID | Primary key `(id, occurred_at)` | | organization_id | BIGINT | | | trip_id | BIGINT | | | trip_vehicle_id | BIGINT | | | passenger_id | BIGINT FK booking_passengers | | | event_type_id | BIGINT FK lookups | `checkin_event`: check_in, check_out, refused_wrong_vehicle | | stop_id | BIGINT FK trip_stops NULL | | | moderator_user_id | BIGINT FK users | | | lat, lng, accuracy_m | NUMERIC, NUMERIC, REAL | Null when location is not permitted | | occurred_at | TIMESTAMPTZ | Device time of the event | | received_at | TIMESTAMPTZ | Server time; difference measures the 60-second target | | client_event_id | UUID | Unique; offline replay is idempotent | | created_at, created_by | | | Retention 1 year. **tracking_points** (immutable hypertable) [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection): `id`, `organization_id`, `trip_vehicle_id`, `occurred_at`, `lat`, `lng`, `speed_kmh REAL`, `heading SMALLINT`, `accuracy_m REAL`, `source_id FK lookups (gps_source: driver_app, moderator_app)`. Retention 90 days, then an hourly summary is kept. **incidents** (Base +) [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting): `organization_id`, `trip_id`, `trip_vehicle_id`, `reported_by FK users`, `category_id FK lookups (incident_category: safety, medical, vehicle_fault, lost_traveler, conduct, other)`, `severity_id FK lookups (severity)`, `description TEXT`, `attachments JSONB`, `lat`, `lng`, `status_id FK lookups (incident_status: open, acknowledged, resolved)`, `acknowledged_at`, `resolved_at`. **trip_reports** (Base +) [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock): `organization_id`, `trip_vehicle_id FK UNIQUE`, `moderator_user_id`, `checked_in_count INT`, `final_headcount INT`, `mismatch_reason TEXT`, `notes TEXT`, `submitted_at` (locked after), `org_note TEXT`. ## child_links [#child_links] *(Base +) [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) to [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking)* | Column | Type | Notes | |---|---|---| | parent_user_id | BIGINT FK users | | | booking_id | BIGINT FK bookings | | | passenger_id | BIGINT FK booking_passengers | Must be `is_child` | | organization_id | BIGINT | Copied for RLS on organization reads | | guardianship_consent_id | BIGINT FK consents | D-126 | | status_id | BIGINT FK lookups | `child_link_status`: active, ended | | ended_at | TIMESTAMPTZ | Ends on cancellation or refund | Unique active `(parent_user_id, passenger_id)`. **safety_cases** (Base +) [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting): `organization_id`, `trip_id FK`, `passenger_id FK NULL`, `reported_by FK users`, `reporter_role_id FK lookups (role)`, `description TEXT`, `status_id FK lookups (case_status: open, escalated, closed)`, `escalated_to VARCHAR(200)` (D-68), `escalated_at`, `closed_at`. # Organizations (/en/docs/erd/domains/organizations) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ ORGANIZATION_MEMBERS : employs USERS ||--o{ ORGANIZATION_MEMBERS : joins ORGANIZATION_MEMBERS ||--o{ MEMBER_PERMISSIONS : granted PERMISSIONS ||--o{ MEMBER_PERMISSIONS : defines ORGANIZATIONS ||--o{ INVITATIONS : sends ORGANIZATIONS ||--o{ CRM_CONNECTIONS : connects ORGANIZATIONS ||--o{ WEBHOOK_ENDPOINTS : registers WEBHOOK_ENDPOINTS ||--o{ WEBHOOK_DELIVERIES : attempts ORGANIZATIONS ||--o{ API_KEYS : issues MARKETS ||--o{ ORGANIZATIONS : hosts ``` ## organizations [#organizations] *(Base +) [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) to [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding)* | Column | Type | Notes | |---|---|---| | owner_user_id | BIGINT FK users | | | application_id | BIGINT FK applications | | | market_id | BIGINT FK markets | From country ([BRL-27](/en/docs/brd/requirements#7-business-rules)) | | legal_name, trade_name | JSONB | | | commercial_reg_no | VARCHAR(50) | | | tax_no | VARCHAR(50) | | | billing_email | CITEXT | | | timezone | VARCHAR(64) | Defaults from market | | status_id | BIGINT FK lookups | `organization_status`: active, suspended, closed | | subscription_id | BIGINT FK subscriptions | | | seat_self_selection_default | BOOLEAN | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) | | child_tracking_default | BOOLEAN | | | branding | JSONB | Enterprise only ([BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org)) | | invoice_settings | JSONB | Prefix, footer, bank details | | approved_at | TIMESTAMPTZ | | ## organization_members [#organization_members] *(Base +) [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth), [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) to [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT FK organizations | Tenant column | | user_id | BIGINT FK users NULL | Null until the invitation is accepted | | email | CITEXT | The access-list key used for organization switching | | member_type_id | BIGINT FK lookups | `member_type`: owner, employee, org_driver, org_photographer, moderator | | status_id | BIGINT FK lookups | `member_status`: invited, active, suspended, removed | | joined_at, removed_at | TIMESTAMPTZ | | Unique `(organization_id, email, deleted_at)`. **permissions** (reference): `id`, `code VARCHAR(80) UNIQUE` (for example `trip.create`, `booking.refund`, `accounting.export`, `integration.manage`, `analytics.view`), `area_id FK lookups (permission_area)`, `name JSONB`. **member_permissions** (Base +): `organization_id`, `member_id FK organization_members`, `permission_id FK permissions`. Every insert and soft delete writes an audit log entry ([FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited)). **invitations** (Base +): `organization_id`, `member_id FK`, `channel_id FK lookups (otp_channel)`, `token_hash CHAR(64)`, `expires_at` (7 days, D-286, D-94), `accepted_at`. **crm_connections** (Base +): `organization_id`, `provider_id FK lookups (crm_provider)`, `credentials_enc BYTEA`, `status_id FK lookups (integration_status: connected, error, disconnected)`, `last_sync_at`. **webhook_endpoints** (Base +) [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks): `organization_id`, `url TEXT` (HTTPS only), `secret_enc BYTEA`, `previous_secret_enc BYTEA`, `previous_secret_valid_until TIMESTAMPTZ` (24 h after rotation), `events TEXT[]` (event codes), `is_active BOOLEAN`. **webhook_deliveries** (Base +): `organization_id`, `endpoint_id FK`, `event_uuid UUID`, `event_type VARCHAR(80)`, `payload JSONB`, `attempt SMALLINT` (up to 5 over 24 h), `status_code SMALLINT`, `next_attempt_at`, `delivered_at`, `replay_until` (7 days, D-63). **api_keys** (Base +): `organization_id`, `name VARCHAR(100)`, `key_prefix VARCHAR(12)`, `key_hash CHAR(64)`, `scopes TEXT[]`, `last_used_at`, `revoked_at`. # Plans and subscriptions (/en/docs/erd/domains/plans-and-subscriptions) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram PLANS ||--o{ PLAN_LIMITS : limits PLANS ||--o{ PLAN_PRICES : priced MARKETS ||--o{ PLAN_PRICES : per_market PLANS ||--o{ SUBSCRIPTIONS : subscribed SUBSCRIPTIONS ||--o{ SUBSCRIPTION_CHARGES : billed SUBSCRIPTIONS ||--o{ PLAN_OVERRIDES : overridden SUBSCRIPTIONS ||--o{ USAGE_COUNTERS : measures ``` **plans** (Base +) [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog): `role_scope_id FK lookups (plan_role: organization, driver, photographer, traveler)`, `code VARCHAR(40)` (starter, growth, enterprise, basic, professional, premium, studio, pro, free, explorer, vip), `name JSONB`, `tier_rank SMALLINT`, `trial_days SMALLINT NULL` ([OD-28](/en/docs/brd/compliance#11-open-decisions)), `is_default_on_approval BOOLEAN`, `is_active BOOLEAN`. **plan_limits** (Base +): `plan_id FK`, `limit_key VARCHAR(60)` (for example `active_trips_per_month`, `employees`, `vehicles_per_trip`, `programs_per_trip`, `coupons_active`, `bookings_per_month`, `portfolio_images`, `albums_per_trip`), `limit_value INT NULL` (null means unlimited), `feature_key VARCHAR(60) NULL` (for example `platform_suppliers`, `seat_self_select`, `child_tracking`, `watermark`, `album_privacy_link`, `album_privacy_selected`, `analytics_level`, `export`), `feature_value VARCHAR(40) NULL`. **plan_prices** (Base +): `plan_id FK`, `market_id FK`, `interval_id FK lookups (billing_interval: monthly, annual)`, `amount_minor BIGINT` ([OD-26](/en/docs/brd/compliance#11-open-decisions)), `currency_code`, `gateway_price_ref VARCHAR(120)`, `valid_from DATE`. ## subscriptions [#subscriptions] *(Base +) [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) to [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials)* | Column | Type | Notes | |---|---|---| | owner_type_id | BIGINT FK lookups | `subscription_owner`: organization, user | | organization_id | BIGINT FK NULL | | | user_id | BIGINT FK NULL | | | plan_id | BIGINT FK plans | | | plan_price_id | BIGINT FK plan_prices NULL | Null for Free | | status_id | BIGINT FK lookups | `subscription_status`: trial, active, grace, downgraded, cancelling, ended | | current_period_start, current_period_end | TIMESTAMPTZ | | | trial_ends_at | TIMESTAMPTZ | | | grace_started_at | TIMESTAMPTZ | 7 days ([BRL-14](/en/docs/brd/requirements#7-business-rules)) | | scheduled_plan_id | BIGINT FK plans NULL | Downgrade at period end | | cancel_at_period_end | BOOLEAN | | | gateway_subscription_ref | VARCHAR(120) | | **subscription_charges** (Base +): `subscription_id FK`, `period_start`, `period_end`, `amount_minor`, `proration_minor`, `currency_code`, `status_id FK lookups (charge_status: due, paid, failed, void)`, `attempt_no SMALLINT` (retries days 1, 3, 5, 7, D-09), `next_retry_at`. **plan_overrides** (Base +) D-227: `subscription_id FK`, `override_plan_id FK plans`, `reason TEXT`, `starts_at`, `ends_at` (required), `requested_by FK users`, `approved_by FK users` (second admin, must differ), `reverted_at`. **usage_counters** (Base +): `subscription_id FK`, `limit_key VARCHAR(60)`, `period_start DATE`, `used INT`. Unique `(subscription_id, limit_key, period_start)`. Reset at 00:00 on the 1st in the owner's time zone (D-218). # Platform (/en/docs/erd/domains/platform) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. **notifications** (Base +) [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) to [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery): `user_id FK`, `category_id FK lookups (notification_category)`, `template_id FK notification_templates`, `event_key VARCHAR(120)` (unique with `user_id` to stop duplicates), `payload JSONB`, `is_urgent BOOLEAN`, `scheduled_for TIMESTAMPTZ` (quiet hours), `read_at`. **notification_deliveries** (Base +): `notification_id FK`, `channel_id FK lookups (notification_channel)`, `provider_message_id VARCHAR(120)`, `status_id FK lookups (delivery_status: queued, sent, delivered, failed, dropped)`, `attempt SMALLINT`, `next_attempt_at`, `error TEXT`. **notification_templates** (Base +) [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates): `category_id FK lookups`, `channel_id FK lookups`, `locale VARCHAR(5)`, `version INT`, `subject TEXT`, `body TEXT`, `is_active BOOLEAN`. Unique `(category_id, channel_id, locale, version)`. **feature_flags** (Base +): `key VARCHAR(80)` unique, `description TEXT`, `is_enabled BOOLEAN`, `rules JSONB` (market, plan, organization, percentage). **analytics_events** (insert only, partitioned by month) [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl): `id`, `occurred_at`, `organization_id NULL`, `trip_id NULL`, `user_id NULL`, `anon_id UUID`, `event_name VARCHAR(60)` (page_view, trip_view, add_to_cart, checkout_start, booking_confirmed, album_view), `page_path TEXT`, `referrer TEXT`, `market_id`, `device_platform_id FK lookups`. Child data is excluded ([FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions)). **analytics_daily** (Base +): `day DATE`, `organization_id NULL`, `trip_id NULL`, `provider_user_id NULL`, `metric_key VARCHAR(60)`, `value NUMERIC(18,2)`. Unique `(day, organization_id, trip_id, provider_user_id, metric_key)`. **audit_logs** (immutable, append-only store with object lock, 7 years) [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log): `id`, `uuid`, `actor_user_id`, `actor_role_id`, `organization_id NULL`, `action VARCHAR(80)`, `target_type VARCHAR(60)`, `target_id BIGINT`, `before JSONB`, `after JSONB`, `reason TEXT`, `request_id UUID`, `ip INET`, `occurred_at`, `created_at`. **outbox_events** (immutable): `id`, `uuid`, `aggregate_type`, `aggregate_id`, `event_type VARCHAR(80)`, `payload JSONB`, `occurred_at`, `published_at` (set by the relay; the only column ever updated). **idempotency_keys**: `key VARCHAR(120)`, `user_id`, `request_hash CHAR(64)`, `response JSONB`, `status_code SMALLINT`, `expires_at` (24 h). Primary key `(user_id, key)`. # Suppliers (/en/docs/erd/domains/suppliers) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o| DRIVER_PROFILES : is USERS ||--o| PHOTOGRAPHER_PROFILES : is DRIVER_PROFILES ||--o{ PROVIDER_VEHICLES : owns DRIVER_PROFILES ||--o{ LAB_TESTS : takes LAB_PARTNERS ||--o{ LAB_TESTS : performs PHOTOGRAPHER_PROFILES ||--o{ PORTFOLIO_ITEMS : shows USERS ||--o{ AVAILABILITY_SLOTS : marks USERS ||--o{ PAYOUT_METHODS : receives_via ORGANIZATIONS ||--o{ DRIVER_PROFILES : owns_org_driver ``` ## driver_profiles [#driver_profiles] *(Base +)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users | Unique per track | | track_id | BIGINT FK lookups | `supplier_track`: platform, organization | | organization_id | BIGINT FK organizations NULL | Set for organization-owned drivers ([BRL-05](/en/docs/brd/requirements#7-business-rules)) | | license_no_enc | BYTEA | enc | | license_valid_until | DATE | | | service_regions | TEXT[] | | | subscription_id | BIGINT FK subscriptions NULL | Platform drivers only | | lab_status_id | BIGINT FK lookups | `driver_lab_status`: clear, paused, suspended | | suspended_since | TIMESTAMPTZ | Close after 30 days ([BRL-16](/en/docs/brd/requirements#7-business-rules)) | | visibility_id | BIGINT FK lookups | `profile_visibility`: standard, featured, top | | verified_badge | BOOLEAN | Plan-driven | **photographer_profiles** (Base +): `user_id FK`, `track_id FK lookups (supplier_track)`, `organization_id NULL`, `bio JSONB`, `equipment TEXT`, `service_regions TEXT[]`, `rates JSONB` (per currency), `subscription_id FK NULL`, `visibility_id FK lookups`, `verified_badge BOOLEAN`, `watermark_settings JSONB`. **provider_vehicles** (Base +) [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details): `driver_profile_id FK`, `plate_no VARCHAR(20)`, `model VARCHAR(80)`, `year SMALLINT`, `seat_count SMALLINT`, `registration_valid_until DATE`, `insurance_valid_until DATE` (at least 3 months at submission). **availability_slots** (Base +) D-89: `user_id FK`, `starts_on DATE`, `ends_on DATE`, `kind_id FK lookups (availability_kind: available, unavailable)`. Dates and ranges only. **portfolio_items** (Base +): `photographer_profile_id FK`, `storage_path TEXT`, `width INT`, `height INT`, `sort_by INT`. Count per plan ([FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio)); minimum 8 at application. **lab_partners** (Base +): `market_id FK`, `name JSONB`, `address JSONB`, `api_settings_enc BYTEA`, `is_active BOOLEAN`. ## lab_tests [#lab_tests] *(Base +) [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension)* | Column | Type | Notes | |---|---|---| | driver_profile_id | BIGINT FK driver_profiles | | | lab_partner_id | BIGINT FK lab_partners NULL | | | test_type_id | BIGINT FK lookups | `lab_test_type`: drug_screen, medical_fitness, both | | status_id | BIGINT FK lookups | `lab_test_status`: requested, pending, result_uploaded, passed, failed, missed | | requested_by | BIGINT FK users | Admin | | requested_at | TIMESTAMPTZ | | | deadline_at | TIMESTAMPTZ | 3 days default, 1 to 7 (D-21) | | booked_slot_at | TIMESTAMPTZ | | | result_path | TEXT | Restricted bucket | | result_source_id | BIGINT FK lookups | `lab_result_source`: partner, driver_upload | | decided_by, decided_at | BIGINT, TIMESTAMPTZ | Admin decision | | is_initial | BOOLEAN | Application lab result | **payout_methods** (Base +): `user_id FK`, `organization_id NULL`, `method_id FK lookups (payout_method: stripe_connect, bank_transfer, local_provider)`, `details_enc BYTEA`, `external_account_id VARCHAR(100)`, `currency_code`, `is_default BOOLEAN`, `verified_at`. # Data Model (/en/docs/erd) # Trips Enjoy: Entity-Relationship Design (ERD) [#trips-enjoy-entity-relationship-design-erd] These apply to every table unless the table says otherwise. | Rule | Detail | |---|---| | Primary key | `id BIGSERIAL` (internal only, never exposed). | | Public identifier | `uuid UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE`. APIs, URLs, webhooks and exports use `uuid` only. | | Timestamps | `created_at`, `updated_at`, `deleted_at` as `TIMESTAMPTZ`. All times are stored in UTC. | | Soft delete | `is_deleted BOOLEAN NOT NULL DEFAULT false` plus `deleted_at`. Unique constraints include `deleted_at` (for example `UNIQUE (code, deleted_at)`). | | Audit columns | `created_by`, `updated_by`, `deleted_by` as `BIGINT` FKs to `users.id`. | | No enum types | Every status, type and category is a `BIGINT` FK to `lookups.id` (named `*_id`, for example `status_id`). The lookup type is named in the column notes. | | Tenant column | Every row owned by an organization carries `organization_id BIGINT NOT NULL`, indexed, with an RLS policy on `app.current_organization_id` (SRS [DAT-01](/en/docs/srs/data#62-data-isolation), [NFR-SEC-07](/en/docs/srs/quality#82-security-nfr-sec)). Child tables repeat `organization_id` (denormalized) so RLS never needs a join. | | Money | `*_minor BIGINT` in minor units plus `currency_code CHAR(3)` FK `currencies.code`. Never a float, never a bare number (D-157). | | Translatable text | `JSONB` shaped `{"en": "...", "ar": "..."}` for names and descriptions shown to users. | | Country | `country_code CHAR(2)` FK `countries.code` (ISO 3166-1 alpha-2). | | Immutable tables | `ledger_entries`, `ledger_transactions`, `audit_logs`, `deal_offers`, `checkin_events`, `tracking_points`, `consents`, `outbox_events`: insert only. They keep `created_at` and `created_by` but have no `updated_*`, `deleted_*` or `is_deleted`. Corrections are new reversing rows (SRS [DAT-08](/en/docs/srs/data#63-soft-delete-immutability-and-deletion)). | | Time-series | `checkin_events` and `tracking_points` are TimescaleDB hypertables partitioned on `occurred_at`; primary key `(id, occurred_at)`. | | Encrypted columns | Columns marked "enc" are encrypted at column level with KMS (SRS [DAT-05](/en/docs/srs/data#62-data-isolation)). A `*_hash` column next to them supports lookups. | Base columns are not repeated in the tables below. "Base" means: `id`, `uuid`, `created_at`, `updated_at`, `deleted_at`, `is_deleted`, `created_by`, `updated_by`, `deleted_by`. | Domain | Tables | Section | |---|---|---| | Lookups and markets | lookup_types, lookups, countries, currencies, markets, market_payment_methods, tax_rates | 3.1 | | Identity and access | users, user_roles, auth_factors, otp_challenges, sessions, devices, consents, notification_preferences, privacy_requests | 3.2 | | Applications | applications, application_documents, application_decisions, appeals | 3.3 | | Organizations | organizations, organization_members, permissions, member_permissions, invitations, crm_connections, webhook_endpoints, webhook_deliveries, api_keys | 3.4 | | Suppliers | driver_profiles, photographer_profiles, provider_vehicles, availability_slots, portfolio_items, lab_partners, lab_tests, payout_methods | 3.5 | | Fleet and trips | vehicle_types, vehicle_type_seats, vehicles, trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments, programs, program_tiers | 3.6 | | Deals | deals, deal_offers | 3.7 | | Booking and payment | bookings, booking_passengers, booking_programs, trip_seats, payments, payment_attempts, refunds, booking_remedies | 3.8 | | Coupons | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | 3.9 | | Plans | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | 3.10 | | Operations | checkin_events, incidents, trip_reports, tracking_points, child_links, safety_cases | 3.11 | | Media | albums, photos, album_shared_links, album_members, download_logs | 3.12 | | Finance | ledger_accounts, ledger_transactions, ledger_entries, invoices, invoice_lines, payout_runs, payouts, settlements, settlement_lines, reconciliation_exceptions, disputes, dispute_files | 3.13 | | Platform | notifications, notification_deliveries, notification_templates, feature_flags, analytics_events, analytics_daily, audit_logs, outbox_events, idempotency_keys | 3.14 | ## Domains [#domains] # Lookup Catalog & Access Paths (/en/docs/erd/reference) ## 4. Lookup type catalog [#4-lookup-type-catalog] Seeded with `is_system = true`. Admin can add values only to types marked "extensible". | Lookup type | Values | Extensible | |---|---|---| | account_status | active, suspended, deletion_requested, closed | No | | role | traveler, organization_owner, organization_employee, platform_driver, platform_photographer, org_driver, org_photographer, moderator, admin_super, admin_operations, admin_finance | No | | application_type / application_status | See 3.3 | No | | decision_reason, suspension_reason | D-234 list | Yes | | trip_status, booking_status, seat_status, deal_status, subscription_status, coupon_status, lab_test_status | See SRS section 7 | No | | pricing_model | free, per_person, by_quantity, per_group, tiered | No | | payment_method, gateway | See 3.1 | Yes | | incident_category | safety, medical, vehicle_fault, lost_traveler, conduct, other (D-331) | No | | dispute_type | booking, payment, refund, supplier_conduct, organization_conduct, other (D-254) | No | | notification_category | account, booking, payment, trip_reminder, trip_day, deal, application, lab_test, plan, promotion, safety | Yes | | trip_category | school, corporate, religious, tourism, event, other | Yes | | permission_area | trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics | No | ## 5. Row-level security and access paths [#5-row-level-security-and-access-paths] | Path | Rule | |---|---| | Organization staff | `organization_id = app.current_organization_id` on every tenant table, plus permission checks in the service layer. | | Platform supplier | Reads deals, assignments, albums and earnings where `provider_user_id` or `photographer_user_id` equals the caller, through a platform-scoped repository that logs every call. | | Moderator | Reads `booking_passengers` and writes `checkin_events` only for `trip_vehicle_id` in an accepted, unexpired assignment. | | Traveler | Reads own bookings, passengers, receipts and allowed albums. Never reads `tracking_points` ([BRL-29](/en/docs/brd/requirements#7-business-rules)). | | Parent | Reads child status through `child_links` with status active; live position only when the trip is in progress and eligible ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)). | | Admin | Bypass policy role; every query logged to `audit_logs`. | ## 6. Traceability [#6-traceability] | SRS entity (section 6.1) | Tables | |---|---| | Account, Role assignment | users, user_roles, auth_factors, sessions | | Organization, Employee permission set | organizations, organization_members, member_permissions, permissions | | Application | applications, application_documents, application_decisions, appeals | | Driver profile, Photographer profile | driver_profiles, photographer_profiles, provider_vehicles, portfolio_items, availability_slots | | Vehicle type, Vehicle | vehicle_types, vehicle_type_seats, vehicles | | Trip, Trip vehicle, Program | trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments, programs, program_tiers | | Booking, Booking passenger, Seat | bookings, booking_passengers, booking_programs, trip_seats, booking_remedies | | Deal and deal offer | deals, deal_offers | | Coupon, Coupon redemption | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | | Plan, Subscription | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | | Ledger entry, Payout, Invoice | ledger_accounts, ledger_transactions, ledger_entries, payout_runs, payouts, invoices, invoice_lines | | Settlement (new in v1.1) | settlements, settlement_lines | | Album and photo | albums, photos, album_shared_links, album_members, download_logs | | Check-in event, Tracking point | checkin_events, tracking_points, incidents, trip_reports | | Child link | child_links, safety_cases | | Lab test | lab_tests, lab_partners | | Notification preference | notification_preferences, notifications, notification_deliveries, notification_templates | | Audit log entry | audit_logs | | Market (new in v1.1) | countries, currencies, markets, market_payment_methods, tax_rates | | Analytics (new in v1.1) | analytics_events, analytics_daily | | Dispute | disputes, dispute_files | # Trips Enjoy Documentation (/en/docs) Trips Enjoy is a multi-role trips marketplace: travelers book seats on organized trips, organizations publish and operate them, and drivers, photographers and moderators deliver the experience. This is the complete product documentation set. All pages exist in Arabic and English interfaces; this documentation is written in English. ## How to read the set [#how-to-read-the-set] - Requirements cite each other by stable ID: `BR-*` (business), `BRL-*` (rules), `FR-*` (functional), `D-*` (decisions), `OD-*` (open decisions) and `UF-*` (flows). - Every SRS requirement page lists its MoSCoW priority and the upstream BRD IDs it traces to. - Items marked `[OPEN]` or *(placeholder)* follow the open-decision process in the BRD. # Delivery Plan (/en/docs/plan) This is the end-to-end delivery view of the whole system: six phases from foundation to scale, every phase broken into tasks, and every task generated from — and linked to — one functional requirement. Nothing here is maintained by hand: the phase pages and milestones are produced by `bun scripts/generate-plan.ts` from the living documentation, so the plan can never drift from the requirements. ## How it fits together [#how-it-fits-together] ```mermaid flowchart LR BR["BRD requirement with a phase"] --> FR["SRS functional requirement"] FR --> T["Delivery task on the phase page"] T --> UF["User flows that exercise it"] T --> WS["System workflow behind it"] ``` - A **task** implements exactly one [functional requirement](/en/docs/srs/requirements/auth) and inherits its MoSCoW priority. Its phase comes from the requirement's business trace: FR → BR → the BRD's phase column. - *Covered by* links the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise the task — the same attribution as the [coverage page](/en/docs/workflows/coverage). - Tasks carry **no invented estimates**. Size a phase by its task count and priority mix (shown on each page and in [milestones](/en/docs/plan/milestones)); the definition of done, not a date, closes a phase. ## The phases [#the-phases] ## Reading a phase page [#reading-a-phase-page] Each phase page opens with its theme and **definition of done** (verbatim from BRD section 3.3), followed by the cross-cutting platform tasks, then one epic per module with its task table, and finally the **decisions to close** — the open decisions cited by that phase's requirements, which should be settled before the phase starts, not during it. # Milestones (/en/docs/plan/milestones) Each phase closes on its **definition of done** (BRD section 3.3) with every *Must* task verified against its acceptance criteria. Task counts come from the [generated phase pages](/en/docs/plan); re-run `bun scripts/generate-plan.ts` after requirement changes to refresh them. ## The ladder [#the-ladder] | Phase | Tasks (M/S/C) | Definition of done | Decisions to close | |---|---|---|---| | **P1** — Foundation | 41 (41M / 0S / 0C) | An organization can apply, be approved and sign in to an empty workspace. | [OD-03](/en/docs/brd/compliance#11-open-decisions), [OD-12](/en/docs/brd/compliance#11-open-decisions), [OD-21](/en/docs/brd/compliance#11-open-decisions), [OD-23](/en/docs/brd/compliance#11-open-decisions) | | **P2** — Single-vehicle pilot (Egypt) | 31 (30M / 1S / 0C) | One pilot organization sells one trip to real travelers with real payments. | [OD-07](/en/docs/brd/compliance#11-open-decisions) | | **P3** — Operational depth | 40 (37M / 3S / 0C) | A three-bus trip with about 120 passengers runs end to end. | [OD-25](/en/docs/brd/compliance#11-open-decisions) | | **P4** — Marketplace supply | 33 (32M / 1S / 0C) | Organizations book platform suppliers through deals and deliver albums with all privacy modes. | [OD-13](/en/docs/brd/compliance#11-open-decisions), [OD-24](/en/docs/brd/compliance#11-open-decisions) | | **P5** — Monetization and Gulf launch | 36 (33M / 3S / 0C) | Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once OD-10 is decided. | [OD-28](/en/docs/brd/compliance#11-open-decisions) | | **P6** — Family and scale | 26 (17M / 5S / 4C) | Parents see their children live; organizations get analytics and integrations. | — | ## Reading the ladder [#reading-the-ladder] - A phase gate needs all of its *Must* tasks green; *Should* and *Could* may trail into the next phase without blocking it. - The decisions column lists open decisions cited by that phase's requirements — close them before the phase starts, not during. - Cross-cutting platform tasks (CI, environments, integrations) sit at the top of each phase page and gate the same milestone. # P1 — Foundation (/en/docs/plan/p1) **Theme.** Foundation — accounts, organization applications and approval, tenancy **Definition of done.** An organization can apply, be approved and sign in to an empty workspace. *(BRD section 3.3)* **41 tasks** from 10 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | CI pipeline and preview environments | Platform | | Tenancy foundation: Postgres schemas, row-level security policies, base columns | Platform | | Observability baseline: logs, metrics, traces and error tracking | Platform | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-AUTH-1 — Role-specific registration paths | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) | Must | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-01](/en/docs/user-flows/shared#uf-shr-01-sign-up-chooser) | | T-P1-AUTH-2 — Country on every registration form | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | Must | — | | T-P1-AUTH-3 — Verification by one-time code | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | Must | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-02](/en/docs/user-flows/shared#uf-shr-02-one-time-code), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-AUTH-4 — Role-specific sign-in methods | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in) | | T-P1-AUTH-5 — Sign-in lockout | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-AUTH-6 — Multi-role accounts | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts) | Must | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role), [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher) | | T-P1-AUTH-7 — Staff access to several organizations | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) | Must | [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher), [UF-ORG-02](/en/docs/user-flows/organization#uf-org-02-switch-organization) | | T-P1-AUTH-8 — Suspension and reinstatement | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement) | Must | [UF-SHR-10](/en/docs/user-flows/shared#uf-shr-10-suspended-account), [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | T-P1-AUTH-9 — Sessions and tokens | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ONB-1 — Application and supplier access | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P1-ONB-2 — Single admin queue | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | Must | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application) | | T-P1-ONB-3 — Decision time target | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) | Must | [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | T-P1-ONB-4 — Changes requested | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | Must | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P1-ONB-5 — Rejection, appeal and re-application | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | Must | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [UF-ADM-03](/en/docs/user-flows/admin#uf-adm-03-decide-an-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-ONB-6 — Applicant status notifications | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | Must | [applications](/en/docs/workflows/applications#timers-and-rules) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ORG-1 — Tenant isolation | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P1-ORG-2 — Tenant setup on approval | [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) | Must | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | T-P1-ORG-3 — Organization-owned drivers and photographers | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) | Must | [UF-ORG-05](/en/docs/user-flows/organization#uf-org-05-own-drivers-and-photographers), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## EMP — Employees and permissions [#emp--employees-and-permissions] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-EMP-1 — Permission sets | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) | Must | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | T-P1-EMP-2 — Permission changes are audited | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited) | Must | [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in) | | T-P1-EMP-3 — Employee limit per plan | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan) | Must | — | | T-P1-EMP-4 — Server-side scope | [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope) | Must | — | | T-P1-EMP-5 — Employee removal | [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal) | Must | — | | T-P1-EMP-6 — Invitation and first sign-in | [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) | Must | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | ## MOD — Moderator app [#mod--moderator-app] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-MOD-1 — Moderator sign-in | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in) | Must | [UF-MOD-02](/en/docs/user-flows/moderator#uf-mod-02-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-PAR-1 — Parent notifications | [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) | Must | [UF-PAR-04](/en/docs/user-flows/parent#uf-par-04-notifications) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-DRV-1 — Driver work area | [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | Must | [UF-DRV-09](/en/docs/user-flows/driver#uf-drv-09-organization-owned-driver-home) | | T-P1-DRV-2 — Missed-deadline suspension | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) | Must | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ADM-1 — Account administration | [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | Must | [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | T-P1-ADM-2 — Admin staff | [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-ADM-3 — Configuration | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | T-P1-ADM-4 — Immutable audit log | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | Must | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | ## NTF — Notifications [#ntf--notifications] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-NTF-1 — Channels by preference | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) | Must | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications), [UF-SHR-11](/en/docs/user-flows/shared#uf-shr-11-notification-centre), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-2 — Language and layout | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-3 — Versioned templates | [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | T-P1-NTF-4 — Delivery records and retries | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-5 — No duplicate delivery | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#diagram), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | T-P1-NTF-6 — Trip reminders and change notices | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#hourly), [notifications](/en/docs/workflows/notifications#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-TRV-1 — Profile and preferences | [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | Must | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications) | | T-P1-TRV-2 — Plan changes | [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) | Must | [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) | | T-P1-TRV-3 — Supplier application keeps traveler access | [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | Must | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-03](/en/docs/brd/compliance#11-open-decisions) - [OD-12](/en/docs/brd/compliance#11-open-decisions) - [OD-21](/en/docs/brd/compliance#11-open-decisions) - [OD-23](/en/docs/brd/compliance#11-open-decisions) # P2 — Single-vehicle pilot (Egypt) (/en/docs/plan/p2) **Theme.** Single-vehicle pilot (Egypt) — trip creation, traveler booking, payment in EGP, admin basics **Definition of done.** One pilot organization sells one trip to real travelers with real payments. *(BRD section 3.3)* **31 tasks** from 8 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Egypt payment gateway integration and callback handling | Platform | | Pilot environment and seed data | Platform | | Email and SMS provider integration for transactional messages | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-ORG-1 — Fleet registration | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-TRIP-1 — Trip creation wizard | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P2-TRIP-2 — Draft, public and targeted publishing | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P2-TRIP-3 — Trip lifecycle | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle) | Must | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | T-P2-TRIP-4 — Changes that affect confirmed bookings | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) | Must | [UF-TRV-07](/en/docs/user-flows/traveler#uf-trv-07-choose-a-remedy-after-a-trip-change), [UF-ORG-10](/en/docs/user-flows/organization#uf-org-10-change-a-trip-after-bookings), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-FLT-1 — Reusable vehicle types | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types) | Must | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | T-P2-FLT-2 — Vehicle registry | [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) | Must | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | T-P2-FLT-3 — Seat map from vehicle type | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | T-P2-FLT-4 — Archiving vehicle types | [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) | Should | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | ## BKG — Booking and checkout [#bkg--booking-and-checkout] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-BKG-1 — Booking composition | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P2-BKG-2 — Checkout handoff | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff) | Must | — | | T-P2-BKG-3 — Retry without losing the cart | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-BKG-4 — Traveler cancellation and refund | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) | Must | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P2-BKG-5 — Receipts and invoices | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | T-P2-BKG-6 — Organization cancellation of a trip | [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | Must | [UF-ORG-11](/en/docs/user-flows/organization#uf-org-11-cancel-a-trip), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | T-P2-BKG-7 — Booking states | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-PAY-1 — Payment outcomes | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-2 — Idempotent callbacks | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-3 — Refund execution | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | Must | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P2-PAY-4 — Gateway reconciliation | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-PAY-5 — Payment methods per market | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P2-PAY-6 — Payment pending | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [UF-ADM-12](/en/docs/user-flows/admin#uf-adm-12-payment-escalations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-7 — Fawry cash vouchers | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-ACC-1 — Double-entry ledger | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-ACC-2 — Reconciled exports | [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | T-P2-ACC-3 — Daily reconciliation and finance digest | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) | Must | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-TRV-1 — Trip visibility and early access | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P2-TRV-2 — History and receipts by plan | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | Must | [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | ## MKT — Markets [#mkt--markets] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-MKT-1 — Market configuration | [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | T-P2-MKT-2 — Market from country | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-MKT-3 — Rounding and display | [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | Must | [money](/en/docs/workflows/money#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-07](/en/docs/brd/compliance#11-open-decisions) # P3 — Operational depth (/en/docs/plan/p3) **Theme.** Operational depth — multi-vehicle trips, programs, seat modes, moderator app, check-in **Definition of done.** A three-bus trip with about 120 passengers runs end to end. *(BRD section 3.3)* **40 tasks** from 13 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Moderator installable app build with the offline sync layer | Platform | | Multi-vehicle operational tooling and manifests | Platform | | Check-in device fleet testing (low connectivity, queue replay) | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-ORG-1 — Seat self-selection setting | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-TRIP-1 — Multi-vehicle trips | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P3-TRIP-2 — Program changes until departure | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | ## PRG — Programs [#prg--programs] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PRG-1 — Pricing models | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P3-PRG-2 — Program types | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P3-PRG-3 — Live booking summary | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P3-PRG-4 — Enrollment report | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | Must | — | | T-P3-PRG-5 — Program capacity | [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) | Must | — | | T-P3-PRG-6 — Program count limit | [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-FLT-1 — Vehicle limit per trip | [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | T-P3-FLT-2 — Vehicle removal after bookings | [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | ## STF — Staffing [#stf--staffing] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-STF-1 — Driver tracks | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P3-STF-2 — Ready gate | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) | Must | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P3-STF-3 — Moderator assignment | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-STF-4 — Reassignment deadline | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | Must | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## SEAT — Seats [#seat--seats] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-SEAT-1 — Company-assigned by default | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P3-SEAT-2 — Live seat map | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-SEAT-3 — Priority window | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | Should | — | | T-P3-SEAT-4 — Seat hold | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | T-P3-SEAT-5 — Seat states | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P3-SEAT-6 — Staff seat assignment | [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment) | Must | [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats) | | T-P3-SEAT-7 — Self-selection by plan | [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PAY-1 — Refunds outside policy | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy) | Must | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund), [refunds](/en/docs/workflows/refunds#timers-and-rules) | ## CHK — Check-in and check-out [#chk--check-in-and-check-out] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-CHK-1 — Check-in at boarding | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) | Must | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | T-P3-CHK-2 — Vehicle match | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) | Must | — | | T-P3-CHK-3 — Event record | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record) | Must | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#diagram), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-CHK-4 — Check-out at stops | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops) | Must | [UF-MOD-05](/en/docs/user-flows/moderator#uf-mod-05-check-out-at-a-stop-or-destination), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-CHK-5 — Offline queue | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) | Must | [UF-MOD-06](/en/docs/user-flows/moderator#uf-mod-06-offline-queue), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P3-CHK-6 — Incident reporting | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) | Should | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-07](/en/docs/user-flows/moderator#uf-mod-07-report-an-incident) | | T-P3-CHK-7 — Occupancy | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## MOD — Moderator app [#mod--moderator-app] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-MOD-1 — Vehicle-scoped access | [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access) | Must | [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest) | | T-P3-MOD-2 — End-of-trip report | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report) | Must | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-MOD-3 — Access revocation | [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | Must | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P3-MOD-4 — Installable app | [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) | Must | [UF-MOD-01](/en/docs/user-flows/moderator#uf-mod-01-install-and-first-open) | | T-P3-MOD-5 — Report lock | [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PAR-1 — Child-safety reporting | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) | Must | [UF-ORG-19](/en/docs/user-flows/organization#uf-org-19-child-safety-reports), [UF-PAR-05](/en/docs/user-flows/parent#uf-par-05-report-a-child-safety-concern) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-ADM-1 — Dispute outcomes and refunds | [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | Must | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund) | | T-P3-ADM-2 — Dispute handling | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) | Must | [UF-TRV-14](/en/docs/user-flows/traveler#uf-trv-14-open-a-dispute), [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## NTF — Notifications [#ntf--notifications] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-NTF-1 — Quiet hours | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | Should | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-TRV-1 — Program discounts | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-25](/en/docs/brd/compliance#11-open-decisions) # P4 — Marketplace supply (/en/docs/plan/p4) **Theme.** Marketplace supply — platform drivers and photographers, lab tests, negotiation, media **Definition of done.** Organizations book platform suppliers through deals and deliver albums with all privacy modes. *(BRD section 3.3)* **33 tasks** from 8 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Media processing pipeline: variants, EXIF stripping, watermarking | Platform | | Stripe Connect Express onboarding for suppliers | Platform | | Lab-test document handling and expiry tracking | Platform | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ONB-1 — Photographer portfolio minimum | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum) | Must | [UF-PHO-01](/en/docs/user-flows/photographer#uf-pho-01-register-and-apply) | | T-P4-ONB-2 — Driver vehicle and insurance details | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P4-ONB-3 — Lab consent and initial result | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | ## STF — Staffing [#stf--staffing] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-STF-1 — Photographer tracks | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) | Must | [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | T-P4-STF-2 — Assignment after finalized deal | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P4-STF-3 — Deal request visibility | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-NEG-1 — Deal proposal | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | T-P4-NEG-2 — Counter-offers and expiry | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P4-NEG-3 — Mutual acceptance | [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) | Must | — | | T-P4-NEG-4 — Rejection | [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | T-P4-NEG-5 — Finalization | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-NEG-6 — Negotiation by plan | [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan) | Must | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | ## MED — Media and albums [#med--media-and-albums] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-MED-1 — Album creation window | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) | Must | [UF-PHO-04](/en/docs/user-flows/photographer#uf-pho-04-assigned-trip-brief), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | | T-P4-MED-2 — Resumable batch upload | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload) | Must | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [media](/en/docs/workflows/media#diagram), [media](/en/docs/workflows/media#timers-and-rules) | | T-P4-MED-3 — Privacy modes by plan | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing) | | T-P4-MED-4 — Shared links | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) | Must | [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | T-P4-MED-5 — Selected-user access | [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | T-P4-MED-6 — Watermarking | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) | Should | [UF-PHO-07](/en/docs/user-flows/photographer#uf-pho-07-watermark), [media](/en/docs/workflows/media#timers-and-rules) | | T-P4-MED-7 — Traveler access and download | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | T-P4-MED-8 — Albums per trip by plan | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | Must | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [media](/en/docs/workflows/media#timers-and-rules) | ## PHO — Photographer studio [#pho--photographer-studio] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-PHO-1 — Portfolio | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) | Must | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | T-P4-PHO-2 — Rates and availability | [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability) | Must | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | T-P4-PHO-3 — Earnings | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | Must | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-DRV-1 — Deal responses | [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | T-P4-DRV-2 — Lab-test pause | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) | Must | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-DRV-10](/en/docs/user-flows/driver#uf-drv-10-support), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | T-P4-DRV-3 — Lab deadline and result | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P4-DRV-4 — Admin validation | [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation) | Must | — | | T-P4-DRV-5 — Earnings and payouts | [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts) | Must | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts) | | T-P4-DRV-6 — Driver availability | [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) | Must | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ADM-1 — Lab-test requests | [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) | Must | [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ACC-1 — Supplier earnings and payouts | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) | Must | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#weekly), [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-ACC-2 — Settlements | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-ACC-3 — Archive after settlement | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-13](/en/docs/brd/compliance#11-open-decisions) - [OD-24](/en/docs/brd/compliance#11-open-decisions) # P5 — Monetization and Gulf launch (/en/docs/plan/p5) **Theme.** Monetization and Gulf launch — plans for all roles, feature gates, coupons, full accounting, invoices; Saudi Arabia (SAR) and UAE (AED) **Definition of done.** Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once OD-10 is decided. *(BRD section 3.3)* **36 tasks** from 12 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Plan service and server-side feature gates | Platform | | Invoice numbering service with retries and finance review | Platform | | Gulf market configuration (SAR, AED) once OD-10 is decided | Platform | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-AUTH-1 — Account deletion with a 30-day grace period | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) | Must | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ORG-1 — B2B and B2C invoices | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) | Must | [UF-ORG-14](/en/docs/user-flows/organization#uf-org-14-invoices), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [money](/en/docs/workflows/money#timers-and-rules) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-TRIP-1 — Active trip limit | [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-NEG-1 — Deal audit | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit) | Must | [UF-ADM-09](/en/docs/user-flows/admin#uf-adm-09-deal-audit) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-PAY-1 — Subscription charges and dunning | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning) | Must | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## CPN — Coupons [#cpn--coupons] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-CPN-1 — Creator scope | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) | Must | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | | T-P5-CPN-2 — Cross-entity rejection | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) | Must | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | T-P5-CPN-3 — Real-time validation | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation) | Must | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | T-P5-CPN-4 — Coupon types | [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | T-P5-CPN-5 — Lifecycle and controls | [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | T-P5-CPN-6 — Redemption and reversal | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P5-CPN-7 — Analytics and abuse flags | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags) | Must | [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons), [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P5-CPN-8 — Coupon count by plan | [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan) | Must | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | ## SUB — Plans and subscriptions [#sub--plans-and-subscriptions] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-SUB-1 — Plan catalog | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) | Must | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides) | | T-P5-SUB-2 — Feature gates | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) | Must | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing) | | T-P5-SUB-3 — Grace period | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | Must | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-4 — Upgrade, downgrade and cancellation | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) | Must | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan), [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing) | | T-P5-SUB-5 — Admin overrides | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) | Must | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | T-P5-SUB-6 — Revenue reporting | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P5-SUB-7 — Trials | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | Must | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-8 — Dunning | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) | Must | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing) | | T-P5-SUB-9 — Limits after a downgrade | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade) | Must | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-10 — Counter reset | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) | Must | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#monthly), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | T-P5-SUB-11 — Plan service failure | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure) | Must | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## PHO — Photographer studio [#pho--photographer-studio] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-PHO-1 — Active bookings by plan | [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan) | Must | — | | T-P5-PHO-2 — Photographer coupons | [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) | Must | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | T-P5-PHO-3 — Visibility and badge | [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge) | Should | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ADM-1 — Platform-wide coupons | [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) | Must | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | T-P5-ADM-2 — Abuse flags | [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | Should | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ACC-1 — Organization accounting per trip | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | T-P5-ACC-2 — Platform financial view | [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) | Must | — | | T-P5-ACC-3 — Exports by plan | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [money](/en/docs/workflows/money#timers-and-rules) | | T-P5-ACC-4 — Invoices across all parties | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | Must | [money](/en/docs/workflows/money#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-TRV-1 — Data copy and deletion | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | Must | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## MKT — Markets [#mkt--markets] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-MKT-1 — Cross-market browsing | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor) | | T-P5-MKT-2 — Market switch | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) | Should | [money](/en/docs/workflows/money#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-28](/en/docs/brd/compliance#11-open-decisions) # P6 — Family and scale (/en/docs/plan/p6) **Theme.** Family and scale — live tracking, parent tracker, analytics, public API **Definition of done.** Parents see their children live; organizations get analytics and integrations. *(BRD section 3.3)* **26 tasks** from 5 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | WebSocket channel with SSE fallback for live data | Platform | | Public API gateway: keys, rate limits, OpenAPI publication | Platform | | Analytics warehouse and export pipeline | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-ORG-1 — CRM and webhooks | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Should | [UF-ORG-17](/en/docs/user-flows/organization#uf-org-17-crm-and-webhooks), [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P6-ORG-2 — Custom branding | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) | Could | [UF-ORG-20](/en/docs/user-flows/organization#uf-org-20-branding-enterprise) | ## TRK — Live tracking [#trk--live-tracking] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-TRK-1 — Live vehicle location | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P6-TRK-2 — Location collection | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection) | Must | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P6-TRK-3 — Passenger vehicle view | [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations) | | T-P6-TRK-4 — Per-trip child tracking switch | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | Must | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | T-P6-TRK-5 — Tracking data scope | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-TRK-6 — End of tracking | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) | Must | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-TRK-7 — No live position for travelers | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) | Must | [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-PAR-1 — Linking a child | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) | Must | [UF-PAR-01](/en/docs/user-flows/parent#uf-par-01-link-a-child) | | T-P6-PAR-2 — Parent view scope | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope) | Must | [UF-PAR-02](/en/docs/user-flows/parent#uf-par-02-child-trip-status) | | T-P6-PAR-3 — Eligibility | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) | Must | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | T-P6-PAR-4 — Child-data restrictions | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-PAR-5 — Link ends with the booking | [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | Must | [UF-PAR-06](/en/docs/user-flows/parent#uf-par-06-link-ends) | ## ANL — Analytics [#anl--analytics] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-ANL-1 — Organization analytics | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) | Must | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics) | | T-P6-ANL-2 — Supplier analytics | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) | Should | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-3 — Admin analytics | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) | Must | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-4 — Ranges, freshness and export | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) | Should | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics), [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-5 — Privacy in analytics | [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | Must | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | ## API — Public API [#api--public-api] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-API-1 — Public API | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) | Could | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | T-P6-API-2 — API key lifecycle | [FR-API-02](/en/docs/srs/requirements/api#fr-api-02--api-key-lifecycle) | Could | — | | T-P6-API-3 — Read resource endpoints | [FR-API-03](/en/docs/srs/requirements/api#fr-api-03--read-resource-endpoints) | Could | — | | T-P6-API-4 — API conventions | [FR-API-04](/en/docs/srs/requirements/api#fr-api-04--api-conventions) | Must | — | | T-P6-API-5 — OpenAPI publication | [FR-API-05](/en/docs/srs/requirements/api#fr-api-05--openapi-publication) | Should | — | | T-P6-API-6 — Rate limiting behavior | [FR-API-06](/en/docs/srs/requirements/api#fr-api-06--rate-limiting-behavior) | Should | — | | T-P6-API-7 — Webhook contract parity | [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity) | Must | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | # Test Strategy (/en/docs/plan/testing) The specification already contains the test plan; it just needs reading the right way. Every functional requirement carries Given/when/then acceptance criteria, every user flow is an end-to-end script, every workflow is a timer to control, and every NFR row is a service-level target. ## The pyramid [#the-pyramid] | Level | Source in the docs | Shape | |---|---|---| | Unit | FR shall-statements | Domain logic per requirement; the acceptance bullets name the cases | | API / integration | FR acceptance bullets | One test per Given/when/then bullet, against the real endpoint or state machine | | End-to-end | [User flows](/en/docs/user-flows) | One E2E scenario per UF: the steps are the script, the edge cases are the variants | | Workflow / timer | [System workflows](/en/docs/workflows) | Time-travel tests: advance the clock past each timer (hold expiry, dunning days 1-3-5-7, quiet hours) and assert the transition | | Performance | [NFR targets](/en/docs/srs/quality) | Load tests against the stated p50/p95/p99; retention jobs against the retention table | ## Rules of thumb [#rules-of-thumb] - **A requirement is done when its bullets pass.** The [coverage page](/en/docs/workflows/coverage) tells you which flows and workflows exercise each FR — if an FR has no covering flow, its test lives at the API level only. - **Test state machines, not screens.** The [state machines](/en/docs/srs/state-machines) are the contract; UI tests should only verify that the traveler sees the label the spec names ("Seats held, time left mm:ss"). - **Timers are deterministic.** Every timer has a verbatim window on its workflow page; never sleep in tests — advance the scheduler. - **Phase gates.** A phase closes when its [definition of done](/en/docs/plan/milestones) passes as one E2E run with all *Must* tasks' acceptance criteria green. ## Traceability of tests [#traceability-of-tests] Test names cite the IDs they verify (`FR-SEAT-04`, `UF-TRV-03`, `WS timer BRL-08`). Because every ID in this documentation set is linked, a failing test report becomes a clickable path from failure to requirement to business rule. # Data Requirements (/en/docs/srs/data) ### 6.1 Core entities [#61-core-entities] [ERD](/en/docs/erd) holds the tables, columns, keys, lookup types and RLS paths. This table states each entity's purpose, owner scope and retention. Scope means who owns the rows: tenant (one organization), platform, account (one person) or supplier. | Entity | Purpose | Scope | ERD tables | Retention | |---|---|---|---|---| | Account and roles | Login identity and held roles | Account | users, user_roles, auth_factors, sessions, devices | Until deletion, then section 6.4 | | Market | Country configuration | Platform | markets, market_payment_methods, tax_rates | Life of platform | | Organization | Tenant root and settings | Tenant | organizations | Life of tenant, then financial retention | | Member and permissions | Staff access per organization | Tenant | organization_members, member_permissions, invitations | Kept with audit log | | Application | Organization and supplier applications | Platform | applications, application_documents, application_decisions, appeals | [OPEN: rejected applications and documents] | | Supplier profiles | Driver and photographer details | Platform, or tenant for organization-owned | driver_profiles, photographer_profiles, provider_vehicles, portfolio_items, availability_slots | Life of account | | Lab test | Driver lab-test record | Platform | lab_tests, lab_partners | Per market legal review | | Vehicle type and vehicle | Seat layouts and fleet | Tenant | vehicle_types, vehicle_type_seats, vehicles | Life of tenant | | Trip | One organized trip with stops, audience, vehicles and staff | Tenant | trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments | 5 years after account deletion | | Program | Activities and tiers | Tenant | programs, program_tiers | As trip | | Booking | Reservation, passengers, programs, seats, remedies | Tenant and traveler | bookings, booking_passengers, booking_programs, trip_seats, booking_remedies | 7 years (financial) | | Deal | Negotiation and offers | Tenant and supplier | deals, deal_offers | 7 years (financial) | | Payment and refund | Gateway payments, attempts, refunds | Tenant or account | payments, payment_attempts, refunds | 7 years | | Coupon | Codes, scope, redemptions, flags | Creator scope | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | Redemptions 7 years | | Plan and subscription | Catalog, prices, subscriptions, charges, overrides, counters | Platform and owner | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | Charges 7 years | | Check-in and tracking | Boarding events, positions, incidents, reports | Tenant | checkin_events, tracking_points, incidents, trip_reports | Check-in 1 year; GPS 90 days | | Child link and safety case | Parent links and safety cases | Parent and tenant | child_links, safety_cases | Child trip history 1 year | | Album and photo | Trip media and access | Photographer and trip | albums, photos, album_shared_links, album_members, download_logs | Albums until deleted; download logs 1 year | | Ledger | Double-entry record | Platform and tenant | ledger_accounts, ledger_transactions, ledger_entries | 7 years | | Invoice | B2C, B2B and credit notes for all parties | Issuer | invoices, invoice_lines | 7 years | | Payout and settlement | Weekly runs and per-trip settlements | Supplier, tenant | payout_runs, payouts, payout_methods, settlements, settlement_lines | 7 years | | Reconciliation | Gateway differences | Platform | reconciliation_exceptions | 7 years | | Dispute | Disputes and files | Platform | disputes, dispute_files | 7 years | | Notification | Preferences, messages, deliveries, templates | Account and platform | notification_preferences, notifications, notification_deliveries, notification_templates | Delivery logs [OPEN] | | Analytics | Events and daily rollups | Tenant and platform | analytics_events, analytics_daily | Events 13 months (proposed); rollups life of tenant | | Consent and privacy | Consents and data requests | Account | consents, privacy_requests | Life of account plus 7 years (proposed) | | Audit | Admin actions and permission changes | Platform | audit_logs | 7 years | ### 6.2 Data isolation [#62-data-isolation] | ID | Requirement | Priority | |---|---|---| | [DAT-01](/en/docs/srs/data#62-data-isolation) | Every tenant row carries `organization_id`. Reads and writes are limited to the tenant at the database (RLS), repository and API layers. | Must | | [DAT-02](/en/docs/srs/data#62-data-isolation) | No user-facing query joins across tenants. Platform-wide reads run under the admin or platform repository and are logged. | Must | | [DAT-03](/en/docs/srs/data#62-data-isolation) | When deletion becomes permanent, personal fields are removed or replaced with "Deleted user", except records kept under section 6.4. Trip records stay 5 years. Future bookings are cancelled and refunded; remaining earnings are paid on the next payout date. | Must | | [DAT-04](/en/docs/srs/data#62-data-isolation) | Identity documents and lab results are in a restricted bucket visible only to admins; every open is audited. | Must | | [DAT-05](/en/docs/srs/data#62-data-isolation) | Phone numbers, ID and license numbers, and payout details are encrypted at column level. | Must | | [DAT-06](/en/docs/srs/data#62-data-isolation) | Money is stored as minor units plus currency code; rounding follows [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display). | Must | | [DAT-10](/en/docs/srs/data#62-data-isolation) | Every API and file path uses the public UUID; internal numeric IDs never leave the backend. | Must | ### 6.3 Soft delete, immutability and deletion [#63-soft-delete-immutability-and-deletion] | ID | Requirement | Priority | |---|---|---| | [DAT-07](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | Suspended accounts, cancelled bookings and withdrawn applications are soft-deleted or kept, hidden from user views and visible to admins. | Must | | [DAT-08](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | Ledger, audit, deal offer, check-in, tracking, consent and outbox rows are insert-only. Corrections are reversing rows. | Must | | [DAT-09](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | A deleted account keeps its trip and financial records for the periods in 6.4, with personal fields removed where the law allows. | Must | ### 6.4 Retention [#64-retention] | Data | Retention | Basis | |---|---|---| | Account during deletion grace | 30 days; sign-in restores | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Account personal data after deletion | Removed, except records below | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Trip records | 5 years after account deletion | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Bookings, payments, invoices, ledger, payouts, deals | 7 years | [OD-04](/en/docs/brd/compliance#11-open-decisions) (pending legal review) | | Audit log | 7 years, object-locked | D-04, BRD 8.5 | | Check-in and check-out events | 1 year | D-45 | | Raw GPS points | 90 days, then an hourly summary is kept | Architecture 18.4 | | Child trip history | 1 year | D-135 | | Album download logs | 1 year | D-271 | | Verification codes | 5 minutes | [BRL-20](/en/docs/brd/requirements#7-business-rules) | | Idempotency keys | 24 hours | [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | | Identity documents and lab results | [OPEN: per market legal review] | BRD 8.2 | | Notification delivery logs | [OPEN] | Not set | | Application logs | 7 years in archive storage | Architecture 22.1 | | Database backups | Daily snapshots 35 days; point-in-time 7 days; cross-region copies 30 days | Architecture 22.1 | # Software Requirements (/en/docs/srs) ## 1. Document control [#1-document-control] **Product** Trips Enjoy (trips-enjoy.com) **Document type** Software Requirements Specification **Version** 1.1 **Date** 9 November 2026 **Status** For review. Items marked [OPEN] need a decision before the affected behavior ships. Items marked (placeholder) carry a working value that the named owner must confirm. **Owner** Product and Engineering (Trips Enjoy) **Approvers** [OPEN: named approvers, D-314] **Companion documents** [BRD](/en/docs/brd) v1.1 (source of every BR, BRL, OD and RSK ID), [ERD](/en/docs/erd) v1.0 (data model), user-flows/ 00 to 08 (per-app flows), Tasks.md (delivery backlog), trips-enjoy-technical-architecture.md (architecture, 18 Apr 2026). **Source status for this version** Read in full: BRD v1.1, technical architecture (18 Apr 2026), system workflows (18 Apr 2026), auth and account rules (4 Oct 2026), design value audit and screen coverage audit (17 Oct 2026, which quote the decision register D-numbers). Where the October documents and the April documents conflict, the October documents win. ### 1.1 Changes from v1.0 [#11-changes-from-v10] | Area | Change | |---|---| | Sources | Architecture, workflows and auth rules now reviewed. Conflict C-06 (architecture not reviewed) and C-07 (user-flows 03 to 08 missing) are closed. | | Open items closed | About 40 [OPEN] items are now set from the decision register: verification by role, appeal window, deal expiry, refund table (placeholder), retry after hold expiry, payment attempts, active-trip definition, coupon counting, webhook policy, invoice rules, settlement rules, payout schedule, dispute SLAs, incident categories, retention periods, capacity stages, backups, observability tools, paging, deprecation notice, maintenance window, digits. | | Changed behavior | Organization-cancelled trips now refund in full (D-150, was "same policy as traveler refund"). Filling Up now starts at 80 percent of seats reserved (D-189, was "first booking"). Check-in events are kept 1 year, not 7 (D-45). Account lockout now applies to all roles (D-53). | | New modules | MKT (markets), ANL (analytics), API (public API, Could). | | New requirements | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) to [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) to [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) to [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display), [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) to [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics), [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api). | | New state machines | 7.9 Settlement, 7.10 Dispute. | | Data | Section 6 now points to [ERD](/en/docs/erd) for tables and columns; entity list extended with Market, Settlement, Dispute and Analytics. | ## 2. Introduction [#2-introduction] ### 2.1 Purpose [#21-purpose] This SRS states what the Trips Enjoy software shall do and the qualities it shall have. It is the basis for design, build, test and acceptance. Every functional requirement traces to a business requirement (BR), business rule (BRL) or open decision (OD) in the BRD. Section 10 holds the traceability matrix. The BRD states what the business needs. This SRS states how the software must behave to meet those needs. It does not restate business policy except where the software must enforce it. ### 2.2 Scope [#22-scope] Trips Enjoy is a bilingual (Arabic and English) multi-tenant SaaS marketplace for organized group trips. This SRS covers the software for: - Accounts, identity, sign-in and role-specific registration. - Applications and approvals for organizations, platform drivers and platform photographers. - Organization workspaces: trips, programs, fleet, staff, employees and permissions, coupons, subscriptions, accounting, invoices, analytics, CRM and webhooks. - Traveler booking, seat selection, checkout, payment, refunds, receipts and invoices. - Deal negotiation between organizations and platform suppliers. - Vehicle moderator check-in and check-out, live tracking, and the parent tracker. - Photo albums with three privacy modes. - Driver lab-test workflow. - Notifications, the platform admin console, the ledger, payouts and settlements. - Market configuration by country. This SRS does not cover business policy beyond what the software enforces (BRD), per-market legal reviews, marketing site content, visual design, or the detailed API specification (OpenAPI, generated from code). ### 2.3 Definitions and acronyms [#23-definitions-and-acronyms] | Term | Meaning | |---|---| | Admin console | The platform staff web application at admin.trips-enjoy.com. | | Applicant | A user who has submitted an application to become an organization, platform driver or platform photographer. | | BR, BRL, OD, RSK | Business requirement, business rule, open decision and risk IDs in the BRD. | | Child link | A record that connects a parent or guardian to a child traveler on one booking. | | D-nn | A decision in the decision register, as quoted in the design value audit (17 Oct 2026). | | Deal | A negotiated agreement between an organization and a platform driver or photographer for one vehicle or trip. | | Dunning | Payment retries and reminders after a failed subscription payment. | | Feature gate | A server-side check that blocks an action when the account's plan does not allow it. | | FR | Functional requirement. | | Grace period | The 7 days after a failed renewal during which features stay active. | | Hold | A temporary reservation of a seat during checkout: 15 minutes, or the voucher window for Fawry cash. | | Ledger | The double-entry record of every financial event. | | Market | The country configuration that sets currency, payment methods, tax rules and default time zone. | | Moderator | A person supervising one vehicle on one trip. Sees only that vehicle. | | MoSCoW | Priority scale: Must, Should, Could. Maps to BRD M, S and C. | | NFR | Non-functional requirement. | | Organization | A travel company, school, employer or event organizer that runs trips. Each organization is a tenant. | | Organization-owned driver or photographer | A driver or photographer belonging to one organization and visible only to it. | | Parent tracker | The section of the traveler app where parents see their linked children's trip status. | | Platform driver or photographer | An independent, admin-approved supplier who serves any organization through a deal. | | Plan | A subscription tier with limits and features, for one role, priced per market. | | Settlement | The per-trip record of amounts owed between the platform, the organization and its suppliers, tracked until every line is paid. | | Tenant | One organization's isolated workspace. | | Traveler | A person who books and attends trips. | | Trip | The single record for one organized trip, which may run many vehicles. | | Vehicle type | A reusable seat layout. | | ZATCA | Saudi Arabia's e-invoicing authority and rules. | | Acronyms | API: application programming interface. CDN: content delivery network. FCM and APNS: Firebase Cloud Messaging and Apple Push Notification service. GDPR: EU General Data Protection Regulation. GPS: global positioning system. HMAC: hash-based message authentication code. JWT: JSON Web Token. MRR: monthly recurring revenue. OTP: one-time password. PDPL: personal data protection law. PWA: progressive web app. RLS: row-level security. RPO and RTO: recovery point and recovery time objectives. SSE: server-sent events. TLS: transport layer security. WCAG: Web Content Accessibility Guidelines. | ### 2.4 References [#24-references] | Document | Version or date | Use in this SRS | |---|---|---| | [BRD](/en/docs/brd) | v1.1, 9 Nov 2026 | Primary source of BR, BRL, OD and RSK IDs, plans, markets and flows. | | [ERD](/en/docs/erd) | v1.0, 9 Nov 2026 | Tables, columns, lookup types and RLS paths for every entity in section 6. | | user-flows/ | 9 Nov 2026 | Per-app flows (UF IDs), screens and edge cases. | | Technical architecture | 18 Apr 2026 | Stack, tenancy model, real-time design, payments, media, jobs, observability, security, capacity, backups. | | System workflows | 18 Apr 2026 | State machines and sequences, where the October documents are silent. | | Auth and account rules | 4 Oct 2026 | Verification, sessions, sign-in, applications, lab tests and deletion. | | Design value audit | 17 Oct 2026 | Decision register values (D-numbers) and canvas conflicts. | ### 2.5 Document conventions [#25-document-conventions] - Requirement IDs use FR-module-NN and NFR-group-NN. IDs are stable. A retired ID is not reused. - Each functional requirement has a title, a "shall" statement, a priority, its sources, and one to three acceptance criteria written as Given, when, then. - Priorities use MoSCoW. Must means required for the BRD phase in which the module appears. Should means required in that phase if effort allows. Could means deferrable. - [OPEN] marks a value no source sets. (placeholder) marks a working value that its owner must confirm. Neither blocks the requirements around it, but the affected behavior does not ship until it is set. - Money is an amount in minor units with a currency code. Every amount shown carries its currency code. - Terms follow the BRD glossary. ## 3. Overall description [#3-overall-description] ### 3.1 Product perspective [#31-product-perspective] Trips Enjoy is one product with one codebase (a modular monolith) and shared-schema multi-tenant data with row-level security (architecture sections 1 and 4). | Part | Form | Primary users | |---|---|---| | Traveler app, including the parent tracker section | Responsive web and mobile apps (iOS, Android) | Travelers, parents and guardians | | Organization dashboard | Responsive web app at business.trips-enjoy.com | Organization owners and employees | | Admin console | Web app at admin.trips-enjoy.com, staff only | Platform admins | | Driver app | Mobile app; web limited to documents and profile (D-86) | Platform drivers and organization-owned drivers | | Photographer studio | Responsive web in phase 1, mobile app available (D-86) | Platform and organization-owned photographers | | Moderator app | Installable web app on phones, scoped to one vehicle | Vehicle moderators | | Backend services | REST API, WebSocket channel with SSE fallback, scheduled jobs, queues, notification service, payments and ledger, media pipeline, search | All surfaces and external systems | | External systems | Payment gateways, messaging, email, push, maps, lab partners, CRM and webhook targets, business registry (manual in phase 1) | See section 4.3 | ### 3.2 Product functions by module [#32-product-functions-by-module] | Code | Module | Summary | |---|---|---| | AUTH | Accounts, identity and access | Role-specific registration, verification, sign-in, sessions, multi-role accounts, organization switching, suspension and deletion. | | ONB | Applications and approvals | Submission, the single admin queue, changes requested, rejection, appeal and re-application, supplier document rules. | | ORG | Organization tenancy and settings | Tenant setup, isolation, organization-owned suppliers, fleet, seat settings, CRM and webhooks, invoices, branding. | | EMP | Employees and permissions | Invitations, permission sets, limits, scope enforcement. | | TRIP | Trips | Wizard, publishing, multi-vehicle trips, lifecycle, changes that affect bookings. | | PRG | Programs | Pricing models, program types, live summary, enrollment reports. | | FLT | Fleet and vehicle types | Seat layouts and vehicles. | | STF | Staffing | Driver and photographer tracks, Ready gate, moderator assignment. | | NEG | Deal negotiation | Proposals, counters, expiry, mutual acceptance, finalization. | | SEAT | Seats | Company-assigned and self-selected seats, live seat map, holds. | | BKG | Booking and checkout | Cart, passengers, programs, seats, coupon, checkout, cancellation, receipts. | | PAY | Payments and refunds | Gateway handoff, outcomes, pending and voucher states, retries, refunds, reconciliation. | | CPN | Coupons | Scope, validation, redemption, reversal, analytics, abuse flags. | | SUB | Plans and subscriptions | Catalog, feature gates, dunning, grace, upgrades and downgrades, overrides, counters. | | CHK | Check-in and check-out | Moderator events, vehicle match, offline queue, incidents, occupancy. | | MOD | Moderator app | Scoped access, sign-in, end-of-trip report. | | TRK | Live tracking | Vehicle positions and passenger movement for operations. | | PAR | Parent tracker | Child linking, view scope, eligibility, notifications, safety reports. | | MED | Media and albums | Albums, privacy modes, watermarking, downloads. | | PHO | Photographer studio | Portfolio, rates, availability, earnings, plan rules. | | DRV | Driver app and lab tests | Work area, deals, lab-test gate, deadlines, suspension, earnings. | | ADM | Admin console | Accounts, admin staff, configuration, disputes, lab tests, audit log. | | ACC | Accounting and settlements | Ledger, accounting views, payouts, settlements, invoices across parties, reconciliation, exports. | | NTF | Notifications | Channels, language, quiet hours, templates, delivery, reminders. | | TRV | Traveler profile and history | Profile, visibility, history, discounts, plan changes, privacy requests. | | MKT | Markets | Country configuration: currency, methods, tax, time zone, prices. | | ANL | Analytics | Organization, supplier and admin analytics. | | API | Public API | Documented API for organizations and partners (Could). | ### 3.3 User classes and characteristics [#33-user-classes-and-characteristics] | User class | Characteristics | Plan requirement | Main surface | |---|---|---|---| | Visitor | Browses public trips and registration pages. Not signed in. | None | Traveler app | | Traveler | Books trips. Mobile-first. Any age, so child-data rules apply. | None (Free, Explorer, VIP) | Traveler app | | Parent or guardian | A traveler on Explorer or VIP with linked children. | Explorer or VIP, plus organization eligibility ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)) | Parent tracker | | Platform admin | Staff. Roles: Super admin, Operations, Finance (D-49). | Staff | Admin console | | Organization owner | Registers, pays and runs the tenant. | Starter, Growth or Enterprise | Organization dashboard | | Organization employee | Works within granted permissions. May belong to several organizations. | Organization plan | Organization dashboard | | Platform driver | Independent, admin-approved. Works through deals. | Basic, Professional or Premium | Driver app | | Organization-owned driver | Drives for one organization only. | Organization plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | Driver app | | Platform photographer | Independent, admin-approved. Works through deals. | Basic, Studio or Pro | Photographer studio | | Organization-owned photographer | Works for one organization only. | Organization plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | Photographer studio | | Vehicle moderator | One vehicle on one trip. Often non-technical, on a bus, with a phone. | [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)] | Moderator app | ### 3.4 Operating environment [#34-operating-environment] | Item | Requirement | |---|---| | Web browsers | Current and previous major versions of Chrome, Safari, Edge and Firefox on desktop and mobile [OPEN: confirm list]. | | Mobile operating systems | iOS and Android [OPEN: minimum versions]. Apps prompt for update when below the supported version. | | Moderator app | Installable web app on Android and iOS, working on mobile data, with an offline queue ([FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue)). | | Languages | Arabic (right to left) and English from the first release. Western digits 0 to 9 in both (D-159). | | Time zones | Each trip has a time zone. An organization's time zone defaults to its market's main zone: Cairo, Riyadh or Dubai (D-282). Times show in the trip's time zone, plus the viewer's zone where they differ. | | Hosting region | Recommended: AWS me-central-1 (UAE) primary with cross-region backups (architecture 20.2) [OPEN: confirm against Egyptian data residency, [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat)]. | ### 3.5 Design and implementation constraints [#35-design-and-implementation-constraints] | ID | Constraint | |---|---| | CON-01 | Tenant isolation is mandatory. One organization's data is never visible to another ([BRL-01](/en/docs/brd/requirements#7-business-rules)). | | CON-02 | Card data never reaches Trips Enjoy servers. Payment runs on the gateway's hosted pages or SDKs ([BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg)). | | CON-03 | Arabic and English from the first release, with right-to-left layouts. | | CON-04 | Markets: Egypt pilot in phase 2; Saudi Arabia and the UAE in phase 5 (D-69). | | CON-05 | Recommended stack (architecture section 3, to confirm in T-FND-01): TypeScript end to end; NestJS modular monolith; PostgreSQL 16 with RLS and TimescaleDB; Redis 7; SQS and SNS; Next.js web; React Native mobile; S3 or R2 with CDN; AWS with ECS Fargate; Terraform; GitHub Actions. | | CON-06 | Plan limits and feature gates are enforced on the server ([BRL-02](/en/docs/brd/requirements#7-business-rules)). | | CON-07 | Every financial event is written to a double-entry ledger ([BRL-18](/en/docs/brd/requirements#7-business-rules)). | | CON-08 | Child data is never used for advertising, marketing or model training. | | CON-09 | Delivery follows the six phases in BRD 3.3. | | CON-10 | Providers follow BRD 9.2. Gateway choice per market follows [OD-11](/en/docs/brd/compliance#11-open-decisions). | | CON-11 | Database conventions follow [ERD](/en/docs/erd) section 1: BIGSERIAL keys with a public UUID, TIMESTAMPTZ, soft delete with audit columns, and lookup tables instead of enum types. | ### 3.6 Assumptions and dependencies [#36-assumptions-and-dependencies] Assumptions in BRD 9.1 and dependencies in BRD 9.2 apply. Additional assumptions: | ID | Assumption | Impact if wrong | |---|---|---| | ASM-01 | One account can hold traveler and supplier roles at once. | Account model changes. | | ASM-02 | Lab partner results reach the platform directly. Driver upload is the fallback. | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) changes. | | ASM-03 | Live location is collected only while a trip is In Progress. | Tracking and privacy design change. | | ASM-04 | Only the owner, or an employee with the subscription permission, changes plans and billing. | Permission design changes. | | ASM-05 | A trip is sold in its organization's market currency only. | Multi-currency pricing would be needed. | ## 4. External interface requirements [#4-external-interface-requirements] ### 4.1 User interfaces [#41-user-interfaces] | Surface | Users | Access rules | |---|---|---| | Traveler app | Travelers, parents | Public browsing. Booking and account actions after sign-in. | | Organization dashboard | Owners, employees | Password plus SMS or authenticator code at every sign-in. Tenant-scoped. Organization switcher. | | Admin console | Admins | Password plus mandatory authenticator. Separate route. | | Driver app | Drivers | Sign-in. Restricted to four actions while a lab test is pending ([FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause)). | | Photographer studio | Photographers | Sign-in. Plan-gated features. | | Moderator app | Moderators | Staff code. One vehicle. | | Parent tracker | Parents | Section of the traveler app (D-124). Linked children only. | | ID | Interface requirement | Priority | |---|---|---| | UI-01 | Every surface supports Arabic and English, with the language switch available on every screen without losing the current task. | Must | | UI-02 | Arabic layouts mirror fully: navigation, forms, tables, charts and icons that imply direction. | Must | | UI-03 | Every surface meets WCAG 2.1 Level AA (proposed). | Must | | UI-04 | Every surface reflows to a 360 px phone width without horizontal page scrolling, with a 16 px side gutter. | Must | | UI-05 | Forms show errors next to the field in the user's language and keep entered data after an error. | Must | | UI-06 | Every amount is labeled with its currency code and follows the market's rounding rule. | Must | | UI-07 | Admin console and organization dashboard use separate routes from the traveler app. | Must | | UI-08 | Destructive and money-moving actions use a confirmation step that names the effect. | Must | | UI-09 | No screen shows a card number field. Payment opens the gateway page or SDK. | Must | ### 4.2 Hardware interfaces [#42-hardware-interfaces] No special hardware. Phones are used for GPS (check-in location, live tracking), camera (document capture, ticket scan, photo upload) and push. Where a permission is denied, the user is told what is missing and what still works. If location is denied at check-in, the event is still recorded without location and flagged (proposed). ### 4.3 Software interfaces [#43-software-interfaces] | Interface | Purpose | Notes | |---|---|---| | Stripe (cards, Apple Pay, Google Pay, Billing, Connect Express) | Bookings, plans, refunds, payouts | Hosted pages or Elements; webhooks. | | Paymob or Tap | Local cards in MENA | Per market ([OD-11](/en/docs/brd/compliance#11-open-decisions)). | | Fawry | Cash vouchers in Egypt | Voucher valid 48 hours (D-31). | | SMS and WhatsApp (Twilio or local provider) | OTP, staff codes, notifications | Delivery status recorded; switch channel after 3 failed deliveries. | | Transactional email (AWS SES, Postmark fallback) | Notifications, receipts, invoices | Bounce and complaint handling. | | Push (FCM, APNS) | Mobile notifications | Token per signed-in device. | | Maps and routing (Mapbox) | Routes, stops, live map | Tiles and routing only; location data stays on platform storage. | | Object storage and CDN (S3 or R2, CloudFront or Cloudflare) | Media and documents | Identity documents in a restricted bucket. Direct upload by presigned URL. | | Lab partner network | Driver lab tests | Results sent from the lab to the platform. | | Business registry and tax checks | Organization onboarding | Manual in phase 1 ([OD-16](/en/docs/brd/compliance#11-open-decisions)). | | CRM and outbound webhooks | Events to organization systems | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). | | Search (Postgres full-text first; OpenSearch or Meilisearch later) | Trip and supplier discovery | Event-driven indexing; 5 to 30 seconds lag accepted. | ### 4.4 Communications interfaces [#44-communications-interfaces] | ID | Requirement | Priority | |---|---|---| | COM-01 | All client-server traffic uses HTTPS with TLS 1.3 and HSTS. Mobile apps pin certificates. | Must | | COM-02 | The real-time channel uses WebSocket with SSE fallback, for the seat map, live tracking, deal updates and operations dashboards. | Must | | COM-03 | Every real-time subscription is authenticated and authorized for the trip, vehicle, deal or account it names before data is sent. | Must | | COM-04 | Outbound webhooks use HTTPS, are signed with HMAC-SHA256 over the body and a timestamp, and carry an event identifier. Receivers reject timestamps older than 5 minutes (D-62). | Must | | COM-05 | Inbound gateway and messaging callbacks are verified against the provider's signature before any state change. | Must | ## Module index [#module-index] Section 5 is split into one page per module: Each module lists its requirements. Source IDs refer to the BRD. Acceptance criteria are Given, when, then sentences. # Quality & Interface Requirements (/en/docs/srs/quality) ## 8. Non-functional requirements [#8-non-functional-requirements] ### 8.1 Performance (NFR-PERF) [#81-performance-nfr-perf] | ID | Requirement | Target | |---|---|---| | [NFR-PERF-01](/en/docs/srs/quality#81-performance-nfr-perf) | API latency per endpoint, server side | p50 under 150 ms; p95 under 500 ms; p99 under 1,500 ms | | [NFR-PERF-02](/en/docs/srs/quality#81-performance-nfr-perf) | Booking flow from trip page to confirmed booking, excluding time on the gateway page | Under 5 seconds | | [NFR-PERF-03](/en/docs/srs/quality#81-performance-nfr-perf) | Trip search | Under 300 ms | | [NFR-PERF-04](/en/docs/srs/quality#81-performance-nfr-perf) | Seat map load | Under 200 ms | | [NFR-PERF-05](/en/docs/srs/quality#81-performance-nfr-perf) | GPS point ingestion | Under 50 ms per point | | [NFR-PERF-06](/en/docs/srs/quality#81-performance-nfr-perf) | Real-time delivery (seat map, tracking, deals, operations) | Under 500 ms from event to client | | [NFR-PERF-07](/en/docs/srs/quality#81-performance-nfr-perf) | Thumbnail from CDN | Under 100 ms | | [NFR-PERF-08](/en/docs/srs/quality#81-performance-nfr-perf) | Dashboard first meaningful paint | Under 2 seconds | | [NFR-PERF-09](/en/docs/srs/quality#81-performance-nfr-perf) | Check-in event reaches the server after boarding | Within 60 seconds, including reconnect after short loss (BRD OBJ-02) | ### 8.2 Security (NFR-SEC) [#82-security-nfr-sec] | ID | Requirement | |---|---| | [NFR-SEC-01](/en/docs/srs/quality#82-security-nfr-sec) | TLS 1.3 and HSTS on all traffic; certificate pinning on mobile. | | [NFR-SEC-02](/en/docs/srs/quality#82-security-nfr-sec) | Passwords hashed with Argon2id; minimum 12 characters; checked against breached-password lists (D-51). | | [NFR-SEC-03](/en/docs/srs/quality#82-security-nfr-sec) | Lockout after 5 failed sign-ins for 15 minutes, all roles. | | [NFR-SEC-04](/en/docs/srs/quality#82-security-nfr-sec) | Second factors per role ([FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods)); OTP rules per [BRL-20](/en/docs/brd/requirements#7-business-rules). | | [NFR-SEC-05](/en/docs/srs/quality#82-security-nfr-sec) | Access tokens are RS256 JWTs carrying user, active role, organization and token version, validated on every request; 15-minute life; refresh tokens rotate. | | [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | Mutating endpoints accept an idempotency key kept 24 hours. | | [NFR-SEC-07](/en/docs/srs/quality#82-security-nfr-sec) | Tenant isolation at database (RLS), repository and API layers; cross-tenant test suite passes before each phase. | | [NFR-SEC-08](/en/docs/srs/quality#82-security-nfr-sec) | Encryption at rest everywhere; column-level encryption for listed identifiers. | | [NFR-SEC-09](/en/docs/srs/quality#82-security-nfr-sec) | Secrets in a managed store, rotated every 90 days, never in code or logs. | | [NFR-SEC-10](/en/docs/srs/quality#82-security-nfr-sec) | Least privilege for services, jobs and staff roles. | | [NFR-SEC-11](/en/docs/srs/quality#82-security-nfr-sec) | Restricted storage for identity documents and lab results. | | [NFR-SEC-12](/en/docs/srs/quality#82-security-nfr-sec) | No card data is received, logged or stored. | | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Rate limits: unauthenticated 60 requests per minute; traveler 600; organization staff 1,200; admin 3,000; moderator check-in 120 per vehicle per minute. Drivers, photographers and parents [OPEN]. | | [NFR-SEC-14](/en/docs/srs/quality#82-security-nfr-sec) | Security review and SAST, dependency scan and monthly DAST before each phase; annual external penetration test. | | [NFR-SEC-15](/en/docs/srs/quality#82-security-nfr-sec) | CAPTCHA on registration forms; booking throttle of 5 per traveler per hour unless verified (architecture 17.4). | ### 8.3 Availability (NFR-AVL) [#83-availability-nfr-avl] | ID | Requirement | Target | |---|---|---| | [NFR-AVL-01](/en/docs/srs/quality#83-availability-nfr-avl) | Monthly uptime of traveler app, organization dashboard and booking services | 99.9 percent (proposed) | | [NFR-AVL-02](/en/docs/srs/quality#83-availability-nfr-avl) | Planned maintenance | 01:00 to 03:00 Cairo time, at most 4 hours per month, 72 hours' notice in app and on the status page (D-303) | | [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | Gateway outage loses no confirmed payment | Callbacks queued and replayed; pending state per [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) | ### 8.4 Scalability (NFR-SCL) [#84-scalability-nfr-scl] | ID | Requirement | Target | |---|---|---| | [NFR-SCL-01](/en/docs/srs/quality#84-scalability-nfr-scl) | Capacity stages | Stage 1 (pilot): 5,000 traveler accounts, 500 trips, 200 concurrent checkouts (D-304). Launch: 10,000 active users, 500 bookings per day. Growth: 100,000 users, 5,000 bookings per day. Scale: 1 million users, 50,000 bookings per day (architecture 19.3). | | [NFR-SCL-02](/en/docs/srs/quality#84-scalability-nfr-scl) | Phase 3 pilot | Three-bus trip, about 120 passengers, end to end | | [NFR-SCL-03](/en/docs/srs/quality#84-scalability-nfr-scl) | Stateless services | Scale by adding instances | | [NFR-SCL-04](/en/docs/srs/quality#84-scalability-nfr-scl) | Load tests before each major release | 1,000 concurrent browsers, 500 concurrent bookings, 100 concurrent payments, 10,000 GPS events per second (architecture 19.4) | ### 8.5 Data (NFR-DAT) [#85-data-nfr-dat] | ID | Requirement | |---|---| | [NFR-[DAT-01](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Tenant isolation per [DAT-01](/en/docs/srs/data#62-data-isolation). | | [NFR-[DAT-02](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Retention per 6.4, enforced by scheduled purge jobs that log each run. | | [NFR-[DAT-03](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Data copy and deletion requests tracked to completion. | | [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Hosting region and residency per market [OPEN: confirm AWS me-central-1 against Egyptian residency rules]. | | [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Consent records keep type, time and text version for lab tests, background checks, guardianship, child tracking and marketing. | ### 8.6 Observability (NFR-OBS) [#86-observability-nfr-obs] | ID | Requirement | |---|---| | [NFR-OBS-01](/en/docs/srs/quality#86-observability-nfr-obs) | Structured logs carry request, trace, tenant and user IDs; never passwords, codes or card data. | | [NFR-OBS-02](/en/docs/srs/quality#86-observability-nfr-obs) | Per-endpoint rate, errors and latency percentiles. | | [NFR-OBS-03](/en/docs/srs/quality#86-observability-nfr-obs) | OpenTelemetry traces across API, jobs, real-time channel and gateway callbacks. | | [NFR-OBS-04](/en/docs/srs/quality#86-observability-nfr-obs) | Critical alerts page on-call through PagerDuty; warnings go to Slack; low priority goes to an email digest. | | [NFR-OBS-05](/en/docs/srs/quality#86-observability-nfr-obs) | Dashboards: platform health, booking funnel, payments, subscriptions, tracking, database, notification delivery by channel. | | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Application logs kept 7 years in archive storage; hot search window [OPEN]. | | [NFR-OBS-07](/en/docs/srs/quality#86-observability-nfr-obs) | Error tracking with Sentry on backend and mobile. | ### 8.7 Internationalization (NFR-I18N) [#87-internationalization-nfr-i18n] | ID | Requirement | |---|---| | NFR-I18N-01 | Every screen and message in Arabic and English from the first release. | | NFR-I18N-02 | Full right-to-left mirroring for Arabic. | | NFR-I18N-03 | Launch currencies EGP (P2), SAR and AED (P5); every amount labeled. | | NFR-I18N-04 | Western digits 0 to 9 in both languages (D-159); dates follow the language. | | NFR-I18N-05 | A missing translation fails the build. | ### 8.8 Accessibility (NFR-A11Y) [#88-accessibility-nfr-a11y] | ID | Requirement | |---|---| | NFR-A11Y-01 | WCAG 2.1 AA on all surfaces (proposed). | | NFR-A11Y-02 | Every web action is keyboard-operable. | | NFR-A11Y-03 | The seat map has a list alternative readable by screen readers. | | NFR-A11Y-04 | AA contrast in light and dark themes, including brand orange text (primary text #C93A00 light, #FF8655 dark). | ### 8.9 Maintainability (NFR-MNT) [#89-maintainability-nfr-mnt] | ID | Requirement | |---|---| | [NFR-MNT-01](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Versioned migrations with expand-contract for breaking changes; rollback documented. | | [NFR-MNT-02](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Every acceptance criterion maps to a test. | | [NFR-MNT-03](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Features ship behind flags per phase. | | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Automated test coverage target [OPEN]. | | [NFR-MNT-05](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Major decisions recorded as ADRs (architecture appendix B). | ### 8.10 Compliance (NFR-COM) [#810-compliance-nfr-com] | ID | Requirement | |---|---| | [NFR-COM-01](/en/docs/srs/quality#810-compliance-nfr-com) | Data access and deletion requests answered within 30 days. | | [NFR-COM-02](/en/docs/srs/quality#810-compliance-nfr-com) | Consent per [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat). | | [NFR-COM-03](/en/docs/srs/quality#810-compliance-nfr-com) | Retention per 6.4. | | [NFR-COM-04](/en/docs/srs/quality#810-compliance-nfr-com) | No child data in marketing, advertising, analytics events or model training. | | [NFR-COM-05](/en/docs/srs/quality#810-compliance-nfr-com) | Lab tests and background checks used in a market only after legal review there. | | [NFR-COM-06](/en/docs/srs/quality#810-compliance-nfr-com) | Regimes: Egypt PDPL, Saudi PDPL, UAE data protection law, GDPR where applicable. | | [NFR-COM-07](/en/docs/srs/quality#810-compliance-nfr-com) | ZATCA scope decided before the Saudi launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)). | | [NFR-COM-08](/en/docs/srs/quality#810-compliance-nfr-com) | PCI DSS SAQ A scope through gateway-hosted payment. | | [NFR-COM-09](/en/docs/srs/quality#810-compliance-nfr-com) | Data processing agreements with every processor (cloud, gateways, messaging, email, monitoring). | ### 8.11 Backup and recovery (NFR-BKP) [#811-backup-and-recovery-nfr-bkp] | ID | Requirement | Target | |---|---|---| | [NFR-BKP-01](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Recovery time objective | 4 hours | | [NFR-BKP-02](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Recovery point objective | 15 minutes | | [NFR-BKP-03](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Backups | Daily database snapshots kept 35 days; point-in-time recovery 7 days; daily cross-region copies kept 30 days; media versioning 90 days with cross-region replication; Redis daily snapshot 7 days | | [NFR-BKP-04](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Restore tests | Daily automated restore to staging; quarterly disaster-recovery drill with measured RTO recorded | ## 9. Interface and API requirements [#9-interface-and-api-requirements] ### 9.1 Resource groups [#91-resource-groups] | Resource group | Covers | Main actors | Modules | |---|---|---|---| | Auth and accounts | Registration, verification, sessions, roles, privacy | All | AUTH, TRV | | Applications | Submissions, decisions, appeals | Applicants, admins | ONB | | Organizations | Settings, members, permissions, integrations, branding | Staff, admins | ORG, EMP | | Fleet | Vehicle types, vehicles | Staff | FLT | | Trips | Trips, stops, vehicles, staffing, programs, publishing | Staff; travelers read | TRIP, PRG, STF | | Deals | Negotiation and offers | Staff, suppliers, admins | NEG | | Bookings | Cart, holds, checkout, cancellation, remedies, receipts | Travelers; staff and admins read | BKG, SEAT | | Payments | Payment status, refunds, gateway callbacks | Travelers, admins | PAY | | Coupons | Coupons, validation, redemptions | Creators, travelers, admins | CPN | | Plans | Catalog, subscriptions, overrides | Owners, admins | SUB | | Operations | Manifests, check-in events, incidents, reports | Moderators, staff | CHK, MOD | | Tracking | Positions, passenger movement, parent view | Staff, parents | TRK, PAR | | Media | Albums, photos, links | Photographers, travelers | MED, PHO | | Finance | Ledger views, invoices, payouts, settlements, reconciliation, exports | Staff, suppliers, admins | ACC | | Markets | Market configuration | Admins | MKT | | Analytics | Reports and exports | Staff, suppliers, admins | ANL | ### 9.2 Conventions [#92-conventions] | ID | Convention | Priority | |---|---|---| | IF-01 | URL-versioned REST (/api/v1). Breaking changes only in a new major version. OpenAPI 3.1 generated from code. | Must | | IF-02 | JSON in UTF-8; ISO 8601 times with offset; money as `{amount_minor, currency}`; resources identified by UUID. | Must | | IF-03 | One envelope: `data` and `meta` on success; `error` (code, message in caller's language, details) and `meta` on failure; `meta.request_id` always. | Must | | IF-04 | Error categories: VALIDATION_FAILED 400, UNAUTHENTICATED 401, PLAN_REQUIRED 402, FORBIDDEN 403, NOT_FOUND 404 (also for other tenants' data), CONFLICT 409, BUSINESS_RULE_VIOLATED 422, RATE_LIMITED 429, INTERNAL_ERROR 500, SERVICE_UNAVAILABLE 503. | Must | | IF-05 | Cursor paging; default 20, maximum 100 per page (D-308). | Must | | IF-06 | Idempotency-Key on every mutating request; same key and body returns the original result; same key with a different body returns CONFLICT. | Must | | IF-07 | Deprecated versions and fields return Deprecation and Sunset headers for 90 days before removal. | Must | | IF-08 | Error codes are stable; messages are translated. | Must | | IF-09 | Rate-limited responses include Retry-After. | Should | | IF-10 | Webhook events carry an event ID, type, occurred time and are signed (COM-04). | Must | | IF-11 | Real-time subscriptions are authorized per channel at subscribe time: trip seats, trip vehicle, family child, deal, organization operations. | Must | | IF-12 | Another tenant's record returns NOT_FOUND. | Must | ### 9.3 API authentication [#93-api-authentication] First-party clients use the access token from sign-in. Public API clients ([FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api), phase 6) use organization API keys with scopes, sent as a bearer key, rate-limited per key. # ACC — Accounting and settlements (/en/docs/srs/requirements/acc) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ACC-01 — Double-entry ledger [#fr-acc-01--double-entry-ledger] Every financial event shall be written as a balanced ledger transaction. - Given a confirmed booking, when the ledger is checked, then its entries balance to zero. ## FR-ACC-02 — Organization accounting per trip [#fr-acc-02--organization-accounting-per-trip] Organizations shall see per trip base revenue, program revenue, coupon impact, supplier costs, commission and gateway fees, at plan depth. - Given a trip with all event types, when trip accounting opens, then each line shows its total. ## FR-ACC-03 — Supplier earnings and payouts [#fr-acc-03--supplier-earnings-and-payouts] The platform shall compute supplier earnings and create weekly payout runs on Mondays at 06:00 (D-28). A negative balance is netted against the next payout in the same currency, and no payout runs while it is negative (D-173). - Given a supplier with a negative balance, when the run executes, then no payout is made and the balance carries forward. ## FR-ACC-04 — Platform financial view [#fr-acc-04--platform-financial-view] Admins shall see subscription revenue, commission, deal audit, coupon redemptions, disputes and payouts, by market and month. - Given a month, when the view opens, then all six areas show totals. ## FR-ACC-05 — Settlements [#fr-acc-05--settlements] A settlement shall open when a trip is Completed and close when every payout is made and no dispute is open (D-174). Each line names the paying party, receiving party, reason and amount. - Given a completed trip with an open dispute, when all payouts are made, then the settlement stays open until the dispute closes. ## FR-ACC-06 — Exports by plan [#fr-acc-06--exports-by-plan] CSV and PDF exports shall follow the plan; admin system-wide exports are CSV only; files expire after 7 days and are ready within 15 minutes (D-249, D-177). - Given a Starter organization, when it requests a full export, then it is refused with an upgrade prompt. ## FR-ACC-07 — Reconciled exports [#fr-acc-07--reconciled-exports] Every export shall match the ledger for the same period and filters. - Given a monthly revenue export, when compared with the ledger, then totals match. ## FR-ACC-08 — Invoices across all parties [#fr-acc-08--invoices-across-all-parties] The platform shall issue and track invoices for every party pair: organization to traveler (B2C or B2B), supplier to organization for deals (issued by the platform on the supplier's behalf, proposed), platform to organization or supplier for commission, and platform to plan holders for subscriptions. - Given a finalized deal is settled, when the settlement closes, then a deal invoice and a commission invoice exist and both appear in the ledger. ## FR-ACC-09 — Daily reconciliation and finance digest [#fr-acc-09--daily-reconciliation-and-finance-digest] Reconciliation shall run daily ([FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation)). A finance exceptions digest goes out daily at 08:00 Cairo time (D-176). Dashboards warn when data is more than 26 hours old (D-250). - Given reconciliation found 2 exceptions, when 08:00 Cairo arrives, then Finance admins get the digest listing both. ## FR-ACC-10 — Archive after settlement [#fr-acc-10--archive-after-settlement] A trip shall archive 30 days after Completed, and only once its settlement is closed ([BRL-25](/en/docs/brd/requirements#7-business-rules)). - Given a trip completed 40 days ago with an open settlement, when the archive job runs, then the trip is not archived. # ADM — Admin console (/en/docs/srs/requirements/adm) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ADM-01 — Account administration [#fr-adm-01--account-administration] Admins shall search any account, suspend, reinstate, reset credentials and review deletion and data-copy requests with their due dates. - Given an open deletion request, when the account opens, then the grace end date shows. ## FR-ADM-02 — Admin staff [#fr-adm-02--admin-staff] A Super admin shall invite admins (link valid 72 hours, D-50) with a role: Super admin, Operations or Finance (D-49). New admins set up the authenticator on first sign-in before the console opens. - Given a new admin, when they first sign in, then authenticator setup is required. ## FR-ADM-03 — Configuration [#fr-adm-03--configuration] Admins shall manage plans, coupons, templates, feature flags and markets. Changes apply at once and are audited. - Given a flag turned off, when saved, then the feature hides for all users and is audited. ## FR-ADM-04 — Dispute outcomes and refunds [#fr-adm-04--dispute-outcomes-and-refunds] Admins shall record disputes, decide outcomes and issue refunds from the dispute, within or outside policy ([FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy)). - Given a dispute resolved with a refund, when saved, then the refund links to the dispute and the booking. ## FR-ADM-05 — Immutable audit log [#fr-adm-05--immutable-audit-log] Every admin action and permission change shall be written to an audit log no role can edit or delete, kept 7 years. - Given an audit entry, when anyone edits it, then the change is refused. ## FR-ADM-06 — Platform-wide coupons [#fr-adm-06--platform-wide-coupons] Admins shall create coupons for any trip, optionally limited by market, and revoke any coupon. - Given a platform coupon, when a traveler applies it to any trip, then it is accepted if other rules pass. ## FR-ADM-07 — Abuse flags [#fr-adm-07--abuse-flags] Admins shall see abuse flags with the rule that raised each and its review due date. - Given a flagged coupon, when the list opens, then the flag and rule show. ## FR-ADM-08 — Dispute handling [#fr-adm-08--dispute-handling] Disputes shall have a type (booking, payment, refund, supplier conduct, organization conduct, other) and the states in section 7.10. They are acknowledged within 2 working days and resolved within 10; information requests are answered within 5 working days. Up to 5 files of 10 MB can be attached (D-32, D-254, D-256, D-259). - Given a dispute open for 3 working days without acknowledgment, when the queue opens, then it is flagged overdue. ## FR-ADM-09 — Lab-test requests [#fr-adm-09--lab-test-requests] Admins shall request a lab test for any approved driver at any time, choose the test type and deadline, and see all tests by state and deadline. Lab tests do not apply to photographers (D-98). - Given an approved driver, when an admin requests a test, then the driver is paused and the test shows in the queue with its deadline. # ANL — Analytics (/en/docs/srs/requirements/anl) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ANL-01 — Organization analytics [#fr-anl-01--organization-analytics] Organizations shall see analytics by trip (views, conversion, bookings, revenue, occupancy, programs), by page (trip and organization page traffic and sources), by customer (new and returning travelers, repeat rate) and by provider (deals, costs, response time). Growth gets basic, Enterprise full; Starter none. - Given a Growth organization, when it opens trip analytics, then views, bookings and revenue show for the selected range. ## FR-ANL-02 — Supplier analytics [#fr-anl-02--supplier-analytics] Drivers and photographers shall see bookings, earnings and deal response analytics at their plan's report depth. - Given a Basic driver, when analytics open, then the basic report shows without export. ## FR-ANL-03 — Admin analytics [#fr-anl-03--admin-analytics] Admins shall see platform analytics by market, organization, role and plan. - Given a market filter, when applied, then all charts show that market only. ## FR-ANL-04 — Ranges, freshness and export [#fr-anl-04--ranges-freshness-and-export] Analytics shall offer 7, 30 and 90-day presets and a custom range, lag the source by no more than 5 minutes, and export within 15 minutes (D-177, D-281). - Given a booking confirmed at 10:00, when analytics refresh at 10:05, then it is counted. ## FR-ANL-05 — Privacy in analytics [#fr-anl-05--privacy-in-analytics] Analytics events shall exclude child-linked records and personal identifiers; page analytics use an anonymous identifier for visitors. - Given a parent views the tracker, when analytics events are written, then no child identifier is stored. # API — Public API (/en/docs/srs/requirements/api) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-API-01 — Public API [#fr-api-01--public-api] Organizations and partners shall access trips and bookings through a versioned public API documented at docs.trips-enjoy.com, authenticated with organization API keys scoped by permission, and rate-limited per key. - Given a revoked API key, when used, then the request is refused as unauthenticated. ## FR-API-02 — API key lifecycle [#fr-api-02--api-key-lifecycle] Organizations shall manage their own API keys: create a key with a chosen scope from the permission set, list active keys, and revoke a key at once; a revoked key is refused as unauthenticated on its next use. - Given an employee without the API permission, when they open key management, then it is refused. - Given a revoked key, when a request arrives within one minute of revocation, then it is refused as unauthenticated. ## FR-API-03 — Read resource endpoints [#fr-api-03--read-resource-endpoints] The public API shall expose read endpoints for the published resource groups — trips, bookings and availability at minimum — returning the same data the organization sees in the dashboard, scoped to the calling organization's tenant. - Given a key scoped to read-only, when it requests another organization's trips, then the response is empty for that tenant, not an error. - Given a trip in Draft, when it is requested through the API, then it is not returned. ## FR-API-04 — API conventions [#fr-api-04--api-conventions] Public API endpoints shall follow the interface conventions: URL versioning under /api/v1 with breaking changes only in a new major version, cursor pagination for list endpoints, and a single error envelope with a stable code, message and request identifier. - Given a breaking change to a response field, when it ships, then it ships under a new major version and /api/v1 keeps its shape. - Given an error, when the response body is inspected, then the envelope contains code, message and the request identifier. ## FR-API-05 — OpenAPI publication [#fr-api-05--openapi-publication] The public API shall publish an OpenAPI 3.1 specification generated from code at docs.trips-enjoy.com, refreshed with every deployment, so partners build against the contract rather than the implementation. - Given a deployed change that alters an endpoint, when the specification is fetched, then it reflects the deployed shape. ## FR-API-06 — Rate limiting behavior [#fr-api-06--rate-limiting-behavior] The public API shall rate-limit per key with published limits, return 429 with a Retry-After header when the limit is exceeded, and expose remaining-quota headers on every response. - Given a key over its limit, when the next request arrives, then the response is 429 and Retry-After names the wait. - Given a key far under its limit, when any request succeeds, then the remaining-quota headers are present. ## FR-API-07 — Webhook contract parity [#fr-api-07--webhook-contract-parity] Webhook deliveries shall use the same envelope and signing as the public API contract: an event identifier, type, occurred time and signature (COM-04), so partners verify both surfaces with one implementation; delivery behavior follows [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). - Given a webhook with a rotated secret inside the 24-hour overlap, when the signature is checked with either secret, then verification succeeds. # AUTH — Accounts, identity and access (/en/docs/srs/requirements/auth) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-AUTH-01 — Role-specific registration paths [#fr-auth-01--role-specific-registration-paths] The platform shall give each role its own registration path (/register/traveler, /register/driver, /register/photographer, /register/organization) and shall not show a combined onboarding form. Organization registration shall be web only. - Given a visitor opens /register, when the visitor chooses a role, then only that role's form is shown. - Given the mobile app, when a user chooses Organization, then the app hands off to the web registration page. ## FR-AUTH-02 — Country on every registration form [#fr-auth-02--country-on-every-registration-form] Every registration form shall collect the applicant's country and shall not submit without it. The country sets the account's market ([FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country)). - Given no country is selected, when the applicant submits, then submission is refused and the field is named. ## FR-AUTH-03 — Verification by one-time code [#fr-auth-03--verification-by-one-time-code] Accounts shall verify contact details by one-time code before acting: travelers at least one of email or phone; drivers, photographers and organization owners both (D-20). Codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. Resend is offered after a 45 to 60 second countdown. A resend does not reset the wrong-code count. After 3 failed deliveries, the code is offered on the other channel (D-58, D-59). - Given a code older than 5 minutes, when it is entered, then it is rejected and resend is offered after the countdown. - Given five wrong codes, when a sixth is entered, then verification is paused for 15 minutes and the resume time is shown. - Given a photographer verified only email, when they submit the application, then submission is refused until the phone is verified. ## FR-AUTH-04 — Role-specific sign-in methods [#fr-auth-04--role-specific-sign-in-methods] Sign-in shall follow the role: admins use email and password plus a mandatory authenticator code; organization staff use email and password plus an SMS or authenticator code at every sign-in (D-48); travelers and suppliers use password or a one-time code, both offered (proposed, auth canvas); moderators use a staff code ([FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in)). No biometric sign-in in phase 1. - Given an admin enters a correct password without a code, when sign-in is attempted, then access is refused and the code is requested. - Given organization staff sign in, when no second-factor code is entered, then sign-in is refused. ## FR-AUTH-05 — Sign-in lockout [#fr-auth-05--sign-in-lockout] The system shall lock any account for 15 minutes after 5 failed sign-in attempts, for every role (D-53), and rate-limit sign-in by IP ([NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec)). - Given five failed attempts, when a sixth is made within 15 minutes, then it is refused and the lock end time is shown. ## FR-AUTH-06 — Multi-role accounts [#fr-auth-06--multi-role-accounts] One person shall hold several roles and switch between them without a second account. The active role is part of the session. - Given a person holds traveler and approved photographer roles, when they switch to photographer, then the studio opens and traveler data is not shown in it. ## FR-AUTH-07 — Staff access to several organizations [#fr-auth-07--staff-access-to-several-organizations] Organization staff shall see and switch between the organizations whose member list includes their email, and no others. Switching changes the tenant context of the session. - Given a staff email listed by two organizations, when the staff member signs in, then both are listed and either opens. - Given an organization that does not list the email, when the staff member searches for it, then it is not listed. ## FR-AUTH-08 — Suspension and reinstatement [#fr-auth-08--suspension-and-reinstatement] Admin shall suspend and reinstate any account with a reason code (D-234). A suspended account loses access at once and keeps its data. Early lifting of a safety suspension requires a second admin (D-233). - Given a suspended account, when its user signs in, then access is refused with a suspension message and no data is deleted. ## FR-AUTH-09 — Account deletion with a 30-day grace period [#fr-auth-09--account-deletion-with-a-30-day-grace-period] A user shall request deletion. During the 30-day grace period no booking or payment is allowed, and signing in restores the account. On day 31, deletion becomes permanent under [DAT-03](/en/docs/srs/data#62-data-isolation). An organization owner cannot delete the account while any of the organization's trips is In Progress (D-168). - Given a request made 10 days ago, when the user signs in, then the account is restored and the request cancelled. - Given 30 days have passed, when the nightly job runs, then the account is deleted per section 6.4. ## FR-AUTH-10 — Sessions and tokens [#fr-auth-10--sessions-and-tokens] Access tokens shall last 15 minutes. Refresh tokens rotate on every use and last 30 days. Web sessions end after 12 hours; drafts are kept ([OD-02](/en/docs/brd/compliance#11-open-decisions)). Mobile apps stay signed in through refresh. - Given a web session in use for 12 hours, when the next request is made, then the user must sign in again. - Given an unpublished trip draft when the session ended, when the user signs in again, then the draft is available. # BKG — Booking and checkout (/en/docs/srs/requirements/bkg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-BKG-01 — Booking composition [#fr-bkg-01--booking-composition] A booking shall hold the passengers (with a child flag), program selections, seats where allowed, at most one coupon unless stackable, an optional buyer tax number, and a payment method. - Given one non-stackable coupon, when a second is entered, then it is refused and the first kept. ## FR-BKG-02 — Checkout handoff [#fr-bkg-02--checkout-handoff] Card details shall be entered only on the gateway page or SDK, using the methods of the trip's market ([FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing)). Card data never reaches Trips Enjoy. - Given checkout reaches payment, when the traveler pays, then no card number, expiry or security code appears in platform logs or data stores. ## FR-BKG-03 — Retry without losing the cart [#fr-bkg-03--retry-without-losing-the-cart] A failed payment shall be retryable while the hold lasts, up to 3 attempts per hold; after the third, the booking stays Payment Failed until the hold expires (D-197). A retry after the hold expires keeps the cart, re-checks the seats and starts a new 15-minute hold only if they are still free (D-191). - Given payment failed 10 minutes into a hold, when the traveler retries, then cart and seats are kept for the remaining 5 minutes. - Given the hold expired and seat 4A was taken meanwhile, when the traveler retries, then the cart is kept and the traveler is asked to pick another seat. ## FR-BKG-04 — Traveler cancellation and refund [#fr-bkg-04--traveler-cancellation-and-refund] A traveler shall cancel a confirmed booking before departure. The refund follows [BRL-12](/en/docs/brd/requirements#7-business-rules) (placeholder: 80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours). Requests after the cut-off go to the organization, which decides within 2 working days, then to admin (D-151). Cancellation is not available after departure or after check-in; those become disputes (D-152, D-153). The preview shows the refund amount before confirmation. - Given cancellation 50 hours before departure, when confirmed, then 80 percent is refunded and the coupon redemption reversed. - Given a checked-in passenger, when cancellation is attempted, then it is refused and a dispute is offered. ## FR-BKG-05 — Receipts and invoices [#fr-bkg-05--receipts-and-invoices] Each confirmed booking shall produce a receipt and an invoice ([FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices)) visible in the traveler's booking history. - Given a booking becomes Confirmed, when the payment is recorded, then receipt and invoice are visible. ## FR-BKG-06 — Organization cancellation of a trip [#fr-bkg-06--organization-cancellation-of-a-trip] When an organization cancels a trip, every confirmed booking shall move to Cancelled and be refunded in full, with coupon redemptions reversed (D-150, [BRL-30](/en/docs/brd/requirements#7-business-rules)). - Given a trip with 40 confirmed bookings is cancelled, when saved, then 40 full refunds are queued. ## FR-BKG-07 — Booking states [#fr-bkg-07--booking-states] Bookings shall move only through the states in section 7.2. - Given a booking in Cart, when Checked In is set, then it is refused. # CHK — Check-in and check-out (/en/docs/srs/requirements/chk) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-CHK-01 — Check-in at boarding [#fr-chk-01--check-in-at-boarding] The moderator shall check each passenger in by scanning the booking code or searching the manifest. - Given passenger P on vehicle 2, when moderator 2 checks P in, then the event is recorded and P shows on board. ## FR-CHK-02 — Vehicle match [#fr-chk-02--vehicle-match] A check-in shall be accepted only for the passenger's assigned vehicle. Otherwise the app names the correct vehicle number only, without other names or moderators. - Given P is on vehicle 2, when moderator 1 scans P, then it is refused and "vehicle 2" is shown. ## FR-CHK-03 — Event record [#fr-chk-03--event-record] Each event shall store event time, server receipt time, moderator, vehicle, stop and location where permitted, and appear in the passenger movement log. - Given a check-in, when the log is read, then it shows time, moderator, vehicle and location if permitted. ## FR-CHK-04 — Check-out at stops [#fr-chk-04--check-out-at-stops] The moderator shall check passengers out at stops and the destination. A passenger checked out at an intermediate stop can be checked in again on the same vehicle (proposed, workflows 16.2). - Given P checked out at stop 3, when P re-boards, then a new check-in is accepted on the same vehicle. ## FR-CHK-05 — Offline queue [#fr-chk-05--offline-queue] Without connection, events shall queue on the device (up to 1,000; warning at 800), retry every 30 seconds, and reach the server in order with original timestamps (D-117). Duplicate replays are ignored by client event ID. - Given 3 minutes offline and five check-ins, when the connection returns, then five events arrive in order with original times. ## FR-CHK-06 — Incident reporting [#fr-chk-06--incident-reporting] Moderators shall report incidents with a category (safety, medical, vehicle fault, lost traveler, conduct, other; D-331), description, photo and location. Reports reach the organization's operations view in real time. - Given an incident is submitted, when saved, then an operations user sees it without refreshing. ## FR-CHK-07 — Occupancy [#fr-chk-07--occupancy] Each vehicle shall show checked-in passengers against seats, updated in real time. - Given 40 of 48 checked in, when operations opens the trip, then vehicle 2 shows 40 of 48. # CPN — Coupons (/en/docs/srs/requirements/cpn) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-CPN-01 — Creator scope [#fr-cpn-01--creator-scope] A coupon shall apply only inside its creator's scope: admin coupons to any trip (optionally limited to a market); organization coupons to its own trips; driver and photographer coupons to bookings where that supplier is assigned. - Given a driver coupon and a booking without that driver, when applied, then it is refused. ## FR-CPN-02 — Cross-entity rejection [#fr-cpn-02--cross-entity-rejection] Cross-entity use shall always be rejected with "not applicable to this booking", without naming the other entity ([OD-20](/en/docs/brd/compliance#11-open-decisions)). - Given organization A's coupon on organization B's trip, when validated, then the generic message shows. ## FR-CPN-03 — Real-time validation [#fr-cpn-03--real-time-validation] Validation shall check existence, status, validity window, scope, usage limit, per-user limit and minimum spend, in that order, and return the first failing reason. - Given a coupon that expired yesterday, when applied, then the reason is "expired". - Given a total below the minimum, when applied, then the reason is "minimum spend not met". ## FR-CPN-04 — Coupon types [#fr-cpn-04--coupon-types] Coupons shall support fixed amount, percentage, program-specific, free program, first booking and minimum spend. - Given a first-booking coupon, when a traveler with a confirmed booking with that entity applies it, then it is refused. ## FR-CPN-05 — Lifecycle and controls [#fr-cpn-05--lifecycle-and-controls] Coupons shall use the states in section 7.7. Creators pause, resume and revoke their own; admins revoke any. - Given a Paused coupon, when applied, then it is refused with reason "paused". ## FR-CPN-06 — Redemption and reversal [#fr-cpn-06--redemption-and-reversal] Each redemption shall be recorded against its booking. A refund reverses the redemption, frees the traveler's per-user use, and decrements the total usage count (architecture 10.6); an Exhausted coupon returns to Active if still in its window. - Given a refunded booking with a coupon, when saved, then the redemption is reversed and the traveler can use the coupon again. ## FR-CPN-07 — Analytics and abuse flags [#fr-cpn-07--analytics-and-abuse-flags] Creators shall see redemptions, discount total and remaining uses per coupon with 7, 30 and 90-day presets. Admins see platform analytics and abuse flags. Flags never block automatically; admins review within 2 working days (D-217). Thresholds are [OPEN: D-216]. - Given a flagged coupon, when the admin opens it, then the flag shows the rule that raised it and its review due date. ## FR-CPN-08 — Coupon count by plan [#fr-cpn-08--coupon-count-by-plan] Active and paused coupons count against the plan limit (D-203): organizations 5, 20, unlimited; drivers and photographers 3, 10, unlimited. - Given a Starter organization with 5 active or paused coupons, when it creates a sixth, then it is blocked with an upgrade prompt. # DRV — Driver app and lab tests (/en/docs/srs/requirements/drv) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-DRV-01 — Driver work area [#fr-drv-01--driver-work-area] A driver shall see only their own assignments; an organization-owned driver only that organization's trips. - Given an own driver of organization A, when trips load, then only A's trips show. ## FR-DRV-02 — Deal responses [#fr-drv-02--deal-responses] A platform driver shall accept, counter or reject deal requests after seeing trip, route, date, vehicle and pay. - Given a counter, when sent, then the state is Countered by Provider and the organization is notified. ## FR-DRV-03 — Lab-test pause [#fr-drv-03--lab-test-pause] When a lab test is requested, the driver shall be paused at once. The app allows only: book the lab, upload the result, contact support, sign out. Open deals end with reason "provider paused"; upcoming assignments return to their organizers, who are notified to reassign. - Given a requested test, when the driver opens the app, then only the four actions are available. ## FR-DRV-04 — Lab deadline and result [#fr-drv-04--lab-deadline-and-result] The deadline shall default to 3 days from request; admins may set 1 to 7 days (D-21). Results come from the partner lab, or by driver upload as fallback. - Given 3 days pass with no result, when the deadline passes, then the test is Missed and the driver suspended. ## FR-DRV-05 — Admin validation [#fr-drv-05--admin-validation] Admins shall mark each result Passed or Failed. Late results are reviewed within 2 working days (D-243). A pass unpauses the driver; lifting a suspension early needs a pass and a second admin (D-239). A failed driver stays paused; a second failure within 12 months closes the account (D-242). - Given a Passed result, when saved, then the driver is unpaused and the change audited. - Given a second failure within 12 months, when saved, then the driver account is closed. ## FR-DRV-06 — Missed-deadline suspension [#fr-drv-06--missed-deadline-suspension] A missed deadline shall suspend the driver; a suspension over 30 days closes the driver account. - Given a suspension of 31 days, when the daily job runs, then the account is closed. ## FR-DRV-07 — Earnings and payouts [#fr-drv-07--earnings-and-payouts] Drivers shall see earnings and receive weekly payouts on Mondays at 06:00. While paused, completed trips are paid and uncompleted trips are held (D-28, D-175). - Given a weekly run, when it completes, then the week's payout shows in earnings. ## FR-DRV-08 — Driver availability [#fr-drv-08--driver-availability] Drivers shall mark available or unavailable dates and ranges (no weekly rules, D-89); deals that conflict with an existing assignment show a conflict. - Given an existing assignment on 10 March, when another deal for that date is opened, then a conflict warning shows. # EMP — Employees and permissions (/en/docs/srs/requirements/emp) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-EMP-01 — Permission sets [#fr-emp-01--permission-sets] The owner shall invite employees and grant each a set of permissions in the areas trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations and analytics. Templates (Operations, Finance, Support, Manager) are offered as starting points. - Given an employee without accounting permission, when they open accounting, then the area is hidden and direct requests are refused. ## FR-EMP-02 — Permission changes are audited [#fr-emp-02--permission-changes-are-audited] Every grant, change and removal shall be written to the audit log with actor, time, and before and after values, and shown in the employee's permission history. - Given an owner removes a permission, when saved, then the audit log records owner, employee, time and the removed permission. ## FR-EMP-03 — Employee limit per plan [#fr-emp-03--employee-limit-per-plan] Active employees shall not exceed the plan limit (Starter 5, Growth 20, Enterprise unlimited). - Given a Starter organization with 5 active employees, when a sixth is invited, then it is blocked with an upgrade prompt. ## FR-EMP-04 — Server-side scope [#fr-emp-04--server-side-scope] Every permission shall be enforced by the server on every request. - Given an employee with trip scope only calls an accounting endpoint, when processed, then it is refused as forbidden. ## FR-EMP-05 — Employee removal [#fr-emp-05--employee-removal] Removing an employee shall end their access to that organization at once; past actions and audit entries remain. - Given a removed employee, when they sign in, then the organization is not listed and audit entries still show their name. ## FR-EMP-06 — Invitation and first sign-in [#fr-emp-06--invitation-and-first-sign-in] An invitation link shall go to the employee's email, valid 7 days (D-286). On first sign-in the employee sets a password and enrolls a second factor (SMS or authenticator) before the workspace opens. - Given an accepted invitation, when the employee signs in for the first time, then second-factor setup is required before the workspace opens. # FLT — Fleet and vehicle types (/en/docs/srs/requirements/flt) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-FLT-01 — Reusable vehicle types [#fr-flt-01--reusable-vehicle-types] A vehicle type shall define a seat layout with labeled seats, reusable across trips. - Given a 48-seat type, when a new trip selects it, then the trip uses the same 48 labeled seats. ## FR-FLT-02 — Vehicle registry [#fr-flt-02--vehicle-registry] A vehicle shall use one vehicle type and its seat count shall match the type. - Given a 48-seat type and a vehicle saying 50, when saved, then it is refused. ## FR-FLT-03 — Vehicle limit per trip [#fr-flt-03--vehicle-limit-per-trip] Vehicles per trip shall not exceed the plan limit (Starter 2, Growth 10, Enterprise unlimited). - Given a Starter trip with 2 vehicles, when a third is added, then it is blocked with an upgrade prompt. ## FR-FLT-04 — Seat map from vehicle type [#fr-flt-04--seat-map-from-vehicle-type] Each trip vehicle's seat map shall come from its vehicle type and show each seat's label and state. - Given seat 12B is reserved, when a traveler views the map, then 12B shows unavailable. ## FR-FLT-05 — Vehicle removal after bookings [#fr-flt-05--vehicle-removal-after-bookings] A vehicle with confirmed bookings shall not be removed until those bookings are reassigned or resolved under [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings). - Given a vehicle with confirmed bookings, when removal is attempted, then it is refused with the count shown. ## FR-FLT-06 — Archiving vehicle types [#fr-flt-06--archiving-vehicle-types] An archived type shall not be offered for new trips; existing trips keep their layout. - Given an archived type, when a new trip is created, then it is not offered. # MED — Media and albums (/en/docs/srs/requirements/med) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MED-01 — Album creation window [#fr-med-01--album-creation-window] A photographer shall create albums for a trip only after it is Completed and within 14 days; albums archive 30 days after the window closes (D-267, D-268). - Given an In Progress trip, when an album is created, then it is refused. ## FR-MED-02 — Resumable batch upload [#fr-med-02--resumable-batch-upload] Photos shall upload directly to storage by presigned URL in batches; an interrupted batch resumes without re-uploading finished files. 95 percent of photos finish processing within 5 minutes (D-274). - Given 300 photos interrupted after 120, when resumed, then the 120 are not uploaded again. ## FR-MED-03 — Privacy modes by plan [#fr-med-03--privacy-modes-by-plan] An album shall be public to trip participants, shared by link (Studio, Pro) or for selected users (Pro). - Given a Basic photographer, when privacy options show, then only public is offered. ## FR-MED-04 — Shared links [#fr-med-04--shared-links] A shared link shall use a 32-character token and be revocable; a revoked link returns not found. - Given a revoked link, when opened, then the response is not found. ## FR-MED-05 — Selected-user access [#fr-med-05--selected-user-access] A selected-users album shall be visible only to users on its list. - Given a traveler not on the list, when they open the trip's albums, then the album is not shown. ## FR-MED-06 — Watermarking [#fr-med-06--watermarking] Studio and Pro photographers shall watermark public copies at the bottom right, inset 3 percent of width, 30 percent opacity (D-275). Originals are unchanged. - Given watermarking on, when a traveler views a photo, then the watermarked copy is served. ## FR-MED-07 — Traveler access and download [#fr-med-07--traveler-access-and-download] Signed-in travelers who took the trip shall view allowed albums. Public albums allow download of the watermarked or medium copy. Shared-link and selected-user albums show no download button. Downloads require sign-in and are logged (D-264, D-266). - Given a shared-link album, when opened, then no download button shows. ## FR-MED-08 — Albums per trip by plan [#fr-med-08--albums-per-trip-by-plan] Albums per trip shall not exceed the plan limit (Basic 1, Studio 5, Pro unlimited). - Given a Basic photographer with one album, when creating a second, then it is blocked with an upgrade prompt. # MKT — Markets (/en/docs/srs/requirements/mkt) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MKT-01 — Market configuration [#fr-mkt-01--market-configuration] Admins shall configure each market: currency, payment methods and gateways for bookings and for plans, tax rates and invoice rules, default time zone, commission rate (placeholder 10 percent), plan prices and status (draft, live, paused). - Given the Egypt market, when an admin adds Fawry for bookings, then Egyptian checkouts offer it. ## FR-MKT-02 — Market from country [#fr-mkt-02--market-from-country] An account's market shall come from its registration country; an organization's market decides its trips' currency, methods and tax rules ([BRL-27](/en/docs/brd/requirements#7-business-rules)). Changing an organization's country after approval requires admin action. - Given an organization registered in Egypt, when it creates a trip, then the trip's currency is EGP. ## FR-MKT-03 — Cross-market browsing [#fr-mkt-03--cross-market-browsing] Travelers shall see trips from every live market with prices in each trip's currency, and pay with that market's methods. - Given an Egyptian traveler opens a Saudi trip, when they reach payment, then the Saudi methods and SAR amount are shown. ## FR-MKT-04 — Market switch [#fr-mkt-04--market-switch] Trips in a paused or draft market shall not be publishable; published trips stay bookable unless admins pause bookings too. - Given the UAE market is draft, when a UAE organization publishes, then publishing is refused. ## FR-MKT-05 — Rounding and display [#fr-mkt-05--rounding-and-display] Amounts shall be computed in minor units, rounded half up per line, with totals as the sum of rounded lines (D-157), and displayed with the currency code and Western digits. - Given three lines of 33.335 EGP, when totaled, then each line rounds to 33.34 and the total is 100.02. # MOD — Moderator app (/en/docs/srs/requirements/mod) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MOD-01 — Vehicle-scoped access [#fr-mod-01--vehicle-scoped-access] A moderator shall see and act only on the assigned vehicle. - Given moderator A on vehicle 1 calls check-in for vehicle 2, when processed, then it is refused as forbidden. ## FR-MOD-02 — End-of-trip report [#fr-mod-02--end-of-trip-report] The moderator shall submit a report with the final headcount; a headcount that differs from the checked-in count requires a reason. - Given 47 checked in and 46 entered without a reason, when submitted, then it is refused. ## FR-MOD-03 — Access revocation [#fr-mod-03--access-revocation] Replacing a moderator, or 24 hours after the trip ends, shall end access at once and show an access-ended screen. - Given A is replaced on vehicle 1, when saved, then A's session shows access ended and A's requests are refused. ## FR-MOD-04 — Installable app [#fr-mod-04--installable-app] The moderator app shall be an installable web app that opens to the vehicle view. - Given the app is added to the home screen, when opened, then it opens to the vehicle view. ## FR-MOD-05 — Moderator sign-in [#fr-mod-05--moderator-sign-in] Moderators shall sign in with phone and a staff code. The code is valid until 24 hours after the trip ends, on one device at a time (D-107, D-108). Moderator plan is [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)]. - Given a second device signs in with the same code, when it succeeds, then the first device's session ends. ## FR-MOD-06 — Report lock [#fr-mod-06--report-lock] A submitted report shall be read-only for the moderator; the organization can add a note. - Given a submitted report, when the moderator edits it, then it is refused. # NEG — Deal negotiation (/en/docs/srs/requirements/neg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-NEG-01 — Deal proposal [#fr-neg-01--deal-proposal] Either party shall propose a price for a specific vehicle or trip. - Given an organization proposes for vehicle 2, when saved, then the supplier receives the request with the price. ## FR-NEG-02 — Counter-offers and expiry [#fr-neg-02--counter-offers-and-expiry] Either party shall counter with no round limit. An offer expires 72 hours after the last counter; the deal then ends as Rejected with reason expired ([BRL-26](/en/docs/brd/requirements#7-business-rules)). - Given a supplier counter, when saved, then the state is Countered by Provider and the organization is notified. - Given 72 hours since the last counter with no response, when the job runs, then the deal is Rejected with reason expired. ## FR-NEG-03 — Mutual acceptance [#fr-neg-03--mutual-acceptance] A deal shall be finalized only when both parties accept the same terms. A counter after an acceptance voids that acceptance. - Given the supplier accepted, when the organization counters, then the acceptance is void and the state is Countered by Organization. ## FR-NEG-04 — Rejection [#fr-neg-04--rejection] Either party shall reject a deal. The vehicle slot stays open for another supplier. - Given a rejected deal, when saved, then the organization can start a new deal with a different supplier. ## FR-NEG-05 — Finalization [#fr-neg-05--finalization] A finalized deal shall assign the supplier and record the agreed amount as a deal cost in the ledger, with commission per [OD-15](/en/docs/brd/compliance#11-open-decisions) (placeholder 10 percent). - Given a finalized deal, when saved, then the ledger holds one deal-cost transaction linked to the trip. ## FR-NEG-06 — Deal audit [#fr-neg-06--deal-audit] Every state change and offer shall be recorded and visible to admins. Admins can flag a deal with a reason; a flag can pause it (D-252). - Given a deal with five counters, when an admin opens it, then all five show in order with actor and time. ## FR-NEG-07 — Negotiation by plan [#fr-neg-07--negotiation-by-plan] Organizations shall negotiate with platform suppliers only on Growth and Enterprise. Platform suppliers negotiate on every tier. - Given a Starter organization, when it starts a deal, then it is blocked with an upgrade prompt. # NTF — Notifications (/en/docs/srs/requirements/ntf) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-NTF-01 — Channels by preference [#fr-ntf-01--channels-by-preference] Each notification shall go on the channels the user enabled for its category: email, SMS, WhatsApp, push, in-app. Account security messages cannot be disabled. - Given push is off for promotions, when a promotion is sent, then no push is delivered. ## FR-NTF-02 — Language and layout [#fr-ntf-02--language-and-layout] Notifications shall use the user's language, right to left for Arabic. - Given an Arabic user, when a confirmation email is sent, then it is in Arabic and right to left. ## FR-NTF-03 — Quiet hours [#fr-ntf-03--quiet-hours] SMS and push shall not be sent between 22:00 and 07:00 recipient local time unless urgent (D-289 list). Deferred messages go at 07:00; trip-day events older than 2 hours are dropped (D-290). - Given a non-urgent push due at 22:30, when processed, then it is sent at 07:00. ## FR-NTF-04 — Versioned templates [#fr-ntf-04--versioned-templates] Text shall come from versioned templates by category, channel and language, managed by admins. - Given a template edit, when saved, then new messages use it and sent ones are unchanged. ## FR-NTF-05 — Delivery records and retries [#fr-ntf-05--delivery-records-and-retries] Each delivery shall record its status by channel. Failures retry 3 times with exponential backoff (architecture 13.2). - Given an SMS failure, when recorded, then a retry is scheduled. ## FR-NTF-06 — No duplicate delivery [#fr-ntf-06--no-duplicate-delivery] One event shall produce at most one message per channel per recipient. - Given a duplicated trip-started event, when processed, then each parent gets one push. ## FR-NTF-07 — Trip reminders and change notices [#fr-ntf-07--trip-reminders-and-change-notices] Travelers shall get a reminder 24 hours before departure by push and email, plus SMS if enabled (D-27). Vehicle, driver or time changes are notified within 1 hour (D-186). - Given a trip departing in 24 hours, when the hourly job runs, then each confirmed traveler gets the reminder once. # ONB — Applications and approvals (/en/docs/srs/requirements/onb) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ONB-01 — Application and supplier access [#fr-onb-01--application-and-supplier-access] The platform shall accept applications from organizations, platform drivers and platform photographers. A plan may be chosen at registration with no charge; it is assigned on approval (D-77). Supplier actions are refused until approval. - Given a pending application, when the applicant tries to create a trip or accept a deal, then the action is refused with an approval-pending message. ## FR-ONB-02 — Single admin queue [#fr-onb-02--single-admin-queue] The admin console shall show all applications in one queue with their documents. Admin shall approve, request changes or reject. A rejection requires a reason code (D-234) and a message in the applicant's language. - Given a rejection without a reason, when the admin submits, then it is refused. ## FR-ONB-03 — Decision time target [#fr-onb-03--decision-time-target] The queue shall flag any application pending for more than 2 working days. - Given an application pending for 3 working days, when the queue opens, then it is flagged overdue. ## FR-ONB-04 — Changes requested [#fr-onb-04--changes-requested] The applicant shall have 14 days to respond, with a reminder on day 7 and one 7-day extension on request (D-235). Resubmission returns the application to Pending Review. Without a response, the application closes [OPEN: closure day when the extension is used, [OD-32](/en/docs/brd/compliance#11-open-decisions)]. - Given changes were requested 15 days ago with no extension and no response, when the daily job runs, then the application is Closed. ## FR-ONB-05 — Rejection, appeal and re-application [#fr-onb-05--rejection-appeal-and-re-application] A rejected applicant shall appeal within 14 days of the notice, with a statement and up to 5 files; one appeal per rejection; decided within 5 working days (D-237). Re-application is allowed 30 days after rejection; a closed application counts as rejected. The traveler account stays active. - Given a rejection 12 days ago, when the applicant re-applies, then it is refused and the earliest date is shown. - Given a rejection 15 days ago, when the applicant tries to appeal, then the appeal is refused as out of time. ## FR-ONB-06 — Photographer portfolio minimum [#fr-onb-06--photographer-portfolio-minimum] A photographer application shall require at least 8 portfolio photos (JPEG, PNG or HEIC, 25 MB each, D-81). - Given 7 uploaded photos, when the photographer submits, then submission is refused and the required count is shown. ## FR-ONB-07 — Driver vehicle and insurance details [#fr-onb-07--driver-vehicle-and-insurance-details] A driver using their own vehicle shall give plate, model, year, seat count, registration and insurance valid for at least 3 more months. Documents are PDF, JPG or PNG up to 10 MB (D-80). - Given insurance expiring in 2 months, when the driver submits, then submission is refused with the minimum shown. ## FR-ONB-08 — Lab consent and initial result [#fr-onb-08--lab-consent-and-initial-result] A driver application shall record consent to lab tests ([NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat)) and include an initial lab result dated within the last 30 days. - Given a lab result dated 31 days before submission, when the driver submits, then submission is refused. ## FR-ONB-09 — Applicant status notifications [#fr-onb-09--applicant-status-notifications] Each state change shall notify the applicant in their language on at least one enabled channel. - Given an application moves to Approved, when the state changes, then the applicant is notified in their language. # ORG — Organization tenancy and settings (/en/docs/srs/requirements/org) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ORG-01 — Tenant isolation [#fr-org-01--tenant-isolation] No user outside an organization shall read or change its trips, staff, suppliers, vehicles, coupons, invoices or accounts. Requests for another tenant's records return not found. - Given a user of organization A requests a trip of organization B, when it is processed, then the response is not found with no trip data. ## FR-ORG-02 — Tenant setup on approval [#fr-org-02--tenant-setup-on-approval] Approval shall create the tenant in the applicant's market, assign the plan chosen at registration or Starter by default (D-24, D-77), make the applicant the owner, and send a sign-in invitation. - Given an approved application with no plan chosen, when approval is saved, then the tenant exists on Starter and the owner is invited. ## FR-ORG-03 — Organization-owned drivers and photographers [#fr-org-03--organization-owned-drivers-and-photographers] An organization shall invite its own drivers and photographers by SMS or email (link valid 7 days, D-94). They are visible only to that organization and accepted on assignment without admin approval. Removing one releases their future assignments and notifies operations. - Given organization A onboards a driver, when organization B searches the pool, then the driver is not listed. - Given organization A assigns its own driver, when the assignment is saved, then it is Accepted with no admin step. ## FR-ORG-04 — Fleet registration [#fr-org-04--fleet-registration] An organization shall register vehicles with plate, model, year, vehicle type, seats and registration status. - Given a vehicle with a seat count that differs from its type, when it is saved, then it is refused with the mismatch shown. ## FR-ORG-05 — Seat self-selection setting [#fr-org-05--seat-self-selection-setting] An organization shall enable or disable traveler seat self-selection per trip or as an account default, only on plans that include it. - Given a Starter organization, when it tries to enable self-selection, then the action is blocked with an upgrade prompt. ## FR-ORG-06 — CRM and webhooks [#fr-org-06--crm-and-webhooks] An organization shall connect a CRM and register webhook endpoints for trip published, trip cancelled, booking confirmed, booking cancelled, check-in and check-out events. Deliveries are signed (COM-04), retried 5 times over 24 hours, then the owner is emailed; deliveries can be replayed for 7 days; after a secret rotation the old secret stays valid for 24 hours. No plan gate applies (D-62 to D-64). Endpoint count per plan is [OPEN: D-65]. CRM targets are [OPEN: [OD-18](/en/docs/brd/compliance#11-open-decisions)]. - Given an endpoint subscribed to booking confirmed, when a booking is confirmed, then a signed event with an event ID is delivered. - Given five failed attempts over 24 hours, when the last fails, then the owner is emailed and the delivery shows as failed with a replay option. ## FR-ORG-07 — B2B and B2C invoices [#fr-org-07--b2b-and-b2c-invoices] An organization shall issue invoices for its trips on every plan (D-178). An invoice is B2B when the buyer gave a tax number, otherwise B2C. An issued invoice is never edited; corrections are credit notes referencing the original. If numbering fails, no invoice is issued, the booking stays Confirmed, numbering retries 3 times, then the case goes to finance review (D-179 to D-181). ZATCA e-invoicing is out of scope until [OD-10](/en/docs/brd/compliance#11-open-decisions). - Given a buyer entered a tax number at checkout, when the booking is confirmed, then a B2B invoice is issued and posted to the ledger. - Given an issued invoice needs a correction, when finance corrects it, then a credit note referencing the original number is issued and the original is unchanged. ## FR-ORG-08 — Custom branding [#fr-org-08--custom-branding] Enterprise organizations shall upload a logo and brand colors applied to their public trip pages, emails and invoice PDFs. - Given a Growth organization, when it opens branding settings, then they are locked with an upgrade prompt. # PAR — Parent tracker (/en/docs/srs/requirements/par) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PAR-01 — Linking a child [#fr-par-01--linking-a-child] A parent shall link a child passenger to a booking with a valid booking reference, the child's name as on the booking, and a guardianship declaration recorded as consent (D-126). Invalid or mismatched input is refused with a generic message. - Given a valid reference and matching name, when submitted with the declaration, then the child is linked. - Given an invalid reference, when submitted, then it is refused without revealing booking details. ## FR-PAR-02 — Parent view scope [#fr-par-02--parent-view-scope] A parent shall see only linked children's vehicle, seat, check-in status and programs. - Given two linked children and another passenger on a different booking, when the tracker opens, then only the two children show. ## FR-PAR-03 — Eligibility [#fr-par-03--eligibility] Child tracking shall be available where the parent is on Explorer or VIP and the organization is on Growth or Enterprise with the trip switch on ([OD-05](/en/docs/brd/compliance#11-open-decisions), proposed). Live position shows only while the trip is In Progress (D-317). The blocked state says whether the parent's plan or the organization's setting is the reason; only the plan case offers an upgrade. - Given a Free parent, when linking, then an upgrade prompt shows. - Given the organization is on Starter, when the parent opens the trip, then tracking is unavailable with no upgrade offered. ## FR-PAR-04 — Parent notifications [#fr-par-04--parent-notifications] Parents shall be notified at boarding, trip start, each stop and trip end. - Given trip start, when published, then each linked parent is notified in their language. ## FR-PAR-05 — Child-data restrictions [#fr-par-05--child-data-restrictions] Child data shall not be used for marketing, advertising, analytics events or model training and shall not appear in any marketing export or audience. - Given a marketing audience is built, when generated, then no child-linked record is included. ## FR-PAR-06 — Link ends with the booking [#fr-par-06--link-ends-with-the-booking] A child link shall end when its booking is cancelled or refunded. - Given a refunded booking, when saved, then the parent no longer sees the child's status. ## FR-PAR-07 — Child-safety reporting [#fr-par-07--child-safety-reporting] Parents and organization staff shall report a child-safety concern, creating a case routed to the configured escalation contact [OPEN: contacts and procedure, D-68]. - Given a parent report, when saved, then a case exists and the escalation contact is notified. # PAY — Payments and refunds (/en/docs/srs/requirements/pay) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PAY-01 — Payment outcomes [#fr-pay-01--payment-outcomes] The platform shall record each gateway result with its reference. Success moves the booking to Confirmed and posts to the ledger; failure moves it to Payment Failed. - Given a success callback, when processed, then the booking is Confirmed and one payment transaction exists in the ledger. ## FR-PAY-02 — Idempotent callbacks [#fr-pay-02--idempotent-callbacks] Callbacks shall be verified and processed at most once per gateway event identifier. - Given the same success callback twice, when both are processed, then one payment entry exists. ## FR-PAY-03 — Refund execution [#fr-pay-03--refund-execution] An approved refund shall be sent to the gateway within 2 working days and shown as "refund in progress". It is Refunded only after the gateway confirms; the ledger reverses revenue, commission and fees then. Failed refunds retry 3 times, then stay Refund Pending for finance review (D-149, D-35, D-322). - Given a sent refund not yet confirmed, when the traveler views the booking, then it shows Refund Pending and no reversal is posted. ## FR-PAY-04 — Refunds outside policy [#fr-pay-04--refunds-outside-policy] Refunds outside the policy shall be issued by an admin with a reason recorded in the audit log. - Given an out-of-policy refund, when saved, then reason and admin are audited. ## FR-PAY-05 — Gateway reconciliation [#fr-pay-05--gateway-reconciliation] The platform shall compare gateway settlement reports with the ledger daily and list each difference as an exception (D-29). - Given a gateway payment missing from the ledger, when reconciliation runs, then it is listed as an exception. ## FR-PAY-06 — Subscription charges and dunning [#fr-pay-06--subscription-charges-and-dunning] Plan charges shall run through the gateway's billing product. A failed charge starts dunning ([FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning)) and the grace period ([FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period)). - Given a failed renewal, when the failure is received, then a reminder is sent and grace starts. ## FR-PAY-07 — Payment methods per market [#fr-pay-07--payment-methods-per-market] Checkout shall offer the methods configured for the trip's market: in Egypt, Stripe cards and wallets, Paymob or Tap local cards, and Fawry cash; Gulf methods are confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)). - Given an Egyptian trip, when the traveler reaches payment, then the Fawry cash option is offered. ## FR-PAY-08 — Payment pending [#fr-pay-08--payment-pending] If the gateway does not answer within 30 seconds, the booking shall stay Payment Pending with a "confirming payment" message. The platform checks status at 1, 5 and 10 minutes and escalates to admin at 15 minutes. Seats stay held while pending (D-30, D-201). - Given a gateway timeout, when 15 minutes pass with no result, then the case appears in the admin queue and the traveler is told the payment is being checked. ## FR-PAY-09 — Fawry cash vouchers [#fr-pay-09--fawry-cash-vouchers] Choosing Fawry shall issue a voucher valid 48 hours and hold the seats for that window. An unpaid voucher expires and releases the seats (D-31, D-41). - Given an unpaid voucher at 48 hours, when it expires, then the seats return to Available and the traveler is notified. # PHO — Photographer studio (/en/docs/srs/requirements/pho) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PHO-01 — Portfolio [#fr-pho-01--portfolio] Photographers shall manage the portfolio within the plan allowance (Basic 10, Studio 50, Pro unlimited). - Given 10 images on Basic, when another is uploaded, then it is blocked with an upgrade prompt. ## FR-PHO-02 — Rates and availability [#fr-pho-02--rates-and-availability] Photographers shall set rates and mark available or unavailable dates and ranges (no weekly rules, D-89). Deals for unavailable dates are refused. - Given a date marked unavailable, when an organization proposes a deal for it, then the proposal is refused. ## FR-PHO-03 — Earnings [#fr-pho-03--earnings] Photographers shall see earnings, statements and payouts; commission shows as a ledger line without a printed rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is decided. - Given a payout was made, when earnings open, then it shows with amount and date. ## FR-PHO-04 — Active bookings by plan [#fr-pho-04--active-bookings-by-plan] Bookings per month shall follow the plan (Basic 3, Studio 10, Pro unlimited). - Given 3 bookings this month on Basic, when a fourth deal is finalized, then it is blocked with an upgrade prompt. ## FR-PHO-05 — Photographer coupons [#fr-pho-05--photographer-coupons] Photographers shall create coupons that apply only to bookings where they are assigned. - Given another photographer's booking, when the coupon is applied, then it is refused. ## FR-PHO-06 — Visibility and badge [#fr-pho-06--visibility-and-badge] Profile visibility and the verified badge shall follow the plan; Basic shows no badge. - Given a Basic photographer, when the profile is viewed, then no badge shows. # PRG — Programs (/en/docs/srs/requirements/prg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PRG-01 — Pricing models [#fr-prg-01--pricing-models] Each program shall have exactly one pricing model: free, per person, by quantity, per group or tiered. - Given a program with two pricing models, when saved, then it is refused. ## FR-PRG-02 — Program types [#fr-prg-02--program-types] A program shall be optional, pre-required (auto-included, not removable), capacity-limited or VIP-only. - Given a pre-required program, when a traveler books, then it is included and cannot be removed. - Given a VIP-only program, when a Free or Explorer traveler opens it, then it is locked with an upgrade prompt. ## FR-PRG-03 — Live booking summary [#fr-prg-03--live-booking-summary] The booking summary shall update the total as programs and quantities change, before the next step, including the plan's program discount. - Given a per-person program for two passengers, when added, then the total rises by price times two before the next step. ## FR-PRG-04 — Enrollment report [#fr-prg-04--enrollment-report] An organization shall see per program who chose it, quantities and revenue. No plan gate until [OD-25](/en/docs/brd/compliance#11-open-decisions) is decided. - Given quantities 2 and 3 on one program, when the report opens, then both rows and a total of 5 show. ## FR-PRG-05 — Program capacity [#fr-prg-05--program-capacity] A capacity-limited program shall stop accepting selections at its cap and show as unavailable. - Given a cap of 20 with 20 selections, when a 21st traveler opens it, then it is unavailable. ## FR-PRG-06 — Program count limit [#fr-prg-06--program-count-limit] Programs per trip shall not exceed the plan limit (Starter 3, Growth 15, Enterprise unlimited). - Given a Starter trip with 3 programs, when a fourth is added, then it is blocked with an upgrade prompt. # SEAT — Seats (/en/docs/srs/requirements/seat) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-SEAT-01 — Company-assigned by default [#fr-seat-01--company-assigned-by-default] Every vehicle shall use company-assigned seating unless self-selection is on for the trip. - Given self-selection off, when a traveler books, then no seat picker shows and the booking shows "seat assigned later". ## FR-SEAT-02 — Live seat map [#fr-seat-02--live-seat-map] With self-selection on, the map shall show each seat's state and update within 500 ms when another traveler takes or releases a seat. A list view is available for screen readers. - Given two viewers, when one holds 7A, then the other sees 7A unavailable within 500 ms. ## FR-SEAT-03 — Priority window [#fr-seat-03--priority-window] Explorer and VIP travelers shall get a priority window for seat selection before others [OPEN: window length, D-316, [OD-08](/en/docs/brd/compliance#11-open-decisions)]. - Given the window is open, when a Free traveler opens the map, then selection is disabled until the window closes. ## FR-SEAT-04 — Seat hold [#fr-seat-04--seat-hold] A seat selected at checkout shall be held for 15 minutes and released automatically when the hold expires or payment does not complete. The price is locked when the hold starts (D-192). Fawry cash vouchers hold seats for the voucher window ([FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers)). - Given a hold with no completed payment after 15 minutes, when it expires, then the seat returns to Available. ## FR-SEAT-05 — Seat states [#fr-seat-05--seat-states] Seats shall move only through the states in section 7.3. - Given a Checked In seat, when a change is attempted, then it is refused. ## FR-SEAT-06 — Staff seat assignment [#fr-seat-06--staff-seat-assignment] In company-assigned mode, employees with the operations permission shall assign and reassign seats. A reserved seat cannot be given to a second passenger. - Given 9C reserved for one passenger, when assigned to another, then it is refused as a conflict. ## FR-SEAT-07 — Self-selection by plan [#fr-seat-07--self-selection-by-plan] Self-selection shall be available only on Growth and Enterprise. - Given a Starter organization, when it views the setting, then it is locked with an upgrade prompt. # STF — Staffing (/en/docs/srs/requirements/stf) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-STF-01 — Driver tracks [#fr-stf-01--driver-tracks] Each vehicle shall be driven by an organization-owned driver or by a platform driver through a finalized deal. - Given a vehicle being staffed, when a driver is chosen, then only these two options are offered. ## FR-STF-02 — Photographer tracks [#fr-stf-02--photographer-tracks] A trip's photographer shall be organization-owned or a platform photographer through a finalized deal. - Given a platform photographer is chosen, when the organization proceeds, then a deal starts and no assignment is made until it is finalized. ## FR-STF-03 — Ready gate [#fr-stf-03--ready-gate] A trip shall not move to Ready until every vehicle has a confirmed driver and moderator and every platform deal is finalized. The system lists each gap. - Given vehicle 3 has no moderator, when Ready is requested, then it is refused and vehicle 3 is listed. ## FR-STF-04 — Assignment after finalized deal [#fr-stf-04--assignment-after-finalized-deal] A platform supplier shall be assigned only after both parties accept the same terms. - Given a deal in Countered by Provider, when assignment is attempted, then it is refused. ## FR-STF-05 — Moderator assignment [#fr-stf-05--moderator-assignment] The organization shall assign one moderator per vehicle, with a phone number (D-107). Access is limited to that vehicle on that trip until 24 hours after the trip ends. - Given moderator A on vehicle 1, when A opens the app, then only vehicle 1 shows. ## FR-STF-06 — Deal request visibility [#fr-stf-06--deal-request-visibility] A supplier shall see trip, route, date, vehicle and pay before responding. - Given an open deal request, when the supplier opens it, then those details show before accept or counter is enabled. ## FR-STF-07 — Reassignment deadline [#fr-stf-07--reassignment-deadline] When a supplier drops out or is paused, the organization shall be able to reassign until 24 hours before departure; after that the trip shows "driver needed" and operations is alerted. A staffing-gap email goes out 48 hours before departure (D-185, D-187). - Given a vehicle without a driver 48 hours before departure, when the job runs, then the organization is emailed about the gap. # SUB — Plans and subscriptions (/en/docs/srs/requirements/sub) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-SUB-01 — Plan catalog [#fr-sub-01--plan-catalog] Admins shall define plans per role with limits, features, trial length, and monthly and annual prices per market ([BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt)). Changes apply to new actions at once and are audited. Prices are [OPEN: [OD-26](/en/docs/brd/compliance#11-open-decisions)]; annual discount placeholder 15 percent ([OD-14](/en/docs/brd/compliance#11-open-decisions)). - Given the Starter employee limit changes from 5 to 6, when saved, then it applies at once and the audit log holds old and new values. ## FR-SUB-02 — Feature gates [#fr-sub-02--feature-gates] Every plan-limited action shall be checked on the server, returning the plan-required category with the current plan, the limit and the next tier. Every non-traveler role needs an active plan ([BRL-02](/en/docs/brd/requirements#7-business-rules)). - Given a limit reached, when the action is attempted, then it is blocked and an upgrade prompt shows. ## FR-SUB-03 — Grace period [#fr-sub-03--grace-period] A failed renewal shall start 7 days of grace with features kept and a payment banner. What happens when grace ends is [OPEN: [OD-29](/en/docs/brd/compliance#11-open-decisions)]; until decided, the account drops to the role's basic tier and new bookings or new deals are blocked (D-08). - Given a renewal failed 6 days ago, when the user works, then features are active with a warning. - Given a renewal failed 8 days ago, when the organization publishes a trip, then it is blocked. ## FR-SUB-04 — Upgrade, downgrade and cancellation [#fr-sub-04--upgrade-downgrade-and-cancellation] Upgrades take effect at once with the prorated difference charged. Downgrades take effect at cycle end with no proration and can be cancelled before then (D-219, D-232). Cancellation keeps access to the end of the paid period. Cancelling during grace ends the plan at once with no refund (D-223). - Given a mid-cycle downgrade, when saved, then the current plan stays until cycle end. ## FR-SUB-05 — Admin overrides [#fr-sub-05--admin-overrides] Admins shall grant, revoke or change a plan for one account with a reason and an end date, approved by a second admin. The owner is emailed and the plan reverts at the end date (D-227, D-230). - Given one admin requests a 3-month VIP grant, when a second admin approves, then it applies at once and is audited with its end date. ## FR-SUB-06 — Revenue reporting [#fr-sub-06--revenue-reporting] Admins shall see MRR, churn, upgrades, downgrades and plan distribution by role, plan, market and billing status. - Given last month, when the view opens, then MRR, churn and upgrade counts for that month show. ## FR-SUB-07 — Trials [#fr-sub-07--trials] A plan with a trial shall not charge until the trial ends. A trial-start notice goes on day 0 and reminders 3 days and 1 day before the end (D-231). No charge happens before an application is approved (D-77). - Given a 14-day trial, when the account starts it, then no charge is made until day 15. ## FR-SUB-08 — Dunning [#fr-sub-08--dunning] Failed charges shall retry on days 1, 3, 5 and 7, with an email at each attempt (D-09). - Given a charge fails on day 0, when day 3 arrives, then the second retry runs and an email is sent. ## FR-SUB-09 — Limits after a downgrade [#fr-sub-09--limits-after-a-downgrade] Items above a lower limit shall keep working; no new items can be added until the count is under the limit (D-144). - Given 8 employees after a downgrade to Starter, when the owner invites another, then it is blocked, and the 8 keep access. ## FR-SUB-10 — Counter reset [#fr-sub-10--counter-reset] Monthly usage counters shall reset at 00:00 on the 1st of each month in the owner's time zone (D-218). - Given the 1st at 00:00 Cairo time, when the reset job runs, then the Egyptian organization's trip counter is zero. ## FR-SUB-11 — Plan service failure [#fr-sub-11--plan-service-failure] If the plan service is unavailable, actions that move money or consume a limit shall fail closed; read-only screens stay available (D-224). - Given the plan service is down, when an organization publishes a trip, then publishing is refused with a service-unavailable message. # TRIP — Trips (/en/docs/srs/requirements/trip) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRIP-01 — Trip creation wizard [#fr-trip-01--trip-creation-wizard] The organization shall create a trip through a wizard: basics, schedule and route, vehicles, staffing, programs, seating, pricing and capacity, publishing. Publishing is blocked until required steps are complete. Drafts save automatically. - Given the vehicles step is incomplete, when the organization publishes, then publishing is blocked and the step is named. ## FR-TRIP-02 — Draft, public and targeted publishing [#fr-trip-02--draft-public-and-targeted-publishing] A trip shall be saved as a hidden draft, published publicly, or published to a target list of travelers. - Given a draft, when travelers search, then it is not shown. - Given a targeted trip, when a traveler not on the list browses, then it is not shown. ## FR-TRIP-03 — Multi-vehicle trips [#fr-trip-03--multi-vehicle-trips] A trip shall support several vehicles, each with one vehicle type, one driver and one moderator, up to the plan's vehicle limit. - Given a vehicle with no moderator, when Ready is requested, then it is refused and the vehicle is named. ## FR-TRIP-04 — Program changes until departure [#fr-trip-04--program-changes-until-departure] Programs shall be addable, editable and removable until the trip starts, subject to [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings). - Given the trip has started, when a program is added, then the request is refused. ## FR-TRIP-05 — Trip lifecycle [#fr-trip-05--trip-lifecycle] A trip shall move only through the transitions in section 7.1. A trip In Progress cannot be cancelled (D-25, [OD-22](/en/docs/brd/compliance#11-open-decisions)). - Given a Draft trip, when In Progress is requested, then the transition is refused. ## FR-TRIP-06 — Changes that affect confirmed bookings [#fr-trip-06--changes-that-affect-confirmed-bookings] A change to programs, seat mode, vehicles or times that would break a confirmed booking shall notify each affected traveler and offer remedies (keep with the change, switch option, or cancel with full refund) before it takes effect. The traveler has 7 days to choose; then the case goes to admin (D-148). Vehicle or driver changes are notified within 1 hour (D-186). - Given a confirmed booking includes a program being removed, when the change is confirmed, then the traveler is notified and offered remedies before the removal applies. ## FR-TRIP-07 — Active trip limit [#fr-trip-07--active-trip-limit] Trips created in the current cycle that reach Published through Completed count against the plan's monthly limit (D-143). Beyond the limit, publishing is blocked with an upgrade prompt. - Given a Starter organization with 5 counted trips this month, when it publishes a sixth, then it is blocked with an upgrade prompt. # TRK — Live tracking (/en/docs/srs/requirements/trk) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRK-01 — Live vehicle location [#fr-trk-01--live-vehicle-location] Operations staff with trip access shall see each vehicle's live position, updated within 500 ms of arrival. - Given a new GPS point for vehicle 2, when the map is open, then vehicle 2 moves within 500 ms. ## FR-TRK-02 — Location collection [#fr-trk-02--location-collection] The driver app (or the moderator app as fallback) shall send a point every 5 to 10 seconds only while the trip is In Progress, batching up to 10 points per request and buffering up to 60 minutes offline (D-34, D-121). - Given the trip has not started, when the device is online, then no points are sent. ## FR-TRK-03 — Passenger vehicle view [#fr-trk-03--passenger-vehicle-view] Operations shall see which vehicle each checked-in passenger is in. - Given P checked in to vehicle 2 and not out, when operations looks up P, then vehicle 2 shows. ## FR-TRK-04 — Per-trip child tracking switch [#fr-trk-04--per-trip-child-tracking-switch] Parent live tracking shall be available only where the trip's child tracking switch is on ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)). - Given the switch is off, when a parent opens the tracker, then no live position shows. ## FR-TRK-05 — Tracking data scope [#fr-trk-05--tracking-data-scope] Positions and passenger movement shall be visible only to the owning organization's staff with operations access, admins, and eligible linked parents. - Given another organization's user requests positions, when processed, then the response is not found. ## FR-TRK-06 — End of tracking [#fr-trk-06--end-of-tracking] When the trip is marked ended, collection shall stop and an end event go to linked parents and operations. - Given the trip is ended, when a new point arrives, then it is rejected. ## FR-TRK-07 — No live position for travelers [#fr-trk-07--no-live-position-for-travelers] Travelers shall never see a vehicle's live position or ETA; their trip-day view shows the vehicle, seat, check-in status and the schedule (D-317). - Given a traveler on an In Progress trip, when they open trip day, then no map position or distance is shown. # TRV — Traveler profile and history (/en/docs/srs/requirements/trv) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRV-01 — Profile and preferences [#fr-trv-01--profile-and-preferences] Travelers shall manage profile, language and notification preferences; a language change applies at once. - Given a switch to Arabic, when saved, then the interface and later notifications are in Arabic. ## FR-TRV-02 — Trip visibility and early access [#fr-trv-02--trip-visibility-and-early-access] Travelers shall see public trips and trips targeted to them. VIP travelers see trips during the early-access window before others [OPEN: window, D-146, [OD-09](/en/docs/brd/compliance#11-open-decisions)]. - Given an early-access window, when a Free traveler browses, then the trip is hidden until the window closes. ## FR-TRV-03 — History and receipts by plan [#fr-trv-03--history-and-receipts-by-plan] History and receipts shall follow the plan: basic (12 months, proposed) on Free, full on Explorer, full with export on VIP. - Given a Free traveler, when a receipt opens, then export is not offered. ## FR-TRV-04 — Program discounts [#fr-trv-04--program-discounts] Explorer travelers get 5 percent and VIP 10 percent off program prices; base trip prices are not discounted. - Given VIP and a program of 200 EGP, when the summary shows, then the line is 180 EGP. ## FR-TRV-05 — Plan changes [#fr-trv-05--plan-changes] Traveler upgrades take effect at once with proration; downgrades at cycle end. Plans are paid on the gateway's browser page, not by in-app purchase. - Given an Explorer downgrade mid-cycle, when saved, then benefits stay to cycle end. ## FR-TRV-06 — Supplier application keeps traveler access [#fr-trv-06--supplier-application-keeps-traveler-access] A traveler shall apply for a supplier role while keeping full traveler access, pending or after rejection. - Given a pending photographer application, when the traveler browses, then booking still works. ## FR-TRV-07 — Data copy and deletion [#fr-trv-07--data-copy-and-deletion] Travelers shall request a copy of their data (delivered within 30 days of verification, D-162) and account deletion ([FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period)). - Given a data-copy request, when saved, then it shows in the admin queue with a due date 30 days out. # State Machines (/en/docs/srs/state-machines) Transitions not listed are refused. Guards marked (proposed) need product confirmation. ### 7.1 Trip lifecycle [#71-trip-lifecycle] States: Draft, Published, Negotiating, Ready, Filling Up, Sold Out, In Progress, Partially Completed, Completed, Post-Processing, Archived, Cancelled, Refunds Issued. | From | Event | Guard | To | |---|---|---|---| | (none) | Organization creates a trip | Active plan; market live | Draft | | Draft | Publish publicly or to targets | Wizard complete; active-trip limit not reached | Published | | Published | A platform deal is started | At least one slot staffed through a platform supplier | Negotiating | | Negotiating | Last platform deal finalized | Every vehicle has driver and moderator ([BRL-07](/en/docs/brd/requirements#7-business-rules)) | Ready | | Published | Last vehicle staffed with own staff | [BRL-07](/en/docs/brd/requirements#7-business-rules) | Ready | | Published, Negotiating or Ready | Reserved seats reach 80 percent of capacity | D-189 | Filling Up | | Filling Up | Every vehicle full | | Sold Out | | Sold Out | A seat is released | | Filling Up | | Filling Up | Reserved seats fall below 80 percent | (proposed) | Ready, or Published if not yet Ready | | Ready, Filling Up or Sold Out | First vehicle departs | Trip start time reached; trip is Ready ([BRL-07](/en/docs/brd/requirements#7-business-rules)) | In Progress | | In Progress | Cancellation requested | Not allowed (D-25); incident flow only | In Progress | | In Progress | Some vehicles ended | At least one ended, others running | Partially Completed | | In Progress or Partially Completed | Last vehicle ended | Every trip report submitted | Completed | | Completed | Settlement opens | Automatic | Post-Processing | | Post-Processing | Archive job | 30 days after Completed and settlement closed ([BRL-25](/en/docs/brd/requirements#7-business-rules)) | Archived | | Draft through Sold Out | Organization or admin cancels | Reason recorded; full refunds queued ([BRL-30](/en/docs/brd/requirements#7-business-rules)) | Cancelled | | Cancelled | All refunds confirmed | Every confirmed booking Refunded | Refunds Issued | | Refunds Issued | Archive job | 30 days later | Archived | ### 7.2 Booking [#72-booking] States: Cart, Seats Held, Payment Pending, Confirmed, Payment Failed, Checked In, Checked Out, Cancelled, Refund Pending, Refunded. | From | Event | Guard | To | |---|---|---|---| | (none) | Traveler starts a booking | Trip bookable; traveler not in deletion grace | Cart | | Cart | Seats selected or capacity reserved (company-assigned) | Seats free; hold starts; price locked | Seats Held | | Seats Held | Proceed to payment | Hold active; attempts under 3 | Payment Pending | | Seats Held | Hold expires | 15 minutes | Cart (cart kept, D-191) | | Payment Pending | Gateway success | Callback verified | Confirmed | | Payment Pending | Gateway failure | | Payment Failed | | Payment Pending | No answer in 30 s | | Payment Pending (checks at 1, 5, 10 min; admin at 15, D-30) | | Payment Pending (Fawry) | Voucher unpaid at 48 h | D-31 | Cart | | Payment Failed | Retry | Hold active; attempts under 3 (D-197) | Payment Pending | | Payment Failed | Hold expires | | Cart | | Confirmed | Moderator checks passenger in | Vehicle match | Checked In | | Checked In | Check-out at a stop or destination | | Checked Out | | Checked Out | Re-boards at a stop | Same vehicle (proposed) | Checked In | | Confirmed | Traveler cancels | Before departure; [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancelled | | Confirmed | Organization cancels trip | [BRL-30](/en/docs/brd/requirements#7-business-rules) | Cancelled | | Cancelled | Refund sent | Amount above zero | Refund Pending | | Cancelled | No refund due | Under 24 hours | Cancelled (final) | | Refund Pending | Gateway confirms | | Refunded | ### 7.3 Seat [#73-seat] States: Available, Held, Reserved, Checked In, Checked Out, Released. | From | Event | Guard | To | |---|---|---|---| | Available | Selected at checkout | Self-selection on, or staff assignment | Held | | Held | Payment succeeds | Booking Confirmed | Reserved | | Held | Hold or voucher expires | [BRL-08](/en/docs/brd/requirements#7-business-rules) | Available | | Reserved | Passenger checks in | Vehicle match | Checked In | | Checked In | Passenger checks out | | Checked Out | | Checked Out | Passenger re-boards | (proposed) | Checked In | | Reserved | Booking cancelled before departure | | Released | | Released | Seat re-offered | Trip still bookable | Available | ### 7.4 Deal [#74-deal] States: Proposed, Countered by Provider, Countered by Organization, Accepted by One Side, Finalized, Rejected. | From | Event | Guard | To | |---|---|---|---| | (none) | Organization or supplier proposes | Slot open; supplier available; plan allows | Proposed | | Proposed or Countered by Organization | Supplier counters | | Countered by Provider | | Proposed or Countered by Provider | Organization counters | | Countered by Organization | | Any open state | One party accepts current terms | | Accepted by One Side | | Accepted by One Side | Other party accepts | Terms unchanged | Finalized | | Accepted by One Side | Other party counters | First acceptance void | Countered by that party | | Any open state | Either party rejects | | Rejected (reason rejected) | | Any open state | 72 hours since last counter | [BRL-26](/en/docs/brd/requirements#7-business-rules) | Rejected (reason expired) | | Any open state | Supplier paused for lab test | [BRL-17](/en/docs/brd/requirements#7-business-rules) | Rejected (reason provider paused) | | Any open state | Trip cancelled | | Rejected (reason trip cancelled) | ### 7.5 Application [#75-application] States: Draft, Submitted, Pending Review, Changes Requested, Approved, Rejected, Appealed, Closed. | From | Event | Guard | To | |---|---|---|---| | Draft | Applicant submits | Contacts verified per role; required documents present | Submitted | | Submitted | Enters queue | Automatic | Pending Review | | Pending Review | Approve | | Approved (plan assigned, tenant or profile created) | | Pending Review | Request changes | Items and message recorded | Changes Requested | | Pending Review | Reject | Reason code recorded | Rejected | | Changes Requested | Resubmit | Within 14 days, or 21 with extension | Pending Review | | Changes Requested | No response by the due date | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Closed | | Rejected or Closed | Appeal | Within 14 days; one per rejection | Appealed | | Appealed | Appeal upheld | Within 5 working days | Approved | | Appealed | Appeal refused | | Rejected (final) | | Rejected or Closed | Re-apply | 30 days after decision | Submitted (new application) | ### 7.6 Subscription [#76-subscription] States: Trial, Active, Grace, Downgraded, Cancelling, Ended. | From | Event | Guard | To | |---|---|---|---| | (none) | Plan starts | Trial configured, or payment taken; application approved | Trial or Active | | Trial | Trial ends, payment succeeds | | Active | | Trial | Trial ends, payment fails | | Grace | | Active | Renewal fails | | Grace | | Grace | Payment succeeds | Retries on days 1, 3, 5, 7 | Active | | Grace | 7 days pass | [OD-29](/en/docs/brd/compliance#11-open-decisions) (current rule D-08) | Downgraded | | Grace | Owner cancels | No refund (D-223) | Ended | | Downgraded | Payment succeeds | | Active | | Active | Upgrade | Payment succeeds | Active (new plan at once) | | Active | Downgrade | Effective at period end | Active (downgrade scheduled) | | Active | Cancel | | Cancelling | | Cancelling | Period ends | | Ended | | Any | Admin override | Second admin; end date | Active on the override plan; reverts at end date | ### 7.7 Coupon [#77-coupon] States: Draft, Active, Paused, Expired, Exhausted, Revoked. | From | Event | Guard | To | |---|---|---|---| | (none) | Created | Scope valid; plan count not reached | Draft | | Draft | Activated or start time reached | | Active | | Active | Paused by creator | | Paused | | Paused | Resumed | Window still open | Active | | Active or Paused | End time passes | | Expired | | Active | Usage limit reached | | Exhausted | | Exhausted | A redemption is reversed | Window open | Active | | Draft, Active, Paused or Exhausted | Revoked by creator or admin | | Revoked | ### 7.8 Lab test [#78-lab-test] States: Requested, Pending, Result Uploaded, Passed, Failed, Missed. | From | Event | Guard | To | |---|---|---|---| | (none) | Admin requests | Approved driver | Requested | | Requested | Driver notified and paused | [BRL-17](/en/docs/brd/requirements#7-business-rules) | Pending (deadline 1 to 7 days, default 3) | | Pending | Result received from lab or uploaded | Before deadline | Result Uploaded | | Pending | Deadline passes | | Missed (driver suspended) | | Missed | Late result received | Reviewed within 2 working days | Result Uploaded | | Result Uploaded | Admin passes | | Passed (driver unpaused; early lift from suspension needs a second admin) | | Result Uploaded | Admin fails | | Failed (driver stays paused; second failure in 12 months closes the account) | | Missed | Suspension exceeds 30 days | [BRL-16](/en/docs/brd/requirements#7-business-rules) | Account closed | ### 7.9 Settlement [#79-settlement] States: Open, Awaiting Payouts, Disputed, Closed. | From | Event | Guard | To | |---|---|---|---| | (none) | Trip Completed | | Open (lines computed from the ledger) | | Open | Payout instructions created | | Awaiting Payouts | | Open or Awaiting Payouts | Dispute opened on the trip | | Disputed | | Disputed | Dispute closed | Adjustment lines posted | Awaiting Payouts | | Awaiting Payouts | Every line paid | No open dispute (D-174) | Closed | ### 7.10 Dispute [#710-dispute] States: Open, Information Requested, Under Review, Resolved, Closed. | From | Event | Guard | To | |---|---|---|---| | (none) | Party raises a dispute | Booking, payment or deal reference | Open | | Open | Admin acknowledges | Within 2 working days | Under Review | | Under Review | Admin requests information | | Information Requested | | Information Requested | Party responds | Within 5 working days | Under Review | | Under Review | Outcome recorded | Within 10 working days of opening | Resolved | | Resolved | No appeal within 7 days (proposed) | | Closed | # Traceability & Open Items (/en/docs/srs/traceability) ## 10. Traceability matrix [#10-traceability-matrix] Generated from the Source line of each functional requirement in section 5 and the BR and BRL tables in [BRD](/en/docs/brd) v1.1. ### 10.1 Business requirements to functional requirements [#101-business-requirements-to-functional-requirements] | Business requirement | BRD priority | Phase | Functional requirements | |---|---|---|---| | [BR-AUTH-01](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) | | [BR-AUTH-02](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | | [BR-AUTH-04](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in), [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | | [BR-AUTH-05](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | | [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) | | [BR-AUTH-07](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | | [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P5 | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | | [BR-ONB-01](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 (organizations), P4 (suppliers) | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) | | [BR-ONB-02](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | | [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) | | [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | | [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | | [BR-ONB-06](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum), [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) | | [BR-ONB-07](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) | | [BR-ONB-08](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | | [BR-ONB-09](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | | [BR-ORG-01](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) | | [BR-ORG-02](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets), [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan), [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope), [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) | | [BR-ORG-03](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | | [BR-ORG-04](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P2 | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) | | [BR-ORG-05](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P3 | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | [BR-ORG-06](/en/docs/brd/requirements#63-organizations-and-employees-org) | S | P6 | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | | [BR-ORG-07](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P5 | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) | | [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org) | C | P6 | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) | | [BR-TRIP-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) | | [BR-TRIP-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing), [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | | [BR-TRIP-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) | | [BR-TRIP-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | | [BR-PRG-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models), [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) | | [BR-PRG-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types), [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) | | [BR-PRG-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary), [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | | [BR-FLT-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry), [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) | | [BR-STF-01](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P3 | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | | [BR-STF-02](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) | | [BR-STF-03](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal), [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry), [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance), [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) | | [BR-STF-04](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | | [BR-STF-05](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P3 | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | | [BR-STF-06](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility), [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses), [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) | | [BR-SEAT-01](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default), [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | [BR-SEAT-02](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | | [BR-SEAT-03](/en/docs/brd/requirements#66-seats-seat) | S | P3 | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | | [BR-SEAT-04](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | | [BR-BKG-01](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) | | [BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff), [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | | [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | | [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | [BR-BKG-05](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | | [BR-CPN-01](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls), [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons), [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) | | [BR-CPN-02](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) | | [BR-CPN-03](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation), [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) | | [BR-CPN-04](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | | [BR-CHK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding), [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | | [BR-CHK-02](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) | | [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states), [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) | | [BR-CHK-04](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment), [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | | [BR-CHK-05](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | S | P3 | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting), [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) | | [BR-MOD-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | | [BR-TRK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P6 | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy), [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) | | [BR-PAR-01](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope), [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions), [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | | [BR-PAR-02](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | | [BR-PAR-03](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking), [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) | | [BR-PAR-04](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch), [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) | | [BR-MED-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | | [BR-MED-02](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan), [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links), [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) | | [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | S | P4 | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) | | [BR-MED-04](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) | | [BR-PHO-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio), [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability), [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | | [BR-NTF-01](/en/docs/brd/requirements#612-notifications-ntf) | M | P1 | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications), [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications), [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | | [BR-NTF-02](/en/docs/brd/requirements#612-notifications-ntf) | M | P1 | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | | [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf) | S | P3 | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | | [BR-SUB-01](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | | [BR-SUB-02](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan), [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan), [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge), [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | | [BR-SUB-03](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) | | [BR-SUB-04](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | | [BR-SUB-05](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) | | [BR-ACC-01](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) | | [BR-ACC-02](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit), [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) | | [BR-ACC-03](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P4 | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings), [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) | | [BR-ACC-04](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) | | [BR-ACC-05](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P2 | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger), [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports), [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) | | [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P4 | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | | [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | [BR-ADM-01](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | | [BR-ADM-02](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | | [BR-ADM-03](/en/docs/brd/requirements#615-platform-administration-adm) | M | P4 | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation), [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) | | [BR-ADM-04](/en/docs/brd/requirements#615-platform-administration-adm) | M | P3 | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | | [BR-ADM-05](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | | [BR-ADM-06](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm) | M | P3 | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) | | [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt) | M | P2 | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration), [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | | [BR-MKT-02](/en/docs/brd/requirements#616-markets-mkt) | M | P2 | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | | [BR-MKT-03](/en/docs/brd/requirements#616-markets-mkt) | M | P5 | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) | | [BR-MKT-04](/en/docs/brd/requirements#616-markets-mkt) | S | P5 | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) | | [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl) | M | P6 | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | | [BR-ANL-02](/en/docs/brd/requirements#617-analytics-anl) | S | P6 | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) | | [BR-ANL-03](/en/docs/brd/requirements#617-analytics-anl) | M | P6 | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) | | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl) | S | P6 | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) | | [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) | C | P6 | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) | ### 10.2 Business rules to functional requirements [#102-business-rules-to-functional-requirements] | Business rule | Rule (shortened) | Functional requirements | |---|---|---| | [BRL-01](/en/docs/brd/requirements#7-business-rules) | Trip records are tenant-isolated. Only the owning organization's staff, the platform admin, and the people... | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation), [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope), [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | | [BRL-02](/en/docs/brd/requirements#7-business-rules) | Every non-traveler role must hold an active plan to use the app. A traveler can always use the app for free. | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) | | [BRL-03](/en/docs/brd/requirements#7-business-rules) | A coupon applies only inside its creator's scope: admin to any trip; organization to its own trips; driver... | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection), [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) | | [BRL-04](/en/docs/brd/requirements#7-business-rules) | A platform driver or photographer is assigned only after a finalized deal accepted by both parties. | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal), [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) | | [BRL-05](/en/docs/brd/requirements#7-business-rules) | An organization-owned driver or photographer is accepted on assignment and is never visible to other... | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) | | [BRL-06](/en/docs/brd/requirements#7-business-rules) | A rejected supplier or organization application can be re-submitted after 30 days. A closed application... | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | | [BRL-07](/en/docs/brd/requirements#7-business-rules) | A trip cannot move to Ready until every vehicle has a driver and a moderator and every platform deal is... | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) | | [BRL-08](/en/docs/brd/requirements#7-business-rules) | A seat hold lasts 15 minutes and is released automatically when it expires. Exception: a Fawry cash... | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | | [BRL-09](/en/docs/brd/requirements#7-business-rules) | A moderator can check a passenger in only to the vehicle assigned to that passenger on that trip. | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | | [BRL-10](/en/docs/brd/requirements#7-business-rules) | Parents see data only for children linked to their own bookings. | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope), [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions), [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | | [BRL-11](/en/docs/brd/requirements#7-business-rules) | A refund reverses the coupon redemption and frees the traveler's per-user limit. | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | | [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancellation refund depends on time before departure: 80 percent at 48 hours or more, 50 percent from 24... | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) | | [BRL-13](/en/docs/brd/requirements#7-business-rules) | A plan upgrade takes effect at once with proration; a downgrade takes effect at the end of the cycle. | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) | | [BRL-14](/en/docs/brd/requirements#7-business-rules) | A failed renewal starts a 7-day grace period with features kept. | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | | [BRL-15](/en/docs/brd/requirements#7-business-rules) | Account deletion becomes permanent after a 30-day grace period. Trip records are kept 5 years after... | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | | [BRL-16](/en/docs/brd/requirements#7-business-rules) | A lab test has a deadline of 3 days from request (admin may set 1 to 7 days, D-21). A missed deadline... | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) | | [BRL-17](/en/docs/brd/requirements#7-business-rules) | A driver whose lab test is requested is paused at once. Upcoming trips return to their organizers.... | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) | | [BRL-18](/en/docs/brd/requirements#7-business-rules) | Every financial event (booking, refund, coupon, subscription charge, payout, deal cost, commission,... | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit), [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger), [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) | | [BRL-19](/en/docs/brd/requirements#7-business-rules) | Every admin action and every permission change is written to an immutable audit log. | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | | [BRL-20](/en/docs/brd/requirements#7-business-rules) | Verification codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. A... | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | | [BRL-21](/en/docs/brd/requirements#7-business-rules) | Accounts lock for 15 minutes after 5 failed sign-in attempts (all roles, D-53). | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | | [BRL-22](/en/docs/brd/requirements#7-business-rules) | Web sessions end after 12 hours of use. Drafts are kept. | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) | | [BRL-23](/en/docs/brd/requirements#7-business-rules) | Every registration form records the applicant's country. | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | | [BRL-24](/en/docs/brd/requirements#7-business-rules) | A trip's programs, seat mode or vehicles cannot be changed in a way that breaks a confirmed booking until... | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | | [BRL-25](/en/docs/brd/requirements#7-business-rules) | A trip is archived 30 days after Completed, and only once its settlement is closed (D-26). | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | | [BRL-26](/en/docs/brd/requirements#7-business-rules) | A deal offer expires 72 hours after the last counter-offer and the deal ends as Rejected with reason... | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) | | [BRL-27](/en/docs/brd/requirements#7-business-rules) | Market values (currency, payment methods, tax and invoicing rules, default time zone) follow the country:... | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form), [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | | [BRL-28](/en/docs/brd/requirements#7-business-rules) | An invoice is B2B when the buyer gives a tax number, otherwise B2C (D-180). An issued invoice is never... | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | [BRL-29](/en/docs/brd/requirements#7-business-rules) | Travelers never see a vehicle's live position. Only operations staff of the owning organization, the... | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope), [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) | | [BRL-30](/en/docs/brd/requirements#7-business-rules) | When an organization cancels a trip, every confirmed booking is refunded in full and coupon redemptions... | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | ## 11. Open items and conflicts [#11-open-items-and-conflicts] ### 11.1 Open items that still affect requirements [#111-open-items-that-still-affect-requirements] | Ref | Open item | Affects | Owner | |---|---|---|---| | [OD-05](/en/docs/brd/compliance#11-open-decisions) | Confirm child tracking eligibility ("and" as drafted) | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility), [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | Product | | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Plan for moderators | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in); section 3.3 | Product | | [OD-07](/en/docs/brd/compliance#11-open-decisions) | Confirm refund table 80/50/0 and non-refundable fees | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | Operations | | [OD-08](/en/docs/brd/compliance#11-open-decisions) | Priority seat window length (D-316) | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | Product | | [OD-09](/en/docs/brd/compliance#11-open-decisions) | VIP early-access window (D-146) | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | Product | | [OD-10](/en/docs/brd/compliance#11-open-decisions) | ZATCA e-invoicing scope | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties), [NFR-COM-07](/en/docs/srs/quality#810-compliance-nfr-com) | Finance | | [OD-11](/en/docs/brd/compliance#11-open-decisions) | Gulf payment methods and gateways | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Engineering | | [OD-14](/en/docs/brd/compliance#11-open-decisions) | Annual discount (placeholder 15 percent) | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) | Finance | | [OD-15](/en/docs/brd/compliance#11-open-decisions) | Commission rates (placeholder 10 percent) | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip), [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | Finance | | [OD-16](/en/docs/brd/compliance#11-open-decisions) | Automated business registry check | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | Operations | | [OD-18](/en/docs/brd/compliance#11-open-decisions) | CRM targets | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Product | | [OD-19](/en/docs/brd/compliance#11-open-decisions) | Organization plan covering own drivers and photographers; allowance per plan (D-97) | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | Product | | [OD-25](/en/docs/brd/compliance#11-open-decisions) | Plan gate on enrollment report | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | Product | | [OD-26](/en/docs/brd/compliance#11-open-decisions) | Plan prices per role and market | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Finance | | [OD-27](/en/docs/brd/compliance#11-open-decisions) | VAT rate per market | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Finance | | [OD-28](/en/docs/brd/compliance#11-open-decisions) | Trial lengths | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | Finance | | [OD-29](/en/docs/brd/compliance#11-open-decisions) | What happens when grace ends (downgrade vs lockout) | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period); section 7.6 | Product | | [OD-30](/en/docs/brd/compliance#11-open-decisions) | Webhook endpoints per plan (D-65) | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Product | | [OD-31](/en/docs/brd/compliance#11-open-decisions) | Deal fee when cancelled after assignment (D-278) | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | Finance | | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Changes-requested closure day when extension used | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested); section 7.5 | Product | | D-68 | Child-safety escalation contacts and procedure | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting), [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) | Operations | | D-216 | Coupon abuse thresholds | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | Product | | D-314 | SRS and BRD approvers | Section 1 | Product | | BRD 8.2 | Legal review per market for lab tests; document and lab-result retention | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result); 6.4 | Legal | | [OD-04](/en/docs/brd/compliance#11-open-decisions) | Financial retention 7 years, pending legal review | 6.4 | Legal | | [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Hosting region against Egyptian residency rules | 3.4 | Engineering | | CON-05 | Confirm recommended stack (T-FND-01) | All | Engineering | | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Rate limits for drivers, photographers and parents | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Engineering | | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Test coverage target | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Engineering | | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Hot log search window | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Engineering | | 3.4 | Supported browser and OS versions | 3.4 | Product | | 6.4 | Retention of notification delivery logs and rejected applications | 6.4 | Legal | | D-289 | Confirm the urgent notification list | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | Product | | Proposed | Re-boarding after check-out at a stop | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops); 7.2, 7.3 | Operations | | Proposed | Traveler sign-in offers both password and code | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) | Product | | Proposed | Platform issues deal invoices on the supplier's behalf | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | Finance | | Proposed | Free-plan history depth 12 months | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | Product | ### 11.2 Items closed in v1.1 [#112-items-closed-in-v11] | Item (v1.0 reference) | Resolution | Source | |---|---|---| | Traveler verification and uniqueness | Travelers verify one contact; suppliers and owners both | D-20 | | Appeal window | 14 days; 5 files; 5 working days; one per rejection | D-237 | | Negotiation expiry ([OD-13](/en/docs/brd/compliance#11-open-decisions)) | 72 hours after last counter; no round limit | D-14 | | Cart after hold expiry | Cart kept; seats re-checked; new hold if free | D-191 | | Payment attempts | 3 per hold | D-197 | | Definition of active trips | Created this cycle and Published through Completed | D-143 | | Coupon count basis | Active and paused | D-203 | | Total usage restored on refund | Yes, usage count decrements | Architecture 10.6 | | Webhook retry and alerts | 5 retries over 24 h, owner emailed, 7-day replay, no plan gate | D-62 to D-64 | | Invoice plan gate and numbering failure | All plans; retry 3 times then finance review | D-178, D-179 | | Settlement rules | Open on Completed; close when paid and no dispute | D-174 | | Payout schedule | Weekly, Monday 06:00 | D-28 | | Default tiers ([OD-21](/en/docs/brd/compliance#11-open-decisions)) | Organization Starter; suppliers Basic; plan chosen without charge | D-24, D-77, D-78 | | Admin roles and invite | Super admin, Operations, Finance; 72 h link | D-49, D-50 | | Moderator sign-in | Phone plus staff code valid to trip end plus 24 h, one device | D-107, D-108 | | Parent tracker surface | Section of the traveler app | D-124 | | Offline check-in scope | 1,000 events; retry every 30 s | D-117 | | Incident categories | Six categories | D-331 | | Dispute SLA and types | 2 / 10 working days; six types | D-32, D-254 | | Notification retries | 3 with exponential backoff | Architecture 13.2 | | Data copy response time | 30 days | D-162 | | Default organization time zone | Market main zone | D-282 | | Digits | Western digits | D-159 | | Maintenance windows | 01:00 to 03:00 Cairo, 4 h per month, 72 h notice | D-303 | | Paging | 20 default, 100 maximum | D-308 | | Deprecation notice | 90 days | Architecture 7.6 | | Capacity stages | Stage 1 values plus architecture stages | D-304; architecture 19.3 | | Backups and DR drills | As [NFR-BKP-03](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) and [NFR-BKP-04](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Architecture 22 | | Alert tools | PagerDuty, Slack, email digest | Architecture 16.3 | | Lab deadline (C-05) | 3 days, admin 1 to 7, now in [BRL-16](/en/docs/brd/requirements#7-business-rules) | D-21 | | Retention of GPS, check-in, child history | 90 days, 1 year, 1 year | Architecture 18.4; D-45; D-135 | | Launch currencies | EGP in P2; SAR and AED in P5 | D-69, D-158 | ### 11.3 Source conflicts [#113-source-conflicts] | # | Conflict | Sources | Resolution in this SRS | |---|---|---|---| | C-01 | Own-driver plan: full BRD context says own drivers are not subject to plans; [BRL-02](/en/docs/brd/requirements#7-business-rules) says every non-traveler needs a plan. | BRD context section 9; [BRL-02](/en/docs/brd/requirements#7-business-rules) | Organization's plan covers them ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed). | | C-02 | Out-of-scope coupon: "silently reject" vs "clear error". | BRD context 3A, 3E | Generic "not applicable" message ([OD-20](/en/docs/brd/compliance#11-open-decisions)). Closed. | | C-03 | Traveler verification. | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth); flow 01 | D-20 applied. Closed. | | C-04 | Enrollment report plan gate. | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt); flow 02 | No gate until [OD-25](/en/docs/brd/compliance#11-open-decisions). | | C-05 | Lab deadline missing from [BRL-16](/en/docs/brd/requirements#7-business-rules). | Auth rules; [BRL-16](/en/docs/brd/requirements#7-business-rules) | [BRL-16](/en/docs/brd/requirements#7-business-rules) updated. Closed. | | C-06 | Architecture not reviewed. | v1.0 | Reviewed. Closed. | | C-07 | User-flows 03 to 08 missing. | v1.0 | Written in v1.1. Closed. | | C-08 | After grace: register says downgrade and block new bookings (D-08); [BRL-02](/en/docs/brd/requirements#7-business-rules) implies lockout; design canvas shows lockout. | D-08; [BRL-02](/en/docs/brd/requirements#7-business-rules); canvas | Downgrade applied until [OD-29](/en/docs/brd/compliance#11-open-decisions) is decided. | | C-09 | Organization-cancelled trip refund: v1.0 used the traveler policy; D-150 says full refund. | SRS v1.0; D-150 | Full refund ([BRL-30](/en/docs/brd/requirements#7-business-rules)). Closed. | | C-10 | Check-in event retention: v1.0 kept 7 years as audit; register and architecture say 1 year. | SRS v1.0; D-45; architecture 18.4 | 1 year; admin actions stay 7 years in the audit log. Closed. | | C-11 | Filling Up trigger: v1.0 "first booking"; register 80 percent. | SRS v1.0; D-189 | 80 percent. Closed. | | C-12 | Lockout scope: [BRL-21](/en/docs/brd/requirements#7-business-rules) admin only; register all roles. | [BRL-21](/en/docs/brd/requirements#7-business-rules) v1.0; D-53 | All roles; [BRL-21](/en/docs/brd/requirements#7-business-rules) updated. Closed. | | C-13 | Design canvas is Saudi-first in SAR with ZATCA, HyperPay, monthly payouts, 72-hour free cancellation, 48-hour deal expiry, traveler live ETA, Face ID. | claude/design-value-conflicts.md | This SRS follows the decisions; the canvas must be relabeled as a P5 Saudi view or corrected before P2 build. | | C-14 | Photographer studio: architecture lists separate role apps; register makes the studio responsive web in phase 1. | Architecture 3.1; D-86 | Responsive web first; mobile studio follows. | # Admin Console (/en/docs/user-flows/admin) Surface: admin.trips-enjoy.com, staff only. Roles: Super admin, Operations, Finance (D-49). ## Registration [#registration] There is no public registration. A Super admin invites a new admin by email with a role; the link is valid 72 hours (D-50). The new admin sets a password (12+ characters) and enrolls an authenticator before the console opens. ## Approval [#approval] The inviting Super admin is the approver. Role changes and removals are audited. ## Role permissions [#role-permissions] | Area | Super admin | Operations | Finance | |---|---|---|---| | Applications, appeals | Yes | Yes | View | | Accounts (suspend, reinstate, reset) | Yes | Yes | View | | Lab tests | Yes | Yes | No | | Disputes | Yes | Yes | Refund decisions | | Plans, prices, overrides | Yes | View | Yes | | Coupons, abuse flags | Yes | Yes | View | | Payouts, settlements, reconciliation | Yes | View | Yes | | Markets, templates, feature flags | Yes | Templates | Markets (tax, prices) | | Admin staff | Yes | No | No | | Audit log | Yes | View | View | ## Flows [#flows] ### UF-ADM-01. Sign in [#uf-adm-01-sign-in] Email and password, then the authenticator code. 5 failures lock the account for 15 minutes. Rules: [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout). ### UF-ADM-02. Review an application [#uf-adm-02-review-an-application] Actor: Operations or Super admin. Trigger: an application in the queue. Queue lists applications by type (organization, driver, photographer), age, overdue flag (over 2 working days), country. Detail shows all fields, documents (opened from restricted storage, each open audited), and checks to record: identity, documents valid, insurance at least 3 months (drivers), lab result within 30 days (drivers), portfolio of 8+ photos (photographers), registry check (organizations). Decision: - **Approve**: plan chosen or default assigned; organization tenant or supplier profile created; applicant notified. - **Request changes**: list items and a message in the applicant's language; 14-day due date. - **Reject**: reason code and message; applicant told about appeal (14 days) and re-apply (30 days). Rules: [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) to [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ```mermaid flowchart TD Q[Application in queue] --> T{Type} T -->|Organization| O{Documents and registry OK?} T -->|Driver| D{License, insurance 3+ months, lab result within 30 days, consent?} T -->|Photographer| P{Identity OK and 8+ portfolio photos?} O -->|Missing items| RC[Request changes: 14 days] D -->|Missing items| RC P -->|Missing items| RC O -->|Fails check| RJ[Reject with reason] D -->|Fails check| RJ P -->|Below quality bar| RJ O -->|Yes| AP[Approve: tenant on chosen plan or Starter] D -->|Yes| AP2[Approve: profile on chosen plan or Basic] P -->|Yes| AP2 RC --> W[Applicant resubmits] --> Q RJ --> AL[Appeal within 14 days or re-apply after 30 days] ``` ### UF-ADM-03. Decide an appeal [#uf-adm-03-decide-an-appeal] Appeal shows the original decision, the statement and up to 5 files. Uphold (application approved) or refuse (rejection final) within 5 working days. Rules: [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ### UF-ADM-04. Manage an account [#uf-adm-04-manage-an-account] Search by name, email, phone, booking reference or organization. Entity detail: roles, plan, status, bookings, deals, audit trail. Suspend with a reason code; reinstate; reset credentials; early lift of a safety suspension needs a second admin. Rules: [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration). ### UF-ADM-05. Privacy requests [#uf-adm-05-privacy-requests] Queue of data-copy and deletion requests with due dates; data copies delivered within 30 days; deletions show the grace end date. Rules: [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period). ### UF-ADM-06. Request and review a lab test [#uf-adm-06-request-and-review-a-lab-test] From a driver's profile, request a lab test: type (drug screen, medical fitness or both) and deadline (1 to 7 days, default 3). The driver is paused at once; open deals end; upcoming assignments return to organizers. Lab-test queue by state and deadline. Results from the partner lab or driver upload are reviewed: Passed (unpause) or Failed (stays paused; second failure in 12 months closes the account). Missed deadline suspends the driver; over 30 days closes the account. Rules: [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests), [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension). ### UF-ADM-07. Plans and overrides [#uf-adm-07-plans-and-overrides] Plan catalog per role: limits, features, trial length, prices per market and interval. Overrides: one admin requests with reason and end date; a second admin approves; the owner is emailed; the plan reverts at the end date. Rules: [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides). ### UF-ADM-08. Coupons and abuse [#uf-adm-08-coupons-and-abuse] Create platform coupons (optionally per market); revoke any coupon; review abuse flags within 2 working days (flags never block automatically). Rules: [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags). ### UF-ADM-09. Deal audit [#uf-adm-09-deal-audit] Deals list with filters; timeline of every offer; flag a deal with a reason, which can pause it. Rules: [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit). ### UF-ADM-10. Disputes [#uf-adm-10-disputes] Queue with type, age, acknowledgment due (2 working days) and resolution due (10 working days). Acknowledge, request information (answered within 5 working days), record outcome, issue a refund within or outside policy with a reason. Rules: [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy). ### UF-ADM-11. Finance operations [#uf-adm-11-finance-operations] Actor: Finance or Super admin. Platform financial view by market and month. Weekly payout run (Mondays 06:00): review, approve, submit; failed and held payouts listed with reasons. Settlements tracker: open, awaiting payouts, disputed, closed. Reconciliation exceptions (daily) and the 08:00 Cairo digest. Invoices in finance review (numbering failures). Rules: [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) to [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices). ### UF-ADM-12. Payment escalations [#uf-adm-12-payment-escalations] Payments pending over 15 minutes appear in a queue with gateway status checks; admin resolves by confirming or failing after checking with the gateway. Rules: [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending). ### UF-ADM-13. Configuration [#uf-adm-13-configuration] Markets (currency, methods, tax, time zone, commission, status), notification templates by category, channel and language, feature flags. Every change audited. Rules: [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates). ### UF-ADM-14. Trip oversight and audit log [#uf-adm-14-trip-oversight-and-audit-log] Trips across organizations with state filters; cancel only before In Progress. Audit log searchable by actor, action, target and date; read-only, kept 7 years. Rules: [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log). ### UF-ADM-15. Platform analytics and audit [#uf-adm-15-platform-analytics-and-audit] Actor: super admin or Operations. Trigger: opening analytics or the audit log. Opens platform analytics: bookings, revenue and funnel views across markets, with data no more than 5 minutes stale. Switches to the privacy view: aggregated figures only, no personal data, with the privacy note shown. Drills into supplier analytics for driver and photographer performance views. Exports a view; the export is ready within 15 minutes and expires after 7 days. Searches the audit log by actor, action and object for the accountability trail. Edge cases: exports queue behind large ranges (status visible until ready). Rules: [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics), [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics), [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics). ### UF-ADM-16. Out-of-policy refund [#uf-adm-16-out-of-policy-refund] Actor: admin with the finance role. Trigger: a refund the policy engine would not grant. Opens the booking or dispute and chooses an amount that differs from the policy computation. Records a reason code; the confirmation names the policy delta. Confirms; the refund is sent like any other and the ledger reversal carries the reason and an audit entry. Edge cases: refunds tied to a dispute follow the dispute's resolution state first. Rules: [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [BRL-19](/en/docs/brd/requirements#7-business-rules), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds). # Driver App (/en/docs/user-flows/driver) Surface: mobile app; the web is limited to documents and profile (D-86). Roles: platform driver, organization-owned driver. ## Registration: platform driver [#registration-platform-driver] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email and phone | Yes, both verified | D-20 | | Password | Yes | | | Country | Yes | Sets market and payout currency | | National ID | Yes | Restricted storage | | Driving license number and photo, expiry | Yes | | | Uses own vehicle? | Yes | If yes: plate, model, year, seat count, registration, insurance valid 3+ more months | | Service regions | Yes | | | Lab-test consent | Yes | Recorded with text version | | Initial lab result | Yes | Dated within the last 30 days | | Background-check consent | Where the market's legal review allows | | | Plan choice | No | Basic if none (D-78); no charge before approval | ## Registration: organization-owned driver [#registration-organization-owned-driver] Invited by an organization by SMS or email (valid 7 days). Fields: name, phone (verified), country, license. No admin approval; accepted on assignment. ## Approval: platform driver [#approval-platform-driver] Admin reviews identity, license, vehicle documents, insurance and lab result ([Admin Console](/en/docs/user-flows/admin), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application)). Approve, request changes or reject. On approval the driver lands on home with the plan, and appears in the platform driver pool. ## Flows [#flows] ### UF-DRV-01. Register and apply [#uf-drv-01-register-and-apply] Account step, verification of both contacts, details, vehicle, documents, lab consent and result, plan. Submit; status page shows Pending Review and the 2-working-day target. Changes requested: the status page lists items, due date, and an "ask for 7 more days" action (once). Rules: [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details), [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result). ### UF-DRV-02. Set availability and profile [#uf-drv-02-set-availability-and-profile] Mark available or unavailable dates and ranges (no weekly rules). Edit rates, regions, vehicle and documents; expiring documents trigger reminders. Rules: [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability). ### UF-DRV-03. Respond to a deal [#uf-drv-03-respond-to-a-deal] Offers inbox: new offers, counters, expiring soon (72 hours after the last counter). Offer detail: organization, trip, route, date, vehicle, pay before any action. Accept, counter with a new price and note, or reject. When both sides accept the same terms, the deal locks and the assignment appears in Trips. Edge cases: conflict with an existing assignment on the date (warning); plan's monthly booking limit reached on finalization (upgrade prompt). Rules: [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses), [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility). ```mermaid sequenceDiagram participant O as Organization participant S as Platform participant D as Driver O->>S: Propose price for vehicle S-->>D: Push: new offer (trip, route, date, pay) D->>S: Counter S-->>O: Counter received O->>S: Accept S-->>D: Organization accepted D->>S: Accept same terms S->>S: Finalize, assign, post deal cost S-->>O: Driver confirmed S-->>D: Assignment and itinerary ``` ### UF-DRV-04. Run an assigned vehicle [#uf-drv-04-run-an-assigned-vehicle] Trips list: upcoming assignments with organization, vehicle, pickup time. Pre-trip checklist; contact the moderator and operations. Start route: GPS shared every 5 to 10 seconds while the trip is In Progress, buffered up to 60 minutes offline. End of trip: route closes; location sharing stops. Rules: [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking). ### UF-DRV-05. Lab test requested [#uf-drv-05-lab-test-requested] Trigger: an admin requests a lab test. The app opens on the lab-test gate. Only four actions work: book the lab, upload the result, contact support, sign out. Book a slot at a partner lab (free); see the deadline countdown. The partner sends the result, or the driver uploads it. Passed: the app unlocks. Failed: stays paused for admin handling. Missed: suspended; closed after 30 days. Upcoming trips go back to their organizers; completed trips are paid, uncompleted ones held. Rules: [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension), [BRL-16](/en/docs/brd/requirements#7-business-rules), [BRL-17](/en/docs/brd/requirements#7-business-rules). ### UF-DRV-06. Earnings and payouts [#uf-drv-06-earnings-and-payouts] Earnings by trip, statements, weekly payouts on Mondays; commission shown as a ledger line without a printed rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is set; negative balances carried forward. Rules: [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts). ### UF-DRV-07. Coupons [#uf-drv-07-coupons] Create coupons that apply only to bookings where the driver is assigned, within the plan's count. Rules: [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan). ### UF-DRV-08. Plan [#uf-drv-08-plan] Current plan, monthly booking usage, visibility level, upgrade or downgrade through the browser gateway page. Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-DRV-09. Organization-owned driver home [#uf-drv-09-organization-owned-driver-home] Sees only that organization's trips and assignments; no offers inbox, no plan screen, no coupons. Rules: [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area), [BRL-05](/en/docs/brd/requirements#7-business-rules). ### UF-DRV-10. Support [#uf-drv-10-support] Contact support from any state, including the lab-test gate; tickets show status. Rules: [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause). # User Flows (/en/docs/user-flows) # Trips Enjoy: User Flows [#trips-enjoy-user-flows] **Version** 1.0 **Date** 9 November 2026 **Traces to** [BRD](/en/docs/brd) v1.1, [SRS](/en/docs/srs) v1.1, [ERD](/en/docs/erd) v1.0 These files describe, for each app and role, how a person registers, how their access is approved, and what they can do once active. Each flow has a UF ID, the actor, the trigger, numbered steps, the rules that apply (BRL, FR), and edge cases. Screens are named by their SCR (web) or MSCR (mobile) IDs from the screen coverage audit where one exists. ## Flows by role [#flows-by-role] | Role | Registers via | Approved by | Plan needed | Lands on | |---|---|---|---|---| | Traveler | /register/traveler or the app | Nobody (active on verification) | No (Free default) | Trip browse | | Organization | /register/organization (web only) | Admin | Yes (Starter default) | Organization workspace | | Employee | Email invitation | Owner (permissions) | Organization's plan | Organization workspace | | Platform driver | /register/driver or the driver app | Admin | Yes (Basic default) | Driver home | | Platform photographer | /register/photographer or the studio | Admin | Yes (Basic default) | Studio home | | Organization-owned driver or photographer | SMS or email invitation | Organization (accepted on assignment) | Organization's plan ([OD-19](/en/docs/brd/compliance#11-open-decisions)) | Driver home or studio home, organization-scoped | | Moderator | Assignment by organization (phone) | Organization | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Vehicle home | | Parent | Traveler account | Nobody; eligibility by plan | Explorer or VIP | Parent tracker | | Admin | Invitation by Super admin | Super admin | Staff | Admin home | ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Submitted : submit (contacts verified, documents present) Submitted --> PendingReview : enters admin queue PendingReview --> Approved : approve PendingReview --> ChangesRequested : request changes PendingReview --> Rejected : reject with reason ChangesRequested --> PendingReview : resubmit within 14 days (+7 extension) ChangesRequested --> Closed : no response Rejected --> Appealed : appeal within 14 days Closed --> Appealed : appeal within 14 days Appealed --> Approved : upheld Appealed --> Rejected : refused (final) Rejected --> Draft : re-apply after 30 days Closed --> Draft : re-apply after 30 days Approved --> [*] ``` - "Must verify" means a one-time code ([BRL-20](/en/docs/brd/requirements#7-business-rules)): 5-minute expiry, 5 wrong codes pause 15 minutes, resend after 45 to 60 seconds. - Every registration form records country ([BRL-23](/en/docs/brd/requirements#7-business-rules)); the country sets the market ([BRL-27](/en/docs/brd/requirements#7-business-rules)). - Every plan-limited action can end in the upgrade prompt ([UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt)). - Every list and screen exists in Arabic (right to left) and English. - Values marked (placeholder) or [OPEN] follow BRD section 11. # Moderator App (/en/docs/user-flows/moderator) Surface: installable web app on phones. Role: vehicle moderator. ## Registration [#registration] No self-registration. The organization assigns a moderator to one vehicle on one trip with name and phone (D-107). The moderator receives an SMS link to install the app and a staff code. ## Approval [#approval] The assignment by the organization is the approval. Access lasts until 24 hours after the trip ends, on one device at a time (D-108). Replacing the moderator ends access at once. The moderator's plan rule is [OD-06](/en/docs/brd/compliance#11-open-decisions). ## Flows [#flows] ### UF-MOD-01. Install and first open [#uf-mod-01-install-and-first-open] Opens the SMS link; adds the app to the home screen. Permission primer: location (for check-in location and tracking fallback), camera (scanning), notifications. Opens to the vehicle view. Rules: [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app). ### UF-MOD-02. Sign in [#uf-mod-02-sign-in] Phone and staff code. Signing in on a second device ends the first session. No assignment, or an expired assignment, shows "no active vehicle". Rules: [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in). ### UF-MOD-03. Vehicle home and manifest [#uf-mod-03-vehicle-home-and-manifest] Vehicle label, trip, departure time, pickup point, driver contact, operations contact; manifest of passengers with seat and status (not boarded, on board, off vehicle); occupancy counter. Rules: [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy). ### UF-MOD-04. Check in a passenger [#uf-mod-04-check-in-a-passenger] Scan the passenger's boarding code, or search the manifest by name. Results: - **Checked in**: seat confirmed; event recorded with time and location where permitted. - **Wrong vehicle**: refused; shows "vehicle N" only. - **Not found or not confirmed**: refused; escalate to operations. - **Already on board**: duplicate ignored. - **Queued**: offline; will sync. Rules: [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) to [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BRL-09](/en/docs/brd/requirements#7-business-rules). ```mermaid flowchart TD S[Scan or search] --> V{Booking confirmed?} V -->|No| R1[Refuse, escalate to operations] V -->|Yes| M{Assigned to this vehicle?} M -->|No| R2[Refuse, show vehicle number only] M -->|Yes| A{Already on board?} A -->|Yes| R3[Ignore duplicate] A -->|No| C[Check in, lock seat] C --> N{Online?} N -->|Yes| U[Send now, parents and operations updated] N -->|No| Q[Queue with original time, retry every 30 s] ``` ### UF-MOD-05. Check out at a stop or destination [#uf-mod-05-check-out-at-a-stop-or-destination] Select the stop; check passengers out individually or all at once; a passenger checked out at a stop can re-board and be checked in again (proposed). Rules: [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops). ### UF-MOD-06. Offline queue [#uf-mod-06-offline-queue] Banner shows offline state and the number of queued events; warning at 800; maximum 1,000; events send in order with original times when the connection returns. Rules: [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue). ### UF-MOD-07. Report an incident [#uf-mod-07-report-an-incident] Category (safety, medical, vehicle fault, lost traveler, conduct, other), description, photo, location; operations sees it at once. Rules: [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting). ### UF-MOD-08. End-of-trip report and access end [#uf-mod-08-end-of-trip-report-and-access-end] Enter final headcount; if it differs from the checked-in count, a reason is required; add notes; submit (read-only after). Access ends 24 hours after the trip ends, or at once on replacement, with an "access ended" screen. Rules: [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock). # Organization Dashboard (/en/docs/user-flows/organization) Surface: business.trips-enjoy.com (web only for registration; the dashboard is responsive). Roles: organization owner, employee. ## Registration [#registration] | Field | Required | Notes | |---|---|---| | Owner full name | Yes | Becomes the owner account | | Owner email and phone | Yes, both verified | D-20 | | Password | Yes | Second factor set up on first sign-in | | Country | Yes | Sets the organization's market, currency, tax rules and time zone | | Legal name and trade name | Yes | Arabic and English | | Commercial registration number | Yes | | | Tax number | Yes where the market requires it | | | Registration documents | Yes | Commercial registration, tax certificate; PDF, JPG or PNG up to 10 MB | | Business address and category | Yes | Category: school, corporate, religious, tourism, event, other | | Billing contact | Yes | Email for invoices | | Plan choice | No | Shown without charge; Starter if none (D-77, D-24) | ## Approval [#approval] Application enters the admin queue; the applicant sees "under review" with the 2-working-day target. Admin checks documents and registry details (manual in phase 1). Decision: approve (tenant created on the chosen plan or Starter, owner invited); request changes (14 days, reminder day 7, one 7-day extension); reject with reason (appeal within 14 days, re-apply after 30 days). Every decision notifies the owner in their language. ## Flows [#flows] ### UF-ORG-01. First sign-in and setup [#uf-org-01-first-sign-in-and-setup] Owner signs in with email and password; sets up an SMS or authenticator second factor. Setup checklist: profile and logo, time zone (defaults from market), invoice settings, first vehicle type, first vehicle, invite staff, onboard own drivers and photographers, payout bank details. Empty-state home shows the checklist and plan usage. Rules: [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in). ### UF-ORG-02. Switch organization [#uf-org-02-switch-organization] A staff member whose email is listed by several organizations sees the organization switcher. Choosing one changes the workspace; data from the other is never shown. Rules: [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations), [BRL-01](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-03. Invite and manage employees [#uf-org-03-invite-and-manage-employees] Invite by email with a permission template (Operations, Finance, Support, Manager) or custom permissions across trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics. Link valid 7 days; on first sign-in the employee sets a password and second factor. Change permissions (history shows actor, time, before and after); suspend or remove (access ends at once). Edge case: the plan's employee limit is reached; the invite is blocked with an upgrade prompt. Rules: [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) to [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in). ### UF-ORG-04. Fleet [#uf-org-04-fleet] Vehicle types: name, seat grid, labeled seats, accessible and blocked seats; archive. Vehicles: plate, model, year, type, seats (must match), registration validity. Rules: [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types). ### UF-ORG-05. Own drivers and photographers [#uf-org-05-own-drivers-and-photographers] Invite by SMS or email (valid 7 days) with name, phone, country; license for drivers. They appear only in this organization's lists and are accepted on assignment. Removing one releases their future assignments and alerts operations. Rules: [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [BRL-05](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-06. Create a trip (wizard) [#uf-org-06-create-a-trip-wizard] **Basics**: title, description, category, cover image, language. **Schedule and route**: start and end, time zone, pickup points, stops, destination on a map. **Vehicles**: add vehicles up to the plan limit, each with a vehicle type and label. **Staffing**: per vehicle, driver (own, or platform through a deal on Growth and Enterprise) and moderator (with phone); trip photographer (own or platform). **Programs**: add programs with pricing model, price or tiers, type flags, capacity; up to the plan limit. **Seating**: company-assigned or self-select (Growth and Enterprise); priority window for Explorer and VIP. **Pricing and capacity**: base price in the market currency; child tracking switch (Growth and Enterprise). **Publish**: save draft, publish publicly, or publish to a target list. Edge cases: missing step blocks publishing and names the step; monthly active-trip limit reached; market not live. Rules: [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) to [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) to [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit), [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan). ```mermaid flowchart LR A["Draft"] --> B{"Publish how?"} B -- "public" --> C["Published"] B -- "target list" --> D["Targeted"] C --> E["Ready, or Negotiating when platform deals are needed"] D --> E E --> F["Filling Up, then Sold Out"] F --> G["In Progress at start time"] G --> H["Completed"] H --> I["Post-Processing"] I --> J["Archived 30 days after settlement closes"] ``` The full state machine, including cancellation and remedy paths, is the [trip lifecycle workflow](/en/docs/workflows/trip-lifecycle). ### UF-ORG-07. Hire a platform supplier (deal) [#uf-org-07-hire-a-platform-supplier-deal] Search platform drivers or photographers by date availability, region, rating badge and price. Propose a price for a vehicle or the trip; the supplier sees trip, route, date, vehicle and pay. Counter back and forth with no round limit; each offer expires 72 hours after the last counter. Accept: when both sides accept the same terms, the deal is finalized and the supplier assigned. Rejected or expired: the slot reopens for another supplier. Rules: [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [BRL-04](/en/docs/brd/requirements#7-business-rules), [BRL-26](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-08. Move a trip to Ready [#uf-org-08-move-a-trip-to-ready] Staffing board shows each vehicle's driver and moderator status and each open deal. Ready is refused with the list of gaps until every vehicle is staffed and every deal finalized. A staffing-gap email arrives 48 hours before departure; reassignment is allowed until 24 hours before. Rules: [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [BRL-07](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-09. Manage bookings and seats [#uf-org-09-manage-bookings-and-seats] Bookings list with filters by state, vehicle and program; passenger roster. Booking detail: passengers, seats, programs, totals, payments, refunds, notes. Seat map in assign mode: drag passengers to seats; conflicts refused. Handle cancellation requests after the policy cut-off within 2 working days. Rules: [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment), [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund). ### UF-ORG-10. Change a trip after bookings [#uf-org-10-change-a-trip-after-bookings] Edit programs, vehicles, seat mode or times. If confirmed bookings are affected, the system lists them and requires sending remedy offers before saving. Travelers have 7 days to choose; unresolved cases go to admin. Rules: [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [BRL-24](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-11. Cancel a trip [#uf-org-11-cancel-a-trip] Cancel with a reason before the trip starts; the preview shows bookings and the full refund total. All confirmed bookings are cancelled and refunded in full; suppliers and travelers are notified. In Progress trips cannot be cancelled; the screen points to incident handling. Rules: [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), [BRL-30](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-12. Live operations [#uf-org-12-live-operations] Trip command view on departure day: vehicles on a map, occupancy per vehicle, check-ins as they happen, incidents in real time. Look up any passenger to see their vehicle and status. Review end-of-trip reports and add a note. Rules: [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view), [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock). ### UF-ORG-13. Coupons [#uf-org-13-coupons] Create, pause, resume and revoke coupons for own trips; per-coupon analytics with 7, 30 and 90-day presets; count limited by plan (active and paused). Rules: [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan). ### UF-ORG-14. Invoices [#uf-org-14-invoices] B2C invoices issue automatically on confirmation; B2B when the buyer gave a tax number. Issue a manual invoice for a group or corporate buyer. Corrections by credit note only. Rules: [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [BRL-28](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-15. Accounting and settlements [#uf-org-15-accounting-and-settlements] Trip accounting: base revenue, program revenue, coupon impact, supplier costs, commission, gateway fees. Ledger browser with filters; exports by plan. Settlements: one per completed trip, with lines per party, status, and closure when paid and dispute-free. Rules: [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip), [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) to [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports). ### UF-ORG-16. Analytics [#uf-org-16-analytics] Trip, page, customer and provider analytics (Growth basic, Enterprise full), date presets and export. Rules: [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics), [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export). ### UF-ORG-17. CRM and webhooks [#uf-org-17-crm-and-webhooks] Connect a CRM; register webhook endpoints and choose events. See deliveries, failures and replay any delivery for 7 days; rotate the secret (old secret valid 24 hours). Rules: [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). ### UF-ORG-18. Plan and billing [#uf-org-18-plan-and-billing] Current plan, usage against limits, renewal date, invoices. Upgrade (at once, prorated) or downgrade (cycle end); cancel. Grace banner during failed renewals with retry dates. Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) to [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning). ### UF-ORG-19. Child-safety reports [#uf-org-19-child-safety-reports] Staff file a report about a child passenger; the case routes to the escalation contact; the list shows status. Rules: [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting). ### UF-ORG-20. Branding (Enterprise) [#uf-org-20-branding-enterprise] Logo and colors applied to public trip pages, emails and invoices. Rules: [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding). ### UF-ORG-21. Employee first sign-in [#uf-org-21-employee-first-sign-in] Actor: employee. Trigger: opening the invitation link within its 7-day life. Sets a password from the invitation email; the link dies after 7 days and the owner can resend. Enables a second factor (SMS or authenticator); organization staff enter it at every sign-in. Lands in the organization workspace with only the permissions the owner granted. Edge cases: expired link (owner resends); lost second factor (owner resets through support). Rules: [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited), [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods). ### UF-ORG-22. Coupon lifecycle [#uf-org-22-coupon-lifecycle] Actor: organization owner or employee with the coupon permission. Trigger: creating a campaign. Creates the coupon: type, stackability, window, usage limits, minimum spend; it activates at once or at the window start. Watches usage on the coupon list; pauses and resumes at any time. Revokes with a reason when the campaign ends; revoked codes fail with not found. Refunds reverse redemptions: usage counts fall back, and an Exhausted coupon returns to Active if its window is still open. Suspicious redemptions raise an abuse flag for admin review within 2 working days. Edge cases: exhaustion mid-checkout (the code fails cleanly at Summary); per-user limits freed by refunds. Rules: [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types), [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags). ### UF-ORG-23. Fleet mid-lifecycle [#uf-org-23-fleet-mid-lifecycle] Actor: organization owner or fleet manager. Trigger: changing the fleet while trips exist. Adds a vehicle with its type and label; the seat map derives from the vehicle type's rows and layout. Assigns vehicles to trips up to the per-trip limit; labels flow through to published trip pages and tickets. Removes a vehicle only when no future bookings depend on it; otherwise the removal names the blocking trips. Edge cases: seat mode changes on a trip with bookings follow the trip-change remedy rules. Rules: [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings), [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default). ### UF-ORG-24. Consume the public API [#uf-org-24-consume-the-public-api] Actor: organization developer. Trigger: integrating bookings, trips or webhooks with external systems. Creates an API key from organization settings; the key carries the organization's plan limits. Signs requests with the key; reads trips, bookings and availability through the public endpoints. Registers a webhook endpoint and verifies the signature; deliveries retry 5 times over 24 hours and remain replayable for 7 days. Rotates the signing secret with a 24-hour overlap so in-flight deliveries keep validating. Edge cases: secret rotation (old secret valid 24 hours); missed events (replay from the event log). Rules: [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) to [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity), [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). # Parent Tracker (/en/docs/user-flows/parent) Surface: a section of the traveler app (D-124). Role: parent or guardian (a traveler). ## Registration [#registration] A parent is a traveler ([Traveler App](/en/docs/user-flows/traveler), [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify)). No extra registration. Linking a child needs the booking reference, the child's name as on the booking, and a guardianship declaration recorded as consent. ## Eligibility (instead of approval) [#eligibility-instead-of-approval] | Condition | Required | |---|---| | Parent's plan | Explorer or VIP | | Organization's plan | Growth or Enterprise | | Trip setting | Child tracking switched on | | Live position | Only while the trip is In Progress | All three plan and setting conditions must hold ([OD-05](/en/docs/brd/compliance#11-open-decisions), proposed). The blocked screen says which one fails; only the parent-plan case offers an upgrade. ## Flows [#flows] ### UF-PAR-01. Link a child [#uf-par-01-link-a-child] Parent tracker, Add child. Enter booking reference and the child's name; confirm the guardianship declaration. Linked: the child appears with the trip. Refused: generic message (invalid reference, name mismatch, not a child passenger, or tracking off for the trip). Rules: [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [BRL-10](/en/docs/brd/requirements#7-business-rules). ```mermaid flowchart TD A[Add child] --> P{Parent on Explorer or VIP?} P -->|No| U[Upgrade prompt] P -->|Yes| B[Enter booking reference, child name, declaration] B --> V{Valid reference and name match?} V -->|No| E[Generic refusal] V -->|Yes| O{Organization Growth or Enterprise and trip switch on?} O -->|No| X[Tracking unavailable, no upgrade offered] O -->|Yes| L[Child linked] ``` ### UF-PAR-02. Child trip status [#uf-par-02-child-trip-status] For each linked child: trip, vehicle, seat, check-in status, programs, schedule; moderator contact. Rules: [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope). ### UF-PAR-03. Live map [#uf-par-03-live-map] While the trip is In Progress and eligible: the vehicle's position on a map, updated live; before start and after end, no position. Rules: [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility), [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking). ### UF-PAR-04. Notifications [#uf-par-04-notifications] Boarding confirmed, trip started, stop reached, trip ended; also "not boarded" when the vehicle departs without the child checked in (proposed). Rules: [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications). ### UF-PAR-05. Report a child-safety concern [#uf-par-05-report-a-child-safety-concern] Describe the concern; a case is created and routed to the escalation contact; status shown. Rules: [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting). ### UF-PAR-06. Link ends [#uf-par-06-link-ends] When the booking is cancelled or refunded, the child disappears from the tracker and live data stops. Child trip history is kept 1 year. Rules: [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking). # Photographer Studio (/en/docs/user-flows/photographer) Surface: responsive web in phase 1, plus mobile (D-86). Roles: platform photographer, organization-owned photographer. ## Registration: platform photographer [#registration-platform-photographer] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email and phone | Yes, both verified | D-20 | | Password | Yes | | | Country | Yes | | | ID document | Yes | Restricted storage | | Portfolio | Yes, at least 8 photos | JPEG, PNG or HEIC, 25 MB each | | Bio, equipment, service regions | Yes | | | Rates | Yes | In the market currency | | Plan choice | No | Basic if none (D-78) | ## Registration: organization-owned photographer [#registration-organization-owned-photographer] Invited by an organization by SMS or email (valid 7 days): name, phone, country. No admin approval; accepted on assignment. ## Approval: platform photographer [#approval-platform-photographer] Admin checks identity and portfolio quality ([Admin Console](/en/docs/user-flows/admin), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application)). Approve, request changes or reject. On approval the photographer becomes discoverable by Growth and Enterprise organizations. Lab tests do not apply to photographers. ## Flows [#flows] ### UF-PHO-01. Register and apply [#uf-pho-01-register-and-apply] Account, verification, profile, portfolio upload (minimum 8), rates, plan; submit; status page as in [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply). Rules: [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum). ### UF-PHO-02. Portfolio, profile and availability [#uf-pho-02-portfolio-profile-and-availability] Manage portfolio within the plan allowance (10, 50, unlimited); visibility and badge follow the plan; mark available and unavailable dates and ranges. Rules: [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio), [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability), [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge). ### UF-PHO-03. Respond to a deal [#uf-pho-03-respond-to-a-deal] Same negotiation as drivers ([Driver App](/en/docs/user-flows/driver), [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal)), for a whole trip rather than a vehicle. Deals for unavailable dates are refused. Rules: [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks). ### UF-PHO-04. Assigned trip brief [#uf-pho-04-assigned-trip-brief] Trip, dates, route and stops, organization contact, programs to cover, expected album delivery window (14 days after completion). Rules: [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window). ### UF-PHO-05. Create and upload an album [#uf-pho-05-create-and-upload-an-album] After the trip is Completed, create an album (within 14 days; count per plan). Upload in batches directly to storage; interrupted batches resume. Processing makes thumbnail, medium, large and watermarked copies; EXIF is stripped. Rules: [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan). ```mermaid flowchart LR A[Trip Completed] --> B[Create album] B --> C[Batch upload, resumable] C --> D[Processing: variants, watermark if on] D --> E{Privacy by plan} E -->|Basic and up| F[Public to trip participants] E -->|Studio and Pro| G[Shared link, revocable] E -->|Pro| H[Selected users] F & G & H --> I[Publish and notify eligible travelers] ``` ### UF-PHO-06. Privacy and sharing [#uf-pho-06-privacy-and-sharing] Choose the privacy mode the plan allows. Shared link: generate, copy, revoke (a revoked link returns not found). Selected users: pick travelers from the trip roster. Downloads: public albums give the watermarked or medium copy; other modes are view only. Rules: [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) to [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access), [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download). ### UF-PHO-07. Watermark [#uf-pho-07-watermark] Studio and Pro: turn on; fixed placement bottom right, inset 3 percent, 30 percent opacity; preview before publishing. Basic: locked with an upgrade prompt. Rules: [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking). ### UF-PHO-08. Earnings, coupons and plan [#uf-pho-08-earnings-coupons-and-plan] Earnings and weekly payouts; coupons for own bookings; plan usage (bookings per month, portfolio, albums) and changes. Rules: [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) to [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-PHO-09. Organization-owned photographer [#uf-pho-09-organization-owned-photographer] Sees only that organization's trips; uploads albums for them; no marketplace, plan or coupons. Rules: [BRL-05](/en/docs/brd/requirements#7-business-rules). # Shared Flows (/en/docs/user-flows/shared) Flows used on every surface. ### UF-SHR-01. Sign up chooser [#uf-shr-01-sign-up-chooser] /register shows Traveler, Driver, Photographer and Organization. Each opens its own form; Organization is web only (the app hands off to the browser). Rules: [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths). ### UF-SHR-02. One-time code [#uf-shr-02-one-time-code] Code by SMS, WhatsApp or email; 6 digits; expires in 5 minutes; resend after a 45 to 60 second countdown; 5 wrong codes pause 15 minutes; resend does not reset the count; after 3 failed deliveries the other channel is offered. Rules: [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code), [BRL-20](/en/docs/brd/requirements#7-business-rules). ### UF-SHR-03. Sign in [#uf-shr-03-sign-in] | Role | Method | |---|---| | Traveler, driver, photographer | Password, or one-time code | | Organization staff | Password, then SMS or authenticator code every time | | Admin | Password, then authenticator code | | Moderator | Phone and staff code | 5 failed attempts lock the account 15 minutes. Web sessions end after 12 hours; drafts are kept. Rules: [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens). ### UF-SHR-04. Password reset [#uf-shr-04-password-reset] Request by email or phone; code or link; new password (12+ characters, breached check); all other sessions end. ### UF-SHR-05. Role and organization switcher [#uf-shr-05-role-and-organization-switcher] Account menu lists held roles (traveler, driver, photographer, staff) and, for staff, organizations that list the user's email. Switching changes the workspace; data from other roles and organizations is never mixed. Rules: [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations). ### UF-SHR-06. Plan-limit prompt [#uf-shr-06-plan-limit-prompt] When a limit or feature blocks an action: what was blocked, current usage and limit, the next plan that allows it, and Upgrade. If the plan service is down, a "try again shortly" message instead (fail closed). Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure). ### UF-SHR-07. Grace banner [#uf-shr-07-grace-banner] After a failed renewal: banner with retry dates and Update payment; features stay for 7 days; then the rule in [OD-29](/en/docs/brd/compliance#11-open-decisions) applies. Rules: [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning). ### UF-SHR-08. Application status, changes, appeal [#uf-shr-08-application-status-changes-appeal] Status page for any application: state, due dates, requested items, extension request (once), appeal form (14 days, statement, up to 5 files), re-apply date. Rules: [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ### UF-SHR-09. Account deletion [#uf-shr-09-account-deletion] Request in privacy settings; confirm by code; see what happens (future bookings cancelled and refunded, earnings paid on the next payout date, trip records kept 5 years). Grace period 30 days: no bookings or payments; signing in shows "restore account". Day 31: permanent. Organization owners cannot request it while a trip is In Progress. Rules: [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [BRL-15](/en/docs/brd/requirements#7-business-rules). ### UF-SHR-10. Suspended account [#uf-shr-10-suspended-account] Sign-in shows the suspension message and a support contact; no data is shown. Rules: [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement). ### UF-SHR-11. Notification centre [#uf-shr-11-notification-centre] In-app list of notifications by category with unread state; tapping opens the target, or a fallback if the target no longer exists. Rules: [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference). ### UF-SHR-12. Errors and service states [#uf-shr-12-errors-and-service-states] | State | Shown when | Message intent | |---|---|---| | 401 | Session ended | Sign in again; return to the same place | | 403 | Missing permission | You do not have access; ask your organization owner | | 404 | Not found or another tenant's data | Not found | | 402 | Plan required | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt) | | 429 | Rate limited | Try again in N seconds | | 500 | Server error | Something went wrong; reference ID | | 503 | Dependency down | Service temporarily unavailable | | Maintenance | Planned window | 01:00 to 03:00 Cairo, announced 72 hours ahead | | Offline | No connection | Banner; queued actions where supported | | Update required | App below supported version | Update to continue | ### UF-SHR-13. Language and layout [#uf-shr-13-language-and-layout] Language switch on every screen; Arabic mirrors the layout; Western digits in both languages; amounts with currency code. Rules: UI-01, UI-02, NFR-I18N-04. ### UF-SHR-14. Confirmation step [#uf-shr-14-confirmation-step] Destructive or money-moving actions (cancel, refund, revoke, suspend, publish, finalize deal) use a confirmation that names the effect, for example "Cancel trip: 40 bookings will be refunded in full, 12,400 EGP". Rules: UI-08. ### UF-SHR-15. Notification delivery and quiet hours [#uf-shr-15-notification-delivery-and-quiet-hours] Actor: any user. Trigger: an event that maps to a notification they receive. One message per enabled channel per event — duplicates are collapsed by the event key. Non-urgent SMS and push wait for 07:00 recipient-local when they fall between 22:00 and 07:00; security messages never wait. Trip-day events older than 2 hours are dropped instead of delivered late. A failed channel retries 3 times with exponential backoff; the delivery record shows each attempt in the notification centre. Edge cases: urgent list (D-289) bypasses quiet hours; language follows the recipient with RTL layout. Rules: [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery). ### UF-SHR-16. Trial to paid [#uf-shr-16-trial-to-paid] Actor: any supplier or organization owner. Trigger: an approved application with a trial plan. The trial starts without a charge; a notice arrives on day 0. Reminders arrive 3 days and 1 day before the trial ends. At the end the first charge runs; if it fails, retries follow on days 1, 3, 5 and 7 with an email each time. Still unpaid after 7 days of grace, the plan leaves Active — what happens next follows the open decision on post-grace behavior. Edge cases: trial lengths remain open in the register; cancelling during grace ends the plan at once with no refund. Rules: [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning). # Traveler App (/en/docs/user-flows/traveler) Surfaces: responsive web (trips-enjoy.com) and mobile apps. Roles: visitor, traveler. Parent features are in [Parent Tracker](/en/docs/user-flows/parent). ## Registration [#registration] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email | One of email or phone | Must verify the one given (D-20) | | Phone | One of email or phone | E.164; must verify if given | | Password | Yes, unless the traveler chooses code-only sign-in | 12+ characters, breached-password check | | Country | Yes | Sets the account's market ([BRL-23](/en/docs/brd/requirements#7-business-rules), [BRL-27](/en/docs/brd/requirements#7-business-rules)) | | Language | Yes | Arabic or English; defaults from the device | | Terms and privacy consent | Yes | Recorded with text version | | Marketing consent | No | Separate from transactional messages | ## Approval [#approval] None. The account is active on verification, on the Free plan. ## Flows [#flows] ### UF-TRV-01. Browse as a visitor [#uf-trv-01-browse-as-a-visitor] Actor: visitor. Trigger: opens the site or app. Home shows featured and upcoming public trips from live markets, with search by destination, date, organization, price and category. Visitor opens a trip: description, organization, dates, route and stops, vehicles, programs with prices, base price in the trip's currency, seat mode, policy summary. Book Now asks the visitor to sign up or sign in, then returns to the same trip. Rules: [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) (drafts and targeted trips hidden), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) (VIP early access hidden), [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing). ### UF-TRV-02. Register and verify [#uf-trv-02-register-and-verify] Actor: visitor. Trigger: Sign up as traveler. Fills the registration form above. Receives a code by SMS, WhatsApp or email; enters it. Lands on a short onboarding: profile photo (optional), notification preferences, plan choice (Free selected; Explorer and VIP offered). Returns to the trip they were viewing, or to home. Edge cases: code expired (resend after countdown); 5 wrong codes (paused 15 minutes); 3 failed deliveries (offer the other channel); email or phone already registered (offer sign-in and password reset). Rules: [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) to [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code). ### UF-TRV-03. Book a trip [#uf-trv-03-book-a-trip] Actor: traveler. Trigger: Book Now on a published trip. **Travelers**: number of passengers; name per passenger; child flag where a passenger is a minor. **Programs**: pre-required programs are added and locked; optional ones can be added by toggle, quantity, or tier; VIP-only programs are locked for Free and Explorer with an upgrade prompt; full programs show unavailable. The summary updates live with the plan discount on programs (5 or 10 percent). **Seats**: if self-selection is on, a live seat map of the assigned vehicle; picking a seat holds it for 15 minutes with a visible countdown. During the priority window, Free travelers see the map read-only. If company-assigned, the step shows "seat assigned later". **Summary**: base, programs, discounts, coupon field, optional tax number for a B2B invoice, total with currency code. The price is locked from the start of the hold. **Payment**: methods of the trip's market; the gateway page or SDK opens; no card fields on the platform. **Result**: Confirmed (ticket with booking reference and boarding code, receipt, invoice), Pending (confirming payment), or Failed (retry). Edge cases: hold expires during payment (cart kept, seats re-checked, new hold if free); third failed attempt (stays Payment Failed until the hold ends); Fawry voucher (seats held 48 hours, voucher code shown, reminder before expiry); trip sells out while in cart (seat step shows unavailable, other vehicles offered). Rules: [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) to [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) to [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) to [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types), [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary). ```mermaid flowchart TD A["Cart"] --> B["Seats held 15 min, price locked"] B --> C{"Payment outcome"} C -- confirmed --> D["Confirmed, ticket issued"] C -- "no answer in 30 s" --> E["Payment Pending: polls at 1, 5, 10 min, admin at 15"] E -- "gateway confirms" --> D C -- failed --> F["Payment Failed, retry"] F -- "under 3 attempts" --> C F -- "third failure" --> G["Stays Payment Failed until the hold ends"] B -- "hold expires" --> H["Cart kept, seats re-checked, new hold if free"] C -- "Fawry voucher" --> I["Voucher code, seats held 48 h, reminder before expiry"] I -- "paid within 48 h" --> D I -- "unpaid at 48 h" --> H ``` The engine view of this pipeline, including callback idempotency and escalation, is the [booking and payment workflow](/en/docs/workflows/booking-payment). ### UF-TRV-04. Apply a coupon [#uf-trv-04-apply-a-coupon] Enters a code at Summary. Valid: discount line appears and the total updates. Invalid: the first failing reason (not found, paused, expired, not applicable to this booking, exhausted, already used, minimum spend not met). A second non-stackable coupon is refused; the first stays. Rules: [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection), [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation). ### UF-TRV-05. Manage bookings [#uf-trv-05-manage-bookings] My Bookings lists upcoming, past and cancelled bookings with state. Booking detail: trip, passengers, seats, programs, totals, payment status, policy, ticket, receipt, invoice, and actions allowed by state. Receipts and invoices list; export on VIP. Rules: [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan). ### UF-TRV-06. Cancel a booking [#uf-trv-06-cancel-a-booking] From booking detail, Cancel shows the refund preview from the policy (placeholder: 80 percent at 48 hours or more, 50 percent from 24 to under 48, none under 24) and the coupon effect. Confirms. The booking moves to Cancelled, then Refund Pending until the gateway confirms ("refund in progress"), then Refunded. After the cut-off, the traveler can send a request to the organization instead (decided within 2 working days, then admin). Edge cases: after departure or check-in, cancel is replaced by Open a dispute. Rules: [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [BRL-11](/en/docs/brd/requirements#7-business-rules), [BRL-12](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-07. Choose a remedy after a trip change [#uf-trv-07-choose-a-remedy-after-a-trip-change] Trigger: the organization changes a program, seat mode, vehicle or time that affects the booking. Notification and banner on the booking with the change. Options: accept the change, switch option (another program or vehicle where offered), or cancel with a full refund. Choice within 7 days; otherwise the case goes to admin. Rules: [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [BRL-24](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-08. Trip day [#uf-trv-08-trip-day] Ticket with boarding code, vehicle label, seat (when assigned), pickup point and time, moderator contact, check-in status. After check-in: status "on board"; programs and schedule. No live vehicle position or ETA is shown to travelers. Rules: [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [BRL-29](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-09. Albums [#uf-trv-09-albums] Trip history lists completed trips; each shows albums the traveler may see. Public albums: view; download the watermarked or medium copy. Shared-link and selected-user albums: view only. A shared link opened while signed out asks the traveler to sign in. Rules: [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access), [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download). ### UF-TRV-10. Change plan [#uf-trv-10-change-plan] Plans page compares Free, Explorer and VIP with prices in the account's market currency. Upgrade opens the gateway page in the browser; benefits apply at once with proration. Downgrade is scheduled for the cycle end and can be cancelled. Rules: [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-TRV-11. Apply for a supplier role [#uf-trv-11-apply-for-a-supplier-role] Account menu shows Become a driver, Become a photographer, Register an organization. Driver: handoff to the driver app. Photographer: handoff to the studio. Organization: handoff to the web form (web only). While pending or after rejection, traveler access is unchanged. Rules: [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access), [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts). ### UF-TRV-12. Profile, language and notifications [#uf-trv-12-profile-language-and-notifications] Edit name, photo, contacts (re-verify on change), language, and per-category channels. Security messages cannot be turned off. Rules: [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences), [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference). ### UF-TRV-13. Privacy requests [#uf-trv-13-privacy-requests] Request a data copy: verified by code, delivered within 30 days as a download link. Request deletion: see [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion). Rules: [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period). ### UF-TRV-14. Open a dispute [#uf-trv-14-open-a-dispute] From a booking: choose type (booking, payment, refund, organization conduct, other), describe, attach up to 5 files. Track status: Open, Information Requested, Under Review, Resolved, Closed. Rules: [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling). ### UF-TRV-15. Payment outcome and pending resolution [#uf-trv-15-payment-outcome-and-pending-resolution] Actor: traveler. Trigger: payment submitted, result not immediate. The gateway page or SDK opens; no card fields ever appear on the platform. While the gateway is silent, the booking shows Confirming payment: the system polls at 1, 5 and 10 minutes and the seats stay held. Confirmed: the ticket, receipt and invoice appear at once. Failed: retry is offered while attempts remain under three for this hold. After the third failure the booking stays Payment Failed until the hold ends; a support contact is offered when the case escalates to admin at 15 minutes. Edge cases: hold expires during payment (cart kept, seats re-checked, new hold only if free); Fawry voucher unpaid at 48 hours returns the booking to the cart with the seats released. Rules: [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart). ### UF-TRV-16. Life after a downgrade [#uf-trv-16-life-after-a-downgrade] Actor: traveler. Trigger: the billing cycle ends on a downgraded plan. Everything already booked keeps working: over-limit items created before the downgrade continue to be available. The next action beyond the new limit is refused by the server-side gate, which names the category, the current plan, the limit and the next tier. The upgrade prompt offers the next tier; counters reset on the 1st of the month at 00:00 in the owner's time zone. Edge cases: grace-period rules apply before the downgrade takes effect; see the subscriptions workflow. Rules: [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates). ## Booking states seen by the traveler [#booking-states-seen-by-the-traveler] | State | Label shown | |---|---| | Seats Held | Seats held, time left mm:ss | | Payment Pending | Confirming payment | | Payment Failed | Payment did not go through, retry | | Confirmed | Confirmed | | Checked In / Checked Out | On board / Off vehicle | | Cancelled | Cancelled | | Refund Pending | Refund in progress | | Refunded | Refunded | # Applications (/en/docs/workflows/applications) Every organization, platform driver and platform photographer goes through one application workflow before they can act on the platform ([BRL-02](/en/docs/brd/requirements#7-business-rules)). This page is the engine view of state machine 7.5; the human side is [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application). **Delivery phase:** P1 Foundation (organizations), P4 Marketplace supply (drivers and photographers). ## Trigger and actors [#trigger-and-actors] - **Trigger:** an applicant submits a Draft application (contacts verified, documents present). - **Actors:** the applicant; the admin reviewer; the daily closure job; the system (plan assignment, tenant creation, notifications). ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Submitted : submit (contacts verified, documents present) Submitted --> PendingReview : enters admin queue PendingReview --> Approved : approve PendingReview --> ChangesRequested : request changes PendingReview --> Rejected : reject with reason ChangesRequested --> PendingReview : resubmit within 14 days, or 21 with extension ChangesRequested --> Closed : daily job, no response Rejected --> Appealed : appeal within 14 days Closed --> Appealed : appeal within 14 days Appealed --> Approved : decided within 5 working days, upheld Appealed --> Rejected : refused, final Rejected --> Draft : re-apply 30 days after decision Closed --> Draft : re-apply 30 days after decision Approved --> [*] : plan assigned, tenant or profile created ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Review queue flag | "more than 2 working days" pending flags the application; median decision target is 2 working days | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target), [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | | Changes-requested window | "14 days to respond, with a reminder on day 7 and one 7-day extension on request" | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb), D-235 | | Closure job | The daily job closes unanswered changes; the closure day when the extension is used is [OPEN: [OD-32](/en/docs/brd/compliance#11-open-decisions)] | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [OD-32](/en/docs/brd/compliance#11-open-decisions) | | Appeal window | "within 14 days of the notice", one appeal per rejection, decided "within 5 working days" | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb), [BRL-06](/en/docs/brd/requirements#7-business-rules), D-237 | | Re-apply cooldown | "30 days after rejection; a closed application counts as rejected" | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules) | | On approval | Plan assigned and tenant or profile created automatically; supplier actions stay refused until then | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), D-24, D-77 | | Notifications | Every state change notifies the applicant in their language on at least one enabled channel | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | | Freshness gates at submission | Driver lab results "dated within the last 30 days"; insurance "valid for at least 3 more months" | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details), [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | ## Stories [#stories] - **As an applicant**, I want my pending review flagged when it slips past two working days, so that the platform's own SLA works in my favor. *([FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target))* - **As an admin reviewer**, I want unanswered change requests to close themselves after the window, so that the queue only holds live cases. *([FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested))* - **As a rejected applicant**, I want one appeal decided within five working days, so that a mistake does not cost me a month. *([FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules))* - **As an approved organization**, I want my plan and tenant created the moment I am approved, so that I can start work without a second wait. *([FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval))* # Booking & Payment (/en/docs/workflows/booking-payment) The booking pipeline is the platform's most timer-dense workflow: a 15-minute seat hold with a price lock, a three-attempt payment cap, a 48-hour Fawry voucher lane, and a gateway poll schedule that escalates to admin. This is the engine view of state machines 7.2 (Booking) and 7.3 (Seat); the traveler side is [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip). **Delivery phase:** P2 Single-vehicle pilot (Egypt). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a traveler picks a seat (self-selection) or confirms passengers (company-assigned). - **Actors:** the traveler; the gateway; the payment callback relay; the admin escalation queue. ## Diagram [#diagram] ```mermaid sequenceDiagram participant T as Traveler participant S as Seat service participant G as Gateway participant A as Admin queue T->>S: Pick seat S-->>T: Held 15 min, price locked (D-191, D-192) T->>G: Pay (attempt 1 of max 3, D-197) alt Gateway answers within 30 s G-->>S: Callback (idempotent, FR-PAY-02) S-->>T: Confirmed, ledger posts (FR-PAY-01) else No answer in 30 s S->>G: Status check at 1, 5, 10 min (D-30) Note over S: Seats stay held while pending S->>A: Escalate at 15 min (D-201) else Hold expires mid-payment S-->>T: Cart kept, seats re-checked, new hold if free (D-191) end opt Fawry (FR-PAY-09) G-->>T: Voucher code, seats held 48 h, reminder before expiry Note over S: Voucher unpaid at 48 h → back to Cart (D-31) end ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Seat hold | "held for 15 minutes and released automatically when it expires"; price "locked when the hold starts" | [BRL-08](/en/docs/brd/requirements#7-business-rules), [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-191, D-192 | | Hold expiry during payment | "A retry after the hold expires keeps the cart, re-checks the seats and starts a new 15-minute hold only if they are still free" | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), D-191 | | Attempt cap | "up to 3 attempts per hold"; after the third the booking stays Payment Failed until the hold expires | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg), D-197 | | Gateway timeout | "If the gateway does not answer within 30 seconds… checks status at 1, 5 and 10 minutes and escalates to admin at 15 minutes. Seats stay held while pending" | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-30, D-201 | | Callbacks | "at most once per gateway event identifier"; callbacks queued and replayed | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | | Fawry voucher | "issue a voucher valid 48 hours and hold the seats for that window. An unpaid voucher expires and releases the seats" | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [BRL-08](/en/docs/brd/requirements#7-business-rules), D-31, D-41 | | Success | Confirmed posts the ledger entry; ticket issued with booking reference and boarding code | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | Seat states | Available, Held, Reserved, Checked In, Checked Out, Released — the loop behind the hold | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | | Seat selection | Company-assigned by default; self-selection by plan and trip setting | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | Booking states | The ten traveler-visible states of machine 7.2, from Cart to Refunded | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | | Program discounts | Plans discount program prices by 5 or 10 percent in the live summary | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | | Concurrency | Hold races resolved with a Redis lock and a conditional update on seat status | ERD trip_seats | ## Stories [#stories] - **As a traveler**, I want the price locked the moment my seat is held, so that nothing changes under me while I pay. *([FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-192)* - **As a traveler**, I want a pending payment resolved by polling instead of a dead end, so that a slow gateway does not cost me the seat. *([FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending))* - **As an admin**, I want gateway no-answers escalated after 15 minutes with the seats still held, so that I can finish what the timer could not. *([FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-201)* - **As a Fawry user**, I want 48 hours to pay the voucher with a reminder before expiry, so that cash payment works like any other method. *([FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), D-31)* # Requirement Coverage (/en/docs/workflows/coverage) Refresh with `bun scripts/coverage-matrix.ts` — do not edit by hand. An empty *Covered by* cell means the requirement is cited by no flow or workflow page yet. **207 of 207** functional requirements (100%) are cited by at least one [user flow](/en/docs/user-flows) or [system workflow](/en/docs/workflows) page. The rest are listed here on purpose — being visible is the first step to being covered. ## PAR — Parent tracker [#par--parent-tracker] | Requirement | Covered by | |---|---| | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) Linking a child | [UF-PAR-01](/en/docs/user-flows/parent#uf-par-01-link-a-child) | | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope) Parent view scope | [UF-PAR-02](/en/docs/user-flows/parent#uf-par-02-child-trip-status) | | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) Eligibility | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) Parent notifications | [UF-PAR-04](/en/docs/user-flows/parent#uf-par-04-notifications) | | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) Child-data restrictions | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) Link ends with the booking | [UF-PAR-06](/en/docs/user-flows/parent#uf-par-06-link-ends) | | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) Child-safety reporting | [UF-ORG-19](/en/docs/user-flows/organization#uf-org-19-child-safety-reports), [UF-PAR-05](/en/docs/user-flows/parent#uf-par-05-report-a-child-safety-concern) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Requirement | Covered by | |---|---| | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) Double-entry ledger | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) Organization accounting per trip | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) Supplier earnings and payouts | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#weekly), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | | [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) Platform financial view | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations) | | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) Settlements | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) Exports by plan | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) Reconciled exports | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) Invoices across all parties | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) Daily reconciliation and finance digest | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) Archive after settlement | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | ## MKT — Markets [#mkt--markets] | Requirement | Covered by | |---|---| | [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) Market configuration | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) Market from country | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) Cross-market browsing | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor) | | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) Market switch | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) Rounding and display | [money](/en/docs/workflows/money#timers-and-rules) | ## PRG — Programs [#prg--programs] | Requirement | Covered by | |---|---| | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) Pricing models | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types) Program types | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary) Live booking summary | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) Enrollment report | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) Program capacity | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) Program count limit | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## SEAT — Seats [#seat--seats] | Requirement | Covered by | |---|---| | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) Company-assigned by default | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) Live seat map | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) Priority window | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold) Seat hold | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) Seat states | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment) Staff seat assignment | [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats) | | [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) Self-selection by plan | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Requirement | Covered by | |---|---| | [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) Profile and preferences | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications) | | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) Trip visibility and early access | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) History and receipts by plan | [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) Program discounts | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) Plan changes | [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) | | [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) Supplier application keeps traveler access | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role) | | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) Data copy and deletion | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## STF — Staffing [#stf--staffing] | Requirement | Covered by | |---|---| | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) Driver tracks | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) Photographer tracks | [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) Ready gate | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) Assignment after finalized deal | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) Moderator assignment | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility) Deal request visibility | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) Reassignment deadline | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## SUB — Plans and subscriptions [#sub--plans-and-subscriptions] | Requirement | Covered by | |---|---| | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) Plan catalog | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides) | | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) Feature gates | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) Grace period | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) Upgrade, downgrade and cancellation | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan), [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) Admin overrides | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) Revenue reporting | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) Trials | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) Dunning | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade) Limits after a downgrade | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) Counter reset | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#monthly), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure) Plan service failure | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Requirement | Covered by | |---|---| | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) Role-specific registration paths | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-01](/en/docs/user-flows/shared#uf-shr-01-sign-up-chooser) | | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) Country on every registration form | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify) | | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) Verification by one-time code | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-02](/en/docs/user-flows/shared#uf-shr-02-one-time-code), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) Role-specific sign-in methods | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in) | | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout) Sign-in lockout | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts) Multi-role accounts | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role), [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher) | | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) Staff access to several organizations | [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher), [UF-ORG-02](/en/docs/user-flows/organization#uf-org-02-switch-organization) | | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement) Suspension and reinstatement | [UF-SHR-10](/en/docs/user-flows/shared#uf-shr-10-suspended-account), [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) Account deletion with a 30-day grace period | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) Sessions and tokens | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## PHO — Photographer studio [#pho--photographer-studio] | Requirement | Covered by | |---|---| | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) Portfolio | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability) Rates and availability | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) Earnings | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan) Active bookings by plan | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) Photographer coupons | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge) Visibility and badge | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Requirement | Covered by | |---|---| | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) Tenant isolation | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) Tenant setup on approval | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) Organization-owned drivers and photographers | [UF-ORG-05](/en/docs/user-flows/organization#uf-org-05-own-drivers-and-photographers), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration) Fleet registration | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) Seat self-selection setting | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) CRM and webhooks | [UF-ORG-17](/en/docs/user-flows/organization#uf-org-17-crm-and-webhooks), [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) B2B and B2C invoices | [UF-ORG-14](/en/docs/user-flows/organization#uf-org-14-invoices), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) Custom branding | [UF-ORG-20](/en/docs/user-flows/organization#uf-org-20-branding-enterprise) | ## NTF — Notifications [#ntf--notifications] | Requirement | Covered by | |---|---| | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) Channels by preference | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications), [UF-SHR-11](/en/docs/user-flows/shared#uf-shr-11-notification-centre), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout) Language and layout | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) Quiet hours | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) Versioned templates | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) Delivery records and retries | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) No duplicate delivery | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#diagram), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices) Trip reminders and change notices | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#hourly), [notifications](/en/docs/workflows/notifications#timers-and-rules) | ## CPN — Coupons [#cpn--coupons] | Requirement | Covered by | |---|---| | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) Creator scope | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) Cross-entity rejection | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation) Real-time validation | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) Coupon types | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls) Lifecycle and controls | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) Redemption and reversal | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags) Analytics and abuse flags | [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons), [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan) Coupon count by plan | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | ## TRK — Live tracking [#trk--live-tracking] | Requirement | Covered by | |---|---| | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) Live vehicle location | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection) Location collection | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view) Passenger vehicle view | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations) | | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) Per-trip child tracking switch | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) Tracking data scope | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) End of tracking | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) No live position for travelers | [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## CHK — Check-in and check-out [#chk--check-in-and-check-out] | Requirement | Covered by | |---|---| | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) Check-in at boarding | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) Vehicle match | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record) Event record | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#diagram), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops) Check-out at stops | [UF-MOD-05](/en/docs/user-flows/moderator#uf-mod-05-check-out-at-a-stop-or-destination), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) Offline queue | [UF-MOD-06](/en/docs/user-flows/moderator#uf-mod-06-offline-queue), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) Incident reporting | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-07](/en/docs/user-flows/moderator#uf-mod-07-report-an-incident) | | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) Occupancy | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Requirement | Covered by | |---|---| | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types) Reusable vehicle types | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) Vehicle registry | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip) Vehicle limit per trip | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type) Seat map from vehicle type | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) Vehicle removal after bookings | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) Archiving vehicle types | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | ## API — Public API [#api--public-api] | Requirement | Covered by | |---|---| | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) Public API | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-02](/en/docs/srs/requirements/api#fr-api-02--api-key-lifecycle) API key lifecycle | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-03](/en/docs/srs/requirements/api#fr-api-03--read-resource-endpoints) Read resource endpoints | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-04](/en/docs/srs/requirements/api#fr-api-04--api-conventions) API conventions | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-05](/en/docs/srs/requirements/api#fr-api-05--openapi-publication) OpenAPI publication | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-06](/en/docs/srs/requirements/api#fr-api-06--rate-limiting-behavior) Rate limiting behavior | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity) Webhook contract parity | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | ## MED — Media and albums [#med--media-and-albums] | Requirement | Covered by | |---|---| | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) Album creation window | [UF-PHO-04](/en/docs/user-flows/photographer#uf-pho-04-assigned-trip-brief), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload) Resumable batch upload | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [media](/en/docs/workflows/media#diagram), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) Privacy modes by plan | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing) | | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) Shared links | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) Selected-user access | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) Watermarking | [UF-PHO-07](/en/docs/user-flows/photographer#uf-pho-07-watermark), [media](/en/docs/workflows/media#timers-and-rules) | | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) Traveler access and download | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) Albums per trip by plan | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [media](/en/docs/workflows/media#timers-and-rules) | ## ADM — Admin console [#adm--admin-console] | Requirement | Covered by | |---|---| | [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) Account administration | [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) Admin staff | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration) Configuration | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) Dispute outcomes and refunds | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund) | | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) Immutable audit log | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) Platform-wide coupons | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) Abuse flags | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) Dispute handling | [UF-TRV-14](/en/docs/user-flows/traveler#uf-trv-14-open-a-dispute), [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) Lab-test requests | [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | ## BKG — Booking and checkout [#bkg--booking-and-checkout] | Requirement | Covered by | |---|---| | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) Booking composition | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff) Checkout handoff | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart) Retry without losing the cart | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) Traveler cancellation and refund | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices) Receipts and invoices | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) Organization cancellation of a trip | [UF-ORG-11](/en/docs/user-flows/organization#uf-org-11-cancel-a-trip), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) Booking states | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Requirement | Covered by | |---|---| | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) Payment outcomes | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks) Idempotent callbacks | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) Refund execution | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy) Refunds outside policy | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation) Gateway reconciliation | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning) Subscription charges and dunning | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) Payment methods per market | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) Payment pending | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [UF-ADM-12](/en/docs/user-flows/admin#uf-adm-12-payment-escalations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) Fawry cash vouchers | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Requirement | Covered by | |---|---| | [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) Driver work area | [UF-DRV-09](/en/docs/user-flows/driver#uf-drv-09-organization-owned-driver-home) | | [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) Deal responses | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) Lab-test pause | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-DRV-10](/en/docs/user-flows/driver#uf-drv-10-support), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) Lab deadline and result | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation) Admin validation | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) Missed-deadline suspension | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | | [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts) Earnings and payouts | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts) | | [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) Driver availability | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | ## TRIP — Trips [#trip--trips] | Requirement | Covered by | |---|---| | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) Trip creation wizard | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) Draft, public and targeted publishing | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips) Multi-vehicle trips | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) Program changes until departure | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle) Trip lifecycle | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) Changes that affect confirmed bookings | [UF-TRV-07](/en/docs/user-flows/traveler#uf-trv-07-choose-a-remedy-after-a-trip-change), [UF-ORG-10](/en/docs/user-flows/organization#uf-org-10-change-a-trip-after-bookings), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit) Active trip limit | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## EMP — Employees and permissions [#emp--employees-and-permissions] | Requirement | Covered by | |---|---| | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) Permission sets | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited) Permission changes are audited | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in) | | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan) Employee limit per plan | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope) Server-side scope | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal) Employee removal | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) Invitation and first sign-in | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Requirement | Covered by | |---|---| | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) Deal proposal | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) Counter-offers and expiry | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) Mutual acceptance | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection) Rejection | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) Finalization | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit) Deal audit | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [UF-ADM-09](/en/docs/user-flows/admin#uf-adm-09-deal-audit) | | [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan) Negotiation by plan | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | ## ANL — Analytics [#anl--analytics] | Requirement | Covered by | |---|---| | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) Organization analytics | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics) | | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) Supplier analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) Admin analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) Ranges, freshness and export | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics), [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) Privacy in analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | ## MOD — Moderator app [#mod--moderator-app] | Requirement | Covered by | |---|---| | [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access) Vehicle-scoped access | [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest) | | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report) End-of-trip report | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) Access revocation | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) Installable app | [UF-MOD-01](/en/docs/user-flows/moderator#uf-mod-01-install-and-first-open) | | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in) Moderator sign-in | [UF-MOD-02](/en/docs/user-flows/moderator#uf-mod-02-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) Report lock | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Requirement | Covered by | |---|---| | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) Application and supplier access | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) Single admin queue | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application) | | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) Decision time target | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) Changes requested | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) Rejection, appeal and re-application | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [UF-ADM-03](/en/docs/user-flows/admin#uf-adm-03-decide-an-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum) Photographer portfolio minimum | [UF-PHO-01](/en/docs/user-flows/photographer#uf-pho-01-register-and-apply) | | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) Driver vehicle and insurance details | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) Lab consent and initial result | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) Applicant status notifications | [applications](/en/docs/workflows/applications#timers-and-rules) | # System Workflows (/en/docs/workflows) The user flows describe what people do. This section describes what the **system** does: every process with a state, a timer, a retry or a queue — the kind of process a workflow engine owns. The SRS cites a *System workflows* source document for these; these pages are that document, fully traced to the requirements. Every page follows the same shape: the trigger, the actors, a diagram, the timers, and the **stories** the workflow serves. ## The engine contract [#the-engine-contract] All workflows in this section share the same execution rules, drawn from the SRS: | Property | Rule | Trace | |---|---|---| | States | Every workflow is one of the ten state machines (SRS section 7) or a named pipeline below | SRS section 7 | | Timers | Time-based transitions are guards on the state machine, with verbatim windows on each page | per machine | | Retries | Payment callbacks at most once per gateway event identifier; notifications 3 times with exponential backoff; refunds 3 times; webhooks 5 times over 24 hours | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | | Idempotency | Idempotency keys are valid for 24 hours; duplicate replays are ignored by client event ID | SRS section 6.4, [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) | | Jobs | Named scheduled jobs run the timers: daily, hourly, weekly and monthly cadences — see the job catalog | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) | | Failure posture | The plan service fails closed; analytics and exports degrade without blocking bookings | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [NFR-OBS-04](/en/docs/srs/quality#86-observability-nfr-obs) | ## The workflows [#the-workflows] ## Reading the timers [#reading-the-timers] Working-day SLAs (review in 2 working days, refunds sent within 2 working days) use the responsible party's market calendar. Clock timers (seat holds, quiet hours, payout runs) are absolute. Where the spec itself has not decided a value, the page says so with the open decision ID — those values follow the BRD open-decision process. ## Stories in this section [#stories-in-this-section] Each workflow page carries user stories in the standard form — *As a (role), I want (capability), so that (value)* — each traced to the requirements it serves, so product, engineering and operations share one vocabulary. # Media (/en/docs/workflows/media) Albums have a clock of their own: uploading opens only after the trip completes and lasts 14 days; processing renders thumbnail, medium, large and watermarked variants with EXIF stripped; and albums archive 30 days after the window closes. The photographer surface is [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-upload-and-publish-an-album); the traveler viewing side is [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums). **Delivery phase:** P4 Marketplace supply. ## Trigger and actors [#trigger-and-actors] - **Trigger:** the trip reaches Completed. - **Actors:** the photographer (Studio or Pro plan); the processing pipeline; the archive job; travelers with access. ## Diagram [#diagram] ```mermaid flowchart LR A[Trip Completed] --> B["Upload window opens, 14 days (D-267)"] B --> C[Create album, choose privacy mode] C --> D["Resumable batch upload by presigned URL (FR-MED-02)"] D --> E["Processing: thumbnail, medium, large, watermarked; EXIF stripped"] E --> F{"95 percent within 5 minutes (D-274)"} F --> G[Publish and notify travelers with access] B --> H["Window closes"] H --> I["Album archives 30 days later (D-268)"] G --> J{Privacy mode} J -- public --> K[View, watermarked or medium download] J -- shared link --> L["32-character token, revocable, revoked returns not found"] J -- selected users --> M[View only for chosen travelers] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Upload window | albums "only after it is Completed and within 14 days" | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-267 | | Archival | "albums archive 30 days after the window closes" | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268 | | Processing SLA | "95 percent of photos finish processing within 5 minutes" | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), D-274 | | Upload | Resumable batch upload by presigned URL, client file IDs unique per batch | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), ERD photos | | Variants | thumbnail, medium, large, watermarked; EXIF stripped | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album) | | Watermark | "bottom right, inset 3 percent of width, 30 percent opacity", Studio and Pro only | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking), [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho), D-275 | | Shared links | "32-character token and be revocable; a revoked link returns not found" — no time expiry | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) | | Download logging | kept 1 year | D-271 | | Plan limits | Album limits by plan | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | ## Stories [#stories] - **As a photographer**, I want a resumable batch that survives a dropped connection, so that a wedding-sized album uploads once. *([FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload))* - **As a traveler**, I want processed photos inside five minutes, so that the album is ready when the group chat asks. *(D-274)* - **As a traveler in a shared-link album**, I want revoked links to vanish, so that privacy decisions are enforceable. *([FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links))* - **As an organization**, I want the window to close and the album to archive on schedule, so that media obligations have an end date. *([FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268)* # Money (/en/docs/workflows/money) Money moves on rails: every booking posts to a double-entry ledger, payouts run Mondays at 06:00, invoice numbering retries three times before finance review, and a daily reconciliation at 08:00 Cairo time catches whatever the gateway disagrees about. This is the engine view of state machine 7.9 (Settlement); the finance role surface is [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-finance-views). **Delivery phase:** P2 (daily ledger reconciliation), P4 (weekly payouts), P5 (full accounting and invoices). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a paid booking, a completed trip, a refund, or the weekly clock. - **Actors:** the ledger; the payout run; the invoice service; the reconciliation job; finance. ## Diagram [#diagram] ```mermaid flowchart LR A[Booking paid] --> B[Double-entry ledger posts] B --> C["Commission line, placeholder 10 percent (D-15, OD-15)"] C --> D[Trip Completed] D --> E["Settlement opens automatically, lines computed from the ledger"] E --> F{Disputed line?} F -- yes --> G[Disputed, adjustment lines posted back] G --> E F -- no --> H["Weekly payout run, Mondays 06:00 (D-28)"] H --> I{Balance negative?} I -- yes --> J["Netted against next payout, no run while negative (D-173)"] I -- no --> K[Payout sent, statuses pending sent paid failed held] K --> L{Driver lab pause?} L -- yes --> M["Held, hold reason lab pause (D-175)"] L -- no --> N[Every line paid, no open dispute] N --> O["Settlement Closed (D-174)"] B --> P[Invoice numbering] P --> Q{Number issued?} Q -- "no, 3 retries (D-179)" --> P Q -- "3 failures" --> R[Finance review, booking stays Confirmed] Q -- yes --> S["Invoice issued, never edited, credit notes only (D-181)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Ledger | Double-entry ledger with event types booking_paid, refund, coupon, deal_cost, commission, gateway_fee, plan_charge, payout, invoice, settlement, reversal | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) | | Commission | placeholder "10 percent of the base trip price, configurable per market and per deal type" | D-15, [OD-15](/en/docs/brd/compliance#11-open-decisions), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | | Payout cadence | "weekly payout runs on Mondays at 06:00" through Stripe Connect Express, bank transfer or a local provider | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), BRD 5.2, D-28 | | Negative balance | "netted against the next payout in the same currency, and no payout runs while it is negative" | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-173 | | Holds | Payouts held during a lab-test pause | D-175 | | Invoice numbering | "numbering retries 3 times, then the case goes to finance review"; issued invoices are never edited, credit notes reference them | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), D-179 to D-181 | | Invoice type | B2B when a tax number is present, else B2C | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [BRL-28](/en/docs/brd/requirements#7-business-rules), D-180 | | Reconciliation | Gateway settlement reports compared with the ledger daily; exceptions listed | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), D-29 | | Finance digest | "A finance exceptions digest goes out daily at 08:00 Cairo time"; dashboards warn when data is more than 26 hours old | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176, D-250 | | Settlement closure | Closed when "Every line paid" and "No open dispute" | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc), D-174 | | Currencies | The market comes from the country; switches follow the market; rounding and display per market | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country), [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch), [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | | Tenant isolation | Every ledger line is tenant-scoped with the owning organization | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) | | Invoices across parties | Invoices for every party pair — traveler, organization, supplier, platform | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | Revenue reporting | Plan revenue reported for finance | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | | Exports | "expire after 7 days", "ready within 15 minutes" | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), D-249, D-177 | ## Stories [#stories] - **As a finance operator**, I want payouts to run themselves every Monday with negative balances netted, so that my week starts with exceptions, not with manual runs. *([FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-28)* - **As an organization owner**, I want a daily digest of money exceptions at a known hour, so that problems surface before callers do. *([FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176)* - **As an auditor**, I want issued invoices immutable with credit notes as the only correction, so that the trail never rewrites history. *(D-181)* - **As a driver**, I want my payout held — not lost — during a lab pause, so that resolving paperwork restores the money. *(D-175)* # Notifications (/en/docs/workflows/notifications) Notifications are a queue with manners: nothing loud between 22:00 and 07:00 recipient-local, deferred messages released at 07:00, trip-day events older than two hours dropped, one message per event per channel per recipient, and three retries with exponential backoff when a channel fails. The recipient side is [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours). **Delivery phase:** P1 (channels and templates), P3 (quiet hours). ## Trigger and actors [#trigger-and-actors] - **Trigger:** any domain event that maps to a notification template. - **Actors:** the notification service; the quiet-hours scheduler; the retry queue; the hourly reminder job. ## Diagram [#diagram] ```mermaid flowchart TD A[Domain event] --> B{Duplicate event key?} B -- "yes, one per channel per recipient" --> C[Drop, FR-NTF-06] B -- no --> D[Template in recipient language, RTL aware] D --> E{Category enabled by recipient?} E -- "no, non-security" --> F[Drop] E -- yes --> G{"Urgent? (D-289 list)"} G -- yes --> H[Send at once on enabled channels] G -- no --> I{"22:00 to 07:00 recipient local (D-289)?"} I -- no --> H I -- yes --> J[Schedule for 07:00] J --> K{Trip-day event older than 2 h?} K -- yes --> L["Drop (D-290)"] K -- no --> H H --> M{Delivery fails} M -- "retry 3x, exponential backoff" --> H M -- "3 failures" --> N[Mark failed, delivery record kept] O[Hourly job] --> P["Reminder 24 h before departure, push and email, SMS if enabled (D-27)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Quiet hours | "SMS and push shall not be sent between 22:00 and 07:00 recipient local time unless urgent"; deferred messages go at 07:00; trip-day events older than 2 hours are dropped | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf), D-289, D-290 | | Retries | "Failures retry 3 times with exponential backoff" | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | | Dedup | "One event shall produce at most one message per channel per recipient" (unique event key) | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) | | Reminders | "a reminder 24 hours before departure by push and email, plus SMS if enabled… when the hourly job runs" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-27 | | Change notices | "Vehicle, driver or time changes are notified within 1 hour" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186 | | Language | Templates versioned, language and layout per recipient with RTL | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | | Security messages | Account security messages cannot be disabled | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) | | Delivery records | Delivery states queued, sent, delivered, failed, dropped with attempt and next-attempt timestamps | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), ERD notifications | ## Stories [#stories] - **As a recipient**, I want silence between 22:00 and 07:00 unless it is urgent, so that the platform respects my night. *([FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), D-289)* - **As an operations controller**, I want trip-day staleness to drop old notifications, so that a catch-up burst never confuses the morning. *(D-290)* - **As a traveler**, I want one reminder per channel, not five, so that the trip day is calm. *([FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery))* - **As an admin**, I want versioned templates, so that a wording fix does not fork history. *([FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates))* # Refunds (/en/docs/workflows/refunds) Refunds are a pipeline, not a button: the policy engine computes the amount from the cancellation window, the coupon redemption is reversed, the gateway gets up to three attempts, and anything the gateway refuses lands in finance review. The traveler side is [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking); admin out-of-policy refunds are [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund). **Delivery phase:** P2 (policy refund), P5 (coupon reversal and full accounting). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a cancellation (traveler, organization or admin), a trip change remedy, or an out-of-policy decision. - **Actors:** the policy engine; the refund job; the gateway; finance review. ## Diagram [#diagram] ```mermaid flowchart TD A[Cancellation requested] --> B{When?} B -- "48 h or more before departure" --> C["Refund 80 percent (placeholder, D-07, OD-07)"] B -- "24 to under 48 h" --> D["Refund 50 percent (placeholder)"] B -- "Under 24 h" --> E["No refund due, booking Cancelled final"] C --> F[Reverse coupon redemption, free per-user limit] D --> F F --> G["Sent to gateway within 2 working days, shown as refund in progress"] G --> H{Gateway confirms?} H -- yes --> I[Refunded, ledger reverses revenue commission and fees] H -- "no, up to 3 retries (D-322)" --> G H -- "3 failures" --> J[Stays Refund Pending for finance review] B -- "After cut-off" --> K[Organization decides within 2 working days] K -- "no agreement" --> L[Admin decides] A2[Organization or admin cancels trip] --> M["Full refund, coupon reversed (BRL-30, D-150)"] M --> G ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Policy windows | "80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours" (placeholder) | [BRL-12](/en/docs/brd/requirements#7-business-rules), [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), D-07, [OD-07](/en/docs/brd/compliance#11-open-decisions) | | Fees | "All fees are refundable until non-refundable fees are set" | [BRL-12](/en/docs/brd/requirements#7-business-rules), D-156 | | Coupon reversal | "A refund reverses the coupon redemption and frees the traveler's per-user limit"; an Exhausted coupon returns to Active if still in its window | [BRL-11](/en/docs/brd/requirements#7-business-rules), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | | Send SLA | "sent to the gateway within 2 working days and shown as 'refund in progress'" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | Confirmation | "It is Refunded only after the gateway confirms; the ledger reverses revenue, commission and fees then" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | Retries | "Failed refunds retry 3 times, then stay Refund Pending for finance review" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-149, D-35, D-322 | | Post cut-off | "Requests after the cut-off go to the organization, which decides within 2 working days, then to admin" | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg), D-151 | | Hard stops | "No cancellation after departure or after check-in" — disputes take over | D-152, D-153 | | Trip cancelled by org or admin | "every confirmed booking is refunded in full, with coupon redemptions reversed" | [BRL-30](/en/docs/brd/requirements#7-business-rules), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), D-150 | | Out-of-policy | Admin refund with reason and audit log | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [BRL-19](/en/docs/brd/requirements#7-business-rules) | | Remedy cancel | Trip-change remedy "cancel with full refund"; refund reason includes remedy | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) | ## Stories [#stories] - **As a traveler**, I want the refund preview to show the exact policy amount before I confirm, so that I decide with real numbers. *([FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund))* - **As a finance operator**, I want gateway-refused refunds to stop in review after three retries instead of looping, so that the queue stays honest. *([FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-322)* - **As an organization**, I want a clean full-refund path when I cancel a trip, so that making travelers whole is one action, not a spreadsheet. *([BRL-30](/en/docs/brd/requirements#7-business-rules))* - **As a coupon owner**, I want a refunded booking to free my per-user coupon limit, so that a cancelled trip does not burn my discount. *([BRL-11](/en/docs/brd/requirements#7-business-rules), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal))* # Job Catalog (/en/docs/workflows/scheduled-jobs) This is the complete catalog of the platform's automated processes: countdowns that expire things, retries that chase failures, and named jobs the acceptance tests call by name — the daily job, the hourly job, the archive job, the reset job, the payout run and the reconciliation. Each entry cites its rules; the linked workflow page tells the full story. ## Countdowns (per-record timers) [#countdowns-per-record-timers] | Process | Window (verbatim) | Trace | |---|---|---| | Seat hold countdown and auto-release | 15 minutes | [BRL-08](/en/docs/brd/requirements#7-business-rules), [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-191 | | Price lock from hold start | at hold start | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-192 | | Fawry voucher hold, expiry and pre-expiry reminder | 48 hours | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), D-31, D-41 | | Payment attempts per hold | max 3 | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), D-197 | | Gateway no-answer poll and escalation | 30 s, then 1 / 5 / 10 min, admin at 15 | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-30, D-201 | | Verification code expiry, pause, resend countdown | 5 minutes; 5 wrong codes pause 15 minutes; resend after 45 to 60 s | [BRL-20](/en/docs/brd/requirements#7-business-rules), [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code), D-58, D-59, [OD-23](/en/docs/brd/compliance#11-open-decisions) | | Sign-in lockout | 15 minutes after 5 failed attempts | [BRL-21](/en/docs/brd/requirements#7-business-rules), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), D-53 | | Access and refresh token TTLs | 15 minutes; refresh rotates, 30 days; web sessions 12 hours | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens), [BRL-22](/en/docs/brd/requirements#7-business-rules), [OD-02](/en/docs/brd/compliance#11-open-decisions) | | Idempotency keys | 24 hours | SRS section 6.4, [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | | Invitation links | employee and own-supplier 7 days; admin invite 72 hours | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff), D-286, D-94, D-50 | | Deal offer expiry | 72 hours since the last counter | [BRL-26](/en/docs/brd/requirements#7-business-rules), [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry), D-14, [OD-13](/en/docs/brd/compliance#11-open-decisions) | | Remedy choice window | 7 days, then admin | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), D-148 | | Appeal window and decision | within 14 days; decided within 5 working days | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules), D-237 | | Changes-requested response | 14 days, day-7 reminder, one 7-day extension | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), D-235, [OD-32](/en/docs/brd/compliance#11-open-decisions) | | Re-apply cooldown | 30 days after rejection | [BRL-06](/en/docs/brd/requirements#7-business-rules), [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | | Dispute SLAs | acknowledge 2 wd, info answered 5 wd, resolved 10 wd, appeal 7 days (proposed) | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), D-32, D-254 | | Abuse-flag review | within 2 working days | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), D-216, D-217 | | Lab test deadline | 3 days from request, admin may set 1 to 7 | [BRL-16](/en/docs/brd/requirements#7-business-rules), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), D-242 | | Staffing-gap reassignment | alert 48 h before departure, until 24 h before | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), D-185, D-187 | | Moderator staff code | valid until 24 hours after trip end, one device | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), D-107, D-108 | | Album upload window | 14 days after trip Completed | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-267 | | Export files | ready within 15 minutes, expire after 7 days | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), D-249, D-177 | | Data copy delivery | within 30 days | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), D-162 | | Account deletion grace | 30-day grace; on day 31 the nightly job deletes | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [BRL-15](/en/docs/brd/requirements#7-business-rules), [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | | Webhook delivery | retried 5 times over 24 hours, replayable 7 days; secret rotation keeps the old secret 24 hours | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks), D-62 to D-64, [OD-18](/en/docs/brd/compliance#11-open-decisions) | ## Retry schedules (per-failure chasing) [#retry-schedules-per-failure-chasing] | Process | Schedule | Trace | |---|---|---| | Subscription dunning | days 1, 3, 5, 7 with an email at each attempt | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), D-09 | | Grace period | 7 days, features kept | [BRL-14](/en/docs/brd/requirements#7-business-rules), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [OD-29](/en/docs/brd/compliance#11-open-decisions) | | Refund gateway retries | 3 times, then Refund Pending for finance review | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-322 | | Invoice numbering | 3 retries, then finance review | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), D-179 | | Notification retries | 3 times with exponential backoff | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | | Check-in offline queue | retry every 30 s, up to 1,000 events, warn at 800, in order | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117 | | Gateway callbacks | idempotent replay, at most once per event identifier | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | ## Hourly [#hourly] | Process | Trace | |---|---| | Trip reminders, 24 hours before departure, push and email, SMS if enabled | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-27 | ## Daily [#daily] | Process | Time | Trace | |---|---|---| | Application closure of unanswered changes | daily job | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | | Lab suspension over 30 days closes the account | daily job | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension), [BRL-16](/en/docs/brd/requirements#7-business-rules) | | Account deletion on day 31 | nightly job | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) | | Gateway reconciliation against the ledger | daily | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), D-29 | | Finance exceptions digest | 08:00 Cairo time | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176 | | Stale-data warning past 26 hours | dashboards | D-250 | | Expiring driver documents reminders | continuous | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | | Quiet-hours flush of deferred messages | 07:00 recipient local | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), D-290 | ## Weekly [#weekly] | Process | Time | Trace | |---|---|---| | Payout run | Mondays at 06:00 | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-28 | ## Monthly [#monthly] | Process | Time | Trace | |---|---|---| | Plan counter reset | 00:00 on the 1st, owner's time zone | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218 | ## Archive and retention jobs [#archive-and-retention-jobs] | Process | Window | Trace | |---|---|---| | Trip archive | 30 days after Completed, settlement closed | [BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), D-26 | | Album archive | 30 days after the upload window closes | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268 | | Retention purges | check-in 1 year; GPS 90 days then hourly summary; child history 1 year; download logs 1 year; financial and audit 7 years; trips 5 years post-deletion | SRS section 6.4, [NFR-[DAT-02](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat), D-45, D-135, D-271, [OD-04](/en/docs/brd/compliance#11-open-decisions) | | Backups | daily snapshots 35 days; point-in-time 7 days; cross-region 30 days | SRS section 6.4 | ## Continuous pipelines [#continuous-pipelines] | Process | Cadence | Trace | |---|---|---| | GPS tracking | point every 5 to 10 s, batches of 10, 60-minute offline buffer | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-34, D-121 | | Seat map and map updates | within 500 ms | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map), [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) | | Check-in event delivery | within 60 seconds | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | | Photo processing | 95 percent within 5 minutes | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), D-274 | | Analytics freshness | no more than 5 minutes | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl), D-281 | | Booking throttle | 5 per traveler per hour unless verified | [NFR-SEC-15](/en/docs/srs/quality#82-security-nfr-sec) | | Maintenance window | 01:00 to 03:00 Cairo, max 4 h per month, 72 h notice | [NFR-AVL-02](/en/docs/srs/quality#83-availability-nfr-avl), D-303 | ## Standing questions [#standing-questions] Values still open in the register and marked on the workflow pages: [OD-29](/en/docs/brd/compliance#11-open-decisions) (post-grace behavior), [OD-32](/en/docs/brd/compliance#11-open-decisions) (changes-requested closure day with extension), [OD-07](/en/docs/brd/compliance#11-open-decisions) and D-07 (refund percentages), [OD-15](/en/docs/brd/compliance#11-open-decisions) and D-15 (commission rates), [OD-28](/en/docs/brd/compliance#11-open-decisions) (trial lengths), [OD-26](/en/docs/brd/compliance#11-open-decisions) (plan prices), [OD-09](/en/docs/brd/compliance#11-open-decisions) and D-146 (priority and early-access windows), D-68 (child-safety escalation contact), and the proposed 80-percent Filling Up threshold (D-189). # Subscriptions (/en/docs/workflows/subscriptions) Plans renew themselves, chase their own payment, and schedule their own demotions. Failed charges retry on days 1, 3, 5 and 7 with an email each time; a seven-day grace period follows; downgrades wait for the cycle end and can be cancelled until then. This is the engine view of state machine 7.6 (Subscription); the traveler surface is [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) and the shared plan-limit prompt is [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt). **Delivery phase:** P5 Monetization and Gulf launch. ## Trigger and actors [#trigger-and-actors] - **Trigger:** a subscription charge attempt, a plan change, or the monthly counter reset. - **Actors:** the billing product at the gateway; the dunning schedule; the reset job; admin overrides. ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Trial : approved application, no charge before approval (D-77) Trial --> Active : trial ends, payment succeeds Trial --> Grace : trial ends, payment fails Active --> Grace : renewal fails Grace --> Active : payment succeeds, retries on days 1, 3, 5, 7 Grace --> Downgraded : 7 days pass (OD-29, current rule D-08) Active --> Active : upgrade, payment succeeds, new plan at once with proration (BRL-13) Active --> Active : downgrade scheduled, effective at period end, cancellable (D-219) Downgraded --> Active : upgrade at any time Active --> Cancelling : cancel, access to end of paid period Cancelling --> Ended : period ends Grace --> Ended : cancel during grace, ends at once, no refund (D-223) ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Dunning | "Failed charges shall retry on days 1, 3, 5 and 7, with an email at each attempt" | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), D-09 | | Grace | Grace lasts 7 days with features kept | [BRL-14](/en/docs/brd/requirements#7-business-rules), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | | After grace | Post-grace behavior is [OPEN: [OD-29](/en/docs/brd/compliance#11-open-decisions)] (current rule D-08: drop to the basic tier, block new bookings and deals) | [OD-29](/en/docs/brd/compliance#11-open-decisions), D-08 | | Upgrades | "A plan upgrade takes effect at once with proration" | [BRL-13](/en/docs/brd/requirements#7-business-rules), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) | | Downgrades | "a downgrade takes effect at the end of the cycle", cancellable before then | [BRL-13](/en/docs/brd/requirements#7-business-rules), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), D-219, D-232 | | Cancellation | "Cancellation keeps access to the end of the paid period. Cancelling during grace ends the plan at once with no refund" | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), D-223 | | Trials | "A trial-start notice goes on day 0 and reminders 3 days and 1 day before the end"; trial lengths are [OPEN: [OD-28](/en/docs/brd/compliance#11-open-decisions)] | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials), D-231, [OD-28](/en/docs/brd/compliance#11-open-decisions) | | Counter reset | "at 00:00 on the 1st of each month in the owner's time zone" | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218 | | After downgrade | Over-limit items keep working; new actions hit the limit gate | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), D-144 | | Admin override | Second admin plus end date required; owner emailed; auto-reverts at the end date | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), D-227, D-230 | | Limit gate | Server-side gate returns the plan, the limit and the next tier; the plan service fails closed | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), D-224 | ## Stories [#stories] - **As a plan owner**, I want four spaced retries with an email each, so that one empty card does not end my service. *([FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), D-09)* - **As a plan owner**, I want a downgrade to wait for the cycle I paid for, so that I keep what I bought until it ends. *([BRL-13](/en/docs/brd/requirements#7-business-rules), D-219)* - **As an admin**, I want overrides to carry an end date and a second approver, so that a favor never becomes a leak. *([FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), D-227)* - **As an organization owner**, I want counters to reset on my calendar's first of the month, so that quota math matches my books. *([FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218)* # Trip Day (/en/docs/workflows/trip-day) Trip day is a machine between people: boarding codes scanned against the right vehicle, check-in events pushed within a minute, a device queue that survives dead zones, GPS points every 5 to 10 seconds, and moderator access that ends 24 hours after the trip does. The moderator side is [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger); the traveler side is [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day). **Delivery phase:** P3 Operational depth. ## Trigger and actors [#trigger-and-actors] - **Trigger:** the trip reaches In Progress. - **Actors:** the moderator's device; the check-in service; the driver's GPS stream; parents and operations watching. ## Diagram [#diagram] ```mermaid flowchart TD A[Trip In Progress] --> B[Moderator scans boarding code] B --> C{Confirmed and this vehicle?} C -- no --> D[Refuse, event type refused_wrong_vehicle] C -- "yes, duplicate" --> E[Ignore duplicate replay by client event ID] C -- yes --> F[Check in and lock seat] F --> G{"Online? (60 s target, FR-CHK-03)"} G -- yes --> H[Event reaches platform within 60 seconds] G -- "no, offline" --> I["Device queue: up to 1,000 events, warning at 800"] I --> J[Retry every 30 seconds, in order, original timestamps] J --> G A --> K[Driver app streams GPS] K --> L["Point every 5 to 10 s, batches of 10, buffer 60 min offline"] L --> M[Parent tracker and operations map, 500 ms updates] A --> N[Moderator staff code] N --> O["Valid until 24 h after trip ends, one device (D-107)"] A --> P[Vehicle departs, child not checked in] P --> Q["Not boarded flag (proposed) → parent alert → incident flow (OD-22)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Check-in delivery | "reaches the platform within 60 seconds" | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | | Offline queue | "queue on the device (up to 1,000; warning at 800), retry every 30 seconds… with original timestamps"; duplicates ignored by client event ID | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117 | | GPS cadence | "send a point every 5 to 10 seconds only while the trip is In Progress, batching up to 10 points per request and buffering up to 60 minutes offline" | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-34, D-121 | | Map freshness | map update "within 500 ms" | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | | Moderator code | "valid until 24 hours after the trip ends, on one device at a time" | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), D-107, D-108 | | End of trip | End event to parents and operations; occupancy real-time during the trip | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | | Traveler privacy | Travelers never see live position or ETA | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [BRL-29](/en/docs/brd/requirements#7-business-rules), D-317 | | No-show | Not a formal state; departure without check-in raises the proposed "not boarded" flag and the incident flow replaces cancellation | [OD-22](/en/docs/brd/compliance#11-open-decisions), D-25, parent tracker proposals | | End-of-trip report | Moderator report with headcount and mismatch reason, read-only after submit | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | | Tracking data scope | Raw GPS kept 90 days, then an hourly summary; scope limited to the trip | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | | Child data | Child-data restrictions apply to tracking, history and reports | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) | | Moderator assignment | A moderator is assigned per vehicle with a phone number before publish | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) | | Re-board | Re-board at a stop allowed (proposed) | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops), sections 7.2 and 7.3 | ## Stories [#stories] - **As a moderator**, I want check-in to work in a dead zone and sync later in order, so that a weak signal never loses a passenger. *([FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117)* - **As a parent**, I want the map to update in half a second, so that I can see the bus reach the gate. *([FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location))* - **As an operations controller**, I want GPS buffering for an hour of offline driving, so that tunnel sections do not create gaps. *([FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-121)* - **As an organization**, I want moderator access to expire a day after the trip, so that a seasonal staff code is never a standing key. *([FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), D-107)* # Trip Lifecycle (/en/docs/workflows/trip-lifecycle) A trip moves through thirteen states from Draft to Archived, and several transitions belong to the system, not to any person: start time reached, settlement closed, thirty days passed. This is the engine view of state machine 7.1; the organization side is [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard). **Delivery phase:** P2 (creation and booking), P3 (multi-vehicle and programs), P6 (tracking-era archival). ## Trigger and actors [#trigger-and-actors] - **Trigger:** an organization publishes a draft, the clock reaches departure, or the last booking completes its lifecycle. - **Actors:** the organization; the start-time job; the remedy window; the archive job; travelers choosing remedies. ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Published : publish Published --> Negotiating : platform supplier deal opens Negotiating --> Ready : deals finalized Published --> Ready : no negotiation needed Ready --> FillingUp : bookings open FillingUp --> SoldOut : last seat reserved note right of FillingUp Filling Up to Ready when seats fall below 80 percent (proposed, D-189) end note Ready --> InProgress : trip start time reached (BRL-07) FillingUp --> InProgress : trip start time reached (BRL-07) SoldOut --> InProgress : trip start time reached (BRL-07) InProgress --> PartiallyCompleted : multi-vehicle, some vehicles ended InProgress --> Completed : all vehicles ended PartiallyCompleted --> Completed Completed --> PostProcessing : albums and settlement open PostProcessing --> Archived : 30 days after Completed and settlement closed (BRL-25) Published --> Cancelled : organization or admin cancels, full refunds queued (BRL-30) Cancelled --> RefundsIssued : every confirmed booking Refunded RefundsIssued --> Archived : 30 days later ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Start transition | "Trip start time reached; trip is Ready" moves the trip to In Progress | [BRL-07](/en/docs/brd/requirements#7-business-rules), section 7.1 | | Remedy window | The traveler has "7 days to choose; then the case goes to admin"; remedy status offered, chosen, escalated, expired | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), D-148 | | Change notice | "Vehicle, driver or time changes are notified within 1 hour" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186 | | Organization cancel | "every confirmed booking is refunded in full, with coupon redemptions reversed" | [BRL-30](/en/docs/brd/requirements#7-business-rules), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), D-150 | | Settlement gate | The trip archives "30 days after Completed, and only once its settlement is closed" | [BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), D-26 | | Refunds-issued terminal | Cancelled becomes Refunds Issued when "Every confirmed booking Refunded", then Archived "30 days later" | section 7.1 | | Ready gate | A trip is Ready when staffing is complete; finalized deals assign platform suppliers and drivers see their assigned trips | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks), [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) | | Program changes | Programs changeable until departure; later changes become traveler remedies | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | | Publish gates | Drafts and targeted trips are hidden from browsing; VIP early access windows apply before public | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | ## Stories [#stories] - **As an organization**, I want the trip to start itself at departure time, so that no one has to press a button mid-operation. *([BRL-07](/en/docs/brd/requirements#7-business-rules))* - **As a traveler affected by a change**, I want seven days to pick my remedy before anyone decides for me, so that a schedule change stays my call. *([BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings))* - **As a finance operator**, I want archival gated on settlement closure, so that nothing disappears while money is still open. *([BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement))* - **As a parent**, I want vehicle or driver changes told to me within the hour, so that I am never surprised at pickup. *([FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186)* # For AI Agents (/ar/docs/ai) This documentation set is designed to be consumed by AI agents as well as people: every page is reachable as clean Markdown, full-text searchable, and queryable through an MCP server. ## Endpoints [#endpoints] | Endpoint | Returns | |---|---| | `/llms.txt` | Curated index of the whole set, grouped by section | | `/llms-full.txt` | The complete documentation as one Markdown document | | `/en/docs/.md` | Any single page as processed Markdown, e.g. `/en/docs/srs/requirements/auth.md` | | `/api/search?query=…` | Full-text search with ranked hits and section anchors | | `/api/mcp` | MCP server (Streamable HTTP, JSON-RPC 2.0) | ## MCP server [#mcp-server] Connect from any MCP client (Claude Desktop, Cursor, …) to `https:///api/mcp`. The server is stateless — no keys, no session. | Tool | Input | Returns | |---|---|---| | `list_docs` | — | All pages with titles, URLs and descriptions | | `search_docs` | `query` | Ranked hits with section anchors (same index as the site search) | | `get_doc` | `path` | The page as full processed Markdown | Example call: ```bash curl -X POST https:///api/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_docs","arguments":{"query":"seat hold"}}}' ``` ## Requirement ID vocabulary [#requirement-id-vocabulary] | Prefix | Meaning | Defined in | |---|---|---| | `FR-` | Functional requirement | Software (SRS) module pages | | `BR-` | Business requirement | Business Requirements and Rules | | `BRL-` | Business rule | Business Requirements and Rules | | `NFR-` | Non-functional requirement | Quality and Interface Requirements | | `DAT-` | Data requirement | Data Requirements | | `OD-` | Open decision | Compliance, Risks and Decisions | | `UF-` | User flow | User Flows | | `D-` | Decision register entry — an external document, not part of this site | — | # Compliance, Risks & Decisions (/ar/docs/brd/compliance) ## 8. Compliance, safety and legal [#8-compliance-safety-and-legal] ### 8.1 Child safety [#81-child-safety] - Minors travel on bookings made by a parent or guardian. A child is linked to a parent account only through a booking reference and a guardianship declaration. - Child data is visible only to the linked parent, the owning organization's authorized staff, the assigned moderator for the passenger list, and the platform admin. - Child data is never used for advertising, marketing or model training and never appears in any marketing export or audience. - Child-safety reports create a case routed to a named escalation contact and procedure, which must exist before the phase 3 pilot ([OPEN: D-68]). - Child trip history is kept 1 year. ### 8.2 Driver lab tests and background checks [#82-driver-lab-tests-and-background-checks] - Lab tests (drug screening and/or medical fitness) and background checks run in a market only after a signed legal review for that market. - Drivers consent at registration; consent records keep the type, time and text version. - Tests are free at partner labs; partner labs send results to the platform directly. - Identity documents and lab results are visible only to admins. Retention per market is set by the legal review. ### 8.3 Data protection [#83-data-protection] - Applicable regimes: Egypt's Personal Data Protection Law, Saudi PDPL, UAE data protection law, and GDPR where EU residents' data is processed. - Users can request a copy of their data (delivered within 30 days of a verified request, D-162) and deletion ([BRL-15](/en/docs/brd/requirements#7-business-rules)). - Marketing consent is separate from transactional messages. - Card data is handled only by gateways. - Hosting region and data residency per market are an engineering decision recorded in the SRS. ### 8.4 Tax and invoicing [#84-tax-and-invoicing] - Invoices follow each market's tax rules. VAT rates per market are supplied by Finance ([OD-27](/en/docs/brd/compliance#11-open-decisions)). - ZATCA e-invoicing is out of scope for phases 1 to 4; its scope is decided before the Saudi launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)). - If invoice numbering fails, no invoice is issued, the booking stays Confirmed, numbering retries 3 times and the case goes to finance review (D-179). ### 8.5 Audit and retention [#85-audit-and-retention] | Data | Retention | |---|---| | Audit log (admin actions, permission changes) | 7 years | | Bookings, payments, invoices, ledger and payouts | 7 years ([OD-04](/en/docs/brd/compliance#11-open-decisions), pending legal review) | | Trip records after account deletion | 5 years | | Check-in and check-out events | 1 year | | Raw GPS points | 90 days | | Child trip history | 1 year | | Album download logs | 1 year | | Identity documents and lab results | Per market legal review | ## 9. Assumptions, dependencies and constraints [#9-assumptions-dependencies-and-constraints] ### 9.1 Assumptions [#91-assumptions] - One product, one codebase, multi-tenant data. - Organizations have a verifiable legal entity in their market. - Travelers pay by card, wallet or local cash methods. - Moderators have a smartphone with GPS and mobile data during the trip. - Lab partners exist in each launch market and can send results to the platform. ### 9.2 Dependencies [#92-dependencies] - Payment gateways: Stripe (international cards, Apple Pay, Google Pay, Stripe Connect Express payouts), Paymob or Tap (local cards in MENA), Fawry (cash in Egypt). - SMS and WhatsApp messaging, transactional email, push (FCM and APNS). - Maps and routing. - Lab partner network per market. - Business registry and tax number checks (manual in phase 1; automated provider [OD-16](/en/docs/brd/compliance#11-open-decisions)). ### 9.3 Constraints [#93-constraints] - Arabic and English from the first release, with right-to-left layouts. - Launch order: Egypt pilot in phase 2; Saudi Arabia and the UAE in phase 5 (D-69). - Organizations register on the web only. - Admin console and organization dashboard use separate routes (admin.trips-enjoy.com, business.trips-enjoy.com). - The driver app is mobile; the photographer studio is responsive web in phase 1; the moderator app is an installable web app on phones; the parent tracker is a section of the traveler app (D-86, D-124). - Maintenance windows fall between 01:00 and 03:00 Cairo time, no more than 4 hours per month, with 72 hours' notice (D-303). ## 10. Risks [#10-risks] | ID | Risk | Impact | Mitigation | |---|---|---|---| | RSK-01 | Data leaks between organizations | Loss of trust, legal exposure | Isolation at database, service and API layers; cross-tenant tests and security review each phase | | RSK-02 | Low supplier supply in the pilot | Organizations cannot staff trips | Organization-owned suppliers first (P1 to P3); platform supply in P4 | | RSK-03 | Lab tests or background checks unlawful in a market | Feature blocked, legal exposure | Legal review per market before use (section 8.2) | | RSK-04 | Poor connectivity on buses | Missed check-ins, wrong headcounts | Offline queue with original timestamps; 60-second target after reconnect | | RSK-05 | Coupon abuse | Revenue loss | Scope rules, per-user limits, abuse flags with admin review | | RSK-06 | Payment gateway outage on a launch day | Lost bookings | Several gateways per market; queued callbacks; pending state instead of failure | | RSK-07 | Plan prices not set before P5 | Monetization delayed | [OD-26](/en/docs/brd/compliance#11-open-decisions) owned by Finance with a P4 deadline | | RSK-08 | Design canvas shows values that conflict with decisions (Saudi-first, SAR, ZATCA, monthly payouts) | Wrong build | Design value audit (claude/design-value-conflicts.md) resolved before P2 build | ## 11. Open decisions [#11-open-decisions] Status: Decided (value applied in this BRD), Proposed (working value, needs sign-off), Open (no value). | ID | Topic | Status | Value or note | Owner | |---|---|---|---|---| | [OD-01](/en/docs/brd/compliance#11-open-decisions) | Launch market order | Decided | Egypt pilot P2; Saudi Arabia and UAE P5 (D-69) | Product | | [OD-02](/en/docs/brd/compliance#11-open-decisions) | Drafts when a session ends | Decided | Drafts kept ([BRL-22](/en/docs/brd/requirements#7-business-rules)) | Product | | [OD-03](/en/docs/brd/compliance#11-open-decisions) | Second factor for organization staff | Decided | SMS or authenticator at every sign-in (D-48) | Product | | [OD-04](/en/docs/brd/compliance#11-open-decisions) | Financial record retention | Proposed | 7 years, pending legal review | Legal | | [OD-05](/en/docs/brd/compliance#11-open-decisions) | Child tracking eligibility | Proposed | Parent Explorer or VIP AND organization Growth or Enterprise with trip switch on | Product | | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Plan for moderators | Open | Proposed: covered by the organization's plan, like [OD-19](/en/docs/brd/compliance#11-open-decisions) | Product | | [OD-07](/en/docs/brd/compliance#11-open-decisions) | Refund table and non-refundable fees | Proposed | 80 / 50 / 0 ([BRL-12](/en/docs/brd/requirements#7-business-rules)); no non-refundable fees until set | Operations | | [OD-08](/en/docs/brd/compliance#11-open-decisions) | Priority seat window length | Open | D-316 | Product | | [OD-09](/en/docs/brd/compliance#11-open-decisions) | VIP early-access window | Open | D-146 | Product | | [OD-10](/en/docs/brd/compliance#11-open-decisions) | Saudi e-invoicing (ZATCA) scope | Open | Out of P1 to P4; decide before Saudi launch | Finance | | [OD-11](/en/docs/brd/compliance#11-open-decisions) | Gateway per market | Proposed | Stripe, Paymob or Tap, Fawry (Egypt); Gulf confirmed at launch | Engineering | | [OD-12](/en/docs/brd/compliance#11-open-decisions) | Admin account provisioning | Decided | Created by an existing admin; authenticator on first sign-in | Product | | [OD-13](/en/docs/brd/compliance#11-open-decisions) | Negotiation limit and expiry | Decided | No round limit; 72 hours after last counter ([BRL-26](/en/docs/brd/requirements#7-business-rules)) | Product | | [OD-14](/en/docs/brd/compliance#11-open-decisions) | Annual billing discount | Proposed | 15 percent (D-16) | Finance | | [OD-15](/en/docs/brd/compliance#11-open-decisions) | Commission rates | Proposed | 10 percent of base trip price, per market and deal type (D-15) | Finance | | [OD-16](/en/docs/brd/compliance#11-open-decisions) | Business registry check provider | Open | Manual in P1 | Operations | | [OD-17](/en/docs/brd/compliance#11-open-decisions) | Ratings and reviews | Decided | Out of scope until after P6 | Product | | [OD-18](/en/docs/brd/compliance#11-open-decisions) | CRM targets and webhook policy | Decided (policy), Open (CRM targets) | Signed, 5 retries over 24 hours, 7-day replay, no plan gate (D-62 to D-64) | Product | | [OD-19](/en/docs/brd/compliance#11-open-decisions) | Plan for organization-owned drivers and photographers | Proposed | Covered by the organization's plan; allowance per plan open (D-97) | Product | | [OD-20](/en/docs/brd/compliance#11-open-decisions) | Out-of-scope coupon message | Decided | Generic "not applicable to this booking" | Product | | [OD-21](/en/docs/brd/compliance#11-open-decisions) | Default tier on approval | Decided | Organization Starter (D-24); driver and photographer Basic (D-78); plan chosen at registration with no charge before approval (D-77) | Finance | | [OD-22](/en/docs/brd/compliance#11-open-decisions) | Cancelling a trip in progress | Decided | Not allowed; incident handling only (D-25) | Operations | | [OD-23](/en/docs/brd/compliance#11-open-decisions) | Verification by role | Decided | Travelers one contact; suppliers and owners both (D-20) | Product | | [OD-24](/en/docs/brd/compliance#11-open-decisions) | Lab-test deadline | Decided | 3 days default, admin 1 to 7 (D-21) | Operations | | [OD-25](/en/docs/brd/compliance#11-open-decisions) | Plan gate on program enrollment report | Open | No gate until confirmed | Product | | [OD-26](/en/docs/brd/compliance#11-open-decisions) | Plan prices per role and market | Open | None set in any approved doc | Finance | | [OD-27](/en/docs/brd/compliance#11-open-decisions) | VAT rate per market | Open | Finance to supply, Egypt first | Finance | | [OD-28](/en/docs/brd/compliance#11-open-decisions) | Trial lengths per plan | Open | Configurable; no default | Finance | | [OD-29](/en/docs/brd/compliance#11-open-decisions) | What happens when grace ends | Open | Decision register D-08 says downgrade to the basic tier and block new bookings; [BRL-02](/en/docs/brd/requirements#7-business-rules) requires an active plan for non-travelers, which implies a lockout. Product to reconcile. | Product | | [OD-30](/en/docs/brd/compliance#11-open-decisions) | Webhook endpoints per plan | Open | D-65 | Product | | [OD-31](/en/docs/brd/compliance#11-open-decisions) | Deal fee when cancelled after assignment | Open | D-278 | Finance | | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Changes-requested closure day when the extension is used | Open | Register says day 14; mobile decisions propose day 21 | Product | ## 12. Approval [#12-approval] | Role | Name | Decision | Date | |---|---|---|---| | Product owner | [OPEN] | | | | Finance | [OPEN] | | | | Operations | [OPEN] | | | | Legal | [OPEN] | | | | Engineering lead | [OPEN] | | | # Business Requirements (/ar/docs/brd) ## 1. Document control [#1-document-control] **Product** Trips Enjoy (trips-enjoy.com) **Document type** Business Requirements Document **Version** 1.1 **Date** 9 November 2026 **Status** For review. Items marked [OPEN] need a decision. Items marked (placeholder) carry a working value that the named owner must confirm. **Owner** Product (Trips Enjoy) **Approvers** [OPEN: named approvers, D-314] **Companion documents** [SRS](/en/docs/srs) v1.1 (software requirements), [ERD](/en/docs/erd) (data model), user-flows/ (per-app flows), Tasks.md (delivery backlog), trips-enjoy-technical-architecture.md (architecture). **Rule for this document** No code, schemas or diagrams in code form. Those live in the SRS, the ERD and the architecture document. ### 1.1 What changed in v1.1 [#11-what-changed-in-v11] | Change | Reason | |---|---| | Rebuilt the numbered BRD (BR, BRL, OD, RSK IDs) that SRS v1.0 traces to. The v1.0 file was not in the project, so IDs are reconstructed from the SRS traceability matrix and kept stable. | SRS v1.0 cites [BRD](/en/docs/brd) v1.0, which was missing from the project. | | Folded in the October 2026 product rules: country-based market values, active plan required for every non-traveler role, organization CRM and webhooks, B2B and B2C invoices, settlements between all parties, analytics by page, organization, trip, customer and provider, staff switching between organizations, lab tests at any time. | Product decisions recorded October 2026. | | Added BR-MKT, BR-ANL, [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc), [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm), [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org), [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) and [BRL-25](/en/docs/brd/requirements#7-business-rules) to [BRL-30](/en/docs/brd/requirements#7-business-rules). | New scope. | | Applied decided values from the decision register (D-numbers) where the earlier text was open. | Decision register values as quoted in claude/design-value-conflicts.md (17 Oct 2026). | | Fixed the lab-test deadline in [BRL-16](/en/docs/brd/requirements#7-business-rules) (3 days, admin-adjustable 1 to 7). | SRS conflict C-05. | ## 2. Executive summary [#2-executive-summary] ### 2.1 Problem and opportunity [#21-problem-and-opportunity] Organized group trips in Egypt and the Gulf (school trips, company outings, religious and tourism tours, events) are run on spreadsheets, WhatsApp groups and cash. Organizers cannot see which traveler is on which bus, suppliers (drivers and photographers) are booked informally with no record of the agreed price, and parents have no reliable way to know where their children are. Travelers pay without receipts, and organizers have no accounting per trip. Trips Enjoy is a bilingual (Arabic and English), multi-tenant marketplace and operations platform for organized group trips. One trip record covers many vehicles, each with its own driver and moderator. Organizations sell trips and optional programs to travelers, hire independent drivers and photographers through negotiated deals, check every passenger onto the right vehicle, give parents a live view of their own children, and get per-trip accounting, invoices and settlements. ### 2.2 Business objectives and success measures [#22-business-objectives-and-success-measures] | ID | Objective | Measure | Target | |---|---|---|---| | OBJ-01 | Let organizations run multi-vehicle trips from one record | Pilot trip: three buses, about 120 passengers, run end to end in the platform | Passed in phase 3 | | OBJ-02 | Know where every passenger is | Check-in or check-out event logged after physical boarding | Within 60 seconds of boarding, including after short connection loss | | OBJ-03 | Admit suppliers and organizations quickly and safely | Median time from submitted application to decision | 2 working days or less | | OBJ-04 | Make supplier prices transparent | Platform suppliers assigned through a finalized deal with both parties' acceptance | 100 percent | | OBJ-05 | Build recurring revenue | Monthly recurring revenue from plans across all roles | [OPEN: target, D-71] | | OBJ-06 | Keep money correct | Ledger entries balance; exports reconcile with the ledger | 100 percent; daily reconciliation with gateways | | OBJ-07 | Give parents confidence | Parents on eligible plans see their linked children's vehicle, seat, check-in status and programs | Live during the trip | | OBJ-08 | Serve each market correctly | Currency, payment methods and tax rules follow the country of the account | Every amount labeled with its currency | ## 3. Scope [#3-scope] ### 3.1 In scope [#31-in-scope] - Role-specific registration, verification, sign-in and multi-role accounts. - Applications and admin approval for organizations, platform drivers and platform photographers. - Organization workspaces: employees and permissions, fleet and vehicle types, trips and programs, organization-owned drivers and photographers, coupons, plans, invoices, accounting, analytics, CRM and webhooks. - Traveler discovery, booking, seats, programs, coupons, payment, cancellation, refunds, receipts and invoices. - Deal negotiation between organizations and platform suppliers. - Vehicle moderators: check-in, check-out, incidents, end-of-trip report. - Live tracking for operations and for parents of linked children. - Photo albums with three privacy modes. - Driver lab-test workflow. - Plans and subscriptions for every role, feature gates, dunning and overrides. - Ledger, payouts, settlements, reconciliation and exports. - Notifications on email, SMS, WhatsApp, push and in-app. - Market configuration by country. - Platform admin console. ### 3.2 Out of scope (this release) [#32-out-of-scope-this-release] - Ratings and reviews ([OD-17](/en/docs/brd/compliance#11-open-decisions), after phase 6). - Hotel and flight inventory. - In-app purchase of plans on mobile (plans are paid through the gateway's browser page). - Biometric sign-in (no app lock or Face ID in phase 1). - Machine-learning recommendations and fraud scoring. - Saudi ZATCA e-invoicing integration until [OD-10](/en/docs/brd/compliance#11-open-decisions) is decided (phase 5 at the latest). ### 3.3 Delivery phases [#33-delivery-phases] | Phase | Theme | Definition of done | |---|---|---| | P1 Foundation | Accounts, organization applications and approval, tenancy | An organization can apply, be approved and sign in to an empty workspace. | | P2 Single-vehicle pilot (Egypt) | Trip creation, traveler booking, payment in EGP, admin basics | One pilot organization sells one trip to real travelers with real payments. | | P3 Operational depth | Multi-vehicle trips, programs, seat modes, moderator app, check-in | A three-bus trip with about 120 passengers runs end to end. | | P4 Marketplace supply | Platform drivers and photographers, lab tests, negotiation, media | Organizations book platform suppliers through deals and deliver albums with all privacy modes. | | P5 Monetization and Gulf launch | Plans for all roles, feature gates, coupons, full accounting, invoices; Saudi Arabia (SAR) and UAE (AED) | Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once [OD-10](/en/docs/brd/compliance#11-open-decisions) is decided. | | P6 Family and scale | Live tracking, parent tracker, analytics, public API | Parents see their children live; organizations get analytics and integrations. | ## 4. Stakeholders and roles [#4-stakeholders-and-roles] ### 4.1 Roles [#41-roles] | Role | Description | Plan required to use the app | |---|---|---| | Visitor | Not signed in. Browses public trips and registration pages. | No | | Traveler | Books and attends trips. Can be a parent or guardian. | No. Free by default; Explorer and VIP add features. | | Parent or guardian | A traveler who links children to bookings and tracks them. | Explorer or VIP for child tracking | | Organization owner | Registers the organization, pays the plan, runs the workspace. | Yes: Starter, Growth or Enterprise | | Organization employee | Works inside one or more organizations within granted permissions. | Covered by the organization's plan | | Organization-owned driver or photographer | Works for one organization only; invisible to others. | Covered by the organization's plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | | Platform driver | Independent, admin-approved; hired through deals. | Yes: Basic, Professional or Premium | | Platform photographer | Independent, admin-approved; hired through deals. | Yes: Basic, Studio or Pro | | Vehicle moderator | Supervises one vehicle on one trip; checks passengers in and out. | [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)] | | Platform admin | Trips Enjoy staff. Roles: Super admin, Operations, Finance (D-49). | Staff | ### 4.2 Glossary [#42-glossary] | Term | Meaning | |---|---| | Organization | A travel company, school, employer or event organizer that runs trips. Older documents say "Company". Each organization is an isolated tenant. | | Traveler | A person who books and attends trips. Older documents say "User" or "Passenger". | | Trip | One organized trip record. It may run many vehicles. | | Program | An optional or required activity inside a trip, with its own pricing. | | Vehicle type | A reusable seat layout with labeled seats. | | Deal | A negotiated price between an organization and a platform supplier for one vehicle or trip. | | Moderator | The person supervising one vehicle on one trip. | | Market | The country whose currency, payment methods, tax rules and default time zone apply. | | Settlement | The record of amounts owed between the platform, an organization and its suppliers for a trip, tracked until paid. | | Ledger | The double-entry record of every financial event. | | Hold | A temporary 15-minute reservation of a seat during checkout. | | Grace period | 7 days after a failed renewal during which plan features stay active. | ### 4.3 Role journeys at a glance [#43-role-journeys-at-a-glance] The detailed flows are in user-flows/. This table states, for each role, what registration needs, how approval works and what the role can do once active. | Role | Registration needs | Approval | Main actions once active | |---|---|---|---| | Traveler | Name, email and/or phone, password or one-time code, country, language. At least one of email or phone verified (D-20). | None. Active on verification, Free plan. | Browse and book trips, choose programs and seats where allowed, apply coupons, pay, cancel, get receipts and invoices, view albums, link children and track them (Explorer or VIP), upgrade plan, apply for a supplier role. | | Organization | Owner name, email and phone (both verified), country, legal and trade names, commercial registration and tax numbers, registration documents, billing contact, chosen plan (no charge before approval). Web only. | Admin reviews documents and registry check (manual in P1). Approve, request changes (14 days) or reject with reason (re-apply after 30 days, appeal within 14 days). On approval: tenant created, Starter by default (D-24) or the chosen plan. | Run the workspace: employees and permissions, fleet, trips and programs, own drivers and photographers, deals with platform suppliers, seats, coupons, bookings, check-in oversight and live operations, invoices, accounting, settlements, analytics, CRM and webhooks, plan and billing. | | Platform driver | Name, email and phone (both verified), country, national ID and driving license, own-vehicle details where used (plate, model, year, seats, registration, insurance valid 3+ months), consent to lab tests, initial lab result dated within 30 days, service regions, chosen plan. | Admin reviews documents, license, insurance and lab result. Same decision options as organizations. On approval: Basic plan by default (D-78) or the chosen plan. | Set availability, receive and negotiate deals, run assigned vehicles, share GPS during trips, see earnings and weekly payouts, create coupons for own bookings, complete lab tests when requested. | | Platform photographer | Name, email and phone (both verified), country, ID, at least 8 portfolio photos, equipment, service areas, rates, chosen plan. | Admin reviews identity and portfolio. Same decision options. Basic plan by default (D-78) or the chosen plan. | Manage portfolio, rates and availability, negotiate deals, upload albums after the trip with plan-allowed privacy, watermark (Studio and Pro), see earnings, create coupons for own bookings. | | Organization-owned driver or photographer | Invited by the organization by SMS or email (link valid 7 days, D-94). Name, phone, country; driver license for drivers. | No admin approval. Accepted on assignment by the organization ([BRL-05](/en/docs/brd/requirements#7-business-rules)). | Work only on that organization's trips. | | Employee | Invited by email (link valid 7 days, D-286). Sets password and second factor on first sign-in. | Owner grants a permission set. | Act within granted permissions; switch between organizations that list their email. | | Moderator | Phone required. Assigned by the organization to one vehicle on one trip. Staff code valid until 24 hours after trip end, one device at a time (D-107, D-108). | Assignment by the organization. | Manifest, check-in and check-out, incidents, end-of-trip report, for the assigned vehicle only. | | Platform admin | Created by an existing admin (invite valid 72 hours, D-50). Authenticator set up on first sign-in. | Super admin creates. | Review applications and appeals, manage accounts, plans, coupons, templates and flags, request lab tests, handle disputes and refunds outside policy, run payouts, oversee settlements and reconciliation, read the audit log. | ## 5. Commercial model [#5-commercial-model] ### 5.1 Plans [#51-plans] No plan prices are set in any approved document. Prices come from the plan catalog per market and need Finance sign-off ([OD-26](/en/docs/brd/compliance#11-open-decisions)). Trial length is a per-plan setting with no approved default ([OD-28](/en/docs/brd/compliance#11-open-decisions)). **Organization plans** | Feature | Starter | Growth | Enterprise | |---|---|---|---| | Active trips per month (trips Published through Completed that were created this cycle, D-143) | 5 | 20 | Unlimited | | Employees | 5 | 20 | Unlimited | | Vehicles per trip | 2 | 10 | Unlimited | | Programs per trip | 3 | 15 | Unlimited | | Platform drivers and photographers | Own only | Own and platform | Own and platform | | Seat self-selection | No | Yes | Yes | | Child tracking | No | Yes | Yes | | Coupons (active and paused, D-203) | 5 | 20 | Unlimited | | Accounting | Basic | Advanced | Full with export | | Analytics | No | Basic | Full | | Invoices (B2B and B2C) | Yes (D-178) | Yes | Yes | | CRM and webhooks | Yes, no plan gate (D-64); endpoint count per plan [OPEN: D-65] | Yes | Yes | | Priority support | No | No | Yes | | Custom branding | No | No | Yes | **Platform driver plans** | Feature | Basic | Professional | Premium | |---|---|---|---| | Active bookings per month | 3 | 10 | Unlimited | | Profile visibility | Standard | Featured | Top placement | | Deal negotiation | Yes | Yes | Yes | | Coupons | 3 | 10 | Unlimited | | History and reports | Basic | Full | Full with export | | Search priority and verified badge | No | Yes | Yes | | Earnings dashboard | Basic | Advanced | Advanced | | Support | Standard | Priority | Dedicated | **Photographer plans** | Feature | Basic | Studio | Pro | |---|---|---|---| | Active bookings per month | 3 | 10 | Unlimited | | Portfolio images | 10 | 50 | Unlimited | | Albums per trip | 1 | 5 | Unlimited | | Coupons | 3 | 10 | Unlimited | | Album privacy | Public only | Public and shared link | Public, shared link and selected users | | Profile visibility | Standard | Featured | Top placement | | Verified badge and watermarking | No | Yes | Yes | | Earnings and reports | Basic | Full | Full with export | | Support | Standard | Priority | Dedicated | **Traveler plans** | Feature | Free | Explorer | VIP | |---|---|---|---| | Trip bookings | Unlimited | Unlimited | Unlimited | | Program discount (programs only, not the base trip price) | None | 5 percent | 10 percent | | Coupons | Yes | Yes | Yes | | Early access to trips | No | No | Yes (window [OPEN: D-146]) | | Priority seat selection | No | Yes | Yes (window [OPEN: D-316]) | | Child tracking | No | Yes | Yes | | Booking history and receipts | Basic (12 months, proposed) | Full | Full with export | | VIP-only programs | No | No | Yes | | Ad-free | No | Yes | Yes | | Support | Standard | Priority | Dedicated | **Plan lifecycle (all roles)** - Billing monthly or annually. Annual discount placeholder 15 percent (D-16, [OD-14](/en/docs/brd/compliance#11-open-decisions)). - Upgrade takes effect at once, with the prorated difference charged. Downgrade takes effect at the end of the cycle with no proration. A scheduled downgrade can be cancelled ([BRL-13](/en/docs/brd/requirements#7-business-rules)). - Failed renewal: retries on days 1, 3, 5 and 7 with an email at each attempt (D-09); 7-day grace period with features kept ([BRL-14](/en/docs/brd/requirements#7-business-rules)). What happens after grace is [OD-29](/en/docs/brd/compliance#11-open-decisions). - Items above a lower limit after a downgrade keep working; no new items can be added until the count is under the limit (D-144). - Monthly counters reset at 00:00 on the 1st in the organization's time zone (D-218). - Admin overrides need a second admin and an end date, notify the owner, and revert at the end date (D-227, D-230). - If the plan service is down, actions that involve money or limits fail closed; read-only screens stay available (D-224). ### 5.2 Revenue and costs [#52-revenue-and-costs] | Stream | Type | Rule | |---|---|---| | Plan subscriptions (all roles) | Revenue | Recurring, per market currency. | | Booking commission | Revenue | Placeholder 10 percent of the base trip price, configurable per market and per deal type (D-15, [OD-15](/en/docs/brd/compliance#11-open-decisions)). Provider screens show a ledger line without printing the rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is decided. | | Deal commission | Revenue | Per deal type and market ([OD-15](/en/docs/brd/compliance#11-open-decisions)). | | Gateway fees | Cost | Recorded as a platform cost in the ledger. No rate set. | | Supplier payouts | Pass-through | Weekly, Monday 06:00, through Stripe Connect Express, bank transfer or a local provider (D-28). | | Refunds | Reversal | Reverse revenue, commission and coupon redemption. | ### 5.3 Markets [#53-markets] Market values are country-based ([BRL-27](/en/docs/brd/requirements#7-business-rules)). | Market | Phase | Currency | Payment methods | Default time zone | Tax and invoicing | |---|---|---|---|---|---| | Egypt | P2 pilot | EGP | Stripe (international cards, Apple Pay, Google Pay), Paymob or Tap (local cards), Fawry (cash) | Cairo | Egyptian rules; VAT rate to be supplied by Finance ([OD-27](/en/docs/brd/compliance#11-open-decisions)) | | Saudi Arabia | P5 | SAR | Stripe, Paymob or Tap; local methods confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)) | Riyadh | Saudi VAT; ZATCA e-invoicing scope decided before launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | | United Arab Emirates | P5 | AED | Stripe, Paymob or Tap; confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)) | Dubai | UAE VAT ([OD-27](/en/docs/brd/compliance#11-open-decisions)) | - Every amount shows its currency code. Western digits 0 to 9 in both languages (D-159). - Amounts are kept in minor units and rounded half up per line; totals are the sum of the rounded lines (D-157). - A booking is priced and paid in the currency of the organization's market. Cross-currency booking is out of scope. # Business Requirements & Rules (/ar/docs/brd/requirements) ## 6. Business requirements [#6-business-requirements] Priority uses MoSCoW: M must, S should, C could. Phase is the delivery phase in section 3.3. ### 6.1 Accounts and access (AUTH) [#61-accounts-and-access-auth] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-AUTH-01](/en/docs/brd/requirements#61-accounts-and-access-auth) | Each role registers through its own path (traveler, driver, photographer, organization). There is no combined onboarding form. | M | P1 | | [BR-AUTH-02](/en/docs/brd/requirements#61-accounts-and-access-auth) | Every registration form records the applicant's country. | M | P1 | | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth) | Accounts verify contact details by one-time code before acting: travelers verify at least one of email or phone; drivers, photographers and organization owners verify both (D-20). | M | P1 | | [BR-AUTH-04](/en/docs/brd/requirements#61-accounts-and-access-auth) | Sign-in strength follows the role: admins use password plus an authenticator; organization staff use password plus an SMS or authenticator code at every sign-in; travelers and suppliers use password or one-time code; moderators use a staff code. | M | P1 | | [BR-AUTH-05](/en/docs/brd/requirements#61-accounts-and-access-auth) | One person can hold several roles (for example traveler and approved photographer) and switch between them without a second account. | M | P1 | | [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth) | Organization staff can switch between the organizations whose access list includes their email, and see no other organization. | M | P1 | | [BR-AUTH-07](/en/docs/brd/requirements#61-accounts-and-access-auth) | Admin can suspend and reinstate any account. Suspension stops access at once and keeps the data. | M | P1 | | [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | A user can request account deletion, with a 30-day grace period during which signing in restores the account. | M | P5 | ### 6.2 Applications and approvals (ONB) [#62-applications-and-approvals-onb] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ONB-01](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Organizations, platform drivers and platform photographers apply before they can act. Supplier actions stay blocked until approval. | M | P1 (organizations), P4 (suppliers) | | [BR-ONB-02](/en/docs/brd/requirements#62-applications-and-approvals-onb) | All applications reach one admin queue with their documents. Admin can approve, request changes or reject; a rejection needs a reason. | M | P1 | | [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | The median decision time is 2 working days or less; overdue applications are flagged. | M | P1 | | [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb) | When changes are requested, the applicant has 14 days to respond, with a reminder on day 7 and one 7-day extension on request (D-235). Unanswered applications close. | M | P1 | | [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb) | A rejected applicant can appeal within 14 days of the notice (statement and up to 5 files, decided within 5 working days, one appeal per rejection, D-237) and can re-apply after 30 days. A closed application counts as rejected. The traveler account keeps working. | M | P1 | | [BR-ONB-06](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Photographer applications include at least 8 portfolio photos. | M | P4 | | [BR-ONB-07](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Drivers using their own vehicle give plate, model, year, seat count, registration and insurance valid for at least 3 more months. | M | P4 | | [BR-ONB-08](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Driver applications record consent to lab tests and include an initial lab result dated within the last 30 days. | M | P4 | | [BR-ONB-09](/en/docs/brd/requirements#62-applications-and-approvals-onb) | Applicants are notified of every status change in their language. | M | P1 | ### 6.3 Organizations and employees (ORG) [#63-organizations-and-employees-org] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ORG-01](/en/docs/brd/requirements#63-organizations-and-employees-org) | Each approved organization gets an isolated workspace that no other organization can see. | M | P1 | | [BR-ORG-02](/en/docs/brd/requirements#63-organizations-and-employees-org) | The owner invites employees and grants each a permission set (trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics). Employee count follows the plan. | M | P1 | | [BR-ORG-03](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations can onboard their own drivers and photographers, visible only to them and accepted on assignment without admin approval. | M | P1 | | [BR-ORG-04](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations register their vehicles (plate, model, year, seats, registration status). | M | P2 | | [BR-ORG-05](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations choose whether travelers can pick their own seats, per trip or for the account, where the plan allows. | M | P3 | | [BR-ORG-06](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations can connect a CRM and send trip, booking and check-in events to external apps through signed webhooks. | S | P6 | | [BR-ORG-07](/en/docs/brd/requirements#63-organizations-and-employees-org) | Organizations issue B2B and B2C invoices for their trips; corrections are made by credit note. | M | P5 | | [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org) | Enterprise organizations can apply custom branding to traveler-facing trip pages, emails and invoices. | C | P6 | ### 6.4 Trips, programs and fleet (TRIP, PRG, FLT) [#64-trips-programs-and-fleet-trip-prg-flt] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-TRIP-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Organizations create trips through a guided wizard: basics, schedule and route, vehicles, staffing, programs, seating, pricing and capacity, publishing. | M | P2 | | [BR-TRIP-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A trip can be saved as a hidden draft, published publicly, or published to targeted travelers only. | M | P2 | | [BR-TRIP-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A trip can run several vehicles at once, each with one vehicle type, one driver and one moderator. The vehicle count follows the plan. | M | P3 | | [BR-TRIP-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Programs can be added, edited and removed until the trip starts. | M | P3 | | [BR-PRG-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Each program has one pricing model: free, per person, by quantity, per group, or tiered. Program count follows the plan. | M | P3 | | [BR-PRG-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | A program can be optional, pre-required (auto-included), capacity-limited or VIP-only. | M | P3 | | [BR-PRG-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Travelers see a live booking total as they add or remove programs, including their plan's program discount. | M | P3 | | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Organizations see who chose each program, quantities and revenue. Report depth by plan is [OD-25](/en/docs/brd/compliance#11-open-decisions). | M | P3 | | [BR-FLT-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | Vehicle types are reusable seat layouts with labeled seats. | M | P2 | ### 6.5 Staffing and deals (STF) [#65-staffing-and-deals-stf] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-STF-01](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Each vehicle is driven either by an organization-owned driver or by a platform driver hired through a deal. | M | P3 | | [BR-STF-02](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A trip's photographer is either organization-owned or a platform photographer hired through a deal. | M | P4 | | [BR-STF-03](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Organizations and platform suppliers negotiate the price of a deal: either side proposes, counters or rejects, with no round limit. An offer expires 72 hours after the last counter ([BRL-26](/en/docs/brd/requirements#7-business-rules)). Platform suppliers are available only on plans that include them. | M | P4 | | [BR-STF-04](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A platform supplier is assigned only after both parties accept the same terms. | M | P4 | | [BR-STF-05](/en/docs/brd/requirements#65-staffing-and-deals-stf) | A trip is Ready only when every vehicle has a confirmed driver and moderator and every platform deal is finalized. | M | P3 | | [BR-STF-06](/en/docs/brd/requirements#65-staffing-and-deals-stf) | Suppliers see trip, route, date and pay before they respond to a deal. | M | P4 | ### 6.6 Seats (SEAT) [#66-seats-seat] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-SEAT-01](/en/docs/brd/requirements#66-seats-seat) | Seating is company-assigned by default. Self-selection is available only on Growth and Enterprise and only where the organization enables it. | M | P3 | | [BR-SEAT-02](/en/docs/brd/requirements#66-seats-seat) | With self-selection on, travelers see a live seat map where taken seats show as unavailable immediately. | M | P3 | | [BR-SEAT-03](/en/docs/brd/requirements#66-seats-seat) | Explorer and VIP travelers get a priority window for seat selection (length [OPEN: D-316]). | S | P3 | | [BR-SEAT-04](/en/docs/brd/requirements#66-seats-seat) | A seat chosen at checkout is held for 15 minutes and released automatically if payment does not complete. | M | P3 | ### 6.7 Booking and payment (BKG) [#67-booking-and-payment-bkg] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-BKG-01](/en/docs/brd/requirements#67-booking-and-payment-bkg) | A booking holds the passengers, chosen programs, seats where allowed, at most one coupon unless the coupon is stackable, and a payment method. | M | P2 | | [BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Travelers pay on the gateway's own page or SDK, with the methods of the organization's market. Card data never reaches Trips Enjoy. | M | P2 | | [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg) | A failed payment can be retried without losing the cart while the hold lasts, up to 3 attempts per hold (D-197). A retry after the hold expires re-checks the seats and starts a new hold only if they are free (D-191). | M | P2 | | [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Travelers can cancel a booking and receive a refund under the cancellation policy ([BRL-12](/en/docs/brd/requirements#7-business-rules)). Requests after the cut-off go to the organization, which decides within 2 working days, then to admin (D-151). No cancellation after departure or after check-in (D-152, D-153). | M | P2 | | [BR-BKG-05](/en/docs/brd/requirements#67-booking-and-payment-bkg) | Every confirmed booking yields a receipt and an invoice the traveler can view. A traveler who enters a tax number at checkout gets a B2B invoice ([BRL-28](/en/docs/brd/requirements#7-business-rules)). | M | P2 | ### 6.8 Coupons (CPN) [#68-coupons-cpn] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-CPN-01](/en/docs/brd/requirements#68-coupons-cpn) | Admins, organizations, drivers and photographers create coupons that apply only inside their own scope. | M | P5 | | [BR-CPN-02](/en/docs/brd/requirements#68-coupons-cpn) | Coupon use across entity boundaries is always rejected with a generic message that does not name the other entity ([OD-20](/en/docs/brd/compliance#11-open-decisions)). | M | P5 | | [BR-CPN-03](/en/docs/brd/requirements#68-coupons-cpn) | Coupons support fixed amount, percentage, program-specific, free program, first booking and minimum spend types, and are validated in real time at checkout. | M | P5 | | [BR-CPN-04](/en/docs/brd/requirements#68-coupons-cpn) | Each redemption is recorded against its booking and reversed on refund. | M | P5 | | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn) | Creators see coupon analytics; admin sees platform-wide analytics and abuse flags. Flags never block automatically and are reviewed within 2 working days (D-217). | M | P5 | ### 6.9 Check-in, moderators and tracking (CHK, MOD, TRK) [#69-check-in-moderators-and-tracking-chk-mod-trk] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-CHK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Moderators check each passenger in at boarding and out at each stop and at the destination. | M | P3 | | [BR-CHK-02](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | A passenger can be checked in only to the vehicle they are assigned to. | M | P3 | | [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Every check-in and check-out records time, moderator, vehicle and location where permitted, and reaches the platform within 60 seconds, including after short connection loss. | M | P3 | | [BR-CHK-04](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | A moderator sees and acts on their assigned vehicle only. | M | P3 | | [BR-CHK-05](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Moderators, parents and staff can report incidents and child-safety concerns, which reach the organization's operations team at once. Incident categories: safety, medical, vehicle fault, lost traveler, conduct, other (D-331). | S | P3 | | [BR-MOD-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | At the end of the trip each moderator submits a report with the final headcount; a mismatch needs a reason. | M | P3 | | [BR-TRK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | Operations staff see each vehicle's live location and which vehicle each passenger is in. Travelers never see the live vehicle position ([BRL-29](/en/docs/brd/requirements#7-business-rules)). | M | P6 | ### 6.10 Parents and children (PAR) [#610-parents-and-children-par] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-PAR-01](/en/docs/brd/requirements#610-parents-and-children-par) | Parents see only their own linked children: vehicle, seat, check-in status and programs. Child data is never used for marketing, advertising or model training. | M | P6 | | [BR-PAR-02](/en/docs/brd/requirements#610-parents-and-children-par) | Parents link a child to a booking with a valid booking reference and a guardianship declaration (D-126). The link ends when the booking is cancelled or refunded. | M | P6 | | [BR-PAR-03](/en/docs/brd/requirements#610-parents-and-children-par) | Parents are notified when boarding is confirmed, the trip starts, a stop is reached and the trip ends. | M | P6 | | [BR-PAR-04](/en/docs/brd/requirements#610-parents-and-children-par) | Child tracking is available where the parent is on Explorer or VIP and the organization is on Growth or Enterprise with tracking enabled for the trip ([OD-05](/en/docs/brd/compliance#11-open-decisions)). Live position is shown only while the trip is In Progress (D-317). | M | P6 | ### 6.11 Media and photographers (MED, PHO) [#611-media-and-photographers-med-pho] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-MED-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Photographers upload albums after the trip is Completed, within 14 days (D-267). Album count per trip follows the plan. | M | P4 | | [BR-MED-02](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Albums use one of three privacy modes allowed by the photographer's plan: public to trip participants, shared link, or selected users. | M | P4 | | [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Studio and Pro photographers can watermark public copies (bottom right, inset 3 percent, 30 percent opacity, D-275). | S | P4 | | [BR-MED-04](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Signed-in travelers who took the trip view the albums they are allowed to see. Public albums allow download of the watermarked or medium copy; shared-link and selected-user albums do not offer download (D-264, D-266). | M | P4 | | [BR-PHO-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | Photographers manage portfolio, rates and availability (dates and ranges, no weekly rules, D-89) and see earnings and payouts. | M | P4 | ### 6.12 Notifications (NTF) [#612-notifications-ntf] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-NTF-01](/en/docs/brd/requirements#612-notifications-ntf) | Notifications go out on the channels each user enables per category: email, SMS, WhatsApp, push and in-app. | M | P1 | | [BR-NTF-02](/en/docs/brd/requirements#612-notifications-ntf) | Notifications use the user's language, with right-to-left layout for Arabic. | M | P1 | | [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf) | SMS and push respect quiet hours 22:00 to 07:00 local time, except urgent messages; deferred messages go at 07:00, and trip-day events older than 2 hours are dropped (D-290). | S | P3 | ### 6.13 Plans and subscriptions (SUB) [#613-plans-and-subscriptions-sub] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-SUB-01](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin defines plans per role and market: limits, features, monthly and annual prices, annual discount and trial length. | M | P5 | | [BR-SUB-02](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Plan limits and features are enforced automatically. A blocked action shows an upgrade prompt. Every non-traveler role needs an active plan to use the app ([BRL-02](/en/docs/brd/requirements#7-business-rules)). | M | P5 | | [BR-SUB-03](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Failed renewals trigger dunning and a 7-day grace period before the account loses plan features. | M | P5 | | [BR-SUB-04](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin sees recurring revenue, churn, upgrades, downgrades and plan distribution. | M | P5 | | [BR-SUB-05](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | Admin can grant, revoke or change a plan for one account, with a reason, a second admin's approval and an end date. | M | P5 | ### 6.14 Accounting, invoices and settlements (ACC) [#614-accounting-invoices-and-settlements-acc] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ACC-01](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Organizations see, per trip, base revenue, program revenue, coupon impact, supplier costs, commission and gateway fees. Depth follows the plan. | M | P5 | | [BR-ACC-02](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Admin sees system-wide finance: subscription revenue, commission, deal audit, coupon redemptions, disputes and payouts. | M | P5 | | [BR-ACC-03](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Suppliers see their earnings and receive weekly payouts. A negative balance is netted against the next payout in the same currency (D-173). | M | P4 | | [BR-ACC-04](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Exports in CSV and PDF follow the plan; admin system-wide exports are CSV only; export files expire after 7 days (D-249). | M | P5 | | [BR-ACC-05](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Every financial event is recorded in a double-entry ledger and reconciled daily with gateway records (D-29). | M | P2 | | [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | The platform records amounts owed between the platform, organizations and suppliers per trip and tracks each settlement to completion. A settlement opens when the trip is Completed and closes when every payout is made and no dispute is open (D-174). | M | P4 | | [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | Settlements and invoices cover every party pair: traveler to organization (B2C or B2B), organization to supplier (deal), platform to organization and supplier (commission and payout), and organization or supplier to platform (plan). | M | P5 | ### 6.15 Platform administration (ADM) [#615-platform-administration-adm] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ADM-01](/en/docs/brd/requirements#615-platform-administration-adm) | Admin reviews all applications and appeals from one queue. | M | P1 | | [BR-ADM-02](/en/docs/brd/requirements#615-platform-administration-adm) | Admin manages any account: suspend, reinstate, reset credentials, review deletion and data-copy requests. | M | P1 | | [BR-ADM-03](/en/docs/brd/requirements#615-platform-administration-adm) | Admin can require any approved driver to take a lab test at any time; the driver is paused until the result is accepted ([BRL-16](/en/docs/brd/requirements#7-business-rules), [BRL-17](/en/docs/brd/requirements#7-business-rules)). Lab tests apply to drivers only (D-98). | M | P4 | | [BR-ADM-04](/en/docs/brd/requirements#615-platform-administration-adm) | Admin records disputes, decides outcomes and issues refunds, including refunds outside policy with a reason. | M | P3 | | [BR-ADM-05](/en/docs/brd/requirements#615-platform-administration-adm) | Every admin action and permission change is written to an audit log no one can edit. | M | P1 | | [BR-ADM-06](/en/docs/brd/requirements#615-platform-administration-adm) | Admin manages plans, coupons, notification templates, feature flags and market settings. | M | P1 | | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm) | Disputes are acknowledged within 2 working days and resolved within 10 working days; information requests are answered within 5 working days. Types: booking, payment, refund, supplier conduct, organization conduct, other (D-32, D-254). | M | P3 | ### 6.16 Markets (MKT) [#616-markets-mkt] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt) | Admin configures each market: currency, enabled payment methods and gateways, tax rules and invoice format, default time zone, and plan prices. | M | P2 | | [BR-MKT-02](/en/docs/brd/requirements#616-markets-mkt) | An account's market is set from the country it registered with. An organization's market decides the currency, payment methods and tax rules of its trips. | M | P2 | | [BR-MKT-03](/en/docs/brd/requirements#616-markets-mkt) | Travelers see trips from every market, with prices in the trip's currency, and pay with that market's methods. | M | P5 | | [BR-MKT-04](/en/docs/brd/requirements#616-markets-mkt) | A market can be switched on or off; trips in a market that is off cannot be published. | S | P5 | ### 6.17 Analytics (ANL) [#617-analytics-anl] | ID | Requirement | Priority | Phase | |---|---|---|---| | [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl) | Organizations see analytics by trip (views, conversion, bookings, revenue, occupancy, programs), by page (trip page and organization page traffic), by customer (new and returning travelers, repeat rate) and by provider (deals, costs, on-time record). Depth follows the plan (Growth basic, Enterprise full). | M | P6 | | [BR-ANL-02](/en/docs/brd/requirements#617-analytics-anl) | Drivers and photographers see analytics for their own bookings and earnings at the depth of their plan. | S | P6 | | [BR-ANL-03](/en/docs/brd/requirements#617-analytics-anl) | Admin sees platform analytics by market, organization, role and plan. | M | P6 | | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl) | Analytics offer 7, 30 and 90-day presets and a custom range, lag the source by no more than 5 minutes, and exports are ready within 15 minutes (D-177, D-281). | S | P6 | | [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) | Organizations and partners can use a documented public API for trips and bookings. | C | P6 | ## 7. Business rules [#7-business-rules] | ID | Rule | |---|---| | [BRL-01](/en/docs/brd/requirements#7-business-rules) | Trip records are tenant-isolated. Only the owning organization's staff, the platform admin, and the people on a booking within their own scope (traveler, linked parent, assigned moderator, driver or photographer) may see them. | | [BRL-02](/en/docs/brd/requirements#7-business-rules) | Every non-traveler role must hold an active plan to use the app. A traveler can always use the app for free. | | [BRL-03](/en/docs/brd/requirements#7-business-rules) | A coupon applies only inside its creator's scope: admin to any trip; organization to its own trips; driver or photographer to bookings where they are assigned. Cross-entity use is rejected. | | [BRL-04](/en/docs/brd/requirements#7-business-rules) | A platform driver or photographer is assigned only after a finalized deal accepted by both parties. | | [BRL-05](/en/docs/brd/requirements#7-business-rules) | An organization-owned driver or photographer is accepted on assignment and is never visible to other organizations. | | [BRL-06](/en/docs/brd/requirements#7-business-rules) | A rejected supplier or organization application can be re-submitted after 30 days. A closed application counts as rejected. The traveler account keeps working throughout. | | [BRL-07](/en/docs/brd/requirements#7-business-rules) | A trip cannot move to Ready until every vehicle has a driver and a moderator and every platform deal is finalized. | | [BRL-08](/en/docs/brd/requirements#7-business-rules) | A seat hold lasts 15 minutes and is released automatically when it expires. Exception: a Fawry cash voucher holds seats for the voucher's 48-hour window (D-31, D-41). | | [BRL-09](/en/docs/brd/requirements#7-business-rules) | A moderator can check a passenger in only to the vehicle assigned to that passenger on that trip. | | [BRL-10](/en/docs/brd/requirements#7-business-rules) | Parents see data only for children linked to their own bookings. | | [BRL-11](/en/docs/brd/requirements#7-business-rules) | A refund reverses the coupon redemption and frees the traveler's per-user limit. | | [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancellation refund depends on time before departure: 80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours (placeholder, D-07, [OD-07](/en/docs/brd/compliance#11-open-decisions)). All fees are refundable until non-refundable fees are set (D-156). | | [BRL-13](/en/docs/brd/requirements#7-business-rules) | A plan upgrade takes effect at once with proration; a downgrade takes effect at the end of the cycle. | | [BRL-14](/en/docs/brd/requirements#7-business-rules) | A failed renewal starts a 7-day grace period with features kept. | | [BRL-15](/en/docs/brd/requirements#7-business-rules) | Account deletion becomes permanent after a 30-day grace period. Trip records are kept 5 years after deletion. Future bookings are cancelled and refunded; remaining earnings are paid on the next payout date. No booking or payment is allowed during the grace period. | | [BRL-16](/en/docs/brd/requirements#7-business-rules) | A lab test has a deadline of 3 days from request (admin may set 1 to 7 days, D-21). A missed deadline suspends the driver; a suspension longer than 30 days closes the driver account. A second failed result within 12 months closes the account (D-242). | | [BRL-17](/en/docs/brd/requirements#7-business-rules) | A driver whose lab test is requested is paused at once. Upcoming trips return to their organizers. Completed trips are paid; trips not yet completed are held (D-175). | | [BRL-18](/en/docs/brd/requirements#7-business-rules) | Every financial event (booking, refund, coupon, subscription charge, payout, deal cost, commission, invoice) is written to a double-entry ledger. | | [BRL-19](/en/docs/brd/requirements#7-business-rules) | Every admin action and every permission change is written to an immutable audit log. | | [BRL-20](/en/docs/brd/requirements#7-business-rules) | Verification codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. A resend does not reset the wrong-code count; after 3 failed deliveries the code goes by the other channel (D-58, D-59). | | [BRL-21](/en/docs/brd/requirements#7-business-rules) | Accounts lock for 15 minutes after 5 failed sign-in attempts (all roles, D-53). | | [BRL-22](/en/docs/brd/requirements#7-business-rules) | Web sessions end after 12 hours of use. Drafts are kept. | | [BRL-23](/en/docs/brd/requirements#7-business-rules) | Every registration form records the applicant's country. | | [BRL-24](/en/docs/brd/requirements#7-business-rules) | A trip's programs, seat mode or vehicles cannot be changed in a way that breaks a confirmed booking until the traveler is notified and offered a remedy. The traveler has 7 days to choose; then the case goes to admin (D-148). | | [BRL-25](/en/docs/brd/requirements#7-business-rules) | A trip is archived 30 days after Completed, and only once its settlement is closed (D-26). | | [BRL-26](/en/docs/brd/requirements#7-business-rules) | A deal offer expires 72 hours after the last counter-offer and the deal ends as Rejected with reason "expired" (D-14). | | [BRL-27](/en/docs/brd/requirements#7-business-rules) | Market values (currency, payment methods, tax and invoicing rules, default time zone) follow the country: the organization's country for its trips and invoices, and the account's country for its own plan. | | [BRL-28](/en/docs/brd/requirements#7-business-rules) | An invoice is B2B when the buyer gives a tax number, otherwise B2C (D-180). An issued invoice is never edited; a correction is a credit note that references it (D-181). | | [BRL-29](/en/docs/brd/requirements#7-business-rules) | Travelers never see a vehicle's live position. Only operations staff of the owning organization, the platform admin and eligible linked parents do, and parents only while the trip is In Progress (D-317). | | [BRL-30](/en/docs/brd/requirements#7-business-rules) | When an organization cancels a trip, every confirmed booking is refunded in full and coupon redemptions are reversed (D-150). A trip that is In Progress cannot be cancelled; it is handled as an incident (D-25, [OD-22](/en/docs/brd/compliance#11-open-decisions)). | # Applications (/ar/docs/erd/domains/applications) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o{ APPLICATIONS : submits APPLICATIONS ||--o{ APPLICATION_DOCUMENTS : attaches APPLICATIONS ||--o{ APPLICATION_DECISIONS : receives APPLICATIONS ||--o| APPEALS : appealed_by APPLICATIONS ||--o| ORGANIZATIONS : creates ``` ## applications [#applications] *(Base +) [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) to [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications)* | Column | Type | Notes | |---|---|---| | applicant_user_id | BIGINT FK users | | | type_id | BIGINT FK lookups | `application_type`: organization, platform_driver, platform_photographer | | status_id | BIGINT FK lookups | `application_status`: draft, submitted, pending_review, changes_requested, approved, rejected, appealed, closed | | country_code | CHAR(2) FK countries | | | requested_plan_id | BIGINT FK plans | Chosen at registration, no charge (D-77) | | payload | JSONB | Role-specific fields (legal names, CR and tax numbers, license, vehicle, rates, service regions) | | submitted_at | TIMESTAMPTZ | | | review_due_at | TIMESTAMPTZ | 2 working days ([FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target)) | | changes_due_at | TIMESTAMPTZ | 14 days, plus one 7-day extension (D-235) | | extension_used | BOOLEAN | | | decided_at | TIMESTAMPTZ | | | reapply_after | DATE | Decision date plus 30 days ([BRL-06](/en/docs/brd/requirements#7-business-rules)) | | previous_application_id | BIGINT FK applications | Re-application chain | **application_documents** (Base +): `application_id FK`, `doc_type_id FK lookups (document_type: id_card, driving_license, vehicle_registration, insurance, lab_result, commercial_registration, tax_certificate, portfolio_photo, other)`, `storage_path TEXT` (restricted bucket, [DAT-04](/en/docs/srs/data#62-data-isolation)), `mime_type VARCHAR(80)`, `size_bytes BIGINT` (10 MB documents, 25 MB photos, D-80, D-81), `valid_until DATE NULL`, `issued_on DATE NULL`, `check_status_id FK lookups (document_check: pending, accepted, rejected)`. **application_decisions** (Base +): `application_id FK`, `decision_id FK lookups (application_decision: approve, request_changes, reject, close, uphold_appeal, overturn)`, `reason_id FK lookups (decision_reason, D-234) NULL`, `message JSONB` (in the applicant's language), `items JSONB` (requested changes), `decided_by BIGINT FK users`. **appeals** (Base +) D-237: `application_id FK UNIQUE`, `statement TEXT`, `files JSONB` (up to 5), `submitted_at`, `due_at` (5 working days), `status_id FK lookups (appeal_status: submitted, upheld, rejected)`. # Booking and payment (/ar/docs/erd/domains/booking-and-payment) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIPS ||--o{ BOOKINGS : receives USERS ||--o{ BOOKINGS : makes BOOKINGS ||--o{ BOOKING_PASSENGERS : includes BOOKINGS ||--o{ BOOKING_PROGRAMS : selects PROGRAMS ||--o{ BOOKING_PROGRAMS : chosen_in TRIP_VEHICLES ||--o{ TRIP_SEATS : has BOOKING_PASSENGERS ||--o| TRIP_SEATS : sits_in BOOKINGS ||--o{ PAYMENTS : paid_by PAYMENTS ||--o{ PAYMENT_ATTEMPTS : tried PAYMENTS ||--o{ REFUNDS : refunded_by BOOKINGS ||--o{ BOOKING_REMEDIES : offered ``` ## bookings [#bookings] *(Base +) [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) to [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column | | trip_id | BIGINT FK trips | | | booked_by_user_id | BIGINT FK users | | | reference | VARCHAR(12) | Public booking reference used for child links | | status_id | BIGINT FK lookups | `booking_status`: cart, seats_held, payment_pending, confirmed, payment_failed, checked_in, checked_out, cancelled, refund_pending, refunded | | passenger_count | SMALLINT | | | base_total_minor, programs_total_minor, plan_discount_minor, coupon_discount_minor, total_minor | BIGINT | Price locked when the hold starts (D-192) | | currency_code | CHAR(3) | | | hold_expires_at | TIMESTAMPTZ | 15 minutes; Fawry 48 h | | payment_attempts | SMALLINT | Max 3 per hold (D-197) | | buyer_tax_no | VARCHAR(50) NULL | Present means B2B invoice ([BRL-28](/en/docs/brd/requirements#7-business-rules)) | | confirmed_at, cancelled_at | TIMESTAMPTZ | | | cancel_reason_id | BIGINT FK lookups | `cancel_reason` | | refund_rule_applied | VARCHAR(20) | For example `80_at_48h` | **booking_passengers** (Base +): `organization_id`, `booking_id FK`, `full_name VARCHAR(200)`, `is_child BOOLEAN`, `birth_year SMALLINT NULL`, `trip_vehicle_id FK NULL`, `seat_id FK trip_seats NULL`, `checkin_status_id FK lookups (passenger_checkin: not_boarded, on_board, off_vehicle, completed)`, `boarding_code_hash CHAR(64)`. **booking_programs** (Base +): `organization_id`, `booking_id FK`, `program_id FK`, `program_tier_id FK NULL`, `passenger_id FK booking_passengers NULL`, `quantity INT`, `unit_price_minor BIGINT`, `line_total_minor BIGINT`. ## trip_seats [#trip_seats] *(Base +) [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) to [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_vehicle_id | BIGINT FK trip_vehicles | | | vehicle_type_seat_id | BIGINT FK vehicle_type_seats | | | label | VARCHAR(10) | | | status_id | BIGINT FK lookups | `seat_status`: available, held, reserved, checked_in, checked_out, released | | held_by_booking_id | BIGINT FK bookings NULL | | | held_until | TIMESTAMPTZ | | | reserved_by_passenger_id | BIGINT FK booking_passengers NULL | | Unique `(trip_vehicle_id, label, deleted_at)`. Hold races are resolved with a Redis lock and a conditional update on `status_id`. **payments** (Base +) [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) to [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market): `organization_id NULL` (null for plan charges), `booking_id FK NULL`, `subscription_charge_id FK NULL`, `payer_user_id FK`, `gateway_id FK lookups (gateway)`, `method_id FK lookups (payment_method)`, `amount_minor`, `currency_code`, `status_id FK lookups (payment_status: pending, succeeded, failed, expired, refunded, partially_refunded)`, `gateway_reference VARCHAR(120)` (unique per gateway), `voucher_expires_at TIMESTAMPTZ NULL` (Fawry), `succeeded_at`. **payment_attempts** (Base +): `payment_id FK`, `attempt_no SMALLINT`, `gateway_event_id VARCHAR(120)` (unique, idempotent callbacks), `result_id FK lookups (attempt_result)`, `failure_code VARCHAR(80)`, `raw_status VARCHAR(80)`. **refunds** (Base +) [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy): `organization_id`, `payment_id FK`, `booking_id FK`, `amount_minor`, `currency_code`, `reason_id FK lookups (refund_reason: traveler_cancel, org_cancel, dispute, admin_outside_policy, remedy)`, `policy_rule VARCHAR(20)`, `status_id FK lookups (refund_status: requested, sent, confirmed, failed)`, `gateway_reference`, `retries SMALLINT` (3, D-322), `approved_by FK users NULL`, `dispute_id FK NULL`. **booking_remedies** (Base +) [BRL-24](/en/docs/brd/requirements#7-business-rules): `organization_id`, `booking_id FK`, `change_type_id FK lookups (trip_change_type: program_removed, seat_mode_changed, vehicle_changed, time_changed)`, `options JSONB`, `chosen_option VARCHAR(40)`, `due_at` (7 days, D-148), `status_id FK lookups (remedy_status: offered, chosen, escalated, expired)`. # Coupons (/ar/docs/erd/domains/coupons) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram COUPONS ||--o{ COUPON_PROGRAMS : targets COUPONS ||--o{ COUPON_AUDIENCES : offered_to COUPONS ||--o{ COUPON_REDEMPTIONS : redeemed_in BOOKINGS ||--o{ COUPON_REDEMPTIONS : uses COUPONS ||--o{ ABUSE_FLAGS : flagged_by ``` ## coupons [#coupons] *(Base +) [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) to [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan)* | Column | Type | Notes | |---|---|---| | code | VARCHAR(40) | Unique with `deleted_at` (case-insensitive) | | creator_type_id | BIGINT FK lookups | `coupon_creator`: admin, organization, driver, photographer | | creator_user_id | BIGINT FK users | | | organization_id | BIGINT FK organizations NULL | Scope for organization coupons | | scope_user_id | BIGINT FK users NULL | Scope for driver or photographer coupons | | market_id | BIGINT FK markets NULL | Null means all markets (admin only) | | discount_type_id | BIGINT FK lookups | `discount_type`: fixed, percent, program_specific, free_program, first_booking, minimum_spend | | value_minor | BIGINT NULL | Fixed amount | | value_bp | INT NULL | Percentage in basis points | | currency_code | CHAR(3) NULL | | | min_spend_minor | BIGINT NULL | | | usage_limit | INT NULL | | | per_user_limit | INT | Default 1 | | used_count | INT | | | valid_from, valid_until | TIMESTAMPTZ | | | audience_id | BIGINT FK lookups | `coupon_audience`: public, targeted | | is_stackable | BOOLEAN | | | status_id | BIGINT FK lookups | `coupon_status`: draft, active, paused, expired, exhausted, revoked | **coupon_programs** (Base +): `coupon_id FK`, `program_id FK`. **coupon_audiences** (Base +): `coupon_id FK`, `user_id FK NULL`, `segment_code VARCHAR(40) NULL`. **coupon_redemptions** (Base +): `coupon_id FK`, `booking_id FK`, `user_id FK`, `organization_id`, `discount_minor BIGINT`, `currency_code`, `status_id FK lookups (redemption_status: applied, confirmed, reversed)`, `reversed_at`. **abuse_flags** (Base +) D-216, D-217: `subject_type_id FK lookups (flag_subject: coupon, user, booking, deal)`, `subject_id BIGINT`, `rule_code VARCHAR(60)`, `details JSONB`, `status_id FK lookups (flag_status: open, reviewed_ok, actioned)`, `review_due_at` (2 working days), `reviewed_by FK users NULL`. # Deals (/ar/docs/erd/domains/deals) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ DEALS : opens USERS ||--o{ DEALS : supplies TRIPS ||--o{ DEALS : for_trip TRIP_VEHICLES ||--o{ DEALS : for_vehicle DEALS ||--o{ DEAL_OFFERS : negotiates ``` ## deals [#deals] *(Base +) [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column; suppliers read through a platform-scoped repository | | trip_id | BIGINT FK trips | | | trip_vehicle_id | BIGINT FK trip_vehicles NULL | Null for photographer deals | | provider_user_id | BIGINT FK users | | | provider_type_id | BIGINT FK lookups | `provider_type`: driver, photographer | | status_id | BIGINT FK lookups | `deal_status`: proposed, countered_by_provider, countered_by_organization, accepted_by_one, finalized, rejected | | current_amount_minor | BIGINT | | | currency_code | CHAR(3) | | | organization_accepted_at, provider_accepted_at | TIMESTAMPTZ | Both set = finalized | | last_offer_at | TIMESTAMPTZ | | | expires_at | TIMESTAMPTZ | last_offer_at plus 72 h ([BRL-26](/en/docs/brd/requirements#7-business-rules)) | | reject_reason_id | BIGINT FK lookups | `deal_end_reason`: rejected, expired, provider_paused, trip_cancelled | | finalized_at | TIMESTAMPTZ | | | flagged_reason | TEXT | Admin flag (D-252) | **deal_offers** (immutable): `id`, `uuid`, `organization_id`, `deal_id FK`, `offered_by_side_id FK lookups (deal_side: organization, provider)`, `amount_minor BIGINT`, `note TEXT`, `action_id FK lookups (deal_action: propose, counter, accept, reject)`, `created_at`, `created_by`. # Finance (/ar/docs/erd/domains/finance) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram LEDGER_ACCOUNTS ||--o{ LEDGER_ENTRIES : posts LEDGER_TRANSACTIONS ||--|{ LEDGER_ENTRIES : balances INVOICES ||--|{ INVOICE_LINES : itemizes INVOICES ||--o{ INVOICES : credit_note_of PAYOUT_RUNS ||--o{ PAYOUTS : pays SETTLEMENTS ||--|{ SETTLEMENT_LINES : owes TRIPS ||--o| SETTLEMENTS : settles PAYOUTS ||--o{ SETTLEMENT_LINES : clears DISPUTES ||--o{ DISPUTE_FILES : attaches BOOKINGS ||--o{ DISPUTES : about ``` **ledger_accounts** (Base +): `owner_type_id FK lookups (ledger_owner: platform, organization, supplier, traveler_clearing, gateway)`, `organization_id NULL`, `user_id NULL`, `account_kind_id FK lookups (ledger_account_kind: cash, receivable, payable, revenue, commission, fee_expense, deferred, refund_clearing, tax_payable)`, `currency_code`, `code VARCHAR(60)` unique. **ledger_transactions** (immutable) [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger): `id`, `uuid`, `event_type_id FK lookups (ledger_event: booking_paid, refund, coupon, deal_cost, commission, gateway_fee, plan_charge, payout, invoice, settlement, reversal)`, `source_type VARCHAR(40)`, `source_id BIGINT`, `occurred_at`, `reverses_transaction_id FK NULL`, `created_at`, `created_by`. A check confirms entries sum to zero per currency. **ledger_entries** (immutable): `id`, `uuid`, `transaction_id FK`, `account_id FK`, `organization_id NULL`, `debit_minor BIGINT`, `credit_minor BIGINT` (one is zero), `currency_code`, `trip_id NULL`, `booking_id NULL`, `deal_id NULL`, `gateway_reference NULL`, `created_at`, `created_by`. Retention 7 years. ## invoices [#invoices] *(Base +) [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT NULL | Issuer when the organization invoices a traveler; null for platform-issued | | issuer_type_id | BIGINT FK lookups | `invoice_issuer`: organization, platform, supplier | | buyer_type_id | BIGINT FK lookups | `invoice_buyer`: traveler, organization, supplier | | kind_id | BIGINT FK lookups | `invoice_kind`: b2c, b2b, credit_note | | number | VARCHAR(40) | Unique per issuer and market; null while numbering is retried (D-179) | | market_id | BIGINT FK markets | | | buyer_name, buyer_tax_no, buyer_address | VARCHAR, VARCHAR, JSONB | | | booking_id, subscription_charge_id, deal_id, settlement_id | BIGINT NULL | Source | | original_invoice_id | BIGINT FK invoices NULL | For credit notes ([BRL-28](/en/docs/brd/requirements#7-business-rules)) | | subtotal_minor, tax_minor, total_minor | BIGINT | | | currency_code | CHAR(3) | | | status_id | BIGINT FK lookups | `invoice_status`: pending_number, issued, voided_by_credit, finance_review | | issued_at | TIMESTAMPTZ | | | e_invoice_status_id | BIGINT FK lookups NULL | Reserved for ZATCA ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | | pdf_path | TEXT | | **invoice_lines** (Base +): `invoice_id FK`, `description JSONB`, `quantity NUMERIC(10,2)`, `unit_minor BIGINT`, `tax_rate_bp INT`, `tax_minor BIGINT`, `line_total_minor BIGINT`. **payout_runs** (Base +) [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts): `run_date DATE` (Mondays 06:00, D-28), `market_id FK`, `status_id FK lookups (payout_run_status: draft, approved, submitted, completed, partial)`, `approved_by FK users`. **payouts** (Base +): `payout_run_id FK`, `payee_user_id FK NULL`, `payee_organization_id FK NULL`, `payout_method_id FK`, `amount_minor`, `currency_code`, `status_id FK lookups (payout_status: pending, sent, paid, failed, held)`, `hold_reason_id FK lookups NULL` (lab pause D-175, negative balance D-173), `external_reference VARCHAR(120)`, `paid_at`. **settlements** (Base +) [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [BRL-25](/en/docs/brd/requirements#7-business-rules): `organization_id`, `trip_id FK UNIQUE`, `status_id FK lookups (settlement_status: open, awaiting_payouts, disputed, closed)`, `opened_at` (trip Completed), `closed_at`, `totals JSONB` (gross, commission, fees, supplier costs, net). **settlement_lines** (Base +): `settlement_id FK`, `from_party_type_id FK lookups (party)`, `from_party_id BIGINT`, `to_party_type_id FK lookups (party)`, `to_party_id BIGINT`, `reason_id FK lookups (settlement_reason: trip_revenue, commission, deal_cost, gateway_fee, refund, adjustment)`, `amount_minor`, `currency_code`, `payout_id FK NULL`, `settled_at`. **reconciliation_exceptions** (Base +) [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation): `gateway_id FK lookups`, `report_date DATE`, `gateway_reference VARCHAR(120)`, `kind_id FK lookups (recon_exception: missing_in_ledger, missing_in_gateway, amount_mismatch, currency_mismatch)`, `gateway_amount_minor`, `ledger_amount_minor`, `status_id FK lookups (exception_status: open, resolved, written_off)`, `resolved_by FK users NULL`. **disputes** (Base +) [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling): `organization_id NULL`, `booking_id FK NULL`, `deal_id FK NULL`, `raised_by FK users`, `type_id FK lookups (dispute_type: booking, payment, refund, supplier_conduct, organization_conduct, other)`, `status_id FK lookups (dispute_status: open, information_requested, under_review, resolved, closed)`, `ack_due_at` (2 working days), `resolve_due_at` (10 working days), `outcome TEXT`, `refund_id FK refunds NULL`, `assigned_to FK users NULL`. **dispute_files** (Base +): `dispute_id FK`, `storage_path TEXT`, `size_bytes BIGINT` (up to 5 files of 10 MB, D-259). # Fleet and trips (/ar/docs/erd/domains/fleet-and-trips) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ VEHICLE_TYPES : defines VEHICLE_TYPES ||--o{ VEHICLE_TYPE_SEATS : lays_out ORGANIZATIONS ||--o{ VEHICLES : registers VEHICLE_TYPES ||--o{ VEHICLES : typed_as ORGANIZATIONS ||--o{ TRIPS : runs TRIPS ||--o{ TRIP_STOPS : routes TRIPS ||--o{ TRIP_AUDIENCES : targets TRIPS ||--o{ TRIP_VEHICLES : uses VEHICLES ||--o{ TRIP_VEHICLES : assigned_as TRIP_VEHICLES ||--o{ TRIP_STAFF_ASSIGNMENTS : staffed_by TRIPS ||--o{ TRIP_STAFF_ASSIGNMENTS : photographer TRIPS ||--o{ PROGRAMS : offers PROGRAMS ||--o{ PROGRAM_TIERS : priced_by ``` **vehicle_types** (Base +) [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types): `organization_id`, `name JSONB`, `seat_count SMALLINT`, `layout JSONB` (grid rows, columns, aisles, doors), `archived_at TIMESTAMPTZ`. **vehicle_type_seats** (Base +): `organization_id`, `vehicle_type_id FK`, `label VARCHAR(10)` (for example 12B), `row_no SMALLINT`, `col_no SMALLINT`, `seat_kind_id FK lookups (seat_kind: standard, accessible, crew, blocked)`. Unique `(vehicle_type_id, label, deleted_at)`. **vehicles** (Base +) [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry): `organization_id`, `vehicle_type_id FK`, `plate_no VARCHAR(20)`, `model VARCHAR(80)`, `year SMALLINT`, `seat_count SMALLINT` (must equal the type), `registration_status_id FK lookups (registration_status)`, `registration_valid_until DATE`, `provider_vehicle_id FK provider_vehicles NULL` (a platform driver's own vehicle used on a deal). ## trips [#trips] *(Base +) [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) to [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT FK organizations | Tenant column | | market_id | BIGINT FK markets | Copied from the organization at creation | | code | VARCHAR(20) | Human reference, unique per organization | | title, description | JSONB | | | category_id | BIGINT FK lookups | `trip_category` | | status_id | BIGINT FK lookups | `trip_status`: draft, published, negotiating, ready, filling_up, sold_out, in_progress, partially_completed, completed, post_processing, archived, cancelled, refunds_issued | | publish_mode_id | BIGINT FK lookups | `publish_mode`: draft, public, targeted | | timezone | VARCHAR(64) | | | starts_at, ends_at | TIMESTAMPTZ | | | base_price_minor | BIGINT | | | currency_code | CHAR(3) | From market | | capacity_total | INT | Sum of vehicle seats | | seats_reserved | INT | Counter; Filling Up at 80 percent (D-189) | | seat_mode_id | BIGINT FK lookups | `seat_mode`: company_assigned, self_select | | child_tracking_enabled | BOOLEAN | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | | vip_early_access_until | TIMESTAMPTZ NULL | D-146 | | priority_seat_window_until | TIMESTAMPTZ NULL | D-316 | | published_at, cancelled_at, completed_at, archived_at | TIMESTAMPTZ | | | cancel_reason | TEXT | | | counted_in_cycle | DATE | Month counted for the active-trip limit (D-143) | Indexes: `(organization_id, status_id)`, partial `(starts_at)` where published or filling up. **trip_stops** (Base +): `organization_id`, `trip_id FK`, `seq SMALLINT`, `kind_id FK lookups (stop_kind: pickup, stop, destination, dropoff)`, `name JSONB`, `address JSONB`, `lat NUMERIC(10,7)`, `lng NUMERIC(10,7)`, `planned_at TIMESTAMPTZ`. **trip_audiences** (Base +): `organization_id`, `trip_id FK`, `user_id FK NULL`, `email CITEXT NULL`, `phone_hash CHAR(64) NULL`. Targeted publishing list ([FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing)). ## trip_vehicles [#trip_vehicles] *(Base +) [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | Tenant column | | trip_id | BIGINT FK trips | | | vehicle_id | BIGINT FK vehicles NULL | | | vehicle_type_id | BIGINT FK vehicle_types | | | label | VARCHAR(40) | Bus A, Bus B | | status_id | BIGINT FK lookups | `trip_vehicle_status`: planning, ready, departed, ended | | seat_count | SMALLINT | | | departed_at, ended_at | TIMESTAMPTZ | | | last_lat, last_lng, last_point_at | NUMERIC, NUMERIC, TIMESTAMPTZ | Latest position cache | ## trip_staff_assignments [#trip_staff_assignments] *(Base +) [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) to [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_id | BIGINT FK trips | | | trip_vehicle_id | BIGINT FK trip_vehicles NULL | Null for trip-level photographer | | staff_role_id | BIGINT FK lookups | `staff_role`: driver, moderator, photographer | | user_id | BIGINT FK users | | | track_id | BIGINT FK lookups | `supplier_track`: organization, platform | | deal_id | BIGINT FK deals NULL | Required when track is platform ([BRL-04](/en/docs/brd/requirements#7-business-rules)) | | status_id | BIGINT FK lookups | `assignment_status`: proposed, accepted, replaced, released | | access_until | TIMESTAMPTZ | Moderators: trip end plus 24 h (D-107) | Unique active `(trip_vehicle_id, staff_role_id)` where status accepted. ## programs [#programs] *(Base +) [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) to [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT | | | trip_id | BIGINT FK trips | | | title, description | JSONB | | | pricing_model_id | BIGINT FK lookups | `pricing_model`: free, per_person, by_quantity, per_group, tiered | | price_minor | BIGINT NULL | Null for free and tiered | | currency_code | CHAR(3) | | | is_required | BOOLEAN | Pre-required | | is_vip_only | BOOLEAN | | | capacity | INT NULL | | | enrolled_count | INT | | | starts_at | TIMESTAMPTZ NULL | | **program_tiers** (Base +): `organization_id`, `program_id FK`, `name JSONB`, `price_minor BIGINT`, `sort_by INT`. # Identity and access (/ar/docs/erd/domains/identity-and-access) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o{ USER_ROLES : holds USERS ||--o{ AUTH_FACTORS : secures USERS ||--o{ OTP_CHALLENGES : verifies USERS ||--o{ SESSIONS : opens USERS ||--o{ DEVICES : registers USERS ||--o{ CONSENTS : gives USERS ||--o{ NOTIFICATION_PREFERENCES : sets USERS ||--o{ PRIVACY_REQUESTS : files ORGANIZATIONS ||--o{ USER_ROLES : scopes ``` ## users [#users] *(Base +) [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) to [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens)* | Column | Type | Notes | |---|---|---| | full_name | VARCHAR(200) | | | email | CITEXT | Unique with `deleted_at` where not null | | phone_enc | BYTEA | enc; E.164 | | phone_hash | CHAR(64) | Unique with `deleted_at` where not null | | email_verified_at, phone_verified_at | TIMESTAMPTZ | D-20 | | password_hash | VARCHAR(255) | Argon2id; null for code-only accounts | | country_code | CHAR(2) FK countries | [BRL-23](/en/docs/brd/requirements#7-business-rules) | | locale | VARCHAR(5) | en or ar | | timezone | VARCHAR(64) | | | status_id | BIGINT FK lookups | `account_status`: active, suspended, deletion_requested, closed | | suspended_reason_id | BIGINT FK lookups | `suspension_reason` (D-234) | | deletion_requested_at, deletion_due_at | TIMESTAMPTZ | 30-day grace ([BRL-15](/en/docs/brd/requirements#7-business-rules)) | | failed_signins | SMALLINT | Reset on success | | locked_until | TIMESTAMPTZ | [BRL-21](/en/docs/brd/requirements#7-business-rules) | | token_version | INT | Bump to revoke all tokens | | traveler_plan_subscription_id | BIGINT FK subscriptions | Free by default | ## user_roles [#user_roles] *(Base +) [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users | | | role_id | BIGINT FK lookups | `role`: traveler, organization_owner, organization_employee, platform_driver, platform_photographer, org_driver, org_photographer, moderator, admin_super, admin_operations, admin_finance | | organization_id | BIGINT FK organizations NULL | Set for organization-scoped roles | | status_id | BIGINT FK lookups | `role_status`: pending, active, paused, suspended, ended | | started_at, ended_at | TIMESTAMPTZ | | Unique `(user_id, role_id, organization_id, deleted_at)`. **auth_factors** (Base +): `user_id FK`, `factor_type_id FK lookups (auth_factor: totp, sms)`, `secret_enc BYTEA`, `verified_at TIMESTAMPTZ`, `last_used_at TIMESTAMPTZ`. ## otp_challenges [#otp_challenges] *(Base +) [BRL-20](/en/docs/brd/requirements#7-business-rules)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users NULL | Null before the account exists | | channel_id | BIGINT FK lookups | `otp_channel`: sms, whatsapp, email | | destination_hash | CHAR(64) | | | purpose_id | BIGINT FK lookups | `otp_purpose`: verify_email, verify_phone, sign_in, staff_code, password_reset | | code_hash | CHAR(64) | | | expires_at | TIMESTAMPTZ | 5 minutes | | wrong_attempts | SMALLINT | Pause at 5 | | paused_until | TIMESTAMPTZ | 15 minutes | | failed_deliveries | SMALLINT | Switch channel at 3 (D-59) | | consumed_at | TIMESTAMPTZ | | **sessions** (Base +): `user_id FK`, `active_role_id FK user_roles`, `active_organization_id FK organizations NULL`, `refresh_token_hash CHAR(64)`, `device_id FK devices NULL`, `ip INET`, `user_agent TEXT`, `expires_at TIMESTAMPTZ` (web 12 h, [BRL-22](/en/docs/brd/requirements#7-business-rules)), `revoked_at TIMESTAMPTZ`. **devices** (Base +): `user_id FK`, `platform_id FK lookups (device_platform: ios, android, web)`, `push_token TEXT`, `app_version VARCHAR(20)`, `last_seen_at TIMESTAMPTZ`. **consents** (immutable) [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat): `id`, `uuid`, `user_id FK`, `consent_type_id FK lookups (consent_type: lab_test, background_check, child_tracking, guardianship, marketing, terms, privacy)`, `text_version VARCHAR(20)`, `granted BOOLEAN`, `occurred_at TIMESTAMPTZ`, `ip INET`, `created_at`, `created_by`. **notification_preferences** (Base +): `user_id FK`, `category_id FK lookups (notification_category)`, `channel_id FK lookups (notification_channel: email, sms, whatsapp, push, in_app)`, `enabled BOOLEAN`. Unique `(user_id, category_id, channel_id, deleted_at)`. **privacy_requests** (Base +) [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion): `user_id FK`, `type_id FK lookups (privacy_request_type: data_copy, deletion)`, `status_id FK lookups (privacy_request_status: received, verified, in_progress, delivered, cancelled)`, `due_at TIMESTAMPTZ` (30 days, D-162), `file_path TEXT`, `completed_at TIMESTAMPTZ`. # Lookups and markets (/ar/docs/erd/domains/lookups-and-markets) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram LOOKUP_TYPES ||--o{ LOOKUPS : contains LOOKUPS ||--o{ LOOKUPS : parent_of COUNTRIES ||--o| MARKETS : configured_as CURRENCIES ||--o{ MARKETS : priced_in MARKETS ||--o{ MARKET_PAYMENT_METHODS : offers MARKETS ||--o{ TAX_RATES : applies ``` ## lookup_types [#lookup_types] *(Base +)* | Column | Type | Notes | |---|---|---| | code | VARCHAR(80) | Unique with `deleted_at`, for example `booking_status` | | name | JSONB | Translatable | | description | JSONB | Translatable | | parent_id | BIGINT FK lookup_types | Optional grouping | | sort_by | INT | | | is_public | BOOLEAN | Shown to clients | | is_system | BOOLEAN | Cannot be edited by admin | ## lookups [#lookups] *(Base +)* | Column | Type | Notes | |---|---|---| | lookup_type_id | BIGINT FK lookup_types | | | code | VARCHAR(80) | Unique with `(lookup_type_id, code, deleted_at)` | | value | VARCHAR(255) | Optional machine value | | name | JSONB | Translatable label | | description | JSONB | | | parent_id | BIGINT FK lookups | For example incident category under a group | | sort_by | INT | | | is_public, is_system | BOOLEAN | | **countries**: `code CHAR(2) PK`, `name JSONB`, `phone_prefix VARCHAR(6)`, `is_active BOOLEAN`. Reference data, no soft delete. **currencies**: `code CHAR(3) PK`, `minor_units SMALLINT`, `symbol JSONB`. Reference data. ## markets [#markets] *(Base +) [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt), [BRL-27](/en/docs/brd/requirements#7-business-rules)* | Column | Type | Notes | |---|---|---| | country_code | CHAR(2) FK countries | Unique | | currency_code | CHAR(3) FK currencies | EGP, SAR, AED | | default_timezone | VARCHAR(64) | Africa/Cairo, Asia/Riyadh, Asia/Dubai (D-282) | | status_id | BIGINT FK lookups | `market_status`: draft, live, paused | | launch_phase | SMALLINT | 2 or 5 | | commission_rate_bp | INT | Basis points; placeholder 1000 (D-15) | | invoice_rules | JSONB | Numbering prefix, required buyer fields, e-invoicing flag ([OD-10](/en/docs/brd/compliance#11-open-decisions)) | **market_payment_methods** (Base +): `market_id FK`, `method_id FK lookups (payment_method: card, apple_pay, google_pay, local_card, fawry_cash)`, `gateway_id FK lookups (gateway: stripe, paymob, tap, fawry)`, `use_for_bookings BOOLEAN`, `use_for_plans BOOLEAN`, `sort_by INT`, `is_active BOOLEAN`. **tax_rates** (Base +): `market_id FK`, `tax_type_id FK lookups (tax_type: vat)`, `rate_bp INT` ([OD-27](/en/docs/brd/compliance#11-open-decisions)), `valid_from DATE`, `valid_to DATE NULL`. # Media (/ar/docs/erd/domains/media) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIPS ||--o{ ALBUMS : has USERS ||--o{ ALBUMS : photographs ALBUMS ||--o{ PHOTOS : contains ALBUMS ||--o{ ALBUM_SHARED_LINKS : shared_by ALBUMS ||--o{ ALBUM_MEMBERS : visible_to PHOTOS ||--o{ DOWNLOAD_LOGS : downloaded ``` **albums** (Base +) [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) to [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan): `organization_id`, `trip_id FK`, `photographer_user_id FK`, `title JSONB`, `privacy_mode_id FK lookups (album_privacy: public, shared_link, selected_users)`, `watermark_enabled BOOLEAN`, `status_id FK lookups (album_status: uploading, processing, published, archived)`, `upload_window_ends_at` (trip completion plus 14 days, D-267), `published_at`, `archived_at`. **photos** (Base +): `organization_id`, `album_id FK`, `original_path TEXT`, `variants JSONB` (thumb, medium, large, watermarked), `width`, `height`, `perceptual_hash CHAR(16)`, `processing_status_id FK lookups (processing_status)`, `upload_batch_id UUID`, `client_file_id VARCHAR(120)` (resumable upload, unique per batch). **album_shared_links** (Base +): `album_id FK`, `token_hash CHAR(64)` (32-character token), `revoked_at`. **album_members** (Base +): `album_id FK`, `user_id FK`. Selected-users mode only. **download_logs** (Base +): `photo_id FK`, `user_id FK`, `variant VARCHAR(20)`, `occurred_at`. Retention 1 year. # Operations (/ar/docs/erd/domains/operations) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram TRIP_VEHICLES ||--o{ CHECKIN_EVENTS : logs BOOKING_PASSENGERS ||--o{ CHECKIN_EVENTS : about TRIP_VEHICLES ||--o{ TRACKING_POINTS : reports TRIP_VEHICLES ||--o{ INCIDENTS : raises TRIP_VEHICLES ||--o| TRIP_REPORTS : closes USERS ||--o{ CHILD_LINKS : parent_of BOOKING_PASSENGERS ||--o{ CHILD_LINKS : child TRIPS ||--o{ SAFETY_CASES : about ``` ## checkin_events [#checkin_events] *(immutable hypertable) [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) to [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue)* | Column | Type | Notes | |---|---|---| | id, uuid | BIGSERIAL, UUID | Primary key `(id, occurred_at)` | | organization_id | BIGINT | | | trip_id | BIGINT | | | trip_vehicle_id | BIGINT | | | passenger_id | BIGINT FK booking_passengers | | | event_type_id | BIGINT FK lookups | `checkin_event`: check_in, check_out, refused_wrong_vehicle | | stop_id | BIGINT FK trip_stops NULL | | | moderator_user_id | BIGINT FK users | | | lat, lng, accuracy_m | NUMERIC, NUMERIC, REAL | Null when location is not permitted | | occurred_at | TIMESTAMPTZ | Device time of the event | | received_at | TIMESTAMPTZ | Server time; difference measures the 60-second target | | client_event_id | UUID | Unique; offline replay is idempotent | | created_at, created_by | | | Retention 1 year. **tracking_points** (immutable hypertable) [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection): `id`, `organization_id`, `trip_vehicle_id`, `occurred_at`, `lat`, `lng`, `speed_kmh REAL`, `heading SMALLINT`, `accuracy_m REAL`, `source_id FK lookups (gps_source: driver_app, moderator_app)`. Retention 90 days, then an hourly summary is kept. **incidents** (Base +) [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting): `organization_id`, `trip_id`, `trip_vehicle_id`, `reported_by FK users`, `category_id FK lookups (incident_category: safety, medical, vehicle_fault, lost_traveler, conduct, other)`, `severity_id FK lookups (severity)`, `description TEXT`, `attachments JSONB`, `lat`, `lng`, `status_id FK lookups (incident_status: open, acknowledged, resolved)`, `acknowledged_at`, `resolved_at`. **trip_reports** (Base +) [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock): `organization_id`, `trip_vehicle_id FK UNIQUE`, `moderator_user_id`, `checked_in_count INT`, `final_headcount INT`, `mismatch_reason TEXT`, `notes TEXT`, `submitted_at` (locked after), `org_note TEXT`. ## child_links [#child_links] *(Base +) [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) to [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking)* | Column | Type | Notes | |---|---|---| | parent_user_id | BIGINT FK users | | | booking_id | BIGINT FK bookings | | | passenger_id | BIGINT FK booking_passengers | Must be `is_child` | | organization_id | BIGINT | Copied for RLS on organization reads | | guardianship_consent_id | BIGINT FK consents | D-126 | | status_id | BIGINT FK lookups | `child_link_status`: active, ended | | ended_at | TIMESTAMPTZ | Ends on cancellation or refund | Unique active `(parent_user_id, passenger_id)`. **safety_cases** (Base +) [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting): `organization_id`, `trip_id FK`, `passenger_id FK NULL`, `reported_by FK users`, `reporter_role_id FK lookups (role)`, `description TEXT`, `status_id FK lookups (case_status: open, escalated, closed)`, `escalated_to VARCHAR(200)` (D-68), `escalated_at`, `closed_at`. # Organizations (/ar/docs/erd/domains/organizations) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram ORGANIZATIONS ||--o{ ORGANIZATION_MEMBERS : employs USERS ||--o{ ORGANIZATION_MEMBERS : joins ORGANIZATION_MEMBERS ||--o{ MEMBER_PERMISSIONS : granted PERMISSIONS ||--o{ MEMBER_PERMISSIONS : defines ORGANIZATIONS ||--o{ INVITATIONS : sends ORGANIZATIONS ||--o{ CRM_CONNECTIONS : connects ORGANIZATIONS ||--o{ WEBHOOK_ENDPOINTS : registers WEBHOOK_ENDPOINTS ||--o{ WEBHOOK_DELIVERIES : attempts ORGANIZATIONS ||--o{ API_KEYS : issues MARKETS ||--o{ ORGANIZATIONS : hosts ``` ## organizations [#organizations] *(Base +) [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) to [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding)* | Column | Type | Notes | |---|---|---| | owner_user_id | BIGINT FK users | | | application_id | BIGINT FK applications | | | market_id | BIGINT FK markets | From country ([BRL-27](/en/docs/brd/requirements#7-business-rules)) | | legal_name, trade_name | JSONB | | | commercial_reg_no | VARCHAR(50) | | | tax_no | VARCHAR(50) | | | billing_email | CITEXT | | | timezone | VARCHAR(64) | Defaults from market | | status_id | BIGINT FK lookups | `organization_status`: active, suspended, closed | | subscription_id | BIGINT FK subscriptions | | | seat_self_selection_default | BOOLEAN | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) | | child_tracking_default | BOOLEAN | | | branding | JSONB | Enterprise only ([BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org)) | | invoice_settings | JSONB | Prefix, footer, bank details | | approved_at | TIMESTAMPTZ | | ## organization_members [#organization_members] *(Base +) [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth), [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) to [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in)* | Column | Type | Notes | |---|---|---| | organization_id | BIGINT FK organizations | Tenant column | | user_id | BIGINT FK users NULL | Null until the invitation is accepted | | email | CITEXT | The access-list key used for organization switching | | member_type_id | BIGINT FK lookups | `member_type`: owner, employee, org_driver, org_photographer, moderator | | status_id | BIGINT FK lookups | `member_status`: invited, active, suspended, removed | | joined_at, removed_at | TIMESTAMPTZ | | Unique `(organization_id, email, deleted_at)`. **permissions** (reference): `id`, `code VARCHAR(80) UNIQUE` (for example `trip.create`, `booking.refund`, `accounting.export`, `integration.manage`, `analytics.view`), `area_id FK lookups (permission_area)`, `name JSONB`. **member_permissions** (Base +): `organization_id`, `member_id FK organization_members`, `permission_id FK permissions`. Every insert and soft delete writes an audit log entry ([FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited)). **invitations** (Base +): `organization_id`, `member_id FK`, `channel_id FK lookups (otp_channel)`, `token_hash CHAR(64)`, `expires_at` (7 days, D-286, D-94), `accepted_at`. **crm_connections** (Base +): `organization_id`, `provider_id FK lookups (crm_provider)`, `credentials_enc BYTEA`, `status_id FK lookups (integration_status: connected, error, disconnected)`, `last_sync_at`. **webhook_endpoints** (Base +) [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks): `organization_id`, `url TEXT` (HTTPS only), `secret_enc BYTEA`, `previous_secret_enc BYTEA`, `previous_secret_valid_until TIMESTAMPTZ` (24 h after rotation), `events TEXT[]` (event codes), `is_active BOOLEAN`. **webhook_deliveries** (Base +): `organization_id`, `endpoint_id FK`, `event_uuid UUID`, `event_type VARCHAR(80)`, `payload JSONB`, `attempt SMALLINT` (up to 5 over 24 h), `status_code SMALLINT`, `next_attempt_at`, `delivered_at`, `replay_until` (7 days, D-63). **api_keys** (Base +): `organization_id`, `name VARCHAR(100)`, `key_prefix VARCHAR(12)`, `key_hash CHAR(64)`, `scopes TEXT[]`, `last_used_at`, `revoked_at`. # Plans and subscriptions (/ar/docs/erd/domains/plans-and-subscriptions) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram PLANS ||--o{ PLAN_LIMITS : limits PLANS ||--o{ PLAN_PRICES : priced MARKETS ||--o{ PLAN_PRICES : per_market PLANS ||--o{ SUBSCRIPTIONS : subscribed SUBSCRIPTIONS ||--o{ SUBSCRIPTION_CHARGES : billed SUBSCRIPTIONS ||--o{ PLAN_OVERRIDES : overridden SUBSCRIPTIONS ||--o{ USAGE_COUNTERS : measures ``` **plans** (Base +) [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog): `role_scope_id FK lookups (plan_role: organization, driver, photographer, traveler)`, `code VARCHAR(40)` (starter, growth, enterprise, basic, professional, premium, studio, pro, free, explorer, vip), `name JSONB`, `tier_rank SMALLINT`, `trial_days SMALLINT NULL` ([OD-28](/en/docs/brd/compliance#11-open-decisions)), `is_default_on_approval BOOLEAN`, `is_active BOOLEAN`. **plan_limits** (Base +): `plan_id FK`, `limit_key VARCHAR(60)` (for example `active_trips_per_month`, `employees`, `vehicles_per_trip`, `programs_per_trip`, `coupons_active`, `bookings_per_month`, `portfolio_images`, `albums_per_trip`), `limit_value INT NULL` (null means unlimited), `feature_key VARCHAR(60) NULL` (for example `platform_suppliers`, `seat_self_select`, `child_tracking`, `watermark`, `album_privacy_link`, `album_privacy_selected`, `analytics_level`, `export`), `feature_value VARCHAR(40) NULL`. **plan_prices** (Base +): `plan_id FK`, `market_id FK`, `interval_id FK lookups (billing_interval: monthly, annual)`, `amount_minor BIGINT` ([OD-26](/en/docs/brd/compliance#11-open-decisions)), `currency_code`, `gateway_price_ref VARCHAR(120)`, `valid_from DATE`. ## subscriptions [#subscriptions] *(Base +) [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) to [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials)* | Column | Type | Notes | |---|---|---| | owner_type_id | BIGINT FK lookups | `subscription_owner`: organization, user | | organization_id | BIGINT FK NULL | | | user_id | BIGINT FK NULL | | | plan_id | BIGINT FK plans | | | plan_price_id | BIGINT FK plan_prices NULL | Null for Free | | status_id | BIGINT FK lookups | `subscription_status`: trial, active, grace, downgraded, cancelling, ended | | current_period_start, current_period_end | TIMESTAMPTZ | | | trial_ends_at | TIMESTAMPTZ | | | grace_started_at | TIMESTAMPTZ | 7 days ([BRL-14](/en/docs/brd/requirements#7-business-rules)) | | scheduled_plan_id | BIGINT FK plans NULL | Downgrade at period end | | cancel_at_period_end | BOOLEAN | | | gateway_subscription_ref | VARCHAR(120) | | **subscription_charges** (Base +): `subscription_id FK`, `period_start`, `period_end`, `amount_minor`, `proration_minor`, `currency_code`, `status_id FK lookups (charge_status: due, paid, failed, void)`, `attempt_no SMALLINT` (retries days 1, 3, 5, 7, D-09), `next_retry_at`. **plan_overrides** (Base +) D-227: `subscription_id FK`, `override_plan_id FK plans`, `reason TEXT`, `starts_at`, `ends_at` (required), `requested_by FK users`, `approved_by FK users` (second admin, must differ), `reverted_at`. **usage_counters** (Base +): `subscription_id FK`, `limit_key VARCHAR(60)`, `period_start DATE`, `used INT`. Unique `(subscription_id, limit_key, period_start)`. Reset at 00:00 on the 1st in the owner's time zone (D-218). # Platform (/ar/docs/erd/domains/platform) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. **notifications** (Base +) [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) to [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery): `user_id FK`, `category_id FK lookups (notification_category)`, `template_id FK notification_templates`, `event_key VARCHAR(120)` (unique with `user_id` to stop duplicates), `payload JSONB`, `is_urgent BOOLEAN`, `scheduled_for TIMESTAMPTZ` (quiet hours), `read_at`. **notification_deliveries** (Base +): `notification_id FK`, `channel_id FK lookups (notification_channel)`, `provider_message_id VARCHAR(120)`, `status_id FK lookups (delivery_status: queued, sent, delivered, failed, dropped)`, `attempt SMALLINT`, `next_attempt_at`, `error TEXT`. **notification_templates** (Base +) [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates): `category_id FK lookups`, `channel_id FK lookups`, `locale VARCHAR(5)`, `version INT`, `subject TEXT`, `body TEXT`, `is_active BOOLEAN`. Unique `(category_id, channel_id, locale, version)`. **feature_flags** (Base +): `key VARCHAR(80)` unique, `description TEXT`, `is_enabled BOOLEAN`, `rules JSONB` (market, plan, organization, percentage). **analytics_events** (insert only, partitioned by month) [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl): `id`, `occurred_at`, `organization_id NULL`, `trip_id NULL`, `user_id NULL`, `anon_id UUID`, `event_name VARCHAR(60)` (page_view, trip_view, add_to_cart, checkout_start, booking_confirmed, album_view), `page_path TEXT`, `referrer TEXT`, `market_id`, `device_platform_id FK lookups`. Child data is excluded ([FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions)). **analytics_daily** (Base +): `day DATE`, `organization_id NULL`, `trip_id NULL`, `provider_user_id NULL`, `metric_key VARCHAR(60)`, `value NUMERIC(18,2)`. Unique `(day, organization_id, trip_id, provider_user_id, metric_key)`. **audit_logs** (immutable, append-only store with object lock, 7 years) [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log): `id`, `uuid`, `actor_user_id`, `actor_role_id`, `organization_id NULL`, `action VARCHAR(80)`, `target_type VARCHAR(60)`, `target_id BIGINT`, `before JSONB`, `after JSONB`, `reason TEXT`, `request_id UUID`, `ip INET`, `occurred_at`, `created_at`. **outbox_events** (immutable): `id`, `uuid`, `aggregate_type`, `aggregate_id`, `event_type VARCHAR(80)`, `payload JSONB`, `occurred_at`, `published_at` (set by the relay; the only column ever updated). **idempotency_keys**: `key VARCHAR(120)`, `user_id`, `request_hash CHAR(64)`, `response JSONB`, `status_code SMALLINT`, `expires_at` (24 h). Primary key `(user_id, key)`. # Suppliers (/ar/docs/erd/domains/suppliers) Part of the [data model](/en/docs/erd); conventions and base columns are documented there. ```mermaid erDiagram USERS ||--o| DRIVER_PROFILES : is USERS ||--o| PHOTOGRAPHER_PROFILES : is DRIVER_PROFILES ||--o{ PROVIDER_VEHICLES : owns DRIVER_PROFILES ||--o{ LAB_TESTS : takes LAB_PARTNERS ||--o{ LAB_TESTS : performs PHOTOGRAPHER_PROFILES ||--o{ PORTFOLIO_ITEMS : shows USERS ||--o{ AVAILABILITY_SLOTS : marks USERS ||--o{ PAYOUT_METHODS : receives_via ORGANIZATIONS ||--o{ DRIVER_PROFILES : owns_org_driver ``` ## driver_profiles [#driver_profiles] *(Base +)* | Column | Type | Notes | |---|---|---| | user_id | BIGINT FK users | Unique per track | | track_id | BIGINT FK lookups | `supplier_track`: platform, organization | | organization_id | BIGINT FK organizations NULL | Set for organization-owned drivers ([BRL-05](/en/docs/brd/requirements#7-business-rules)) | | license_no_enc | BYTEA | enc | | license_valid_until | DATE | | | service_regions | TEXT[] | | | subscription_id | BIGINT FK subscriptions NULL | Platform drivers only | | lab_status_id | BIGINT FK lookups | `driver_lab_status`: clear, paused, suspended | | suspended_since | TIMESTAMPTZ | Close after 30 days ([BRL-16](/en/docs/brd/requirements#7-business-rules)) | | visibility_id | BIGINT FK lookups | `profile_visibility`: standard, featured, top | | verified_badge | BOOLEAN | Plan-driven | **photographer_profiles** (Base +): `user_id FK`, `track_id FK lookups (supplier_track)`, `organization_id NULL`, `bio JSONB`, `equipment TEXT`, `service_regions TEXT[]`, `rates JSONB` (per currency), `subscription_id FK NULL`, `visibility_id FK lookups`, `verified_badge BOOLEAN`, `watermark_settings JSONB`. **provider_vehicles** (Base +) [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details): `driver_profile_id FK`, `plate_no VARCHAR(20)`, `model VARCHAR(80)`, `year SMALLINT`, `seat_count SMALLINT`, `registration_valid_until DATE`, `insurance_valid_until DATE` (at least 3 months at submission). **availability_slots** (Base +) D-89: `user_id FK`, `starts_on DATE`, `ends_on DATE`, `kind_id FK lookups (availability_kind: available, unavailable)`. Dates and ranges only. **portfolio_items** (Base +): `photographer_profile_id FK`, `storage_path TEXT`, `width INT`, `height INT`, `sort_by INT`. Count per plan ([FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio)); minimum 8 at application. **lab_partners** (Base +): `market_id FK`, `name JSONB`, `address JSONB`, `api_settings_enc BYTEA`, `is_active BOOLEAN`. ## lab_tests [#lab_tests] *(Base +) [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension)* | Column | Type | Notes | |---|---|---| | driver_profile_id | BIGINT FK driver_profiles | | | lab_partner_id | BIGINT FK lab_partners NULL | | | test_type_id | BIGINT FK lookups | `lab_test_type`: drug_screen, medical_fitness, both | | status_id | BIGINT FK lookups | `lab_test_status`: requested, pending, result_uploaded, passed, failed, missed | | requested_by | BIGINT FK users | Admin | | requested_at | TIMESTAMPTZ | | | deadline_at | TIMESTAMPTZ | 3 days default, 1 to 7 (D-21) | | booked_slot_at | TIMESTAMPTZ | | | result_path | TEXT | Restricted bucket | | result_source_id | BIGINT FK lookups | `lab_result_source`: partner, driver_upload | | decided_by, decided_at | BIGINT, TIMESTAMPTZ | Admin decision | | is_initial | BOOLEAN | Application lab result | **payout_methods** (Base +): `user_id FK`, `organization_id NULL`, `method_id FK lookups (payout_method: stripe_connect, bank_transfer, local_provider)`, `details_enc BYTEA`, `external_account_id VARCHAR(100)`, `currency_code`, `is_default BOOLEAN`, `verified_at`. # Data Model (/ar/docs/erd) # Trips Enjoy: Entity-Relationship Design (ERD) [#trips-enjoy-entity-relationship-design-erd] These apply to every table unless the table says otherwise. | Rule | Detail | |---|---| | Primary key | `id BIGSERIAL` (internal only, never exposed). | | Public identifier | `uuid UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE`. APIs, URLs, webhooks and exports use `uuid` only. | | Timestamps | `created_at`, `updated_at`, `deleted_at` as `TIMESTAMPTZ`. All times are stored in UTC. | | Soft delete | `is_deleted BOOLEAN NOT NULL DEFAULT false` plus `deleted_at`. Unique constraints include `deleted_at` (for example `UNIQUE (code, deleted_at)`). | | Audit columns | `created_by`, `updated_by`, `deleted_by` as `BIGINT` FKs to `users.id`. | | No enum types | Every status, type and category is a `BIGINT` FK to `lookups.id` (named `*_id`, for example `status_id`). The lookup type is named in the column notes. | | Tenant column | Every row owned by an organization carries `organization_id BIGINT NOT NULL`, indexed, with an RLS policy on `app.current_organization_id` (SRS [DAT-01](/en/docs/srs/data#62-data-isolation), [NFR-SEC-07](/en/docs/srs/quality#82-security-nfr-sec)). Child tables repeat `organization_id` (denormalized) so RLS never needs a join. | | Money | `*_minor BIGINT` in minor units plus `currency_code CHAR(3)` FK `currencies.code`. Never a float, never a bare number (D-157). | | Translatable text | `JSONB` shaped `{"en": "...", "ar": "..."}` for names and descriptions shown to users. | | Country | `country_code CHAR(2)` FK `countries.code` (ISO 3166-1 alpha-2). | | Immutable tables | `ledger_entries`, `ledger_transactions`, `audit_logs`, `deal_offers`, `checkin_events`, `tracking_points`, `consents`, `outbox_events`: insert only. They keep `created_at` and `created_by` but have no `updated_*`, `deleted_*` or `is_deleted`. Corrections are new reversing rows (SRS [DAT-08](/en/docs/srs/data#63-soft-delete-immutability-and-deletion)). | | Time-series | `checkin_events` and `tracking_points` are TimescaleDB hypertables partitioned on `occurred_at`; primary key `(id, occurred_at)`. | | Encrypted columns | Columns marked "enc" are encrypted at column level with KMS (SRS [DAT-05](/en/docs/srs/data#62-data-isolation)). A `*_hash` column next to them supports lookups. | Base columns are not repeated in the tables below. "Base" means: `id`, `uuid`, `created_at`, `updated_at`, `deleted_at`, `is_deleted`, `created_by`, `updated_by`, `deleted_by`. | Domain | Tables | Section | |---|---|---| | Lookups and markets | lookup_types, lookups, countries, currencies, markets, market_payment_methods, tax_rates | 3.1 | | Identity and access | users, user_roles, auth_factors, otp_challenges, sessions, devices, consents, notification_preferences, privacy_requests | 3.2 | | Applications | applications, application_documents, application_decisions, appeals | 3.3 | | Organizations | organizations, organization_members, permissions, member_permissions, invitations, crm_connections, webhook_endpoints, webhook_deliveries, api_keys | 3.4 | | Suppliers | driver_profiles, photographer_profiles, provider_vehicles, availability_slots, portfolio_items, lab_partners, lab_tests, payout_methods | 3.5 | | Fleet and trips | vehicle_types, vehicle_type_seats, vehicles, trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments, programs, program_tiers | 3.6 | | Deals | deals, deal_offers | 3.7 | | Booking and payment | bookings, booking_passengers, booking_programs, trip_seats, payments, payment_attempts, refunds, booking_remedies | 3.8 | | Coupons | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | 3.9 | | Plans | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | 3.10 | | Operations | checkin_events, incidents, trip_reports, tracking_points, child_links, safety_cases | 3.11 | | Media | albums, photos, album_shared_links, album_members, download_logs | 3.12 | | Finance | ledger_accounts, ledger_transactions, ledger_entries, invoices, invoice_lines, payout_runs, payouts, settlements, settlement_lines, reconciliation_exceptions, disputes, dispute_files | 3.13 | | Platform | notifications, notification_deliveries, notification_templates, feature_flags, analytics_events, analytics_daily, audit_logs, outbox_events, idempotency_keys | 3.14 | ## Domains [#domains] # Lookup Catalog & Access Paths (/ar/docs/erd/reference) ## 4. Lookup type catalog [#4-lookup-type-catalog] Seeded with `is_system = true`. Admin can add values only to types marked "extensible". | Lookup type | Values | Extensible | |---|---|---| | account_status | active, suspended, deletion_requested, closed | No | | role | traveler, organization_owner, organization_employee, platform_driver, platform_photographer, org_driver, org_photographer, moderator, admin_super, admin_operations, admin_finance | No | | application_type / application_status | See 3.3 | No | | decision_reason, suspension_reason | D-234 list | Yes | | trip_status, booking_status, seat_status, deal_status, subscription_status, coupon_status, lab_test_status | See SRS section 7 | No | | pricing_model | free, per_person, by_quantity, per_group, tiered | No | | payment_method, gateway | See 3.1 | Yes | | incident_category | safety, medical, vehicle_fault, lost_traveler, conduct, other (D-331) | No | | dispute_type | booking, payment, refund, supplier_conduct, organization_conduct, other (D-254) | No | | notification_category | account, booking, payment, trip_reminder, trip_day, deal, application, lab_test, plan, promotion, safety | Yes | | trip_category | school, corporate, religious, tourism, event, other | Yes | | permission_area | trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics | No | ## 5. Row-level security and access paths [#5-row-level-security-and-access-paths] | Path | Rule | |---|---| | Organization staff | `organization_id = app.current_organization_id` on every tenant table, plus permission checks in the service layer. | | Platform supplier | Reads deals, assignments, albums and earnings where `provider_user_id` or `photographer_user_id` equals the caller, through a platform-scoped repository that logs every call. | | Moderator | Reads `booking_passengers` and writes `checkin_events` only for `trip_vehicle_id` in an accepted, unexpired assignment. | | Traveler | Reads own bookings, passengers, receipts and allowed albums. Never reads `tracking_points` ([BRL-29](/en/docs/brd/requirements#7-business-rules)). | | Parent | Reads child status through `child_links` with status active; live position only when the trip is in progress and eligible ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)). | | Admin | Bypass policy role; every query logged to `audit_logs`. | ## 6. Traceability [#6-traceability] | SRS entity (section 6.1) | Tables | |---|---| | Account, Role assignment | users, user_roles, auth_factors, sessions | | Organization, Employee permission set | organizations, organization_members, member_permissions, permissions | | Application | applications, application_documents, application_decisions, appeals | | Driver profile, Photographer profile | driver_profiles, photographer_profiles, provider_vehicles, portfolio_items, availability_slots | | Vehicle type, Vehicle | vehicle_types, vehicle_type_seats, vehicles | | Trip, Trip vehicle, Program | trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments, programs, program_tiers | | Booking, Booking passenger, Seat | bookings, booking_passengers, booking_programs, trip_seats, booking_remedies | | Deal and deal offer | deals, deal_offers | | Coupon, Coupon redemption | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | | Plan, Subscription | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | | Ledger entry, Payout, Invoice | ledger_accounts, ledger_transactions, ledger_entries, payout_runs, payouts, invoices, invoice_lines | | Settlement (new in v1.1) | settlements, settlement_lines | | Album and photo | albums, photos, album_shared_links, album_members, download_logs | | Check-in event, Tracking point | checkin_events, tracking_points, incidents, trip_reports | | Child link | child_links, safety_cases | | Lab test | lab_tests, lab_partners | | Notification preference | notification_preferences, notifications, notification_deliveries, notification_templates | | Audit log entry | audit_logs | | Market (new in v1.1) | countries, currencies, markets, market_payment_methods, tax_rates | | Analytics (new in v1.1) | analytics_events, analytics_daily | | Dispute | disputes, dispute_files | # Trips Enjoy Documentation (/ar/docs) Trips Enjoy is a multi-role trips marketplace: travelers book seats on organized trips, organizations publish and operate them, and drivers, photographers and moderators deliver the experience. This is the complete product documentation set. All pages exist in Arabic and English interfaces; this documentation is written in English. ## How to read the set [#how-to-read-the-set] - Requirements cite each other by stable ID: `BR-*` (business), `BRL-*` (rules), `FR-*` (functional), `D-*` (decisions), `OD-*` (open decisions) and `UF-*` (flows). - Every SRS requirement page lists its MoSCoW priority and the upstream BRD IDs it traces to. - Items marked `[OPEN]` or *(placeholder)* follow the open-decision process in the BRD. # Delivery Plan (/ar/docs/plan) This is the end-to-end delivery view of the whole system: six phases from foundation to scale, every phase broken into tasks, and every task generated from — and linked to — one functional requirement. Nothing here is maintained by hand: the phase pages and milestones are produced by `bun scripts/generate-plan.ts` from the living documentation, so the plan can never drift from the requirements. ## How it fits together [#how-it-fits-together] ```mermaid flowchart LR BR["BRD requirement with a phase"] --> FR["SRS functional requirement"] FR --> T["Delivery task on the phase page"] T --> UF["User flows that exercise it"] T --> WS["System workflow behind it"] ``` - A **task** implements exactly one [functional requirement](/en/docs/srs/requirements/auth) and inherits its MoSCoW priority. Its phase comes from the requirement's business trace: FR → BR → the BRD's phase column. - *Covered by* links the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise the task — the same attribution as the [coverage page](/en/docs/workflows/coverage). - Tasks carry **no invented estimates**. Size a phase by its task count and priority mix (shown on each page and in [milestones](/en/docs/plan/milestones)); the definition of done, not a date, closes a phase. ## The phases [#the-phases] ## Reading a phase page [#reading-a-phase-page] Each phase page opens with its theme and **definition of done** (verbatim from BRD section 3.3), followed by the cross-cutting platform tasks, then one epic per module with its task table, and finally the **decisions to close** — the open decisions cited by that phase's requirements, which should be settled before the phase starts, not during it. # Milestones (/ar/docs/plan/milestones) Each phase closes on its **definition of done** (BRD section 3.3) with every *Must* task verified against its acceptance criteria. Task counts come from the [generated phase pages](/en/docs/plan); re-run `bun scripts/generate-plan.ts` after requirement changes to refresh them. ## The ladder [#the-ladder] | Phase | Tasks (M/S/C) | Definition of done | Decisions to close | |---|---|---|---| | **P1** — Foundation | 41 (41M / 0S / 0C) | An organization can apply, be approved and sign in to an empty workspace. | [OD-03](/en/docs/brd/compliance#11-open-decisions), [OD-12](/en/docs/brd/compliance#11-open-decisions), [OD-21](/en/docs/brd/compliance#11-open-decisions), [OD-23](/en/docs/brd/compliance#11-open-decisions) | | **P2** — Single-vehicle pilot (Egypt) | 31 (30M / 1S / 0C) | One pilot organization sells one trip to real travelers with real payments. | [OD-07](/en/docs/brd/compliance#11-open-decisions) | | **P3** — Operational depth | 40 (37M / 3S / 0C) | A three-bus trip with about 120 passengers runs end to end. | [OD-25](/en/docs/brd/compliance#11-open-decisions) | | **P4** — Marketplace supply | 33 (32M / 1S / 0C) | Organizations book platform suppliers through deals and deliver albums with all privacy modes. | [OD-13](/en/docs/brd/compliance#11-open-decisions), [OD-24](/en/docs/brd/compliance#11-open-decisions) | | **P5** — Monetization and Gulf launch | 36 (33M / 3S / 0C) | Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once OD-10 is decided. | [OD-28](/en/docs/brd/compliance#11-open-decisions) | | **P6** — Family and scale | 26 (17M / 5S / 4C) | Parents see their children live; organizations get analytics and integrations. | — | ## Reading the ladder [#reading-the-ladder] - A phase gate needs all of its *Must* tasks green; *Should* and *Could* may trail into the next phase without blocking it. - The decisions column lists open decisions cited by that phase's requirements — close them before the phase starts, not during. - Cross-cutting platform tasks (CI, environments, integrations) sit at the top of each phase page and gate the same milestone. # P1 — Foundation (/ar/docs/plan/p1) **Theme.** Foundation — accounts, organization applications and approval, tenancy **Definition of done.** An organization can apply, be approved and sign in to an empty workspace. *(BRD section 3.3)* **41 tasks** from 10 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | CI pipeline and preview environments | Platform | | Tenancy foundation: Postgres schemas, row-level security policies, base columns | Platform | | Observability baseline: logs, metrics, traces and error tracking | Platform | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-AUTH-1 — Role-specific registration paths | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) | Must | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-01](/en/docs/user-flows/shared#uf-shr-01-sign-up-chooser) | | T-P1-AUTH-2 — Country on every registration form | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | Must | — | | T-P1-AUTH-3 — Verification by one-time code | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | Must | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-02](/en/docs/user-flows/shared#uf-shr-02-one-time-code), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-AUTH-4 — Role-specific sign-in methods | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in) | | T-P1-AUTH-5 — Sign-in lockout | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-AUTH-6 — Multi-role accounts | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts) | Must | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role), [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher) | | T-P1-AUTH-7 — Staff access to several organizations | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) | Must | [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher), [UF-ORG-02](/en/docs/user-flows/organization#uf-org-02-switch-organization) | | T-P1-AUTH-8 — Suspension and reinstatement | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement) | Must | [UF-SHR-10](/en/docs/user-flows/shared#uf-shr-10-suspended-account), [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | T-P1-AUTH-9 — Sessions and tokens | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) | Must | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ONB-1 — Application and supplier access | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P1-ONB-2 — Single admin queue | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | Must | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application) | | T-P1-ONB-3 — Decision time target | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) | Must | [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | T-P1-ONB-4 — Changes requested | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | Must | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P1-ONB-5 — Rejection, appeal and re-application | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | Must | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [UF-ADM-03](/en/docs/user-flows/admin#uf-adm-03-decide-an-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-ONB-6 — Applicant status notifications | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | Must | [applications](/en/docs/workflows/applications#timers-and-rules) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ORG-1 — Tenant isolation | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P1-ORG-2 — Tenant setup on approval | [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) | Must | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | T-P1-ORG-3 — Organization-owned drivers and photographers | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) | Must | [UF-ORG-05](/en/docs/user-flows/organization#uf-org-05-own-drivers-and-photographers), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## EMP — Employees and permissions [#emp--employees-and-permissions] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-EMP-1 — Permission sets | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) | Must | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | T-P1-EMP-2 — Permission changes are audited | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited) | Must | [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in) | | T-P1-EMP-3 — Employee limit per plan | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan) | Must | — | | T-P1-EMP-4 — Server-side scope | [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope) | Must | — | | T-P1-EMP-5 — Employee removal | [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal) | Must | — | | T-P1-EMP-6 — Invitation and first sign-in | [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) | Must | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | ## MOD — Moderator app [#mod--moderator-app] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-MOD-1 — Moderator sign-in | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in) | Must | [UF-MOD-02](/en/docs/user-flows/moderator#uf-mod-02-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-PAR-1 — Parent notifications | [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) | Must | [UF-PAR-04](/en/docs/user-flows/parent#uf-par-04-notifications) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-DRV-1 — Driver work area | [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | Must | [UF-DRV-09](/en/docs/user-flows/driver#uf-drv-09-organization-owned-driver-home) | | T-P1-DRV-2 — Missed-deadline suspension | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) | Must | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-ADM-1 — Account administration | [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | Must | [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | T-P1-ADM-2 — Admin staff | [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P1-ADM-3 — Configuration | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | T-P1-ADM-4 — Immutable audit log | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | Must | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | ## NTF — Notifications [#ntf--notifications] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-NTF-1 — Channels by preference | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) | Must | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications), [UF-SHR-11](/en/docs/user-flows/shared#uf-shr-11-notification-centre), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-2 — Language and layout | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-3 — Versioned templates | [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | T-P1-NTF-4 — Delivery records and retries | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | T-P1-NTF-5 — No duplicate delivery | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) | Must | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#diagram), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | T-P1-NTF-6 — Trip reminders and change notices | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#hourly), [notifications](/en/docs/workflows/notifications#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P1-TRV-1 — Profile and preferences | [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | Must | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications) | | T-P1-TRV-2 — Plan changes | [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) | Must | [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) | | T-P1-TRV-3 — Supplier application keeps traveler access | [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | Must | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-03](/en/docs/brd/compliance#11-open-decisions) - [OD-12](/en/docs/brd/compliance#11-open-decisions) - [OD-21](/en/docs/brd/compliance#11-open-decisions) - [OD-23](/en/docs/brd/compliance#11-open-decisions) # P2 — Single-vehicle pilot (Egypt) (/ar/docs/plan/p2) **Theme.** Single-vehicle pilot (Egypt) — trip creation, traveler booking, payment in EGP, admin basics **Definition of done.** One pilot organization sells one trip to real travelers with real payments. *(BRD section 3.3)* **31 tasks** from 8 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Egypt payment gateway integration and callback handling | Platform | | Pilot environment and seed data | Platform | | Email and SMS provider integration for transactional messages | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-ORG-1 — Fleet registration | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-TRIP-1 — Trip creation wizard | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P2-TRIP-2 — Draft, public and targeted publishing | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P2-TRIP-3 — Trip lifecycle | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle) | Must | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | T-P2-TRIP-4 — Changes that affect confirmed bookings | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) | Must | [UF-TRV-07](/en/docs/user-flows/traveler#uf-trv-07-choose-a-remedy-after-a-trip-change), [UF-ORG-10](/en/docs/user-flows/organization#uf-org-10-change-a-trip-after-bookings), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-FLT-1 — Reusable vehicle types | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types) | Must | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | T-P2-FLT-2 — Vehicle registry | [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) | Must | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | T-P2-FLT-3 — Seat map from vehicle type | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | T-P2-FLT-4 — Archiving vehicle types | [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) | Should | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | ## BKG — Booking and checkout [#bkg--booking-and-checkout] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-BKG-1 — Booking composition | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P2-BKG-2 — Checkout handoff | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff) | Must | — | | T-P2-BKG-3 — Retry without losing the cart | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-BKG-4 — Traveler cancellation and refund | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) | Must | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P2-BKG-5 — Receipts and invoices | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | T-P2-BKG-6 — Organization cancellation of a trip | [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | Must | [UF-ORG-11](/en/docs/user-flows/organization#uf-org-11-cancel-a-trip), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | T-P2-BKG-7 — Booking states | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-PAY-1 — Payment outcomes | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-2 — Idempotent callbacks | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-3 — Refund execution | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | Must | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P2-PAY-4 — Gateway reconciliation | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-PAY-5 — Payment methods per market | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P2-PAY-6 — Payment pending | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) | Must | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [UF-ADM-12](/en/docs/user-flows/admin#uf-adm-12-payment-escalations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P2-PAY-7 — Fawry cash vouchers | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-ACC-1 — Double-entry ledger | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-ACC-2 — Reconciled exports | [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | T-P2-ACC-3 — Daily reconciliation and finance digest | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) | Must | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-TRV-1 — Trip visibility and early access | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P2-TRV-2 — History and receipts by plan | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | Must | [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | ## MKT — Markets [#mkt--markets] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P2-MKT-1 — Market configuration | [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Must | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | T-P2-MKT-2 — Market from country | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P2-MKT-3 — Rounding and display | [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | Must | [money](/en/docs/workflows/money#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-07](/en/docs/brd/compliance#11-open-decisions) # P3 — Operational depth (/ar/docs/plan/p3) **Theme.** Operational depth — multi-vehicle trips, programs, seat modes, moderator app, check-in **Definition of done.** A three-bus trip with about 120 passengers runs end to end. *(BRD section 3.3)* **40 tasks** from 13 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Moderator installable app build with the offline sync layer | Platform | | Multi-vehicle operational tooling and manifests | Platform | | Check-in device fleet testing (low connectivity, queue replay) | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-ORG-1 — Seat self-selection setting | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-TRIP-1 — Multi-vehicle trips | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P3-TRIP-2 — Program changes until departure | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | ## PRG — Programs [#prg--programs] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PRG-1 — Pricing models | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | T-P3-PRG-2 — Program types | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P3-PRG-3 — Live booking summary | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | T-P3-PRG-4 — Enrollment report | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | Must | — | | T-P3-PRG-5 — Program capacity | [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) | Must | — | | T-P3-PRG-6 — Program count limit | [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-FLT-1 — Vehicle limit per trip | [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | T-P3-FLT-2 — Vehicle removal after bookings | [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | ## STF — Staffing [#stf--staffing] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-STF-1 — Driver tracks | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P3-STF-2 — Ready gate | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) | Must | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P3-STF-3 — Moderator assignment | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-STF-4 — Reassignment deadline | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | Must | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## SEAT — Seats [#seat--seats] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-SEAT-1 — Company-assigned by default | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) | Must | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P3-SEAT-2 — Live seat map | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-SEAT-3 — Priority window | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | Should | — | | T-P3-SEAT-4 — Seat hold | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold) | Must | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | T-P3-SEAT-5 — Seat states | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | T-P3-SEAT-6 — Staff seat assignment | [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment) | Must | [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats) | | T-P3-SEAT-7 — Self-selection by plan | [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PAY-1 — Refunds outside policy | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy) | Must | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund), [refunds](/en/docs/workflows/refunds#timers-and-rules) | ## CHK — Check-in and check-out [#chk--check-in-and-check-out] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-CHK-1 — Check-in at boarding | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) | Must | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | T-P3-CHK-2 — Vehicle match | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) | Must | — | | T-P3-CHK-3 — Event record | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record) | Must | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#diagram), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-CHK-4 — Check-out at stops | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops) | Must | [UF-MOD-05](/en/docs/user-flows/moderator#uf-mod-05-check-out-at-a-stop-or-destination), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-CHK-5 — Offline queue | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) | Must | [UF-MOD-06](/en/docs/user-flows/moderator#uf-mod-06-offline-queue), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P3-CHK-6 — Incident reporting | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) | Should | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-07](/en/docs/user-flows/moderator#uf-mod-07-report-an-incident) | | T-P3-CHK-7 — Occupancy | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## MOD — Moderator app [#mod--moderator-app] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-MOD-1 — Vehicle-scoped access | [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access) | Must | [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest) | | T-P3-MOD-2 — End-of-trip report | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report) | Must | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P3-MOD-3 — Access revocation | [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | Must | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P3-MOD-4 — Installable app | [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) | Must | [UF-MOD-01](/en/docs/user-flows/moderator#uf-mod-01-install-and-first-open) | | T-P3-MOD-5 — Report lock | [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-PAR-1 — Child-safety reporting | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) | Must | [UF-ORG-19](/en/docs/user-flows/organization#uf-org-19-child-safety-reports), [UF-PAR-05](/en/docs/user-flows/parent#uf-par-05-report-a-child-safety-concern) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-ADM-1 — Dispute outcomes and refunds | [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | Must | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund) | | T-P3-ADM-2 — Dispute handling | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) | Must | [UF-TRV-14](/en/docs/user-flows/traveler#uf-trv-14-open-a-dispute), [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## NTF — Notifications [#ntf--notifications] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-NTF-1 — Quiet hours | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | Should | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P3-TRV-1 — Program discounts | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | Must | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-25](/en/docs/brd/compliance#11-open-decisions) # P4 — Marketplace supply (/ar/docs/plan/p4) **Theme.** Marketplace supply — platform drivers and photographers, lab tests, negotiation, media **Definition of done.** Organizations book platform suppliers through deals and deliver albums with all privacy modes. *(BRD section 3.3)* **33 tasks** from 8 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Media processing pipeline: variants, EXIF stripping, watermarking | Platform | | Stripe Connect Express onboarding for suppliers | Platform | | Lab-test document handling and expiry tracking | Platform | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ONB-1 — Photographer portfolio minimum | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum) | Must | [UF-PHO-01](/en/docs/user-flows/photographer#uf-pho-01-register-and-apply) | | T-P4-ONB-2 — Driver vehicle and insurance details | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | T-P4-ONB-3 — Lab consent and initial result | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | Must | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | ## STF — Staffing [#stf--staffing] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-STF-1 — Photographer tracks | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) | Must | [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | T-P4-STF-2 — Assignment after finalized deal | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | T-P4-STF-3 — Deal request visibility | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-NEG-1 — Deal proposal | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | T-P4-NEG-2 — Counter-offers and expiry | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P4-NEG-3 — Mutual acceptance | [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) | Must | — | | T-P4-NEG-4 — Rejection | [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | T-P4-NEG-5 — Finalization | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-NEG-6 — Negotiation by plan | [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan) | Must | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | ## MED — Media and albums [#med--media-and-albums] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-MED-1 — Album creation window | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) | Must | [UF-PHO-04](/en/docs/user-flows/photographer#uf-pho-04-assigned-trip-brief), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | | T-P4-MED-2 — Resumable batch upload | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload) | Must | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [media](/en/docs/workflows/media#diagram), [media](/en/docs/workflows/media#timers-and-rules) | | T-P4-MED-3 — Privacy modes by plan | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing) | | T-P4-MED-4 — Shared links | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) | Must | [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | T-P4-MED-5 — Selected-user access | [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | T-P4-MED-6 — Watermarking | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) | Should | [UF-PHO-07](/en/docs/user-flows/photographer#uf-pho-07-watermark), [media](/en/docs/workflows/media#timers-and-rules) | | T-P4-MED-7 — Traveler access and download | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) | Must | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | T-P4-MED-8 — Albums per trip by plan | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | Must | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [media](/en/docs/workflows/media#timers-and-rules) | ## PHO — Photographer studio [#pho--photographer-studio] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-PHO-1 — Portfolio | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) | Must | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | T-P4-PHO-2 — Rates and availability | [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability) | Must | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | T-P4-PHO-3 — Earnings | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | Must | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-DRV-1 — Deal responses | [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) | Must | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | T-P4-DRV-2 — Lab-test pause | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) | Must | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-DRV-10](/en/docs/user-flows/driver#uf-drv-10-support), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | T-P4-DRV-3 — Lab deadline and result | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P4-DRV-4 — Admin validation | [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation) | Must | — | | T-P4-DRV-5 — Earnings and payouts | [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts) | Must | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts) | | T-P4-DRV-6 — Driver availability | [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) | Must | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ADM-1 — Lab-test requests | [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) | Must | [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P4-ACC-1 — Supplier earnings and payouts | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) | Must | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#weekly), [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-ACC-2 — Settlements | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [money](/en/docs/workflows/money#timers-and-rules) | | T-P4-ACC-3 — Archive after settlement | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | Must | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-13](/en/docs/brd/compliance#11-open-decisions) - [OD-24](/en/docs/brd/compliance#11-open-decisions) # P5 — Monetization and Gulf launch (/ar/docs/plan/p5) **Theme.** Monetization and Gulf launch — plans for all roles, feature gates, coupons, full accounting, invoices; Saudi Arabia (SAR) and UAE (AED) **Definition of done.** Recurring revenue is measurable, limits are enforced, and the Gulf markets are live once OD-10 is decided. *(BRD section 3.3)* **36 tasks** from 12 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | Plan service and server-side feature gates | Platform | | Invoice numbering service with retries and finance review | Platform | | Gulf market configuration (SAR, AED) once OD-10 is decided | Platform | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-AUTH-1 — Account deletion with a 30-day grace period | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) | Must | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ORG-1 — B2B and B2C invoices | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) | Must | [UF-ORG-14](/en/docs/user-flows/organization#uf-org-14-invoices), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [money](/en/docs/workflows/money#timers-and-rules) | ## TRIP — Trips [#trip--trips] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-TRIP-1 — Active trip limit | [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit) | Must | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-NEG-1 — Deal audit | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit) | Must | [UF-ADM-09](/en/docs/user-flows/admin#uf-adm-09-deal-audit) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-PAY-1 — Subscription charges and dunning | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning) | Must | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## CPN — Coupons [#cpn--coupons] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-CPN-1 — Creator scope | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) | Must | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | | T-P5-CPN-2 — Cross-entity rejection | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) | Must | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | T-P5-CPN-3 — Real-time validation | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation) | Must | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | T-P5-CPN-4 — Coupon types | [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | T-P5-CPN-5 — Lifecycle and controls | [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | T-P5-CPN-6 — Redemption and reversal | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | Must | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | T-P5-CPN-7 — Analytics and abuse flags | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags) | Must | [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons), [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P5-CPN-8 — Coupon count by plan | [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan) | Must | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | ## SUB — Plans and subscriptions [#sub--plans-and-subscriptions] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-SUB-1 — Plan catalog | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) | Must | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides) | | T-P5-SUB-2 — Feature gates | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) | Must | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing) | | T-P5-SUB-3 — Grace period | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | Must | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-4 — Upgrade, downgrade and cancellation | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) | Must | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan), [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing) | | T-P5-SUB-5 — Admin overrides | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) | Must | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | T-P5-SUB-6 — Revenue reporting | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | Must | [money](/en/docs/workflows/money#timers-and-rules) | | T-P5-SUB-7 — Trials | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | Must | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-8 — Dunning | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) | Must | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing) | | T-P5-SUB-9 — Limits after a downgrade | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade) | Must | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | T-P5-SUB-10 — Counter reset | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) | Must | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#monthly), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | T-P5-SUB-11 — Plan service failure | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure) | Must | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## PHO — Photographer studio [#pho--photographer-studio] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-PHO-1 — Active bookings by plan | [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan) | Must | — | | T-P5-PHO-2 — Photographer coupons | [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) | Must | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | T-P5-PHO-3 — Visibility and badge | [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge) | Should | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | ## ADM — Admin console [#adm--admin-console] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ADM-1 — Platform-wide coupons | [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) | Must | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | T-P5-ADM-2 — Abuse flags | [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | Should | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-ACC-1 — Organization accounting per trip | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) | Must | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | T-P5-ACC-2 — Platform financial view | [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) | Must | — | | T-P5-ACC-3 — Exports by plan | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) | Must | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [money](/en/docs/workflows/money#timers-and-rules) | | T-P5-ACC-4 — Invoices across all parties | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | Must | [money](/en/docs/workflows/money#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-TRV-1 — Data copy and deletion | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | Must | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## MKT — Markets [#mkt--markets] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P5-MKT-1 — Cross-market browsing | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) | Must | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor) | | T-P5-MKT-2 — Market switch | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) | Should | [money](/en/docs/workflows/money#timers-and-rules) | ## Decisions to close [#decisions-to-close] These open decisions are cited by this phase's requirements: - [OD-28](/en/docs/brd/compliance#11-open-decisions) # P6 — Family and scale (/ar/docs/plan/p6) **Theme.** Family and scale — live tracking, parent tracker, analytics, public API **Definition of done.** Parents see their children live; organizations get analytics and integrations. *(BRD section 3.3)* **26 tasks** from 5 modules. Tasks are generated from the requirement trace: every task implements one functional requirement and links to it; *Covered by* names the [user flows](/en/docs/user-flows) and [system workflows](/en/docs/workflows) that exercise it. ## Cross-cutting [#cross-cutting] | Task | Area | |---|---| | WebSocket channel with SSE fallback for live data | Platform | | Public API gateway: keys, rate limits, OpenAPI publication | Platform | | Analytics warehouse and export pipeline | Platform | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-ORG-1 — CRM and webhooks | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Should | [UF-ORG-17](/en/docs/user-flows/organization#uf-org-17-crm-and-webhooks), [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | T-P6-ORG-2 — Custom branding | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) | Could | [UF-ORG-20](/en/docs/user-flows/organization#uf-org-20-branding-enterprise) | ## TRK — Live tracking [#trk--live-tracking] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-TRK-1 — Live vehicle location | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P6-TRK-2 — Location collection | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection) | Must | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | T-P6-TRK-3 — Passenger vehicle view | [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view) | Must | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations) | | T-P6-TRK-4 — Per-trip child tracking switch | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | Must | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | T-P6-TRK-5 — Tracking data scope | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-TRK-6 — End of tracking | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) | Must | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-TRK-7 — No live position for travelers | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) | Must | [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## PAR — Parent tracker [#par--parent-tracker] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-PAR-1 — Linking a child | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) | Must | [UF-PAR-01](/en/docs/user-flows/parent#uf-par-01-link-a-child) | | T-P6-PAR-2 — Parent view scope | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope) | Must | [UF-PAR-02](/en/docs/user-flows/parent#uf-par-02-child-trip-status) | | T-P6-PAR-3 — Eligibility | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) | Must | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | T-P6-PAR-4 — Child-data restrictions | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) | Must | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | T-P6-PAR-5 — Link ends with the booking | [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | Must | [UF-PAR-06](/en/docs/user-flows/parent#uf-par-06-link-ends) | ## ANL — Analytics [#anl--analytics] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-ANL-1 — Organization analytics | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) | Must | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics) | | T-P6-ANL-2 — Supplier analytics | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) | Should | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-3 — Admin analytics | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) | Must | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-4 — Ranges, freshness and export | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) | Should | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics), [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | T-P6-ANL-5 — Privacy in analytics | [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | Must | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | ## API — Public API [#api--public-api] | Task | Requirement | Priority | Covered by | |---|---|---|---| | T-P6-API-1 — Public API | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) | Could | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | T-P6-API-2 — API key lifecycle | [FR-API-02](/en/docs/srs/requirements/api#fr-api-02--api-key-lifecycle) | Could | — | | T-P6-API-3 — Read resource endpoints | [FR-API-03](/en/docs/srs/requirements/api#fr-api-03--read-resource-endpoints) | Could | — | | T-P6-API-4 — API conventions | [FR-API-04](/en/docs/srs/requirements/api#fr-api-04--api-conventions) | Must | — | | T-P6-API-5 — OpenAPI publication | [FR-API-05](/en/docs/srs/requirements/api#fr-api-05--openapi-publication) | Should | — | | T-P6-API-6 — Rate limiting behavior | [FR-API-06](/en/docs/srs/requirements/api#fr-api-06--rate-limiting-behavior) | Should | — | | T-P6-API-7 — Webhook contract parity | [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity) | Must | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | # Test Strategy (/ar/docs/plan/testing) The specification already contains the test plan; it just needs reading the right way. Every functional requirement carries Given/when/then acceptance criteria, every user flow is an end-to-end script, every workflow is a timer to control, and every NFR row is a service-level target. ## The pyramid [#the-pyramid] | Level | Source in the docs | Shape | |---|---|---| | Unit | FR shall-statements | Domain logic per requirement; the acceptance bullets name the cases | | API / integration | FR acceptance bullets | One test per Given/when/then bullet, against the real endpoint or state machine | | End-to-end | [User flows](/en/docs/user-flows) | One E2E scenario per UF: the steps are the script, the edge cases are the variants | | Workflow / timer | [System workflows](/en/docs/workflows) | Time-travel tests: advance the clock past each timer (hold expiry, dunning days 1-3-5-7, quiet hours) and assert the transition | | Performance | [NFR targets](/en/docs/srs/quality) | Load tests against the stated p50/p95/p99; retention jobs against the retention table | ## Rules of thumb [#rules-of-thumb] - **A requirement is done when its bullets pass.** The [coverage page](/en/docs/workflows/coverage) tells you which flows and workflows exercise each FR — if an FR has no covering flow, its test lives at the API level only. - **Test state machines, not screens.** The [state machines](/en/docs/srs/state-machines) are the contract; UI tests should only verify that the traveler sees the label the spec names ("Seats held, time left mm:ss"). - **Timers are deterministic.** Every timer has a verbatim window on its workflow page; never sleep in tests — advance the scheduler. - **Phase gates.** A phase closes when its [definition of done](/en/docs/plan/milestones) passes as one E2E run with all *Must* tasks' acceptance criteria green. ## Traceability of tests [#traceability-of-tests] Test names cite the IDs they verify (`FR-SEAT-04`, `UF-TRV-03`, `WS timer BRL-08`). Because every ID in this documentation set is linked, a failing test report becomes a clickable path from failure to requirement to business rule. # Data Requirements (/ar/docs/srs/data) ### 6.1 Core entities [#61-core-entities] [ERD](/en/docs/erd) holds the tables, columns, keys, lookup types and RLS paths. This table states each entity's purpose, owner scope and retention. Scope means who owns the rows: tenant (one organization), platform, account (one person) or supplier. | Entity | Purpose | Scope | ERD tables | Retention | |---|---|---|---|---| | Account and roles | Login identity and held roles | Account | users, user_roles, auth_factors, sessions, devices | Until deletion, then section 6.4 | | Market | Country configuration | Platform | markets, market_payment_methods, tax_rates | Life of platform | | Organization | Tenant root and settings | Tenant | organizations | Life of tenant, then financial retention | | Member and permissions | Staff access per organization | Tenant | organization_members, member_permissions, invitations | Kept with audit log | | Application | Organization and supplier applications | Platform | applications, application_documents, application_decisions, appeals | [OPEN: rejected applications and documents] | | Supplier profiles | Driver and photographer details | Platform, or tenant for organization-owned | driver_profiles, photographer_profiles, provider_vehicles, portfolio_items, availability_slots | Life of account | | Lab test | Driver lab-test record | Platform | lab_tests, lab_partners | Per market legal review | | Vehicle type and vehicle | Seat layouts and fleet | Tenant | vehicle_types, vehicle_type_seats, vehicles | Life of tenant | | Trip | One organized trip with stops, audience, vehicles and staff | Tenant | trips, trip_stops, trip_audiences, trip_vehicles, trip_staff_assignments | 5 years after account deletion | | Program | Activities and tiers | Tenant | programs, program_tiers | As trip | | Booking | Reservation, passengers, programs, seats, remedies | Tenant and traveler | bookings, booking_passengers, booking_programs, trip_seats, booking_remedies | 7 years (financial) | | Deal | Negotiation and offers | Tenant and supplier | deals, deal_offers | 7 years (financial) | | Payment and refund | Gateway payments, attempts, refunds | Tenant or account | payments, payment_attempts, refunds | 7 years | | Coupon | Codes, scope, redemptions, flags | Creator scope | coupons, coupon_programs, coupon_audiences, coupon_redemptions, abuse_flags | Redemptions 7 years | | Plan and subscription | Catalog, prices, subscriptions, charges, overrides, counters | Platform and owner | plans, plan_limits, plan_prices, subscriptions, subscription_charges, plan_overrides, usage_counters | Charges 7 years | | Check-in and tracking | Boarding events, positions, incidents, reports | Tenant | checkin_events, tracking_points, incidents, trip_reports | Check-in 1 year; GPS 90 days | | Child link and safety case | Parent links and safety cases | Parent and tenant | child_links, safety_cases | Child trip history 1 year | | Album and photo | Trip media and access | Photographer and trip | albums, photos, album_shared_links, album_members, download_logs | Albums until deleted; download logs 1 year | | Ledger | Double-entry record | Platform and tenant | ledger_accounts, ledger_transactions, ledger_entries | 7 years | | Invoice | B2C, B2B and credit notes for all parties | Issuer | invoices, invoice_lines | 7 years | | Payout and settlement | Weekly runs and per-trip settlements | Supplier, tenant | payout_runs, payouts, payout_methods, settlements, settlement_lines | 7 years | | Reconciliation | Gateway differences | Platform | reconciliation_exceptions | 7 years | | Dispute | Disputes and files | Platform | disputes, dispute_files | 7 years | | Notification | Preferences, messages, deliveries, templates | Account and platform | notification_preferences, notifications, notification_deliveries, notification_templates | Delivery logs [OPEN] | | Analytics | Events and daily rollups | Tenant and platform | analytics_events, analytics_daily | Events 13 months (proposed); rollups life of tenant | | Consent and privacy | Consents and data requests | Account | consents, privacy_requests | Life of account plus 7 years (proposed) | | Audit | Admin actions and permission changes | Platform | audit_logs | 7 years | ### 6.2 Data isolation [#62-data-isolation] | ID | Requirement | Priority | |---|---|---| | [DAT-01](/en/docs/srs/data#62-data-isolation) | Every tenant row carries `organization_id`. Reads and writes are limited to the tenant at the database (RLS), repository and API layers. | Must | | [DAT-02](/en/docs/srs/data#62-data-isolation) | No user-facing query joins across tenants. Platform-wide reads run under the admin or platform repository and are logged. | Must | | [DAT-03](/en/docs/srs/data#62-data-isolation) | When deletion becomes permanent, personal fields are removed or replaced with "Deleted user", except records kept under section 6.4. Trip records stay 5 years. Future bookings are cancelled and refunded; remaining earnings are paid on the next payout date. | Must | | [DAT-04](/en/docs/srs/data#62-data-isolation) | Identity documents and lab results are in a restricted bucket visible only to admins; every open is audited. | Must | | [DAT-05](/en/docs/srs/data#62-data-isolation) | Phone numbers, ID and license numbers, and payout details are encrypted at column level. | Must | | [DAT-06](/en/docs/srs/data#62-data-isolation) | Money is stored as minor units plus currency code; rounding follows [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display). | Must | | [DAT-10](/en/docs/srs/data#62-data-isolation) | Every API and file path uses the public UUID; internal numeric IDs never leave the backend. | Must | ### 6.3 Soft delete, immutability and deletion [#63-soft-delete-immutability-and-deletion] | ID | Requirement | Priority | |---|---|---| | [DAT-07](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | Suspended accounts, cancelled bookings and withdrawn applications are soft-deleted or kept, hidden from user views and visible to admins. | Must | | [DAT-08](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | Ledger, audit, deal offer, check-in, tracking, consent and outbox rows are insert-only. Corrections are reversing rows. | Must | | [DAT-09](/en/docs/srs/data#63-soft-delete-immutability-and-deletion) | A deleted account keeps its trip and financial records for the periods in 6.4, with personal fields removed where the law allows. | Must | ### 6.4 Retention [#64-retention] | Data | Retention | Basis | |---|---|---| | Account during deletion grace | 30 days; sign-in restores | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Account personal data after deletion | Removed, except records below | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Trip records | 5 years after account deletion | [BRL-15](/en/docs/brd/requirements#7-business-rules) | | Bookings, payments, invoices, ledger, payouts, deals | 7 years | [OD-04](/en/docs/brd/compliance#11-open-decisions) (pending legal review) | | Audit log | 7 years, object-locked | D-04, BRD 8.5 | | Check-in and check-out events | 1 year | D-45 | | Raw GPS points | 90 days, then an hourly summary is kept | Architecture 18.4 | | Child trip history | 1 year | D-135 | | Album download logs | 1 year | D-271 | | Verification codes | 5 minutes | [BRL-20](/en/docs/brd/requirements#7-business-rules) | | Idempotency keys | 24 hours | [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | | Identity documents and lab results | [OPEN: per market legal review] | BRD 8.2 | | Notification delivery logs | [OPEN] | Not set | | Application logs | 7 years in archive storage | Architecture 22.1 | | Database backups | Daily snapshots 35 days; point-in-time 7 days; cross-region copies 30 days | Architecture 22.1 | # Software Requirements (/ar/docs/srs) ## 1. Document control [#1-document-control] **Product** Trips Enjoy (trips-enjoy.com) **Document type** Software Requirements Specification **Version** 1.1 **Date** 9 November 2026 **Status** For review. Items marked [OPEN] need a decision before the affected behavior ships. Items marked (placeholder) carry a working value that the named owner must confirm. **Owner** Product and Engineering (Trips Enjoy) **Approvers** [OPEN: named approvers, D-314] **Companion documents** [BRD](/en/docs/brd) v1.1 (source of every BR, BRL, OD and RSK ID), [ERD](/en/docs/erd) v1.0 (data model), user-flows/ 00 to 08 (per-app flows), Tasks.md (delivery backlog), trips-enjoy-technical-architecture.md (architecture, 18 Apr 2026). **Source status for this version** Read in full: BRD v1.1, technical architecture (18 Apr 2026), system workflows (18 Apr 2026), auth and account rules (4 Oct 2026), design value audit and screen coverage audit (17 Oct 2026, which quote the decision register D-numbers). Where the October documents and the April documents conflict, the October documents win. ### 1.1 Changes from v1.0 [#11-changes-from-v10] | Area | Change | |---|---| | Sources | Architecture, workflows and auth rules now reviewed. Conflict C-06 (architecture not reviewed) and C-07 (user-flows 03 to 08 missing) are closed. | | Open items closed | About 40 [OPEN] items are now set from the decision register: verification by role, appeal window, deal expiry, refund table (placeholder), retry after hold expiry, payment attempts, active-trip definition, coupon counting, webhook policy, invoice rules, settlement rules, payout schedule, dispute SLAs, incident categories, retention periods, capacity stages, backups, observability tools, paging, deprecation notice, maintenance window, digits. | | Changed behavior | Organization-cancelled trips now refund in full (D-150, was "same policy as traveler refund"). Filling Up now starts at 80 percent of seats reserved (D-189, was "first booking"). Check-in events are kept 1 year, not 7 (D-45). Account lockout now applies to all roles (D-53). | | New modules | MKT (markets), ANL (analytics), API (public API, Could). | | New requirements | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) to [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) to [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) to [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display), [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) to [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics), [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api). | | New state machines | 7.9 Settlement, 7.10 Dispute. | | Data | Section 6 now points to [ERD](/en/docs/erd) for tables and columns; entity list extended with Market, Settlement, Dispute and Analytics. | ## 2. Introduction [#2-introduction] ### 2.1 Purpose [#21-purpose] This SRS states what the Trips Enjoy software shall do and the qualities it shall have. It is the basis for design, build, test and acceptance. Every functional requirement traces to a business requirement (BR), business rule (BRL) or open decision (OD) in the BRD. Section 10 holds the traceability matrix. The BRD states what the business needs. This SRS states how the software must behave to meet those needs. It does not restate business policy except where the software must enforce it. ### 2.2 Scope [#22-scope] Trips Enjoy is a bilingual (Arabic and English) multi-tenant SaaS marketplace for organized group trips. This SRS covers the software for: - Accounts, identity, sign-in and role-specific registration. - Applications and approvals for organizations, platform drivers and platform photographers. - Organization workspaces: trips, programs, fleet, staff, employees and permissions, coupons, subscriptions, accounting, invoices, analytics, CRM and webhooks. - Traveler booking, seat selection, checkout, payment, refunds, receipts and invoices. - Deal negotiation between organizations and platform suppliers. - Vehicle moderator check-in and check-out, live tracking, and the parent tracker. - Photo albums with three privacy modes. - Driver lab-test workflow. - Notifications, the platform admin console, the ledger, payouts and settlements. - Market configuration by country. This SRS does not cover business policy beyond what the software enforces (BRD), per-market legal reviews, marketing site content, visual design, or the detailed API specification (OpenAPI, generated from code). ### 2.3 Definitions and acronyms [#23-definitions-and-acronyms] | Term | Meaning | |---|---| | Admin console | The platform staff web application at admin.trips-enjoy.com. | | Applicant | A user who has submitted an application to become an organization, platform driver or platform photographer. | | BR, BRL, OD, RSK | Business requirement, business rule, open decision and risk IDs in the BRD. | | Child link | A record that connects a parent or guardian to a child traveler on one booking. | | D-nn | A decision in the decision register, as quoted in the design value audit (17 Oct 2026). | | Deal | A negotiated agreement between an organization and a platform driver or photographer for one vehicle or trip. | | Dunning | Payment retries and reminders after a failed subscription payment. | | Feature gate | A server-side check that blocks an action when the account's plan does not allow it. | | FR | Functional requirement. | | Grace period | The 7 days after a failed renewal during which features stay active. | | Hold | A temporary reservation of a seat during checkout: 15 minutes, or the voucher window for Fawry cash. | | Ledger | The double-entry record of every financial event. | | Market | The country configuration that sets currency, payment methods, tax rules and default time zone. | | Moderator | A person supervising one vehicle on one trip. Sees only that vehicle. | | MoSCoW | Priority scale: Must, Should, Could. Maps to BRD M, S and C. | | NFR | Non-functional requirement. | | Organization | A travel company, school, employer or event organizer that runs trips. Each organization is a tenant. | | Organization-owned driver or photographer | A driver or photographer belonging to one organization and visible only to it. | | Parent tracker | The section of the traveler app where parents see their linked children's trip status. | | Platform driver or photographer | An independent, admin-approved supplier who serves any organization through a deal. | | Plan | A subscription tier with limits and features, for one role, priced per market. | | Settlement | The per-trip record of amounts owed between the platform, the organization and its suppliers, tracked until every line is paid. | | Tenant | One organization's isolated workspace. | | Traveler | A person who books and attends trips. | | Trip | The single record for one organized trip, which may run many vehicles. | | Vehicle type | A reusable seat layout. | | ZATCA | Saudi Arabia's e-invoicing authority and rules. | | Acronyms | API: application programming interface. CDN: content delivery network. FCM and APNS: Firebase Cloud Messaging and Apple Push Notification service. GDPR: EU General Data Protection Regulation. GPS: global positioning system. HMAC: hash-based message authentication code. JWT: JSON Web Token. MRR: monthly recurring revenue. OTP: one-time password. PDPL: personal data protection law. PWA: progressive web app. RLS: row-level security. RPO and RTO: recovery point and recovery time objectives. SSE: server-sent events. TLS: transport layer security. WCAG: Web Content Accessibility Guidelines. | ### 2.4 References [#24-references] | Document | Version or date | Use in this SRS | |---|---|---| | [BRD](/en/docs/brd) | v1.1, 9 Nov 2026 | Primary source of BR, BRL, OD and RSK IDs, plans, markets and flows. | | [ERD](/en/docs/erd) | v1.0, 9 Nov 2026 | Tables, columns, lookup types and RLS paths for every entity in section 6. | | user-flows/ | 9 Nov 2026 | Per-app flows (UF IDs), screens and edge cases. | | Technical architecture | 18 Apr 2026 | Stack, tenancy model, real-time design, payments, media, jobs, observability, security, capacity, backups. | | System workflows | 18 Apr 2026 | State machines and sequences, where the October documents are silent. | | Auth and account rules | 4 Oct 2026 | Verification, sessions, sign-in, applications, lab tests and deletion. | | Design value audit | 17 Oct 2026 | Decision register values (D-numbers) and canvas conflicts. | ### 2.5 Document conventions [#25-document-conventions] - Requirement IDs use FR-module-NN and NFR-group-NN. IDs are stable. A retired ID is not reused. - Each functional requirement has a title, a "shall" statement, a priority, its sources, and one to three acceptance criteria written as Given, when, then. - Priorities use MoSCoW. Must means required for the BRD phase in which the module appears. Should means required in that phase if effort allows. Could means deferrable. - [OPEN] marks a value no source sets. (placeholder) marks a working value that its owner must confirm. Neither blocks the requirements around it, but the affected behavior does not ship until it is set. - Money is an amount in minor units with a currency code. Every amount shown carries its currency code. - Terms follow the BRD glossary. ## 3. Overall description [#3-overall-description] ### 3.1 Product perspective [#31-product-perspective] Trips Enjoy is one product with one codebase (a modular monolith) and shared-schema multi-tenant data with row-level security (architecture sections 1 and 4). | Part | Form | Primary users | |---|---|---| | Traveler app, including the parent tracker section | Responsive web and mobile apps (iOS, Android) | Travelers, parents and guardians | | Organization dashboard | Responsive web app at business.trips-enjoy.com | Organization owners and employees | | Admin console | Web app at admin.trips-enjoy.com, staff only | Platform admins | | Driver app | Mobile app; web limited to documents and profile (D-86) | Platform drivers and organization-owned drivers | | Photographer studio | Responsive web in phase 1, mobile app available (D-86) | Platform and organization-owned photographers | | Moderator app | Installable web app on phones, scoped to one vehicle | Vehicle moderators | | Backend services | REST API, WebSocket channel with SSE fallback, scheduled jobs, queues, notification service, payments and ledger, media pipeline, search | All surfaces and external systems | | External systems | Payment gateways, messaging, email, push, maps, lab partners, CRM and webhook targets, business registry (manual in phase 1) | See section 4.3 | ### 3.2 Product functions by module [#32-product-functions-by-module] | Code | Module | Summary | |---|---|---| | AUTH | Accounts, identity and access | Role-specific registration, verification, sign-in, sessions, multi-role accounts, organization switching, suspension and deletion. | | ONB | Applications and approvals | Submission, the single admin queue, changes requested, rejection, appeal and re-application, supplier document rules. | | ORG | Organization tenancy and settings | Tenant setup, isolation, organization-owned suppliers, fleet, seat settings, CRM and webhooks, invoices, branding. | | EMP | Employees and permissions | Invitations, permission sets, limits, scope enforcement. | | TRIP | Trips | Wizard, publishing, multi-vehicle trips, lifecycle, changes that affect bookings. | | PRG | Programs | Pricing models, program types, live summary, enrollment reports. | | FLT | Fleet and vehicle types | Seat layouts and vehicles. | | STF | Staffing | Driver and photographer tracks, Ready gate, moderator assignment. | | NEG | Deal negotiation | Proposals, counters, expiry, mutual acceptance, finalization. | | SEAT | Seats | Company-assigned and self-selected seats, live seat map, holds. | | BKG | Booking and checkout | Cart, passengers, programs, seats, coupon, checkout, cancellation, receipts. | | PAY | Payments and refunds | Gateway handoff, outcomes, pending and voucher states, retries, refunds, reconciliation. | | CPN | Coupons | Scope, validation, redemption, reversal, analytics, abuse flags. | | SUB | Plans and subscriptions | Catalog, feature gates, dunning, grace, upgrades and downgrades, overrides, counters. | | CHK | Check-in and check-out | Moderator events, vehicle match, offline queue, incidents, occupancy. | | MOD | Moderator app | Scoped access, sign-in, end-of-trip report. | | TRK | Live tracking | Vehicle positions and passenger movement for operations. | | PAR | Parent tracker | Child linking, view scope, eligibility, notifications, safety reports. | | MED | Media and albums | Albums, privacy modes, watermarking, downloads. | | PHO | Photographer studio | Portfolio, rates, availability, earnings, plan rules. | | DRV | Driver app and lab tests | Work area, deals, lab-test gate, deadlines, suspension, earnings. | | ADM | Admin console | Accounts, admin staff, configuration, disputes, lab tests, audit log. | | ACC | Accounting and settlements | Ledger, accounting views, payouts, settlements, invoices across parties, reconciliation, exports. | | NTF | Notifications | Channels, language, quiet hours, templates, delivery, reminders. | | TRV | Traveler profile and history | Profile, visibility, history, discounts, plan changes, privacy requests. | | MKT | Markets | Country configuration: currency, methods, tax, time zone, prices. | | ANL | Analytics | Organization, supplier and admin analytics. | | API | Public API | Documented API for organizations and partners (Could). | ### 3.3 User classes and characteristics [#33-user-classes-and-characteristics] | User class | Characteristics | Plan requirement | Main surface | |---|---|---|---| | Visitor | Browses public trips and registration pages. Not signed in. | None | Traveler app | | Traveler | Books trips. Mobile-first. Any age, so child-data rules apply. | None (Free, Explorer, VIP) | Traveler app | | Parent or guardian | A traveler on Explorer or VIP with linked children. | Explorer or VIP, plus organization eligibility ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)) | Parent tracker | | Platform admin | Staff. Roles: Super admin, Operations, Finance (D-49). | Staff | Admin console | | Organization owner | Registers, pays and runs the tenant. | Starter, Growth or Enterprise | Organization dashboard | | Organization employee | Works within granted permissions. May belong to several organizations. | Organization plan | Organization dashboard | | Platform driver | Independent, admin-approved. Works through deals. | Basic, Professional or Premium | Driver app | | Organization-owned driver | Drives for one organization only. | Organization plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | Driver app | | Platform photographer | Independent, admin-approved. Works through deals. | Basic, Studio or Pro | Photographer studio | | Organization-owned photographer | Works for one organization only. | Organization plan ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed) | Photographer studio | | Vehicle moderator | One vehicle on one trip. Often non-technical, on a bus, with a phone. | [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)] | Moderator app | ### 3.4 Operating environment [#34-operating-environment] | Item | Requirement | |---|---| | Web browsers | Current and previous major versions of Chrome, Safari, Edge and Firefox on desktop and mobile [OPEN: confirm list]. | | Mobile operating systems | iOS and Android [OPEN: minimum versions]. Apps prompt for update when below the supported version. | | Moderator app | Installable web app on Android and iOS, working on mobile data, with an offline queue ([FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue)). | | Languages | Arabic (right to left) and English from the first release. Western digits 0 to 9 in both (D-159). | | Time zones | Each trip has a time zone. An organization's time zone defaults to its market's main zone: Cairo, Riyadh or Dubai (D-282). Times show in the trip's time zone, plus the viewer's zone where they differ. | | Hosting region | Recommended: AWS me-central-1 (UAE) primary with cross-region backups (architecture 20.2) [OPEN: confirm against Egyptian data residency, [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat)]. | ### 3.5 Design and implementation constraints [#35-design-and-implementation-constraints] | ID | Constraint | |---|---| | CON-01 | Tenant isolation is mandatory. One organization's data is never visible to another ([BRL-01](/en/docs/brd/requirements#7-business-rules)). | | CON-02 | Card data never reaches Trips Enjoy servers. Payment runs on the gateway's hosted pages or SDKs ([BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg)). | | CON-03 | Arabic and English from the first release, with right-to-left layouts. | | CON-04 | Markets: Egypt pilot in phase 2; Saudi Arabia and the UAE in phase 5 (D-69). | | CON-05 | Recommended stack (architecture section 3, to confirm in T-FND-01): TypeScript end to end; NestJS modular monolith; PostgreSQL 16 with RLS and TimescaleDB; Redis 7; SQS and SNS; Next.js web; React Native mobile; S3 or R2 with CDN; AWS with ECS Fargate; Terraform; GitHub Actions. | | CON-06 | Plan limits and feature gates are enforced on the server ([BRL-02](/en/docs/brd/requirements#7-business-rules)). | | CON-07 | Every financial event is written to a double-entry ledger ([BRL-18](/en/docs/brd/requirements#7-business-rules)). | | CON-08 | Child data is never used for advertising, marketing or model training. | | CON-09 | Delivery follows the six phases in BRD 3.3. | | CON-10 | Providers follow BRD 9.2. Gateway choice per market follows [OD-11](/en/docs/brd/compliance#11-open-decisions). | | CON-11 | Database conventions follow [ERD](/en/docs/erd) section 1: BIGSERIAL keys with a public UUID, TIMESTAMPTZ, soft delete with audit columns, and lookup tables instead of enum types. | ### 3.6 Assumptions and dependencies [#36-assumptions-and-dependencies] Assumptions in BRD 9.1 and dependencies in BRD 9.2 apply. Additional assumptions: | ID | Assumption | Impact if wrong | |---|---|---| | ASM-01 | One account can hold traveler and supplier roles at once. | Account model changes. | | ASM-02 | Lab partner results reach the platform directly. Driver upload is the fallback. | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) changes. | | ASM-03 | Live location is collected only while a trip is In Progress. | Tracking and privacy design change. | | ASM-04 | Only the owner, or an employee with the subscription permission, changes plans and billing. | Permission design changes. | | ASM-05 | A trip is sold in its organization's market currency only. | Multi-currency pricing would be needed. | ## 4. External interface requirements [#4-external-interface-requirements] ### 4.1 User interfaces [#41-user-interfaces] | Surface | Users | Access rules | |---|---|---| | Traveler app | Travelers, parents | Public browsing. Booking and account actions after sign-in. | | Organization dashboard | Owners, employees | Password plus SMS or authenticator code at every sign-in. Tenant-scoped. Organization switcher. | | Admin console | Admins | Password plus mandatory authenticator. Separate route. | | Driver app | Drivers | Sign-in. Restricted to four actions while a lab test is pending ([FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause)). | | Photographer studio | Photographers | Sign-in. Plan-gated features. | | Moderator app | Moderators | Staff code. One vehicle. | | Parent tracker | Parents | Section of the traveler app (D-124). Linked children only. | | ID | Interface requirement | Priority | |---|---|---| | UI-01 | Every surface supports Arabic and English, with the language switch available on every screen without losing the current task. | Must | | UI-02 | Arabic layouts mirror fully: navigation, forms, tables, charts and icons that imply direction. | Must | | UI-03 | Every surface meets WCAG 2.1 Level AA (proposed). | Must | | UI-04 | Every surface reflows to a 360 px phone width without horizontal page scrolling, with a 16 px side gutter. | Must | | UI-05 | Forms show errors next to the field in the user's language and keep entered data after an error. | Must | | UI-06 | Every amount is labeled with its currency code and follows the market's rounding rule. | Must | | UI-07 | Admin console and organization dashboard use separate routes from the traveler app. | Must | | UI-08 | Destructive and money-moving actions use a confirmation step that names the effect. | Must | | UI-09 | No screen shows a card number field. Payment opens the gateway page or SDK. | Must | ### 4.2 Hardware interfaces [#42-hardware-interfaces] No special hardware. Phones are used for GPS (check-in location, live tracking), camera (document capture, ticket scan, photo upload) and push. Where a permission is denied, the user is told what is missing and what still works. If location is denied at check-in, the event is still recorded without location and flagged (proposed). ### 4.3 Software interfaces [#43-software-interfaces] | Interface | Purpose | Notes | |---|---|---| | Stripe (cards, Apple Pay, Google Pay, Billing, Connect Express) | Bookings, plans, refunds, payouts | Hosted pages or Elements; webhooks. | | Paymob or Tap | Local cards in MENA | Per market ([OD-11](/en/docs/brd/compliance#11-open-decisions)). | | Fawry | Cash vouchers in Egypt | Voucher valid 48 hours (D-31). | | SMS and WhatsApp (Twilio or local provider) | OTP, staff codes, notifications | Delivery status recorded; switch channel after 3 failed deliveries. | | Transactional email (AWS SES, Postmark fallback) | Notifications, receipts, invoices | Bounce and complaint handling. | | Push (FCM, APNS) | Mobile notifications | Token per signed-in device. | | Maps and routing (Mapbox) | Routes, stops, live map | Tiles and routing only; location data stays on platform storage. | | Object storage and CDN (S3 or R2, CloudFront or Cloudflare) | Media and documents | Identity documents in a restricted bucket. Direct upload by presigned URL. | | Lab partner network | Driver lab tests | Results sent from the lab to the platform. | | Business registry and tax checks | Organization onboarding | Manual in phase 1 ([OD-16](/en/docs/brd/compliance#11-open-decisions)). | | CRM and outbound webhooks | Events to organization systems | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). | | Search (Postgres full-text first; OpenSearch or Meilisearch later) | Trip and supplier discovery | Event-driven indexing; 5 to 30 seconds lag accepted. | ### 4.4 Communications interfaces [#44-communications-interfaces] | ID | Requirement | Priority | |---|---|---| | COM-01 | All client-server traffic uses HTTPS with TLS 1.3 and HSTS. Mobile apps pin certificates. | Must | | COM-02 | The real-time channel uses WebSocket with SSE fallback, for the seat map, live tracking, deal updates and operations dashboards. | Must | | COM-03 | Every real-time subscription is authenticated and authorized for the trip, vehicle, deal or account it names before data is sent. | Must | | COM-04 | Outbound webhooks use HTTPS, are signed with HMAC-SHA256 over the body and a timestamp, and carry an event identifier. Receivers reject timestamps older than 5 minutes (D-62). | Must | | COM-05 | Inbound gateway and messaging callbacks are verified against the provider's signature before any state change. | Must | ## Module index [#module-index] Section 5 is split into one page per module: Each module lists its requirements. Source IDs refer to the BRD. Acceptance criteria are Given, when, then sentences. # Quality & Interface Requirements (/ar/docs/srs/quality) ## 8. Non-functional requirements [#8-non-functional-requirements] ### 8.1 Performance (NFR-PERF) [#81-performance-nfr-perf] | ID | Requirement | Target | |---|---|---| | [NFR-PERF-01](/en/docs/srs/quality#81-performance-nfr-perf) | API latency per endpoint, server side | p50 under 150 ms; p95 under 500 ms; p99 under 1,500 ms | | [NFR-PERF-02](/en/docs/srs/quality#81-performance-nfr-perf) | Booking flow from trip page to confirmed booking, excluding time on the gateway page | Under 5 seconds | | [NFR-PERF-03](/en/docs/srs/quality#81-performance-nfr-perf) | Trip search | Under 300 ms | | [NFR-PERF-04](/en/docs/srs/quality#81-performance-nfr-perf) | Seat map load | Under 200 ms | | [NFR-PERF-05](/en/docs/srs/quality#81-performance-nfr-perf) | GPS point ingestion | Under 50 ms per point | | [NFR-PERF-06](/en/docs/srs/quality#81-performance-nfr-perf) | Real-time delivery (seat map, tracking, deals, operations) | Under 500 ms from event to client | | [NFR-PERF-07](/en/docs/srs/quality#81-performance-nfr-perf) | Thumbnail from CDN | Under 100 ms | | [NFR-PERF-08](/en/docs/srs/quality#81-performance-nfr-perf) | Dashboard first meaningful paint | Under 2 seconds | | [NFR-PERF-09](/en/docs/srs/quality#81-performance-nfr-perf) | Check-in event reaches the server after boarding | Within 60 seconds, including reconnect after short loss (BRD OBJ-02) | ### 8.2 Security (NFR-SEC) [#82-security-nfr-sec] | ID | Requirement | |---|---| | [NFR-SEC-01](/en/docs/srs/quality#82-security-nfr-sec) | TLS 1.3 and HSTS on all traffic; certificate pinning on mobile. | | [NFR-SEC-02](/en/docs/srs/quality#82-security-nfr-sec) | Passwords hashed with Argon2id; minimum 12 characters; checked against breached-password lists (D-51). | | [NFR-SEC-03](/en/docs/srs/quality#82-security-nfr-sec) | Lockout after 5 failed sign-ins for 15 minutes, all roles. | | [NFR-SEC-04](/en/docs/srs/quality#82-security-nfr-sec) | Second factors per role ([FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods)); OTP rules per [BRL-20](/en/docs/brd/requirements#7-business-rules). | | [NFR-SEC-05](/en/docs/srs/quality#82-security-nfr-sec) | Access tokens are RS256 JWTs carrying user, active role, organization and token version, validated on every request; 15-minute life; refresh tokens rotate. | | [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | Mutating endpoints accept an idempotency key kept 24 hours. | | [NFR-SEC-07](/en/docs/srs/quality#82-security-nfr-sec) | Tenant isolation at database (RLS), repository and API layers; cross-tenant test suite passes before each phase. | | [NFR-SEC-08](/en/docs/srs/quality#82-security-nfr-sec) | Encryption at rest everywhere; column-level encryption for listed identifiers. | | [NFR-SEC-09](/en/docs/srs/quality#82-security-nfr-sec) | Secrets in a managed store, rotated every 90 days, never in code or logs. | | [NFR-SEC-10](/en/docs/srs/quality#82-security-nfr-sec) | Least privilege for services, jobs and staff roles. | | [NFR-SEC-11](/en/docs/srs/quality#82-security-nfr-sec) | Restricted storage for identity documents and lab results. | | [NFR-SEC-12](/en/docs/srs/quality#82-security-nfr-sec) | No card data is received, logged or stored. | | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Rate limits: unauthenticated 60 requests per minute; traveler 600; organization staff 1,200; admin 3,000; moderator check-in 120 per vehicle per minute. Drivers, photographers and parents [OPEN]. | | [NFR-SEC-14](/en/docs/srs/quality#82-security-nfr-sec) | Security review and SAST, dependency scan and monthly DAST before each phase; annual external penetration test. | | [NFR-SEC-15](/en/docs/srs/quality#82-security-nfr-sec) | CAPTCHA on registration forms; booking throttle of 5 per traveler per hour unless verified (architecture 17.4). | ### 8.3 Availability (NFR-AVL) [#83-availability-nfr-avl] | ID | Requirement | Target | |---|---|---| | [NFR-AVL-01](/en/docs/srs/quality#83-availability-nfr-avl) | Monthly uptime of traveler app, organization dashboard and booking services | 99.9 percent (proposed) | | [NFR-AVL-02](/en/docs/srs/quality#83-availability-nfr-avl) | Planned maintenance | 01:00 to 03:00 Cairo time, at most 4 hours per month, 72 hours' notice in app and on the status page (D-303) | | [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | Gateway outage loses no confirmed payment | Callbacks queued and replayed; pending state per [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) | ### 8.4 Scalability (NFR-SCL) [#84-scalability-nfr-scl] | ID | Requirement | Target | |---|---|---| | [NFR-SCL-01](/en/docs/srs/quality#84-scalability-nfr-scl) | Capacity stages | Stage 1 (pilot): 5,000 traveler accounts, 500 trips, 200 concurrent checkouts (D-304). Launch: 10,000 active users, 500 bookings per day. Growth: 100,000 users, 5,000 bookings per day. Scale: 1 million users, 50,000 bookings per day (architecture 19.3). | | [NFR-SCL-02](/en/docs/srs/quality#84-scalability-nfr-scl) | Phase 3 pilot | Three-bus trip, about 120 passengers, end to end | | [NFR-SCL-03](/en/docs/srs/quality#84-scalability-nfr-scl) | Stateless services | Scale by adding instances | | [NFR-SCL-04](/en/docs/srs/quality#84-scalability-nfr-scl) | Load tests before each major release | 1,000 concurrent browsers, 500 concurrent bookings, 100 concurrent payments, 10,000 GPS events per second (architecture 19.4) | ### 8.5 Data (NFR-DAT) [#85-data-nfr-dat] | ID | Requirement | |---|---| | [NFR-[DAT-01](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Tenant isolation per [DAT-01](/en/docs/srs/data#62-data-isolation). | | [NFR-[DAT-02](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Retention per 6.4, enforced by scheduled purge jobs that log each run. | | [NFR-[DAT-03](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Data copy and deletion requests tracked to completion. | | [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Hosting region and residency per market [OPEN: confirm AWS me-central-1 against Egyptian residency rules]. | | [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Consent records keep type, time and text version for lab tests, background checks, guardianship, child tracking and marketing. | ### 8.6 Observability (NFR-OBS) [#86-observability-nfr-obs] | ID | Requirement | |---|---| | [NFR-OBS-01](/en/docs/srs/quality#86-observability-nfr-obs) | Structured logs carry request, trace, tenant and user IDs; never passwords, codes or card data. | | [NFR-OBS-02](/en/docs/srs/quality#86-observability-nfr-obs) | Per-endpoint rate, errors and latency percentiles. | | [NFR-OBS-03](/en/docs/srs/quality#86-observability-nfr-obs) | OpenTelemetry traces across API, jobs, real-time channel and gateway callbacks. | | [NFR-OBS-04](/en/docs/srs/quality#86-observability-nfr-obs) | Critical alerts page on-call through PagerDuty; warnings go to Slack; low priority goes to an email digest. | | [NFR-OBS-05](/en/docs/srs/quality#86-observability-nfr-obs) | Dashboards: platform health, booking funnel, payments, subscriptions, tracking, database, notification delivery by channel. | | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Application logs kept 7 years in archive storage; hot search window [OPEN]. | | [NFR-OBS-07](/en/docs/srs/quality#86-observability-nfr-obs) | Error tracking with Sentry on backend and mobile. | ### 8.7 Internationalization (NFR-I18N) [#87-internationalization-nfr-i18n] | ID | Requirement | |---|---| | NFR-I18N-01 | Every screen and message in Arabic and English from the first release. | | NFR-I18N-02 | Full right-to-left mirroring for Arabic. | | NFR-I18N-03 | Launch currencies EGP (P2), SAR and AED (P5); every amount labeled. | | NFR-I18N-04 | Western digits 0 to 9 in both languages (D-159); dates follow the language. | | NFR-I18N-05 | A missing translation fails the build. | ### 8.8 Accessibility (NFR-A11Y) [#88-accessibility-nfr-a11y] | ID | Requirement | |---|---| | NFR-A11Y-01 | WCAG 2.1 AA on all surfaces (proposed). | | NFR-A11Y-02 | Every web action is keyboard-operable. | | NFR-A11Y-03 | The seat map has a list alternative readable by screen readers. | | NFR-A11Y-04 | AA contrast in light and dark themes, including brand orange text (primary text #C93A00 light, #FF8655 dark). | ### 8.9 Maintainability (NFR-MNT) [#89-maintainability-nfr-mnt] | ID | Requirement | |---|---| | [NFR-MNT-01](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Versioned migrations with expand-contract for breaking changes; rollback documented. | | [NFR-MNT-02](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Every acceptance criterion maps to a test. | | [NFR-MNT-03](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Features ship behind flags per phase. | | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Automated test coverage target [OPEN]. | | [NFR-MNT-05](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Major decisions recorded as ADRs (architecture appendix B). | ### 8.10 Compliance (NFR-COM) [#810-compliance-nfr-com] | ID | Requirement | |---|---| | [NFR-COM-01](/en/docs/srs/quality#810-compliance-nfr-com) | Data access and deletion requests answered within 30 days. | | [NFR-COM-02](/en/docs/srs/quality#810-compliance-nfr-com) | Consent per [NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat). | | [NFR-COM-03](/en/docs/srs/quality#810-compliance-nfr-com) | Retention per 6.4. | | [NFR-COM-04](/en/docs/srs/quality#810-compliance-nfr-com) | No child data in marketing, advertising, analytics events or model training. | | [NFR-COM-05](/en/docs/srs/quality#810-compliance-nfr-com) | Lab tests and background checks used in a market only after legal review there. | | [NFR-COM-06](/en/docs/srs/quality#810-compliance-nfr-com) | Regimes: Egypt PDPL, Saudi PDPL, UAE data protection law, GDPR where applicable. | | [NFR-COM-07](/en/docs/srs/quality#810-compliance-nfr-com) | ZATCA scope decided before the Saudi launch ([OD-10](/en/docs/brd/compliance#11-open-decisions)). | | [NFR-COM-08](/en/docs/srs/quality#810-compliance-nfr-com) | PCI DSS SAQ A scope through gateway-hosted payment. | | [NFR-COM-09](/en/docs/srs/quality#810-compliance-nfr-com) | Data processing agreements with every processor (cloud, gateways, messaging, email, monitoring). | ### 8.11 Backup and recovery (NFR-BKP) [#811-backup-and-recovery-nfr-bkp] | ID | Requirement | Target | |---|---|---| | [NFR-BKP-01](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Recovery time objective | 4 hours | | [NFR-BKP-02](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Recovery point objective | 15 minutes | | [NFR-BKP-03](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Backups | Daily database snapshots kept 35 days; point-in-time recovery 7 days; daily cross-region copies kept 30 days; media versioning 90 days with cross-region replication; Redis daily snapshot 7 days | | [NFR-BKP-04](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Restore tests | Daily automated restore to staging; quarterly disaster-recovery drill with measured RTO recorded | ## 9. Interface and API requirements [#9-interface-and-api-requirements] ### 9.1 Resource groups [#91-resource-groups] | Resource group | Covers | Main actors | Modules | |---|---|---|---| | Auth and accounts | Registration, verification, sessions, roles, privacy | All | AUTH, TRV | | Applications | Submissions, decisions, appeals | Applicants, admins | ONB | | Organizations | Settings, members, permissions, integrations, branding | Staff, admins | ORG, EMP | | Fleet | Vehicle types, vehicles | Staff | FLT | | Trips | Trips, stops, vehicles, staffing, programs, publishing | Staff; travelers read | TRIP, PRG, STF | | Deals | Negotiation and offers | Staff, suppliers, admins | NEG | | Bookings | Cart, holds, checkout, cancellation, remedies, receipts | Travelers; staff and admins read | BKG, SEAT | | Payments | Payment status, refunds, gateway callbacks | Travelers, admins | PAY | | Coupons | Coupons, validation, redemptions | Creators, travelers, admins | CPN | | Plans | Catalog, subscriptions, overrides | Owners, admins | SUB | | Operations | Manifests, check-in events, incidents, reports | Moderators, staff | CHK, MOD | | Tracking | Positions, passenger movement, parent view | Staff, parents | TRK, PAR | | Media | Albums, photos, links | Photographers, travelers | MED, PHO | | Finance | Ledger views, invoices, payouts, settlements, reconciliation, exports | Staff, suppliers, admins | ACC | | Markets | Market configuration | Admins | MKT | | Analytics | Reports and exports | Staff, suppliers, admins | ANL | ### 9.2 Conventions [#92-conventions] | ID | Convention | Priority | |---|---|---| | IF-01 | URL-versioned REST (/api/v1). Breaking changes only in a new major version. OpenAPI 3.1 generated from code. | Must | | IF-02 | JSON in UTF-8; ISO 8601 times with offset; money as `{amount_minor, currency}`; resources identified by UUID. | Must | | IF-03 | One envelope: `data` and `meta` on success; `error` (code, message in caller's language, details) and `meta` on failure; `meta.request_id` always. | Must | | IF-04 | Error categories: VALIDATION_FAILED 400, UNAUTHENTICATED 401, PLAN_REQUIRED 402, FORBIDDEN 403, NOT_FOUND 404 (also for other tenants' data), CONFLICT 409, BUSINESS_RULE_VIOLATED 422, RATE_LIMITED 429, INTERNAL_ERROR 500, SERVICE_UNAVAILABLE 503. | Must | | IF-05 | Cursor paging; default 20, maximum 100 per page (D-308). | Must | | IF-06 | Idempotency-Key on every mutating request; same key and body returns the original result; same key with a different body returns CONFLICT. | Must | | IF-07 | Deprecated versions and fields return Deprecation and Sunset headers for 90 days before removal. | Must | | IF-08 | Error codes are stable; messages are translated. | Must | | IF-09 | Rate-limited responses include Retry-After. | Should | | IF-10 | Webhook events carry an event ID, type, occurred time and are signed (COM-04). | Must | | IF-11 | Real-time subscriptions are authorized per channel at subscribe time: trip seats, trip vehicle, family child, deal, organization operations. | Must | | IF-12 | Another tenant's record returns NOT_FOUND. | Must | ### 9.3 API authentication [#93-api-authentication] First-party clients use the access token from sign-in. Public API clients ([FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api), phase 6) use organization API keys with scopes, sent as a bearer key, rate-limited per key. # ACC — Accounting and settlements (/ar/docs/srs/requirements/acc) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ACC-01 — Double-entry ledger [#fr-acc-01--double-entry-ledger] Every financial event shall be written as a balanced ledger transaction. - Given a confirmed booking, when the ledger is checked, then its entries balance to zero. ## FR-ACC-02 — Organization accounting per trip [#fr-acc-02--organization-accounting-per-trip] Organizations shall see per trip base revenue, program revenue, coupon impact, supplier costs, commission and gateway fees, at plan depth. - Given a trip with all event types, when trip accounting opens, then each line shows its total. ## FR-ACC-03 — Supplier earnings and payouts [#fr-acc-03--supplier-earnings-and-payouts] The platform shall compute supplier earnings and create weekly payout runs on Mondays at 06:00 (D-28). A negative balance is netted against the next payout in the same currency, and no payout runs while it is negative (D-173). - Given a supplier with a negative balance, when the run executes, then no payout is made and the balance carries forward. ## FR-ACC-04 — Platform financial view [#fr-acc-04--platform-financial-view] Admins shall see subscription revenue, commission, deal audit, coupon redemptions, disputes and payouts, by market and month. - Given a month, when the view opens, then all six areas show totals. ## FR-ACC-05 — Settlements [#fr-acc-05--settlements] A settlement shall open when a trip is Completed and close when every payout is made and no dispute is open (D-174). Each line names the paying party, receiving party, reason and amount. - Given a completed trip with an open dispute, when all payouts are made, then the settlement stays open until the dispute closes. ## FR-ACC-06 — Exports by plan [#fr-acc-06--exports-by-plan] CSV and PDF exports shall follow the plan; admin system-wide exports are CSV only; files expire after 7 days and are ready within 15 minutes (D-249, D-177). - Given a Starter organization, when it requests a full export, then it is refused with an upgrade prompt. ## FR-ACC-07 — Reconciled exports [#fr-acc-07--reconciled-exports] Every export shall match the ledger for the same period and filters. - Given a monthly revenue export, when compared with the ledger, then totals match. ## FR-ACC-08 — Invoices across all parties [#fr-acc-08--invoices-across-all-parties] The platform shall issue and track invoices for every party pair: organization to traveler (B2C or B2B), supplier to organization for deals (issued by the platform on the supplier's behalf, proposed), platform to organization or supplier for commission, and platform to plan holders for subscriptions. - Given a finalized deal is settled, when the settlement closes, then a deal invoice and a commission invoice exist and both appear in the ledger. ## FR-ACC-09 — Daily reconciliation and finance digest [#fr-acc-09--daily-reconciliation-and-finance-digest] Reconciliation shall run daily ([FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation)). A finance exceptions digest goes out daily at 08:00 Cairo time (D-176). Dashboards warn when data is more than 26 hours old (D-250). - Given reconciliation found 2 exceptions, when 08:00 Cairo arrives, then Finance admins get the digest listing both. ## FR-ACC-10 — Archive after settlement [#fr-acc-10--archive-after-settlement] A trip shall archive 30 days after Completed, and only once its settlement is closed ([BRL-25](/en/docs/brd/requirements#7-business-rules)). - Given a trip completed 40 days ago with an open settlement, when the archive job runs, then the trip is not archived. # ADM — Admin console (/ar/docs/srs/requirements/adm) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ADM-01 — Account administration [#fr-adm-01--account-administration] Admins shall search any account, suspend, reinstate, reset credentials and review deletion and data-copy requests with their due dates. - Given an open deletion request, when the account opens, then the grace end date shows. ## FR-ADM-02 — Admin staff [#fr-adm-02--admin-staff] A Super admin shall invite admins (link valid 72 hours, D-50) with a role: Super admin, Operations or Finance (D-49). New admins set up the authenticator on first sign-in before the console opens. - Given a new admin, when they first sign in, then authenticator setup is required. ## FR-ADM-03 — Configuration [#fr-adm-03--configuration] Admins shall manage plans, coupons, templates, feature flags and markets. Changes apply at once and are audited. - Given a flag turned off, when saved, then the feature hides for all users and is audited. ## FR-ADM-04 — Dispute outcomes and refunds [#fr-adm-04--dispute-outcomes-and-refunds] Admins shall record disputes, decide outcomes and issue refunds from the dispute, within or outside policy ([FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy)). - Given a dispute resolved with a refund, when saved, then the refund links to the dispute and the booking. ## FR-ADM-05 — Immutable audit log [#fr-adm-05--immutable-audit-log] Every admin action and permission change shall be written to an audit log no role can edit or delete, kept 7 years. - Given an audit entry, when anyone edits it, then the change is refused. ## FR-ADM-06 — Platform-wide coupons [#fr-adm-06--platform-wide-coupons] Admins shall create coupons for any trip, optionally limited by market, and revoke any coupon. - Given a platform coupon, when a traveler applies it to any trip, then it is accepted if other rules pass. ## FR-ADM-07 — Abuse flags [#fr-adm-07--abuse-flags] Admins shall see abuse flags with the rule that raised each and its review due date. - Given a flagged coupon, when the list opens, then the flag and rule show. ## FR-ADM-08 — Dispute handling [#fr-adm-08--dispute-handling] Disputes shall have a type (booking, payment, refund, supplier conduct, organization conduct, other) and the states in section 7.10. They are acknowledged within 2 working days and resolved within 10; information requests are answered within 5 working days. Up to 5 files of 10 MB can be attached (D-32, D-254, D-256, D-259). - Given a dispute open for 3 working days without acknowledgment, when the queue opens, then it is flagged overdue. ## FR-ADM-09 — Lab-test requests [#fr-adm-09--lab-test-requests] Admins shall request a lab test for any approved driver at any time, choose the test type and deadline, and see all tests by state and deadline. Lab tests do not apply to photographers (D-98). - Given an approved driver, when an admin requests a test, then the driver is paused and the test shows in the queue with its deadline. # ANL — Analytics (/ar/docs/srs/requirements/anl) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ANL-01 — Organization analytics [#fr-anl-01--organization-analytics] Organizations shall see analytics by trip (views, conversion, bookings, revenue, occupancy, programs), by page (trip and organization page traffic and sources), by customer (new and returning travelers, repeat rate) and by provider (deals, costs, response time). Growth gets basic, Enterprise full; Starter none. - Given a Growth organization, when it opens trip analytics, then views, bookings and revenue show for the selected range. ## FR-ANL-02 — Supplier analytics [#fr-anl-02--supplier-analytics] Drivers and photographers shall see bookings, earnings and deal response analytics at their plan's report depth. - Given a Basic driver, when analytics open, then the basic report shows without export. ## FR-ANL-03 — Admin analytics [#fr-anl-03--admin-analytics] Admins shall see platform analytics by market, organization, role and plan. - Given a market filter, when applied, then all charts show that market only. ## FR-ANL-04 — Ranges, freshness and export [#fr-anl-04--ranges-freshness-and-export] Analytics shall offer 7, 30 and 90-day presets and a custom range, lag the source by no more than 5 minutes, and export within 15 minutes (D-177, D-281). - Given a booking confirmed at 10:00, when analytics refresh at 10:05, then it is counted. ## FR-ANL-05 — Privacy in analytics [#fr-anl-05--privacy-in-analytics] Analytics events shall exclude child-linked records and personal identifiers; page analytics use an anonymous identifier for visitors. - Given a parent views the tracker, when analytics events are written, then no child identifier is stored. # API — Public API (/ar/docs/srs/requirements/api) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-API-01 — Public API [#fr-api-01--public-api] Organizations and partners shall access trips and bookings through a versioned public API documented at docs.trips-enjoy.com, authenticated with organization API keys scoped by permission, and rate-limited per key. - Given a revoked API key, when used, then the request is refused as unauthenticated. ## FR-API-02 — API key lifecycle [#fr-api-02--api-key-lifecycle] Organizations shall manage their own API keys: create a key with a chosen scope from the permission set, list active keys, and revoke a key at once; a revoked key is refused as unauthenticated on its next use. - Given an employee without the API permission, when they open key management, then it is refused. - Given a revoked key, when a request arrives within one minute of revocation, then it is refused as unauthenticated. ## FR-API-03 — Read resource endpoints [#fr-api-03--read-resource-endpoints] The public API shall expose read endpoints for the published resource groups — trips, bookings and availability at minimum — returning the same data the organization sees in the dashboard, scoped to the calling organization's tenant. - Given a key scoped to read-only, when it requests another organization's trips, then the response is empty for that tenant, not an error. - Given a trip in Draft, when it is requested through the API, then it is not returned. ## FR-API-04 — API conventions [#fr-api-04--api-conventions] Public API endpoints shall follow the interface conventions: URL versioning under /api/v1 with breaking changes only in a new major version, cursor pagination for list endpoints, and a single error envelope with a stable code, message and request identifier. - Given a breaking change to a response field, when it ships, then it ships under a new major version and /api/v1 keeps its shape. - Given an error, when the response body is inspected, then the envelope contains code, message and the request identifier. ## FR-API-05 — OpenAPI publication [#fr-api-05--openapi-publication] The public API shall publish an OpenAPI 3.1 specification generated from code at docs.trips-enjoy.com, refreshed with every deployment, so partners build against the contract rather than the implementation. - Given a deployed change that alters an endpoint, when the specification is fetched, then it reflects the deployed shape. ## FR-API-06 — Rate limiting behavior [#fr-api-06--rate-limiting-behavior] The public API shall rate-limit per key with published limits, return 429 with a Retry-After header when the limit is exceeded, and expose remaining-quota headers on every response. - Given a key over its limit, when the next request arrives, then the response is 429 and Retry-After names the wait. - Given a key far under its limit, when any request succeeds, then the remaining-quota headers are present. ## FR-API-07 — Webhook contract parity [#fr-api-07--webhook-contract-parity] Webhook deliveries shall use the same envelope and signing as the public API contract: an event identifier, type, occurred time and signature (COM-04), so partners verify both surfaces with one implementation; delivery behavior follows [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). - Given a webhook with a rotated secret inside the 24-hour overlap, when the signature is checked with either secret, then verification succeeds. # AUTH — Accounts, identity and access (/ar/docs/srs/requirements/auth) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-AUTH-01 — Role-specific registration paths [#fr-auth-01--role-specific-registration-paths] The platform shall give each role its own registration path (/register/traveler, /register/driver, /register/photographer, /register/organization) and shall not show a combined onboarding form. Organization registration shall be web only. - Given a visitor opens /register, when the visitor chooses a role, then only that role's form is shown. - Given the mobile app, when a user chooses Organization, then the app hands off to the web registration page. ## FR-AUTH-02 — Country on every registration form [#fr-auth-02--country-on-every-registration-form] Every registration form shall collect the applicant's country and shall not submit without it. The country sets the account's market ([FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country)). - Given no country is selected, when the applicant submits, then submission is refused and the field is named. ## FR-AUTH-03 — Verification by one-time code [#fr-auth-03--verification-by-one-time-code] Accounts shall verify contact details by one-time code before acting: travelers at least one of email or phone; drivers, photographers and organization owners both (D-20). Codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. Resend is offered after a 45 to 60 second countdown. A resend does not reset the wrong-code count. After 3 failed deliveries, the code is offered on the other channel (D-58, D-59). - Given a code older than 5 minutes, when it is entered, then it is rejected and resend is offered after the countdown. - Given five wrong codes, when a sixth is entered, then verification is paused for 15 minutes and the resume time is shown. - Given a photographer verified only email, when they submit the application, then submission is refused until the phone is verified. ## FR-AUTH-04 — Role-specific sign-in methods [#fr-auth-04--role-specific-sign-in-methods] Sign-in shall follow the role: admins use email and password plus a mandatory authenticator code; organization staff use email and password plus an SMS or authenticator code at every sign-in (D-48); travelers and suppliers use password or a one-time code, both offered (proposed, auth canvas); moderators use a staff code ([FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in)). No biometric sign-in in phase 1. - Given an admin enters a correct password without a code, when sign-in is attempted, then access is refused and the code is requested. - Given organization staff sign in, when no second-factor code is entered, then sign-in is refused. ## FR-AUTH-05 — Sign-in lockout [#fr-auth-05--sign-in-lockout] The system shall lock any account for 15 minutes after 5 failed sign-in attempts, for every role (D-53), and rate-limit sign-in by IP ([NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec)). - Given five failed attempts, when a sixth is made within 15 minutes, then it is refused and the lock end time is shown. ## FR-AUTH-06 — Multi-role accounts [#fr-auth-06--multi-role-accounts] One person shall hold several roles and switch between them without a second account. The active role is part of the session. - Given a person holds traveler and approved photographer roles, when they switch to photographer, then the studio opens and traveler data is not shown in it. ## FR-AUTH-07 — Staff access to several organizations [#fr-auth-07--staff-access-to-several-organizations] Organization staff shall see and switch between the organizations whose member list includes their email, and no others. Switching changes the tenant context of the session. - Given a staff email listed by two organizations, when the staff member signs in, then both are listed and either opens. - Given an organization that does not list the email, when the staff member searches for it, then it is not listed. ## FR-AUTH-08 — Suspension and reinstatement [#fr-auth-08--suspension-and-reinstatement] Admin shall suspend and reinstate any account with a reason code (D-234). A suspended account loses access at once and keeps its data. Early lifting of a safety suspension requires a second admin (D-233). - Given a suspended account, when its user signs in, then access is refused with a suspension message and no data is deleted. ## FR-AUTH-09 — Account deletion with a 30-day grace period [#fr-auth-09--account-deletion-with-a-30-day-grace-period] A user shall request deletion. During the 30-day grace period no booking or payment is allowed, and signing in restores the account. On day 31, deletion becomes permanent under [DAT-03](/en/docs/srs/data#62-data-isolation). An organization owner cannot delete the account while any of the organization's trips is In Progress (D-168). - Given a request made 10 days ago, when the user signs in, then the account is restored and the request cancelled. - Given 30 days have passed, when the nightly job runs, then the account is deleted per section 6.4. ## FR-AUTH-10 — Sessions and tokens [#fr-auth-10--sessions-and-tokens] Access tokens shall last 15 minutes. Refresh tokens rotate on every use and last 30 days. Web sessions end after 12 hours; drafts are kept ([OD-02](/en/docs/brd/compliance#11-open-decisions)). Mobile apps stay signed in through refresh. - Given a web session in use for 12 hours, when the next request is made, then the user must sign in again. - Given an unpublished trip draft when the session ended, when the user signs in again, then the draft is available. # BKG — Booking and checkout (/ar/docs/srs/requirements/bkg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-BKG-01 — Booking composition [#fr-bkg-01--booking-composition] A booking shall hold the passengers (with a child flag), program selections, seats where allowed, at most one coupon unless stackable, an optional buyer tax number, and a payment method. - Given one non-stackable coupon, when a second is entered, then it is refused and the first kept. ## FR-BKG-02 — Checkout handoff [#fr-bkg-02--checkout-handoff] Card details shall be entered only on the gateway page or SDK, using the methods of the trip's market ([FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing)). Card data never reaches Trips Enjoy. - Given checkout reaches payment, when the traveler pays, then no card number, expiry or security code appears in platform logs or data stores. ## FR-BKG-03 — Retry without losing the cart [#fr-bkg-03--retry-without-losing-the-cart] A failed payment shall be retryable while the hold lasts, up to 3 attempts per hold; after the third, the booking stays Payment Failed until the hold expires (D-197). A retry after the hold expires keeps the cart, re-checks the seats and starts a new 15-minute hold only if they are still free (D-191). - Given payment failed 10 minutes into a hold, when the traveler retries, then cart and seats are kept for the remaining 5 minutes. - Given the hold expired and seat 4A was taken meanwhile, when the traveler retries, then the cart is kept and the traveler is asked to pick another seat. ## FR-BKG-04 — Traveler cancellation and refund [#fr-bkg-04--traveler-cancellation-and-refund] A traveler shall cancel a confirmed booking before departure. The refund follows [BRL-12](/en/docs/brd/requirements#7-business-rules) (placeholder: 80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours). Requests after the cut-off go to the organization, which decides within 2 working days, then to admin (D-151). Cancellation is not available after departure or after check-in; those become disputes (D-152, D-153). The preview shows the refund amount before confirmation. - Given cancellation 50 hours before departure, when confirmed, then 80 percent is refunded and the coupon redemption reversed. - Given a checked-in passenger, when cancellation is attempted, then it is refused and a dispute is offered. ## FR-BKG-05 — Receipts and invoices [#fr-bkg-05--receipts-and-invoices] Each confirmed booking shall produce a receipt and an invoice ([FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices)) visible in the traveler's booking history. - Given a booking becomes Confirmed, when the payment is recorded, then receipt and invoice are visible. ## FR-BKG-06 — Organization cancellation of a trip [#fr-bkg-06--organization-cancellation-of-a-trip] When an organization cancels a trip, every confirmed booking shall move to Cancelled and be refunded in full, with coupon redemptions reversed (D-150, [BRL-30](/en/docs/brd/requirements#7-business-rules)). - Given a trip with 40 confirmed bookings is cancelled, when saved, then 40 full refunds are queued. ## FR-BKG-07 — Booking states [#fr-bkg-07--booking-states] Bookings shall move only through the states in section 7.2. - Given a booking in Cart, when Checked In is set, then it is refused. # CHK — Check-in and check-out (/ar/docs/srs/requirements/chk) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-CHK-01 — Check-in at boarding [#fr-chk-01--check-in-at-boarding] The moderator shall check each passenger in by scanning the booking code or searching the manifest. - Given passenger P on vehicle 2, when moderator 2 checks P in, then the event is recorded and P shows on board. ## FR-CHK-02 — Vehicle match [#fr-chk-02--vehicle-match] A check-in shall be accepted only for the passenger's assigned vehicle. Otherwise the app names the correct vehicle number only, without other names or moderators. - Given P is on vehicle 2, when moderator 1 scans P, then it is refused and "vehicle 2" is shown. ## FR-CHK-03 — Event record [#fr-chk-03--event-record] Each event shall store event time, server receipt time, moderator, vehicle, stop and location where permitted, and appear in the passenger movement log. - Given a check-in, when the log is read, then it shows time, moderator, vehicle and location if permitted. ## FR-CHK-04 — Check-out at stops [#fr-chk-04--check-out-at-stops] The moderator shall check passengers out at stops and the destination. A passenger checked out at an intermediate stop can be checked in again on the same vehicle (proposed, workflows 16.2). - Given P checked out at stop 3, when P re-boards, then a new check-in is accepted on the same vehicle. ## FR-CHK-05 — Offline queue [#fr-chk-05--offline-queue] Without connection, events shall queue on the device (up to 1,000; warning at 800), retry every 30 seconds, and reach the server in order with original timestamps (D-117). Duplicate replays are ignored by client event ID. - Given 3 minutes offline and five check-ins, when the connection returns, then five events arrive in order with original times. ## FR-CHK-06 — Incident reporting [#fr-chk-06--incident-reporting] Moderators shall report incidents with a category (safety, medical, vehicle fault, lost traveler, conduct, other; D-331), description, photo and location. Reports reach the organization's operations view in real time. - Given an incident is submitted, when saved, then an operations user sees it without refreshing. ## FR-CHK-07 — Occupancy [#fr-chk-07--occupancy] Each vehicle shall show checked-in passengers against seats, updated in real time. - Given 40 of 48 checked in, when operations opens the trip, then vehicle 2 shows 40 of 48. # CPN — Coupons (/ar/docs/srs/requirements/cpn) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-CPN-01 — Creator scope [#fr-cpn-01--creator-scope] A coupon shall apply only inside its creator's scope: admin coupons to any trip (optionally limited to a market); organization coupons to its own trips; driver and photographer coupons to bookings where that supplier is assigned. - Given a driver coupon and a booking without that driver, when applied, then it is refused. ## FR-CPN-02 — Cross-entity rejection [#fr-cpn-02--cross-entity-rejection] Cross-entity use shall always be rejected with "not applicable to this booking", without naming the other entity ([OD-20](/en/docs/brd/compliance#11-open-decisions)). - Given organization A's coupon on organization B's trip, when validated, then the generic message shows. ## FR-CPN-03 — Real-time validation [#fr-cpn-03--real-time-validation] Validation shall check existence, status, validity window, scope, usage limit, per-user limit and minimum spend, in that order, and return the first failing reason. - Given a coupon that expired yesterday, when applied, then the reason is "expired". - Given a total below the minimum, when applied, then the reason is "minimum spend not met". ## FR-CPN-04 — Coupon types [#fr-cpn-04--coupon-types] Coupons shall support fixed amount, percentage, program-specific, free program, first booking and minimum spend. - Given a first-booking coupon, when a traveler with a confirmed booking with that entity applies it, then it is refused. ## FR-CPN-05 — Lifecycle and controls [#fr-cpn-05--lifecycle-and-controls] Coupons shall use the states in section 7.7. Creators pause, resume and revoke their own; admins revoke any. - Given a Paused coupon, when applied, then it is refused with reason "paused". ## FR-CPN-06 — Redemption and reversal [#fr-cpn-06--redemption-and-reversal] Each redemption shall be recorded against its booking. A refund reverses the redemption, frees the traveler's per-user use, and decrements the total usage count (architecture 10.6); an Exhausted coupon returns to Active if still in its window. - Given a refunded booking with a coupon, when saved, then the redemption is reversed and the traveler can use the coupon again. ## FR-CPN-07 — Analytics and abuse flags [#fr-cpn-07--analytics-and-abuse-flags] Creators shall see redemptions, discount total and remaining uses per coupon with 7, 30 and 90-day presets. Admins see platform analytics and abuse flags. Flags never block automatically; admins review within 2 working days (D-217). Thresholds are [OPEN: D-216]. - Given a flagged coupon, when the admin opens it, then the flag shows the rule that raised it and its review due date. ## FR-CPN-08 — Coupon count by plan [#fr-cpn-08--coupon-count-by-plan] Active and paused coupons count against the plan limit (D-203): organizations 5, 20, unlimited; drivers and photographers 3, 10, unlimited. - Given a Starter organization with 5 active or paused coupons, when it creates a sixth, then it is blocked with an upgrade prompt. # DRV — Driver app and lab tests (/ar/docs/srs/requirements/drv) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-DRV-01 — Driver work area [#fr-drv-01--driver-work-area] A driver shall see only their own assignments; an organization-owned driver only that organization's trips. - Given an own driver of organization A, when trips load, then only A's trips show. ## FR-DRV-02 — Deal responses [#fr-drv-02--deal-responses] A platform driver shall accept, counter or reject deal requests after seeing trip, route, date, vehicle and pay. - Given a counter, when sent, then the state is Countered by Provider and the organization is notified. ## FR-DRV-03 — Lab-test pause [#fr-drv-03--lab-test-pause] When a lab test is requested, the driver shall be paused at once. The app allows only: book the lab, upload the result, contact support, sign out. Open deals end with reason "provider paused"; upcoming assignments return to their organizers, who are notified to reassign. - Given a requested test, when the driver opens the app, then only the four actions are available. ## FR-DRV-04 — Lab deadline and result [#fr-drv-04--lab-deadline-and-result] The deadline shall default to 3 days from request; admins may set 1 to 7 days (D-21). Results come from the partner lab, or by driver upload as fallback. - Given 3 days pass with no result, when the deadline passes, then the test is Missed and the driver suspended. ## FR-DRV-05 — Admin validation [#fr-drv-05--admin-validation] Admins shall mark each result Passed or Failed. Late results are reviewed within 2 working days (D-243). A pass unpauses the driver; lifting a suspension early needs a pass and a second admin (D-239). A failed driver stays paused; a second failure within 12 months closes the account (D-242). - Given a Passed result, when saved, then the driver is unpaused and the change audited. - Given a second failure within 12 months, when saved, then the driver account is closed. ## FR-DRV-06 — Missed-deadline suspension [#fr-drv-06--missed-deadline-suspension] A missed deadline shall suspend the driver; a suspension over 30 days closes the driver account. - Given a suspension of 31 days, when the daily job runs, then the account is closed. ## FR-DRV-07 — Earnings and payouts [#fr-drv-07--earnings-and-payouts] Drivers shall see earnings and receive weekly payouts on Mondays at 06:00. While paused, completed trips are paid and uncompleted trips are held (D-28, D-175). - Given a weekly run, when it completes, then the week's payout shows in earnings. ## FR-DRV-08 — Driver availability [#fr-drv-08--driver-availability] Drivers shall mark available or unavailable dates and ranges (no weekly rules, D-89); deals that conflict with an existing assignment show a conflict. - Given an existing assignment on 10 March, when another deal for that date is opened, then a conflict warning shows. # EMP — Employees and permissions (/ar/docs/srs/requirements/emp) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-EMP-01 — Permission sets [#fr-emp-01--permission-sets] The owner shall invite employees and grant each a set of permissions in the areas trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations and analytics. Templates (Operations, Finance, Support, Manager) are offered as starting points. - Given an employee without accounting permission, when they open accounting, then the area is hidden and direct requests are refused. ## FR-EMP-02 — Permission changes are audited [#fr-emp-02--permission-changes-are-audited] Every grant, change and removal shall be written to the audit log with actor, time, and before and after values, and shown in the employee's permission history. - Given an owner removes a permission, when saved, then the audit log records owner, employee, time and the removed permission. ## FR-EMP-03 — Employee limit per plan [#fr-emp-03--employee-limit-per-plan] Active employees shall not exceed the plan limit (Starter 5, Growth 20, Enterprise unlimited). - Given a Starter organization with 5 active employees, when a sixth is invited, then it is blocked with an upgrade prompt. ## FR-EMP-04 — Server-side scope [#fr-emp-04--server-side-scope] Every permission shall be enforced by the server on every request. - Given an employee with trip scope only calls an accounting endpoint, when processed, then it is refused as forbidden. ## FR-EMP-05 — Employee removal [#fr-emp-05--employee-removal] Removing an employee shall end their access to that organization at once; past actions and audit entries remain. - Given a removed employee, when they sign in, then the organization is not listed and audit entries still show their name. ## FR-EMP-06 — Invitation and first sign-in [#fr-emp-06--invitation-and-first-sign-in] An invitation link shall go to the employee's email, valid 7 days (D-286). On first sign-in the employee sets a password and enrolls a second factor (SMS or authenticator) before the workspace opens. - Given an accepted invitation, when the employee signs in for the first time, then second-factor setup is required before the workspace opens. # FLT — Fleet and vehicle types (/ar/docs/srs/requirements/flt) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-FLT-01 — Reusable vehicle types [#fr-flt-01--reusable-vehicle-types] A vehicle type shall define a seat layout with labeled seats, reusable across trips. - Given a 48-seat type, when a new trip selects it, then the trip uses the same 48 labeled seats. ## FR-FLT-02 — Vehicle registry [#fr-flt-02--vehicle-registry] A vehicle shall use one vehicle type and its seat count shall match the type. - Given a 48-seat type and a vehicle saying 50, when saved, then it is refused. ## FR-FLT-03 — Vehicle limit per trip [#fr-flt-03--vehicle-limit-per-trip] Vehicles per trip shall not exceed the plan limit (Starter 2, Growth 10, Enterprise unlimited). - Given a Starter trip with 2 vehicles, when a third is added, then it is blocked with an upgrade prompt. ## FR-FLT-04 — Seat map from vehicle type [#fr-flt-04--seat-map-from-vehicle-type] Each trip vehicle's seat map shall come from its vehicle type and show each seat's label and state. - Given seat 12B is reserved, when a traveler views the map, then 12B shows unavailable. ## FR-FLT-05 — Vehicle removal after bookings [#fr-flt-05--vehicle-removal-after-bookings] A vehicle with confirmed bookings shall not be removed until those bookings are reassigned or resolved under [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings). - Given a vehicle with confirmed bookings, when removal is attempted, then it is refused with the count shown. ## FR-FLT-06 — Archiving vehicle types [#fr-flt-06--archiving-vehicle-types] An archived type shall not be offered for new trips; existing trips keep their layout. - Given an archived type, when a new trip is created, then it is not offered. # MED — Media and albums (/ar/docs/srs/requirements/med) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MED-01 — Album creation window [#fr-med-01--album-creation-window] A photographer shall create albums for a trip only after it is Completed and within 14 days; albums archive 30 days after the window closes (D-267, D-268). - Given an In Progress trip, when an album is created, then it is refused. ## FR-MED-02 — Resumable batch upload [#fr-med-02--resumable-batch-upload] Photos shall upload directly to storage by presigned URL in batches; an interrupted batch resumes without re-uploading finished files. 95 percent of photos finish processing within 5 minutes (D-274). - Given 300 photos interrupted after 120, when resumed, then the 120 are not uploaded again. ## FR-MED-03 — Privacy modes by plan [#fr-med-03--privacy-modes-by-plan] An album shall be public to trip participants, shared by link (Studio, Pro) or for selected users (Pro). - Given a Basic photographer, when privacy options show, then only public is offered. ## FR-MED-04 — Shared links [#fr-med-04--shared-links] A shared link shall use a 32-character token and be revocable; a revoked link returns not found. - Given a revoked link, when opened, then the response is not found. ## FR-MED-05 — Selected-user access [#fr-med-05--selected-user-access] A selected-users album shall be visible only to users on its list. - Given a traveler not on the list, when they open the trip's albums, then the album is not shown. ## FR-MED-06 — Watermarking [#fr-med-06--watermarking] Studio and Pro photographers shall watermark public copies at the bottom right, inset 3 percent of width, 30 percent opacity (D-275). Originals are unchanged. - Given watermarking on, when a traveler views a photo, then the watermarked copy is served. ## FR-MED-07 — Traveler access and download [#fr-med-07--traveler-access-and-download] Signed-in travelers who took the trip shall view allowed albums. Public albums allow download of the watermarked or medium copy. Shared-link and selected-user albums show no download button. Downloads require sign-in and are logged (D-264, D-266). - Given a shared-link album, when opened, then no download button shows. ## FR-MED-08 — Albums per trip by plan [#fr-med-08--albums-per-trip-by-plan] Albums per trip shall not exceed the plan limit (Basic 1, Studio 5, Pro unlimited). - Given a Basic photographer with one album, when creating a second, then it is blocked with an upgrade prompt. # MKT — Markets (/ar/docs/srs/requirements/mkt) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MKT-01 — Market configuration [#fr-mkt-01--market-configuration] Admins shall configure each market: currency, payment methods and gateways for bookings and for plans, tax rates and invoice rules, default time zone, commission rate (placeholder 10 percent), plan prices and status (draft, live, paused). - Given the Egypt market, when an admin adds Fawry for bookings, then Egyptian checkouts offer it. ## FR-MKT-02 — Market from country [#fr-mkt-02--market-from-country] An account's market shall come from its registration country; an organization's market decides its trips' currency, methods and tax rules ([BRL-27](/en/docs/brd/requirements#7-business-rules)). Changing an organization's country after approval requires admin action. - Given an organization registered in Egypt, when it creates a trip, then the trip's currency is EGP. ## FR-MKT-03 — Cross-market browsing [#fr-mkt-03--cross-market-browsing] Travelers shall see trips from every live market with prices in each trip's currency, and pay with that market's methods. - Given an Egyptian traveler opens a Saudi trip, when they reach payment, then the Saudi methods and SAR amount are shown. ## FR-MKT-04 — Market switch [#fr-mkt-04--market-switch] Trips in a paused or draft market shall not be publishable; published trips stay bookable unless admins pause bookings too. - Given the UAE market is draft, when a UAE organization publishes, then publishing is refused. ## FR-MKT-05 — Rounding and display [#fr-mkt-05--rounding-and-display] Amounts shall be computed in minor units, rounded half up per line, with totals as the sum of rounded lines (D-157), and displayed with the currency code and Western digits. - Given three lines of 33.335 EGP, when totaled, then each line rounds to 33.34 and the total is 100.02. # MOD — Moderator app (/ar/docs/srs/requirements/mod) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-MOD-01 — Vehicle-scoped access [#fr-mod-01--vehicle-scoped-access] A moderator shall see and act only on the assigned vehicle. - Given moderator A on vehicle 1 calls check-in for vehicle 2, when processed, then it is refused as forbidden. ## FR-MOD-02 — End-of-trip report [#fr-mod-02--end-of-trip-report] The moderator shall submit a report with the final headcount; a headcount that differs from the checked-in count requires a reason. - Given 47 checked in and 46 entered without a reason, when submitted, then it is refused. ## FR-MOD-03 — Access revocation [#fr-mod-03--access-revocation] Replacing a moderator, or 24 hours after the trip ends, shall end access at once and show an access-ended screen. - Given A is replaced on vehicle 1, when saved, then A's session shows access ended and A's requests are refused. ## FR-MOD-04 — Installable app [#fr-mod-04--installable-app] The moderator app shall be an installable web app that opens to the vehicle view. - Given the app is added to the home screen, when opened, then it opens to the vehicle view. ## FR-MOD-05 — Moderator sign-in [#fr-mod-05--moderator-sign-in] Moderators shall sign in with phone and a staff code. The code is valid until 24 hours after the trip ends, on one device at a time (D-107, D-108). Moderator plan is [OPEN: [OD-06](/en/docs/brd/compliance#11-open-decisions)]. - Given a second device signs in with the same code, when it succeeds, then the first device's session ends. ## FR-MOD-06 — Report lock [#fr-mod-06--report-lock] A submitted report shall be read-only for the moderator; the organization can add a note. - Given a submitted report, when the moderator edits it, then it is refused. # NEG — Deal negotiation (/ar/docs/srs/requirements/neg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-NEG-01 — Deal proposal [#fr-neg-01--deal-proposal] Either party shall propose a price for a specific vehicle or trip. - Given an organization proposes for vehicle 2, when saved, then the supplier receives the request with the price. ## FR-NEG-02 — Counter-offers and expiry [#fr-neg-02--counter-offers-and-expiry] Either party shall counter with no round limit. An offer expires 72 hours after the last counter; the deal then ends as Rejected with reason expired ([BRL-26](/en/docs/brd/requirements#7-business-rules)). - Given a supplier counter, when saved, then the state is Countered by Provider and the organization is notified. - Given 72 hours since the last counter with no response, when the job runs, then the deal is Rejected with reason expired. ## FR-NEG-03 — Mutual acceptance [#fr-neg-03--mutual-acceptance] A deal shall be finalized only when both parties accept the same terms. A counter after an acceptance voids that acceptance. - Given the supplier accepted, when the organization counters, then the acceptance is void and the state is Countered by Organization. ## FR-NEG-04 — Rejection [#fr-neg-04--rejection] Either party shall reject a deal. The vehicle slot stays open for another supplier. - Given a rejected deal, when saved, then the organization can start a new deal with a different supplier. ## FR-NEG-05 — Finalization [#fr-neg-05--finalization] A finalized deal shall assign the supplier and record the agreed amount as a deal cost in the ledger, with commission per [OD-15](/en/docs/brd/compliance#11-open-decisions) (placeholder 10 percent). - Given a finalized deal, when saved, then the ledger holds one deal-cost transaction linked to the trip. ## FR-NEG-06 — Deal audit [#fr-neg-06--deal-audit] Every state change and offer shall be recorded and visible to admins. Admins can flag a deal with a reason; a flag can pause it (D-252). - Given a deal with five counters, when an admin opens it, then all five show in order with actor and time. ## FR-NEG-07 — Negotiation by plan [#fr-neg-07--negotiation-by-plan] Organizations shall negotiate with platform suppliers only on Growth and Enterprise. Platform suppliers negotiate on every tier. - Given a Starter organization, when it starts a deal, then it is blocked with an upgrade prompt. # NTF — Notifications (/ar/docs/srs/requirements/ntf) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-NTF-01 — Channels by preference [#fr-ntf-01--channels-by-preference] Each notification shall go on the channels the user enabled for its category: email, SMS, WhatsApp, push, in-app. Account security messages cannot be disabled. - Given push is off for promotions, when a promotion is sent, then no push is delivered. ## FR-NTF-02 — Language and layout [#fr-ntf-02--language-and-layout] Notifications shall use the user's language, right to left for Arabic. - Given an Arabic user, when a confirmation email is sent, then it is in Arabic and right to left. ## FR-NTF-03 — Quiet hours [#fr-ntf-03--quiet-hours] SMS and push shall not be sent between 22:00 and 07:00 recipient local time unless urgent (D-289 list). Deferred messages go at 07:00; trip-day events older than 2 hours are dropped (D-290). - Given a non-urgent push due at 22:30, when processed, then it is sent at 07:00. ## FR-NTF-04 — Versioned templates [#fr-ntf-04--versioned-templates] Text shall come from versioned templates by category, channel and language, managed by admins. - Given a template edit, when saved, then new messages use it and sent ones are unchanged. ## FR-NTF-05 — Delivery records and retries [#fr-ntf-05--delivery-records-and-retries] Each delivery shall record its status by channel. Failures retry 3 times with exponential backoff (architecture 13.2). - Given an SMS failure, when recorded, then a retry is scheduled. ## FR-NTF-06 — No duplicate delivery [#fr-ntf-06--no-duplicate-delivery] One event shall produce at most one message per channel per recipient. - Given a duplicated trip-started event, when processed, then each parent gets one push. ## FR-NTF-07 — Trip reminders and change notices [#fr-ntf-07--trip-reminders-and-change-notices] Travelers shall get a reminder 24 hours before departure by push and email, plus SMS if enabled (D-27). Vehicle, driver or time changes are notified within 1 hour (D-186). - Given a trip departing in 24 hours, when the hourly job runs, then each confirmed traveler gets the reminder once. # ONB — Applications and approvals (/ar/docs/srs/requirements/onb) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ONB-01 — Application and supplier access [#fr-onb-01--application-and-supplier-access] The platform shall accept applications from organizations, platform drivers and platform photographers. A plan may be chosen at registration with no charge; it is assigned on approval (D-77). Supplier actions are refused until approval. - Given a pending application, when the applicant tries to create a trip or accept a deal, then the action is refused with an approval-pending message. ## FR-ONB-02 — Single admin queue [#fr-onb-02--single-admin-queue] The admin console shall show all applications in one queue with their documents. Admin shall approve, request changes or reject. A rejection requires a reason code (D-234) and a message in the applicant's language. - Given a rejection without a reason, when the admin submits, then it is refused. ## FR-ONB-03 — Decision time target [#fr-onb-03--decision-time-target] The queue shall flag any application pending for more than 2 working days. - Given an application pending for 3 working days, when the queue opens, then it is flagged overdue. ## FR-ONB-04 — Changes requested [#fr-onb-04--changes-requested] The applicant shall have 14 days to respond, with a reminder on day 7 and one 7-day extension on request (D-235). Resubmission returns the application to Pending Review. Without a response, the application closes [OPEN: closure day when the extension is used, [OD-32](/en/docs/brd/compliance#11-open-decisions)]. - Given changes were requested 15 days ago with no extension and no response, when the daily job runs, then the application is Closed. ## FR-ONB-05 — Rejection, appeal and re-application [#fr-onb-05--rejection-appeal-and-re-application] A rejected applicant shall appeal within 14 days of the notice, with a statement and up to 5 files; one appeal per rejection; decided within 5 working days (D-237). Re-application is allowed 30 days after rejection; a closed application counts as rejected. The traveler account stays active. - Given a rejection 12 days ago, when the applicant re-applies, then it is refused and the earliest date is shown. - Given a rejection 15 days ago, when the applicant tries to appeal, then the appeal is refused as out of time. ## FR-ONB-06 — Photographer portfolio minimum [#fr-onb-06--photographer-portfolio-minimum] A photographer application shall require at least 8 portfolio photos (JPEG, PNG or HEIC, 25 MB each, D-81). - Given 7 uploaded photos, when the photographer submits, then submission is refused and the required count is shown. ## FR-ONB-07 — Driver vehicle and insurance details [#fr-onb-07--driver-vehicle-and-insurance-details] A driver using their own vehicle shall give plate, model, year, seat count, registration and insurance valid for at least 3 more months. Documents are PDF, JPG or PNG up to 10 MB (D-80). - Given insurance expiring in 2 months, when the driver submits, then submission is refused with the minimum shown. ## FR-ONB-08 — Lab consent and initial result [#fr-onb-08--lab-consent-and-initial-result] A driver application shall record consent to lab tests ([NFR-[DAT-05](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat)) and include an initial lab result dated within the last 30 days. - Given a lab result dated 31 days before submission, when the driver submits, then submission is refused. ## FR-ONB-09 — Applicant status notifications [#fr-onb-09--applicant-status-notifications] Each state change shall notify the applicant in their language on at least one enabled channel. - Given an application moves to Approved, when the state changes, then the applicant is notified in their language. # ORG — Organization tenancy and settings (/ar/docs/srs/requirements/org) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-ORG-01 — Tenant isolation [#fr-org-01--tenant-isolation] No user outside an organization shall read or change its trips, staff, suppliers, vehicles, coupons, invoices or accounts. Requests for another tenant's records return not found. - Given a user of organization A requests a trip of organization B, when it is processed, then the response is not found with no trip data. ## FR-ORG-02 — Tenant setup on approval [#fr-org-02--tenant-setup-on-approval] Approval shall create the tenant in the applicant's market, assign the plan chosen at registration or Starter by default (D-24, D-77), make the applicant the owner, and send a sign-in invitation. - Given an approved application with no plan chosen, when approval is saved, then the tenant exists on Starter and the owner is invited. ## FR-ORG-03 — Organization-owned drivers and photographers [#fr-org-03--organization-owned-drivers-and-photographers] An organization shall invite its own drivers and photographers by SMS or email (link valid 7 days, D-94). They are visible only to that organization and accepted on assignment without admin approval. Removing one releases their future assignments and notifies operations. - Given organization A onboards a driver, when organization B searches the pool, then the driver is not listed. - Given organization A assigns its own driver, when the assignment is saved, then it is Accepted with no admin step. ## FR-ORG-04 — Fleet registration [#fr-org-04--fleet-registration] An organization shall register vehicles with plate, model, year, vehicle type, seats and registration status. - Given a vehicle with a seat count that differs from its type, when it is saved, then it is refused with the mismatch shown. ## FR-ORG-05 — Seat self-selection setting [#fr-org-05--seat-self-selection-setting] An organization shall enable or disable traveler seat self-selection per trip or as an account default, only on plans that include it. - Given a Starter organization, when it tries to enable self-selection, then the action is blocked with an upgrade prompt. ## FR-ORG-06 — CRM and webhooks [#fr-org-06--crm-and-webhooks] An organization shall connect a CRM and register webhook endpoints for trip published, trip cancelled, booking confirmed, booking cancelled, check-in and check-out events. Deliveries are signed (COM-04), retried 5 times over 24 hours, then the owner is emailed; deliveries can be replayed for 7 days; after a secret rotation the old secret stays valid for 24 hours. No plan gate applies (D-62 to D-64). Endpoint count per plan is [OPEN: D-65]. CRM targets are [OPEN: [OD-18](/en/docs/brd/compliance#11-open-decisions)]. - Given an endpoint subscribed to booking confirmed, when a booking is confirmed, then a signed event with an event ID is delivered. - Given five failed attempts over 24 hours, when the last fails, then the owner is emailed and the delivery shows as failed with a replay option. ## FR-ORG-07 — B2B and B2C invoices [#fr-org-07--b2b-and-b2c-invoices] An organization shall issue invoices for its trips on every plan (D-178). An invoice is B2B when the buyer gave a tax number, otherwise B2C. An issued invoice is never edited; corrections are credit notes referencing the original. If numbering fails, no invoice is issued, the booking stays Confirmed, numbering retries 3 times, then the case goes to finance review (D-179 to D-181). ZATCA e-invoicing is out of scope until [OD-10](/en/docs/brd/compliance#11-open-decisions). - Given a buyer entered a tax number at checkout, when the booking is confirmed, then a B2B invoice is issued and posted to the ledger. - Given an issued invoice needs a correction, when finance corrects it, then a credit note referencing the original number is issued and the original is unchanged. ## FR-ORG-08 — Custom branding [#fr-org-08--custom-branding] Enterprise organizations shall upload a logo and brand colors applied to their public trip pages, emails and invoice PDFs. - Given a Growth organization, when it opens branding settings, then they are locked with an upgrade prompt. # PAR — Parent tracker (/ar/docs/srs/requirements/par) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PAR-01 — Linking a child [#fr-par-01--linking-a-child] A parent shall link a child passenger to a booking with a valid booking reference, the child's name as on the booking, and a guardianship declaration recorded as consent (D-126). Invalid or mismatched input is refused with a generic message. - Given a valid reference and matching name, when submitted with the declaration, then the child is linked. - Given an invalid reference, when submitted, then it is refused without revealing booking details. ## FR-PAR-02 — Parent view scope [#fr-par-02--parent-view-scope] A parent shall see only linked children's vehicle, seat, check-in status and programs. - Given two linked children and another passenger on a different booking, when the tracker opens, then only the two children show. ## FR-PAR-03 — Eligibility [#fr-par-03--eligibility] Child tracking shall be available where the parent is on Explorer or VIP and the organization is on Growth or Enterprise with the trip switch on ([OD-05](/en/docs/brd/compliance#11-open-decisions), proposed). Live position shows only while the trip is In Progress (D-317). The blocked state says whether the parent's plan or the organization's setting is the reason; only the plan case offers an upgrade. - Given a Free parent, when linking, then an upgrade prompt shows. - Given the organization is on Starter, when the parent opens the trip, then tracking is unavailable with no upgrade offered. ## FR-PAR-04 — Parent notifications [#fr-par-04--parent-notifications] Parents shall be notified at boarding, trip start, each stop and trip end. - Given trip start, when published, then each linked parent is notified in their language. ## FR-PAR-05 — Child-data restrictions [#fr-par-05--child-data-restrictions] Child data shall not be used for marketing, advertising, analytics events or model training and shall not appear in any marketing export or audience. - Given a marketing audience is built, when generated, then no child-linked record is included. ## FR-PAR-06 — Link ends with the booking [#fr-par-06--link-ends-with-the-booking] A child link shall end when its booking is cancelled or refunded. - Given a refunded booking, when saved, then the parent no longer sees the child's status. ## FR-PAR-07 — Child-safety reporting [#fr-par-07--child-safety-reporting] Parents and organization staff shall report a child-safety concern, creating a case routed to the configured escalation contact [OPEN: contacts and procedure, D-68]. - Given a parent report, when saved, then a case exists and the escalation contact is notified. # PAY — Payments and refunds (/ar/docs/srs/requirements/pay) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PAY-01 — Payment outcomes [#fr-pay-01--payment-outcomes] The platform shall record each gateway result with its reference. Success moves the booking to Confirmed and posts to the ledger; failure moves it to Payment Failed. - Given a success callback, when processed, then the booking is Confirmed and one payment transaction exists in the ledger. ## FR-PAY-02 — Idempotent callbacks [#fr-pay-02--idempotent-callbacks] Callbacks shall be verified and processed at most once per gateway event identifier. - Given the same success callback twice, when both are processed, then one payment entry exists. ## FR-PAY-03 — Refund execution [#fr-pay-03--refund-execution] An approved refund shall be sent to the gateway within 2 working days and shown as "refund in progress". It is Refunded only after the gateway confirms; the ledger reverses revenue, commission and fees then. Failed refunds retry 3 times, then stay Refund Pending for finance review (D-149, D-35, D-322). - Given a sent refund not yet confirmed, when the traveler views the booking, then it shows Refund Pending and no reversal is posted. ## FR-PAY-04 — Refunds outside policy [#fr-pay-04--refunds-outside-policy] Refunds outside the policy shall be issued by an admin with a reason recorded in the audit log. - Given an out-of-policy refund, when saved, then reason and admin are audited. ## FR-PAY-05 — Gateway reconciliation [#fr-pay-05--gateway-reconciliation] The platform shall compare gateway settlement reports with the ledger daily and list each difference as an exception (D-29). - Given a gateway payment missing from the ledger, when reconciliation runs, then it is listed as an exception. ## FR-PAY-06 — Subscription charges and dunning [#fr-pay-06--subscription-charges-and-dunning] Plan charges shall run through the gateway's billing product. A failed charge starts dunning ([FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning)) and the grace period ([FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period)). - Given a failed renewal, when the failure is received, then a reminder is sent and grace starts. ## FR-PAY-07 — Payment methods per market [#fr-pay-07--payment-methods-per-market] Checkout shall offer the methods configured for the trip's market: in Egypt, Stripe cards and wallets, Paymob or Tap local cards, and Fawry cash; Gulf methods are confirmed at launch ([OD-11](/en/docs/brd/compliance#11-open-decisions)). - Given an Egyptian trip, when the traveler reaches payment, then the Fawry cash option is offered. ## FR-PAY-08 — Payment pending [#fr-pay-08--payment-pending] If the gateway does not answer within 30 seconds, the booking shall stay Payment Pending with a "confirming payment" message. The platform checks status at 1, 5 and 10 minutes and escalates to admin at 15 minutes. Seats stay held while pending (D-30, D-201). - Given a gateway timeout, when 15 minutes pass with no result, then the case appears in the admin queue and the traveler is told the payment is being checked. ## FR-PAY-09 — Fawry cash vouchers [#fr-pay-09--fawry-cash-vouchers] Choosing Fawry shall issue a voucher valid 48 hours and hold the seats for that window. An unpaid voucher expires and releases the seats (D-31, D-41). - Given an unpaid voucher at 48 hours, when it expires, then the seats return to Available and the traveler is notified. # PHO — Photographer studio (/ar/docs/srs/requirements/pho) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PHO-01 — Portfolio [#fr-pho-01--portfolio] Photographers shall manage the portfolio within the plan allowance (Basic 10, Studio 50, Pro unlimited). - Given 10 images on Basic, when another is uploaded, then it is blocked with an upgrade prompt. ## FR-PHO-02 — Rates and availability [#fr-pho-02--rates-and-availability] Photographers shall set rates and mark available or unavailable dates and ranges (no weekly rules, D-89). Deals for unavailable dates are refused. - Given a date marked unavailable, when an organization proposes a deal for it, then the proposal is refused. ## FR-PHO-03 — Earnings [#fr-pho-03--earnings] Photographers shall see earnings, statements and payouts; commission shows as a ledger line without a printed rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is decided. - Given a payout was made, when earnings open, then it shows with amount and date. ## FR-PHO-04 — Active bookings by plan [#fr-pho-04--active-bookings-by-plan] Bookings per month shall follow the plan (Basic 3, Studio 10, Pro unlimited). - Given 3 bookings this month on Basic, when a fourth deal is finalized, then it is blocked with an upgrade prompt. ## FR-PHO-05 — Photographer coupons [#fr-pho-05--photographer-coupons] Photographers shall create coupons that apply only to bookings where they are assigned. - Given another photographer's booking, when the coupon is applied, then it is refused. ## FR-PHO-06 — Visibility and badge [#fr-pho-06--visibility-and-badge] Profile visibility and the verified badge shall follow the plan; Basic shows no badge. - Given a Basic photographer, when the profile is viewed, then no badge shows. # PRG — Programs (/ar/docs/srs/requirements/prg) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-PRG-01 — Pricing models [#fr-prg-01--pricing-models] Each program shall have exactly one pricing model: free, per person, by quantity, per group or tiered. - Given a program with two pricing models, when saved, then it is refused. ## FR-PRG-02 — Program types [#fr-prg-02--program-types] A program shall be optional, pre-required (auto-included, not removable), capacity-limited or VIP-only. - Given a pre-required program, when a traveler books, then it is included and cannot be removed. - Given a VIP-only program, when a Free or Explorer traveler opens it, then it is locked with an upgrade prompt. ## FR-PRG-03 — Live booking summary [#fr-prg-03--live-booking-summary] The booking summary shall update the total as programs and quantities change, before the next step, including the plan's program discount. - Given a per-person program for two passengers, when added, then the total rises by price times two before the next step. ## FR-PRG-04 — Enrollment report [#fr-prg-04--enrollment-report] An organization shall see per program who chose it, quantities and revenue. No plan gate until [OD-25](/en/docs/brd/compliance#11-open-decisions) is decided. - Given quantities 2 and 3 on one program, when the report opens, then both rows and a total of 5 show. ## FR-PRG-05 — Program capacity [#fr-prg-05--program-capacity] A capacity-limited program shall stop accepting selections at its cap and show as unavailable. - Given a cap of 20 with 20 selections, when a 21st traveler opens it, then it is unavailable. ## FR-PRG-06 — Program count limit [#fr-prg-06--program-count-limit] Programs per trip shall not exceed the plan limit (Starter 3, Growth 15, Enterprise unlimited). - Given a Starter trip with 3 programs, when a fourth is added, then it is blocked with an upgrade prompt. # SEAT — Seats (/ar/docs/srs/requirements/seat) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-SEAT-01 — Company-assigned by default [#fr-seat-01--company-assigned-by-default] Every vehicle shall use company-assigned seating unless self-selection is on for the trip. - Given self-selection off, when a traveler books, then no seat picker shows and the booking shows "seat assigned later". ## FR-SEAT-02 — Live seat map [#fr-seat-02--live-seat-map] With self-selection on, the map shall show each seat's state and update within 500 ms when another traveler takes or releases a seat. A list view is available for screen readers. - Given two viewers, when one holds 7A, then the other sees 7A unavailable within 500 ms. ## FR-SEAT-03 — Priority window [#fr-seat-03--priority-window] Explorer and VIP travelers shall get a priority window for seat selection before others [OPEN: window length, D-316, [OD-08](/en/docs/brd/compliance#11-open-decisions)]. - Given the window is open, when a Free traveler opens the map, then selection is disabled until the window closes. ## FR-SEAT-04 — Seat hold [#fr-seat-04--seat-hold] A seat selected at checkout shall be held for 15 minutes and released automatically when the hold expires or payment does not complete. The price is locked when the hold starts (D-192). Fawry cash vouchers hold seats for the voucher window ([FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers)). - Given a hold with no completed payment after 15 minutes, when it expires, then the seat returns to Available. ## FR-SEAT-05 — Seat states [#fr-seat-05--seat-states] Seats shall move only through the states in section 7.3. - Given a Checked In seat, when a change is attempted, then it is refused. ## FR-SEAT-06 — Staff seat assignment [#fr-seat-06--staff-seat-assignment] In company-assigned mode, employees with the operations permission shall assign and reassign seats. A reserved seat cannot be given to a second passenger. - Given 9C reserved for one passenger, when assigned to another, then it is refused as a conflict. ## FR-SEAT-07 — Self-selection by plan [#fr-seat-07--self-selection-by-plan] Self-selection shall be available only on Growth and Enterprise. - Given a Starter organization, when it views the setting, then it is locked with an upgrade prompt. # STF — Staffing (/ar/docs/srs/requirements/stf) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-STF-01 — Driver tracks [#fr-stf-01--driver-tracks] Each vehicle shall be driven by an organization-owned driver or by a platform driver through a finalized deal. - Given a vehicle being staffed, when a driver is chosen, then only these two options are offered. ## FR-STF-02 — Photographer tracks [#fr-stf-02--photographer-tracks] A trip's photographer shall be organization-owned or a platform photographer through a finalized deal. - Given a platform photographer is chosen, when the organization proceeds, then a deal starts and no assignment is made until it is finalized. ## FR-STF-03 — Ready gate [#fr-stf-03--ready-gate] A trip shall not move to Ready until every vehicle has a confirmed driver and moderator and every platform deal is finalized. The system lists each gap. - Given vehicle 3 has no moderator, when Ready is requested, then it is refused and vehicle 3 is listed. ## FR-STF-04 — Assignment after finalized deal [#fr-stf-04--assignment-after-finalized-deal] A platform supplier shall be assigned only after both parties accept the same terms. - Given a deal in Countered by Provider, when assignment is attempted, then it is refused. ## FR-STF-05 — Moderator assignment [#fr-stf-05--moderator-assignment] The organization shall assign one moderator per vehicle, with a phone number (D-107). Access is limited to that vehicle on that trip until 24 hours after the trip ends. - Given moderator A on vehicle 1, when A opens the app, then only vehicle 1 shows. ## FR-STF-06 — Deal request visibility [#fr-stf-06--deal-request-visibility] A supplier shall see trip, route, date, vehicle and pay before responding. - Given an open deal request, when the supplier opens it, then those details show before accept or counter is enabled. ## FR-STF-07 — Reassignment deadline [#fr-stf-07--reassignment-deadline] When a supplier drops out or is paused, the organization shall be able to reassign until 24 hours before departure; after that the trip shows "driver needed" and operations is alerted. A staffing-gap email goes out 48 hours before departure (D-185, D-187). - Given a vehicle without a driver 48 hours before departure, when the job runs, then the organization is emailed about the gap. # SUB — Plans and subscriptions (/ar/docs/srs/requirements/sub) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-SUB-01 — Plan catalog [#fr-sub-01--plan-catalog] Admins shall define plans per role with limits, features, trial length, and monthly and annual prices per market ([BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt)). Changes apply to new actions at once and are audited. Prices are [OPEN: [OD-26](/en/docs/brd/compliance#11-open-decisions)]; annual discount placeholder 15 percent ([OD-14](/en/docs/brd/compliance#11-open-decisions)). - Given the Starter employee limit changes from 5 to 6, when saved, then it applies at once and the audit log holds old and new values. ## FR-SUB-02 — Feature gates [#fr-sub-02--feature-gates] Every plan-limited action shall be checked on the server, returning the plan-required category with the current plan, the limit and the next tier. Every non-traveler role needs an active plan ([BRL-02](/en/docs/brd/requirements#7-business-rules)). - Given a limit reached, when the action is attempted, then it is blocked and an upgrade prompt shows. ## FR-SUB-03 — Grace period [#fr-sub-03--grace-period] A failed renewal shall start 7 days of grace with features kept and a payment banner. What happens when grace ends is [OPEN: [OD-29](/en/docs/brd/compliance#11-open-decisions)]; until decided, the account drops to the role's basic tier and new bookings or new deals are blocked (D-08). - Given a renewal failed 6 days ago, when the user works, then features are active with a warning. - Given a renewal failed 8 days ago, when the organization publishes a trip, then it is blocked. ## FR-SUB-04 — Upgrade, downgrade and cancellation [#fr-sub-04--upgrade-downgrade-and-cancellation] Upgrades take effect at once with the prorated difference charged. Downgrades take effect at cycle end with no proration and can be cancelled before then (D-219, D-232). Cancellation keeps access to the end of the paid period. Cancelling during grace ends the plan at once with no refund (D-223). - Given a mid-cycle downgrade, when saved, then the current plan stays until cycle end. ## FR-SUB-05 — Admin overrides [#fr-sub-05--admin-overrides] Admins shall grant, revoke or change a plan for one account with a reason and an end date, approved by a second admin. The owner is emailed and the plan reverts at the end date (D-227, D-230). - Given one admin requests a 3-month VIP grant, when a second admin approves, then it applies at once and is audited with its end date. ## FR-SUB-06 — Revenue reporting [#fr-sub-06--revenue-reporting] Admins shall see MRR, churn, upgrades, downgrades and plan distribution by role, plan, market and billing status. - Given last month, when the view opens, then MRR, churn and upgrade counts for that month show. ## FR-SUB-07 — Trials [#fr-sub-07--trials] A plan with a trial shall not charge until the trial ends. A trial-start notice goes on day 0 and reminders 3 days and 1 day before the end (D-231). No charge happens before an application is approved (D-77). - Given a 14-day trial, when the account starts it, then no charge is made until day 15. ## FR-SUB-08 — Dunning [#fr-sub-08--dunning] Failed charges shall retry on days 1, 3, 5 and 7, with an email at each attempt (D-09). - Given a charge fails on day 0, when day 3 arrives, then the second retry runs and an email is sent. ## FR-SUB-09 — Limits after a downgrade [#fr-sub-09--limits-after-a-downgrade] Items above a lower limit shall keep working; no new items can be added until the count is under the limit (D-144). - Given 8 employees after a downgrade to Starter, when the owner invites another, then it is blocked, and the 8 keep access. ## FR-SUB-10 — Counter reset [#fr-sub-10--counter-reset] Monthly usage counters shall reset at 00:00 on the 1st of each month in the owner's time zone (D-218). - Given the 1st at 00:00 Cairo time, when the reset job runs, then the Egyptian organization's trip counter is zero. ## FR-SUB-11 — Plan service failure [#fr-sub-11--plan-service-failure] If the plan service is unavailable, actions that move money or consume a limit shall fail closed; read-only screens stay available (D-224). - Given the plan service is down, when an organization publishes a trip, then publishing is refused with a service-unavailable message. # TRIP — Trips (/ar/docs/srs/requirements/trip) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRIP-01 — Trip creation wizard [#fr-trip-01--trip-creation-wizard] The organization shall create a trip through a wizard: basics, schedule and route, vehicles, staffing, programs, seating, pricing and capacity, publishing. Publishing is blocked until required steps are complete. Drafts save automatically. - Given the vehicles step is incomplete, when the organization publishes, then publishing is blocked and the step is named. ## FR-TRIP-02 — Draft, public and targeted publishing [#fr-trip-02--draft-public-and-targeted-publishing] A trip shall be saved as a hidden draft, published publicly, or published to a target list of travelers. - Given a draft, when travelers search, then it is not shown. - Given a targeted trip, when a traveler not on the list browses, then it is not shown. ## FR-TRIP-03 — Multi-vehicle trips [#fr-trip-03--multi-vehicle-trips] A trip shall support several vehicles, each with one vehicle type, one driver and one moderator, up to the plan's vehicle limit. - Given a vehicle with no moderator, when Ready is requested, then it is refused and the vehicle is named. ## FR-TRIP-04 — Program changes until departure [#fr-trip-04--program-changes-until-departure] Programs shall be addable, editable and removable until the trip starts, subject to [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings). - Given the trip has started, when a program is added, then the request is refused. ## FR-TRIP-05 — Trip lifecycle [#fr-trip-05--trip-lifecycle] A trip shall move only through the transitions in section 7.1. A trip In Progress cannot be cancelled (D-25, [OD-22](/en/docs/brd/compliance#11-open-decisions)). - Given a Draft trip, when In Progress is requested, then the transition is refused. ## FR-TRIP-06 — Changes that affect confirmed bookings [#fr-trip-06--changes-that-affect-confirmed-bookings] A change to programs, seat mode, vehicles or times that would break a confirmed booking shall notify each affected traveler and offer remedies (keep with the change, switch option, or cancel with full refund) before it takes effect. The traveler has 7 days to choose; then the case goes to admin (D-148). Vehicle or driver changes are notified within 1 hour (D-186). - Given a confirmed booking includes a program being removed, when the change is confirmed, then the traveler is notified and offered remedies before the removal applies. ## FR-TRIP-07 — Active trip limit [#fr-trip-07--active-trip-limit] Trips created in the current cycle that reach Published through Completed count against the plan's monthly limit (D-143). Beyond the limit, publishing is blocked with an upgrade prompt. - Given a Starter organization with 5 counted trips this month, when it publishes a sixth, then it is blocked with an upgrade prompt. # TRK — Live tracking (/ar/docs/srs/requirements/trk) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRK-01 — Live vehicle location [#fr-trk-01--live-vehicle-location] Operations staff with trip access shall see each vehicle's live position, updated within 500 ms of arrival. - Given a new GPS point for vehicle 2, when the map is open, then vehicle 2 moves within 500 ms. ## FR-TRK-02 — Location collection [#fr-trk-02--location-collection] The driver app (or the moderator app as fallback) shall send a point every 5 to 10 seconds only while the trip is In Progress, batching up to 10 points per request and buffering up to 60 minutes offline (D-34, D-121). - Given the trip has not started, when the device is online, then no points are sent. ## FR-TRK-03 — Passenger vehicle view [#fr-trk-03--passenger-vehicle-view] Operations shall see which vehicle each checked-in passenger is in. - Given P checked in to vehicle 2 and not out, when operations looks up P, then vehicle 2 shows. ## FR-TRK-04 — Per-trip child tracking switch [#fr-trk-04--per-trip-child-tracking-switch] Parent live tracking shall be available only where the trip's child tracking switch is on ([FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility)). - Given the switch is off, when a parent opens the tracker, then no live position shows. ## FR-TRK-05 — Tracking data scope [#fr-trk-05--tracking-data-scope] Positions and passenger movement shall be visible only to the owning organization's staff with operations access, admins, and eligible linked parents. - Given another organization's user requests positions, when processed, then the response is not found. ## FR-TRK-06 — End of tracking [#fr-trk-06--end-of-tracking] When the trip is marked ended, collection shall stop and an end event go to linked parents and operations. - Given the trip is ended, when a new point arrives, then it is rejected. ## FR-TRK-07 — No live position for travelers [#fr-trk-07--no-live-position-for-travelers] Travelers shall never see a vehicle's live position or ETA; their trip-day view shows the vehicle, seat, check-in status and the schedule (D-317). - Given a traveler on an In Progress trip, when they open trip day, then no map position or distance is shown. # TRV — Traveler profile and history (/ar/docs/srs/requirements/trv) Traces to the [business requirements](/en/docs/brd/requirements). ## FR-TRV-01 — Profile and preferences [#fr-trv-01--profile-and-preferences] Travelers shall manage profile, language and notification preferences; a language change applies at once. - Given a switch to Arabic, when saved, then the interface and later notifications are in Arabic. ## FR-TRV-02 — Trip visibility and early access [#fr-trv-02--trip-visibility-and-early-access] Travelers shall see public trips and trips targeted to them. VIP travelers see trips during the early-access window before others [OPEN: window, D-146, [OD-09](/en/docs/brd/compliance#11-open-decisions)]. - Given an early-access window, when a Free traveler browses, then the trip is hidden until the window closes. ## FR-TRV-03 — History and receipts by plan [#fr-trv-03--history-and-receipts-by-plan] History and receipts shall follow the plan: basic (12 months, proposed) on Free, full on Explorer, full with export on VIP. - Given a Free traveler, when a receipt opens, then export is not offered. ## FR-TRV-04 — Program discounts [#fr-trv-04--program-discounts] Explorer travelers get 5 percent and VIP 10 percent off program prices; base trip prices are not discounted. - Given VIP and a program of 200 EGP, when the summary shows, then the line is 180 EGP. ## FR-TRV-05 — Plan changes [#fr-trv-05--plan-changes] Traveler upgrades take effect at once with proration; downgrades at cycle end. Plans are paid on the gateway's browser page, not by in-app purchase. - Given an Explorer downgrade mid-cycle, when saved, then benefits stay to cycle end. ## FR-TRV-06 — Supplier application keeps traveler access [#fr-trv-06--supplier-application-keeps-traveler-access] A traveler shall apply for a supplier role while keeping full traveler access, pending or after rejection. - Given a pending photographer application, when the traveler browses, then booking still works. ## FR-TRV-07 — Data copy and deletion [#fr-trv-07--data-copy-and-deletion] Travelers shall request a copy of their data (delivered within 30 days of verification, D-162) and account deletion ([FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period)). - Given a data-copy request, when saved, then it shows in the admin queue with a due date 30 days out. # State Machines (/ar/docs/srs/state-machines) Transitions not listed are refused. Guards marked (proposed) need product confirmation. ### 7.1 Trip lifecycle [#71-trip-lifecycle] States: Draft, Published, Negotiating, Ready, Filling Up, Sold Out, In Progress, Partially Completed, Completed, Post-Processing, Archived, Cancelled, Refunds Issued. | From | Event | Guard | To | |---|---|---|---| | (none) | Organization creates a trip | Active plan; market live | Draft | | Draft | Publish publicly or to targets | Wizard complete; active-trip limit not reached | Published | | Published | A platform deal is started | At least one slot staffed through a platform supplier | Negotiating | | Negotiating | Last platform deal finalized | Every vehicle has driver and moderator ([BRL-07](/en/docs/brd/requirements#7-business-rules)) | Ready | | Published | Last vehicle staffed with own staff | [BRL-07](/en/docs/brd/requirements#7-business-rules) | Ready | | Published, Negotiating or Ready | Reserved seats reach 80 percent of capacity | D-189 | Filling Up | | Filling Up | Every vehicle full | | Sold Out | | Sold Out | A seat is released | | Filling Up | | Filling Up | Reserved seats fall below 80 percent | (proposed) | Ready, or Published if not yet Ready | | Ready, Filling Up or Sold Out | First vehicle departs | Trip start time reached; trip is Ready ([BRL-07](/en/docs/brd/requirements#7-business-rules)) | In Progress | | In Progress | Cancellation requested | Not allowed (D-25); incident flow only | In Progress | | In Progress | Some vehicles ended | At least one ended, others running | Partially Completed | | In Progress or Partially Completed | Last vehicle ended | Every trip report submitted | Completed | | Completed | Settlement opens | Automatic | Post-Processing | | Post-Processing | Archive job | 30 days after Completed and settlement closed ([BRL-25](/en/docs/brd/requirements#7-business-rules)) | Archived | | Draft through Sold Out | Organization or admin cancels | Reason recorded; full refunds queued ([BRL-30](/en/docs/brd/requirements#7-business-rules)) | Cancelled | | Cancelled | All refunds confirmed | Every confirmed booking Refunded | Refunds Issued | | Refunds Issued | Archive job | 30 days later | Archived | ### 7.2 Booking [#72-booking] States: Cart, Seats Held, Payment Pending, Confirmed, Payment Failed, Checked In, Checked Out, Cancelled, Refund Pending, Refunded. | From | Event | Guard | To | |---|---|---|---| | (none) | Traveler starts a booking | Trip bookable; traveler not in deletion grace | Cart | | Cart | Seats selected or capacity reserved (company-assigned) | Seats free; hold starts; price locked | Seats Held | | Seats Held | Proceed to payment | Hold active; attempts under 3 | Payment Pending | | Seats Held | Hold expires | 15 minutes | Cart (cart kept, D-191) | | Payment Pending | Gateway success | Callback verified | Confirmed | | Payment Pending | Gateway failure | | Payment Failed | | Payment Pending | No answer in 30 s | | Payment Pending (checks at 1, 5, 10 min; admin at 15, D-30) | | Payment Pending (Fawry) | Voucher unpaid at 48 h | D-31 | Cart | | Payment Failed | Retry | Hold active; attempts under 3 (D-197) | Payment Pending | | Payment Failed | Hold expires | | Cart | | Confirmed | Moderator checks passenger in | Vehicle match | Checked In | | Checked In | Check-out at a stop or destination | | Checked Out | | Checked Out | Re-boards at a stop | Same vehicle (proposed) | Checked In | | Confirmed | Traveler cancels | Before departure; [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancelled | | Confirmed | Organization cancels trip | [BRL-30](/en/docs/brd/requirements#7-business-rules) | Cancelled | | Cancelled | Refund sent | Amount above zero | Refund Pending | | Cancelled | No refund due | Under 24 hours | Cancelled (final) | | Refund Pending | Gateway confirms | | Refunded | ### 7.3 Seat [#73-seat] States: Available, Held, Reserved, Checked In, Checked Out, Released. | From | Event | Guard | To | |---|---|---|---| | Available | Selected at checkout | Self-selection on, or staff assignment | Held | | Held | Payment succeeds | Booking Confirmed | Reserved | | Held | Hold or voucher expires | [BRL-08](/en/docs/brd/requirements#7-business-rules) | Available | | Reserved | Passenger checks in | Vehicle match | Checked In | | Checked In | Passenger checks out | | Checked Out | | Checked Out | Passenger re-boards | (proposed) | Checked In | | Reserved | Booking cancelled before departure | | Released | | Released | Seat re-offered | Trip still bookable | Available | ### 7.4 Deal [#74-deal] States: Proposed, Countered by Provider, Countered by Organization, Accepted by One Side, Finalized, Rejected. | From | Event | Guard | To | |---|---|---|---| | (none) | Organization or supplier proposes | Slot open; supplier available; plan allows | Proposed | | Proposed or Countered by Organization | Supplier counters | | Countered by Provider | | Proposed or Countered by Provider | Organization counters | | Countered by Organization | | Any open state | One party accepts current terms | | Accepted by One Side | | Accepted by One Side | Other party accepts | Terms unchanged | Finalized | | Accepted by One Side | Other party counters | First acceptance void | Countered by that party | | Any open state | Either party rejects | | Rejected (reason rejected) | | Any open state | 72 hours since last counter | [BRL-26](/en/docs/brd/requirements#7-business-rules) | Rejected (reason expired) | | Any open state | Supplier paused for lab test | [BRL-17](/en/docs/brd/requirements#7-business-rules) | Rejected (reason provider paused) | | Any open state | Trip cancelled | | Rejected (reason trip cancelled) | ### 7.5 Application [#75-application] States: Draft, Submitted, Pending Review, Changes Requested, Approved, Rejected, Appealed, Closed. | From | Event | Guard | To | |---|---|---|---| | Draft | Applicant submits | Contacts verified per role; required documents present | Submitted | | Submitted | Enters queue | Automatic | Pending Review | | Pending Review | Approve | | Approved (plan assigned, tenant or profile created) | | Pending Review | Request changes | Items and message recorded | Changes Requested | | Pending Review | Reject | Reason code recorded | Rejected | | Changes Requested | Resubmit | Within 14 days, or 21 with extension | Pending Review | | Changes Requested | No response by the due date | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Closed | | Rejected or Closed | Appeal | Within 14 days; one per rejection | Appealed | | Appealed | Appeal upheld | Within 5 working days | Approved | | Appealed | Appeal refused | | Rejected (final) | | Rejected or Closed | Re-apply | 30 days after decision | Submitted (new application) | ### 7.6 Subscription [#76-subscription] States: Trial, Active, Grace, Downgraded, Cancelling, Ended. | From | Event | Guard | To | |---|---|---|---| | (none) | Plan starts | Trial configured, or payment taken; application approved | Trial or Active | | Trial | Trial ends, payment succeeds | | Active | | Trial | Trial ends, payment fails | | Grace | | Active | Renewal fails | | Grace | | Grace | Payment succeeds | Retries on days 1, 3, 5, 7 | Active | | Grace | 7 days pass | [OD-29](/en/docs/brd/compliance#11-open-decisions) (current rule D-08) | Downgraded | | Grace | Owner cancels | No refund (D-223) | Ended | | Downgraded | Payment succeeds | | Active | | Active | Upgrade | Payment succeeds | Active (new plan at once) | | Active | Downgrade | Effective at period end | Active (downgrade scheduled) | | Active | Cancel | | Cancelling | | Cancelling | Period ends | | Ended | | Any | Admin override | Second admin; end date | Active on the override plan; reverts at end date | ### 7.7 Coupon [#77-coupon] States: Draft, Active, Paused, Expired, Exhausted, Revoked. | From | Event | Guard | To | |---|---|---|---| | (none) | Created | Scope valid; plan count not reached | Draft | | Draft | Activated or start time reached | | Active | | Active | Paused by creator | | Paused | | Paused | Resumed | Window still open | Active | | Active or Paused | End time passes | | Expired | | Active | Usage limit reached | | Exhausted | | Exhausted | A redemption is reversed | Window open | Active | | Draft, Active, Paused or Exhausted | Revoked by creator or admin | | Revoked | ### 7.8 Lab test [#78-lab-test] States: Requested, Pending, Result Uploaded, Passed, Failed, Missed. | From | Event | Guard | To | |---|---|---|---| | (none) | Admin requests | Approved driver | Requested | | Requested | Driver notified and paused | [BRL-17](/en/docs/brd/requirements#7-business-rules) | Pending (deadline 1 to 7 days, default 3) | | Pending | Result received from lab or uploaded | Before deadline | Result Uploaded | | Pending | Deadline passes | | Missed (driver suspended) | | Missed | Late result received | Reviewed within 2 working days | Result Uploaded | | Result Uploaded | Admin passes | | Passed (driver unpaused; early lift from suspension needs a second admin) | | Result Uploaded | Admin fails | | Failed (driver stays paused; second failure in 12 months closes the account) | | Missed | Suspension exceeds 30 days | [BRL-16](/en/docs/brd/requirements#7-business-rules) | Account closed | ### 7.9 Settlement [#79-settlement] States: Open, Awaiting Payouts, Disputed, Closed. | From | Event | Guard | To | |---|---|---|---| | (none) | Trip Completed | | Open (lines computed from the ledger) | | Open | Payout instructions created | | Awaiting Payouts | | Open or Awaiting Payouts | Dispute opened on the trip | | Disputed | | Disputed | Dispute closed | Adjustment lines posted | Awaiting Payouts | | Awaiting Payouts | Every line paid | No open dispute (D-174) | Closed | ### 7.10 Dispute [#710-dispute] States: Open, Information Requested, Under Review, Resolved, Closed. | From | Event | Guard | To | |---|---|---|---| | (none) | Party raises a dispute | Booking, payment or deal reference | Open | | Open | Admin acknowledges | Within 2 working days | Under Review | | Under Review | Admin requests information | | Information Requested | | Information Requested | Party responds | Within 5 working days | Under Review | | Under Review | Outcome recorded | Within 10 working days of opening | Resolved | | Resolved | No appeal within 7 days (proposed) | | Closed | # Traceability & Open Items (/ar/docs/srs/traceability) ## 10. Traceability matrix [#10-traceability-matrix] Generated from the Source line of each functional requirement in section 5 and the BR and BRL tables in [BRD](/en/docs/brd) v1.1. ### 10.1 Business requirements to functional requirements [#101-business-requirements-to-functional-requirements] | Business requirement | BRD priority | Phase | Functional requirements | |---|---|---|---| | [BR-AUTH-01](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) | | [BR-AUTH-02](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | | [BR-AUTH-04](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in), [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | | [BR-AUTH-05](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | | [BR-AUTH-06](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) | | [BR-AUTH-07](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P1 | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | | [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | M | P5 | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | | [BR-ONB-01](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 (organizations), P4 (suppliers) | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) | | [BR-ONB-02](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | | [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) | | [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | | [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | | [BR-ONB-06](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum), [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) | | [BR-ONB-07](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) | | [BR-ONB-08](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P4 | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | | [BR-ONB-09](/en/docs/brd/requirements#62-applications-and-approvals-onb) | M | P1 | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | | [BR-ORG-01](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) | | [BR-ORG-02](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets), [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan), [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope), [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) | | [BR-ORG-03](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P1 | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | | [BR-ORG-04](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P2 | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) | | [BR-ORG-05](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P3 | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | [BR-ORG-06](/en/docs/brd/requirements#63-organizations-and-employees-org) | S | P6 | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | | [BR-ORG-07](/en/docs/brd/requirements#63-organizations-and-employees-org) | M | P5 | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) | | [BR-ORG-08](/en/docs/brd/requirements#63-organizations-and-employees-org) | C | P6 | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) | | [BR-TRIP-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) | | [BR-TRIP-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing), [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | | [BR-TRIP-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) | | [BR-TRIP-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | | [BR-PRG-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models), [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) | | [BR-PRG-02](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types), [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) | | [BR-PRG-03](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary), [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P3 | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | | [BR-FLT-01](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt) | M | P2 | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry), [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) | | [BR-STF-01](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P3 | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | | [BR-STF-02](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) | | [BR-STF-03](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal), [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry), [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance), [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) | | [BR-STF-04](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | | [BR-STF-05](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P3 | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | | [BR-STF-06](/en/docs/brd/requirements#65-staffing-and-deals-stf) | M | P4 | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility), [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses), [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) | | [BR-SEAT-01](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default), [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | [BR-SEAT-02](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | | [BR-SEAT-03](/en/docs/brd/requirements#66-seats-seat) | S | P3 | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | | [BR-SEAT-04](/en/docs/brd/requirements#66-seats-seat) | M | P3 | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | | [BR-BKG-01](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) | | [BR-BKG-02](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff), [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | | [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | | [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | [BR-BKG-05](/en/docs/brd/requirements#67-booking-and-payment-bkg) | M | P2 | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | | [BR-CPN-01](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls), [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons), [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) | | [BR-CPN-02](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) | | [BR-CPN-03](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation), [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) | | [BR-CPN-04](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn) | M | P5 | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | | [BR-CHK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding), [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | | [BR-CHK-02](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) | | [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states), [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) | | [BR-CHK-04](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment), [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | | [BR-CHK-05](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | S | P3 | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting), [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) | | [BR-MOD-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P3 | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | | [BR-TRK-01](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | M | P6 | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy), [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) | | [BR-PAR-01](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope), [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions), [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | | [BR-PAR-02](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | | [BR-PAR-03](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking), [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) | | [BR-PAR-04](/en/docs/brd/requirements#610-parents-and-children-par) | M | P6 | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch), [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) | | [BR-MED-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | | [BR-MED-02](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan), [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links), [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) | | [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | S | P4 | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) | | [BR-MED-04](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) | | [BR-PHO-01](/en/docs/brd/requirements#611-media-and-photographers-med-pho) | M | P4 | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio), [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability), [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | | [BR-NTF-01](/en/docs/brd/requirements#612-notifications-ntf) | M | P1 | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications), [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications), [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | | [BR-NTF-02](/en/docs/brd/requirements#612-notifications-ntf) | M | P1 | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) | | [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf) | S | P3 | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | | [BR-SUB-01](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | | [BR-SUB-02](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan), [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan), [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge), [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | | [BR-SUB-03](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) | | [BR-SUB-04](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | | [BR-SUB-05](/en/docs/brd/requirements#613-plans-and-subscriptions-sub) | M | P5 | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) | | [BR-ACC-01](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) | | [BR-ACC-02](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit), [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) | | [BR-ACC-03](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P4 | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings), [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) | | [BR-ACC-04](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) | | [BR-ACC-05](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P2 | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger), [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports), [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) | | [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P4 | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | | [BR-ACC-07](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc) | M | P5 | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | [BR-ADM-01](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | | [BR-ADM-02](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) | | [BR-ADM-03](/en/docs/brd/requirements#615-platform-administration-adm) | M | P4 | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation), [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) | | [BR-ADM-04](/en/docs/brd/requirements#615-platform-administration-adm) | M | P3 | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | | [BR-ADM-05](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | | [BR-ADM-06](/en/docs/brd/requirements#615-platform-administration-adm) | M | P1 | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm) | M | P3 | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) | | [BR-MKT-01](/en/docs/brd/requirements#616-markets-mkt) | M | P2 | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration), [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | | [BR-MKT-02](/en/docs/brd/requirements#616-markets-mkt) | M | P2 | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | | [BR-MKT-03](/en/docs/brd/requirements#616-markets-mkt) | M | P5 | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) | | [BR-MKT-04](/en/docs/brd/requirements#616-markets-mkt) | S | P5 | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) | | [BR-ANL-01](/en/docs/brd/requirements#617-analytics-anl) | M | P6 | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) | | [BR-ANL-02](/en/docs/brd/requirements#617-analytics-anl) | S | P6 | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) | | [BR-ANL-03](/en/docs/brd/requirements#617-analytics-anl) | M | P6 | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) | | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl) | S | P6 | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) | | [BR-API-01](/en/docs/brd/requirements#617-analytics-anl) | C | P6 | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) | ### 10.2 Business rules to functional requirements [#102-business-rules-to-functional-requirements] | Business rule | Rule (shortened) | Functional requirements | |---|---|---| | [BRL-01](/en/docs/brd/requirements#7-business-rules) | Trip records are tenant-isolated. Only the owning organization's staff, the platform admin, and the people... | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation), [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope), [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | | [BRL-02](/en/docs/brd/requirements#7-business-rules) | Every non-traveler role must hold an active plan to use the app. A traveler can always use the app for free. | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) | | [BRL-03](/en/docs/brd/requirements#7-business-rules) | A coupon applies only inside its creator's scope: admin to any trip; organization to its own trips; driver... | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection), [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) | | [BRL-04](/en/docs/brd/requirements#7-business-rules) | A platform driver or photographer is assigned only after a finalized deal accepted by both parties. | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal), [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) | | [BRL-05](/en/docs/brd/requirements#7-business-rules) | An organization-owned driver or photographer is accepted on assignment and is never visible to other... | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) | | [BRL-06](/en/docs/brd/requirements#7-business-rules) | A rejected supplier or organization application can be re-submitted after 30 days. A closed application... | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) | | [BRL-07](/en/docs/brd/requirements#7-business-rules) | A trip cannot move to Ready until every vehicle has a driver and a moderator and every platform deal is... | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) | | [BRL-08](/en/docs/brd/requirements#7-business-rules) | A seat hold lasts 15 minutes and is released automatically when it expires. Exception: a Fawry cash... | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) | | [BRL-09](/en/docs/brd/requirements#7-business-rules) | A moderator can check a passenger in only to the vehicle assigned to that passenger on that trip. | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) | | [BRL-10](/en/docs/brd/requirements#7-business-rules) | Parents see data only for children linked to their own bookings. | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope), [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions), [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) | | [BRL-11](/en/docs/brd/requirements#7-business-rules) | A refund reverses the coupon redemption and frees the traveler's per-user limit. | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) | | [BRL-12](/en/docs/brd/requirements#7-business-rules) | Cancellation refund depends on time before departure: 80 percent at 48 hours or more, 50 percent from 24... | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) | | [BRL-13](/en/docs/brd/requirements#7-business-rules) | A plan upgrade takes effect at once with proration; a downgrade takes effect at the end of the cycle. | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) | | [BRL-14](/en/docs/brd/requirements#7-business-rules) | A failed renewal starts a 7-day grace period with features kept. | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | | [BRL-15](/en/docs/brd/requirements#7-business-rules) | Account deletion becomes permanent after a 30-day grace period. Trip records are kept 5 years after... | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) | | [BRL-16](/en/docs/brd/requirements#7-business-rules) | A lab test has a deadline of 3 days from request (admin may set 1 to 7 days, D-21). A missed deadline... | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) | | [BRL-17](/en/docs/brd/requirements#7-business-rules) | A driver whose lab test is requested is paused at once. Upcoming trips return to their organizers.... | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) | | [BRL-18](/en/docs/brd/requirements#7-business-rules) | Every financial event (booking, refund, coupon, subscription charge, payout, deal cost, commission,... | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit), [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger), [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) | | [BRL-19](/en/docs/brd/requirements#7-business-rules) | Every admin action and every permission change is written to an immutable audit log. | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) | | [BRL-20](/en/docs/brd/requirements#7-business-rules) | Verification codes expire after 5 minutes. After 5 wrong codes, verification pauses for 15 minutes. A... | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) | | [BRL-21](/en/docs/brd/requirements#7-business-rules) | Accounts lock for 15 minutes after 5 failed sign-in attempts (all roles, D-53). | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) | | [BRL-22](/en/docs/brd/requirements#7-business-rules) | Web sessions end after 12 hours of use. Drafts are kept. | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) | | [BRL-23](/en/docs/brd/requirements#7-business-rules) | Every registration form records the applicant's country. | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) | | [BRL-24](/en/docs/brd/requirements#7-business-rules) | A trip's programs, seat mode or vehicles cannot be changed in a way that breaks a confirmed booking until... | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | | [BRL-25](/en/docs/brd/requirements#7-business-rules) | A trip is archived 30 days after Completed, and only once its settlement is closed (D-26). | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) | | [BRL-26](/en/docs/brd/requirements#7-business-rules) | A deal offer expires 72 hours after the last counter-offer and the deal ends as Rejected with reason... | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) | | [BRL-27](/en/docs/brd/requirements#7-business-rules) | Market values (currency, payment methods, tax and invoicing rules, default time zone) follow the country:... | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form), [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) | | [BRL-28](/en/docs/brd/requirements#7-business-rules) | An invoice is B2B when the buyer gives a tax number, otherwise B2C (D-180). An issued invoice is never... | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | [BRL-29](/en/docs/brd/requirements#7-business-rules) | Travelers never see a vehicle's live position. Only operations staff of the owning organization, the... | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope), [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) | | [BRL-30](/en/docs/brd/requirements#7-business-rules) | When an organization cancels a trip, every confirmed booking is refunded in full and coupon redemptions... | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) | ## 11. Open items and conflicts [#11-open-items-and-conflicts] ### 11.1 Open items that still affect requirements [#111-open-items-that-still-affect-requirements] | Ref | Open item | Affects | Owner | |---|---|---|---| | [OD-05](/en/docs/brd/compliance#11-open-decisions) | Confirm child tracking eligibility ("and" as drafted) | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility), [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) | Product | | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Plan for moderators | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in); section 3.3 | Product | | [OD-07](/en/docs/brd/compliance#11-open-decisions) | Confirm refund table 80/50/0 and non-refundable fees | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | Operations | | [OD-08](/en/docs/brd/compliance#11-open-decisions) | Priority seat window length (D-316) | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) | Product | | [OD-09](/en/docs/brd/compliance#11-open-decisions) | VIP early-access window (D-146) | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | Product | | [OD-10](/en/docs/brd/compliance#11-open-decisions) | ZATCA e-invoicing scope | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties), [NFR-COM-07](/en/docs/srs/quality#810-compliance-nfr-com) | Finance | | [OD-11](/en/docs/brd/compliance#11-open-decisions) | Gulf payment methods and gateways | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Engineering | | [OD-14](/en/docs/brd/compliance#11-open-decisions) | Annual discount (placeholder 15 percent) | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) | Finance | | [OD-15](/en/docs/brd/compliance#11-open-decisions) | Commission rates (placeholder 10 percent) | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip), [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) | Finance | | [OD-16](/en/docs/brd/compliance#11-open-decisions) | Automated business registry check | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) | Operations | | [OD-18](/en/docs/brd/compliance#11-open-decisions) | CRM targets | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Product | | [OD-19](/en/docs/brd/compliance#11-open-decisions) | Organization plan covering own drivers and photographers; allowance per plan (D-97) | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) | Product | | [OD-25](/en/docs/brd/compliance#11-open-decisions) | Plan gate on enrollment report | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) | Product | | [OD-26](/en/docs/brd/compliance#11-open-decisions) | Plan prices per role and market | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Finance | | [OD-27](/en/docs/brd/compliance#11-open-decisions) | VAT rate per market | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) | Finance | | [OD-28](/en/docs/brd/compliance#11-open-decisions) | Trial lengths | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) | Finance | | [OD-29](/en/docs/brd/compliance#11-open-decisions) | What happens when grace ends (downgrade vs lockout) | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period); section 7.6 | Product | | [OD-30](/en/docs/brd/compliance#11-open-decisions) | Webhook endpoints per plan (D-65) | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | Product | | [OD-31](/en/docs/brd/compliance#11-open-decisions) | Deal fee when cancelled after assignment (D-278) | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) | Finance | | [OD-32](/en/docs/brd/compliance#11-open-decisions) | Changes-requested closure day when extension used | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested); section 7.5 | Product | | D-68 | Child-safety escalation contacts and procedure | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting), [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) | Operations | | D-216 | Coupon abuse thresholds | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) | Product | | D-314 | SRS and BRD approvers | Section 1 | Product | | BRD 8.2 | Legal review per market for lab tests; document and lab-result retention | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result); 6.4 | Legal | | [OD-04](/en/docs/brd/compliance#11-open-decisions) | Financial retention 7 years, pending legal review | 6.4 | Legal | | [NFR-[DAT-04](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat) | Hosting region against Egyptian residency rules | 3.4 | Engineering | | CON-05 | Confirm recommended stack (T-FND-01) | All | Engineering | | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Rate limits for drivers, photographers and parents | [NFR-SEC-13](/en/docs/srs/quality#82-security-nfr-sec) | Engineering | | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Test coverage target | [NFR-MNT-04](/en/docs/srs/quality#89-maintainability-nfr-mnt) | Engineering | | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Hot log search window | [NFR-OBS-06](/en/docs/srs/quality#86-observability-nfr-obs) | Engineering | | 3.4 | Supported browser and OS versions | 3.4 | Product | | 6.4 | Retention of notification delivery logs and rejected applications | 6.4 | Legal | | D-289 | Confirm the urgent notification list | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) | Product | | Proposed | Re-boarding after check-out at a stop | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops); 7.2, 7.3 | Operations | | Proposed | Traveler sign-in offers both password and code | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) | Product | | Proposed | Platform issues deal invoices on the supplier's behalf | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | Finance | | Proposed | Free-plan history depth 12 months | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) | Product | ### 11.2 Items closed in v1.1 [#112-items-closed-in-v11] | Item (v1.0 reference) | Resolution | Source | |---|---|---| | Traveler verification and uniqueness | Travelers verify one contact; suppliers and owners both | D-20 | | Appeal window | 14 days; 5 files; 5 working days; one per rejection | D-237 | | Negotiation expiry ([OD-13](/en/docs/brd/compliance#11-open-decisions)) | 72 hours after last counter; no round limit | D-14 | | Cart after hold expiry | Cart kept; seats re-checked; new hold if free | D-191 | | Payment attempts | 3 per hold | D-197 | | Definition of active trips | Created this cycle and Published through Completed | D-143 | | Coupon count basis | Active and paused | D-203 | | Total usage restored on refund | Yes, usage count decrements | Architecture 10.6 | | Webhook retry and alerts | 5 retries over 24 h, owner emailed, 7-day replay, no plan gate | D-62 to D-64 | | Invoice plan gate and numbering failure | All plans; retry 3 times then finance review | D-178, D-179 | | Settlement rules | Open on Completed; close when paid and no dispute | D-174 | | Payout schedule | Weekly, Monday 06:00 | D-28 | | Default tiers ([OD-21](/en/docs/brd/compliance#11-open-decisions)) | Organization Starter; suppliers Basic; plan chosen without charge | D-24, D-77, D-78 | | Admin roles and invite | Super admin, Operations, Finance; 72 h link | D-49, D-50 | | Moderator sign-in | Phone plus staff code valid to trip end plus 24 h, one device | D-107, D-108 | | Parent tracker surface | Section of the traveler app | D-124 | | Offline check-in scope | 1,000 events; retry every 30 s | D-117 | | Incident categories | Six categories | D-331 | | Dispute SLA and types | 2 / 10 working days; six types | D-32, D-254 | | Notification retries | 3 with exponential backoff | Architecture 13.2 | | Data copy response time | 30 days | D-162 | | Default organization time zone | Market main zone | D-282 | | Digits | Western digits | D-159 | | Maintenance windows | 01:00 to 03:00 Cairo, 4 h per month, 72 h notice | D-303 | | Paging | 20 default, 100 maximum | D-308 | | Deprecation notice | 90 days | Architecture 7.6 | | Capacity stages | Stage 1 values plus architecture stages | D-304; architecture 19.3 | | Backups and DR drills | As [NFR-BKP-03](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) and [NFR-BKP-04](/en/docs/srs/quality#811-backup-and-recovery-nfr-bkp) | Architecture 22 | | Alert tools | PagerDuty, Slack, email digest | Architecture 16.3 | | Lab deadline (C-05) | 3 days, admin 1 to 7, now in [BRL-16](/en/docs/brd/requirements#7-business-rules) | D-21 | | Retention of GPS, check-in, child history | 90 days, 1 year, 1 year | Architecture 18.4; D-45; D-135 | | Launch currencies | EGP in P2; SAR and AED in P5 | D-69, D-158 | ### 11.3 Source conflicts [#113-source-conflicts] | # | Conflict | Sources | Resolution in this SRS | |---|---|---|---| | C-01 | Own-driver plan: full BRD context says own drivers are not subject to plans; [BRL-02](/en/docs/brd/requirements#7-business-rules) says every non-traveler needs a plan. | BRD context section 9; [BRL-02](/en/docs/brd/requirements#7-business-rules) | Organization's plan covers them ([OD-19](/en/docs/brd/compliance#11-open-decisions), proposed). | | C-02 | Out-of-scope coupon: "silently reject" vs "clear error". | BRD context 3A, 3E | Generic "not applicable" message ([OD-20](/en/docs/brd/compliance#11-open-decisions)). Closed. | | C-03 | Traveler verification. | [BR-AUTH-03](/en/docs/brd/requirements#61-accounts-and-access-auth); flow 01 | D-20 applied. Closed. | | C-04 | Enrollment report plan gate. | [BR-PRG-04](/en/docs/brd/requirements#64-trips-programs-and-fleet-trip-prg-flt); flow 02 | No gate until [OD-25](/en/docs/brd/compliance#11-open-decisions). | | C-05 | Lab deadline missing from [BRL-16](/en/docs/brd/requirements#7-business-rules). | Auth rules; [BRL-16](/en/docs/brd/requirements#7-business-rules) | [BRL-16](/en/docs/brd/requirements#7-business-rules) updated. Closed. | | C-06 | Architecture not reviewed. | v1.0 | Reviewed. Closed. | | C-07 | User-flows 03 to 08 missing. | v1.0 | Written in v1.1. Closed. | | C-08 | After grace: register says downgrade and block new bookings (D-08); [BRL-02](/en/docs/brd/requirements#7-business-rules) implies lockout; design canvas shows lockout. | D-08; [BRL-02](/en/docs/brd/requirements#7-business-rules); canvas | Downgrade applied until [OD-29](/en/docs/brd/compliance#11-open-decisions) is decided. | | C-09 | Organization-cancelled trip refund: v1.0 used the traveler policy; D-150 says full refund. | SRS v1.0; D-150 | Full refund ([BRL-30](/en/docs/brd/requirements#7-business-rules)). Closed. | | C-10 | Check-in event retention: v1.0 kept 7 years as audit; register and architecture say 1 year. | SRS v1.0; D-45; architecture 18.4 | 1 year; admin actions stay 7 years in the audit log. Closed. | | C-11 | Filling Up trigger: v1.0 "first booking"; register 80 percent. | SRS v1.0; D-189 | 80 percent. Closed. | | C-12 | Lockout scope: [BRL-21](/en/docs/brd/requirements#7-business-rules) admin only; register all roles. | [BRL-21](/en/docs/brd/requirements#7-business-rules) v1.0; D-53 | All roles; [BRL-21](/en/docs/brd/requirements#7-business-rules) updated. Closed. | | C-13 | Design canvas is Saudi-first in SAR with ZATCA, HyperPay, monthly payouts, 72-hour free cancellation, 48-hour deal expiry, traveler live ETA, Face ID. | claude/design-value-conflicts.md | This SRS follows the decisions; the canvas must be relabeled as a P5 Saudi view or corrected before P2 build. | | C-14 | Photographer studio: architecture lists separate role apps; register makes the studio responsive web in phase 1. | Architecture 3.1; D-86 | Responsive web first; mobile studio follows. | # Admin Console (/ar/docs/user-flows/admin) Surface: admin.trips-enjoy.com, staff only. Roles: Super admin, Operations, Finance (D-49). ## Registration [#registration] There is no public registration. A Super admin invites a new admin by email with a role; the link is valid 72 hours (D-50). The new admin sets a password (12+ characters) and enrolls an authenticator before the console opens. ## Approval [#approval] The inviting Super admin is the approver. Role changes and removals are audited. ## Role permissions [#role-permissions] | Area | Super admin | Operations | Finance | |---|---|---|---| | Applications, appeals | Yes | Yes | View | | Accounts (suspend, reinstate, reset) | Yes | Yes | View | | Lab tests | Yes | Yes | No | | Disputes | Yes | Yes | Refund decisions | | Plans, prices, overrides | Yes | View | Yes | | Coupons, abuse flags | Yes | Yes | View | | Payouts, settlements, reconciliation | Yes | View | Yes | | Markets, templates, feature flags | Yes | Templates | Markets (tax, prices) | | Admin staff | Yes | No | No | | Audit log | Yes | View | View | ## Flows [#flows] ### UF-ADM-01. Sign in [#uf-adm-01-sign-in] Email and password, then the authenticator code. 5 failures lock the account for 15 minutes. Rules: [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout). ### UF-ADM-02. Review an application [#uf-adm-02-review-an-application] Actor: Operations or Super admin. Trigger: an application in the queue. Queue lists applications by type (organization, driver, photographer), age, overdue flag (over 2 working days), country. Detail shows all fields, documents (opened from restricted storage, each open audited), and checks to record: identity, documents valid, insurance at least 3 months (drivers), lab result within 30 days (drivers), portfolio of 8+ photos (photographers), registry check (organizations). Decision: - **Approve**: plan chosen or default assigned; organization tenant or supplier profile created; applicant notified. - **Request changes**: list items and a message in the applicant's language; 14-day due date. - **Reject**: reason code and message; applicant told about appeal (14 days) and re-apply (30 days). Rules: [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) to [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ```mermaid flowchart TD Q[Application in queue] --> T{Type} T -->|Organization| O{Documents and registry OK?} T -->|Driver| D{License, insurance 3+ months, lab result within 30 days, consent?} T -->|Photographer| P{Identity OK and 8+ portfolio photos?} O -->|Missing items| RC[Request changes: 14 days] D -->|Missing items| RC P -->|Missing items| RC O -->|Fails check| RJ[Reject with reason] D -->|Fails check| RJ P -->|Below quality bar| RJ O -->|Yes| AP[Approve: tenant on chosen plan or Starter] D -->|Yes| AP2[Approve: profile on chosen plan or Basic] P -->|Yes| AP2 RC --> W[Applicant resubmits] --> Q RJ --> AL[Appeal within 14 days or re-apply after 30 days] ``` ### UF-ADM-03. Decide an appeal [#uf-adm-03-decide-an-appeal] Appeal shows the original decision, the statement and up to 5 files. Uphold (application approved) or refuse (rejection final) within 5 working days. Rules: [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ### UF-ADM-04. Manage an account [#uf-adm-04-manage-an-account] Search by name, email, phone, booking reference or organization. Entity detail: roles, plan, status, bookings, deals, audit trail. Suspend with a reason code; reinstate; reset credentials; early lift of a safety suspension needs a second admin. Rules: [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement), [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration). ### UF-ADM-05. Privacy requests [#uf-adm-05-privacy-requests] Queue of data-copy and deletion requests with due dates; data copies delivered within 30 days; deletions show the grace end date. Rules: [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period). ### UF-ADM-06. Request and review a lab test [#uf-adm-06-request-and-review-a-lab-test] From a driver's profile, request a lab test: type (drug screen, medical fitness or both) and deadline (1 to 7 days, default 3). The driver is paused at once; open deals end; upcoming assignments return to organizers. Lab-test queue by state and deadline. Results from the partner lab or driver upload are reviewed: Passed (unpause) or Failed (stays paused; second failure in 12 months closes the account). Missed deadline suspends the driver; over 30 days closes the account. Rules: [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests), [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension). ### UF-ADM-07. Plans and overrides [#uf-adm-07-plans-and-overrides] Plan catalog per role: limits, features, trial length, prices per market and interval. Overrides: one admin requests with reason and end date; a second admin approves; the owner is emailed; the plan reverts at the end date. Rules: [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog), [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides). ### UF-ADM-08. Coupons and abuse [#uf-adm-08-coupons-and-abuse] Create platform coupons (optionally per market); revoke any coupon; review abuse flags within 2 working days (flags never block automatically). Rules: [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons), [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags). ### UF-ADM-09. Deal audit [#uf-adm-09-deal-audit] Deals list with filters; timeline of every offer; flag a deal with a reason, which can pause it. Rules: [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit). ### UF-ADM-10. Disputes [#uf-adm-10-disputes] Queue with type, age, acknowledgment due (2 working days) and resolution due (10 working days). Acknowledge, request information (answered within 5 working days), record outcome, issue a refund within or outside policy with a reason. Rules: [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy). ### UF-ADM-11. Finance operations [#uf-adm-11-finance-operations] Actor: Finance or Super admin. Platform financial view by market and month. Weekly payout run (Mondays 06:00): review, approve, submit; failed and held payouts listed with reasons. Settlements tracker: open, awaiting payouts, disputed, closed. Reconciliation exceptions (daily) and the 08:00 Cairo digest. Invoices in finance review (numbering failures). Rules: [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) to [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices). ### UF-ADM-12. Payment escalations [#uf-adm-12-payment-escalations] Payments pending over 15 minutes appear in a queue with gateway status checks; admin resolves by confirming or failing after checking with the gateway. Rules: [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending). ### UF-ADM-13. Configuration [#uf-adm-13-configuration] Markets (currency, methods, tax, time zone, commission, status), notification templates by category, channel and language, feature flags. Every change audited. Rules: [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration), [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates). ### UF-ADM-14. Trip oversight and audit log [#uf-adm-14-trip-oversight-and-audit-log] Trips across organizations with state filters; cancel only before In Progress. Audit log searchable by actor, action, target and date; read-only, kept 7 years. Rules: [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle), [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log). ### UF-ADM-15. Platform analytics and audit [#uf-adm-15-platform-analytics-and-audit] Actor: super admin or Operations. Trigger: opening analytics or the audit log. Opens platform analytics: bookings, revenue and funnel views across markets, with data no more than 5 minutes stale. Switches to the privacy view: aggregated figures only, no personal data, with the privacy note shown. Drills into supplier analytics for driver and photographer performance views. Exports a view; the export is ready within 15 minutes and expires after 7 days. Searches the audit log by actor, action and object for the accountability trail. Edge cases: exports queue behind large ranges (status visible until ready). Rules: [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics), [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics), [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export), [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics). ### UF-ADM-16. Out-of-policy refund [#uf-adm-16-out-of-policy-refund] Actor: admin with the finance role. Trigger: a refund the policy engine would not grant. Opens the booking or dispute and chooses an amount that differs from the policy computation. Records a reason code; the confirmation names the policy delta. Confirms; the refund is sent like any other and the ledger reversal carries the reason and an audit entry. Edge cases: refunds tied to a dispute follow the dispute's resolution state first. Rules: [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [BRL-19](/en/docs/brd/requirements#7-business-rules), [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds). # Driver App (/ar/docs/user-flows/driver) Surface: mobile app; the web is limited to documents and profile (D-86). Roles: platform driver, organization-owned driver. ## Registration: platform driver [#registration-platform-driver] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email and phone | Yes, both verified | D-20 | | Password | Yes | | | Country | Yes | Sets market and payout currency | | National ID | Yes | Restricted storage | | Driving license number and photo, expiry | Yes | | | Uses own vehicle? | Yes | If yes: plate, model, year, seat count, registration, insurance valid 3+ more months | | Service regions | Yes | | | Lab-test consent | Yes | Recorded with text version | | Initial lab result | Yes | Dated within the last 30 days | | Background-check consent | Where the market's legal review allows | | | Plan choice | No | Basic if none (D-78); no charge before approval | ## Registration: organization-owned driver [#registration-organization-owned-driver] Invited by an organization by SMS or email (valid 7 days). Fields: name, phone (verified), country, license. No admin approval; accepted on assignment. ## Approval: platform driver [#approval-platform-driver] Admin reviews identity, license, vehicle documents, insurance and lab result ([Admin Console](/en/docs/user-flows/admin), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application)). Approve, request changes or reject. On approval the driver lands on home with the plan, and appears in the platform driver pool. ## Flows [#flows] ### UF-DRV-01. Register and apply [#uf-drv-01-register-and-apply] Account step, verification of both contacts, details, vehicle, documents, lab consent and result, plan. Submit; status page shows Pending Review and the 2-working-day target. Changes requested: the status page lists items, due date, and an "ask for 7 more days" action (once). Rules: [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details), [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result). ### UF-DRV-02. Set availability and profile [#uf-drv-02-set-availability-and-profile] Mark available or unavailable dates and ranges (no weekly rules). Edit rates, regions, vehicle and documents; expiring documents trigger reminders. Rules: [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability). ### UF-DRV-03. Respond to a deal [#uf-drv-03-respond-to-a-deal] Offers inbox: new offers, counters, expiring soon (72 hours after the last counter). Offer detail: organization, trip, route, date, vehicle, pay before any action. Accept, counter with a new price and note, or reject. When both sides accept the same terms, the deal locks and the assignment appears in Trips. Edge cases: conflict with an existing assignment on the date (warning); plan's monthly booking limit reached on finalization (upgrade prompt). Rules: [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses), [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility). ```mermaid sequenceDiagram participant O as Organization participant S as Platform participant D as Driver O->>S: Propose price for vehicle S-->>D: Push: new offer (trip, route, date, pay) D->>S: Counter S-->>O: Counter received O->>S: Accept S-->>D: Organization accepted D->>S: Accept same terms S->>S: Finalize, assign, post deal cost S-->>O: Driver confirmed S-->>D: Assignment and itinerary ``` ### UF-DRV-04. Run an assigned vehicle [#uf-drv-04-run-an-assigned-vehicle] Trips list: upcoming assignments with organization, vehicle, pickup time. Pre-trip checklist; contact the moderator and operations. Start route: GPS shared every 5 to 10 seconds while the trip is In Progress, buffered up to 60 minutes offline. End of trip: route closes; location sharing stops. Rules: [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking). ### UF-DRV-05. Lab test requested [#uf-drv-05-lab-test-requested] Trigger: an admin requests a lab test. The app opens on the lab-test gate. Only four actions work: book the lab, upload the result, contact support, sign out. Book a slot at a partner lab (free); see the deadline countdown. The partner sends the result, or the driver uploads it. Passed: the app unlocks. Failed: stays paused for admin handling. Missed: suspended; closed after 30 days. Upcoming trips go back to their organizers; completed trips are paid, uncompleted ones held. Rules: [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) to [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension), [BRL-16](/en/docs/brd/requirements#7-business-rules), [BRL-17](/en/docs/brd/requirements#7-business-rules). ### UF-DRV-06. Earnings and payouts [#uf-drv-06-earnings-and-payouts] Earnings by trip, statements, weekly payouts on Mondays; commission shown as a ledger line without a printed rate until [OD-15](/en/docs/brd/compliance#11-open-decisions) is set; negative balances carried forward. Rules: [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts). ### UF-DRV-07. Coupons [#uf-drv-07-coupons] Create coupons that apply only to bookings where the driver is assigned, within the plan's count. Rules: [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan). ### UF-DRV-08. Plan [#uf-drv-08-plan] Current plan, monthly booking usage, visibility level, upgrade or downgrade through the browser gateway page. Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-DRV-09. Organization-owned driver home [#uf-drv-09-organization-owned-driver-home] Sees only that organization's trips and assignments; no offers inbox, no plan screen, no coupons. Rules: [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area), [BRL-05](/en/docs/brd/requirements#7-business-rules). ### UF-DRV-10. Support [#uf-drv-10-support] Contact support from any state, including the lab-test gate; tickets show status. Rules: [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause). # User Flows (/ar/docs/user-flows) # Trips Enjoy: User Flows [#trips-enjoy-user-flows] **Version** 1.0 **Date** 9 November 2026 **Traces to** [BRD](/en/docs/brd) v1.1, [SRS](/en/docs/srs) v1.1, [ERD](/en/docs/erd) v1.0 These files describe, for each app and role, how a person registers, how their access is approved, and what they can do once active. Each flow has a UF ID, the actor, the trigger, numbered steps, the rules that apply (BRL, FR), and edge cases. Screens are named by their SCR (web) or MSCR (mobile) IDs from the screen coverage audit where one exists. ## Flows by role [#flows-by-role] | Role | Registers via | Approved by | Plan needed | Lands on | |---|---|---|---|---| | Traveler | /register/traveler or the app | Nobody (active on verification) | No (Free default) | Trip browse | | Organization | /register/organization (web only) | Admin | Yes (Starter default) | Organization workspace | | Employee | Email invitation | Owner (permissions) | Organization's plan | Organization workspace | | Platform driver | /register/driver or the driver app | Admin | Yes (Basic default) | Driver home | | Platform photographer | /register/photographer or the studio | Admin | Yes (Basic default) | Studio home | | Organization-owned driver or photographer | SMS or email invitation | Organization (accepted on assignment) | Organization's plan ([OD-19](/en/docs/brd/compliance#11-open-decisions)) | Driver home or studio home, organization-scoped | | Moderator | Assignment by organization (phone) | Organization | [OD-06](/en/docs/brd/compliance#11-open-decisions) | Vehicle home | | Parent | Traveler account | Nobody; eligibility by plan | Explorer or VIP | Parent tracker | | Admin | Invitation by Super admin | Super admin | Staff | Admin home | ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Submitted : submit (contacts verified, documents present) Submitted --> PendingReview : enters admin queue PendingReview --> Approved : approve PendingReview --> ChangesRequested : request changes PendingReview --> Rejected : reject with reason ChangesRequested --> PendingReview : resubmit within 14 days (+7 extension) ChangesRequested --> Closed : no response Rejected --> Appealed : appeal within 14 days Closed --> Appealed : appeal within 14 days Appealed --> Approved : upheld Appealed --> Rejected : refused (final) Rejected --> Draft : re-apply after 30 days Closed --> Draft : re-apply after 30 days Approved --> [*] ``` - "Must verify" means a one-time code ([BRL-20](/en/docs/brd/requirements#7-business-rules)): 5-minute expiry, 5 wrong codes pause 15 minutes, resend after 45 to 60 seconds. - Every registration form records country ([BRL-23](/en/docs/brd/requirements#7-business-rules)); the country sets the market ([BRL-27](/en/docs/brd/requirements#7-business-rules)). - Every plan-limited action can end in the upgrade prompt ([UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt)). - Every list and screen exists in Arabic (right to left) and English. - Values marked (placeholder) or [OPEN] follow BRD section 11. # Moderator App (/ar/docs/user-flows/moderator) Surface: installable web app on phones. Role: vehicle moderator. ## Registration [#registration] No self-registration. The organization assigns a moderator to one vehicle on one trip with name and phone (D-107). The moderator receives an SMS link to install the app and a staff code. ## Approval [#approval] The assignment by the organization is the approval. Access lasts until 24 hours after the trip ends, on one device at a time (D-108). Replacing the moderator ends access at once. The moderator's plan rule is [OD-06](/en/docs/brd/compliance#11-open-decisions). ## Flows [#flows] ### UF-MOD-01. Install and first open [#uf-mod-01-install-and-first-open] Opens the SMS link; adds the app to the home screen. Permission primer: location (for check-in location and tracking fallback), camera (scanning), notifications. Opens to the vehicle view. Rules: [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app). ### UF-MOD-02. Sign in [#uf-mod-02-sign-in] Phone and staff code. Signing in on a second device ends the first session. No assignment, or an expired assignment, shows "no active vehicle". Rules: [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in). ### UF-MOD-03. Vehicle home and manifest [#uf-mod-03-vehicle-home-and-manifest] Vehicle label, trip, departure time, pickup point, driver contact, operations contact; manifest of passengers with seat and status (not boarded, on board, off vehicle); occupancy counter. Rules: [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy). ### UF-MOD-04. Check in a passenger [#uf-mod-04-check-in-a-passenger] Scan the passenger's boarding code, or search the manifest by name. Results: - **Checked in**: seat confirmed; event recorded with time and location where permitted. - **Wrong vehicle**: refused; shows "vehicle N" only. - **Not found or not confirmed**: refused; escalate to operations. - **Already on board**: duplicate ignored. - **Queued**: offline; will sync. Rules: [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) to [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BRL-09](/en/docs/brd/requirements#7-business-rules). ```mermaid flowchart TD S[Scan or search] --> V{Booking confirmed?} V -->|No| R1[Refuse, escalate to operations] V -->|Yes| M{Assigned to this vehicle?} M -->|No| R2[Refuse, show vehicle number only] M -->|Yes| A{Already on board?} A -->|Yes| R3[Ignore duplicate] A -->|No| C[Check in, lock seat] C --> N{Online?} N -->|Yes| U[Send now, parents and operations updated] N -->|No| Q[Queue with original time, retry every 30 s] ``` ### UF-MOD-05. Check out at a stop or destination [#uf-mod-05-check-out-at-a-stop-or-destination] Select the stop; check passengers out individually or all at once; a passenger checked out at a stop can re-board and be checked in again (proposed). Rules: [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops). ### UF-MOD-06. Offline queue [#uf-mod-06-offline-queue] Banner shows offline state and the number of queued events; warning at 800; maximum 1,000; events send in order with original times when the connection returns. Rules: [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue). ### UF-MOD-07. Report an incident [#uf-mod-07-report-an-incident] Category (safety, medical, vehicle fault, lost traveler, conduct, other), description, photo, location; operations sees it at once. Rules: [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting). ### UF-MOD-08. End-of-trip report and access end [#uf-mod-08-end-of-trip-report-and-access-end] Enter final headcount; if it differs from the checked-in count, a reason is required; add notes; submit (read-only after). Access ends 24 hours after the trip ends, or at once on replacement, with an "access ended" screen. Rules: [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock). # Organization Dashboard (/ar/docs/user-flows/organization) Surface: business.trips-enjoy.com (web only for registration; the dashboard is responsive). Roles: organization owner, employee. ## Registration [#registration] | Field | Required | Notes | |---|---|---| | Owner full name | Yes | Becomes the owner account | | Owner email and phone | Yes, both verified | D-20 | | Password | Yes | Second factor set up on first sign-in | | Country | Yes | Sets the organization's market, currency, tax rules and time zone | | Legal name and trade name | Yes | Arabic and English | | Commercial registration number | Yes | | | Tax number | Yes where the market requires it | | | Registration documents | Yes | Commercial registration, tax certificate; PDF, JPG or PNG up to 10 MB | | Business address and category | Yes | Category: school, corporate, religious, tourism, event, other | | Billing contact | Yes | Email for invoices | | Plan choice | No | Shown without charge; Starter if none (D-77, D-24) | ## Approval [#approval] Application enters the admin queue; the applicant sees "under review" with the 2-working-day target. Admin checks documents and registry details (manual in phase 1). Decision: approve (tenant created on the chosen plan or Starter, owner invited); request changes (14 days, reminder day 7, one 7-day extension); reject with reason (appeal within 14 days, re-apply after 30 days). Every decision notifies the owner in their language. ## Flows [#flows] ### UF-ORG-01. First sign-in and setup [#uf-org-01-first-sign-in-and-setup] Owner signs in with email and password; sets up an SMS or authenticator second factor. Setup checklist: profile and logo, time zone (defaults from market), invoice settings, first vehicle type, first vehicle, invite staff, onboard own drivers and photographers, payout bank details. Empty-state home shows the checklist and plan usage. Rules: [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in). ### UF-ORG-02. Switch organization [#uf-org-02-switch-organization] A staff member whose email is listed by several organizations sees the organization switcher. Choosing one changes the workspace; data from the other is never shown. Rules: [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations), [BRL-01](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-03. Invite and manage employees [#uf-org-03-invite-and-manage-employees] Invite by email with a permission template (Operations, Finance, Support, Manager) or custom permissions across trips, bookings, operations, accounting, coupons, employees, fleet, subscription, integrations, analytics. Link valid 7 days; on first sign-in the employee sets a password and second factor. Change permissions (history shows actor, time, before and after); suspend or remove (access ends at once). Edge case: the plan's employee limit is reached; the invite is blocked with an upgrade prompt. Rules: [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) to [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in). ### UF-ORG-04. Fleet [#uf-org-04-fleet] Vehicle types: name, seat grid, labeled seats, accessible and blocked seats; archive. Vehicles: plate, model, year, type, seats (must match), registration validity. Rules: [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types), [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry), [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types). ### UF-ORG-05. Own drivers and photographers [#uf-org-05-own-drivers-and-photographers] Invite by SMS or email (valid 7 days) with name, phone, country; license for drivers. They appear only in this organization's lists and are accepted on assignment. Removing one releases their future assignments and alerts operations. Rules: [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [BRL-05](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-06. Create a trip (wizard) [#uf-org-06-create-a-trip-wizard] **Basics**: title, description, category, cover image, language. **Schedule and route**: start and end, time zone, pickup points, stops, destination on a map. **Vehicles**: add vehicles up to the plan limit, each with a vehicle type and label. **Staffing**: per vehicle, driver (own, or platform through a deal on Growth and Enterprise) and moderator (with phone); trip photographer (own or platform). **Programs**: add programs with pricing model, price or tiers, type flags, capacity; up to the plan limit. **Seating**: company-assigned or self-select (Growth and Enterprise); priority window for Explorer and VIP. **Pricing and capacity**: base price in the market currency; child tracking switch (Growth and Enterprise). **Publish**: save draft, publish publicly, or publish to a target list. Edge cases: missing step blocks publishing and names the step; monthly active-trip limit reached; market not live. Rules: [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) to [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips), [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit), [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) to [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit), [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan). ```mermaid flowchart LR A["Draft"] --> B{"Publish how?"} B -- "public" --> C["Published"] B -- "target list" --> D["Targeted"] C --> E["Ready, or Negotiating when platform deals are needed"] D --> E E --> F["Filling Up, then Sold Out"] F --> G["In Progress at start time"] G --> H["Completed"] H --> I["Post-Processing"] I --> J["Archived 30 days after settlement closes"] ``` The full state machine, including cancellation and remedy paths, is the [trip lifecycle workflow](/en/docs/workflows/trip-lifecycle). ### UF-ORG-07. Hire a platform supplier (deal) [#uf-org-07-hire-a-platform-supplier-deal] Search platform drivers or photographers by date availability, region, rating badge and price. Propose a price for a vehicle or the trip; the supplier sees trip, route, date, vehicle and pay. Counter back and forth with no round limit; each offer expires 72 hours after the last counter. Accept: when both sides accept the same terms, the deal is finalized and the supplier assigned. Rejected or expired: the slot reopens for another supplier. Rules: [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan), [BRL-04](/en/docs/brd/requirements#7-business-rules), [BRL-26](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-08. Move a trip to Ready [#uf-org-08-move-a-trip-to-ready] Staffing board shows each vehicle's driver and moderator status and each open deal. Ready is refused with the list of gaps until every vehicle is staffed and every deal finalized. A staffing-gap email arrives 48 hours before departure; reassignment is allowed until 24 hours before. Rules: [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), [BRL-07](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-09. Manage bookings and seats [#uf-org-09-manage-bookings-and-seats] Bookings list with filters by state, vehicle and program; passenger roster. Booking detail: passengers, seats, programs, totals, payments, refunds, notes. Seat map in assign mode: drag passengers to seats; conflicts refused. Handle cancellation requests after the policy cut-off within 2 working days. Rules: [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment), [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund). ### UF-ORG-10. Change a trip after bookings [#uf-org-10-change-a-trip-after-bookings] Edit programs, vehicles, seat mode or times. If confirmed bookings are affected, the system lists them and requires sending remedy offers before saving. Travelers have 7 days to choose; unresolved cases go to admin. Rules: [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [BRL-24](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-11. Cancel a trip [#uf-org-11-cancel-a-trip] Cancel with a reason before the trip starts; the preview shows bookings and the full refund total. All confirmed bookings are cancelled and refunded in full; suppliers and travelers are notified. In Progress trips cannot be cancelled; the screen points to incident handling. Rules: [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), [BRL-30](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-12. Live operations [#uf-org-12-live-operations] Trip command view on departure day: vehicles on a map, occupancy per vehicle, check-ins as they happen, incidents in real time. Look up any passenger to see their vehicle and status. Review end-of-trip reports and add a note. Rules: [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view), [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock). ### UF-ORG-13. Coupons [#uf-org-13-coupons] Create, pause, resume and revoke coupons for own trips; per-coupon analytics with 7, 30 and 90-day presets; count limited by plan (active and paused). Rules: [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan). ### UF-ORG-14. Invoices [#uf-org-14-invoices] B2C invoices issue automatically on confirmation; B2B when the buyer gave a tax number. Issue a manual invoice for a group or corporate buyer. Corrections by credit note only. Rules: [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [BRL-28](/en/docs/brd/requirements#7-business-rules). ### UF-ORG-15. Accounting and settlements [#uf-org-15-accounting-and-settlements] Trip accounting: base revenue, program revenue, coupon impact, supplier costs, commission, gateway fees. Ledger browser with filters; exports by plan. Settlements: one per completed trip, with lines per party, status, and closure when paid and dispute-free. Rules: [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip), [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) to [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports). ### UF-ORG-16. Analytics [#uf-org-16-analytics] Trip, page, customer and provider analytics (Growth basic, Enterprise full), date presets and export. Rules: [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics), [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export). ### UF-ORG-17. CRM and webhooks [#uf-org-17-crm-and-webhooks] Connect a CRM; register webhook endpoints and choose events. See deliveries, failures and replay any delivery for 7 days; rotate the secret (old secret valid 24 hours). Rules: [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). ### UF-ORG-18. Plan and billing [#uf-org-18-plan-and-billing] Current plan, usage against limits, renewal date, invoices. Upgrade (at once, prorated) or downgrade (cycle end); cancel. Grace banner during failed renewals with retry dates. Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) to [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning). ### UF-ORG-19. Child-safety reports [#uf-org-19-child-safety-reports] Staff file a report about a child passenger; the case routes to the escalation contact; the list shows status. Rules: [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting). ### UF-ORG-20. Branding (Enterprise) [#uf-org-20-branding-enterprise] Logo and colors applied to public trip pages, emails and invoices. Rules: [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding). ### UF-ORG-21. Employee first sign-in [#uf-org-21-employee-first-sign-in] Actor: employee. Trigger: opening the invitation link within its 7-day life. Sets a password from the invitation email; the link dies after 7 days and the owner can resend. Enables a second factor (SMS or authenticator); organization staff enter it at every sign-in. Lands in the organization workspace with only the permissions the owner granted. Edge cases: expired link (owner resends); lost second factor (owner resets through support). Rules: [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited), [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods). ### UF-ORG-22. Coupon lifecycle [#uf-org-22-coupon-lifecycle] Actor: organization owner or employee with the coupon permission. Trigger: creating a campaign. Creates the coupon: type, stackability, window, usage limits, minimum spend; it activates at once or at the window start. Watches usage on the coupon list; pauses and resumes at any time. Revokes with a reason when the campaign ends; revoked codes fail with not found. Refunds reverse redemptions: usage counts fall back, and an Exhausted coupon returns to Active if its window is still open. Suspicious redemptions raise an abuse flag for admin review within 2 working days. Edge cases: exhaustion mid-checkout (the code fails cleanly at Summary); per-user limits freed by refunds. Rules: [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types), [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags). ### UF-ORG-23. Fleet mid-lifecycle [#uf-org-23-fleet-mid-lifecycle] Actor: organization owner or fleet manager. Trigger: changing the fleet while trips exist. Adds a vehicle with its type and label; the seat map derives from the vehicle type's rows and layout. Assigns vehicles to trips up to the per-trip limit; labels flow through to published trip pages and tickets. Removes a vehicle only when no future bookings depend on it; otherwise the removal names the blocking trips. Edge cases: seat mode changes on a trip with bookings follow the trip-change remedy rules. Rules: [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration), [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip), [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type), [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings), [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default). ### UF-ORG-24. Consume the public API [#uf-org-24-consume-the-public-api] Actor: organization developer. Trigger: integrating bookings, trips or webhooks with external systems. Creates an API key from organization settings; the key carries the organization's plan limits. Signs requests with the key; reads trips, bookings and availability through the public endpoints. Registers a webhook endpoint and verifies the signature; deliveries retry 5 times over 24 hours and remain replayable for 7 days. Rotates the signing secret with a 24-hour overlap so in-flight deliveries keep validating. Edge cases: secret rotation (old secret valid 24 hours); missed events (replay from the event log). Rules: [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) to [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity), [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks). # Parent Tracker (/ar/docs/user-flows/parent) Surface: a section of the traveler app (D-124). Role: parent or guardian (a traveler). ## Registration [#registration] A parent is a traveler ([Traveler App](/en/docs/user-flows/traveler), [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify)). No extra registration. Linking a child needs the booking reference, the child's name as on the booking, and a guardianship declaration recorded as consent. ## Eligibility (instead of approval) [#eligibility-instead-of-approval] | Condition | Required | |---|---| | Parent's plan | Explorer or VIP | | Organization's plan | Growth or Enterprise | | Trip setting | Child tracking switched on | | Live position | Only while the trip is In Progress | All three plan and setting conditions must hold ([OD-05](/en/docs/brd/compliance#11-open-decisions), proposed). The blocked screen says which one fails; only the parent-plan case offers an upgrade. ## Flows [#flows] ### UF-PAR-01. Link a child [#uf-par-01-link-a-child] Parent tracker, Add child. Enter booking reference and the child's name; confirm the guardianship declaration. Linked: the child appears with the trip. Refused: generic message (invalid reference, name mismatch, not a child passenger, or tracking off for the trip). Rules: [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child), [BRL-10](/en/docs/brd/requirements#7-business-rules). ```mermaid flowchart TD A[Add child] --> P{Parent on Explorer or VIP?} P -->|No| U[Upgrade prompt] P -->|Yes| B[Enter booking reference, child name, declaration] B --> V{Valid reference and name match?} V -->|No| E[Generic refusal] V -->|Yes| O{Organization Growth or Enterprise and trip switch on?} O -->|No| X[Tracking unavailable, no upgrade offered] O -->|Yes| L[Child linked] ``` ### UF-PAR-02. Child trip status [#uf-par-02-child-trip-status] For each linked child: trip, vehicle, seat, check-in status, programs, schedule; moderator contact. Rules: [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope). ### UF-PAR-03. Live map [#uf-par-03-live-map] While the trip is In Progress and eligible: the vehicle's position on a map, updated live; before start and after end, no position. Rules: [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility), [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch), [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking). ### UF-PAR-04. Notifications [#uf-par-04-notifications] Boarding confirmed, trip started, stop reached, trip ended; also "not boarded" when the vehicle departs without the child checked in (proposed). Rules: [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications). ### UF-PAR-05. Report a child-safety concern [#uf-par-05-report-a-child-safety-concern] Describe the concern; a case is created and routed to the escalation contact; status shown. Rules: [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting). ### UF-PAR-06. Link ends [#uf-par-06-link-ends] When the booking is cancelled or refunded, the child disappears from the tracker and live data stops. Child trip history is kept 1 year. Rules: [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking). # Photographer Studio (/ar/docs/user-flows/photographer) Surface: responsive web in phase 1, plus mobile (D-86). Roles: platform photographer, organization-owned photographer. ## Registration: platform photographer [#registration-platform-photographer] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email and phone | Yes, both verified | D-20 | | Password | Yes | | | Country | Yes | | | ID document | Yes | Restricted storage | | Portfolio | Yes, at least 8 photos | JPEG, PNG or HEIC, 25 MB each | | Bio, equipment, service regions | Yes | | | Rates | Yes | In the market currency | | Plan choice | No | Basic if none (D-78) | ## Registration: organization-owned photographer [#registration-organization-owned-photographer] Invited by an organization by SMS or email (valid 7 days): name, phone, country. No admin approval; accepted on assignment. ## Approval: platform photographer [#approval-platform-photographer] Admin checks identity and portfolio quality ([Admin Console](/en/docs/user-flows/admin), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application)). Approve, request changes or reject. On approval the photographer becomes discoverable by Growth and Enterprise organizations. Lab tests do not apply to photographers. ## Flows [#flows] ### UF-PHO-01. Register and apply [#uf-pho-01-register-and-apply] Account, verification, profile, portfolio upload (minimum 8), rates, plan; submit; status page as in [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply). Rules: [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum). ### UF-PHO-02. Portfolio, profile and availability [#uf-pho-02-portfolio-profile-and-availability] Manage portfolio within the plan allowance (10, 50, unlimited); visibility and badge follow the plan; mark available and unavailable dates and ranges. Rules: [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio), [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability), [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge). ### UF-PHO-03. Respond to a deal [#uf-pho-03-respond-to-a-deal] Same negotiation as drivers ([Driver App](/en/docs/user-flows/driver), [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal)), for a whole trip rather than a vehicle. Deals for unavailable dates are refused. Rules: [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) to [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection), [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks). ### UF-PHO-04. Assigned trip brief [#uf-pho-04-assigned-trip-brief] Trip, dates, route and stops, organization contact, programs to cover, expected album delivery window (14 days after completion). Rules: [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window). ### UF-PHO-05. Create and upload an album [#uf-pho-05-create-and-upload-an-album] After the trip is Completed, create an album (within 14 days; count per plan). Upload in batches directly to storage; interrupted batches resume. Processing makes thumbnail, medium, large and watermarked copies; EXIF is stripped. Rules: [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan). ```mermaid flowchart LR A[Trip Completed] --> B[Create album] B --> C[Batch upload, resumable] C --> D[Processing: variants, watermark if on] D --> E{Privacy by plan} E -->|Basic and up| F[Public to trip participants] E -->|Studio and Pro| G[Shared link, revocable] E -->|Pro| H[Selected users] F & G & H --> I[Publish and notify eligible travelers] ``` ### UF-PHO-06. Privacy and sharing [#uf-pho-06-privacy-and-sharing] Choose the privacy mode the plan allows. Shared link: generate, copy, revoke (a revoked link returns not found). Selected users: pick travelers from the trip roster. Downloads: public albums give the watermarked or medium copy; other modes are view only. Rules: [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) to [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access), [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download). ### UF-PHO-07. Watermark [#uf-pho-07-watermark] Studio and Pro: turn on; fixed placement bottom right, inset 3 percent, 30 percent opacity; preview before publishing. Basic: locked with an upgrade prompt. Rules: [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking). ### UF-PHO-08. Earnings, coupons and plan [#uf-pho-08-earnings-coupons-and-plan] Earnings and weekly payouts; coupons for own bookings; plan usage (bookings per month, portfolio, albums) and changes. Rules: [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) to [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-PHO-09. Organization-owned photographer [#uf-pho-09-organization-owned-photographer] Sees only that organization's trips; uploads albums for them; no marketplace, plan or coupons. Rules: [BRL-05](/en/docs/brd/requirements#7-business-rules). # Shared Flows (/ar/docs/user-flows/shared) Flows used on every surface. ### UF-SHR-01. Sign up chooser [#uf-shr-01-sign-up-chooser] /register shows Traveler, Driver, Photographer and Organization. Each opens its own form; Organization is web only (the app hands off to the browser). Rules: [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths). ### UF-SHR-02. One-time code [#uf-shr-02-one-time-code] Code by SMS, WhatsApp or email; 6 digits; expires in 5 minutes; resend after a 45 to 60 second countdown; 5 wrong codes pause 15 minutes; resend does not reset the count; after 3 failed deliveries the other channel is offered. Rules: [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code), [BRL-20](/en/docs/brd/requirements#7-business-rules). ### UF-SHR-03. Sign in [#uf-shr-03-sign-in] | Role | Method | |---|---| | Traveler, driver, photographer | Password, or one-time code | | Organization staff | Password, then SMS or authenticator code every time | | Admin | Password, then authenticator code | | Moderator | Phone and staff code | 5 failed attempts lock the account 15 minutes. Web sessions end after 12 hours; drafts are kept. Rules: [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens). ### UF-SHR-04. Password reset [#uf-shr-04-password-reset] Request by email or phone; code or link; new password (12+ characters, breached check); all other sessions end. ### UF-SHR-05. Role and organization switcher [#uf-shr-05-role-and-organization-switcher] Account menu lists held roles (traveler, driver, photographer, staff) and, for staff, organizations that list the user's email. Switching changes the workspace; data from other roles and organizations is never mixed. Rules: [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts), [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations). ### UF-SHR-06. Plan-limit prompt [#uf-shr-06-plan-limit-prompt] When a limit or feature blocks an action: what was blocked, current usage and limit, the next plan that allows it, and Upgrade. If the plan service is down, a "try again shortly" message instead (fail closed). Rules: [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure). ### UF-SHR-07. Grace banner [#uf-shr-07-grace-banner] After a failed renewal: banner with retry dates and Update payment; features stay for 7 days; then the rule in [OD-29](/en/docs/brd/compliance#11-open-decisions) applies. Rules: [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning). ### UF-SHR-08. Application status, changes, appeal [#uf-shr-08-application-status-changes-appeal] Status page for any application: state, due dates, requested items, extension request (once), appeal form (14 days, statement, up to 5 files), re-apply date. Rules: [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application). ### UF-SHR-09. Account deletion [#uf-shr-09-account-deletion] Request in privacy settings; confirm by code; see what happens (future bookings cancelled and refunded, earnings paid on the next payout date, trip records kept 5 years). Grace period 30 days: no bookings or payments; signing in shows "restore account". Day 31: permanent. Organization owners cannot request it while a trip is In Progress. Rules: [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [BRL-15](/en/docs/brd/requirements#7-business-rules). ### UF-SHR-10. Suspended account [#uf-shr-10-suspended-account] Sign-in shows the suspension message and a support contact; no data is shown. Rules: [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement). ### UF-SHR-11. Notification centre [#uf-shr-11-notification-centre] In-app list of notifications by category with unread state; tapping opens the target, or a fallback if the target no longer exists. Rules: [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference). ### UF-SHR-12. Errors and service states [#uf-shr-12-errors-and-service-states] | State | Shown when | Message intent | |---|---|---| | 401 | Session ended | Sign in again; return to the same place | | 403 | Missing permission | You do not have access; ask your organization owner | | 404 | Not found or another tenant's data | Not found | | 402 | Plan required | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt) | | 429 | Rate limited | Try again in N seconds | | 500 | Server error | Something went wrong; reference ID | | 503 | Dependency down | Service temporarily unavailable | | Maintenance | Planned window | 01:00 to 03:00 Cairo, announced 72 hours ahead | | Offline | No connection | Banner; queued actions where supported | | Update required | App below supported version | Update to continue | ### UF-SHR-13. Language and layout [#uf-shr-13-language-and-layout] Language switch on every screen; Arabic mirrors the layout; Western digits in both languages; amounts with currency code. Rules: UI-01, UI-02, NFR-I18N-04. ### UF-SHR-14. Confirmation step [#uf-shr-14-confirmation-step] Destructive or money-moving actions (cancel, refund, revoke, suspend, publish, finalize deal) use a confirmation that names the effect, for example "Cancel trip: 40 bookings will be refunded in full, 12,400 EGP". Rules: UI-08. ### UF-SHR-15. Notification delivery and quiet hours [#uf-shr-15-notification-delivery-and-quiet-hours] Actor: any user. Trigger: an event that maps to a notification they receive. One message per enabled channel per event — duplicates are collapsed by the event key. Non-urgent SMS and push wait for 07:00 recipient-local when they fall between 22:00 and 07:00; security messages never wait. Trip-day events older than 2 hours are dropped instead of delivered late. A failed channel retries 3 times with exponential backoff; the delivery record shows each attempt in the notification centre. Edge cases: urgent list (D-289) bypasses quiet hours; language follows the recipient with RTL layout. Rules: [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery). ### UF-SHR-16. Trial to paid [#uf-shr-16-trial-to-paid] Actor: any supplier or organization owner. Trigger: an approved application with a trial plan. The trial starts without a charge; a notice arrives on day 0. Reminders arrive 3 days and 1 day before the trial ends. At the end the first charge runs; if it fails, retries follow on days 1, 3, 5 and 7 with an email each time. Still unpaid after 7 days of grace, the plan leaves Active — what happens next follows the open decision on post-grace behavior. Edge cases: trial lengths remain open in the register; cancelling during grace ends the plan at once with no refund. Rules: [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials), [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning). # Traveler App (/ar/docs/user-flows/traveler) Surfaces: responsive web (trips-enjoy.com) and mobile apps. Roles: visitor, traveler. Parent features are in [Parent Tracker](/en/docs/user-flows/parent). ## Registration [#registration] | Field | Required | Notes | |---|---|---| | Full name | Yes | | | Email | One of email or phone | Must verify the one given (D-20) | | Phone | One of email or phone | E.164; must verify if given | | Password | Yes, unless the traveler chooses code-only sign-in | 12+ characters, breached-password check | | Country | Yes | Sets the account's market ([BRL-23](/en/docs/brd/requirements#7-business-rules), [BRL-27](/en/docs/brd/requirements#7-business-rules)) | | Language | Yes | Arabic or English; defaults from the device | | Terms and privacy consent | Yes | Recorded with text version | | Marketing consent | No | Separate from transactional messages | ## Approval [#approval] None. The account is active on verification, on the Free plan. ## Flows [#flows] ### UF-TRV-01. Browse as a visitor [#uf-trv-01-browse-as-a-visitor] Actor: visitor. Trigger: opens the site or app. Home shows featured and upcoming public trips from live markets, with search by destination, date, organization, price and category. Visitor opens a trip: description, organization, dates, route and stops, vehicles, programs with prices, base price in the trip's currency, seat mode, policy summary. Book Now asks the visitor to sign up or sign in, then returns to the same trip. Rules: [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) (drafts and targeted trips hidden), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) (VIP early access hidden), [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing). ### UF-TRV-02. Register and verify [#uf-trv-02-register-and-verify] Actor: visitor. Trigger: Sign up as traveler. Fills the registration form above. Receives a code by SMS, WhatsApp or email; enters it. Lands on a short onboarding: profile photo (optional), notification preferences, plan choice (Free selected; Explorer and VIP offered). Returns to the trip they were viewing, or to home. Edge cases: code expired (resend after countdown); 5 wrong codes (paused 15 minutes); 3 failed deliveries (offer the other channel); email or phone already registered (offer sign-in and password reset). Rules: [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) to [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code). ### UF-TRV-03. Book a trip [#uf-trv-03-book-a-trip] Actor: traveler. Trigger: Book Now on a published trip. **Travelers**: number of passengers; name per passenger; child flag where a passenger is a minor. **Programs**: pre-required programs are added and locked; optional ones can be added by toggle, quantity, or tier; VIP-only programs are locked for Free and Explorer with an upgrade prompt; full programs show unavailable. The summary updates live with the plan discount on programs (5 or 10 percent). **Seats**: if self-selection is on, a live seat map of the assigned vehicle; picking a seat holds it for 15 minutes with a visible countdown. During the priority window, Free travelers see the map read-only. If company-assigned, the step shows "seat assigned later". **Summary**: base, programs, discounts, coupon field, optional tax number for a B2B invoice, total with currency code. The price is locked from the start of the hold. **Payment**: methods of the trip's market; the gateway page or SDK opens; no card fields on the platform. **Result**: Confirmed (ticket with booking reference and boarding code, receipt, invoice), Pending (confirming payment), or Failed (retry). Edge cases: hold expires during payment (cart kept, seats re-checked, new hold if free); third failed attempt (stays Payment Failed until the hold ends); Fawry voucher (seats held 48 hours, voucher code shown, reminder before expiry); trip sells out while in cart (seat step shows unavailable, other vehicles offered). Rules: [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) to [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) to [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) to [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types), [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary). ```mermaid flowchart TD A["Cart"] --> B["Seats held 15 min, price locked"] B --> C{"Payment outcome"} C -- confirmed --> D["Confirmed, ticket issued"] C -- "no answer in 30 s" --> E["Payment Pending: polls at 1, 5, 10 min, admin at 15"] E -- "gateway confirms" --> D C -- failed --> F["Payment Failed, retry"] F -- "under 3 attempts" --> C F -- "third failure" --> G["Stays Payment Failed until the hold ends"] B -- "hold expires" --> H["Cart kept, seats re-checked, new hold if free"] C -- "Fawry voucher" --> I["Voucher code, seats held 48 h, reminder before expiry"] I -- "paid within 48 h" --> D I -- "unpaid at 48 h" --> H ``` The engine view of this pipeline, including callback idempotency and escalation, is the [booking and payment workflow](/en/docs/workflows/booking-payment). ### UF-TRV-04. Apply a coupon [#uf-trv-04-apply-a-coupon] Enters a code at Summary. Valid: discount line appears and the total updates. Invalid: the first failing reason (not found, paused, expired, not applicable to this booking, exhausted, already used, minimum spend not met). A second non-stackable coupon is refused; the first stays. Rules: [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection), [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation). ### UF-TRV-05. Manage bookings [#uf-trv-05-manage-bookings] My Bookings lists upcoming, past and cancelled bookings with state. Booking detail: trip, passengers, seats, programs, totals, payment status, policy, ticket, receipt, invoice, and actions allowed by state. Receipts and invoices list; export on VIP. Rules: [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices), [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan). ### UF-TRV-06. Cancel a booking [#uf-trv-06-cancel-a-booking] From booking detail, Cancel shows the refund preview from the policy (placeholder: 80 percent at 48 hours or more, 50 percent from 24 to under 48, none under 24) and the coupon effect. Confirms. The booking moves to Cancelled, then Refund Pending until the gateway confirms ("refund in progress"), then Refunded. After the cut-off, the traveler can send a request to the organization instead (decided within 2 working days, then admin). Edge cases: after departure or check-in, cancel is replaced by Open a dispute. Rules: [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [BRL-11](/en/docs/brd/requirements#7-business-rules), [BRL-12](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-07. Choose a remedy after a trip change [#uf-trv-07-choose-a-remedy-after-a-trip-change] Trigger: the organization changes a program, seat mode, vehicle or time that affects the booking. Notification and banner on the booking with the change. Options: accept the change, switch option (another program or vehicle where offered), or cancel with a full refund. Choice within 7 days; otherwise the case goes to admin. Rules: [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), [BRL-24](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-08. Trip day [#uf-trv-08-trip-day] Ticket with boarding code, vehicle label, seat (when assigned), pickup point and time, moderator contact, check-in status. After check-in: status "on board"; programs and schedule. No live vehicle position or ETA is shown to travelers. Rules: [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [BRL-29](/en/docs/brd/requirements#7-business-rules). ### UF-TRV-09. Albums [#uf-trv-09-albums] Trip history lists completed trips; each shows albums the traveler may see. Public albums: view; download the watermarked or medium copy. Shared-link and selected-user albums: view only. A shared link opened while signed out asks the traveler to sign in. Rules: [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access), [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download). ### UF-TRV-10. Change plan [#uf-trv-10-change-plan] Plans page compares Free, Explorer and VIP with prices in the account's market currency. Upgrade opens the gateway page in the browser; benefits apply at once with proration. Downgrade is scheduled for the cycle end and can be cancelled. Rules: [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation). ### UF-TRV-11. Apply for a supplier role [#uf-trv-11-apply-for-a-supplier-role] Account menu shows Become a driver, Become a photographer, Register an organization. Driver: handoff to the driver app. Photographer: handoff to the studio. Organization: handoff to the web form (web only). While pending or after rejection, traveler access is unchanged. Rules: [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access), [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts). ### UF-TRV-12. Profile, language and notifications [#uf-trv-12-profile-language-and-notifications] Edit name, photo, contacts (re-verify on change), language, and per-category channels. Security messages cannot be turned off. Rules: [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences), [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference). ### UF-TRV-13. Privacy requests [#uf-trv-13-privacy-requests] Request a data copy: verified by code, delivered within 30 days as a download link. Request deletion: see [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion). Rules: [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period). ### UF-TRV-14. Open a dispute [#uf-trv-14-open-a-dispute] From a booking: choose type (booking, payment, refund, organization conduct, other), describe, attach up to 5 files. Track status: Open, Information Requested, Under Review, Resolved, Closed. Rules: [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling). ### UF-TRV-15. Payment outcome and pending resolution [#uf-trv-15-payment-outcome-and-pending-resolution] Actor: traveler. Trigger: payment submitted, result not immediate. The gateway page or SDK opens; no card fields ever appear on the platform. While the gateway is silent, the booking shows Confirming payment: the system polls at 1, 5 and 10 minutes and the seats stay held. Confirmed: the ticket, receipt and invoice appear at once. Failed: retry is offered while attempts remain under three for this hold. After the third failure the booking stays Payment Failed until the hold ends; a support contact is offered when the case escalates to admin at 15 minutes. Edge cases: hold expires during payment (cart kept, seats re-checked, new hold only if free); Fawry voucher unpaid at 48 hours returns the booking to the cart with the seats released. Rules: [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart). ### UF-TRV-16. Life after a downgrade [#uf-trv-16-life-after-a-downgrade] Actor: traveler. Trigger: the billing cycle ends on a downgraded plan. Everything already booked keeps working: over-limit items created before the downgrade continue to be available. The next action beyond the new limit is refused by the server-side gate, which names the category, the current plan, the limit and the next tier. The upgrade prompt offers the next tier; counters reset on the 1st of the month at 00:00 in the owner's time zone. Edge cases: grace-period rules apply before the downgrade takes effect; see the subscriptions workflow. Rules: [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates). ## Booking states seen by the traveler [#booking-states-seen-by-the-traveler] | State | Label shown | |---|---| | Seats Held | Seats held, time left mm:ss | | Payment Pending | Confirming payment | | Payment Failed | Payment did not go through, retry | | Confirmed | Confirmed | | Checked In / Checked Out | On board / Off vehicle | | Cancelled | Cancelled | | Refund Pending | Refund in progress | | Refunded | Refunded | # Applications (/ar/docs/workflows/applications) Every organization, platform driver and platform photographer goes through one application workflow before they can act on the platform ([BRL-02](/en/docs/brd/requirements#7-business-rules)). This page is the engine view of state machine 7.5; the human side is [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application). **Delivery phase:** P1 Foundation (organizations), P4 Marketplace supply (drivers and photographers). ## Trigger and actors [#trigger-and-actors] - **Trigger:** an applicant submits a Draft application (contacts verified, documents present). - **Actors:** the applicant; the admin reviewer; the daily closure job; the system (plan assignment, tenant creation, notifications). ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Submitted : submit (contacts verified, documents present) Submitted --> PendingReview : enters admin queue PendingReview --> Approved : approve PendingReview --> ChangesRequested : request changes PendingReview --> Rejected : reject with reason ChangesRequested --> PendingReview : resubmit within 14 days, or 21 with extension ChangesRequested --> Closed : daily job, no response Rejected --> Appealed : appeal within 14 days Closed --> Appealed : appeal within 14 days Appealed --> Approved : decided within 5 working days, upheld Appealed --> Rejected : refused, final Rejected --> Draft : re-apply 30 days after decision Closed --> Draft : re-apply 30 days after decision Approved --> [*] : plan assigned, tenant or profile created ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Review queue flag | "more than 2 working days" pending flags the application; median decision target is 2 working days | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target), [BR-ONB-03](/en/docs/brd/requirements#62-applications-and-approvals-onb) | | Changes-requested window | "14 days to respond, with a reminder on day 7 and one 7-day extension on request" | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [BR-ONB-04](/en/docs/brd/requirements#62-applications-and-approvals-onb), D-235 | | Closure job | The daily job closes unanswered changes; the closure day when the extension is used is [OPEN: [OD-32](/en/docs/brd/compliance#11-open-decisions)] | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [OD-32](/en/docs/brd/compliance#11-open-decisions) | | Appeal window | "within 14 days of the notice", one appeal per rejection, decided "within 5 working days" | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BR-ONB-05](/en/docs/brd/requirements#62-applications-and-approvals-onb), [BRL-06](/en/docs/brd/requirements#7-business-rules), D-237 | | Re-apply cooldown | "30 days after rejection; a closed application counts as rejected" | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules) | | On approval | Plan assigned and tenant or profile created automatically; supplier actions stay refused until then | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access), [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval), D-24, D-77 | | Notifications | Every state change notifies the applicant in their language on at least one enabled channel | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) | | Freshness gates at submission | Driver lab results "dated within the last 30 days"; insurance "valid for at least 3 more months" | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details), [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) | ## Stories [#stories] - **As an applicant**, I want my pending review flagged when it slips past two working days, so that the platform's own SLA works in my favor. *([FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target))* - **As an admin reviewer**, I want unanswered change requests to close themselves after the window, so that the queue only holds live cases. *([FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested))* - **As a rejected applicant**, I want one appeal decided within five working days, so that a mistake does not cost me a month. *([FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules))* - **As an approved organization**, I want my plan and tenant created the moment I am approved, so that I can start work without a second wait. *([FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval))* # Booking & Payment (/ar/docs/workflows/booking-payment) The booking pipeline is the platform's most timer-dense workflow: a 15-minute seat hold with a price lock, a three-attempt payment cap, a 48-hour Fawry voucher lane, and a gateway poll schedule that escalates to admin. This is the engine view of state machines 7.2 (Booking) and 7.3 (Seat); the traveler side is [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip). **Delivery phase:** P2 Single-vehicle pilot (Egypt). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a traveler picks a seat (self-selection) or confirms passengers (company-assigned). - **Actors:** the traveler; the gateway; the payment callback relay; the admin escalation queue. ## Diagram [#diagram] ```mermaid sequenceDiagram participant T as Traveler participant S as Seat service participant G as Gateway participant A as Admin queue T->>S: Pick seat S-->>T: Held 15 min, price locked (D-191, D-192) T->>G: Pay (attempt 1 of max 3, D-197) alt Gateway answers within 30 s G-->>S: Callback (idempotent, FR-PAY-02) S-->>T: Confirmed, ledger posts (FR-PAY-01) else No answer in 30 s S->>G: Status check at 1, 5, 10 min (D-30) Note over S: Seats stay held while pending S->>A: Escalate at 15 min (D-201) else Hold expires mid-payment S-->>T: Cart kept, seats re-checked, new hold if free (D-191) end opt Fawry (FR-PAY-09) G-->>T: Voucher code, seats held 48 h, reminder before expiry Note over S: Voucher unpaid at 48 h → back to Cart (D-31) end ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Seat hold | "held for 15 minutes and released automatically when it expires"; price "locked when the hold starts" | [BRL-08](/en/docs/brd/requirements#7-business-rules), [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-191, D-192 | | Hold expiry during payment | "A retry after the hold expires keeps the cart, re-checks the seats and starts a new 15-minute hold only if they are still free" | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), D-191 | | Attempt cap | "up to 3 attempts per hold"; after the third the booking stays Payment Failed until the hold expires | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), [BR-BKG-03](/en/docs/brd/requirements#67-booking-and-payment-bkg), D-197 | | Gateway timeout | "If the gateway does not answer within 30 seconds… checks status at 1, 5 and 10 minutes and escalates to admin at 15 minutes. Seats stay held while pending" | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-30, D-201 | | Callbacks | "at most once per gateway event identifier"; callbacks queued and replayed | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | | Fawry voucher | "issue a voucher valid 48 hours and hold the seats for that window. An unpaid voucher expires and releases the seats" | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), [BRL-08](/en/docs/brd/requirements#7-business-rules), D-31, D-41 | | Success | Confirmed posts the ledger entry; ticket issued with booking reference and boarding code | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes), [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | Seat states | Available, Held, Reserved, Checked In, Checked Out, Released — the loop behind the hold | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) | | Seat selection | Company-assigned by default; self-selection by plan and trip setting | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default), [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) | | Booking states | The ten traveler-visible states of machine 7.2, from Cart to Refunded | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) | | Program discounts | Plans discount program prices by 5 or 10 percent in the live summary | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) | | Concurrency | Hold races resolved with a Redis lock and a conditional update on seat status | ERD trip_seats | ## Stories [#stories] - **As a traveler**, I want the price locked the moment my seat is held, so that nothing changes under me while I pay. *([FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-192)* - **As a traveler**, I want a pending payment resolved by polling instead of a dead end, so that a slow gateway does not cost me the seat. *([FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending))* - **As an admin**, I want gateway no-answers escalated after 15 minutes with the seats still held, so that I can finish what the timer could not. *([FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-201)* - **As a Fawry user**, I want 48 hours to pay the voucher with a reminder before expiry, so that cash payment works like any other method. *([FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), D-31)* # Requirement Coverage (/ar/docs/workflows/coverage) Refresh with `bun scripts/coverage-matrix.ts` — do not edit by hand. An empty *Covered by* cell means the requirement is cited by no flow or workflow page yet. **207 of 207** functional requirements (100%) are cited by at least one [user flow](/en/docs/user-flows) or [system workflow](/en/docs/workflows) page. The rest are listed here on purpose — being visible is the first step to being covered. ## PAR — Parent tracker [#par--parent-tracker] | Requirement | Covered by | |---|---| | [FR-PAR-01](/en/docs/srs/requirements/par#fr-par-01--linking-a-child) Linking a child | [UF-PAR-01](/en/docs/user-flows/parent#uf-par-01-link-a-child) | | [FR-PAR-02](/en/docs/srs/requirements/par#fr-par-02--parent-view-scope) Parent view scope | [UF-PAR-02](/en/docs/user-flows/parent#uf-par-02-child-trip-status) | | [FR-PAR-03](/en/docs/srs/requirements/par#fr-par-03--eligibility) Eligibility | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | [FR-PAR-04](/en/docs/srs/requirements/par#fr-par-04--parent-notifications) Parent notifications | [UF-PAR-04](/en/docs/user-flows/parent#uf-par-04-notifications) | | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) Child-data restrictions | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-PAR-06](/en/docs/srs/requirements/par#fr-par-06--link-ends-with-the-booking) Link ends with the booking | [UF-PAR-06](/en/docs/user-flows/parent#uf-par-06-link-ends) | | [FR-PAR-07](/en/docs/srs/requirements/par#fr-par-07--child-safety-reporting) Child-safety reporting | [UF-ORG-19](/en/docs/user-flows/organization#uf-org-19-child-safety-reports), [UF-PAR-05](/en/docs/user-flows/parent#uf-par-05-report-a-child-safety-concern) | ## ACC — Accounting and settlements [#acc--accounting-and-settlements] | Requirement | Covered by | |---|---| | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) Double-entry ledger | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-02](/en/docs/srs/requirements/acc#fr-acc-02--organization-accounting-per-trip) Organization accounting per trip | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts) Supplier earnings and payouts | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#weekly), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | | [FR-ACC-04](/en/docs/srs/requirements/acc#fr-acc-04--platform-financial-view) Platform financial view | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations) | | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements) Settlements | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan) Exports by plan | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-07](/en/docs/srs/requirements/acc#fr-acc-07--reconciled-exports) Reconciled exports | [UF-ORG-15](/en/docs/user-flows/organization#uf-org-15-accounting-and-settlements) | | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) Invoices across all parties | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest) Daily reconciliation and finance digest | [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules), [money](/en/docs/workflows/money#stories) | | [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement) Archive after settlement | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs) | ## MKT — Markets [#mkt--markets] | Requirement | Covered by | |---|---| | [FR-MKT-01](/en/docs/srs/requirements/mkt#fr-mkt-01--market-configuration) Market configuration | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country) Market from country | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-MKT-03](/en/docs/srs/requirements/mkt#fr-mkt-03--cross-market-browsing) Cross-market browsing | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor) | | [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch) Market switch | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) Rounding and display | [money](/en/docs/workflows/money#timers-and-rules) | ## PRG — Programs [#prg--programs] | Requirement | Covered by | |---|---| | [FR-PRG-01](/en/docs/srs/requirements/prg#fr-prg-01--pricing-models) Pricing models | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-02](/en/docs/srs/requirements/prg#fr-prg-02--program-types) Program types | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-03](/en/docs/srs/requirements/prg#fr-prg-03--live-booking-summary) Live booking summary | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-04](/en/docs/srs/requirements/prg#fr-prg-04--enrollment-report) Enrollment report | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-05](/en/docs/srs/requirements/prg#fr-prg-05--program-capacity) Program capacity | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-PRG-06](/en/docs/srs/requirements/prg#fr-prg-06--program-count-limit) Program count limit | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## SEAT — Seats [#seat--seats] | Requirement | Covered by | |---|---| | [FR-SEAT-01](/en/docs/srs/requirements/seat#fr-seat-01--company-assigned-by-default) Company-assigned by default | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) Live seat map | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-SEAT-03](/en/docs/srs/requirements/seat#fr-seat-03--priority-window) Priority window | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold) Seat hold | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | [FR-SEAT-05](/en/docs/srs/requirements/seat#fr-seat-05--seat-states) Seat states | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-SEAT-06](/en/docs/srs/requirements/seat#fr-seat-06--staff-seat-assignment) Staff seat assignment | [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats) | | [FR-SEAT-07](/en/docs/srs/requirements/seat#fr-seat-07--self-selection-by-plan) Self-selection by plan | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## TRV — Traveler profile and history [#trv--traveler-profile-and-history] | Requirement | Covered by | |---|---| | [FR-TRV-01](/en/docs/srs/requirements/trv#fr-trv-01--profile-and-preferences) Profile and preferences | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications) | | [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) Trip visibility and early access | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRV-03](/en/docs/srs/requirements/trv#fr-trv-03--history-and-receipts-by-plan) History and receipts by plan | [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | [FR-TRV-04](/en/docs/srs/requirements/trv#fr-trv-04--program-discounts) Program discounts | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-TRV-05](/en/docs/srs/requirements/trv#fr-trv-05--plan-changes) Plan changes | [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) | | [FR-TRV-06](/en/docs/srs/requirements/trv#fr-trv-06--supplier-application-keeps-traveler-access) Supplier application keeps traveler access | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role) | | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion) Data copy and deletion | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## STF — Staffing [#stf--staffing] | Requirement | Covered by | |---|---| | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks) Driver tracks | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-02](/en/docs/srs/requirements/stf#fr-stf-02--photographer-tracks) Photographer tracks | [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal) | | [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate) Ready gate | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) Assignment after finalized deal | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) Moderator assignment | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-STF-06](/en/docs/srs/requirements/stf#fr-stf-06--deal-request-visibility) Deal request visibility | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline) Reassignment deadline | [UF-ORG-08](/en/docs/user-flows/organization#uf-org-08-move-a-trip-to-ready), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## SUB — Plans and subscriptions [#sub--plans-and-subscriptions] | Requirement | Covered by | |---|---| | [FR-SUB-01](/en/docs/srs/requirements/sub#fr-sub-01--plan-catalog) Plan catalog | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides) | | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates) Feature gates | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) Grace period | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) Upgrade, downgrade and cancellation | [UF-DRV-08](/en/docs/user-flows/driver#uf-drv-08-plan), [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan), [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides) Admin overrides | [UF-ADM-07](/en/docs/user-flows/admin#uf-adm-07-plans-and-overrides), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) Revenue reporting | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials) Trials | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning) Dunning | [UF-SHR-07](/en/docs/user-flows/shared#uf-shr-07-grace-banner), [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [UF-ORG-18](/en/docs/user-flows/organization#uf-org-18-plan-and-billing), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade) Limits after a downgrade | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) Counter reset | [UF-TRV-16](/en/docs/user-flows/traveler#uf-trv-16-life-after-a-downgrade), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#monthly), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules), [subscriptions](/en/docs/workflows/subscriptions#stories) | | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure) Plan service failure | [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | ## AUTH — Accounts, identity and access [#auth--accounts-identity-and-access] | Requirement | Covered by | |---|---| | [FR-AUTH-01](/en/docs/srs/requirements/auth#fr-auth-01--role-specific-registration-paths) Role-specific registration paths | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-01](/en/docs/user-flows/shared#uf-shr-01-sign-up-chooser) | | [FR-AUTH-02](/en/docs/srs/requirements/auth#fr-auth-02--country-on-every-registration-form) Country on every registration form | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify) | | [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code) Verification by one-time code | [UF-TRV-02](/en/docs/user-flows/traveler#uf-trv-02-register-and-verify), [UF-SHR-02](/en/docs/user-flows/shared#uf-shr-02-one-time-code), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-AUTH-04](/en/docs/srs/requirements/auth#fr-auth-04--role-specific-sign-in-methods) Role-specific sign-in methods | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in) | | [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout) Sign-in lockout | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [UF-ADM-01](/en/docs/user-flows/admin#uf-adm-01-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-AUTH-06](/en/docs/srs/requirements/auth#fr-auth-06--multi-role-accounts) Multi-role accounts | [UF-TRV-11](/en/docs/user-flows/traveler#uf-trv-11-apply-for-a-supplier-role), [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher) | | [FR-AUTH-07](/en/docs/srs/requirements/auth#fr-auth-07--staff-access-to-several-organizations) Staff access to several organizations | [UF-SHR-05](/en/docs/user-flows/shared#uf-shr-05-role-and-organization-switcher), [UF-ORG-02](/en/docs/user-flows/organization#uf-org-02-switch-organization) | | [FR-AUTH-08](/en/docs/srs/requirements/auth#fr-auth-08--suspension-and-reinstatement) Suspension and reinstatement | [UF-SHR-10](/en/docs/user-flows/shared#uf-shr-10-suspended-account), [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) Account deletion with a 30-day grace period | [UF-TRV-13](/en/docs/user-flows/traveler#uf-trv-13-privacy-requests), [UF-SHR-09](/en/docs/user-flows/shared#uf-shr-09-account-deletion), [UF-ADM-05](/en/docs/user-flows/admin#uf-adm-05-privacy-requests), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens) Sessions and tokens | [UF-SHR-03](/en/docs/user-flows/shared#uf-shr-03-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | ## PHO — Photographer studio [#pho--photographer-studio] | Requirement | Covered by | |---|---| | [FR-PHO-01](/en/docs/srs/requirements/pho#fr-pho-01--portfolio) Portfolio | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | [FR-PHO-02](/en/docs/srs/requirements/pho#fr-pho-02--rates-and-availability) Rates and availability | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | | [FR-PHO-03](/en/docs/srs/requirements/pho#fr-pho-03--earnings) Earnings | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-04](/en/docs/srs/requirements/pho#fr-pho-04--active-bookings-by-plan) Active bookings by plan | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-05](/en/docs/srs/requirements/pho#fr-pho-05--photographer-coupons) Photographer coupons | [UF-PHO-08](/en/docs/user-flows/photographer#uf-pho-08-earnings-coupons-and-plan) | | [FR-PHO-06](/en/docs/srs/requirements/pho#fr-pho-06--visibility-and-badge) Visibility and badge | [UF-PHO-02](/en/docs/user-flows/photographer#uf-pho-02-portfolio-profile-and-availability) | ## ORG — Organization tenancy and settings [#org--organization-tenancy-and-settings] | Requirement | Covered by | |---|---| | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) Tenant isolation | [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ORG-02](/en/docs/srs/requirements/org#fr-org-02--tenant-setup-on-approval) Tenant setup on approval | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers) Organization-owned drivers and photographers | [UF-ORG-05](/en/docs/user-flows/organization#uf-org-05-own-drivers-and-photographers), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ORG-04](/en/docs/srs/requirements/org#fr-org-04--fleet-registration) Fleet registration | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-ORG-05](/en/docs/srs/requirements/org#fr-org-05--seat-self-selection-setting) Seat self-selection setting | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) CRM and webhooks | [UF-ORG-17](/en/docs/user-flows/organization#uf-org-17-crm-and-webhooks), [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices) B2B and B2C invoices | [UF-ORG-14](/en/docs/user-flows/organization#uf-org-14-invoices), [UF-ADM-11](/en/docs/user-flows/admin#uf-adm-11-finance-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-ORG-08](/en/docs/srs/requirements/org#fr-org-08--custom-branding) Custom branding | [UF-ORG-20](/en/docs/user-flows/organization#uf-org-20-branding-enterprise) | ## NTF — Notifications [#ntf--notifications] | Requirement | Covered by | |---|---| | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) Channels by preference | [UF-TRV-12](/en/docs/user-flows/traveler#uf-trv-12-profile-language-and-notifications), [UF-SHR-11](/en/docs/user-flows/shared#uf-shr-11-notification-centre), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout) Language and layout | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours) Quiet hours | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) Versioned templates | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) Delivery records and retries | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [notifications](/en/docs/workflows/notifications#timers-and-rules) | | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) No duplicate delivery | [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours), [notifications](/en/docs/workflows/notifications#diagram), [notifications](/en/docs/workflows/notifications#timers-and-rules), [notifications](/en/docs/workflows/notifications#stories) | | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices) Trip reminders and change notices | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#hourly), [notifications](/en/docs/workflows/notifications#timers-and-rules) | ## CPN — Coupons [#cpn--coupons] | Requirement | Covered by | |---|---| | [FR-CPN-01](/en/docs/srs/requirements/cpn#fr-cpn-01--creator-scope) Creator scope | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | | [FR-CPN-02](/en/docs/srs/requirements/cpn#fr-cpn-02--cross-entity-rejection) Cross-entity rejection | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | [FR-CPN-03](/en/docs/srs/requirements/cpn#fr-cpn-03--real-time-validation) Real-time validation | [UF-TRV-04](/en/docs/user-flows/traveler#uf-trv-04-apply-a-coupon) | | [FR-CPN-04](/en/docs/srs/requirements/cpn#fr-cpn-04--coupon-types) Coupon types | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | [FR-CPN-05](/en/docs/srs/requirements/cpn#fr-cpn-05--lifecycle-and-controls) Lifecycle and controls | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle) | | [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) Redemption and reversal | [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags) Analytics and abuse flags | [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons), [UF-ORG-22](/en/docs/user-flows/organization#uf-org-22-coupon-lifecycle), [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-CPN-08](/en/docs/srs/requirements/cpn#fr-cpn-08--coupon-count-by-plan) Coupon count by plan | [UF-DRV-07](/en/docs/user-flows/driver#uf-drv-07-coupons), [UF-ORG-13](/en/docs/user-flows/organization#uf-org-13-coupons) | ## TRK — Live tracking [#trk--live-tracking] | Requirement | Covered by | |---|---| | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) Live vehicle location | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection) Location collection | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-TRK-03](/en/docs/srs/requirements/trk#fr-trk-03--passenger-vehicle-view) Passenger vehicle view | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations) | | [FR-TRK-04](/en/docs/srs/requirements/trk#fr-trk-04--per-trip-child-tracking-switch) Per-trip child tracking switch | [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map) | | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) Tracking data scope | [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking) End of tracking | [UF-DRV-04](/en/docs/user-flows/driver#uf-drv-04-run-an-assigned-vehicle), [UF-PAR-03](/en/docs/user-flows/parent#uf-par-03-live-map), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers) No live position for travelers | [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## CHK — Check-in and check-out [#chk--check-in-and-check-out] | Requirement | Covered by | |---|---| | [FR-CHK-01](/en/docs/srs/requirements/chk#fr-chk-01--check-in-at-boarding) Check-in at boarding | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | [FR-CHK-02](/en/docs/srs/requirements/chk#fr-chk-02--vehicle-match) Vehicle match | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger) | | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record) Event record | [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [trip-day](/en/docs/workflows/trip-day#diagram), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops) Check-out at stops | [UF-MOD-05](/en/docs/user-flows/moderator#uf-mod-05-check-out-at-a-stop-or-destination), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) Offline queue | [UF-MOD-06](/en/docs/user-flows/moderator#uf-mod-06-offline-queue), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-CHK-06](/en/docs/srs/requirements/chk#fr-chk-06--incident-reporting) Incident reporting | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-07](/en/docs/user-flows/moderator#uf-mod-07-report-an-incident) | | [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) Occupancy | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## FLT — Fleet and vehicle types [#flt--fleet-and-vehicle-types] | Requirement | Covered by | |---|---| | [FR-FLT-01](/en/docs/srs/requirements/flt#fr-flt-01--reusable-vehicle-types) Reusable vehicle types | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | [FR-FLT-02](/en/docs/srs/requirements/flt#fr-flt-02--vehicle-registry) Vehicle registry | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | | [FR-FLT-03](/en/docs/srs/requirements/flt#fr-flt-03--vehicle-limit-per-trip) Vehicle limit per trip | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-04](/en/docs/srs/requirements/flt#fr-flt-04--seat-map-from-vehicle-type) Seat map from vehicle type | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-05](/en/docs/srs/requirements/flt#fr-flt-05--vehicle-removal-after-bookings) Vehicle removal after bookings | [UF-ORG-23](/en/docs/user-flows/organization#uf-org-23-fleet-mid-lifecycle) | | [FR-FLT-06](/en/docs/srs/requirements/flt#fr-flt-06--archiving-vehicle-types) Archiving vehicle types | [UF-ORG-04](/en/docs/user-flows/organization#uf-org-04-fleet) | ## API — Public API [#api--public-api] | Requirement | Covered by | |---|---| | [FR-API-01](/en/docs/srs/requirements/api#fr-api-01--public-api) Public API | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-02](/en/docs/srs/requirements/api#fr-api-02--api-key-lifecycle) API key lifecycle | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-03](/en/docs/srs/requirements/api#fr-api-03--read-resource-endpoints) Read resource endpoints | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-04](/en/docs/srs/requirements/api#fr-api-04--api-conventions) API conventions | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-05](/en/docs/srs/requirements/api#fr-api-05--openapi-publication) OpenAPI publication | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-06](/en/docs/srs/requirements/api#fr-api-06--rate-limiting-behavior) Rate limiting behavior | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | | [FR-API-07](/en/docs/srs/requirements/api#fr-api-07--webhook-contract-parity) Webhook contract parity | [UF-ORG-24](/en/docs/user-flows/organization#uf-org-24-consume-the-public-api) | ## MED — Media and albums [#med--media-and-albums] | Requirement | Covered by | |---|---| | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window) Album creation window | [UF-PHO-04](/en/docs/user-flows/photographer#uf-pho-04-assigned-trip-brief), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#archive-and-retention-jobs), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload) Resumable batch upload | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#continuous-pipelines), [media](/en/docs/workflows/media#diagram), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-03](/en/docs/srs/requirements/med#fr-med-03--privacy-modes-by-plan) Privacy modes by plan | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing) | | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) Shared links | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [media](/en/docs/workflows/media#timers-and-rules), [media](/en/docs/workflows/media#stories) | | [FR-MED-05](/en/docs/srs/requirements/med#fr-med-05--selected-user-access) Selected-user access | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking) Watermarking | [UF-PHO-07](/en/docs/user-flows/photographer#uf-pho-07-watermark), [media](/en/docs/workflows/media#timers-and-rules) | | [FR-MED-07](/en/docs/srs/requirements/med#fr-med-07--traveler-access-and-download) Traveler access and download | [UF-PHO-06](/en/docs/user-flows/photographer#uf-pho-06-privacy-and-sharing), [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums) | | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) Albums per trip by plan | [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album), [media](/en/docs/workflows/media#timers-and-rules) | ## ADM — Admin console [#adm--admin-console] | Requirement | Covered by | |---|---| | [FR-ADM-01](/en/docs/srs/requirements/adm#fr-adm-01--account-administration) Account administration | [UF-ADM-04](/en/docs/user-flows/admin#uf-adm-04-manage-an-account) | | [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff) Admin staff | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ADM-03](/en/docs/srs/requirements/adm#fr-adm-03--configuration) Configuration | [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-configuration) | | [FR-ADM-04](/en/docs/srs/requirements/adm#fr-adm-04--dispute-outcomes-and-refunds) Dispute outcomes and refunds | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund) | | [FR-ADM-05](/en/docs/srs/requirements/adm#fr-adm-05--immutable-audit-log) Immutable audit log | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | [FR-ADM-06](/en/docs/srs/requirements/adm#fr-adm-06--platform-wide-coupons) Platform-wide coupons | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | [FR-ADM-07](/en/docs/srs/requirements/adm#fr-adm-07--abuse-flags) Abuse flags | [UF-ADM-08](/en/docs/user-flows/admin#uf-adm-08-coupons-and-abuse) | | [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling) Dispute handling | [UF-TRV-14](/en/docs/user-flows/traveler#uf-trv-14-open-a-dispute), [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-ADM-09](/en/docs/srs/requirements/adm#fr-adm-09--lab-test-requests) Lab-test requests | [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | ## BKG — Booking and checkout [#bkg--booking-and-checkout] | Requirement | Covered by | |---|---| | [FR-BKG-01](/en/docs/srs/requirements/bkg#fr-bkg-01--booking-composition) Booking composition | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-BKG-02](/en/docs/srs/requirements/bkg#fr-bkg-02--checkout-handoff) Checkout handoff | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart) Retry without losing the cart | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund) Traveler cancellation and refund | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [UF-ORG-09](/en/docs/user-flows/organization#uf-org-09-manage-bookings-and-seats), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-BKG-05](/en/docs/srs/requirements/bkg#fr-bkg-05--receipts-and-invoices) Receipts and invoices | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-05](/en/docs/user-flows/traveler#uf-trv-05-manage-bookings) | | [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip) Organization cancellation of a trip | [UF-ORG-11](/en/docs/user-flows/organization#uf-org-11-cancel-a-trip), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-BKG-07](/en/docs/srs/requirements/bkg#fr-bkg-07--booking-states) Booking states | [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | ## PAY — Payments and refunds [#pay--payments-and-refunds] | Requirement | Covered by | |---|---| | [FR-PAY-01](/en/docs/srs/requirements/pay#fr-pay-01--payment-outcomes) Payment outcomes | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks) Idempotent callbacks | [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules) | | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) Refund execution | [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [refunds](/en/docs/workflows/refunds#timers-and-rules), [refunds](/en/docs/workflows/refunds#stories) | | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy) Refunds outside policy | [UF-ADM-10](/en/docs/user-flows/admin#uf-adm-10-disputes), [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation) Gateway reconciliation | [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning) Subscription charges and dunning | [UF-SHR-16](/en/docs/user-flows/shared#uf-shr-16-trial-to-paid), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#retry-schedules-per-failure-chasing), [subscriptions](/en/docs/workflows/subscriptions#timers-and-rules) | | [FR-PAY-07](/en/docs/srs/requirements/pay#fr-pay-07--payment-methods-per-market) Payment methods per market | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip) | | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending) Payment pending | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [UF-TRV-15](/en/docs/user-flows/traveler#uf-trv-15-payment-outcome-and-pending-resolution), [UF-ADM-12](/en/docs/user-flows/admin#uf-adm-12-payment-escalations), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers) Fawry cash vouchers | [UF-TRV-03](/en/docs/user-flows/traveler#uf-trv-03-book-a-trip), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [booking-payment](/en/docs/workflows/booking-payment#diagram), [booking-payment](/en/docs/workflows/booking-payment#timers-and-rules), [booking-payment](/en/docs/workflows/booking-payment#stories) | ## DRV — Driver app and lab tests [#drv--driver-app-and-lab-tests] | Requirement | Covered by | |---|---| | [FR-DRV-01](/en/docs/srs/requirements/drv#fr-drv-01--driver-work-area) Driver work area | [UF-DRV-09](/en/docs/user-flows/driver#uf-drv-09-organization-owned-driver-home) | | [FR-DRV-02](/en/docs/srs/requirements/drv#fr-drv-02--deal-responses) Deal responses | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal) | | [FR-DRV-03](/en/docs/srs/requirements/drv#fr-drv-03--lab-test-pause) Lab-test pause | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-DRV-10](/en/docs/user-flows/driver#uf-drv-10-support), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result) Lab deadline and result | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-DRV-05](/en/docs/srs/requirements/drv#fr-drv-05--admin-validation) Admin validation | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test) | | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension) Missed-deadline suspension | [UF-DRV-05](/en/docs/user-flows/driver#uf-drv-05-lab-test-requested), [UF-ADM-06](/en/docs/user-flows/admin#uf-adm-06-request-and-review-a-lab-test), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily) | | [FR-DRV-07](/en/docs/srs/requirements/drv#fr-drv-07--earnings-and-payouts) Earnings and payouts | [UF-DRV-06](/en/docs/user-flows/driver#uf-drv-06-earnings-and-payouts) | | [FR-DRV-08](/en/docs/srs/requirements/drv#fr-drv-08--driver-availability) Driver availability | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | ## TRIP — Trips [#trip--trips] | Requirement | Covered by | |---|---| | [FR-TRIP-01](/en/docs/srs/requirements/trip#fr-trip-01--trip-creation-wizard) Trip creation wizard | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing) Draft, public and targeted publishing | [UF-TRV-01](/en/docs/user-flows/traveler#uf-trv-01-browse-as-a-visitor), [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRIP-03](/en/docs/srs/requirements/trip#fr-trip-03--multi-vehicle-trips) Multi-vehicle trips | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) Program changes until departure | [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules) | | [FR-TRIP-05](/en/docs/srs/requirements/trip#fr-trip-05--trip-lifecycle) Trip lifecycle | [UF-ADM-14](/en/docs/user-flows/admin#uf-adm-14-trip-oversight-and-audit-log) | | [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) Changes that affect confirmed bookings | [UF-TRV-07](/en/docs/user-flows/traveler#uf-trv-07-choose-a-remedy-after-a-trip-change), [UF-ORG-10](/en/docs/user-flows/organization#uf-org-10-change-a-trip-after-bookings), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#timers-and-rules), [trip-lifecycle](/en/docs/workflows/trip-lifecycle#stories), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [refunds](/en/docs/workflows/refunds#timers-and-rules) | | [FR-TRIP-07](/en/docs/srs/requirements/trip#fr-trip-07--active-trip-limit) Active trip limit | [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard) | ## EMP — Employees and permissions [#emp--employees-and-permissions] | Requirement | Covered by | |---|---| | [FR-EMP-01](/en/docs/srs/requirements/emp#fr-emp-01--permission-sets) Permission sets | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-02](/en/docs/srs/requirements/emp#fr-emp-02--permission-changes-are-audited) Permission changes are audited | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees), [UF-ORG-21](/en/docs/user-flows/organization#uf-org-21-employee-first-sign-in) | | [FR-EMP-03](/en/docs/srs/requirements/emp#fr-emp-03--employee-limit-per-plan) Employee limit per plan | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-04](/en/docs/srs/requirements/emp#fr-emp-04--server-side-scope) Server-side scope | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-05](/en/docs/srs/requirements/emp#fr-emp-05--employee-removal) Employee removal | [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | | [FR-EMP-06](/en/docs/srs/requirements/emp#fr-emp-06--invitation-and-first-sign-in) Invitation and first sign-in | [UF-ORG-01](/en/docs/user-flows/organization#uf-org-01-first-sign-in-and-setup), [UF-ORG-03](/en/docs/user-flows/organization#uf-org-03-invite-and-manage-employees) | ## NEG — Deal negotiation [#neg--deal-negotiation] | Requirement | Covered by | |---|---| | [FR-NEG-01](/en/docs/srs/requirements/neg#fr-neg-01--deal-proposal) Deal proposal | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry) Counter-offers and expiry | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers) | | [FR-NEG-03](/en/docs/srs/requirements/neg#fr-neg-03--mutual-acceptance) Mutual acceptance | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-04](/en/docs/srs/requirements/neg#fr-neg-04--rejection) Rejection | [UF-DRV-03](/en/docs/user-flows/driver#uf-drv-03-respond-to-a-deal), [UF-PHO-03](/en/docs/user-flows/photographer#uf-pho-03-respond-to-a-deal), [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | | [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) Finalization | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [money](/en/docs/workflows/money#timers-and-rules) | | [FR-NEG-06](/en/docs/srs/requirements/neg#fr-neg-06--deal-audit) Deal audit | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal), [UF-ADM-09](/en/docs/user-flows/admin#uf-adm-09-deal-audit) | | [FR-NEG-07](/en/docs/srs/requirements/neg#fr-neg-07--negotiation-by-plan) Negotiation by plan | [UF-ORG-07](/en/docs/user-flows/organization#uf-org-07-hire-a-platform-supplier-deal) | ## ANL — Analytics [#anl--analytics] | Requirement | Covered by | |---|---| | [FR-ANL-01](/en/docs/srs/requirements/anl#fr-anl-01--organization-analytics) Organization analytics | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics) | | [FR-ANL-02](/en/docs/srs/requirements/anl#fr-anl-02--supplier-analytics) Supplier analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-03](/en/docs/srs/requirements/anl#fr-anl-03--admin-analytics) Admin analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-04](/en/docs/srs/requirements/anl#fr-anl-04--ranges-freshness-and-export) Ranges, freshness and export | [UF-ORG-16](/en/docs/user-flows/organization#uf-org-16-analytics), [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | | [FR-ANL-05](/en/docs/srs/requirements/anl#fr-anl-05--privacy-in-analytics) Privacy in analytics | [UF-ADM-15](/en/docs/user-flows/admin#uf-adm-15-platform-analytics-and-audit) | ## MOD — Moderator app [#mod--moderator-app] | Requirement | Covered by | |---|---| | [FR-MOD-01](/en/docs/srs/requirements/mod#fr-mod-01--vehicle-scoped-access) Vehicle-scoped access | [UF-MOD-03](/en/docs/user-flows/moderator#uf-mod-03-vehicle-home-and-manifest) | | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report) End-of-trip report | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation) Access revocation | [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules), [trip-day](/en/docs/workflows/trip-day#stories) | | [FR-MOD-04](/en/docs/srs/requirements/mod#fr-mod-04--installable-app) Installable app | [UF-MOD-01](/en/docs/user-flows/moderator#uf-mod-01-install-and-first-open) | | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in) Moderator sign-in | [UF-MOD-02](/en/docs/user-flows/moderator#uf-mod-02-sign-in), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | | [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) Report lock | [UF-ORG-12](/en/docs/user-flows/organization#uf-org-12-live-operations), [UF-MOD-08](/en/docs/user-flows/moderator#uf-mod-08-end-of-trip-report-and-access-end), [trip-day](/en/docs/workflows/trip-day#timers-and-rules) | ## ONB — Applications and approvals [#onb--applications-and-approvals] | Requirement | Covered by | |---|---| | [FR-ONB-01](/en/docs/srs/requirements/onb#fr-onb-01--application-and-supplier-access) Application and supplier access | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-02](/en/docs/srs/requirements/onb#fr-onb-02--single-admin-queue) Single admin queue | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application) | | [FR-ONB-03](/en/docs/srs/requirements/onb#fr-onb-03--decision-time-target) Decision time target | [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) Changes requested | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#daily), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) Rejection, appeal and re-application | [UF-SHR-08](/en/docs/user-flows/shared#uf-shr-08-application-status-changes-appeal), [UF-ADM-02](/en/docs/user-flows/admin#uf-adm-02-review-an-application), [UF-ADM-03](/en/docs/user-flows/admin#uf-adm-03-decide-an-appeal), [scheduled-jobs](/en/docs/workflows/scheduled-jobs#countdowns-per-record-timers), [applications](/en/docs/workflows/applications#timers-and-rules), [applications](/en/docs/workflows/applications#stories) | | [FR-ONB-06](/en/docs/srs/requirements/onb#fr-onb-06--photographer-portfolio-minimum) Photographer portfolio minimum | [UF-PHO-01](/en/docs/user-flows/photographer#uf-pho-01-register-and-apply) | | [FR-ONB-07](/en/docs/srs/requirements/onb#fr-onb-07--driver-vehicle-and-insurance-details) Driver vehicle and insurance details | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-08](/en/docs/srs/requirements/onb#fr-onb-08--lab-consent-and-initial-result) Lab consent and initial result | [UF-DRV-01](/en/docs/user-flows/driver#uf-drv-01-register-and-apply), [applications](/en/docs/workflows/applications#timers-and-rules) | | [FR-ONB-09](/en/docs/srs/requirements/onb#fr-onb-09--applicant-status-notifications) Applicant status notifications | [applications](/en/docs/workflows/applications#timers-and-rules) | # System Workflows (/ar/docs/workflows) The user flows describe what people do. This section describes what the **system** does: every process with a state, a timer, a retry or a queue — the kind of process a workflow engine owns. The SRS cites a *System workflows* source document for these; these pages are that document, fully traced to the requirements. Every page follows the same shape: the trigger, the actors, a diagram, the timers, and the **stories** the workflow serves. ## The engine contract [#the-engine-contract] All workflows in this section share the same execution rules, drawn from the SRS: | Property | Rule | Trace | |---|---|---| | States | Every workflow is one of the ten state machines (SRS section 7) or a named pipeline below | SRS section 7 | | Timers | Time-based transitions are guards on the state machine, with verbatim windows on each page | per machine | | Retries | Payment callbacks at most once per gateway event identifier; notifications 3 times with exponential backoff; refunds 3 times; webhooks 5 times over 24 hours | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks) | | Idempotency | Idempotency keys are valid for 24 hours; duplicate replays are ignored by client event ID | SRS section 6.4, [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue) | | Jobs | Named scheduled jobs run the timers: daily, hourly, weekly and monthly cadences — see the job catalog | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset) | | Failure posture | The plan service fails closed; analytics and exports degrade without blocking bookings | [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), [NFR-OBS-04](/en/docs/srs/quality#86-observability-nfr-obs) | ## The workflows [#the-workflows] ## Reading the timers [#reading-the-timers] Working-day SLAs (review in 2 working days, refunds sent within 2 working days) use the responsible party's market calendar. Clock timers (seat holds, quiet hours, payout runs) are absolute. Where the spec itself has not decided a value, the page says so with the open decision ID — those values follow the BRD open-decision process. ## Stories in this section [#stories-in-this-section] Each workflow page carries user stories in the standard form — *As a (role), I want (capability), so that (value)* — each traced to the requirements it serves, so product, engineering and operations share one vocabulary. # Media (/ar/docs/workflows/media) Albums have a clock of their own: uploading opens only after the trip completes and lasts 14 days; processing renders thumbnail, medium, large and watermarked variants with EXIF stripped; and albums archive 30 days after the window closes. The photographer surface is [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-upload-and-publish-an-album); the traveler viewing side is [UF-TRV-09](/en/docs/user-flows/traveler#uf-trv-09-albums). **Delivery phase:** P4 Marketplace supply. ## Trigger and actors [#trigger-and-actors] - **Trigger:** the trip reaches Completed. - **Actors:** the photographer (Studio or Pro plan); the processing pipeline; the archive job; travelers with access. ## Diagram [#diagram] ```mermaid flowchart LR A[Trip Completed] --> B["Upload window opens, 14 days (D-267)"] B --> C[Create album, choose privacy mode] C --> D["Resumable batch upload by presigned URL (FR-MED-02)"] D --> E["Processing: thumbnail, medium, large, watermarked; EXIF stripped"] E --> F{"95 percent within 5 minutes (D-274)"} F --> G[Publish and notify travelers with access] B --> H["Window closes"] H --> I["Album archives 30 days later (D-268)"] G --> J{Privacy mode} J -- public --> K[View, watermarked or medium download] J -- shared link --> L["32-character token, revocable, revoked returns not found"] J -- selected users --> M[View only for chosen travelers] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Upload window | albums "only after it is Completed and within 14 days" | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-267 | | Archival | "albums archive 30 days after the window closes" | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268 | | Processing SLA | "95 percent of photos finish processing within 5 minutes" | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), D-274 | | Upload | Resumable batch upload by presigned URL, client file IDs unique per batch | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), ERD photos | | Variants | thumbnail, medium, large, watermarked; EXIF stripped | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking), [UF-PHO-05](/en/docs/user-flows/photographer#uf-pho-05-create-and-upload-an-album) | | Watermark | "bottom right, inset 3 percent of width, 30 percent opacity", Studio and Pro only | [FR-MED-06](/en/docs/srs/requirements/med#fr-med-06--watermarking), [BR-MED-03](/en/docs/brd/requirements#611-media-and-photographers-med-pho), D-275 | | Shared links | "32-character token and be revocable; a revoked link returns not found" — no time expiry | [FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links) | | Download logging | kept 1 year | D-271 | | Plan limits | Album limits by plan | [FR-MED-08](/en/docs/srs/requirements/med#fr-med-08--albums-per-trip-by-plan) | ## Stories [#stories] - **As a photographer**, I want a resumable batch that survives a dropped connection, so that a wedding-sized album uploads once. *([FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload))* - **As a traveler**, I want processed photos inside five minutes, so that the album is ready when the group chat asks. *(D-274)* - **As a traveler in a shared-link album**, I want revoked links to vanish, so that privacy decisions are enforceable. *([FR-MED-04](/en/docs/srs/requirements/med#fr-med-04--shared-links))* - **As an organization**, I want the window to close and the album to archive on schedule, so that media obligations have an end date. *([FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268)* # Money (/ar/docs/workflows/money) Money moves on rails: every booking posts to a double-entry ledger, payouts run Mondays at 06:00, invoice numbering retries three times before finance review, and a daily reconciliation at 08:00 Cairo time catches whatever the gateway disagrees about. This is the engine view of state machine 7.9 (Settlement); the finance role surface is [UF-ADM-13](/en/docs/user-flows/admin#uf-adm-13-finance-views). **Delivery phase:** P2 (daily ledger reconciliation), P4 (weekly payouts), P5 (full accounting and invoices). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a paid booking, a completed trip, a refund, or the weekly clock. - **Actors:** the ledger; the payout run; the invoice service; the reconciliation job; finance. ## Diagram [#diagram] ```mermaid flowchart LR A[Booking paid] --> B[Double-entry ledger posts] B --> C["Commission line, placeholder 10 percent (D-15, OD-15)"] C --> D[Trip Completed] D --> E["Settlement opens automatically, lines computed from the ledger"] E --> F{Disputed line?} F -- yes --> G[Disputed, adjustment lines posted back] G --> E F -- no --> H["Weekly payout run, Mondays 06:00 (D-28)"] H --> I{Balance negative?} I -- yes --> J["Netted against next payout, no run while negative (D-173)"] I -- no --> K[Payout sent, statuses pending sent paid failed held] K --> L{Driver lab pause?} L -- yes --> M["Held, hold reason lab pause (D-175)"] L -- no --> N[Every line paid, no open dispute] N --> O["Settlement Closed (D-174)"] B --> P[Invoice numbering] P --> Q{Number issued?} Q -- "no, 3 retries (D-179)" --> P Q -- "3 failures" --> R[Finance review, booking stays Confirmed] Q -- yes --> S["Invoice issued, never edited, credit notes only (D-181)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Ledger | Double-entry ledger with event types booking_paid, refund, coupon, deal_cost, commission, gateway_fee, plan_charge, payout, invoice, settlement, reversal | [FR-ACC-01](/en/docs/srs/requirements/acc#fr-acc-01--double-entry-ledger) | | Commission | placeholder "10 percent of the base trip price, configurable per market and per deal type" | D-15, [OD-15](/en/docs/brd/compliance#11-open-decisions), [FR-NEG-05](/en/docs/srs/requirements/neg#fr-neg-05--finalization) | | Payout cadence | "weekly payout runs on Mondays at 06:00" through Stripe Connect Express, bank transfer or a local provider | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), BRD 5.2, D-28 | | Negative balance | "netted against the next payout in the same currency, and no payout runs while it is negative" | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-173 | | Holds | Payouts held during a lab-test pause | D-175 | | Invoice numbering | "numbering retries 3 times, then the case goes to finance review"; issued invoices are never edited, credit notes reference them | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), D-179 to D-181 | | Invoice type | B2B when a tax number is present, else B2C | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), [BRL-28](/en/docs/brd/requirements#7-business-rules), D-180 | | Reconciliation | Gateway settlement reports compared with the ledger daily; exceptions listed | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), D-29 | | Finance digest | "A finance exceptions digest goes out daily at 08:00 Cairo time"; dashboards warn when data is more than 26 hours old | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176, D-250 | | Settlement closure | Closed when "Every line paid" and "No open dispute" | [FR-ACC-05](/en/docs/srs/requirements/acc#fr-acc-05--settlements), [BR-ACC-06](/en/docs/brd/requirements#614-accounting-invoices-and-settlements-acc), D-174 | | Currencies | The market comes from the country; switches follow the market; rounding and display per market | [FR-MKT-02](/en/docs/srs/requirements/mkt#fr-mkt-02--market-from-country), [FR-MKT-04](/en/docs/srs/requirements/mkt#fr-mkt-04--market-switch), [FR-MKT-05](/en/docs/srs/requirements/mkt#fr-mkt-05--rounding-and-display) | | Tenant isolation | Every ledger line is tenant-scoped with the owning organization | [FR-ORG-01](/en/docs/srs/requirements/org#fr-org-01--tenant-isolation) | | Invoices across parties | Invoices for every party pair — traveler, organization, supplier, platform | [FR-ACC-08](/en/docs/srs/requirements/acc#fr-acc-08--invoices-across-all-parties) | | Revenue reporting | Plan revenue reported for finance | [FR-SUB-06](/en/docs/srs/requirements/sub#fr-sub-06--revenue-reporting) | | Exports | "expire after 7 days", "ready within 15 minutes" | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), D-249, D-177 | ## Stories [#stories] - **As a finance operator**, I want payouts to run themselves every Monday with negative balances netted, so that my week starts with exceptions, not with manual runs. *([FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-28)* - **As an organization owner**, I want a daily digest of money exceptions at a known hour, so that problems surface before callers do. *([FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176)* - **As an auditor**, I want issued invoices immutable with credit notes as the only correction, so that the trail never rewrites history. *(D-181)* - **As a driver**, I want my payout held — not lost — during a lab pause, so that resolving paperwork restores the money. *(D-175)* # Notifications (/ar/docs/workflows/notifications) Notifications are a queue with manners: nothing loud between 22:00 and 07:00 recipient-local, deferred messages released at 07:00, trip-day events older than two hours dropped, one message per event per channel per recipient, and three retries with exponential backoff when a channel fails. The recipient side is [UF-SHR-15](/en/docs/user-flows/shared#uf-shr-15-notification-delivery-and-quiet-hours). **Delivery phase:** P1 (channels and templates), P3 (quiet hours). ## Trigger and actors [#trigger-and-actors] - **Trigger:** any domain event that maps to a notification template. - **Actors:** the notification service; the quiet-hours scheduler; the retry queue; the hourly reminder job. ## Diagram [#diagram] ```mermaid flowchart TD A[Domain event] --> B{Duplicate event key?} B -- "yes, one per channel per recipient" --> C[Drop, FR-NTF-06] B -- no --> D[Template in recipient language, RTL aware] D --> E{Category enabled by recipient?} E -- "no, non-security" --> F[Drop] E -- yes --> G{"Urgent? (D-289 list)"} G -- yes --> H[Send at once on enabled channels] G -- no --> I{"22:00 to 07:00 recipient local (D-289)?"} I -- no --> H I -- yes --> J[Schedule for 07:00] J --> K{Trip-day event older than 2 h?} K -- yes --> L["Drop (D-290)"] K -- no --> H H --> M{Delivery fails} M -- "retry 3x, exponential backoff" --> H M -- "3 failures" --> N[Mark failed, delivery record kept] O[Hourly job] --> P["Reminder 24 h before departure, push and email, SMS if enabled (D-27)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Quiet hours | "SMS and push shall not be sent between 22:00 and 07:00 recipient local time unless urgent"; deferred messages go at 07:00; trip-day events older than 2 hours are dropped | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), [BR-NTF-03](/en/docs/brd/requirements#612-notifications-ntf), D-289, D-290 | | Retries | "Failures retry 3 times with exponential backoff" | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | | Dedup | "One event shall produce at most one message per channel per recipient" (unique event key) | [FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery) | | Reminders | "a reminder 24 hours before departure by push and email, plus SMS if enabled… when the hourly job runs" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-27 | | Change notices | "Vehicle, driver or time changes are notified within 1 hour" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186 | | Language | Templates versioned, language and layout per recipient with RTL | [FR-NTF-02](/en/docs/srs/requirements/ntf#fr-ntf-02--language-and-layout), [FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates) | | Security messages | Account security messages cannot be disabled | [FR-NTF-01](/en/docs/srs/requirements/ntf#fr-ntf-01--channels-by-preference) | | Delivery records | Delivery states queued, sent, delivered, failed, dropped with attempt and next-attempt timestamps | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries), ERD notifications | ## Stories [#stories] - **As a recipient**, I want silence between 22:00 and 07:00 unless it is urgent, so that the platform respects my night. *([FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), D-289)* - **As an operations controller**, I want trip-day staleness to drop old notifications, so that a catch-up burst never confuses the morning. *(D-290)* - **As a traveler**, I want one reminder per channel, not five, so that the trip day is calm. *([FR-NTF-06](/en/docs/srs/requirements/ntf#fr-ntf-06--no-duplicate-delivery))* - **As an admin**, I want versioned templates, so that a wording fix does not fork history. *([FR-NTF-04](/en/docs/srs/requirements/ntf#fr-ntf-04--versioned-templates))* # Refunds (/ar/docs/workflows/refunds) Refunds are a pipeline, not a button: the policy engine computes the amount from the cancellation window, the coupon redemption is reversed, the gateway gets up to three attempts, and anything the gateway refuses lands in finance review. The traveler side is [UF-TRV-06](/en/docs/user-flows/traveler#uf-trv-06-cancel-a-booking); admin out-of-policy refunds are [UF-ADM-16](/en/docs/user-flows/admin#uf-adm-16-out-of-policy-refund). **Delivery phase:** P2 (policy refund), P5 (coupon reversal and full accounting). ## Trigger and actors [#trigger-and-actors] - **Trigger:** a cancellation (traveler, organization or admin), a trip change remedy, or an out-of-policy decision. - **Actors:** the policy engine; the refund job; the gateway; finance review. ## Diagram [#diagram] ```mermaid flowchart TD A[Cancellation requested] --> B{When?} B -- "48 h or more before departure" --> C["Refund 80 percent (placeholder, D-07, OD-07)"] B -- "24 to under 48 h" --> D["Refund 50 percent (placeholder)"] B -- "Under 24 h" --> E["No refund due, booking Cancelled final"] C --> F[Reverse coupon redemption, free per-user limit] D --> F F --> G["Sent to gateway within 2 working days, shown as refund in progress"] G --> H{Gateway confirms?} H -- yes --> I[Refunded, ledger reverses revenue commission and fees] H -- "no, up to 3 retries (D-322)" --> G H -- "3 failures" --> J[Stays Refund Pending for finance review] B -- "After cut-off" --> K[Organization decides within 2 working days] K -- "no agreement" --> L[Admin decides] A2[Organization or admin cancels trip] --> M["Full refund, coupon reversed (BRL-30, D-150)"] M --> G ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Policy windows | "80 percent at 48 hours or more, 50 percent from 24 to under 48 hours, none under 24 hours" (placeholder) | [BRL-12](/en/docs/brd/requirements#7-business-rules), [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), D-07, [OD-07](/en/docs/brd/compliance#11-open-decisions) | | Fees | "All fees are refundable until non-refundable fees are set" | [BRL-12](/en/docs/brd/requirements#7-business-rules), D-156 | | Coupon reversal | "A refund reverses the coupon redemption and frees the traveler's per-user limit"; an Exhausted coupon returns to Active if still in its window | [BRL-11](/en/docs/brd/requirements#7-business-rules), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal) | | Send SLA | "sent to the gateway within 2 working days and shown as 'refund in progress'" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | Confirmation | "It is Refunded only after the gateway confirms; the ledger reverses revenue, commission and fees then" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution) | | Retries | "Failed refunds retry 3 times, then stay Refund Pending for finance review" | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-149, D-35, D-322 | | Post cut-off | "Requests after the cut-off go to the organization, which decides within 2 working days, then to admin" | [FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund), [BR-BKG-04](/en/docs/brd/requirements#67-booking-and-payment-bkg), D-151 | | Hard stops | "No cancellation after departure or after check-in" — disputes take over | D-152, D-153 | | Trip cancelled by org or admin | "every confirmed booking is refunded in full, with coupon redemptions reversed" | [BRL-30](/en/docs/brd/requirements#7-business-rules), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), D-150 | | Out-of-policy | Admin refund with reason and audit log | [FR-PAY-04](/en/docs/srs/requirements/pay#fr-pay-04--refunds-outside-policy), [BRL-19](/en/docs/brd/requirements#7-business-rules) | | Remedy cancel | Trip-change remedy "cancel with full refund"; refund reason includes remedy | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings) | ## Stories [#stories] - **As a traveler**, I want the refund preview to show the exact policy amount before I confirm, so that I decide with real numbers. *([FR-BKG-04](/en/docs/srs/requirements/bkg#fr-bkg-04--traveler-cancellation-and-refund))* - **As a finance operator**, I want gateway-refused refunds to stop in review after three retries instead of looping, so that the queue stays honest. *([FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-322)* - **As an organization**, I want a clean full-refund path when I cancel a trip, so that making travelers whole is one action, not a spreadsheet. *([BRL-30](/en/docs/brd/requirements#7-business-rules))* - **As a coupon owner**, I want a refunded booking to free my per-user coupon limit, so that a cancelled trip does not burn my discount. *([BRL-11](/en/docs/brd/requirements#7-business-rules), [FR-CPN-06](/en/docs/srs/requirements/cpn#fr-cpn-06--redemption-and-reversal))* # Job Catalog (/ar/docs/workflows/scheduled-jobs) This is the complete catalog of the platform's automated processes: countdowns that expire things, retries that chase failures, and named jobs the acceptance tests call by name — the daily job, the hourly job, the archive job, the reset job, the payout run and the reconciliation. Each entry cites its rules; the linked workflow page tells the full story. ## Countdowns (per-record timers) [#countdowns-per-record-timers] | Process | Window (verbatim) | Trace | |---|---|---| | Seat hold countdown and auto-release | 15 minutes | [BRL-08](/en/docs/brd/requirements#7-business-rules), [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-191 | | Price lock from hold start | at hold start | [FR-SEAT-04](/en/docs/srs/requirements/seat#fr-seat-04--seat-hold), D-192 | | Fawry voucher hold, expiry and pre-expiry reminder | 48 hours | [FR-PAY-09](/en/docs/srs/requirements/pay#fr-pay-09--fawry-cash-vouchers), D-31, D-41 | | Payment attempts per hold | max 3 | [FR-BKG-03](/en/docs/srs/requirements/bkg#fr-bkg-03--retry-without-losing-the-cart), D-197 | | Gateway no-answer poll and escalation | 30 s, then 1 / 5 / 10 min, admin at 15 | [FR-PAY-08](/en/docs/srs/requirements/pay#fr-pay-08--payment-pending), D-30, D-201 | | Verification code expiry, pause, resend countdown | 5 minutes; 5 wrong codes pause 15 minutes; resend after 45 to 60 s | [BRL-20](/en/docs/brd/requirements#7-business-rules), [FR-AUTH-03](/en/docs/srs/requirements/auth#fr-auth-03--verification-by-one-time-code), D-58, D-59, [OD-23](/en/docs/brd/compliance#11-open-decisions) | | Sign-in lockout | 15 minutes after 5 failed attempts | [BRL-21](/en/docs/brd/requirements#7-business-rules), [FR-AUTH-05](/en/docs/srs/requirements/auth#fr-auth-05--sign-in-lockout), D-53 | | Access and refresh token TTLs | 15 minutes; refresh rotates, 30 days; web sessions 12 hours | [FR-AUTH-10](/en/docs/srs/requirements/auth#fr-auth-10--sessions-and-tokens), [BRL-22](/en/docs/brd/requirements#7-business-rules), [OD-02](/en/docs/brd/compliance#11-open-decisions) | | Idempotency keys | 24 hours | SRS section 6.4, [NFR-SEC-06](/en/docs/srs/quality#82-security-nfr-sec) | | Invitation links | employee and own-supplier 7 days; admin invite 72 hours | [FR-ORG-03](/en/docs/srs/requirements/org#fr-org-03--organization-owned-drivers-and-photographers), [FR-ADM-02](/en/docs/srs/requirements/adm#fr-adm-02--admin-staff), D-286, D-94, D-50 | | Deal offer expiry | 72 hours since the last counter | [BRL-26](/en/docs/brd/requirements#7-business-rules), [FR-NEG-02](/en/docs/srs/requirements/neg#fr-neg-02--counter-offers-and-expiry), D-14, [OD-13](/en/docs/brd/compliance#11-open-decisions) | | Remedy choice window | 7 days, then admin | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), D-148 | | Appeal window and decision | within 14 days; decided within 5 working days | [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application), [BRL-06](/en/docs/brd/requirements#7-business-rules), D-237 | | Changes-requested response | 14 days, day-7 reminder, one 7-day extension | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested), D-235, [OD-32](/en/docs/brd/compliance#11-open-decisions) | | Re-apply cooldown | 30 days after rejection | [BRL-06](/en/docs/brd/requirements#7-business-rules), [FR-ONB-05](/en/docs/srs/requirements/onb#fr-onb-05--rejection-appeal-and-re-application) | | Dispute SLAs | acknowledge 2 wd, info answered 5 wd, resolved 10 wd, appeal 7 days (proposed) | [BR-ADM-07](/en/docs/brd/requirements#615-platform-administration-adm), [FR-ADM-08](/en/docs/srs/requirements/adm#fr-adm-08--dispute-handling), D-32, D-254 | | Abuse-flag review | within 2 working days | [BR-CPN-05](/en/docs/brd/requirements#68-coupons-cpn), [FR-CPN-07](/en/docs/srs/requirements/cpn#fr-cpn-07--analytics-and-abuse-flags), D-216, D-217 | | Lab test deadline | 3 days from request, admin may set 1 to 7 | [BRL-16](/en/docs/brd/requirements#7-business-rules), [FR-DRV-04](/en/docs/srs/requirements/drv#fr-drv-04--lab-deadline-and-result), D-242 | | Staffing-gap reassignment | alert 48 h before departure, until 24 h before | [FR-STF-07](/en/docs/srs/requirements/stf#fr-stf-07--reassignment-deadline), D-185, D-187 | | Moderator staff code | valid until 24 hours after trip end, one device | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), D-107, D-108 | | Album upload window | 14 days after trip Completed | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-267 | | Export files | ready within 15 minutes, expire after 7 days | [FR-ACC-06](/en/docs/srs/requirements/acc#fr-acc-06--exports-by-plan), D-249, D-177 | | Data copy delivery | within 30 days | [FR-TRV-07](/en/docs/srs/requirements/trv#fr-trv-07--data-copy-and-deletion), D-162 | | Account deletion grace | 30-day grace; on day 31 the nightly job deletes | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period), [BRL-15](/en/docs/brd/requirements#7-business-rules), [BR-AUTH-08](/en/docs/brd/requirements#61-accounts-and-access-auth) | | Webhook delivery | retried 5 times over 24 hours, replayable 7 days; secret rotation keeps the old secret 24 hours | [FR-ORG-06](/en/docs/srs/requirements/org#fr-org-06--crm-and-webhooks), D-62 to D-64, [OD-18](/en/docs/brd/compliance#11-open-decisions) | ## Retry schedules (per-failure chasing) [#retry-schedules-per-failure-chasing] | Process | Schedule | Trace | |---|---|---| | Subscription dunning | days 1, 3, 5, 7 with an email at each attempt | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), D-09 | | Grace period | 7 days, features kept | [BRL-14](/en/docs/brd/requirements#7-business-rules), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period), [OD-29](/en/docs/brd/compliance#11-open-decisions) | | Refund gateway retries | 3 times, then Refund Pending for finance review | [FR-PAY-03](/en/docs/srs/requirements/pay#fr-pay-03--refund-execution), D-322 | | Invoice numbering | 3 retries, then finance review | [FR-ORG-07](/en/docs/srs/requirements/org#fr-org-07--b2b-and-b2c-invoices), D-179 | | Notification retries | 3 times with exponential backoff | [FR-NTF-05](/en/docs/srs/requirements/ntf#fr-ntf-05--delivery-records-and-retries) | | Check-in offline queue | retry every 30 s, up to 1,000 events, warn at 800, in order | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117 | | Gateway callbacks | idempotent replay, at most once per event identifier | [FR-PAY-02](/en/docs/srs/requirements/pay#fr-pay-02--idempotent-callbacks), [NFR-AVL-03](/en/docs/srs/quality#83-availability-nfr-avl) | ## Hourly [#hourly] | Process | Trace | |---|---| | Trip reminders, 24 hours before departure, push and email, SMS if enabled | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-27 | ## Daily [#daily] | Process | Time | Trace | |---|---|---| | Application closure of unanswered changes | daily job | [FR-ONB-04](/en/docs/srs/requirements/onb#fr-onb-04--changes-requested) | | Lab suspension over 30 days closes the account | daily job | [FR-DRV-06](/en/docs/srs/requirements/drv#fr-drv-06--missed-deadline-suspension), [BRL-16](/en/docs/brd/requirements#7-business-rules) | | Account deletion on day 31 | nightly job | [FR-AUTH-09](/en/docs/srs/requirements/auth#fr-auth-09--account-deletion-with-a-30-day-grace-period) | | Gateway reconciliation against the ledger | daily | [FR-PAY-05](/en/docs/srs/requirements/pay#fr-pay-05--gateway-reconciliation), D-29 | | Finance exceptions digest | 08:00 Cairo time | [FR-ACC-09](/en/docs/srs/requirements/acc#fr-acc-09--daily-reconciliation-and-finance-digest), D-176 | | Stale-data warning past 26 hours | dashboards | D-250 | | Expiring driver documents reminders | continuous | [UF-DRV-02](/en/docs/user-flows/driver#uf-drv-02-set-availability-and-profile) | | Quiet-hours flush of deferred messages | 07:00 recipient local | [FR-NTF-03](/en/docs/srs/requirements/ntf#fr-ntf-03--quiet-hours), D-290 | ## Weekly [#weekly] | Process | Time | Trace | |---|---|---| | Payout run | Mondays at 06:00 | [FR-ACC-03](/en/docs/srs/requirements/acc#fr-acc-03--supplier-earnings-and-payouts), D-28 | ## Monthly [#monthly] | Process | Time | Trace | |---|---|---| | Plan counter reset | 00:00 on the 1st, owner's time zone | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218 | ## Archive and retention jobs [#archive-and-retention-jobs] | Process | Window | Trace | |---|---|---| | Trip archive | 30 days after Completed, settlement closed | [BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), D-26 | | Album archive | 30 days after the upload window closes | [FR-MED-01](/en/docs/srs/requirements/med#fr-med-01--album-creation-window), D-268 | | Retention purges | check-in 1 year; GPS 90 days then hourly summary; child history 1 year; download logs 1 year; financial and audit 7 years; trips 5 years post-deletion | SRS section 6.4, [NFR-[DAT-02](/en/docs/srs/data#62-data-isolation)](/en/docs/srs/quality#85-data-nfr-dat), D-45, D-135, D-271, [OD-04](/en/docs/brd/compliance#11-open-decisions) | | Backups | daily snapshots 35 days; point-in-time 7 days; cross-region 30 days | SRS section 6.4 | ## Continuous pipelines [#continuous-pipelines] | Process | Cadence | Trace | |---|---|---| | GPS tracking | point every 5 to 10 s, batches of 10, 60-minute offline buffer | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-34, D-121 | | Seat map and map updates | within 500 ms | [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map), [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location) | | Check-in event delivery | within 60 seconds | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | | Photo processing | 95 percent within 5 minutes | [FR-MED-02](/en/docs/srs/requirements/med#fr-med-02--resumable-batch-upload), D-274 | | Analytics freshness | no more than 5 minutes | [BR-ANL-04](/en/docs/brd/requirements#617-analytics-anl), D-281 | | Booking throttle | 5 per traveler per hour unless verified | [NFR-SEC-15](/en/docs/srs/quality#82-security-nfr-sec) | | Maintenance window | 01:00 to 03:00 Cairo, max 4 h per month, 72 h notice | [NFR-AVL-02](/en/docs/srs/quality#83-availability-nfr-avl), D-303 | ## Standing questions [#standing-questions] Values still open in the register and marked on the workflow pages: [OD-29](/en/docs/brd/compliance#11-open-decisions) (post-grace behavior), [OD-32](/en/docs/brd/compliance#11-open-decisions) (changes-requested closure day with extension), [OD-07](/en/docs/brd/compliance#11-open-decisions) and D-07 (refund percentages), [OD-15](/en/docs/brd/compliance#11-open-decisions) and D-15 (commission rates), [OD-28](/en/docs/brd/compliance#11-open-decisions) (trial lengths), [OD-26](/en/docs/brd/compliance#11-open-decisions) (plan prices), [OD-09](/en/docs/brd/compliance#11-open-decisions) and D-146 (priority and early-access windows), D-68 (child-safety escalation contact), and the proposed 80-percent Filling Up threshold (D-189). # Subscriptions (/ar/docs/workflows/subscriptions) Plans renew themselves, chase their own payment, and schedule their own demotions. Failed charges retry on days 1, 3, 5 and 7 with an email each time; a seven-day grace period follows; downgrades wait for the cycle end and can be cancelled until then. This is the engine view of state machine 7.6 (Subscription); the traveler surface is [UF-TRV-10](/en/docs/user-flows/traveler#uf-trv-10-change-plan) and the shared plan-limit prompt is [UF-SHR-06](/en/docs/user-flows/shared#uf-shr-06-plan-limit-prompt). **Delivery phase:** P5 Monetization and Gulf launch. ## Trigger and actors [#trigger-and-actors] - **Trigger:** a subscription charge attempt, a plan change, or the monthly counter reset. - **Actors:** the billing product at the gateway; the dunning schedule; the reset job; admin overrides. ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Trial : approved application, no charge before approval (D-77) Trial --> Active : trial ends, payment succeeds Trial --> Grace : trial ends, payment fails Active --> Grace : renewal fails Grace --> Active : payment succeeds, retries on days 1, 3, 5, 7 Grace --> Downgraded : 7 days pass (OD-29, current rule D-08) Active --> Active : upgrade, payment succeeds, new plan at once with proration (BRL-13) Active --> Active : downgrade scheduled, effective at period end, cancellable (D-219) Downgraded --> Active : upgrade at any time Active --> Cancelling : cancel, access to end of paid period Cancelling --> Ended : period ends Grace --> Ended : cancel during grace, ends at once, no refund (D-223) ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Dunning | "Failed charges shall retry on days 1, 3, 5 and 7, with an email at each attempt" | [FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), [FR-PAY-06](/en/docs/srs/requirements/pay#fr-pay-06--subscription-charges-and-dunning), D-09 | | Grace | Grace lasts 7 days with features kept | [BRL-14](/en/docs/brd/requirements#7-business-rules), [FR-SUB-03](/en/docs/srs/requirements/sub#fr-sub-03--grace-period) | | After grace | Post-grace behavior is [OPEN: [OD-29](/en/docs/brd/compliance#11-open-decisions)] (current rule D-08: drop to the basic tier, block new bookings and deals) | [OD-29](/en/docs/brd/compliance#11-open-decisions), D-08 | | Upgrades | "A plan upgrade takes effect at once with proration" | [BRL-13](/en/docs/brd/requirements#7-business-rules), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation) | | Downgrades | "a downgrade takes effect at the end of the cycle", cancellable before then | [BRL-13](/en/docs/brd/requirements#7-business-rules), [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), D-219, D-232 | | Cancellation | "Cancellation keeps access to the end of the paid period. Cancelling during grace ends the plan at once with no refund" | [FR-SUB-04](/en/docs/srs/requirements/sub#fr-sub-04--upgrade-downgrade-and-cancellation), D-223 | | Trials | "A trial-start notice goes on day 0 and reminders 3 days and 1 day before the end"; trial lengths are [OPEN: [OD-28](/en/docs/brd/compliance#11-open-decisions)] | [FR-SUB-07](/en/docs/srs/requirements/sub#fr-sub-07--trials), D-231, [OD-28](/en/docs/brd/compliance#11-open-decisions) | | Counter reset | "at 00:00 on the 1st of each month in the owner's time zone" | [FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218 | | After downgrade | Over-limit items keep working; new actions hit the limit gate | [FR-SUB-09](/en/docs/srs/requirements/sub#fr-sub-09--limits-after-a-downgrade), D-144 | | Admin override | Second admin plus end date required; owner emailed; auto-reverts at the end date | [FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), D-227, D-230 | | Limit gate | Server-side gate returns the plan, the limit and the next tier; the plan service fails closed | [FR-SUB-02](/en/docs/srs/requirements/sub#fr-sub-02--feature-gates), [FR-SUB-11](/en/docs/srs/requirements/sub#fr-sub-11--plan-service-failure), D-224 | ## Stories [#stories] - **As a plan owner**, I want four spaced retries with an email each, so that one empty card does not end my service. *([FR-SUB-08](/en/docs/srs/requirements/sub#fr-sub-08--dunning), D-09)* - **As a plan owner**, I want a downgrade to wait for the cycle I paid for, so that I keep what I bought until it ends. *([BRL-13](/en/docs/brd/requirements#7-business-rules), D-219)* - **As an admin**, I want overrides to carry an end date and a second approver, so that a favor never becomes a leak. *([FR-SUB-05](/en/docs/srs/requirements/sub#fr-sub-05--admin-overrides), D-227)* - **As an organization owner**, I want counters to reset on my calendar's first of the month, so that quota math matches my books. *([FR-SUB-10](/en/docs/srs/requirements/sub#fr-sub-10--counter-reset), D-218)* # Trip Day (/ar/docs/workflows/trip-day) Trip day is a machine between people: boarding codes scanned against the right vehicle, check-in events pushed within a minute, a device queue that survives dead zones, GPS points every 5 to 10 seconds, and moderator access that ends 24 hours after the trip does. The moderator side is [UF-MOD-04](/en/docs/user-flows/moderator#uf-mod-04-check-in-a-passenger); the traveler side is [UF-TRV-08](/en/docs/user-flows/traveler#uf-trv-08-trip-day). **Delivery phase:** P3 Operational depth. ## Trigger and actors [#trigger-and-actors] - **Trigger:** the trip reaches In Progress. - **Actors:** the moderator's device; the check-in service; the driver's GPS stream; parents and operations watching. ## Diagram [#diagram] ```mermaid flowchart TD A[Trip In Progress] --> B[Moderator scans boarding code] B --> C{Confirmed and this vehicle?} C -- no --> D[Refuse, event type refused_wrong_vehicle] C -- "yes, duplicate" --> E[Ignore duplicate replay by client event ID] C -- yes --> F[Check in and lock seat] F --> G{"Online? (60 s target, FR-CHK-03)"} G -- yes --> H[Event reaches platform within 60 seconds] G -- "no, offline" --> I["Device queue: up to 1,000 events, warning at 800"] I --> J[Retry every 30 seconds, in order, original timestamps] J --> G A --> K[Driver app streams GPS] K --> L["Point every 5 to 10 s, batches of 10, buffer 60 min offline"] L --> M[Parent tracker and operations map, 500 ms updates] A --> N[Moderator staff code] N --> O["Valid until 24 h after trip ends, one device (D-107)"] A --> P[Vehicle departs, child not checked in] P --> Q["Not boarded flag (proposed) → parent alert → incident flow (OD-22)"] ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Check-in delivery | "reaches the platform within 60 seconds" | [FR-CHK-03](/en/docs/srs/requirements/chk#fr-chk-03--event-record), [BR-CHK-03](/en/docs/brd/requirements#69-check-in-moderators-and-tracking-chk-mod-trk) | | Offline queue | "queue on the device (up to 1,000; warning at 800), retry every 30 seconds… with original timestamps"; duplicates ignored by client event ID | [FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117 | | GPS cadence | "send a point every 5 to 10 seconds only while the trip is In Progress, batching up to 10 points per request and buffering up to 60 minutes offline" | [FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-34, D-121 | | Map freshness | map update "within 500 ms" | [FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location), [FR-SEAT-02](/en/docs/srs/requirements/seat#fr-seat-02--live-seat-map) | | Moderator code | "valid until 24 hours after the trip ends, on one device at a time" | [FR-MOD-05](/en/docs/srs/requirements/mod#fr-mod-05--moderator-sign-in), [FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), D-107, D-108 | | End of trip | End event to parents and operations; occupancy real-time during the trip | [FR-TRK-06](/en/docs/srs/requirements/trk#fr-trk-06--end-of-tracking), [FR-CHK-07](/en/docs/srs/requirements/chk#fr-chk-07--occupancy) | | Traveler privacy | Travelers never see live position or ETA | [FR-TRK-07](/en/docs/srs/requirements/trk#fr-trk-07--no-live-position-for-travelers), [BRL-29](/en/docs/brd/requirements#7-business-rules), D-317 | | No-show | Not a formal state; departure without check-in raises the proposed "not boarded" flag and the incident flow replaces cancellation | [OD-22](/en/docs/brd/compliance#11-open-decisions), D-25, parent tracker proposals | | End-of-trip report | Moderator report with headcount and mismatch reason, read-only after submit | [FR-MOD-02](/en/docs/srs/requirements/mod#fr-mod-02--end-of-trip-report), [FR-MOD-06](/en/docs/srs/requirements/mod#fr-mod-06--report-lock) | | Tracking data scope | Raw GPS kept 90 days, then an hourly summary; scope limited to the trip | [FR-TRK-05](/en/docs/srs/requirements/trk#fr-trk-05--tracking-data-scope) | | Child data | Child-data restrictions apply to tracking, history and reports | [FR-PAR-05](/en/docs/srs/requirements/par#fr-par-05--child-data-restrictions) | | Moderator assignment | A moderator is assigned per vehicle with a phone number before publish | [FR-STF-05](/en/docs/srs/requirements/stf#fr-stf-05--moderator-assignment) | | Re-board | Re-board at a stop allowed (proposed) | [FR-CHK-04](/en/docs/srs/requirements/chk#fr-chk-04--check-out-at-stops), sections 7.2 and 7.3 | ## Stories [#stories] - **As a moderator**, I want check-in to work in a dead zone and sync later in order, so that a weak signal never loses a passenger. *([FR-CHK-05](/en/docs/srs/requirements/chk#fr-chk-05--offline-queue), D-117)* - **As a parent**, I want the map to update in half a second, so that I can see the bus reach the gate. *([FR-TRK-01](/en/docs/srs/requirements/trk#fr-trk-01--live-vehicle-location))* - **As an operations controller**, I want GPS buffering for an hour of offline driving, so that tunnel sections do not create gaps. *([FR-TRK-02](/en/docs/srs/requirements/trk#fr-trk-02--location-collection), D-121)* - **As an organization**, I want moderator access to expire a day after the trip, so that a seasonal staff code is never a standing key. *([FR-MOD-03](/en/docs/srs/requirements/mod#fr-mod-03--access-revocation), D-107)* # Trip Lifecycle (/ar/docs/workflows/trip-lifecycle) A trip moves through thirteen states from Draft to Archived, and several transitions belong to the system, not to any person: start time reached, settlement closed, thirty days passed. This is the engine view of state machine 7.1; the organization side is [UF-ORG-06](/en/docs/user-flows/organization#uf-org-06-create-a-trip-wizard). **Delivery phase:** P2 (creation and booking), P3 (multi-vehicle and programs), P6 (tracking-era archival). ## Trigger and actors [#trigger-and-actors] - **Trigger:** an organization publishes a draft, the clock reaches departure, or the last booking completes its lifecycle. - **Actors:** the organization; the start-time job; the remedy window; the archive job; travelers choosing remedies. ## Diagram [#diagram] ```mermaid stateDiagram-v2 [*] --> Draft Draft --> Published : publish Published --> Negotiating : platform supplier deal opens Negotiating --> Ready : deals finalized Published --> Ready : no negotiation needed Ready --> FillingUp : bookings open FillingUp --> SoldOut : last seat reserved note right of FillingUp Filling Up to Ready when seats fall below 80 percent (proposed, D-189) end note Ready --> InProgress : trip start time reached (BRL-07) FillingUp --> InProgress : trip start time reached (BRL-07) SoldOut --> InProgress : trip start time reached (BRL-07) InProgress --> PartiallyCompleted : multi-vehicle, some vehicles ended InProgress --> Completed : all vehicles ended PartiallyCompleted --> Completed Completed --> PostProcessing : albums and settlement open PostProcessing --> Archived : 30 days after Completed and settlement closed (BRL-25) Published --> Cancelled : organization or admin cancels, full refunds queued (BRL-30) Cancelled --> RefundsIssued : every confirmed booking Refunded RefundsIssued --> Archived : 30 days later ``` ## Timers and rules [#timers-and-rules] | Step | Timer (verbatim) | Rule trace | |---|---|---| | Start transition | "Trip start time reached; trip is Ready" moves the trip to In Progress | [BRL-07](/en/docs/brd/requirements#7-business-rules), section 7.1 | | Remedy window | The traveler has "7 days to choose; then the case goes to admin"; remedy status offered, chosen, escalated, expired | [BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings), D-148 | | Change notice | "Vehicle, driver or time changes are notified within 1 hour" | [FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186 | | Organization cancel | "every confirmed booking is refunded in full, with coupon redemptions reversed" | [BRL-30](/en/docs/brd/requirements#7-business-rules), [FR-BKG-06](/en/docs/srs/requirements/bkg#fr-bkg-06--organization-cancellation-of-a-trip), D-150 | | Settlement gate | The trip archives "30 days after Completed, and only once its settlement is closed" | [BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement), D-26 | | Refunds-issued terminal | Cancelled becomes Refunds Issued when "Every confirmed booking Refunded", then Archived "30 days later" | section 7.1 | | Ready gate | A trip is Ready when staffing is complete; finalized deals assign platform suppliers and drivers see their assigned trips | [FR-STF-01](/en/docs/srs/requirements/stf#fr-stf-01--driver-tracks), [FR-STF-03](/en/docs/srs/requirements/stf#fr-stf-03--ready-gate), [FR-STF-04](/en/docs/srs/requirements/stf#fr-stf-04--assignment-after-finalized-deal) | | Program changes | Programs changeable until departure; later changes become traveler remedies | [FR-TRIP-04](/en/docs/srs/requirements/trip#fr-trip-04--program-changes-until-departure) | | Publish gates | Drafts and targeted trips are hidden from browsing; VIP early access windows apply before public | [FR-TRIP-02](/en/docs/srs/requirements/trip#fr-trip-02--draft-public-and-targeted-publishing), [FR-TRV-02](/en/docs/srs/requirements/trv#fr-trv-02--trip-visibility-and-early-access) | ## Stories [#stories] - **As an organization**, I want the trip to start itself at departure time, so that no one has to press a button mid-operation. *([BRL-07](/en/docs/brd/requirements#7-business-rules))* - **As a traveler affected by a change**, I want seven days to pick my remedy before anyone decides for me, so that a schedule change stays my call. *([BRL-24](/en/docs/brd/requirements#7-business-rules), [FR-TRIP-06](/en/docs/srs/requirements/trip#fr-trip-06--changes-that-affect-confirmed-bookings))* - **As a finance operator**, I want archival gated on settlement closure, so that nothing disappears while money is still open. *([BRL-25](/en/docs/brd/requirements#7-business-rules), [FR-ACC-10](/en/docs/srs/requirements/acc#fr-acc-10--archive-after-settlement))* - **As a parent**, I want vehicle or driver changes told to me within the hour, so that I am never surprised at pickup. *([FR-NTF-07](/en/docs/srs/requirements/ntf#fr-ntf-07--trip-reminders-and-change-notices), D-186)*