HH/apps/core/reference.py
ismail 7369d08012
All checks were successful
Build and Push Docker Image / build (push) Successful in 4m14s
feat: unified reference numbers + feedback modules QA audit
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

42 lines
1.4 KiB
Python

"""
Unified reference-number generator.
Format: {PREFIX}-{YYYYMM}-{HOSPITAL_TOKEN}-{SEQ:04d}
e.g. CMP-202606-HHN-0001
PREFIX module prefix (CMP/INQ/OBS/APR/SGT)
YYYYMM creation month
HOSPITAL_TOKEN hospital.code sanitized to uppercase alphanumerics
(HH-N -> HHN, E2E-HOSP -> E2EHOSP); "GEN" when no hospital
SEQ 4-digit monthly sequence per (prefix, hospital, month)
The sequence is allocated atomically via ReferenceSequence so it is safe under
concurrent submissions. Legacy references keep their old format (no migration
of historical data); only new records use this generator.
"""
import re
from datetime import datetime
_TOKEN_RE = re.compile(r"[^A-Z0-9]")
def sanitize_hospital_token(hospital) -> str:
"""Derive a clean, format-safe token from a hospital instance."""
code = getattr(hospital, "code", None) if hospital else None
if not code:
return "GEN"
token = _TOKEN_RE.sub("", str(code).upper())
return token or "GEN"
def generate_reference(prefix: str, hospital) -> str:
"""Generate a unified reference number for the given module prefix."""
from apps.core.models import ReferenceSequence
prefix = (prefix or "").upper()
token = sanitize_hospital_token(hospital)
year_month = datetime.now().strftime("%Y%m")
number = ReferenceSequence.next_number(prefix, token, year_month)
return f"{prefix}-{year_month}-{token}-{number:04d}"