Changes between Version 1 and Version 2 of Procedures


Ignore:
Timestamp:
08/17/25 22:57:47 (2 days ago)
Author:
221012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Procedures

    v1 v2  
    8282    public void callReminderProcedure() {
    8383        entityManager
    84                 .createNativeQuery("CALL domify.send_monthly_payment_reminders2()")
     84                .createNativeQuery("CALL domify.send_monthly_payment_reminders()")
    8585                .executeUpdate();
    8686    }
     
    8888За автоматско повикување на оваа процедура се користи Spring Scheduler со cron. Со тоа се овозможува процедурата да се извршува автоматски во точно определено време. Во овој случај, изразот @Scheduled(cron = "0 0 15 3-5 * *") значи дека процедурата ќе се повикува секој месец на 3-ти, 4-ти и 5-ти ден во 15:00 часот, при што ќе се изврши проверката и испраќањето на пораката до изнајмувачите.
    8989
     90== Процедура 2
     91Оваа процедура е одговорна за автоматско потсетување на издавачите на станови за нерешени сервисни барања кои се постари од 7 дена. На овој начин се обезбедува навремено решавање на проблемите и подобрување на квалитетот на услугите за изнајмувачите.
     92{{{
     93CREATE OR REPLACE PROCEDURE domify.send_unresolved_service_request_reminders()
     94LANGUAGE plpgsql
     95AS $$
     96DECLARE
     97    req RECORD;
     98    admin_user_id BIGINT := 6; -- Vo nas slucaj id na admin e 6
     99BEGIN
     100    FOR req IN
     101        SELECT sr.id AS service_request_id,
     102               sr.lease_id,
     103               sr.request_date,
     104               sr.status,
     105               l.landlord_id,
     106               ll.first_name || ' ' || ll.last_name AS landlord_name,
     107               tp.id AS tenant_id,
     108               tt.first_name || ' ' || tt.last_name AS tenant_name,
     109               p.title AS property_title,
     110               u.unit_number,
     111               a.street,
     112               a.number,
     113               a.municipality,
     114               a.city
     115        FROM domify.ServiceRequest sr
     116        JOIN domify.Lease l ON sr.lease_id = l.id
     117        JOIN domify.LandlordProfile lp ON l.landlord_id = lp.id
     118        JOIN domify.UserD ll ON lp.id = ll.id
     119        JOIN domify.TenantProfile tp ON l.tenant_id = tp.id
     120        JOIN domify.UserD tt ON tp.id = tt.id
     121        JOIN domify.Listing ls ON l.listing_id = ls.id
     122        JOIN domify.Unit u ON ls.unit_id = u.id
     123        JOIN domify.Property p ON u.property_id = p.id
     124        JOIN domify.Address a ON p.address_id = a.id
     125        WHERE sr.status IN ('pending', 'in_progress')
     126          AND sr.request_date <= CURRENT_DATE - INTERVAL '7 days'
     127    LOOP
     128        INSERT INTO domify.MessageD (
     129            content,
     130            sent_at,
     131            from_user_id,
     132            to_user_id,
     133            lease_id
     134        ) VALUES (
     135            'Потсетување: Сервисното барање #' || req.service_request_id ||
     136            ' за имотот "' || req.property_title || '", единица ' || req.unit_number ||
     137            ' на адреса ' || req.street || ' ' || req.number ||
     138            ', ' || req.municipality || ', ' || req.city ||
     139            ', поднесено од ' || req.tenant_name ||
     140            ' на ' || TO_CHAR(req.request_date, 'DD.MM.YYYY') ||
     141            ' е сè уште во статус "' || req.status || '". Ве молиме да постапите што е можно побрзо.',
     142            CURRENT_TIMESTAMP,
     143            admin_user_id,
     144            req.landlord_id,
     145            req.lease_id
     146        );
     147    END LOOP;
     148END;
     149$$;
     150}}}
     151Процедурата работи на тој начин што прво ги бара сите сервисни барања кои се во статус 'pending' или 'in_progress' и кои се постари од 7 дена. За секое такво барање се собираат детални информации за имотот, издавачот, изнајмувачот и адресата. Потоа се испраќа порака од системскиот администратор до издавачот на станот со детални информации за нерешеното сервисно барање.
     152{{{
     153@Scheduled(cron = "0 0 18 * * *")
     154@Transactional
     155public void callUnresolvedServiceReminderProcedure() {
     156    entityManager
     157            .createNativeQuery("CALL domify.send_unresolved_service_request_reminders()")
     158            .executeUpdate();
     159}
     160}}}
     161Во овој случај, изразот @Scheduled(cron = "0 0 18 * * *") значи дека процедурата ќе се повикува секој ден во 18:00 часот, при што ќе се изврши проверката и испраќањето на пораки до издавачите за сите нерешени сервисни барања постари од 7 дена.
     162
     163== Процедура 3
     164Оваа процедура е одговорна за автоматско санкционирање на издавачите кои имаат долготрајни нерешени сервисни барања (подолги од 14 дена). Процедурата го намалува рејтингот на издавачот и го известува за санкцијата, што придонесува за подобрување на квалитетот на услугите и одговорното однесување.
     165
     166{{{
     167CREATE OR REPLACE PROCEDURE domify.flag_landlords_with_overdue_maintenance()
     168LANGUAGE plpgsql
     169AS $$
     170DECLARE
     171    rec RECORD;
     172    new_rating NUMERIC(3,2);
     173    system_admin_id BIGINT := 6;
     174BEGIN
     175    FOR rec IN
     176        SELECT DISTINCT
     177            l.landlord_id,
     178            l.id AS lease_id,
     179            u.unit_number
     180        FROM domify.ServiceRequest sr
     181        JOIN domify.Lease l ON sr.lease_id = l.id
     182        JOIN domify.Listing li ON l.listing_id = li.id
     183        JOIN domify.Unit u ON li.unit_id = u.id
     184        WHERE sr.status NOT IN ('completed', 'resolved')
     185          AND sr.request_date < CURRENT_DATE - INTERVAL '14 days'
     186    LOOP
     187        UPDATE domify.UserD
     188        SET rating = GREATEST(0.00, rating - 0.10)
     189        WHERE id = rec.landlord_id
     190        RETURNING rating INTO new_rating;
     191
     192        INSERT INTO domify.MessageD (
     193            content, sent_at, from_user_id, to_user_id, lease_id
     194        ) VALUES (
     195            'Вашиот рејтинг е намален заради неисполнето сервисно барање подолго од 14 дена за единицата '
     196           || rec.unit_number || '. Нов рејтинг: ' || new_rating,
     197            CURRENT_TIMESTAMP,
     198            system_admin_id,
     199            rec.landlord_id,
     200            rec.lease_id
     201        );
     202    END LOOP;
     203END;
     204$$;
     205}}}
     206Процедурата работи на тој начин што прво ги бара сите издавачи кои имаат нерешени сервисни барања (со статус различен од 'completed' или 'resolved') постари од 14 дена. За секој таков случај се намалува рејтингот на издавачот за 0.10 поени (со минимална вредност од 0.00), а потоа се испраќа  порака од системскиот администратор до издавачот со информации за санкцијата и новиот рејтинг.
     207
     208{{{
     209@Scheduled(cron = "0 0 12 * * *")
     210@Transactional
     211public void callOverdueMaintenanceFlagProcedure() {
     212    entityManager
     213            .createNativeQuery("CALL domify.flag_landlords_with_overdue_maintenance()")
     214            .executeUpdate();
     215}
     216}}}
     217Во овој случај, изразот @Scheduled(cron = "0 0 12 * * *") значи дека процедурата ќе се повикува секој ден во 12:00 часот, при што ќе се изврши проверката и санкционирањето на издавачите со долготрајни нерешени сервисни барања.
     218
     219== Процедура 4
     220Оваа процедура е одговорна за автоматско ажурирање на статусите на огласите во системот врз основа на нивната достапност и тековната состојба.
     221{{{
     222CREATE OR REPLACE PROCEDURE domify.update_listing_statuses()
     223LANGUAGE plpgsql
     224AS $$
     225BEGIN
     226    UPDATE domify.Listing
     227    SET status = 'expired'
     228    WHERE available_to < CURRENT_DATE
     229      AND status != 'expired';
     230   
     231    UPDATE domify.Listing
     232    SET status = 'rented'
     233    WHERE EXISTS (
     234        SELECT 1
     235        FROM domify.Lease l
     236        WHERE l.listing_id = domify.Listing.id
     237          AND l.start_date <= CURRENT_DATE
     238          AND l.end_date >= CURRENT_DATE
     239    )
     240    AND status != 'rented';
     241   
     242    UPDATE domify.Listing
     243    SET status = 'available'
     244    WHERE available_from <= CURRENT_DATE
     245      AND available_to >= CURRENT_DATE
     246      AND status NOT IN ('rented', 'expired')
     247      AND NOT EXISTS (
     248          SELECT 1
     249          FROM domify.Lease l
     250          WHERE l.listing_id = domify.Listing.id
     251            AND l.start_date <= CURRENT_DATE
     252            AND l.end_date >= CURRENT_DATE
     253      );
     254END;
     255$$;
     256}}}
     257Процедурата работи во три чекори: прво, ги обележува како "истечени" сите огласи чијшто рок на достапност (available_to) е поминат, второ, ги обележува како "изнајмени" сите огласи кои имаат активни договори за изнајмување во моментот, и трето, ги обележува како "достапни" сите огласи кои се во рамките на нивниот период на достапност и немаат активни договори.
     258{{{
     259@Scheduled(cron = "0 0 2 * * *")
     260@Transactional
     261public void callUpdateListingStatusesProcedure() {
     262    entityManager
     263            .createNativeQuery("CALL domify.update_listing_statuses()")
     264            .executeUpdate();
     265}
     266}}}
     267Во овој случај, изразот @Scheduled(cron = "0 0 2 * * *") значи дека процедурата ќе се повикува секој ден во 2:00 часот наутро, при што ќе се изврши ажурирањето на сите статуси на огласите според тековната состојба и достапност.
     268
     269На крајот процедурите кои ги имаме во нашата база на податоци се:
     270[[Image(domify - diag.png​)]]