PROMPT Creating Package Body 'PRA_FLEXKEEPING'
CREATE OR REPLACE PACKAGE BODY PRA_FLEXKEEPING IS
-- Private Declaration

data_m    CLOB;
url_m     szmp_parametri.vrijednost%TYPE;
odgovor_m CLOB;
opis_m    CLOB;

metcvor_rbr_m smet_cvorovi.rbr%TYPE; -- IRN 3991
log_file_name_m VARCHAR2(100); -- IRN 3991

/*
Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
*/
flex_param_1003_m szmp_parametri.vrijednost%TYPE;

TYPE booking_rec_type IS RECORD (
  ObjectF   m_so.sifra%TYPE,
  Room      m_sj.broj%TYPE,
  -- PrevRoom -- Previous room identificator, if it has been changed from last time.
  BookingId VARCHAR2(100),
  Status    VARCHAR2(20), -- RESERVED, CANCELLED, NO SHOW, CHECKED IN, CHECKED OUT, PROSPECT
  Arrival   VARCHAR2(16), -- YYYY-MM-DD 00:00
  Departure VARCHAR2(16), -- YYYY-MM-DD 00:00
  Vip       t_rezervacije.ozn_vip%TYPE,
  CheckIn   VARCHAR2(16), -- YYYY-MM-DD 00:00
  CheckOut  VARCHAR2(16), -- YYYY-MM-DD 00:00
  Adults    t_rezervacije.br_osoba1%TYPE,
  -- Traces
  Message   t_rezervacije.napomena%TYPE,
  -- Guests
  GuestId   VARCHAR2(100),
  FirstName t_rezervacije.ime%TYPE,
  LastName  t_rezervacije.prezime%TYPE,
  BirthDate VARCHAR2(10), -- YYYY-MM-DD
  Country   s_zemlje.sifra_2a%TYPE
  );

booking_rec_m booking_rec_type;

-- END Private Declaration


PROCEDURE INSERT_RECIDOM
 (SO_SIFRA_P IN m_so.sifra%TYPE
 ,SJ_ID_P IN trec_idomacice.sj_id%TYPE
 ,OZN_DOMACICE1_P IN trec_idomacice.ozn_domacice1%TYPE
 ,UNOS_KORISNIK_P IN trec_idomacice.unos_korisnik%TYPE
 ,ODGOVOR_P OUT VARCHAR2
 )
 IS
-- poziva se iz procedure post_room_cleanness
BEGIN

  IF pra_zmp_s.oznaka ('P0021', so_sifra_p) = 0 THEN -- IRN 3016
    -- Nedopu�ten pristup!
    pra_zmp_zaj.vrati_poruku (-20138);
  END IF;

  INSERT INTO trec_idomacice (sj_id, datum, ozn_domacice1, ozn_unosa, unos_korisnik, unos_dat)
    VALUES (sj_id_p, TRUNC (SYSDATE), ozn_domacice1_p, 'A', unos_korisnik_p, SYSDATE);

  odgovor_p := 'OK (INSERTED ' || SQL%ROWCOUNT || ')';

END;
PROCEDURE UPISI_RACUN
 (SO_SIFRA_P IN m_so.sifra%TYPE
 ,SJ_ID_P IN m_sj.id%TYPE
 ,PRO_ID_P IN m_proizvodi.id%TYPE
 ,QUANTITY_P IN t_rnkase_pro.kolicina%TYPE
 ,BOOKING_ID_P IN VARCHAR2
 ,GMPKAS_ID_P IN mgmp_kase.id%TYPE
 ,ODGOVOR_P OUT VARCHAR2
 )
 IS
-- poziva se iz procedure post_room_minibar
  CURSOR gost1_c IS
    SELECT id, ozn_rnk, ime, prezime
      FROM t_gosti
     WHERE sj_id = sj_id_p
       AND god_poslovna = SUBSTR (booking_id_p, 1, 4) -- booking_id_p npr. 2018-123456
       AND rbr = SUBSTR (booking_id_p, 6, 6);

  CURSOR gost2_c IS
    SELECT id, ozn_rnk, ime, prezime
      FROM t_gosti
     WHERE sj_id = sj_id_p
       AND TRUNC (SYSDATE) BETWEEN dat_dolaska AND dat_odlaska
       AND ozn_prisutnosti = 'P'
     ORDER BY ozn_platitelj, rbr;

  gost_c_l gost1_c%ROWTYPE; -- ili gost2_c%ROWTYPE

  CURSOR asokase_c IS
    SELECT asokase.pc, asokase.nac_id
      FROM m_aso_kase asokase,
           m_nac_vpla nacvpla,
           s_vplacanja vpla,
           m_nacpot nac
     WHERE asokase.kase_id = gmpkas_id_p
       AND asokase.pro_id = pro_id_p
       AND asokase.nac_id = nacvpla.nac_id
       AND nacvpla.nac_id = nac.id
       AND nacvpla.vpla_id = vpla.id
       AND vpla.ozn_irn = '1'
     ORDER BY vpla.sifra, nac.sifra;
  cijena_l m_aso_kase.pc%TYPE;
  nac_id_l m_aso_kase.nac_id%TYPE;

  odgovor_l VARCHAR2(500);
  rbr_l t_rnkase.rbr%TYPE;
BEGIN

  IF pra_zmp_s.oznaka ('P0021', so_sifra_p) = 0 THEN -- IRN 3016
    -- Nedopu�ten pristup!
    pra_zmp_zaj.vrati_poruku (-20138);
  END IF;

  IF booking_id_p IS NOT NULL THEN -- npr. 2018-123456
    OPEN gost1_c;
    FETCH gost1_c INTO gost_c_l;
    CLOSE gost1_c;
    IF gost_c_l.id IS NULL THEN
      -- Pogre�na vrijednost ulaznog parametra (#0)!
      pra_zmp_zaj.vrati_poruku (-20099, 'BookingId ' || booking_id_p);
    END IF;
    IF gost_c_l.ozn_rnk = 0 THEN
      -- Knji�enje RNK na gosta #0 #1 nije dopu�teno!
      pra_pka_zaj.vrati_poruku (-20100, gost_c_l.ime, gost_c_l.prezime);
    END IF;
  ELSE
    OPEN gost2_c;
    FETCH gost2_c INTO gost_c_l;
    CLOSE gost2_c;
    IF gost_c_l.id IS NULL THEN
      -- Nedostaje podatak (#0)!
      pra_zmp_zaj.vrati_poruku (-20098, pra_zmp_zaj.poruka ('REC', 'REC_GOST'));
    END IF;
    IF gost_c_l.ozn_rnk = 0 THEN
      -- Knji�enje RNK na gosta #0 #1 nije dopu�teno!
      pra_pka_zaj.vrati_poruku (-20100, gost_c_l.ime, gost_c_l.prezime);
    END IF;
  END IF;

  OPEN asokase_c;
  FETCH asokase_c INTO cijena_l, nac_id_l;
  CLOSE asokase_c;
  IF cijena_l IS NULL OR nac_id_l IS NULL THEN
    -- Nedostaje podatak (#0)!
    pra_zmp_zaj.vrati_poruku (-20098, pra_zmp_zaj.poruka ('GAS', 'GAS_ASOKASE'));
  END IF;

  odgovor_l := 'OK';

  pra_gas_pka.upisi_racun (
    datum_p     => TRUNC (SYSDATE),
    sj_id_p     => sj_id_p,
    pro_id_p    => pro_id_p,
    kolicina_p  => quantity_p,
    cijena_p    => cijena_l,
    gost_id_p   => gost_c_l.id,
    kase_id_p   => gmpkas_id_p,
    nac_id_p    => nac_id_l,
    pkaadr_id_p => NULL,
    age_id_p    => NULL,
    pkakar_id_p => NULL,
    poruka_p    => odgovor_l,
    rbr_p       => rbr_l);

  odgovor_p := odgovor_l;

END;
FUNCTION DAT_RODJENJA
 (OZNAKE_P IN szmp_parametri.vrijednost%TYPE
 ,GOST_ID_P IN t_gosti.id%TYPE
 ,DAT_DOLASKA_P IN t_gosti.dat_dolaska%TYPE
 ,DAT_ODLASKA_P IN t_gosti.dat_odlaska%TYPE
 ,DAT_RODJENJA_P IN t_kgostiju.dat_rodjenja%TYPE := NULL
 )
 RETURN t_kgostiju.dat_rodjenja%TYPE
 IS
-- datum ro�enja; poziva se iz procedura post_init_booking, post_booking_gost i post_booking_kgost
  dat_rodjenja_l t_kgostiju.dat_rodjenja%TYPE;
BEGIN

  IF INSTR (oznake_p, 'C') = 0    -- datum ro�enja
    AND INSTR (oznake_p, 'D') = 0 -- datum ro�enja (samo za ro�endane u vrijeme boravka)
  THEN
    RETURN (NULL);
  END IF;

  IF gost_id_p IS NULL
    OR dat_dolaska_p IS NULL
    OR dat_odlaska_p IS NULL
  THEN
    RETURN (NULL);
  END IF;

  IF dat_rodjenja_p IS NOT NULL THEN
    dat_rodjenja_l := dat_rodjenja_p;
  ELSE
    SELECT MIN (dat_rodjenja) INTO dat_rodjenja_l
      FROM t_kgostiju
     WHERE gost_id = gost_id_p
       AND oznaka = 'V';
    IF dat_rodjenja_l IS NULL THEN
      RETURN (NULL);
    END IF;
  END IF;
  IF INSTR (oznake_p, 'C') > 0 THEN
    RETURN (dat_rodjenja_l);
  END IF;

  IF ADD_MONTHS (dat_rodjenja_l, (pra_rec_s3.dob (dat_rodjenja_l, (dat_dolaska_p - 1)) + 1) * 12)
    BETWEEN dat_dolaska_p AND dat_odlaska_p
  THEN
    RETURN (dat_rodjenja_l);
  END IF;

  RETURN (NULL);
END;
PROCEDURE ZAJ_POST
 (ENDPOINT_P IN VARCHAR2
 )
 IS
--
  timeout_l NUMBER;
  api_key_l szmp_parametri.vrijednost%TYPE;

  req_l UTL_HTTP.req;
  res_l UTL_HTTP.resp;
  line_l CLOB;
BEGIN

  timeout_l := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001');
  IF endpoint_p LIKE '%initialization%' THEN -- IRN 3625
    timeout_l := timeout_l * 2;
  END IF;
  api_key_l := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1002');

  url_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1005') || endpoint_p;

  -- IRN 3130; Spremati komunikaciju sa servisom Flexkeeping u log: da ili ne.
  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1004') = 'da' THEN
    pra_pka2.clob_to_table (opis_m || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3532, IRN 3991
    pra_pka2.clob_to_table (url_m || CHR(10), log_file_name_m, NULL, 'FLEX');
    pra_pka2.clob_to_table (data_m || CHR(10), log_file_name_m, NULL, 'FLEX');
  END IF;

  UTL_HTTP.set_detailed_excp_support (enable => true);
  UTL_HTTP.set_transfer_timeout (timeout => timeout_l);
  UTL_HTTP.set_body_charset (charset => 'UTF-8');
  req_l := UTL_HTTP.begin_request (url => url_m, method => 'POST', http_version => 'HTTP/1.1');
  UTL_HTTP.set_header (req_l, 'Content-Type', 'application/json; charset=utf-8');
  UTL_HTTP.set_header (req_l, 'Api-Key', api_key_l);

  /*
  IRN 3625   
  Dodao Pjer�30.3.2023
  https://test-aminess.flexkeeping.com zahtjeva da postoji header sa stringom validnog (registriranog) user agenta (aplikacije)
  Neki od mogu�i stringova su: PostmanRuntime/7.31.3,� Mozilla/5.0 (najnoviji), itd
  Ovdje se predstavljamo kao Chrome browser
  ako se ne po�alje User-Agent javi se gre�ka {"error":"Invalid realm 'aminess_copy2'"} 
  */
  UTL_HTTP.set_header (req_l, 'User-Agent', 'Mozilla/5.0');

  DECLARE
    req_length_l BINARY_INTEGER;
    buffer_l     VARCHAR2(2000);
    amount_l     PLS_INTEGER := 2000;
    offset_l     PLS_INTEGER := 1;
  BEGIN
    req_length_l := pra_pka2.clob_length (data_m);

    IF req_length_l <= 32767 THEN
      UTL_HTTP.set_header (req_l, 'Content-Length', req_length_l);
      UTL_HTTP.write_text (req_l, data_m);

    ELSE
      UTL_HTTP.set_header (req_l, 'Transfer-Encoding', 'chunked');

      WHILE (offset_l < req_length_l) LOOP
        buffer_l := DBMS_LOB.substr (data_m, amount_l, offset_l);
        UTL_HTTP.write_text (req_l, buffer_l);
        offset_l := offset_l + amount_l;
      END LOOP;
    END IF;
  END;

  res_l := UTL_HTTP.get_response (req_l);

  BEGIN
    LOOP
      UTL_HTTP.read_line (res_l, line_l);
      odgovor_m := odgovor_m || line_l;
    END LOOP;
    UTL_HTTP.end_response (res_l);
  EXCEPTION
    WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response (res_l);
  END;

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1004') = 'da' THEN
    pra_pka2.clob_to_table ('[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] ' || odgovor_m || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX');
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    UTL_HTTP.end_response (res_l);
    RAISE;
END;
PROCEDURE POST_ROOM_CLEANNESS
 (OBJECT_P IN m_so.sifra%TYPE
 ,ROOM_P IN m_sj.broj%TYPE
 ,CLEANNESS_P IN VARCHAR2
 ,ODGOVOR_P OUT VARCHAR2
 )
 IS
-- proceduru poziva ORDS modul flexkeeping /flex/roomcleanness
  CURSOR so_c IS
    SELECT id, metcvor_sifra
      FROM m_so
     WHERE sifra = object_p;
  so_c_l so_c%ROWTYPE;
  sj_id_l m_sj.id%TYPE;
  ozn_domacice1_l trec_idomacice.ozn_domacice1%TYPE;
  unos_korisnik_l trec_idomacice.unos_korisnik%TYPE := zmp_zaj.korisnik (-1);
  naredba_l VARCHAR2(1000);
BEGIN

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m :=
    '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] ' || 
    '{Room Cleanness} < ' || object_p || '; ' || room_p || '; ' || cleanness_p;
  -- KRAJ IRN 3991

  -- Nedostaje obvezan ulazni parametar (#0).
  IF object_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Object');
  ELSIF room_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Room');
  ELSIF cleanness_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Cleanness');
  END IF;

  OPEN so_c;
  FETCH so_c INTO so_c_l;
  CLOSE so_c;
  IF so_c_l.id IS NULL THEN
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'Object ' || object_p);
  END IF;

  SELECT MIN(id) INTO sj_id_l FROM m_sj WHERE so_id = so_c_l.id AND broj = room_p;
  IF sj_id_l IS NULL THEN
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'Room ' || room_p);
  END IF;

  -- Cleanness status. Available: CL = cleaned, DI = dirty, IN = inspected (optional)
  IF    cleanness_p = 'CL' THEN ozn_domacice1_l := 2; -- �ista
  ELSIF cleanness_p = 'DI' THEN ozn_domacice1_l := 5; -- prljava
  ELSIF cleanness_p = 'IN' THEN ozn_domacice1_l := 1; -- pregledana
  -- IRN 3606; PI = pickup (Ready for final inspection)
  ELSIF cleanness_p = 'PI' THEN ozn_domacice1_l := 2; -- �ista
  ELSE
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'Cleanness ' || cleanness_p);
  END IF;

  -- IRN 3016, dodan parametar object_p
  IF so_c_l.metcvor_sifra = pra_zmp_zaj.tekuci_cvor THEN
    pra_flexkeeping.insert_recidom (object_p, sj_id_l, ozn_domacice1_l, unos_korisnik_l, odgovor_p);
  ELSE
    -- radi samo ako se poziva sa centra
    naredba_l := 'BEGIN pra_flexkeeping.insert_recidom<CVOR> (:object_p, :sj_id_l, :ozn_domacice1_l, :unos_korisnik_l, :odgovor_p); END;';
    EXECUTE IMMEDIATE REPLACE (naredba_l, '<CVOR>', '@' || so_c_l.metcvor_sifra)
      USING object_p, sj_id_l, ozn_domacice1_l, unos_korisnik_l, OUT odgovor_p;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    odgovor_p := SUBSTR ('ERROR ' || SQLERRM, 1, 2000);
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_ROOM_MINIBAR
 (OBJECT_P IN m_so.sifra%TYPE
 ,ROOM_P IN m_sj.broj%TYPE
 ,BOOKING_ID_P IN VARCHAR2
 ,ITEM_ID_P IN m_proizvodi.sif_proizvoda_kasa%TYPE
 ,QUANTITY_P IN t_rnkase_pro.kolicina%TYPE
 ,ODGOVOR_P OUT VARCHAR2
 )
 IS
-- proceduru poziva ORDS modul flexkeeping endpoint /flex/roomminibar
  CURSOR so_c IS
    SELECT id, metcvor_sifra, ojr_id
      FROM m_so
     WHERE sifra = object_p;
  so_c_l so_c%ROWTYPE;
  sj_id_l m_sj.id%TYPE;
  CURSOR gmpkas_c IS
    SELECT id
      FROM mgmp_kase
     WHERE metapl_sifra = 'GAS'
       AND ozn_kase = 'M'
       AND zmpojr_id = so_c_l.ojr_id
       AND NVL (so_id, so_c_l.id) = so_c_l.id
       AND TRUNC (SYSDATE) BETWEEN dat_valjan AND (NVL (dat_ponisten, TO_DATE ('31.12.9999', 'DD.MM.RRRR')) - 1)
     ORDER BY sifra;
  gmpkas_id_l mgmp_kase.id%TYPE;
  pro_id_l m_proizvodi.id%TYPE;
  odgovor_l VARCHAR2(2000);
  naredba_l VARCHAR2(1000);
  booking_id_l VARCHAR2(20);
BEGIN

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m :=
    '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] ' || 
    '{Room Minibar} < ' || object_p || '; ' || room_p || '; ' || booking_id_p || '; ' || item_id_p || '; ' || quantity_p;
  -- KRAJ IRN 3991

  -- Nedostaje obvezan ulazni parametar (#0).
  IF object_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Object');
  ELSIF room_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Room');
  -- booking_id_p -- mo�e biti NULL
  ELSIF item_id_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'ItemId');
  ELSIF quantity_p IS NULL THEN
    pra_rec_zaj.vrati_poruku (-20422, 'Quantity');
  END IF;

  OPEN so_c;
  FETCH so_c INTO so_c_l;
  CLOSE so_c;
  IF so_c_l.id IS NULL THEN
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'Object ' || object_p);
  END IF;

  SELECT MIN(id) INTO sj_id_l FROM m_sj WHERE so_id = so_c_l.id AND broj = room_p;
  IF sj_id_l IS NULL THEN
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'Room ' || room_p);
  END IF;

  OPEN gmpkas_c;
  FETCH gmpkas_c INTO gmpkas_id_l;
  CLOSE gmpkas_c;
  IF gmpkas_id_l IS NULL THEN
    -- #0 #1 --> Ne postoji kasa vrste minibar.
    pra_zmp_zaj.vrati_poruku (-20000, 'GAS0632', pra_zmp_zaj.poruka ('GAS', 'GAS0632'));
  END IF;

  SELECT MIN (id) INTO pro_id_l FROM m_proizvodi WHERE sif_proizvoda_kasa = item_id_p;
  IF pro_id_l IS NULL THEN
    -- Pogre�na vrijednost ulaznog parametra (#0)!
    pra_zmp_zaj.vrati_poruku (-20099, 'ItemId ' || item_id_p);
  END IF;

  -- IRN 2974; ukloni metcvor_rbr iz booking_id npr. 101-2025-123456 u 2025-123456
  booking_id_l := SUBSTR (booking_id_p, INSTR (booking_id_p, '-') + 1);

  -- IRN 3016; dodan parametar object_p
  IF so_c_l.metcvor_sifra = pra_zmp_zaj.tekuci_cvor THEN
    pra_flexkeeping.upisi_racun (object_p, sj_id_l, pro_id_l, quantity_p, booking_id_l, gmpkas_id_l, odgovor_l);
  ELSE
    -- radi samo ako se poziva sa centra
    naredba_l := 'BEGIN pra_flexkeeping.upisi_racun<CVOR> (:object_p, :sj_id_l, :pro_id_l, :quantity_p, :booking_id_l, :gmpkas_id_l, :odgovor_l); END;';
    EXECUTE IMMEDIATE REPLACE (naredba_l, '<CVOR>', '@' || so_c_l.metcvor_sifra)
      USING object_p, sj_id_l, pro_id_l, quantity_p, booking_id_l, gmpkas_id_l, OUT odgovor_l;
  END IF;

  IF odgovor_l = 'OK' THEN
    odgovor_p := odgovor_l;
  ELSE
    -- #0 #1
    pra_zmp_zaj.vrati_poruku (-20000, odgovor_l, '{Room Minibar}');
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    odgovor_p := SUBSTR ('ERROR ' || SQLERRM, 1, 2000);
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_INIT_BOOKING
 IS
-- Initialization Booking
-- proceduru poziva procedura post2flexkeeping_job
BEGIN

  /*
  Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
  D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
  */
  flex_param_1003_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1003');
  -- IRN 3991
  metcvor_rbr_m := pra_zmp_zaj.tekuci_cvor_rbr;
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {InitBooking}';
  -- KRAJ IRN 3991

  APEX_JSON.initialize_clob_output;

  APEX_JSON.open_array; -- [

  FOR c IN (
    -- rezervacije
    SELECT
      -1 AS ozn_rez,
      so.sifra AS so_sifra,
      sj.broj AS sj_broj,
      so.sifra || '-' || rez.god_poslovna || '-' || rez.rbr || '-' || rezvsj.id  AS rbr,
      'RESERVED' AS status,
      TO_CHAR (rez.dat_dolaska, 'YYYY-MM-DD') || ' 00:00' AS dat_dolaska,
      TO_CHAR (rez.dat_odlaska, 'YYYY-MM-DD') || ' 00:00' AS dat_odlaska,
      TO_CHAR (NULL) AS unos_dat,
      TO_CHAR (NULL) AS sat_odjave,
      DECODE (INSTR (flex_param_1003_m, 'A'), 0, NULL, TRIM (rez.ime)) AS ime,
      DECODE (INSTR (flex_param_1003_m, 'B'), 0, NULL, TRIM (rez.prezime)) AS prezime,
      TO_CHAR (NULL) AS dat_rodjenja,
      DECODE (INSTR (flex_param_1003_m, 'E'), 0, NULL, zem.sifra_2a) AS zem_sifra_2a,
      rezvsj.br_osoba AS adults,
      rez.ozn_vip AS ozn_vip,
      rez.napomena AS napomena
    FROM
      (
      SELECT id, rez_id, sj_id, br_osoba
        FROM t_rez_vsj
       WHERE sj_id IS NOT NULL
         AND kol_sjz IS NULL -- jo� nije checked in
      UNION
      SELECT recrezsj.id, rezvsj2.rez_id, recrezsj.sj_id, recrezsj.br_osoba
        FROM trec_rez_sj recrezsj,
             t_rez_vsj rezvsj2
       WHERE recrezsj.rezvsj_id = rezvsj2.id
         AND recrezsj.br_osobaz IS NULL -- jo� nije checked in
      ) rezvsj,
      m_sj sj,
      t_rezervacije rez,
      m_so so,
      s_zemlje zem
    WHERE
      rezvsj.rez_id = rez.id
      AND rezvsj.sj_id = sj.id
      AND rez.so_id = so.id
      AND NVL (rez.zem_id, rez.zemd_id) = zem.id(+)
      AND rez.oznaka = 'V'
      AND rez.ozn_vstorna IS NULL
      AND rez.dat_dolaska >= TRUNC (SYSDATE)
      AND pra_zmp_s.oznaka ('P0021', so.sifra) = -1
    UNION
    -- gosti
    SELECT
      0 AS ozn_rez,
      so.sifra AS so_sifra,
      sj.broj AS sj_broj,
      metcvor_rbr_m || '-' || gost.god_poslovna || '-' || gost.rbr AS rbr, -- IRN 2974, IRN 3991
      DECODE (gost.ozn_prisutnosti, 'P', 'CHECKED IN', 'CHECKED OUT') AS status,
      TO_CHAR (gost.dat_dolaska, 'YYYY-MM-DD') || ' 00:00' AS dat_dolaska, -- IRN 3174
      TO_CHAR (gost.dat_odlaska, 'YYYY-MM-DD') || ' 00:00' AS dat_odlaska, -- IRN 3174
      TO_CHAR (gost.unos_dat, 'YYYY-MM-DD HH24:MI') AS unos_dat, -- IRN 3174
      DECODE (gost.ozn_prisutnosti, 'P', NULL, TO_CHAR (gost.sat_odjave, 'YYYY-MM-DD HH24:MI')) AS sat_odjave, -- IRN 3174
      DECODE (INSTR (flex_param_1003_m, 'A'), 0, NULL, TRIM (gost.ime)) AS ime,
      DECODE (INSTR (flex_param_1003_m, 'B'), 0, NULL, TRIM (gost.prezime)) AS prezime,
      TO_CHAR (pra_flexkeeping.dat_rodjenja (flex_param_1003_m, gost.id, gost.dat_dolaska, gost.dat_odlaska), 'YYYY-MM-DD') AS dat_rodjenja,
      DECODE (INSTR (flex_param_1003_m, 'E'), 0, NULL, zem.sifra_2a) AS zem_sifra_2a,
      1 AS adults,
      gost.ozn_vip AS ozn_vip,
      TO_CHAR (NULL) AS napomena
    FROM
      t_gosti gost,
      m_sj sj,
      m_so so,
      s_zemlje zem
    WHERE
      TRUNC (SYSDATE) BETWEEN gost.dat_dolaska AND GREATEST (gost.dat_odlaska, NVL (TRUNC (gost.sat_odjave), gost.dat_odlaska))
      AND NVL (gost.ozn_brisano, 0) = 0
      AND gost.id NOT IN (SELECT id FROM trec_kplovila)
      AND gost.sj_id = sj.id
      AND sj.so_id = so.id
      AND gost.zem_id = zem.id
      AND pra_zmp_s.oznaka ('P0021', so.sifra) = -1 -- IRN 3016
    ORDER BY 1, 2, 3, 4
    )
  LOOP
    APEX_JSON.open_object; -- {
    APEX_JSON.write ('Object', c.so_sifra);
    APEX_JSON.write ('Room', c.sj_broj);
    APEX_JSON.write ('BookingId', c.rbr);
    APEX_JSON.write ('Status', c.status);
    APEX_JSON.write ('Arrival', c.dat_dolaska);
    APEX_JSON.write ('Departure', c.dat_odlaska);
    APEX_JSON.write ('Vip', c.ozn_vip, TRUE);
    APEX_JSON.write ('CheckIn', c.unos_dat, TRUE);
    APEX_JSON.write ('CheckOut', c.sat_odjave, TRUE);
    APEX_JSON.write ('Adults', c.adults);
    IF c.napomena IS NOT NULL THEN
      APEX_JSON.open_array ('Traces'); -- [
      APEX_JSON.open_object; -- {
      APEX_JSON.write ('DepartmentId', 'housekeeping');
      APEX_JSON.write ('Message', c.napomena);
      APEX_JSON.close_object; -- }
      APEX_JSON.close_array; -- ]
    END IF;
    IF c.ozn_rez = -1 THEN
      -- rezervacije
      APEX_JSON.write ('GuestId', TO_CHAR (NULL), TRUE);
    ELSE
      -- gosti
      APEX_JSON.write ('GuestId', c.rbr);
    END IF;
    APEX_JSON.write ('FirstName', c.ime, TRUE);
    APEX_JSON.write ('LastName', c.prezime, TRUE);
    APEX_JSON.write ('BirthDate', c.dat_rodjenja, TRUE);
    APEX_JSON.write ('Country', c.zem_sifra_2a, TRUE);

    APEX_JSON.close_object; -- }

  END LOOP;

  APEX_JSON.close_array; -- ]

  data_m := APEX_JSON.get_clob_output;
  data_m := REPLACE (data_m, CHR(10), ''); -- ukloni suvi�ne CrLf
  data_m := REPLACE (data_m, '},', '},' || CHR(10)); -- jedan zapis u jedan redak
  APEX_JSON.free_output;

  IF data_m IS NULL THEN
    RETURN;
  END IF;

  odgovor_m := NULL;

  zaj_post ('/pms/initialization_booking');

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_INIT_ROOM_STATUS
 IS
-- Initialization Room Status
-- proceduru poziva procedura post2flexkeeping_job
BEGIN

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {InitRoomStatus}';
  -- KRAJ IRN 3991

  APEX_JSON.initialize_clob_output;

  APEX_JSON.open_array; -- [

  FOR c IN (
    SELECT
      so.sifra AS so_sifra,
      sj.broj AS sj_broj,
      so.sifra || '-' || recodr.god_poslovna || '-' || recodr.rbr AS recodr_rbr, -- IRN 2974
      TO_CHAR (recodr.dat_poc, 'YYYY-MM-DD') AS recodr_dat_poc,
      TO_CHAR (recodr.dat_zav, 'YYYY-MM-DD') AS recodr_dat_zav,
      CASE -- 13.8.2018.
        WHEN recodr.dat_poc = recodr.dat_zav AND recodr.dat_zav <= TRUNC (SYSDATE) THEN
          TO_CHAR (recodr.dat_zav, 'YYYY-MM-DD')
        WHEN recodr.dat_poc < recodr.dat_zav AND (recodr.dat_zav - 1) <= TRUNC (SYSDATE) THEN
          TO_CHAR ((recodr.dat_zav - 1), 'YYYY-MM-DD')
        ELSE
          TO_CHAR (NULL)
      END AS completed,
      DECODE (recodr.ozn_i, 2, 'OOS', 3, 'OOO') AS status,
      TRIM (recodr.napomena) AS recodr_napomena
    FROM
      trec_odrzavanje recodr,
      m_sj sj,
      m_so so
    WHERE recodr.oznaka = 'V'
      AND TRUNC (SYSDATE) BETWEEN recodr.dat_poc AND recodr.dat_zav
      AND recodr.sj_id = sj.id
      AND sj.so_id = so.id
      AND recodr.ozn_i IN (2, 3) -- u kvaru ili izvan upotrebe
      AND pra_zmp_s.oznaka ('P0021', so.sifra) = -1 -- IRN 3016
    ORDER BY so.sifra, sj.broj -- IRN 2974
    )
  LOOP
    APEX_JSON.open_object; -- {
    APEX_JSON.write ('Object', c.so_sifra);
    APEX_JSON.write ('Room', c.sj_broj);
    APEX_JSON.write ('RoomStatusId', c.recodr_rbr);
    APEX_JSON.write ('Begin', c.recodr_dat_poc);
    APEX_JSON.write ('End',  c.recodr_dat_zav);
    APEX_JSON.write ('Completed', c.completed, TRUE);
    APEX_JSON.write ('Status', c.status);
    APEX_JSON.write ('Reason', c.recodr_napomena);
    APEX_JSON.close_object; -- }
  END LOOP;

  APEX_JSON.close_array; -- ]

  data_m := APEX_JSON.get_clob_output;
  data_m := REPLACE (data_m, CHR(10), '');
  data_m := REPLACE (data_m, '},', '},' || CHR(10));
  APEX_JSON.free_output;

  IF data_m IS NULL THEN
    RETURN;
  END IF;

  odgovor_m := NULL;

  zaj_post ('/pms/initialization_roomstatus');

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST2FLEXKEEPING_JOB
 (VLASNIKPODATKA_P IN NUMBER := NULL
 )
 IS
-- proceduru poziva JOB
BEGIN
  pra_zmp_context.set_vlasnikpodatka (vlasnikpodatka_p);
  post_init_booking;
  post_init_room_status;
END;
PROCEDURE POST_BOOKING_GOST
 (ZAPIS_P IN tab_t_gosti.gost_rec_type
 )
 IS
-- Booking
-- proceduru pozivaju AIS_T_GOSTI i AUS_T_GOSTI
  CURSOR sj_c (sj_id_k m_sj.id%TYPE) IS
    SELECT so.sifra, sj.broj
      FROM m_sj sj, m_so so
     WHERE sj.id = sj_id_k
       AND sj.so_id = so.id;
  so_sifra_old_l m_so.sifra%TYPE; -- IRN 3991
  sj_broj_old_l  m_sj.broj%TYPE;  -- IRN 3991
BEGIN

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001') = 'nebitno' -- timeout
    OR zapis_p.sj_id_new IS NULL -- IRN 3532
  THEN
    RETURN;
  END IF;

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {Booking}';
  -- KRAJ IRN 3991

  /*
  Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
  D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
  */
  flex_param_1003_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1003');

  opis_m := opis_m || ' [*** post_booking_gost'; -- IRN 3532
  IF INSERTING THEN
    opis_m := opis_m || ' | inserting | '; -- IRN 3532
    NULL;
  ELSIF UPDATING
      AND (
             zapis_p.sj_id_new <> zapis_p.sj_id_old
             -- zapis_p.god_poslovna
             -- zapis_p.rbr
          OR zapis_p.ozn_prisutnosti_new <> zapis_p.ozn_prisutnosti_old
          OR zapis_p.dat_dolaska_new <> zapis_p.dat_dolaska_old
          OR zapis_p.dat_odlaska_new <> zapis_p.dat_odlaska_old
             -- zapis_p.unos_dat
             -- zapis_p.sat_odjave
          OR (zapis_p.ime_new <> zapis_p.ime_old AND INSTR (flex_param_1003_m, 'A') > 0)
          OR (zapis_p.prezime_new <> zapis_p.prezime_old AND INSTR (flex_param_1003_m, 'B') > 0)
             -- zapis_p.gost_id
          OR (zapis_p.zem_id_new <> zapis_p.zem_id_old AND INSTR (flex_param_1003_m, 'E') > 0)
          OR NVL (zapis_p.ozn_vip_new, '�') <> NVL (zapis_p.ozn_vip_old, '�')
          )
  THEN
    opis_m := opis_m || ' | updating | '; -- IRN 3532
    NULL;
  ELSE
    RETURN;
  END IF;
  opis_m := opis_m || zmp_zaj.korisnik (-1) || ' | ' || zapis_p.ime_new || ' | ' || zapis_p.prezime_new || ']'; -- IRN 3532

  booking_rec_m := NULL;

  OPEN sj_c (zapis_p.sj_id_new);
  FETCH sj_c INTO booking_rec_m.ObjectF, booking_rec_m.Room;
  CLOSE sj_c;

  IF booking_rec_m.ObjectF IS NULL
    OR (INSERTING AND pra_zmp_s.oznaka ('P0021', booking_rec_m.ObjectF) = 0)
  THEN
    RETURN; -- podaci za promatrani SO ne �alju se u Flexkeeping
  END IF;

  IF UPDATING THEN
    OPEN sj_c (zapis_p.sj_id_old);
    FETCH sj_c INTO so_sifra_old_l, sj_broj_old_l;
    CLOSE sj_c;
    IF so_sifra_old_l IS NULL
      OR (pra_zmp_s.oznaka ('P0021', so_sifra_old_l) = 0
          AND pra_zmp_s.oznaka ('P0021', booking_rec_m.ObjectF) = 0)
    THEN
      RETURN; -- podaci za promatrane SO ne �alju se u Flexkeeping
    END IF;
  END IF;

  metcvor_rbr_m := pra_zmp_zaj.tekuci_cvor_rbr; -- IRN 3991
  booking_rec_m.BookingId := metcvor_rbr_m || '-' || zapis_p.god_poslovna || '-' || zapis_p.rbr; -- IRN 3991
  IF UPDATING AND pra_zmp_s.oznaka ('P0021', booking_rec_m.ObjectF) = 0 THEN -- IRN 3991
    -- odjavi gosta iz stare SJ jer seli u ne-Flex SJ
    booking_rec_m.ObjectF := so_sifra_old_l;
    booking_rec_m.Room := sj_broj_old_l;
    booking_rec_m.Status := 'CHECKED OUT';
    booking_rec_m.CheckOut := TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI');
    booking_rec_m.Departure := TO_CHAR (SYSDATE, 'YYYY-MM-DD') || ' 00:00';
  ELSE
    IF zapis_p.ozn_prisutnosti_new = 'P' THEN
      booking_rec_m.Status := 'CHECKED IN';
    ELSE
      booking_rec_m.Status := 'CHECKED OUT';
      booking_rec_m.CheckOut := TO_CHAR (zapis_p.sat_odjave, 'YYYY-MM-DD HH24:MI');
    END IF;
    booking_rec_m.Departure := TO_CHAR (zapis_p.dat_odlaska_new, 'YYYY-MM-DD') || ' 00:00';
  END IF;
  booking_rec_m.Arrival := TO_CHAR (zapis_p.dat_dolaska_new, 'YYYY-MM-DD') || ' 00:00';
  booking_rec_m.Vip := zapis_p.ozn_vip_new;
  booking_rec_m.CheckIn := TO_CHAR (zapis_p.unos_dat, 'YYYY-MM-DD HH24:MI');
  booking_rec_m.Adults := 1;
  -- Guests
  booking_rec_m.GuestId := metcvor_rbr_m || '-' || zapis_p.god_poslovna || '-' || zapis_p.rbr; -- IRN 3991
  IF INSTR (flex_param_1003_m, 'A') > 0 THEN
    booking_rec_m.FirstName := TRIM (zapis_p.ime_new);
  END IF;
  IF INSTR (flex_param_1003_m, 'B') > 0 THEN
    booking_rec_m.LastName := TRIM (zapis_p.prezime_new);
  END IF;
  IF UPDATING THEN
    booking_rec_m.BirthDate := TO_CHAR (pra_flexkeeping.dat_rodjenja (flex_param_1003_m, zapis_p.gost_id, zapis_p.dat_dolaska_new, zapis_p.dat_odlaska_new), 'YYYY-MM-DD');
  END IF;
  IF INSTR (flex_param_1003_m, 'E') > 0 THEN
    SELECT MIN (sifra_2a) INTO booking_rec_m.Country FROM s_zemlje WHERE id = zapis_p.zem_id_new;
  END IF;

  post_booking_zaj (NULL);

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_BOOKING_KGOST
 (GOST_ID_NEW_P IN t_gosti.id%TYPE
 ,GOST_ID_OLD_P IN t_gosti.id%TYPE
 ,DAT_RODJENJA_NEW_P IN t_kgostiju.dat_rodjenja%TYPE
 ,DAT_RODJENJA_OLD_P IN t_kgostiju.dat_rodjenja%TYPE
 )
 IS
-- Booking
-- proceduru pozivaju AIS_T_KGOSTIJU i AUS_T_KGOSTIJU
  dat_null_l DATE := TO_DATE ('01.01.1800', 'DD.MM.RRRR');

  CURSOR gost_c (gost_id_k IN t_gosti.id%TYPE) IS
    SELECT dat_dolaska, dat_odlaska
      FROM t_gosti
     WHERE id = gost_id_k;
  dat_dolaska_l t_gosti.dat_dolaska%TYPE;
  dat_odlaska_l t_gosti.dat_odlaska%TYPE;
BEGIN

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001') = 'nebitno' -- timeout
    OR gost_id_new_p IS NULL
  THEN
    RETURN;
  END IF;

  /*
  Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
  D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
  */
  flex_param_1003_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1003');
  IF INSTR (flex_param_1003_m, 'C') = 0 AND INSTR (flex_param_1003_m, 'D') = 0 THEN
    RETURN;
  END IF;

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {Booking}';
  -- KRAJ IRN 3991

  opis_m := opis_m || ' [*** post_booking_kgost'; -- IRN 3532, IRN 3991

  booking_rec_m := NULL;

  IF INSERTING THEN
    opis_m := opis_m || ' | inserting | '; -- IRN 3532
    IF dat_rodjenja_new_p IS NULL THEN
      RETURN;
    END IF;
    IF INSTR (flex_param_1003_m, 'D') > 0 THEN
      OPEN gost_c (gost_id_new_p);
      FETCH gost_c INTO dat_dolaska_l, dat_odlaska_l;
      CLOSE gost_c;
      IF dat_dolaska_l IS NULL OR dat_odlaska_l IS NULL THEN
        RETURN;
      END IF;
      IF ADD_MONTHS (dat_rodjenja_new_p, (pra_rec_s3.dob (dat_rodjenja_new_p, (dat_dolaska_l - 1)) + 1) * 12)
        BETWEEN dat_dolaska_l AND dat_odlaska_l
      THEN
        NULL;
      ELSE
        RETURN;
      END IF;
    ELSE
      NULL;
    END IF;
  ELSIF UPDATING
    AND (
           gost_id_new_p <> gost_id_old_p -- IRN 3991 ne ra�unam da �e se promjena gost_id zaista dogoditi
        OR NVL (dat_rodjenja_new_p, dat_null_l) <> NVL (dat_rodjenja_old_p, dat_null_l)
        )
  THEN
    opis_m := opis_m || ' | updating | '; -- IRN 3532
    NULL;
  ELSE
    RETURN;
  END IF;
  opis_m := opis_m || zmp_zaj.korisnik (-1) || ' | ' || TO_CHAR (dat_rodjenja_new_p, 'DD.MM.RRRR') || ' | ' || TO_CHAR (dat_rodjenja_old_p, 'DD.MM.RRRR') || ']'; -- IRN 3532

  FOR c IN ( -- izvede se samo jednom
    SELECT
      so.sifra AS so_sifra,
      sj.broj AS sj_broj,
      pra_zmp_zaj.tekuci_cvor_rbr || '-' || gost.god_poslovna || '-' || gost.rbr AS BookingId, -- IRN 2974, IRN 3991
      DECODE (gost.ozn_prisutnosti, 'P', 'CHECKED IN', 'CHECKED OUT') AS Status,
      TO_CHAR (gost.dat_dolaska, 'YYYY-MM-DD') || ' 00:00' AS Arrival, -- IRN 3174
      TO_CHAR (gost.dat_odlaska, 'YYYY-MM-DD') || ' 00:00' AS Departure, -- IRN 3174
      gost.ozn_vip AS Vip,
      TO_CHAR (gost.unos_dat, 'YYYY-MM-DD HH24:MI') AS CheckIn, -- IRN 3174
      DECODE (gost.ozn_prisutnosti, 'P', NULL, TO_CHAR (gost.sat_odjave, 'YYYY-MM-DD HH24:MI')) AS CheckOut, -- IRN 3174
      1 AS Adults,
      pra_zmp_zaj.tekuci_cvor_rbr || '-' || gost.god_poslovna || '-' || gost.rbr AS GuestId, -- IRN 2974, IRN 3991
      DECODE (INSTR (flex_param_1003_m, 'A'), 0, NULL, TRIM (gost.ime)) AS FirstName,
      DECODE (INSTR (flex_param_1003_m, 'B'), 0, NULL, TRIM (gost.prezime)) AS LastName,
      TO_CHAR (pra_flexkeeping.dat_rodjenja (flex_param_1003_m, gost_id_new_p, gost.dat_dolaska, gost.dat_odlaska, dat_rodjenja_new_p), 'YYYY-MM-DD') AS BirthDate,
      DECODE (INSTR (flex_param_1003_m, 'E'), 0, NULL, zem.sifra_2a) AS Country
    FROM
      t_gosti gost,
      m_sj sj,
      m_so so,
      s_zemlje zem
    WHERE
      gost.id = gost_id_new_p
      AND gost.sj_id = sj.id
      AND sj.so_id = so.id
      AND gost.zem_id = zem.id
      AND TRUNC (SYSDATE) BETWEEN gost.dat_dolaska AND gost.dat_odlaska
      AND pra_zmp_s.oznaka ('P0021', so.sifra) = -1 -- IRN 3016
    )
  LOOP
    booking_rec_m.ObjectF := c.so_sifra;
    booking_rec_m.Room := c.sj_broj;
    booking_rec_m.BookingId := c.BookingId;
    booking_rec_m.Status := c.Status;
    booking_rec_m.Arrival := c.Arrival;
    booking_rec_m.Departure := c.Departure;
    booking_rec_m.Vip := c.Vip;
    booking_rec_m.CheckIn := c.CheckIn;
    booking_rec_m.CheckOut := c.CheckOut;
    booking_rec_m.Adults := c.Adults;
    booking_rec_m.GuestId := c.GuestId;
    booking_rec_m.FirstName := c.FirstName;
    booking_rec_m.LastName := c.LastName;
    booking_rec_m.BirthDate := c.BirthDate;
    booking_rec_m.Country := c.Country;
    post_booking_zaj (NULL);
  END LOOP;

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_ROOM_STATUS
 (SJ_ID_P IN trec_odrzavanje.sj_id%TYPE
 ,GOD_POSLOVNA_P IN trec_odrzavanje.god_poslovna%TYPE
 ,RBR_P IN trec_odrzavanje.rbr%TYPE
 ,DAT_POC_P IN trec_odrzavanje.dat_poc%TYPE
 ,DAT_ZAV_P IN trec_odrzavanje.dat_zav%TYPE
 ,OZNAKA_P IN trec_odrzavanje.oznaka%TYPE
 ,OZN_I_P IN trec_odrzavanje.ozn_i%TYPE
 ,NAPOMENA_P IN trec_odrzavanje.napomena%TYPE
 )
 IS
-- Room Status
-- proceduru pozivaju AIS_TREC_ODRZAVANJE i AUS_TREC_ODRZAVANJE

  completed_l VARCHAR2(10); -- 13.08.2018.
BEGIN

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001') = 'nebitno' -- timeout
  THEN
    RETURN;
  END IF;

  IF sj_id_p IS NULL
    OR god_poslovna_p IS NULL
    OR rbr_p IS NULL
    OR dat_poc_p IS NULL
    OR dat_zav_p IS NULL
    OR oznaka_p IS NULL
    OR ozn_i_p NOT IN (2, 3) -- u kvaru ili izvan upotrebe
    -- napomena_p
  THEN
    RETURN;
  END IF;

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {RoomStatus}';
  -- KRAJ IRN 3991

  IF oznaka_p = 'V' THEN -- 13.08.2018.
    IF dat_poc_p = dat_zav_p AND dat_zav_p <= TRUNC (SYSDATE) THEN
      completed_l := TO_CHAR (dat_zav_p, 'YYYY-MM-DD');
    ELSIF dat_poc_p < dat_zav_p AND (dat_zav_p - 1) <= TRUNC (SYSDATE) THEN
      completed_l := TO_CHAR ((dat_zav_p - 1), 'YYYY-MM-DD');
    END IF;
  ELSE
    completed_l := TO_CHAR (SYSDATE, 'YYYY-MM-DD');
  END IF;

  APEX_JSON.initialize_clob_output;

  APEX_JSON.open_array; -- [

  FOR c IN (
    SELECT
      so.sifra AS so_sifra,
      sj.broj AS Room,
      so.sifra || '-' || god_poslovna_p || '-' || rbr_p AS RoomStatusId, -- IRN 2974
      TO_CHAR (dat_poc_p, 'YYYY-MM-DD') AS dat_poc,
      TO_CHAR (dat_zav_p, 'YYYY-MM-DD') AS dat_zav,
      completed_l AS Completed, -- 13.08.2018.
      DECODE (ozn_i_p, 2, 'OOS', 3, 'OOO') AS Status,
      TRIM (napomena_p) AS Reason
    FROM
      m_sj sj,
      m_so so
    WHERE
      sj.id = sj_id_p
      AND sj.so_id = so.id
      AND pra_zmp_s.oznaka ('P0021', so.sifra) = -1 -- IRN 3016
    )
  LOOP
    APEX_JSON.open_object; -- {
    APEX_JSON.write ('Object', c.so_sifra);
    APEX_JSON.write ('Room', c.Room);
    APEX_JSON.write ('RoomStatusId', c.RoomStatusId);
    APEX_JSON.write ('Begin', c.dat_poc);
    APEX_JSON.write ('End', c.dat_zav);
    APEX_JSON.write ('Completed', c.Completed, TRUE);
    APEX_JSON.write ('Status', c.Status);
    APEX_JSON.write ('Reason', c.Reason);
    APEX_JSON.close_object; -- }
  END LOOP;

  APEX_JSON.close_array; -- ]

  data_m := APEX_JSON.get_clob_output;
  data_m := REPLACE (data_m, CHR(10), '');
  data_m := REPLACE (data_m, '},', '},' || CHR(10));
  APEX_JSON.free_output;

  IF data_m IS NULL THEN
    RETURN;
  END IF;

  odgovor_m := NULL;

  zaj_post ('/pms/roomstatus');

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_BOOKING_ZAJ
 (SJ_ID_P IN m_sj.id%TYPE
 )
 IS
-- IRN 3625
-- poziva se iz post_booking_gost, post_booking_kgost, post_booking_rezsj i post_booking_rez
BEGIN

  IF sj_id_p IS NOT NULL THEN
    SELECT MIN (broj) INTO booking_rec_m.Room FROM m_sj WHERE id = sj_id_p;
  END IF;

  APEX_JSON.initialize_clob_output;
  APEX_JSON.open_array; -- [
  APEX_JSON.open_object; -- {

  APEX_JSON.write ('Object', booking_rec_m.ObjectF);
  APEX_JSON.write ('Room', booking_rec_m.Room);
  APEX_JSON.write ('BookingId', booking_rec_m.BookingId);
  APEX_JSON.write ('Status', booking_rec_m.Status);
  APEX_JSON.write ('Arrival', booking_rec_m.Arrival);
  APEX_JSON.write ('Departure', booking_rec_m.Departure);
  APEX_JSON.write ('Vip', booking_rec_m.Vip, TRUE);
  APEX_JSON.write ('CheckIn', booking_rec_m.CheckIn, TRUE);
  APEX_JSON.write ('CheckOut', booking_rec_m.CheckOut, TRUE);
  APEX_JSON.write ('Adults', booking_rec_m.Adults);
  IF booking_rec_m.Message IS NOT NULL THEN
    APEX_JSON.open_array ('Traces'); -- [
    APEX_JSON.open_object; -- {
    APEX_JSON.write ('DepartmentId', 'housekeeping');
    APEX_JSON.write ('Message', booking_rec_m.Message);
    APEX_JSON.close_object; -- }
    APEX_JSON.close_array; -- ]
  END IF;
  -- Guests
  APEX_JSON.write ('GuestId', booking_rec_m.GuestId, TRUE);
  APEX_JSON.write ('FirstName', booking_rec_m.FirstName, TRUE);
  APEX_JSON.write ('LastName', booking_rec_m.LastName, TRUE);
  APEX_JSON.write ('BirthDate', booking_rec_m.BirthDate, TRUE);
  APEX_JSON.write ('Country', booking_rec_m.Country, TRUE);

  APEX_JSON.close_object; -- }
  APEX_JSON.close_array; -- ]

  data_m := APEX_JSON.get_clob_output;
  data_m := REPLACE (data_m, CHR(10), '');
  data_m := REPLACE (data_m, '},', '},' || CHR(10));
  APEX_JSON.free_output;

  IF data_m IS NULL THEN
    RETURN;
  END IF;

  odgovor_m := NULL;

  zaj_post ('/pms/booking');

END;
PROCEDURE POST_BOOKING_REZSJ
 (ZAPIS_P IN rezsj_rec_type
 )
 IS
-- IRN 3625; Booking - Arrivals
-- proceduru pozivaju AIS/AUS/ADS tablica T_REZ_VSJ i TREC_REZ_SJ
  opis_end_l VARCHAR2(100);
BEGIN

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001') = 'nebitno' THEN -- timeout
    RETURN;
  END IF;

  booking_rec_m := NULL;

  SELECT MIN (sifra) INTO booking_rec_m.ObjectF FROM m_so WHERE id = zapis_p.rez_row.so_id;
  IF booking_rec_m.ObjectF IS NULL
    OR pra_zmp_s.oznaka ('P0021', booking_rec_m.ObjectF) = 0
  THEN
    RETURN; -- podaci za promatrani SO ne �alju se u Flexkeeping
  END IF;

  IF zapis_p.rez_row.dat_dolaska < TRUNC (SYSDATE) THEN
    RETURN; -- podaci za dolaske prije teku�eg datuma ne �alju se u Flexkeeping
  END IF;

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {Booking}';
  -- KRAJ IRN 3991

  /*
  Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
  D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
  */
  flex_param_1003_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1003');
  IF INSTR (flex_param_1003_m, 'A') > 0 THEN
    booking_rec_m.FirstName := TRIM (zapis_p.rez_row.ime);
  END IF;
  IF INSTR (flex_param_1003_m, 'B') > 0 THEN
    booking_rec_m.LastName := TRIM (zapis_p.rez_row.prezime);
  END IF;
  IF INSTR (flex_param_1003_m, 'E') > 0 THEN
    SELECT MIN (sifra_2a) INTO booking_rec_m.Country
      FROM s_zemlje
     WHERE id = NVL (zapis_p.rez_row.zem_id, zapis_p.rez_row.zemd_id);
  END IF;

  opis_m := opis_m || ' [*** post_booking_rez'; -- IRN 3991
  opis_end_l := zmp_zaj.korisnik (-1) || ' | ' || zapis_p.rez_row.ime || ' | ' || zapis_p.rez_row.prezime || ']';

  booking_rec_m.BookingId := booking_rec_m.ObjectF || '-' || zapis_p.rez_row.god_poslovna || '-' || zapis_p.rez_row.rbr || '-' || zapis_p.id;
  booking_rec_m.Arrival := TO_CHAR (zapis_p.rez_row.dat_dolaska, 'YYYY-MM-DD') || ' 00:00';
  booking_rec_m.Departure := TO_CHAR (zapis_p.rez_row.dat_odlaska, 'YYYY-MM-DD') || ' 00:00';
  booking_rec_m.Vip := zapis_p.rez_row.ozn_vip;
  booking_rec_m.Adults := zapis_p.br_osoba;
  booking_rec_m.Message := zapis_p.rez_row.napomena;

  IF INSERTING AND zapis_p.sj_id_new IS NOT NULL THEN
    opis_m := opis_m || ' | inserting | ' || opis_end_l;
    booking_rec_m.Status := 'RESERVED';
    post_booking_zaj (zapis_p.sj_id_new);
  ELSIF UPDATING THEN
    -- BUR stvori zapis samo ako su se mijenjali sj_id ili br_osoba 
    opis_m := opis_m || ' | updating | ' || opis_end_l;
    IF zapis_p.sj_id_old IS NOT NULL AND zapis_p.sj_id_new IS NULL THEN
      booking_rec_m.Status := 'CANCELLED';
      post_booking_zaj (zapis_p.sj_id_old);
    END IF;
    IF zapis_p.sj_id_new IS NOT NULL THEN
      booking_rec_m.Status := 'RESERVED';
      post_booking_zaj (zapis_p.sj_id_new);
    END IF;
  ELSIF DELETING AND zapis_p.sj_id_old IS NOT NULL THEN
    opis_m := opis_m || ' | deleting | ' || opis_end_l;
    booking_rec_m.Status := 'CANCELLED';
    post_booking_zaj (zapis_p.sj_id_old);
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;
PROCEDURE POST_BOOKING_REZ
 (ZAPIS_P IN tab_t_rezervacije_flex.rez_rec_type
 )
 IS
-- IRN 3625
-- poziva se iz AUS_T_REZERVACIJE
  BookingId_l VARCHAR2(100);
BEGIN

  IF pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1001') = 'nebitno' THEN -- timeout
    RETURN;
  END IF;

  booking_rec_m := NULL;

  SELECT MIN (sifra) INTO booking_rec_m.ObjectF FROM m_so WHERE id = zapis_p.rez_row_new.so_id;
  IF booking_rec_m.ObjectF IS NULL
    OR pra_zmp_s.oznaka ('P0021', booking_rec_m.ObjectF) = 0
  THEN
    RETURN; -- podaci za promatrani SO ne �alju se u Flexkeeping
  END IF;
  
  IF zapis_p.rez_row_new.dat_dolaska < TRUNC (SYSDATE)
    AND zapis_p.rez_row_old.dat_dolaska < TRUNC (SYSDATE)
  THEN
    RETURN;
  END IF;

  -- IRN 3991
  log_file_name_m := 'flexkeeping-' || TO_CHAR (SYSDATE, 'RRRR-MM-DD') || '.log';
  opis_m := '[' || TO_CHAR (SYSDATE, 'DD.MM.RRRR HH24:MI:SS') || '] {Booking}';
  -- KRAJ IRN 3991

  /*
  Oznake podataka koje MISH �alje servisu Flexkeeping: A = ime, B = prezime, C = datum ro�enja,
  D = datum ro�enja (samo za ro�endane u vrijeme boravka), E = dr�avljanstvo ili nebitno.
  */
  flex_param_1003_m := pra_zmp_zaj.zmppar_vrijednost ('FLEX', '1003');

  IF zapis_p.rez_row_new.oznaka <> zapis_p.rez_row_old.oznaka
    OR NVL (zapis_p.rez_row_new.ozn_vstorna, 0) <> NVL (zapis_p.rez_row_old.ozn_vstorna, 0)
    OR zapis_p.rez_row_new.dat_dolaska <> zapis_p.rez_row_old.dat_dolaska
    OR zapis_p.rez_row_new.dat_odlaska <> zapis_p.rez_row_old.dat_odlaska
    OR (NVL (zapis_p.rez_row_new.ime, '�') <> NVL (zapis_p.rez_row_old.ime, '�') AND INSTR (flex_param_1003_m, 'A') > 0)
    OR (zapis_p.rez_row_new.prezime <> zapis_p.rez_row_old.prezime AND INSTR (flex_param_1003_m, 'B') > 0)
    OR (NVL (zapis_p.rez_row_new.zem_id, 0) <> NVL (zapis_p.rez_row_old.zem_id, 0) AND INSTR (flex_param_1003_m, 'E') > 0)
    OR (NVL (zapis_p.rez_row_new.zemd_id, 0) <> NVL (zapis_p.rez_row_old.zemd_id, 0) AND INSTR (flex_param_1003_m, 'E') > 0)
    OR NVL (zapis_p.rez_row_new.ozn_vip, '�') <> NVL (zapis_p.rez_row_old.ozn_vip, '�')
    OR NVL (zapis_p.rez_row_new.napomena, '�') <> NVL (zapis_p.rez_row_old.napomena, '�')
  THEN

    IF INSTR (flex_param_1003_m, 'A') > 0 THEN
      booking_rec_m.FirstName := TRIM (TRANSLATE (zapis_p.rez_row_new.ime, ' ''";:{}\<&', ' '));
    END IF;
    IF INSTR (flex_param_1003_m, 'B') > 0 THEN
      booking_rec_m.LastName := TRIM (TRANSLATE (zapis_p.rez_row_new.prezime, ' ''";:{}\<&', ' '));
    END IF;
    IF INSTR (flex_param_1003_m, 'E') > 0 THEN
      SELECT MIN (sifra_2a) INTO booking_rec_m.Country
        FROM s_zemlje
       WHERE id = NVL (zapis_p.rez_row_new.zem_id, zapis_p.rez_row_new.zemd_id);
    END IF;

    opis_m := opis_m || ' [*** post_booking_rez' || ' | updating | ' || zmp_zaj.korisnik (-1) || ' | ' || zapis_p.rez_row_new.ime || ' | ' || zapis_p.rez_row_new.prezime || ']';

    BookingId_l := booking_rec_m.ObjectF || '-' || zapis_p.rez_row_new.god_poslovna || '-' || zapis_p.rez_row_new.rbr;
    IF zapis_p.rez_row_new.oznaka = 'V' AND zapis_p.rez_row_new.ozn_vstorna IS NULL THEN
      booking_rec_m.Status := 'RESERVED';
    ELSIF zapis_p.rez_row_new.oznaka = 'P'
      OR (zapis_p.rez_row_old.dat_dolaska >= TRUNC (SYSDATE) AND zapis_p.rez_row_new.dat_dolaska < TRUNC (SYSDATE))
    THEN
      booking_rec_m.Status := 'CANCELLED';
    ELSIF zapis_p.rez_row_new.ozn_vstorna = '3' THEN
      booking_rec_m.Status := 'NO SHOW';
    END IF;
    booking_rec_m.Arrival := TO_CHAR (zapis_p.rez_row_new.dat_dolaska, 'YYYY-MM-DD') || ' 00:00';
    booking_rec_m.Departure := TO_CHAR (zapis_p.rez_row_new.dat_odlaska, 'YYYY-MM-DD') || ' 00:00';
    booking_rec_m.Vip := zapis_p.rez_row_new.ozn_vip;
    booking_rec_m.Message := zapis_p.rez_row_new.napomena;

    FOR rezvsj_c IN (
      SELECT id, sj_id, br_osoba
        FROM t_rez_vsj
       WHERE rez_id = zapis_p.rez_row_new.id
         AND br_osobaz IS NULL)
    LOOP
      IF rezvsj_c.sj_id IS NOT NULL THEN
        booking_rec_m.BookingId := BookingId_l || '-' || rezvsj_c.id;
        booking_rec_m.Adults := rezvsj_c.br_osoba;
        post_booking_zaj (rezvsj_c.sj_id);
      END IF;
      FOR recrezsj_c IN (
        SELECT id, sj_id, br_osoba
          FROM trec_rez_sj
         WHERE rezvsj_id = rezvsj_c.id
           AND br_osobaz IS NULL)
      LOOP
        booking_rec_m.BookingId := BookingId_l || '-' || recrezsj_c.id;
        booking_rec_m.Adults := recrezsj_c.br_osoba;
        post_booking_zaj (recrezsj_c.sj_id);
      END LOOP;
    END LOOP;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    pra_pka2.clob_to_table (opis_m || CHR(10) || SQLERRM || CHR(10) || CHR(10), log_file_name_m, NULL, 'FLEX'); -- IRN 3991
END;

END PRA_FLEXKEEPING;
/
SHOW ERROR