wiki:Triggers

Version 7 (modified by 213231, 10 days ago) ( diff )

--

Тригери

Тригер: trg_after_t_type_insert

Автоматски го менува статусот на производот откако ќе се финализира набавката.

Логика:

  • Се зема производот поврзан со TransactionID.
  • Ако типот е 'Buy', производот добива статус 'sold'.
  • Ако типот е 'Rent', производот добива статус 'rented'.

SQL код:

CREATE TRIGGER trg_after_t_type_insert
AFTER INSERT ON t_type
FOR EACH ROW
BEGIN
  DECLARE v_product_id INT;

  SELECT ProductID INTO v_product_id
  FROM procurement
  WHERE TransactionID = NEW.TransactionID;

  IF NEW.Type = 'Buy' THEN
    UPDATE product SET Status = 'sold' WHERE ProductID = v_product_id;
  ELSEIF NEW.Type = 'Rent' THEN
    UPDATE product SET Status = 'rented' WHERE ProductID = v_product_id;
  END IF;
END;

Тригер: refund_wallet_after_reject

Автоматски да се рефундира сумата на клиентот доколку неговото барање биде одбиено. Логика:

  • Кога статусот на барањето се менува од нешто друго во 'Rejected', парите се враќаат назад на соодветниот паричник (wallet).

SQL код:

CREATE TRIGGER refund_wallet_after_reject
AFTER UPDATE ON procurement_request
FOR EACH ROW
BEGIN
  IF NEW.Status = 'Rejected' AND OLD.Status != 'Rejected' THEN
    UPDATE wallet
    SET Balance = Balance + NEW.TotalPrice
    WHERE WalletID = NEW.CardID;
  END IF;
END;

Тригер: prevent_duplicate_pending_request

Спречува додавање на ново барање за набавка за производ кој веќе има статус Pending. Логика:

  • Доколку веќе постои барање за истиот ProductID со статус 'Pending', се прекинува внесувањето и се прикажува грешка.

SQL код:

CREATE TRIGGER prevent_duplicate_pending_request
BEFORE INSERT ON procurement_request
FOR EACH ROW
BEGIN
  IF EXISTS (
    SELECT 1 FROM procurement_request
    WHERE ProductID = NEW.ProductID AND Status = 'Pending'
  ) THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'This product already has a pending request;
  END IF;
END;

Трансакции

const db = require('./db');

exports.getAll = (cb) => {
  db.query('SELECT * FROM procurement', cb);
};

exports.getDetailedTransactions = (cb) => {
  const query = `
    SELECT p.TransactionID, c.CustomerName, c.CustomerSurName, pr.Model, t.Type, t.Duration, t.MonthlyPay, t.TotalPrice, p.ProcurementDate
    FROM procurement p
    JOIN customer c ON p.CustomerID = c.CustomerID
    JOIN product pr ON p.ProductID = pr.ProductID
    JOIN t_type t ON p.TransactionID = t.TransactionID`;
  db.query(query, cb);
};

exports.add = (data, cb) => {
  const { TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity } = data;
  db.query('INSERT INTO procurement VALUES (?, ?, ?, ?, ?, ?)', [TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity], cb);
};
Note: See TracWiki for help on using the wiki.