import os import django # Set up Django environment os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hospital_management.settings') django.setup() import random from datetime import datetime, date, time, timedelta from django.utils import timezone as django_timezone from django.contrib.auth import get_user_model from pharmacy.models import * from patients.models import PatientProfile from emr.models import Encounter from core.models import Tenant import uuid from decimal import Decimal User = get_user_model() # Saudi pharmacy data SAUDI_MEDICATIONS = [ ('Paracetamol', 'باراسيتامول', 'TAB', 'Analgesic', '500mg', ['J01XX01']), ('Ibuprofen', 'ايبوبروفين', 'TAB', 'NSAID', '400mg', ['M01AE01']), ('Metformin', 'ميتفورمين', 'TAB', 'Antidiabetic', '500mg', ['A10BA02']), ('Amlodipine', 'أملوديبين', 'TAB', 'Antihypertensive', '5mg', ['C08CA01']), ('Atorvastatin', 'أتورفاستاتين', 'TAB', 'Statin', '20mg', ['C10AA05']), ('Omeprazole', 'أوميبرازول', 'CAP', 'PPI', '20mg', ['A02BC01']), ('Salbutamol', 'سالبيوتامول', 'INH', 'Bronchodilator', '100mcg', ['R03AC02']), ('Warfarin', 'وارفارين', 'TAB', 'Anticoagulant', '5mg', ['B01AA03']), ('Insulin Glargine', 'انسولين جلارجين', 'INJ', 'Insulin', '100units/ml', ['A10AE04']), ('Levothyroxine', 'ليفوثيروكسين', 'TAB', 'Thyroid hormone', '100mcg', ['H03AA01']), ('Losartan', 'لوسارتان', 'TAB', 'ARB', '50mg', ['C09CA01']), ('Pantoprazole', 'بانتوبرازول', 'TAB', 'PPI', '40mg', ['A02BC02']), ('Clopidogrel', 'كلوبيدوجريل', 'TAB', 'Antiplatelet', '75mg', ['B01AC04']), ('Simvastatin', 'سيمفاستاتين', 'TAB', 'Statin', '20mg', ['C10AA01']), ('Furosemide', 'فوروسيمايد', 'TAB', 'Diuretic', '40mg', ['C03CA01']), ('Prednisone', 'بريدنيزون', 'TAB', 'Corticosteroid', '5mg', ['H02AB07']), ('Azithromycin', 'أزيثروميسين', 'TAB', 'Antibiotic', '250mg', ['J01FA10']), ('Ciprofloxacin', 'سيبروفلوكساسين', 'TAB', 'Antibiotic', '500mg', ['J01MA02']), ('Gabapentin', 'جابابنتين', 'CAP', 'Anticonvulsant', '300mg', ['N03AX12']), ('Tramadol', 'ترامادول', 'TAB', 'Opioid analgesic', '50mg', ['N02AX02']), ('Cetirizine 200units/ml', 'سيتيريزين 200units/ml', 'TAB', 'Antihistamine', '200units/ml', ['R06AE07']), ('Enalapril 200units/ml', 'إنالابريل 200units/ml', 'TAB', 'ACE Inhibitor', '200units/ml', ['C09AA02']), ('Hydrochlorothiazide 5mcg', 'هيدروكلوروثيازيد 5mcg', 'TAB', 'Diuretic', '5mcg', ['C03AA03']), ('Amoxicillin 200mg', 'أموكسيسيلين 200mg', 'CAP', 'Antibiotic', '200mg', ['J01CA04']), ('Dapagliflozin 500mg', 'داباجليفلوزين 500mg', 'TAB', 'Antidiabetic', '500mg', ['A10BK01']), ('Enalapril 500mg', 'إنالابريل 500mg', 'TAB', 'ACE Inhibitor', '500mg', ['C09AA02']), ('Lisinopril 50mcg', 'ليسينوبريل 50mcg', 'TAB', 'ACE Inhibitor', '50mcg', ['C09AA03']), ('Amoxicillin 500mcg', 'أموكسيسيلين 500mcg', 'CAP', 'Antibiotic', '500mcg', ['J01CA04']), ('Rosuvastatin 400mcg', 'روسوفاستاتين 400mcg', 'TAB', 'Statin', '400mcg', ['C10AA07']), ('Montelukast 400mg', 'مونتيلوكاست 400mg', 'TAB', 'Leukotriene antagonist', '400mg', ['R03DC03']), ('Amoxicillin 50mg', 'أموكسيسيلين 50mg', 'CAP', 'Antibiotic', '50mg', ['J01CA04']), ('Rosuvastatin 400units/ml', 'روسوفاستاتين 400units/ml', 'TAB', 'Statin', '400units/ml', ['C10AA07']), ('Dapagliflozin 400units/ml', 'داباجليفلوزين 400units/ml', 'TAB', 'Antidiabetic', '400units/ml', ['A10BK01']), ('Sitagliptin 400mcg', 'سيتاجليبتين 400mcg', 'TAB', 'Antidiabetic', '400mcg', ['A10BH01']), ('Amoxicillin 10units/ml', 'أموكسيسيلين 10units/ml', 'CAP', 'Antibiotic', '10units/ml', ['J01CA04']), ('Lisinopril 500units/ml', 'ليسينوبريل 500units/ml', 'TAB', 'ACE Inhibitor', '500units/ml', ['C09AA03']), ('Dapagliflozin 5units/ml', 'داباجليفلوزين 5units/ml', 'TAB', 'Antidiabetic', '5units/ml', ['A10BK01']), ('Enalapril 5mg', 'إنالابريل 5mg', 'TAB', 'ACE Inhibitor', '5mg', ['C09AA02']), ('Cetirizine 400mg', 'سيتيريزين 400mg', 'TAB', 'Antihistamine', '400mg', ['R06AE07']), ('Montelukast 25mg', 'مونتيلوكاست 25mg', 'TAB', 'Leukotriene antagonist', '25mg', ['R03DC03']), ('Enalapril 400mg', 'إنالابريل 400mg', 'TAB', 'ACE Inhibitor', '400mg', ['C09AA02']), ('Rosuvastatin 25mg', 'روسوفاستاتين 25mg', 'TAB', 'Statin', '25mg', ['C10AA07']), ('Dapagliflozin 400mcg', 'داباجليفلوزين 400mcg', 'TAB', 'Antidiabetic', '400mcg', ['A10BK01']), ('Cetirizine 5mg', 'سيتيريزين 5mg', 'TAB', 'Antihistamine', '5mg', ['R06AE07']), ('Dapagliflozin 5units/ml', 'داباجليفلوزين 5units/ml', 'TAB', 'Antidiabetic', '5units/ml', ['A10BK01']), ('Hydrochlorothiazide 20mcg', 'هيدروكلوروثيازيد 20mcg', 'TAB', 'Diuretic', '20mcg', ['C03AA03']), ('Sitagliptin 500mcg', 'سيتاجليبتين 500mcg', 'TAB', 'Antidiabetic', '500mcg', ['A10BH01']), ('Montelukast 100mcg', 'مونتيلوكاست 100mcg', 'TAB', 'Leukotriene antagonist', '100mcg', ['R03DC03']), ('Enalapril 50mg', 'إنالابريل 50mg', 'TAB', 'ACE Inhibitor', '50mg', ['C09AA02']), ('Sitagliptin 20mcg', 'سيتاجليبتين 20mcg', 'TAB', 'Antidiabetic', '20mcg', ['A10BH01']), ('Lisinopril 400mg', 'ليسينوبريل 400mg', 'TAB', 'ACE Inhibitor', '400mg', ['C09AA03']), ('Amoxicillin 200mg', 'أموكسيسيلين 200mg', 'CAP', 'Antibiotic', '200mg', ['J01CA04']), ('Fexofenadine 200mcg', 'فيكسوفينادين 200mcg', 'TAB', 'Antihistamine', '200mcg', ['R06AX26']), ('Lisinopril 10units/ml', 'ليسينوبريل 10units/ml', 'TAB', 'ACE Inhibitor', '10units/ml', ['C09AA03']), ('Hydrochlorothiazide 20mcg', 'هيدروكلوروثيازيد 20mcg', 'TAB', 'Diuretic', '20mcg', ['C03AA03']), ('Fexofenadine 25mcg', 'فيكسوفينادين 25mcg', 'TAB', 'Antihistamine', '25mcg', ['R06AX26']), ('Lisinopril 10mcg', 'ليسينوبريل 10mcg', 'TAB', 'ACE Inhibitor', '10mcg', ['C09AA03']), ('Fexofenadine 200units/ml', 'فيكسوفينادين 200units/ml', 'TAB', 'Antihistamine', '200units/ml', ['R06AX26']), ('Amoxicillin 200units/ml', 'أموكسيسيلين 200units/ml', 'CAP', 'Antibiotic', '200units/ml', ['J01CA04']), ('Fexofenadine 25mcg', 'فيكسوفينادين 25mcg', 'TAB', 'Antihistamine', '25mcg', ['R06AX26']), ('Enalapril 400units/ml', 'إنالابريل 400units/ml', 'TAB', 'ACE Inhibitor', '400units/ml', ['C09AA02']), ('Enalapril 100mcg', 'إنالابريل 100mcg', 'TAB', 'ACE Inhibitor', '100mcg', ['C09AA02']), ('Fexofenadine 20units/ml', 'فيكسوفينادين 20units/ml', 'TAB', 'Antihistamine', '20units/ml', ['R06AX26']), ('Lisinopril 20units/ml', 'ليسينوبريل 20units/ml', 'TAB', 'ACE Inhibitor', '20units/ml', ['C09AA03']), ('Cetirizine 200mcg', 'سيتيريزين 200mcg', 'TAB', 'Antihistamine', '200mcg', ['R06AE07']), ('Amoxicillin 10units/ml', 'أموكسيسيلين 10units/ml', 'CAP', 'Antibiotic', '10units/ml', ['J01CA04']), ('Rosuvastatin 5mg', 'روسوفاستاتين 5mg', 'TAB', 'Statin', '5mg', ['C10AA07']), ('Hydrochlorothiazide 20mcg', 'هيدروكلوروثيازيد 20mcg', 'TAB', 'Diuretic', '20mcg', ['C03AA03']), ('Amoxicillin 50mg', 'أموكسيسيلين 50mg', 'CAP', 'Antibiotic', '50mg', ['J01CA04']), ('Fexofenadine 5mg', 'فيكسوفينادين 5mg', 'TAB', 'Antihistamine', '5mg', ['R06AX26']), ('Dapagliflozin 50units/ml', 'داباجليفلوزين 50units/ml', 'TAB', 'Antidiabetic', '50units/ml', ['A10BK01']), ('Cetirizine 25mcg', 'سيتيريزين 25mcg', 'TAB', 'Antihistamine', '25mcg', ['R06AE07']), ('Hydrochlorothiazide 500mcg', 'هيدروكلوروثيازيد 500mcg', 'TAB', 'Diuretic', '500mcg', ['C03AA03']), ('Lisinopril 25mg', 'ليسينوبريل 25mg', 'TAB', 'ACE Inhibitor', '25mg', ['C09AA03']), ('Montelukast 400units/ml', 'مونتيلوكاست 400units/ml', 'TAB', 'Leukotriene antagonist', '400units/ml', ['R03DC03']), ('Sitagliptin 20units/ml', 'سيتاجليبتين 20units/ml', 'TAB', 'Antidiabetic', '20units/ml', ['A10BH01']), ('Cetirizine 200units/ml', 'سيتيريزين 200units/ml', 'TAB', 'Antihistamine', '200units/ml', ['R06AE07']), ('Rosuvastatin 10units/ml', 'روسوفاستاتين 10units/ml', 'TAB', 'Statin', '10units/ml', ['C10AA07']), ('Enalapril 200mcg', 'إنالابريل 200mcg', 'TAB', 'ACE Inhibitor', '200mcg', ['C09AA02']), ('Montelukast 20mg', 'مونتيلوكاست 20mg', 'TAB', 'Leukotriene antagonist', '20mg', ['R03DC03']), ('Hydrochlorothiazide 500mcg', 'هيدروكلوروثيازيد 500mcg', 'TAB', 'Diuretic', '500mcg', ['C03AA03']), ('Enalapril 25units/ml', 'إنالابريل 25units/ml', 'TAB', 'ACE Inhibitor', '25units/ml', ['C09AA02']), ('Montelukast 20units/ml', 'مونتيلوكاست 20units/ml', 'TAB', 'Leukotriene antagonist', '20units/ml', ['R03DC03']), ('Fexofenadine 25units/ml', 'فيكسوفينادين 25units/ml', 'TAB', 'Antihistamine', '25units/ml', ['R06AX26']), ('Hydrochlorothiazide 500mcg', 'هيدروكلوروثيازيد 500mcg', 'TAB', 'Diuretic', '500mcg', ['C03AA03']), ('Lisinopril 5units/ml', 'ليسينوبريل 5units/ml', 'TAB', 'ACE Inhibitor', '5units/ml', ['C09AA03']), ('Lisinopril 20units/ml', 'ليسينوبريل 20units/ml', 'TAB', 'ACE Inhibitor', '20units/ml', ['C09AA03']), ('Fexofenadine 20mg', 'فيكسوفينادين 20mg', 'TAB', 'Antihistamine', '20mg', ['R06AX26']), ('Cetirizine 20units/ml', 'سيتيريزين 20units/ml', 'TAB', 'Antihistamine', '20units/ml', ['R06AE07']), ('Lisinopril 25mg', 'ليسينوبريل 25mg', 'TAB', 'ACE Inhibitor', '25mg', ['C09AA03']), ('Rosuvastatin 400units/ml', 'روسوفاستاتين 400units/ml', 'TAB', 'Statin', '400units/ml', ['C10AA07']), ('Hydrochlorothiazide 50mg', 'هيدروكلوروثيازيد 50mg', 'TAB', 'Diuretic', '50mg', ['C03AA03']), ('Hydrochlorothiazide 20units/ml', 'هيدروكلوروثيازيد 20units/ml', 'TAB', 'Diuretic', '20units/ml', ['C03AA03']), ('Amoxicillin 5mg', 'أموكسيسيلين 5mg', 'CAP', 'Antibiotic', '5mg', ['J01CA04']), ('Cetirizine 10mcg', 'سيتيريزين 10mcg', 'TAB', 'Antihistamine', '10mcg', ['R06AE07']), ('Cetirizine 500mcg', 'سيتيريزين 500mcg', 'TAB', 'Antihistamine', '500mcg', ['R06AE07']), ('Rosuvastatin 25mg', 'روسوفاستاتين 25mg', 'TAB', 'Statin', '25mg', ['C10AA07']), ('Cetirizine 100units/ml', 'سيتيريزين 100units/ml', 'TAB', 'Antihistamine', '100units/ml', ['R06AE07']), ('Rosuvastatin 500mg', 'روسوفاستاتين 500mg', 'TAB', 'Statin', '500mg', ['C10AA07']), ('Fexofenadine 50mcg', 'فيكسوفينادين 50mcg', 'TAB', 'Antihistamine', '50mcg', ['R06AX26']), ('Sitagliptin 200units/ml', 'سيتاجليبتين 200units/ml', 'TAB', 'Antidiabetic', '200units/ml', ['A10BH01']), ('Montelukast 500mg', 'مونتيلوكاست 500mg', 'TAB', 'Leukotriene antagonist', '500mg', ['R03DC03']), ('Enalapril 50units/ml', 'إنالابريل 50units/ml', 'TAB', 'ACE Inhibitor', '50units/ml', ['C09AA02']), ('Lisinopril 200units/ml', 'ليسينوبريل 200units/ml', 'TAB', 'ACE Inhibitor', '200units/ml', ['C09AA03']), ('Fexofenadine 200units/ml', 'فيكسوفينادين 200units/ml', 'TAB', 'Antihistamine', '200units/ml', ['R06AX26']), ('Sitagliptin 400mcg', 'سيتاجليبتين 400mcg', 'TAB', 'Antidiabetic', '400mcg', ['A10BH01']), ('Amoxicillin 50mcg', 'أموكسيسيلين 50mcg', 'CAP', 'Antibiotic', '50mcg', ['J01CA04']), ('Cetirizine 100units/ml', 'سيتيريزين 100units/ml', 'TAB', 'Antihistamine', '100units/ml', ['R06AE07']), ('Amoxicillin 10units/ml', 'أموكسيسيلين 10units/ml', 'CAP', 'Antibiotic', '10units/ml', ['J01CA04']), ('Montelukast 400mg', 'مونتيلوكاست 400mg', 'TAB', 'Leukotriene antagonist', '400mg', ['R03DC03']), ('Hydrochlorothiazide 5mcg', 'هيدروكلوروثيازيد 5mcg', 'TAB', 'Diuretic', '5mcg', ['C03AA03']), ('Rosuvastatin 100mg', 'روسوفاستاتين 100mg', 'TAB', 'Statin', '100mg', ['C10AA07']), ('Hydrochlorothiazide 200units/ml', 'هيدروكلوروثيازيد 200units/ml', 'TAB', 'Diuretic', '200units/ml', ['C03AA03']), ('Rosuvastatin 20mg', 'روسوفاستاتين 20mg', 'TAB', 'Statin', '20mg', ['C10AA07']), ('Dapagliflozin 400mg', 'داباجليفلوزين 400mg', 'TAB', 'Antidiabetic', '400mg', ['A10BK01']), ('Cetirizine 500mg', 'سيتيريزين 500mg', 'TAB', 'Antihistamine', '500mg', ['R06AE07']), ('Sitagliptin 25mg', 'سيتاجليبتين 25mg', 'TAB', 'Antidiabetic', '25mg', ['A10BH01']), ('Hydrochlorothiazide 25mg', 'هيدروكلوروثيازيد 25mg', 'TAB', 'Diuretic', '25mg', ['C03AA03']), ('Sitagliptin 100mcg', 'سيتاجليبتين 100mcg', 'TAB', 'Antidiabetic', '100mcg', ['A10BH01']), ('Enalapril 200units/ml', 'إنالابريل 200units/ml', 'TAB', 'ACE Inhibitor', '200units/ml', ['C09AA02']), ('Rosuvastatin 50mcg', 'روسوفاستاتين 50mcg', 'TAB', 'Statin', '50mcg', ['C10AA07']), ('Sitagliptin 400units/ml', 'سيتاجليبتين 400units/ml', 'TAB', 'Antidiabetic', '400units/ml', ['A10BH01']), ('Enalapril 20mg', 'إنالابريل 20mg', 'TAB', 'ACE Inhibitor', '20mg', ['C09AA02']), ('Rosuvastatin 25units/ml', 'روسوفاستاتين 25units/ml', 'TAB', 'Statin', '25units/ml', ['C10AA07']), ('Hydrochlorothiazide 100units/ml', 'هيدروكلوروثيازيد 100units/ml', 'TAB', 'Diuretic', '100units/ml', ['C03AA03']), ('Cetirizine 100units/ml', 'سيتيريزين 100units/ml', 'TAB', 'Antihistamine', '100units/ml', ['R06AE07']), ('Montelukast 50units/ml', 'مونتيلوكاست 50units/ml', 'TAB', 'Leukotriene antagonist', '50units/ml', ['R03DC03']), ('Amoxicillin 10units/ml', 'أموكسيسيلين 10units/ml', 'CAP', 'Antibiotic', '10units/ml', ['J01CA04']), ('Hydrochlorothiazide 5units/ml', 'هيدروكلوروثيازيد 5units/ml', 'TAB', 'Diuretic', '5units/ml', ['C03AA03']), ('Cetirizine 50mcg', 'سيتيريزين 50mcg', 'TAB', 'Antihistamine', '50mcg', ['R06AE07']), ('Sitagliptin 500mg', 'سيتاجليبتين 500mg', 'TAB', 'Antidiabetic', '500mg', ['A10BH01']), ('Hydrochlorothiazide 5units/ml', 'هيدروكلوروثيازيد 5units/ml', 'TAB', 'Diuretic', '5units/ml', ['C03AA03']), ('Sitagliptin 20mg', 'سيتاجليبتين 20mg', 'TAB', 'Antidiabetic', '20mg', ['A10BH01']), ('Amoxicillin 5units/ml', 'أموكسيسيلين 5units/ml', 'CAP', 'Antibiotic', '5units/ml', ['J01CA04']), ('Fexofenadine 400units/ml', 'فيكسوفينادين 400units/ml', 'TAB', 'Antihistamine', '400units/ml', ['R06AX26']), ('Sitagliptin 200mg', 'سيتاجليبتين 200mg', 'TAB', 'Antidiabetic', '200mg', ['A10BH01']), ('Hydrochlorothiazide 100mg', 'هيدروكلوروثيازيد 100mg', 'TAB', 'Diuretic', '100mg', ['C03AA03']), ('Lisinopril 5mcg', 'ليسينوبريل 5mcg', 'TAB', 'ACE Inhibitor', '5mcg', ['C09AA03']), ('Amoxicillin 100mg', 'أموكسيسيلين 100mg', 'CAP', 'Antibiotic', '100mg', ['J01CA04']), ('Rosuvastatin 200mg', 'روسوفاستاتين 200mg', 'TAB', 'Statin', '200mg', ['C10AA07']), ('Sitagliptin 200units/ml', 'سيتاجليبتين 200units/ml', 'TAB', 'Antidiabetic', '200units/ml', ['A10BH01']), ('Hydrochlorothiazide 400units/ml', 'هيدروكلوروثيازيد 400units/ml', 'TAB', 'Diuretic', '400units/ml', ['C03AA03']), ('Lisinopril 25mcg', 'ليسينوبريل 25mcg', 'TAB', 'ACE Inhibitor', '25mcg', ['C09AA03']), ('Fexofenadine 25mcg', 'فيكسوفينادين 25mcg', 'TAB', 'Antihistamine', '25mcg', ['R06AX26']), ('Fexofenadine 25mcg', 'فيكسوفينادين 25mcg', 'TAB', 'Antihistamine', '25mcg', ['R06AX26']), ('Montelukast 500units/ml', 'مونتيلوكاست 500units/ml', 'TAB', 'Leukotriene antagonist', '500units/ml', ['R03DC03']), ('Fexofenadine 10units/ml', 'فيكسوفينادين 10units/ml', 'TAB', 'Antihistamine', '10units/ml', ['R06AX26']), ('Cetirizine 400units/ml', 'سيتيريزين 400units/ml', 'TAB', 'Antihistamine', '400units/ml', ['R06AE07']), ('Rosuvastatin 400mcg', 'روسوفاستاتين 400mcg', 'TAB', 'Statin', '400mcg', ['C10AA07']), ('Lisinopril 400mcg', 'ليسينوبريل 400mcg', 'TAB', 'ACE Inhibitor', '400mcg', ['C09AA03']), ('Enalapril 20units/ml', 'إنالابريل 20units/ml', 'TAB', 'ACE Inhibitor', '20units/ml', ['C09AA02']), ('Lisinopril 20units/ml', 'ليسينوبريل 20units/ml', 'TAB', 'ACE Inhibitor', '20units/ml', ['C09AA03']), ('Fexofenadine 50mcg', 'فيكسوفينادين 50mcg', 'TAB', 'Antihistamine', '50mcg', ['R06AX26']), ('Montelukast 100units/ml', 'مونتيلوكاست 100units/ml', 'TAB', 'Leukotriene antagonist', '100units/ml', ['R03DC03']), ('Cetirizine 100mcg', 'سيتيريزين 100mcg', 'TAB', 'Antihistamine', '100mcg', ['R06AE07']), ('Cetirizine 5mcg', 'سيتيريزين 5mcg', 'TAB', 'Antihistamine', '5mcg', ['R06AE07']), ('Sitagliptin 20units/ml', 'سيتاجليبتين 20units/ml', 'TAB', 'Antidiabetic', '20units/ml', ['A10BH01']), ('Amoxicillin 200units/ml', 'أموكسيسيلين 200units/ml', 'CAP', 'Antibiotic', '200units/ml', ['J01CA04']), ('Montelukast 20units/ml', 'مونتيلوكاست 20units/ml', 'TAB', 'Leukotriene antagonist', '20units/ml', ['R03DC03']), ('Amoxicillin 10mg', 'أموكسيسيلين 10mg', 'CAP', 'Antibiotic', '10mg', ['J01CA04']), ('Montelukast 400units/ml', 'مونتيلوكاست 400units/ml', 'TAB', 'Leukotriene antagonist', '400units/ml', ['R03DC03']), ('Hydrochlorothiazide 400mcg', 'هيدروكلوروثيازيد 400mcg', 'TAB', 'Diuretic', '400mcg', ['C03AA03']), ('Montelukast 200mcg', 'مونتيلوكاست 200mcg', 'TAB', 'Leukotriene antagonist', '200mcg', ['R03DC03']), ('Sitagliptin 5mcg', 'سيتاجليبتين 5mcg', 'TAB', 'Antidiabetic', '5mcg', ['A10BH01']), ('Montelukast 400mcg', 'مونتيلوكاست 400mcg', 'TAB', 'Leukotriene antagonist', '400mcg', ['R03DC03']), ('Lisinopril 50units/ml', 'ليسينوبريل 50units/ml', 'TAB', 'ACE Inhibitor', '50units/ml', ['C09AA03']), ('Cetirizine 20mcg', 'سيتيريزين 20mcg', 'TAB', 'Antihistamine', '20mcg', ['R06AE07']), ('Sitagliptin 400mcg', 'سيتاجليبتين 400mcg', 'TAB', 'Antidiabetic', '400mcg', ['A10BH01']), ('Lisinopril 20mg', 'ليسينوبريل 20mg', 'TAB', 'ACE Inhibitor', '20mg', ['C09AA03']), ('Enalapril 5mcg', 'إنالابريل 5mcg', 'TAB', 'ACE Inhibitor', '5mcg', ['C09AA02']), ('Enalapril 200mg', 'إنالابريل 200mg', 'TAB', 'ACE Inhibitor', '200mg', ['C09AA02']), ('Cetirizine 25mg', 'سيتيريزين 25mg', 'TAB', 'Antihistamine', '25mg', ['R06AE07']), ('Cetirizine 200units/ml', 'سيتيريزين 200units/ml', 'TAB', 'Antihistamine', '200units/ml', ['R06AE07']), ('Cetirizine 500units/ml', 'سيتيريزين 500units/ml', 'TAB', 'Antihistamine', '500units/ml', ['R06AE07']), ('Rosuvastatin 5units/ml', 'روسوفاستاتين 5units/ml', 'TAB', 'Statin', '5units/ml', ['C10AA07']), ('Amoxicillin 50mg', 'أموكسيسيلين 50mg', 'CAP', 'Antibiotic', '50mg', ['J01CA04']), ('Rosuvastatin 10mcg', 'روسوفاستاتين 10mcg', 'TAB', 'Statin', '10mcg', ['C10AA07']), ('Rosuvastatin 50units/ml', 'روسوفاستاتين 50units/ml', 'TAB', 'Statin', '50units/ml', ['C10AA07']), ('Montelukast 500mg', 'مونتيلوكاست 500mg', 'TAB', 'Leukotriene antagonist', '500mg', ['R03DC03']), ('Enalapril 20mcg', 'إنالابريل 20mcg', 'TAB', 'ACE Inhibitor', '20mcg', ['C09AA02']), ('Enalapril 400mg', 'إنالابريل 400mg', 'TAB', 'ACE Inhibitor', '400mg', ['C09AA02']), ('Rosuvastatin 25units/ml', 'روسوفاستاتين 25units/ml', 'TAB', 'Statin', '25units/ml', ['C10AA07']), ('Fexofenadine 20mg', 'فيكسوفينادين 20mg', 'TAB', 'Antihistamine', '20mg', ['R06AX26']), ('Enalapril 5mg', 'إنالابريل 5mg', 'TAB', 'ACE Inhibitor', '5mg', ['C09AA02']), ('Hydrochlorothiazide 20units/ml', 'هيدروكلوروثيازيد 20units/ml', 'TAB', 'Diuretic', '20units/ml', ['C03AA03']), ('Sitagliptin 100mg', 'سيتاجليبتين 100mg', 'TAB', 'Antidiabetic', '100mg', ['A10BH01']), ('Rosuvastatin 100mg', 'روسوفاستاتين 100mg', 'TAB', 'Statin', '100mg', ['C10AA07']), ('Rosuvastatin 100mcg', 'روسوفاستاتين 100mcg', 'TAB', 'Statin', '100mcg', ['C10AA07']), ('Amoxicillin 10mcg', 'أموكسيسيلين 10mcg', 'CAP', 'Antibiotic', '10mcg', ['J01CA04']), ('Montelukast 20mg', 'مونتيلوكاست 20mg', 'TAB', 'Leukotriene antagonist', '20mg', ['R03DC03']), ('Amoxicillin 500mcg', 'أموكسيسيلين 500mcg', 'CAP', 'Antibiotic', '500mcg', ['J01CA04']), ('Montelukast 500mg', 'مونتيلوكاست 500mg', 'TAB', 'Leukotriene antagonist', '500mg', ['R03DC03']), ('Montelukast 25units/ml', 'مونتيلوكاست 25units/ml', 'TAB', 'Leukotriene antagonist', '25units/ml', ['R03DC03']), ('Amoxicillin 100units/ml', 'أموكسيسيلين 100units/ml', 'CAP', 'Antibiotic', '100units/ml', ['J01CA04']), ('Hydrochlorothiazide 5mg', 'هيدروكلوروثيازيد 5mg', 'TAB', 'Diuretic', '5mg', ['C03AA03']), ('Rosuvastatin 500units/ml', 'روسوفاستاتين 500units/ml', 'TAB', 'Statin', '500units/ml', ['C10AA07']), ('Amoxicillin 50units/ml', 'أموكسيسيلين 50units/ml', 'CAP', 'Antibiotic', '50units/ml', ['J01CA04']), ('Cetirizine 10units/ml', 'سيتيريزين 10units/ml', 'TAB', 'Antihistamine', '10units/ml', ['R06AE07']), ('Rosuvastatin 50units/ml', 'روسوفاستاتين 50units/ml', 'TAB', 'Statin', '50units/ml', ['C10AA07']), ('Lisinopril 5mcg', 'ليسينوبريل 5mcg', 'TAB', 'ACE Inhibitor', '5mcg', ['C09AA03']), ('Dapagliflozin 200mcg', 'داباجليفلوزين 200mcg', 'TAB', 'Antidiabetic', '200mcg', ['A10BK01']), ('Dapagliflozin 20mg', 'داباجليفلوزين 20mg', 'TAB', 'Antidiabetic', '20mg', ['A10BK01']), ('Rosuvastatin 10mg', 'روسوفاستاتين 10mg', 'TAB', 'Statin', '10mg', ['C10AA07']), ('Amoxicillin 10mg', 'أموكسيسيلين 10mg', 'CAP', 'Antibiotic', '10mg', ['J01CA04']), ('Cetirizine 20mg', 'سيتيريزين 20mg', 'TAB', 'Antihistamine', '20mg', ['R06AE07']), ('Rosuvastatin 50units/ml', 'روسوفاستاتين 50units/ml', 'TAB', 'Statin', '50units/ml', ['C10AA07']), ('Fexofenadine 5mcg', 'فيكسوفينادين 5mcg', 'TAB', 'Antihistamine', '5mcg', ['R06AX26']), ('Rosuvastatin 20mg', 'روسوفاستاتين 20mg', 'TAB', 'Statin', '20mg', ['C10AA07']), ('Sitagliptin 100mcg', 'سيتاجليبتين 100mcg', 'TAB', 'Antidiabetic', '100mcg', ['A10BH01']), ('Amoxicillin 50mcg', 'أموكسيسيلين 50mcg', 'CAP', 'Antibiotic', '50mcg', ['J01CA04']), ('Amoxicillin 25units/ml', 'أموكسيسيلين 25units/ml', 'CAP', 'Antibiotic', '25units/ml', ['J01CA04']), ('Hydrochlorothiazide 20units/ml', 'هيدروكلوروثيازيد 20units/ml', 'TAB', 'Diuretic', '20units/ml', ['C03AA03']), ('Cetirizine 400mg', 'سيتيريزين 400mg', 'TAB', 'Antihistamine', '400mg', ['R06AE07']), ('Amoxicillin 200mcg', 'أموكسيسيلين 200mcg', 'CAP', 'Antibiotic', '200mcg', ['J01CA04']), ('Hydrochlorothiazide 25units/ml', 'هيدروكلوروثيازيد 25units/ml', 'TAB', 'Diuretic', '25units/ml', ['C03AA03']), ('Amoxicillin 25units/ml', 'أموكسيسيلين 25units/ml', 'CAP', 'Antibiotic', '25units/ml', ['J01CA04']), ('Cetirizine 50units/ml', 'سيتيريزين 50units/ml', 'TAB', 'Antihistamine', '50units/ml', ['R06AE07']), ('Enalapril 20mg', 'إنالابريل 20mg', 'TAB', 'ACE Inhibitor', '20mg', ['C09AA02']), ('Amoxicillin 25mcg', 'أموكسيسيلين 25mcg', 'CAP', 'Antibiotic', '25mcg', ['J01CA04']), ('Rosuvastatin 25mg', 'روسوفاستاتين 25mg', 'TAB', 'Statin', '25mg', ['C10AA07']), ('Amoxicillin 100mcg', 'أموكسيسيلين 100mcg', 'CAP', 'Antibiotic', '100mcg', ['J01CA04']), ('Dapagliflozin 500mcg', 'داباجليفلوزين 500mcg', 'TAB', 'Antidiabetic', '500mcg', ['A10BK01']), ('Hydrochlorothiazide 50units/ml', 'هيدروكلوروثيازيد 50units/ml', 'TAB', 'Diuretic', '50units/ml', ['C03AA03']), ('Montelukast 25mcg', 'مونتيلوكاست 25mcg', 'TAB', 'Leukotriene antagonist', '25mcg', ['R03DC03']), ('Fexofenadine 20mcg', 'فيكسوفينادين 20mcg', 'TAB', 'Antihistamine', '20mcg', ['R06AX26']), ('Rosuvastatin 200units/ml', 'روسوفاستاتين 200units/ml', 'TAB', 'Statin', '200units/ml', ['C10AA07']), ('Hydrochlorothiazide 400units/ml', 'هيدروكلوروثيازيد 400units/ml', 'TAB', 'Diuretic', '400units/ml', ['C03AA03']), ('Dapagliflozin 500units/ml', 'داباجليفلوزين 500units/ml', 'TAB', 'Antidiabetic', '500units/ml', ['A10BK01']), ('Lisinopril 5units/ml', 'ليسينوبريل 5units/ml', 'TAB', 'ACE Inhibitor', '5units/ml', ['C09AA03']), ('Enalapril 5mg', 'إنالابريل 5mg', 'TAB', 'ACE Inhibitor', '5mg', ['C09AA02']), ('Sitagliptin 100mg', 'سيتاجليبتين 100mg', 'TAB', 'Antidiabetic', '100mg', ['A10BH01']), ('Fexofenadine 25mg', 'فيكسوفينادين 25mg', 'TAB', 'Antihistamine', '25mg', ['R06AX26']), ('Cetirizine 10mg', 'سيتيريزين 10mg', 'TAB', 'Antihistamine', '10mg', ['R06AE07']), ('Fexofenadine 10units/ml', 'فيكسوفينادين 10units/ml', 'TAB', 'Antihistamine', '10units/ml', ['R06AX26']), ('Fexofenadine 20units/ml', 'فيكسوفينادين 20units/ml', 'TAB', 'Antihistamine', '20units/ml', ['R06AX26']), ('Sitagliptin 10mg', 'سيتاجليبتين 10mg', 'TAB', 'Antidiabetic', '10mg', ['A10BH01']), ('Dapagliflozin 100units/ml', 'داباجليفلوزين 100units/ml', 'TAB', 'Antidiabetic', '100units/ml', ['A10BK01']), ('Amoxicillin 20units/ml', 'أموكسيسيلين 20units/ml', 'CAP', 'Antibiotic', '20units/ml', ['J01CA04']), ('Dapagliflozin 10mcg', 'داباجليفلوزين 10mcg', 'TAB', 'Antidiabetic', '10mcg', ['A10BK01']), ('Dapagliflozin 400mcg', 'داباجليفلوزين 400mcg', 'TAB', 'Antidiabetic', '400mcg', ['A10BK01']), ('Dapagliflozin 10mg', 'داباجليفلوزين 10mg', 'TAB', 'Antidiabetic', '10mg', ['A10BK01']), ('Amoxicillin 400mcg', 'أموكسيسيلين 400mcg', 'CAP', 'Antibiotic', '400mcg', ['J01CA04']), ('Dapagliflozin 500mg', 'داباجليفلوزين 500mg', 'TAB', 'Antidiabetic', '500mg', ['A10BK01']), ('Dapagliflozin 25mg', 'داباجليفلوزين 25mg', 'TAB', 'Antidiabetic', '25mg', ['A10BK01']), ('Montelukast 10units/ml', 'مونتيلوكاست 10units/ml', 'TAB', 'Leukotriene antagonist', '10units/ml', ['R03DC03']), ('Rosuvastatin 200mg', 'روسوفاستاتين 200mg', 'TAB', 'Statin', '200mg', ['C10AA07']), ('Sitagliptin 400mg', 'سيتاجليبتين 400mg', 'TAB', 'Antidiabetic', '400mg', ['A10BH01']), ('Fexofenadine 10units/ml', 'فيكسوفينادين 10units/ml', 'TAB', 'Antihistamine', '10units/ml', ['R06AX26']), ('Sitagliptin 100mcg', 'سيتاجليبتين 100mcg', 'TAB', 'Antidiabetic', '100mcg', ['A10BH01']), ('Lisinopril 5mg', 'ليسينوبريل 5mg', 'TAB', 'ACE Inhibitor', '5mg', ['C09AA03']), ('Hydrochlorothiazide 400mg', 'هيدروكلوروثيازيد 400mg', 'TAB', 'Diuretic', '400mg', ['C03AA03']), ('Enalapril 400mg', 'إنالابريل 400mg', 'TAB', 'ACE Inhibitor', '400mg', ['C09AA02']), ('Fexofenadine 25mg', 'فيكسوفينادين 25mg', 'TAB', 'Antihistamine', '25mg', ['R06AX26']), ('Montelukast 10mg', 'مونتيلوكاست 10mg', 'TAB', 'Leukotriene antagonist', '10mg', ['R03DC03']), ('Hydrochlorothiazide 100mcg', 'هيدروكلوروثيازيد 100mcg', 'TAB', 'Diuretic', '100mcg', ['C03AA03']), ('Enalapril 20mg', 'إنالابريل 20mg', 'TAB', 'ACE Inhibitor', '20mg', ['C09AA02']), ('Dapagliflozin 100units/ml', 'داباجليفلوزين 100units/ml', 'TAB', 'Antidiabetic', '100units/ml', ['A10BK01']), ('Enalapril 10mcg', 'إنالابريل 10mcg', 'TAB', 'ACE Inhibitor', '10mcg', ['C09AA02']), ('Montelukast 25units/ml', 'مونتيلوكاست 25units/ml', 'TAB', 'Leukotriene antagonist', '25units/ml', ['R03DC03']), ('Dapagliflozin 20mcg', 'داباجليفلوزين 20mcg', 'TAB', 'Antidiabetic', '20mcg', ['A10BK01']), ('Lisinopril 5units/ml', 'ليسينوبريل 5units/ml', 'TAB', 'ACE Inhibitor', '5units/ml', ['C09AA03']), ('Hydrochlorothiazide 25units/ml', 'هيدروكلوروثيازيد 25units/ml', 'TAB', 'Diuretic', '25units/ml', ['C03AA03']), ('Montelukast 400mcg', 'مونتيلوكاست 400mcg', 'TAB', 'Leukotriene antagonist', '400mcg', ['R03DC03']), ('Enalapril 20units/ml', 'إنالابريل 20units/ml', 'TAB', 'ACE Inhibitor', '20units/ml', ['C09AA02']), ('Rosuvastatin 50mcg', 'روسوفاستاتين 50mcg', 'TAB', 'Statin', '50mcg', ['C10AA07']), ('Cetirizine 400units/ml', 'سيتيريزين 400units/ml', 'TAB', 'Antihistamine', '400units/ml', ['R06AE07']), ('Dapagliflozin 50units/ml', 'داباجليفلوزين 50units/ml', 'TAB', 'Antidiabetic', '50units/ml', ['A10BK01']), ('Montelukast 25mg', 'مونتيلوكاست 25mg', 'TAB', 'Leukotriene antagonist', '25mg', ['R03DC03']), ('Enalapril 50units/ml', 'إنالابريل 50units/ml', 'TAB', 'ACE Inhibitor', '50units/ml', ['C09AA02']), ('Montelukast 20mcg', 'مونتيلوكاست 20mcg', 'TAB', 'Leukotriene antagonist', '20mcg', ['R03DC03']), ('Dapagliflozin 400mg', 'داباجليفلوزين 400mg', 'TAB', 'Antidiabetic', '400mg', ['A10BK01']), ('Amoxicillin 5mg', 'أموكسيسيلين 5mg', 'CAP', 'Antibiotic', '5mg', ['J01CA04']), ('Dapagliflozin 10units/ml', 'داباجليفلوزين 10units/ml', 'TAB', 'Antidiabetic', '10units/ml', ['A10BK01']), ('Sitagliptin 50mg', 'سيتاجليبتين 50mg', 'TAB', 'Antidiabetic', '50mg', ['A10BH01']), ('Cetirizine 100mg', 'سيتيريزين 100mg', 'TAB', 'Antihistamine', '100mg', ['R06AE07']), ('Dapagliflozin 200units/ml', 'داباجليفلوزين 200units/ml', 'TAB', 'Antidiabetic', '200units/ml', ['A10BK01']), ('Rosuvastatin 500mg', 'روسوفاستاتين 500mg', 'TAB', 'Statin', '500mg', ['C10AA07']), ('Fexofenadine 5units/ml', 'فيكسوفينادين 5units/ml', 'TAB', 'Antihistamine', '5units/ml', ['R06AX26']), ('Amoxicillin 200mcg', 'أموكسيسيلين 200mcg', 'CAP', 'Antibiotic', '200mcg', ['J01CA04']), ('Lisinopril 20mg', 'ليسينوبريل 20mg', 'TAB', 'ACE Inhibitor', '20mg', ['C09AA03']), ('Cetirizine 100mg', 'سيتيريزين 100mg', 'TAB', 'Antihistamine', '100mg', ['R06AE07']), ('Montelukast 200mg', 'مونتيلوكاست 200mg', 'TAB', 'Leukotriene antagonist', '200mg', ['R03DC03']), ('Amoxicillin 400mg', 'أموكسيسيلين 400mg', 'CAP', 'Antibiotic', '400mg', ['J01CA04']), ('Cetirizine 50mcg', 'سيتيريزين 50mcg', 'TAB', 'Antihistamine', '50mcg', ['R06AE07']), ('Amoxicillin 20mcg', 'أموكسيسيلين 20mcg', 'CAP', 'Antibiotic', '20mcg', ['J01CA04']), ('Montelukast 400mg', 'مونتيلوكاست 400mg', 'TAB', 'Leukotriene antagonist', '400mg', ['R03DC03']), ('Amoxicillin 400units/ml', 'أموكسيسيلين 400units/ml', 'CAP', 'Antibiotic', '400units/ml', ['J01CA04']), ('Rosuvastatin 10mcg', 'روسوفاستاتين 10mcg', 'TAB', 'Statin', '10mcg', ['C10AA07']), ('Fexofenadine 100units/ml', 'فيكسوفينادين 100units/ml', 'TAB', 'Antihistamine', '100units/ml', ['R06AX26']), ('Hydrochlorothiazide 500units/ml', 'هيدروكلوروثيازيد 500units/ml', 'TAB', 'Diuretic', '500units/ml', ['C03AA03']), ('Sitagliptin 5mg', 'سيتاجليبتين 5mg', 'TAB', 'Antidiabetic', '5mg', ['A10BH01']), ('Fexofenadine 100mcg', 'فيكسوفينادين 100mcg', 'TAB', 'Antihistamine', '100mcg', ['R06AX26']), ('Hydrochlorothiazide 10mcg', 'هيدروكلوروثيازيد 10mcg', 'TAB', 'Diuretic', '10mcg', ['C03AA03']), ('Cetirizine 20units/ml', 'سيتيريزين 20units/ml', 'TAB', 'Antihistamine', '20units/ml', ['R06AE07']), ('Montelukast 20units/ml', 'مونتيلوكاست 20units/ml', 'TAB', 'Leukotriene antagonist', '20units/ml', ['R03DC03']), ('Lisinopril 200mg', 'ليسينوبريل 200mg', 'TAB', 'ACE Inhibitor', '200mg', ['C09AA03']), ('Dapagliflozin 10mg', 'داباجليفلوزين 10mg', 'TAB', 'Antidiabetic', '10mg', ['A10BK01']), ('Montelukast 20mcg', 'مونتيلوكاست 20mcg', 'TAB', 'Leukotriene antagonist', '20mcg', ['R03DC03']), ('Montelukast 10mg', 'مونتيلوكاست 10mg', 'TAB', 'Leukotriene antagonist', '10mg', ['R03DC03']), ('Lisinopril 25units/ml', 'ليسينوبريل 25units/ml', 'TAB', 'ACE Inhibitor', '25units/ml', ['C09AA03']), ] SAUDI_DOSAGE_FORMS = [ 'TAB', 'CAP', 'SYR', 'INJ', 'CRE', 'GEL', 'DRO', 'INH', 'SUP', 'LOT' ] SAUDI_ROUTES = [ 'ORAL', 'IV', 'IM', 'SC', 'TOPICAL', 'INHALATION', 'RECTAL', 'OPHTHALMIC', 'OTIC', 'NASAL' ] SAUDI_FREQUENCIES = [ 'ONCE_DAILY', 'TWICE_DAILY', 'THREE_TIMES_DAILY', 'FOUR_TIMES_DAILY', 'EVERY_6_HOURS', 'EVERY_8_HOURS', 'EVERY_12_HOURS', 'WEEKLY', 'AS_NEEDED' ] def get_pharmacists(tenants): """Get pharmacists for pharmacy operations""" pharmacists = [] for tenant in tenants: tenant_pharmacists = User.objects.filter( tenant=tenant, is_active=True, employee_profile__role='PHARMACIST' ) pharmacists.extend(list(tenant_pharmacists)) # Create mock pharmacists if none exist if not pharmacists: pharmacists = create_mock_pharmacists(tenants) return pharmacists def create_mock_pharmacists(tenants): """Create mock pharmacists""" pharmacists = [] mock_pharmacists = [ {'first_name': 'Ahmed', 'last_name': 'Al-Kindi'}, {'first_name': 'Fatma', 'last_name': 'Al-Zahra'}, {'first_name': 'Khalid', 'last_name': 'Al-Pharma'}, {'first_name': 'Nour', 'last_name': 'Al-Dawaa'}, ] for tenant in tenants: for pharmacist_data in mock_pharmacists: try: email = f"{pharmacist_data['first_name'].lower()}.{pharmacist_data['last_name'].lower().replace('-', '')}@{tenant.domain}" existing_user = User.objects.filter(email=email).first() if not existing_user: user = User.objects.create_user( email=email, first_name=pharmacist_data['first_name'], last_name=pharmacist_data['last_name'], employee_profile__role='PHARMACIST', tenant=tenant, is_active=True, password='temp_password_123' ) pharmacists.append(user) else: pharmacists.append(existing_user) except Exception as e: print(f"Error creating pharmacist: {e}") continue return pharmacists def create_medications(tenants): """Create medication master data""" medications = [] for tenant in tenants: for med_data in SAUDI_MEDICATIONS: name, arabic_name, form, category, strength, ndc_codes = med_data try: medication = Medication.objects.create( tenant=tenant, medication_id=uuid.uuid4(), generic_name=name, brand_name=f"{name} {random.choice(['Plus', 'SR', 'XR', ''])}".strip(), dosage_form=form.upper() if form.upper() in ['TABLET', 'CAPSULE', 'LIQUID', 'INJECTION', 'TOPICAL', 'INHALER', 'PATCH', 'SUPPOSITORY', 'CREAM', 'OINTMENT', 'DROPS', 'SPRAY', 'OTHER'] else 'OTHER', strength=strength, unit_of_measure=random.choice(['MG', 'ML', 'MCG', 'G', 'L', 'UNITS', 'IU', 'MEQ', 'PERCENT','OTHER']), drug_class=category, controlled_substance_schedule=random.choice(['NON', 'CIV', 'CIII', 'CI', 'CII', 'CV']) if 'Tramadol' in name else 'NON', ndc_number=f"{random.randint(1000, 9999)}-{random.randint(100, 999)}-{random.randint(10, 99)}", rxcui=f"{random.randint(100000, 999999)}", indications=f"Treatment of {category.lower()} and related conditions", contraindications="Hypersensitivity to the drug" if random.choice([True, False]) else None, side_effects="Nausea, headache, dizziness" if random.choice([True, False]) else None, warnings="Use with caution in elderly patients" if random.choice([True, False]) else None, adult_dose_range=f"{strength} daily to twice daily", pediatric_dose_range=f"Reduce dose by 50%" if random.choice([True, False]) else None, max_daily_dose=f"{int(strength.split('mg')[0]) * 4}mg" if 'mg' in strength else "As per guidelines", routes_of_administration=['ORAL'] if form in ['TAB', 'CAP', 'SYR'] else ['TOPICAL'], storage_requirements=f"Store at room temperature (15-30°C)", manufacturer=random.choice([ 'Saudi Pharmaceutical Industries', 'Jamjoom Pharma', 'Tabuk Pharmaceuticals', 'Riyadh Pharma', 'SPIMACO' ]), is_active=True, created_at=django_timezone.now() - timedelta(days=random.randint(30, 365)), updated_at=django_timezone.now() - timedelta(days=random.randint(0, 30)) ) medications.append(medication) except Exception as e: print(f"Error creating medication {name}: {e}") continue print(f"Created {len(medications)} medications") return medications def create_pharmacy_inventory(medications): """Create pharmacy inventory items""" inventory_items = [] for medication in medications: # Create 1-3 different package sizes/batches per medication num_items = random.randint(1, 3) for item_num in range(num_items): received_date = django_timezone.now().date() - timedelta(days=random.randint(1, 30)) expiration_date = received_date + timedelta(days=random.randint(365, 1095)) try: inventory_item = InventoryItem.objects.create( tenant=medication.tenant, medication=medication, lot_number=f"BAT{random.randint(100000, 999999)}", expiration_date=expiration_date, quantity_on_hand=random.randint(0, 1000), quantity_allocated=random.randint(0, 50), quantity_available=0, # Will be calculated in save() reorder_point=random.randint(10, 50), reorder_quantity=random.randint(100, 500), storage_location=f"Shelf {random.choice(['A', 'B', 'C', 'D'])}-{random.randint(1, 20)}", bin_location=f"Bin-{random.randint(1, 10)}" if random.choice([True, False]) else None, unit_cost=Decimal(str(round(random.uniform(0.50, 100.00), 2))), total_cost=Decimal('0.00'), # Will be calculated in save() supplier=random.choice([ 'National Medical Supply', 'Gulf Pharma Trading', 'Saudi Medical Distributors', 'Riyadh Medical Supplies', 'Jeddah Pharma Hub' ]), purchase_order_number=f"PO{random.randint(10000, 99999)}" if random.choice([True, False]) else None, received_date=received_date, last_counted=received_date + timedelta(days=random.randint(1, 30)) if random.choice( [True, False]) else None, status=random.choice(['ACTIVE', 'QUARANTINE']) if random.random() < 0.95 else 'QUARANTINE', quality_checked=random.choice([True, False]), quality_check_date=received_date + timedelta(days=1) if random.choice([True, False]) else None, quality_notes="Quality check passed" if random.choice([True, False]) else None, created_at=django_timezone.now() - timedelta(days=random.randint(7, 60)), updated_at=django_timezone.now() - timedelta(days=random.randint(0, 7)) ) inventory_items.append(inventory_item) except Exception as e: print(f"Error creating inventory item for {medication.generic_name}: {e}") continue print(f"Created {len(inventory_items)} inventory items") return inventory_items def create_prescriptions(tenants, days_back=30): """Create prescriptions""" prescriptions = [] # Get required data patients = list(PatientProfile.objects.filter(tenant__in=tenants)) providers = list(User.objects.filter( tenant__in=tenants, employee_profile__role__in=['PHYSICIAN', 'NURSE_PRACTITIONER'], is_active=True )) encounters = list(Encounter.objects.filter(tenant__in=tenants, status='COMPLETED')) medications = list(Medication.objects.filter(tenant__in=tenants)) if not all([patients, providers, medications]): print("Missing required data for prescriptions") return prescriptions start_date = django_timezone.now().date() - timedelta(days=days_back) for day_offset in range(days_back): prescription_date = start_date + timedelta(days=day_offset) daily_prescriptions = random.randint(10, 30) for prescription_num in range(daily_prescriptions): patient = random.choice(patients) provider = random.choice([p for p in providers if p.tenant == patient.tenant]) # Link to encounter if available patient_encounters = [e for e in encounters if e.patient == patient] encounter = random.choice(patient_encounters) if patient_encounters else None # Prescription details prescribed_datetime = django_timezone.make_aware( datetime.combine(prescription_date, time(random.randint(8, 18), random.randint(0, 59))) ) status = random.choices( ['ACTIVE', 'DISPENSED', 'COMPLETED', 'CANCELLED', 'EXPIRED'], weights=[40, 25, 20, 10, 5] )[0] medication = random.choice([m for m in medications if m.tenant == patient.tenant]) # Generate unique prescription number prescription_number = f"RX{patient.tenant.id}{day_offset:02d}{prescription_num:03d}{random.randint(100, 999)}" try: prescription = Prescription.objects.create( tenant=patient.tenant, patient=patient, prescription_id=uuid.uuid4(), prescription_number=prescription_number, prescriber=provider, medication=medication, quantity_prescribed=random.randint(30, 90), quantity_unit='TABLETS' if medication.dosage_form in ['TABLET', 'CAPSULE'] else 'ML', dosage_instructions=random.choice([ "Take one tablet twice daily with food", "Take one capsule daily in the morning", "Take as needed for pain", "Apply thin layer to affected area twice daily" ]), frequency=random.choice([ 'Once daily', 'Twice daily', 'Three times daily', 'As needed' ]), duration=f"{random.randint(7, 30)} days" if random.choice([True, False]) else None, refills_authorized=random.randint(0, 6), refills_remaining=random.randint(0, 6), date_prescribed=prescribed_datetime, date_written=prescribed_datetime.date(), expiration_date=prescribed_datetime.date() + timedelta(days=365), status=status, indication=random.choice([ 'Pain management', 'Hypertension', 'Diabetes', 'Infection', 'Anxiety', 'Depression', 'Asthma', 'Arthritis' ]) if random.choice([True, False]) else None, diagnosis_code=f"M79.{random.randint(10, 99)}", pharmacy_notes=f"Dispensed by pharmacy on {prescription_date}" if random.choice([True, False]) else None, patient_instructions=random.choice([ "Take with food", "Take on empty stomach", "Take at bedtime", "Avoid alcohol", "Complete full course" ]) if random.choice([True, False]) else None, created_at=prescribed_datetime, updated_at=prescribed_datetime + timedelta(hours=random.randint(1, 24)) ) prescriptions.append(prescription) except Exception as e: print(f"Error creating prescription: {e}") continue print(f"Created {len(prescriptions)} prescriptions") return prescriptions def create_dispense_records(prescriptions, inventory_items, pharmacists): """Create medication dispense records""" dispense_records = [] for prescription in prescriptions: if prescription.status not in ['ACTIVE', 'DISPENSED', 'COMPLETED']: continue # Dispense 60-80% of prescriptions if random.random() > 0.8: continue # Get the single medication from the prescription medication = prescription.medication # Find available inventory available_inventory = [ item for item in inventory_items if item.medication == medication and item.quantity_on_hand > 0 ] if not available_inventory: continue inventory_item = random.choice(available_inventory) pharmacist = random.choice([p for p in pharmacists if p.tenant == prescription.tenant]) # Dispense details quantity_prescribed = prescription.quantity_prescribed quantity_dispensed = min(quantity_prescribed, inventory_item.quantity_on_hand) dispense_datetime = prescription.date_prescribed + timedelta( hours=random.randint(2, 48) ) try: dispense_record = DispenseRecord.objects.create( prescription=prescription, inventory_item=inventory_item, dispense_id=uuid.uuid4(), quantity_dispensed=quantity_dispensed, quantity_remaining=quantity_prescribed - quantity_dispensed, date_dispensed=dispense_datetime, dispensed_by=pharmacist, verified_by=pharmacist if random.choice([True, False]) else None, unit_price=inventory_item.unit_cost * Decimal('1.2'), # Add markup total_price=Decimal('0.00'), # Will be calculated in save() copay_amount=Decimal(str(random.randint(10, 100))), insurance_amount=Decimal(str(random.randint(50, 500))), patient_counseled=random.choice([True, False]), counseling_notes=random.choice([ "Medication use instructions provided", "Side effects explained", "Drug interactions discussed", "Storage requirements explained" ]) if random.choice([True, False]) else None, is_refill=random.choice([True, False]), refill_number=random.randint(0, 3) if random.choice([True, False]) else 0, status=random.choice(['DISPENSED', 'PICKED_UP']), picked_up_by=prescription.patient.get_full_name() if random.choice([True, False]) else None, pickup_datetime=dispense_datetime + timedelta(hours=random.randint(1, 24)) if random.choice([True, False]) else None, identification_verified=random.choice([True, False]), quality_check_performed=random.choice([True, False]), quality_notes="Quality check completed" if random.choice([True, False]) else None, created_at=dispense_datetime, updated_at=dispense_datetime + timedelta(minutes=random.randint(5, 30)) ) # Update inventory stock inventory_item.quantity_on_hand -= quantity_dispensed inventory_item.save() dispense_records.append(dispense_record) except Exception as e: print(f"Error creating dispense record: {e}") continue print(f"Created {len(dispense_records)} dispense records") return dispense_records def create_medication_administrations(dispense_records): """Create medication administration records""" administrations = [] nurses = User.objects.filter(employee_profile__role='NURSE', is_active=True) for dispense_record in dispense_records: # Only create administrations for inpatient medications if random.random() > 0.3: # 30% chance for inpatient administration continue # Create 5-15 administration records per dispense num_administrations = random.randint(5, 15) for admin_num in range(num_administrations): admin_datetime = dispense_record.date_dispensed + timedelta( hours=admin_num * random.randint(6, 12) ) nurse = random.choice(nurses) if nurses else dispense_record.dispensed_by try: administration = MedicationAdministration.objects.create( prescription=dispense_record.prescription, patient=dispense_record.prescription.patient, encounter=dispense_record.prescription.encounter, administration_id=uuid.uuid4(), scheduled_datetime=admin_datetime, actual_datetime=admin_datetime + timedelta(minutes=random.randint(0, 30)), dose_given=dispense_record.prescription.medication.strength, route_given=random.choice(['PO', 'IV', 'IM', 'SC', 'TOP']), status=random.choices( ['GIVEN', 'NOT_GIVEN', 'HELD', 'REFUSED'], weights=[80, 10, 5, 5] )[0], administered_by=nurse, witnessed_by=random.choice(nurses) if nurses and random.choice([True, False]) else None, reason_not_given=random.choice([ 'PATIENT_REFUSED', 'PATIENT_ASLEEP', 'PATIENT_NPO', 'ADVERSE_REACTION' ]) if random.random() < 0.2 else None, reason_notes="Patient refused medication" if random.choice([True, False]) else None, patient_response=random.choice([ 'No adverse effects noted', 'Pain improved', 'Tolerated well', 'Mild nausea reported' ]) if random.choice([True, False]) else None, side_effects_observed=random.choice([ 'None', 'Mild drowsiness', 'Nausea', 'Dizziness' ]) if random.choice([True, False]) else None, injection_site=random.choice([ 'Left arm', 'Right arm', 'Abdomen', 'Thigh' ]) if random.choice([True, False]) else None, site_condition="Good condition" if random.choice([True, False]) else None, double_checked=random.choice([True, False]), double_checked_by=random.choice(nurses) if nurses and random.choice([True, False]) else None, created_at=admin_datetime, updated_at=admin_datetime + timedelta(minutes=random.randint(5, 15)) ) administrations.append(administration) except Exception as e: print(f"Error creating medication administration: {e}") continue print(f"Created {len(administrations)} medication administrations") return administrations def create_drug_interactions(medications): """Create drug interaction data""" interactions = [] # Common drug interaction pairs interaction_pairs = [ ('Warfarin', 'Aspirin', 'MAJOR', 'Increased bleeding risk'), ('Metformin', 'Alcohol', 'MODERATE', 'Risk of lactic acidosis'), ('Simvastatin', 'Amlodipine', 'MODERATE', 'Increased statin levels'), ('Tramadol', 'Gabapentin', 'MODERATE', 'Increased sedation risk'), ('Insulin Glargine', 'Alcohol', 'MAJOR', 'Risk of hypoglycemia'), ] medication_dict = {med.generic_name: med for med in medications} for tenant in set([med.tenant for med in medications]): for drug1_name, drug2_name, severity, description in interaction_pairs: drug1 = medication_dict.get(drug1_name) drug2 = medication_dict.get(drug2_name) if drug1 and drug2 and drug1.tenant == tenant and drug2.tenant == tenant: try: interaction = DrugInteraction.objects.create( tenant=tenant, medication_1=drug1, medication_2=drug2, interaction_id=uuid.uuid4(), severity=severity, interaction_type=random.choice(['PHARMACOKINETIC', 'PHARMACODYNAMIC', 'ADDITIVE']), mechanism=f"Pharmacokinetic interaction affecting {random.choice(['absorption', 'metabolism', 'excretion'])}", clinical_effect=f"{severity.lower()} clinical significance requiring monitoring", management_recommendations=random.choice([ 'Monitor patient closely', 'Consider alternative therapy', 'Adjust dosing as needed', 'Separate administration times' ]), monitoring_parameters="Monitor vital signs and patient response" if random.choice([True, False]) else None, evidence_level=random.choice(['ESTABLISHED', 'PROBABLE', 'SUSPECTED']), references="Clinical pharmacology literature" if random.choice([True, False]) else None, is_active=True, created_at=django_timezone.now() - timedelta(days=random.randint(30, 365)), updated_at=django_timezone.now() - timedelta(days=random.randint(0, 30)) ) interactions.append(interaction) except Exception as e: print(f"Error creating drug interaction: {e}") continue print(f"Created {len(interactions)} drug interactions") return interactions def main(): """Main function to generate pharmacy data""" print("Starting Saudi Pharmacy Data Generation...") tenants = list(Tenant.objects.all()) if not tenants: print("❌ No tenants found.") return print("\n1. Creating Medications...") medications = create_medications(tenants) print("\n2. Creating Inventory Items...") inventory_items = create_pharmacy_inventory(medications) print("\n3. Getting Pharmacists...") pharmacists = get_pharmacists(tenants) print("\n4. Creating Prescriptions...") prescriptions = create_prescriptions(tenants, days_back=30) print("\n5. Creating Dispense Records...") dispense_records = create_dispense_records(prescriptions, inventory_items, pharmacists) print("\n6. Creating Medication Administrations...") administrations = create_medication_administrations(dispense_records) print("\n7. Creating Drug Interactions...") interactions = create_drug_interactions(medications) print(f"\n✅ Saudi Pharmacy Data Generation Complete!") print(f"📊 Summary:") print(f" - Medications: {len(medications)}") print(f" - Inventory Items: {len(inventory_items)}") print(f" - Prescriptions: {len(prescriptions)}") print(f" - Dispense Records: {len(dispense_records)}") print(f" - Medication Administrations: {len(administrations)}") print(f" - Drug Interactions: {len(interactions)}") if __name__ == "__main__": main()