Changes between Initial Version and Version 1 of Procedures


Ignore:
Timestamp:
08/31/25 22:13:11 (38 hours ago)
Author:
222004
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Procedures

    v1 v1  
     1== **Процедури**\\
     2\\
     3
     4== 1) Генерирање на месечен извештај за промет по аптека\\
     5Оваа процедура создава месечен извештај за приходот на сите аптеки. Се користи кога менаџментот сака да следи колку приход остварила секоја аптека во даден месец.\\ Практична за финансиска анализа.\\
     6
     7{{{
     8
     9CREATE OR REPLACE PROCEDURE synergymed.sp_monthly_pharmacy_revenue(p_year INT, p_month INT)
     10LANGUAGE plpgsql
     11AS $$
     12BEGIN
     13  RAISE NOTICE 'Извештај за промет за %-%:', p_month, p_year;
     14
     15  SELECT ph.company_id AS pharmacy_id,
     16         c.company_name,
     17         SUM(cobm.quantity * bm.price) AS total_revenue
     18  FROM synergymed.clientorder co
     19  JOIN synergymed.clientorder_brandedmedicine cobm ON cobm.order_id = co.id
     20  JOIN synergymed.brandedmedicine bm ON bm.id = cobm.branded_medicine_id
     21  JOIN synergymed.deliverycompany dc ON dc.company_id = co.delivery_company_id
     22  JOIN synergymed.pharmacy ph ON ph.company_id = dc.company_id
     23  JOIN synergymed.company c ON c.id = ph.company_id
     24  WHERE EXTRACT(YEAR FROM co.order_date) = p_year
     25    AND EXTRACT(MONTH FROM co.order_date) = p_month
     26  GROUP BY ph.company_id, c.company_name;
     27END;
     28$$;
     29
     30}}}
     31----
     32== 2) Блокирање на клиент ако има повеќе неуспешни плаќања \\
     33Со оваа процедура се проверува колку пати клиентот имал неуспешно плаќање и ако надмине лимит, автоматски му се деактивира статусот. \\Корисна е за ризик менаџмент и заштита од злоупотреби.\\
     34{{{
     35
     36CREATE OR REPLACE PROCEDURE synergymed.sp_block_client_for_failed_payments(p_client_id INT, p_limit INT)
     37LANGUAGE plpgsql
     38AS $$
     39DECLARE v_failed INT;
     40BEGIN
     41  SELECT COUNT(*) INTO v_failed
     42  FROM synergymed.payment
     43  WHERE client_id = p_client_id
     44    AND status = 'неуспешно';
     45
     46  IF v_failed >= p_limit THEN
     47    UPDATE synergymed.client
     48    SET is_verified = FALSE
     49    WHERE user_id = p_client_id;
     50
     51    RAISE NOTICE 'Клиентот % е блокиран поради % неуспешни плаќања', p_client_id, v_failed;
     52  ELSE
     53    RAISE NOTICE 'Клиентот % има само % неуспешни плаќања (лимит %)', p_client_id, v_failed, p_limit;
     54  END IF;
     55END;
     56$$;
     57
     58
     59}}}
     60
     61----
     62
     63== 3) Извештај за истекување на рецепти \\
     64Оваа процедура излистува рецепти што ќе истечат во одреден временски период (пример 7 дена). Корисна е за аптеки и лекари за да навремено известат пациенти.\\ Ова е реално сценарио кое се користи во здравствени системи.\\
     65{{{
     66
     67CREATE OR REPLACE PROCEDURE synergymed.sp_expiring_prescriptions(p_days_ahead INT)
     68LANGUAGE plpgsql
     69AS $$
     70BEGIN
     71  RAISE NOTICE 'Рецепти што истекуваат во наредните % дена:', p_days_ahead;
     72
     73  SELECT p.id, u.first_name || ' ' || u.last_name AS client_name, p.valid_to
     74  FROM synergymed.prescription p
     75  JOIN synergymed.client c ON c.user_id = p.client_id
     76  JOIN synergymed.users u ON u.id = c.user_id
     77  WHERE p.valid_to <= CURRENT_DATE + p_days_ahead;
     78END;
     79$$;
     80
     81}}}
     82
     83----
     84
     85== 4) Проверка на интеракции при препишување лекови \\
     86Оваа процедура проверува дали ново препишаниот лек ќе има интеракции со веќе активни рецепти на клиентот. Корисна е за фармацевти и лекари за да се избегнат опасни комбинации на лекови.\\ При издавање нов рецепт, системот веднаш предупредува ако постои ризик.\\
     87
     88{{{
     89
     90CREATE OR REPLACE PROCEDURE synergymed.sp_check_prescription_interactions(p_client_id INT, p_new_medicine_id INT)
     91LANGUAGE plpgsql
     92AS $$
     93BEGIN
     94  RAISE NOTICE 'Проверка на интеракции за клиент % со лек %', p_client_id, p_new_medicine_id;
     95
     96  SELECT DISTINCT m1.medicine_name AS existing_medicine,
     97                  m2.medicine_name AS new_medicine,
     98                  mi.type,
     99                  mi.severity,
     100                  mi.description
     101  FROM synergymed.prescription pr
     102  JOIN synergymed.medicine m1 ON m1.id = pr.medicine_id
     103  JOIN synergymed.medicineinteraction mi
     104       ON (mi.medicine_id_1 = m1.id AND mi.medicine_id_2 = p_new_medicine_id)
     105       OR (mi.medicine_id_2 = m1.id AND mi.medicine_id_1 = p_new_medicine_id)
     106  JOIN synergymed.medicine m2 ON m2.id = p_new_medicine_id
     107  WHERE pr.client_id = p_client_id
     108    AND pr.valid_to >= CURRENT_DATE;
     109END;
     110$$;
     111
     112
     113}}}
     114
     115