Platform Vision — PRD+FSD Hybrid¶
Product: [BOTH] (Papillon HR Suite + ALTARYS ENTERPRISE HR Suite) Country Scope: CI (Côte d'Ivoire) — MVP Version: 1.0 Date: 25/02/2026 Author: ANALYST (Claude Code) Input documents: - docs/specs/platform-vision.md (Tier 1 human-written spec) - docs/specs/control-plane.md (Tier 2 control plane spec) - docs/specs/tarifs_papillon_hr_suite.md (pricing grid) - docs/specs/comparatif-altarys-concurrence.md (competitive analysis) - docs/research/3_validated/platform-vision-legal-validated.md (legal research audit) - docs/research/2_audit/platform-vision-legal-audit.md (legal audit gaps)
PART A — Product Requirements (PRD)¶
A.1 Executive Summary¶
ALTARYS ENTERPRISE is building a multi-tenant SaaS platform for HR management and corporate finance, purpose-built for businesses operating under the OHADA (Organisation pour l'Harmonisation en Afrique du Droit des Affaires) legal framework across 17 member states.
The Problem¶
Businesses in the OHADA zone — particularly SMEs — manage HR and payroll using Excel spreadsheets, paper registers, and manual processes. This creates:
- Compliance risk: OHADA Uniform Acts, SYSCOHADA accounting standards, and national labor codes impose complex, country-specific obligations. Manual processes lead to errors in CNPS declarations, tax filings, and employee registers.
- Operational inefficiency: Leave approvals via WhatsApp, attendance tracked on paper, payslips computed manually in Excel — HR managers spend 60-80% of their time on administrative tasks instead of strategic work.
- Data fragility: No audit trail, no backup, no data integrity. A lost Excel file means lost payroll history.
- Connectivity challenges: Intermittent internet in West/Central Africa means cloud-only solutions fail at the moment employees need them most.
The Solution¶
ALTARYS delivers two SaaS brands from a single codebase:
| Brand | Target | Employees | Phase |
|---|---|---|---|
| Papillon HR Suite | SMEs (TPE/PME) | 2–350 | Phase 1: Month 1–18 (primary focus) |
| ALTARYS ENTERPRISE HR Suite | Large companies (ETI + Grands Comptes) | 351–5,000+ | Phase 2: Month 18+ |
The platform provides 14 modular HR/Finance capabilities plus a non-sellable Control Plane foundation — all built offline-first, mobile-first, and OHADA-compliant by default.
Scale Target¶
100,000+ client companies within 5 years.
Pilot Country¶
Côte d'Ivoire (CI). Expansion: Bénin + Cameroun (Month 9), RDC (Month 15), Sénégal (Month 18), then progressive rollout across remaining OHADA countries.
A.2 Two-Brand Architecture: Why Single Codebase¶
Decision: ALTARYS operates two commercial brands but maintains a single backend codebase deployed on different infrastructure. This is a foundational architectural decision that all teams must understand.
Why Single Codebase Is Right¶
| Concern | Two Codebases | Single Codebase (Chosen) |
|---|---|---|
| Bug fix | Fix twice, test twice, deploy twice | Fix once, test once, deploy everywhere |
| Security patch | Double the attack surface to maintain | One surface, one patch |
| Feature development | Decide per-feature which codebase gets it | Build once, gate via configuration |
| Team size | Solo dev + small team — maintaining 2 codebases is unsustainable | Sustainable with a small team |
| Testing | Two test suites, two CI pipelines | One test suite covers both brands |
| API consistency | APIs drift over time, data models diverge | Guaranteed consistency |
What Differs Between Brands¶
| Dimension | Papillon HR Suite (SME) | ALTARYS ENTERPRISE HR Suite |
|---|---|---|
| Code | Same | Same |
| Frontend | frontend/ — warm, mobile-first, offline-first, forgiving UX |
frontend-enterprise/ — dense data, desktop-first, batch operations, power-user UX |
| DB Profile | Shared DB (MVP) | Schema-per-tenant or DB-per-tenant (MVP) or BYO-DB (MVP) |
| Deployment | Shared servers | Dedicated servers (ETI) or dedicated cluster (Grands Comptes) |
| Module gating | Standard modules | Standard + Enterprise-only modules/features |
| SLA | 99.5% | 99.9% (contractual) |
| API rate limits | Standard | Higher |
| Storage quotas | Segment-based (S1-S6) | Higher or unlimited |
| Pricing | S1-S6 grid (see §A.8) | Custom enterprise pricing |
| Support | Self-service + email | Dedicated account manager |
Tenant Segmentation¶
| Segment | Brand | Employee Range | Description |
|---|---|---|---|
| SME (TPE/PME) | Papillon HR Suite | 2–350 | 6 sub-segments (S1-S6) |
| ETI (Entreprise de Taille Intermédiaire) | ALTARYS ENTERPRISE | 351–4,999 | Mid-market |
| GC (Grands Comptes) | ALTARYS ENTERPRISE | 5,000+ | Large enterprise |
Architecture Pattern¶
Same Docker image / Same Spring Boot JAR
│
├── Papillon deployment (shared infrastructure)
│ └── Shared DB, shared Kubernetes namespace
│ └── 99.5% SLA, shared resources
│
└── Enterprise deployment (dedicated infrastructure)
└── Schema-per-tenant or DB-per-tenant
└── 99.9% SLA, dedicated resources
└── Potentially dedicated cluster per Grand Compte
Enterprise-only features (multi-entity consolidation, SSO/SAML, advanced approval chains, batch operations at scale, custom roles, API access for ERP integration) exist in the same codebase but are gated via module gating + brand/tier flags on the tenant entity.
[BOTH] The shared component library (packages/shared-components/) uses theme injection — both frontends consume the same components rendered differently based on the brand theme.
A.3 User Personas¶
P1: Directeur Général (DG) / CEO — [BOTH]¶
- Uses: Dashboards, approvals (self-approves as Company Owner), high-level reports
- Digital literacy: Medium to high
- Device: Laptop + phone
- Key concern: "Is my business compliant? Show me the numbers."
- Papillon context: Often the company owner (gérant SARL). May also be the HR manager in very small businesses (S1-S2).
- Enterprise context: Professional CEO with dedicated HR/Finance teams. Needs executive dashboards, not operational screens.
P2: Responsable RH / HR Manager — [BOTH]¶
- Uses: Employee files (HR Core), onboarding/offboarding (Employee Mgmt), Absence, Payroll oversight
- Digital literacy: Medium
- Device: Desktop primarily, phone for approvals
- Key concern: "Process leave requests quickly, ensure OHADA compliance, track employee lifecycle."
- Papillon context: Often the DG's spouse or a trusted employee wearing multiple hats. Transitioning from Excel/paper. Needs hand-holding UX.
- Enterprise context: Professional HR Director managing a team of HR officers. Needs batch operations, advanced reporting, delegation workflows.
P3: Comptable / Accountant — [BOTH]¶
- Uses: Budget lines, commitments, expenses, accounting, payroll read
- Digital literacy: Medium to high (uses Excel extensively)
- Device: Desktop (dual monitor preferred)
- Key concern: "SYSCOHADA compliance, balanced books, audit trail."
- Papillon context: Often an external accountant (cabinet comptable) managing 5-20 client companies. Needs multi-tenant access via tenant switcher.
- Enterprise context: In-house finance controller with dedicated team.
P4: Employé / Employee — [BOTH]¶
- Uses: Leave requests, viewing payslips, clocking in/out, basic self-service profile view
- Digital literacy: Low to medium
- Device: Android phone (often entry-level, 8+ years old, intermittent connectivity)
- Key concern: "Submit my leave request easily, check my salary, see my profile."
- Papillon context: May not have an email address. Account activation via SMS. Needs absolute simplicity.
- Enterprise context: More digitally literate. Has corporate email. Expects polished, modern UX.
P5: Commercial Freelance / Freelance Salesperson — [PAPILLON ONLY]¶
- Uses: Internal CRM — leads, opportunities, prospect→tenant conversion, commissions
- Digital literacy: Medium
- Device: Phone primarily (always on the move)
- Key concern: "Track my leads and see my commissions."
- Note: This persona works FOR ALTARYS (or a partner consulting company), not for a tenant.
P6: Partenaire Consultant / Partner Consulting Company — [PAPILLON ONLY]¶
- Uses: Internal CRM — presents Papillon to their clients, tracks referrals, revenue share (~10%)
- Digital literacy: High
- Device: Laptop + phone
- Key concern: "Track which clients I've referred and my revenue share."
- Note: Accesses CRM as a special "operator" tenant.
P7: Administrateur Système / Platform Admin — [BOTH]¶
- Uses: Control Plane — tenant management, user management, billing, platform monitoring
- Digital literacy: High
- Device: Desktop
- Key concern: "Onboard new companies, manage subscriptions, troubleshoot, monitor platform health."
A.4 User Stories¶
US-PV-001: Platform-Level Understanding [BOTH]¶
As a development team member, I want a single document that describes the entire platform's vision, module map, dependencies, and cross-cutting concerns, So that I can understand how any individual module fits into the broader system.
Acceptance Criteria: - Given I read this PRD, When I look up any of the 14 modules, Then I find its purpose, dependencies, and relationship to other modules. - Given I need to build a new module, When I check this PRD, Then I find the shared infrastructure (auth, tenant resolution, audit, offline, i18n) I can rely on.
US-PV-002: Two-Brand Single-Codebase [BOTH]¶
As an architect or developer, I want clear documentation of why we use a single codebase for two brands and what differs between them, So that I never accidentally introduce brand-specific code in the shared backend.
Acceptance Criteria: - Given I am building a backend feature, When I check this PRD, Then I find rules about keeping the backend brand-agnostic. - Given I am building a frontend feature, When I check this PRD, Then I know which frontend project to target (frontend/ vs frontend-enterprise/).
US-PV-003: Module Dependency Understanding [BOTH]¶
As a developer starting work on a module, I want to know which modules mine depends on and which modules depend on mine, So that I build the right API contracts and events.
Acceptance Criteria: - Given I am building the Absence module, When I check this PRD, Then I find that it depends on Control Plane (employee entity) and publishes events consumed by Payroll. - Given I am building Payroll, When I check this PRD, Then I find all modules that feed data into payroll calculations.
US-PV-004: Company Owner Special Status [BOTH]¶
As a company owner (gérant/DG), I want the platform to recognize my special status and let me choose whether I'm an employee (salarié) or independent (indépendant), So that payroll, CNPS, and leave management treat me correctly.
Acceptance Criteria: - Given I am the company owner, When I am flagged as indépendant, Then I do not appear in payroll, have no payslip, and have no leave balance. - Given I am the company owner, When I am flagged as salarié, Then I am also an Employee with payslip, CNPS contributions, and leave rights. - Given I am the company owner, When an org unit has no assigned manager, Then I am the fallback approver for that unit's employees.
US-PV-005: Employee Self-Export [BOTH]¶
As an employee, I want to download my own data (profile, payslips, leave history) as a PDF/ZIP, So that I can exercise my data portability right under CI's Loi n°2013-450.
Acceptance Criteria: - Given I am an employee with an active account, When I navigate to my profile, Then I find an "Export my data" option. - Given I request data export, When the export is generated, Then it includes my profile, all payslips, and leave history in a downloadable ZIP.
A.5 Non-Functional Requirements¶
| Requirement | Target | Notes |
|---|---|---|
| Response time | < 2 seconds for any page load on 3G connection | Critical for West Africa mobile usage |
| Offline capability | Full navigation offline. Simple writes (clock-in, expense entry, draft leave) offline. Approvals and financial operations require connectivity. Queued writes sync within 30s of reconnection. | Selective offline write strategy |
| Uptime | 99.5% (Papillon), 99.9% (Enterprise, contractual) | ~3.6h / ~43min downtime/month respectively |
| Data isolation | Zero cross-tenant data leakage — auditable and testable | Every DB query includes tenant context |
| Accessibility | WCAG AA compliance; minimum 16px text; 48px touch targets | Android phones with small screens |
| Browser support | Chrome 90+, Firefox 90+, Safari 15+ | Covers 95%+ of West African users |
| Device support | Primarily Android phones (8+ years old models), tablets, desktops | Entry-level devices with limited RAM |
| Data retention | Payroll/accounting: 10 years (OHADA AUDCIF). Employee personal: anonymized after tenant exit grace period. | Enforced even without ADVDOC module |
| Concurrent users | 500 per tenant at launch, scalable to 5,000 | Enterprise tenants may reach higher |
| Backup | Daily automated backups with 30-day retention | |
| Localization | French primary. XOF currency (0 decimal places). DD/MM/YYYY dates. Space as thousands separator. | English (CM bilingual) in V2 |
| Scale target | 100,000+ tenant companies within 5 years | Drives shared DB as default profile |
A.6 The 14 Modules + Control Plane¶
Module Map¶
┌─────────────────────────────────────────────────────────────────────────┐
│ CONTROL PLANE (Foundation) │
│ Tenant Mgmt · User Mgmt · Auth (Keycloak) · RBAC · Billing │
│ Module Gating · Country Config · Org & Master Data · Audit Trail │
│ Notification Service · Employee Baseline · Basic Doc Attachment (MinIO)│
└─────────────────────────┬───────────────────────────────────────────────┘
│ Every module depends on Control Plane
┌───────────────┼───────────────────────────────────┐
│ │ │
┌──────┴──────┐ ┌─────┴──────┐ ┌──────────────────────┐ │
│OPERATIONAL │ │ FINANCE & │ │ TALENT & │ │
│ HR │ │ COMPLIANCE │ │ DEVELOPMENT │ │
├─────────────┤ ├────────────┤ ├──────────────────────┤ │
│1. HR Core │ │7. Expense │ │10. Performance │ │
│2. Emp Mgmt │ │8. Commit │ │11. Skills/GPEC │ │
│3. Absence │ │ +BUDMGT │ │12. Learning │ │
│4. QR Attend │ │9. Payroll │ │13. Recruitment (ATS) │ │
│5. Time&Act │ │ │ │ │ │
│6. HSE │ │ │ │ │ │
└─────────────┘ └────────────┘ └──────────────────────┘ │
│
┌─────────────────────────┘
│ PLATFORM SERVICES
├──────────────────────┐
│14. Adv Doc Mgmt │
└──────────────────────┘
Module Summary Table¶
| # | Module | Code | Sellable? | Hard Dependencies | Soft Dependencies (events) | MVP? |
|---|---|---|---|---|---|---|
| — | Control Plane | CP | No (foundation) | None | — | ✅ |
| 1 | HR Core | HRCORE | Yes | Control Plane | → Absence, Attendance, Payroll | ✅ |
| 2 | Employee Management | EMPMGT | Yes | HR Core or CP baseline | → Payroll | ❌ Post-MVP |
| 3 | Leave & Absence | ABSMGT | Yes | Control Plane (employee) | → Payroll | ✅ |
| 4 | QR Attendance | QRCONTR | Yes | Control Plane (employee) | → Payroll | ✅ |
| 5 | Time & Activities | TIMACT | Yes | Control Plane (employee) | → Payroll | ❌ Post-MVP |
| 6 | HSE | HSEMGT | Yes | Control Plane (employee) | — | ❌ Post-MVP |
| 7 | Expense Management | EXPMGT | Yes (includes BUDMGT) | Budget Lines (auto) | → Accounting | ❌ Post-MVP |
| 8 | Commitment Management | COMMIT | Yes (includes BUDMGT) | Budget Lines (auto) | → Accounting | ✅ |
| — | Budget Lines | BUDMGT | No (auto-included) | Control Plane | — | ✅ (with COMMIT) |
| 9 | Payroll | PAYROL | Yes | CP, Absence, Attendance | → Accounting | ✅ |
| 10 | Performance & Objectives | PERFOB | Yes | CP (employee, manager) | — | ❌ Post-MVP |
| 11 | Skills & GPEC | GPEC | Yes | CP (employee, position) | — | ❌ Post-MVP |
| 12 | Learning & Training | LTRAIN | Yes | Skills & GPEC | — | ❌ Post-MVP |
| 13 | Recruitment (ATS) | ATSMGT | Yes | CP (positions, org) | → HR Core/Emp Mgmt | ❌ Post-MVP |
| 14 | Advanced Doc Management | ADVDOC | Yes | CP (MinIO, tenant scope) | Enhances all modules | ❌ Post-MVP |
Internal CRM — Special Case¶
The Internal CRM (CRMMGT) is NOT a tenant-facing module. It is an ALTARYS-internal tool used by: 1. ALTARYS freelance salespeople — direct sales, commission-based 2. Partner consulting companies — indirect sales/referrals, ~10% revenue share with ALTARYS
ALTARYS and partner companies access the CRM as special "operator" tenants. The CRM is free — it is an ALTARYS cost center, not a revenue module. Partner access is funded by the revenue share agreement.
The CRM must distinguish between direct salespeople (commission model) and partner companies (revenue share model).
A.7 Module Dependency Map¶
Dependency Graph¶
Control Plane (foundation for ALL modules incl. Organization & Master Data)
│
├── Organization & Master Data (absorbed into CP for MVP):
│ ├── Organizational units (entity, site, department — flexible tree)
│ ├── Position/job catalog
│ ├── Employee categories (cadre, agent de maîtrise, employé, ouvrier + custom)
│ ├── Contract type reference (CDD, CDI, Stage, Apprentissage, Journalier)
│ ├── Manager hierarchy (org-unit-based, owner as fallback)
│ └── Cost centers (V2)
│
├── HR Core (HRCORE) ── extends CP employee entity
│ │ (optional module — enriches baseline employee file)
│ │
│ └── Employee Management (EMPMGT) ── depends on HR Core OR CP baseline
│ │ (administrative process layer over employee record)
│ │ Can operate standalone on CP baseline (reduced feature set)
│ │
│ └──~~> Payroll (exit settlements, status change impacts)
│
├── Absence Management ──────────~~> Payroll (unpaid leave deductions)
│
├── QR Attendance ───────────────~~> Payroll (overtime, late deductions)
│
├── Time & Activities ───────────~~> Payroll (hours, overtime, night/weekend)
│
├── HSE ── depends on: Employee data (Control Plane or HR Core)
│
├── Budget Lines Management (BUDMGT) ── NOT sellable alone
│ │ Auto-included when Expense Mgmt OR Commitment Mgmt is purchased.
│ │ Deactivates only when NEITHER is active.
│ │
│ ├── Commitment Management ──~~> Accounting (journal entries)
│ │
│ └── Expense Management ─────~~> Accounting (journal entries)
│
├── Internal CRM (operator-only, uses CP auth only)
│ │ NOT a tenant-facing module
│ │
│ └──~~> Control Plane (ProspectConvertedToTenantEvent)
│
├── Payroll ─────────────────────~~> Accounting (salary journal entries)
│ │ MVP: payslip generation only (no payment order files)
│ │ Post-MVP: + payment orders (requires HR Core bank info)
│ │
│ └── depends on: Employee data (CP or HR Core),
│ Absence data, Attendance data
│
├── Accounting / General Ledger
│ └── depends on: SYSCOHADA chart of accounts (seeded at setup)
│
├── Advanced Document Management (ADVDOC)
│ │ Platform-wide document engine (MinIO backend)
│ │ Independent — no hard dependencies on other app modules
│ │
│ └── Enhances: HR Core, Emp Mgmt, Expense, Commitment,
│ HSE, Payroll (payslip archival), Accounting
│
├── Performance & Objectives ── depends on: Employee data, Manager hierarchy
│
├── Skills & GPEC ── depends on: Employee data, Position catalog
│ │
│ └── Learning & Training ── depends on: Skills & GPEC
│
└── Recruitment (ATS) ── depends on: Position catalog, Org units
│
└──~~> HR Core / Employee Mgmt (candidate → employee conversion)
Legend: ── = hard dependency (must exist). ~~> = soft dependency (events/data flow).
Cross-Module Events¶
| Event | Published By | Consumed By | Payload (key fields) |
|---|---|---|---|
EmployeeCreated |
CP (or HR Core if active) | Absence, Attendance, Payroll | employeeId, tenantId, contractType, startDate |
EmployeeUpdated |
CP (or HR Core if active) | Modules caching employee data | employeeId, tenantId, changedFields[] |
EmployeeTerminated |
Emp Mgmt (or CP if EMPMGT inactive) | Absence, Attendance, Payroll | employeeId, tenantId, terminationDate, reason |
EmployeeOnboarded |
Employee Mgmt | HR Core, Payroll | employeeId, tenantId, effectiveDate, contractDetails |
EmployeeOffboarded |
Employee Mgmt | HR Core, Absence, Attendance, Payroll | employeeId, tenantId, exitDate, exitType, exitReason |
ContractRenewed |
Employee Mgmt | Payroll | employeeId, tenantId, newContractType, newEndDate |
ContractAmended |
Employee Mgmt | Payroll | employeeId, tenantId, amendmentType, effectiveDate, changes[] |
EmployeeReassigned |
Employee Mgmt | Absence, Commitment, Budget | employeeId, tenantId, oldUnitId, newUnitId, effectiveDate |
LeaveApproved |
Absence Mgmt | Payroll | employeeId, leaveType, startDate, endDate, isPaid |
LeaveCancelled |
Absence Mgmt | Payroll | employeeId, leaveRequestId |
AttendanceRecorded |
QR Attendance | Payroll | employeeId, date, clockIn, clockOut, overtimeMinutes |
CommitmentApproved |
Commitment Mgmt | Budget Lines | commitmentId, budgetLineId, amount |
CommitmentCancelled |
Commitment Mgmt | Budget Lines | commitmentId, budgetLineId, amountToRelease |
PayrollComputed |
Payroll | Accounting | tenantId, month, journalEntries[] |
DocumentVersioned |
Advanced Doc Mgmt | Originating module | documentId, tenantId, entityType, entityId, version |
RetentionPolicyApplied |
Advanced Doc Mgmt | Audit | documentId, tenantId, action, policyName |
OrganisationUnitCreated |
Org & Master Data | Budget Lines, Reporting | unitId, tenantId, type, name, parentId |
OrganisationUnitDeactivated |
Org & Master Data | Budget Lines, Reporting | unitId, tenantId, deactivatedDate |
PositionCreated |
Org & Master Data | GPEC (V2) | positionId, tenantId, title, categoryId |
ManagerChanged |
Org & Master Data | Absence, Commitment, Emp Mgmt | employeeId, tenantId, oldManagerId, newManagerId, effectiveDate |
ProspectConvertedToTenant |
Internal CRM | Control Plane | prospectId, tenantData, salespersonId, channel |
API Dependencies (Synchronous)¶
| Caller | Calls | Endpoint (conceptual) | Purpose |
|---|---|---|---|
| Payroll | CP / HR Core | GET /api/v1/employees/{id} | Retrieve employee salary info |
| Payroll | CP / HR Core | GET /api/v1/employees/{id}/bank-info | Payment info (post-MVP) |
| Employee Mgmt | CP / HR Core | GET /api/v1/employees/{id} | Read employee record |
| Employee Mgmt | CP | PATCH /api/v1/employees/{id}/status | Execute lifecycle transition |
| Commitment Mgmt | Budget Lines | GET /api/v1/budget-lines/{id}/balance | Check available budget |
| Commitment Mgmt | Budget Lines | POST /api/v1/budget-lines/{id}/reserve | Reserve committed amount |
| Absence Mgmt | CP | GET /api/v1/org-units/{id}/manager | Get approver for unit |
| Any module | CP | GET /api/v1/auth/permissions | Check user permissions |
| Any module | ADVDOC (if active) | POST /api/v1/documents | Store document with versioning |
| Any module | ADVDOC (if active) | GET /api/v1/documents?entityType=X&entityId=Y | Retrieve entity documents |
A.8 Billing & Commercial Model [PAPILLON ONLY — MVP]¶
Tenant Segments (Papillon HR Suite)¶
| Segment | Employee Count | Pricing Model |
|---|---|---|
| S1 | 2–12 | Fixed monthly price |
| S2 | 13–29 | Fixed monthly price |
| S3 | 30–49 | Fixed monthly price |
| S4 | 50–99 | Per-user/month + Platform Fee (FP) |
| S5 | 100–199 | Per-user/month + Platform Fee (FP) |
| S6 | 200–350 | Per-user/month + Platform Fee (FP) |
Billing Frequency¶
- Monthly billing available for all tenants.
- Annual billing available: tenant pays for 12 months and gets 14 months (2 free months as bonus, NOT a discount). This is a perceived-value incentive, not a price reduction.
Free Trial¶
- 14-day free trial available for self-onboarded tenants.
- Full access to all selected modules during trial (no restrictions).
- After 14 days without payment → status changes to
PAYMENT_REQUIRED(read-only). - Tenant can pay at any time to unlock full access.
Platform Fee Formula (S4-S6 only)¶
| Segment | 1 module | 2 modules | 3 modules | 4 modules | 5+ modules |
|---|---|---|---|---|---|
| S4 (50-99) | 360,000 | 414,000 | 468,000 | 522,000 | 576,000 |
| S5 (100-199) | 540,000 | 621,000 | 702,000 | 783,000 | 864,000 |
| S6 (200-350) | 660,000 | 759,000 | 858,000 | 957,000 | 1,056,000 |
All amounts in FCFA/month.
Module Pricing (Individual)¶
| Module | S1 | S2 | S3 | S4 | S5 | S6 |
|---|---|---|---|---|---|---|
| Absences | 12,000 | 15,000 | 25,000 | 500/u | 450/u | 400/u |
| QR Attendance | 5,000 | 10,000 | 30,000 | 300/u | 300/u | 300/u |
| Notes de Frais (NDF) | 5,000 | 10,000 | 30,000 | 550/u | 550/u | 650/u |
| Engagement/Budget (EB) | 10,000 | 20,000 | 50,000 | 1,400/u | 1,500/u | 1,500/u |
| Paie | 30,000 | 50,000 | 80,000 | 1,500/u | 1,400/u | 1,400/u |
| Core RH | 12,000 | 15,000 | 25,000 | 1,250/u | 1,150/u | 1,150/u |
| Évaluation/Performance | 5,000 | 15,000 | 35,000 | 1,100/u | 1,200/u | 1,350/u |
S1-S3: FCFA/month fixed. S4-S6: FCFA/user/month + FP.
Pack Pricing¶
| Pack | Modules Included | S1 | S2 | S3 | S4 | S5 | S6 |
|---|---|---|---|---|---|---|---|
| Contrôle | Absence + QR | 15,000 | 20,000 | 30,000 | 800/u | 750/u | 700/u |
| Finance | NDF + EB | 15,000 | 30,000 | 75,000 | 1,850/u | 1,850/u | 1,850/u |
| Essentiel | Core RH + Absences | 20,000 | 25,000 | 45,000 | 1,700/u | 1,600/u | 1,550/u |
| Standard | Essentiel + QR | 25,000 | 30,000 | 75,000 | 2,250/u | 2,150/u | 2,200/u |
| Complet | Standard + NDF + Eval | 30,000 | 45,000 | 100,000 | 3,800/u | 3,800/u | 3,950/u |
Storage Quotas (Basic Document Attachment)¶
| Segment | Storage Quota |
|---|---|
| S1-S2 | 1 GB |
| S3 | 3 GB |
| S4 | 5 GB |
| S5 | 10 GB |
| S6 | 25 GB |
- Warning at 75% capacity: tenant notified and advised to purchase additional storage.
- Hard block at 100%: uploads blocked until tenant purchases more storage or deletes files.
- Additional storage purchasable (pricing TBD).
Paid Data Archival Service¶
When a tenant deactivates a module or exits the platform, ALTARYS offers a paid archival service: data retention for the full 10-year OHADA compliance period in cold storage. This is an additional revenue stream.
Enterprise Pricing [ENTERPRISE ONLY — V2]¶
Custom enterprise pricing to be defined at Month 12-13. Not included in this PRD.
A.9 Competitive Landscape¶
Strategic Positioning¶
Papillon HR Suite positions as the native OHADA-compliant HR SaaS for francophone African SMEs, with modular pricing, no lock-in, and mobile-first offline-capable UX.
Competitive Comparison¶
| Competitor | Segment | Strengths | Weaknesses | ALTARYS Differentiator |
|---|---|---|---|---|
| Excel / Paper | All SMEs | Universal, familiar, free | No compliance, no audit trail, error-prone, data loss risk | Automation + compliance + beautiful UX |
| SOCIUM | 50-150 | Strong Africa francophone position | Payroll OHADA less refined | More modular, native OHADA payroll |
| Workpay | Micro to 150 | Pan-African, very cheap for micro | Limited reporting, limited OHADA focus | Deeper OHADA compliance, richer module set |
| SeamlessHR | 50-150 | Strong in anglophone Africa | Less adapted to francophone markets | Native French, OHADA-native |
| Sage Paie & RH | 50-150 | Historic brand recognition | High entry cost (license model) | SaaS model, lower TCO, modern UX |
| BambooHR | 50-350 | Rich HCM feature set | Not optimized for OHADA/Africa | OHADA-native, offline-first, XOF pricing |
| SAP SuccessFactors | 150-350+ | Complete HCM platform | Oversized for SMEs, very expensive | Right-sized for PME, local pricing |
| PaySpace | 150-350 | Advanced reporting | Additional costs, complex pricing | Transparent modular pricing |
| iSmartRecruit | 50-150 | Advanced recruitment | Weak generalist HRIS | Full HR suite beyond recruitment |
| Bento Payroll | Micro | Simple, payroll-focused | Payroll only | Full HR suite |
Key Differentiators¶
- Native OHADA compliance: SYSCOHADA accounting, CNPS/CNSS integration, CI labor code built-in — not bolted on.
- Modular pricing adapted to African SMEs: S1-S6 segments with XOF pricing. No USD, no per-seat enterprise pricing for a 5-person company.
- Offline-first: Works on 3G, works offline. Critical in West Africa.
- Mobile-first: 360px Android-first design. 48px touch targets.
- No lock-in: Monthly billing, modular subscriptions, data export available.
- French-first: UI, support, documentation all in French.
- Local payment: CinetPay (Orange Money, Wave, MTN Mobile Money) — not just credit cards.
A.10 MVP Scope¶
In MVP¶
- Country: Côte d'Ivoire only
- Language: French only
- Currency: XOF only (0 decimal places)
- DB Profile: All 4 profiles — A (Shared DB), B (Schema-per-tenant), C (DB-per-tenant), D (BYO-DB)
- 7 Modules: Control Plane + Absence + QR Attendance + Budget Lines (auto-included with Commitment) + Commitment + Internal CRM + Payroll
- Note: Budget Lines auto-activates because Commitment Management is in MVP
- Web application: Responsive, mobile-first (360px)
- PWA: Installable on phone home screens
- Offline: Full navigation + selective writes (clock-in, expense entry, draft leave). Approvals/financial operations require connectivity.
- Basic document attachment: Simple upload/download via MinIO (all modules)
- Basic retention enforcement: 10-year OHADA retention for payroll/accounting documents even without ADVDOC
- Payroll: Payslip generation and salary computation only. No payment order files.
- SMS: Basic SMS gateway for account activation/password creation links only
- Multi-tenant user: Single login + tenant switcher (cabinet comptable use case)
- Billing: Monthly + annual (14 months for price of 12). CinetPay integration.
- 14-day free trial for self-onboarded tenants
Out of MVP (V2+)¶
- Bénin and Cameroun country rules (Month 9 target)
- XAF currency support
- English and Portuguese languages
- Native mobile apps (iOS/Android)
- Advanced reporting and analytics
- Document generation (contracts, certificates) — part of ADVDOC V2
- Integration with external systems (banking, government portals)
- SSO/OAuth authentication
- SMS general notifications (beyond account activation)
- Employee-level notification preferences
- HR Core module (full employee dossier)
- Employee Management module (administrative process layer)
- Advanced Document Management module (versioning, retention, search)
- Expense Management, Accounting modules
- HSE, Time & Activities, Performance, Skills & GPEC, Learning, Recruitment
- Custom roles per tenant
- Conventions Collectives configuration
- Multi-entity / group structures
- Enterprise brand (ALTARYS ENTERPRISE HR Suite) features
- Cost centers
- Organigramme graphique
- Grades, classifications, job families
- Matrix organisations
Module Build Order (Engineering Reality)¶
| Order | Module | Rationale | Target |
|---|---|---|---|
| 0 | Host Shell | App shell, auth, navigation, PWA, offline — proves the platform | Sprint 0 |
| 1 | Control Plane | Foundation: tenants, users, roles, employees (baseline), billing, Org & Master Data | Sprint 1 |
| 2a | Absence Management | First business module; depends on CP employees | Sprint 2 |
| 2b | QR Attendance | Parallel with Absence; depends on CP employees | Sprint 2 |
| 3a | Budget Lines Management | Required by Commitment; auto-included | Sprint 3 |
| 3b | Commitment Management | Depends on Budget Lines; first Finance module | Sprint 3 |
| 4 | Internal CRM | Relatively independent; needs only auth from CP | Sprint 3-4 |
| 5 | Payroll | Most complex; needs Employee + Absence + Attendance data. MVP: payslips only | Sprint 4-5 |
Commercial Target Dates (Aspirational)¶
| Module | Commercial Target |
|---|---|
| Absences + QR Attendance | March 2026 |
| Notes de Frais (NDF) | April 2026 |
| Engagement / Budget (EB) | May 2026 |
| Paie | June 2026 |
| Core RH | July 2026 |
| Évaluation / Performance | November 2026 |
Note: Commercial targets are aspirational and may differ from engineering delivery dates. The engineering build order (above) is authoritative for development planning.
A.11 Open Questions¶
These items require further clarification before or during implementation:
| # | Question | Priority | Status |
|---|---|---|---|
| OQ-01 | ARTCI cross-border data transfer authorization: Hosting is in Europe. ARTCI authorization required under Loi n°2013-450. Process not started. Potentially MVP-blocking. | 🔴 CRITICAL | Unresolved — legal consultation needed |
| OQ-02 | ITS (Impôt sur Traitements et Salaires) calculation: Brackets, rates, and method for CI not covered in platform-vision research. Deferred to Payroll module legal research. | 🟡 HIGH | Deferred to Payroll PRD |
| OQ-03 | CNPS contribution rates primary sources: Pension (14%), PF (5%), Maternity (0.75%), AT/MP (2-5%), CMU (1,000 FCFA) — all sourced from secondary sources or 2012 Ordonnance. Need re-research with current decree citations. | 🟡 HIGH | Deferred to Payroll PRD |
| OQ-04 | CNPS ceilings verification: 70,000 FCFA/month (PF/Maternity/AT) and 3,375,000 FCFA/month (pension) — need decree-level citation and clarification (ceiling on base salary or on contribution amount?). | 🟡 HIGH | Deferred to Payroll PRD |
| OQ-05 | DB profile auto-selection thresholds for V2: At what employee counts do tenants move from Profile A → B → C? Employee count only or also plan tier? | 🟢 MEDIUM | V2 scope |
| OQ-06 | Additional storage pricing: How much does additional storage cost per GB for tenants who exceed their quota? | 🟢 MEDIUM | Pricing decision needed |
| OQ-07 | SAS company form specifics: Do SAS companies have different social or fiscal obligations from SARL in CI? Relevant for target market. | 🟢 MEDIUM | Needs research |
| OQ-08 | CI apprenticeship and training taxes: Rates and applicability thresholds not covered in platform-vision research. | 🟢 MEDIUM | Deferred to Payroll PRD |
| OQ-09 | CI employee register (Registre d'Employeur) exact article: Research cites "Art. 18.x" — placeholder format. Exact article in Loi 2015-532 needs confirmation. | 🟢 MEDIUM | Needs verification |
| OQ-10 | Enterprise pricing model: Custom pricing for ETI and Grands Comptes segments. | 🟢 LOW | Month 12-13 |
| OQ-11 | ADVDOC pricing: Standalone module pricing TBD. | 🟢 LOW | Post-MVP |
A.12 Temporarily Validated¶
These items are implemented as-is but flagged for future verification or update:
| # | Item | Current Value | Risk | Action Required |
|---|---|---|---|---|
| TV-01 | Fiscal year configuration | Default Jan-Dec, but tenant can customize. | OHADA mandates calendar year (AUDCIF Art. 7). Tenants who override do so at their own compliance risk. Platform displays a warning. | Legal confirmation that platform can allow override without liability. |
| TV-02 | CI CNPS contribution rates (reference only — NOT implementation-ready) | Pension: 14% (7.7% employer + 6.3% employee). PF: 5%. Maternity: 0.75%. AT/MP: 2-5%. CMU: 1,000 FCFA/person (500+500). | Sourced from Cleiss.fr and a 2012 Ordonnance. Rates may have changed. | Re-research with primary decree citations before Payroll module implementation. |
| TV-03 | CI CNPS ceilings (reference only) | PF/Maternity/AT ceiling: 70,000 FCFA/month. Pension ceiling: 3,375,000 FCFA/month. | Secondary source only. 70,000 FCFA ceiling appears suspiciously low. | Verify with CNPS CI official schedule. |
PART B — Functional Specifications (FSD)¶
B.1 Core Functional Rules¶
Company Owner Status¶
| Rule | Description |
|---|---|
| FR-PV-001 | Every tenant has exactly ONE Company Owner for MVP. The owner is identified during onboarding (self-onboarding: the person who creates the account; CRM/Admin: designated at creation). |
| FR-PV-002 | The Company Owner has a owner_employment_status field with two values: INDEPENDANT (default) or SALARIE. |
| FR-PV-003 | IF owner_employment_status = INDEPENDANT THEN the owner is a User only (not an Employee). No payslip, no CNPS contributions, no leave balance. They can approve requests and access dashboards via their DG role. |
| FR-PV-004 | IF owner_employment_status = SALARIE THEN the owner is ALSO created as an Employee. They receive a payslip, CNPS contributions are calculated, leave balance is tracked. |
| FR-PV-005 | IF an organizational unit has no assigned manager THEN the Company Owner is the fallback approver for that unit's employees' requests (leave, commitments, expenses). |
| FR-PV-006 | The Company Owner self-approves their own requests (leave, expense, etc.). No external approval required for MVP. |
| FR-PV-007 | [V2] Support for multiple Company Owners per tenant (e.g., SARL with co-gérants). Each can independently be salarié or indépendant. |
Organizational Structure¶
| Rule | Description |
|---|---|
| FR-PV-010 | Organizational structure is a flexible tree with unlimited depth. Each node has an id, tenant_id, name, type (ENTITY | SITE | DEPARTMENT | CUSTOM), parent_id (self-referencing FK), status (ACTIVE | INACTIVE), manager_id (FK to Employee, nullable). |
| FR-PV-011 | The root node (type=ENTITY) is automatically created at tenant onboarding from the company name. It cannot be deleted or deactivated. |
| FR-PV-012 | At onboarding, the system seeds 5-6 default departments under the root entity: Direction Générale, Ressources Humaines, Comptabilité, Commercial, Production. Tenant admin can rename, delete (deactivate), or add more. |
| FR-PV-013 | No hard deletes on organizational units. Deactivation only. Historical data integrity must be preserved. |
| FR-PV-014 | Each employee is assigned to exactly one organizational unit (FK). Reassignment creates a history record with effective_date. |
Approval Chain (Org-Unit-Based)¶
| Rule | Description |
|---|---|
| FR-PV-020 | Approval routing is org-unit-based: an employee's approver is the manager_id of their assigned organizational unit. |
| FR-PV-021 | IF the employee's org unit has no manager_id assigned THEN the approver falls back to the Company Owner (FR-PV-005). |
| FR-PV-022 | IF the employee IS the org unit's manager THEN the approver is the manager_id of the parent org unit. If the parent has no manager, fall back to Company Owner. |
| FR-PV-023 | The Company Owner (DG) self-approves. Their requests are auto-approved with status SELF_APPROVED and logged in the audit trail. |
| FR-PV-024 | [V2] Multi-level approval chains (N+1 → N+2 → DG, based on amount thresholds). Matrix organisations (functional + hierarchical manager). Delegation of approval authority. |
Module Gating¶
| Rule | Description |
|---|---|
| FR-PV-030 | The Control Plane tracks module subscriptions per tenant in a tenant_modules table: tenant_id, module_code, status (ACTIVE | INACTIVE | TRIAL), activated_date, deactivated_date. |
| FR-PV-031 | Sellable module codes: HRCORE, EMPMGT, ABSMGT, QRCONTR, TIMACT, EXPMGT, COMMIT, PAYROL, HSEMGT, PERFOB, GPEC, LTRAIN, ATSMGT, ADVDOC. |
| FR-PV-032 | Non-sellable auto-included modules: BUDMGT (activates when EXPMGT OR COMMIT is ACTIVE; deactivates only when NEITHER is ACTIVE). |
| FR-PV-033 | Control Plane and Organization & Master Data are always active. Never gated. |
| FR-PV-034 | API-level gating: Every API endpoint checks if the requesting tenant has the required module ACTIVE. IF module is INACTIVE THEN return HTTP 403 with message "Module non souscrit". |
| FR-PV-035 | Frontend-level gating: Navigation items for unsubscribed modules are hidden or shown as "upgrade prompts" (marketing upsell opportunity). |
| FR-PV-036 | IF ADVDOC is ACTIVE THEN all modules' document attachment features automatically upgrade to versioned, retention-aware mode. |
| FR-PV-037 | IF EMPMGT is ACTIVE but HRCORE is INACTIVE THEN Employee Management operates on the CP baseline employee entity (reduced feature set but functional). |
Module Downgrade¶
| Rule | Description | Scope |
|---|---|---|
| FR-PV-040 | IF a tenant deactivates a previously active module THEN the module's data becomes read-only for 6 months. | V2 |
| FR-PV-041 | During the 6-month read-only period, the tenant is offered the option to export the module's data (CSV/Excel/ZIP). | V2 |
| FR-PV-042 | After 6 months, the enriched fields are hidden from the UI. Data is preserved in the database but invisible to the tenant. | V2 |
| FR-PV-043 | ALTARYS offers a paid data archival service: data retention in cold storage for the full 10-year OHADA compliance period. If the tenant subscribes to this service, data remains retained in cold storage. | V2 |
| FR-PV-044 | IF the tenant does NOT purchase the archival service AND the 6-month read-only period has passed THEN data is archived to cold storage automatically (not deleted). ALTARYS retains it for OHADA compliance but it is not accessible to the tenant without re-subscribing or purchasing archival. | V2 |
MVP behaviour: In MVP, deactivating a module sets it to
INACTIVEimmediately. Module data is preserved in the database but not accessible via the UI. The 6-monthREADONLY_GRACEperiod,HIDDENstate, and archival service (FR-PV-040 through FR-PV-044) are all V2.
Employee Import Flow¶
| Rule | Description |
|---|---|
| FR-PV-050 | Tenant admin can bulk-import employees via Excel file upload. |
| FR-PV-051 | After upload, the system parses the Excel file and displays an editable confirmation table showing all imported employees. Admin can edit any field directly in the table before committing. |
| FR-PV-052 | For each employee in the table, admin must select a preferred contact method: EMAIL or SMS. This is mandatory because some employees do not have email addresses. |
| FR-PV-053 | On Submit: the system creates Employee records, creates User accounts, and sends password creation links via the selected channel (email or SMS) for each employee. |
| FR-PV-054 | SMS-based password creation links require the basic SMS gateway integration (see FR-PV-080). |
Offline Strategy¶
| Rule | Description |
|---|---|
| FR-PV-060 | The application is fully navigable offline (PWA + Service Worker for app shell, IndexedDB for data cache). |
| FR-PV-061 | Offline-capable writes (queued in IndexedDB, synced on reconnection within 30s): clock-in/clock-out, expense entry/draft, leave request draft, employee profile view. |
| FR-PV-062 | Online-only operations: approval actions (leave approval, commitment approval), financial operations (payroll computation, budget reservation), module activation/deactivation, user management, billing operations. |
| FR-PV-063 | A sync status indicator is always visible in the UI. |
| FR-PV-064 | Auto-save on all form fields. No data loss on connectivity drop. |
Multi-Tenant User Access¶
| Rule | Description |
|---|---|
| FR-PV-070 | A single person can be a User across multiple tenants simultaneously (e.g., external accountant managing 5 client companies). |
| FR-PV-071 | One email/phone = one Keycloak account. User logs in once and sees a tenant picker listing all tenants they belong to. |
| FR-PV-072 | User can switch between tenants in-app without re-authenticating. JWT is re-issued with the selected tenant_id. |
| FR-PV-073 | Roles and permissions are per-tenant: a user can be Comptable in Tenant A and Employé in Tenant B. |
Notifications¶
| Rule | Description |
|---|---|
| FR-PV-075 | In-app notifications via WebSocket (real-time when online, queued for offline delivery). |
| FR-PV-076 | Email notifications for critical actions (leave approved/rejected, payroll ready, CDD expiry warnings, account activation). |
| FR-PV-077 | Notification preferences are admin-controlled for MVP: tenant admin configures which events trigger email/in-app notifications for which roles. |
| FR-PV-078 | [V2] Employee-level notification preferences (opt-in/opt-out per notification type). |
SMS Gateway¶
| Rule | Description |
|---|---|
| FR-PV-080 | MVP integrates a basic SMS gateway (Twilio, Orange SMS API, or local CI provider) for account activation/password creation links only. |
| FR-PV-081 | The same SMS gateway infrastructure is reused for general notification SMS in V2. The V2 work is building the notification preference engine and event-driven triggers, not the SMS plumbing. |
| FR-PV-082 | [V2] General SMS notifications (leave approved, payroll ready, etc.) using the same gateway. |
Data Retention & Privacy¶
| Rule | Description |
|---|---|
| FR-PV-090 | Basic OHADA retention is enforced ALWAYS, regardless of ADVDOC module status: payroll documents and accounting documents cannot be deleted before 10 years (AUDCIF requirement). |
| FR-PV-091 | Audit trail entries are immutable — no delete, no modify. Retained for minimum 10 years. |
| FR-PV-092 | Employee self-export: every employee can download their own data (profile, payslips, leave history) as PDF/ZIP from their self-service portal. This is a privacy right under CI Loi n°2013-450, not a gated feature. |
| FR-PV-093 | On tenant soft-delete: accounting/payroll data retained for 10 years. Employee personal data anonymized after a 3-month grace period (during which the tenant can request data export or purchase archival service). |
Self-Service Profile¶
| Rule | Description |
|---|---|
| FR-PV-095 | All employees can view a basic read-only profile showing Control Plane baseline data: name, email, phone, department, position, contract type, manager, hire date. This is available regardless of HR Core module status. |
| FR-PV-096 | IF HR Core is ACTIVE THEN the profile view is enriched with: personal details, emergency contacts, photo, bank info, document attachments, change history. |
Fiscal Year¶
| Rule | Description |
|---|---|
| FR-PV-100 | Fiscal year defaults to January-December (calendar year) for all OHADA-zone tenants. |
| FR-PV-101 | Tenants can customize the fiscal year start month. IF a tenant overrides the default THEN the platform displays a warning: "OHADA (AUDCIF Art. 7) mandates a calendar year fiscal closing (31 December). Overriding this may create compliance risks." |
| FR-PV-102 | The warning is logged in the audit trail. The tenant assumes compliance responsibility for non-calendar fiscal years. |
Duplicate Tenant Detection¶
| Rule | Description |
|---|---|
| FR-PV-105 | On tenant onboarding, the system performs a soft match on: company name (fuzzy), country, and admin email. |
| FR-PV-106 | IF a potential duplicate is detected THEN the onboarding is NOT blocked. Instead, the match is flagged for ALTARYS admin review in the admin console. |
| FR-PV-107 | ALTARYS admin can merge, link, or dismiss flagged duplicates. |
RCCM Policy¶
| Rule | Description |
|---|---|
| FR-PV-110 | RCCM (Registre du Commerce et du Crédit Mobilier) is optional at onboarding. |
| FR-PV-111 | IF RCCM is not provided within 3 months of activation THEN the tenant status becomes ACTIVE_INCOMPLETE and the account + subscribed modules become read-only until RCCM is provided. |
| FR-PV-112 | This grace period aligns with the ACTIVE_INCOMPLETE status defined in the tenant lifecycle (see §B.2). |
B.2 State Machines¶
Tenant Lifecycle State Machine¶
stateDiagram-v2
[*] --> PENDING_VERIFICATION : Self-onboarding (email not yet verified)
[*] --> PENDING_VALIDATION : CRM channel (manager approval needed)
[*] --> PENDING : Admin channel (direct creation)
PENDING_VERIFICATION --> PENDING : Email verified
PENDING_VALIDATION --> PENDING : CRM manager approved
PENDING --> ACTIVE : Provisioned + API-method payment collected
PENDING --> ACTIVE_PAYMENT_PENDING : Provisioned + bank transfer chosen
PENDING --> ACTIVE_INCOMPLETE : Provisioned + paid but legal info missing
PENDING --> PAYMENT_REQUIRED : Provisioned + API-method payment failed
PENDING --> TRIAL : Provisioned + free trial started (14 days)
TRIAL --> PAYMENT_REQUIRED : 14-day trial expired without payment
TRIAL --> ACTIVE : Payment collected during trial
PAYMENT_REQUIRED --> ACTIVE : Payment collected (API-method)
PAYMENT_REQUIRED --> ACTIVE_INCOMPLETE : Paid but legal info missing
PAYMENT_REQUIRED --> ACTIVE_PAYMENT_PENDING : Changed to bank transfer
ACTIVE_PAYMENT_PENDING --> ACTIVE : Bank transfer received
ACTIVE_PAYMENT_PENDING --> SUSPENDED : 10 days elapsed without payment
ACTIVE_INCOMPLETE --> ACTIVE : Legal info completed
ACTIVE_INCOMPLETE --> ACTIVE_INCOMPLETE_READONLY : 3 months elapsed without completing info
ACTIVE --> SUSPENDED : Subscription expired (10-day grace) OR admin manual suspension
ACTIVE --> DELETED : Tenant resigns
SUSPENDED --> ACTIVE : Payment received or admin reactivation
SUSPENDED --> DELETED : Grace period expired
DELETED --> [*] : Soft delete (data retained per OHADA 10-year rule)
Key status definitions:
| Status | Meaning | Access Level |
|---|---|---|
PENDING_VERIFICATION |
Email not yet verified (self-onboarding) | No access |
PENDING_VALIDATION |
Awaiting CRM manager approval | No access |
PENDING |
Awaiting provisioning | No access |
TRIAL |
Free trial active (14 days) | Full access to selected modules |
PAYMENT_REQUIRED |
API-method payment failed or trial expired | Read-only (all modules) |
ACTIVE_PAYMENT_PENDING |
Bank transfer chosen, 10-day grace | Full access |
ACTIVE_INCOMPLETE |
Paid but RCCM/legal info missing | Full access (3-month grace) |
ACTIVE_INCOMPLETE_READONLY |
3 months without completing legal info | Read-only |
ACTIVE |
Fully active and paid | Full access |
SUSPENDED |
Subscription expired or admin suspension | Read-only for 10 days, then blocked |
DELETED |
Soft-deleted | No access. Data retained per OHADA. |
Employee Lifecycle State Machine¶
stateDiagram-v2
[*] --> ACTIVE : Employee created (onboarded)
ACTIVE --> ON_LEAVE : Leave period starts
ACTIVE --> SUSPENDED : Administrative suspension
ACTIVE --> TERMINATED : Offboarding/termination
ON_LEAVE --> ACTIVE : Leave period ends
ON_LEAVE --> TERMINATED : Terminated while on leave
SUSPENDED --> ACTIVE : Suspension lifted
SUSPENDED --> TERMINATED : Terminated while suspended
TERMINATED --> [*] : Final state (data retained)
Module Subscription State Machine¶
MVP statuses: INACTIVE, TRIAL, ACTIVE only.
stateDiagram-v2
[*] --> INACTIVE : Module not purchased
INACTIVE --> TRIAL : Trial started
INACTIVE --> ACTIVE : Module purchased
TRIAL --> ACTIVE : Paid after trial
TRIAL --> INACTIVE : Trial expired
ACTIVE --> READONLY_GRACE : Module deactivated (6-month grace) [V2]
ACTIVE --> ACTIVE : Renewed
READONLY_GRACE --> HIDDEN : 6 months elapsed [V2]
HIDDEN --> ACTIVE : Re-activated (data restored to visibility) [V2]
V2 note:
READONLY_GRACEandHIDDENare not in MVP. In MVP, deactivating a module immediately sets it back toINACTIVE(data preserved in DB but not accessible). The 6-month grace period and hidden-data states are V2 features.
B.3 Decision Tables¶
Tenant Status After Onboarding¶
| Channel | Payment Method | Payment Result | Legal Info Complete? | → Status |
|---|---|---|---|---|
| Self | API-method | Success | Yes | ACTIVE |
| Self | API-method | Success | No (RCCM missing) | ACTIVE_INCOMPLETE |
| Self | API-method | Failed | — | PAYMENT_REQUIRED |
| Self | Bank transfer | Pending | — | ACTIVE_PAYMENT_PENDING |
| Self | Free trial | N/A | — | TRIAL |
| CRM | API-method | Success | Yes | ACTIVE |
| CRM | API-method | Success | No | ACTIVE_INCOMPLETE |
| CRM | Bank transfer | Pending | — | ACTIVE_PAYMENT_PENDING |
| Admin | API-method | Success | Yes | ACTIVE |
| Admin | Bank transfer | Pending | — | ACTIVE_PAYMENT_PENDING |
Approval Routing Decision¶
| Employee's Org Unit Has Manager? | Employee IS the Manager? | Parent Unit Has Manager? | → Approver |
|---|---|---|---|
| Yes | No | — | Org unit manager |
| Yes | Yes | Yes | Parent unit manager |
| Yes | Yes | No | Company Owner (self-approve if owner) |
| No | — | — | Company Owner |
Offline Write Capability¶
| Operation Type | Offline Capable? | Sync Behavior |
|---|---|---|
| Clock-in / Clock-out | ✅ Yes | Queue in IndexedDB, sync on reconnect |
| Expense entry (draft) | ✅ Yes | Queue, sync on reconnect |
| Leave request (draft) | ✅ Yes | Queue, sync on reconnect |
| Profile view | ✅ Yes (cached) | Read from IndexedDB cache |
| Leave approval | ❌ No | Requires connectivity |
| Commitment approval | ❌ No | Requires connectivity |
| Payroll computation | ❌ No | Requires connectivity |
| Budget reservation | ❌ No | Requires connectivity |
| User management | ❌ No | Requires connectivity |
| Billing operations | ❌ No | Requires connectivity |
B.4 Data Requirements¶
Three-Layer Employee Data Model¶
Layer 1 — Control Plane (always present):
Baseline employee: last_name, first_name, email, phone, employee_number,
contract_type_id (FK), org_unit_id (FK), position_id (FK),
category_id (FK or derived from Position→Category),
hire_date, status (ACTIVE | ON_LEAVE | SUSPENDED | TERMINATED),
preferred_contact (EMAIL | SMS)
↓ Sufficient for Absence, Attendance, Payroll to function
↓ MVP Payroll uses this layer only
Layer 2 — HR Core (optional, sellable):
Enriched: date_of_birth, nationality, national_id_number,
marital_status, dependents_count, photo, emergency_contacts[],
bank_info (bank_name, account_number, IBAN),
current_contract_snapshot (start, end, probation_end, salary, grade),
document_attachments[], change_history[]
↓ Complete "dossier du personnel"
↓ Post-MVP: bank info enables Payroll payment orders
Layer 3 — Employee Management (optional, sellable):
Process layer: onboarding_events[], offboarding_events[],
contract_history[], reassignment_history[],
probation_tracking, cdd_renewal_tracking,
immutable_event_timeline[], compliance_exports
↓ "Actes administratifs" — formal HR process management
Key Entities Summary¶
| Entity | Owner Module | Tenant-Scoped | Key Fields |
|---|---|---|---|
| Tenant | Control Plane | N/A (is the scope) | company_name, country_code, employee_count, db_profile, status, onboarding_channel, fiscal_year_start_month, owner_user_id, owner_employment_status |
| User | Control Plane | Yes | email, name, phone, tenant_associations[], status |
| Employee | Control Plane | Yes | last_name,first_name, email, phone, employee_number, contract_type_id, org_unit_id, position_id, category_id, hire_date, manager (via org unit), status, preferred_contact |
| OrganisationalUnit | Org & Master Data | Yes | name, type, parent_id, manager_id, status |
| Position | Org & Master Data | Yes | title, description, category_id, department_id, status |
| EmployeeCategory | Org & Master Data | Yes | name, code, country_code, sort_order, is_system (seeded vs custom) |
| ContractType | Org & Master Data | Yes | name, code, country_code, max_duration_months |
| TenantModule | Control Plane | Yes | module_code, status, activated_date, deactivated_date |
| AuditEntry | Control Plane | Yes | user_id, entity_type, entity_id, action, before_value, after_value, timestamp |
| CountryConfig | Control Plane | No (platform-wide) | country_code, fiscal_year, config_type, config_data, effective_date |
B.5 Multi-Tenant Implications¶
| Concern | Shared DB | Schema-per-Tenant | DB-per-Tenant | BYO-DB |
|---|---|---|---|---|
| Tenant isolation | tenant_id column on every table. Every query includes WHERE tenant_id = ?. |
Schema isolation. Queries don't need tenant_id filter (schema IS the filter). | Full DB isolation. Connection pool per tenant. | Tenant provides connection. Full isolation. |
| Module gating | tenant_modules table in shared DB. |
Same table in tenant's schema. | Same table in tenant's DB. | Same table in tenant's DB. |
| Country config | Platform-wide table (not tenant-scoped). All tenants read from same config. | Same — platform-wide table in a shared schema. | Same — platform DB, not tenant DB. | Same — platform DB. |
| Audit trail | Tenant-scoped rows in shared audit table. | Per-schema audit table. | Per-DB audit table. | Per-DB audit table. |
| Org & Master Data | Tenant-scoped rows. | Per-schema tables. | Per-DB tables. | Per-DB tables. |
| Multi-tenant user | User→Tenant mapping table. JWT re-issued per tenant switch. | User exists in platform DB. Tenant switch changes schema context. | User exists in platform DB. Tenant switch changes DB connection. | Same. |
Design principle: Design for BYO-DB first (hardest case), then simplify. The data model must work without relying on cross-tenant JOINs.
B.6 Cross-Module Dependencies¶
Detailed in §A.7 (events and API dependencies). Key principles:
- Spring Modulith boundaries are sacred: modules communicate via Application Events for async operations, REST API for sync reads. Never direct method calls across module boundaries.
- Event names are contracts: changing an event name or payload is a breaking change. Event schemas must be versioned.
- API endpoints are contracts: the backend serves both Papillon and Enterprise frontends. Endpoints must be UI-agnostic — return data, not presentation.
- Module gating is enforced at API level: every endpoint checks
TenantContextfor module activation before processing.
PART C — Constraints & Boundaries¶
C.1 Regulatory Compliance — CI (Côte d'Ivoire)¶
OHADA Supranational Framework¶
OHADA provides supranational commercial law via 11 Uniform Acts. Key acts for ALTARYS:
| Uniform Act | Relevance | Platform Impact |
|---|---|---|
| AUDCIF (Accounting) | SYSCOHADA revised accounting framework (2017). Mandatory chart of accounts. Calendar year closing. | Accounting module seed data. Fiscal year default Jan-Dec. 10-year document retention. |
| AUSCGIE (Commercial Companies) | Company forms (SARL, SAS, SA, EI). Commissaire aux comptes thresholds. | Tenant company_form field. Employee category implications. |
| AUPSRVE (Debt Recovery) | Salary garnishment rules. | Payroll deduction rules (V2). |
Critical: OHADA does NOT harmonize labor law. Each country has its own Code du Travail, social security system, and tax rules. The platform must be country-configurable, not OHADA-uniform.
CI Labor Law¶
- Code du Travail: Loi n°2015-532 du 20 juillet 2015
- Contract types: CDI, CDD (max 2 years, renewable once per OHADA), Stage, Apprentissage, Journalier
- Employee categories: Cadre, Agent de maîtrise, Employé, Ouvrier (per Convention Collective Interprofessionnelle de CI)
- Staff delegation threshold: >10 employees (Décret n°2024-901 du 16 octobre 2024)
- Internal rules (Règlement Intérieur): Required for >10 employees
- Domestic workers: Explicitly out of scope for ALTARYS. Platform targets formal businesses only.
CI Data Privacy¶
- Law: Loi n°2013-450 relative à la protection des données à caractère personnel
- Authority: ARTCI (Autorité de Régulation des Télécommunications/TIC de Côte d'Ivoire)
- Cross-border transfer: Requires formal ARTCI authorization for data hosted outside CEDEAO
- Employee rights: Right to access, rectification, and portability of personal data
- Platform implications:
- 🔴 CRITICAL ACTION ITEM: ARTCI authorization for cross-border data transfer NOT YET STARTED. Hosting is planned in Europe. This is potentially MVP-blocking. Legal consultation required immediately.
- Employee self-export feature (FR-PV-092) addresses the portability right.
- Privacy policy and data processing agreements must be in place.
CI Social Security (Reference Only — NOT Implementation-Ready)¶
⚠️ The following rates are documented as informational context only. They are sourced from secondary sources (Cleiss.fr) and a 2012 Ordonnance. They MUST be re-researched with primary decree citations before the Payroll module implementation.
| Contribution | Rate | Employer Share | Employee Share | Ceiling |
|---|---|---|---|---|
| Pension (Retraite) | 14% | 7.7% | 6.3% | 3,375,000 FCFA/month |
| Family Benefits (PF) | 5% | 5% | 0% | 70,000 FCFA/month |
| Maternity | 0.75% | 0.75% | 0% | 70,000 FCFA/month |
| Workplace Accidents (AT/MP) | 2-5% | 2-5% | 0% | 70,000 FCFA/month |
| CMU (Health) | 1,000 FCFA/person | 500 FCFA | 500 FCFA | Flat rate |
Source: Cleiss.fr, CNPS CI schedules, Ordonnance n°2012-03. [REFERENCE ONLY — source unverified, must be confirmed with CNPS CI before Payroll go-live]
CI Tax (Reference Only)¶
- ITS (Impôt sur Traitements et Salaires): Brackets and rates NOT covered in platform-vision research. Deferred to Payroll module legal research.
- Tax ID: IDU (Identifiant Unique) format for CI businesses.
SYSCOHADA 2017¶
- Standard chart of accounts applicable across all 17 OHADA member states.
- Seeded at tenant onboarding as part of Country Configuration.
- Key account classes for HR/Payroll: Class 6 (charges), particularly accounts 64x (personnel costs), 66x (social contributions).
- Fiscal year MUST close 31 December per AUDCIF Art. 7 (see TV-01 for platform override decision).
C.2 Localization Requirements — CI¶
| Aspect | Requirement |
|---|---|
| Language | French (primary and default). All UI strings externalized via i18n. |
| Currency | XOF (Franc CFA BCEAO). Zero decimal places. Display: 15 000 FCFA. |
| Date format | DD/MM/YYYY |
| Number format | Space as thousands separator: 1 000 000 |
| Name conventions | Last name first in formal contexts: KOUASSI Jean-Pierre |
| Phone format | CI mobile: +225 XX XX XX XX XX (10 digits after country code) |
| Business hours | Typical: 8h-12h, 14h30-17h30 (with lunch break). 40h/week. |
| Public holidays | Seeded per year in Country Configuration engine. ~12-14 per year for CI. |
| Future: English | Cameroun bilingual mode (V2, Month 9+) |
| Future: Portuguese | Guinée Bissau (V2+) |
C.3 Security Requirements¶
| Requirement | Implementation |
|---|---|
| Authentication | Keycloak (OIDC/OAuth2). Email + password for MVP. SSO/SAML for Enterprise V2. |
| JWT claims | user_id, tenant_id, country_code, roles[]. Roles only in JWT — permissions resolved server-side and cached per session. |
| Tenant isolation | Every DB query includes tenant context. Spring Security filter extracts tenant_id from JWT and sets TenantContext. Zero cross-tenant data leakage. |
| Permission model | RBAC: Role → Permission mapping. Permission format: module.entity.action (e.g., absence.leave_request.approve). Module-gated: permission denied if module inactive. |
| Default roles | DG, RH Manager, Comptable, Employé, Manager (seeded at onboarding). Custom roles in V2. |
| Audit trail | Every create/update/delete produces immutable audit entry. Before/after values as JSON. Retained 10 years. |
| Encryption | HTTPS everywhere. Data at rest encrypted (PostgreSQL TDE or disk encryption). |
| CAPTCHA | Required on self-onboarding public endpoint. Rate limiting on all public endpoints. |
| Financial data | BigDecimal ONLY for all financial calculations. Never double/float. |
| Password policy | Minimum 8 characters, mixed case + number. Managed by Keycloak. |
| Session management | JWT expiry (configurable, default 1 hour). Refresh tokens. |
C.4 Out of Scope¶
The following are explicitly NOT part of the Platform Vision MVP:
| Item | Reason | When |
|---|---|---|
| Countries beyond CI | MVP is CI-only | BJ + CM at Month 9, RDC Month 15, SN Month 18 |
| XAF currency | CEMAC zone (Cameroun) | Month 9 with CM expansion |
| English / Portuguese UI | Anglophone and lusophone markets | V2+ |
| DB profiles B, C, D | Schema-per-tenant, DB-per-tenant, BYO-DB | MVP |
| Native mobile apps | iOS/Android | V2+ (PWA serves mobile for MVP) |
| SSO / OAuth / SAML | Enterprise IT requirement | Enterprise V2 |
| SMS general notifications | Only account activation SMS in MVP | V2 |
| Custom roles per tenant | Default roles only for MVP | V2 |
| Conventions Collectives | Code du Travail defaults only | V2 |
| Multi-entity / group structures | Single entity per tenant for MVP | V2 (Enterprise) |
| Cost centers | Budget by department only for MVP | V2 |
| Domestic workers / household employees | Different CNPS rules, out of target market | Excluded permanently |
| Payroll payment order files | MVP computes payslips, no bank transfer files | Post-MVP (requires HR Core bank info) |
| Document generation (contracts, certificates) | Part of ADVDOC V2 | Post-MVP |
| Integration with banking/government portals | Manual processes for MVP | V2+ |
| Multiple Company Owners per tenant | Single owner for MVP | V2 |
| Advanced reporting / BI | Standard reporting only for MVP | V2 |
| Enterprise brand features | Dense UX, batch operations, SSO, etc. | Month 12-13 frontend prep, Month 18 sales |
| API rate limiting per tenant | Basic IP-level on public endpoints only | V2 |
| Matrix organisations | Simple hierarchy for MVP | V3 (Enterprise) |
Shared Infrastructure Requirements (Cross-Cutting)¶
Authentication & Authorization¶
- Keycloak as identity provider (OIDC/OAuth2)
- MVP: single Keycloak realm, tenants differentiated by JWT claims
- JWT contains:
user_id,tenant_id,country_code,roles[] - Permissions resolved server-side from role→permission mappings, cached per session
- Login via email + password. Password recovery via email.
- Multi-tenant user support: single Keycloak account, tenant switcher in-app
- V2+: SSO/OAuth, realm-per-enterprise-tenant for silo isolation
Multi-Tenant Resolution¶
- Tenant resolved from JWT token on every request
- Spring Security filter extracts
tenant_idandcountry_codefrom JWT → setsTenantContext(ThreadLocal / ScopedValue) - Every downstream service and repository uses
TenantContextto scope data access - 4 database profiles supported (MVP: Shared DB & DB-Per-Tenant only)
Audit Trail¶
- Every create/update/delete logged: who, when, what, before/after values (JSON)
- Immutable — no delete, no modify
- Queryable by tenant admins (filterable by entity, user, date range)
- Scoped to tenant (tenant admin sees only their tenant's audit trail)
- Platform admin can query across all tenants
- Retained minimum 10 years (OHADA AUDCIF)
Offline Support¶
- PWA with Service Worker for app shell caching
- IndexedDB for offline write queue and read cache
- Sync status indicator always visible
- Auto-save on all form fields
- Selective offline writes (see FR-PV-060 through FR-PV-064)
i18n / Localization¶
- French as primary and default language
- All user-facing strings externalized in translation files
- Date format: DD/MM/YYYY
- Number format: space as thousands separator
- Currency: XOF with 0 decimal places
Notification Service¶
- In-app: WebSocket (real-time), queued for offline delivery
- Email: critical actions, account activation, alerts
- SMS: account activation/password links only (MVP)
- Admin-controlled notification preferences (MVP)
Basic Document Attachment¶
- MinIO backend for all tenant document storage
- Simple upload/download (no versioning without ADVDOC)
- Tenant-scoped storage buckets
- Storage quotas enforced per segment (S1-S6)
- OHADA 10-year retention enforced for payroll/accounting documents regardless of ADVDOC
Country Configuration Engine¶
- DB-driven (not hardcoded) — admin can update without redeployment
- Versioned per fiscal year
- Stores: tax tables, social contribution rates, leave entitlements, public holidays, SYSCOHADA chart of accounts, default categories, default contract types
- MVP: CI only. Month 9: add BJ + CM.
Glossary (Ubiquitous Language)¶
| Concept (FR) | Concept (EN) | Definition | Used By |
|---|---|---|---|
| Locataire | Tenant | A client company using the platform. Identified by tenant_id. Each has its own data space. |
All modules |
| Employé | Employee | A person employed by a tenant. Has contract type, department, position, category. Baseline in CP; enriched by HR Core. | HR Core, Emp Mgmt, Absence, Attendance, Payroll, etc. |
| Dossier du Personnel | Employee File | Complete record of employee data. Owned by HR Core. | HR Core, Emp Mgmt |
| Acte Administratif | Administrative Event | Formal, immutable record of an HR action (onboarding, offboarding, reassignment). | Emp Mgmt |
| Exercice Fiscal | Fiscal Year | 12-month accounting period. Default Jan-Dec (OHADA). Configurable with warning. | Budget, Commitment, Expense, Accounting |
| Ligne Budgétaire | Budget Line | Allocated amount for an expense category within a fiscal year. | Budget Lines, Commitment, Expense |
| Engagement | Commitment | Formal commitment to spend (e.g., purchase order). Reserves budget. | Commitment Mgmt, Budget Lines |
| Type de Congé | Leave Type | Category of absence (annual, sick, maternity). Each has rules. | Absence Mgmt |
| Bulletin de Paie | Payslip | Monthly salary computation document. Gross, deductions, net. | Payroll |
| Utilisateur | User | Person who can log in. Has roles/permissions. May or may not be an Employee. | CP, All modules |
| Rôle | Role | Named set of permissions (DG, RH Manager, Comptable, Employé, Manager). | CP, enforced everywhere |
| Entrée d'Audit | Audit Entry | Immutable log of who did what, when, to which entity. | All modules |
| Document | Document | File attached to an entity. Basic attachment natively; versioning/retention via ADVDOC. | All modules |
| Gérant / Propriétaire | Company Owner | The tenant's legal representative/owner. Special status: salarié or indépendant. | CP |
| Module Commercial | Sellable Module | A purchasable capability (14 total). Gated per tenant. | CP (gating) |
| Plan de Base | Control Plane | Platform foundation. Always active. Not sellable. | All modules |
| Unité Organisationnelle | Org Unit | Node in the flexible org tree (entity, site, department). | Org & Master Data |
| Poste | Position | Job/role in the catalog. Linked to employee category. | Org & Master Data |
| Catégorie de Salarié | Employee Category | Legal classification (Cadre, Agent de maîtrise, Employé, Ouvrier). Affects CNPS/ITS. | Org & Master Data, Payroll |
| Opérateur | Operator Tenant | Special tenant for ALTARYS staff and partner companies. Used for Internal CRM. | CRM |
Appendix: Module Detail Summaries¶
1. HR Core (HRCORE) — MVP¶
- Employee system of record (dossier du personnel)
- Enriches CP baseline with personal data, bank info, emergency contacts, photos, documents
- Self-service profile view, bulk import, advanced search
- Optional sellable module — CP baseline serves all modules without it
2. Employee Management (EMPMGT) — Post-MVP¶
- Administrative process layer (actes administratifs)
- Onboarding/offboarding events, contract lifecycle, reassignment tracking
- Probation and CDD renewal alerts, compliance exports
- Can operate on CP baseline without HR Core (reduced feature set)
3. Leave & Absence Management (ABSMGT) — MVP¶
- Absence types, accrual rules, individual balances
- Employee requests, org-unit-based approval chain
- Supporting documents, history, payroll export
- Country-specific rules via Country Config
4. QR Code Attendance Control (QRCONTR) — MVP¶
- QR code generation, mobile scanning, timestamp recording
- Optional geolocation, late/absence detection
- Daily history, CSV/Excel exports, manager views
5. Time & Activities (TIMACT) — Post-MVP¶
- Schedule management, shift cycles, rotations
- Advanced time capture, overtime, night/weekend work
- Activity/project tracking, payroll export
6. HSE (HSEMGT) — Post-MVP¶
- Medical visits, fitness assessments
- Workplace accidents, regulatory registers, PPE tracking
- Risk assessments, compliance alerts
7. Expense Management (EXPMGT) — Post-MVP¶
- Expense entry, categories, receipt photos, approval workflows
- Reconciliation, accounting export, mobile-first UX
- Requires Budget Lines (auto-included)
8. Commitment Management (COMMIT) — MVP¶
- Request creation, cost center allocation, multi-level approvals
- Consumption tracking, committed vs actual analysis
- Requires Budget Lines (auto-included)
9. Payroll (PAYROL) — MVP¶
- Payroll item configuration, calculations, payslip generation
- MVP: payslips only, no payment orders
- Social/tax declarations, accounting export
- Most complex module — requires stable Employee + Absence + Attendance data
10-13. Talent & Development — Post-MVP¶
- Performance & Objectives (PERFOB): Reviews, feedback, KPIs
- Skills & GPEC (GPEC): Skills framework, gap analysis, succession planning
- Learning & Training (LTRAIN): Training catalog, sessions, budgets
- Recruitment/ATS (ATSMGT): Job postings, candidate pipeline, hiring
14. Advanced Document Management (ADVDOC) — Post-MVP¶
- Platform-wide document engine (MinIO backend)
- Versioning, retention policies, lifecycle management, advanced search
- Enhances all modules' basic attachment features when active
- Pricing: TBD (standalone sellable module)
This PRD+FSD was produced by the ANALYST personality based on exhaustive interview with the Business Analyst/Product Owner. It serves as the foundational reference for ALL subsequent module-level PRDs, architecture documents, and design specifications.
All module-level PRDs must reference this document for: shared infrastructure, cross-module events, data model conventions, tenant segmentation, approval chain logic, offline strategy, and regulatory framework.