From 6e643e1cac36f750c6660f498b58680d31b3b066 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Mon, 6 Oct 2025 15:25:37 +0300 Subject: [PATCH] added gitignore file --- .DS_Store | Bin 18436 -> 18436 bytes .gitignore | 172 + EMR_DATA_GENERATOR_README.md | 349 + SURGERY_CONSOLIDATION_SUMMARY.md | 246 + WORKFLOW_ENHANCEMENT_COMPLETE.md | 328 + _refactor_report/model_map.json | 6261 + .../modular_refactoring_report.md | 5822 + _refactor_report/overlaps.json | 149 + accounts/__pycache__/adapter.cpython-312.pyc | Bin 0 -> 1760 bytes accounts/__pycache__/urls.cpython-312.pyc | Bin 2292 -> 2012 bytes accounts/__pycache__/views.cpython-312.pyc | Bin 52062 -> 52062 bytes accounts/adapter.py | 44 + accounts/migrations/0001_initial.py | 472 + accounts/migrations/0002_initial.py | 116 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 10691 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 3766 bytes accounts/templates/account/login.html | 24 +- accounts/urls.py | 6 +- accounts/views.py | 1205 +- analytics/migrations/0001_initial.py | 623 + analytics/migrations/0002_initial.py | 309 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 15113 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 9157 bytes .../__pycache__/forms.cpython-312.pyc | Bin 34395 -> 37494 bytes appointments/__pycache__/urls.cpython-312.pyc | Bin 8284 -> 8415 bytes .../__pycache__/views.cpython-312.pyc | Bin 106080 -> 122929 bytes appointments/forms.py | 123 +- appointments/migrations/0001_initial.py | 1568 + appointments/migrations/0002_initial.py | 526 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 30125 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 15530 bytes .../templates/appointments/calendar.html | 89 +- .../appointments/queue/queue_display.html | 316 + .../queue/waiting_queue_detail.html | 76 +- .../queue/waiting_queue_form.html | 868 +- .../appointments/scheduling_calendar.html | 2 +- appointments/urls.py | 2 +- appointments/views.py | 1926 +- appointments_data.py | 10 +- billing/migrations/0001_initial.py | 1172 + billing/migrations/0002_initial.py | 418 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 22574 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 12327 bytes .../templates/billing/bills/bill_detail.html | 2 +- .../billing/payments/payment_detail.html | 20 +- blood_bank/migrations/0001_initial.py | 673 + blood_bank/migrations/0002_initial.py | 297 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 18002 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 9731 bytes communications/migrations/0001_initial.py | 968 + communications/migrations/0002_initial.py | 375 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 18786 bytes .../__pycache__/0002_initial.cpython-312.pyc | Bin 0 -> 11196 bytes core/__pycache__/views.cpython-312.pyc | Bin 58466 -> 58561 bytes core/migrations/0001_initial.py | 921 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 19035 bytes core/views.py | 24 +- db.sqlite3 | Bin 0 -> 64204800 bytes emr/__pycache__/models.cpython-312.pyc | Bin 85739 -> 85917 bytes emr/migrations/0001_initial.py | 2727 + ...ique_together_alter_icd10_code_and_more.py | 26 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 59841 bytes ..._alter_icd10_code_and_more.cpython-312.pyc | Bin 0 -> 1032 bytes emr/models.py | 29 +- .../emr/encounters/encounter_detail.html | 6 +- .../emr/problems/problem_detail.html | 52 +- emr_data.py | 384 +- enhancements.txt | 83 + .../migrations/0001_initial.py | 1194 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 30422 bytes .../__pycache__/settings.cpython-312.pyc | Bin 7775 -> 7905 bytes .../__pycache__/urls.cpython-312.pyc | Bin 2530 -> 2622 bytes hospital_management/settings.py | 5 + hospital_management/urls.py | 3 +- hr/migrations/0001_initial.py | 1921 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 44517 bytes inpatients/__pycache__/admin.cpython-312.pyc | Bin 15720 -> 13314 bytes inpatients/__pycache__/forms.cpython-312.pyc | Bin 26076 -> 20257 bytes inpatients/__pycache__/models.cpython-312.pyc | Bin 53044 -> 43788 bytes inpatients/__pycache__/urls.cpython-312.pyc | Bin 8767 -> 7103 bytes inpatients/__pycache__/views.cpython-312.pyc | Bin 135620 -> 108475 bytes inpatients/admin.py | 100 +- inpatients/forms.py | 98 +- inpatients/migrations/0001_initial.py | 1644 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 36983 bytes inpatients/models.py | 321 - .../inpatients/admissions/admission_list.html | 106 +- .../templates/inpatients/dashboard.html | 11 +- .../partials/WARD_STATS_DOCUMENTATION.md | 193 + .../inpatients/partials/ward_stats.html | 15 +- .../templates/inpatients/wards/ward_list.html | 28 +- inpatients/urls.py | 13 - inpatients/views.py | 692 +- inpatients_data.py | 102 +- .../__pycache__/forms.cpython-312.pyc | Bin 0 -> 13594 bytes .../__pycache__/models.cpython-312.pyc | Bin 26705 -> 26752 bytes .../__pycache__/urls.cpython-312.pyc | Bin 0 -> 1801 bytes .../__pycache__/views.cpython-312.pyc | Bin 0 -> 23159 bytes insurance_approvals/forms.py | 27 +- .../migrations/0001_initial.py | 897 + ...ceapprovalrequest_content_type_and_more.py | 25 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 21368 bytes ...uest_content_type_and_more.cpython-312.pyc | Bin 0 -> 1434 bytes insurance_approvals/models.py | 6 +- .../insurance_approvals/dashboard.html | 11 +- insurance_approvals/views.py | 42 +- insurance_approvals_data.py | 2 +- integration/migrations/0001_initial.py | 863 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 25022 bytes inventory/migrations/0001_initial.py | 1568 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 34615 bytes laboratory/migrations/0001_initial.py | 1479 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 31011 bytes logs/hospital_management.log | 98254 ++++++++++++++++ media/dicom/2/.DS_Store | Bin 6148 -> 0 bytes .../.DS_Store | Bin 6148 -> 0 bytes .../RAD-20250929-0002/.DS_Store | Bin 6148 -> 0 bytes ...47739743721617648017668593296284333197.dcm | Bin 525508 -> 0 bytes .../RAD-20250929-0003/.DS_Store | Bin 6148 -> 0 bytes ...93512765977047735031516555377968329182.dcm | Bin 525508 -> 0 bytes ...93085371716606973448212398851894082193.dcm | Bin 525508 -> 0 bytes ....6718116057010946030800242287053901138.dcm | Bin 525508 -> 0 bytes ...93839981555204234790663505961728774365.dcm | Bin 525508 -> 0 bytes ...41177406786584983371234492481783857854.dcm | Bin 525508 -> 0 bytes ...30088044490155530091831262755636982648.dcm | Bin 525508 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 45754 -> 45834 bytes .../__pycache__/urls.cpython-312.pyc | Bin 6037 -> 6611 bytes .../__pycache__/views.cpython-312.pyc | Bin 73550 -> 80968 bytes operating_theatre/migrations/0001_initial.py | 1477 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 33011 bytes operating_theatre/models.py | 2 + .../operating_theatre/case_reschedule.html | 90 + .../equipment/equipment_detail.html | 116 +- .../equipment/equipment_list.html | 2 +- operating_theatre/urls.py | 11 +- operating_theatre/views.py | 197 +- patients/__pycache__/views.cpython-312.pyc | Bin 132645 -> 133119 bytes patients/migrations/0001_initial.py | 1859 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 38845 bytes patients/views.py | 48 +- pharmacy/__pycache__/views.cpython-312.pyc | Bin 61063 -> 61063 bytes pharmacy/migrations/0001_initial.py | 1421 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 32461 bytes quality/migrations/0001_initial.py | 1121 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 28240 bytes radiology/.DS_Store | Bin 6148 -> 6148 bytes radiology/__pycache__/views.cpython-312.pyc | Bin 68031 -> 67949 bytes .../management}/.DS_Store | Bin 6148 -> 6148 bytes .../generate_dicom.cpython-312.pyc | Bin 17220 -> 17530 bytes .../management/commands/generate_dicom.py | 26 +- radiology/migrations/0001_initial.py | 1653 + .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 33644 bytes .../radiology/series/imaging_series_list.html | 165 +- radiology/views.py | 17 +- radiology_data.py | 35 +- temp.txt | 2374 +- tools/analyze_models.py | 670 + 157 files changed, 145726 insertions(+), 4987 deletions(-) create mode 100644 .gitignore create mode 100644 EMR_DATA_GENERATOR_README.md create mode 100644 SURGERY_CONSOLIDATION_SUMMARY.md create mode 100644 WORKFLOW_ENHANCEMENT_COMPLETE.md create mode 100644 _refactor_report/model_map.json create mode 100644 _refactor_report/modular_refactoring_report.md create mode 100644 _refactor_report/overlaps.json create mode 100644 accounts/__pycache__/adapter.cpython-312.pyc create mode 100644 accounts/adapter.py create mode 100644 accounts/migrations/0001_initial.py create mode 100644 accounts/migrations/0002_initial.py create mode 100644 accounts/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 accounts/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 analytics/migrations/0001_initial.py create mode 100644 analytics/migrations/0002_initial.py create mode 100644 analytics/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 analytics/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 appointments/migrations/0001_initial.py create mode 100644 appointments/migrations/0002_initial.py create mode 100644 appointments/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 appointments/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 appointments/templates/appointments/queue/queue_display.html create mode 100644 billing/migrations/0001_initial.py create mode 100644 billing/migrations/0002_initial.py create mode 100644 billing/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 billing/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 blood_bank/migrations/0001_initial.py create mode 100644 blood_bank/migrations/0002_initial.py create mode 100644 blood_bank/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 blood_bank/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 communications/migrations/0001_initial.py create mode 100644 communications/migrations/0002_initial.py create mode 100644 communications/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 communications/migrations/__pycache__/0002_initial.cpython-312.pyc create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 db.sqlite3 create mode 100644 emr/migrations/0001_initial.py create mode 100644 emr/migrations/0002_alter_icd10_unique_together_alter_icd10_code_and_more.py create mode 100644 emr/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 emr/migrations/__pycache__/0002_alter_icd10_unique_together_alter_icd10_code_and_more.cpython-312.pyc create mode 100644 enhancements.txt create mode 100644 facility_management/migrations/0001_initial.py create mode 100644 facility_management/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 hr/migrations/0001_initial.py create mode 100644 hr/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 inpatients/migrations/0001_initial.py create mode 100644 inpatients/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 inpatients/templates/inpatients/partials/WARD_STATS_DOCUMENTATION.md create mode 100644 insurance_approvals/__pycache__/forms.cpython-312.pyc create mode 100644 insurance_approvals/__pycache__/urls.cpython-312.pyc create mode 100644 insurance_approvals/__pycache__/views.cpython-312.pyc create mode 100644 insurance_approvals/migrations/0001_initial.py create mode 100644 insurance_approvals/migrations/0002_alter_insuranceapprovalrequest_content_type_and_more.py create mode 100644 insurance_approvals/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 insurance_approvals/migrations/__pycache__/0002_alter_insuranceapprovalrequest_content_type_and_more.cpython-312.pyc create mode 100644 integration/migrations/0001_initial.py create mode 100644 integration/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 inventory/migrations/0001_initial.py create mode 100644 inventory/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 laboratory/migrations/0001_initial.py create mode 100644 laboratory/migrations/__pycache__/0001_initial.cpython-312.pyc delete mode 100644 media/dicom/2/.DS_Store delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/.DS_Store delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0002/.DS_Store delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0002/series_001/image_0001_1.2.826.0.1.3680043.8.498.47739743721617648017668593296284333197.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0003/.DS_Store delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0003/series_001/image_0001_1.2.826.0.1.3680043.8.498.93512765977047735031516555377968329182.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004/series_001/image_0001_1.2.826.0.1.3680043.8.498.93085371716606973448212398851894082193.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004/series_001/image_0002_1.2.826.0.1.3680043.8.498.6718116057010946030800242287053901138.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004/series_001/image_0003_1.2.826.0.1.3680043.8.498.93839981555204234790663505961728774365.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004/series_001/image_0004_1.2.826.0.1.3680043.8.498.41177406786584983371234492481783857854.dcm delete mode 100644 media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004/series_001/image_0005_1.2.826.0.1.3680043.8.498.30088044490155530091831262755636982648.dcm create mode 100644 operating_theatre/migrations/0001_initial.py create mode 100644 operating_theatre/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 operating_theatre/templates/operating_theatre/case_reschedule.html create mode 100644 patients/migrations/0001_initial.py create mode 100644 patients/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 pharmacy/migrations/0001_initial.py create mode 100644 pharmacy/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 quality/migrations/0001_initial.py create mode 100644 quality/migrations/__pycache__/0001_initial.cpython-312.pyc rename {media/dicom/2/ab17f383-94fe-4495-8559-73c6e13ce4b5/RAD-20250929-0004 => radiology/management}/.DS_Store (84%) create mode 100644 radiology/migrations/0001_initial.py create mode 100644 radiology/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 tools/analyze_models.py diff --git a/.DS_Store b/.DS_Store index b09969c24d1501520339bf0d08ba5a3a417fe4b7..9e36a34516435474fbbcd75cabae094c16749387 100644 GIT binary patch delta 23 dcmZpfz}PZ@aYKj*Bg5uUkxQyTO2g_7F92Jb2UY+8 delta 23 dcmZpfz}PZ@aYKj*Bje^!kxQyTO2g_7F92Ju2Uq|A diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c7f96e19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,172 @@ +# Django # +*.log +*.pot +*.pyc +__pycache__ +**/*__pycache__ +**/*/__pycache__ +hospital_management_system_v4/__pycache__ +db.sqlite +dbtest.sqlite3 +db.sqlite3 +db.sqlite3.backup +db.sqlite* +new.sqlite3 +*.sqlite3 +media +#car*.json +hospital_management/settings.py +hospital_management/__pycache__ +scripts/dsrpipe.py +dev_venv +# Backup files # +*.bak +play.sh +git-sync.sh +deploy* +git-sync.sh +update.sh +rollback.sh +# If you are using PyCharm # +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf +Makefile +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml +**/migrations/** + +**haikalbot/migrations/** + + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# File-based project format +*.iws + +# IntelliJ +out/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Python # +*.py[cod] +*$py.class + +# Distribution / packaging +.Python build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.whl +*.egg-info/ +.installed.cfg +*.egg +*.manifest +*.spec +inventory/management/commands/run.py + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +.pytest_cache/ +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery +celerybeat-schedule.* + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +dev_venv/ +ENV/ +env.bak/ +venv.bak/ + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# Sublime Text # +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache +*.sublime-workspace +*.sublime-project + +# sftp configuration file +sftp-config.json + +# Package control specific files Package +Control.last-run +Control.ca-list +Control.ca-bundle +Control.system-ca-bundle +GitHub.sublime-settings + +# Visual Studio Code # +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history + + +static-copy +static +static/* +staticfiles +media +tmp +logs +static/testdir \ No newline at end of file diff --git a/EMR_DATA_GENERATOR_README.md b/EMR_DATA_GENERATOR_README.md new file mode 100644 index 00000000..eb16fa2d --- /dev/null +++ b/EMR_DATA_GENERATOR_README.md @@ -0,0 +1,349 @@ +# EMR Data Generator - Comprehensive Guide + +This document explains how to use the unified `emr_data.py` script that combines sample EMR data generation with full ICD-10-CM XML import capabilities. + +## Overview + +The `emr_data.py` script provides three modes of operation: + +1. **Standard Mode**: Generate sample EMR data with ~35 sample ICD-10 codes +2. **Full ICD-10 Import Mode**: Generate sample EMR data + import complete ICD-10-CM from XML +3. **ICD-10 Only Mode**: Import only ICD-10-CM codes, skip other EMR data + +## Prerequisites + +### Required +- Python 3.8+ +- Django project properly configured +- Existing tenants in the database (run `core_data.py` first) +- Existing patients in the database (run `patients_data.py` first) + +### Optional (for ICD-10 XML import) +- `xmlschema` library: `pip install xmlschema` +- ICD-10-CM XML files (download from CDC/CMS) + +## Usage Examples + +### 1. Standard Mode (Default) +Generate sample EMR data with sample ICD-10 codes: + +```bash +python3 emr_data.py +``` + +**What it creates:** +- Note templates (5 templates) +- Patient encounters (~900-1000) +- Vital signs (~1800-2000 records) +- Problem lists (~140-150 entries) +- Care plans (~70-80 plans) +- Clinical notes (~800-900 notes) +- **Sample ICD-10 codes (~35 codes)** +- Clinical recommendations (~100-110) +- Allergy alerts (~20-30) +- Treatment protocols (5 protocols) +- Clinical guidelines (10 guidelines) +- Critical alerts (~5-10) +- Diagnostic suggestions (~10-20) + +--- + +### 2. Full ICD-10 Import Mode +Generate sample EMR data + import complete ICD-10-CM from XML: + +```bash +python3 emr_data.py \ + --import-icd10 \ + --xsd /path/to/icd10cm-tabular-2026.xsd \ + --xml /path/to/icd10cm-tabular-2026.xml +``` + +**What it creates:** +- All standard EMR data (as above) +- **Complete ICD-10-CM codes (~70,000+ codes)** instead of sample codes + +**Optional: Truncate existing codes first** +```bash +python3 emr_data.py \ + --import-icd10 \ + --xsd /path/to/icd10cm-tabular-2026.xsd \ + --xml /path/to/icd10cm-tabular-2026.xml \ + --truncate +``` + +--- + +### 3. ICD-10 Only Mode +Import only ICD-10-CM codes, skip all other EMR data generation: + +```bash +python3 emr_data.py \ + --icd10-only \ + --xsd /path/to/icd10cm-tabular-2026.xsd \ + --xml /path/to/icd10cm-tabular-2026.xml +``` + +**What it creates:** +- **Only ICD-10-CM codes (~70,000+ codes)** +- Skips all other EMR data generation + +**With truncate:** +```bash +python3 emr_data.py \ + --icd10-only \ + --xsd /path/to/icd10cm-tabular-2026.xsd \ + --xml /path/to/icd10cm-tabular-2026.xml \ + --truncate +``` + +--- + +## Command-Line Arguments + +| Argument | Description | Required | Default | +|----------|-------------|----------|---------| +| `--import-icd10` | Import full ICD-10 codes from XML files | No | False | +| `--xsd` | Path to ICD-10 XSD schema file | Yes (with --import-icd10) | None | +| `--xml` | Path to ICD-10 XML data file | Yes (with --import-icd10) | None | +| `--icd10-only` | Only import ICD-10, skip other EMR data | No | False | +| `--truncate` | Delete existing ICD-10 codes before importing | No | False | + +--- + +## Obtaining ICD-10-CM XML Files + +### Official Sources + +1. **CDC (Centers for Disease Control and Prevention)** + - URL: https://www.cdc.gov/nchs/icd/icd-10-cm.htm + - Download the "ICD-10-CM Tabular List" XML files + +2. **CMS (Centers for Medicare & Medicaid Services)** + - URL: https://www.cms.gov/medicare/coding-billing/icd-10-codes + - Download the complete ICD-10-CM code set + +### Required Files + +You need two files: +- `icd10cm-tabular-YYYY.xsd` (Schema definition) +- `icd10cm-tabular-YYYY.xml` (Actual codes) + +Where `YYYY` is the year (e.g., 2026) + +--- + +## Multi-Tenant Support + +The script automatically creates ICD-10 codes for **all tenants** in your database: + +```python +# Codes are created for each tenant +for tenant in tenants: + # Creates ICD-10 codes with tenant relationship + Icd10.objects.create( + tenant=tenant, + code='E11.9', + description='Type 2 diabetes mellitus without complications', + ... + ) +``` + +--- + +## Performance Considerations + +### Sample Mode (Default) +- **Runtime**: ~30-60 seconds +- **Database Impact**: Minimal (~2,000 total records) +- **Recommended for**: Development, testing, demos + +### Full ICD-10 Import Mode +- **Runtime**: ~5-15 minutes (depending on system) +- **Database Impact**: Significant (~70,000+ ICD-10 codes + ~2,000 other records) +- **Recommended for**: Production, staging, comprehensive testing + +### ICD-10 Only Mode +- **Runtime**: ~3-10 minutes +- **Database Impact**: ~70,000+ ICD-10 codes only +- **Recommended for**: Updating ICD-10 codes without regenerating other data + +--- + +## Error Handling + +### Missing xmlschema Library +``` +❌ Error: xmlschema library not installed. + Install it with: pip install xmlschema +``` +**Solution**: `pip install xmlschema` + +### Missing XML/XSD Files +``` +❌ Error: --xsd and --xml are required when using --import-icd10 +``` +**Solution**: Provide both `--xsd` and `--xml` arguments + +### No Tenants Found +``` +❌ No tenants found. Please run the core data generator first. +``` +**Solution**: Run `python3 core_data.py` first + +### XML Parsing Errors +``` +❌ Failed to parse XML: [error details] +``` +**Solution**: Verify XML file integrity, ensure correct file paths + +--- + +## Data Generated + +### Sample ICD-10 Codes (Default Mode) +The script creates ~35 sample codes covering: +- Infectious diseases (A00-A04) +- Neoplasms (C00-C04) +- Circulatory diseases (I00-I06) +- Respiratory diseases (J00-J04) +- Digestive diseases (K00-K04) +- Genitourinary diseases (N00-N04) +- Symptoms and signs (R00-R04) + +### Full ICD-10-CM Import +Complete ICD-10-CM code set including: +- All chapters (1-22) +- All sections +- All diagnosis codes +- Parent-child relationships +- Code descriptions +- Chapter and section names + +--- + +## Integration with Other Data Generators + +### Recommended Execution Order + +1. **Core Data** (Required first) + ```bash + python3 core_data.py + ``` + +2. **Patients Data** (Required before EMR) + ```bash + python3 patients_data.py + ``` + +3. **EMR Data** (This script) + ```bash + python3 emr_data.py + # or with full ICD-10 import + python3 emr_data.py --import-icd10 --xsd path/to/file.xsd --xml path/to/file.xml + ``` + +4. **Other Modules** (Optional, any order) + ```bash + python3 appointments_data.py + python3 billing_data.py + python3 pharmacy_data.py + # etc. + ``` + +--- + +## Troubleshooting + +### Issue: Duplicate ICD-10 Codes +**Symptom**: UNIQUE constraint failed errors +**Solution**: Use `--truncate` flag to delete existing codes first + +### Issue: Slow Performance +**Symptom**: Script takes very long to complete +**Solution**: +- Ensure database indexes are created +- Use SSD storage +- Consider using PostgreSQL instead of SQLite for large datasets + +### Issue: Memory Errors +**Symptom**: Out of memory errors during import +**Solution**: +- The script uses batch processing (1000 records at a time) +- Increase available system memory +- Close other applications + +--- + +## Advanced Usage + +### Custom Days Back for Encounters +Modify the script to change the number of days of encounter history: + +```python +# In main() function, change: +encounters = create_encounters(tenants, days_back=30) +# To: +encounters = create_encounters(tenants, days_back=90) # 90 days of history +``` + +### Adjusting Data Volume +Modify the random ranges in each function: + +```python +# Example: More encounters per day +daily_encounters = random.randint(20, 50) # Default +daily_encounters = random.randint(50, 100) # More data +``` + +--- + +## Migration from Old System + +If you were using the separate `emr/management/commands/import_icd10.py` Django management command: + +### Old Way (Django Management Command) +```bash +python manage.py import_icd10 \ + --xsd path/to/file.xsd \ + --xml path/to/file.xml \ + --truncate +``` + +### New Way (Unified Script) +```bash +python3 emr_data.py \ + --icd10-only \ + --xsd path/to/file.xsd \ + --xml path/to/file.xml \ + --truncate +``` + +**Benefits of new approach:** +- No need for Django management command infrastructure +- Consistent with other data generators +- Can combine with EMR data generation +- Simpler command-line interface + +--- + +## Support + +For issues or questions: +1. Check this README +2. Review error messages carefully +3. Verify prerequisites are met +4. Check file paths are correct +5. Ensure database is accessible + +--- + +## Version History + +- **v2.0** (Current): Merged ICD-10 XML import functionality +- **v1.0**: Original EMR data generator with sample ICD-10 codes + +--- + +## License + +This script is part of the Hospital Management System v4 project. diff --git a/SURGERY_CONSOLIDATION_SUMMARY.md b/SURGERY_CONSOLIDATION_SUMMARY.md new file mode 100644 index 00000000..834ab074 --- /dev/null +++ b/SURGERY_CONSOLIDATION_SUMMARY.md @@ -0,0 +1,246 @@ +# Surgery Management Consolidation - Summary Report + +**Date:** 2025-10-03 +**Task:** Remove duplicate SurgerySchedule from inpatients app and consolidate all surgical management in operating_theatre app + +--- + +## ✅ Completed Actions + +### 1. **Removed SurgerySchedule Model from Inpatients App** +**File:** `inpatients/models.py` +- ❌ Removed entire `SurgerySchedule` class (~300 lines) +- ✅ Kept: Ward, Bed, Admission, Transfer, DischargeSummary models +- ✅ Admission model retains relationship to SurgicalCase via reverse FK + +### 2. **Removed SurgerySchedule Admin Configuration** +**File:** `inpatients/admin.py` +- ❌ Removed `SurgeryScheduleAdmin` class +- ❌ Removed admin registration for SurgerySchedule +- ❌ Removed import statement + +### 3. **Removed SurgerySchedule Form** +**File:** `inpatients/forms.py` +- ❌ Removed `SurgeryScheduleForm` class (~100 lines) +- ❌ Removed import statement +- ✅ Kept all other forms intact + +### 4. **Removed All Surgery Views** +**File:** `inpatients/views.py` +- ❌ Removed 6 class-based views: + - `SurgeryScheduleView` + - `SurgeryDetailView` + - `SurgeryScheduleListView` + - `SurgeryScheduleDetailView` + - `SurgeryScheduleCreateView` + - `SurgeryScheduleUpdateView` + +- ❌ Removed 9 function-based views: + - `surgery_calendar` + - `mark_surgery_completed` + - `reschedule_surgery` + - `cancel_surgery` + - `confirm_surgery` + - `prep_surgery` + - `postpone_surgery` + - `start_surgery` + - `complete_surgery` + +### 5. **Removed Surgery URL Patterns** +**File:** `inpatients/urls.py` +- ❌ Removed 12 surgery-related URL patterns +- ✅ All other URL patterns remain functional + +--- + +## 📊 Impact Analysis + +### What Was Removed: +- **Total Lines Removed:** ~800+ lines of code +- **Models:** 1 (SurgerySchedule) +- **Forms:** 1 (SurgeryScheduleForm) +- **Views:** 15 (6 CBVs + 9 FBVs) +- **URL Patterns:** 12 +- **Admin Classes:** 1 + +### What Remains in Inpatients: +- ✅ Ward management +- ✅ Bed allocation and tracking +- ✅ Patient admissions +- ✅ Inter-ward transfers +- ✅ Discharge summaries +- ✅ All HTMX endpoints for bed management + +--- + +## 🔗 Integration Points + +### How Inpatients Connects to Operating Theatre: + +1. **Admission → SurgicalCase** + ```python + # In operating_theatre/models.py - SurgicalCase + admission = models.ForeignKey( + 'inpatients.Admission', + on_delete=models.SET_NULL, + null=True, + blank=True, + related_name='surgical_cases' + ) + ``` + +2. **Usage Example:** + ```python + # Get all surgeries for an admission + admission = Admission.objects.get(pk=1) + surgeries = admission.surgical_cases.all() + + # Check if surgery needs insurance approval + for surgery in surgeries: + if surgery.requires_approval(): + # Create approval request + pass + ``` + +3. **Operating Room Access:** + ```python + # Get all cases in an OR + or_room = OperatingRoom.objects.get(room_number='OR-1') + today_cases = or_room.surgical_cases.filter( + scheduled_start__date=timezone.now().date() + ) + ``` + +--- + +## 🎯 Next Steps (Recommended) + +### Phase 1: Enhance Operating Theatre (Priority) +1. **Add Missing Status Choices to SurgicalCase:** + - Add `CONFIRMED` status + - Add `PREP` status + +2. **Add Workflow Views:** + - `confirm_case(request, pk)` - Confirm scheduled case + - `prep_case(request, pk)` - Mark case in prep + - `cancel_case(request, pk)` - Cancel case + - `postpone_case(request, pk)` - Postpone case + - `reschedule_case(request, pk)` - Reschedule case + +3. **Add URL Patterns:** + ```python + path('cases//confirm/', views.confirm_case, name='confirm_case'), + path('cases//prep/', views.prep_case, name='prep_case'), + path('cases//cancel/', views.cancel_case, name='cancel_case'), + path('cases//postpone/', views.postpone_case, name='postpone_case'), + path('cases//reschedule/', views.reschedule_case, name='reschedule_case'), + ``` + +4. **Create Reschedule Template:** + - `operating_theatre/templates/operating_theatre/case_reschedule.html` + +### Phase 2: Update Data Generation +1. **Remove from `inpatients_data.py`:** + - Remove SurgerySchedule data generation + +2. **Verify `or_data.py`:** + - Ensure SurgicalCase generation includes all statuses + - Verify insurance approval integration + +### Phase 3: Database Migration +1. **Create migrations:** + ```bash + python manage.py makemigrations + python manage.py migrate + ``` + +2. **Verify no broken references** + +--- + +## 🎨 Surgical Workflow (Operating Theatre) + +### Complete Status Flow: +``` +SCHEDULED → CONFIRMED → PREP → IN_PROGRESS → COMPLETED + ↓ ↓ ↓ ↓ +POSTPONED CANCELLED DELAYED CANCELLED + ↓ +SCHEDULED (via reschedule) +``` + +### Available Actions: +- ✅ Create Case (SurgicalCaseCreateView) - Already exists +- ✅ Start Case (StartCaseView) - Already exists +- ✅ Complete Case (CompleteCaseView) - Already exists +- 🔄 Confirm Case - Need to add +- 🔄 Prep Case - Need to add +- 🔄 Cancel Case - Need to add +- 🔄 Postpone Case - Need to add +- 🔄 Reschedule Case - Need to add + +--- + +## ✅ Benefits Achieved + +1. **Single Source of Truth** + - All surgical management in one app (operating_theatre) + - No duplicate functionality + +2. **Better Architecture** + - Clear separation of concerns + - Inpatients focuses on ward/bed management + - Operating theatre handles all surgical workflows + +3. **Insurance Integration** + - SurgicalCase already has GenericRelation to insurance approvals + - No changes needed for insurance approval workflow + +4. **Scalability** + - SurgicalCase supports both inpatient AND outpatient surgeries + - More comprehensive data model + - Better OR scheduling with ORBlock concept + +5. **Data Integrity** + - No risk of conflicting surgery records + - Cleaner database schema + +--- + +## 📝 Files Modified + +1. ✅ `inpatients/models.py` - Removed SurgerySchedule model +2. ✅ `inpatients/admin.py` - Removed SurgeryScheduleAdmin +3. ✅ `inpatients/forms.py` - Removed SurgeryScheduleForm +4. ✅ `inpatients/views.py` - Removed 15 surgery views +5. ✅ `inpatients/urls.py` - Removed 12 surgery URL patterns + +--- + +## 🚀 Ready for Production + +The inpatients app is now clean and focused on its core responsibilities: +- ✅ Ward management +- ✅ Bed allocation +- ✅ Patient admissions +- ✅ Transfers +- ✅ Discharge planning + +All surgical management is now centralized in the operating_theatre app with: +- ✅ Comprehensive SurgicalCase model +- ✅ OR scheduling with ORBlock +- ✅ Insurance approval integration +- ✅ Equipment tracking +- ✅ Surgical notes +- ✅ Team management + +--- + +## 📞 Support + +For questions or issues related to this consolidation: +1. Review the operating_theatre app documentation +2. Check the SurgicalCase model for available fields and methods +3. Refer to insurance_approvals integration documentation + +**Status:** ✅ CONSOLIDATION COMPLETE diff --git a/WORKFLOW_ENHANCEMENT_COMPLETE.md b/WORKFLOW_ENHANCEMENT_COMPLETE.md new file mode 100644 index 00000000..f9233330 --- /dev/null +++ b/WORKFLOW_ENHANCEMENT_COMPLETE.md @@ -0,0 +1,328 @@ +# Operating Theatre Workflow Enhancement - Complete ✅ + +**Date:** 2025-10-03 +**Task:** Add missing workflow functions to operating_theatre app + +--- + +## ✅ Completed Enhancements + +### 1. **Added New Status Choices to SurgicalCase Model** +**File:** `operating_theatre/models.py` + +Added two new statuses to the `CaseStatus` enum: +```python +class CaseStatus(models.TextChoices): + SCHEDULED = 'SCHEDULED', 'Scheduled' + CONFIRMED = 'CONFIRMED', 'Confirmed' # ✅ NEW + PREP = 'PREP', 'Pre-operative Prep' # ✅ NEW + DELAYED = 'DELAYED', 'Delayed' + IN_PROGRESS = 'IN_PROGRESS', 'In Progress' + COMPLETED = 'COMPLETED', 'Completed' + CANCELLED = 'CANCELLED', 'Cancelled' + POSTPONED = 'POSTPONED', 'Postponed' +``` + +### 2. **Added 5 New Workflow Functions** +**File:** `operating_theatre/views.py` + +#### New Functions Added: + +1. **`confirm_case(request, pk)`** + - Confirms a scheduled surgical case + - Changes status from SCHEDULED → CONFIRMED + - POST-only endpoint + +2. **`prep_case(request, pk)`** + - Marks case as in pre-operative prep + - Changes status from SCHEDULED/CONFIRMED → PREP + - POST-only endpoint + +3. **`cancel_case(request, pk)`** + - Cancels a surgical case + - Cannot cancel COMPLETED or IN_PROGRESS cases + - Adds cancellation reason to clinical notes + - POST-only endpoint + +4. **`postpone_case(request, pk)`** + - Postpones a surgical case + - Cannot postpone COMPLETED or IN_PROGRESS cases + - Adds postponement reason to clinical notes + - POST-only endpoint + +5. **`reschedule_case(request, pk)`** + - Reschedules a surgical case to new OR block and time + - Cannot reschedule COMPLETED or IN_PROGRESS cases + - Provides form to select new OR block and start time + - Adds rescheduling note to clinical notes + - GET (form) and POST (submit) endpoint + +### 3. **Added URL Patterns** +**File:** `operating_theatre/urls.py` + +Added 5 new URL patterns: +```python +path('cases//confirm/', views.confirm_case, name='confirm_case'), +path('cases//prep/', views.prep_case, name='prep_case'), +path('cases//cancel/', views.cancel_case, name='cancel_case'), +path('cases//postpone/', views.postpone_case, name='postpone_case'), +path('cases//reschedule/', views.reschedule_case, name='reschedule_case'), +``` + +### 4. **Created Reschedule Template** +**File:** `operating_theatre/templates/operating_theatre/case_reschedule.html` + +Features: +- Displays current case information +- Form to select new OR block +- Input for new scheduled start time +- Validation and user-friendly interface + +--- + +## 🎨 Complete Surgical Workflow + +### Status Flow Diagram: +``` +SCHEDULED → CONFIRMED → PREP → IN_PROGRESS → COMPLETED + ↓ ↓ ↓ ↓ +POSTPONED CANCELLED DELAYED CANCELLED + ↓ +SCHEDULED (via reschedule) +``` + +### Available Actions by Status: + +| Current Status | Available Actions | +|---------------|-------------------| +| SCHEDULED | Confirm, Prep, Cancel, Postpone, Reschedule | +| CONFIRMED | Prep, Cancel, Postpone, Reschedule | +| PREP | Start, Cancel, Postpone, Reschedule | +| DELAYED | Start, Cancel, Postpone, Reschedule | +| IN_PROGRESS | Complete | +| COMPLETED | *(No actions - final state)* | +| CANCELLED | Reschedule | +| POSTPONED | Reschedule | + +--- + +## 📋 Usage Examples + +### 1. Confirm a Case +```python +# POST to /operating-theatre/cases/123/confirm/ +# Status changes: SCHEDULED → CONFIRMED +``` + +### 2. Move to Prep +```python +# POST to /operating-theatre/cases/123/prep/ +# Status changes: SCHEDULED/CONFIRMED → PREP +``` + +### 3. Start a Case +```python +# POST to /operating-theatre/cases/123/start/ +# Status changes: PREP/CONFIRMED → IN_PROGRESS +# Sets actual_start timestamp +``` + +### 4. Complete a Case +```python +# POST to /operating-theatre/cases/123/complete/ +# Status changes: IN_PROGRESS → COMPLETED +# Sets actual_end timestamp +# Calculates actual_duration +``` + +### 5. Cancel a Case +```python +# POST to /operating-theatre/cases/123/cancel/ +# With POST data: reason="Patient condition improved" +# Status changes: Any (except COMPLETED/IN_PROGRESS) → CANCELLED +# Adds reason to clinical_notes +``` + +### 6. Postpone a Case +```python +# POST to /operating-theatre/cases/123/postpone/ +# With POST data: reason="Equipment unavailable" +# Status changes: Any (except COMPLETED/IN_PROGRESS) → POSTPONED +# Adds reason to clinical_notes +``` + +### 7. Reschedule a Case +```python +# GET /operating-theatre/cases/123/reschedule/ +# Displays form with available OR blocks + +# POST /operating-theatre/cases/123/reschedule/ +# With POST data: or_block=456, scheduled_start="2025-10-05 08:00" +# Status changes: POSTPONED/CANCELLED → SCHEDULED +# Updates or_block and scheduled_start +# Adds rescheduling note to clinical_notes +``` + +--- + +## 🔗 Integration with Existing Features + +### Insurance Approval Integration +All workflow functions work seamlessly with the existing insurance approval system: + +```python +# Check if case requires approval +if case.requires_approval(): + # Create approval request + approval = InsuranceApprovalRequest.objects.create( + content_object=case, + request_type='SURGERY', + # ... + ) + +# Check approval status +if case.has_valid_approval(): + # Proceed with surgery + case.status = 'CONFIRMED' + case.save() +``` + +### Admission Integration +Cases remain linked to admissions: + +```python +# Get all surgeries for an admission +admission = Admission.objects.get(pk=1) +surgeries = admission.surgical_cases.all() + +# Each surgery has full workflow capabilities +for surgery in surgeries: + if surgery.status == 'SCHEDULED': + # Can confirm, prep, cancel, postpone, or reschedule +``` + +--- + +## 🎯 Benefits Achieved + +1. **Complete Workflow Coverage** + - All surgical case lifecycle stages covered + - Clear status transitions + - Proper validation at each step + +2. **Audit Trail** + - All status changes logged + - Reasons captured for cancellations and postponements + - Rescheduling history maintained in clinical notes + +3. **User-Friendly** + - Simple POST endpoints for quick actions + - Dedicated reschedule form for complex changes + - Clear error messages for invalid transitions + +4. **Flexible** + - Supports emergency and elective workflows + - Handles postponements and rescheduling + - Maintains data integrity + +5. **Production-Ready** + - Proper permission checks + - Tenant isolation + - Error handling + - User feedback via messages + +--- + +## 📝 Files Modified/Created + +### Modified Files: +1. ✅ `operating_theatre/models.py` - Added CONFIRMED and PREP statuses +2. ✅ `operating_theatre/views.py` - Added 5 workflow functions +3. ✅ `operating_theatre/urls.py` - Added 5 URL patterns + +### Created Files: +1. ✅ `operating_theatre/templates/operating_theatre/case_reschedule.html` - Reschedule form template +2. ✅ `WORKFLOW_ENHANCEMENT_COMPLETE.md` - This documentation + +--- + +## 🚀 Next Steps + +### Database Migration: +```bash +python manage.py makemigrations operating_theatre +python manage.py migrate +``` + +### Testing Checklist: +- [ ] Test confirm_case endpoint +- [ ] Test prep_case endpoint +- [ ] Test cancel_case with reason +- [ ] Test postpone_case with reason +- [ ] Test reschedule_case form and submission +- [ ] Verify status transitions +- [ ] Check clinical notes updates +- [ ] Test permission checks +- [ ] Verify tenant isolation + +### Optional Enhancements: +- Add HTMX endpoints for real-time status updates +- Create dashboard widgets for workflow statistics +- Add email notifications for status changes +- Implement approval workflows for cancellations +- Add bulk operations for multiple cases + +--- + +## 📞 API Reference + +### Confirm Case +``` +POST /operating-theatre/cases//confirm/ +Response: Redirect to case detail +Messages: Success message +``` + +### Prep Case +``` +POST /operating-theatre/cases//prep/ +Response: Redirect to case detail +Messages: Success message +``` + +### Cancel Case +``` +POST /operating-theatre/cases//cancel/ +POST Data: reason (optional) +Response: Redirect to case list +Messages: Warning message +``` + +### Postpone Case +``` +POST /operating-theatre/cases//postpone/ +POST Data: reason (optional) +Response: Redirect to case detail +Messages: Info message +``` + +### Reschedule Case +``` +GET /operating-theatre/cases//reschedule/ +Response: Reschedule form + +POST /operating-theatre/cases//reschedule/ +POST Data: or_block (required), scheduled_start (required) +Response: Redirect to case detail +Messages: Success or error message +``` + +--- + +## ✅ Summary + +**Status:** ✅ WORKFLOW ENHANCEMENT COMPLETE + +All missing workflow functions have been successfully added to the operating_theatre app. The surgical case management system now has complete lifecycle support from scheduling through completion, with proper handling of cancellations, postponements, and rescheduling. + +The system is ready for database migration and testing! diff --git a/_refactor_report/model_map.json b/_refactor_report/model_map.json new file mode 100644 index 00000000..c702583c --- /dev/null +++ b/_refactor_report/model_map.json @@ -0,0 +1,6261 @@ +{ + "apps": [ + "core", + "accounts", + "blood_bank", + "patients", + "appointments", + "inpatients", + "emr", + "pharmacy", + "laboratory", + "radiology", + "operating_theatre", + "billing", + "inventory", + "hr", + "analytics", + "communications", + "integration", + "quality", + "facility_management", + "insurance_approvals" + ], + "by_app": { + "core": [ + { + "name": "Tenant", + "fields": { + "tenant_id": "UUIDField", + "name": "CharField", + "display_name": "CharField", + "description": "TextField", + "organization_type": "CharField", + "address_line1": "CharField", + "address_line2": "CharField", + "city": "CharField", + "state": "CharField", + "postal_code": "CharField", + "country": "CharField", + "phone_number": "CharField", + "email": "EmailField", + "website": "URLField", + "license_number": "CharField", + "accreditation_body": "CharField", + "accreditation_number": "CharField", + "accreditation_expiry": "DateField", + "timezone": "CharField", + "locale": "CharField", + "currency": "CharField", + "subscription_plan": "CharField", + "max_users": "PositiveIntegerField", + "max_patients": "PositiveIntegerField", + "is_active": "BooleanField", + "is_trial": "BooleanField", + "trial_expires_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [], + "m2ms": [], + "lineno": 17, + "file": "core/models.py" + }, + { + "name": "AuditLogEntry", + "fields": { + "tenant": "ForeignKey", + "log_id": "UUIDField", + "event_type": "CharField", + "event_category": "CharField", + "user": "ForeignKey", + "user_email": "EmailField", + "user_role": "CharField", + "session_key": "CharField", + "ip_address": "GenericIPAddressField", + "user_agent": "TextField", + "content_type": "ForeignKey", + "object_id": "PositiveIntegerField", + "content_object": "GenericForeignKey", + "object_repr": "CharField", + "action": "CharField", + "description": "TextField", + "changes": "JSONField", + "additional_data": "JSONField", + "patient_id": "CharField", + "patient_mrn": "CharField", + "risk_level": "CharField", + "hipaa_relevant": "BooleanField", + "gdpr_relevant": "BooleanField", + "is_successful": "BooleanField", + "error_message": "TextField", + "timestamp": "DateTimeField", + "created_at": "DateTimeField" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL", + "ContentType" + ], + "m2ms": [], + "lineno": 217, + "file": "core/models.py" + }, + { + "name": "SystemConfiguration", + "fields": { + "tenant": "ForeignKey", + "key": "CharField", + "value": "TextField", + "data_type": "CharField", + "category": "CharField", + "description": "TextField", + "validation_rules": "JSONField", + "default_value": "TextField", + "is_sensitive": "BooleanField", + "is_encrypted": "BooleanField", + "required_permission": "CharField", + "is_active": "BooleanField", + "is_readonly": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "updated_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 424, + "file": "core/models.py" + }, + { + "name": "SystemNotification", + "fields": { + "tenant": "ForeignKey", + "notification_id": "UUIDField", + "title": "CharField", + "message": "TextField", + "notification_type": "CharField", + "priority": "CharField", + "target_audience": "CharField", + "target_roles": "JSONField", + "target_users": "ManyToManyField", + "is_dismissible": "BooleanField", + "auto_dismiss_after": "PositiveIntegerField", + "show_on_login": "BooleanField", + "start_date": "DateTimeField", + "end_date": "DateTimeField", + "action_url": "URLField", + "action_text": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 552, + "file": "core/models.py" + }, + { + "name": "IntegrationLog", + "fields": { + "tenant": "ForeignKey", + "log_id": "UUIDField", + "integration_type": "CharField", + "direction": "CharField", + "external_system": "CharField", + "endpoint": "CharField", + "message_type": "CharField", + "message_id": "CharField", + "correlation_id": "UUIDField", + "request_data": "TextField", + "response_data": "TextField", + "status": "CharField", + "error_code": "CharField", + "error_message": "TextField", + "processing_time_ms": "PositiveIntegerField", + "timestamp": "DateTimeField", + "created_at": "DateTimeField" + }, + "fks": [ + "Tenant" + ], + "m2ms": [], + "lineno": 710, + "file": "core/models.py" + } + ], + "accounts": [ + { + "name": "TwoFactorDevice", + "fields": { + "user": "ForeignKey", + "device_id": "UUIDField", + "name": "CharField", + "device_type": "CharField", + "secret_key": "CharField", + "phone_number": "CharField", + "email_address": "EmailField", + "is_active": "BooleanField", + "is_verified": "BooleanField", + "verified_at": "DateTimeField", + "last_used_at": "DateTimeField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 431, + "file": "accounts/models.py" + }, + { + "name": "SocialAccount", + "fields": { + "user": "ForeignKey", + "provider": "CharField", + "provider_id": "CharField", + "provider_email": "EmailField", + "display_name": "CharField", + "profile_url": "URLField", + "avatar_url": "URLField", + "access_token": "TextField", + "refresh_token": "TextField", + "token_expires_at": "DateTimeField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "last_login_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 520, + "file": "accounts/models.py" + }, + { + "name": "UserSession", + "fields": { + "user": "ForeignKey", + "session_key": "CharField", + "session_id": "UUIDField", + "ip_address": "GenericIPAddressField", + "user_agent": "TextField", + "device_type": "CharField", + "browser": "CharField", + "operating_system": "CharField", + "country": "CharField", + "region": "CharField", + "city": "CharField", + "is_active": "BooleanField", + "login_method": "CharField", + "created_at": "DateTimeField", + "last_activity_at": "DateTimeField", + "expires_at": "DateTimeField", + "ended_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 615, + "file": "accounts/models.py" + }, + { + "name": "PasswordHistory", + "fields": { + "user": "ForeignKey", + "password_hash": "CharField", + "created_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 752, + "file": "accounts/models.py" + } + ], + "blood_bank": [ + { + "name": "BloodGroup", + "fields": { + "abo_type": "CharField", + "rh_factor": "CharField" + }, + "fks": [], + "m2ms": [], + "lineno": 10, + "file": "blood_bank/models.py" + }, + { + "name": "Donor", + "fields": { + "donor_id": "CharField", + "first_name": "CharField", + "last_name": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "national_id": "CharField", + "blood_group": "ForeignKey", + "phone": "CharField", + "email": "EmailField", + "address": "TextField", + "emergency_contact_name": "CharField", + "emergency_contact_phone": "CharField", + "donor_type": "CharField", + "status": "CharField", + "registration_date": "DateTimeField", + "last_donation_date": "DateTimeField", + "total_donations": "PositiveIntegerField", + "weight": "FloatField", + "height": "FloatField", + "notes": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "BloodGroup", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 39, + "file": "blood_bank/models.py" + }, + { + "name": "BloodComponent", + "fields": { + "name": "CharField", + "description": "TextField", + "shelf_life_days": "PositiveIntegerField", + "storage_temperature": "CharField", + "volume_ml": "PositiveIntegerField", + "is_active": "BooleanField" + }, + "fks": [], + "m2ms": [], + "lineno": 116, + "file": "blood_bank/models.py" + }, + { + "name": "BloodUnit", + "fields": { + "unit_number": "CharField", + "donor": "ForeignKey", + "component": "ForeignKey", + "blood_group": "ForeignKey", + "collection_date": "DateTimeField", + "expiry_date": "DateTimeField", + "volume_ml": "PositiveIntegerField", + "status": "CharField", + "location": "CharField", + "bag_type": "CharField", + "anticoagulant": "CharField", + "collection_site": "CharField", + "collected_by": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Donor", + "BloodComponent", + "BloodGroup", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 141, + "file": "blood_bank/models.py" + }, + { + "name": "BloodTest", + "fields": { + "blood_unit": "ForeignKey", + "test_type": "CharField", + "result": "CharField", + "test_date": "DateTimeField", + "tested_by": "ForeignKey", + "equipment_used": "CharField", + "lot_number": "CharField", + "notes": "TextField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField" + }, + "fks": [ + "BloodUnit", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 192, + "file": "blood_bank/models.py" + }, + { + "name": "CrossMatch", + "fields": { + "blood_unit": "ForeignKey", + "recipient": "ForeignKey", + "test_type": "CharField", + "compatibility": "CharField", + "test_date": "DateTimeField", + "tested_by": "ForeignKey", + "temperature": "CharField", + "incubation_time": "PositiveIntegerField", + "notes": "TextField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField" + }, + "fks": [ + "BloodUnit", + "PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 232, + "file": "blood_bank/models.py" + }, + { + "name": "BloodRequest", + "fields": { + "request_number": "CharField", + "patient": "ForeignKey", + "requesting_department": "ForeignKey", + "requesting_physician": "ForeignKey", + "component_requested": "ForeignKey", + "units_requested": "PositiveIntegerField", + "urgency": "CharField", + "indication": "TextField", + "special_requirements": "TextField", + "patient_blood_group": "ForeignKey", + "hemoglobin_level": "FloatField", + "platelet_count": "IntegerField", + "status": "CharField", + "request_date": "DateTimeField", + "required_by": "DateTimeField", + "processed_by": "ForeignKey", + "processed_at": "DateTimeField", + "notes": "TextField", + "cancellation_reason": "TextField", + "cancelled_by": "ForeignKey", + "cancellation_date": "DateTimeField" + }, + "fks": [ + "PatientProfile", + "Department", + "settings.AUTH_USER_MODEL", + "BloodComponent", + "BloodGroup", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 266, + "file": "blood_bank/models.py" + }, + { + "name": "BloodIssue", + "fields": { + "blood_request": "ForeignKey", + "blood_unit": "OneToOneField", + "crossmatch": "ForeignKey", + "issued_by": "ForeignKey", + "issued_to": "ForeignKey", + "issue_date": "DateTimeField", + "expiry_time": "DateTimeField", + "returned": "BooleanField", + "return_date": "DateTimeField", + "return_reason": "TextField", + "notes": "TextField" + }, + "fks": [ + "BloodRequest", + "BloodUnit", + "CrossMatch", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 318, + "file": "blood_bank/models.py" + }, + { + "name": "Transfusion", + "fields": { + "blood_issue": "OneToOneField", + "start_time": "DateTimeField", + "end_time": "DateTimeField", + "status": "CharField", + "volume_transfused": "PositiveIntegerField", + "transfusion_rate": "CharField", + "administered_by": "ForeignKey", + "witnessed_by": "ForeignKey", + "pre_transfusion_vitals": "JSONField", + "post_transfusion_vitals": "JSONField", + "vital_signs_history": "JSONField", + "current_blood_pressure": "CharField", + "current_heart_rate": "IntegerField", + "current_temperature": "FloatField", + "current_respiratory_rate": "IntegerField", + "current_oxygen_saturation": "IntegerField", + "last_vitals_check": "DateTimeField", + "patient_consent": "BooleanField", + "consent_date": "DateTimeField", + "notes": "TextField", + "stop_reason": "TextField", + "stopped_by": "ForeignKey", + "completed_by": "ForeignKey", + "completion_notes": "TextField" + }, + "fks": [ + "BloodIssue", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 343, + "file": "blood_bank/models.py" + }, + { + "name": "AdverseReaction", + "fields": { + "transfusion": "ForeignKey", + "reaction_type": "CharField", + "severity": "CharField", + "onset_time": "DateTimeField", + "symptoms": "TextField", + "treatment_given": "TextField", + "outcome": "TextField", + "reported_by": "ForeignKey", + "investigated_by": "ForeignKey", + "investigation_notes": "TextField", + "regulatory_reported": "BooleanField", + "report_date": "DateTimeField" + }, + "fks": [ + "Transfusion", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 396, + "file": "blood_bank/models.py" + }, + { + "name": "InventoryLocation", + "fields": { + "name": "CharField", + "location_type": "CharField", + "temperature_range": "CharField", + "temperature": "FloatField", + "capacity": "PositiveIntegerField", + "current_stock": "PositiveIntegerField", + "is_active": "BooleanField", + "notes": "TextField" + }, + "fks": [], + "m2ms": [], + "lineno": 437, + "file": "blood_bank/models.py" + }, + { + "name": "QualityControl", + "fields": { + "test_type": "CharField", + "test_date": "DateTimeField", + "equipment_tested": "CharField", + "parameters_tested": "TextField", + "expected_results": "TextField", + "actual_results": "TextField", + "status": "CharField", + "performed_by": "ForeignKey", + "reviewed_by": "ForeignKey", + "review_date": "DateTimeField", + "review_notes": "TextField", + "corrective_action": "TextField", + "next_test_date": "DateTimeField", + "capa_initiated": "BooleanField", + "capa_number": "CharField", + "capa_priority": "CharField", + "capa_initiated_by": "ForeignKey", + "capa_date": "DateTimeField", + "capa_assessment": "TextField", + "capa_status": "CharField" + }, + "fks": [ + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 469, + "file": "blood_bank/models.py" + } + ], + "patients": [ + { + "name": "PatientProfile", + "fields": { + "patient_id": "UUIDField", + "tenant": "ForeignKey", + "mrn": "CharField", + "first_name": "CharField", + "last_name": "CharField", + "middle_name": "CharField", + "preferred_name": "CharField", + "suffix": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "email": "EmailField", + "phone_number": "CharField", + "mobile_number": "CharField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "zip_code": "CharField", + "country": "CharField", + "id_number": "CharField", + "marital_status": "CharField", + "primary_language": "CharField", + "interpreter_needed": "BooleanField", + "communication_preference": "CharField", + "employer": "CharField", + "occupation": "CharField", + "primary_care_physician": "CharField", + "referring_physician": "CharField", + "allergies": "TextField", + "medical_alerts": "TextField", + "has_advance_directive": "BooleanField", + "advance_directive_type": "CharField", + "is_active": "BooleanField", + "is_deceased": "BooleanField", + "date_of_death": "DateField", + "is_vip": "BooleanField", + "confidential_patient": "BooleanField", + "registration_date": "DateTimeField", + "registered_by": "ForeignKey", + "photo": "ImageField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "last_visit_date": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 13, + "file": "patients/models.py" + }, + { + "name": "EmergencyContact", + "fields": { + "patient": "ForeignKey", + "first_name": "CharField", + "last_name": "CharField", + "relationship": "CharField", + "phone_number": "CharField", + "mobile_number": "CharField", + "email": "EmailField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "zip_code": "CharField", + "priority": "PositiveIntegerField", + "is_authorized_for_medical_decisions": "BooleanField", + "is_authorized_for_financial_decisions": "BooleanField", + "is_authorized_for_information": "BooleanField", + "is_primary": "BooleanField", + "authorization_number": "CharField", + "is_active": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PatientProfile" + ], + "m2ms": [], + "lineno": 392, + "file": "patients/models.py" + }, + { + "name": "InsuranceInfo", + "fields": { + "patient": "ForeignKey", + "insurance_type": "CharField", + "insurance_company": "CharField", + "plan_name": "CharField", + "plan_type": "CharField", + "status": "CharField", + "policy_number": "CharField", + "group_number": "CharField", + "subscriber_name": "CharField", + "subscriber_relationship": "CharField", + "subscriber_dob": "DateField", + "subscriber_id_number": "CharField", + "effective_date": "DateField", + "termination_date": "DateField", + "copay_amount": "DecimalField", + "deductible_amount": "DecimalField", + "out_of_pocket_max": "DecimalField", + "is_verified": "BooleanField", + "verification_date": "DateTimeField", + "verified_by": "ForeignKey", + "requires_authorization": "BooleanField", + "authorization_number": "CharField", + "authorization_expiry": "DateField", + "is_active": "BooleanField", + "is_primary": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PatientProfile", + "hr.Employee" + ], + "m2ms": [], + "lineno": 555, + "file": "patients/models.py" + }, + { + "name": "InsuranceClaim", + "fields": { + "claim_number": "CharField", + "patient": "ForeignKey", + "insurance_info": "ForeignKey", + "claim_type": "CharField", + "status": "CharField", + "priority": "CharField", + "service_date": "DateField", + "service_provider": "CharField", + "service_provider_license": "CharField", + "facility_name": "CharField", + "facility_license": "CharField", + "primary_diagnosis_code": "CharField", + "primary_diagnosis_description": "TextField", + "secondary_diagnosis_codes": "JSONField", + "procedure_codes": "JSONField", + "billed_amount": "DecimalField", + "approved_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "discount_amount": "DecimalField", + "submitted_date": "DateTimeField", + "processed_date": "DateTimeField", + "payment_date": "DateTimeField", + "saudi_id_number": "CharField", + "insurance_card_number": "CharField", + "authorization_number": "CharField", + "denial_reason": "TextField", + "denial_code": "CharField", + "appeal_date": "DateTimeField", + "appeal_reason": "TextField", + "notes": "TextField", + "attachments": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "InsuranceInfo", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 784, + "file": "patients/models.py" + }, + { + "name": "ClaimDocument", + "fields": { + "claim": "ForeignKey", + "document_type": "CharField", + "title": "CharField", + "description": "TextField", + "file_path": "CharField", + "file_size": "PositiveIntegerField", + "mime_type": "CharField", + "uploaded_at": "DateTimeField", + "uploaded_by": "ForeignKey" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1121, + "file": "patients/models.py" + }, + { + "name": "ClaimStatusHistory", + "fields": { + "claim": "ForeignKey", + "from_status": "CharField", + "to_status": "CharField", + "reason": "TextField", + "notes": "TextField", + "changed_at": "DateTimeField", + "changed_by": "ForeignKey" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1197, + "file": "patients/models.py" + }, + { + "name": "ConsentTemplate", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "category": "CharField", + "content": "TextField", + "requires_signature": "BooleanField", + "requires_witness": "BooleanField", + "requires_guardian": "BooleanField", + "is_active": "BooleanField", + "version": "CharField", + "effective_date": "DateField", + "expiry_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1252, + "file": "patients/models.py" + }, + { + "name": "ConsentForm", + "fields": { + "patient": "ForeignKey", + "template": "ForeignKey", + "consent_id": "UUIDField", + "status": "CharField", + "patient_signature": "TextField", + "patient_signed_at": "DateTimeField", + "patient_ip_address": "GenericIPAddressField", + "guardian_signature": "TextField", + "guardian_signed_at": "DateTimeField", + "guardian_name": "CharField", + "guardian_relationship": "CharField", + "witness_signature": "TextField", + "witness_signed_at": "DateTimeField", + "witness_name": "CharField", + "witness_title": "CharField", + "provider_name": "CharField", + "provider_signature": "TextField", + "provider_signed_at": "DateTimeField", + "effective_date": "DateTimeField", + "expiry_date": "DateTimeField", + "revoked_at": "DateTimeField", + "revoked_by": "ForeignKey", + "revocation_reason": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "ConsentTemplate", + "hr.Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1357, + "file": "patients/models.py" + }, + { + "name": "PatientNote", + "fields": { + "patient": "ForeignKey", + "note_id": "UUIDField", + "title": "CharField", + "content": "TextField", + "category": "CharField", + "priority": "CharField", + "is_confidential": "BooleanField", + "is_alert": "BooleanField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1573, + "file": "patients/models.py" + } + ], + "appointments": [ + { + "name": "AppointmentRequest", + "fields": { + "request_id": "UUIDField", + "tenant": "ForeignKey", + "patient": "ForeignKey", + "provider": "ForeignKey", + "appointment_type": "CharField", + "specialty": "CharField", + "preferred_date": "DateField", + "preferred_time": "TimeField", + "duration_minutes": "PositiveIntegerField", + "flexible_scheduling": "BooleanField", + "earliest_acceptable_date": "DateField", + "latest_acceptable_date": "DateField", + "acceptable_times": "JSONField", + "priority": "CharField", + "urgency_score": "PositiveIntegerField", + "chief_complaint": "TextField", + "clinical_notes": "TextField", + "referring_provider": "CharField", + "insurance_verified": "BooleanField", + "authorization_required": "BooleanField", + "authorization_number": "CharField", + "status": "CharField", + "scheduled_datetime": "DateTimeField", + "scheduled_end_datetime": "DateTimeField", + "location": "CharField", + "room_number": "CharField", + "is_telemedicine": "BooleanField", + "telemedicine_platform": "CharField", + "meeting_url": "URLField", + "meeting_id": "CharField", + "meeting_password": "CharField", + "checked_in_at": "DateTimeField", + "checked_in_by": "ForeignKey", + "completed_at": "DateTimeField", + "actual_duration_minutes": "PositiveIntegerField", + "cancelled_at": "DateTimeField", + "cancelled_by": "ForeignKey", + "cancellation_reason": "TextField", + "rescheduled_from": "ForeignKey", + "reminder_preferences": "JSONField", + "special_requirements": "TextField", + "interpreter_needed": "BooleanField", + "interpreter_language": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 15, + "file": "appointments/models.py" + }, + { + "name": "SlotAvailability", + "fields": { + "tenant": "ForeignKey", + "provider": "ForeignKey", + "slot_id": "UUIDField", + "date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "duration_minutes": "PositiveIntegerField", + "availability_type": "CharField", + "max_appointments": "PositiveIntegerField", + "booked_appointments": "PositiveIntegerField", + "location": "CharField", + "room_number": "CharField", + "specialty": "CharField", + "appointment_types": "JSONField", + "patient_restrictions": "JSONField", + "insurance_restrictions": "JSONField", + "supports_telemedicine": "BooleanField", + "telemedicine_only": "BooleanField", + "is_active": "BooleanField", + "is_blocked": "BooleanField", + "block_reason": "CharField", + "is_recurring": "BooleanField", + "recurrence_pattern": "JSONField", + "recurrence_end_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 398, + "file": "appointments/models.py" + }, + { + "name": "WaitingQueue", + "fields": { + "tenant": "ForeignKey", + "queue_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "queue_type": "CharField", + "providers": "ManyToManyField", + "specialty": "CharField", + "location": "CharField", + "max_queue_size": "PositiveIntegerField", + "average_service_time_minutes": "PositiveIntegerField", + "priority_weights": "JSONField", + "is_active": "BooleanField", + "is_accepting_patients": "BooleanField", + "operating_hours": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 589, + "file": "appointments/models.py" + }, + { + "name": "QueueEntry", + "fields": { + "queue": "ForeignKey", + "patient": "ForeignKey", + "appointment": "ForeignKey", + "entry_id": "UUIDField", + "queue_position": "PositiveIntegerField", + "priority_score": "FloatField", + "joined_at": "DateTimeField", + "estimated_service_time": "DateTimeField", + "called_at": "DateTimeField", + "served_at": "DateTimeField", + "status": "CharField", + "assigned_provider": "ForeignKey", + "notification_sent": "BooleanField", + "notification_method": "CharField", + "notes": "TextField", + "updated_at": "DateTimeField", + "updated_by": "ForeignKey" + }, + "fks": [ + "WaitingQueue", + "patients.PatientProfile", + "AppointmentRequest", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 728, + "file": "appointments/models.py" + }, + { + "name": "TelemedicineSession", + "fields": { + "session_id": "UUIDField", + "appointment": "OneToOneField", + "platform": "CharField", + "meeting_url": "URLField", + "meeting_id": "CharField", + "meeting_password": "CharField", + "waiting_room_enabled": "BooleanField", + "recording_enabled": "BooleanField", + "recording_consent": "BooleanField", + "encryption_enabled": "BooleanField", + "password_required": "BooleanField", + "status": "CharField", + "scheduled_start": "DateTimeField", + "scheduled_end": "DateTimeField", + "actual_start": "DateTimeField", + "actual_end": "DateTimeField", + "provider_joined_at": "DateTimeField", + "patient_joined_at": "DateTimeField", + "connection_quality": "CharField", + "technical_issues": "TextField", + "recording_url": "URLField", + "recording_duration_minutes": "PositiveIntegerField", + "session_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "AppointmentRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 881, + "file": "appointments/models.py" + }, + { + "name": "AppointmentTemplate", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "appointment_type": "CharField", + "specialty": "CharField", + "duration_minutes": "PositiveIntegerField", + "advance_booking_days": "PositiveIntegerField", + "minimum_notice_hours": "PositiveIntegerField", + "insurance_verification_required": "BooleanField", + "authorization_required": "BooleanField", + "pre_appointment_instructions": "TextField", + "post_appointment_instructions": "TextField", + "required_forms": "JSONField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1077, + "file": "appointments/models.py" + }, + { + "name": "WaitingList", + "fields": { + "waiting_list_id": "UUIDField", + "tenant": "ForeignKey", + "patient": "ForeignKey", + "provider": "ForeignKey", + "department": "ForeignKey", + "appointment_type": "CharField", + "specialty": "CharField", + "priority": "CharField", + "urgency_score": "PositiveIntegerField", + "clinical_indication": "TextField", + "diagnosis_codes": "JSONField", + "preferred_date": "DateField", + "preferred_time": "TimeField", + "flexible_scheduling": "BooleanField", + "earliest_acceptable_date": "DateField", + "latest_acceptable_date": "DateField", + "acceptable_days": "JSONField", + "acceptable_times": "JSONField", + "contact_method": "CharField", + "contact_phone": "CharField", + "contact_email": "EmailField", + "status": "CharField", + "position": "PositiveIntegerField", + "estimated_wait_time": "PositiveIntegerField", + "last_contacted": "DateTimeField", + "contact_attempts": "PositiveIntegerField", + "max_contact_attempts": "PositiveIntegerField", + "appointments_offered": "PositiveIntegerField", + "appointments_declined": "PositiveIntegerField", + "last_offer_date": "DateTimeField", + "requires_interpreter": "BooleanField", + "interpreter_language": "CharField", + "accessibility_requirements": "TextField", + "transportation_needed": "BooleanField", + "insurance_verified": "BooleanField", + "authorization_required": "BooleanField", + "authorization_status": "CharField", + "authorization_number": "CharField", + "referring_provider": "CharField", + "referral_date": "DateField", + "referral_urgency": "CharField", + "scheduled_appointment": "ForeignKey", + "removal_reason": "CharField", + "removal_notes": "TextField", + "removed_at": "DateTimeField", + "removed_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "notes": "TextField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "hr.Department", + "AppointmentRequest", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1186, + "file": "appointments/models.py" + }, + { + "name": "WaitingListContactLog", + "fields": { + "waiting_list_entry": "ForeignKey", + "contact_date": "DateTimeField", + "contact_method": "CharField", + "contact_outcome": "CharField", + "appointment_offered": "BooleanField", + "offered_date": "DateField", + "offered_time": "TimeField", + "patient_response": "CharField", + "notes": "TextField", + "next_contact_date": "DateField", + "contacted_by": "ForeignKey" + }, + "fks": [ + "WaitingList", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1705, + "file": "appointments/models.py" + } + ], + "inpatients": [ + { + "name": "Ward", + "fields": { + "tenant": "ForeignKey", + "ward_id": "CharField", + "name": "CharField", + "description": "TextField", + "ward_type": "CharField", + "specialty": "CharField", + "total_beds": "PositiveIntegerField", + "private_rooms": "PositiveIntegerField", + "semi_private_rooms": "PositiveIntegerField", + "shared_rooms": "PositiveIntegerField", + "building": "ForeignKey", + "floor": "ForeignKey", + "wing": "CharField", + "nurse_manager": "ForeignKey", + "attending_physicians": "ManyToManyField", + "min_nurses_day": "PositiveIntegerField", + "min_nurses_night": "PositiveIntegerField", + "nurse_to_patient_ratio": "FloatField", + "equipment_list": "JSONField", + "special_features": "JSONField", + "admission_criteria": "TextField", + "age_restrictions": "JSONField", + "gender_restrictions": "CharField", + "is_active": "BooleanField", + "is_accepting_admissions": "BooleanField", + "closure_reason": "TextField", + "phone_number": "CharField", + "extension": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "facility_management.Building", + "facility_management.Floor", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 16, + "file": "inpatients/models.py" + }, + { + "name": "Bed", + "fields": { + "ward": "ForeignKey", + "bed_number": "CharField", + "room_number": "CharField", + "bed_type": "CharField", + "is_operational": "BooleanField", + "is_active": "BooleanField", + "is_out_of_service": "BooleanField", + "room_type": "CharField", + "status": "CharField", + "current_admission": "ForeignKey", + "occupied_since": "DateTimeField", + "reserved_until": "DateTimeField", + "equipment": "ManyToManyField", + "features": "JSONField", + "last_maintenance": "DateTimeField", + "next_maintenance": "DateTimeField", + "maintenance_notes": "TextField", + "last_cleaned": "DateTimeField", + "cleaned_by": "ForeignKey", + "cleaning_level": "CharField", + "blocked_reason": "TextField", + "blocked_by": "ForeignKey", + "blocked_until": "DateTimeField", + "bed_position": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Ward", + "Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "facility_management.Asset" + ], + "lineno": 265, + "file": "inpatients/models.py" + }, + { + "name": "Admission", + "fields": { + "tenant": "ForeignKey", + "admission_id": "UUIDField", + "patient": "ForeignKey", + "admission_datetime": "DateTimeField", + "admission_type": "CharField", + "admission_source": "CharField", + "chief_complaint": "TextField", + "admitting_diagnosis": "TextField", + "secondary_diagnoses": "JSONField", + "admitting_physician": "ForeignKey", + "attending_physician": "ForeignKey", + "consulting_physicians": "ManyToManyField", + "current_ward": "ForeignKey", + "current_bed": "ForeignKey", + "status": "CharField", + "priority": "CharField", + "acuity_level": "PositiveIntegerField", + "insurance_verified": "BooleanField", + "authorization_number": "CharField", + "estimated_length_of_stay": "PositiveIntegerField", + "discharge_planning_started": "BooleanField", + "discharge_planner": "ForeignKey", + "anticipated_discharge_date": "DateField", + "discharge_datetime": "DateTimeField", + "discharge_disposition": "CharField", + "isolation_required": "BooleanField", + "isolation_type": "CharField", + "special_needs": "JSONField", + "allergies": "JSONField", + "alerts": "JSONField", + "code_status": "CharField", + "advance_directive": "BooleanField", + "healthcare_proxy": "CharField", + "admission_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Ward", + "Bed", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 535, + "file": "inpatients/models.py" + }, + { + "name": "DischargeSummary", + "fields": { + "admission": "OneToOneField", + "summary_id": "UUIDField", + "discharge_date": "DateField", + "discharge_time": "TimeField", + "length_of_stay": "PositiveIntegerField", + "admission_diagnosis": "TextField", + "final_diagnosis": "TextField", + "secondary_diagnoses": "JSONField", + "procedures_performed": "JSONField", + "hospital_course": "TextField", + "complications": "TextField", + "discharge_medications": "JSONField", + "medication_changes": "TextField", + "activity_restrictions": "TextField", + "diet_instructions": "TextField", + "wound_care": "TextField", + "special_instructions": "TextField", + "follow_up_appointments": "JSONField", + "follow_up_instructions": "TextField", + "warning_signs": "TextField", + "when_to_call": "TextField", + "discharge_disposition": "CharField", + "discharge_location": "CharField", + "transportation_arranged": "BooleanField", + "transportation_method": "CharField", + "durable_medical_equipment": "JSONField", + "supplies_provided": "JSONField", + "education_provided": "JSONField", + "education_materials": "JSONField", + "patient_understanding": "CharField", + "discharge_planner": "ForeignKey", + "social_worker_involved": "BooleanField", + "case_manager_involved": "BooleanField", + "readmission_risk": "CharField", + "patient_satisfaction": "PositiveIntegerField", + "discharging_physician": "ForeignKey", + "primary_nurse": "ForeignKey", + "summary_completed": "BooleanField", + "summary_signed": "BooleanField", + "patient_copy_provided": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 865, + "file": "inpatients/models.py" + }, + { + "name": "Transfer", + "fields": { + "transfer_id": "UUIDField", + "admission": "ForeignKey", + "patient": "ForeignKey", + "transfer_type": "CharField", + "from_ward": "ForeignKey", + "from_bed": "ForeignKey", + "to_ward": "ForeignKey", + "to_bed": "ForeignKey", + "requested_datetime": "DateTimeField", + "scheduled_datetime": "DateTimeField", + "actual_datetime": "DateTimeField", + "status": "CharField", + "reason": "TextField", + "priority": "CharField", + "requested_by": "ForeignKey", + "approved_by": "ForeignKey", + "completed_by": "ForeignKey", + "transport_method": "CharField", + "transport_team": "ManyToManyField", + "equipment_needed": "JSONField", + "supplies_needed": "JSONField", + "patient_condition": "CharField", + "vital_signs": "JSONField", + "handoff_report": "TextField", + "medications_transferred": "JSONField", + "delay_reason": "TextField", + "complications": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Admission", + "patients.PatientProfile", + "Ward", + "Bed", + "Ward", + "Bed", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 1161, + "file": "inpatients/models.py" + } + ], + "emr": [ + { + "name": "Encounter", + "fields": { + "objects": "EncounterManager", + "tenant": "ForeignKey", + "encounter_id": "UUIDField", + "patient": "ForeignKey", + "provider": "ForeignKey", + "encounter_type": "CharField", + "encounter_class": "CharField", + "start_datetime": "DateTimeField", + "end_datetime": "DateTimeField", + "status": "CharField", + "location": "CharField", + "room_number": "CharField", + "appointment": "ForeignKey", + "admission": "ForeignKey", + "chief_complaint": "TextField", + "reason_for_visit": "TextField", + "priority": "CharField", + "acuity_level": "PositiveIntegerField", + "documentation_complete": "BooleanField", + "signed_off": "BooleanField", + "signed_by": "ForeignKey", + "signed_datetime": "DateTimeField", + "billable": "BooleanField", + "billing_codes": "JSONField", + "quality_measures": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "appointments.AppointmentRequest", + "inpatients.Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 71, + "file": "emr/models.py" + }, + { + "name": "VitalSigns", + "fields": { + "encounter": "ForeignKey", + "patient": "ForeignKey", + "measurement_id": "UUIDField", + "measured_datetime": "DateTimeField", + "temperature": "DecimalField", + "temperature_method": "CharField", + "systolic_bp": "PositiveIntegerField", + "diastolic_bp": "PositiveIntegerField", + "bp_position": "CharField", + "bp_cuff_size": "CharField", + "heart_rate": "PositiveIntegerField", + "heart_rhythm": "CharField", + "respiratory_rate": "PositiveIntegerField", + "oxygen_saturation": "PositiveIntegerField", + "oxygen_delivery": "CharField", + "oxygen_flow_rate": "DecimalField", + "pain_scale": "PositiveIntegerField", + "pain_location": "CharField", + "pain_quality": "CharField", + "weight": "DecimalField", + "height": "DecimalField", + "bmi": "DecimalField", + "head_circumference": "DecimalField", + "device_used": "CharField", + "device_calibrated": "BooleanField", + "measured_by": "ForeignKey", + "verified_by": "ForeignKey", + "critical_values": "JSONField", + "alerts_generated": "JSONField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Encounter", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 349, + "file": "emr/models.py" + }, + { + "name": "ProblemList", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "problem_id": "UUIDField", + "problem_name": "CharField", + "problem_code": "CharField", + "coding_system": "CharField", + "problem_type": "CharField", + "onset_date": "DateField", + "onset_description": "CharField", + "severity": "CharField", + "priority": "CharField", + "status": "CharField", + "resolution_date": "DateField", + "resolution_notes": "TextField", + "diagnosing_provider": "ForeignKey", + "managing_provider": "ForeignKey", + "related_encounter": "ForeignKey", + "body_site": "CharField", + "laterality": "CharField", + "clinical_notes": "TextField", + "patient_concerns": "TextField", + "treatment_goals": "JSONField", + "outcome_measures": "JSONField", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_date": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 732, + "file": "emr/models.py" + }, + { + "name": "CarePlan", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "care_plan_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "plan_type": "CharField", + "category": "CharField", + "start_date": "DateField", + "end_date": "DateField", + "target_completion_date": "DateField", + "status": "CharField", + "priority": "CharField", + "primary_provider": "ForeignKey", + "care_team": "ManyToManyField", + "related_problems": "ManyToManyField", + "goals": "JSONField", + "objectives": "JSONField", + "interventions": "JSONField", + "activities": "JSONField", + "monitoring_parameters": "JSONField", + "evaluation_criteria": "JSONField", + "patient_goals": "TextField", + "patient_preferences": "TextField", + "patient_barriers": "TextField", + "resources_needed": "JSONField", + "support_systems": "JSONField", + "progress_notes": "TextField", + "last_reviewed": "DateField", + "next_review_date": "DateField", + "outcomes_achieved": "JSONField", + "completion_percentage": "PositiveIntegerField", + "approved": "BooleanField", + "approved_by": "ForeignKey", + "approved_date": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL", + "ProblemList" + ], + "lineno": 1105, + "file": "emr/models.py" + }, + { + "name": "ClinicalNote", + "fields": { + "encounter": "ForeignKey", + "patient": "ForeignKey", + "note_id": "UUIDField", + "note_type": "CharField", + "title": "CharField", + "content": "TextField", + "template": "ForeignKey", + "structured_data": "JSONField", + "author": "ForeignKey", + "co_signers": "ManyToManyField", + "status": "CharField", + "electronically_signed": "BooleanField", + "signed_datetime": "DateTimeField", + "signature_method": "CharField", + "amended_note": "ForeignKey", + "amendment_reason": "TextField", + "quality_score": "PositiveIntegerField", + "compliance_flags": "JSONField", + "note_datetime": "DateTimeField", + "confidential": "BooleanField", + "restricted_access": "BooleanField", + "access_restrictions": "JSONField", + "related_problems": "ManyToManyField", + "related_care_plans": "ManyToManyField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Encounter", + "patients.PatientProfile", + "NoteTemplate", + "settings.AUTH_USER_MODEL", + "self" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL", + "ProblemList", + "CarePlan" + ], + "lineno": 1514, + "file": "emr/models.py" + }, + { + "name": "NoteTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "note_type": "CharField", + "specialty": "CharField", + "template_content": "TextField", + "structured_fields": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "version": "CharField", + "previous_version": "ForeignKey", + "quality_indicators": "JSONField", + "compliance_requirements": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1753, + "file": "emr/models.py" + }, + { + "name": "Icd10", + "fields": { + "code": "CharField", + "description": "TextField", + "chapter_name": "CharField", + "section_name": "CharField", + "parent": "ForeignKey", + "is_header": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "self" + ], + "m2ms": [], + "lineno": 1929, + "file": "emr/models.py" + }, + { + "name": "ClinicalRecommendation", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "recommendation_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "category": "CharField", + "priority": "CharField", + "evidence_level": "CharField", + "source": "CharField", + "rationale": "TextField", + "status": "CharField", + "accepted_by": "ForeignKey", + "accepted_at": "DateTimeField", + "deferred_by": "ForeignKey", + "deferred_at": "DateTimeField", + "dismissed_by": "ForeignKey", + "dismissed_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "expires_at": "DateTimeField", + "related_problems": "ManyToManyField", + "related_encounter": "ForeignKey", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "ProblemList" + ], + "lineno": 1968, + "file": "emr/models.py" + }, + { + "name": "AllergyAlert", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "alert_id": "UUIDField", + "allergen": "CharField", + "reaction_type": "CharField", + "severity": "CharField", + "symptoms": "TextField", + "onset": "CharField", + "resolved": "BooleanField", + "resolved_at": "DateTimeField", + "resolved_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "detected_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2180, + "file": "emr/models.py" + }, + { + "name": "TreatmentProtocol", + "fields": { + "tenant": "ForeignKey", + "protocol_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "indication": "TextField", + "goals": "JSONField", + "interventions": "JSONField", + "monitoring_parameters": "JSONField", + "success_rate": "DecimalField", + "average_duration": "PositiveIntegerField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2287, + "file": "emr/models.py" + }, + { + "name": "ClinicalGuideline", + "fields": { + "tenant": "ForeignKey", + "guideline_id": "UUIDField", + "title": "CharField", + "organization": "CharField", + "summary": "TextField", + "url": "URLField", + "publication_date": "DateField", + "last_updated": "DateField", + "version": "CharField", + "is_active": "BooleanField", + "keywords": "JSONField", + "specialties": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant" + ], + "m2ms": [], + "lineno": 2386, + "file": "emr/models.py" + }, + { + "name": "CriticalAlert", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "alert_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "priority": "CharField", + "recommendation": "TextField", + "acknowledged": "BooleanField", + "acknowledged_by": "ForeignKey", + "acknowledged_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "expires_at": "DateTimeField", + "related_encounter": "ForeignKey", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2480, + "file": "emr/models.py" + }, + { + "name": "DiagnosticSuggestion", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "suggestion_id": "UUIDField", + "test_name": "CharField", + "test_code": "CharField", + "indication": "TextField", + "confidence": "DecimalField", + "status": "CharField", + "ordered_by": "ForeignKey", + "ordered_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2619, + "file": "emr/models.py" + } + ], + "pharmacy": [ + { + "name": "Medication", + "fields": { + "tenant": "ForeignKey", + "medication_id": "UUIDField", + "generic_name": "CharField", + "brand_name": "CharField", + "ndc_number": "CharField", + "rxcui": "CharField", + "drug_class": "CharField", + "controlled_substance_schedule": "CharField", + "dosage_form": "CharField", + "strength": "CharField", + "unit_of_measure": "CharField", + "indications": "TextField", + "contraindications": "TextField", + "side_effects": "TextField", + "warnings": "TextField", + "adult_dose_range": "CharField", + "pediatric_dose_range": "CharField", + "max_daily_dose": "CharField", + "routes_of_administration": "JSONField", + "administration_instructions": "TextField", + "storage_requirements": "CharField", + "special_handling": "TextField", + "formulary_status": "CharField", + "is_active": "BooleanField", + "is_available": "BooleanField", + "unit_cost": "DecimalField", + "awp": "DecimalField", + "manufacturer": "CharField", + "manufacturer_ndc": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "pharmacy/models.py" + }, + { + "name": "Prescription", + "fields": { + "tenant": "ForeignKey", + "prescription_id": "UUIDField", + "prescription_number": "CharField", + "patient": "ForeignKey", + "prescriber": "ForeignKey", + "medication": "ForeignKey", + "quantity_prescribed": "PositiveIntegerField", + "quantity_unit": "CharField", + "dosage_instructions": "TextField", + "frequency": "CharField", + "duration": "CharField", + "refills_authorized": "PositiveIntegerField", + "refills_remaining": "PositiveIntegerField", + "date_prescribed": "DateTimeField", + "date_written": "DateField", + "expiration_date": "DateField", + "status": "CharField", + "indication": "CharField", + "diagnosis_code": "CharField", + "pharmacy_notes": "TextField", + "patient_instructions": "TextField", + "prior_authorization_required": "BooleanField", + "prior_authorization_number": "CharField", + "prior_authorization_expiry": "DateField", + "generic_substitution_allowed": "BooleanField", + "dispense_as_written": "BooleanField", + "electronic_prescription": "BooleanField", + "e_prescription_id": "CharField", + "encounter": "ForeignKey", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_datetime": "DateTimeField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "Medication", + "emr.Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 295, + "file": "pharmacy/models.py" + }, + { + "name": "MedicationInventoryItem", + "fields": { + "tenant": "ForeignKey", + "medication": "ForeignKey", + "inventory_item": "ForeignKey", + "medication_inventory_id": "UUIDField", + "formulary_tier": "CharField", + "therapeutic_equivalent": "BooleanField", + "auto_substitution_allowed": "BooleanField", + "pharmacy_notes": "TextField", + "max_dispense_quantity": "PositiveIntegerField", + "requires_counseling": "BooleanField", + "requires_id_verification": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Medication", + "inventory.InventoryItem", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 661, + "file": "pharmacy/models.py" + }, + { + "name": "DispenseRecord", + "fields": { + "prescription": "ForeignKey", + "inventory_stock": "ForeignKey", + "dispense_id": "UUIDField", + "quantity_dispensed": "PositiveIntegerField", + "quantity_remaining": "PositiveIntegerField", + "date_dispensed": "DateTimeField", + "dispensed_by": "ForeignKey", + "verified_by": "ForeignKey", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "copay_amount": "DecimalField", + "insurance_amount": "DecimalField", + "patient_counseled": "BooleanField", + "counseling_notes": "TextField", + "is_refill": "BooleanField", + "refill_number": "PositiveIntegerField", + "status": "CharField", + "picked_up_by": "CharField", + "pickup_datetime": "DateTimeField", + "identification_verified": "BooleanField", + "quality_check_performed": "BooleanField", + "quality_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Prescription", + "inventory.InventoryStock", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 803, + "file": "pharmacy/models.py" + }, + { + "name": "MedicationAdministration", + "fields": { + "prescription": "ForeignKey", + "patient": "ForeignKey", + "encounter": "ForeignKey", + "administration_id": "UUIDField", + "scheduled_datetime": "DateTimeField", + "actual_datetime": "DateTimeField", + "dose_given": "CharField", + "route_given": "CharField", + "status": "CharField", + "administered_by": "ForeignKey", + "witnessed_by": "ForeignKey", + "reason_not_given": "CharField", + "reason_notes": "TextField", + "patient_response": "TextField", + "side_effects_observed": "TextField", + "injection_site": "CharField", + "site_condition": "CharField", + "double_checked": "BooleanField", + "double_checked_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Prescription", + "patients.PatientProfile", + "emr.Encounter", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1012, + "file": "pharmacy/models.py" + }, + { + "name": "DrugInteraction", + "fields": { + "tenant": "ForeignKey", + "medication_1": "ForeignKey", + "medication_2": "ForeignKey", + "interaction_id": "UUIDField", + "severity": "CharField", + "interaction_type": "CharField", + "mechanism": "TextField", + "clinical_effect": "TextField", + "management_recommendations": "TextField", + "monitoring_parameters": "TextField", + "evidence_level": "CharField", + "references": "TextField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Medication", + "Medication", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1220, + "file": "pharmacy/models.py" + } + ], + "laboratory": [ + { + "name": "LabTest", + "fields": { + "tenant": "ForeignKey", + "test_id": "UUIDField", + "test_code": "CharField", + "test_name": "CharField", + "test_description": "TextField", + "loinc_code": "CharField", + "cpt_code": "CharField", + "snomed_code": "CharField", + "test_category": "CharField", + "test_type": "CharField", + "specimen_type": "CharField", + "specimen_volume": "CharField", + "collection_container": "CharField", + "collection_instructions": "TextField", + "processing_time": "PositiveIntegerField", + "turnaround_time": "PositiveIntegerField", + "stat_available": "BooleanField", + "stat_turnaround_time": "PositiveIntegerField", + "storage_temperature": "CharField", + "transport_requirements": "TextField", + "stability_time": "PositiveIntegerField", + "clinical_significance": "TextField", + "indications": "TextField", + "contraindications": "TextField", + "patient_preparation": "TextField", + "fasting_required": "BooleanField", + "fasting_hours": "PositiveIntegerField", + "methodology": "CharField", + "analyzer": "CharField", + "qc_frequency": "CharField", + "cost": "DecimalField", + "is_active": "BooleanField", + "is_orderable": "BooleanField", + "department": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "laboratory/models.py" + }, + { + "name": "LabOrder", + "fields": { + "tenant": "ForeignKey", + "order_id": "UUIDField", + "order_number": "CharField", + "patient": "ForeignKey", + "ordering_provider": "ForeignKey", + "tests": "ManyToManyField", + "scheduled_collection": "DateTimeField", + "order_datetime": "DateTimeField", + "priority": "CharField", + "clinical_indication": "TextField", + "diagnosis_code": "CharField", + "clinical_notes": "TextField", + "collection_datetime": "DateTimeField", + "collection_location": "CharField", + "fasting_status": "CharField", + "status": "CharField", + "encounter": "ForeignKey", + "special_instructions": "TextField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "emr.Encounter" + ], + "m2ms": [ + "LabTest" + ], + "lineno": 332, + "file": "laboratory/models.py" + }, + { + "name": "Specimen", + "fields": { + "order": "ForeignKey", + "specimen_id": "UUIDField", + "specimen_number": "CharField", + "specimen_type": "CharField", + "container_type": "CharField", + "volume": "CharField", + "collected_datetime": "DateTimeField", + "collected_by": "ForeignKey", + "collection_site": "CharField", + "collection_method": "CharField", + "quality": "CharField", + "rejection_reason": "CharField", + "quality_notes": "TextField", + "received_datetime": "DateTimeField", + "received_by": "ForeignKey", + "storage_location": "CharField", + "storage_temperature": "CharField", + "status": "CharField", + "chain_of_custody": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "LabOrder", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 586, + "file": "laboratory/models.py" + }, + { + "name": "LabResult", + "fields": { + "order": "ForeignKey", + "test": "ForeignKey", + "specimen": "ForeignKey", + "result_id": "UUIDField", + "result_value": "TextField", + "result_unit": "CharField", + "result_type": "CharField", + "reference_range": "CharField", + "abnormal_flag": "CharField", + "is_critical": "BooleanField", + "critical_called": "BooleanField", + "critical_called_datetime": "DateTimeField", + "critical_called_to": "CharField", + "analyzed_datetime": "DateTimeField", + "analyzed_by": "ForeignKey", + "analyzer": "CharField", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_datetime": "DateTimeField", + "status": "CharField", + "technician_comments": "TextField", + "pathologist_comments": "TextField", + "qc_passed": "BooleanField", + "qc_notes": "TextField", + "reported_datetime": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "LabOrder", + "LabTest", + "Specimen", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 821, + "file": "laboratory/models.py" + }, + { + "name": "QualityControl", + "fields": { + "tenant": "ForeignKey", + "test": "ForeignKey", + "result": "ForeignKey", + "qc_id": "UUIDField", + "control_material": "CharField", + "control_lot": "CharField", + "control_level": "CharField", + "target_value": "DecimalField", + "acceptable_range_low": "DecimalField", + "acceptable_range_high": "DecimalField", + "run_datetime": "DateTimeField", + "observed_value": "DecimalField", + "status": "CharField", + "performed_by": "ForeignKey", + "reviewed_by": "ForeignKey", + "analyzer": "CharField", + "comments": "TextField", + "corrective_action": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "LabTest", + "LabResult", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1060, + "file": "laboratory/models.py" + }, + { + "name": "ReferenceRange", + "fields": { + "test": "ForeignKey", + "range_id": "UUIDField", + "gender": "CharField", + "age_min": "PositiveIntegerField", + "age_max": "PositiveIntegerField", + "range_low": "DecimalField", + "range_high": "DecimalField", + "range_text": "CharField", + "critical_low": "DecimalField", + "critical_high": "DecimalField", + "unit": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "LabTest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1234, + "file": "laboratory/models.py" + } + ], + "radiology": [ + { + "name": "ImagingStudy", + "fields": { + "tenant": "ForeignKey", + "study_id": "UUIDField", + "study_instance_uid": "CharField", + "accession_number": "CharField", + "patient": "ForeignKey", + "referring_physician": "ForeignKey", + "radiologist": "ForeignKey", + "modality": "CharField", + "study_description": "CharField", + "body_part": "CharField", + "scheduled_datetime": "DateTimeField", + "study_datetime": "DateTimeField", + "arrived_datetime": "DateTimeField", + "started_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "interpreted_datetime": "DateTimeField", + "finalized_datetime": "DateTimeField", + "clinical_indication": "TextField", + "clinical_history": "TextField", + "diagnosis_code": "CharField", + "status": "CharField", + "priority": "CharField", + "kvp": "FloatField", + "mas": "FloatField", + "exposure_time": "FloatField", + "slice_thickness": "FloatField", + "station_name": "CharField", + "manufacturer": "CharField", + "model_name": "CharField", + "number_of_series": "PositiveIntegerField", + "number_of_instances": "PositiveIntegerField", + "study_size": "BigIntegerField", + "image_quality": "CharField", + "completion_status": "CharField", + "encounter": "ForeignKey", + "imaging_order": "ForeignKey", + "pacs_location": "CharField", + "archived": "BooleanField", + "archive_location": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "objects": "ImagingStudyManager" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "ImagingOrder", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 24, + "file": "radiology/models.py" + }, + { + "name": "ImagingSeries", + "fields": { + "study": "ForeignKey", + "series_id": "UUIDField", + "series_instance_uid": "CharField", + "series_number": "PositiveIntegerField", + "modality": "CharField", + "series_description": "CharField", + "protocol_name": "CharField", + "series_datetime": "DateTimeField", + "started_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "processed_datetime": "DateTimeField", + "archived_datetime": "DateTimeField", + "slice_thickness": "FloatField", + "spacing_between_slices": "FloatField", + "pixel_spacing": "CharField", + "image_orientation": "CharField", + "number_of_instances": "PositiveIntegerField", + "series_size": "BigIntegerField", + "body_part": "CharField", + "patient_position": "CharField", + "contrast_agent": "CharField", + "contrast_route": "CharField", + "image_quality": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "ImagingSeriesManager" + }, + "fks": [ + "ImagingStudy" + ], + "m2ms": [], + "lineno": 468, + "file": "radiology/models.py" + }, + { + "name": "DICOMImage", + "fields": { + "series": "ForeignKey", + "image_id": "UUIDField", + "sop_instance_uid": "CharField", + "instance_number": "PositiveIntegerField", + "image_type": "CharField", + "sop_class_uid": "CharField", + "rows": "PositiveIntegerField", + "columns": "PositiveIntegerField", + "bits_allocated": "PositiveIntegerField", + "bits_stored": "PositiveIntegerField", + "image_position": "CharField", + "image_orientation": "CharField", + "slice_location": "FloatField", + "window_center": "FloatField", + "window_width": "FloatField", + "file_path": "CharField", + "file_size": "BigIntegerField", + "transfer_syntax_uid": "CharField", + "content_date": "DateField", + "content_time": "TimeField", + "acquisition_datetime": "DateTimeField", + "processed_datetime": "DateTimeField", + "quality_checked_datetime": "DateTimeField", + "archived_datetime": "DateTimeField", + "image_quality": "CharField", + "processed": "BooleanField", + "archived": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "DICOMImageManager" + }, + "fks": [ + "ImagingSeries" + ], + "m2ms": [], + "lineno": 676, + "file": "radiology/models.py" + }, + { + "name": "RadiologyReport", + "fields": { + "study": "OneToOneField", + "report_id": "UUIDField", + "radiologist": "ForeignKey", + "dictated_by": "ForeignKey", + "transcribed_by": "ForeignKey", + "clinical_history": "TextField", + "technique": "TextField", + "findings": "TextField", + "impression": "TextField", + "recommendations": "TextField", + "status": "CharField", + "critical_finding": "BooleanField", + "critical_communicated": "BooleanField", + "critical_communicated_to": "ForeignKey", + "critical_communicated_datetime": "DateTimeField", + "dictated_datetime": "DateTimeField", + "transcribed_datetime": "DateTimeField", + "verified_datetime": "DateTimeField", + "finalized_datetime": "DateTimeField", + "template_used": "ForeignKey", + "structured_data": "JSONField", + "report_length": "PositiveIntegerField", + "turnaround_time": "PositiveIntegerField", + "addendum": "TextField", + "addendum_datetime": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "RadiologyReportManager" + }, + "fks": [ + "ImagingStudy", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "ReportTemplate" + ], + "m2ms": [], + "lineno": 923, + "file": "radiology/models.py" + }, + { + "name": "ReportTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "modality": "CharField", + "body_part": "CharField", + "clinical_history_template": "TextField", + "technique_template": "TextField", + "findings_template": "TextField", + "impression_template": "TextField", + "recommendations_template": "TextField", + "structured_fields": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "objects": "ReportTemplateManager" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1151, + "file": "radiology/models.py" + }, + { + "name": "ImagingOrder", + "fields": { + "tenant": "ForeignKey", + "order_id": "UUIDField", + "order_number": "CharField", + "patient": "ForeignKey", + "ordering_provider": "ForeignKey", + "order_datetime": "DateTimeField", + "priority": "CharField", + "modality": "CharField", + "study_description": "CharField", + "body_part": "CharField", + "clinical_indication": "TextField", + "clinical_history": "TextField", + "diagnosis_code": "CharField", + "contrast_required": "BooleanField", + "contrast_type": "CharField", + "contrast_route": "CharField", + "requested_datetime": "DateTimeField", + "approved_datetime": "DateTimeField", + "scheduled_datetime": "DateTimeField", + "cancelled_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "status": "CharField", + "encounter": "ForeignKey", + "special_instructions": "TextField", + "patient_preparation": "TextField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "ImagingOrderManager" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "emr.Encounter" + ], + "m2ms": [], + "lineno": 1310, + "file": "radiology/models.py" + } + ], + "operating_theatre": [ + { + "name": "OperatingRoom", + "fields": { + "tenant": "ForeignKey", + "room_id": "UUIDField", + "room_number": "CharField", + "room_name": "CharField", + "room_type": "CharField", + "status": "CharField", + "floor_number": "PositiveIntegerField", + "room_size": "FloatField", + "ceiling_height": "FloatField", + "temperature_min": "FloatField", + "temperature_max": "FloatField", + "humidity_min": "FloatField", + "humidity_max": "FloatField", + "air_changes_per_hour": "PositiveIntegerField", + "positive_pressure": "BooleanField", + "equipment_list": "JSONField", + "special_features": "JSONField", + "has_c_arm": "BooleanField", + "has_ct": "BooleanField", + "has_mri": "BooleanField", + "has_ultrasound": "BooleanField", + "has_neuromonitoring": "BooleanField", + "supports_robotic": "BooleanField", + "supports_laparoscopic": "BooleanField", + "supports_microscopy": "BooleanField", + "supports_laser": "BooleanField", + "max_case_duration": "PositiveIntegerField", + "turnover_time": "PositiveIntegerField", + "cleaning_time": "PositiveIntegerField", + "required_nurses": "PositiveIntegerField", + "required_techs": "PositiveIntegerField", + "is_active": "BooleanField", + "accepts_emergency": "BooleanField", + "building": "CharField", + "wing": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "operating_theatre/models.py" + }, + { + "name": "ORBlock", + "fields": { + "operating_room": "ForeignKey", + "block_id": "UUIDField", + "date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "block_type": "CharField", + "primary_surgeon": "ForeignKey", + "assistant_surgeons": "ManyToManyField", + "service": "CharField", + "status": "CharField", + "allocated_minutes": "PositiveIntegerField", + "used_minutes": "PositiveIntegerField", + "special_equipment": "JSONField", + "special_setup": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "OperatingRoom", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 286, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalCase", + "fields": { + "or_block": "ForeignKey", + "case_id": "UUIDField", + "case_number": "CharField", + "patient": "ForeignKey", + "primary_surgeon": "ForeignKey", + "assistant_surgeons": "ManyToManyField", + "anesthesiologist": "ForeignKey", + "circulating_nurse": "ForeignKey", + "scrub_nurse": "ForeignKey", + "primary_procedure": "CharField", + "secondary_procedures": "JSONField", + "procedure_codes": "JSONField", + "case_type": "CharField", + "approach": "CharField", + "anesthesia_type": "CharField", + "scheduled_start": "DateTimeField", + "estimated_duration": "PositiveIntegerField", + "actual_start": "DateTimeField", + "actual_end": "DateTimeField", + "status": "CharField", + "diagnosis": "CharField", + "diagnosis_codes": "JSONField", + "clinical_notes": "TextField", + "special_equipment": "JSONField", + "blood_products": "JSONField", + "implants": "JSONField", + "patient_position": "CharField", + "complications": "JSONField", + "estimated_blood_loss": "PositiveIntegerField", + "encounter": "ForeignKey", + "admission": "ForeignKey", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ORBlock", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "inpatients.Admission", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 471, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalNote", + "fields": { + "surgical_case": "OneToOneField", + "note_id": "UUIDField", + "surgeon": "ForeignKey", + "preoperative_diagnosis": "TextField", + "planned_procedure": "TextField", + "indication": "TextField", + "procedure_performed": "TextField", + "surgical_approach": "TextField", + "findings": "TextField", + "technique": "TextField", + "postoperative_diagnosis": "TextField", + "condition": "CharField", + "disposition": "CharField", + "complications": "TextField", + "estimated_blood_loss": "PositiveIntegerField", + "blood_transfusion": "TextField", + "specimens": "TextField", + "implants": "TextField", + "drains": "TextField", + "closure": "TextField", + "postop_instructions": "TextField", + "follow_up": "TextField", + "status": "CharField", + "signed_datetime": "DateTimeField", + "template_used": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "SurgicalCase", + "settings.AUTH_USER_MODEL", + "SurgicalNoteTemplate" + ], + "m2ms": [], + "lineno": 862, + "file": "operating_theatre/models.py" + }, + { + "name": "EquipmentUsage", + "fields": { + "surgical_case": "ForeignKey", + "usage_id": "UUIDField", + "equipment_name": "CharField", + "equipment_type": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "quantity_used": "PositiveIntegerField", + "unit_of_measure": "CharField", + "start_time": "DateTimeField", + "end_time": "DateTimeField", + "unit_cost": "DecimalField", + "total_cost": "DecimalField", + "lot_number": "CharField", + "expiration_date": "DateField", + "sterilization_date": "DateField", + "notes": "TextField", + "recorded_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "SurgicalCase", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1068, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalNoteTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "procedure_type": "CharField", + "specialty": "CharField", + "preoperative_diagnosis_template": "TextField", + "planned_procedure_template": "TextField", + "indication_template": "TextField", + "procedure_performed_template": "TextField", + "surgical_approach_template": "TextField", + "findings_template": "TextField", + "technique_template": "TextField", + "postoperative_diagnosis_template": "TextField", + "complications_template": "TextField", + "specimens_template": "TextField", + "implants_template": "TextField", + "closure_template": "TextField", + "postop_instructions_template": "TextField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1262, + "file": "operating_theatre/models.py" + } + ], + "billing": [ + { + "name": "MedicalBill", + "fields": { + "tenant": "ForeignKey", + "bill_id": "UUIDField", + "bill_number": "CharField", + "patient": "ForeignKey", + "bill_type": "CharField", + "service_date_from": "DateField", + "service_date_to": "DateField", + "bill_date": "DateField", + "due_date": "DateField", + "subtotal": "DecimalField", + "tax_amount": "DecimalField", + "discount_amount": "DecimalField", + "adjustment_amount": "DecimalField", + "total_amount": "DecimalField", + "paid_amount": "DecimalField", + "balance_amount": "DecimalField", + "primary_insurance": "ForeignKey", + "secondary_insurance": "ForeignKey", + "status": "CharField", + "attending_provider": "ForeignKey", + "billing_provider": "ForeignKey", + "encounter": "ForeignKey", + "admission": "ForeignKey", + "notes": "TextField", + "payment_terms": "CharField", + "collection_status": "CharField", + "last_statement_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "patients.InsuranceInfo", + "patients.InsuranceInfo", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "inpatients.Admission", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "billing/models.py" + }, + { + "name": "BillLineItem", + "fields": { + "medical_bill": "ForeignKey", + "line_item_id": "UUIDField", + "line_number": "PositiveIntegerField", + "service_date": "DateField", + "service_code": "CharField", + "service_description": "CharField", + "service_category": "CharField", + "quantity": "DecimalField", + "unit_of_measure": "CharField", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "modifier_1": "CharField", + "modifier_2": "CharField", + "modifier_3": "CharField", + "modifier_4": "CharField", + "primary_diagnosis": "CharField", + "secondary_diagnoses": "JSONField", + "rendering_provider": "ForeignKey", + "supervising_provider": "ForeignKey", + "place_of_service": "IntegerField", + "revenue_code": "CharField", + "ndc_code": "CharField", + "drug_quantity": "DecimalField", + "drug_unit": "CharField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "MedicalBill", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 321, + "file": "billing/models.py" + }, + { + "name": "InsuranceClaim", + "fields": { + "medical_bill": "ForeignKey", + "claim_id": "UUIDField", + "claim_number": "CharField", + "insurance_info": "ForeignKey", + "claim_type": "CharField", + "submission_date": "DateField", + "service_date_from": "DateField", + "service_date_to": "DateField", + "billed_amount": "DecimalField", + "allowed_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "deductible_amount": "DecimalField", + "coinsurance_amount": "DecimalField", + "copay_amount": "DecimalField", + "status": "CharField", + "clearinghouse": "CharField", + "batch_number": "CharField", + "response_date": "DateField", + "check_number": "CharField", + "check_date": "DateField", + "denial_reason": "CharField", + "denial_code": "CharField", + "prior_auth_number": "CharField", + "notes": "TextField", + "original_claim": "ForeignKey", + "resubmission_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "MedicalBill", + "patients.InsuranceInfo", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 606, + "file": "billing/models.py" + }, + { + "name": "Payment", + "fields": { + "medical_bill": "ForeignKey", + "payment_id": "UUIDField", + "payment_number": "CharField", + "payment_date": "DateField", + "payment_amount": "DecimalField", + "payment_method": "CharField", + "payment_source": "CharField", + "check_number": "CharField", + "bank_name": "CharField", + "routing_number": "CharField", + "card_type": "CharField", + "card_last_four": "CharField", + "authorization_code": "CharField", + "transaction_id": "CharField", + "insurance_claim": "ForeignKey", + "eob_number": "CharField", + "status": "CharField", + "deposit_date": "DateField", + "deposit_slip": "CharField", + "notes": "TextField", + "refund_amount": "DecimalField", + "refund_date": "DateField", + "refund_reason": "CharField", + "received_by": "ForeignKey", + "processed_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "MedicalBill", + "InsuranceClaim", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 883, + "file": "billing/models.py" + }, + { + "name": "ClaimStatusUpdate", + "fields": { + "insurance_claim": "ForeignKey", + "update_id": "UUIDField", + "previous_status": "CharField", + "new_status": "CharField", + "status_date": "DateTimeField", + "update_source": "CharField", + "response_code": "CharField", + "response_message": "TextField", + "allowed_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "notes": "TextField", + "updated_by": "ForeignKey", + "created_at": "DateTimeField" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1160, + "file": "billing/models.py" + }, + { + "name": "BillingConfiguration", + "fields": { + "tenant": "OneToOneField", + "config_id": "UUIDField", + "default_payment_terms": "CharField", + "tax_rate": "DecimalField", + "tax_exempt": "BooleanField", + "statement_frequency": "CharField", + "statement_message": "TextField", + "first_notice_days": "PositiveIntegerField", + "second_notice_days": "PositiveIntegerField", + "final_notice_days": "PositiveIntegerField", + "collections_days": "PositiveIntegerField", + "apply_interest": "BooleanField", + "interest_rate": "DecimalField", + "accept_credit_cards": "BooleanField", + "accept_ach": "BooleanField", + "payment_portal_enabled": "BooleanField", + "auto_submit_claims": "BooleanField", + "claim_submission_frequency": "CharField", + "primary_clearinghouse": "CharField", + "secondary_clearinghouse": "CharField", + "aging_buckets": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1297, + "file": "billing/models.py" + } + ], + "inventory": [ + { + "name": "InventoryItem", + "fields": { + "tenant": "ForeignKey", + "item_id": "UUIDField", + "item_code": "CharField", + "item_name": "CharField", + "description": "TextField", + "category": "CharField", + "subcategory": "CharField", + "item_type": "CharField", + "manufacturer": "CharField", + "model_number": "CharField", + "part_number": "CharField", + "upc_code": "CharField", + "ndc_code": "CharField", + "gtin_code": "CharField", + "unit_of_measure": "CharField", + "package_size": "PositiveIntegerField", + "package_type": "CharField", + "unit_cost": "DecimalField", + "list_price": "DecimalField", + "storage_temperature_min": "DecimalField", + "storage_temperature_max": "DecimalField", + "storage_humidity_min": "PositiveIntegerField", + "storage_humidity_max": "PositiveIntegerField", + "storage_requirements": "TextField", + "has_expiration": "BooleanField", + "shelf_life_days": "PositiveIntegerField", + "fda_approved": "BooleanField", + "controlled_substance": "BooleanField", + "dea_schedule": "CharField", + "is_active": "BooleanField", + "is_tracked": "BooleanField", + "is_serialized": "BooleanField", + "is_lot_tracked": "BooleanField", + "reorder_point": "PositiveIntegerField", + "reorder_quantity": "PositiveIntegerField", + "min_stock_level": "PositiveIntegerField", + "max_stock_level": "PositiveIntegerField", + "primary_supplier": "ForeignKey", + "clinical_use": "TextField", + "contraindications": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Supplier", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 16, + "file": "inventory/models.py" + }, + { + "name": "InventoryStock", + "fields": { + "inventory_item": "ForeignKey", + "location": "ForeignKey", + "stock_id": "UUIDField", + "lot_number": "CharField", + "serial_number": "CharField", + "quantity_on_hand": "PositiveIntegerField", + "quantity_reserved": "PositiveIntegerField", + "quantity_available": "PositiveIntegerField", + "received_date": "DateField", + "expiration_date": "DateField", + "unit_cost": "DecimalField", + "total_cost": "DecimalField", + "quality_status": "CharField", + "supplier": "ForeignKey", + "purchase_order": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "InventoryItem", + "InventoryLocation", + "Supplier", + "PurchaseOrder" + ], + "m2ms": [], + "lineno": 384, + "file": "inventory/models.py" + }, + { + "name": "InventoryLocation", + "fields": { + "tenant": "ForeignKey", + "location_id": "UUIDField", + "location_code": "CharField", + "name": "CharField", + "description": "TextField", + "location_type": "CharField", + "building": "CharField", + "floor": "CharField", + "room": "CharField", + "zone": "CharField", + "aisle": "CharField", + "shelf": "CharField", + "bin": "CharField", + "capacity_cubic_feet": "DecimalField", + "max_weight_pounds": "DecimalField", + "temperature_controlled": "BooleanField", + "temperature_min": "DecimalField", + "temperature_max": "DecimalField", + "humidity_controlled": "BooleanField", + "humidity_min": "PositiveIntegerField", + "humidity_max": "PositiveIntegerField", + "secure_location": "BooleanField", + "access_control": "CharField", + "is_active": "BooleanField", + "parent_location": "ForeignKey", + "location_manager": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 562, + "file": "inventory/models.py" + }, + { + "name": "PurchaseOrder", + "fields": { + "tenant": "ForeignKey", + "po_id": "UUIDField", + "po_number": "CharField", + "supplier": "ForeignKey", + "order_date": "DateField", + "requested_delivery_date": "DateField", + "promised_delivery_date": "DateField", + "actual_delivery_date": "DateField", + "order_type": "CharField", + "priority": "CharField", + "subtotal": "DecimalField", + "tax_amount": "DecimalField", + "shipping_amount": "DecimalField", + "total_amount": "DecimalField", + "status": "CharField", + "delivery_location": "ForeignKey", + "delivery_instructions": "TextField", + "payment_terms": "CharField", + "requested_by": "ForeignKey", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Supplier", + "InventoryLocation", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 819, + "file": "inventory/models.py" + }, + { + "name": "PurchaseOrderItem", + "fields": { + "purchase_order": "ForeignKey", + "item_id": "UUIDField", + "line_number": "PositiveIntegerField", + "inventory_item": "ForeignKey", + "quantity_ordered": "PositiveIntegerField", + "quantity_received": "PositiveIntegerField", + "quantity_remaining": "PositiveIntegerField", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "requested_delivery_date": "DateField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PurchaseOrder", + "InventoryItem" + ], + "m2ms": [], + "lineno": 1080, + "file": "inventory/models.py" + }, + { + "name": "Supplier", + "fields": { + "tenant": "ForeignKey", + "supplier_id": "UUIDField", + "supplier_code": "CharField", + "name": "CharField", + "supplier_type": "CharField", + "contact_person": "CharField", + "phone": "CharField", + "email": "EmailField", + "website": "URLField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "postal_code": "CharField", + "country": "CharField", + "tax_id": "CharField", + "duns_number": "CharField", + "payment_terms": "CharField", + "performance_rating": "DecimalField", + "on_time_delivery_rate": "DecimalField", + "quality_rating": "DecimalField", + "is_active": "BooleanField", + "is_preferred": "BooleanField", + "certifications": "JSONField", + "contract_start_date": "DateField", + "contract_end_date": "DateField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1208, + "file": "inventory/models.py" + } + ], + "hr": [ + { + "name": "Employee", + "fields": { + "tenant": "ForeignKey", + "user": "OneToOneField", + "employee_id": "CharField", + "identification_number": "CharField", + "id_type": "CharField", + "first_name": "CharField", + "father_name": "CharField", + "grandfather_name": "CharField", + "last_name": "CharField", + "e164_ksa_regex": "RegexValidator", + "email": "EmailField", + "phone": "CharField", + "mobile_phone": "CharField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "postal_code": "CharField", + "country": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "marital_status": "CharField", + "user_timezone": "CharField", + "language": "CharField", + "theme": "CharField", + "role": "CharField", + "department": "ForeignKey", + "job_title": "CharField", + "license_number": "CharField", + "license_expiry_date": "DateField", + "license_state": "CharField", + "dea_number": "CharField", + "npi_number": "CharField", + "employment_status": "CharField", + "employment_type": "CharField", + "hire_date": "DateField", + "termination_date": "DateField", + "supervisor": "ForeignKey", + "hourly_rate": "DecimalField", + "standard_hours_per_week": "DecimalField", + "annual_salary": "DecimalField", + "fte_percentage": "DecimalField", + "profile_picture": "ImageField", + "bio": "TextField", + "emergency_contact_name": "CharField", + "emergency_contact_relationship": "CharField", + "emergency_contact_phone": "CharField", + "notes": "TextField", + "is_verified": "BooleanField", + "is_approved": "BooleanField", + "approval_date": "DateTimeField", + "approved_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "hr.Department", + "self", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 19, + "file": "hr/models.py" + }, + { + "name": "Department", + "fields": { + "tenant": "ForeignKey", + "department_id": "UUIDField", + "code": "CharField", + "name": "CharField", + "description": "TextField", + "department_type": "CharField", + "parent_department": "ForeignKey", + "department_head": "ForeignKey", + "phone": "CharField", + "extension": "CharField", + "email": "EmailField", + "annual_budget": "DecimalField", + "cost_center": "CharField", + "authorized_positions": "PositiveIntegerField", + "location": "CharField", + "is_active": "BooleanField", + "is_24_hour": "BooleanField", + "operating_hours": "JSONField", + "accreditation_required": "BooleanField", + "accreditation_body": "CharField", + "last_inspection_date": "DateField", + "next_inspection_date": "DateField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "Employee", + "hr.Employee" + ], + "m2ms": [], + "lineno": 250, + "file": "hr/models.py" + }, + { + "name": "Schedule", + "fields": { + "employee": "ForeignKey", + "schedule_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "schedule_type": "CharField", + "effective_date": "DateField", + "end_date": "DateField", + "schedule_pattern": "JSONField", + "is_active": "BooleanField", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Employee", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 471, + "file": "hr/models.py" + }, + { + "name": "ScheduleAssignment", + "fields": { + "schedule": "ForeignKey", + "assignment_id": "UUIDField", + "assignment_date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "shift_type": "CharField", + "department": "ForeignKey", + "location": "CharField", + "status": "CharField", + "break_minutes": "PositiveIntegerField", + "lunch_minutes": "PositiveIntegerField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Schedule", + "Department" + ], + "m2ms": [], + "lineno": 603, + "file": "hr/models.py" + }, + { + "name": "TimeEntry", + "fields": { + "employee": "ForeignKey", + "entry_id": "UUIDField", + "work_date": "DateField", + "clock_in_time": "DateTimeField", + "clock_out_time": "DateTimeField", + "break_start_time": "DateTimeField", + "break_end_time": "DateTimeField", + "lunch_start_time": "DateTimeField", + "lunch_end_time": "DateTimeField", + "regular_hours": "DecimalField", + "overtime_hours": "DecimalField", + "total_hours": "DecimalField", + "entry_type": "CharField", + "department": "ForeignKey", + "location": "CharField", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Employee", + "Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 750, + "file": "hr/models.py" + }, + { + "name": "PerformanceReview", + "fields": { + "employee": "ForeignKey", + "review_id": "UUIDField", + "review_period_start": "DateField", + "review_period_end": "DateField", + "review_date": "DateField", + "review_type": "CharField", + "reviewer": "ForeignKey", + "overall_rating": "DecimalField", + "competency_ratings": "JSONField", + "goals_achieved": "TextField", + "goals_not_achieved": "TextField", + "future_goals": "TextField", + "strengths": "TextField", + "areas_for_improvement": "TextField", + "development_plan": "TextField", + "training_recommendations": "TextField", + "employee_comments": "TextField", + "employee_signature_date": "DateField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 962, + "file": "hr/models.py" + }, + { + "name": "TrainingPrograms", + "fields": { + "tenant": "ForeignKey", + "program_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "program_type": "CharField", + "program_provider": "CharField", + "instructor": "ForeignKey", + "start_date": "DateField", + "end_date": "DateField", + "duration_hours": "DecimalField", + "cost": "DecimalField", + "is_certified": "BooleanField", + "validity_days": "PositiveIntegerField", + "notify_before_days": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1139, + "file": "hr/models.py" + }, + { + "name": "ProgramModule", + "fields": { + "program": "ForeignKey", + "title": "CharField", + "order": "PositiveIntegerField", + "hours": "DecimalField" + }, + "fks": [ + "TrainingPrograms" + ], + "m2ms": [], + "lineno": 1203, + "file": "hr/models.py" + }, + { + "name": "ProgramPrerequisite", + "fields": { + "program": "ForeignKey", + "required_program": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "TrainingPrograms" + ], + "m2ms": [], + "lineno": 1220, + "file": "hr/models.py" + }, + { + "name": "TrainingSession", + "fields": { + "session_id": "UUIDField", + "program": "ForeignKey", + "title": "CharField", + "instructor": "ForeignKey", + "delivery_method": "CharField", + "start_at": "DateTimeField", + "end_at": "DateTimeField", + "location": "CharField", + "capacity": "PositiveIntegerField", + "cost_override": "DecimalField", + "hours_override": "DecimalField", + "created_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1238, + "file": "hr/models.py" + }, + { + "name": "TrainingRecord", + "fields": { + "record_id": "UUIDField", + "employee": "ForeignKey", + "program": "ForeignKey", + "session": "ForeignKey", + "enrolled_at": "DateTimeField", + "started_at": "DateTimeField", + "completion_date": "DateField", + "expiry_date": "DateField", + "status": "CharField", + "credits_earned": "DecimalField", + "score": "DecimalField", + "passed": "BooleanField", + "notes": "TextField", + "cost_paid": "DecimalField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Employee", + "TrainingPrograms", + "TrainingSession", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1281, + "file": "hr/models.py" + }, + { + "name": "TrainingAttendance", + "fields": { + "enrollment": "ForeignKey", + "checked_in_at": "DateTimeField", + "checked_out_at": "DateTimeField", + "status": "CharField", + "notes": "CharField" + }, + "fks": [ + "TrainingRecord" + ], + "m2ms": [], + "lineno": 1382, + "file": "hr/models.py" + }, + { + "name": "TrainingAssessment", + "fields": { + "enrollment": "ForeignKey", + "name": "CharField", + "max_score": "DecimalField", + "score": "DecimalField", + "passed": "BooleanField", + "taken_at": "DateTimeField", + "notes": "TextField" + }, + "fks": [ + "TrainingRecord" + ], + "m2ms": [], + "lineno": 1406, + "file": "hr/models.py" + }, + { + "name": "TrainingCertificates", + "fields": { + "certificate_id": "UUIDField", + "program": "ForeignKey", + "employee": "ForeignKey", + "enrollment": "OneToOneField", + "certificate_name": "CharField", + "certificate_number": "CharField", + "certification_body": "CharField", + "issued_date": "DateField", + "expiry_date": "DateField", + "file": "FileField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "signed_by": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "Employee", + "TrainingRecord", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1424, + "file": "hr/models.py" + } + ], + "analytics": [ + { + "name": "Dashboard", + "fields": { + "dashboard_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "dashboard_type": "CharField", + "layout_config": "JSONField", + "refresh_interval": "PositiveIntegerField", + "is_public": "BooleanField", + "allowed_users": "ManyToManyField", + "allowed_roles": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "User" + ], + "m2ms": [ + "User" + ], + "lineno": 16, + "file": "analytics/models.py" + }, + { + "name": "DashboardWidget", + "fields": { + "widget_id": "UUIDField", + "dashboard": "ForeignKey", + "name": "CharField", + "description": "TextField", + "widget_type": "CharField", + "chart_type": "CharField", + "data_source": "ForeignKey", + "query_config": "JSONField", + "position_x": "PositiveIntegerField", + "position_y": "PositiveIntegerField", + "width": "PositiveIntegerField", + "height": "PositiveIntegerField", + "display_config": "JSONField", + "color_scheme": "CharField", + "auto_refresh": "BooleanField", + "refresh_interval": "PositiveIntegerField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Dashboard", + "DataSource" + ], + "m2ms": [], + "lineno": 69, + "file": "analytics/models.py" + }, + { + "name": "DataSource", + "fields": { + "source_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "source_type": "CharField", + "connection_type": "CharField", + "connection_config": "JSONField", + "authentication_config": "JSONField", + "query_template": "TextField", + "parameters": "JSONField", + "data_transformation": "JSONField", + "cache_duration": "PositiveIntegerField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "is_active": "BooleanField", + "last_test_status": "CharField", + "last_test_start_at": "DateTimeField", + "last_test_end_at": "DateTimeField", + "last_test_duration_seconds": "PositiveIntegerField", + "last_test_error_message": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "User" + ], + "m2ms": [], + "lineno": 143, + "file": "analytics/models.py" + }, + { + "name": "Report", + "fields": { + "report_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "report_type": "CharField", + "data_source": "ForeignKey", + "query_config": "JSONField", + "output_format": "CharField", + "template_config": "JSONField", + "schedule_type": "CharField", + "schedule_config": "JSONField", + "next_execution": "DateTimeField", + "recipients": "JSONField", + "distribution_config": "JSONField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "DataSource", + "User" + ], + "m2ms": [], + "lineno": 227, + "file": "analytics/models.py" + }, + { + "name": "ReportExecution", + "fields": { + "execution_id": "UUIDField", + "report": "ForeignKey", + "execution_type": "CharField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "duration_seconds": "PositiveIntegerField", + "status": "CharField", + "error_message": "TextField", + "output_file_path": "CharField", + "output_size_bytes": "PositiveBigIntegerField", + "record_count": "PositiveIntegerField", + "execution_parameters": "JSONField", + "executed_by": "ForeignKey" + }, + "fks": [ + "Report", + "User" + ], + "m2ms": [], + "lineno": 305, + "file": "analytics/models.py" + }, + { + "name": "MetricDefinition", + "fields": { + "metric_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "metric_type": "CharField", + "data_source": "ForeignKey", + "calculation_config": "JSONField", + "aggregation_period": "CharField", + "aggregation_config": "JSONField", + "target_value": "DecimalField", + "warning_threshold": "DecimalField", + "critical_threshold": "DecimalField", + "unit_of_measure": "CharField", + "decimal_places": "PositiveIntegerField", + "display_format": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "DataSource", + "User" + ], + "m2ms": [], + "lineno": 366, + "file": "analytics/models.py" + }, + { + "name": "MetricValue", + "fields": { + "value_id": "UUIDField", + "metric_definition": "ForeignKey", + "value": "DecimalField", + "period_start": "DateTimeField", + "period_end": "DateTimeField", + "dimensions": "JSONField", + "metadata": "JSONField", + "data_quality_score": "DecimalField", + "confidence_level": "DecimalField", + "calculation_timestamp": "DateTimeField", + "calculation_duration_ms": "PositiveIntegerField" + }, + "fks": [ + "MetricDefinition" + ], + "m2ms": [], + "lineno": 437, + "file": "analytics/models.py" + } + ], + "communications": [ + { + "name": "Message", + "fields": { + "message_id": "UUIDField", + "tenant": "ForeignKey", + "subject": "CharField", + "content": "TextField", + "message_type": "CharField", + "priority": "CharField", + "sender": "ForeignKey", + "status": "CharField", + "created_at": "DateTimeField", + "scheduled_at": "DateTimeField", + "sent_at": "DateTimeField", + "expires_at": "DateTimeField", + "is_urgent": "BooleanField", + "requires_acknowledgment": "BooleanField", + "is_confidential": "BooleanField", + "delivery_attempts": "PositiveIntegerField", + "max_delivery_attempts": "PositiveIntegerField", + "message_thread_id": "UUIDField", + "reply_to_message": "ForeignKey", + "external_message_id": "CharField", + "has_attachments": "BooleanField", + "content_type": "CharField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "self" + ], + "m2ms": [], + "lineno": 15, + "file": "communications/models.py" + }, + { + "name": "MessageRecipient", + "fields": { + "recipient_id": "UUIDField", + "message": "ForeignKey", + "recipient_type": "CharField", + "user": "ForeignKey", + "email_address": "EmailField", + "phone_number": "CharField", + "role_name": "CharField", + "status": "CharField", + "sent_at": "DateTimeField", + "delivered_at": "DateTimeField", + "read_at": "DateTimeField", + "acknowledged_at": "DateTimeField", + "delivery_attempts": "PositiveIntegerField", + "last_attempt_at": "DateTimeField", + "error_message": "TextField", + "external_delivery_id": "CharField" + }, + "fks": [ + "Message", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 205, + "file": "communications/models.py" + }, + { + "name": "NotificationTemplate", + "fields": { + "template_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "template_type": "CharField", + "category": "CharField", + "subject_template": "CharField", + "content_template": "TextField", + "variables": "JSONField", + "default_values": "JSONField", + "formatting_rules": "JSONField", + "is_active": "BooleanField", + "is_system_template": "BooleanField", + "requires_approval": "BooleanField", + "usage_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 348, + "file": "communications/models.py" + }, + { + "name": "AlertRule", + "fields": { + "rule_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "trigger_type": "CharField", + "severity": "CharField", + "trigger_conditions": "JSONField", + "evaluation_frequency": "PositiveIntegerField", + "cooldown_period": "PositiveIntegerField", + "notification_template": "ForeignKey", + "notification_channels": "JSONField", + "escalation_rules": "JSONField", + "default_recipients": "ManyToManyField", + "recipient_roles": "JSONField", + "is_active": "BooleanField", + "is_system_rule": "BooleanField", + "trigger_count": "PositiveIntegerField", + "last_triggered_at": "DateTimeField", + "last_evaluated_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "NotificationTemplate", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 489, + "file": "communications/models.py" + }, + { + "name": "AlertInstance", + "fields": { + "alert_id": "UUIDField", + "alert_rule": "ForeignKey", + "title": "CharField", + "description": "TextField", + "severity": "CharField", + "trigger_data": "JSONField", + "context_data": "JSONField", + "status": "CharField", + "triggered_at": "DateTimeField", + "acknowledged_at": "DateTimeField", + "resolved_at": "DateTimeField", + "expires_at": "DateTimeField", + "acknowledged_by": "ForeignKey", + "resolved_by": "ForeignKey", + "resolution_notes": "TextField", + "escalation_level": "PositiveIntegerField", + "escalated_at": "DateTimeField", + "notifications_sent": "PositiveIntegerField", + "last_notification_at": "DateTimeField" + }, + "fks": [ + "AlertRule", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 656, + "file": "communications/models.py" + }, + { + "name": "CommunicationChannel", + "fields": { + "channel_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "channel_type": "CharField", + "provider_type": "CharField", + "configuration": "JSONField", + "authentication_config": "JSONField", + "rate_limits": "JSONField", + "is_active": "BooleanField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "message_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 807, + "file": "communications/models.py" + }, + { + "name": "DeliveryLog", + "fields": { + "log_id": "UUIDField", + "message": "ForeignKey", + "recipient": "ForeignKey", + "channel": "ForeignKey", + "status": "CharField", + "attempt_number": "PositiveIntegerField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "external_id": "CharField", + "response_code": "CharField", + "response_message": "TextField", + "error_details": "JSONField", + "processing_time_ms": "PositiveIntegerField", + "payload_size_bytes": "PositiveIntegerField", + "metadata": "JSONField" + }, + "fks": [ + "Message", + "MessageRecipient", + "CommunicationChannel" + ], + "m2ms": [], + "lineno": 969, + "file": "communications/models.py" + } + ], + "integration": [ + { + "name": "ExternalSystem", + "fields": { + "system_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "system_type": "CharField", + "vendor": "CharField", + "version": "CharField", + "base_url": "URLField", + "host": "CharField", + "port": "PositiveIntegerField", + "database_name": "CharField", + "authentication_type": "CharField", + "authentication_config": "JSONField", + "configuration": "JSONField", + "timeout_seconds": "PositiveIntegerField", + "retry_attempts": "PositiveIntegerField", + "retry_delay_seconds": "PositiveIntegerField", + "is_active": "BooleanField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "connection_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 18, + "file": "integration/models.py" + }, + { + "name": "IntegrationEndpoint", + "fields": { + "endpoint_id": "UUIDField", + "external_system": "ForeignKey", + "name": "CharField", + "description": "TextField", + "endpoint_type": "CharField", + "path": "CharField", + "method": "CharField", + "direction": "CharField", + "headers": "JSONField", + "parameters": "JSONField", + "request_format": "CharField", + "response_format": "CharField", + "request_mapping": "JSONField", + "response_mapping": "JSONField", + "request_schema": "JSONField", + "response_schema": "JSONField", + "is_active": "BooleanField", + "execution_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_executed_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ExternalSystem", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 153, + "file": "integration/models.py" + }, + { + "name": "DataMapping", + "fields": { + "mapping_id": "UUIDField", + "endpoint": "ForeignKey", + "name": "CharField", + "description": "TextField", + "mapping_type": "CharField", + "source_field": "CharField", + "source_format": "CharField", + "source_validation": "JSONField", + "target_field": "CharField", + "target_format": "CharField", + "target_validation": "JSONField", + "transformation_type": "CharField", + "transformation_config": "JSONField", + "is_required": "BooleanField", + "validation_rules": "JSONField", + "default_value": "TextField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "IntegrationEndpoint", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 272, + "file": "integration/models.py" + }, + { + "name": "IntegrationExecution", + "fields": { + "execution_id": "UUIDField", + "endpoint": "ForeignKey", + "execution_type": "CharField", + "status": "CharField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "request_data": "JSONField", + "response_data": "JSONField", + "request_size_bytes": "PositiveIntegerField", + "response_size_bytes": "PositiveIntegerField", + "processing_time_ms": "PositiveIntegerField", + "network_time_ms": "PositiveIntegerField", + "error_message": "TextField", + "error_details": "JSONField", + "retry_count": "PositiveIntegerField", + "external_id": "CharField", + "correlation_id": "CharField", + "triggered_by": "ForeignKey", + "metadata": "JSONField" + }, + "fks": [ + "IntegrationEndpoint", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 378, + "file": "integration/models.py" + }, + { + "name": "WebhookEndpoint", + "fields": { + "webhook_id": "UUIDField", + "external_system": "ForeignKey", + "name": "CharField", + "description": "TextField", + "url_path": "CharField", + "allowed_methods": "JSONField", + "authentication_type": "CharField", + "authentication_config": "JSONField", + "data_mapping": "ForeignKey", + "processing_config": "JSONField", + "rate_limit_per_minute": "PositiveIntegerField", + "rate_limit_per_hour": "PositiveIntegerField", + "is_active": "BooleanField", + "request_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_request_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ExternalSystem", + "DataMapping", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 480, + "file": "integration/models.py" + }, + { + "name": "WebhookExecution", + "fields": { + "execution_id": "UUIDField", + "webhook": "ForeignKey", + "method": "CharField", + "headers": "JSONField", + "query_params": "JSONField", + "payload": "JSONField", + "payload_size_bytes": "PositiveIntegerField", + "client_ip": "GenericIPAddressField", + "user_agent": "TextField", + "status": "CharField", + "received_at": "DateTimeField", + "processed_at": "DateTimeField", + "processing_time_ms": "PositiveIntegerField", + "response_status": "PositiveIntegerField", + "response_data": "JSONField", + "error_message": "TextField", + "error_details": "JSONField", + "external_id": "CharField", + "correlation_id": "CharField", + "metadata": "JSONField" + }, + "fks": [ + "WebhookEndpoint" + ], + "m2ms": [], + "lineno": 595, + "file": "integration/models.py" + }, + { + "name": "IntegrationLog", + "fields": { + "log_id": "UUIDField", + "external_system": "ForeignKey", + "endpoint": "ForeignKey", + "execution": "ForeignKey", + "level": "CharField", + "category": "CharField", + "message": "TextField", + "details": "JSONField", + "correlation_id": "CharField", + "user": "ForeignKey", + "timestamp": "DateTimeField", + "metadata": "JSONField" + }, + "fks": [ + "ExternalSystem", + "IntegrationEndpoint", + "IntegrationExecution", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 681, + "file": "integration/models.py" + } + ], + "quality": [ + { + "name": "QualityIndicator", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "category": "CharField", + "type": "CharField", + "measurement_unit": "CharField", + "target_value": "DecimalField", + "current_value": "DecimalField", + "threshold_warning": "DecimalField", + "threshold_critical": "DecimalField", + "calculation_method": "TextField", + "data_source": "CharField", + "frequency": "CharField", + "responsible_department": "ForeignKey", + "responsible_user": "ForeignKey", + "is_active": "BooleanField", + "regulatory_requirement": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "hr.Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 7, + "file": "quality/models.py" + }, + { + "name": "QualityMeasurement", + "fields": { + "tenant": "ForeignKey", + "indicator": "ForeignKey", + "measurement_date": "DateField", + "value": "DecimalField", + "numerator": "IntegerField", + "denominator": "IntegerField", + "status": "CharField", + "measurement_method": "TextField", + "sample_size": "DecimalField", + "data_source": "CharField", + "notes": "TextField", + "data_source_reference": "CharField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "QualityIndicator", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 84, + "file": "quality/models.py" + }, + { + "name": "IncidentReport", + "fields": { + "tenant": "ForeignKey", + "incident_number": "CharField", + "title": "CharField", + "description": "TextField", + "incident_type": "CharField", + "severity": "CharField", + "category": "CharField", + "location": "CharField", + "incident_date": "DateField", + "incident_time": "TimeField", + "discovered_date": "DateTimeField", + "patient": "ForeignKey", + "witness_information": "TextField", + "reported_by": "ForeignKey", + "status": "CharField", + "priority": "CharField", + "root_cause": "TextField", + "contributing_factors": "TextField", + "corrective_actions": "TextField", + "preventive_actions": "TextField", + "assigned_to": "ForeignKey", + "due_date": "DateField", + "closed_date": "DateTimeField", + "is_confidential": "BooleanField", + "regulatory_notification": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 138, + "file": "quality/models.py" + }, + { + "name": "RiskAssessment", + "fields": { + "tenant": "ForeignKey", + "title": "CharField", + "description": "TextField", + "risk_category": "CharField", + "risk_type": "CharField", + "likelihood": "IntegerField", + "impact": "IntegerField", + "risk_score": "IntegerField", + "risk_level": "CharField", + "current_controls": "TextField", + "control_effectiveness": "CharField", + "mitigation_plan": "TextField", + "target_completion_date": "DateTimeField", + "responsible_person": "ForeignKey", + "review_date": "DateField", + "review_notes": "TextField", + "status": "CharField", + "incident_report": "ForeignKey", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "IncidentReport", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 243, + "file": "quality/models.py" + }, + { + "name": "AuditPlan", + "fields": { + "tenant": "ForeignKey", + "title": "CharField", + "description": "TextField", + "audit_type": "CharField", + "scope": "TextField", + "criteria": "TextField", + "department": "ForeignKey", + "auditor": "ForeignKey", + "audit_team": "ManyToManyField", + "planned_start_date": "DateField", + "planned_end_date": "DateField", + "actual_start_date": "DateField", + "actual_end_date": "DateField", + "status": "CharField", + "priority": "CharField", + "regulatory_requirement": "BooleanField", + "accreditation_body": "CharField", + "objectives": "TextField", + "notes": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "hr.Department", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 368, + "file": "quality/models.py" + }, + { + "name": "AuditFinding", + "fields": { + "tenant": "ForeignKey", + "audit_plan": "ForeignKey", + "finding_number": "CharField", + "title": "CharField", + "description": "TextField", + "finding_type": "CharField", + "finding_date": "DateField", + "severity": "CharField", + "category": "CharField", + "criteria_reference": "CharField", + "evidence": "TextField", + "root_cause": "TextField", + "corrective_action_required": "BooleanField", + "corrective_actions": "TextField", + "responsible_person": "ForeignKey", + "target_completion_date": "DateField", + "actual_completion_date": "DateField", + "status": "CharField", + "verification_method": "CharField", + "verified_by": "ForeignKey", + "verified_date": "DateField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "AuditPlan", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 442, + "file": "quality/models.py" + }, + { + "name": "ImprovementProject", + "fields": { + "tenant": "ForeignKey", + "project_number": "CharField", + "title": "CharField", + "description": "TextField", + "project_type": "CharField", + "methodology": "CharField", + "problem_statement": "TextField", + "goal_statement": "TextField", + "success_metrics": "TextField", + "baseline_data": "TextField", + "target_metrics": "TextField", + "scope": "TextField", + "project_manager": "ForeignKey", + "project_team": "ManyToManyField", + "sponsor": "ForeignKey", + "department": "ForeignKey", + "planned_start_date": "DateField", + "planned_end_date": "DateField", + "actual_start_date": "DateField", + "actual_end_date": "DateField", + "status": "CharField", + "phase": "CharField", + "estimated_cost": "DecimalField", + "resources_required": "TextField", + "actual_cost": "DecimalField", + "roi_expected": "DecimalField", + "roi_actual": "DecimalField", + "lessons_learned": "TextField", + "notes": "TextField", + "sustainability_plan": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "hr.Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 522, + "file": "quality/models.py" + } + ], + "facility_management": [ + { + "name": "Building", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "building_id": "UUIDField", + "code": "CharField", + "building_type": "CharField", + "address": "TextField", + "latitude": "DecimalField", + "longitude": "DecimalField", + "floor_count": "PositiveIntegerField", + "total_area_sqm": "DecimalField", + "construction_year": "PositiveIntegerField", + "architect": "CharField", + "contractor": "CharField", + "is_active": "BooleanField", + "last_major_renovation": "DateField", + "facility_manager": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 9, + "file": "facility_management/models.py" + }, + { + "name": "Floor", + "fields": { + "building": "ForeignKey", + "floor_number": "IntegerField", + "name": "CharField", + "area_sqm": "DecimalField", + "ceiling_height_m": "DecimalField", + "is_public_access": "BooleanField" + }, + "fks": [ + "Building" + ], + "m2ms": [], + "lineno": 69, + "file": "facility_management/models.py" + }, + { + "name": "Room", + "fields": { + "floor": "ForeignKey", + "room_number": "CharField", + "name": "CharField", + "area_sqm": "DecimalField", + "capacity": "PositiveIntegerField", + "occupancy_status": "CharField", + "is_accessible": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Floor" + ], + "m2ms": [], + "lineno": 90, + "file": "facility_management/models.py" + }, + { + "name": "AssetCategory", + "fields": { + "name": "CharField", + "code": "CharField", + "description": "TextField", + "parent_category": "ForeignKey", + "is_active": "BooleanField" + }, + "fks": [ + "self" + ], + "m2ms": [], + "lineno": 127, + "file": "facility_management/models.py" + }, + { + "name": "Asset", + "fields": { + "asset_id": "UUIDField", + "name": "CharField", + "category": "ForeignKey", + "building": "ForeignKey", + "floor": "ForeignKey", + "room": "ForeignKey", + "location_description": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "purchase_date": "DateField", + "purchase_cost": "DecimalField", + "current_value": "DecimalField", + "depreciation_rate": "DecimalField", + "warranty_start_date": "DateField", + "warranty_end_date": "DateField", + "service_provider": "CharField", + "service_contract_number": "CharField", + "status": "CharField", + "condition": "CharField", + "last_inspection_date": "DateField", + "next_maintenance_date": "DateField", + "assigned_to": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "AssetCategory", + "Building", + "Floor", + "Room", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 147, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceType", + "fields": { + "name": "CharField", + "code": "CharField", + "description": "TextField", + "estimated_duration_hours": "DecimalField", + "is_active": "BooleanField" + }, + "fks": [], + "m2ms": [], + "lineno": 230, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceRequest", + "fields": { + "request_id": "CharField", + "title": "CharField", + "description": "TextField", + "maintenance_type": "ForeignKey", + "building": "ForeignKey", + "floor": "ForeignKey", + "room": "ForeignKey", + "asset": "ForeignKey", + "priority": "CharField", + "status": "CharField", + "requested_by": "ForeignKey", + "assigned_to": "ForeignKey", + "requested_date": "DateTimeField", + "scheduled_date": "DateTimeField", + "started_date": "DateTimeField", + "completed_date": "DateTimeField", + "estimated_hours": "DecimalField", + "estimated_cost": "DecimalField", + "actual_cost": "DecimalField", + "notes": "TextField", + "completion_notes": "TextField" + }, + "fks": [ + "MaintenanceType", + "Building", + "Floor", + "Room", + "Asset", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 250, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceSchedule", + "fields": { + "name": "CharField", + "description": "TextField", + "maintenance_type": "ForeignKey", + "asset": "ForeignKey", + "building": "ForeignKey", + "room": "ForeignKey", + "frequency_interval": "IntegerField", + "start_date": "DateField", + "end_date": "DateField", + "assigned_to": "ForeignKey", + "estimated_duration_hours": "DecimalField", + "is_active": "BooleanField", + "last_generated_date": "DateField", + "next_due_date": "DateField", + "created_at": "DateTimeField" + }, + "fks": [ + "MaintenanceType", + "Asset", + "Building", + "Room", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 322, + "file": "facility_management/models.py" + }, + { + "name": "Vendor", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "vendor_type": "CharField", + "contact_person": "CharField", + "email": "EmailField", + "phone": "CharField", + "address": "TextField", + "crn": "CharField", + "vrn": "CharField", + "rating": "DecimalField", + "total_contracts": "PositiveIntegerField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant" + ], + "m2ms": [], + "lineno": 369, + "file": "facility_management/models.py" + }, + { + "name": "ServiceContract", + "fields": { + "contract_number": "CharField", + "vendor": "ForeignKey", + "title": "CharField", + "description": "TextField", + "start_date": "DateField", + "end_date": "DateField", + "contract_value": "DecimalField", + "payment_terms": "CharField", + "buildings": "ManyToManyField", + "service_areas": "TextField", + "status": "CharField", + "auto_renewal": "BooleanField", + "renewal_notice_days": "PositiveIntegerField", + "contract_manager": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Vendor", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "Building" + ], + "lineno": 414, + "file": "facility_management/models.py" + }, + { + "name": "Inspection", + "fields": { + "inspection_id": "CharField", + "inspection_type": "CharField", + "title": "CharField", + "description": "TextField", + "building": "ForeignKey", + "floors": "ManyToManyField", + "rooms": "ManyToManyField", + "assets": "ManyToManyField", + "scheduled_date": "DateTimeField", + "estimated_duration_hours": "DecimalField", + "inspector": "ForeignKey", + "inspector_external": "CharField", + "inspector_organization": "CharField", + "status": "CharField", + "started_date": "DateTimeField", + "completed_date": "DateTimeField", + "overall_rating": "CharField", + "findings": "TextField", + "recommendations": "TextField", + "requires_followup": "BooleanField", + "followup_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Building", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "Floor", + "Room", + "Asset" + ], + "lineno": 470, + "file": "facility_management/models.py" + }, + { + "name": "EnergyMeter", + "fields": { + "meter_id": "CharField", + "meter_type": "CharField", + "building": "ForeignKey", + "location_description": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "installation_date": "DateField", + "current_reading": "DecimalField", + "last_reading_date": "DateTimeField", + "is_active": "BooleanField", + "calibration_date": "DateField", + "next_calibration_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Building" + ], + "m2ms": [], + "lineno": 544, + "file": "facility_management/models.py" + }, + { + "name": "EnergyReading", + "fields": { + "meter": "ForeignKey", + "reading_date": "DateTimeField", + "reading_value": "DecimalField", + "consumption": "DecimalField", + "cost": "DecimalField", + "read_by": "ForeignKey", + "is_estimated": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField" + }, + "fks": [ + "EnergyMeter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 586, + "file": "facility_management/models.py" + }, + { + "name": "SpaceReservation", + "fields": { + "reservation_id": "CharField", + "room": "ForeignKey", + "title": "CharField", + "description": "TextField", + "start_datetime": "DateTimeField", + "end_datetime": "DateTimeField", + "reserved_by": "ForeignKey", + "contact_person": "CharField", + "contact_email": "EmailField", + "contact_phone": "CharField", + "expected_attendees": "PositiveIntegerField", + "setup_requirements": "TextField", + "catering_required": "BooleanField", + "av_equipment_required": "BooleanField", + "status": "CharField", + "approved_by": "ForeignKey", + "approved_at": "DateTimeField", + "hourly_rate": "DecimalField", + "total_cost": "DecimalField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Room", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 627, + "file": "facility_management/models.py" + } + ], + "insurance_approvals": [ + { + "name": "InsuranceApprovalRequest", + "fields": { + "tenant": "ForeignKey", + "approval_id": "UUIDField", + "approval_number": "CharField", + "patient": "ForeignKey", + "insurance_info": "ForeignKey", + "content_type": "ForeignKey", + "object_id": "PositiveIntegerField", + "order": "GenericForeignKey", + "request_type": "CharField", + "service_description": "CharField", + "procedure_codes": "JSONField", + "diagnosis_codes": "JSONField", + "clinical_justification": "TextField", + "medical_necessity": "TextField", + "alternative_treatments_tried": "TextField", + "requested_quantity": "PositiveIntegerField", + "requested_visits": "PositiveIntegerField", + "requested_units": "PositiveIntegerField", + "service_start_date": "DateField", + "service_end_date": "DateField", + "status": "CharField", + "priority": "CharField", + "submission_method": "CharField", + "submitted_date": "DateTimeField", + "submitted_by": "ForeignKey", + "decision_date": "DateTimeField", + "authorization_number": "CharField", + "reference_number": "CharField", + "approved_quantity": "PositiveIntegerField", + "approved_visits": "PositiveIntegerField", + "approved_units": "PositiveIntegerField", + "approved_amount": "DecimalField", + "effective_date": "DateField", + "expiration_date": "DateField", + "denial_reason": "TextField", + "denial_code": "CharField", + "appeal_date": "DateTimeField", + "appeal_reason": "TextField", + "appeal_deadline": "DateField", + "assigned_to": "ForeignKey", + "requesting_provider": "ForeignKey", + "last_contact_date": "DateTimeField", + "last_contact_method": "CharField", + "last_contact_notes": "TextField", + "is_urgent": "BooleanField", + "is_expedited": "BooleanField", + "requires_peer_review": "BooleanField", + "internal_notes": "TextField", + "insurance_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "patients.InsuranceInfo", + "ContentType", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 16, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalDocument", + "fields": { + "approval_request": "ForeignKey", + "document_id": "UUIDField", + "document_type": "CharField", + "title": "CharField", + "description": "TextField", + "file": "FileField", + "file_size": "PositiveIntegerField", + "mime_type": "CharField", + "uploaded_at": "DateTimeField", + "uploaded_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 449, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalStatusHistory", + "fields": { + "approval_request": "ForeignKey", + "from_status": "CharField", + "to_status": "CharField", + "reason": "TextField", + "notes": "TextField", + "changed_at": "DateTimeField", + "changed_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 534, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalCommunicationLog", + "fields": { + "approval_request": "ForeignKey", + "communication_id": "UUIDField", + "communication_type": "CharField", + "contact_person": "CharField", + "contact_number": "CharField", + "subject": "CharField", + "message": "TextField", + "response": "TextField", + "outcome": "CharField", + "follow_up_required": "BooleanField", + "follow_up_date": "DateField", + "communicated_at": "DateTimeField", + "communicated_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 589, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "request_type": "CharField", + "insurance_company": "CharField", + "clinical_justification_template": "TextField", + "medical_necessity_template": "TextField", + "required_documents": "JSONField", + "required_codes": "JSONField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 688, + "file": "insurance_approvals/models.py" + } + ] + }, + "app_domains": { + "core": "communications", + "accounts": "communications", + "blood_bank": "blood_bank", + "patients": "emr", + "appointments": "appointments", + "inpatients": "inpatients", + "emr": "emr", + "pharmacy": "pharmacy", + "laboratory": "laboratory", + "radiology": "radiology", + "operating_theatre": "operating_theatre", + "billing": "billing", + "inventory": "inventory", + "hr": "hr", + "analytics": "analytics", + "communications": "communications", + "integration": "core", + "quality": "quality", + "facility_management": "facility_management", + "insurance_approvals": "emr" + }, + "reverse_deps": { + "core.Tenant": { + "core": [ + "AuditLogEntry", + "SystemConfiguration", + "SystemNotification", + "IntegrationLog" + ], + "patients": [ + "PatientProfile", + "ConsentTemplate" + ], + "appointments": [ + "AppointmentRequest", + "SlotAvailability", + "WaitingQueue", + "AppointmentTemplate", + "WaitingList" + ], + "inpatients": [ + "Ward", + "Admission" + ], + "emr": [ + "Encounter", + "ProblemList", + "CarePlan", + "NoteTemplate", + "ClinicalRecommendation", + "AllergyAlert", + "TreatmentProtocol", + "ClinicalGuideline", + "CriticalAlert", + "DiagnosticSuggestion" + ], + "pharmacy": [ + "Medication", + "Prescription", + "MedicationInventoryItem", + "DrugInteraction" + ], + "laboratory": [ + "LabTest", + "LabOrder", + "QualityControl" + ], + "radiology": [ + "ImagingStudy", + "ReportTemplate", + "ImagingOrder" + ], + "operating_theatre": [ + "OperatingRoom", + "SurgicalNoteTemplate" + ], + "billing": [ + "MedicalBill", + "BillingConfiguration" + ], + "inventory": [ + "InventoryItem", + "InventoryLocation", + "PurchaseOrder", + "Supplier" + ], + "hr": [ + "Employee", + "Department", + "TrainingPrograms" + ], + "analytics": [ + "Dashboard", + "DataSource", + "Report", + "MetricDefinition" + ], + "communications": [ + "Message", + "NotificationTemplate", + "AlertRule", + "CommunicationChannel" + ], + "integration": [ + "ExternalSystem" + ], + "quality": [ + "QualityIndicator", + "QualityMeasurement", + "IncidentReport", + "RiskAssessment", + "AuditPlan", + "AuditFinding", + "ImprovementProject" + ], + "facility_management": [ + "Building", + "Vendor" + ], + "insurance_approvals": [ + "InsuranceApprovalRequest", + "ApprovalTemplate" + ] + }, + "settings.AUTH_USER_MODEL": { + "core": [ + "AuditLogEntry", + "SystemConfiguration", + "SystemNotification", + "SystemNotification" + ], + "blood_bank": [ + "Donor", + "BloodUnit", + "BloodTest", + "BloodTest", + "CrossMatch", + "CrossMatch", + "BloodRequest", + "BloodRequest", + "BloodRequest", + "BloodIssue", + "BloodIssue", + "Transfusion", + "Transfusion", + "Transfusion", + "Transfusion", + "AdverseReaction", + "AdverseReaction", + "QualityControl", + "QualityControl", + "QualityControl" + ], + "patients": [ + "PatientProfile", + "InsuranceClaim", + "ClaimDocument", + "ClaimStatusHistory", + "ConsentTemplate", + "ConsentForm", + "PatientNote" + ], + "appointments": [ + "AppointmentRequest", + "AppointmentRequest", + "AppointmentRequest", + "AppointmentRequest", + "SlotAvailability", + "SlotAvailability", + "WaitingQueue", + "WaitingQueue", + "QueueEntry", + "QueueEntry", + "TelemedicineSession", + "AppointmentTemplate", + "WaitingList", + "WaitingList", + "WaitingList", + "WaitingListContactLog" + ], + "inpatients": [ + "Ward", + "Ward", + "Ward", + "Bed", + "Bed", + "Bed", + "Admission", + "Admission", + "Admission", + "Admission", + "Admission", + "DischargeSummary", + "DischargeSummary", + "DischargeSummary", + "DischargeSummary", + "Transfer", + "Transfer", + "Transfer", + "Transfer" + ], + "emr": [ + "Encounter", + "Encounter", + "Encounter", + "VitalSigns", + "VitalSigns", + "ProblemList", + "ProblemList", + "ProblemList", + "ProblemList", + "CarePlan", + "CarePlan", + "CarePlan", + "CarePlan", + "ClinicalNote", + "ClinicalNote", + "NoteTemplate", + "ClinicalRecommendation", + "ClinicalRecommendation", + "ClinicalRecommendation", + "ClinicalRecommendation", + "AllergyAlert", + "TreatmentProtocol", + "CriticalAlert", + "CriticalAlert", + "DiagnosticSuggestion", + "DiagnosticSuggestion" + ], + "pharmacy": [ + "Medication", + "Prescription", + "Prescription", + "MedicationInventoryItem", + "DispenseRecord", + "DispenseRecord", + "MedicationAdministration", + "MedicationAdministration", + "MedicationAdministration", + "DrugInteraction" + ], + "laboratory": [ + "LabTest", + "LabOrder", + "Specimen", + "Specimen", + "LabResult", + "LabResult", + "QualityControl", + "QualityControl", + "ReferenceRange" + ], + "radiology": [ + "ImagingStudy", + "ImagingStudy", + "ImagingStudy", + "RadiologyReport", + "RadiologyReport", + "RadiologyReport", + "RadiologyReport", + "ReportTemplate", + "ImagingOrder" + ], + "operating_theatre": [ + "OperatingRoom", + "ORBlock", + "ORBlock", + "ORBlock", + "SurgicalCase", + "SurgicalCase", + "SurgicalCase", + "SurgicalCase", + "SurgicalCase", + "SurgicalCase", + "SurgicalNote", + "EquipmentUsage", + "SurgicalNoteTemplate" + ], + "billing": [ + "MedicalBill", + "MedicalBill", + "MedicalBill", + "BillLineItem", + "BillLineItem", + "InsuranceClaim", + "Payment", + "Payment", + "ClaimStatusUpdate", + "BillingConfiguration" + ], + "inventory": [ + "InventoryItem", + "InventoryLocation", + "InventoryLocation", + "PurchaseOrder", + "PurchaseOrder", + "PurchaseOrder", + "Supplier" + ], + "hr": [ + "Employee", + "Employee", + "Employee", + "Schedule", + "Schedule", + "TimeEntry", + "PerformanceReview", + "TrainingPrograms", + "TrainingSession", + "TrainingRecord", + "TrainingCertificates", + "TrainingCertificates" + ], + "communications": [ + "Message", + "MessageRecipient", + "NotificationTemplate", + "AlertRule", + "AlertRule", + "AlertInstance", + "AlertInstance", + "CommunicationChannel" + ], + "integration": [ + "ExternalSystem", + "IntegrationEndpoint", + "DataMapping", + "IntegrationExecution", + "WebhookEndpoint", + "IntegrationLog" + ], + "quality": [ + "QualityIndicator", + "QualityMeasurement", + "QualityMeasurement", + "IncidentReport", + "IncidentReport", + "RiskAssessment", + "RiskAssessment", + "AuditPlan", + "AuditPlan", + "AuditPlan", + "AuditFinding", + "AuditFinding", + "AuditFinding", + "ImprovementProject", + "ImprovementProject", + "ImprovementProject", + "ImprovementProject" + ], + "facility_management": [ + "Building", + "Asset", + "MaintenanceRequest", + "MaintenanceRequest", + "MaintenanceSchedule", + "ServiceContract", + "Inspection", + "EnergyReading", + "SpaceReservation", + "SpaceReservation" + ], + "insurance_approvals": [ + "InsuranceApprovalRequest", + "InsuranceApprovalRequest", + "InsuranceApprovalRequest", + "InsuranceApprovalRequest", + "ApprovalDocument", + "ApprovalStatusHistory", + "ApprovalCommunicationLog", + "ApprovalTemplate" + ] + }, + "blood_bank.BloodGroup": { + "blood_bank": [ + "Donor", + "BloodUnit", + "BloodRequest" + ] + }, + "blood_bank.Donor": { + "blood_bank": [ + "BloodUnit" + ] + }, + "blood_bank.BloodComponent": { + "blood_bank": [ + "BloodUnit", + "BloodRequest" + ] + }, + "blood_bank.BloodUnit": { + "blood_bank": [ + "BloodTest", + "CrossMatch", + "BloodIssue" + ] + }, + "patients.PatientProfile": { + "blood_bank": [ + "CrossMatch", + "BloodRequest" + ], + "patients": [ + "EmergencyContact", + "InsuranceInfo", + "InsuranceClaim", + "ConsentForm", + "PatientNote" + ], + "appointments": [ + "AppointmentRequest", + "QueueEntry", + "WaitingList" + ], + "inpatients": [ + "Admission", + "Transfer" + ], + "emr": [ + "Encounter", + "VitalSigns", + "ProblemList", + "CarePlan", + "ClinicalNote", + "ClinicalRecommendation", + "AllergyAlert", + "CriticalAlert", + "DiagnosticSuggestion" + ], + "pharmacy": [ + "Prescription", + "MedicationAdministration" + ], + "laboratory": [ + "LabOrder" + ], + "radiology": [ + "ImagingStudy", + "ImagingOrder" + ], + "operating_theatre": [ + "SurgicalCase" + ], + "billing": [ + "MedicalBill" + ], + "quality": [ + "IncidentReport" + ], + "insurance_approvals": [ + "InsuranceApprovalRequest" + ] + }, + "hr.Department": { + "blood_bank": [ + "BloodRequest" + ], + "appointments": [ + "WaitingList" + ], + "hr": [ + "Employee", + "ScheduleAssignment", + "TimeEntry" + ], + "quality": [ + "QualityIndicator", + "AuditPlan", + "ImprovementProject" + ] + }, + "blood_bank.BloodRequest": { + "blood_bank": [ + "BloodIssue" + ] + }, + "blood_bank.CrossMatch": { + "blood_bank": [ + "BloodIssue" + ] + }, + "blood_bank.BloodIssue": { + "blood_bank": [ + "Transfusion" + ] + }, + "blood_bank.Transfusion": { + "blood_bank": [ + "AdverseReaction" + ] + }, + "hr.Employee": { + "patients": [ + "InsuranceInfo", + "ConsentForm" + ], + "hr": [ + "Department", + "Department", + "Schedule", + "TimeEntry", + "PerformanceReview", + "TrainingPrograms", + "TrainingSession", + "TrainingRecord", + "TrainingCertificates" + ] + }, + "patients.InsuranceInfo": { + "patients": [ + "InsuranceClaim" + ], + "billing": [ + "MedicalBill", + "MedicalBill", + "InsuranceClaim" + ], + "insurance_approvals": [ + "InsuranceApprovalRequest" + ] + }, + "patients.InsuranceClaim": { + "patients": [ + "ClaimDocument", + "ClaimStatusHistory" + ], + "billing": [ + "Payment", + "ClaimStatusUpdate" + ] + }, + "patients.ConsentTemplate": { + "patients": [ + "ConsentForm" + ] + }, + "appointments.WaitingQueue": { + "appointments": [ + "QueueEntry" + ] + }, + "appointments.AppointmentRequest": { + "appointments": [ + "QueueEntry", + "TelemedicineSession", + "WaitingList" + ], + "emr": [ + "Encounter" + ] + }, + "appointments.WaitingList": { + "appointments": [ + "WaitingListContactLog" + ] + }, + "facility_management.Building": { + "inpatients": [ + "Ward" + ], + "facility_management": [ + "Floor", + "Asset", + "MaintenanceRequest", + "MaintenanceSchedule", + "ServiceContract", + "Inspection", + "EnergyMeter" + ] + }, + "facility_management.Floor": { + "inpatients": [ + "Ward" + ], + "facility_management": [ + "Room", + "Asset", + "MaintenanceRequest", + "Inspection" + ] + }, + "inpatients.Ward": { + "inpatients": [ + "Bed", + "Admission", + "Transfer", + "Transfer" + ] + }, + "inpatients.Admission": { + "inpatients": [ + "Bed", + "DischargeSummary", + "Transfer" + ], + "emr": [ + "Encounter" + ], + "operating_theatre": [ + "SurgicalCase" + ], + "billing": [ + "MedicalBill" + ] + }, + "facility_management.Asset": { + "inpatients": [ + "Bed" + ], + "facility_management": [ + "MaintenanceRequest", + "MaintenanceSchedule", + "Inspection" + ] + }, + "inpatients.Bed": { + "inpatients": [ + "Admission", + "Transfer", + "Transfer" + ] + }, + "emr.Encounter": { + "emr": [ + "VitalSigns", + "ProblemList", + "ClinicalNote", + "ClinicalRecommendation", + "CriticalAlert" + ], + "pharmacy": [ + "Prescription", + "MedicationAdministration" + ], + "laboratory": [ + "LabOrder" + ], + "radiology": [ + "ImagingStudy", + "ImagingOrder" + ], + "operating_theatre": [ + "SurgicalCase" + ], + "billing": [ + "MedicalBill" + ] + }, + "emr.ProblemList": { + "emr": [ + "CarePlan", + "ClinicalNote", + "ClinicalRecommendation" + ] + }, + "emr.NoteTemplate": { + "emr": [ + "ClinicalNote" + ] + }, + "emr.CarePlan": { + "emr": [ + "ClinicalNote" + ] + }, + "pharmacy.Medication": { + "pharmacy": [ + "Prescription", + "MedicationInventoryItem", + "DrugInteraction", + "DrugInteraction" + ] + }, + "inventory.InventoryItem": { + "pharmacy": [ + "MedicationInventoryItem" + ], + "inventory": [ + "InventoryStock", + "PurchaseOrderItem" + ] + }, + "pharmacy.Prescription": { + "pharmacy": [ + "DispenseRecord", + "MedicationAdministration" + ] + }, + "inventory.InventoryStock": { + "pharmacy": [ + "DispenseRecord" + ] + }, + "laboratory.LabTest": { + "laboratory": [ + "LabOrder", + "LabResult", + "QualityControl", + "ReferenceRange" + ] + }, + "laboratory.LabOrder": { + "laboratory": [ + "Specimen", + "LabResult" + ] + }, + "laboratory.Specimen": { + "laboratory": [ + "LabResult" + ] + }, + "laboratory.LabResult": { + "laboratory": [ + "QualityControl" + ] + }, + "radiology.ImagingOrder": { + "radiology": [ + "ImagingStudy" + ] + }, + "radiology.ImagingStudy": { + "radiology": [ + "ImagingSeries", + "RadiologyReport" + ] + }, + "radiology.ImagingSeries": { + "radiology": [ + "DICOMImage" + ] + }, + "radiology.ReportTemplate": { + "radiology": [ + "RadiologyReport" + ] + }, + "operating_theatre.OperatingRoom": { + "operating_theatre": [ + "ORBlock" + ] + }, + "operating_theatre.ORBlock": { + "operating_theatre": [ + "SurgicalCase" + ] + }, + "operating_theatre.SurgicalCase": { + "operating_theatre": [ + "SurgicalNote", + "EquipmentUsage" + ] + }, + "operating_theatre.SurgicalNoteTemplate": { + "operating_theatre": [ + "SurgicalNote" + ] + }, + "billing.MedicalBill": { + "billing": [ + "BillLineItem", + "InsuranceClaim", + "Payment" + ] + }, + "inventory.Supplier": { + "inventory": [ + "InventoryItem", + "InventoryStock", + "PurchaseOrder" + ] + }, + "blood_bank.InventoryLocation": { + "inventory": [ + "InventoryStock", + "PurchaseOrder" + ] + }, + "inventory.PurchaseOrder": { + "inventory": [ + "InventoryStock", + "PurchaseOrderItem" + ] + }, + "hr.Schedule": { + "hr": [ + "ScheduleAssignment" + ] + }, + "hr.TrainingPrograms": { + "hr": [ + "ProgramModule", + "ProgramPrerequisite", + "ProgramPrerequisite", + "TrainingSession", + "TrainingRecord", + "TrainingCertificates" + ] + }, + "hr.TrainingSession": { + "hr": [ + "TrainingRecord" + ] + }, + "hr.TrainingRecord": { + "hr": [ + "TrainingAttendance", + "TrainingAssessment", + "TrainingCertificates" + ] + }, + "analytics.Dashboard": { + "analytics": [ + "DashboardWidget" + ] + }, + "analytics.DataSource": { + "analytics": [ + "DashboardWidget", + "Report", + "MetricDefinition" + ] + }, + "analytics.Report": { + "analytics": [ + "ReportExecution" + ] + }, + "analytics.MetricDefinition": { + "analytics": [ + "MetricValue" + ] + }, + "communications.Message": { + "communications": [ + "MessageRecipient", + "DeliveryLog" + ] + }, + "communications.NotificationTemplate": { + "communications": [ + "AlertRule" + ] + }, + "communications.AlertRule": { + "communications": [ + "AlertInstance" + ] + }, + "communications.MessageRecipient": { + "communications": [ + "DeliveryLog" + ] + }, + "communications.CommunicationChannel": { + "communications": [ + "DeliveryLog" + ] + }, + "integration.ExternalSystem": { + "integration": [ + "IntegrationEndpoint", + "WebhookEndpoint", + "IntegrationLog" + ] + }, + "integration.IntegrationEndpoint": { + "integration": [ + "DataMapping", + "IntegrationExecution", + "IntegrationLog" + ] + }, + "integration.DataMapping": { + "integration": [ + "WebhookEndpoint" + ] + }, + "integration.WebhookEndpoint": { + "integration": [ + "WebhookExecution" + ] + }, + "integration.IntegrationExecution": { + "integration": [ + "IntegrationLog" + ] + }, + "quality.QualityIndicator": { + "quality": [ + "QualityMeasurement" + ] + }, + "quality.IncidentReport": { + "quality": [ + "RiskAssessment" + ] + }, + "quality.AuditPlan": { + "quality": [ + "AuditFinding" + ] + }, + "facility_management.AssetCategory": { + "facility_management": [ + "Asset" + ] + }, + "facility_management.Room": { + "facility_management": [ + "Asset", + "MaintenanceRequest", + "MaintenanceSchedule", + "Inspection", + "SpaceReservation" + ] + }, + "facility_management.MaintenanceType": { + "facility_management": [ + "MaintenanceRequest", + "MaintenanceSchedule" + ] + }, + "facility_management.Vendor": { + "facility_management": [ + "ServiceContract" + ] + }, + "facility_management.EnergyMeter": { + "facility_management": [ + "EnergyReading" + ] + }, + "insurance_approvals.InsuranceApprovalRequest": { + "insurance_approvals": [ + "ApprovalDocument", + "ApprovalStatusHistory", + "ApprovalCommunicationLog" + ] + } + } +} \ No newline at end of file diff --git a/_refactor_report/modular_refactoring_report.md b/_refactor_report/modular_refactoring_report.md new file mode 100644 index 00000000..e02d17db --- /dev/null +++ b/_refactor_report/modular_refactoring_report.md @@ -0,0 +1,5822 @@ +# Modular Refactoring Report (Drop-and-Reseed Friendly) + + **Executive Summary** + - Apps scanned: **20** + - Total models found: **153** + - Name collisions: **4** + - Field-set similarities: **1** + - Inventory leaks in clinical apps: **6** + - Canonical ownership conflicts: **1** + + --- + + ## 1) App & Model Inventory + | App | Domain Guess | # Models | Models | +|---|---|---:|---| +| `accounts` | communications | 4 | PasswordHistory, SocialAccount, TwoFactorDevice, UserSession | +| `analytics` | analytics | 7 | Dashboard, DashboardWidget, DataSource, MetricDefinition, MetricValue, Report, ReportExecution | +| `appointments` | appointments | 8 | AppointmentRequest, AppointmentTemplate, QueueEntry, SlotAvailability, TelemedicineSession, WaitingList, WaitingListContactLog, WaitingQueue | +| `billing` | billing | 6 | BillLineItem, BillingConfiguration, ClaimStatusUpdate, InsuranceClaim, MedicalBill, Payment | +| `blood_bank` | blood_bank | 12 | AdverseReaction, BloodComponent, BloodGroup, BloodIssue, BloodRequest, BloodTest, BloodUnit, CrossMatch, Donor, InventoryLocation, QualityControl, Transfusion | +| `communications` | communications | 7 | AlertInstance, AlertRule, CommunicationChannel, DeliveryLog, Message, MessageRecipient, NotificationTemplate | +| `core` | communications | 5 | AuditLogEntry, IntegrationLog, SystemConfiguration, SystemNotification, Tenant | +| `emr` | emr | 13 | AllergyAlert, CarePlan, ClinicalGuideline, ClinicalNote, ClinicalRecommendation, CriticalAlert, DiagnosticSuggestion, Encounter, Icd10, NoteTemplate, ProblemList, TreatmentProtocol, VitalSigns | +| `facility_management` | facility_management | 14 | Asset, AssetCategory, Building, EnergyMeter, EnergyReading, Floor, Inspection, MaintenanceRequest, MaintenanceSchedule, MaintenanceType, Room, ServiceContract, SpaceReservation, Vendor | +| `hr` | hr | 14 | Department, Employee, PerformanceReview, ProgramModule, ProgramPrerequisite, Schedule, ScheduleAssignment, TimeEntry, TrainingAssessment, TrainingAttendance, TrainingCertificates, TrainingPrograms, TrainingRecord, TrainingSession | +| `inpatients` | inpatients | 5 | Admission, Bed, DischargeSummary, Transfer, Ward | +| `insurance_approvals` | emr | 5 | ApprovalCommunicationLog, ApprovalDocument, ApprovalStatusHistory, ApprovalTemplate, InsuranceApprovalRequest | +| `integration` | core | 7 | DataMapping, ExternalSystem, IntegrationEndpoint, IntegrationExecution, IntegrationLog, WebhookEndpoint, WebhookExecution | +| `inventory` | inventory | 6 | InventoryItem, InventoryLocation, InventoryStock, PurchaseOrder, PurchaseOrderItem, Supplier | +| `laboratory` | laboratory | 6 | LabOrder, LabResult, LabTest, QualityControl, ReferenceRange, Specimen | +| `operating_theatre` | operating_theatre | 6 | EquipmentUsage, ORBlock, OperatingRoom, SurgicalCase, SurgicalNote, SurgicalNoteTemplate | +| `patients` | emr | 9 | ClaimDocument, ClaimStatusHistory, ConsentForm, ConsentTemplate, EmergencyContact, InsuranceClaim, InsuranceInfo, PatientNote, PatientProfile | +| `pharmacy` | pharmacy | 6 | DispenseRecord, DrugInteraction, Medication, MedicationAdministration, MedicationInventoryItem, Prescription | +| `quality` | quality | 7 | AuditFinding, AuditPlan, ImprovementProject, IncidentReport, QualityIndicator, QualityMeasurement, RiskAssessment | +| `radiology` | radiology | 6 | DICOMImage, ImagingOrder, ImagingSeries, ImagingStudy, RadiologyReport, ReportTemplate | + + ### Model Map (JSON) + ```json +{ + "apps": [ + "core", + "accounts", + "blood_bank", + "patients", + "appointments", + "inpatients", + "emr", + "pharmacy", + "laboratory", + "radiology", + "operating_theatre", + "billing", + "inventory", + "hr", + "analytics", + "communications", + "integration", + "quality", + "facility_management", + "insurance_approvals" + ], + "by_app": { + "core": [ + { + "name": "Tenant", + "fields": { + "tenant_id": "UUIDField", + "name": "CharField", + "display_name": "CharField", + "description": "TextField", + "organization_type": "CharField", + "address_line1": "CharField", + "address_line2": "CharField", + "city": "CharField", + "state": "CharField", + "postal_code": "CharField", + "country": "CharField", + "phone_number": "CharField", + "email": "EmailField", + "website": "URLField", + "license_number": "CharField", + "accreditation_body": "CharField", + "accreditation_number": "CharField", + "accreditation_expiry": "DateField", + "timezone": "CharField", + "locale": "CharField", + "currency": "CharField", + "subscription_plan": "CharField", + "max_users": "PositiveIntegerField", + "max_patients": "PositiveIntegerField", + "is_active": "BooleanField", + "is_trial": "BooleanField", + "trial_expires_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [], + "m2ms": [], + "lineno": 17, + "file": "core/models.py" + }, + { + "name": "AuditLogEntry", + "fields": { + "tenant": "ForeignKey", + "log_id": "UUIDField", + "event_type": "CharField", + "event_category": "CharField", + "user": "ForeignKey", + "user_email": "EmailField", + "user_role": "CharField", + "session_key": "CharField", + "ip_address": "GenericIPAddressField", + "user_agent": "TextField", + "content_type": "ForeignKey", + "object_id": "PositiveIntegerField", + "content_object": "GenericForeignKey", + "object_repr": "CharField", + "action": "CharField", + "description": "TextField", + "changes": "JSONField", + "additional_data": "JSONField", + "patient_id": "CharField", + "patient_mrn": "CharField", + "risk_level": "CharField", + "hipaa_relevant": "BooleanField", + "gdpr_relevant": "BooleanField", + "is_successful": "BooleanField", + "error_message": "TextField", + "timestamp": "DateTimeField", + "created_at": "DateTimeField" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL", + "ContentType" + ], + "m2ms": [], + "lineno": 217, + "file": "core/models.py" + }, + { + "name": "SystemConfiguration", + "fields": { + "tenant": "ForeignKey", + "key": "CharField", + "value": "TextField", + "data_type": "CharField", + "category": "CharField", + "description": "TextField", + "validation_rules": "JSONField", + "default_value": "TextField", + "is_sensitive": "BooleanField", + "is_encrypted": "BooleanField", + "required_permission": "CharField", + "is_active": "BooleanField", + "is_readonly": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "updated_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 424, + "file": "core/models.py" + }, + { + "name": "SystemNotification", + "fields": { + "tenant": "ForeignKey", + "notification_id": "UUIDField", + "title": "CharField", + "message": "TextField", + "notification_type": "CharField", + "priority": "CharField", + "target_audience": "CharField", + "target_roles": "JSONField", + "target_users": "ManyToManyField", + "is_dismissible": "BooleanField", + "auto_dismiss_after": "PositiveIntegerField", + "show_on_login": "BooleanField", + "start_date": "DateTimeField", + "end_date": "DateTimeField", + "action_url": "URLField", + "action_text": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 552, + "file": "core/models.py" + }, + { + "name": "IntegrationLog", + "fields": { + "tenant": "ForeignKey", + "log_id": "UUIDField", + "integration_type": "CharField", + "direction": "CharField", + "external_system": "CharField", + "endpoint": "CharField", + "message_type": "CharField", + "message_id": "CharField", + "correlation_id": "UUIDField", + "request_data": "TextField", + "response_data": "TextField", + "status": "CharField", + "error_code": "CharField", + "error_message": "TextField", + "processing_time_ms": "PositiveIntegerField", + "timestamp": "DateTimeField", + "created_at": "DateTimeField" + }, + "fks": [ + "Tenant" + ], + "m2ms": [], + "lineno": 710, + "file": "core/models.py" + } + ], + "accounts": [ + { + "name": "TwoFactorDevice", + "fields": { + "user": "ForeignKey", + "device_id": "UUIDField", + "name": "CharField", + "device_type": "CharField", + "secret_key": "CharField", + "phone_number": "CharField", + "email_address": "EmailField", + "is_active": "BooleanField", + "is_verified": "BooleanField", + "verified_at": "DateTimeField", + "last_used_at": "DateTimeField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 431, + "file": "accounts/models.py" + }, + { + "name": "SocialAccount", + "fields": { + "user": "ForeignKey", + "provider": "CharField", + "provider_id": "CharField", + "provider_email": "EmailField", + "display_name": "CharField", + "profile_url": "URLField", + "avatar_url": "URLField", + "access_token": "TextField", + "refresh_token": "TextField", + "token_expires_at": "DateTimeField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "last_login_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 520, + "file": "accounts/models.py" + }, + { + "name": "UserSession", + "fields": { + "user": "ForeignKey", + "session_key": "CharField", + "session_id": "UUIDField", + "ip_address": "GenericIPAddressField", + "user_agent": "TextField", + "device_type": "CharField", + "browser": "CharField", + "operating_system": "CharField", + "country": "CharField", + "region": "CharField", + "city": "CharField", + "is_active": "BooleanField", + "login_method": "CharField", + "created_at": "DateTimeField", + "last_activity_at": "DateTimeField", + "expires_at": "DateTimeField", + "ended_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 615, + "file": "accounts/models.py" + }, + { + "name": "PasswordHistory", + "fields": { + "user": "ForeignKey", + "password_hash": "CharField", + "created_at": "DateTimeField" + }, + "fks": [ + "User" + ], + "m2ms": [], + "lineno": 752, + "file": "accounts/models.py" + } + ], + "blood_bank": [ + { + "name": "BloodGroup", + "fields": { + "abo_type": "CharField", + "rh_factor": "CharField" + }, + "fks": [], + "m2ms": [], + "lineno": 10, + "file": "blood_bank/models.py" + }, + { + "name": "Donor", + "fields": { + "donor_id": "CharField", + "first_name": "CharField", + "last_name": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "national_id": "CharField", + "blood_group": "ForeignKey", + "phone": "CharField", + "email": "EmailField", + "address": "TextField", + "emergency_contact_name": "CharField", + "emergency_contact_phone": "CharField", + "donor_type": "CharField", + "status": "CharField", + "registration_date": "DateTimeField", + "last_donation_date": "DateTimeField", + "total_donations": "PositiveIntegerField", + "weight": "FloatField", + "height": "FloatField", + "notes": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "BloodGroup", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 39, + "file": "blood_bank/models.py" + }, + { + "name": "BloodComponent", + "fields": { + "name": "CharField", + "description": "TextField", + "shelf_life_days": "PositiveIntegerField", + "storage_temperature": "CharField", + "volume_ml": "PositiveIntegerField", + "is_active": "BooleanField" + }, + "fks": [], + "m2ms": [], + "lineno": 116, + "file": "blood_bank/models.py" + }, + { + "name": "BloodUnit", + "fields": { + "unit_number": "CharField", + "donor": "ForeignKey", + "component": "ForeignKey", + "blood_group": "ForeignKey", + "collection_date": "DateTimeField", + "expiry_date": "DateTimeField", + "volume_ml": "PositiveIntegerField", + "status": "CharField", + "location": "CharField", + "bag_type": "CharField", + "anticoagulant": "CharField", + "collection_site": "CharField", + "collected_by": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Donor", + "BloodComponent", + "BloodGroup", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 141, + "file": "blood_bank/models.py" + }, + { + "name": "BloodTest", + "fields": { + "blood_unit": "ForeignKey", + "test_type": "CharField", + "result": "CharField", + "test_date": "DateTimeField", + "tested_by": "ForeignKey", + "equipment_used": "CharField", + "lot_number": "CharField", + "notes": "TextField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField" + }, + "fks": [ + "BloodUnit", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 192, + "file": "blood_bank/models.py" + }, + { + "name": "CrossMatch", + "fields": { + "blood_unit": "ForeignKey", + "recipient": "ForeignKey", + "test_type": "CharField", + "compatibility": "CharField", + "test_date": "DateTimeField", + "tested_by": "ForeignKey", + "temperature": "CharField", + "incubation_time": "PositiveIntegerField", + "notes": "TextField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField" + }, + "fks": [ + "BloodUnit", + "PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 232, + "file": "blood_bank/models.py" + }, + { + "name": "BloodRequest", + "fields": { + "request_number": "CharField", + "patient": "ForeignKey", + "requesting_department": "ForeignKey", + "requesting_physician": "ForeignKey", + "component_requested": "ForeignKey", + "units_requested": "PositiveIntegerField", + "urgency": "CharField", + "indication": "TextField", + "special_requirements": "TextField", + "patient_blood_group": "ForeignKey", + "hemoglobin_level": "FloatField", + "platelet_count": "IntegerField", + "status": "CharField", + "request_date": "DateTimeField", + "required_by": "DateTimeField", + "processed_by": "ForeignKey", + "processed_at": "DateTimeField", + "notes": "TextField", + "cancellation_reason": "TextField", + "cancelled_by": "ForeignKey", + "cancellation_date": "DateTimeField" + }, + "fks": [ + "PatientProfile", + "Department", + "settings.AUTH_USER_MODEL", + "BloodComponent", + "BloodGroup", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 266, + "file": "blood_bank/models.py" + }, + { + "name": "BloodIssue", + "fields": { + "blood_request": "ForeignKey", + "blood_unit": "OneToOneField", + "crossmatch": "ForeignKey", + "issued_by": "ForeignKey", + "issued_to": "ForeignKey", + "issue_date": "DateTimeField", + "expiry_time": "DateTimeField", + "returned": "BooleanField", + "return_date": "DateTimeField", + "return_reason": "TextField", + "notes": "TextField" + }, + "fks": [ + "BloodRequest", + "BloodUnit", + "CrossMatch", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 318, + "file": "blood_bank/models.py" + }, + { + "name": "Transfusion", + "fields": { + "blood_issue": "OneToOneField", + "start_time": "DateTimeField", + "end_time": "DateTimeField", + "status": "CharField", + "volume_transfused": "PositiveIntegerField", + "transfusion_rate": "CharField", + "administered_by": "ForeignKey", + "witnessed_by": "ForeignKey", + "pre_transfusion_vitals": "JSONField", + "post_transfusion_vitals": "JSONField", + "vital_signs_history": "JSONField", + "current_blood_pressure": "CharField", + "current_heart_rate": "IntegerField", + "current_temperature": "FloatField", + "current_respiratory_rate": "IntegerField", + "current_oxygen_saturation": "IntegerField", + "last_vitals_check": "DateTimeField", + "patient_consent": "BooleanField", + "consent_date": "DateTimeField", + "notes": "TextField", + "stop_reason": "TextField", + "stopped_by": "ForeignKey", + "completed_by": "ForeignKey", + "completion_notes": "TextField" + }, + "fks": [ + "BloodIssue", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 343, + "file": "blood_bank/models.py" + }, + { + "name": "AdverseReaction", + "fields": { + "transfusion": "ForeignKey", + "reaction_type": "CharField", + "severity": "CharField", + "onset_time": "DateTimeField", + "symptoms": "TextField", + "treatment_given": "TextField", + "outcome": "TextField", + "reported_by": "ForeignKey", + "investigated_by": "ForeignKey", + "investigation_notes": "TextField", + "regulatory_reported": "BooleanField", + "report_date": "DateTimeField" + }, + "fks": [ + "Transfusion", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 396, + "file": "blood_bank/models.py" + }, + { + "name": "InventoryLocation", + "fields": { + "name": "CharField", + "location_type": "CharField", + "temperature_range": "CharField", + "temperature": "FloatField", + "capacity": "PositiveIntegerField", + "current_stock": "PositiveIntegerField", + "is_active": "BooleanField", + "notes": "TextField" + }, + "fks": [], + "m2ms": [], + "lineno": 437, + "file": "blood_bank/models.py" + }, + { + "name": "QualityControl", + "fields": { + "test_type": "CharField", + "test_date": "DateTimeField", + "equipment_tested": "CharField", + "parameters_tested": "TextField", + "expected_results": "TextField", + "actual_results": "TextField", + "status": "CharField", + "performed_by": "ForeignKey", + "reviewed_by": "ForeignKey", + "review_date": "DateTimeField", + "review_notes": "TextField", + "corrective_action": "TextField", + "next_test_date": "DateTimeField", + "capa_initiated": "BooleanField", + "capa_number": "CharField", + "capa_priority": "CharField", + "capa_initiated_by": "ForeignKey", + "capa_date": "DateTimeField", + "capa_assessment": "TextField", + "capa_status": "CharField" + }, + "fks": [ + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 469, + "file": "blood_bank/models.py" + } + ], + "patients": [ + { + "name": "PatientProfile", + "fields": { + "patient_id": "UUIDField", + "tenant": "ForeignKey", + "mrn": "CharField", + "first_name": "CharField", + "last_name": "CharField", + "middle_name": "CharField", + "preferred_name": "CharField", + "suffix": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "email": "EmailField", + "phone_number": "CharField", + "mobile_number": "CharField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "zip_code": "CharField", + "country": "CharField", + "id_number": "CharField", + "marital_status": "CharField", + "primary_language": "CharField", + "interpreter_needed": "BooleanField", + "communication_preference": "CharField", + "employer": "CharField", + "occupation": "CharField", + "primary_care_physician": "CharField", + "referring_physician": "CharField", + "allergies": "TextField", + "medical_alerts": "TextField", + "has_advance_directive": "BooleanField", + "advance_directive_type": "CharField", + "is_active": "BooleanField", + "is_deceased": "BooleanField", + "date_of_death": "DateField", + "is_vip": "BooleanField", + "confidential_patient": "BooleanField", + "registration_date": "DateTimeField", + "registered_by": "ForeignKey", + "photo": "ImageField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "last_visit_date": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 13, + "file": "patients/models.py" + }, + { + "name": "EmergencyContact", + "fields": { + "patient": "ForeignKey", + "first_name": "CharField", + "last_name": "CharField", + "relationship": "CharField", + "phone_number": "CharField", + "mobile_number": "CharField", + "email": "EmailField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "zip_code": "CharField", + "priority": "PositiveIntegerField", + "is_authorized_for_medical_decisions": "BooleanField", + "is_authorized_for_financial_decisions": "BooleanField", + "is_authorized_for_information": "BooleanField", + "is_primary": "BooleanField", + "authorization_number": "CharField", + "is_active": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PatientProfile" + ], + "m2ms": [], + "lineno": 392, + "file": "patients/models.py" + }, + { + "name": "InsuranceInfo", + "fields": { + "patient": "ForeignKey", + "insurance_type": "CharField", + "insurance_company": "CharField", + "plan_name": "CharField", + "plan_type": "CharField", + "status": "CharField", + "policy_number": "CharField", + "group_number": "CharField", + "subscriber_name": "CharField", + "subscriber_relationship": "CharField", + "subscriber_dob": "DateField", + "subscriber_id_number": "CharField", + "effective_date": "DateField", + "termination_date": "DateField", + "copay_amount": "DecimalField", + "deductible_amount": "DecimalField", + "out_of_pocket_max": "DecimalField", + "is_verified": "BooleanField", + "verification_date": "DateTimeField", + "verified_by": "ForeignKey", + "requires_authorization": "BooleanField", + "authorization_number": "CharField", + "authorization_expiry": "DateField", + "is_active": "BooleanField", + "is_primary": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PatientProfile", + "hr.Employee" + ], + "m2ms": [], + "lineno": 555, + "file": "patients/models.py" + }, + { + "name": "InsuranceClaim", + "fields": { + "claim_number": "CharField", + "patient": "ForeignKey", + "insurance_info": "ForeignKey", + "claim_type": "CharField", + "status": "CharField", + "priority": "CharField", + "service_date": "DateField", + "service_provider": "CharField", + "service_provider_license": "CharField", + "facility_name": "CharField", + "facility_license": "CharField", + "primary_diagnosis_code": "CharField", + "primary_diagnosis_description": "TextField", + "secondary_diagnosis_codes": "JSONField", + "procedure_codes": "JSONField", + "billed_amount": "DecimalField", + "approved_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "discount_amount": "DecimalField", + "submitted_date": "DateTimeField", + "processed_date": "DateTimeField", + "payment_date": "DateTimeField", + "saudi_id_number": "CharField", + "insurance_card_number": "CharField", + "authorization_number": "CharField", + "denial_reason": "TextField", + "denial_code": "CharField", + "appeal_date": "DateTimeField", + "appeal_reason": "TextField", + "notes": "TextField", + "attachments": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "InsuranceInfo", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 784, + "file": "patients/models.py" + }, + { + "name": "ClaimDocument", + "fields": { + "claim": "ForeignKey", + "document_type": "CharField", + "title": "CharField", + "description": "TextField", + "file_path": "CharField", + "file_size": "PositiveIntegerField", + "mime_type": "CharField", + "uploaded_at": "DateTimeField", + "uploaded_by": "ForeignKey" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1121, + "file": "patients/models.py" + }, + { + "name": "ClaimStatusHistory", + "fields": { + "claim": "ForeignKey", + "from_status": "CharField", + "to_status": "CharField", + "reason": "TextField", + "notes": "TextField", + "changed_at": "DateTimeField", + "changed_by": "ForeignKey" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1197, + "file": "patients/models.py" + }, + { + "name": "ConsentTemplate", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "category": "CharField", + "content": "TextField", + "requires_signature": "BooleanField", + "requires_witness": "BooleanField", + "requires_guardian": "BooleanField", + "is_active": "BooleanField", + "version": "CharField", + "effective_date": "DateField", + "expiry_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1252, + "file": "patients/models.py" + }, + { + "name": "ConsentForm", + "fields": { + "patient": "ForeignKey", + "template": "ForeignKey", + "consent_id": "UUIDField", + "status": "CharField", + "patient_signature": "TextField", + "patient_signed_at": "DateTimeField", + "patient_ip_address": "GenericIPAddressField", + "guardian_signature": "TextField", + "guardian_signed_at": "DateTimeField", + "guardian_name": "CharField", + "guardian_relationship": "CharField", + "witness_signature": "TextField", + "witness_signed_at": "DateTimeField", + "witness_name": "CharField", + "witness_title": "CharField", + "provider_name": "CharField", + "provider_signature": "TextField", + "provider_signed_at": "DateTimeField", + "effective_date": "DateTimeField", + "expiry_date": "DateTimeField", + "revoked_at": "DateTimeField", + "revoked_by": "ForeignKey", + "revocation_reason": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "ConsentTemplate", + "hr.Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1357, + "file": "patients/models.py" + }, + { + "name": "PatientNote", + "fields": { + "patient": "ForeignKey", + "note_id": "UUIDField", + "title": "CharField", + "content": "TextField", + "category": "CharField", + "priority": "CharField", + "is_confidential": "BooleanField", + "is_alert": "BooleanField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "PatientProfile", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1573, + "file": "patients/models.py" + } + ], + "appointments": [ + { + "name": "AppointmentRequest", + "fields": { + "request_id": "UUIDField", + "tenant": "ForeignKey", + "patient": "ForeignKey", + "provider": "ForeignKey", + "appointment_type": "CharField", + "specialty": "CharField", + "preferred_date": "DateField", + "preferred_time": "TimeField", + "duration_minutes": "PositiveIntegerField", + "flexible_scheduling": "BooleanField", + "earliest_acceptable_date": "DateField", + "latest_acceptable_date": "DateField", + "acceptable_times": "JSONField", + "priority": "CharField", + "urgency_score": "PositiveIntegerField", + "chief_complaint": "TextField", + "clinical_notes": "TextField", + "referring_provider": "CharField", + "insurance_verified": "BooleanField", + "authorization_required": "BooleanField", + "authorization_number": "CharField", + "status": "CharField", + "scheduled_datetime": "DateTimeField", + "scheduled_end_datetime": "DateTimeField", + "location": "CharField", + "room_number": "CharField", + "is_telemedicine": "BooleanField", + "telemedicine_platform": "CharField", + "meeting_url": "URLField", + "meeting_id": "CharField", + "meeting_password": "CharField", + "checked_in_at": "DateTimeField", + "checked_in_by": "ForeignKey", + "completed_at": "DateTimeField", + "actual_duration_minutes": "PositiveIntegerField", + "cancelled_at": "DateTimeField", + "cancelled_by": "ForeignKey", + "cancellation_reason": "TextField", + "rescheduled_from": "ForeignKey", + "reminder_preferences": "JSONField", + "special_requirements": "TextField", + "interpreter_needed": "BooleanField", + "interpreter_language": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 15, + "file": "appointments/models.py" + }, + { + "name": "SlotAvailability", + "fields": { + "tenant": "ForeignKey", + "provider": "ForeignKey", + "slot_id": "UUIDField", + "date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "duration_minutes": "PositiveIntegerField", + "availability_type": "CharField", + "max_appointments": "PositiveIntegerField", + "booked_appointments": "PositiveIntegerField", + "location": "CharField", + "room_number": "CharField", + "specialty": "CharField", + "appointment_types": "JSONField", + "patient_restrictions": "JSONField", + "insurance_restrictions": "JSONField", + "supports_telemedicine": "BooleanField", + "telemedicine_only": "BooleanField", + "is_active": "BooleanField", + "is_blocked": "BooleanField", + "block_reason": "CharField", + "is_recurring": "BooleanField", + "recurrence_pattern": "JSONField", + "recurrence_end_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 398, + "file": "appointments/models.py" + }, + { + "name": "WaitingQueue", + "fields": { + "tenant": "ForeignKey", + "queue_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "queue_type": "CharField", + "providers": "ManyToManyField", + "specialty": "CharField", + "location": "CharField", + "max_queue_size": "PositiveIntegerField", + "average_service_time_minutes": "PositiveIntegerField", + "priority_weights": "JSONField", + "is_active": "BooleanField", + "is_accepting_patients": "BooleanField", + "operating_hours": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 589, + "file": "appointments/models.py" + }, + { + "name": "QueueEntry", + "fields": { + "queue": "ForeignKey", + "patient": "ForeignKey", + "appointment": "ForeignKey", + "entry_id": "UUIDField", + "queue_position": "PositiveIntegerField", + "priority_score": "FloatField", + "joined_at": "DateTimeField", + "estimated_service_time": "DateTimeField", + "called_at": "DateTimeField", + "served_at": "DateTimeField", + "status": "CharField", + "assigned_provider": "ForeignKey", + "notification_sent": "BooleanField", + "notification_method": "CharField", + "notes": "TextField", + "updated_at": "DateTimeField", + "updated_by": "ForeignKey" + }, + "fks": [ + "WaitingQueue", + "patients.PatientProfile", + "AppointmentRequest", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 728, + "file": "appointments/models.py" + }, + { + "name": "TelemedicineSession", + "fields": { + "session_id": "UUIDField", + "appointment": "OneToOneField", + "platform": "CharField", + "meeting_url": "URLField", + "meeting_id": "CharField", + "meeting_password": "CharField", + "waiting_room_enabled": "BooleanField", + "recording_enabled": "BooleanField", + "recording_consent": "BooleanField", + "encryption_enabled": "BooleanField", + "password_required": "BooleanField", + "status": "CharField", + "scheduled_start": "DateTimeField", + "scheduled_end": "DateTimeField", + "actual_start": "DateTimeField", + "actual_end": "DateTimeField", + "provider_joined_at": "DateTimeField", + "patient_joined_at": "DateTimeField", + "connection_quality": "CharField", + "technical_issues": "TextField", + "recording_url": "URLField", + "recording_duration_minutes": "PositiveIntegerField", + "session_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "AppointmentRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 881, + "file": "appointments/models.py" + }, + { + "name": "AppointmentTemplate", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "appointment_type": "CharField", + "specialty": "CharField", + "duration_minutes": "PositiveIntegerField", + "advance_booking_days": "PositiveIntegerField", + "minimum_notice_hours": "PositiveIntegerField", + "insurance_verification_required": "BooleanField", + "authorization_required": "BooleanField", + "pre_appointment_instructions": "TextField", + "post_appointment_instructions": "TextField", + "required_forms": "JSONField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1077, + "file": "appointments/models.py" + }, + { + "name": "WaitingList", + "fields": { + "waiting_list_id": "UUIDField", + "tenant": "ForeignKey", + "patient": "ForeignKey", + "provider": "ForeignKey", + "department": "ForeignKey", + "appointment_type": "CharField", + "specialty": "CharField", + "priority": "CharField", + "urgency_score": "PositiveIntegerField", + "clinical_indication": "TextField", + "diagnosis_codes": "JSONField", + "preferred_date": "DateField", + "preferred_time": "TimeField", + "flexible_scheduling": "BooleanField", + "earliest_acceptable_date": "DateField", + "latest_acceptable_date": "DateField", + "acceptable_days": "JSONField", + "acceptable_times": "JSONField", + "contact_method": "CharField", + "contact_phone": "CharField", + "contact_email": "EmailField", + "status": "CharField", + "position": "PositiveIntegerField", + "estimated_wait_time": "PositiveIntegerField", + "last_contacted": "DateTimeField", + "contact_attempts": "PositiveIntegerField", + "max_contact_attempts": "PositiveIntegerField", + "appointments_offered": "PositiveIntegerField", + "appointments_declined": "PositiveIntegerField", + "last_offer_date": "DateTimeField", + "requires_interpreter": "BooleanField", + "interpreter_language": "CharField", + "accessibility_requirements": "TextField", + "transportation_needed": "BooleanField", + "insurance_verified": "BooleanField", + "authorization_required": "BooleanField", + "authorization_status": "CharField", + "authorization_number": "CharField", + "referring_provider": "CharField", + "referral_date": "DateField", + "referral_urgency": "CharField", + "scheduled_appointment": "ForeignKey", + "removal_reason": "CharField", + "removal_notes": "TextField", + "removed_at": "DateTimeField", + "removed_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "notes": "TextField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "hr.Department", + "AppointmentRequest", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1186, + "file": "appointments/models.py" + }, + { + "name": "WaitingListContactLog", + "fields": { + "waiting_list_entry": "ForeignKey", + "contact_date": "DateTimeField", + "contact_method": "CharField", + "contact_outcome": "CharField", + "appointment_offered": "BooleanField", + "offered_date": "DateField", + "offered_time": "TimeField", + "patient_response": "CharField", + "notes": "TextField", + "next_contact_date": "DateField", + "contacted_by": "ForeignKey" + }, + "fks": [ + "WaitingList", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1705, + "file": "appointments/models.py" + } + ], + "inpatients": [ + { + "name": "Ward", + "fields": { + "tenant": "ForeignKey", + "ward_id": "CharField", + "name": "CharField", + "description": "TextField", + "ward_type": "CharField", + "specialty": "CharField", + "total_beds": "PositiveIntegerField", + "private_rooms": "PositiveIntegerField", + "semi_private_rooms": "PositiveIntegerField", + "shared_rooms": "PositiveIntegerField", + "building": "ForeignKey", + "floor": "ForeignKey", + "wing": "CharField", + "nurse_manager": "ForeignKey", + "attending_physicians": "ManyToManyField", + "min_nurses_day": "PositiveIntegerField", + "min_nurses_night": "PositiveIntegerField", + "nurse_to_patient_ratio": "FloatField", + "equipment_list": "JSONField", + "special_features": "JSONField", + "admission_criteria": "TextField", + "age_restrictions": "JSONField", + "gender_restrictions": "CharField", + "is_active": "BooleanField", + "is_accepting_admissions": "BooleanField", + "closure_reason": "TextField", + "phone_number": "CharField", + "extension": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "facility_management.Building", + "facility_management.Floor", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 16, + "file": "inpatients/models.py" + }, + { + "name": "Bed", + "fields": { + "ward": "ForeignKey", + "bed_number": "CharField", + "room_number": "CharField", + "bed_type": "CharField", + "is_operational": "BooleanField", + "is_active": "BooleanField", + "is_out_of_service": "BooleanField", + "room_type": "CharField", + "status": "CharField", + "current_admission": "ForeignKey", + "occupied_since": "DateTimeField", + "reserved_until": "DateTimeField", + "equipment": "ManyToManyField", + "features": "JSONField", + "last_maintenance": "DateTimeField", + "next_maintenance": "DateTimeField", + "maintenance_notes": "TextField", + "last_cleaned": "DateTimeField", + "cleaned_by": "ForeignKey", + "cleaning_level": "CharField", + "blocked_reason": "TextField", + "blocked_by": "ForeignKey", + "blocked_until": "DateTimeField", + "bed_position": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Ward", + "Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "facility_management.Asset" + ], + "lineno": 265, + "file": "inpatients/models.py" + }, + { + "name": "Admission", + "fields": { + "tenant": "ForeignKey", + "admission_id": "UUIDField", + "patient": "ForeignKey", + "admission_datetime": "DateTimeField", + "admission_type": "CharField", + "admission_source": "CharField", + "chief_complaint": "TextField", + "admitting_diagnosis": "TextField", + "secondary_diagnoses": "JSONField", + "admitting_physician": "ForeignKey", + "attending_physician": "ForeignKey", + "consulting_physicians": "ManyToManyField", + "current_ward": "ForeignKey", + "current_bed": "ForeignKey", + "status": "CharField", + "priority": "CharField", + "acuity_level": "PositiveIntegerField", + "insurance_verified": "BooleanField", + "authorization_number": "CharField", + "estimated_length_of_stay": "PositiveIntegerField", + "discharge_planning_started": "BooleanField", + "discharge_planner": "ForeignKey", + "anticipated_discharge_date": "DateField", + "discharge_datetime": "DateTimeField", + "discharge_disposition": "CharField", + "isolation_required": "BooleanField", + "isolation_type": "CharField", + "special_needs": "JSONField", + "allergies": "JSONField", + "alerts": "JSONField", + "code_status": "CharField", + "advance_directive": "BooleanField", + "healthcare_proxy": "CharField", + "admission_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Ward", + "Bed", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 535, + "file": "inpatients/models.py" + }, + { + "name": "DischargeSummary", + "fields": { + "admission": "OneToOneField", + "summary_id": "UUIDField", + "discharge_date": "DateField", + "discharge_time": "TimeField", + "length_of_stay": "PositiveIntegerField", + "admission_diagnosis": "TextField", + "final_diagnosis": "TextField", + "secondary_diagnoses": "JSONField", + "procedures_performed": "JSONField", + "hospital_course": "TextField", + "complications": "TextField", + "discharge_medications": "JSONField", + "medication_changes": "TextField", + "activity_restrictions": "TextField", + "diet_instructions": "TextField", + "wound_care": "TextField", + "special_instructions": "TextField", + "follow_up_appointments": "JSONField", + "follow_up_instructions": "TextField", + "warning_signs": "TextField", + "when_to_call": "TextField", + "discharge_disposition": "CharField", + "discharge_location": "CharField", + "transportation_arranged": "BooleanField", + "transportation_method": "CharField", + "durable_medical_equipment": "JSONField", + "supplies_provided": "JSONField", + "education_provided": "JSONField", + "education_materials": "JSONField", + "patient_understanding": "CharField", + "discharge_planner": "ForeignKey", + "social_worker_involved": "BooleanField", + "case_manager_involved": "BooleanField", + "readmission_risk": "CharField", + "patient_satisfaction": "PositiveIntegerField", + "discharging_physician": "ForeignKey", + "primary_nurse": "ForeignKey", + "summary_completed": "BooleanField", + "summary_signed": "BooleanField", + "patient_copy_provided": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 865, + "file": "inpatients/models.py" + }, + { + "name": "Transfer", + "fields": { + "transfer_id": "UUIDField", + "admission": "ForeignKey", + "patient": "ForeignKey", + "transfer_type": "CharField", + "from_ward": "ForeignKey", + "from_bed": "ForeignKey", + "to_ward": "ForeignKey", + "to_bed": "ForeignKey", + "requested_datetime": "DateTimeField", + "scheduled_datetime": "DateTimeField", + "actual_datetime": "DateTimeField", + "status": "CharField", + "reason": "TextField", + "priority": "CharField", + "requested_by": "ForeignKey", + "approved_by": "ForeignKey", + "completed_by": "ForeignKey", + "transport_method": "CharField", + "transport_team": "ManyToManyField", + "equipment_needed": "JSONField", + "supplies_needed": "JSONField", + "patient_condition": "CharField", + "vital_signs": "JSONField", + "handoff_report": "TextField", + "medications_transferred": "JSONField", + "delay_reason": "TextField", + "complications": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Admission", + "patients.PatientProfile", + "Ward", + "Bed", + "Ward", + "Bed", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 1161, + "file": "inpatients/models.py" + } + ], + "emr": [ + { + "name": "Encounter", + "fields": { + "objects": "EncounterManager", + "tenant": "ForeignKey", + "encounter_id": "UUIDField", + "patient": "ForeignKey", + "provider": "ForeignKey", + "encounter_type": "CharField", + "encounter_class": "CharField", + "start_datetime": "DateTimeField", + "end_datetime": "DateTimeField", + "status": "CharField", + "location": "CharField", + "room_number": "CharField", + "appointment": "ForeignKey", + "admission": "ForeignKey", + "chief_complaint": "TextField", + "reason_for_visit": "TextField", + "priority": "CharField", + "acuity_level": "PositiveIntegerField", + "documentation_complete": "BooleanField", + "signed_off": "BooleanField", + "signed_by": "ForeignKey", + "signed_datetime": "DateTimeField", + "billable": "BooleanField", + "billing_codes": "JSONField", + "quality_measures": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "appointments.AppointmentRequest", + "inpatients.Admission", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 71, + "file": "emr/models.py" + }, + { + "name": "VitalSigns", + "fields": { + "encounter": "ForeignKey", + "patient": "ForeignKey", + "measurement_id": "UUIDField", + "measured_datetime": "DateTimeField", + "temperature": "DecimalField", + "temperature_method": "CharField", + "systolic_bp": "PositiveIntegerField", + "diastolic_bp": "PositiveIntegerField", + "bp_position": "CharField", + "bp_cuff_size": "CharField", + "heart_rate": "PositiveIntegerField", + "heart_rhythm": "CharField", + "respiratory_rate": "PositiveIntegerField", + "oxygen_saturation": "PositiveIntegerField", + "oxygen_delivery": "CharField", + "oxygen_flow_rate": "DecimalField", + "pain_scale": "PositiveIntegerField", + "pain_location": "CharField", + "pain_quality": "CharField", + "weight": "DecimalField", + "height": "DecimalField", + "bmi": "DecimalField", + "head_circumference": "DecimalField", + "device_used": "CharField", + "device_calibrated": "BooleanField", + "measured_by": "ForeignKey", + "verified_by": "ForeignKey", + "critical_values": "JSONField", + "alerts_generated": "JSONField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Encounter", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 349, + "file": "emr/models.py" + }, + { + "name": "ProblemList", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "problem_id": "UUIDField", + "problem_name": "CharField", + "problem_code": "CharField", + "coding_system": "CharField", + "problem_type": "CharField", + "onset_date": "DateField", + "onset_description": "CharField", + "severity": "CharField", + "priority": "CharField", + "status": "CharField", + "resolution_date": "DateField", + "resolution_notes": "TextField", + "diagnosing_provider": "ForeignKey", + "managing_provider": "ForeignKey", + "related_encounter": "ForeignKey", + "body_site": "CharField", + "laterality": "CharField", + "clinical_notes": "TextField", + "patient_concerns": "TextField", + "treatment_goals": "JSONField", + "outcome_measures": "JSONField", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_date": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 732, + "file": "emr/models.py" + }, + { + "name": "CarePlan", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "care_plan_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "plan_type": "CharField", + "category": "CharField", + "start_date": "DateField", + "end_date": "DateField", + "target_completion_date": "DateField", + "status": "CharField", + "priority": "CharField", + "primary_provider": "ForeignKey", + "care_team": "ManyToManyField", + "related_problems": "ManyToManyField", + "goals": "JSONField", + "objectives": "JSONField", + "interventions": "JSONField", + "activities": "JSONField", + "monitoring_parameters": "JSONField", + "evaluation_criteria": "JSONField", + "patient_goals": "TextField", + "patient_preferences": "TextField", + "patient_barriers": "TextField", + "resources_needed": "JSONField", + "support_systems": "JSONField", + "progress_notes": "TextField", + "last_reviewed": "DateField", + "next_review_date": "DateField", + "outcomes_achieved": "JSONField", + "completion_percentage": "PositiveIntegerField", + "approved": "BooleanField", + "approved_by": "ForeignKey", + "approved_date": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL", + "ProblemList" + ], + "lineno": 1105, + "file": "emr/models.py" + }, + { + "name": "ClinicalNote", + "fields": { + "encounter": "ForeignKey", + "patient": "ForeignKey", + "note_id": "UUIDField", + "note_type": "CharField", + "title": "CharField", + "content": "TextField", + "template": "ForeignKey", + "structured_data": "JSONField", + "author": "ForeignKey", + "co_signers": "ManyToManyField", + "status": "CharField", + "electronically_signed": "BooleanField", + "signed_datetime": "DateTimeField", + "signature_method": "CharField", + "amended_note": "ForeignKey", + "amendment_reason": "TextField", + "quality_score": "PositiveIntegerField", + "compliance_flags": "JSONField", + "note_datetime": "DateTimeField", + "confidential": "BooleanField", + "restricted_access": "BooleanField", + "access_restrictions": "JSONField", + "related_problems": "ManyToManyField", + "related_care_plans": "ManyToManyField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Encounter", + "patients.PatientProfile", + "NoteTemplate", + "settings.AUTH_USER_MODEL", + "self" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL", + "ProblemList", + "CarePlan" + ], + "lineno": 1514, + "file": "emr/models.py" + }, + { + "name": "NoteTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "note_type": "CharField", + "specialty": "CharField", + "template_content": "TextField", + "structured_fields": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "version": "CharField", + "previous_version": "ForeignKey", + "quality_indicators": "JSONField", + "compliance_requirements": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1753, + "file": "emr/models.py" + }, + { + "name": "Icd10", + "fields": { + "code": "CharField", + "description": "TextField", + "chapter_name": "CharField", + "section_name": "CharField", + "parent": "ForeignKey", + "is_header": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "self" + ], + "m2ms": [], + "lineno": 1929, + "file": "emr/models.py" + }, + { + "name": "ClinicalRecommendation", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "recommendation_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "category": "CharField", + "priority": "CharField", + "evidence_level": "CharField", + "source": "CharField", + "rationale": "TextField", + "status": "CharField", + "accepted_by": "ForeignKey", + "accepted_at": "DateTimeField", + "deferred_by": "ForeignKey", + "deferred_at": "DateTimeField", + "dismissed_by": "ForeignKey", + "dismissed_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "expires_at": "DateTimeField", + "related_problems": "ManyToManyField", + "related_encounter": "ForeignKey", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "ProblemList" + ], + "lineno": 1968, + "file": "emr/models.py" + }, + { + "name": "AllergyAlert", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "alert_id": "UUIDField", + "allergen": "CharField", + "reaction_type": "CharField", + "severity": "CharField", + "symptoms": "TextField", + "onset": "CharField", + "resolved": "BooleanField", + "resolved_at": "DateTimeField", + "resolved_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "detected_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2180, + "file": "emr/models.py" + }, + { + "name": "TreatmentProtocol", + "fields": { + "tenant": "ForeignKey", + "protocol_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "indication": "TextField", + "goals": "JSONField", + "interventions": "JSONField", + "monitoring_parameters": "JSONField", + "success_rate": "DecimalField", + "average_duration": "PositiveIntegerField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2287, + "file": "emr/models.py" + }, + { + "name": "ClinicalGuideline", + "fields": { + "tenant": "ForeignKey", + "guideline_id": "UUIDField", + "title": "CharField", + "organization": "CharField", + "summary": "TextField", + "url": "URLField", + "publication_date": "DateField", + "last_updated": "DateField", + "version": "CharField", + "is_active": "BooleanField", + "keywords": "JSONField", + "specialties": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant" + ], + "m2ms": [], + "lineno": 2386, + "file": "emr/models.py" + }, + { + "name": "CriticalAlert", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "alert_id": "UUIDField", + "title": "CharField", + "description": "TextField", + "priority": "CharField", + "recommendation": "TextField", + "acknowledged": "BooleanField", + "acknowledged_by": "ForeignKey", + "acknowledged_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "expires_at": "DateTimeField", + "related_encounter": "ForeignKey", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2480, + "file": "emr/models.py" + }, + { + "name": "DiagnosticSuggestion", + "fields": { + "tenant": "ForeignKey", + "patient": "ForeignKey", + "suggestion_id": "UUIDField", + "test_name": "CharField", + "test_code": "CharField", + "indication": "TextField", + "confidence": "DecimalField", + "status": "CharField", + "ordered_by": "ForeignKey", + "ordered_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 2619, + "file": "emr/models.py" + } + ], + "pharmacy": [ + { + "name": "Medication", + "fields": { + "tenant": "ForeignKey", + "medication_id": "UUIDField", + "generic_name": "CharField", + "brand_name": "CharField", + "ndc_number": "CharField", + "rxcui": "CharField", + "drug_class": "CharField", + "controlled_substance_schedule": "CharField", + "dosage_form": "CharField", + "strength": "CharField", + "unit_of_measure": "CharField", + "indications": "TextField", + "contraindications": "TextField", + "side_effects": "TextField", + "warnings": "TextField", + "adult_dose_range": "CharField", + "pediatric_dose_range": "CharField", + "max_daily_dose": "CharField", + "routes_of_administration": "JSONField", + "administration_instructions": "TextField", + "storage_requirements": "CharField", + "special_handling": "TextField", + "formulary_status": "CharField", + "is_active": "BooleanField", + "is_available": "BooleanField", + "unit_cost": "DecimalField", + "awp": "DecimalField", + "manufacturer": "CharField", + "manufacturer_ndc": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "pharmacy/models.py" + }, + { + "name": "Prescription", + "fields": { + "tenant": "ForeignKey", + "prescription_id": "UUIDField", + "prescription_number": "CharField", + "patient": "ForeignKey", + "prescriber": "ForeignKey", + "medication": "ForeignKey", + "quantity_prescribed": "PositiveIntegerField", + "quantity_unit": "CharField", + "dosage_instructions": "TextField", + "frequency": "CharField", + "duration": "CharField", + "refills_authorized": "PositiveIntegerField", + "refills_remaining": "PositiveIntegerField", + "date_prescribed": "DateTimeField", + "date_written": "DateField", + "expiration_date": "DateField", + "status": "CharField", + "indication": "CharField", + "diagnosis_code": "CharField", + "pharmacy_notes": "TextField", + "patient_instructions": "TextField", + "prior_authorization_required": "BooleanField", + "prior_authorization_number": "CharField", + "prior_authorization_expiry": "DateField", + "generic_substitution_allowed": "BooleanField", + "dispense_as_written": "BooleanField", + "electronic_prescription": "BooleanField", + "e_prescription_id": "CharField", + "encounter": "ForeignKey", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_datetime": "DateTimeField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "Medication", + "emr.Encounter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 295, + "file": "pharmacy/models.py" + }, + { + "name": "MedicationInventoryItem", + "fields": { + "tenant": "ForeignKey", + "medication": "ForeignKey", + "inventory_item": "ForeignKey", + "medication_inventory_id": "UUIDField", + "formulary_tier": "CharField", + "therapeutic_equivalent": "BooleanField", + "auto_substitution_allowed": "BooleanField", + "pharmacy_notes": "TextField", + "max_dispense_quantity": "PositiveIntegerField", + "requires_counseling": "BooleanField", + "requires_id_verification": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Medication", + "inventory.InventoryItem", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 661, + "file": "pharmacy/models.py" + }, + { + "name": "DispenseRecord", + "fields": { + "prescription": "ForeignKey", + "inventory_stock": "ForeignKey", + "dispense_id": "UUIDField", + "quantity_dispensed": "PositiveIntegerField", + "quantity_remaining": "PositiveIntegerField", + "date_dispensed": "DateTimeField", + "dispensed_by": "ForeignKey", + "verified_by": "ForeignKey", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "copay_amount": "DecimalField", + "insurance_amount": "DecimalField", + "patient_counseled": "BooleanField", + "counseling_notes": "TextField", + "is_refill": "BooleanField", + "refill_number": "PositiveIntegerField", + "status": "CharField", + "picked_up_by": "CharField", + "pickup_datetime": "DateTimeField", + "identification_verified": "BooleanField", + "quality_check_performed": "BooleanField", + "quality_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Prescription", + "inventory.InventoryStock", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 803, + "file": "pharmacy/models.py" + }, + { + "name": "MedicationAdministration", + "fields": { + "prescription": "ForeignKey", + "patient": "ForeignKey", + "encounter": "ForeignKey", + "administration_id": "UUIDField", + "scheduled_datetime": "DateTimeField", + "actual_datetime": "DateTimeField", + "dose_given": "CharField", + "route_given": "CharField", + "status": "CharField", + "administered_by": "ForeignKey", + "witnessed_by": "ForeignKey", + "reason_not_given": "CharField", + "reason_notes": "TextField", + "patient_response": "TextField", + "side_effects_observed": "TextField", + "injection_site": "CharField", + "site_condition": "CharField", + "double_checked": "BooleanField", + "double_checked_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Prescription", + "patients.PatientProfile", + "emr.Encounter", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1012, + "file": "pharmacy/models.py" + }, + { + "name": "DrugInteraction", + "fields": { + "tenant": "ForeignKey", + "medication_1": "ForeignKey", + "medication_2": "ForeignKey", + "interaction_id": "UUIDField", + "severity": "CharField", + "interaction_type": "CharField", + "mechanism": "TextField", + "clinical_effect": "TextField", + "management_recommendations": "TextField", + "monitoring_parameters": "TextField", + "evidence_level": "CharField", + "references": "TextField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Medication", + "Medication", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1220, + "file": "pharmacy/models.py" + } + ], + "laboratory": [ + { + "name": "LabTest", + "fields": { + "tenant": "ForeignKey", + "test_id": "UUIDField", + "test_code": "CharField", + "test_name": "CharField", + "test_description": "TextField", + "loinc_code": "CharField", + "cpt_code": "CharField", + "snomed_code": "CharField", + "test_category": "CharField", + "test_type": "CharField", + "specimen_type": "CharField", + "specimen_volume": "CharField", + "collection_container": "CharField", + "collection_instructions": "TextField", + "processing_time": "PositiveIntegerField", + "turnaround_time": "PositiveIntegerField", + "stat_available": "BooleanField", + "stat_turnaround_time": "PositiveIntegerField", + "storage_temperature": "CharField", + "transport_requirements": "TextField", + "stability_time": "PositiveIntegerField", + "clinical_significance": "TextField", + "indications": "TextField", + "contraindications": "TextField", + "patient_preparation": "TextField", + "fasting_required": "BooleanField", + "fasting_hours": "PositiveIntegerField", + "methodology": "CharField", + "analyzer": "CharField", + "qc_frequency": "CharField", + "cost": "DecimalField", + "is_active": "BooleanField", + "is_orderable": "BooleanField", + "department": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "laboratory/models.py" + }, + { + "name": "LabOrder", + "fields": { + "tenant": "ForeignKey", + "order_id": "UUIDField", + "order_number": "CharField", + "patient": "ForeignKey", + "ordering_provider": "ForeignKey", + "tests": "ManyToManyField", + "scheduled_collection": "DateTimeField", + "order_datetime": "DateTimeField", + "priority": "CharField", + "clinical_indication": "TextField", + "diagnosis_code": "CharField", + "clinical_notes": "TextField", + "collection_datetime": "DateTimeField", + "collection_location": "CharField", + "fasting_status": "CharField", + "status": "CharField", + "encounter": "ForeignKey", + "special_instructions": "TextField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "emr.Encounter" + ], + "m2ms": [ + "LabTest" + ], + "lineno": 332, + "file": "laboratory/models.py" + }, + { + "name": "Specimen", + "fields": { + "order": "ForeignKey", + "specimen_id": "UUIDField", + "specimen_number": "CharField", + "specimen_type": "CharField", + "container_type": "CharField", + "volume": "CharField", + "collected_datetime": "DateTimeField", + "collected_by": "ForeignKey", + "collection_site": "CharField", + "collection_method": "CharField", + "quality": "CharField", + "rejection_reason": "CharField", + "quality_notes": "TextField", + "received_datetime": "DateTimeField", + "received_by": "ForeignKey", + "storage_location": "CharField", + "storage_temperature": "CharField", + "status": "CharField", + "chain_of_custody": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "LabOrder", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 586, + "file": "laboratory/models.py" + }, + { + "name": "LabResult", + "fields": { + "order": "ForeignKey", + "test": "ForeignKey", + "specimen": "ForeignKey", + "result_id": "UUIDField", + "result_value": "TextField", + "result_unit": "CharField", + "result_type": "CharField", + "reference_range": "CharField", + "abnormal_flag": "CharField", + "is_critical": "BooleanField", + "critical_called": "BooleanField", + "critical_called_datetime": "DateTimeField", + "critical_called_to": "CharField", + "analyzed_datetime": "DateTimeField", + "analyzed_by": "ForeignKey", + "analyzer": "CharField", + "verified": "BooleanField", + "verified_by": "ForeignKey", + "verified_datetime": "DateTimeField", + "status": "CharField", + "technician_comments": "TextField", + "pathologist_comments": "TextField", + "qc_passed": "BooleanField", + "qc_notes": "TextField", + "reported_datetime": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "LabOrder", + "LabTest", + "Specimen", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 821, + "file": "laboratory/models.py" + }, + { + "name": "QualityControl", + "fields": { + "tenant": "ForeignKey", + "test": "ForeignKey", + "result": "ForeignKey", + "qc_id": "UUIDField", + "control_material": "CharField", + "control_lot": "CharField", + "control_level": "CharField", + "target_value": "DecimalField", + "acceptable_range_low": "DecimalField", + "acceptable_range_high": "DecimalField", + "run_datetime": "DateTimeField", + "observed_value": "DecimalField", + "status": "CharField", + "performed_by": "ForeignKey", + "reviewed_by": "ForeignKey", + "analyzer": "CharField", + "comments": "TextField", + "corrective_action": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "LabTest", + "LabResult", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1060, + "file": "laboratory/models.py" + }, + { + "name": "ReferenceRange", + "fields": { + "test": "ForeignKey", + "range_id": "UUIDField", + "gender": "CharField", + "age_min": "PositiveIntegerField", + "age_max": "PositiveIntegerField", + "range_low": "DecimalField", + "range_high": "DecimalField", + "range_text": "CharField", + "critical_low": "DecimalField", + "critical_high": "DecimalField", + "unit": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "LabTest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1234, + "file": "laboratory/models.py" + } + ], + "radiology": [ + { + "name": "ImagingStudy", + "fields": { + "tenant": "ForeignKey", + "study_id": "UUIDField", + "study_instance_uid": "CharField", + "accession_number": "CharField", + "patient": "ForeignKey", + "referring_physician": "ForeignKey", + "radiologist": "ForeignKey", + "modality": "CharField", + "study_description": "CharField", + "body_part": "CharField", + "scheduled_datetime": "DateTimeField", + "study_datetime": "DateTimeField", + "arrived_datetime": "DateTimeField", + "started_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "interpreted_datetime": "DateTimeField", + "finalized_datetime": "DateTimeField", + "clinical_indication": "TextField", + "clinical_history": "TextField", + "diagnosis_code": "CharField", + "status": "CharField", + "priority": "CharField", + "kvp": "FloatField", + "mas": "FloatField", + "exposure_time": "FloatField", + "slice_thickness": "FloatField", + "station_name": "CharField", + "manufacturer": "CharField", + "model_name": "CharField", + "number_of_series": "PositiveIntegerField", + "number_of_instances": "PositiveIntegerField", + "study_size": "BigIntegerField", + "image_quality": "CharField", + "completion_status": "CharField", + "encounter": "ForeignKey", + "imaging_order": "ForeignKey", + "pacs_location": "CharField", + "archived": "BooleanField", + "archive_location": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "objects": "ImagingStudyManager" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "ImagingOrder", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 24, + "file": "radiology/models.py" + }, + { + "name": "ImagingSeries", + "fields": { + "study": "ForeignKey", + "series_id": "UUIDField", + "series_instance_uid": "CharField", + "series_number": "PositiveIntegerField", + "modality": "CharField", + "series_description": "CharField", + "protocol_name": "CharField", + "series_datetime": "DateTimeField", + "started_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "processed_datetime": "DateTimeField", + "archived_datetime": "DateTimeField", + "slice_thickness": "FloatField", + "spacing_between_slices": "FloatField", + "pixel_spacing": "CharField", + "image_orientation": "CharField", + "number_of_instances": "PositiveIntegerField", + "series_size": "BigIntegerField", + "body_part": "CharField", + "patient_position": "CharField", + "contrast_agent": "CharField", + "contrast_route": "CharField", + "image_quality": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "ImagingSeriesManager" + }, + "fks": [ + "ImagingStudy" + ], + "m2ms": [], + "lineno": 468, + "file": "radiology/models.py" + }, + { + "name": "DICOMImage", + "fields": { + "series": "ForeignKey", + "image_id": "UUIDField", + "sop_instance_uid": "CharField", + "instance_number": "PositiveIntegerField", + "image_type": "CharField", + "sop_class_uid": "CharField", + "rows": "PositiveIntegerField", + "columns": "PositiveIntegerField", + "bits_allocated": "PositiveIntegerField", + "bits_stored": "PositiveIntegerField", + "image_position": "CharField", + "image_orientation": "CharField", + "slice_location": "FloatField", + "window_center": "FloatField", + "window_width": "FloatField", + "file_path": "CharField", + "file_size": "BigIntegerField", + "transfer_syntax_uid": "CharField", + "content_date": "DateField", + "content_time": "TimeField", + "acquisition_datetime": "DateTimeField", + "processed_datetime": "DateTimeField", + "quality_checked_datetime": "DateTimeField", + "archived_datetime": "DateTimeField", + "image_quality": "CharField", + "processed": "BooleanField", + "archived": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "DICOMImageManager" + }, + "fks": [ + "ImagingSeries" + ], + "m2ms": [], + "lineno": 676, + "file": "radiology/models.py" + }, + { + "name": "RadiologyReport", + "fields": { + "study": "OneToOneField", + "report_id": "UUIDField", + "radiologist": "ForeignKey", + "dictated_by": "ForeignKey", + "transcribed_by": "ForeignKey", + "clinical_history": "TextField", + "technique": "TextField", + "findings": "TextField", + "impression": "TextField", + "recommendations": "TextField", + "status": "CharField", + "critical_finding": "BooleanField", + "critical_communicated": "BooleanField", + "critical_communicated_to": "ForeignKey", + "critical_communicated_datetime": "DateTimeField", + "dictated_datetime": "DateTimeField", + "transcribed_datetime": "DateTimeField", + "verified_datetime": "DateTimeField", + "finalized_datetime": "DateTimeField", + "template_used": "ForeignKey", + "structured_data": "JSONField", + "report_length": "PositiveIntegerField", + "turnaround_time": "PositiveIntegerField", + "addendum": "TextField", + "addendum_datetime": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "RadiologyReportManager" + }, + "fks": [ + "ImagingStudy", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "ReportTemplate" + ], + "m2ms": [], + "lineno": 923, + "file": "radiology/models.py" + }, + { + "name": "ReportTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "modality": "CharField", + "body_part": "CharField", + "clinical_history_template": "TextField", + "technique_template": "TextField", + "findings_template": "TextField", + "impression_template": "TextField", + "recommendations_template": "TextField", + "structured_fields": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "objects": "ReportTemplateManager" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1151, + "file": "radiology/models.py" + }, + { + "name": "ImagingOrder", + "fields": { + "tenant": "ForeignKey", + "order_id": "UUIDField", + "order_number": "CharField", + "patient": "ForeignKey", + "ordering_provider": "ForeignKey", + "order_datetime": "DateTimeField", + "priority": "CharField", + "modality": "CharField", + "study_description": "CharField", + "body_part": "CharField", + "clinical_indication": "TextField", + "clinical_history": "TextField", + "diagnosis_code": "CharField", + "contrast_required": "BooleanField", + "contrast_type": "CharField", + "contrast_route": "CharField", + "requested_datetime": "DateTimeField", + "approved_datetime": "DateTimeField", + "scheduled_datetime": "DateTimeField", + "cancelled_datetime": "DateTimeField", + "completed_datetime": "DateTimeField", + "status": "CharField", + "encounter": "ForeignKey", + "special_instructions": "TextField", + "patient_preparation": "TextField", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "objects": "ImagingOrderManager" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "emr.Encounter" + ], + "m2ms": [], + "lineno": 1310, + "file": "radiology/models.py" + } + ], + "operating_theatre": [ + { + "name": "OperatingRoom", + "fields": { + "tenant": "ForeignKey", + "room_id": "UUIDField", + "room_number": "CharField", + "room_name": "CharField", + "room_type": "CharField", + "status": "CharField", + "floor_number": "PositiveIntegerField", + "room_size": "FloatField", + "ceiling_height": "FloatField", + "temperature_min": "FloatField", + "temperature_max": "FloatField", + "humidity_min": "FloatField", + "humidity_max": "FloatField", + "air_changes_per_hour": "PositiveIntegerField", + "positive_pressure": "BooleanField", + "equipment_list": "JSONField", + "special_features": "JSONField", + "has_c_arm": "BooleanField", + "has_ct": "BooleanField", + "has_mri": "BooleanField", + "has_ultrasound": "BooleanField", + "has_neuromonitoring": "BooleanField", + "supports_robotic": "BooleanField", + "supports_laparoscopic": "BooleanField", + "supports_microscopy": "BooleanField", + "supports_laser": "BooleanField", + "max_case_duration": "PositiveIntegerField", + "turnover_time": "PositiveIntegerField", + "cleaning_time": "PositiveIntegerField", + "required_nurses": "PositiveIntegerField", + "required_techs": "PositiveIntegerField", + "is_active": "BooleanField", + "accepts_emergency": "BooleanField", + "building": "CharField", + "wing": "CharField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "operating_theatre/models.py" + }, + { + "name": "ORBlock", + "fields": { + "operating_room": "ForeignKey", + "block_id": "UUIDField", + "date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "block_type": "CharField", + "primary_surgeon": "ForeignKey", + "assistant_surgeons": "ManyToManyField", + "service": "CharField", + "status": "CharField", + "allocated_minutes": "PositiveIntegerField", + "used_minutes": "PositiveIntegerField", + "special_equipment": "JSONField", + "special_setup": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "OperatingRoom", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 286, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalCase", + "fields": { + "or_block": "ForeignKey", + "case_id": "UUIDField", + "case_number": "CharField", + "patient": "ForeignKey", + "primary_surgeon": "ForeignKey", + "assistant_surgeons": "ManyToManyField", + "anesthesiologist": "ForeignKey", + "circulating_nurse": "ForeignKey", + "scrub_nurse": "ForeignKey", + "primary_procedure": "CharField", + "secondary_procedures": "JSONField", + "procedure_codes": "JSONField", + "case_type": "CharField", + "approach": "CharField", + "anesthesia_type": "CharField", + "scheduled_start": "DateTimeField", + "estimated_duration": "PositiveIntegerField", + "actual_start": "DateTimeField", + "actual_end": "DateTimeField", + "status": "CharField", + "diagnosis": "CharField", + "diagnosis_codes": "JSONField", + "clinical_notes": "TextField", + "special_equipment": "JSONField", + "blood_products": "JSONField", + "implants": "JSONField", + "patient_position": "CharField", + "complications": "JSONField", + "estimated_blood_loss": "PositiveIntegerField", + "encounter": "ForeignKey", + "admission": "ForeignKey", + "approval_requests": "GenericRelation", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ORBlock", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "inpatients.Admission", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 471, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalNote", + "fields": { + "surgical_case": "OneToOneField", + "note_id": "UUIDField", + "surgeon": "ForeignKey", + "preoperative_diagnosis": "TextField", + "planned_procedure": "TextField", + "indication": "TextField", + "procedure_performed": "TextField", + "surgical_approach": "TextField", + "findings": "TextField", + "technique": "TextField", + "postoperative_diagnosis": "TextField", + "condition": "CharField", + "disposition": "CharField", + "complications": "TextField", + "estimated_blood_loss": "PositiveIntegerField", + "blood_transfusion": "TextField", + "specimens": "TextField", + "implants": "TextField", + "drains": "TextField", + "closure": "TextField", + "postop_instructions": "TextField", + "follow_up": "TextField", + "status": "CharField", + "signed_datetime": "DateTimeField", + "template_used": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "SurgicalCase", + "settings.AUTH_USER_MODEL", + "SurgicalNoteTemplate" + ], + "m2ms": [], + "lineno": 862, + "file": "operating_theatre/models.py" + }, + { + "name": "EquipmentUsage", + "fields": { + "surgical_case": "ForeignKey", + "usage_id": "UUIDField", + "equipment_name": "CharField", + "equipment_type": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "quantity_used": "PositiveIntegerField", + "unit_of_measure": "CharField", + "start_time": "DateTimeField", + "end_time": "DateTimeField", + "unit_cost": "DecimalField", + "total_cost": "DecimalField", + "lot_number": "CharField", + "expiration_date": "DateField", + "sterilization_date": "DateField", + "notes": "TextField", + "recorded_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "SurgicalCase", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1068, + "file": "operating_theatre/models.py" + }, + { + "name": "SurgicalNoteTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "procedure_type": "CharField", + "specialty": "CharField", + "preoperative_diagnosis_template": "TextField", + "planned_procedure_template": "TextField", + "indication_template": "TextField", + "procedure_performed_template": "TextField", + "surgical_approach_template": "TextField", + "findings_template": "TextField", + "technique_template": "TextField", + "postoperative_diagnosis_template": "TextField", + "complications_template": "TextField", + "specimens_template": "TextField", + "implants_template": "TextField", + "closure_template": "TextField", + "postop_instructions_template": "TextField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1262, + "file": "operating_theatre/models.py" + } + ], + "billing": [ + { + "name": "MedicalBill", + "fields": { + "tenant": "ForeignKey", + "bill_id": "UUIDField", + "bill_number": "CharField", + "patient": "ForeignKey", + "bill_type": "CharField", + "service_date_from": "DateField", + "service_date_to": "DateField", + "bill_date": "DateField", + "due_date": "DateField", + "subtotal": "DecimalField", + "tax_amount": "DecimalField", + "discount_amount": "DecimalField", + "adjustment_amount": "DecimalField", + "total_amount": "DecimalField", + "paid_amount": "DecimalField", + "balance_amount": "DecimalField", + "primary_insurance": "ForeignKey", + "secondary_insurance": "ForeignKey", + "status": "CharField", + "attending_provider": "ForeignKey", + "billing_provider": "ForeignKey", + "encounter": "ForeignKey", + "admission": "ForeignKey", + "notes": "TextField", + "payment_terms": "CharField", + "collection_status": "CharField", + "last_statement_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "patients.InsuranceInfo", + "patients.InsuranceInfo", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "emr.Encounter", + "inpatients.Admission", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 17, + "file": "billing/models.py" + }, + { + "name": "BillLineItem", + "fields": { + "medical_bill": "ForeignKey", + "line_item_id": "UUIDField", + "line_number": "PositiveIntegerField", + "service_date": "DateField", + "service_code": "CharField", + "service_description": "CharField", + "service_category": "CharField", + "quantity": "DecimalField", + "unit_of_measure": "CharField", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "modifier_1": "CharField", + "modifier_2": "CharField", + "modifier_3": "CharField", + "modifier_4": "CharField", + "primary_diagnosis": "CharField", + "secondary_diagnoses": "JSONField", + "rendering_provider": "ForeignKey", + "supervising_provider": "ForeignKey", + "place_of_service": "IntegerField", + "revenue_code": "CharField", + "ndc_code": "CharField", + "drug_quantity": "DecimalField", + "drug_unit": "CharField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "MedicalBill", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 321, + "file": "billing/models.py" + }, + { + "name": "InsuranceClaim", + "fields": { + "medical_bill": "ForeignKey", + "claim_id": "UUIDField", + "claim_number": "CharField", + "insurance_info": "ForeignKey", + "claim_type": "CharField", + "submission_date": "DateField", + "service_date_from": "DateField", + "service_date_to": "DateField", + "billed_amount": "DecimalField", + "allowed_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "deductible_amount": "DecimalField", + "coinsurance_amount": "DecimalField", + "copay_amount": "DecimalField", + "status": "CharField", + "clearinghouse": "CharField", + "batch_number": "CharField", + "response_date": "DateField", + "check_number": "CharField", + "check_date": "DateField", + "denial_reason": "CharField", + "denial_code": "CharField", + "prior_auth_number": "CharField", + "notes": "TextField", + "original_claim": "ForeignKey", + "resubmission_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "MedicalBill", + "patients.InsuranceInfo", + "self", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 606, + "file": "billing/models.py" + }, + { + "name": "Payment", + "fields": { + "medical_bill": "ForeignKey", + "payment_id": "UUIDField", + "payment_number": "CharField", + "payment_date": "DateField", + "payment_amount": "DecimalField", + "payment_method": "CharField", + "payment_source": "CharField", + "check_number": "CharField", + "bank_name": "CharField", + "routing_number": "CharField", + "card_type": "CharField", + "card_last_four": "CharField", + "authorization_code": "CharField", + "transaction_id": "CharField", + "insurance_claim": "ForeignKey", + "eob_number": "CharField", + "status": "CharField", + "deposit_date": "DateField", + "deposit_slip": "CharField", + "notes": "TextField", + "refund_amount": "DecimalField", + "refund_date": "DateField", + "refund_reason": "CharField", + "received_by": "ForeignKey", + "processed_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "MedicalBill", + "InsuranceClaim", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 883, + "file": "billing/models.py" + }, + { + "name": "ClaimStatusUpdate", + "fields": { + "insurance_claim": "ForeignKey", + "update_id": "UUIDField", + "previous_status": "CharField", + "new_status": "CharField", + "status_date": "DateTimeField", + "update_source": "CharField", + "response_code": "CharField", + "response_message": "TextField", + "allowed_amount": "DecimalField", + "paid_amount": "DecimalField", + "patient_responsibility": "DecimalField", + "notes": "TextField", + "updated_by": "ForeignKey", + "created_at": "DateTimeField" + }, + "fks": [ + "InsuranceClaim", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1160, + "file": "billing/models.py" + }, + { + "name": "BillingConfiguration", + "fields": { + "tenant": "OneToOneField", + "config_id": "UUIDField", + "default_payment_terms": "CharField", + "tax_rate": "DecimalField", + "tax_exempt": "BooleanField", + "statement_frequency": "CharField", + "statement_message": "TextField", + "first_notice_days": "PositiveIntegerField", + "second_notice_days": "PositiveIntegerField", + "final_notice_days": "PositiveIntegerField", + "collections_days": "PositiveIntegerField", + "apply_interest": "BooleanField", + "interest_rate": "DecimalField", + "accept_credit_cards": "BooleanField", + "accept_ach": "BooleanField", + "payment_portal_enabled": "BooleanField", + "auto_submit_claims": "BooleanField", + "claim_submission_frequency": "CharField", + "primary_clearinghouse": "CharField", + "secondary_clearinghouse": "CharField", + "aging_buckets": "JSONField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1297, + "file": "billing/models.py" + } + ], + "inventory": [ + { + "name": "InventoryItem", + "fields": { + "tenant": "ForeignKey", + "item_id": "UUIDField", + "item_code": "CharField", + "item_name": "CharField", + "description": "TextField", + "category": "CharField", + "subcategory": "CharField", + "item_type": "CharField", + "manufacturer": "CharField", + "model_number": "CharField", + "part_number": "CharField", + "upc_code": "CharField", + "ndc_code": "CharField", + "gtin_code": "CharField", + "unit_of_measure": "CharField", + "package_size": "PositiveIntegerField", + "package_type": "CharField", + "unit_cost": "DecimalField", + "list_price": "DecimalField", + "storage_temperature_min": "DecimalField", + "storage_temperature_max": "DecimalField", + "storage_humidity_min": "PositiveIntegerField", + "storage_humidity_max": "PositiveIntegerField", + "storage_requirements": "TextField", + "has_expiration": "BooleanField", + "shelf_life_days": "PositiveIntegerField", + "fda_approved": "BooleanField", + "controlled_substance": "BooleanField", + "dea_schedule": "CharField", + "is_active": "BooleanField", + "is_tracked": "BooleanField", + "is_serialized": "BooleanField", + "is_lot_tracked": "BooleanField", + "reorder_point": "PositiveIntegerField", + "reorder_quantity": "PositiveIntegerField", + "min_stock_level": "PositiveIntegerField", + "max_stock_level": "PositiveIntegerField", + "primary_supplier": "ForeignKey", + "clinical_use": "TextField", + "contraindications": "TextField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Supplier", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 16, + "file": "inventory/models.py" + }, + { + "name": "InventoryStock", + "fields": { + "inventory_item": "ForeignKey", + "location": "ForeignKey", + "stock_id": "UUIDField", + "lot_number": "CharField", + "serial_number": "CharField", + "quantity_on_hand": "PositiveIntegerField", + "quantity_reserved": "PositiveIntegerField", + "quantity_available": "PositiveIntegerField", + "received_date": "DateField", + "expiration_date": "DateField", + "unit_cost": "DecimalField", + "total_cost": "DecimalField", + "quality_status": "CharField", + "supplier": "ForeignKey", + "purchase_order": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "InventoryItem", + "InventoryLocation", + "Supplier", + "PurchaseOrder" + ], + "m2ms": [], + "lineno": 384, + "file": "inventory/models.py" + }, + { + "name": "InventoryLocation", + "fields": { + "tenant": "ForeignKey", + "location_id": "UUIDField", + "location_code": "CharField", + "name": "CharField", + "description": "TextField", + "location_type": "CharField", + "building": "CharField", + "floor": "CharField", + "room": "CharField", + "zone": "CharField", + "aisle": "CharField", + "shelf": "CharField", + "bin": "CharField", + "capacity_cubic_feet": "DecimalField", + "max_weight_pounds": "DecimalField", + "temperature_controlled": "BooleanField", + "temperature_min": "DecimalField", + "temperature_max": "DecimalField", + "humidity_controlled": "BooleanField", + "humidity_min": "PositiveIntegerField", + "humidity_max": "PositiveIntegerField", + "secure_location": "BooleanField", + "access_control": "CharField", + "is_active": "BooleanField", + "parent_location": "ForeignKey", + "location_manager": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 562, + "file": "inventory/models.py" + }, + { + "name": "PurchaseOrder", + "fields": { + "tenant": "ForeignKey", + "po_id": "UUIDField", + "po_number": "CharField", + "supplier": "ForeignKey", + "order_date": "DateField", + "requested_delivery_date": "DateField", + "promised_delivery_date": "DateField", + "actual_delivery_date": "DateField", + "order_type": "CharField", + "priority": "CharField", + "subtotal": "DecimalField", + "tax_amount": "DecimalField", + "shipping_amount": "DecimalField", + "total_amount": "DecimalField", + "status": "CharField", + "delivery_location": "ForeignKey", + "delivery_instructions": "TextField", + "payment_terms": "CharField", + "requested_by": "ForeignKey", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Supplier", + "InventoryLocation", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 819, + "file": "inventory/models.py" + }, + { + "name": "PurchaseOrderItem", + "fields": { + "purchase_order": "ForeignKey", + "item_id": "UUIDField", + "line_number": "PositiveIntegerField", + "inventory_item": "ForeignKey", + "quantity_ordered": "PositiveIntegerField", + "quantity_received": "PositiveIntegerField", + "quantity_remaining": "PositiveIntegerField", + "unit_price": "DecimalField", + "total_price": "DecimalField", + "requested_delivery_date": "DateField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "PurchaseOrder", + "InventoryItem" + ], + "m2ms": [], + "lineno": 1080, + "file": "inventory/models.py" + }, + { + "name": "Supplier", + "fields": { + "tenant": "ForeignKey", + "supplier_id": "UUIDField", + "supplier_code": "CharField", + "name": "CharField", + "supplier_type": "CharField", + "contact_person": "CharField", + "phone": "CharField", + "email": "EmailField", + "website": "URLField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "state": "CharField", + "postal_code": "CharField", + "country": "CharField", + "tax_id": "CharField", + "duns_number": "CharField", + "payment_terms": "CharField", + "performance_rating": "DecimalField", + "on_time_delivery_rate": "DecimalField", + "quality_rating": "DecimalField", + "is_active": "BooleanField", + "is_preferred": "BooleanField", + "certifications": "JSONField", + "contract_start_date": "DateField", + "contract_end_date": "DateField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1208, + "file": "inventory/models.py" + } + ], + "hr": [ + { + "name": "Employee", + "fields": { + "tenant": "ForeignKey", + "user": "OneToOneField", + "employee_id": "CharField", + "identification_number": "CharField", + "id_type": "CharField", + "first_name": "CharField", + "father_name": "CharField", + "grandfather_name": "CharField", + "last_name": "CharField", + "e164_ksa_regex": "RegexValidator", + "email": "EmailField", + "phone": "CharField", + "mobile_phone": "CharField", + "address_line_1": "CharField", + "address_line_2": "CharField", + "city": "CharField", + "postal_code": "CharField", + "country": "CharField", + "date_of_birth": "DateField", + "gender": "CharField", + "marital_status": "CharField", + "user_timezone": "CharField", + "language": "CharField", + "theme": "CharField", + "role": "CharField", + "department": "ForeignKey", + "job_title": "CharField", + "license_number": "CharField", + "license_expiry_date": "DateField", + "license_state": "CharField", + "dea_number": "CharField", + "npi_number": "CharField", + "employment_status": "CharField", + "employment_type": "CharField", + "hire_date": "DateField", + "termination_date": "DateField", + "supervisor": "ForeignKey", + "hourly_rate": "DecimalField", + "standard_hours_per_week": "DecimalField", + "annual_salary": "DecimalField", + "fte_percentage": "DecimalField", + "profile_picture": "ImageField", + "bio": "TextField", + "emergency_contact_name": "CharField", + "emergency_contact_relationship": "CharField", + "emergency_contact_phone": "CharField", + "notes": "TextField", + "is_verified": "BooleanField", + "is_approved": "BooleanField", + "approval_date": "DateTimeField", + "approved_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "hr.Department", + "self", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 19, + "file": "hr/models.py" + }, + { + "name": "Department", + "fields": { + "tenant": "ForeignKey", + "department_id": "UUIDField", + "code": "CharField", + "name": "CharField", + "description": "TextField", + "department_type": "CharField", + "parent_department": "ForeignKey", + "department_head": "ForeignKey", + "phone": "CharField", + "extension": "CharField", + "email": "EmailField", + "annual_budget": "DecimalField", + "cost_center": "CharField", + "authorized_positions": "PositiveIntegerField", + "location": "CharField", + "is_active": "BooleanField", + "is_24_hour": "BooleanField", + "operating_hours": "JSONField", + "accreditation_required": "BooleanField", + "accreditation_body": "CharField", + "last_inspection_date": "DateField", + "next_inspection_date": "DateField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "self", + "Employee", + "hr.Employee" + ], + "m2ms": [], + "lineno": 250, + "file": "hr/models.py" + }, + { + "name": "Schedule", + "fields": { + "employee": "ForeignKey", + "schedule_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "schedule_type": "CharField", + "effective_date": "DateField", + "end_date": "DateField", + "schedule_pattern": "JSONField", + "is_active": "BooleanField", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Employee", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 471, + "file": "hr/models.py" + }, + { + "name": "ScheduleAssignment", + "fields": { + "schedule": "ForeignKey", + "assignment_id": "UUIDField", + "assignment_date": "DateField", + "start_time": "TimeField", + "end_time": "TimeField", + "shift_type": "CharField", + "department": "ForeignKey", + "location": "CharField", + "status": "CharField", + "break_minutes": "PositiveIntegerField", + "lunch_minutes": "PositiveIntegerField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Schedule", + "Department" + ], + "m2ms": [], + "lineno": 603, + "file": "hr/models.py" + }, + { + "name": "TimeEntry", + "fields": { + "employee": "ForeignKey", + "entry_id": "UUIDField", + "work_date": "DateField", + "clock_in_time": "DateTimeField", + "clock_out_time": "DateTimeField", + "break_start_time": "DateTimeField", + "break_end_time": "DateTimeField", + "lunch_start_time": "DateTimeField", + "lunch_end_time": "DateTimeField", + "regular_hours": "DecimalField", + "overtime_hours": "DecimalField", + "total_hours": "DecimalField", + "entry_type": "CharField", + "department": "ForeignKey", + "location": "CharField", + "approved_by": "ForeignKey", + "approval_date": "DateTimeField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Employee", + "Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 750, + "file": "hr/models.py" + }, + { + "name": "PerformanceReview", + "fields": { + "employee": "ForeignKey", + "review_id": "UUIDField", + "review_period_start": "DateField", + "review_period_end": "DateField", + "review_date": "DateField", + "review_type": "CharField", + "reviewer": "ForeignKey", + "overall_rating": "DecimalField", + "competency_ratings": "JSONField", + "goals_achieved": "TextField", + "goals_not_achieved": "TextField", + "future_goals": "TextField", + "strengths": "TextField", + "areas_for_improvement": "TextField", + "development_plan": "TextField", + "training_recommendations": "TextField", + "employee_comments": "TextField", + "employee_signature_date": "DateField", + "status": "CharField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 962, + "file": "hr/models.py" + }, + { + "name": "TrainingPrograms", + "fields": { + "tenant": "ForeignKey", + "program_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "program_type": "CharField", + "program_provider": "CharField", + "instructor": "ForeignKey", + "start_date": "DateField", + "end_date": "DateField", + "duration_hours": "DecimalField", + "cost": "DecimalField", + "is_certified": "BooleanField", + "validity_days": "PositiveIntegerField", + "notify_before_days": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1139, + "file": "hr/models.py" + }, + { + "name": "ProgramModule", + "fields": { + "program": "ForeignKey", + "title": "CharField", + "order": "PositiveIntegerField", + "hours": "DecimalField" + }, + "fks": [ + "TrainingPrograms" + ], + "m2ms": [], + "lineno": 1203, + "file": "hr/models.py" + }, + { + "name": "ProgramPrerequisite", + "fields": { + "program": "ForeignKey", + "required_program": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "TrainingPrograms" + ], + "m2ms": [], + "lineno": 1220, + "file": "hr/models.py" + }, + { + "name": "TrainingSession", + "fields": { + "session_id": "UUIDField", + "program": "ForeignKey", + "title": "CharField", + "instructor": "ForeignKey", + "delivery_method": "CharField", + "start_at": "DateTimeField", + "end_at": "DateTimeField", + "location": "CharField", + "capacity": "PositiveIntegerField", + "cost_override": "DecimalField", + "hours_override": "DecimalField", + "created_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "Employee", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1238, + "file": "hr/models.py" + }, + { + "name": "TrainingRecord", + "fields": { + "record_id": "UUIDField", + "employee": "ForeignKey", + "program": "ForeignKey", + "session": "ForeignKey", + "enrolled_at": "DateTimeField", + "started_at": "DateTimeField", + "completion_date": "DateField", + "expiry_date": "DateField", + "status": "CharField", + "credits_earned": "DecimalField", + "score": "DecimalField", + "passed": "BooleanField", + "notes": "TextField", + "cost_paid": "DecimalField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Employee", + "TrainingPrograms", + "TrainingSession", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1281, + "file": "hr/models.py" + }, + { + "name": "TrainingAttendance", + "fields": { + "enrollment": "ForeignKey", + "checked_in_at": "DateTimeField", + "checked_out_at": "DateTimeField", + "status": "CharField", + "notes": "CharField" + }, + "fks": [ + "TrainingRecord" + ], + "m2ms": [], + "lineno": 1382, + "file": "hr/models.py" + }, + { + "name": "TrainingAssessment", + "fields": { + "enrollment": "ForeignKey", + "name": "CharField", + "max_score": "DecimalField", + "score": "DecimalField", + "passed": "BooleanField", + "taken_at": "DateTimeField", + "notes": "TextField" + }, + "fks": [ + "TrainingRecord" + ], + "m2ms": [], + "lineno": 1406, + "file": "hr/models.py" + }, + { + "name": "TrainingCertificates", + "fields": { + "certificate_id": "UUIDField", + "program": "ForeignKey", + "employee": "ForeignKey", + "enrollment": "OneToOneField", + "certificate_name": "CharField", + "certificate_number": "CharField", + "certification_body": "CharField", + "issued_date": "DateField", + "expiry_date": "DateField", + "file": "FileField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey", + "signed_by": "ForeignKey" + }, + "fks": [ + "TrainingPrograms", + "Employee", + "TrainingRecord", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 1424, + "file": "hr/models.py" + } + ], + "analytics": [ + { + "name": "Dashboard", + "fields": { + "dashboard_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "dashboard_type": "CharField", + "layout_config": "JSONField", + "refresh_interval": "PositiveIntegerField", + "is_public": "BooleanField", + "allowed_users": "ManyToManyField", + "allowed_roles": "JSONField", + "is_active": "BooleanField", + "is_default": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "User" + ], + "m2ms": [ + "User" + ], + "lineno": 16, + "file": "analytics/models.py" + }, + { + "name": "DashboardWidget", + "fields": { + "widget_id": "UUIDField", + "dashboard": "ForeignKey", + "name": "CharField", + "description": "TextField", + "widget_type": "CharField", + "chart_type": "CharField", + "data_source": "ForeignKey", + "query_config": "JSONField", + "position_x": "PositiveIntegerField", + "position_y": "PositiveIntegerField", + "width": "PositiveIntegerField", + "height": "PositiveIntegerField", + "display_config": "JSONField", + "color_scheme": "CharField", + "auto_refresh": "BooleanField", + "refresh_interval": "PositiveIntegerField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Dashboard", + "DataSource" + ], + "m2ms": [], + "lineno": 69, + "file": "analytics/models.py" + }, + { + "name": "DataSource", + "fields": { + "source_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "source_type": "CharField", + "connection_type": "CharField", + "connection_config": "JSONField", + "authentication_config": "JSONField", + "query_template": "TextField", + "parameters": "JSONField", + "data_transformation": "JSONField", + "cache_duration": "PositiveIntegerField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "is_active": "BooleanField", + "last_test_status": "CharField", + "last_test_start_at": "DateTimeField", + "last_test_end_at": "DateTimeField", + "last_test_duration_seconds": "PositiveIntegerField", + "last_test_error_message": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "User" + ], + "m2ms": [], + "lineno": 143, + "file": "analytics/models.py" + }, + { + "name": "Report", + "fields": { + "report_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "report_type": "CharField", + "data_source": "ForeignKey", + "query_config": "JSONField", + "output_format": "CharField", + "template_config": "JSONField", + "schedule_type": "CharField", + "schedule_config": "JSONField", + "next_execution": "DateTimeField", + "recipients": "JSONField", + "distribution_config": "JSONField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "DataSource", + "User" + ], + "m2ms": [], + "lineno": 227, + "file": "analytics/models.py" + }, + { + "name": "ReportExecution", + "fields": { + "execution_id": "UUIDField", + "report": "ForeignKey", + "execution_type": "CharField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "duration_seconds": "PositiveIntegerField", + "status": "CharField", + "error_message": "TextField", + "output_file_path": "CharField", + "output_size_bytes": "PositiveBigIntegerField", + "record_count": "PositiveIntegerField", + "execution_parameters": "JSONField", + "executed_by": "ForeignKey" + }, + "fks": [ + "Report", + "User" + ], + "m2ms": [], + "lineno": 305, + "file": "analytics/models.py" + }, + { + "name": "MetricDefinition", + "fields": { + "metric_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "metric_type": "CharField", + "data_source": "ForeignKey", + "calculation_config": "JSONField", + "aggregation_period": "CharField", + "aggregation_config": "JSONField", + "target_value": "DecimalField", + "warning_threshold": "DecimalField", + "critical_threshold": "DecimalField", + "unit_of_measure": "CharField", + "decimal_places": "PositiveIntegerField", + "display_format": "CharField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "DataSource", + "User" + ], + "m2ms": [], + "lineno": 366, + "file": "analytics/models.py" + }, + { + "name": "MetricValue", + "fields": { + "value_id": "UUIDField", + "metric_definition": "ForeignKey", + "value": "DecimalField", + "period_start": "DateTimeField", + "period_end": "DateTimeField", + "dimensions": "JSONField", + "metadata": "JSONField", + "data_quality_score": "DecimalField", + "confidence_level": "DecimalField", + "calculation_timestamp": "DateTimeField", + "calculation_duration_ms": "PositiveIntegerField" + }, + "fks": [ + "MetricDefinition" + ], + "m2ms": [], + "lineno": 437, + "file": "analytics/models.py" + } + ], + "communications": [ + { + "name": "Message", + "fields": { + "message_id": "UUIDField", + "tenant": "ForeignKey", + "subject": "CharField", + "content": "TextField", + "message_type": "CharField", + "priority": "CharField", + "sender": "ForeignKey", + "status": "CharField", + "created_at": "DateTimeField", + "scheduled_at": "DateTimeField", + "sent_at": "DateTimeField", + "expires_at": "DateTimeField", + "is_urgent": "BooleanField", + "requires_acknowledgment": "BooleanField", + "is_confidential": "BooleanField", + "delivery_attempts": "PositiveIntegerField", + "max_delivery_attempts": "PositiveIntegerField", + "message_thread_id": "UUIDField", + "reply_to_message": "ForeignKey", + "external_message_id": "CharField", + "has_attachments": "BooleanField", + "content_type": "CharField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "self" + ], + "m2ms": [], + "lineno": 15, + "file": "communications/models.py" + }, + { + "name": "MessageRecipient", + "fields": { + "recipient_id": "UUIDField", + "message": "ForeignKey", + "recipient_type": "CharField", + "user": "ForeignKey", + "email_address": "EmailField", + "phone_number": "CharField", + "role_name": "CharField", + "status": "CharField", + "sent_at": "DateTimeField", + "delivered_at": "DateTimeField", + "read_at": "DateTimeField", + "acknowledged_at": "DateTimeField", + "delivery_attempts": "PositiveIntegerField", + "last_attempt_at": "DateTimeField", + "error_message": "TextField", + "external_delivery_id": "CharField" + }, + "fks": [ + "Message", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 205, + "file": "communications/models.py" + }, + { + "name": "NotificationTemplate", + "fields": { + "template_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "template_type": "CharField", + "category": "CharField", + "subject_template": "CharField", + "content_template": "TextField", + "variables": "JSONField", + "default_values": "JSONField", + "formatting_rules": "JSONField", + "is_active": "BooleanField", + "is_system_template": "BooleanField", + "requires_approval": "BooleanField", + "usage_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 348, + "file": "communications/models.py" + }, + { + "name": "AlertRule", + "fields": { + "rule_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "trigger_type": "CharField", + "severity": "CharField", + "trigger_conditions": "JSONField", + "evaluation_frequency": "PositiveIntegerField", + "cooldown_period": "PositiveIntegerField", + "notification_template": "ForeignKey", + "notification_channels": "JSONField", + "escalation_rules": "JSONField", + "default_recipients": "ManyToManyField", + "recipient_roles": "JSONField", + "is_active": "BooleanField", + "is_system_rule": "BooleanField", + "trigger_count": "PositiveIntegerField", + "last_triggered_at": "DateTimeField", + "last_evaluated_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "NotificationTemplate", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 489, + "file": "communications/models.py" + }, + { + "name": "AlertInstance", + "fields": { + "alert_id": "UUIDField", + "alert_rule": "ForeignKey", + "title": "CharField", + "description": "TextField", + "severity": "CharField", + "trigger_data": "JSONField", + "context_data": "JSONField", + "status": "CharField", + "triggered_at": "DateTimeField", + "acknowledged_at": "DateTimeField", + "resolved_at": "DateTimeField", + "expires_at": "DateTimeField", + "acknowledged_by": "ForeignKey", + "resolved_by": "ForeignKey", + "resolution_notes": "TextField", + "escalation_level": "PositiveIntegerField", + "escalated_at": "DateTimeField", + "notifications_sent": "PositiveIntegerField", + "last_notification_at": "DateTimeField" + }, + "fks": [ + "AlertRule", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 656, + "file": "communications/models.py" + }, + { + "name": "CommunicationChannel", + "fields": { + "channel_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "channel_type": "CharField", + "provider_type": "CharField", + "configuration": "JSONField", + "authentication_config": "JSONField", + "rate_limits": "JSONField", + "is_active": "BooleanField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "message_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 807, + "file": "communications/models.py" + }, + { + "name": "DeliveryLog", + "fields": { + "log_id": "UUIDField", + "message": "ForeignKey", + "recipient": "ForeignKey", + "channel": "ForeignKey", + "status": "CharField", + "attempt_number": "PositiveIntegerField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "external_id": "CharField", + "response_code": "CharField", + "response_message": "TextField", + "error_details": "JSONField", + "processing_time_ms": "PositiveIntegerField", + "payload_size_bytes": "PositiveIntegerField", + "metadata": "JSONField" + }, + "fks": [ + "Message", + "MessageRecipient", + "CommunicationChannel" + ], + "m2ms": [], + "lineno": 969, + "file": "communications/models.py" + } + ], + "integration": [ + { + "name": "ExternalSystem", + "fields": { + "system_id": "UUIDField", + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "system_type": "CharField", + "vendor": "CharField", + "version": "CharField", + "base_url": "URLField", + "host": "CharField", + "port": "PositiveIntegerField", + "database_name": "CharField", + "authentication_type": "CharField", + "authentication_config": "JSONField", + "configuration": "JSONField", + "timeout_seconds": "PositiveIntegerField", + "retry_attempts": "PositiveIntegerField", + "retry_delay_seconds": "PositiveIntegerField", + "is_active": "BooleanField", + "is_healthy": "BooleanField", + "last_health_check": "DateTimeField", + "health_check_interval": "PositiveIntegerField", + "connection_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 18, + "file": "integration/models.py" + }, + { + "name": "IntegrationEndpoint", + "fields": { + "endpoint_id": "UUIDField", + "external_system": "ForeignKey", + "name": "CharField", + "description": "TextField", + "endpoint_type": "CharField", + "path": "CharField", + "method": "CharField", + "direction": "CharField", + "headers": "JSONField", + "parameters": "JSONField", + "request_format": "CharField", + "response_format": "CharField", + "request_mapping": "JSONField", + "response_mapping": "JSONField", + "request_schema": "JSONField", + "response_schema": "JSONField", + "is_active": "BooleanField", + "execution_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_executed_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ExternalSystem", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 153, + "file": "integration/models.py" + }, + { + "name": "DataMapping", + "fields": { + "mapping_id": "UUIDField", + "endpoint": "ForeignKey", + "name": "CharField", + "description": "TextField", + "mapping_type": "CharField", + "source_field": "CharField", + "source_format": "CharField", + "source_validation": "JSONField", + "target_field": "CharField", + "target_format": "CharField", + "target_validation": "JSONField", + "transformation_type": "CharField", + "transformation_config": "JSONField", + "is_required": "BooleanField", + "validation_rules": "JSONField", + "default_value": "TextField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_used_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "IntegrationEndpoint", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 272, + "file": "integration/models.py" + }, + { + "name": "IntegrationExecution", + "fields": { + "execution_id": "UUIDField", + "endpoint": "ForeignKey", + "execution_type": "CharField", + "status": "CharField", + "started_at": "DateTimeField", + "completed_at": "DateTimeField", + "request_data": "JSONField", + "response_data": "JSONField", + "request_size_bytes": "PositiveIntegerField", + "response_size_bytes": "PositiveIntegerField", + "processing_time_ms": "PositiveIntegerField", + "network_time_ms": "PositiveIntegerField", + "error_message": "TextField", + "error_details": "JSONField", + "retry_count": "PositiveIntegerField", + "external_id": "CharField", + "correlation_id": "CharField", + "triggered_by": "ForeignKey", + "metadata": "JSONField" + }, + "fks": [ + "IntegrationEndpoint", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 378, + "file": "integration/models.py" + }, + { + "name": "WebhookEndpoint", + "fields": { + "webhook_id": "UUIDField", + "external_system": "ForeignKey", + "name": "CharField", + "description": "TextField", + "url_path": "CharField", + "allowed_methods": "JSONField", + "authentication_type": "CharField", + "authentication_config": "JSONField", + "data_mapping": "ForeignKey", + "processing_config": "JSONField", + "rate_limit_per_minute": "PositiveIntegerField", + "rate_limit_per_hour": "PositiveIntegerField", + "is_active": "BooleanField", + "request_count": "PositiveIntegerField", + "success_count": "PositiveIntegerField", + "failure_count": "PositiveIntegerField", + "last_request_at": "DateTimeField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "ExternalSystem", + "DataMapping", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 480, + "file": "integration/models.py" + }, + { + "name": "WebhookExecution", + "fields": { + "execution_id": "UUIDField", + "webhook": "ForeignKey", + "method": "CharField", + "headers": "JSONField", + "query_params": "JSONField", + "payload": "JSONField", + "payload_size_bytes": "PositiveIntegerField", + "client_ip": "GenericIPAddressField", + "user_agent": "TextField", + "status": "CharField", + "received_at": "DateTimeField", + "processed_at": "DateTimeField", + "processing_time_ms": "PositiveIntegerField", + "response_status": "PositiveIntegerField", + "response_data": "JSONField", + "error_message": "TextField", + "error_details": "JSONField", + "external_id": "CharField", + "correlation_id": "CharField", + "metadata": "JSONField" + }, + "fks": [ + "WebhookEndpoint" + ], + "m2ms": [], + "lineno": 595, + "file": "integration/models.py" + }, + { + "name": "IntegrationLog", + "fields": { + "log_id": "UUIDField", + "external_system": "ForeignKey", + "endpoint": "ForeignKey", + "execution": "ForeignKey", + "level": "CharField", + "category": "CharField", + "message": "TextField", + "details": "JSONField", + "correlation_id": "CharField", + "user": "ForeignKey", + "timestamp": "DateTimeField", + "metadata": "JSONField" + }, + "fks": [ + "ExternalSystem", + "IntegrationEndpoint", + "IntegrationExecution", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 681, + "file": "integration/models.py" + } + ], + "quality": [ + { + "name": "QualityIndicator", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "description": "TextField", + "category": "CharField", + "type": "CharField", + "measurement_unit": "CharField", + "target_value": "DecimalField", + "current_value": "DecimalField", + "threshold_warning": "DecimalField", + "threshold_critical": "DecimalField", + "calculation_method": "TextField", + "data_source": "CharField", + "frequency": "CharField", + "responsible_department": "ForeignKey", + "responsible_user": "ForeignKey", + "is_active": "BooleanField", + "regulatory_requirement": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "hr.Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 7, + "file": "quality/models.py" + }, + { + "name": "QualityMeasurement", + "fields": { + "tenant": "ForeignKey", + "indicator": "ForeignKey", + "measurement_date": "DateField", + "value": "DecimalField", + "numerator": "IntegerField", + "denominator": "IntegerField", + "status": "CharField", + "measurement_method": "TextField", + "sample_size": "DecimalField", + "data_source": "CharField", + "notes": "TextField", + "data_source_reference": "CharField", + "verified_by": "ForeignKey", + "verified_at": "DateTimeField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "QualityIndicator", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 84, + "file": "quality/models.py" + }, + { + "name": "IncidentReport", + "fields": { + "tenant": "ForeignKey", + "incident_number": "CharField", + "title": "CharField", + "description": "TextField", + "incident_type": "CharField", + "severity": "CharField", + "category": "CharField", + "location": "CharField", + "incident_date": "DateField", + "incident_time": "TimeField", + "discovered_date": "DateTimeField", + "patient": "ForeignKey", + "witness_information": "TextField", + "reported_by": "ForeignKey", + "status": "CharField", + "priority": "CharField", + "root_cause": "TextField", + "contributing_factors": "TextField", + "corrective_actions": "TextField", + "preventive_actions": "TextField", + "assigned_to": "ForeignKey", + "due_date": "DateField", + "closed_date": "DateTimeField", + "is_confidential": "BooleanField", + "regulatory_notification": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 138, + "file": "quality/models.py" + }, + { + "name": "RiskAssessment", + "fields": { + "tenant": "ForeignKey", + "title": "CharField", + "description": "TextField", + "risk_category": "CharField", + "risk_type": "CharField", + "likelihood": "IntegerField", + "impact": "IntegerField", + "risk_score": "IntegerField", + "risk_level": "CharField", + "current_controls": "TextField", + "control_effectiveness": "CharField", + "mitigation_plan": "TextField", + "target_completion_date": "DateTimeField", + "responsible_person": "ForeignKey", + "review_date": "DateField", + "review_notes": "TextField", + "status": "CharField", + "incident_report": "ForeignKey", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "IncidentReport", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 243, + "file": "quality/models.py" + }, + { + "name": "AuditPlan", + "fields": { + "tenant": "ForeignKey", + "title": "CharField", + "description": "TextField", + "audit_type": "CharField", + "scope": "TextField", + "criteria": "TextField", + "department": "ForeignKey", + "auditor": "ForeignKey", + "audit_team": "ManyToManyField", + "planned_start_date": "DateField", + "planned_end_date": "DateField", + "actual_start_date": "DateField", + "actual_end_date": "DateField", + "status": "CharField", + "priority": "CharField", + "regulatory_requirement": "BooleanField", + "accreditation_body": "CharField", + "objectives": "TextField", + "notes": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "hr.Department", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 368, + "file": "quality/models.py" + }, + { + "name": "AuditFinding", + "fields": { + "tenant": "ForeignKey", + "audit_plan": "ForeignKey", + "finding_number": "CharField", + "title": "CharField", + "description": "TextField", + "finding_type": "CharField", + "finding_date": "DateField", + "severity": "CharField", + "category": "CharField", + "criteria_reference": "CharField", + "evidence": "TextField", + "root_cause": "TextField", + "corrective_action_required": "BooleanField", + "corrective_actions": "TextField", + "responsible_person": "ForeignKey", + "target_completion_date": "DateField", + "actual_completion_date": "DateField", + "status": "CharField", + "verification_method": "CharField", + "verified_by": "ForeignKey", + "verified_date": "DateField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "AuditPlan", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 442, + "file": "quality/models.py" + }, + { + "name": "ImprovementProject", + "fields": { + "tenant": "ForeignKey", + "project_number": "CharField", + "title": "CharField", + "description": "TextField", + "project_type": "CharField", + "methodology": "CharField", + "problem_statement": "TextField", + "goal_statement": "TextField", + "success_metrics": "TextField", + "baseline_data": "TextField", + "target_metrics": "TextField", + "scope": "TextField", + "project_manager": "ForeignKey", + "project_team": "ManyToManyField", + "sponsor": "ForeignKey", + "department": "ForeignKey", + "planned_start_date": "DateField", + "planned_end_date": "DateField", + "actual_start_date": "DateField", + "actual_end_date": "DateField", + "status": "CharField", + "phase": "CharField", + "estimated_cost": "DecimalField", + "resources_required": "TextField", + "actual_cost": "DecimalField", + "roi_expected": "DecimalField", + "roi_actual": "DecimalField", + "lessons_learned": "TextField", + "notes": "TextField", + "sustainability_plan": "TextField", + "created_by": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "hr.Department", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "settings.AUTH_USER_MODEL" + ], + "lineno": 522, + "file": "quality/models.py" + } + ], + "facility_management": [ + { + "name": "Building", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "building_id": "UUIDField", + "code": "CharField", + "building_type": "CharField", + "address": "TextField", + "latitude": "DecimalField", + "longitude": "DecimalField", + "floor_count": "PositiveIntegerField", + "total_area_sqm": "DecimalField", + "construction_year": "PositiveIntegerField", + "architect": "CharField", + "contractor": "CharField", + "is_active": "BooleanField", + "last_major_renovation": "DateField", + "facility_manager": "ForeignKey", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 9, + "file": "facility_management/models.py" + }, + { + "name": "Floor", + "fields": { + "building": "ForeignKey", + "floor_number": "IntegerField", + "name": "CharField", + "area_sqm": "DecimalField", + "ceiling_height_m": "DecimalField", + "is_public_access": "BooleanField" + }, + "fks": [ + "Building" + ], + "m2ms": [], + "lineno": 69, + "file": "facility_management/models.py" + }, + { + "name": "Room", + "fields": { + "floor": "ForeignKey", + "room_number": "CharField", + "name": "CharField", + "area_sqm": "DecimalField", + "capacity": "PositiveIntegerField", + "occupancy_status": "CharField", + "is_accessible": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Floor" + ], + "m2ms": [], + "lineno": 90, + "file": "facility_management/models.py" + }, + { + "name": "AssetCategory", + "fields": { + "name": "CharField", + "code": "CharField", + "description": "TextField", + "parent_category": "ForeignKey", + "is_active": "BooleanField" + }, + "fks": [ + "self" + ], + "m2ms": [], + "lineno": 127, + "file": "facility_management/models.py" + }, + { + "name": "Asset", + "fields": { + "asset_id": "UUIDField", + "name": "CharField", + "category": "ForeignKey", + "building": "ForeignKey", + "floor": "ForeignKey", + "room": "ForeignKey", + "location_description": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "purchase_date": "DateField", + "purchase_cost": "DecimalField", + "current_value": "DecimalField", + "depreciation_rate": "DecimalField", + "warranty_start_date": "DateField", + "warranty_end_date": "DateField", + "service_provider": "CharField", + "service_contract_number": "CharField", + "status": "CharField", + "condition": "CharField", + "last_inspection_date": "DateField", + "next_maintenance_date": "DateField", + "assigned_to": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "AssetCategory", + "Building", + "Floor", + "Room", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 147, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceType", + "fields": { + "name": "CharField", + "code": "CharField", + "description": "TextField", + "estimated_duration_hours": "DecimalField", + "is_active": "BooleanField" + }, + "fks": [], + "m2ms": [], + "lineno": 230, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceRequest", + "fields": { + "request_id": "CharField", + "title": "CharField", + "description": "TextField", + "maintenance_type": "ForeignKey", + "building": "ForeignKey", + "floor": "ForeignKey", + "room": "ForeignKey", + "asset": "ForeignKey", + "priority": "CharField", + "status": "CharField", + "requested_by": "ForeignKey", + "assigned_to": "ForeignKey", + "requested_date": "DateTimeField", + "scheduled_date": "DateTimeField", + "started_date": "DateTimeField", + "completed_date": "DateTimeField", + "estimated_hours": "DecimalField", + "estimated_cost": "DecimalField", + "actual_cost": "DecimalField", + "notes": "TextField", + "completion_notes": "TextField" + }, + "fks": [ + "MaintenanceType", + "Building", + "Floor", + "Room", + "Asset", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 250, + "file": "facility_management/models.py" + }, + { + "name": "MaintenanceSchedule", + "fields": { + "name": "CharField", + "description": "TextField", + "maintenance_type": "ForeignKey", + "asset": "ForeignKey", + "building": "ForeignKey", + "room": "ForeignKey", + "frequency_interval": "IntegerField", + "start_date": "DateField", + "end_date": "DateField", + "assigned_to": "ForeignKey", + "estimated_duration_hours": "DecimalField", + "is_active": "BooleanField", + "last_generated_date": "DateField", + "next_due_date": "DateField", + "created_at": "DateTimeField" + }, + "fks": [ + "MaintenanceType", + "Asset", + "Building", + "Room", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 322, + "file": "facility_management/models.py" + }, + { + "name": "Vendor", + "fields": { + "tenant": "ForeignKey", + "name": "CharField", + "vendor_type": "CharField", + "contact_person": "CharField", + "email": "EmailField", + "phone": "CharField", + "address": "TextField", + "crn": "CharField", + "vrn": "CharField", + "rating": "DecimalField", + "total_contracts": "PositiveIntegerField", + "is_active": "BooleanField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "core.Tenant" + ], + "m2ms": [], + "lineno": 369, + "file": "facility_management/models.py" + }, + { + "name": "ServiceContract", + "fields": { + "contract_number": "CharField", + "vendor": "ForeignKey", + "title": "CharField", + "description": "TextField", + "start_date": "DateField", + "end_date": "DateField", + "contract_value": "DecimalField", + "payment_terms": "CharField", + "buildings": "ManyToManyField", + "service_areas": "TextField", + "status": "CharField", + "auto_renewal": "BooleanField", + "renewal_notice_days": "PositiveIntegerField", + "contract_manager": "ForeignKey", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Vendor", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "Building" + ], + "lineno": 414, + "file": "facility_management/models.py" + }, + { + "name": "Inspection", + "fields": { + "inspection_id": "CharField", + "inspection_type": "CharField", + "title": "CharField", + "description": "TextField", + "building": "ForeignKey", + "floors": "ManyToManyField", + "rooms": "ManyToManyField", + "assets": "ManyToManyField", + "scheduled_date": "DateTimeField", + "estimated_duration_hours": "DecimalField", + "inspector": "ForeignKey", + "inspector_external": "CharField", + "inspector_organization": "CharField", + "status": "CharField", + "started_date": "DateTimeField", + "completed_date": "DateTimeField", + "overall_rating": "CharField", + "findings": "TextField", + "recommendations": "TextField", + "requires_followup": "BooleanField", + "followup_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Building", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [ + "Floor", + "Room", + "Asset" + ], + "lineno": 470, + "file": "facility_management/models.py" + }, + { + "name": "EnergyMeter", + "fields": { + "meter_id": "CharField", + "meter_type": "CharField", + "building": "ForeignKey", + "location_description": "CharField", + "manufacturer": "CharField", + "model": "CharField", + "serial_number": "CharField", + "installation_date": "DateField", + "current_reading": "DecimalField", + "last_reading_date": "DateTimeField", + "is_active": "BooleanField", + "calibration_date": "DateField", + "next_calibration_date": "DateField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Building" + ], + "m2ms": [], + "lineno": 544, + "file": "facility_management/models.py" + }, + { + "name": "EnergyReading", + "fields": { + "meter": "ForeignKey", + "reading_date": "DateTimeField", + "reading_value": "DecimalField", + "consumption": "DecimalField", + "cost": "DecimalField", + "read_by": "ForeignKey", + "is_estimated": "BooleanField", + "notes": "TextField", + "created_at": "DateTimeField" + }, + "fks": [ + "EnergyMeter", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 586, + "file": "facility_management/models.py" + }, + { + "name": "SpaceReservation", + "fields": { + "reservation_id": "CharField", + "room": "ForeignKey", + "title": "CharField", + "description": "TextField", + "start_datetime": "DateTimeField", + "end_datetime": "DateTimeField", + "reserved_by": "ForeignKey", + "contact_person": "CharField", + "contact_email": "EmailField", + "contact_phone": "CharField", + "expected_attendees": "PositiveIntegerField", + "setup_requirements": "TextField", + "catering_required": "BooleanField", + "av_equipment_required": "BooleanField", + "status": "CharField", + "approved_by": "ForeignKey", + "approved_at": "DateTimeField", + "hourly_rate": "DecimalField", + "total_cost": "DecimalField", + "notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField" + }, + "fks": [ + "Room", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 627, + "file": "facility_management/models.py" + } + ], + "insurance_approvals": [ + { + "name": "InsuranceApprovalRequest", + "fields": { + "tenant": "ForeignKey", + "approval_id": "UUIDField", + "approval_number": "CharField", + "patient": "ForeignKey", + "insurance_info": "ForeignKey", + "content_type": "ForeignKey", + "object_id": "PositiveIntegerField", + "order": "GenericForeignKey", + "request_type": "CharField", + "service_description": "CharField", + "procedure_codes": "JSONField", + "diagnosis_codes": "JSONField", + "clinical_justification": "TextField", + "medical_necessity": "TextField", + "alternative_treatments_tried": "TextField", + "requested_quantity": "PositiveIntegerField", + "requested_visits": "PositiveIntegerField", + "requested_units": "PositiveIntegerField", + "service_start_date": "DateField", + "service_end_date": "DateField", + "status": "CharField", + "priority": "CharField", + "submission_method": "CharField", + "submitted_date": "DateTimeField", + "submitted_by": "ForeignKey", + "decision_date": "DateTimeField", + "authorization_number": "CharField", + "reference_number": "CharField", + "approved_quantity": "PositiveIntegerField", + "approved_visits": "PositiveIntegerField", + "approved_units": "PositiveIntegerField", + "approved_amount": "DecimalField", + "effective_date": "DateField", + "expiration_date": "DateField", + "denial_reason": "TextField", + "denial_code": "CharField", + "appeal_date": "DateTimeField", + "appeal_reason": "TextField", + "appeal_deadline": "DateField", + "assigned_to": "ForeignKey", + "requesting_provider": "ForeignKey", + "last_contact_date": "DateTimeField", + "last_contact_method": "CharField", + "last_contact_notes": "TextField", + "is_urgent": "BooleanField", + "is_expedited": "BooleanField", + "requires_peer_review": "BooleanField", + "internal_notes": "TextField", + "insurance_notes": "TextField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "patients.PatientProfile", + "patients.InsuranceInfo", + "ContentType", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 16, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalDocument", + "fields": { + "approval_request": "ForeignKey", + "document_id": "UUIDField", + "document_type": "CharField", + "title": "CharField", + "description": "TextField", + "file": "FileField", + "file_size": "PositiveIntegerField", + "mime_type": "CharField", + "uploaded_at": "DateTimeField", + "uploaded_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 449, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalStatusHistory", + "fields": { + "approval_request": "ForeignKey", + "from_status": "CharField", + "to_status": "CharField", + "reason": "TextField", + "notes": "TextField", + "changed_at": "DateTimeField", + "changed_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 534, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalCommunicationLog", + "fields": { + "approval_request": "ForeignKey", + "communication_id": "UUIDField", + "communication_type": "CharField", + "contact_person": "CharField", + "contact_number": "CharField", + "subject": "CharField", + "message": "TextField", + "response": "TextField", + "outcome": "CharField", + "follow_up_required": "BooleanField", + "follow_up_date": "DateField", + "communicated_at": "DateTimeField", + "communicated_by": "ForeignKey" + }, + "fks": [ + "InsuranceApprovalRequest", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 589, + "file": "insurance_approvals/models.py" + }, + { + "name": "ApprovalTemplate", + "fields": { + "tenant": "ForeignKey", + "template_id": "UUIDField", + "name": "CharField", + "description": "TextField", + "request_type": "CharField", + "insurance_company": "CharField", + "clinical_justification_template": "TextField", + "medical_necessity_template": "TextField", + "required_documents": "JSONField", + "required_codes": "JSONField", + "is_active": "BooleanField", + "usage_count": "PositiveIntegerField", + "created_at": "DateTimeField", + "updated_at": "DateTimeField", + "created_by": "ForeignKey" + }, + "fks": [ + "core.Tenant", + "settings.AUTH_USER_MODEL" + ], + "m2ms": [], + "lineno": 688, + "file": "insurance_approvals/models.py" + } + ] + }, + "app_domains": { + "core": "communications", + "accounts": "communications", + "blood_bank": "blood_bank", + "patients": "emr", + "appointments": "appointments", + "inpatients": "inpatients", + "emr": "emr", + "pharmacy": "pharmacy", + "laboratory": "laboratory", + "radiology": "radiology", + "operating_theatre": "operating_theatre", + "billing": "billing", + "inventory": "inventory", + "hr": "hr", + "analytics": "analytics", + "communications": "communications", + "integration": "core", + "quality": "quality", + "facility_management": "facility_management", + "insurance_approvals": "emr" + } +} +``` + + --- + + ## 2) Detected Overlaps & Risks + + ### A) Name Collisions + ```json +[ + { + "name": "IntegrationLog", + "occurrences": [ + { + "app": "core", + "file": "core/models.py", + "lineno": 710 + }, + { + "app": "integration", + "file": "integration/models.py", + "lineno": 681 + } + ] + }, + { + "name": "InventoryLocation", + "occurrences": [ + { + "app": "blood_bank", + "file": "blood_bank/models.py", + "lineno": 437 + }, + { + "app": "inventory", + "file": "inventory/models.py", + "lineno": 562 + } + ] + }, + { + "name": "QualityControl", + "occurrences": [ + { + "app": "blood_bank", + "file": "blood_bank/models.py", + "lineno": 469 + }, + { + "app": "laboratory", + "file": "laboratory/models.py", + "lineno": 1060 + } + ] + }, + { + "name": "InsuranceClaim", + "occurrences": [ + { + "app": "patients", + "file": "patients/models.py", + "lineno": 784 + }, + { + "app": "billing", + "file": "billing/models.py", + "lineno": 606 + } + ] + } +] +``` + + ### B) Field-Set Similarities (possible duplicates) — threshold ≥ 0.6 + ```json +[ + { + "a": { + "app": "patients", + "name": "ClaimStatusHistory", + "file": "patients/models.py" + }, + "b": { + "app": "insurance_approvals", + "name": "ApprovalStatusHistory", + "file": "insurance_approvals/models.py" + }, + "similarity": 0.64, + "shared": [ + "changed_at", + "changed_by", + "from_status", + "notes", + "reason", + "settings.AUTH_USER_MODEL", + "to_status" + ] + } +] +``` + + ### C) Inventory Responsibility Leaks in Clinical Apps + ```json +[ + { + "app": "blood_bank", + "model": "InventoryLocation", + "file": "blood_bank/models.py", + "tokens": [ + "stock" + ] + }, + { + "app": "pharmacy", + "model": "Prescription", + "file": "pharmacy/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "pharmacy", + "model": "MedicationInventoryItem", + "file": "pharmacy/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "pharmacy", + "model": "DispenseRecord", + "file": "pharmacy/models.py", + "tokens": [ + "quantity", + "stock" + ] + }, + { + "app": "operating_theatre", + "model": "EquipmentUsage", + "file": "operating_theatre/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "insurance_approvals", + "model": "InsuranceApprovalRequest", + "file": "insurance_approvals/models.py", + "tokens": [ + "quantity" + ] + } +] +``` + + ### D) Canonical Ownership Conflicts + ```json +[ + { + "model": "Encounter", + "app": "emr", + "expected": [ + "core" + ], + "file": "emr/models.py" + } +] +``` + + --- + + ## 3) Responsibility Matrix (Apps × Capabilities) + | App | Domain | Allowed Capabilities | Note | +|---|---|---|---| +| `accounts` | communications | notifications, templates | Heuristic; adjust if needed. | +| `analytics` | analytics | aggregations, reporting | Heuristic; adjust if needed. | +| `appointments` | appointments | booking, scheduling | Heuristic; adjust if needed. | +| `billing` | billing | claims, invoices, payments | Heuristic; adjust if needed. | +| `blood_bank` | blood_bank | components, crossmatch, donations, transfusions | Heuristic; adjust if needed. | +| `communications` | communications | notifications, templates | Heuristic; adjust if needed. | +| `core` | communications | notifications, templates | Heuristic; adjust if needed. | +| `emr` | emr | clinical_docs, observations | Heuristic; adjust if needed. | +| `facility_management` | facility_management | assets, maintenance, workorders | Heuristic; adjust if needed. | +| `hr` | hr | scheduling, staffing | Heuristic; adjust if needed. | +| `inpatients` | inpatients | admissions, beds, transfers | Heuristic; adjust if needed. | +| `insurance_approvals` | emr | clinical_docs, observations | Heuristic; adjust if needed. | +| `integration` | core | attachments, audit, encounters, patients, tenancy | Heuristic; adjust if needed. | +| `inventory` | inventory | catalog, ledger, stock | Heuristic; adjust if needed. | +| `laboratory` | laboratory | orders, panels, results | Heuristic; adjust if needed. | +| `operating_theatre` | operating_theatre | anesthesia, surgical_cases | Heuristic; adjust if needed. | +| `patients` | emr | clinical_docs, observations | Heuristic; adjust if needed. | +| `pharmacy` | pharmacy | dispenses, formulary, prescriptions | Heuristic; adjust if needed. | +| `quality` | quality | audits, incidents, indicators | Heuristic; adjust if needed. | +| `radiology` | radiology | orders, reports, studies | Heuristic; adjust if needed. | + + --- + + ## 4) Target Architecture (Text Diagram) + + ``` + core ──► (patient, encounter, tenant, audit, attachment) + │ + ├── emr ──► clinical docs + observations (uses core.Patient/Encounter) + ├── documentation ──► owns ALL notes/reports (centralized), linkable everywhere + ├── inventory ──► items/stock/ledger (FK used by lab/pharmacy/blood_bank) + ├── pharmacy ──► prescriptions/dispenses (FK inventory) + ├── laboratory ──► orders/tests/results (FK inventory) + ├── radiology ──► orders/studies/reports (narrative via documentation) + ├── inpatients ──► admissions/transfers/beds (admission & progress notes via documentation) + ├── operating_theatre ──► surgical cases/anesthesia (notes via documentation) + ├── blood_bank ──► donors/components/crossmatch/transfusions (no stock logic) + ├── billing ──► claims/invoices/payments (FK patient/encounter only) + ├── appointments ──► booking/scheduling + ├── hr ──► staffing/scheduling + ├── insurance_approvals ──► payer authorizations + ├── facility_management ──► assets/workorders/maintenance + ├── analytics ──► reporting/aggregations (read-only) + ├── communications ──► notifications/templates + └── integration ──► connectors/mappings/jobs + ``` + + **Rules** + - No stock logic in lab/radiology/pharmacy/blood_bank/inpatients. + - No billing logic in EMR/clinical apps. + - PHI stays in `core`, `emr`, and `documentation`. + - All narrative notes/reports live in `documentation.Document`; domain apps **link**. + + --- + + ## 5) Refactor Plan (Drop & Reseed) + + 1. **Delete** duplicated models from non-canonical apps (see overlaps). + 2. **Keep** canonical models in the domain owners defined above. + 3. Replace cross-app copies with **FKs to canonical models** or service calls. + 4. Introduce **service modules** per domain (e.g., `inventory.services.record_stock_movement`). + 5. Standardize model fields: `tenant`, `external_id`, `created_at`, `updated_at`, `created_by`, `updated_by`, `is_active`. + 6. Regenerate seeds per domain (inventory catalog, lab tests, formulary, payer contracts). + 7. Implement centralized documentation (below) and remove local notes/report models. + + --- + + ## 6) Centralized Documentation (New `documentation/` app) + + **Purpose:** One canonical store for all notes & reports; link to any object. + + Create: `documentation/models.py` + ```python + from django.conf import settings + from django.db import models + from django.contrib.contenttypes.fields import GenericForeignKey + from django.contrib.contenttypes.models import ContentType + import uuid + + class NoteType(models.TextChoices): + ADMISSION = "ADMISSION", "Admission Note" + PROGRESS = "PROGRESS", "Progress Note" + DISCHARGE = "DISCHARGE", "Discharge Summary" + RADIOLOGY_REPORT = "RADIOLOGY_REPORT", "Radiology Report" + LAB_REPORT = "LAB_REPORT", "Laboratory Narrative" + PROCEDURE = "PROCEDURE", "Procedure Note" + ANESTHESIA = "ANESTHESIA", "Anesthesia Note" + BLOODBANK = "BLOODBANK", "Transfusion Note" + OTHER = "OTHER", "Other" + + class Document(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + tenant = models.ForeignKey("core.Tenant", on_delete=models.CASCADE, related_name="documents") + patient = models.ForeignKey("core.Patient", on_delete=models.CASCADE, related_name="documents") + encounter = models.ForeignKey("core.Encounter", on_delete=models.SET_NULL, null=True, blank=True, related_name="documents") + + doc_type = models.CharField(max_length=40, choices=NoteType.choices) + title = models.CharField(max_length=255) + status = models.CharField(max_length=20, default="final") # draft|amended|final|entered-in-error + authored_at = models.DateTimeField(auto_now_add=True) + authored_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name="documents_authored") + signed_at = models.DateTimeField(null=True, blank=True) + signed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name="documents_signed") + + body_markdown = models.TextField(blank=True, default="") + body_json = models.JSONField(blank=True, null=True) + + fhir_profile = models.CharField(max_length=120, blank=True, default="") + code = models.CharField(max_length=64, blank=True, default="") + + is_confidential = models.BooleanField(default=False) + is_amendment = models.BooleanField(default=False) + + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class DocumentVersion(models.Model): + document = models.ForeignKey(Document, on_delete=models.CASCADE, related_name="versions") + version = models.PositiveIntegerField() + snapshot_markdown = models.TextField(blank=True, default="") + snapshot_json = models.JSONField(blank=True, null=True) + changed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True) + changed_at = models.DateTimeField(auto_now_add=True) + + class Meta: + unique_together = [("document", "version")] + ordering = ["-version"] + + class DocumentLink(models.Model): + document = models.ForeignKey(Document, on_delete=models.CASCADE, related_name="links") + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.CharField(max_length=64) + target = GenericForeignKey("content_type", "object_id") + role = models.CharField(max_length=40, blank=True, default="context") # context|source|result|followup + created_at = models.DateTimeField(auto_now_add=True) + + class DocumentAttachment(models.Model): + document = models.ForeignKey(Document, on_delete=models.CASCADE, related_name="attachments") + file = models.FileField(upload_to="documents/%Y/%m/") + title = models.CharField(max_length=255, blank=True, default="") + created_at = models.DateTimeField(auto_now_add=True) + ``` + + **DRF (serializers & viewsets)** + - Endpoints: + - `POST /api/v1/documentation/documents/` (create) + - `GET /api/v1/documentation/documents/?patient=&encounter=&doc_type=` + - `POST /api/v1/documentation/documents/{id}/amend/` + - `POST /api/v1/documentation/documents/{id}/link/` + - `GET /api/v1/documentation/documents/{id}/` + - Add tenant scoping and object-level permissions. + + **Services**: `documentation/services.py` + ```python + from .models import Document, DocumentVersion, DocumentLink + from django.contrib.contenttypes.models import ContentType + from django.utils import timezone + + def create_document_and_link(*, tenant, patient, encounter=None, doc_type:str, title:str, + body_markdown:str="", body_json=None, links=None, author=None, sign=False): + doc = Document.objects.create( + tenant=tenant, patient=patient, encounter=encounter, + doc_type=doc_type, title=title, body_markdown=body_markdown, body_json=body_json or {}, + authored_by=author, status="draft" if not sign else "final", + signed_at=timezone.now() if sign else None, signed_by=author if sign else None + ) + DocumentVersion.objects.create(document=doc, version=1, snapshot_markdown=body_markdown, snapshot_json=body_json or {}, changed_by=author) + for ln in links or []: + ct = ContentType.objects.get(app_label=ln["app_label"], model=ln["model"].lower()) + DocumentLink.objects.create(document=doc, content_type=ct, object_id=str(ln["pk"]), role=ln.get("role","context")) + return doc + + def sign_document(doc: Document, user): + doc.status = "final"; doc.signed_at = timezone.now(); doc.signed_by = user; doc.save(update_fields=["status","signed_at","signed_by"]) + return doc + + def amend_document(doc: Document, user, *, new_markdown:str="", new_json=None): + nxt = (doc.versions.first().version + 1) if doc.versions.exists() else 2 + DocumentVersion.objects.create(document=doc, version=nxt, snapshot_markdown=new_markdown, snapshot_json=new_json or {}, changed_by=user) + doc.body_markdown, doc.body_json, doc.is_amendment = new_markdown, (new_json or {}), True + doc.save(update_fields=["body_markdown","body_json","updated_at","is_amendment"]) + return doc + ``` + + **Refactor each domain to use services:** + - **inpatients**: Admission/Progress notes → `documentation` (doc_type `ADMISSION` / `PROGRESS`). + - **radiology**: Narrative report → `documentation` (doc_type `RADIOLOGY_REPORT`, link to Study as `result`). + - **laboratory**: Narrative report (if needed) → `documentation` (doc_type `LAB_REPORT`, link to Order). + - **operating_theatre**: Anesthesia/Procedure notes → `documentation`. + - **blood_bank**: Transfusion note → `documentation`. + + **Delete** local note/report models once the adapters are wired. + + --- + + ## 7) Breaking Changes & Reseed Checklist + + - [ ] Removed duplicated/non-canonical models + - [ ] Updated FK targets to canonical owners + - [ ] Replaced local notes/reports with `documentation.Document` links + - [ ] Admin & DRF routes updated + - [ ] Seed order: `core` → `inventory` → `emr` → domain catalogs → `billing` + - [ ] Tenancy filters enforced (Managers/Mixins) + - [ ] PHI audit verified (create/update/sign/amend trails) + + --- + + ## 8) Smoke Tests (must pass) + + 1) Create Patient & Encounter (core). + 2) Create Admission (inpatients) → create `ADMISSION` note via documentation & link to Admission. + 3) Create Lab Order (laboratory) that consumes inventory items via FK; finalize → (optional) `LAB_REPORT`. + 4) Create Radiology Study (radiology) → finalize report via documentation (`RADIOLOGY_REPORT`), link as `result`. + 5) Raise Invoice (billing) against Encounter; **no clinical duplication** in billing. + 6) Verify Patient timeline shows all Documents; each domain detail page shows linked documents. + + --- + + ## 9) How to Run + + **A) Generate audit report** + ```bash + python tools/analyze_models.py \ + --project-root . \ + --apps core accounts blood_bank patients appointments inpatients emr pharmacy laboratory radiology \ + operating_theatre billing inventory hr analytics communications integration quality \ + facility_management insurance_approvals \ + --output-dir ./_refactor_report + ``` + Review `_refactor_report/modular_refactoring_report.md`. + + **B) Implement `documentation/` app** + - Add to `LOCAL_APPS`: `documentation` + - Create models/services as above; make DRF serializers/viewsets. + - Replace local notes/report models with calls to `documentation.services`. + + **C) Drop & Reseed** + - Reset DB, run migrations, seed catalogs (inventory items, lab tests, formulary, payers, etc.). + - Run **Smoke Tests**. + + --- + + ## 10) App Responsibility Matrix (tailored to your list) + + | App | Canonical Ownership | + |---|---| + | `core` | Patient, Encounter, Tenant, Facility, AuditEvent, Attachment, Identifier | + | `accounts` | Users/Auth/RBAC; no clinical/business logic | + | `patients` | PatientProfile & demographics extensions (if used) | + | `appointments` | Appointment, Schedule, Slot | + | `inpatients` | Admission, Transfer, DischargeSummary, Ward, Bed, Stay (**notes via documentation**) | + | `emr` | Clinical documentation scaffolding if needed; avoid storing notes (use `documentation`) | + | `pharmacy` | Drug, Formulary, Prescription, Dispense (**stock via inventory FK**) | + | `laboratory` | LabOrder, LabTest, LabPanel, LabResult, Specimen (**no stock logic**) | + | `radiology` | RadOrder, Study, Series (**narrative report via documentation**) | + | `operating_theatre` | SurgicalCase, AnesthesiaNote (**note content via documentation**) | + | `billing` | Payer, Contract, Claim, Invoice, Payment | + | `inventory` | Item, StockLocation, StockLedger, ReorderRule, UnitOfMeasure, Batch, Lot | + | `hr` | Employee, Shift, Schedule, Timesheet | + | `analytics` | Reporting/aggregations (read-only over canonical stores) | + | `communications` | Notifications, MessageTemplate | + | `integration` | Connectors (FHIR/HL7/ELM/etc.), Mappings, Jobs, EventLog | + | `quality` | Incident, Indicator, AuditFinding, CAPA | + | `facility_management` | Asset, WorkOrder, MaintenancePlan, Ticket | + | `blood_bank` | Donor, Donation, Component, Crossmatch, Transfusion (**no stock logic**) | + | `insurance_approvals` | AuthorizationRequest/Response | + + **Golden Rules** + - **Inventory** is the *only* place with stock/ledger logic. + - **Billing** is the *only* place with claims/invoices/payments. + - **Documentation** is the *only* place for free-text notes/reports; everything else **links**. \ No newline at end of file diff --git a/_refactor_report/overlaps.json b/_refactor_report/overlaps.json new file mode 100644 index 00000000..71322b10 --- /dev/null +++ b/_refactor_report/overlaps.json @@ -0,0 +1,149 @@ +{ + "name_collisions": [ + { + "name": "IntegrationLog", + "occurrences": [ + { + "app": "core", + "file": "core/models.py", + "lineno": 710 + }, + { + "app": "integration", + "file": "integration/models.py", + "lineno": 681 + } + ] + }, + { + "name": "InventoryLocation", + "occurrences": [ + { + "app": "blood_bank", + "file": "blood_bank/models.py", + "lineno": 437 + }, + { + "app": "inventory", + "file": "inventory/models.py", + "lineno": 562 + } + ] + }, + { + "name": "QualityControl", + "occurrences": [ + { + "app": "blood_bank", + "file": "blood_bank/models.py", + "lineno": 469 + }, + { + "app": "laboratory", + "file": "laboratory/models.py", + "lineno": 1060 + } + ] + }, + { + "name": "InsuranceClaim", + "occurrences": [ + { + "app": "patients", + "file": "patients/models.py", + "lineno": 784 + }, + { + "app": "billing", + "file": "billing/models.py", + "lineno": 606 + } + ] + } + ], + "fieldset_similar": [ + { + "a": { + "app": "patients", + "name": "ClaimStatusHistory", + "file": "patients/models.py" + }, + "b": { + "app": "insurance_approvals", + "name": "ApprovalStatusHistory", + "file": "insurance_approvals/models.py" + }, + "similarity": 0.64, + "shared": [ + "changed_at", + "changed_by", + "from_status", + "notes", + "reason", + "settings.AUTH_USER_MODEL", + "to_status" + ] + } + ], + "inventory_leaks": [ + { + "app": "blood_bank", + "model": "InventoryLocation", + "file": "blood_bank/models.py", + "tokens": [ + "stock" + ] + }, + { + "app": "pharmacy", + "model": "Prescription", + "file": "pharmacy/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "pharmacy", + "model": "MedicationInventoryItem", + "file": "pharmacy/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "pharmacy", + "model": "DispenseRecord", + "file": "pharmacy/models.py", + "tokens": [ + "quantity", + "stock" + ] + }, + { + "app": "operating_theatre", + "model": "EquipmentUsage", + "file": "operating_theatre/models.py", + "tokens": [ + "quantity" + ] + }, + { + "app": "insurance_approvals", + "model": "InsuranceApprovalRequest", + "file": "insurance_approvals/models.py", + "tokens": [ + "quantity" + ] + } + ], + "canonical_conflicts": [ + { + "model": "Encounter", + "app": "emr", + "expected": [ + "core" + ], + "file": "emr/models.py" + } + ] +} \ No newline at end of file diff --git a/accounts/__pycache__/adapter.cpython-312.pyc b/accounts/__pycache__/adapter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c19a4e79d868fd86ff17e5976708f456455c190 GIT binary patch literal 1760 zcmb7EJxm-&6rS1L`-Sr#CO>B)2Akx3LOzUwumva)HvTCH$UqeNn$dc9j$O33d!Cu~ zap;gzP`F5wC=xDHxJX3OrA*~EjZarVR*DqMY0}|$=*GQGP9I*!D zq*}`UBSRHoFgQ;ty6^Bg!|;5U&xIkxMw$`MZFh|sVbV~-$T)mYC_8|FG8E_)6P8s| z*#>2;p%%5^VhHSX%+0wh5-Y|W<~za6J!I*w=@3NBHG&MC5r%9xzFVo|YbZTfL{Wh( z$l0&xutXD8HP_85`f$oM=8b?;gQ@j2<5u?GK07}wLR7a zc{fN!4vSQhPCSTVac3+bVDa3%Ix#zmvEVFbh9w?XQ4LgaB*^vdvmhtq*py(4^BOB= zf|LL)uMnhT^nohg8r4LaAUC(Lu=LfPd3=9qWpyPubGj(Od2?NN*SwO?ZHJX)M4FLq z8QB*iE=`JwKx4$IP)P7AUK#(A5z5A^I<1T0;M8@;7KZCHT%(?> z_INx!aCds(aC+b;ljC~$e%W|5bV{{G(AUF`&FG<@o&lwv6FG_K7a_g|Z_a>o1N#FX z93{a({@LgcnI9+H7p^}|z3RJgplP|;{gJDCBNMHWiT22+FVW<$?6;eHGY?ub585}D zTWI;)+)+RH2t7~lp{W*{Y7gCb`o-HM$lQgm&X)E?Whz|kc*=1X^dUHN-z$x7*{>hcck8r@nc_iqMa1Rre|PG<@o#w9102OpcHc2 zbcAdf>lb1hyit@y`Y=75$kL&Bd$E|Ld0_c#vVk#=!6x#DM`pDC6@MrimJM5~(a%A}}cgoh3f;g7n08 z!O0Gc;*4PSPC<}TDTERj3#3$ER0hUH&|otr>obb*$RPw7CTBCs@F*Y)tY?(bR6-Jf zGE+p?aIR*CaF`fUnNq}n_Nz=5U{YsPn`{9jH6|wjNv+8pKvHM&1|X?7`3935M>=nm zM5U6Z^5in+V#(6t)S_bjTbv*|J}0xdM3eCrOI~7b>Sk*eT_$0kP@uREP&h0zwfq)) zVsU)gK7OFRMFJoK6kL+h#=!6x#DM`3DC4si^F$3hHYSEt_AHT!bvhsx2Z$v- z@vb0ZD7c1mH8VsAXdF|D(8PD*j9_hB zf!btXiV-weo2V$7HnCKeEV;>_7}X~)WE7dK%Ot|6G}(zseey>juNKHtn>-1~b7T^k ze3pq@4{VbXP>UAATo@}w8O>;w$$d=X)~aZtYCzq3Fg*x5MIE6oT_8%LQbSX7@&l$~ z`<(pr%sl;DtYBJ`@fJ&7Vs2^`JCK`STB3i84Z^5mFV0NQD=pB!#g~|zoL`z(5)ToW z9LOxZIfq%7NtivcIKC`1wfq)OXmM(hPiApR*yJ^=Hj}@z%JLL}g1JZ%L`Y2*WGms) z1TqSR#q=f%M~CDE5w!_k*G1GW kil|){(O6M&g~bAk_yv9YD=ZEVSvWRtVN+pbQ3sk1088D3e*gdg diff --git a/accounts/__pycache__/views.cpython-312.pyc b/accounts/__pycache__/views.cpython-312.pyc index 443f040806308494cf5301267319d689f4cdc5b7..02904ecddc0b4fe8c7a32c53f331310175fa48fe 100644 GIT binary patch delta 26 gcmcaNjrra*X8zN>yj%=G5TO1bqvH?5Mt=X(0C!yp3IG5A delta 26 gcmcaNjrra*X8zN>yj%=G@LKdrhUaX?jr{(n0eI{P=l}o! diff --git a/accounts/adapter.py b/accounts/adapter.py new file mode 100644 index 00000000..e176ac22 --- /dev/null +++ b/accounts/adapter.py @@ -0,0 +1,44 @@ +""" +Custom allauth adapter for the hospital management system. +""" +from allauth.account.adapter import DefaultAccountAdapter +from django.conf import settings + + +class CustomAccountAdapter(DefaultAccountAdapter): + """ + Custom account adapter to handle edge cases in allauth. + """ + + def is_safe_url(self, url): + """ + Override is_safe_url to handle cases where request context is None. + + This fixes the AttributeError: 'NoneType' object has no attribute 'get_host' + that occurs when context.request is None in certain scenarios. + """ + if not url: + return False + + # Try to get the request from the adapter's stash + request = getattr(self, 'request', None) + + if request: + # If we have a request, use the standard validation + try: + allowed_hosts = {request.get_host()} | set(settings.ALLOWED_HOSTS) + except AttributeError: + # Fallback if request doesn't have get_host + allowed_hosts = set(settings.ALLOWED_HOSTS) + else: + # If no request available, just use ALLOWED_HOSTS + allowed_hosts = set(settings.ALLOWED_HOSTS) + + # Use Django's url_has_allowed_host_and_scheme for validation + from django.utils.http import url_has_allowed_host_and_scheme + + return url_has_allowed_host_and_scheme( + url=url, + allowed_hosts=allowed_hosts, + require_https=request.is_secure() if request else False + ) diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py new file mode 100644 index 00000000..04b4da42 --- /dev/null +++ b/accounts/migrations/0001_initial.py @@ -0,0 +1,472 @@ +# Generated by Django 5.2.6 on 2025-10-03 17:38 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.utils.timezone +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("auth", "0012_alter_user_first_name_max_length"), + ] + + operations = [ + migrations.CreateModel( + name="PasswordHistory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "password_hash", + models.CharField(help_text="Hashed password", max_length=128), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ], + options={ + "verbose_name": "Password History", + "verbose_name_plural": "Password History", + "db_table": "accounts_password_history", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="SocialAccount", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "provider", + models.CharField( + choices=[ + ("GOOGLE", "Google"), + ("MICROSOFT", "Microsoft"), + ("APPLE", "Apple"), + ("FACEBOOK", "Facebook"), + ("LINKEDIN", "LinkedIn"), + ("GITHUB", "GitHub"), + ("OKTA", "Okta"), + ("SAML", "SAML"), + ("LDAP", "LDAP"), + ], + max_length=50, + ), + ), + ( + "provider_id", + models.CharField(help_text="Provider user ID", max_length=200), + ), + ( + "provider_email", + models.EmailField( + blank=True, + help_text="Email from provider", + max_length=254, + null=True, + ), + ), + ( + "display_name", + models.CharField( + blank=True, + help_text="Display name from provider", + max_length=200, + null=True, + ), + ), + ( + "profile_url", + models.URLField( + blank=True, help_text="Profile URL from provider", null=True + ), + ), + ( + "avatar_url", + models.URLField( + blank=True, help_text="Avatar URL from provider", null=True + ), + ), + ( + "access_token", + models.TextField( + blank=True, help_text="Access token from provider", null=True + ), + ), + ( + "refresh_token", + models.TextField( + blank=True, help_text="Refresh token from provider", null=True + ), + ), + ( + "token_expires_at", + models.DateTimeField( + blank=True, help_text="Token expiration date", null=True + ), + ), + ( + "is_active", + models.BooleanField( + default=True, help_text="Social account is active" + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "last_login_at", + models.DateTimeField( + blank=True, + help_text="Last login using this social account", + null=True, + ), + ), + ], + options={ + "verbose_name": "Social Account", + "verbose_name_plural": "Social Accounts", + "db_table": "accounts_social_account", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="TwoFactorDevice", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "device_id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + help_text="Unique device identifier", + unique=True, + ), + ), + ("name", models.CharField(help_text="Device name", max_length=100)), + ( + "device_type", + models.CharField( + choices=[ + ("TOTP", "Time-based OTP (Authenticator App)"), + ("SMS", "SMS"), + ("EMAIL", "Email"), + ("HARDWARE", "Hardware Token"), + ("BACKUP", "Backup Codes"), + ], + max_length=20, + ), + ), + ( + "secret_key", + models.CharField( + blank=True, + help_text="Secret key for TOTP devices", + max_length=200, + null=True, + ), + ), + ( + "phone_number", + models.CharField( + blank=True, + help_text="Phone number for SMS devices", + max_length=20, + null=True, + ), + ), + ( + "email_address", + models.EmailField( + blank=True, + help_text="Email address for email devices", + max_length=254, + null=True, + ), + ), + ( + "is_active", + models.BooleanField(default=True, help_text="Device is active"), + ), + ( + "is_verified", + models.BooleanField(default=False, help_text="Device is verified"), + ), + ( + "verified_at", + models.DateTimeField( + blank=True, help_text="Device verification date", null=True + ), + ), + ( + "last_used_at", + models.DateTimeField( + blank=True, help_text="Last time device was used", null=True + ), + ), + ( + "usage_count", + models.PositiveIntegerField( + default=0, help_text="Number of times device was used" + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ], + options={ + "verbose_name": "Two Factor Device", + "verbose_name_plural": "Two Factor Devices", + "db_table": "accounts_two_factor_device", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="UserSession", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "session_key", + models.CharField( + help_text="Django session key", max_length=40, unique=True + ), + ), + ( + "session_id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + help_text="Unique session identifier", + unique=True, + ), + ), + ("ip_address", models.GenericIPAddressField(help_text="IP address")), + ("user_agent", models.TextField(help_text="User agent string")), + ( + "device_type", + models.CharField( + choices=[ + ("DESKTOP", "Desktop"), + ("MOBILE", "Mobile"), + ("TABLET", "Tablet"), + ("UNKNOWN", "Unknown"), + ], + default="UNKNOWN", + max_length=20, + ), + ), + ( + "browser", + models.CharField( + blank=True, + help_text="Browser name and version", + max_length=100, + null=True, + ), + ), + ( + "operating_system", + models.CharField( + blank=True, + help_text="Operating system", + max_length=100, + null=True, + ), + ), + ( + "country", + models.CharField( + blank=True, help_text="Country", max_length=100, null=True + ), + ), + ( + "region", + models.CharField( + blank=True, help_text="Region/State", max_length=100, null=True + ), + ), + ( + "city", + models.CharField( + blank=True, help_text="City", max_length=100, null=True + ), + ), + ( + "is_active", + models.BooleanField(default=True, help_text="Session is active"), + ), + ( + "login_method", + models.CharField( + choices=[ + ("PASSWORD", "Password"), + ("TWO_FACTOR", "Two Factor"), + ("SOCIAL", "Social Login"), + ("SSO", "Single Sign-On"), + ("API_KEY", "API Key"), + ], + default="PASSWORD", + max_length=20, + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("last_activity_at", models.DateTimeField(auto_now=True)), + ( + "expires_at", + models.DateTimeField(help_text="Session expiration time"), + ), + ( + "ended_at", + models.DateTimeField( + blank=True, help_text="Session end time", null=True + ), + ), + ], + options={ + "verbose_name": "User Session", + "verbose_name_plural": "User Sessions", + "db_table": "accounts_user_session", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="User", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + error_messages={ + "unique": "A user with that username already exists." + }, + help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.", + max_length=150, + unique=True, + validators=[ + django.contrib.auth.validators.UnicodeUsernameValidator() + ], + verbose_name="username", + ), + ), + ( + "first_name", + models.CharField( + blank=True, max_length=150, verbose_name="first name" + ), + ), + ( + "last_name", + models.CharField( + blank=True, max_length=150, verbose_name="last name" + ), + ), + ( + "is_staff", + models.BooleanField( + default=False, + help_text="Designates whether the user can log into this admin site.", + verbose_name="staff status", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="active", + ), + ), + ( + "date_joined", + models.DateTimeField( + default=django.utils.timezone.now, verbose_name="date joined" + ), + ), + ( + "user_id", + models.UUIDField(default=uuid.uuid4, editable=False, unique=True), + ), + ("email", models.EmailField(max_length=254, unique=True)), + ("force_password_change", models.BooleanField(default=False)), + ("password_expires_at", models.DateTimeField(blank=True, null=True)), + ("failed_login_attempts", models.PositiveIntegerField(default=0)), + ("locked_until", models.DateTimeField(blank=True, null=True)), + ("two_factor_enabled", models.BooleanField(default=False)), + ("max_concurrent_sessions", models.PositiveIntegerField(default=3)), + ("session_timeout_minutes", models.PositiveIntegerField(default=30)), + ("last_password_change", models.DateTimeField(blank=True, null=True)), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + ], + options={ + "db_table": "accounts_user", + "ordering": ["last_name", "first_name"], + }, + managers=[ + ("objects", django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/accounts/migrations/0002_initial.py b/accounts/migrations/0002_initial.py new file mode 100644 index 00000000..c44dcde2 --- /dev/null +++ b/accounts/migrations/0002_initial.py @@ -0,0 +1,116 @@ +# Generated by Django 5.2.6 on 2025-10-03 17:38 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ("accounts", "0001_initial"), + ("auth", "0012_alter_user_first_name_max_length"), + ("core", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="tenant", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="users", + to="core.tenant", + ), + ), + migrations.AddField( + model_name="user", + name="user_permissions", + field=models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), + migrations.AddField( + model_name="passwordhistory", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="password_history", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="socialaccount", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="social_accounts", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="twofactordevice", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="two_factor_devices", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="usersession", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="user_sessions", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddIndex( + model_name="user", + index=models.Index( + fields=["tenant", "email"], name="accounts_us_tenant__162cd2_idx" + ), + ), + migrations.AddIndex( + model_name="user", + index=models.Index( + fields=["tenant", "username"], name="accounts_us_tenant__d92906_idx" + ), + ), + migrations.AddIndex( + model_name="user", + index=models.Index( + fields=["tenant", "is_active"], name="accounts_us_tenant__78e6c9_idx" + ), + ), + migrations.AlterUniqueTogether( + name="socialaccount", + unique_together={("provider", "provider_id")}, + ), + migrations.AddIndex( + model_name="usersession", + index=models.Index( + fields=["user", "is_active"], name="accounts_us_user_id_f3bc3f_idx" + ), + ), + migrations.AddIndex( + model_name="usersession", + index=models.Index( + fields=["session_key"], name="accounts_us_session_5ce38e_idx" + ), + ), + migrations.AddIndex( + model_name="usersession", + index=models.Index( + fields=["ip_address"], name="accounts_us_ip_addr_f7885b_idx" + ), + ), + ] diff --git a/accounts/migrations/__pycache__/0001_initial.cpython-312.pyc b/accounts/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c975047174c3dc6c0bda1db23ade99ceb74210e GIT binary patch literal 10691 zcmb_iTTmNWdTw12LSTV~ZLoj_a}zd_J-*ENHe+!!*nlt+_AHy-PNUO^2GOnQZkeHT z+1cGmGRfvLo6C+jnPg`+*$fja*?CDa4|(8`s=P?GRMFM*5Le}iH+IK)$wMmtIo%T7 zASjaxuIfJL^w4;PJuksm*Rd`X5b?>T(xU8Jse~F^H&Cb`s2CNlFG@5rJ$Gi(UGmd$;lj1zf0qZM9 z8@UjER#QzE??yMjK1R1J=bQJ2JJIc6>3pK#M zQz)2mpvI5gg{HC%j@0?|33Uz~rE`Wt%|CUZGljDjz0VzmMlGn-w!-rSd8XP5Q5dx$ zN1@$fxsD^{IuMOo51=~<`dn4nU4Xq%wi5WH`xtD`0cA?WH+GkPd$j^oOhjVt$w+-j`ypm7^=f*`AN^?{uQ=;1Ng$phFaf-UD_ ziv!U#O4u~`f95rCbp|~`vnSwc@`PMXk+oH0+8lZec6egRM{g7CNqGGYkYMHYJdx0A zF`?N+-z@x^C7!=UaMiNew{5uN*v|m_e;xSGT2`=d;8^S*+OU6gj7|O+{fW&c$FcrH^g|o=Pl?<`27P9k>BmRgsqmMUy!uy1ts9>S3Lje}{xv~X z-Scb`|K^n?{^S*P{N%`)Kef&L(<5)r zw5~gOG^RTzMj~!K0D?p&Epe>EA-ygq@vE$~&a80jdM!xg*(|Sedf+K1Er>ElMCf z%c{1p>9m*^6qzZDXO@grsC9!DNp9&B%&MQZD$3-td5O*HKD59n>_V2)eP9Gwl#q$I zbT>AW?p@@$ERyvaF=w33>yu&{RvkB{)qOche9FU1ky==i_kJRAe{vM=qL|5Yc#%^R z!?THGVl0I{l$JzUTvTA(6Q7v@peLTo5u9%WEuawY&~vks zc3i|IUB`2fiEske{p?d#VS(xJ-nlqwAASu8m4>y;j3TaZg4zmxgdR&@v%x zc^b9BoYrKpddl9H^|PizGGn|6`jQaSPo>sGASa}V5$-84NUufYj+t|APT=3kbF?u+ zLqrG)53wUf+|rxaJ3bEaB*=^;lf_6GvpCA>>`Y=GbJnQIWFSCoK7WDGiq0g zU*!fDSQ*j@^y&UMq&YlOngy+B2&M>NUCF7W^Z>*_+cP>9pO}OjW-Ro5AaoH1QNX^A5#_AI{CFfgv`%lF!k@@GG3Wi%SFDFLRJg6rA_e^GVXCp-nHs ztXMO1-Lf9YEr|l;!Tjn1C#m5X+@p;i0fTB4Y(0r4oY;Ufvf5!pmDwd|0x09vplPNG zQS>@s6J#`OXrwmnKQ52yb>$Z3$2k*VjDgAE$3}yd0YW5*c}y|2h44rLQzM& zzy^?)*$l@JK1le7K(%9t5?LPn&`G3=Awe(ZVIeg=}pOb?RxFLF zcwd+j7a*JAkyLzWax?{Zyz$^2p=NIS;dJ83G&F=2h;Bi`kpK(13^x)(Mn0`ski<2Z zSv@yoG>jz53Wx^B5)%c*9EX2P7BY;yE-T!s8cdW&Xk!F+0laO(W?wUGHoOv-0RyXn zS#pmh6`Zi#X<|SrQS6RNqWInS7F%9npQ|-5OTsPd!O6 zu*anmv#NjJ{n!%8#PCFXQVp1SXcDJ07xTv8X*2Pht+y(Pu80& zbj@Q%$R;`67zIUvSpY?x#AinB;U_8*d#R*tr0ViUhW9W77=Wmj^WZQnTAcwJ!Ro;m zuuUzoijmauBO1ypn$2cufUfd{-7>w#gD3I|-gvS+_%6FngEAn%*blhXs2Z#Y2i~$u zUIrC#jy6Ju)JZ-pA8*bic+^PTC+6Gv<~w@*(FESv03h&JZyp}N?*Bt znNBaU5_koONkgh!6eM9=Sv#KEo@p1~B=(STuGqHW*`QQOK@GcYg#5MZ9_g zCrP5jKw`m(M?MtQPoV&Xy-}28)5!ZJuIeXk5*}qERUSSs( z)teTxuPp(+!QOB&?2u*!>^zzm6w&Ypi&lAomU)GXssSRww5`fj6$Ck)xKIXXWf8r= z(TY)HgSX5wAWF{(GMDAjrptK&LYYN4)56yw4u^MnQxCdQG6f5+U(G47Q)b09RJ06aAwH`&S+YJS;GBr`v-nhy7KL`MXa3Ar-0+$tq z3@!$vbcOH`UKvg~6lU!55-{Rpfo1+Fo=ep1{RZ66f#CO!qH zKcg8K62&aX3g&~kxrq^@>CWeQq>G%by23zGjSZ!RcrePIxW}16kP9rc8&{5WXWD9`eO?Tl+`_vRGtfxeL zHDr^L1iIL?y5HPy;oI%!)Yl-N`tNiMiT3!QGb`2(gj*y3gsw84x#g;@l2PJV9 zj^bF%Dxo;pu9>ITVr5^)_P-0qF2i}AG2Ii*txNbVws zI~8i!>!LcZYJE4g@atOJz_Y|JL1x3to^!SSz1M7-(66pZheeZLIsKijduOQb-j^-) zSlb{d)J-*aSun*|d@H>jnl-fbQ_VeEs0S~lrxfbZ+Pk!_*R>11T3e@m!51td23t?vyjeBI*wQP+|K+&}BG`Tqn=gq2j7sL|b@`9Jk* zoxNJu9j)Vn#f42&)45_xmPn~3^2HR8pk=lgOuh(#Pbw0A<@5rB8Zd(zYw-dC zuz)b}TLnYh|5i2kAMl>mbx*s{bBIddKs(`vtI4u@=nHr8-t2ZLS>Y`3tP-SOc#844 z?a*WEL#scE(P}KSBMuW4W{6=5#Y&-=Mt2qmr~j`60sp^^{jWHw&TCrVZ7uwU#s6zg z7W;q1?*H~zkAG`yYh5=sU)w?!O^uM-cb$bGcMlN+^44vfw{Dj@Zf|C{JCemcE@xvm^jE953nXcbq;{P?Zj!fkc$xKPBmvk!0zjabI`SFr~|S#_|4&i zi*2(D+7Px*7n4uy204EKv$%PB>zW;MkbIEdQx$$$SzeBp&Wm{Er~No&>Pg5{-37G9 z3&ozBpFG~_xmoJDxp{57XS^7kcoBm6DugUvo!kyhRc3?yUU@`v*}Y9`&YW;9V{*L> z$t9-s-O$2UE#&&9OUC3{vXkrVE0PORM!48E`0Vjc+hD0}@XOO%x3=3J7lTji`hrp$ zp)V)x1_T>b0#u`Wv@S*KdEJr|o2X{%#`PlHUF>}XyK;XkD0gASf!*J6;YGOXC(}Qk z-U-J_;n+_2Rw;aIC!8#WlfMYh0k|83doRCiuES<;0JGDFGS!B>8MdotOPHX$ym{UZ z0LAROe@pARYS-P$4@kOuPU^w~r`9uQM?q-ryN>StEbwVyhrV8-ukX+|OZ3gHdi%Uq zdT*qDKL7drW)Ezj+o3sw3{Y9L6k9Jo>)mO+SZclag$(>@#r)A4`-=m2H+pvl?v@7b zZgSfLlf~ea*4SI@zq8@p>AzFzzq5I53vKrs5e?{3j23(tM z(e@?0mmD0P-M(bZ*jJ3)-8i!oxm$|d-5l9cwj-%xaPCDYtc3<}mK`XC27pJ{j$>fQ zn0E1sb{?v(!I$+l*tdSNjV@rOkGrV0OIln1#-(ET^IKK8$j;^n$p0B9zS5)19Q2j5x(=`t7hyI;lcPZHYUli^US^o-7g1Y!Zlp)Cmq?LTohB_wGJNgLqe%WByf+e_BF&hGMI z4s9ys&|B##>Zwt0RrpUTRrZP1NL3^C)LT@@rKi5x^(J;Og-A3jv7UMF&F}r*oA+jx zUpqR&3_M-om!GMDGde4b|+ zA9I&Mfu{`OFt-MH?>;a5t|T9_QH^WE(6Ng;50fM^VRa=L_DoI00r1`TwVg2imag!m+i~ zVflMyq5Fd}j-LYK#0O>Ea|(>ld{D+`-;?ph!xhxvn{J~Cpx&Yn_3fT};d8aSNpIwI z+WVsQ1KPl;p$!7s`6JPW+r-n2J}R-hsbga}_J=NjN2nj8Er~h)s54V9J$+Et#Stf~2OiWCQil$hKq=F_Oty?8>34~Lk zq*~Yz*G+g86vMPcO)6utENzJ@){0h%n#;O@jSwW91gIh5Ev!kJML0S$w$R}Z!@i5ggyEQ}mb;Y4m?pi$wuhD~SXK&( zoNAJ$3c8W9N{X4H_E{o0%itE=j?u8PZ%wxy#OAdbo^Y$Gq&*^`5>_jsg|{rDn+6v5 zm_A;|M%7_w#Hk{>fsIwh1jMKaAz-9X^q(v2$V@&uwM=`eK}(%eWsiMdnp&1S@` zO}!w=uo~eFMaCo!0@0N~-l)hV5ht_Q$ph(VMCfLPaJVcfDmm{V!sbCBbVEdO^7@pF zrbGp8!M^cMUQL5u&KaLUZ-2rm8p2y{(wyYCg+a4ZvlG`T3<)VFaJQ5V+}`7j8GK!y zZFm$ahQ6U7D3ORa0uA`46i94cQy{&fr5CYP0;3k+PLK)`3)8Febiwf*G2IM^k8ris z*i&4S@$?LKjKfMrln^ptNvmx`E*5Ug%v@Wgw)ZnM`mIO8cc2H9qV@$a<``%`M%UyFG8vFFX>PTUov*t}M+z6c-=do?mc0 zedg>M=l&$-XwR-V$z1kw8P=ij-EY5Nn0)|Z{*iMlv_ErY$=H-MN!^rG1tuEQ3+&Ds zmaSY#H!F%IsnGD6RK#TrMPyb@3zx->t2wX2a&NyYb8wVEeYrw+*%^Ow_wPWUhkvs0s*?!~d>7sm`s+f!-8*P^pR?mbJHvbNp?ZACPNsg!{FvEG zj@6T6d&%i~a(XX$v!1+Z52o!z>L3_MbRGnSQ215+U6>&|K1yLm>+w7CY7dUs zLm4}fwg+0xSDkR*u@;y(c4(vlIP$iOcoGRUejj9*;~>M)mJGLAkJWmw)UGa{(E4(%H(R^5 z(rP_I%V)SQK(1>kh?r!0*we!pH7e^@*_nQx^VA`W^Gi&$8@3&#)JMXHtJKqX)doviweXuPa^e LO2204%t84V04HH( literal 0 HcmV?d00001 diff --git a/accounts/templates/account/login.html b/accounts/templates/account/login.html index 8f77f1ca..fb1a400d 100644 --- a/accounts/templates/account/login.html +++ b/accounts/templates/account/login.html @@ -73,7 +73,7 @@

Sign in to your account

- +