Changes between Initial Version and Version 1 of Procedures


Ignore:
Timestamp:
08/17/25 19:06:38 (2 months ago)
Author:
221012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Procedures

    v1 v1  
     1= Процедури
     2
     3== Процедура 1
     4Оваа процедура е одговорна за автоматско потсетување на изнајмувачите на станови да ја платат месечната кирија доколку не е платена во првите пет дена од месецот. На овој начин би се подобрила комуникацијата помеѓу издавачот и изнјамувачот на станот.
     5
     6{{{
     7CREATE OR REPLACE PROCEDURE domify.send_monthly_payment_reminders()
     8LANGUAGE plpgsql
     9AS $$
     10DECLARE
     11    lease_record RECORD;
     12    current_month DATE;
     13    macedonian_month TEXT;
     14BEGIN
     15    current_month := DATE_TRUNC('month', CURRENT_DATE);
     16
     17    macedonian_month := CASE EXTRACT(MONTH FROM current_month)::INT
     18        WHEN 1 THEN 'јануари'
     19        WHEN 2 THEN 'февруари'
     20        WHEN 3 THEN 'март'
     21        WHEN 4 THEN 'април'
     22        WHEN 5 THEN 'мај'
     23        WHEN 6 THEN 'јуни'
     24        WHEN 7 THEN 'јули'
     25        WHEN 8 THEN 'август'
     26        WHEN 9 THEN 'септември'
     27        WHEN 10 THEN 'октомври'
     28        WHEN 11 THEN 'ноември'
     29        WHEN 12 THEN 'декември'
     30        ELSE ''
     31    END;
     32
     33    FOR lease_record IN
     34        SELECT l.id, l.landlord_id, l.tenant_id, l.start_date, l.end_date, l.rent_amount
     35        FROM domify.Lease l
     36        JOIN domify.Listing ls ON l.listing_id = ls.id
     37        JOIN domify.Unit u ON ls.unit_id = u.id
     38        WHERE l.start_date <= CURRENT_DATE
     39          AND l.end_date >= CURRENT_DATE
     40    LOOP
     41        IF NOT EXISTS (
     42            SELECT 1 FROM domify.Payment p
     43            WHERE p.lease_id = lease_record.id
     44              AND DATE_TRUNC('month', p.payment_date) = current_month
     45              AND p.status IN ('completed', 'paid')
     46        ) THEN
     47            IF NOT EXISTS (
     48                SELECT 1 FROM domify.MessageD
     49                WHERE lease_id = lease_record.id
     50                  AND DATE_TRUNC('month', sent_at) = current_month
     51                  AND content LIKE 'Потсетување:%'
     52            ) THEN
     53                INSERT INTO domify.MessageD (
     54                    content,
     55                    sent_at,
     56                    from_user_id,
     57                    to_user_id,
     58                    lease_id
     59                ) VALUES (
     60                    'Потсетување: Потребно е да ја подмирите Вашата кирија во износ од ' || lease_record.rent_amount ||
     61                    ' денари за месец ' || macedonian_month || ' ' || EXTRACT(YEAR FROM current_month)::TEXT ||
     62                    ' во најбрз можен рок.',
     63                    CURRENT_DATE,
     64                    lease_record.landlord_id,
     65                    lease_record.tenant_id,
     66                    lease_record.id
     67                );
     68            END IF;
     69        END IF;
     70    END LOOP;
     71END;
     72$$;
     73
     74}}}
     75
     76Процедурата работи на тој начин што прво ги бара сите договори кои имаат валидни рокови на траење (сеуште се активни), по што се прави проверка дали во табелата Payment постои плаќање за овој месец, доколку не постои се прави проверка дали веќе е испратена пораката, доколку не е се испраќа од издавачот до изнајмувачот на станот со што е известен дека е потребно да ја плати киријата.
     77
     78
     79{{{
     80    @Scheduled(cron = "0 0 15 3-5 * *")
     81    @Transactional
     82    public void callReminderProcedure() {
     83        entityManager
     84                .createNativeQuery("CALL domify.send_monthly_payment_reminders2()")
     85                .executeUpdate();
     86    }
     87}}}
     88За автоматско повикување на оваа процедура се користи Spring Scheduler со cron. Со тоа се овозможува процедурата да се извршува автоматски во точно определено време. Во овој случај, изразот @Scheduled(cron = "0 0 15 3-5 * *") значи дека процедурата ќе се повикува секој месец на 3-ти, 4-ти и 5-ти ден во 15:00 часот, при што ќе се изврши проверката и испраќањето на пораката до изнајмувачите.
     89