Version 4 (modified by 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.