| 90 | == Процедура 2 |
| 91 | Оваа процедура е одговорна за автоматско потсетување на издавачите на станови за нерешени сервисни барања кои се постари од 7 дена. На овој начин се обезбедува навремено решавање на проблемите и подобрување на квалитетот на услугите за изнајмувачите. |
| 92 | {{{ |
| 93 | CREATE OR REPLACE PROCEDURE domify.send_unresolved_service_request_reminders() |
| 94 | LANGUAGE plpgsql |
| 95 | AS $$ |
| 96 | DECLARE |
| 97 | req RECORD; |
| 98 | admin_user_id BIGINT := 6; -- Vo nas slucaj id na admin e 6 |
| 99 | BEGIN |
| 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; |
| 148 | END; |
| 149 | $$; |
| 150 | }}} |
| 151 | Процедурата работи на тој начин што прво ги бара сите сервисни барања кои се во статус 'pending' или 'in_progress' и кои се постари од 7 дена. За секое такво барање се собираат детални информации за имотот, издавачот, изнајмувачот и адресата. Потоа се испраќа порака од системскиот администратор до издавачот на станот со детални информации за нерешеното сервисно барање. |
| 152 | {{{ |
| 153 | @Scheduled(cron = "0 0 18 * * *") |
| 154 | @Transactional |
| 155 | public 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 | {{{ |
| 167 | CREATE OR REPLACE PROCEDURE domify.flag_landlords_with_overdue_maintenance() |
| 168 | LANGUAGE plpgsql |
| 169 | AS $$ |
| 170 | DECLARE |
| 171 | rec RECORD; |
| 172 | new_rating NUMERIC(3,2); |
| 173 | system_admin_id BIGINT := 6; |
| 174 | BEGIN |
| 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; |
| 203 | END; |
| 204 | $$; |
| 205 | }}} |
| 206 | Процедурата работи на тој начин што прво ги бара сите издавачи кои имаат нерешени сервисни барања (со статус различен од 'completed' или 'resolved') постари од 14 дена. За секој таков случај се намалува рејтингот на издавачот за 0.10 поени (со минимална вредност од 0.00), а потоа се испраќа порака од системскиот администратор до издавачот со информации за санкцијата и новиот рејтинг. |
| 207 | |
| 208 | {{{ |
| 209 | @Scheduled(cron = "0 0 12 * * *") |
| 210 | @Transactional |
| 211 | public 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 | {{{ |
| 222 | CREATE OR REPLACE PROCEDURE domify.update_listing_statuses() |
| 223 | LANGUAGE plpgsql |
| 224 | AS $$ |
| 225 | BEGIN |
| 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 | ); |
| 254 | END; |
| 255 | $$; |
| 256 | }}} |
| 257 | Процедурата работи во три чекори: прво, ги обележува како "истечени" сите огласи чијшто рок на достапност (available_to) е поминат, второ, ги обележува како "изнајмени" сите огласи кои имаат активни договори за изнајмување во моментот, и трето, ги обележува како "достапни" сите огласи кои се во рамките на нивниот период на достапност и немаат активни договори. |
| 258 | {{{ |
| 259 | @Scheduled(cron = "0 0 2 * * *") |
| 260 | @Transactional |
| 261 | public 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)]] |