| 139 | | v_month_start DATE; |
| 140 | | v_month_end DATE; |
| 141 | | v_total NUMERIC; |
| 142 | | BEGIN |
| 143 | | IF NOT EXISTS ( |
| 144 | | SELECT 1 |
| 145 | | FROM Customer c |
| 146 | | WHERE c.user_id = p_customer_id |
| 147 | | ) THEN |
| 148 | | RAISE EXCEPTION 'Customer with id % does not exist.', p_customer_id; |
| 149 | | END IF; |
| 150 | | |
| 151 | | v_month_start := date_trunc('month', p_month)::date; |
| 152 | | v_month_end := (v_month_start + INTERVAL '1 month')::date; |
| 153 | | |
| 154 | | SELECT |
| 155 | | COALESCE(SUM(COALESCE(st.amount, pass.amount, 0)), 0) |
| 156 | | INTO v_total |
| 157 | | FROM Customer_Payment_Ticket cpt |
| 158 | | JOIN Payment p |
| 159 | | ON cpt.payment_id = p.payment_id |
| 160 | | JOIN Ticket t |
| 161 | | ON cpt.ticket_id = t.ticket_id |
| 162 | | LEFT JOIN Single_ticket st |
| 163 | | ON t.ticket_id = st.ticket_id |
| 164 | | LEFT JOIN Pass_ticket pt |
| 165 | | ON t.ticket_id = pt.ticket_id |
| 166 | | LEFT JOIN Pass_type pass |
| 167 | | ON pt.type_id = pass.id |
| 168 | | WHERE cpt.user_id = p_customer_id |
| 169 | | AND p.status = 'Completed'::payment_status |
| 170 | | AND p.payment_date >= v_month_start |
| 171 | | AND p.payment_date < v_month_end; |
| 172 | | |
| 173 | | RETURN v_total; |
| 174 | | END; |
| 175 | | $$; |
| 176 | | |
| 177 | | }}} |
| 178 | | |
| 179 | | === `get_driver_shift_count` |
| 180 | | |
| 181 | | Оваа функција служи за да го пресмета бројот на смени (line assignments) што одреден возач ги има извршено во даден временски интервал. |
| 182 | | |
| 183 | | {{{ |
| 184 | | |
| 185 | | CREATE OR REPLACE FUNCTION get_driver_shift_count( |
| 186 | | p_driver_id BIGINT, |
| 187 | | p_date_from TIMESTAMP, |
| 188 | | p_date_to TIMESTAMP |
| 189 | | ) |
| 190 | | RETURNS INTEGER |
| 191 | | LANGUAGE plpgsql |
| 192 | | AS $$ |
| 193 | | DECLARE |
| 194 | | v_count INTEGER; |
| 195 | | BEGIN |
| 196 | | IF p_date_from >= p_date_to THEN |
| 197 | | RAISE EXCEPTION 'Start date must be before end date.'; |
| 198 | | END IF; |
| 199 | | |
| 200 | | IF NOT EXISTS ( |
| 201 | | SELECT 1 |
| 202 | | FROM Driver d |
| 203 | | WHERE d.user_id = p_driver_id |
| 204 | | ) THEN |
| 205 | | RAISE EXCEPTION 'Driver with id % does not exist.', p_driver_id; |
| 206 | | END IF; |
| 207 | | |
| | 134 | v_active_count INTEGER; |
| | 135 | BEGIN |
| | 368 | $$; |
| | 369 | |
| | 370 | }}} |
| | 371 | |
| | 372 | === `generate_line_assignment` |
| | 373 | |
| | 374 | Оваа процедура служи за внесување на нова распределба на линија, при што се зачувуваат информациите за возачот, администраторот, автобусот и возниот ред што ќе се користи. Со нејзина помош процесот на креирање на распределби е поедноставен и се намалува можноста за грешки при внесувањето на податоците. |
| | 375 | |
| | 376 | {{{ |
| | 377 | |
| | 378 | CREATE OR REPLACE PROCEDURE generate_line_assignment( |
| | 379 | assignment_driver_id BIGINT, |
| | 380 | assignment_admin_id BIGINT, |
| | 381 | assignment_chassis_number VARCHAR, |
| | 382 | assignment_schedule_id INT, |
| | 383 | assignment_start_time TIMESTAMP, |
| | 384 | assignment_end_time TIMESTAMP |
| | 385 | ) |
| | 386 | LANGUAGE plpgsql AS $$ |
| | 387 | |
| | 388 | DECLARE |
| | 389 | new_assignment_id BIGINT; |
| | 390 | |
| | 391 | BEGIN |
| | 392 | |
| | 393 | INSERT INTO Line_assignment( |
| | 394 | driver_id, |
| | 395 | admin_id, |
| | 396 | chassis_number, |
| | 397 | schedule_id, |
| | 398 | start_time, |
| | 399 | end_time |
| | 400 | ) |
| | 401 | VALUES( |
| | 402 | assignment_driver_id, |
| | 403 | assignment_admin_id, |
| | 404 | assignment_chassis_number, |
| | 405 | assignment_schedule_id, |
| | 406 | assignment_start_time, |
| | 407 | assignment_end_time |
| | 408 | ) |
| | 409 | RETURNING assignment_id INTO new_assignment_id; |
| | 410 | |
| | 411 | COMMIT; |
| | 412 | |
| | 413 | END; |
| | 414 | $$; |
| | 415 | |
| | 416 | }}} |
| | 417 | |
| | 418 | === `register_customer` |
| | 419 | |
| | 420 | Оваа процедура овозможува регистрација на нов корисник во системот преку внесување на неговите лични податоци и автоматско креирање на запис во табелата за патници. Со тоа се обезбедува едноставен и организиран процес на регистрација, при што податоците за корисникот и неговиот тип се зачувуваат на соодветните места во базата на податоци. |
| | 421 | |
| | 422 | {{{ |
| | 423 | |
| | 424 | create or replace procedure register_customer( |
| | 425 | customer_name varchar, |
| | 426 | customer_surname varchar, |
| | 427 | customer_email varchar, |
| | 428 | customer_password varchar, |
| | 429 | customer_address varchar, |
| | 430 | customer_birth date, |
| | 431 | customer_phone varchar, |
| | 432 | customer_id_card varchar, |
| | 433 | customer_type_value customer_type |
| | 434 | ) |
| | 435 | language plpgsql as $$ |
| | 436 | |
| | 437 | declare |
| | 438 | new_user_id bigint; |
| | 439 | |
| | 440 | begin |
| | 441 | |
| | 442 | insert into ApplicationUser( |
| | 443 | name, |
| | 444 | surname, |
| | 445 | email, |
| | 446 | password, |
| | 447 | address, |
| | 448 | date_of_birth, |
| | 449 | phone_number, |
| | 450 | id_card |
| | 451 | ) |
| | 452 | values( |
| | 453 | customer_name, |
| | 454 | customer_surname, |
| | 455 | customer_email, |
| | 456 | customer_password, |
| | 457 | customer_address, |
| | 458 | customer_birth, |
| | 459 | customer_phone, |
| | 460 | customer_id_card |
| | 461 | ) |
| | 462 | returning user_id into new_user_id; |
| | 463 | |
| | 464 | insert into Customer(user_id, type) |
| | 465 | values(new_user_id, customer_type_value); |
| | 466 | |
| | 467 | commit; |
| | 468 | |
| | 469 | end; |
| | 564 | |
| | 565 | === `payment_expired` |
| | 566 | |
| | 567 | Овој тригер автоматски го проверува статусот на секоја уплата при нејзино внесување или ажурирање во системот. Доколку уплатата е сè уште во статус „Pending“, а датумот за плаќање е поминат, статусот автоматски се менува во „Failed“, со што се обезбедува точно евидентирање на неуспешните уплати. |
| | 568 | |
| | 569 | {{{ |
| | 570 | |
| | 571 | create or replace function payment_expired() |
| | 572 | returns trigger as $$ |
| | 573 | |
| | 574 | begin |
| | 575 | |
| | 576 | if NEW.status = 'Pending' |
| | 577 | and NEW.payment_date < current_date then |
| | 578 | |
| | 579 | NEW.status := 'Failed'; |
| | 580 | |
| | 581 | end if; |
| | 582 | |
| | 583 | return NEW; |
| | 584 | |
| | 585 | end; |
| | 586 | $$ language plpgsql; |
| | 587 | |
| | 588 | create trigger payment_status_trigger |
| | 589 | before insert or update on Payment |
| | 590 | for each row |
| | 591 | execute function payment_expired(); |
| | 592 | |
| | 593 | }}} |