# """ # Viewflow workflows for patients app. # Provides patient registration, consent management, and record management workflows. # """ # # from viewflow import Flow, lock # from viewflow.base import this, flow_func # from viewflow.contrib import celery # from viewflow.decorators import flow_view # from viewflow.fields import CharField, ModelField # from viewflow.forms import ModelForm # from viewflow.views import CreateProcessView, UpdateProcessView # from viewflow.models import Process, Task # from django.contrib.auth.models import User # from django.urls import reverse_lazy # from django.utils import timezone # from django.db import transaction # from django.core.mail import send_mail # # from .models import PatientProfile, ConsentForm, ConsentTemplate, PatientNote # from .views import ( # PatientRegistrationView, IdentityVerificationView, InsuranceVerificationView, # ConsentCollectionView, MedicalHistoryView, EmergencyContactView, # ConsentPresentationView, ConsentSigningView, ConsentWitnessView, # ConsentVerificationView # ) # # # class PatientRegistrationProcess(Process): # """ # Viewflow process model for patient registration # """ # patient = ModelField(PatientProfile, help_text='Associated patient') # # # Process status tracking # patient_created = models.BooleanField(default=False) # identity_verified = models.BooleanField(default=False) # insurance_verified = models.BooleanField(default=False) # consents_collected = models.BooleanField(default=False) # medical_history_collected = models.BooleanField(default=False) # emergency_contacts_added = models.BooleanField(default=False) # registration_completed = models.BooleanField(default=False) # # class Meta: # verbose_name = 'Patient Registration Process' # verbose_name_plural = 'Patient Registration Processes' # # # class PatientRegistrationFlow(Flow): # """ # Patient Registration Workflow # # This flow manages the complete patient registration process including # identity verification, insurance verification, and consent collection. # """ # # process_class = PatientRegistrationProcess # # # Flow definition # start = ( # flow_func(this.start_registration) # .Next(this.create_patient_record) # ) # # create_patient_record = ( # flow_view(PatientRegistrationView) # .Permission('patients.can_register_patients') # .Next(this.verify_identity) # ) # # verify_identity = ( # flow_view(IdentityVerificationView) # .Permission('patients.can_verify_identity') # .Next(this.verify_insurance) # ) # # verify_insurance = ( # flow_view(InsuranceVerificationView) # .Permission('patients.can_verify_insurance') # .Next(this.parallel_data_collection) # ) # # parallel_data_collection = ( # flow_func(this.start_parallel_collection) # .Next(this.collect_consents) # .Next(this.collect_medical_history) # .Next(this.collect_emergency_contacts) # ) # # collect_consents = ( # flow_view(ConsentCollectionView) # .Permission('patients.can_collect_consents') # .Next(this.join_data_collection) # ) # # collect_medical_history = ( # flow_view(MedicalHistoryView) # .Permission('patients.can_collect_medical_history') # .Next(this.join_data_collection) # ) # # collect_emergency_contacts = ( # flow_view(EmergencyContactView) # .Permission('patients.can_collect_emergency_contacts') # .Next(this.join_data_collection) # ) # # join_data_collection = ( # flow_func(this.join_parallel_collection) # .Next(this.finalize_registration) # ) # # finalize_registration = ( # flow_func(this.complete_registration) # .Next(this.end) # ) # # end = flow_func(this.end_registration) # # # Flow functions # def start_registration(self, activation): # """Initialize the registration process""" # process = activation.process # # # Log registration start # self.log_registration_start(process.patient) # # # Notify registration staff # self.notify_registration_staff(process.patient) # # def start_parallel_collection(self, activation): # """Start parallel data collection tasks""" # process = activation.process # # # Create parallel collection tasks # self.create_collection_tasks(process.patient) # # def join_parallel_collection(self, activation): # """Wait for all data collection to complete""" # process = activation.process # # # Check if all collection is completed # if (process.consents_collected and # process.medical_history_collected and # process.emergency_contacts_added): # # # Proceed to finalization # self.notify_registration_ready(process.patient) # # def complete_registration(self, activation): # """Finalize the registration process""" # process = activation.process # patient = process.patient # # # Update patient status # patient.registration_status = 'COMPLETED' # patient.save() # # # Generate MRN if not already assigned # if not patient.mrn: # patient.mrn = self.generate_mrn() # patient.save() # # # Mark process as completed # process.registration_completed = True # process.save() # # # Send completion notifications # self.notify_registration_completion(patient) # # # Create patient chart # self.create_patient_chart(patient) # # def end_registration(self, activation): # """End the registration workflow""" # process = activation.process # # # Generate registration summary report # self.generate_registration_summary(process.patient) # # # Update registration metrics # self.update_registration_metrics(process.patient) # # # Helper methods # def log_registration_start(self, patient): # """Log registration start""" # # This would log the registration start # pass # # def notify_registration_staff(self, patient): # """Notify registration staff of new patient""" # from django.contrib.auth.models import Group # # registration_staff = User.objects.filter( # groups__name='Registration Staff' # ) # # for staff in registration_staff: # send_mail( # subject=f'New Patient Registration: {patient.get_full_name()}', # message=f'New patient registration started for {patient.get_full_name()}.', # from_email='registration@hospital.com', # recipient_list=[staff.email], # fail_silently=True # ) # # def create_collection_tasks(self, patient): # """Create data collection tasks""" # # This would create tasks in a task management system # pass # # def notify_registration_ready(self, patient): # """Notify that registration is ready for completion""" # registration_staff = User.objects.filter( # groups__name='Registration Staff' # ) # # for staff in registration_staff: # send_mail( # subject=f'Registration Ready: {patient.get_full_name()}', # message=f'Patient registration for {patient.get_full_name()} is ready for completion.', # from_email='registration@hospital.com', # recipient_list=[staff.email], # fail_silently=True # ) # # def generate_mrn(self): # """Generate unique Medical Record Number""" # from django.utils.crypto import get_random_string # return f"MRN{timezone.now().strftime('%Y%m%d')}{get_random_string(6, '0123456789')}" # # def notify_registration_completion(self, patient): # """Notify relevant parties of registration completion""" # # Notify patient if email available # if patient.email: # send_mail( # subject='Registration Complete', # message=f'Welcome {patient.first_name}! Your registration is complete. Your MRN is: {patient.mrn}', # from_email='registration@hospital.com', # recipient_list=[patient.email], # fail_silently=True # ) # # def create_patient_chart(self, patient): # """Create initial patient chart""" # # This would create the initial patient chart # pass # # def generate_registration_summary(self, patient): # """Generate registration summary report""" # # This would generate a comprehensive registration report # pass # # def update_registration_metrics(self, patient): # """Update registration metrics""" # # This would update registration performance metrics # pass # # # class ConsentManagementProcess(Process): # """ # Viewflow process model for consent management # """ # consent_form = ModelField(ConsentForm, help_text='Associated consent form') # # # Process status tracking # consent_presented = models.BooleanField(default=False) # patient_reviewed = models.BooleanField(default=False) # questions_answered = models.BooleanField(default=False) # consent_signed = models.BooleanField(default=False) # witness_signed = models.BooleanField(default=False) # consent_verified = models.BooleanField(default=False) # consent_filed = models.BooleanField(default=False) # # class Meta: # verbose_name = 'Consent Management Process' # verbose_name_plural = 'Consent Management Processes' # # # class ConsentManagementFlow(Flow): # """ # Consent Management Workflow # # This flow manages the consent collection process including presentation, # review, signing, witnessing, and verification. # """ # # process_class = ConsentManagementProcess # # # Flow definition # start = ( # flow_func(this.start_consent_process) # .Next(this.present_consent) # ) # # present_consent = ( # flow_view(ConsentPresentationView) # .Permission('patients.can_present_consents') # .Next(this.patient_review) # ) # # patient_review = ( # flow_view(PatientConsentReviewView) # .Permission('patients.can_review_consents') # .Next(this.answer_questions) # ) # # answer_questions = ( # flow_view(ConsentQuestionView) # .Permission('patients.can_answer_consent_questions') # .Next(this.sign_consent) # ) # # sign_consent = ( # flow_view(ConsentSigningView) # .Permission('patients.can_sign_consents') # .Next(this.witness_consent) # ) # # witness_consent = ( # flow_view(ConsentWitnessView) # .Permission('patients.can_witness_consents') # .Next(this.verify_consent) # ) # # verify_consent = ( # flow_view(ConsentVerificationView) # .Permission('patients.can_verify_consents') # .Next(this.file_consent) # ) # # file_consent = ( # flow_func(this.complete_consent_process) # .Next(this.end) # ) # # end = flow_func(this.end_consent_process) # # # Flow functions # def start_consent_process(self, activation): # """Initialize the consent process""" # process = activation.process # consent = process.consent_form # # # Update consent status # consent.status = 'PENDING' # consent.save() # # # Notify relevant staff # self.notify_consent_required(consent) # # def complete_consent_process(self, activation): # """Finalize the consent process""" # process = activation.process # consent = process.consent_form # # # Update consent status # if consent.is_fully_signed: # consent.status = 'SIGNED' # else: # consent.status = 'DECLINED' # # consent.save() # # # Mark process as completed # process.consent_filed = True # process.save() # # # Send completion notifications # self.notify_consent_completion(consent) # # # File consent in patient record # self.file_consent_in_record(consent) # # def end_consent_process(self, activation): # """End the consent workflow""" # process = activation.process # # # Generate consent summary report # self.generate_consent_summary(process.consent_form) # # # Helper methods # def notify_consent_required(self, consent): # """Notify staff that consent is required""" # nursing_staff = User.objects.filter( # groups__name='Nursing Staff' # ) # # for staff in nursing_staff: # send_mail( # subject=f'Consent Required: {consent.patient.get_full_name()}', # message=f'Consent form "{consent.template.name}" required for {consent.patient.get_full_name()}.', # from_email='consents@hospital.com', # recipient_list=[staff.email], # fail_silently=True # ) # # def notify_consent_completion(self, consent): # """Notify relevant parties of consent completion""" # # Notify ordering physician if applicable # if hasattr(consent, 'ordering_physician') and consent.ordering_physician: # if consent.ordering_physician.email: # send_mail( # subject=f'Consent {consent.status}: {consent.patient.get_full_name()}', # message=f'Consent form "{consent.template.name}" has been {consent.status.lower()}.', # from_email='consents@hospital.com', # recipient_list=[consent.ordering_physician.email], # fail_silently=True # ) # # def file_consent_in_record(self, consent): # """File consent in patient record""" # # This would file the consent in the patient's medical record # pass # # def generate_consent_summary(self, consent): # """Generate consent summary report""" # # This would generate a comprehensive consent report # pass # # # class PatientRecordManagementProcess(Process): # """ # Viewflow process model for patient record management # """ # patient_id = CharField(max_length=50, help_text='Patient identifier') # record_action = CharField(max_length=20, help_text='Record management action') # # # Process status tracking # record_requested = models.BooleanField(default=False) # authorization_verified = models.BooleanField(default=False) # record_prepared = models.BooleanField(default=False) # quality_checked = models.BooleanField(default=False) # record_delivered = models.BooleanField(default=False) # delivery_confirmed = models.BooleanField(default=False) # # class Meta: # verbose_name = 'Patient Record Management Process' # verbose_name_plural = 'Patient Record Management Processes' # # # class PatientRecordManagementFlow(Flow): # """ # Patient Record Management Workflow # # This flow manages patient record requests including authorization, # preparation, quality checking, and delivery. # """ # # process_class = PatientRecordManagementProcess # # # Flow definition # start = ( # flow_func(this.start_record_management) # .Next(this.verify_authorization) # ) # # verify_authorization = ( # flow_view(RecordAuthorizationView) # .Permission('patients.can_verify_record_authorization') # .Next(this.prepare_record) # ) # # prepare_record = ( # flow_view(RecordPreparationView) # .Permission('patients.can_prepare_records') # .Next(this.quality_check) # ) # # quality_check = ( # flow_view(RecordQualityCheckView) # .Permission('patients.can_quality_check_records') # .Next(this.deliver_record) # ) # # deliver_record = ( # flow_view(RecordDeliveryView) # .Permission('patients.can_deliver_records') # .Next(this.confirm_delivery) # ) # # confirm_delivery = ( # flow_func(this.complete_record_management) # .Next(this.end) # ) # # end = flow_func(this.end_record_management) # # # Flow functions # def start_record_management(self, activation): # """Initialize the record management process""" # process = activation.process # # # Log record request # self.log_record_request(process.patient_id, process.record_action) # # # Notify records staff # self.notify_records_staff(process.patient_id, process.record_action) # # def complete_record_management(self, activation): # """Finalize the record management process""" # process = activation.process # # # Mark delivery as confirmed # process.delivery_confirmed = True # process.save() # # # Generate delivery confirmation # self.generate_delivery_confirmation(process.patient_id, process.record_action) # # def end_record_management(self, activation): # """End the record management workflow""" # process = activation.process # # # Generate record management summary # self.generate_record_summary(process.patient_id, process.record_action) # # # Helper methods # def log_record_request(self, patient_id, action): # """Log record request""" # # This would log the record request # pass # # def notify_records_staff(self, patient_id, action): # """Notify records staff""" # records_staff = User.objects.filter( # groups__name='Medical Records' # ) # # for staff in records_staff: # send_mail( # subject=f'Record Request: {patient_id}', # message=f'Record {action} requested for patient {patient_id}.', # from_email='records@hospital.com', # recipient_list=[staff.email], # fail_silently=True # ) # # def generate_delivery_confirmation(self, patient_id, action): # """Generate delivery confirmation""" # # This would generate delivery confirmation # pass # # def generate_record_summary(self, patient_id, action): # """Generate record management summary""" # # This would generate record management summary # pass # # # class PatientTransferProcess(Process): # """ # Viewflow process model for patient transfers between facilities # """ # patient_id = CharField(max_length=50, help_text='Patient identifier') # transfer_type = CharField(max_length=20, help_text='Type of transfer') # # # Process status tracking # transfer_requested = models.BooleanField(default=False) # receiving_facility_contacted = models.BooleanField(default=False) # transfer_approved = models.BooleanField(default=False) # records_prepared = models.BooleanField(default=False) # transport_arranged = models.BooleanField(default=False) # patient_transferred = models.BooleanField(default=False) # transfer_confirmed = models.BooleanField(default=False) # # class Meta: # verbose_name = 'Patient Transfer Process' # verbose_name_plural = 'Patient Transfer Processes' # # # class PatientTransferFlow(Flow): # """ # Patient Transfer Workflow # # This flow manages patient transfers between facilities including # coordination, approval, preparation, and execution. # """ # # process_class = PatientTransferProcess # # # Flow definition # start = ( # flow_func(this.start_transfer) # .Next(this.contact_receiving_facility) # ) # # contact_receiving_facility = ( # flow_view(FacilityContactView) # .Permission('patients.can_contact_facilities') # .Next(this.approve_transfer) # ) # # approve_transfer = ( # flow_view(TransferApprovalView) # .Permission('patients.can_approve_transfers') # .Next(this.parallel_preparation) # ) # # parallel_preparation = ( # flow_func(this.start_parallel_preparation) # .Next(this.prepare_records) # .Next(this.arrange_transport) # ) # # prepare_records = ( # flow_view(TransferRecordPreparationView) # .Permission('patients.can_prepare_transfer_records') # .Next(this.join_preparation) # ) # # arrange_transport = ( # flow_view(TransportArrangementView) # .Permission('patients.can_arrange_transport') # .Next(this.join_preparation) # ) # # join_preparation = ( # flow_func(this.join_parallel_preparation) # .Next(this.execute_transfer) # ) # # execute_transfer = ( # flow_view(TransferExecutionView) # .Permission('patients.can_execute_transfers') # .Next(this.confirm_transfer) # ) # # confirm_transfer = ( # flow_func(this.complete_transfer) # .Next(this.end) # ) # # end = flow_func(this.end_transfer) # # # Flow functions # def start_transfer(self, activation): # """Initialize the transfer process""" # process = activation.process # # # Log transfer request # self.log_transfer_request(process.patient_id, process.transfer_type) # # # Notify transfer coordinator # self.notify_transfer_coordinator(process.patient_id, process.transfer_type) # # def start_parallel_preparation(self, activation): # """Start parallel preparation tasks""" # process = activation.process # # # Create preparation tasks # self.create_preparation_tasks(process.patient_id) # # def join_parallel_preparation(self, activation): # """Wait for all preparation to complete""" # process = activation.process # # # Check if all preparation is completed # if process.records_prepared and process.transport_arranged: # # Proceed to transfer execution # self.notify_transfer_ready(process.patient_id) # # def complete_transfer(self, activation): # """Finalize the transfer process""" # process = activation.process # # # Mark transfer as confirmed # process.transfer_confirmed = True # process.save() # # # Send confirmation notifications # self.notify_transfer_completion(process.patient_id) # # def end_transfer(self, activation): # """End the transfer workflow""" # process = activation.process # # # Generate transfer summary report # self.generate_transfer_summary(process.patient_id, process.transfer_type) # # # Helper methods # def log_transfer_request(self, patient_id, transfer_type): # """Log transfer request""" # # This would log the transfer request # pass # # def notify_transfer_coordinator(self, patient_id, transfer_type): # """Notify transfer coordinator""" # coordinators = User.objects.filter( # groups__name='Transfer Coordinators' # ) # # for coordinator in coordinators: # send_mail( # subject=f'Patient Transfer Request: {patient_id}', # message=f'{transfer_type} transfer requested for patient {patient_id}.', # from_email='transfers@hospital.com', # recipient_list=[coordinator.email], # fail_silently=True # ) # # def create_preparation_tasks(self, patient_id): # """Create preparation tasks""" # # This would create preparation tasks # pass # # def notify_transfer_ready(self, patient_id): # """Notify that transfer is ready""" # # This would notify that transfer is ready # pass # # def notify_transfer_completion(self, patient_id): # """Notify transfer completion""" # # This would notify transfer completion # pass # # def generate_transfer_summary(self, patient_id, transfer_type): # """Generate transfer summary""" # # This would generate transfer summary # pass # # # # Celery tasks for background processing # @celery.job # def auto_verify_insurance(patient_id): # """Background task to automatically verify insurance""" # try: # # This would perform automated insurance verification # return True # except Exception: # return False # # # @celery.job # def monitor_consent_expiry(): # """Background task to monitor consent expiry""" # try: # # This would monitor expiring consents # return True # except Exception: # return False # # # @celery.job # def generate_patient_reports(): # """Background task to generate patient reports""" # try: # # This would generate patient reports # return True # except Exception: # return False # # # @celery.job # def auto_schedule_follow_ups(patient_id): # """Background task to automatically schedule follow-ups""" # try: # # This would schedule follow-up appointments # return True # except Exception: # return False #