-- D:\_radni\a0_irn\z003882_book_out\pra_trec_odrzavanje.pkb -- -- Generated for Oracle 10g on Thu Jul 25 13:18:50 2024 by Server Generator 6.5.96.5.6 PROMPT Creating Package Body 'PRA_TREC_ODRZAVANJE' CREATE OR REPLACE PACKAGE BODY PRA_TREC_ODRZAVANJE IS /* pra_trec_odrzavanje */ PROCEDURE PROVJERI_RAZDOBLJE (ID_P IN trec_odrzavanje.id%TYPE ,SJ_ID_P IN TREC_ODRZAVANJE.SJ_ID%TYPE ,ZMPPROS_ID_P IN mzmp_prostori.id%TYPE ,DAT_POC_P IN TREC_ODRZAVANJE.DAT_POC%TYPE ,DAT_ZAV_P IN TREC_ODRZAVANJE.DAT_ZAV%TYPE ) IS /* Razdoblja u kojima je SJ/prostor izvan upotrebe/u kvaru/raspolo�iv(a) ne mogu se preklapati. */ br_redaka_l NUMBER; BEGIN IF id_p IS NULL OR (sj_id_p IS NULL AND zmppros_id_p IS NULL) OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; SELECT COUNT (rowid) INTO br_redaka_l FROM trec_odrzavanje WHERE id <> id_p AND NVL (sj_id, 0) = NVL (sj_id_p, 0) AND NVL (zmppros_id, 0) = NVL (zmppros_id_p, 0) AND dat_poc < dat_zav_p AND dat_zav > dat_poc_p AND oznaka = 'V'; -- IRN 1678 IF br_redaka_l > 0 THEN -- Razdoblja zapisa o odr�avanju SJ/prostora ne smiju se preklapati. pra_rec_zaj.vrati_poruku (-20027); END IF; END; /* pra_trec_odrzavanje */ PROCEDURE PROVJERI_SLOBODNU_SJ (SJ_ID_P IN TREC_ODRZAVANJE.SJ_ID%TYPE ,DAT_POC_P IN TREC_ODRZAVANJE.DAT_POC%TYPE ,DAT_ZAV_P IN TREC_ODRZAVANJE.DAT_ZAV%TYPE ,OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ) IS -- br_redaka_l NUMBER; BEGIN IF sj_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL OR ozn_i_p IS NULL OR ozn_i_p <> 3 -- 3 = izvan upotrebe THEN RETURN; END IF; SELECT COUNT (ROWID) INTO br_redaka_l FROM i_statusisj WHERE sj_id = sj_id_p AND datum BETWEEN dat_poc_p AND dat_zav_p - 1 -- IRN 2168 AND (ozn_u = -1 OR ozn_r > 0 OR ozn_z > 0); IF br_redaka_l > 0 THEN -- Smje�tajna jedinica izvan upotrebe mo�e biti samo slobodna SJ. pra_rec_zaj.vrati_poruku (-20095); END IF; END; /* pra_trec_odrzavanje */ PROCEDURE DODAJ_STATUSSJ_I (SJ_ID_P IN I_STATUSISJ.SJ_ID%TYPE ,DAT_DOLASKA_P IN I_STATUSISJ.DATUM%TYPE ,DAT_ODLASKA_P IN I_STATUSISJ.DATUM%TYPE ,OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ) IS /* Postavi i_statusisj.ozn_i na 2 = u kvaru ili 3 = izvan upotrebe, te i_statusisj.ozn_domacice1 na 5 = prljava. */ CURSOR stsj_c (datum_k i_statusisj.datum%TYPE) IS SELECT ozn_i FROM i_statusisj WHERE sj_id = sj_id_p AND datum = datum_k FOR UPDATE OF ozn_i NOWAIT; datum_l i_statusisj.datum%TYPE; ozn_i_l i_statusisj.ozn_i%TYPE; BEGIN IF sj_id_p IS NULL OR ozn_i_p NOT IN (2, 3) THEN RETURN; END IF; datum_l := dat_dolaska_p; WHILE datum_l < dat_odlaska_p LOOP OPEN stsj_c (datum_l); FETCH stsj_c INTO ozn_i_l; IF stsj_c%FOUND THEN IF ozn_i_l >= ozn_i_p THEN -- Smje�tajna jedinica je u kvaru ili izvan upotrebe (#0). pra_rec_zaj.vrati_poruku (-20362, ozn_i_l); ELSE UPDATE i_statusisj SET ozn_i = ozn_i_p, ozn_domacice1 = 5 WHERE CURRENT OF stsj_c; END IF; ELSE INSERT INTO i_statusisj ( sj_id, gost_id, datum, ozn_i, ozn_u, ozn_r, ozn_z, ozn_domacice1) VALUES ( sj_id_p, NULL, datum_l, ozn_i_p, 0, 0, 0, 5); END IF; CLOSE stsj_c; datum_l := datum_l + 1; END LOOP; EXCEPTION WHEN OTHERS THEN IF stsj_c%ISOPEN THEN CLOSE stsj_c; END IF; RAISE; END; /* pra_trec_odrzavanje */ PROCEDURE ODUZMI_STATUSSJ_I (SJ_ID_P IN I_STATUSISJ.SJ_ID%TYPE ,DAT_DOLASKA_P IN I_STATUSISJ.DATUM%TYPE ,DAT_ODLASKA_P IN I_STATUSISJ.DATUM%TYPE ,OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ) IS -- postavi i_statusi.ozn_i sa 2 = u kvaru ili 3 = izvan upotrebe na 1 = raspolo�iva CURSOR stsj_c (datum_k i_statusisj.datum%TYPE) IS SELECT ozn_i FROM i_statusisj WHERE sj_id = sj_id_p AND datum = datum_k FOR UPDATE OF ozn_i NOWAIT; datum_l i_statusisj.datum%TYPE; ozn_i_l i_statusisj.ozn_i%TYPE; BEGIN IF sj_id_p IS NULL OR ozn_i_p NOT IN (2, 3) THEN RETURN; END IF; datum_l := dat_dolaska_p; WHILE datum_l < dat_odlaska_p LOOP OPEN stsj_c (datum_l); FETCH stsj_c INTO ozn_i_l; IF stsj_c%FOUND THEN IF ozn_i_l = ozn_i_p THEN UPDATE i_statusisj SET ozn_i = 1 WHERE CURRENT OF stsj_c; END IF; END IF; CLOSE stsj_c; datum_l := datum_l + 1; END LOOP; EXCEPTION WHEN OTHERS THEN IF stsj_c%ISOPEN THEN CLOSE stsj_c; END IF; RAISE; END; /* pra_trec_odrzavanje */ PROCEDURE PROVJERI_DODAJ_ODUZMI (NOVI_DAT_POC_P IN TREC_ODRZAVANJE.DAT_POC%TYPE ,NOVI_DAT_ZAV_P IN TREC_ODRZAVANJE.DAT_ZAV%TYPE ,STARI_DAT_POC_P IN TREC_ODRZAVANJE.DAT_POC%TYPE ,STARI_DAT_ZAV_P IN TREC_ODRZAVANJE.DAT_ZAV%TYPE ,NOVI_SJ_ID_P IN TREC_ODRZAVANJE.SJ_ID%TYPE ,STARI_SJ_ID_P IN TREC_ODRZAVANJE.SJ_ID%TYPE ,NEW_OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ,OLD_OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ,CENTAR_P IN VARCHAR2 ,VRSTA_P IN VARCHAR2 ) IS -- vrsta_p: 1 provjeri, 2 oduzmi, 3 dodaj, 4 oduzmi centar, 5 dodaj centar datum_l i_statusisj.datum%TYPE; naredba_l VARCHAR2(4000); BEGIN IF vrsta_p IN (1, 3, 5) THEN datum_l := novi_dat_poc_p - 1; ELSIF vrsta_p IN (2, 4) THEN datum_l := stari_dat_poc_p - 1; END IF; LOOP datum_l := datum_l + 1; IF (vrsta_p IN (1, 3, 5) AND datum_l = novi_dat_zav_p) OR (vrsta_p IN (2, 4) AND datum_l = stari_dat_zav_p) THEN EXIT; END IF; IF vrsta_p = 1 AND datum_l NOT BETWEEN stari_dat_poc_p AND stari_dat_zav_p - 1 THEN pra_trec_odrzavanje.provjeri_slobodnu_sj (novi_sj_id_p, datum_l, datum_l + 1, new_ozn_i_p); ELSIF vrsta_p = 2 AND datum_l NOT BETWEEN novi_dat_poc_p AND novi_dat_zav_p - 1 THEN pra_trec_odrzavanje.oduzmi_statussj_i (stari_sj_id_p, datum_l, datum_l + 1, old_ozn_i_p); ELSIF vrsta_p = 3 AND datum_l NOT BETWEEN stari_dat_poc_p AND stari_dat_zav_p - 1 THEN pra_trec_odrzavanje.dodaj_statussj_i (novi_sj_id_p, datum_l, datum_l + 1, new_ozn_i_p); ELSIF vrsta_p = 4 AND datum_l NOT BETWEEN novi_dat_poc_p AND novi_dat_zav_p - 1 AND old_ozn_i_p = 3 THEN naredba_l := 'BEGIN pra_trec_odrzavanje.oduzmi_statussj_i@' || centar_p || ' (:sj_id , :dat_poc, :dat_zav, :ozn_i); END;'; EXECUTE IMMEDIATE naredba_l USING stari_sj_id_p, datum_l, datum_l + 1, old_ozn_i_p; ELSIF vrsta_p = 5 AND datum_l NOT BETWEEN stari_dat_poc_p AND stari_dat_zav_p - 1 AND new_ozn_i_p = 3 THEN naredba_l := 'BEGIN pra_trec_odrzavanje.dodaj_statussj_i@' || centar_p || ' (:sj_id , :dat_poc, :dat_zav, :ozn_i); END;'; EXECUTE IMMEDIATE naredba_l USING novi_sj_id_p, datum_l, datum_l + 1, new_ozn_i_p; END IF; END LOOP; END; /* pra_trec_odrzavanje */ PROCEDURE VRATI_ZMPPROS_OZN_I_OBJEKT (ZMPPROS_ID_P IN NUMBER ,DAT_POC_P IN DATE ,DAT_ZAV_P IN DATE ,RECODR_ZMPPROS_ID_P IN OUT NUMBER ,RECODR_DAT_POC_P IN OUT DATE ,RECODR_DAT_ZAV_P IN OUT DATE ,RECODR_OZN_I_P IN OUT NUMBER ) IS -- CURSOR recodr_c IS SELECT zmppros_id, dat_poc, dat_zav, ozn_i FROM trec_odrzavanje WHERE zmppros_id IN ( -- promatrani i njemu nadre�eni prostori SELECT id FROM mzmp_prostori START WITH id = zmppros_id_p CONNECT BY PRIOR zmppros_id = id) AND ozn_i IN (2, 3) AND dat_zav > dat_poc_p AND dat_poc < dat_zav_p AND oznaka = 'V' -- IRN 1678 ORDER BY dat_poc; BEGIN IF zmppros_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; OPEN recodr_c; FETCH recodr_c INTO recodr_zmppros_id_p, recodr_dat_poc_p, recodr_dat_zav_p, recodr_ozn_i_p; CLOSE recodr_c; END; /* pra_trec_odrzavanje */ PROCEDURE VRATI_ZMPPROS_OZN_I_CENTAR (ZMPOJR_ID_P IN NUMBER ,ZMPPROS_ID_P IN NUMBER ,DAT_POC_P IN DATE ,DAT_ZAV_P IN DATE ,RECODR_ZMPPROS_ID_P IN OUT NUMBER ,RECODR_DAT_POC_P IN OUT DATE ,RECODR_DAT_ZAV_P IN OUT DATE ,RECODR_OZN_I_P IN OUT NUMBER ) IS -- cvor_l VARCHAR2(41) := pra_zmp_s.metcvor_sifra_ojr (zmpojr_id_p); naredba_l VARCHAR2(2000); BEGIN IF zmpojr_id_p IS NULL OR zmppros_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; IF cvor_l IS NOT NULL THEN cvor_l := '@' || cvor_l; END IF; naredba_l := 'BEGIN ' || ' pra_trec_odrzavanje.vrati_zmppros_ozn_i_objekt<CVOR> (' || ' :zmppros_id_p, :dat_poc_p, :dat_zav_p, :recodr_zmppros_id_p, :recodr_dat_poc_p, :recodr_dat_zav_p, :recodr_ozn_i_p); ' || 'END;'; EXECUTE IMMEDIATE REPLACE (naredba_l, '<CVOR>', cvor_l) USING zmppros_id_p, dat_poc_p, dat_zav_p, IN OUT recodr_zmppros_id_p, IN OUT recodr_dat_poc_p, IN OUT recodr_dat_zav_p, IN OUT recodr_ozn_i_p; END; /* pra_trec_odrzavanje */ PROCEDURE VRATI_ZMPPROS_OZN_I (ZMPOJR_ID_P IN NUMBER ,ZMPPROS_ID_P IN NUMBER ,DAT_POC_P IN DATE ,DAT_ZAV_P IN DATE ,RECODR_ZMPPROS_ID_P IN OUT NUMBER ,RECODR_DAT_POC_P IN OUT DATE ,RECODR_DAT_ZAV_P IN OUT DATE ,RECODR_OZN_I_P IN OUT NUMBER ) IS -- podcentar_l VARCHAR2(41) := pra_rec_s3.metcvor_sifra_podcentar; naredba_l VARCHAR2(2000); BEGIN IF zmpojr_id_p IS NULL OR zmppros_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; IF pra_zmp_s.zmpojr_tekuceg_cvora (zmpojr_id_p) THEN pra_trec_odrzavanje.vrati_zmppros_ozn_i_objekt ( zmppros_id_p, dat_poc_p, dat_zav_p, recodr_zmppros_id_p, recodr_dat_poc_p, recodr_dat_zav_p, recodr_ozn_i_p); ELSE naredba_l := 'BEGIN ' || ' pra_trec_odrzavanje.vrati_zmppros_ozn_i_centar<CVOR> (' || ' :zmpojr_id_p, :zmppros_id_p, :dat_poc_p, :dat_zav_p, :recodr_zmppros_id_p, :recodr_dat_poc_p, :recodr_dat_zav_p, :recodr_ozn_i_p); ' || 'END;'; EXECUTE IMMEDIATE REPLACE (naredba_l, '<CVOR>', podcentar_l) USING zmpojr_id_p, zmppros_id_p, dat_poc_p, dat_zav_p, IN OUT recodr_zmppros_id_p, IN OUT recodr_dat_poc_p, IN OUT recodr_dat_zav_p, IN OUT recodr_ozn_i_p; END IF; END; /* pra_trec_odrzavanje */ PROCEDURE PROVJERI_SLOBODAN_ZMPPROS1 (ZMPPROS_ID_P IN trec_odrzavanje.zmppros_id%TYPE ,DAT_POC_P IN trec_odrzavanje.dat_poc%TYPE ,DAT_ZAV_P IN trec_odrzavanje.dat_zav%TYPE ) IS -- CURSOR recrez2_c IS SELECT recrez2.rbr || '-' || oj.sifra || '-' || recrez2.god_poslovna FROM trec_rez2_pros recrez2, m_oj oj WHERE recrez2.zmpojr_id = oj.id AND recrez2.oznaka = 'V' AND recrez2.zmppros_id IN ( -- promatrani i njemu podre�eni prostori SELECT id FROM mzmp_prostori START WITH id = zmppros_id_p CONNECT BY PRIOR id = zmppros_id) AND recrez2.sat_poc < dat_zav_p AND recrez2.sat_zav > dat_poc_p ORDER BY recrez2.god_poslovna DESC, oj.sifra, recrez2.rbr DESC; CURSOR ponpros_c IS SELECT pon.rbr || '-' || pon.god_poslovna FROM t_pon_pros ponpros, t_pon_ojr ponojr, t_ponude pon WHERE ponpros.ponojr_id = ponojr.id AND ponojr.pon_id = pon.id AND pon.oznaka NOT IN ('P') AND ponpros.zmppros_id IN ( -- promatrani i njemu podre�eni prostori SELECT id FROM mzmp_prostori START WITH id = zmppros_id_p CONNECT BY PRIOR id = zmppros_id) AND ponpros.sat_poc < dat_zav_p AND ponpros.sat_zav > dat_poc_p ORDER BY pon.god_poslovna DESC, pon.rbr DESC; opis_l VARCHAR2(40); BEGIN IF zmppros_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; OPEN recrez2_c; FETCH recrez2_c INTO opis_l; IF recrez2_c%FOUND THEN CLOSE recrez2_c; -- Prostor nije slobodan (#0 #1)! pra_zmp_zaj.vrati_poruku (-20087, pra_zmp_zaj.poruka ('REC', 'REC_RECREZ2'), opis_l); END IF; CLOSE recrez2_c; OPEN ponpros_c; FETCH ponpros_c INTO opis_l; IF ponpros_c%FOUND THEN CLOSE ponpros_c; -- Prostor nije slobodan (#0 #1)! pra_zmp_zaj.vrati_poruku (-20087, pra_zmp_zaj.poruka ('REC', 'REC_PON'), opis_l); END IF; CLOSE ponpros_c; END; /* pra_trec_odrzavanje */ PROCEDURE PROVJERI_SLOBODAN_ZMPPROS (ZMPPROS_ID_P IN trec_odrzavanje.zmppros_id%TYPE ,OZN_I_P IN trec_odrzavanje.ozn_i%TYPE ,NEW_DAT_POC_P IN trec_odrzavanje.dat_poc%TYPE ,NEW_DAT_ZAV_P IN trec_odrzavanje.dat_zav%TYPE ,OLD_DAT_POC_P IN trec_odrzavanje.dat_poc%TYPE ,OLD_DAT_ZAV_P IN trec_odrzavanje.dat_zav%TYPE ) IS /* samo slobodan prostor mo�e biti prostor izvan upotrebe slobodan = nevezan za valjanu rezervaciju i/ili ponudu */ BEGIN IF zmppros_id_p IS NULL OR ozn_i_p NOT IN (3) -- izvan upotrebe OR new_dat_poc_p IS NULL OR new_dat_zav_p IS NULL OR new_dat_poc_p = new_dat_zav_p THEN RETURN; END IF; IF INSERTING THEN pra_trec_odrzavanje.provjeri_slobodan_zmppros1 (zmppros_id_p, new_dat_poc_p, new_dat_zav_p); END IF; IF UPDATING THEN -- podrazumijeva se kako nije dopu�teno promijeniti niti zmppros_id niti ozn_i IF old_dat_poc_p IS NULL OR old_dat_zav_p IS NULL OR (new_dat_poc_p >= old_dat_poc_p AND new_dat_zav_p <= old_dat_zav_p) THEN -- novo razdoblje je unutar starog razdoblja, pa provjera nije potrebna RETURN; END IF; IF new_dat_poc_p < old_dat_poc_p THEN pra_trec_odrzavanje.provjeri_slobodan_zmppros1 (zmppros_id_p, new_dat_poc_p, old_dat_poc_p); END IF; IF new_dat_zav_p > old_dat_zav_p THEN pra_trec_odrzavanje.provjeri_slobodan_zmppros1 (zmppros_id_p, old_dat_zav_p, new_dat_zav_p); END IF; END IF; END; /* pra_trec_odrzavanje */ FUNCTION BR_TELEFONA (TCOSER_ID_P IN trec_odrzavanje.tcoser_id%TYPE ,SJ_ID_P IN trec_odrzavanje.sj_id%TYPE ,ZMPPROS_ID_P IN trec_odrzavanje.zmppros_id%TYPE ) RETURN mrec_gdje_ojr.br_telefona%TYPE IS -- IRN 1678; broj telefona grupe djelatnika promatranog servisa u OJR promatrane SJ ili prostora br_telefona_l mrec_gdje_ojr.br_telefona%TYPE; BEGIN IF tcoser_id_p IS NULL OR (sj_id_p IS NULL AND zmppros_id_p IS NULL) THEN RETURN (NULL); END IF; SELECT MIN (br_telefona) INTO br_telefona_l FROM mrec_gdje_ojr WHERE tcogdje_id = (SELECT tcogdje_id FROM mtco_servisi WHERE id = tcoser_id_p) AND zmpojr_id = ( SELECT so.ojr_id FROM m_sj sj, m_so so WHERE sj.id = sj_id_p AND sj.so_id = so.id UNION SELECT pra_zmp_s.oj_zmpojr_id (oj_id) FROM mzmp_prostori WHERE id = zmppros_id_p); RETURN (br_telefona_l); END; /* pra_trec_odrzavanje */ PROCEDURE PUNI_OZN_PORUKE (OZNAKA_P IN trec_odrzavanje.oznaka%TYPE ,TCOSER_ID_P IN trec_odrzavanje.tcoser_id%TYPE ,SAT_ZAV_P IN trec_odrzavanje.sat_zav%TYPE ,SJ_ID_P IN trec_odrzavanje.sj_id%TYPE ,ZMPPROS_ID_P IN trec_odrzavanje.zmppros_id%TYPE ,OZN_PORUKE_P IN OUT trec_odrzavanje.ozn_poruke%TYPE ) IS /* IRN 1678 Ako je zapis valjan i vezan za servis koji nije obavljen i ako postoji telefon u OJR postavi oznaku na 10 = treba slati poruku */ BEGIN IF oznaka_p = 'V' AND tcoser_id_p IS NOT NULL AND sat_zav_p IS NULL AND NVL (ozn_poruke_p, 0) = 0 -- ne treba slati poruku AND pra_trec_odrzavanje.br_telefona (tcoser_id_p, sj_id_p, zmppros_id_p) IS NOT NULL THEN ozn_poruke_p := 10; END IF; IF ozn_poruke_p IS NULL THEN ozn_poruke_p := 0; -- ne treba slati poruku END IF; END; /* pra_trec_odrzavanje */ PROCEDURE AZU_RECBOOKCH_IU (SJ_ID_P IN I_STATUSISJ.SJ_ID%TYPE ,DAT_POC_P IN trec_odrzavanje.dat_poc%type ,DAT_ZAV_P IN trec_odrzavanje.dat_zav%type ,KOL_SJ_P IN i_booking.kol_sj%type ) IS /* a�uriraj irec_book_change pod ozn_sprodaje = 1 (poziva se ako je ozn_i = 3 = izvan upotrebe �to utje�e na kapacitet) */ CURSOR sj_c IS SELECT so_id, vsj_id FROM m_sj WHERE id = sj_id_p; so_id_l m_so.id%TYPE; vsj_id_l s_vsj.id%TYPE; datum_l i_statusisj.datum%TYPE; ozn_i_l i_statusisj.ozn_i%TYPE; BEGIN IF sj_id_p IS NULL OR dat_poc_p IS NULL OR dat_zav_p IS NULL THEN RETURN; END IF; OPEN sj_c; FETCH sj_c INTO so_id_l, vsj_id_l; IF sj_c%FOUND THEN datum_l := dat_poc_p; WHILE datum_l < dat_zav_p LOOP INSERT INTO irec_book_change (so_id, vsj_id, datum, ozn_sprodaje, kol_sj) VALUES (so_id_l, vsj_id_l, datum_l, '1', kol_sj_p); datum_l := datum_l + 1; END LOOP; END IF; CLOSE sj_c; EXCEPTION WHEN OTHERS THEN IF sj_c%ISOPEN THEN CLOSE sj_c; END IF; END; END PRA_TREC_ODRZAVANJE; / SHOW ERROR