= Тригери == 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(); }}}