| | 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 | }}} |