| | 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]. |
| | 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 | |