agdar/PHASE7_SIGNALS_SERVICES_TASKS.md
2025-11-02 14:35:35 +03:00

421 lines
14 KiB
Markdown

# Phase 7: Signals, Services & Tasks Implementation Plan
## Overview
Phase 7 focuses on implementing Django signals for automation, service layer for business logic separation, and Celery tasks for background processing in the Tenhal Multidisciplinary Healthcare Platform.
## Objectives
1. **Django Signals** - Automate audit logging, notifications, and workflow triggers
2. **Service Layer** - Separate business logic from views for better maintainability
3. **Celery Tasks** - Background processing for reminders, reports, and integrations
4. **Scheduled Jobs** - Periodic tasks using Celery Beat
## Implementation Checklist
### Part 1: Celery Setup & Configuration (30 minutes)
- [x] Celery already configured in settings.py
- [ ] Create `AgdarCentre/celery.py` - Celery app initialization
- [ ] Update `AgdarCentre/__init__.py` - Import Celery app
- [ ] Create `.env` entries for Redis configuration
- [ ] Test Celery worker connection
### Part 2: Django Signals (2-3 hours)
#### Core App Signals
- [ ] Create `core/signals.py`
- [ ] `post_save` signal for Patient - Create audit log entry
- [ ] `post_save` signal for User - Send welcome email
- [ ] `pre_delete` signal for Patient - Soft delete implementation
- [ ] `post_save` signal for Consent - Notify relevant staff
#### Appointments App Signals
- [ ] Create `appointments/signals.py`
- [ ] `post_save` signal for Appointment - Status change notifications
- [ ] `post_save` signal for Appointment (CONFIRMED) - Schedule reminder task
- [ ] `post_save` signal for Appointment (COMPLETED) - Trigger invoice generation
- [ ] `post_save` signal for Appointment (CANCELLED) - Cancel reminders
- [ ] `pre_save` signal for Appointment - Validate time slot conflicts
#### Finance App Signals
- [ ] Create `finance/signals.py`
- [ ] `post_save` signal for Payment - Update invoice status
- [ ] `post_save` signal for Invoice (ISSUED) - Send invoice notification
- [ ] `post_save` signal for Invoice (OVERDUE) - Schedule overdue reminder
- [ ] `post_save` signal for Payment (COMPLETED) - Send receipt
#### Referrals App Signals
- [ ] Create `referrals/signals.py`
- [ ] `post_save` signal for Referral (PENDING) - Notify receiving clinic
- [ ] `post_save` signal for Referral (ACCEPTED) - Notify sending clinic
- [ ] `post_save` signal for Referral (REJECTED) - Notify sending clinic
- [ ] `post_save` signal for Referral (COMPLETED) - Update statistics
### Part 3: Service Layer (3-4 hours)
#### Core Services
- [ ] Create `core/services.py`
- [ ] `PatientService` class
- [ ] `create_patient()` - Patient creation with validation
- [ ] `update_patient()` - Patient update with audit
- [ ] `merge_patients()` - Merge duplicate patients
- [ ] `get_patient_summary()` - Complete patient overview
- [ ] `FileService` class
- [ ] `create_file()` - File creation with auto-numbering
- [ ] `close_file()` - File closure workflow
- [ ] `reopen_file()` - File reopening workflow
#### Appointments Services
- [ ] Create `appointments/services.py`
- [ ] `AppointmentService` class
- [ ] `book_appointment()` - Complete booking workflow
- [ ] `confirm_appointment()` - Confirmation with validation
- [ ] `reschedule_appointment()` - Reschedule with conflict check
- [ ] `cancel_appointment()` - Cancellation with reason
- [ ] `check_availability()` - Provider availability check
- [ ] `get_calendar_slots()` - Calendar view generation
- [ ] `ScheduleService` class
- [ ] `create_schedule()` - Schedule creation
- [ ] `check_conflicts()` - Conflict detection
- [ ] `get_available_slots()` - Available time slots
#### Finance Services
- [ ] Create `finance/services.py`
- [ ] `InvoiceService` class
- [ ] `generate_invoice()` - Auto-generate from appointment
- [ ] `issue_invoice()` - Issue draft invoice
- [ ] `calculate_totals()` - Calculate invoice totals
- [ ] `apply_discount()` - Apply discount logic
- [ ] `mark_paid()` - Mark invoice as paid
- [ ] `PaymentService` class
- [ ] `process_payment()` - Payment processing
- [ ] `refund_payment()` - Refund processing
- [ ] `allocate_payment()` - Allocate to invoices
- [ ] `PackageService` class
- [ ] `activate_package()` - Activate patient package
- [ ] `consume_session()` - Consume package session
- [ ] `check_balance()` - Check remaining sessions
#### Referrals Services
- [ ] Create `referrals/services.py`
- [ ] `ReferralService` class
- [ ] `create_referral()` - Referral creation with validation
- [ ] `accept_referral()` - Accept workflow
- [ ] `reject_referral()` - Reject workflow
- [ ] `complete_referral()` - Complete workflow
- [ ] `check_auto_rules()` - Check auto-referral rules
- [ ] `get_referral_statistics()` - Statistics calculation
### Part 4: Celery Tasks (3-4 hours)
#### Notification Tasks
- [ ] Create `core/tasks.py`
- [ ] `send_email_task()` - Async email sending
- [ ] `send_sms_task()` - Async SMS sending
- [ ] `send_whatsapp_task()` - Async WhatsApp sending
- [ ] `create_notification_task()` - Create in-app notification
#### Appointment Tasks
- [ ] Create `appointments/tasks.py`
- [ ] `send_appointment_reminder()` - Send reminder (24h, 2h before)
- [ ] `send_appointment_confirmation()` - Send confirmation
- [ ] `check_no_shows()` - Check and mark no-shows
- [ ] `generate_daily_schedule()` - Generate daily schedule report
- [ ] `sync_calendar()` - Sync with external calendar (future)
#### Finance Tasks
- [ ] Create `finance/tasks.py`
- [ ] `generate_invoice_from_appointment()` - Auto-generate invoice
- [ ] `send_invoice_notification()` - Send invoice to patient
- [ ] `check_overdue_invoices()` - Check and notify overdue
- [ ] `send_payment_receipt()` - Send payment receipt
- [ ] `generate_financial_report()` - Generate periodic reports
- [ ] `process_batch_payments()` - Process batch payments
#### Referral Tasks
- [ ] Create `referrals/tasks.py`
- [ ] `send_referral_notification()` - Notify receiving clinic
- [ ] `check_pending_referrals()` - Check pending referrals
- [ ] `send_referral_reminder()` - Remind about pending referrals
- [ ] `update_referral_statistics()` - Update statistics
#### Integration Tasks
- [ ] Create `integrations/tasks.py`
- [ ] `submit_nphies_eligibility()` - NPHIES eligibility check
- [ ] `submit_nphies_prior_auth()` - NPHIES prior authorization
- [ ] `submit_nphies_claim()` - NPHIES claim submission
- [ ] `submit_zatca_invoice()` - ZATCA e-invoice submission
- [ ] `sync_lab_results()` - Sync lab results
- [ ] `sync_radiology_results()` - Sync radiology results
### Part 5: Celery Beat Scheduled Tasks (1-2 hours)
#### Periodic Tasks Configuration
- [ ] Create `appointments/beat_schedule.py`
- [ ] Daily at 8:00 AM - Send appointment reminders for today
- [ ] Every 2 hours - Check for no-shows
- [ ] Daily at 6:00 PM - Generate next day schedule
- [ ] Create `finance/beat_schedule.py`
- [ ] Daily at 9:00 AM - Check overdue invoices
- [ ] Weekly on Monday - Generate weekly financial report
- [ ] Monthly on 1st - Generate monthly financial report
- [ ] Create `referrals/beat_schedule.py`
- [ ] Daily at 10:00 AM - Check pending referrals
- [ ] Weekly on Friday - Send referral statistics
- [ ] Create `integrations/beat_schedule.py`
- [ ] Every 30 minutes - Sync lab results
- [ ] Every 30 minutes - Sync radiology results
- [ ] Daily at 11:00 PM - Submit pending ZATCA invoices
### Part 6: Testing & Validation (2-3 hours)
#### Signal Tests
- [ ] Create `tests/test_signals.py`
- [ ] Test patient creation triggers audit log
- [ ] Test appointment confirmation triggers reminder
- [ ] Test payment triggers invoice update
- [ ] Test referral creation triggers notification
#### Service Tests
- [ ] Create `tests/test_services.py`
- [ ] Test appointment booking service
- [ ] Test invoice generation service
- [ ] Test payment processing service
- [ ] Test referral workflow service
#### Task Tests
- [ ] Create `tests/test_tasks.py`
- [ ] Test email sending task
- [ ] Test reminder task
- [ ] Test invoice generation task
- [ ] Test integration tasks
#### Integration Tests
- [ ] Test complete workflows
- [ ] Book appointment → Generate invoice → Send reminder
- [ ] Create referral → Notify → Accept → Complete
- [ ] Issue invoice → Process payment → Send receipt
### Part 7: Documentation (1 hour)
- [ ] Create `SIGNALS_REFERENCE.md` - Signal documentation
- [ ] Create `SERVICES_REFERENCE.md` - Service layer documentation
- [ ] Create `TASKS_REFERENCE.md` - Celery tasks documentation
- [ ] Update `README.md` - Add Celery setup instructions
- [ ] Create `CELERY_DEPLOYMENT.md` - Production deployment guide
## File Structure
```
AgdarCentre/
├── celery.py # Celery app initialization
├── __init__.py # Import Celery app
core/
├── signals.py # Core app signals
├── services.py # Core business services
├── tasks.py # Core Celery tasks
appointments/
├── signals.py # Appointment signals
├── services.py # Appointment services
├── tasks.py # Appointment tasks
├── beat_schedule.py # Scheduled tasks
finance/
├── signals.py # Finance signals
├── services.py # Finance services
├── tasks.py # Finance tasks
├── beat_schedule.py # Scheduled tasks
referrals/
├── signals.py # Referral signals
├── services.py # Referral services
├── tasks.py # Referral tasks
├── beat_schedule.py # Scheduled tasks
integrations/
├── signals.py # Integration signals
├── services.py # Integration services
├── tasks.py # Integration tasks
├── beat_schedule.py # Scheduled tasks
tests/
├── test_signals.py # Signal tests
├── test_services.py # Service tests
├── test_tasks.py # Task tests
```
## Key Design Patterns
### 1. Signal Pattern
```python
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Appointment)
def appointment_confirmed(sender, instance, created, **kwargs):
if not created and instance.status == 'CONFIRMED':
# Schedule reminder task
send_appointment_reminder.apply_async(
args=[instance.id],
eta=instance.start_time - timedelta(hours=24)
)
```
### 2. Service Layer Pattern
```python
class AppointmentService:
@staticmethod
def book_appointment(patient, provider, start_time, **kwargs):
# Validate availability
if not AppointmentService.check_availability(provider, start_time):
raise ValidationError("Time slot not available")
# Create appointment
appointment = Appointment.objects.create(
patient=patient,
provider=provider,
start_time=start_time,
**kwargs
)
# Trigger post-creation tasks
send_appointment_confirmation.delay(appointment.id)
return appointment
```
### 3. Celery Task Pattern
```python
from celery import shared_task
@shared_task(bind=True, max_retries=3)
def send_appointment_reminder(self, appointment_id):
try:
appointment = Appointment.objects.get(id=appointment_id)
# Send reminder logic
send_sms(appointment.patient.phone, f"Reminder: {appointment}")
except Exception as exc:
raise self.retry(exc=exc, countdown=60)
```
## Dependencies Already Installed
✅ celery>=5.3.4
✅ redis>=5.0.1
✅ django-celery-beat>=2.5.0
✅ django-celery-results>=2.5.1
## Environment Variables Needed
Add to `.env`:
```bash
# Celery Configuration
CELERY_BROKER_URL=redis://localhost:6379/0
CELERY_RESULT_BACKEND=redis://localhost:6379/0
# Email Configuration (for notifications)
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=your-email@gmail.com
EMAIL_HOST_PASSWORD=your-app-password
DEFAULT_FROM_EMAIL=noreply@agdarcentre.sa
# SMS Configuration (Twilio)
TWILIO_ACCOUNT_SID=your-account-sid
TWILIO_AUTH_TOKEN=your-auth-token
TWILIO_PHONE_NUMBER=+1234567890
TWILIO_WHATSAPP_NUMBER=whatsapp:+1234567890
```
## Running Celery
### Development
```bash
# Terminal 1: Start Redis
redis-server
# Terminal 2: Start Celery Worker
celery -A AgdarCentre worker -l info
# Terminal 3: Start Celery Beat (for scheduled tasks)
celery -A AgdarCentre beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
# Terminal 4: Start Django
python manage.py runserver
```
### Production
```bash
# Use supervisor or systemd to manage processes
# See CELERY_DEPLOYMENT.md for details
```
## Expected Benefits
1. **Automation**
- Automatic appointment reminders
- Auto-generated invoices
- Automated notifications
- Scheduled reports
2. **Performance**
- Background processing of heavy tasks
- Non-blocking email/SMS sending
- Async integration calls
- Improved response times
3. **Maintainability**
- Separated business logic in services
- Reusable service methods
- Testable components
- Clear code organization
4. **Reliability**
- Task retry mechanisms
- Error handling and logging
- Transaction management
- Audit trail automation
## Timeline Estimate
- **Part 1: Celery Setup** - 30 minutes
- **Part 2: Signals** - 2-3 hours
- **Part 3: Services** - 3-4 hours
- **Part 4: Tasks** - 3-4 hours
- **Part 5: Beat Schedule** - 1-2 hours
- **Part 6: Testing** - 2-3 hours
- **Part 7: Documentation** - 1 hour
**Total: 13-18 hours (2-3 days)**
## Success Criteria
- [ ] All signals properly connected and tested
- [ ] Service layer methods working correctly
- [ ] Celery tasks executing successfully
- [ ] Scheduled tasks running on time
- [ ] Email/SMS notifications working
- [ ] Integration tasks functioning
- [ ] Comprehensive test coverage
- [ ] Complete documentation
## Next Phase Preview
**Phase 8: Admin, RBAC & Auditing**
- Custom Django admin interfaces
- Enhanced role-based permissions
- Detailed audit trails
- Compliance reporting
- User activity monitoring
---
**Status:** Ready to implement
**Priority:** High (enables automation and background processing)
**Dependencies:** Phase 6 (APIs) completed ✅