| 64 | |
| 65 | == 3. Тригер за закажување на инспекција на единицата веднаш по креирање на договор |
| 66 | |
| 67 | * Со овој тригер се креираат 3 инспекции на единицата веднаш по креирање на договорот, првата е пред да се всели изнајмувачот, втората се закажува за оние единици чии договор трае повеќе од 8 месеци и третата се закажува 7 дена пред да заврши договорот за да се направи финална проверка на единицата. Дополнително се прави проверка дали датумот за секоја од овие 3 инспекции е викенд, со што се прави поместување +1 за недела, +2дена за сабота со цел инспекциите да се одвиваат во работна недела. |
| 68 | {{{ |
| 69 | CREATE OR REPLACE FUNCTION domify.f_schedule_mandatory_inspections() |
| 70 | RETURNS TRIGGER AS $$ |
| 71 | DECLARE |
| 72 | lease_duration_months INT; |
| 73 | initial_inspection_date DATE; |
| 74 | midterm_inspection_date DATE; |
| 75 | final_inspection_date DATE; |
| 76 | BEGIN |
| 77 | lease_duration_months := EXTRACT(MONTH FROM AGE(NEW.end_date, NEW.start_date)) + |
| 78 | EXTRACT(YEAR FROM AGE(NEW.end_date, NEW.start_date)) * 12; |
| 79 | |
| 80 | initial_inspection_date := domify.f_adjust_for_weekend((NEW.start_date - INTERVAL '1 day')::DATE); |
| 81 | midterm_inspection_date := domify.f_adjust_for_weekend((NEW.start_date + INTERVAL '6 months')::DATE); |
| 82 | final_inspection_date := domify.f_adjust_for_weekend((NEW.end_date - INTERVAL '7 days')::DATE); |
| 83 | |
| 84 | IF NEW.start_date > CURRENT_DATE + INTERVAL '1 day' THEN |
| 85 | INSERT INTO domify.Inspection ( |
| 86 | inspection_date, |
| 87 | notes, |
| 88 | lease_id, |
| 89 | landlord_id |
| 90 | ) VALUES ( |
| 91 | initial_inspection_date, |
| 92 | 'Почетна инспекција - проверка дали се е добро пред вселување' || |
| 93 | CASE WHEN initial_inspection_date != (NEW.start_date - INTERVAL '1 day')::DATE |
| 94 | THEN ' (поместена од викенд)' |
| 95 | ELSE '' |
| 96 | END, |
| 97 | NEW.id, |
| 98 | NEW.landlord_id |
| 99 | ); |
| 100 | END IF; |
| 101 | |
| 102 | IF lease_duration_months >= 8 THEN |
| 103 | INSERT INTO domify.Inspection ( |
| 104 | inspection_date, |
| 105 | notes, |
| 106 | lease_id, |
| 107 | landlord_id |
| 108 | ) VALUES ( |
| 109 | midterm_inspection_date, |
| 110 | 'Полугодишна инспекција - проверка на состојбата во која се наоѓа единицата' || |
| 111 | CASE WHEN midterm_inspection_date != (NEW.start_date + INTERVAL '6 months')::DATE |
| 112 | THEN ' (поместена од викенд)' |
| 113 | ELSE '' |
| 114 | END, |
| 115 | NEW.id, |
| 116 | NEW.landlord_id |
| 117 | ); |
| 118 | END IF; |
| 119 | |
| 120 | INSERT INTO domify.Inspection ( |
| 121 | inspection_date, |
| 122 | notes, |
| 123 | lease_id, |
| 124 | landlord_id |
| 125 | ) VALUES ( |
| 126 | final_inspection_date, |
| 127 | 'Финална инспекција - оценка на штети и депозит' || |
| 128 | CASE WHEN final_inspection_date != (NEW.end_date - INTERVAL '7 days')::DATE |
| 129 | THEN ' (поместена од викенд)' |
| 130 | ELSE '' |
| 131 | END, |
| 132 | NEW.id, |
| 133 | NEW.landlord_id |
| 134 | ); |
| 135 | |
| 136 | RETURN NEW; |
| 137 | END; |
| 138 | $$ LANGUAGE plpgsql; |
| 139 | |
| 140 | CREATE TRIGGER t_schedule_mandatory_inspections |
| 141 | AFTER INSERT ON domify.Lease |
| 142 | FOR EACH ROW |
| 143 | EXECUTE FUNCTION domify.f_schedule_mandatory_inspections(); |
| 144 | }}} |
| 145 | Функцијата која се користи за поместувањето: |
| 146 | {{{ |
| 147 | CREATE OR REPLACE FUNCTION domify.f_adjust_for_weekend(input_date DATE) |
| 148 | RETURNS DATE AS $$ |
| 149 | BEGIN |
| 150 | CASE EXTRACT(DOW FROM input_date) |
| 151 | WHEN 0 THEN RETURN input_date + INTERVAL '1 day'; |
| 152 | WHEN 6 THEN RETURN input_date + INTERVAL '2 days'; |
| 153 | ELSE RETURN input_date; |
| 154 | END CASE; |
| 155 | END; |
| 156 | $$ LANGUAGE plpgsql; |
| 157 | }}} |