| | 570 | |
| | 571 | |
| | 572 | == Тригери |
| | 573 | |
| | 574 | = trg_notify_payment_success |
| | 575 | |
| | 576 | Цел: автоматски после успешно плаќање, генерира нотификација до корисникот дека плаќањето е успешно завршено. |
| | 577 | |
| | 578 | {{{CREATE OR REPLACE FUNCTION fn_notify_payment_success() |
| | 579 | RETURNS TRIGGER LANGUAGE plpgsql AS $$ |
| | 580 | BEGIN |
| | 581 | INSERT INTO notifications (user_id, type, title, message, order_id) |
| | 582 | VALUES ( |
| | 583 | NEW.user_id, |
| | 584 | 'PAYMENT', |
| | 585 | 'Uspeshno plakjanje', |
| | 586 | 'Vashata narachka #' || NEW.order_id || ' e uspeshno platena.', |
| | 587 | NEW.order_id |
| | 588 | ); |
| | 589 | RETURN NEW; |
| | 590 | END; |
| | 591 | $$; |
| | 592 | |
| | 593 | CREATE TRIGGER trg_notify_payment_success |
| | 594 | AFTER INSERT ON payment |
| | 595 | FOR EACH ROW |
| | 596 | EXECUTE FUNCTION fn_notify_payment_success(); |
| | 597 | }}} |
| | 598 | |
| | 599 | |
| | 600 | = trg_notify_order_status |
| | 601 | |
| | 602 | Цел: известување на купувачот кога ќе се промени статусот на нарачката. |
| | 603 | |
| | 604 | {{{ |
| | 605 | CREATE OR REPLACE FUNCTION fn_notify_order_status_change() |
| | 606 | RETURNS TRIGGER LANGUAGE plpgsql AS $$ |
| | 607 | BEGIN |
| | 608 | IF OLD.status IS NOT DISTINCT FROM NEW.status THEN |
| | 609 | RETURN NEW; |
| | 610 | END IF; |
| | 611 | |
| | 612 | INSERT INTO notifications (user_id, type, title, message, order_id) |
| | 613 | VALUES ( |
| | 614 | NEW.buyer_id, |
| | 615 | 'ORDER_STATUS', |
| | 616 | 'Promena na status', |
| | 617 | 'Narachkata #' || NEW.order_id || ' e sega: ' || NEW.status || '.', |
| | 618 | NEW.order_id |
| | 619 | ); |
| | 620 | |
| | 621 | RETURN NEW; |
| | 622 | END; |
| | 623 | $$; |
| | 624 | |
| | 625 | CREATE TRIGGER trg_notify_order_status |
| | 626 | AFTER UPDATE OF status ON "order" |
| | 627 | FOR EACH ROW |
| | 628 | EXECUTE FUNCTION fn_notify_order_status_change(); |
| | 629 | |
| | 630 | }}} |
| | 631 | |
| | 632 | |
| | 633 | |
| | 634 | |
| | 635 | |
| | 636 | = trg_prevent_over_selling |
| | 637 | |
| | 638 | Цел: спречување на продажба на производи за кои нема доволно залиха(двојна нарачка). |
| | 639 | |
| | 640 | {{{ |
| | 641 | CREATE OR REPLACE FUNCTION trg_prevent_over_selling() |
| | 642 | RETURNS TRIGGER |
| | 643 | LANGUAGE plpgsql |
| | 644 | AS $$ |
| | 645 | DECLARE |
| | 646 | v_stock INT; |
| | 647 | BEGIN |
| | 648 | |
| | 649 | -- земи тековна залиха |
| | 650 | SELECT quantity |
| | 651 | INTO v_stock |
| | 652 | FROM product |
| | 653 | WHERE product_id = NEW.product_id; |
| | 654 | |
| | 655 | -- ако нема продукт |
| | 656 | IF NOT FOUND THEN |
| | 657 | RAISE EXCEPTION 'Product % does not exist', NEW.product_id; |
| | 658 | END IF; |
| | 659 | |
| | 660 | -- ако нема доволно залиха |
| | 661 | IF v_stock < NEW.quantity THEN |
| | 662 | RAISE EXCEPTION |
| | 663 | 'Not enough stock for product %. Available: %, Requested: %', |
| | 664 | NEW.product_id, v_stock, NEW.quantity; |
| | 665 | END IF; |
| | 666 | |
| | 667 | RETURN NEW; |
| | 668 | END; |
| | 669 | $$; |
| | 670 | }}} |