Changes between Version 3 and Version 4 of DatabaseProgramming


Ignore:
Timestamp:
06/08/26 18:17:22 (11 days ago)
Author:
231003
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v3 v4  
    123123}}}
    124124
    125 === `get_customer_monthly_spending`
    126 
    127 Оваа функција служи за пресметување на вкупната сума што одреден клиент ја има потрошено во даден месец за сите успешно завршени плаќања за билети (single или pass).
    128 
    129 {{{
    130 
    131 CREATE OR REPLACE FUNCTION get_customer_monthly_spending(
    132     p_customer_id BIGINT,
    133     p_month DATE
    134 )
    135 RETURNS NUMERIC
    136 LANGUAGE plpgsql
    137 AS $$
     125=== `count_active_lines`
     126
     127Оваа функција е имплементирана со цел да обезбеди брз и едноставен начин за добивање на бројот на активни линии во системот. Нејзината намена е да поддржи анализа и следење на состојбата на транспортната мрежа преку централизирано пресметување на активните линии.
     128
     129{{{
     130
     131CREATE OR REPLACE FUNCTION count_active_lines()
     132RETURNS INTEGER AS $$
    138133DECLARE
    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;
     135BEGIN
    208136    SELECT COUNT(*)
    209     INTO v_count
    210     FROM Line_assignment la
    211     WHERE la.driver_id = p_driver_id
    212       AND la.start_time >= p_date_from
    213       AND la.start_time < p_date_to;
    214 
    215     RETURN v_count;
    216 END;
    217 $$;
    218 
     137    INTO v_active_count
     138    FROM Line
     139    WHERE is_active = TRUE;
     140   
     141    RETURN v_active_count;
     142END;
     143$$ LANGUAGE plpgsql;
     144
     145SELECT count_active_lines();
    219146}}}
    220147
     
    439366    RAISE NOTICE 'Line assignment created. assignment_id=%', v_assignment_id;
    440367END;
     368$$;
     369
     370}}}
     371
     372=== `generate_line_assignment`
     373
     374Оваа процедура служи за внесување на нова распределба на линија, при што се зачувуваат информациите за возачот, администраторот, автобусот и возниот ред што ќе се користи. Со нејзина помош процесот на креирање на распределби е поедноставен и се намалува можноста за грешки при внесувањето на податоците.
     375
     376{{{
     377
     378CREATE 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)
     386LANGUAGE plpgsql AS $$
     387
     388DECLARE
     389    new_assignment_id BIGINT;
     390
     391BEGIN
     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
     413END;
     414$$;
     415
     416}}}
     417
     418=== `register_customer`
     419
     420Оваа процедура овозможува регистрација на нов корисник во системот преку внесување на неговите лични податоци и автоматско креирање на запис во табелата за патници. Со тоа се обезбедува едноставен и организиран процес на регистрација, при што податоците за корисникот и неговиот тип се зачувуваат на соодветните места во базата на податоци.
     421
     422{{{
     423
     424create 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)
     435language plpgsql as $$
     436
     437declare
     438    new_user_id bigint;
     439
     440begin
     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
     469end;
    441470$$;
    442471
     
    533562
    534563}}}
     564
     565=== `payment_expired`
     566
     567Овој тригер автоматски го проверува статусот на секоја уплата при нејзино внесување или ажурирање во системот. Доколку уплатата е сè уште во статус „Pending“, а датумот за плаќање е поминат, статусот автоматски се менува во „Failed“, со што се обезбедува точно евидентирање на неуспешните уплати.
     568
     569{{{
     570
     571create or replace function payment_expired()
     572returns trigger as $$
     573
     574begin
     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
     585end;
     586$$ language plpgsql;
     587
     588create trigger payment_status_trigger
     589before insert or update on Payment
     590for each row
     591execute function payment_expired();
     592
     593}}}