Changes between Version 4 and Version 5 of DatabaseProgramming


Ignore:
Timestamp:
09/14/26 01:15:12 (12 days ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v4 v5  
    11= Functions, Procedures, Triggers =
     2
     3== Функции ==
     4
     5Функциите ги пресметуваат износите и поените и ја проверуваат важноста на договорите. Припаѓаат на шемата `kbnteam`, се напишани на SQL и се означени како STABLE. Читаат податоци и враќаат вредност без да ги менуваат табелите. Можат да се користат во SQL изрази и во логиката на процедурите и тригерите.
     6
     7||= Функција ||= Намена ||= Повратен тип ||
     8|| [#fn_has_active_contract fn_has_active_contract] || Проверка на активен договор || `BOOLEAN` ||
     9|| [#fn_calculate_order_total fn_calculate_order_total] || Пресметка на вкупен износ || `NUMERIC(10,2)` ||
     10|| [#fn_calculate_customer_loyalty_points fn_calculate_customer_loyalty_points] || Пресметка на поени за лојалност || `INTEGER` ||
     11
     12[[Anchor(fn_has_active_contract)]]
     13
     14=== fn_has_active_contract ===
     15
     16Враќа TRUE ако постои договор за зададената компанија и ресторан со статус active, а зададениот датум е меѓу почетниот и крајниот датум, вклучувајќи ги границите. Инаку враќа FALSE. Кога датумот не е зададен, се користи тековниот датум. Називот на статусот се споредува без разлика на големината на буквите.
     17
     18||= Својство ||= Вредност ||
     19|| Повратен тип || `BOOLEAN` ||
     20|| Изворни табели || `contract`, `contract_status` ||
     21
     22||= Параметар ||= Тип ||= Стандардна вредност ||= Опис ||
     23|| `p_company_id` || `INTEGER` || — || Идентификатор на компанијата. ||
     24|| `p_rest_id` || `INTEGER` || — || Идентификатор на ресторанот. ||
     25|| `p_on_date` || `DATE` || `CURRENT_DATE` || Датум за проверка на важноста на договорот. ||
     26
     27Се користи од: [#trg_order_drink_guard_and_total trg_order_drink_guard_and_total], [#trg_order_meal_guard_and_total trg_order_meal_guard_and_total], [#pr_assign_delivery_to_company_order pr_assign_delivery_to_company_order], [#pr_add_order_item pr_add_order_item], [#pr_change_order_status pr_change_order_status], [#pr_submit_customer_order pr_submit_customer_order].
     28
     29[[Anchor(fn_calculate_order_total)]]
     30
     31=== fn_calculate_order_total ===
     32
     33Ги собира тековните цени на јадењата и пијалоците поврзани со нарачката. Ако нема ставки, враќа 0.00. Не применува попуст за лојалност или дополнителен надомест за достава и не ја менува нарачката; запишувањето на пресметаниот износ го вршат процедурите и тригерите.
     34
     35||= Својство ||= Вредност ||
     36|| Повратен тип || `NUMERIC(10,2)` ||
     37|| Изворни табели || `order_meal`, `meal`, `order_drink`, `drink` ||
     38
     39||= Параметар ||= Тип ||= Стандардна вредност ||= Опис ||
     40|| `p_order_id` || `INTEGER` || — || Идентификатор на клиентската нарачка. ||
     41
     42Се користи од: [#trg_order_drink_guard_and_total trg_order_drink_guard_and_total], [#trg_order_meal_guard_and_total trg_order_meal_guard_and_total], [#pr_remove_order_item pr_remove_order_item], [#pr_add_order_item pr_add_order_item], [#pr_finalize_company_order pr_finalize_company_order], [#pr_change_order_status pr_change_order_status], [#pr_submit_customer_order pr_submit_customer_order].
     43
     44[[Anchor(fn_calculate_customer_loyalty_points)]]
     45
     46=== fn_calculate_customer_loyalty_points ===
     47
     48Ги собира износите на нарачките на клиентот, го заокружува збирот надолу и враќа цел број. Нарачките со статус cancelled придонесуваат со нула. Останатите статуси, вклучително pending и refunded, се вклучени. Ако нема нарачки, враќа нула. Функцијата ги пресметува поените, а нивното запишување го врши процедурата за освежување на лојалноста.
     49
     50||= Својство ||= Вредност ||
     51|| Повратен тип || `INTEGER` ||
     52|| Изворни табели || `customer_order`, `order_status` ||
     53
     54||= Параметар ||= Тип ||= Стандардна вредност ||= Опис ||
     55|| `p_customer_user_id` || `INTEGER` || — || Идентификатор на клиентот. ||
     56
     57Се користи од: [#pr_refresh_customer_loyalty pr_refresh_customer_loyalty].
    258
    359== Процедури ==
    … …  
    210266Овие премини се однесуваат на [#pr_change_delivery_status pr_change_delivery_status]. При создавање достава се користи зададениот почетен статус. Во двете процедури за промена на статус, називите се споредуваат без разлика на големината на буквите и повторување на тековниот статус завршува без измена.
    211267
     268== Тригери ==
     269
     270Тригерите автоматски се активираат при промени на податоците. Сите се извршуваат за секој засегнат ред. Проверката на компанијата се извршува пред промената на клиентската нарачка, а проверките на ставките и пресметката на износот по нивното внесување, измена или бришење.
     271
     272||= Тригер ||= Табела ||= Момент ||= Настан ||
     273|| [#trg_validate_customer_order_company trg_validate_customer_order_company] || `kbnteam.customer_order` || `BEFORE` || `INSERT OR UPDATE OF customer_user_id, comp_order_id` ||
     274|| [#trg_order_meal_guard_and_total trg_order_meal_guard_and_total] || `kbnteam.order_meal` || `AFTER` || `INSERT OR UPDATE OR DELETE` ||
     275|| [#trg_order_drink_guard_and_total trg_order_drink_guard_and_total] || `kbnteam.order_drink` || `AFTER` || `INSERT OR UPDATE OR DELETE` ||
     276
     277[[Anchor(trg_validate_customer_order_company)]]
     278
     279=== trg_validate_customer_order_company ===
     280
     281Проверува дали клиентот и компаниската нарачка постојат и припаѓаат на иста компанија. При неуспешна проверка ја прекинува наредбата со исклучок. При успешна проверка го враќа новиот ред (NEW).
     282
     283Проверката се активира при внесување нарачка и при ажурирање што ги наведува customer_user_id или comp_order_id. Ажурирање само на order_total или статусот не го активира овој тригер.
     284
     285||= Својство ||= Вредност ||
     286|| Табела || `kbnteam.customer_order` ||
     287|| Момент || `BEFORE` ||
     288|| Настан || `INSERT OR UPDATE OF customer_user_id, comp_order_id` ||
     289|| Опфат || За секој засегнат ред (FOR EACH ROW). ||
     290|| Тригер-функција || [#tf_validate_customer_order_company tf_validate_customer_order_company] ||
     291
     292[[Anchor(trg_order_meal_guard_and_total)]]
     293
     294=== trg_order_meal_guard_and_total ===
     295
     296При внесување или измена на ставка проверува дали нарачката е поврзана со валиден клиент и компанија и дали постои активен договор со ресторанот на јадењето на датумот на нарачката. Потоа повторно го пресметува и запишува вкупниот износ на нарачката. При бришење не проверува договор, туку го освежува износот на старата нарачка.
     297
     298Ако со UPDATE ставката се префрли во друга нарачка, ги освежува износите и на новата и на старата нарачка.
     299
     300||= Својство ||= Вредност ||
     301|| Табела || `kbnteam.order_meal` ||
     302|| Момент || `AFTER` ||
     303|| Настан || `INSERT OR UPDATE OR DELETE` ||
     304|| Опфат || За секој засегнат ред (FOR EACH ROW). ||
     305|| Тригер-функција || [#tf_order_meal_guard_and_total tf_order_meal_guard_and_total] ||
     306
     307Ги користи [#fn_has_active_contract fn_has_active_contract] за проверка на договорот и [#fn_calculate_order_total fn_calculate_order_total] за пресметка на износот. Бидејќи се извршува AFTER, пресметката ја опфаќа изменетата состојба на ставките. Исклучок од проверката ја прекинува тековната наредба.
     308
     309[[Anchor(trg_order_drink_guard_and_total)]]
     310
     311=== trg_order_drink_guard_and_total ===
     312
     313При внесување или измена на ставка проверува дали нарачката е поврзана со валиден клиент и компанија и дали постои активен договор со ресторанот на пијалакот на датумот на нарачката. Потоа повторно го пресметува и запишува вкупниот износ на нарачката. При бришење не проверува договор, туку го освежува износот на старата нарачка.
     314
     315Ако со UPDATE ставката се префрли во друга нарачка, ги освежува износите и на новата и на старата нарачка.
     316
     317||= Својство ||= Вредност ||
     318|| Табела || `kbnteam.order_drink` ||
     319|| Момент || `AFTER` ||
     320|| Настан || `INSERT OR UPDATE OR DELETE` ||
     321|| Опфат || За секој засегнат ред (FOR EACH ROW). ||
     322|| Тригер-функција || [#tf_order_drink_guard_and_total tf_order_drink_guard_and_total] ||
     323
     324Ги користи [#fn_has_active_contract fn_has_active_contract] за проверка на договорот и [#fn_calculate_order_total fn_calculate_order_total] за пресметка на износот. Бидејќи се извршува AFTER, пресметката ја опфаќа изменетата состојба на ставките. Исклучок од проверката ја прекинува тековната наредба.
     325
     326=== Тригер-функции ===
     327
     328Тригер-функциите се напишани на PL/pgSQL и враќаат тип TRIGGER. Немаат декларирани влезни параметри; ги користат податоците за активирањето и редовите NEW и OLD. Нивното извршување го повикува соодветниот тригер.
     329
     330[[Anchor(tf_validate_customer_order_company)]]
     331
     332==== tf_validate_customer_order_company ====
     333
     334||= Својство ||= Вредност ||
     335|| Повратен тип || `TRIGGER` ||
     336|| Активиран преку || [#trg_validate_customer_order_company trg_validate_customer_order_company] ||
     337|| Однесување || Го враќа NEW по успешна проверка на компанијата. ||
     338
     339[[Anchor(tf_order_meal_guard_and_total)]]
     340
     341==== tf_order_meal_guard_and_total ====
     342
     343||= Својство ||= Вредност ||
     344|| Повратен тип || `TRIGGER` ||
     345|| Активиран преку || [#trg_order_meal_guard_and_total trg_order_meal_guard_and_total] ||
     346|| Однесување || Го враќа COALESCE(NEW, OLD). Кај AFTER тригерот повратниот ред не го заменува запишаниот ред; ефектот е проверката и ажурирањето на износот. ||
     347
     348[[Anchor(tf_order_drink_guard_and_total)]]
     349
     350==== tf_order_drink_guard_and_total ====
     351
     352||= Својство ||= Вредност ||
     353|| Повратен тип || `TRIGGER` ||
     354|| Активиран преку || [#trg_order_drink_guard_and_total trg_order_drink_guard_and_total] ||
     355|| Однесување || Го враќа COALESCE(NEW, OLD). Кај AFTER тригерот повратниот ред не го заменува запишаниот ред; ефектот е проверката и ажурирањето на износот. ||
     356
     357=== Поврзаност со процедурите ===
     358
     359Проверките за статус на нарачката и за постоење фактура се дел од процедурите за додавање и отстранување производи. Тригерите за ставки ги проверуваат договорите и го освежуваат износот, но не ги повторуваат тие проверки за статус и фактурирање.
     360
     361Процедурите за додавање и отстранување производи исто така го пресметуваат износот. Кога тригерите се активни, пресметката се извршува и автоматски при промената на ставките. Ажурирањето на order_total не го активира тригерот за проверка на компанијата.
     362
    212363== Поврзаност меѓу операциите ==
    213364
    … …  
    217368
    218369||= Функција ||= Улога ||
    219 || `fn_has_active_contract` || Проверува дали за компанијата и ресторанот постои договор со статус active што го опфаќа зададениот датум. ||
    220 || `fn_calculate_order_total` || Ги собира тековните цени на јадењата и пијалоците во нарачката. ||
    221 || `fn_calculate_customer_loyalty_points` || Го заокружува надолу збирот на износите на нарачките на клиентот, при што нарачките со статус cancelled придонесуваат со нула. Останатите статуси, вклучително refunded, се вклучени во тековната пресметка. ||
     370|| [#fn_has_active_contract fn_has_active_contract] || Проверува дали за компанијата и ресторанот постои договор со статус active што го опфаќа зададениот датум. ||
     371|| [#fn_calculate_order_total fn_calculate_order_total] || Ги собира тековните цени на јадењата и пијалоците во нарачката. ||
     372|| [#fn_calculate_customer_loyalty_points fn_calculate_customer_loyalty_points] || Го заокружува надолу збирот на износите на нарачките на клиентот, при што нарачките со статус cancelled придонесуваат со нула. Останатите статуси, вклучително refunded, се вклучени во тековната пресметка. ||
    222373
    223374Процедурата [#pr_change_order_status pr_change_order_status] ја повикува [#pr_refresh_customer_loyalty pr_refresh_customer_loyalty] при промена во completed, cancelled или refunded. Освежувањето бара постојни нивоа и статуси на лојалност.