hospital-management/pharmacy_data.py
Marwan Alwali 2780a2dc7c update
2025-09-16 15:10:57 +03:00

848 lines
56 KiB
Python

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()