| 214 | |
| 215 | === 8. Проверка за дали Person објектот на кого се однесува !EmploymentReport е возрасна личност |
| 216 | |
| 217 | {{{ |
| 218 | CREATE OR REPLACE FUNCTION check_if_person_is_adult() |
| 219 | RETURNS TRIGGER AS $$ |
| 220 | DECLARE |
| 221 | person_date_of_birth DATE; |
| 222 | person_date_of_death DATE; |
| 223 | person_is_alive_status BOOLEAN; |
| 224 | created_at_report_date DATE; |
| 225 | BEGIN |
| 226 | --I need the data so I can make the checks |
| 227 | SELECT p.date_of_birth, p.is_alive, p.date_of_death, r.created_at |
| 228 | INTO person_date_of_birth, person_is_alive_status, person_date_of_death, created_at_report_date |
| 229 | FROM report r |
| 230 | JOIN person p ON r.person_id = p.person_id |
| 231 | WHERE r.report_id = NEW.report_id; |
| 232 | IF person_is_alive_status IS TRUE THEN |
| 233 | IF EXTRACT(YEAR FROM age(created_at_report_date, person_date_of_birth)) < 18 THEN |
| 234 | RAISE EXCEPTION 'Person must be adult to have an employment report!'; |
| 235 | END IF; |
| 236 | ELSIF person_is_alive_status IS FALSE THEN |
| 237 | IF EXTRACT(YEAR FROM age(created_at_report_date, person_date_of_birth)) < 18 THEN |
| 238 | RAISE EXCEPTION 'Person was not adult at the time of report creation!'; |
| 239 | ELSIF created_at_report_date > person_date_of_death THEN |
| 240 | RAISE EXCEPTION 'The report cannot be created after the person''s death!'; |
| 241 | END IF; |
| 242 | END IF; |
| 243 | RETURN NEW; |
| 244 | END; |
| 245 | $$ LANGUAGE plpgsql; |
| 246 | |
| 247 | CREATE TRIGGER trg_check_if_person_adult |
| 248 | BEFORE INSERT OR UPDATE ON EmploymentReport |
| 249 | FOR EACH ROW |
| 250 | EXECUTE FUNCTION check_if_person_is_adult(); |
| 251 | }}} |
| 252 | |
| 253 | === 9. Тригер кој овозможува креирање на профил за секој регистриран корисник на апликацијата, веднаш по регистрација |
| 254 | |
| 255 | {{{ |
| 256 | CREATE FUNCTION create_profile_automatically_when_user_comes() RETURNS TRIGGER AS $$ |
| 257 | BEGIN |
| 258 | INSERT INTO UserProfile (user_id, role_id, username) |
| 259 | VALUES (NEW.user_id, 2, NEW.name || ' ' || NEW.surname); |
| 260 | RETURN NEW; |
| 261 | END; |
| 262 | $$ LANGUAGE plpgsql; |
| 263 | |
| 264 | CREATE TRIGGER trg_create_profile_for_user |
| 265 | AFTER INSERT ON ReportiumUser |
| 266 | FOR EACH ROW |
| 267 | EXECUTE FUNCTION create_profile_automatically_when_user_comes(); |
| 268 | }}} |
| 269 | |
| 270 | === 10. Валидатор на embg форматот |
| 271 | |
| 272 | {{{ |
| 273 | --function for validating embg format |
| 274 | CREATE OR REPLACE FUNCTION validate_embg_format() |
| 275 | RETURNS TRIGGER AS $$ |
| 276 | DECLARE |
| 277 | date_part TEXT; |
| 278 | gender_code TEXT; |
| 279 | BEGIN |
| 280 | date_part := TO_CHAR(NEW.date_of_birth, 'DD') |
| 281 | || TO_CHAR(NEW.date_of_birth, 'MM') |
| 282 | || RIGHT(TO_CHAR(EXTRACT(YEAR FROM NEW.date_of_birth)::INT,'9999'),3); |
| 283 | --this is going to fetch the last 3 digits from the year |
| 284 | --example: if it is 1990 -> it fetches 990 |
| 285 | IF SUBSTRING(NEW.embg FROM 1 FOR 7) <> date_part THEN |
| 286 | RAISE EXCEPTION 'EMBG date part does not match the date of birth!'; |
| 287 | END IF; |
| 288 | --gender check |
| 289 | gender_code := SUBSTRING(NEW.embg FROM 8 FOR 3); |
| 290 | IF (NEW.gender = 'Male' AND gender_code <> '450') OR |
| 291 | (NEW.gender = 'Female' AND gender_code <> '455') THEN |
| 292 | RAISE EXCEPTION 'EMBG gender code does not match gender!'; |
| 293 | END IF; |
| 294 | RETURN NEW; |
| 295 | END; |
| 296 | $$ LANGUAGE plpgsql; |
| 297 | |
| 298 | CREATE TRIGGER check_embg_format |
| 299 | BEFORE INSERT OR UPDATE ON Person |
| 300 | FOR EACH ROW |
| 301 | EXECUTE FUNCTION validate_embg_format(); |
| 302 | }}} |
| 303 | |
| 304 | === 11. Проверка за is_alive статус кај Person објект |
| 305 | |
| 306 | {{{ |
| 307 | CREATE OR REPLACE FUNCTION alive_status_check() |
| 308 | RETURNS TRIGGER AS $$ |
| 309 | BEGIN |
| 310 | IF NEW.date_of_death IS NOT NULL THEN |
| 311 | NEW.is_alive := FALSE; |
| 312 | END IF; |
| 313 | RETURN NEW; |
| 314 | END; |
| 315 | $$ LANGUAGE plpgsql; |
| 316 | |
| 317 | CREATE TRIGGER alive_status_check |
| 318 | BEFORE INSERT OR UPDATE ON Person |
| 319 | FOR EACH ROW |
| 320 | EXECUTE FUNCTION alive_status_check(); |
| 321 | }}} |
| 322 | |