wiki:DatabaseProgramming

Version 5 (modified by 223235, 12 days ago) ( diff )

--

Functions, Procedures, Triggers

Функции

Функциите ги пресметуваат износите и поените и ја проверуваат важноста на договорите. Припаѓаат на шемата kbnteam, се напишани на SQL и се означени како STABLE. Читаат податоци и враќаат вредност без да ги менуваат табелите. Можат да се користат во SQL изрази и во логиката на процедурите и тригерите.

Функција Намена Повратен тип
fn_has_active_contract Проверка на активен договор BOOLEAN
fn_calculate_order_total Пресметка на вкупен износ NUMERIC(10,2)
fn_calculate_customer_loyalty_points Пресметка на поени за лојалност INTEGER

Anchor(fn_has_active_contract)

fn_has_active_contract

Враќа TRUE ако постои договор за зададената компанија и ресторан со статус active, а зададениот датум е меѓу почетниот и крајниот датум, вклучувајќи ги границите. Инаку враќа FALSE. Кога датумот не е зададен, се користи тековниот датум. Називот на статусот се споредува без разлика на големината на буквите.

Својство Вредност
Повратен тип BOOLEAN
Изворни табели contract, contract_status
Параметар Тип Стандардна вредност Опис
p_company_id INTEGER — Идентификатор на компанијата.
p_rest_id INTEGER — Идентификатор на ресторанот.
p_on_date DATE CURRENT_DATE Датум за проверка на важноста на договорот.

Се користи од: trg_order_drink_guard_and_total, trg_order_meal_guard_and_total, pr_assign_delivery_to_company_order, pr_add_order_item, pr_change_order_status, pr_submit_customer_order.

Anchor(fn_calculate_order_total)

fn_calculate_order_total

Ги собира тековните цени на јадењата и пијалоците поврзани со нарачката. Ако нема ставки, враќа 0.00. Не применува попуст за лојалност или дополнителен надомест за достава и не ја менува нарачката; запишувањето на пресметаниот износ го вршат процедурите и тригерите.

Својство Вредност
Повратен тип NUMERIC(10,2)
Изворни табели order_meal, meal, order_drink, drink
Параметар Тип Стандардна вредност Опис
p_order_id INTEGER — Идентификатор на клиентската нарачка.

Се користи од: trg_order_drink_guard_and_total, trg_order_meal_guard_and_total, pr_remove_order_item, pr_add_order_item, pr_finalize_company_order, pr_change_order_status, pr_submit_customer_order.

Anchor(fn_calculate_customer_loyalty_points)

fn_calculate_customer_loyalty_points

Ги собира износите на нарачките на клиентот, го заокружува збирот надолу и враќа цел број. Нарачките со статус cancelled придонесуваат со нула. Останатите статуси, вклучително pending и refunded, се вклучени. Ако нема нарачки, враќа нула. Функцијата ги пресметува поените, а нивното запишување го врши процедурата за освежување на лојалноста.

Својство Вредност
Повратен тип INTEGER
Изворни табели customer_order, order_status
Параметар Тип Стандардна вредност Опис
p_customer_user_id INTEGER — Идентификатор на клиентот.

Се користи од: pr_refresh_customer_loyalty.

Процедури

Процедурите ги опфаќаат операциите за договори, нарачки, достави, рецензии и лојалност. Припаѓаат на шемата kbnteam, се напишани на PL/pgSQL и се повикуваат со CALL. Проверките и промените на податоците се извршуваат во рамки на тековната трансакција.

Договори

Процедура Намена Директно изменети табели
pr_activate_or_renew_contract Активирање или обновување договор contract

Нарачки и фактурирање

Процедура Намена Директно изменети табели
pr_create_company_order Создавање компаниска нарачка company_order
pr_create_customer_order Создавање клиентска нарачка customer_order
pr_add_order_item Додавање јадење или пијалак order_meal, order_drink, customer_order
pr_remove_order_item Отстранување јадење или пијалак order_meal, order_drink, customer_order
pr_submit_customer_order Поднесување клиентска нарачка customer_order
pr_change_order_status Промена на статус на нарачка customer_order
pr_finalize_company_order Финализирање и фактурирање customer_order, invoice

Достави

Процедура Намена Директно изменети табели
pr_assign_delivery_to_company_order Доделување достава delivery, company_order
pr_change_delivery_status Промена на статус на достава delivery

Рецензии

Процедура Намена Директно изменети табели
pr_create_order_review Оценување клиентска нарачка review, order_review
pr_create_delivery_review Оценување достава review, delivery_review

Лојалност

Процедура Намена Директно изменети табели
pr_refresh_customer_loyalty Освежување лојалност customer_loyalty

Параметри и однесување

Параметрите без наведена насока се влезни (IN). Параметарот INOUT е истовремено влезен и излезен. Единствено создавањето компаниска нарачка го враќа новиот идентификатор преку INOUT параметар; останатите процедури немаат излезни параметри.

Anchor(pr_activate_or_renew_contract)

pr_activate_or_renew_contract

Проверува дали компанијата и ресторанот постојат и дали периодот е валиден. Кога постои активен договор со период што се преклопува или е непосредно соседен, го проширува неговиот период. Ако нема таков договор, создава нов со статус active. Обновувањето се одбива ако проширениот период се преклопува со друг активен договор.

Параметар Тип Насока Стандардна вредност Опис
p_company_id INTEGER IN — Компанија на која се однесува операцијата.
p_rest_id INTEGER IN — Ресторан поврзан со договорот.
p_start_date DATE IN — Почетен датум на договорот.
p_end_date DATE IN — Краен датум на договорот.

Anchor(pr_create_company_order)

pr_create_company_order

Проверува дали компанијата постои и создава компаниска нарачка без доделена достава. Новиот идентификатор се враќа преку параметарот p_comp_order_id.

Параметар Тип Насока Стандардна вредност Опис
p_company_id INTEGER IN — Компанија на која се однесува операцијата.
p_comp_order_id INTEGER INOUT NULL Се пополнува со идентификаторот на новата компаниска нарачка.

Anchor(pr_create_customer_order)

pr_create_customer_order

Проверува дали клиентот и компаниската нарачка постојат и припаѓаат на иста компанија. Не дозволува додавање нарачка кон компаниска нарачка за која веќе има фактура. Создава клиентска нарачка со зададениот статус и почетен износ нула.

Параметар Тип Насока Стандардна вредност Опис
p_customer_user_id INTEGER IN — Идентификатор на клиентот.
p_comp_order_id INTEGER IN — Идентификатор на компаниската нарачка.
p_o_status_id INTEGER IN — Почетен статус на клиентската нарачка.

Anchor(pr_add_order_item)

pr_add_order_item

Го прифаќа типот meal или drink и проверува дали производот постои. За ресторанот на производот е потребен активен договор со компанијата на клиентот на датумот на нарачката. Не дозволува повторно додавање на истиот производ, измена на нарачка со статус completed, cancelled или refunded, ниту измена по фактурирање. По додавањето повторно го пресметува вкупниот износ.

Параметар Тип Насока Стандардна вредност Опис
p_order_id INTEGER IN — Идентификатор на клиентската нарачка.
p_item_type VARCHAR(10) IN — Тип на производ: meal или drink.
p_item_id INTEGER IN — Идентификатор на јадењето или пијалакот.

Anchor(pr_remove_order_item)

pr_remove_order_item

Го отстранува зададениот производ од нарачката и повторно го пресметува износот. Одбива отстранување производ што не е дел од нарачката. Не дозволува измени при статус completed, cancelled или refunded, ниту по фактурирање.

Параметар Тип Насока Стандардна вредност Опис
p_order_id INTEGER IN — Идентификатор на клиентската нарачка.
p_item_type VARCHAR(10) IN — Тип на производ: meal или drink.
p_item_id INTEGER IN — Идентификатор на јадењето или пијалакот.

Anchor(pr_submit_customer_order)

pr_submit_customer_order

Проверува дали нарачката содржи барем едно јадење или пијалак и дали за секој вклучен ресторан постои активен договор на датумот на нарачката. Не дозволува поднесување при статус completed, cancelled или refunded, ниту по фактурирање. Го пресметува износот и го поставува статусот на pending.

Параметар Тип Насока Стандардна вредност Опис
p_order_id INTEGER IN — Идентификатор на клиентската нарачка.

Anchor(pr_change_order_status)

pr_change_order_status

Проверува дали нарачката и новиот статус постојат и дали преминот е дозволен. За completed бара барем еден производ и активни договори со вклучените ресторани на датумот на нарачката, а потоа го пресметува износот. По фактурирање дозволува само премин од completed во refunded. При премин во completed, cancelled или refunded ја повикува процедурата за освежување на лојалноста. Повторно задавање на тековниот статус не предизвикува промена.

Параметар Тип Насока Стандардна вредност Опис
p_order_id INTEGER IN — Идентификатор на клиентската нарачка.
p_new_status_id INTEGER IN — Идентификатор на новиот статус.

Anchor(pr_finalize_company_order)

pr_finalize_company_order

Бара компаниската нарачка да постои, да нема фактура и да содржи клиентски нарачки. Сите клиентски нарачки мора да бидат completed и да содржат барем еден производ. Повторно ги пресметува нивните износи и создава една фактура за компаниската нарачка. Не бара доставата да има статус delivered.

Параметар Тип Насока Стандардна вредност Опис
p_comp_order_id INTEGER IN — Идентификатор на компаниската нарачка.

Anchor(pr_assign_delivery_to_company_order)

pr_assign_delivery_to_company_order

За компаниска нарачка без достава создава нова достава и ја поврзува со нарачката. Проверува дали доставувачот постои и дали неговиот ресторан има активен договор со компанијата на датумот на доставата. Датумот, статусот и забелешките се запишуваат во новата достава.

Параметар Тип Насока Стандардна вредност Опис
p_comp_order_id INTEGER IN — Идентификатор на компаниската нарачка.
p_driver_user_id INTEGER IN — Идентификатор на доставувачот.
p_d_status_id INTEGER IN — Почетен статус на доставата.
p_delivery_date DATE IN CURRENT_DATE Датум на доставата.
p_delivery_notes VARCHAR(255) IN NULL Забелешки за доставата.

Anchor(pr_change_delivery_status)

pr_change_delivery_status

Проверува дали доставата и новиот статус постојат и дали преминот е дозволен. Статусите assigned, picked up, on the way, delivered и delayed бараат назначен доставувач. За delivered дополнително бара доставата да биде поврзана со компаниска нарачка. Повторно задавање на тековниот статус не предизвикува промена.

Параметар Тип Насока Стандардна вредност Опис
p_delivery_id INTEGER IN — Идентификатор на доставата.
p_new_status_id INTEGER IN — Идентификатор на новиот статус.

Anchor(pr_create_order_review)

pr_create_order_review

Бара завршена нарачка со статус completed, поврзана со зададениот клиент, и проверува дали веќе постои рецензија за неа. Запишува општа оценка и коментар, како и посебни оценки за храната и ресторанот. Оценките се во опсег од 1 до 5.

Параметар Тип Насока Стандардна вредност Опис
p_order_id INTEGER IN — Идентификатор на клиентската нарачка.
p_customer_user_id INTEGER IN — Идентификатор на клиентот.
p_review_rating INTEGER IN — Општа оценка од 1 до 5.
p_review_comment VARCHAR(255) IN — Коментар за рецензијата.
p_food_rating INTEGER IN — Оценка за храната од 1 до 5.
p_restaurant_rating INTEGER IN — Оценка за ресторанот од 1 до 5.

Anchor(pr_create_delivery_review)

pr_create_delivery_review

Бара достава со статус delivered и клиент што има нарачка поврзана со таа достава. Не дозволува втора рецензија за истата достава, независно од клиентот. Запишува општа оценка и коментар, како и оценки за доставувачот и брзината, во опсег од 1 до 5.

Параметар Тип Насока Стандардна вредност Опис
p_delivery_id INTEGER IN — Идентификатор на доставата.
p_customer_user_id INTEGER IN — Идентификатор на клиентот.
p_review_rating INTEGER IN — Општа оценка од 1 до 5.
p_review_comment VARCHAR(255) IN — Коментар за рецензијата.
p_courier_rating INTEGER IN — Оценка за доставувачот од 1 до 5.
p_speed_rating INTEGER IN — Оценка за брзината од 1 до 5.

Anchor(pr_refresh_customer_loyalty)

pr_refresh_customer_loyalty

Ги пресметува поените на клиентот и избира ниво чиј опсег ги содржи поените. При повеќе совпаѓања го избира нивото со најголем долен праг; ако нема совпаѓање, го избира нивото со најмал долен праг. Го користи статусот на лојалност со најмал идентификатор. Создава членство или ги ажурира поените, нивото и статусот на постојното членство.

Параметар Тип Насока Стандардна вредност Опис
p_customer_user_id INTEGER IN — Идентификатор на клиентот.

Дозволени промени на статус

Клиентска нарачка

Тековен статус Дозволени следни статуси
pending on-hold, backorder, completed, cancelled
on-hold pending, backorder, completed, cancelled
backorder pending, on-hold, completed, cancelled
completed refunded
cancelled, refunded Нема премин во друг статус.

Овие премини се однесуваат на pr_change_order_status. За нарачка во фактурирана компаниска нарачка е дозволен само преминот completed → refunded. Создавањето нарачка го користи зададениот почетен статус, а поднесувањето ја поставува на pending според сопствените проверки.

Достава

Тековен статус Дозволени следни статуси
pending assigned, cancelled
assigned picked up, delayed, failed, cancelled
picked up on the way, delayed, failed, cancelled
on the way delivered, delayed, failed
delayed assigned, picked up, on the way, delivered, failed, cancelled
delivered, failed, cancelled Нема премин во друг статус.

Овие премини се однесуваат на pr_change_delivery_status. При создавање достава се користи зададениот почетен статус. Во двете процедури за промена на статус, називите се споредуваат без разлика на големината на буквите и повторување на тековниот статус завршува без измена.

Тригери

Тригерите автоматски се активираат при промени на податоците. Сите се извршуваат за секој засегнат ред. Проверката на компанијата се извршува пред промената на клиентската нарачка, а проверките на ставките и пресметката на износот по нивното внесување, измена или бришење.

Тригер Табела Момент Настан
trg_validate_customer_order_company kbnteam.customer_order BEFORE INSERT OR UPDATE OF customer_user_id, comp_order_id
trg_order_meal_guard_and_total kbnteam.order_meal AFTER INSERT OR UPDATE OR DELETE
trg_order_drink_guard_and_total kbnteam.order_drink AFTER INSERT OR UPDATE OR DELETE

Anchor(trg_validate_customer_order_company)

trg_validate_customer_order_company

Проверува дали клиентот и компаниската нарачка постојат и припаѓаат на иста компанија. При неуспешна проверка ја прекинува наредбата со исклучок. При успешна проверка го враќа новиот ред (NEW).

Проверката се активира при внесување нарачка и при ажурирање што ги наведува customer_user_id или comp_order_id. Ажурирање само на order_total или статусот не го активира овој тригер.

Својство Вредност
Табела kbnteam.customer_order
Момент BEFORE
Настан INSERT OR UPDATE OF customer_user_id, comp_order_id
Опфат За секој засегнат ред (FOR EACH ROW).
Тригер-функција tf_validate_customer_order_company

Anchor(trg_order_meal_guard_and_total)

trg_order_meal_guard_and_total

При внесување или измена на ставка проверува дали нарачката е поврзана со валиден клиент и компанија и дали постои активен договор со ресторанот на јадењето на датумот на нарачката. Потоа повторно го пресметува и запишува вкупниот износ на нарачката. При бришење не проверува договор, туку го освежува износот на старата нарачка.

Ако со UPDATE ставката се префрли во друга нарачка, ги освежува износите и на новата и на старата нарачка.

Својство Вредност
Табела kbnteam.order_meal
Момент AFTER
Настан INSERT OR UPDATE OR DELETE
Опфат За секој засегнат ред (FOR EACH ROW).
Тригер-функција tf_order_meal_guard_and_total

Ги користи fn_has_active_contract за проверка на договорот и fn_calculate_order_total за пресметка на износот. Бидејќи се извршува AFTER, пресметката ја опфаќа изменетата состојба на ставките. Исклучок од проверката ја прекинува тековната наредба.

Anchor(trg_order_drink_guard_and_total)

trg_order_drink_guard_and_total

При внесување или измена на ставка проверува дали нарачката е поврзана со валиден клиент и компанија и дали постои активен договор со ресторанот на пијалакот на датумот на нарачката. Потоа повторно го пресметува и запишува вкупниот износ на нарачката. При бришење не проверува договор, туку го освежува износот на старата нарачка.

Ако со UPDATE ставката се префрли во друга нарачка, ги освежува износите и на новата и на старата нарачка.

Својство Вредност
Табела kbnteam.order_drink
Момент AFTER
Настан INSERT OR UPDATE OR DELETE
Опфат За секој засегнат ред (FOR EACH ROW).
Тригер-функција tf_order_drink_guard_and_total

Ги користи fn_has_active_contract за проверка на договорот и fn_calculate_order_total за пресметка на износот. Бидејќи се извршува AFTER, пресметката ја опфаќа изменетата состојба на ставките. Исклучок од проверката ја прекинува тековната наредба.

Тригер-функции

Тригер-функциите се напишани на PL/pgSQL и враќаат тип TRIGGER. Немаат декларирани влезни параметри; ги користат податоците за активирањето и редовите NEW и OLD. Нивното извршување го повикува соодветниот тригер.

Anchor(tf_validate_customer_order_company)

tf_validate_customer_order_company

Својство Вредност
Повратен тип TRIGGER
Активиран преку trg_validate_customer_order_company
Однесување Го враќа NEW по успешна проверка на компанијата.

Anchor(tf_order_meal_guard_and_total)

tf_order_meal_guard_and_total

Својство Вредност
Повратен тип TRIGGER
Активиран преку trg_order_meal_guard_and_total
Однесување Го враќа COALESCE(NEW, OLD). Кај AFTER тригерот повратниот ред не го заменува запишаниот ред; ефектот е проверката и ажурирањето на износот.

Anchor(tf_order_drink_guard_and_total)

tf_order_drink_guard_and_total

Својство Вредност
Повратен тип TRIGGER
Активиран преку trg_order_drink_guard_and_total
Однесување Го враќа COALESCE(NEW, OLD). Кај AFTER тригерот повратниот ред не го заменува запишаниот ред; ефектот е проверката и ажурирањето на износот.

Поврзаност со процедурите

Проверките за статус на нарачката и за постоење фактура се дел од процедурите за додавање и отстранување производи. Тригерите за ставки ги проверуваат договорите и го освежуваат износот, но не ги повторуваат тие проверки за статус и фактурирање.

Процедурите за додавање и отстранување производи исто така го пресметуваат износот. Кога тригерите се активни, пресметката се извршува и автоматски при промената на ставките. Ажурирањето на order_total не го активира тригерот за проверка на компанијата.

Поврзаност меѓу операциите

Компаниската нарачка ги обединува клиентските нарачки на една компанија. Во клиентските нарачки се додаваат производи, се проверуваат договорите и се пресметуваат износите. Завршените нарачки можат да се оценуваат, а компаниската нарачка се финализира со создавање фактура. Доставата има сопствен тек на статуси и може да се оценува откако ќе биде доставена.

Помошни пресметки и проверки

Функција Улога
fn_has_active_contract Проверува дали за компанијата и ресторанот постои договор со статус active што го опфаќа зададениот датум.
fn_calculate_order_total Ги собира тековните цени на јадењата и пијалоците во нарачката.
fn_calculate_customer_loyalty_points Го заокружува надолу збирот на износите на нарачките на клиентот, при што нарачките со статус cancelled придонесуваат со нула. Останатите статуси, вклучително refunded, се вклучени во тековната пресметка.

Процедурата pr_change_order_status ја повикува pr_refresh_customer_loyalty при промена во completed, cancelled или refunded. Освежувањето бара постојни нивоа и статуси на лојалност.

Note: See TracWiki for help on using the wiki.