wiki:Procedures

Version 1 (modified by 221012, 2 months ago) ( diff )

--

Процедури

Процедура 1

Оваа процедура е одговорна за автоматско потсетување на изнајмувачите на станови да ја платат месечната кирија доколку не е платена во првите пет дена од месецот. На овој начин би се подобрила комуникацијата помеѓу издавачот и изнјамувачот на станот.

CREATE OR REPLACE PROCEDURE domify.send_monthly_payment_reminders()
LANGUAGE plpgsql
AS $$
DECLARE
    lease_record RECORD;
    current_month DATE;
    macedonian_month TEXT;
BEGIN
    current_month := DATE_TRUNC('month', CURRENT_DATE);

    macedonian_month := CASE EXTRACT(MONTH FROM current_month)::INT
        WHEN 1 THEN 'јануари'
        WHEN 2 THEN 'февруари'
        WHEN 3 THEN 'март'
        WHEN 4 THEN 'април'
        WHEN 5 THEN 'мај'
        WHEN 6 THEN 'јуни'
        WHEN 7 THEN 'јули'
        WHEN 8 THEN 'август'
        WHEN 9 THEN 'септември'
        WHEN 10 THEN 'октомври'
        WHEN 11 THEN 'ноември'
        WHEN 12 THEN 'декември'
        ELSE ''
    END;

    FOR lease_record IN 
        SELECT l.id, l.landlord_id, l.tenant_id, l.start_date, l.end_date, l.rent_amount
        FROM domify.Lease l
        JOIN domify.Listing ls ON l.listing_id = ls.id
        JOIN domify.Unit u ON ls.unit_id = u.id
        WHERE l.start_date <= CURRENT_DATE 
          AND l.end_date >= CURRENT_DATE
    LOOP
        IF NOT EXISTS (
            SELECT 1 FROM domify.Payment p
            WHERE p.lease_id = lease_record.id
              AND DATE_TRUNC('month', p.payment_date) = current_month
              AND p.status IN ('completed', 'paid')
        ) THEN
            IF NOT EXISTS (
                SELECT 1 FROM domify.MessageD 
                WHERE lease_id = lease_record.id 
                  AND DATE_TRUNC('month', sent_at) = current_month
                  AND content LIKE 'Потсетување:%'
            ) THEN
                INSERT INTO domify.MessageD (
                    content,
                    sent_at,
                    from_user_id,
                    to_user_id,
                    lease_id
                ) VALUES (
                    'Потсетување: Потребно е да ја подмирите Вашата кирија во износ од ' || lease_record.rent_amount || 
                    ' денари за месец ' || macedonian_month || ' ' || EXTRACT(YEAR FROM current_month)::TEXT || 
                    ' во најбрз можен рок.',
                    CURRENT_DATE,
                    lease_record.landlord_id,
                    lease_record.tenant_id,
                    lease_record.id
                );
            END IF;
        END IF;
    END LOOP;
END;
$$;

Процедурата работи на тој начин што прво ги бара сите договори кои имаат валидни рокови на траење (сеуште се активни), по што се прави проверка дали во табелата Payment постои плаќање за овој месец, доколку не постои се прави проверка дали веќе е испратена пораката, доколку не е се испраќа од издавачот до изнајмувачот на станот со што е известен дека е потребно да ја плати киријата.

    @Scheduled(cron = "0 0 15 3-5 * *")
    @Transactional
    public void callReminderProcedure() {
        entityManager
                .createNativeQuery("CALL domify.send_monthly_payment_reminders2()")
                .executeUpdate();
    }

За автоматско повикување на оваа процедура се користи Spring Scheduler со cron. Со тоа се овозможува процедурата да се извршува автоматски во точно определено време. Во овој случај, изразот @Scheduled(cron = "0 0 15 3-5 * *") значи дека процедурата ќе се повикува секој месец на 3-ти, 4-ти и 5-ти ден во 15:00 часот, при што ќе се изврши проверката и испраќањето на пораката до изнајмувачите.

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.