| 97 | | === 4. |
| | 97 | === 4. Валидирање на годината на создавање на објект од типот Institution |
| | 98 | |
| | 99 | {{{ |
| | 100 | CREATE OR REPLACE FUNCTION validate_institution_year() |
| | 101 | RETURNS TRIGGER AS $$ |
| | 102 | BEGIN |
| | 103 | IF NEW.year_established > EXTRACT(YEAR FROM CURRENT_DATE) THEN |
| | 104 | RAISE EXCEPTION 'Institution cannot be established in the future.'; |
| | 105 | END IF; |
| | 106 | RETURN NEW; |
| | 107 | END; |
| | 108 | $$ LANGUAGE plpgsql; |
| | 109 | |
| | 110 | CREATE TRIGGER trg_validate_year_established |
| | 111 | BEFORE INSERT OR UPDATE ON Institution |
| | 112 | FOR EACH ROW |
| | 113 | EXECUTE FUNCTION validate_institution_year(); |
| | 114 | }}} |
| | 115 | |
| | 116 | === 5. Форматирчки тригер кој се однесува на објектите од типот Institution |
| | 117 | |
| | 118 | {{{ |
| | 119 | CREATE OR REPLACE FUNCTION format_institution_fields() |
| | 120 | RETURNS TRIGGER AS $$ |
| | 121 | BEGIN |
| | 122 | NEW.name := INITCAP(NEW.name); |
| | 123 | NEW.city := INITCAP(NEW.city); |
| | 124 | RETURN NEW; |
| | 125 | END; |
| | 126 | $$ LANGUAGE plpgsql; |
| | 127 | |
| | 128 | CREATE TRIGGER trg_format_institution_fields |
| | 129 | BEFORE INSERT OR UPDATE ON Institution |
| | 130 | FOR EACH ROW |
| | 131 | EXECUTE FUNCTION format_institution_fields(); |
| | 132 | }}} |
| | 133 | |
| | 134 | === 6. Тригер кој поставува custom description на !CriminalReport |
| | 135 | |
| | 136 | {{{ |
| | 137 | CREATE OR REPLACE FUNCTION update_criminal_report_description() |
| | 138 | RETURNS TRIGGER AS $$ |
| | 139 | DECLARE |
| | 140 | deadline_date DATE; |
| | 141 | report_date DATE; |
| | 142 | formatted_fine TEXT; |
| | 143 | BEGIN |
| | 144 | SELECT created_at INTO report_date |
| | 145 | FROM report |
| | 146 | WHERE report_id = NEW.report_id; |
| | 147 | |
| | 148 | IF NEW.punishment_type = 'fine' THEN |
| | 149 | deadline_date := report_date + INTERVAL '1 month'; |
| | 150 | formatted_fine := TO_CHAR(NEW.fine_to_pay, 'FM999999990.00'); |
| | 151 | |
| | 152 | UPDATE CriminalReport |
| | 153 | SET descriptive_punishment = FORMAT( |
| | 154 | 'The fine to be paid is %s euros, and shall be paid within one month after the report is made (until %s).', |
| | 155 | formatted_fine, |
| | 156 | TO_CHAR(deadline_date, 'YYYY-MM-DD') |
| | 157 | ) |
| | 158 | WHERE report_id = NEW.report_id; |
| | 159 | |
| | 160 | ELSIF NEW.punishment_type = 'prison' THEN |
| | 161 | UPDATE CriminalReport |
| | 162 | SET descriptive_punishment = FORMAT( |
| | 163 | 'The accused shall be in prison until %s.', |
| | 164 | TO_CHAR(NEW.release_date, 'YYYY-MM-DD') |
| | 165 | ) |
| | 166 | WHERE report_id = NEW.report_id; |
| | 167 | END IF; |
| | 168 | |
| | 169 | RETURN NULL; |
| | 170 | END; |
| | 171 | $$ LANGUAGE plpgsql; |
| | 172 | |
| | 173 | CREATE TRIGGER trg_update_description_on_punishment_insert |
| | 174 | AFTER INSERT OR UPDATE ON Punishment |
| | 175 | FOR EACH ROW |
| | 176 | EXECUTE FUNCTION update_criminal_report_description(); |
| | 177 | }}} |
| | 178 | |
| | 179 | === 7. Тригер кој поставува вредносна валута за казната на објектот Punishment |
| | 180 | |
| | 181 | {{{ |
| | 182 | CREATE OR REPLACE FUNCTION setting_punishment_depending_on_type() |
| | 183 | RETURNS TRIGGER AS $$ |
| | 184 | DECLARE |
| | 185 | BEGIN |
| | 186 | IF NEW.punishment_type = 'fine' THEN |
| | 187 | NEW.value_unit := 'euros'; |
| | 188 | IF NEW.fine_to_pay IS NULL THEN |
| | 189 | RAISE EXCEPTION 'Fine punishment must include fine_to_pay amount.'; |
| | 190 | END IF; |
| | 191 | IF NEW.release_date IS NOT NULL THEN |
| | 192 | RAISE EXCEPTION 'Fine punishment must not have a release_date.'; |
| | 193 | END IF; |
| | 194 | ELSIF NEW.punishment_type = 'prison' THEN |
| | 195 | NEW.value_unit := 'years'; |
| | 196 | IF NEW.release_date IS NULL THEN |
| | 197 | RAISE EXCEPTION 'Prison punishment must include release_date.'; |
| | 198 | END IF; |
| | 199 | IF NEW.fine_to_pay IS NOT NULL THEN |
| | 200 | RAISE EXCEPTION 'Prison punishment must not include fine_to_pay.'; |
| | 201 | END IF; |
| | 202 | ELSE |
| | 203 | RAISE EXCEPTION 'Invalid punishment_type: %', NEW.punishment_type; |
| | 204 | END IF; |
| | 205 | RETURN NEW; |
| | 206 | END; |
| | 207 | $$ LANGUAGE plpgsql; |
| | 208 | |
| | 209 | CREATE TRIGGER trg_set_punishment_unit |
| | 210 | BEFORE INSERT OR UPDATE ON Punishment |
| | 211 | FOR EACH ROW |
| | 212 | EXECUTE FUNCTION setting_punishment_depending_on_type(); |
| | 213 | }}} |