# EnCoach Platform -- QA / UAT Assessment Report **Document Version:** 1.0 **Date:** March 11, 2026 **Prepared By:** Architecture & QA Team **Audience:** Odoo Developer / Frontend Developer **Repositories Assessed:** - Frontend: `https://git.albousalh.com/devops/encoach_frontend_new_v3.git` - Backend: `https://git.albousalh.com/devops/encoach_backend_new_v3.git` **Assessed Against:** - `ENCOACH_USER_STORIES.md` v2.0 (83 atomic user stories) - `ENCOACH_WORKFLOWS_FRONTEND_SRS.md` v1.1 - `ENCOACH_WORKFLOWS_BACKEND_SRS.md` v1.1 - `encoach_workflows_v3.pdf` v3.0 --- ## Table of Contents 1. [Executive Summary](#1-executive-summary) 2. [Assessment Scope and Methodology](#2-assessment-scope-and-methodology) 3. [P0 -- Blocker Issues (Must Fix Immediately)](#3-p0----blocker-issues) 4. [P1 -- High Severity Issues (Must Fix Before UAT)](#4-p1----high-severity-issues) 5. [P2 -- Medium Severity Issues (Should Fix Before Production)](#5-p2----medium-severity-issues) 6. [P3 -- Low Severity / Observations](#6-p3----low-severity--observations) 7. [User Story Coverage Matrix](#7-user-story-coverage-matrix) 8. [Overall Statistics](#8-overall-statistics) 9. [Appendix A -- API Contract Mismatches (Full Detail)](#9-appendix-a----api-contract-mismatches) 10. [Appendix B -- Stub / Placeholder Inventory](#10-appendix-b----stub--placeholder-inventory) --- ## 1. Executive Summary A thorough code-level audit was performed on both the frontend (React 18 / Vite / TypeScript) and backend (Odoo 19 custom addons) repositories. The codebase was traced line-by-line against all 83 user stories, the frontend and backend SRS documents, and the original workflow specification. **Key findings:** - **53 out of 83** user stories (63.9%) are fully implemented and functional end-to-end. - **11 stories** (13.3%) are partially implemented with minor gaps or caveats. - **19 stories** (22.9%) are blocked or broken due to API mismatches, missing endpoints, or stub implementations. - **8 API path mismatches** exist between the frontend service layer and backend controllers. These will cause **runtime 404 errors** and must be resolved before any integration testing. - **3 backend endpoints** required by the frontend do not exist at all. - **8 frontend features** are currently stub/placeholder implementations (no real functionality). - **Zero automated tests** exist in either repository. - **No deployment configuration** (Docker, requirements.txt) exists in the backend repository. The platform cannot proceed to UAT until the P0 (blocker) items in Section 3 are resolved. --- ## 2. Assessment Scope and Methodology ### What Was Examined | Layer | Files Examined | Approach | |-------|---------------|----------| | Frontend Routes | `App.tsx` -- 124 route definitions | Every `` path traced to its component | | Frontend Services | 54 service files in `src/services/` | Every API endpoint URL and HTTP method extracted | | Frontend Pages | 130 page components across `admin/`, `student/`, `teacher/`, root | Read source code for critical pages | | Frontend Types | 40+ type definition files in `src/types/` | Cross-referenced with SRS type inventory | | Backend Controllers | 24 controller files across all custom modules | Every `@http.route` decorator extracted (approx. 150 endpoints) | | Backend Models | All `models/*.py` files across 24 modules | Field definitions and business logic reviewed | | Backend Services | AI services, PDF generator, CSV parser, credential service | Implementation depth assessed (real logic vs stub) | | Backend Security | 22 `ir.model.access.csv` files, 1 security XML | Access rules reviewed | ### What Was NOT Examined - Runtime behavior on the staging server (no live testing performed) - OpenEduCat community/enterprise module internals - Third-party API integrations (OpenAI, AWS Polly, ELAI) -- only checked that service code exists - Database content / seed data correctness --- ## 3. P0 -- Blocker Issues These issues will cause immediate failures. The platform **cannot be tested** until they are resolved. ### BUG-001: Frontend-Backend API Path Mismatches (8 paths) The frontend service layer calls endpoint URLs that do not match the routes registered in the backend controllers. Every one of these will produce a **404 Not Found** at runtime. | # | Frontend Path (from service) | Backend Path (from controller) | Service File | Controller File | |---|------------------------------|-------------------------------|--------------|-----------------| | 1 | `/api/entity/students/csv/validate` | `/api/entity/students/validate-csv` | `entity-onboarding.service.ts` | `entity_onboard.py` | | 2 | `/api/entity/students/:id/resend-credential` | `/api/entity/students/:id/resend-credentials` | `entity-onboarding.service.ts` | `entity_onboard.py` | | 3 | `/api/entity/students/resend-credentials/pending` | `/api/entity/students/resend-all-pending` | `entity-onboarding.service.ts` | `entity_onboard.py` | | 4 | `/api/adaptive-engine/dashboard` | `/api/adaptive/dashboard` | `adaptive-engine.service.ts` | `adaptive.py` | | 5 | `/api/adaptive-engine/students/:id/signals` | `/api/adaptive/student/:id/signals` | `adaptive-engine.service.ts` | `adaptive.py` | | 6 | `/api/adaptive-engine/settings` | `/api/adaptive/settings` | `adaptive-engine.service.ts` | `adaptive.py` | | 7 | `/api/reset/sendVerification` | **(does not exist)** | `auth.service.ts` | -- | | 8 | `/api/auth/invite/set-password` | **(does not exist)** | `auth.service.ts` | -- | **Action required:** Align paths. Either update the frontend service files to match the backend routes, or update the backend routes to match the frontend. Both sides must agree on a single path. ### BUG-002: Send Credentials Payload Key Mismatch - **Frontend** (`entity-onboarding.service.ts`): sends `{ student_ids: number[] }` - **Backend** (`entity_onboard.py`): expects `user_ids` in the JSON body The backend will receive an empty or null `user_ids` list, resulting in no credentials being sent. **Action required:** Align the JSON key name on both sides. ### BUG-003: OTP Email Not Delivered - **File:** `encoach_signup/controllers/auth.py` - **Issue:** When a user registers and an OTP is generated, the OTP code is only written to `_logger.info()` (Python log). There is no `mail.mail` record created, no SMTP call, and no email template invoked. - **Impact:** Users who register cannot receive their verification code. The entire signup flow (US-SL-01, US-SL-02) is **blocked** for real users. **Action required:** Implement email delivery for OTP codes using Odoo's `mail.mail` or `mail.template` mechanism. ### BUG-004: Duplicate Route Registration - **Routes:** `/api/placement/speaking-upload` and `/api/placement/speaking-status` - **Registered in:** Both `encoach_placement/controllers/placement.py` (`auth='none'` + `@jwt_required`) AND `encoach_ai/controllers/media_controller.py` (`auth='user'`) - **Impact:** Odoo will load only one implementation based on module install order. The active endpoint may use the wrong authentication mode, causing either 401 or 403 errors. **Action required:** Remove the duplicate registration from one of the two modules. ### BUG-005: Missing Backend Endpoint -- Exam Status - **Frontend calls:** `GET /api/exam/:examId/status` (in `exam-session.service.ts`) - **Backend:** This endpoint does not exist in any controller. - **Impact:** The `ExamStatus.tsx` page will always fail to load. **Action required:** Implement the endpoint in the exam session controller, or remove the frontend page if not needed. --- ## 4. P1 -- High Severity Issues These issues represent broken or non-functional features that must be fixed before UAT can begin. ### BUG-006: Exam Results Page Uses Mock Data - **File:** `src/pages/student/ExamResults.tsx` - **Issue:** The page renders static/hardcoded mock data instead of calling `GET /api/exam/:examId/results`. - **Impact:** Students never see their real exam scores. Affects **US-SL-21, US-SL-22, US-SL-23, US-ES-04, US-ES-06**. ### BUG-007: PDF Download Button Not Wired - **File:** `src/pages/student/ExamResults.tsx` - **Issue:** A "Download PDF Report" button is rendered but has **no `onClick` handler**. The `reportService.downloadPdf()` function exists in `report.service.ts` but is never imported or called anywhere in the codebase. - **Impact:** Students and entity students cannot download their score reports. Affects **US-SL-32, US-ES-08**. ### BUG-008: PDF Report Skill Column Bug - **File:** `encoach_pdf_report/services/pdf_generator.py` - **Issue:** The code uses `getattr(score, 'skill_name', '')` and `getattr(score, 'name', ...)`, but the `encoach.score` model defines the field as `skill` (not `skill_name` or `name`). The skill column in generated PDFs will display "N/A" for all rows. - **Impact:** PDF reports are generated but contain incorrect data. ### BUG-009: CAPTCHA Widget Not Integrated - **File:** `src/pages/Register.tsx` - **Issue:** The registration page displays a dashed placeholder box labeled "Verification widget placeholder" and submits a hardcoded `captcha_token: "demo-placeholder"`. No reCAPTCHA, hCaptcha, or Turnstile SDK is loaded. The backend **does** implement CAPTCHA validation and exposes `GET /api/config/captcha` for the provider/site-key, but the frontend never calls it. - **Impact:** Registration is unprotected against bots. Affects **US-SL-01**. ### BUG-010: Speaking Recording Not Implemented (Both Placement and Exam) - **Placement** (`src/pages/student/PlacementTest.tsx`): Shows "Recording will be available in a future update" with a disabled button. - **Exam** (`src/pages/student/ExamSession.tsx`): Shows "Recording interface will appear here." - **Impact:** Speaking skill assessment is completely non-functional. Affects **US-SL-11, US-SL-19, US-AD-27**. ### BUG-011: Listening Audio Playback Not Implemented - **File:** `src/pages/student/ExamSession.tsx` - **Issue:** The listening section displays a fake progress bar and a static timestamp `0:00 / 3:42`. No actual audio element or playback controls exist. - **Impact:** Listening skill assessment is non-functional. Affects **US-SL-16**. ### BUG-012: Custom Exam Question Pool Uses Fake IDs - **File:** `src/pages/admin/CustomExamCreate.tsx` - **Issue:** Step 3 ("Assign Questions") uses `Math.random()` to generate question IDs instead of querying the real content pool API. The "Browse content pool" action navigates away from the wizard. - **Impact:** Custom exams cannot have real questions assigned. Affects **US-AD-22**. ### BUG-013: No Subscription/Trial Endpoint - **Frontend calls:** `POST /api/subscription/trial` (in `placement.service.ts`) - **Backend:** No `/api/subscription` route or payment/billing logic exists anywhere in the backend codebase. - **Impact:** The payment/access flow after placement results is non-functional. Affects **US-SL-14**. ### BUG-014: Missing Dependency Declaration in `encoach_branding` - **File:** `encoach_branding/__manifest__.py` - **Issue:** The module imports JWT helpers from `encoach_api.controllers.base` but does not declare `encoach_api` in its `depends` list. If `encoach_api` is not installed, `encoach_branding` will crash on import. - **Impact:** Module may fail to load depending on installation order. ### BUG-015: Speaking Transcription Status Always Returns "completed" - **File:** `encoach_placement/controllers/placement.py` - **Issue:** The `speaking-status` endpoint always returns `{ status: "completed", transcription: null }` regardless of whether transcription has actually occurred. No Whisper pipeline is wired in the placement controller. - **Impact:** Speaking placement scores are never actually computed from audio. Affects **US-SL-11**. ### BUG-016: Undeclared Python Dependencies The following Python packages are imported and used in backend code but are **not declared** in any module's `__manifest__.py` `external_dependencies`: | Package | Used In | Purpose | |---------|---------|---------| | `PyJWT` (as `jwt`) | `encoach_api`, `encoach_exam_session` | JWT token handling | | `openai` | `encoach_ai/services/openai_service.py` | AI completions | | `boto3` | `encoach_ai/services/polly_service.py` | AWS Polly TTS | | `requests` | `encoach_signup/services/captcha_service.py` | CAPTCHA verification | Additionally, there is **no** `requirements.txt`, `pyproject.toml`, or `setup.py` in the backend repository. A fresh deployment will fail if these packages are not pre-installed. --- ## 5. P2 -- Medium Severity Issues ### BUG-017: No React Error Boundary No Error Boundary component exists in the frontend. An unhandled JavaScript error in any component will crash the entire application with a white screen. An `ErrorBoundary` should wrap the main `` tree. ### BUG-018: XSS Risk in AI Workbench - **File:** `src/pages/teacher/AiWorkbench.tsx` - **Issue:** `generatedContent.content` is rendered via `dangerouslySetInnerHTML` without any sanitization (e.g., DOMPurify). If the AI returns content containing `