| 1 | -- ============================================================================
|
|---|
| 2 | -- Section 2: Appointment Scheduling Integrity - Deployment Verification
|
|---|
| 3 | -- ============================================================================
|
|---|
| 4 |
|
|---|
| 5 | -- 1. Check triggers on appointments table
|
|---|
| 6 | -- ============================================================================
|
|---|
| 7 | -- === 1. TRIGGERS ON APPOINTMENTS TABLE ===
|
|---|
| 8 | SELECT
|
|---|
| 9 | tgname as trigger_name,
|
|---|
| 10 | CASE WHEN tgdisabled = 0 THEN 'ENABLED' ELSE 'DISABLED' END as status
|
|---|
| 11 | FROM pg_trigger
|
|---|
| 12 | WHERE tgrelid = 'appointments'::regclass
|
|---|
| 13 | ORDER BY tgname;
|
|---|
| 14 |
|
|---|
| 15 | -- 2. Check trigger functions
|
|---|
| 16 | -- ============================================================================
|
|---|
| 17 | -- === 2. TRIGGER FUNCTIONS ===
|
|---|
| 18 | SELECT
|
|---|
| 19 | proname as function_name,
|
|---|
| 20 | pronargs as parameter_count,
|
|---|
| 21 | prokind as kind
|
|---|
| 22 | FROM pg_proc
|
|---|
| 23 | WHERE proname IN ('trigger_appointments_enforce', 'trigger_appointments_no_overlap', 'is_valid_appointment_transition')
|
|---|
| 24 | ORDER BY proname;
|
|---|
| 25 |
|
|---|
| 26 | -- 3. Check background job procedure
|
|---|
| 27 | -- ============================================================================
|
|---|
| 28 | -- === 3. BACKGROUND JOB PROCEDURE ===
|
|---|
| 29 | SELECT
|
|---|
| 30 | proname as procedure_name,
|
|---|
| 31 | prokind as kind,
|
|---|
| 32 | 'PL/pgSQL' as language
|
|---|
| 33 | FROM pg_proc
|
|---|
| 34 | WHERE proname = 'job_mark_no_show';
|
|---|
| 35 |
|
|---|
| 36 | -- 4. Check view
|
|---|
| 37 | -- ============================================================================
|
|---|
| 38 | -- === 4. VIEWS ===
|
|---|
| 39 | SELECT
|
|---|
| 40 | viewname as view_name,
|
|---|
| 41 | schemaname as schema_name
|
|---|
| 42 | FROM pg_views
|
|---|
| 43 | WHERE viewname = 'v_overdue_appointments';
|
|---|
| 44 |
|
|---|
| 45 | -- 5. Check appointment status constraint
|
|---|
| 46 | -- ============================================================================
|
|---|
| 47 | -- === 5. STATUS CONSTRAINT (CHECK) ===
|
|---|
| 48 | SELECT
|
|---|
| 49 | constraint_name,
|
|---|
| 50 | constraint_type,
|
|---|
| 51 | table_name
|
|---|
| 52 | FROM information_schema.table_constraints
|
|---|
| 53 | WHERE table_name = 'appointments'
|
|---|
| 54 | AND constraint_type = 'CHECK'
|
|---|
| 55 | AND constraint_name LIKE '%status%';
|
|---|
| 56 |
|
|---|
| 57 | -- 6. Verify constraint includes NO_SHOW
|
|---|
| 58 | -- ============================================================================
|
|---|
| 59 | -- === 6. CONSTRAINT DEFINITION ===
|
|---|
| 60 | SELECT
|
|---|
| 61 | constraint_name,
|
|---|
| 62 | check_clause
|
|---|
| 63 | FROM information_schema.check_constraints
|
|---|
| 64 | WHERE constraint_name = 'appointments_status_chk';
|
|---|
| 65 |
|
|---|
| 66 | -- 7. Test appointment status values
|
|---|
| 67 | -- ============================================================================
|
|---|
| 68 | -- === 7. VALID APPOINTMENT STATUSES ===
|
|---|
| 69 | SELECT 'SCHEDULED' as status
|
|---|
| 70 | UNION ALL
|
|---|
| 71 | SELECT 'IN_PROGRESS'
|
|---|
| 72 | UNION ALL
|
|---|
| 73 | SELECT 'COMPLETED'
|
|---|
| 74 | UNION ALL
|
|---|
| 75 | SELECT 'CANCELLED'
|
|---|
| 76 | UNION ALL
|
|---|
| 77 | SELECT 'NO_SHOW'
|
|---|
| 78 | ORDER BY status;
|
|---|
| 79 |
|
|---|
| 80 | -- 8. Summary Statistics
|
|---|
| 81 | -- ============================================================================
|
|---|
| 82 | -- === 8. DEPLOYMENT SUMMARY ===
|
|---|
| 83 | SELECT
|
|---|
| 84 | 'Triggers' as component,
|
|---|
| 85 | COUNT(*) as count
|
|---|
| 86 | FROM pg_trigger
|
|---|
| 87 | WHERE tgrelid = 'appointments'::regclass
|
|---|
| 88 | UNION ALL
|
|---|
| 89 | SELECT
|
|---|
| 90 | 'Trigger Functions' as component,
|
|---|
| 91 | COUNT(*) as count
|
|---|
| 92 | FROM pg_proc
|
|---|
| 93 | WHERE proname IN ('trigger_appointments_enforce', 'trigger_appointments_no_overlap')
|
|---|
| 94 | UNION ALL
|
|---|
| 95 | SELECT
|
|---|
| 96 | 'Validation Functions' as component,
|
|---|
| 97 | COUNT(*) as count
|
|---|
| 98 | FROM pg_proc
|
|---|
| 99 | WHERE proname = 'is_valid_appointment_transition'
|
|---|
| 100 | UNION ALL
|
|---|
| 101 | SELECT
|
|---|
| 102 | 'Background Procedures' as component,
|
|---|
| 103 | COUNT(*) as count
|
|---|
| 104 | FROM pg_proc
|
|---|
| 105 | WHERE proname = 'job_mark_no_show'
|
|---|
| 106 | UNION ALL
|
|---|
| 107 | SELECT
|
|---|
| 108 | 'Views' as component,
|
|---|
| 109 | COUNT(*) as count
|
|---|
| 110 | FROM pg_views
|
|---|
| 111 | WHERE viewname = 'v_overdue_appointments'
|
|---|
| 112 | ORDER BY component;
|
|---|
| 113 |
|
|---|
| 114 | -- 9. Test the transition validation function
|
|---|
| 115 | -- ============================================================================
|
|---|
| 116 | -- === 9. STATUS TRANSITION VALIDATION TEST ===
|
|---|
| 117 | SELECT
|
|---|
| 118 | 'SCHEDULED → IN_PROGRESS' as transition,
|
|---|
| 119 | is_valid_appointment_transition('SCHEDULED', 'IN_PROGRESS') as valid
|
|---|
| 120 | UNION ALL
|
|---|
| 121 | SELECT 'SCHEDULED → COMPLETED', is_valid_appointment_transition('SCHEDULED', 'COMPLETED')
|
|---|
| 122 | UNION ALL
|
|---|
| 123 | SELECT 'SCHEDULED → CANCELLED', is_valid_appointment_transition('SCHEDULED', 'CANCELLED')
|
|---|
| 124 | UNION ALL
|
|---|
| 125 | SELECT 'IN_PROGRESS → COMPLETED', is_valid_appointment_transition('IN_PROGRESS', 'COMPLETED')
|
|---|
| 126 | UNION ALL
|
|---|
| 127 | SELECT 'COMPLETED → SCHEDULED', is_valid_appointment_transition('COMPLETED', 'SCHEDULED')
|
|---|
| 128 | UNION ALL
|
|---|
| 129 | SELECT 'COMPLETED → COMPLETED', is_valid_appointment_transition('COMPLETED', 'COMPLETED')
|
|---|
| 130 | ORDER BY transition;
|
|---|