wiki:Triggers

Version 4 (modified by 221071, 18 hours ago) ( diff )

--

Тригери

1. Тригер за спречување на преклопени договори по оглас

  • Тригер за забрана на преклопени изнајмувања (Lease) за ист оглас (Listing) ]. Целта е да се спречи креирање на изнајмувања со ранг на датуми кои се преклопуваат за ист Listing. Доколку новото (или изменетото) изнајмување се поклопува со постоечко, операцијата ќе биде одбиена со RAISE EXCEPTION.
    CREATE OR REPLACE FUNCTION domify.f_lease_no_overlap()
    RETURNS TRIGGER AS $$
    DECLARE
      cnt INT;
    BEGIN
      SELECT COUNT(*) INTO cnt
      FROM domify."lease"
      WHERE listing_id = NEW.listing_id
        AND id <> COALESCE(NEW.id, -1)
        AND daterange(start_date, end_date, '[]')
            && daterange(NEW.start_date, NEW.end_date, '[]');
      IF cnt > 0 THEN
         RAISE EXCEPTION
           'Listing % веќе има договор кој се преклопува со периодот %–%',
           NEW.listing_id, NEW.start_date, NEW.end_date;
      END IF;
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER t_lease_no_overlap
    BEFORE INSERT OR UPDATE ON domify."lease"
    FOR EACH ROW
    EXECUTE FUNCTION domify.f_lease_no_overlap();
    
    

2. Тригери за суспендирање на рејтингот на станар при повеќекратни задоцнети плаќања

  • Доколку станар има три или повеќе задоцнети плаќања низ сите негови изнајмувања, неговиот UserD.rating се поставува на 0, а во биографијата се додава напомена дека е суспендиран.
    CREATE OR REPLACE FUNCTION suspend_rating_on_repeated_delinquency()
    RETURNS TRIGGER AS $$
    DECLARE
      tenant_rec domify.Lease%ROWTYPE;
      late_payments INT;
    BEGIN
      SELECT * INTO tenant_rec FROM domify.Lease WHERE id = NEW.lease_id;
      IF FOUND THEN
        SELECT COUNT(*) INTO late_payments
          FROM domify.Payment p
          JOIN domify.Lease l ON p.lease_id = l.id
         WHERE l.tenant_id = tenant_rec.tenant_id AND p.status = 'доцнење';
    
        IF late_payments >= 3 THEN
          UPDATE domify.UserD
             SET rating = 0.00,
                 bio = 'Суспендиран станар поради повеќе доцнења на плаќање'
           WHERE id = (SELECT id FROM domify.UserD WHERE id = tenant_rec.tenant_id);
        END IF;
      END IF;
      RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER trg_suspend_tenant_on_late_payments
    AFTER INSERT OR UPDATE ON domify.Payment
    FOR EACH ROW
    WHEN (NEW.status = 'доцнење')
    EXECUTE FUNCTION suspend_rating_on_repeated_delinquency();
    
Note: See TracWiki for help on using the wiki.