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.
42 lines
1.4 KiB
Python
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}"
|