· 10 years ago · Apr 11, 2016, 02:06 PM
1BEN INTERFACY
2VÅ¡echny interfacy mezi BEN a Benefity.cz jsou posÃlány pÅ™es HTTPS. Je tÅ™eba zajistit takové Å™eÅ¡enÃ, u které nebude možné se zvenÄà dostat do HR systému.
3• BEN-MAGMA
41 Navedenà bodů do Ben
5Jednou za mÄ›sÃc se z Magmy do Bena navádà maximum bodů, na které má zamÄ›stnanec nárok. Hodnota se skládá ze třà složek (docházka, seniorita a nevim). PÅ™enos zajišťuje procedura „Ben_Elanor_Import_Bodyâ€
6Přenášà se:
7PID (number 12) – identifikátor zaměstnance
8DATUM_DO (DATE DD.MM.YYYY) –platnost benefitu do
9DATUM_OD (DATE DD.MM.YYYY) –platnost benefitu od
10JMENO (varchar2 30B) – jméno zamce
11PRIJMENI (varchar2 50B) – pÅ™Ãjmenà zamce
12OBDOBI (number 6) – zúÄtovacà obdobÃ
13BODY_CELKEM (number 7) – poÄet bodů
14C_SJ (Char 3B) – ÄÃslo správnà jednotky = 1
15PLATNOST_PV_OD (DATE DD.MM.YYYY) – platnost PV zamce od
16PLATNOST_PV_DO (DATE DD.MM.YYYY) – platnost PV zamce do
17Body jsou na stranÄ› Magmy ve view „BEN_V_BODY“, ze kterého si Ben navede body za zúÄtovacà obdobà do tabulky BENSALDO (do této tabulky se po akci uživatele jednou mÄ›sÃÄnÄ› promÃtnou také dlouhodobé benefity a automaticky ÄerpánÃ).
18Procedura je v pÅ™Ãloze 1
192 Navedenà Äerpánà bodů do Magma
20Jednou mÄ›sÃÄnÄ› uživatel v prostÅ™edà Ben vygeneruje soubor s mÄ›sÃÄnÃm ÄerpánÃm vÅ¡ech zamÄ›stnanců a tento soubor importuje do Magma.
213 Navedenà seznamu zamÄ›stnanců do BEN – neruÅ¡it, využÃvá modul BYTY v BEN!!!
22Každých 5 minut se synchronizuje seznam zamÄ›stnanců mezi Magma a Ben. Seznam zamců je na stranÄ› Magmy ve view „Ben_v“. V pÅ™ÃpadÄ› zmÄ›n Ben updatuje tabulku „BENZAMESTNANCI“.
23• MAGMA-BENEFITY.CZ
244 Navedenà seznamu zaměstnanců do Benefity.cz
25Každý den dvakrát dennÄ› Magma generuje seznam zamÄ›stnanců v souboru „zam_export.csv“ na server HRIS. Odtud se pravidelnou úlohou posÃlá soubor na benefity.cz
26• BEN – BENEFITY.CZ
275 Navedenà Äerpánà bodů do BEN
28Každých 15 minut se do Ben navádà Äerpánà bodů pomocà procedury BENEFITYCZ_PKG.IMPORT.
29BEN z adresy https://online.benefity.cz:443/tpca/prov/ pomocà php metod z benefity.cz stahuje jednotlivé záznamy. K tomuto potÅ™ebuje credentials (wallet), které jsou umÃstÄ›né na serveru BEN.
30Importujà se:
31IMP_DAVKA (number) – identifikátor dávky
32ID_TRANSAKCE (number) – internà transakce v benefity.cz
33DATUM_TRANSAKCE (DATE) – datum transakce
34PID (number 12) – ID zamce
35CASTKA (number) – poÄet Äerpaných bodů
36POUZITO (varchar2 1B) - A/N: Indikuje, zda byla transakce převzata z importu do BEN
37KOEF_DAN_ZATEZE (varchar2 16B)- Z1,Z2 a podobnÄ›
38SKUPINA_BENEFITU (varchar2 256B) – textový popis skupiny benefitu např. „ZP - lékárny, prevence, rehabilitace, masáže“
39Procedura je v pÅ™Ãloze 2
406 Navedenà nároku na body a dlouhodobé benefity na Benefity.cz
41Jednou mÄ›sÃÄnÄ› se po uživatelské akci v BEN posÃlajà na benefity.cz nárok na body a dlouhodobé benefity pomocà procedury BENEFITYCZ_PKG.EXPORT
42BEN pomocà php metod z benefit.cz posÃlá záznamy na adresu https://online.benefity.cz:443/tpca/prov/ . K tomuto potÅ™ebuje credentials (wallet), které jsou umÃstÄ›né na serveru BEN.
43Exportujà se:
44ID_TRANSAKCE (number) - internà transakce v benefity.cz
45PID (number 12) – ID zamce
46POCET_BODU (number) – poÄet bodů (může kladé i záporné ÄÃslo)
47DATUM_TRANSAKCE (DATE,DD.MM.YYYY) – datum transakce
48Procedura je v pÅ™Ãloze 3
497 Navedenà nároku na body a dlouhodobé benefity na Benefity.cz (-200)
50Každý den ve 22.00 se z BEN posÃlajà na benefity.cz nárok na body a dlouhodobé benefity pomocà procedury BENEFITYCZ_PKG.EXPORT_BODY
51BEN pomocà php metod z benefit.cz posÃlá záznamy na adresu https://online.benefity.cz:443/tpca/prov/ . K tomuto potÅ™ebuje credentials (wallet), které jsou umÃstÄ›né na serveru BEN.
52Exportujà se:
53PID (number 12) – ID zamce
54MAX_BODY (number) – nárok na poÄet bodů (může kladé i záporné ÄÃslo)
55XBODY (number) – dlouhodobý benefit
56Procedura je v PÅ™Ãloze 4
57
58
59
60 
61PÅ™Ãloha 1
62CREATE OR REPLACE PROCEDURE BEN.Ben_Elanor_Import_Body IS
63
64 CURSOR import_body(OBDOBI_RRRRMM in Varchar2) IS
65 SELECT distinct Z.PID, Z.DATUM_DO, Z.jmeno, Z.prijmeni, Z.OBDOBI, Z.BODY_CELKEM
66 FROM BEN_V_BODY@mz_0010 Z, BENZAMESTNANCI BZ
67 WHERE Z.C_SJ = 1
68 AND Z.PID = BZ.PID
69 AND Z.obdobi = OBDOBI_RRRRMM
70 AND OBDOBI_RRRRMM BETWEEN to_char(Z.datum_od,'YYYYMM') AND to_char(Z.datum_do,'YYYYMM')
71 AND OBDOBI_RRRRMM BETWEEN to_char(Z.PLATNOST_PV_OD,'YYYYMM') AND to_char(Z.PLATNOST_PV_DO,'YYYYMM')
72 AND not exists (select 'X' from BENSALDO S
73 where S.PID = BZ.PID
74 and S.ID_VOBD = OBDOBI_RRRRMM
75 AND S.BENEFIT = 117)
76 ORDER BY Z.PID asc, Z.DATUM_DO desc;
77 cnt NUMBER; -- poÄet nových záznamů
78 obdobi NUMBER; -- aktuálnà obdobÃ
79 saldo Number; -- aktuálnà saldo pro daný PID;
80
81BEGIN
82 cnt := 0;
83 Ben_Error_Log_Write('Ben_Elanor_Import_Body',
84 'SpouÅ¡tÃm algoritmus',
85 NULL, 'I');
86 LOCK TABLE BENSALDO IN EXCLUSIVE MODE NOWAIT;
87 select AKTUALNI_ID_VOBD into obdobi from benkst where rownum=1;
88 FOR x IN import_body(obdobi) LOOP
89 -- Zjisti předchozà saldo:
90 saldo := 0;
91 begin
92 select S.SALDO into saldo
93 from (select max(id) id from BENSALDO where PID = x.PID) M,
94 (select id, saldo from BENSALDO where PID = x.PID) S
95 where M.ID = S.ID;
96 exception when others then null;
97 end;
98 -- Vlož záznam:
99 BEGIN
100 insert into BENSALDO
101 (PID, BENEFIT, ID_VOBD, PORADI, POCET_BODU, SALDO, DATUM_TRANSAKCE, ZDROJ)
102 values(x.PID, 117, x.OBDOBI, 1, x.BODY_CELKEM, x.BODY_CELKEM + nvl(saldo,0),
103 sysdate, 'Ben_Elanor_Import_Body');
104 cnt := cnt + 1;
105 EXCEPTION WHEN dup_val_on_index THEN null;
106 END;
107 END LOOP;
108 IF cnt > 0 THEN
109 Ben_Error_Log_Write('Ben_Elanor_Import_Body',
110 'PoÄet nových záznamů: '||TO_CHAR(cnt),
111 NULL, 'U');
112 Ben_Error_Log_Write('Ben_Elanor_Import_Body',
113 'Import z Elanoru ukonÄen bez chyb.',
114 NULL, 'U');
115 ELSE
116 Ben_Error_Log_Write(NULL, NULL, NULL, 'D');
117 Ben_Error_Log_Write('Ben_Elanor_Import_Body',
118 'Žádná nová data',
119 NULL, 'I');
120 END IF;
121EXCEPTION
122 WHEN OTHERS THEN
123 Ben_Error_Log_Write('Ben_Elanor_Import_Body',
124 'Import z Elanoru ukonÄen s chybou.',
125 SQLERRM, 'U');
126END Ben_Elanor_Import_Body;
127/
128
129 
130PÅ™Ãloha 2
131PROCEDURE Import IS
132 fromTR NUMBER; -- poslednà importovaná transakce
133 TrID NUMBER; -- právÄ› naÄÃtaná transakce
134 req UTL_HTTP.REQ; --http request
135 resp UTL_HTTP.RESP; --http response
136 zaznam VARCHAR2(32767); --naÄtený řádek z webu
137 cnt NUMBER;
138 chyba BOOLEAN;
139 BEGIN
140 cnt := 0; chyba := false;
141 -- 0. Zjistit URL adresu Benefity.cz:
142 select URL_BENEFITY_CZ into URL_BEN from BENKST;
143 -- 1. Zjistit, od kterého ÄÃsla ÄÃsla transakce chci zaÄÃt importovat
144 SELECT MAX(ID_TRANSAKCE) INTO fromTR FROM BENEFITY_CZ_IMPORT;
145 fromTR := NVL(fromTR,-1); --normálnà by bylo dát 0, ale benefity.cz 0 neberou.
146 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
147 'SpouÅ¡tÃm algoritmus',
148 NULL, 'I');
149 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
150 'ID poslednà naÄtené transakce je '||TO_CHAR(fromTR),
151 NULL, 'U');
152 --
153 -- 2. Zadat request: Nastavenà ÄÃsla transakce
154 --
155 -- Nastavit wallet pro ssl:
156 --UTL_HTTP.SET_WALLET('file:C:\tpca\_BEN\BEN_WALLETS',''); -- bez hesla, nastavit ve wallet autologin
157
158 UTL_HTTP.SET_WALLET('file:/ora/db11g/home/wallet','Wall3t99'); -- s heslem, nastavit ve wallet autologin
159 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
160 -- zadat http request
161 -- ( https://online.benefity.cz/export/ )
162 req := UTL_HTTP.BEGIN_REQUEST(
163 url => URL_BEN||'SetLastTransaction.php?transakce='||
164 TO_CHAR(fromTR), METHOD => 'POST');
165 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
166 'Request: '||req.url,
167 NULL, 'U');
168 -- nastavit autentifikaci a charset
169 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
170 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250'); -- null ... použije se database default charset
171 -- obdržet odpovÄ›Ä
172 resp := UTL_HTTP.GET_RESPONSE(req);
173 BEGIN
174 -- pÅ™eÄÃst řádek, mÄ›l by odpovÄ›dÄ›t "OK"
175 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
176 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN zaznam := NULL;
177 END;
178 --dbms_output.put_line(zaznam);
179 UTL_HTTP.END_RESPONSE(r => resp);
180 IF zaznam = 'OK' THEN
181 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
182 'Response: OK (oÄekávaná odpovÄ›Ä)',
183 NULL, 'U');
184 --
185 -- 3. Zadat request: NaÄtenà transakcÃ
186 -- (prvnà řádek musà být: "Sending transactions...")
187 --
188 req := UTL_HTTP.BEGIN_REQUEST(
189 url => URL_BEN||'GetTransactions.php');--, method => 'POST');
190 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
191 'Request: '||req.url,
192 NULL, 'U');
193 -- nastavit autentifikaci a charset
194 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
195 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250'); -- null ... použije se database default charset
196 -- obdržet odpověd
197 resp := UTL_HTTP.GET_RESPONSE(req);
198 -- PÅ™ÃÄÃst prvnà řádek
199 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
200 -- Měl by obsahovat 'Sending transactions ...'
201 IF zaznam = 'Sending transactions...' THEN
202 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
203 'Response: Sending transactions... (oÄekávaná odpovÄ›Ä)',
204 NULL, 'U');
205 cnt := 0;
206 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
207 'Importuji záznamy ...',
208 NULL, 'U');
209 LOOP
210 BEGIN
211 -- pÅ™eÄÃst řádek
212 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
213 BEGIN
214 IF GetParam(zaznam,1,';') is null or
215 GetParam(zaznam,7,';') is null or
216 GetParam(zaznam,2,';') is null or
217 GetParam(zaznam,6,';') is null or
218 GetParam(zaznam,5,';') is null or
219 GetParam(zaznam,4,';') is null then
220 chyba := true;
221 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
222 'Záznam obsahuje nepovolenou prázdnou hodnotu',
223 zaznam, 'U');
224 EXIT;
225 ELSE
226 -- ZapiÅ¡ naÄtený záznam do db:
227 BEGIN
228 INSERT INTO BENEFITY_CZ_IMPORT
229 (IMP_DAVKA,
230 ID_TRANSAKCE,
231 DATUM_TRANSAKCE,
232 PID,
233 CASTKA, POUZITO,
234 KOEF_DAN_ZATEZE,
235 SKUPINA_BENEFITU)
236 VALUES(BEN_ERROR_LOG_BATCH_SEQ.CURRVAL,
237 to_number(GetParam(zaznam,1,';')),
238 to_date(GetParam(zaznam,7,';'),'DD.MM.YYYY HH24:MI:SS'),
239 decode(GetParam(zaznam,2,';'), 'UNKNOWN PID', 0,
240 to_number(GetParam(zaznam,2,';'))),
241 -to_number(GetParam(zaznam,6,';'),
242 '999999999D99',
243 'NLS_NUMERIC_CHARACTERS = ''.,'''), 'N',
244 GetParam(zaznam,5,';'),
245 GetParam(zaznam,4,';'));
246 TrID := to_number(GetParam(zaznam,1,';'));
247 EXCEPTION WHEN OTHERS THEN
248 chyba := true;
249 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
250 'Chyba při zápisu záznamu do databáze. > '||zaznam,
251 SQLERRM, 'U');
252 RAISE;
253 END;
254 END IF;
255 EXCEPTION WHEN OTHERS THEN
256 chyba := true;
257 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
258 'Záznam má špatný formát',
259 zaznam, 'U');
260 EXIT;
261 END;
262 cnt := cnt + 1;
263 --dbms_output.put_line(zaznam);
264 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN EXIT;
265 END;
266 END LOOP;
267 ELSE
268 chyba := true;
269 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
270 'Response: NeoÄekávaná odpovÄ›Ä',
271 zaznam, 'U');
272 END IF;
273 UTL_HTTP.END_RESPONSE(r => resp);
274 IF cnt > 0 or chyba then
275 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
276 'Import ukonÄen, poÄet naÄtených záznamů je '||TO_CHAR(cnt)||
277 ', poslednà transakce = '||to_char(TrID),
278 NULL, 'U');
279 ELSE
280 Ben_Error_Log_Write(NULL, NULL, NULL, 'D');
281 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
282 'Žádná nová data',
283 NULL, 'I');
284 END IF;
285 ELSE
286 chyba := true;
287 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
288 'Response: NeoÄekávaná odpovÄ›Ä',
289 zaznam, 'U');
290 END IF;
291 EXCEPTION
292 WHEN OTHERS THEN
293 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
294 'UkonÄeno pÅ™edÄasnÄ› s chybou',
295 SQLERRM, 'U');
296 UTL_HTTP.END_RESPONSE(r => resp);
297 END;
298
299PÅ™Ãloha 3
300CREATE OR REPLACE PACKAGE BODY BEN.Benefitycz_Pkg AS
301
302 PROCEDURE Presun_ze_salda is
303 begin
304 for x in presun_ze_salda_cur loop
305 insert into BENEFITY_CZ_EXPORT
306 (ID_TRANSAKCE, PID, POCET_BODU, DATUM_TRANSAKCE)
307 VALUES (x.ID, x.PID, x.POCET_BODU, x.DATUM_TRANSAKCE);
308 end loop;
309 end;
310
311 PROCEDURE Presun_do_salda is
312 saldo Number; -- aktuálnà saldo pro daný PID;
313 poradi Number; -- poÅ™adà stejného benefitu pro PID a obdobÃ
314 akt_obdobi Date; --prvnà den následujÃcÃho obdobà (za aktuálnÃm)
315 begin
316 select trunc(last_day(to_date(AKTUALNI_ID_VOBD,'yyyymm'))+1)
317 into akt_obdobi
318 from BENKST;
319 LOCK TABLE BENSALDO IN EXCLUSIVE MODE NOWAIT;
320 for x in presun_do_salda_cur(akt_obdobi) loop
321 saldo := 0;
322 begin
323 select S.SALDO into saldo
324 from (select max(id) id from BENSALDO where PID = x.PID) M,
325 (select id, saldo from BENSALDO where PID = x.PID) S
326 where M.ID = S.ID;
327 exception when others then null;
328 end;
329 begin
330 select max(poradi) into poradi from BENSALDO
331 where PID = x.PID
332 and BENEFIT = x.BENEFIT
333 and ID_VOBD = to_char(x.DATUM_TRANSAKCE,'YYYYMM');
334 exception when others then null;
335 end;
336 begin
337 insert into BENSALDO
338 (PID, BENEFIT, ID_VOBD, PORADI, POCET_BODU, SALDO, DATUM_TRANSAKCE, ZDROJ)
339 VALUES (x.PID, x.BENEFIT, to_char(x.DATUM_TRANSAKCE,'YYYYMM'), nvl(poradi,0)+1, x.CASTKA,
340 x.CASTKA + nvl(saldo,0), x.DATUM_TRANSAKCE, 'BENEFITY.CZ');
341 update BENEFITY_CZ_IMPORT set POUZITO = 'A'
342 where current of presun_do_salda_cur;
343 exception when others then null;
344 end;
345 end loop;
346 end;
347
348 PROCEDURE Export_Body IS
349 req UTL_HTTP.REQ; --http request
350 resp UTL_HTTP.RESP; --http response
351 zaznam VARCHAR2(32767);
352 vystup CLOB;
353 part Varchar2(30000);
354 poz Number;
355 cnt_poslano Number;
356 cnt_prijato Number;
357 Cursor Export_cur is
358 select B.PID, nvl(B.max_body,0) MAX_BODY, sum(nvl(F.BODY,0)) xBODY
359 from benzamestnanci B, benefity F
360 where B.DAT_UKON >= sysdate
361 and B.PID = F.PID
362 and to_char(sysdate,'yyyymm') between F.ID_VOBD_OD and F.ID_VOBD_DO
363 group by B.PID, nvl(B.max_body,0)
364 UNION
365 select B.PID, nvl(B.max_body,0) MAX_BODY, 0 xBODY
366 from benzamestnanci B
367 where B.DAT_UKON >= sysdate
368 and not exists ( select F.BODY from benefity F
369 where F.PID = B.PID
370 and to_char(sysdate,'yyyymm') between
371 F.ID_VOBD_OD and F.ID_VOBD_DO
372 )
373 order by PID;
374 BEGIN
375 vystup := null; poz := 0; cnt_poslano := 0;
376 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
377 'SpouÅ¡tÃm algoritmus',
378 NULL, 'I');
379 for x in Export_cur loop
380 vystup := vystup||to_char(x.PID)||';'||TO_CHAR(nvl(x.MAX_BODY,0)-nvl(x.xBODY,0))||chr(10);
381 cnt_poslano := cnt_poslano + 1;
382 end loop;
383 -- 0. Zjistit URL adresu Benefity.cz:
384 select URL_BENEFITY_CZ into URL_BEN from BENKST;
385
386 UTL_HTTP.SET_WALLET('file:/ora/db11g/home/wallet','Wall3t99'); -- s heslem, nastavit ve wallet autologin
387
388 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
389 req := UTL_HTTP.BEGIN_REQUEST( url => URL_BEN||'WriteMaxBodyAll.php',
390 METHOD => 'POST');
391 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
392 'Request: '||req.url,
393 null, 'U');
394 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
395 UTL_HTTP.SET_BODY_CHARSET( r => req, charset => 'WINDOWS-1250');
396 vystup := 'vstup='||vystup;
397 UTL_HTTP.SET_HEADER (r => req, name => 'Content-Type', value => 'application/x-www-form-urlencoded');
398 UTL_HTTP.SET_HEADER (r => req, name => 'Content-Length', value => length(vystup));
399 poz := 1;
400 loop
401 part := substr(vystup,poz,5000);
402 UTL_HTTP.WRITE_TEXT(req, part);
403 poz := poz + 5000;
404 if poz > length(vystup) then exit; end if;
405 end loop;
406 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
407 'Zasláno '||to_char(cnt_poslano)||' záznamů',
408 null, 'U');
409 resp := UTL_HTTP.GET_RESPONSE(req);
410 cnt_prijato := 0;
411 LOOP
412 BEGIN
413 -- pÅ™eÄÃst řádek
414 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
415 DBMS_OUTPUT.PUT_LINE(zaznam);
416 IF getparam(zaznam,2,';') <> 'OK' THEN
417 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
418 'PID = '||getparam(zaznam,1,';'),
419 getparam(zaznam,2,';'), 'U');
420 ELSE
421 cnt_prijato := cnt_prijato + 1;
422 END IF;
423 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN EXIT;
424 END;
425 END LOOP;
426 UTL_HTTP.END_RESPONSE(r => resp);
427 IF cnt_prijato = cnt_poslano THEN
428 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
429 'Export ukonÄen bez chyb.',
430 NULL, 'U');
431 ELSE
432 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
433 'Export ukonÄen, '||to_char(cnt_poslano-cnt_prijato)||
434 ' záznamů nebylo zpracováno.',
435 NULL, 'U');
436 END IF;
437 EXCEPTION
438 WHEN OTHERS THEN
439 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
440 'UkonÄeno pÅ™edÄasnÄ› s chybou',
441 SQLERRM, 'U');
442 UTL_HTTP.END_RESPONSE(r => resp);
443 END;
444
445 PROCEDURE Export is
446 req UTL_HTTP.REQ; --http request
447 resp UTL_HTTP.RESP; --http response
448 zaznam VARCHAR2(32767); --naÄtený řádek z webu
449 chyba BOOLEAN;
450 Cursor Export_cur is
451 select ID_TRANSAKCE, PID, POCET_BODU, DATUM_TRANSAKCE
452 from BENEFITY_CZ_EXPORT
453 where POTVRZENO = 'A'
454 and EXPORTOVANO = 'N'
455 order by id_transakce
456 for update of EXPORTOVANO, DATUM_EXPORTU, POPIS_CHYBY;
457 BEGIN
458 EXPORTOVANO_TRANSAKCI := 0; CHYBA := FALSE;
459 -- 0. Zjistit URL adresu Benefity.cz:
460 select URL_BENEFITY_CZ into URL_BEN from BENKST;
461 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
462 'SpouÅ¡tÃm algoritmus',
463 NULL, 'I');
464
465 UTL_HTTP.SET_WALLET('file:/ora/db11g/home/wallet','Wall3t99'); -- s heslem, nastavit ve wallet autologin
466 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
467 for x in Export_cur loop
468 --
469 -- 2. Zadat request pro zápis:
470 --
471 req := UTL_HTTP.BEGIN_REQUEST(
472 url => URL_BEN||'WriteTrans.php'||
473 '?trid='||TO_CHAR(x.ID_TRANSAKCE)||
474 '&pid='||TO_CHAR(x.PID)||
475 '&body='||TO_CHAR(x.POCET_BODU)||
476 '&datum='||TO_CHAR(x.DATUM_TRANSAKCE,'DD.MM.YYYY'));
477 -- nastavit autentifikaci a charset
478 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
479 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250'); -- null ... použije se database default charset
480 -- obdržet odpovÄ›Ä
481 resp := UTL_HTTP.GET_RESPONSE(req);
482 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
483 UTL_HTTP.END_RESPONSE(r => resp);
484 if zaznam = 'OK' then
485 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
486 'Request: '||req.url,
487 NULL, 'U');
488 update BENEFITY_CZ_EXPORT
489 set (EXPORTOVANO, DATUM_EXPORTU, POPIS_CHYBY) =
490 (select 'A', sysdate, 'OK' from dual)
491 where current of Export_cur;
492 EXPORTOVANO_TRANSAKCI := EXPORTOVANO_TRANSAKCI + 1;
493 else
494 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
495 'Request: '||req.url,
496 zaznam, 'U');
497 update BENEFITY_CZ_EXPORT
498 set (EXPORTOVANO, DATUM_EXPORTU, POPIS_CHYBY) =
499 (select 'N', sysdate, zaznam from dual)
500 where current of Export_cur;
501 CHYBA := TRUE;
502 end if;
503 end loop;
504 if EXPORTOVANO_TRANSAKCI > 0 or CHYBA then
505 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
506 'Export ukonÄen, poÄet odeslaných záznamů je '||
507 TO_CHAR(EXPORTOVANO_TRANSAKCI),
508 NULL, 'U');
509 else
510 Ben_Error_Log_Write(NULL, NULL, NULL, 'D');
511 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
512 'Žádné transakce nebyly exportovány',
513 NULL, 'I');
514 end if;
515 EXCEPTION
516 WHEN OTHERS THEN
517 Ben_Error_Log_Write('BenefityCZ_PKG.Export',
518 'UkonÄeno pÅ™edÄasnÄ› s chybou',
519 SQLERRM, 'U');
520 UTL_HTTP.END_RESPONSE(r => resp);
521 END;
522
523 PROCEDURE Import IS
524 fromTR NUMBER; -- poslednà importovaná transakce
525 TrID NUMBER; -- právÄ› naÄÃtaná transakce
526 req UTL_HTTP.REQ; --http request
527 resp UTL_HTTP.RESP; --http response
528 zaznam VARCHAR2(32767); --naÄtený řádek z webu
529 cnt NUMBER;
530 chyba BOOLEAN;
531 BEGIN
532 cnt := 0; chyba := false;
533 -- 0. Zjistit URL adresu Benefity.cz:
534 select URL_BENEFITY_CZ into URL_BEN from BENKST;
535 -- 1. Zjistit, od kterého ÄÃsla ÄÃsla transakce chci zaÄÃt importovat
536 SELECT MAX(ID_TRANSAKCE) INTO fromTR FROM BENEFITY_CZ_IMPORT;
537 fromTR := NVL(fromTR,-1); --normálnà by bylo dát 0, ale benefity.cz 0 neberou.
538 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
539 'SpouÅ¡tÃm algoritmus',
540 NULL, 'I');
541 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
542 'ID poslednà naÄtené transakce je '||TO_CHAR(fromTR),
543 NULL, 'U');
544 --
545 -- 2. Zadat request: Nastavenà ÄÃsla transakce
546 --
547 -- Nastavit wallet pro ssl:
548 --UTL_HTTP.SET_WALLET('file:C:\tpca\_BEN\BEN_WALLETS',''); -- bez hesla, nastavit ve wallet autologin
549
550 UTL_HTTP.SET_WALLET('file:/ora/db11g/home/wallet','Wall3t99'); -- s heslem, nastavit ve wallet autologin
551 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
552 -- zadat http request
553 -- ( https://online.benefity.cz/export/ )
554 req := UTL_HTTP.BEGIN_REQUEST(
555 url => URL_BEN||'SetLastTransaction.php?transakce='||
556 TO_CHAR(fromTR), METHOD => 'POST');
557 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
558 'Request: '||req.url,
559 NULL, 'U');
560 -- nastavit autentifikaci a charset
561 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
562 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250'); -- null ... použije se database default charset
563 -- obdržet odpovÄ›Ä
564 resp := UTL_HTTP.GET_RESPONSE(req);
565 BEGIN
566 -- pÅ™eÄÃst řádek, mÄ›l by odpovÄ›dÄ›t "OK"
567 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
568 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN zaznam := NULL;
569 END;
570 --dbms_output.put_line(zaznam);
571 UTL_HTTP.END_RESPONSE(r => resp);
572 IF zaznam = 'OK' THEN
573 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
574 'Response: OK (oÄekávaná odpovÄ›Ä)',
575 NULL, 'U');
576 --
577 -- 3. Zadat request: NaÄtenà transakcÃ
578 -- (prvnà řádek musà být: "Sending transactions...")
579 --
580 req := UTL_HTTP.BEGIN_REQUEST(
581 url => URL_BEN||'GetTransactions.php');--, method => 'POST');
582 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
583 'Request: '||req.url,
584 NULL, 'U');
585 -- nastavit autentifikaci a charset
586 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
587 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250'); -- null ... použije se database default charset
588 -- obdržet odpověd
589 resp := UTL_HTTP.GET_RESPONSE(req);
590 -- PÅ™ÃÄÃst prvnà řádek
591 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
592 -- Měl by obsahovat 'Sending transactions ...'
593 IF zaznam = 'Sending transactions...' THEN
594 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
595 'Response: Sending transactions... (oÄekávaná odpovÄ›Ä)',
596 NULL, 'U');
597 cnt := 0;
598 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
599 'Importuji záznamy ...',
600 NULL, 'U');
601 LOOP
602 BEGIN
603 -- pÅ™eÄÃst řádek
604 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
605 BEGIN
606 IF GetParam(zaznam,1,';') is null or
607 GetParam(zaznam,7,';') is null or
608 GetParam(zaznam,2,';') is null or
609 GetParam(zaznam,6,';') is null or
610 GetParam(zaznam,5,';') is null or
611 GetParam(zaznam,4,';') is null then
612 chyba := true;
613 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
614 'Záznam obsahuje nepovolenou prázdnou hodnotu',
615 zaznam, 'U');
616 EXIT;
617 ELSE
618 -- ZapiÅ¡ naÄtený záznam do db:
619 BEGIN
620 INSERT INTO BENEFITY_CZ_IMPORT
621 (IMP_DAVKA,
622 ID_TRANSAKCE,
623 DATUM_TRANSAKCE,
624 PID,
625 CASTKA, POUZITO,
626 KOEF_DAN_ZATEZE,
627 SKUPINA_BENEFITU)
628 VALUES(BEN_ERROR_LOG_BATCH_SEQ.CURRVAL,
629 to_number(GetParam(zaznam,1,';')),
630 to_date(GetParam(zaznam,7,';'),'DD.MM.YYYY HH24:MI:SS'),
631 decode(GetParam(zaznam,2,';'), 'UNKNOWN PID', 0,
632 to_number(GetParam(zaznam,2,';'))),
633 -to_number(GetParam(zaznam,6,';'),
634 '999999999D99',
635 'NLS_NUMERIC_CHARACTERS = ''.,'''), 'N',
636 GetParam(zaznam,5,';'),
637 GetParam(zaznam,4,';'));
638 TrID := to_number(GetParam(zaznam,1,';'));
639 EXCEPTION WHEN OTHERS THEN
640 chyba := true;
641 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
642 'Chyba při zápisu záznamu do databáze. > '||zaznam,
643 SQLERRM, 'U');
644 RAISE;
645 END;
646 END IF;
647 EXCEPTION WHEN OTHERS THEN
648 chyba := true;
649 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
650 'Záznam má špatný formát',
651 zaznam, 'U');
652 EXIT;
653 END;
654 cnt := cnt + 1;
655 --dbms_output.put_line(zaznam);
656 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN EXIT;
657 END;
658 END LOOP;
659 ELSE
660 chyba := true;
661 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
662 'Response: NeoÄekávaná odpovÄ›Ä',
663 zaznam, 'U');
664 END IF;
665 UTL_HTTP.END_RESPONSE(r => resp);
666 IF cnt > 0 or chyba then
667 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
668 'Import ukonÄen, poÄet naÄtených záznamů je '||TO_CHAR(cnt)||
669 ', poslednà transakce = '||to_char(TrID),
670 NULL, 'U');
671 ELSE
672 Ben_Error_Log_Write(NULL, NULL, NULL, 'D');
673 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
674 'Žádná nová data',
675 NULL, 'I');
676 END IF;
677 ELSE
678 chyba := true;
679 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
680 'Response: NeoÄekávaná odpovÄ›Ä',
681 zaznam, 'U');
682 END IF;
683 EXCEPTION
684 WHEN OTHERS THEN
685 Ben_Error_Log_Write('BenefityCZ_PKG.Import',
686 'UkonÄeno pÅ™edÄasnÄ› s chybou',
687 SQLERRM, 'U');
688 UTL_HTTP.END_RESPONSE(r => resp);
689 END;
690
691
692
693 PROCEDURE POKUS AS
694 req UTL_HTTP.REQ;
695 resp UTL_HTTP.RESP;
696 zaznam VARCHAR2(32767);
697 BEGIN
698 select URL_BENEFITY_CZ into URL_BEN from BENKST;
699 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
700 req := UTL_HTTP.BEGIN_REQUEST( url => 'http://www.benefity.cz/tpca/GetTransactions.php');
701 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
702 UTL_HTTP.SET_BODY_CHARSET(r => req, charset => 'WINDOWS-1250');
703 resp := UTL_HTTP.GET_RESPONSE(req);
704 --LOOP
705 -- BEGIN
706 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
707 -- EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN EXIT;
708 -- END;
709 DBMS_OUTPUT.PUT(zaznam);
710 --END LOOP;
711 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
712 DBMS_OUTPUT.PUT_LINE(zaznam);
713 DBMS_OUTPUT.PUT_LINE(GetParam(zaznam,1,';'));
714 DBMS_OUTPUT.PUT_LINE(to_date(GetParam(zaznam,7,';'),'DD.MM.YYYY HH24:MI:SS'));
715 DBMS_OUTPUT.PUT_LINE(GetParam(zaznam,2,';'));
716 DBMS_OUTPUT.PUT_LINE(GetParam(zaznam,6,';'));
717 DBMS_OUTPUT.PUT_LINE(GetParam(zaznam,5,';'));
718 DBMS_OUTPUT.PUT_LINE(GetParam(zaznam,4,';'));
719 UTL_HTTP.END_RESPONSE(r => resp);
720 EXCEPTION WHEN OTHERS THEN
721 DBMS_OUTPUT.PUT_LINE(UTL_HTTP.GET_DETAILED_SQLERRM);
722 UTL_HTTP.END_RESPONSE(r => resp);
723 RAISE;
724 END;
725
726 FUNCTION adresar(pDirectory IN VARCHAR2) RETURN VARCHAR2 IS
727 cesta VARCHAR2(1024);
728 BEGIN
729 SELECT Directory_Path INTO cesta FROM ALL_DIRECTORIES
730 WHERE Directory_Name = pDirectory;
731 RETURN cesta;
732 --exception when others then return null;
733 END;
734
735 FUNCTION GetParam( -- ... vrátà x-tý parametr z řetězce
736 par IN VARCHAR2, -- Řetězec s parametry
737 por IN NUMBER, -- kolikátý parametr chci ?
738 sep IN VARCHAR2 -- jaký je použit oddÄ›lovaÄ ?
739 ) RETURN VARCHAR2 IS
740 xpar VARCHAR2(1);
741 xpor NUMBER;
742 x1 NUMBER;
743 x2 NUMBER;
744 BEGIN
745 xpar:=SUBSTR(par,1,1); xpor:=por;
746 IF (xpar LIKE sep) THEN xpar:=NULL; ELSE xpar:=sep; END IF;
747 x1:=INSTR(xpar||par||xpar,sep,1,xpor); x2:=INSTR(xpar||par||xpar,sep,1,xpor+1);
748 RETURN SUBSTR(xpar||par||xpar,x1+1,x2-x1-1);
749 END;
750
751 FUNCTION CntParam( -- ... spoÄÃtá, kolik je v Å™etÄ›zci parametrů
752 par IN VARCHAR2, -- Řetězec s parametry
753 sep IN VARCHAR2 -- jaký je použit oddÄ›lovaÄ ?
754 ) RETURN NUMBER IS
755 pocet NUMBER:=0;
756 xpar VARCHAR2(4000);
757 BEGIN
758 xpar:=REPLACE(par,'||','|');
759 FOR i IN 1..LENGTH(xpar) LOOP
760 IF SUBSTR(xpar,i,1) = sep THEN pocet:=pocet+1; END IF;
761 END LOOP;
762 RETURN pocet-1;
763 END;
764
765END Benefitycz_Pkg;
766/
767
768
769
770 
771PÅ™Ãloha 4
772PROCEDURE Export_Body IS
773 req UTL_HTTP.REQ; --http request
774 resp UTL_HTTP.RESP; --http response
775 zaznam VARCHAR2(32767);
776 vystup CLOB;
777 part Varchar2(30000);
778 poz Number;
779 cnt_poslano Number;
780 cnt_prijato Number;
781 Cursor Export_cur is
782 select B.PID, nvl(B.max_body,0) MAX_BODY, sum(nvl(F.BODY,0)) xBODY
783 from benzamestnanci B, benefity F
784 where B.DAT_UKON >= sysdate
785 and B.PID = F.PID
786 and to_char(sysdate,'yyyymm') between F.ID_VOBD_OD and F.ID_VOBD_DO
787 group by B.PID, nvl(B.max_body,0)
788 UNION
789 select B.PID, nvl(B.max_body,0) MAX_BODY, 0 xBODY
790 from benzamestnanci B
791 where B.DAT_UKON >= sysdate
792 and not exists ( select F.BODY from benefity F
793 where F.PID = B.PID
794 and to_char(sysdate,'yyyymm') between
795 F.ID_VOBD_OD and F.ID_VOBD_DO
796 )
797 order by PID;
798 BEGIN
799 vystup := null; poz := 0; cnt_poslano := 0;
800 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
801 'SpouÅ¡tÃm algoritmus',
802 NULL, 'I');
803 for x in Export_cur loop
804 vystup := vystup||to_char(x.PID)||';'||TO_CHAR(nvl(x.MAX_BODY,0)-nvl(x.xBODY,0))||chr(10);
805 cnt_poslano := cnt_poslano + 1;
806 end loop;
807 -- 0. Zjistit URL adresu Benefity.cz:
808 select URL_BENEFITY_CZ into URL_BEN from BENKST;
809
810 UTL_HTTP.SET_WALLET('file:/ora/db11g/home/wallet','Wall3t99'); -- s heslem, nastavit ve wallet autologin
811
812 UTL_HTTP.SET_TRANSFER_TIMEOUT (timeout => 300);
813 req := UTL_HTTP.BEGIN_REQUEST( url => URL_BEN||'WriteMaxBodyAll.php',
814 METHOD => 'POST');
815 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
816 'Request: '||req.url,
817 null, 'U');
818 UTL_HTTP.SET_AUTHENTICATION(r => req, username => 'tpca', PASSWORD => 'online');
819 UTL_HTTP.SET_BODY_CHARSET( r => req, charset => 'WINDOWS-1250');
820 vystup := 'vstup='||vystup;
821 UTL_HTTP.SET_HEADER (r => req, name => 'Content-Type', value => 'application/x-www-form-urlencoded');
822 UTL_HTTP.SET_HEADER (r => req, name => 'Content-Length', value => length(vystup));
823 poz := 1;
824 loop
825 part := substr(vystup,poz,5000);
826 UTL_HTTP.WRITE_TEXT(req, part);
827 poz := poz + 5000;
828 if poz > length(vystup) then exit; end if;
829 end loop;
830 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
831 'Zasláno '||to_char(cnt_poslano)||' záznamů',
832 null, 'U');
833 resp := UTL_HTTP.GET_RESPONSE(req);
834 cnt_prijato := 0;
835 LOOP
836 BEGIN
837 -- pÅ™eÄÃst řádek
838 UTL_HTTP.READ_LINE(resp, zaznam, TRUE);
839 DBMS_OUTPUT.PUT_LINE(zaznam);
840 IF getparam(zaznam,2,';') <> 'OK' THEN
841 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
842 'PID = '||getparam(zaznam,1,';'),
843 getparam(zaznam,2,';'), 'U');
844 ELSE
845 cnt_prijato := cnt_prijato + 1;
846 END IF;
847 EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN EXIT;
848 END;
849 END LOOP;
850 UTL_HTTP.END_RESPONSE(r => resp);
851 IF cnt_prijato = cnt_poslano THEN
852 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
853 'Export ukonÄen bez chyb.',
854 NULL, 'U');
855 ELSE
856 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
857 'Export ukonÄen, '||to_char(cnt_poslano-cnt_prijato)||
858 ' záznamů nebylo zpracováno.',
859 NULL, 'U');
860 END IF;
861 EXCEPTION
862 WHEN OTHERS THEN
863 Ben_Error_Log_Write('BenefityCZ_PKG.Export_BODY',
864 'UkonÄeno pÅ™edÄasnÄ› s chybou',
865 SQLERRM, 'U');
866 UTL_HTTP.END_RESPONSE(r => resp);
867 END;