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