Changes between Version 4 and Version 5 of Triggers


Ignore:
Timestamp:
08/21/25 00:49:39 (18 hours ago)
Author:
221012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Triggers

    v4 v5  
    6262EXECUTE FUNCTION suspend_rating_on_repeated_delinquency();
    6363}}}
     64
     65== 3. Тригер за закажување на инспекција на единицата веднаш по креирање на договор
     66
     67* Со овој тригер се креираат 3 инспекции на единицата веднаш по креирање на договорот, првата е пред да се всели изнајмувачот, втората се закажува за оние единици чии договор трае повеќе од 8 месеци и третата се закажува 7 дена пред да заврши договорот за да се направи финална проверка на единицата. Дополнително се прави проверка дали датумот за секоја од овие 3 инспекции е викенд, со што се прави поместување +1 за недела, +2дена за сабота со цел инспекциите да се одвиваат во работна недела.
     68{{{
     69CREATE OR REPLACE FUNCTION domify.f_schedule_mandatory_inspections()
     70RETURNS TRIGGER AS $$
     71DECLARE
     72    lease_duration_months INT;
     73    initial_inspection_date DATE;
     74    midterm_inspection_date DATE;
     75    final_inspection_date DATE;
     76BEGIN
     77    lease_duration_months := EXTRACT(MONTH FROM AGE(NEW.end_date, NEW.start_date)) +
     78                            EXTRACT(YEAR FROM AGE(NEW.end_date, NEW.start_date)) * 12;
     79   
     80    initial_inspection_date := domify.f_adjust_for_weekend((NEW.start_date - INTERVAL '1 day')::DATE);
     81    midterm_inspection_date := domify.f_adjust_for_weekend((NEW.start_date + INTERVAL '6 months')::DATE);
     82    final_inspection_date := domify.f_adjust_for_weekend((NEW.end_date - INTERVAL '7 days')::DATE);
     83   
     84    IF NEW.start_date > CURRENT_DATE + INTERVAL '1 day' THEN
     85        INSERT INTO domify.Inspection (
     86            inspection_date,
     87            notes,
     88            lease_id,
     89            landlord_id
     90        ) VALUES (
     91            initial_inspection_date,
     92            'Почетна инспекција - проверка дали се е добро пред вселување' ||
     93            CASE WHEN initial_inspection_date != (NEW.start_date - INTERVAL '1 day')::DATE
     94                 THEN ' (поместена од викенд)'
     95                 ELSE ''
     96            END,
     97            NEW.id,
     98            NEW.landlord_id
     99        );
     100    END IF;
     101   
     102    IF lease_duration_months >= 8 THEN
     103        INSERT INTO domify.Inspection (
     104            inspection_date,
     105            notes,
     106            lease_id,
     107            landlord_id
     108        ) VALUES (
     109            midterm_inspection_date,
     110            'Полугодишна инспекција - проверка на состојбата во која се наоѓа единицата' ||
     111            CASE WHEN midterm_inspection_date != (NEW.start_date + INTERVAL '6 months')::DATE
     112                 THEN ' (поместена од викенд)'
     113                 ELSE ''
     114            END,
     115            NEW.id,
     116            NEW.landlord_id
     117        );
     118    END IF;
     119   
     120    INSERT INTO domify.Inspection (
     121        inspection_date,
     122        notes,
     123        lease_id,
     124        landlord_id
     125    ) VALUES (
     126        final_inspection_date,
     127        'Финална инспекција - оценка на штети и депозит' ||
     128        CASE WHEN final_inspection_date != (NEW.end_date - INTERVAL '7 days')::DATE
     129             THEN ' (поместена од викенд)'
     130             ELSE ''
     131        END,
     132        NEW.id,
     133        NEW.landlord_id
     134    );
     135   
     136    RETURN NEW;
     137END;
     138$$ LANGUAGE plpgsql;
     139
     140CREATE TRIGGER t_schedule_mandatory_inspections
     141    AFTER INSERT ON domify.Lease
     142    FOR EACH ROW
     143    EXECUTE FUNCTION domify.f_schedule_mandatory_inspections();
     144}}}
     145Функцијата која се користи за поместувањето:
     146{{{
     147CREATE OR REPLACE FUNCTION domify.f_adjust_for_weekend(input_date DATE)
     148RETURNS DATE AS $$
     149BEGIN
     150    CASE EXTRACT(DOW FROM input_date)
     151        WHEN 0 THEN RETURN input_date + INTERVAL '1 day';
     152        WHEN 6 THEN RETURN input_date + INTERVAL '2 days';
     153        ELSE RETURN input_date;
     154    END CASE;
     155END;
     156$$ LANGUAGE plpgsql;
     157}}}