14 KiB
Package Appointments Implementation Summary
Overview
This document summarizes the implementation of the package-based appointment system with auto-scheduling functionality. The system allows users to differentiate between single sessions and packages, with support for multiple providers and automatic scheduling based on availability and preferred days.
Implementation Date
November 11, 2025
What Was Implemented
1. Package Models (appointments/package_models.py)
Created three new models to support package appointments:
AppointmentPackage
- Represents a package of multiple appointment sessions
- Fields:
package_number: Unique identifier (format: PKG-YYYYMMDD-NNNN)patient,clinic: Core relationshipsservice_type: Type of service for all sessionstotal_sessions: Number of sessions (2-100)session_duration: Duration of each session in minutesstatus: DRAFT, SCHEDULED, IN_PROGRESS, COMPLETED, CANCELLEDpreferred_days: JSON list of preferred day numbers (0=Sunday, 6=Saturday)start_date,end_date: Date range for schedulinguse_multiple_providers: Boolean flag for provider assignment strategyauto_schedule: Boolean flag for automatic schedulingscheduling_completed,scheduling_errors: Auto-scheduling tracking
- Properties:
completed_sessions_count,scheduled_sessions_count,pending_sessions_countprogress_percentage,is_completed,can_cancelget_preferred_days_display(): Human-readable preferred days
PackageSession
- Represents an individual session within a package
- Fields:
package: Foreign key to AppointmentPackageappointment: One-to-one link to Appointment (when scheduled)provider: Assigned provider for this sessionsession_number: Order in package (1, 2, 3, ...)status: PENDING, SCHEDULED, COMPLETED, CANCELLED, FAILEDpreferred_date,scheduled_date,scheduled_time: Scheduling infoscheduling_error,scheduling_attempts: Error tracking
- Properties:
is_scheduled,is_completed,can_rescheduleget_status_color(): Bootstrap color class
ProviderAssignment
- Tracks provider assignments for package sessions
- Fields:
package: Foreign key to AppointmentPackageprovider: Assigned providersession_number: Which session this provider is assigned tonotes: Additional notes
2. Auto-Scheduling Service (appointments/package_scheduling_service.py)
Created PackageSchedulingService class with the following methods:
create_package_with_sessions()
- Creates a new package with all sessions
- Handles provider assignments (single or multiple)
- Triggers auto-scheduling if enabled
- Returns package and list of errors
auto_schedule_package()
- Automatically schedules all pending sessions in a package
- Respects preferred days and date range
- Uses availability service to find open slots
- Returns list of scheduling errors
_schedule_single_session()
- Schedules one session within date range
- Checks provider availability
- Filters by preferred days
- Creates appointment when slot found
- Tries up to 90 days
_create_appointment_for_session()
- Creates an Appointment object for a scheduled session
- Generates unique appointment number
- Links appointment to package session
reschedule_session()
- Reschedules a specific session in a package
- Validates new slot availability
- Updates both appointment and session
cancel_package()
- Cancels entire package and all scheduled appointments
- Tracks cancellation reason and user
- Returns success status and message
_generate_package_number() & _generate_appointment_number()
- Generate unique identifiers with date-based format
get_package_summary()
- Returns comprehensive package status and session details
- Useful for API responses and reporting
3. Package Forms (appointments/package_forms.py)
Created comprehensive forms for package management:
AppointmentTypeSelectionForm
- Radio button selection between single session and package
- Used as first step in appointment creation
PackageCreateForm
- Complete form for creating a new package
- Fields:
- Patient and clinic selection
- Service type, total sessions, session duration
- Start date, end date (optional)
- Preferred days (multi-select checkboxes)
- Provider assignment strategy (single vs multiple)
- Single provider selection (when not using multiple)
- Auto-schedule checkbox
- Notes
- Validation:
- Ensures provider is selected
- Validates date range
- Converts preferred days to integer list
ProviderAssignmentForm
- Dynamic form for assigning providers to individual sessions
- Creates one field per session
- Filters providers by clinic
- Returns provider assignments as dictionary
PackageSessionRescheduleForm
- Form for rescheduling a single session
- Fields: new date, new time, reason
PackageCancelForm
- Form for cancelling entire package
- Requires confirmation checkbox
- Shows warning about cancelling all appointments
PackageSearchForm
- Search and filter packages
- Fields: search query, clinic, status, date range
4. Model Updates
appointments/models.py
- Added import statement for package models at the top:
from .package_models import AppointmentPackage, PackageSession, ProviderAssignment
5. Admin Interface (appointments/admin.py)
Added admin classes for all package models:
AppointmentPackageAdmin
- List display: package number, patient, clinic, sessions, progress, status
- Filters: status, clinic, provider strategy, auto-schedule, date
- Inlines: ProviderAssignmentInline, PackageSessionInline
- Readonly fields: progress metrics, completion status
- Custom display:
progress_display()shows percentage and count
PackageSessionAdmin
- List display: package, session number, provider, status, date/time
- Filters: status, clinic, date, provider
- Readonly fields: scheduling status properties
- Optimized queryset with select_related
ProviderAssignmentAdmin
- List display: package, session number, provider
- Filters: clinic, provider
- Simple interface for viewing assignments
Key Features
1. Differentiation Between Single Session and Package
- Users can choose appointment type at creation
- Single sessions use existing workflow
- Packages use new multi-session workflow
2. Multiple Provider Support
- Option to use same provider for all sessions
- Option to assign different providers per session
- Provider assignments tracked in ProviderAssignment model
3. Auto-Scheduling
- Automatically finds available slots for all sessions
- Respects provider schedules and existing appointments
- Considers preferred days of the week
- Schedules sessions sequentially with at least 1 day gap
- Handles scheduling failures gracefully
4. Preferred Days Selection
- Users can select specific days of the week
- System only schedules on preferred days
- If no days selected, any day is acceptable
5. Progress Tracking
- Real-time progress percentage
- Counts: completed, scheduled, pending sessions
- Visual progress indicators in admin
6. Error Handling
- Tracks scheduling errors per session
- Stores error messages for troubleshooting
- Allows manual rescheduling of failed sessions
Database Schema
New Tables Created
appointments_appointmentpackage- Package master recordsappointments_packagesession- Individual sessions in packagesappointments_providerassignment- Provider-to-session mappings- Historical tables for audit trail (via simple-history)
Relationships
AppointmentPackage (1) -----> (N) PackageSession
AppointmentPackage (1) -----> (N) ProviderAssignment
PackageSession (1) -----> (1) Appointment
PackageSession (N) -----> (1) Provider
ProviderAssignment (N) -----> (1) Provider
Next Steps
1. Create Database Migrations
python manage.py makemigrations appointments
python manage.py migrate
2. Update Appointment Creation View
Modify appointments/views.py to add package creation views:
# Add these imports
from .package_forms import (
AppointmentTypeSelectionForm,
PackageCreateForm,
ProviderAssignmentForm,
)
from .package_scheduling_service import PackageSchedulingService
# Add new views:
# - appointment_type_selection_view()
# - package_create_view()
# - provider_assignment_view()
# - package_detail_view()
# - package_list_view()
# - package_cancel_view()
# - session_reschedule_view()
3. Update URLs
Add package-related URLs to appointments/urls.py:
# Package URLs
path('packages/', views.package_list_view, name='package_list'),
path('packages/create/', views.package_create_view, name='package_create'),
path('packages/<uuid:pk>/', views.package_detail_view, name='package_detail'),
path('packages/<uuid:pk>/cancel/', views.package_cancel_view, name='package_cancel'),
path('packages/sessions/<uuid:pk>/reschedule/', views.session_reschedule_view, name='session_reschedule'),
4. Create Templates
Create the following templates in appointments/templates/appointments/:
appointment_type_selection.html- Choose single vs packagepackage_create_form.html- Package creation formprovider_assignment_form.html- Assign providers to sessionspackage_detail.html- View package details and sessionspackage_list.html- List all packagespackage_cancel_form.html- Cancel package confirmationsession_reschedule_form.html- Reschedule individual session
5. Update Existing Appointment Form
Modify appointments/templates/appointments/appointment_form.html:
- Add appointment type selection at the top
- Show/hide fields based on selection
- Redirect to package flow if package selected
6. Add Navigation Links
Update navigation menus to include:
- "Create Package" link
- "View Packages" link
- Package count badges
7. Testing Checklist
Single Session Flow
- Create single session appointment (existing flow)
- Verify no changes to existing functionality
- Check appointment appears in calendar
- Test rescheduling and cancellation
Package Flow - Single Provider
- Create package with single provider
- Verify auto-scheduling works
- Check all sessions created with correct provider
- Verify appointments appear in calendar
- Test progress tracking
- Reschedule individual session
- Cancel entire package
Package Flow - Multiple Providers
- Create package with multiple providers
- Assign different provider to each session
- Verify auto-scheduling respects assignments
- Check each session has correct provider
- Test mixed completion (some done, some pending)
Preferred Days
- Create package with specific preferred days
- Verify sessions only scheduled on those days
- Test with no preferred days (any day)
- Test with limited availability on preferred days
Error Handling
- Test with no available slots
- Verify error messages stored
- Test manual rescheduling of failed sessions
- Check scheduling attempts counter
Admin Interface
- View packages in admin
- Edit package details
- View inline sessions
- Check progress display
- Filter and search packages
8. API Endpoints (Optional)
Consider adding REST API endpoints for:
- Package creation
- Package listing and filtering
- Package details
- Session rescheduling
- Package cancellation
- Auto-scheduling trigger
9. Notifications
Integrate with existing notification system:
- Send confirmation when package created
- Notify patient of all scheduled sessions
- Send reminders before each session
- Notify on package completion
10. Reporting
Add reports for:
- Package completion rates
- Average sessions per package
- Most common package types
- Provider utilization in packages
- Scheduling success rates
Technical Notes
Performance Considerations
- Use
select_related()andprefetch_related()for package queries - Index on
package_number,status,scheduled_date - Consider caching for frequently accessed packages
Security
- Ensure tenant isolation for all package queries
- Validate user permissions for package operations
- Audit all package modifications via simple-history
Scalability
- Auto-scheduling limited to 90-day window
- Maximum 100 sessions per package
- Consider background tasks for large packages (Celery)
Data Integrity
- Use database transactions for package creation
- Cascade delete handled properly
- Orphaned appointments prevented via foreign keys
Files Created/Modified
New Files
appointments/package_models.py- Package data modelsappointments/package_scheduling_service.py- Auto-scheduling logicappointments/package_forms.py- Package formsPACKAGE_APPOINTMENTS_IMPLEMENTATION.md- This document
Modified Files
appointments/models.py- Added package model importsappointments/admin.py- Added package admin classes
Files to Create (Next Steps)
- Migration files (auto-generated)
- Package views in
appointments/views.py - Package templates (7 templates)
- URL patterns in
appointments/urls.py
Benefits
- Flexibility: Support both single sessions and multi-session packages
- Automation: Auto-scheduling saves time and reduces errors
- Scalability: Handle packages from 2 to 100 sessions
- Provider Management: Support for single or multiple providers
- Patient Preferences: Respect preferred days for scheduling
- Progress Tracking: Real-time visibility into package completion
- Error Recovery: Graceful handling of scheduling failures
- Audit Trail: Complete history via simple-history integration
Conclusion
The package appointment system is now fully implemented at the model, service, form, and admin levels. The next steps involve creating the views, templates, and URLs to expose this functionality to end users. The system is designed to be flexible, scalable, and user-friendly while maintaining data integrity and security.
Support
For questions or issues with this implementation, refer to:
- Django documentation: https://docs.djangoproject.com/
- Simple History: https://django-simple-history.readthedocs.io/
- Crispy Forms: https://django-crispy-forms.readthedocs.io/