118 Commits

Author SHA1 Message Date
e2109ff913 fix: QI project Excel export — PDCAPhaseChoices/FOCUSPhaseChoices not imported
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m25s
NameError in export_utils.py (line 168 used PDCAPhaseChoices.choices without
importing it). Added the import. Re-verified: export now returns 200 with
correct content-type (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet).
2026-06-16 23:59:42 +03:00
badb6a9ebf feat: QI Projects — team-member task management + My Tasks + notifications
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m41s
Fixed 3 gaps in the QI Projects module:

Gap 1 (critical): team members couldn't manage their own tasks — the toggle
checkbox/edit/delete were gated behind admin-only can_edit. Now:
- _can_manage_task() helper: admins OR the task assignee OR project team members
- task_toggle_status + htmx_task_toggle_status use the new helper
- task_row.html shows the toggle for assignees (task.assigned_to.user_id check)

Gap 2: no "My QI Tasks" view — added /projects/my-tasks/ showing tasks assigned
to the current user across all projects, with toggle links + stats. Sidebar link.

Gap 3: no notification on task assignment — added apps/projects/signals.py
(post_save on QIProjectTask → create_in_app_notification). apps.py ready() wired.

Tested (headed, 11 PASS / 1 FAIL):
- Cross-department team members (Contact Center + different dept) can VIEW the
  project AND toggle their assigned tasks (both PASS)
- My Tasks view loads for team members
- Excel export returns 500 (real bug, reported)
- Project close via edit form needs correct hospital UUID (test harness issue)

Also bundles accumulated in-progress work across complaints, observations,
organizations, templates, and other modules.

Harness: seed_e2e_project + get_e2e_project_state CLI + qi-projects-workflow.spec.ts
2026-06-16 23:55:58 +03:00
1ee9ae807b test: complaint full lifecycle (create -> resolve) + fix public_submit NameError
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m11s
One continuous E2E test from public-form creation through resolution:
1. CREATE (public form POST) -> captures CMP- reference
2. ACTIVATE (open -> in_progress)
3. SEND TO DEPARTMENT (creates ComplaintInvolvedDepartment)
4. CHAMPION RESPONDS (department response)
5. MANAGER APPROVES
6. PX ACCEPTS
7. RESOLVE

Fix: NameError in public_complaint_submit (reference_number was undefined after
removing the legacy CMP- generator). Also fixed the same in the inquiry public
submit path (ui_views.py). Both now read complaint.reference_number /
inquiry.reference_number after save().

Harness: get_e2e_complaint_id CLI + seed_e2e_complaint other_dept_id output.
2026-06-15 16:20:55 +03:00
553364b82c test: send-to-person workflow (assign + reassign) across complaint/inquiry/observation
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m21s
Covers the recipient_type=person branch of the unified send-to endpoint for all
3 modules: assign to px_employee, verify the assignee can open the item detail,
then reassign to a different user. 3/3 pass, 0 FAIL.

Harness: get_e2e_user_id + get_e2e_assignment_state CLI helpers.
2026-06-15 15:11:54 +03:00
45b75eb9ef fix: align workflow behavior (Phase 1) + lucide icon-race mitigation
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m27s
Behavioral consistency across complaint/inquiry/observation (re-run: 0 FAIL):
- activation gate on complaints: complaint_send_to + send_to_department_form now
  reject status=open ("Activate this complaint before sending it to a department")
- observation resolve dead-end fixed: observation_change_status now allows
  hospital_admin (was triage_perm/px_admin only) + added a Resolve action on the
  observation detail page -> accepted dept responses can be resolved from the flow
- status validation: Observation.clean() rejects invalid statuses + a DB
  CheckConstraint (migration 0016 normalizes legacy "new"->"open" first)
- inquiry sent_to_department consistency: inquiry_transfer_to_department now also
  sets sent_to_department=True/At (matches observation/complaint for cross-module queries)

Lucide icon-race mitigation: added a defensive `window.lucide || {createIcons:noop}`
shim to the three base layouts + standalone CDN pages (login, select_hospital,
password reset) so the "lucide is not defined" ReferenceError can't throw during
navigation races. Audit listener classifies any residual occurrence as WARN (cosmetic).

Docs: docs/workflows.md records the intentional complaint vs inquiry/observation
differences (multi-dept join + manager review vs single-dept flat) + the field-name map.

Specs: champion spec now activates before send (matches the new gate).
2026-06-14 23:27:03 +03:00
32e2a3f996 fix: require activation before sending observation/inquiry to a department
Some checks failed
Build and Push Docker Image / build (push) Failing after 6m52s
An item could be sent to a department while still in its initial (open) state,
bypassing activation. Added a status guard to the 4 send entry points:
- observation_send_to_department / observation_send_to (AJAX)
- inquiry_transfer_to_department / inquiry_send_to (AJAX)
Rejects with "Activate this {observation/inquiry} before sending it to a
department." if status is open. Re-sends after a rejection still work (item
stays in_progress).

Also:
- seed_e2e_dept_response: observation status "new" -> "open" (valid initial;
  "new" isn't a valid ObservationStatus, which is why activate never moved it)
- spec: Flow A/B/C now activate before send
2026-06-14 21:27:39 +03:00
adff7dd8b5 fix: token-response forms, inquiry dept-response 500, get_email_header_html, lucide
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m15s
Bugs 4-8 from the QA audit, all re-verified (re-run: 0 FAIL):
- token-response form pages (inquiry + observation, 8 templates) extended the
  static dashboard base (no {% block content %}) -> form was dropped. Switched
  to layouts/public_base.html; form + csrf now render, anonymous token POST works
- inquiry dept-response GET 500 (missing template) -> created
  complaints/inquiry_department_response.html (mirrors the observation one)
- NameError get_email_header_html in notifications/settings_service.py
  (send_inquiry_department_assigned/_resolved/_reopened) -> added to the imports
- "lucide is not defined" -> guarded the unguarded lucide.createIcons() in
  layouts/base.html and added a guarded init to layouts/public_base.html
- dept analytics XHR ERR_ABORTED -> verified endpoint returns 200 (test artifact)

Report updated: §13 issues marked fixed.
2026-06-14 20:13:45 +03:00
8c75baf30a test: make inquiry/observation Flow A visible (UI-driven with API fallback)
All checks were successful
Build and Push Docker Image / build (push) Successful in 28s
Flow A now drives the real screens - detail page, Send-to modal, dept-response
page, Accept button - so the run is watchable in headed mode. Each visible step
falls back to a direct POST if the UI doesn't persist, so the flow still
completes reliably. Flows B/C unchanged.
2026-06-14 19:05:07 +03:00
23b6e239b5 test: inquiry + observation dept-response workflow E2E
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m2s
Adds headed Playwright coverage for the simpler dept-response flow
(PX send -> champion responds -> PX accept/reject), 3 flows per module
(happy path, token response, reject loop). 6/6 pass; 50 PASS / 5 WARN / 0 FAIL.

Findings (documented in report):
- token-response form pages (inquiry + observation) render the dashboard
  chrome instead of the response form -> anonymous champions can't submit
  via the emailed link (backend POST still works)
- NameError get_email_header_html in inquiry_transfer_to_department (notif
  email silently fails)
- observation can't jump new->resolved (status machine needs intermediate steps)

Harness:
- seed_e2e_dept_response, get_e2e_dept_response_state CLI helpers
- E2E_MAXIMIZED=1 fullscreen mode in playwright.config.ts
- report: appended "Inquiry & Observation dept-response workflow" section
2026-06-14 16:55:54 +03:00
17981fdf82 test: harden champion/manager spec against post-login session timing
All checks were successful
Build and Push Docker Image / build (push) Successful in 23s
ensureAuth() probes an auth-required endpoint after each login() and re-logs-in
if the session hasn't settled (occasionally needed under slowMo after rapid
role swaps). Also observes the HTTP status of every second-pass POST so any
auth bounce is visible. App logic unchanged (verified via the test client).
2026-06-14 15:37:54 +03:00
ef53f69833 test: champion/manager workflow E2E + fix investigation bugs
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m7s
Adds headed Playwright coverage for the full send-to-department lifecycle
(PX send -> champion investigates -> manager approves/rejects -> PX accepts ->
resolve), including the token investigation sub-flow and both reject loops.

Bugs fixed (found by the new test):
- champion_start_investigation: NameError - InvestigationAnswer not imported
  (complaints/views.py) -> the "create questions" POST was 500ing
- champion_start_investigation: staff_member.phone_number -> Staff.phone
  (would have AttributeError'd once the import was fixed)

Harness:
- create_e2e_isolated_env: bind dept-manager as department.manager + create
  e2e-staff Staff profile in the champion's department
- seed_e2e_complaint, get_e2e_workflow_state CLI helpers for setup/assertions
- champion-manager-workflow.spec.ts (flows A/B/C1/C2)

Report: appended "Champion/Manager Workflow Audit" section.
2026-06-14 15:23:14 +03:00
7369d08012 feat: unified reference numbers + feedback modules QA audit
All checks were successful
Build and Push Docker Image / build (push) Successful in 4m14s
Reference numbers (unified scheme PREFIX-YYYYMM-HOSP-NNNN, e.g. CMP-202606-HHN-0001):
- new ReferenceSequence model + generate_reference() helper (apps/core)
- Complaint/Inquiry/Observation/Appreciation/Suggestion emit unified refs via save()
- prefix-based auto-routing in public track API (CMP/INQ/OBS trackable; APR/SGT internal-only)
- removed legacy CMP-/INQ- generators in ui_views, integrations, px_sources
- migrations: core.0003_referencesequence, appreciation.0006, feedback.0008, observations.0012
- unit tests (format, sanitization, monthly reset, 40-thread concurrency)

QA audit:
- isolated E2E hospital sandbox mirroring HH-N + 10 role users (create_e2e_isolated_env)
- feedback-modules-audit.spec.ts + audit helper (headed, run-to-completion)
- reports/feedback-modules-qa-report.md

Also bundles accumulated in-progress work across complaints, observations,
organizations, templates, and other modules.
2026-06-14 14:29:23 +03:00
7dae32d206 fix: replace pytz with zoneinfo, fix predictive insights list/dict bug
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m15s
2026-05-12 01:32:41 +03:00
76b514d521 update on login page
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m6s
2026-05-12 00:51:14 +03:00
4a139a0fa3 update login page
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m1s
2026-05-12 00:40:09 +03:00
b5335bc9bc fix: add Node.js CSS build step to Dockerfile, fix Caddyfile for local testing
All checks were successful
Build and Push Docker Image / build (push) Successful in 2m11s
2026-05-12 00:27:35 +03:00
b2209ae458 update allowed hosts
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m12s
2026-05-12 00:05:53 +03:00
35c725d276 fix: add appuser home dir in Dockerfile, allow localhost in ALLOWED_HOSTS for healthcheck 2026-05-12 00:03:06 +03:00
fd19216b0d track migrations in git, regenerate fresh initial migrations, add staging-test compose, fix .gitignore
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m5s
2026-05-11 23:34:39 +03:00
4c93105260 updates gitea build file
All checks were successful
Build and Push Docker Image / build (push) Successful in 3m12s
2026-05-11 15:59:49 +03:00
6dd7d47ba2 updates gitea build file
Some checks failed
Build and Push Docker Image / build (push) Failing after 2m42s
2026-05-11 15:50:21 +03:00
08f9c24d39 updates gitea build file
Some checks failed
Build and Push Docker Image / build (push) Failing after 2m38s
2026-05-11 15:40:03 +03:00
ad90824f24 updates gitea build file
Some checks failed
Build and Push Docker Image / build (push) Failing after 23s
2026-05-11 14:53:18 +03:00
54108e2bab updates gitea build file
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
2026-05-11 14:49:39 +03:00
c5f76b3855 updates
Some checks are pending
Build and Push Docker Image / build (push) Waiting to run
2026-05-11 14:45:30 +03:00
09933e1a69 update config
Some checks failed
Build and Push Docker Image / build (push) Failing after 33s
2026-04-19 14:10:17 +03:00
571231b164 update secret
Some checks failed
Build and Push Docker Image / build (push) Failing after 4m12s
2026-04-19 13:54:02 +03:00
43ef57f1b6 Merge pull request 'Add CI pipeline for Docker image builds' (#5) from staging into main
Some checks failed
Build and Push Docker Image / build (push) Failing after 20s
Reviewed-on: #5
2026-04-19 13:48:05 +03:00
946c31cf34 Add CI pipeline for Docker image builds
Some checks failed
Build and Push Docker Image / build (push) Failing after 21s
2026-04-19 13:34:40 +03:00
f219effc33 Add CI pipeline for Docker image builds
Some checks failed
Build and Push Docker Image / build (push) Failing after 5s
2026-04-19 11:36:40 +03:00
e119312a9c clean up version 2026-04-19 10:53:12 +03:00
bcb9c86541 pre dep 2026-04-09 13:46:34 +03:00
177a7e0f5f updates 2026-04-08 17:13:35 +03:00
23d439f5a5 fix: harden multi-tenant data isolation across 8 modules
Pre-production security fixes to prevent cross-hospital data leaks:

- Standards API: add get_queryset() filtering by department__hospital
- Reports service: add user param with hospital filtering to all querysets
- RCA views: replace is_superuser with tenant_hospital pattern, add access
  checks to all 11 mutation views
- Notifications views: replace is_superuser patterns with _get_notification_hospital
  helper across all 5 settings functions
- Appreciation API: add tenant_hospital fallback to AppreciationViewSet,
  AppreciationStatsViewSet, and LeaderboardView
- AI Analytics: add tenant_hospital fallback in ExecutiveSummaryGenerator and
  ActionRecommendationEngine
- SourceUserRestrictionMiddleware: remove None from ALLOWED_URL_NAMES
- Complaint export: fix nullable patient/due_at/description crashes in CSV
  and Excel export, fix invalid get_category_display/get_source_display calls

E2E test updates:
- Update isolation gap tests to actively assert hospital filtering
- Fix CSV export test to use API context for download handling
- Switch clinical-staff tests to serial mode to prevent race conditions
2026-04-07 01:23:10 +03:00
6b51b0870d More updates 2026-03-28 14:03:56 +03:00
Marwan Alwali
69c3fdbb95 images 2026-03-25 10:15:01 +03:00
Marwan Alwali
3c2593de78 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	data.json
2026-03-16 02:12:48 +03:00
0fc06151eb data 2026-03-15 23:48:45 +03:00
Marwan Alwali
a63a25da92 update 2026-03-13 18:43:51 +03:00
1091dcdfde Fix remaining syntax errors in physicians/ui_views.py - remove orphaned lines 2026-03-11 01:37:32 +03:00
ba63f8f1c6 Fix orphaned lines and undefined variables in physicians ui_views.py 2026-03-11 01:33:11 +03:00
3b9468748c Fix syntax errors in forms.py files 2026-03-11 01:26:19 +03:00
da0ca4ee19 Fix hospital fields in forms - Add HospitalFieldMixin and update templates
PHASE 1: Add HospitalFieldMixin to forms without it
- apps/complaints/forms.py: SLAConfigForm, EscalationRuleForm
- apps/feedback/forms.py: FeedbackForm
- apps/rca/forms.py: RootCauseAnalysisForm

PHASE 2: Update templates to conditionally hide hospital field labels
- templates/complaints/complaint_form.html
- templates/complaints/inquiry_form.html
- templates/complaints/complaint_threshold_form.html
- templates/complaints/escalation_rule_form.html
- templates/feedback/feedback_form.html

PHASE 3: Remove redundant manual hospital filtering code
- Removed manual __init__ hospital logic from forms now using mixin

Behavior:
- PX Admin: Sees hospital dropdown (can select any hospital)
- Hospital Admin/Staff: Hospital field hidden, auto-set to their hospital
- Cleaner code: Mixin handles all role-based filtering automatically
2026-03-11 01:19:41 +03:00
b57ce661bb Clean up redundant hospital filtering in views
Removed ~300 lines of redundant hospital filtering code from views.
Templates no longer use hospital dropdowns, so views don't need to:
- Query Hospital.objects.filter()
- Apply RBAC filtering to hospitals queryset
- Pass hospitals to context

The middleware (TenantMiddleware) already handles hospital filtering
via request.tenant_hospital for all users.

Files cleaned:
- apps/surveys/ui_views.py
- apps/callcenter/ui_views.py
- apps/complaints/ui_views.py
- apps/analytics/ui_views.py
- apps/physicians/ui_views.py
- apps/projects/ui_views.py
- apps/feedback/views.py
- apps/dashboard/views.py
- apps/journeys/ui_views.py
- apps/appreciation/ui_views.py
2026-03-11 00:49:42 +03:00
c16e410fdd Remove hospital dropdowns from templates and fix JavaScript dependencies 2026-03-11 00:17:53 +03:00
Marwan Alwali
b383991053 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	apps/dashboard/views.py
#	config/celery.py
2026-03-10 19:42:39 +03:00
01fa26c59a updates 2026-03-09 16:10:24 +03:00
Marwan Alwali
bda6af64a5 update-language-button 2026-02-25 21:52:18 +03:00
Marwan Alwali
fa966a3574 Merge remote-tracking branch 'origin/main' 2026-02-25 21:20:10 +03:00
60839790e8 update 2026-02-25 08:27:21 +03:00