[Home] [Help]
PACKAGE BODY: APPS.IBY_FNDCPT_TRXN_PUB
Source
1 PACKAGE BODY IBY_FNDCPT_TRXN_PUB AS
2 /*$Header: ibyfctxb.pls 120.127.12020000.6 2013/02/22 07:09:19 sugottum ship $*/
3
4 /* ======================================================================*
5 | Global Data Types |
6 * ======================================================================*/
7 G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
8 G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
9 G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
10 G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
11 G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
12 G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
13 G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
14
15
16 G_PKG_NAME CONSTANT VARCHAR2(30) := 'IBY_FNDCPT_TRXN_PUB';
17
18 G_DEBUG_MODULE CONSTANT VARCHAR2(100) := 'iby.plsql.IBY_FNDCPT_TRXN_PUB';
19
20 --
21 -- Constants
22 --
23 CC_CAPTURE_TRXNTYPE CONSTANT NUMBER(15,0) := 8;
24 BA_CAPTURE_TRXNTYPE CONSTANT NUMBER(15,0) := 100;
25 CC_PMTCHANNEL_CODE CONSTANT VARCHAR2(30) := 'CREDIT_CARD';
26 DC_PMTCHANNEL_CODE CONSTANT VARCHAR2(30) := 'PINLESS_DEBIT_CARD';
27 BA_PMT_CHANNEL_CODE CONSTANT VARCHAR2(30) := 'BANK_ACCT_XFER';
28 CC_INSTR_TYPE CONSTANT VARCHAR2(30) :='CREDITCARD';
29 PC_INSTR_TYPE CONSTANT VARCHAR2(30) :='PURCHASECARD';
30 DC_INSTR_TYPE CONSTANT VARCHAR2(30) :='DEBITCARD';
31 BA_INSTR_TYPE CONSTANT VARCHAR2(30) :='BANKACCOUNT';
32 GATEWAY_SETTLEMENT_STATUS CONSTANT VARCHAR2(30) := '11';
33 PROCESSOR_SETTLEMENT_STATUS CONSTANT VARCHAR2(30) := '100';
34
35 -------------------------------------------------------------------------
36 -- II. Record Types
37 -------------------------------------------------------------------------
38
39 -- Bug : 8763944
40 --Added last two columns in rec to get trxn_core info.
41 TYPE FuncCaptureOrder_rec_type IS RECORD (
42 TRXNMID IBY_TRXN_SUMMARIES_ALL.TRXNMID%TYPE,
43 -- From IBY_FNDCPT_TX_EXTENSIONS
44 TRXN_REF_NUMBER1 IBY_FNDCPT_TX_EXTENSIONS.TRXN_REF_NUMBER1%TYPE,
45 TRXN_REF_NUMBER2 IBY_FNDCPT_TX_EXTENSIONS.TRXN_REF_NUMBER2%TYPE,
46 PAYMENT_CHANNEL_CODE IBY_FNDCPT_TX_EXTENSIONS.PAYMENT_CHANNEL_CODE%TYPE,
47 PO_NUMBER IBY_FNDCPT_TX_EXTENSIONS.PO_NUMBER%TYPE,
48 VOICE_AUTHORIZATION_FLAG IBY_FNDCPT_TX_EXTENSIONS.VOICE_AUTHORIZATION_FLAG%TYPE,
49 PAYMENT_FUNCTION IBY_EXTERNAL_PAYERS_ALL.PAYMENT_FUNCTION%TYPE,
50 -- From the ORDERS View
51 CALL_APP_SERVICE_REQ_CODE IBY_TRXN_SUMMARIES_ALL.CALL_APP_SERVICE_REQ_CODE%TYPE,
52 --CALLING_APP_DOC_REF_NUMBER IBY_TRXN_SUMMARIES_ALL.CALLING_APP_DOC_REF_NUMBER%TYPE,
53 SETTLEMENT_DATE IBY_TRXN_SUMMARIES_ALL.SETTLEDATE%TYPE,
54 SETTLEMENT_DUE_DATE IBY_TRXN_SUMMARIES_ALL.SETTLEMENT_DUE_DATE%TYPE,
55 BR_MATURITY_DATE IBY_TRXN_SUMMARIES_ALL.BR_MATURITY_DATE%TYPE,
56 ORDER_DESCRIPTION VARCHAR2(255),
57 SETTLEMENT_CURRENCY_CODE IBY_TRXN_SUMMARIES_ALL.CURRENCYNAMECODE%TYPE,
58 SETTLEMENT_AMOUNT IBY_TRXN_SUMMARIES_ALL.AMOUNT%TYPE,
59 PAYMENT_TRXN_EXTENSION_ID IBY_FNDCPT_TX_EXTENSIONS.TRXN_EXTENSION_ID%TYPE,
60 INTERNAL_BANK_ACCOUNT_ID CE_BANK_ACCOUNTS.BANK_ACCOUNT_ID%TYPE,
61 PAYER_PARTY_ID IBY_EXTERNAL_PAYERS_ALL.PARTY_ID%TYPE,
62 CUST_ACCOUNT_ID IBY_TRXN_SUMMARIES_ALL.CUST_ACCOUNT_ID%TYPE,
63 ACCT_SITE_USE_ID IBY_TRXN_SUMMARIES_ALL.ACCT_SITE_USE_ID%TYPE,
64 ORG_ID IBY_TRXN_SUMMARIES_ALL.ORG_ID%TYPE,
65 ORG_TYPE IBY_TRXN_SUMMARIES_ALL.ORG_TYPE%TYPE,
66 LEGAL_ENTITY_ID IBY_TRXN_SUMMARIES_ALL.LEGAL_ENTITY_ID%TYPE,
67 BILL_TO_ADDRESS_ID IBY_TRXN_SUMMARIES_ALL.BILL_TO_ADDRESS_ID%TYPE,
68 SETTLEMENT_CUSTOMER_REFERENCE IBY_TRXN_SUMMARIES_ALL.SETTLEMENT_CUSTOMER_REFERENCE%TYPE,
69 AR_RECEIPT_METHOD_ID IBY_TRXN_SUMMARIES_ALL.AR_RECEIPT_METHOD_ID%TYPE,
70 BR_DRAWEE_ISSUED_FLAG IBY_TRXN_SUMMARIES_ALL.BR_DRAWEE_ISSUED_FLAG%TYPE,
71 BR_SIGNED_FLAG IBY_TRXN_SUMMARIES_ALL.BR_SIGNED_FLAG%TYPE,
72 BR_DISPUTED_FLAG VARCHAR2(1),
73 ATTRIBUTE_CATEGORY VARCHAR2(150),
74 ATTRIBUTE1 VARCHAR2(150),
75 ATTRIBUTE2 VARCHAR2(150),
76 ATTRIBUTE3 VARCHAR2(150),
77 ATTRIBUTE4 VARCHAR2(150),
78 ATTRIBUTE5 VARCHAR2(150),
79 ATTRIBUTE6 VARCHAR2(150),
80 ATTRIBUTE7 VARCHAR2(150),
81 ATTRIBUTE8 VARCHAR2(150),
82 ATTRIBUTE9 VARCHAR2(150),
83 ATTRIBUTE10 VARCHAR2(150),
84 ATTRIBUTE11 VARCHAR2(150),
85 ATTRIBUTE12 VARCHAR2(150),
86 ATTRIBUTE13 VARCHAR2(150),
87 ATTRIBUTE14 VARCHAR2(150),
88 ATTRIBUTE15 VARCHAR2(150),
89 CREATED_BY IBY_TRXN_SUMMARIES_ALL.CREATED_BY%TYPE,
90 CREATION_DATE IBY_TRXN_SUMMARIES_ALL.CREATION_DATE%TYPE,
91 LAST_UPDATED_BY IBY_TRXN_SUMMARIES_ALL.LAST_UPDATED_BY%TYPE,
92 LAST_UPDATE_DATE IBY_TRXN_SUMMARIES_ALL.LAST_UPDATE_DATE%TYPE,
93 LAST_UPDATE_LOGIN IBY_TRXN_SUMMARIES_ALL.LAST_UPDATE_LOGIN%TYPE,
94 OBJECT_VERSION_NUMBER IBY_TRXN_SUMMARIES_ALL.OBJECT_VERSION_NUMBER%TYPE,
95 -- From auth table
96 auth_transactionid IBY_TRXN_SUMMARIES_ALL.transactionid%TYPE,
97 auth_sales_rep_party_id IBY_TRXN_SUMMARIES_ALL.sales_rep_party_id%TYPE,
98 auth_tangibleid IBY_TRXN_SUMMARIES_ALL.tangibleid%TYPE,
99 auth_bepkey IBY_TRXN_SUMMARIES_ALL.bepkey%TYPE,
100 auth_payeeid IBY_TRXN_SUMMARIES_ALL.payeeid%TYPE,
101 auth_bepid IBY_TRXN_SUMMARIES_ALL.bepid%TYPE,
102 auth_mpayeeid IBY_TRXN_SUMMARIES_ALL.mpayeeid%TYPE,
103 auth_ecappid IBY_TRXN_SUMMARIES_ALL.ecappid%TYPE,
104 auth_paymentmethodname IBY_TRXN_SUMMARIES_ALL.paymentmethodname%TYPE,
105 auth_mtangibleid IBY_TRXN_SUMMARIES_ALL.mtangibleid%TYPE,
106 auth_payeeinstrid IBY_TRXN_SUMMARIES_ALL.payeeinstrid%TYPE,
107 auth_payerid IBY_TRXN_SUMMARIES_ALL.payerid%TYPE,
108 auth_payerinstrid IBY_TRXN_SUMMARIES_ALL.payerinstrid%TYPE,
109 auth_detaillookup IBY_TRXN_SUMMARIES_ALL.detaillookup%TYPE,
110 auth_instrnumber IBY_TRXN_SUMMARIES_ALL.instrnumber%TYPE,
111 auth_instrtype IBY_TRXN_SUMMARIES_ALL.instrtype%TYPE,
112 auth_instrsubtype IBY_TRXN_SUMMARIES_ALL.instrsubtype%TYPE,
113 auth_currencynamecode IBY_TRXN_SUMMARIES_ALL.currencynamecode%TYPE,
114 auth_desturl IBY_TRXN_SUMMARIES_ALL.desturl%TYPE,
115 auth_nlslang IBY_TRXN_SUMMARIES_ALL.nlslang%TYPE,
116 auth_amount IBY_TRXN_SUMMARIES_ALL.amount%TYPE,
117 auth_process_profile_code IBY_TRXN_SUMMARIES_ALL.process_profile_code%TYPE,
118 auth_payment_channel_code IBY_TRXN_SUMMARIES_ALL.payment_channel_code%TYPE,
119 auth_proc_reference_code IBY_TRXN_SUMMARIES_ALL.proc_reference_code%TYPE,
120 auth_proc_reference_amount IBY_TRXN_SUMMARIES_ALL.proc_reference_amount%TYPE,
121 auth_legal_entity_id IBY_TRXN_SUMMARIES_ALL.legal_entity_id%TYPE,
122 auth_settlement_due_date IBY_TRXN_SUMMARIES_ALL.settlement_due_date%TYPE,
123 auth_bill_to_address_id IBY_TRXN_SUMMARIES_ALL.bill_to_address_id%TYPE,
124 auth_br_maturity_date IBY_TRXN_SUMMARIES_ALL.br_maturity_date%TYPE,
125 auth_factored_flag IBY_TRXN_SUMMARIES_ALL.factored_flag%TYPE,
126 -- From Payers table
127 auth_payment_function IBY_EXTERNAL_PAYERS_ALL.PAYMENT_FUNCTION%TYPE,
128 auth_payer_party_id IBY_EXTERNAL_PAYERS_ALL.PARTY_ID%TYPE,
129 auth_cust_account_id IBY_EXTERNAL_PAYERS_ALL.CUST_ACCOUNT_ID%TYPE,
130 auth_acct_site_use_id IBY_EXTERNAL_PAYERS_ALL.ACCT_SITE_USE_ID%TYPE,
131 auth_org_id IBY_EXTERNAL_PAYERS_ALL.ORG_ID%TYPE,
132 auth_org_type IBY_EXTERNAL_PAYERS_ALL.ORG_TYPE%TYPE,
133 bep_type IBY_BEPINFO.bep_type%TYPE,
134 payer_instr_assignment_id IBY_TRXN_SUMMARIES_ALL.payer_instr_assignment_id%TYPE,
135 debit_auth_flag IBY_TRXN_SUMMARIES_ALL.debit_auth_flag%TYPE,
136 debit_auth_method IBY_TRXN_SUMMARIES_ALL.debit_auth_method%TYPE,
137 debit_auth_reference IBY_TRXN_SUMMARIES_ALL.debit_auth_reference%TYPE,
138 capture_transaction_id IBY_TRXN_SUMMARIES_ALL.transactionid%TYPE,
139 int_bank_country VARCHAR2(60),
140 settle_req_vrfy IBY_FNDCPT_SYS_EFT_PF_B.SETTLE_REQUIRE_VRFY_FLAG%TYPE,
141 auth_count PLS_INTEGER,
142 auth_dirdeb_instruction_code IBY_TRXN_SUMMARIES_ALL.dirdeb_instruction_code%TYPE,
143 card_subtype_code IBY_TRXN_CORE.card_subtype_code%TYPE,
144 card_data_level IBY_TRXN_CORE.card_data_level%TYPE
145 );
146
147
148
149
150 -- II.2 Table Types
151
152 TYPE caFundcaptureOrdersTabType IS TABLE OF FuncCaptureOrder_rec_type
153 INDEX BY BINARY_INTEGER;
154
155 --
156 -- Use: Determines cause of the instrument assignments view returning no
157 -- data
158 FUNCTION Get_Payer_Instr_Assgn_Fail
159 (p_instr_assign_id IN iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE,
160 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type
161 )
162 RETURN VARCHAR2
163 IS
164 l_msg VARCHAR2(100);
165 l_payer_id iby_pmt_instr_uses_all.ext_pmt_party_id%TYPE;
166 l_party_id iby_external_payers_all.party_id%TYPE;
167
168 l_count NUMBER;
169
170 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Payer_Instr_Assgn_Fail';
171 BEGIN
172
173 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
174 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
175 END IF;
176
177 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
178 iby_debug_pub.add('instr assignment id:=' || p_instr_assign_id,
179 G_LEVEL_STATEMENT,l_dbg_mod);
180 END IF;
181
182 l_msg := 'IBY_INVALID_INSTR_ASSIGN';
183
184 -- Bug: 7719030
185 -- Handling Exceptions in a different way
186 BEGIN
187
188 SELECT ext_pmt_party_id
189 INTO l_payer_id
190 FROM iby_pmt_instr_uses_all
191 WHERE (instrument_payment_use_id = p_instr_assign_id);
192
193 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
194 iby_debug_pub.add('payer id:=' || l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
195 END IF;
196
197 EXCEPTION
198 WHEN NO_DATA_FOUND THEN
199 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
200 iby_debug_pub.add('Exception: No Instrument found',G_LEVEL_EXCEPTION,l_dbg_mod);
201 END IF;
202 RETURN l_msg;
203 END;
204
205
206 l_msg := 'IBY_20491';
207 SELECT party_id
208 INTO l_party_id
209 FROM iby_external_payers_all
210 WHERE (ext_payer_id = l_payer_id);
211
212 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
213 iby_debug_pub.add('external payer count:=' || SQL%ROWCOUNT,G_LEVEL_STATEMENT,l_dbg_mod);
214 END IF;
215
216 IF (SQL%ROWCOUNT < 1) THEN RETURN l_msg; END IF;
217
218 l_msg := 'IBY_INVALID_PARTY_CONTEXT';
219 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
220 iby_debug_pub.add('party id:=' || l_party_id,G_LEVEL_STATEMENT,l_dbg_mod);
221 END IF;
222 IF (l_party_id <> p_payer.Party_Id) THEN RETURN l_msg; END IF;
223
224 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
225 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
226 END IF;
227
228 RETURN null;
229 EXCEPTION
230 WHEN NO_DATA_FOUND THEN
231 RETURN l_msg;
232 END Get_Payer_Instr_Assgn_Fail;
233
234 --
235 -- Use: Determine the reason extension lookup failed in the auth API
236 --
237 FUNCTION Get_Extension_Auth_Fail
238 (p_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
239 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type
240 )
241 RETURN VARCHAR2
242 IS
243 l_msg VARCHAR2(100);
244 l_instr_assign_id iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE;
245 l_ext_payer_id iby_fndcpt_tx_extensions.ext_payer_id%TYPE;
246
247 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Extension_Auth_Fail';
248 BEGIN
249
250 l_msg := 'IBY_INVALID_TXN_EXTENSION';
251 -- Bug: 7719030.
252 --Changing exception handling.
253 BEGIN
254 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
255 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
256 END IF;
257
258
259 SELECT instr_assignment_id, ext_payer_id
260 INTO l_instr_assign_id, l_ext_payer_id
261 FROM iby_fndcpt_tx_extensions
262 WHERE (p_trxn_extension_id = trxn_extension_id);
263 EXCEPTION
264 WHEN NO_DATA_FOUND THEN
265 RETURN l_msg;
266 END;
267
268 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
269 iby_debug_pub.add('checking instrument assignment',G_LEVEL_STATEMENT,l_dbg_mod);
270 END IF;
271 l_msg := Get_Payer_Instr_Assgn_Fail(l_instr_assign_id,p_payer);
272
273 IF (NOT l_msg IS NULL) THEN RETURN l_msg; END IF;
274
275 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
276 iby_debug_pub.add('EXIT',G_LEVEL_PROCEDURE,l_dbg_mod);
277 END IF;
278
279 RETURN NULL;
280 EXCEPTION
281 WHEN NO_DATA_FOUND THEN
282 RETURN l_msg;
283 END Get_Extension_Auth_Fail;
284
285 --
286 -- Use: Gets the encryption mode for transaction extensions
287 --
288 FUNCTION Get_Extension_Encrypt_Mode
289 RETURN iby_sys_security_options.instr_sec_code_encryption_mode%TYPE
290 IS
291 l_mode iby_sys_security_options.instr_sec_code_encryption_mode%TYPE;
292 CURSOR c_encrypt_mode
293 IS
294 SELECT instr_sec_code_encryption_mode
295 FROM iby_sys_security_options;
296 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Extension_Encrypt_Mode';
297 BEGIN
298 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
299 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
300 END IF;
301
302 IF (c_encrypt_mode%ISOPEN) THEN CLOSE c_encrypt_mode; END IF;
303
304 OPEN c_encrypt_mode;
305 FETCH c_encrypt_mode INTO l_mode;
306 CLOSE c_encrypt_mode;
307
308 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
309 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
310 END IF;
311
312 RETURN l_mode;
313 END Get_Extension_Encrypt_Mode;
314
315 FUNCTION Get_Tangible_Id
316 (p_app_short_name IN fnd_application.application_short_name%TYPE,
317 p_order_id IN iby_fndcpt_tx_extensions.order_id%TYPE,
318 p_trxn_ref1 IN iby_fndcpt_tx_extensions.trxn_ref_number1%TYPE,
319 p_trxn_ref2 IN iby_fndcpt_tx_extensions.trxn_ref_number2%TYPE
320 )
321 RETURN iby_trxn_summaries_all.tangibleid%TYPE
322 IS
323 l_tangible_id iby_trxn_summaries_all.tangibleid%TYPE;
324 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Tangible_Id';
325 BEGIN
326 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
327 iby_debug_pub.add('Enter with 4 params',G_LEVEL_PROCEDURE,l_dbg_mod);
328 END IF;
329
330 l_tangible_id := p_app_short_name || '_' || p_order_id;
331
332 IF (NOT p_trxn_ref1 IS NULL) THEN
333 l_tangible_id := l_tangible_id || '_' || p_trxn_ref1;
334 END IF;
335 IF (NOT p_trxn_ref2 IS NULL) THEN
336 l_tangible_id := l_tangible_id || '_' || p_trxn_ref2;
337 END IF;
338
339 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
340 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
341 END IF;
342
343 RETURN l_tangible_id;
344 END Get_Tangible_Id;
345
346 --Overloading this function for bug : 7628586
347 FUNCTION Get_Tangible_Id
348 (p_app_short_name IN fnd_application.application_short_name%TYPE,
349 p_trxn_extn_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE
350 )
351 RETURN iby_trxn_summaries_all.tangibleid%TYPE
352 IS
353 l_tangible_id iby_trxn_summaries_all.tangibleid%TYPE;
354 l_cust_pson VARCHAR2(30);
355 l_msg VARCHAR2(10);
356 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Tangible_Id(2)';
357 BEGIN
358 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
359 iby_debug_pub.add('Enter with 2 params',G_LEVEL_PROCEDURE,l_dbg_mod);
360 END IF;
361
362 -- Bug# 8544953
363 -- This API returns customized PSON if the customer had implemented the custome code
364 IBY_PSON_CUSTOMIZER_PKG.Get_Custom_Tangible_Id(p_app_short_name, p_trxn_extn_id, l_cust_pson, l_msg);
365 IF( l_msg = IBY_PSON_CUSTOMIZER_PKG.G_CUST_PSON_YES ) THEN
366 l_tangible_id := l_cust_pson;
367 iby_debug_pub.add('Customized PSON :='||l_tangible_id,G_LEVEL_PROCEDURE,l_dbg_mod);
368 ELSE
369 --Bug# 8535868
370 --Removing '_' since this is not accepted by FDC
371 -- l_tangible_id := p_app_short_name || '_' || p_trxn_extn_id;
372 l_tangible_id := p_app_short_name || p_trxn_extn_id;
373 iby_debug_pub.add('PSON:' ||l_tangible_id || ' was not customized',G_LEVEL_PROCEDURE,l_dbg_mod);
374 END IF;
375
376 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
377 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
378 END IF;
379 RETURN l_tangible_id;
380 END Get_Tangible_Id;
381 --End of Overloaded Function
382
383
384 -- [lmallick]
385 -- New Function to generate PSON for a re-authorization
386 FUNCTION Get_Reauth_Tangible_Id
387 (
388 p_app_short_name IN fnd_application.application_short_name%TYPE,
389 p_trxn_extn_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE
390 )
391 RETURN iby_trxn_summaries_all.tangibleid%TYPE
392 IS
393 l_tangible_id iby_trxn_summaries_all.tangibleid%TYPE;
394 l_prev_pson iby_trxn_summaries_all.tangibleid%TYPE;
395 l_reauth_cnt NUMBER;
396 l_cust_pson VARCHAR2(30);
397 l_msg VARCHAR2(10);
398 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Reauth_Tangible_Id';
399 BEGIN
400 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
401 --IBY_PSON_CUSTOMIZER_PKG.Get_Custom_Tangible_Id(p_app_short_name, p_trxn_extn_id, l_cust_pson, l_msg);
402 --IF( l_msg = IBY_PSON_CUSTOMIZER_PKG.G_CUST_PSON_YES ) THEN
403 -- l_tangible_id := l_cust_pson;
404 -- iby_debug_pub.add('Customized PSON :='||l_tangible_id,G_LEVEL_PROCEDURE,l_dbg_mod);
405 --ELSE
406 --Bug# 8535868
407 --Removing '_' since this is not accepted by FDC
408 -- l_tangible_id := p_app_short_name || '_' || p_trxn_extn_id;
409 l_tangible_id := Get_Tangible_Id(p_app_short_name, p_trxn_extn_id);
410
411 SELECT payment_system_order_number INTO l_prev_pson
412 FROM iby_fndcpt_tx_extensions
413 WHERE trxn_extension_id = p_trxn_extn_id;
414
415 IF(l_prev_pson IS NOT NULL) THEN
416 iby_debug_pub.add('PSON for earlier attempt: '||l_prev_pson,G_LEVEL_STATEMENT,l_dbg_mod);
417 IF (l_prev_pson = l_tangible_id) THEN -- first re-auth
418 iby_debug_pub.add('First time re-auth.',G_LEVEL_STATEMENT,l_dbg_mod);
419 l_tangible_id := l_tangible_id||'R1';
420 ELSE
421 l_reauth_cnt := TO_NUMBER(LTRIM((SUBSTR(l_prev_pson, length(l_tangible_id)+1)),'R'));
422 iby_debug_pub.add((l_reauth_cnt +1)||'th time re-auth.',G_LEVEL_STATEMENT,l_dbg_mod);
423 l_tangible_id := l_tangible_id||'R'||(l_reauth_cnt+1);
424 END IF;
425 END IF;
426 iby_debug_pub.add('PSON:' ||l_tangible_id ,G_LEVEL_STATEMENT,l_dbg_mod);
427 --END IF;
428 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
429 RETURN l_tangible_id;
430 END Get_Reauth_Tangible_Id;
431
432 --
433 -- Use: Gets the internal payee id from a payee context
434 --
435 FUNCTION Get_Internal_Payee(p_payee IN PayeeContext_rec_type)
436 RETURN iby_payee.payeeid%TYPE
437 IS
438 l_payeeid iby_payee.payeeid%TYPE;
439
440 CURSOR c_payeeid
441 (ci_org_type IN iby_fndcpt_payee_appl.org_type%TYPE,
442 ci_org_id IN iby_fndcpt_payee_appl.org_id%TYPE
443 )
444 IS
445 SELECT p.payeeid
446 FROM iby_payee p, iby_fndcpt_payee_appl a
447 WHERE (p.mpayeeid = a.mpayeeid)
448 AND ((a.org_type = ci_org_type) AND (a.org_id = ci_org_id));
449
450 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Internal_Payee';
451 BEGIN
452 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
453 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
454 END IF;
455
456 IF (c_payeeid%ISOPEN) THEN CLOSE c_payeeid; END IF;
457
458 OPEN c_payeeid(p_payee.Org_Type, p_payee.Org_Id);
459 FETCH c_payeeid INTO l_payeeid;
460 IF (c_payeeid%NOTFOUND) THEN
461 l_payeeid := NULL;
462 END IF;
463 CLOSE c_payeeid;
464
465 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
466 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
467 END IF;
468
469 RETURN l_payeeid;
470 END Get_Internal_Payee;
471
472 FUNCTION Get_Tx_Extension_Copy_Count
473 (p_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
474 RETURN NUMBER
475 IS
476 l_copy_count NUMBER;
477
478 CURSOR c_xe_copies(ci_x_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
479 IS
480 SELECT COUNT(copy_trxn_extension_id)
481 FROM iby_fndcpt_tx_xe_copies
482 WHERE (source_trxn_extension_id = ci_x_id);
483
484 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Get_Tx_Extension_Copy_Count';
485 BEGIN
486 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
487 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
488 END IF;
489
490 IF (c_xe_copies%ISOPEN) THEN CLOSE c_xe_copies; END IF;
491
492 OPEN c_xe_copies(p_trxn_extension_id);
493 FETCH c_xe_copies INTO l_copy_count;
494 CLOSE c_xe_copies;
495 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
496 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
497 END IF;
498
499
500 RETURN NVL(l_copy_count,0);
501 END Get_Tx_Extension_Copy_Count;
502
503 --
504 -- Use: Validates the transaction extension attributes based upon their
505 -- use by the payment channel
506 --
507 FUNCTION Extension_Valid
508 (p_pmt_channel IN VARCHAR2,
509 p_trxn_attribs IN TrxnExtension_rec_type,
510 p_update IN BOOLEAN,
511 p_consumed_cvv2 IN BOOLEAN
512 )
513 RETURN BOOLEAN
514 IS
515 l_return_status VARCHAR2(1);
516 l_msg_count NUMBER;
517 l_msg_data VARCHAR2(100);
518 l_channel_attribs IBY_FNDCPT_SETUP_PUB.PmtChannel_AttribUses_rec_type;
519 l_response IBY_FNDCPT_COMMON_PUB.Result_rec_type;
520
521 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Extension_Valid';
522 BEGIN
523 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
524 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
525 END IF;
526
527
528 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
529 iby_debug_pub.add('validating xtension',G_LEVEL_STATEMENT,l_dbg_mod);
530 END IF;
531
532 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
533 iby_debug_pub.add('Call -> IBY_FNDCPT_SETUP_PUB.Get_Payment_Channel_Attribs',
534 G_LEVEL_STATEMENT,l_dbg_mod);
535 END IF;
536 IBY_FNDCPT_SETUP_PUB.Get_Payment_Channel_Attribs
537 (1.0, FND_API.G_FALSE, l_return_status, l_msg_count, l_msg_data,
538 p_pmt_channel, l_channel_attribs, l_response);
539
540 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
541 iby_debug_pub.add('Return from IBY_FNDCPT_SETUP_PUB.Get_Payment_Channel_Attribs',
542 G_LEVEL_STATEMENT,l_dbg_mod);
543 END IF;
544 IF (l_response.Result_Code <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS) THEN
545 RETURN FALSE;
546 END IF;
547
548 IF ( (l_channel_attribs.Instr_SecCode_Use =
549 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
550 AND
551 ( ((p_trxn_attribs.Instrument_Security_Code IS NULL)
552 AND (NOT p_update)
553 AND (NOT p_consumed_cvv2)
554 )
555 OR (p_trxn_attribs.Instrument_Security_Code = FND_API.G_MISS_CHAR)
556 )
557 )
558 THEN
559 RETURN FALSE;
560 END IF;
561 IF ( (l_channel_attribs.Instr_SecCode_Use =
562 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
563 AND NOT ( (p_trxn_attribs.Instrument_Security_Code IS NULL) OR
564 (p_trxn_attribs.Instrument_security_Code = FND_API.G_MISS_CHAR)
565 )
566 )
567 THEN
568 RETURN FALSE;
569 END IF;
570
571 IF ( (l_channel_attribs.Instr_VoiceAuthFlag_Use =
572 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
573 AND ( (p_trxn_attribs.VoiceAuth_Flag IS NULL AND (NOT p_update))
574 OR (p_trxn_attribs.VoiceAuth_Flag = FND_API.G_MISS_CHAR) )
575 )
576 THEN
577 RETURN FALSE;
578 END IF;
579 --Fix for bug# 6404912: Voice Auth flag 'N' and NULL treated similarly
580 IF ( (l_channel_attribs.Instr_VoiceAuthFlag_Use =
581 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
582 AND NOT ( ( nvl(p_trxn_attribs.VoiceAuth_Flag, 'N') = 'N') OR
583 (p_trxn_attribs.VoiceAuth_Flag = FND_API.G_MISS_CHAR)
584 )
585 )
586 THEN
587 RETURN FALSE;
588 END IF;
589
590 IF ( (l_channel_attribs.Instr_VoiceAuthCode_Use =
591 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
592 AND ( (p_trxn_attribs.VoiceAuth_Code IS NULL AND (NOT p_update))
593 OR (p_trxn_attribs.VoiceAuth_Code = FND_API.G_MISS_CHAR)
594 )
595 )
596 THEN
597 RETURN FALSE;
598 END IF;
599 IF ( (l_channel_attribs.Instr_VoiceAuthCode_Use =
600 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
601 AND NOT ( (p_trxn_attribs.VoiceAuth_Code IS NULL) OR
602 (p_trxn_attribs.VoiceAuth_Code = FND_API.G_MISS_CHAR)
603 )
604 )
605 THEN
606 RETURN FALSE;
607 END IF;
608
609 IF ( (l_channel_attribs.Instr_VoiceAuthDate_Use =
610 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
611 AND ( (p_trxn_attribs.VoiceAuth_Date IS NULL AND (NOT p_update)) OR
612 (p_trxn_attribs.VoiceAuth_Date = FND_API.G_MISS_DATE) )
613 )
614 THEN
615 RETURN FALSE;
616 END IF;
617 IF ( (l_channel_attribs.Instr_VoiceAuthDate_Use =
618 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
619 AND NOT ( (p_trxn_attribs.VoiceAuth_Date IS NULL) OR
620 (p_trxn_attribs.VoiceAuth_Date = FND_API.G_MISS_DATE)
621 )
622 )
623 THEN
624 RETURN FALSE;
625 END IF;
626
627 IF ( (l_channel_attribs.PO_Number_Use =
628 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
629 AND ( (p_trxn_attribs.PO_Number IS NULL AND (NOT p_update))
630 OR (p_trxn_attribs.PO_Number = FND_API.G_MISS_CHAR) )
631 )
632 THEN
633 RETURN FALSE;
634 END IF;
635 IF ( (l_channel_attribs.PO_Number_Use =
636 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
637 AND NOT ( (p_trxn_attribs.PO_Number IS NULL) OR
638 (p_trxn_attribs.PO_Number = FND_API.G_MISS_CHAR)
639 )
640 )
641 THEN
642 RETURN FALSE;
643 END IF;
644
645 IF ( (l_channel_attribs.PO_Line_Number_Use =
646 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
647 AND ( (p_trxn_attribs.PO_Line_Number IS NULL OR (NOT p_update))
648 OR (p_trxn_attribs.PO_Line_Number = FND_API.G_MISS_CHAR) )
649 )
650 THEN
651 RETURN FALSE;
652 END IF;
653 IF ( (l_channel_attribs.PO_Line_Number_Use =
654 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
655 AND NOT ( (p_trxn_attribs.PO_Line_Number IS NULL) OR
656 (p_trxn_attribs.PO_Line_Number = FND_API.G_MISS_CHAR)
657 )
658 )
659 THEN
660 RETURN FALSE;
661 END IF;
662
663 IF ( (l_channel_attribs.AddInfo_Use =
664 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_REQUIRED)
665 AND ( (p_trxn_attribs.Additional_Info IS NULL OR (NOT p_update))
666 OR (p_trxn_attribs.Additional_Info = FND_API.G_MISS_CHAR) )
667 )
668 THEN
669 RETURN FALSE;
670 END IF;
671 IF ( (l_channel_attribs.AddInfo_Use =
672 IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED)
673 AND NOT ( (p_trxn_attribs.Additional_Info IS NULL) OR
674 (p_trxn_attribs.Additional_Info = FND_API.G_MISS_CHAR)
675 )
676 )
677 THEN
678 RETURN FALSE;
679 END IF;
680
681 IF ( (p_trxn_attribs.Order_Id IS NULL AND (NOT p_update)) OR
682 (p_trxn_attribs.Order_id = FND_API.G_MISS_CHAR)
683 )
684 THEN
685 RETURN FALSE;
686 END IF;
687
688 IF (NOT iby_utility_pvt.Validate_App_Id(p_trxn_attribs.Originating_Application_Id))
689 THEN
690 RETURN FALSE;
691 END IF;
692
693 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
694 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
695 END IF;
696
697 RETURN TRUE;
698 END Extension_Valid;
699
700 --
701 -- USE: Validates the payment channel for the payer;
702 -- the given payer or an equivalent must be assigned this payment
703 -- channel
704 --
705 FUNCTION Payer_Channel_Valid
706 (p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
707 p_payer_level IN VARCHAR2,
708 p_payer_equiv IN VARCHAR2,
709 p_pmt_channel IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE
710 )
711 RETURN BOOLEAN
712 IS
713 l_channel_instr iby_fndcpt_pmt_chnnls_b.instrument_type%TYPE;
714
715 CURSOR c_trxn_channel
716 (ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
717 ci_payer_level IN VARCHAR2,
718 ci_payer_equiv IN VARCHAR2,
719 ci_channel_code IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE)
720 IS
721 SELECT c.instrument_type
722 FROM iby_ext_party_pmt_mthds pm, iby_fndcpt_pmt_chnnls_b c
723 WHERE (c.payment_channel_code = ci_channel_code)
724 AND (pm.payment_method_code = c.payment_channel_code)
725 AND (NVL(pm.inactive_date,SYSDATE-10)<SYSDATE)
726 AND (NVL(c.inactive_date,SYSDATE-10)<SYSDATE)
727 AND (pm.payment_flow = IBY_FNDCPT_SETUP_PUB.G_PMT_FLOW_FNDCPT)
728 AND pm.ext_pmt_party_id IN
729 (
730 SELECT ext_payer_id
731 FROM iby_external_payers_all
732 WHERE (payment_function = ci_payer.Payment_Function)
733 AND (party_id = ci_payer.Party_Id)
734 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
735 (ci_payer.org_type, ci_payer.org_id,
736 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
737 ci_payer_level,ci_payer_equiv,org_type,org_id,
738 cust_account_id,acct_site_use_id) = 'T')
739 );
740
741 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Payer_Channel_Valid';
742 BEGIN
743 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
744 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
745 END IF;
746
747
748 -- ENHANCEMENT:
749 -- Applicability rules for payer-assigned payment channels
750 -- not currently supported
751
752 RETURN TRUE;
753
754 IF (c_trxn_channel%ISOPEN) THEN CLOSE c_trxn_channel; END IF;
755
756 OPEN c_trxn_channel(p_payer,p_payer_level,p_payer_equiv,p_pmt_channel);
757 --
758 -- should only return the same payment channel and thus only
759 -- one instrument type value; storing this saves a later fetch
760 --
761 FETCH c_trxn_channel INTO l_channel_instr;
762 CLOSE c_trxn_channel;
763
764 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
765 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
766 END IF;
767
768 IF (l_channel_instr<1) THEN
769 RETURN FALSE;
770 ELSE
771 RETURN TRUE;
772 END IF;
773 END Payer_Channel_Valid;
774
775 FUNCTION Channel_InstrAssignment_Appl
776 (p_channel IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE)
777 RETURN iby_pmt_mthd_attrib_appl.attribute_applicability%TYPE
778 IS
779 l_assign_appl iby_pmt_mthd_attrib_appl.attribute_applicability%TYPE;
780
781 CURSOR c_pmt_instr
782 (ci_pmt_channel iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE)
783 IS
784 SELECT attribute_applicability
785 FROM iby_pmt_mthd_attrib_appl
786 WHERE (payment_flow = 'FUNDS_CAPTURE')
787 AND (payment_method_code = ci_pmt_channel)
788 AND (attribute_code = 'PAYMENT_INSTRUMENT');
789
790 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Channel_InstrAssignment_Appl';
791 BEGIN
792 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
793 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
794 END IF;
795
796 IF (c_pmt_instr%ISOPEN) THEN CLOSE c_pmt_instr; END IF;
797
798 OPEN c_pmt_instr(p_channel);
799 FETCH c_pmt_instr INTO l_assign_appl;
800 CLOSE c_pmt_instr;
801
802 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
803 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
804 END IF;
805
806 RETURN l_assign_appl;
807 END Channel_InstrAssignment_Appl;
808
809 -- Verifies that the channel is correct for the given
810 -- instrument assignment
811 --
812 FUNCTION InstrAssignment_Channel_Valid
813 (p_channel IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE,
814 p_assign IN iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE,
815 x_channel_instr OUT NOCOPY iby_fndcpt_pmt_chnnls_b.instrument_type%TYPE
816 )
817 RETURN BOOLEAN
818 IS
819 l_assign_id iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE;
820 l_assign_appl iby_pmt_mthd_attrib_appl.attribute_applicability%TYPE;
821
822 -- cursor def changes for bug 5117954
823 CURSOR c_channel_assign
824 (ci_channel_code IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE,
825 ci_assign_id IN iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE
826 )
827 IS
828 SELECT c.instrument_type, u.instrument_payment_use_id
829 FROM iby_fndcpt_pmt_chnnls_b c, iby_pmt_instr_uses_all u
830 WHERE (payment_channel_code = ci_channel_code)
831 AND (u.instrument_payment_use_id (+) = ci_assign_id)
832 AND (c.instrument_type = u.instrument_type(+))
833 AND (NVL(payment_flow,IBY_FNDCPT_SETUP_PUB.G_PMT_FLOW_FNDCPT)
834 = IBY_FNDCPT_SETUP_PUB.G_PMT_FLOW_FNDCPT);
835
836 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.InstrAssignment_Channel_Valid';
837 BEGIN
838 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
839 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
840 END IF;
841
842 IF (c_channel_assign%ISOPEN) THEN CLOSE c_channel_assign; END IF;
843
844 OPEN c_channel_assign(p_channel,p_assign);
845 FETCH c_channel_assign INTO x_channel_instr, l_assign_id;
846 CLOSE c_channel_assign;
847
848 l_assign_appl := Channel_InstrAssignment_Appl(p_channel);
849
850 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
851 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
852 END IF;
853
854 IF ((x_channel_instr = IBY_FNDCPT_COMMON_PUB.G_INSTR_TYPE_MANUAL)
855 AND (l_assign_id IS NULL))
856 THEN
857 RETURN TRUE;
858 ELSIF (l_assign_appl = IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_OPTIONAL)
859 THEN
860 RETURN TRUE;
861 ELSIF (NOT l_assign_id IS NULL) THEN
862 RETURN TRUE;
863 ELSE
864 RETURN FALSE;
865 END IF;
866 END InstrAssignment_Channel_Valid;
867
868 --
869 -- USE: Validates the payment instrument assignment for the given payer
870 --
871 FUNCTION Payer_InstrAssignment_Valid
872 (p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
873 p_payer_level IN VARCHAR2,
874 p_payer_equiv IN VARCHAR2,
875 p_channel_code IN iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE,
876 p_instr_assign IN iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE,
877 p_new_extension IN BOOLEAN
878 )
879 RETURN BOOLEAN
880 IS
881 l_assign_id iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE;
882 l_instr_req iby_pmt_mthd_attrib_appl.attribute_applicability%TYPE;
883 l_instr_type iby_fndcpt_payer_assgn_instr_v.instrument_type%TYPE;
884 l_instr_id iby_fndcpt_payer_assgn_instr_v.instrument_id%TYPE;
885 l_info_only iby_fndcpt_payer_assgn_instr_v.card_info_only_flag%TYPE;
886 l_single_use iby_fndcpt_payer_assgn_instr_v.card_single_use_flag%TYPE;
887 l_auth_flag iby_trxn_extensions_v.authorized_flag%TYPE;
888
889 CURSOR c_instr_assigns
890 (ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
891 ci_payer_level IN VARCHAR2,
892 ci_payer_equiv IN VARCHAR2,
893 ci_instr_assign IN iby_fndcpt_payer_assgn_instr_v.instr_assignment_id%TYPE
894 )
895 IS
896 SELECT instr_assignment_id, instrument_type, instrument_id,
897 NVL(card_info_only_flag,'N'), NVL(card_single_use_flag,'N')
898 FROM iby_fndcpt_payer_assgn_instr_v
899 WHERE
900 (instr_assignment_id = ci_instr_assign)
901 AND ext_payer_id IN
902 (
903 SELECT ext_payer_id
904 FROM iby_external_payers_all
905 WHERE (payment_function = ci_payer.Payment_Function)
906 AND (party_id = ci_payer.Party_Id)
907 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
908 (ci_payer.org_type, ci_payer.org_id,
909 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
910 ci_payer_level,ci_payer_equiv,org_type,org_id,
911 cust_account_id,acct_site_use_id) = 'T')
912 );
913
914 CURSOR c_instr_extensions
915 (ci_instr_type IN iby_trxn_extensions_v.instrument_type%TYPE,
916 ci_instr_id IN iby_trxn_extensions_v.instrument_id%TYPE
917 )
918 IS
919 SELECT NVL(authorized_flag,'N')
920 FROM iby_trxn_extensions_v
921 WHERE (instrument_id = ci_instr_id)
922 AND (instrument_type = ci_instr_type);
923
924 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Payer_InstrAssignment_Valid';
925 BEGIN
926 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
927 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
928 END IF;
929
930 iby_debug_pub.add('p_instr_assign: ' || p_instr_assign, iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
931
932 IF (c_instr_assigns%ISOPEN) THEN CLOSE c_instr_assigns; END IF;
933 IF (c_instr_extensions%ISOPEN) THEN CLOSE c_instr_extensions; END IF;
934
935 l_instr_req := Channel_InstrAssignment_Appl(p_channel_code);
936
937 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
938 iby_debug_pub.add('instrument applicability:=' || l_instr_req,G_LEVEL_STATEMENT,l_dbg_mod);
939 END IF;
940
941 IF ((l_instr_req = IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_OPTIONAL)
942 AND (p_instr_assign IS NULL))
943 THEN
944 RETURN TRUE;
945 ELSIF (l_instr_req = IBY_FNDCPT_SETUP_PUB.G_CHNNL_ATTRIB_USE_DISABLED) THEN
946 RETURN (p_instr_assign IS NULL);
947 END IF;
948
949 OPEN c_instr_assigns(p_payer,p_payer_level,p_payer_equiv,p_instr_assign);
950 FETCH c_instr_assigns INTO l_assign_id, l_instr_type, l_instr_id,
951 l_info_only, l_single_use;
952 CLOSE c_instr_assigns;
953
954 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
955 iby_debug_pub.add('fetched assignment id:=' || l_assign_id,
956 G_LEVEL_STATEMENT,l_dbg_mod);
957 iby_debug_pub.add('info only:=' || l_info_only,
958 G_LEVEL_STATEMENT,l_dbg_mod);
959 iby_debug_pub.add('single use:=' || l_single_use,
960 G_LEVEL_STATEMENT,l_dbg_mod);
961 END IF;
962 IF ((l_assign_id IS NULL) OR (l_info_only = 'Y')) THEN
963 RETURN FALSE;
964 ELSE
965 RETURN TRUE;
966 END IF;
967
968 -- cannot use a single-use instrument for a new trxn extension which
969 -- has already been used
970 IF ((l_single_use = 'Y') AND p_new_extension) THEN
971 OPEN c_instr_extensions(l_instr_type,l_instr_id);
972 FETCH c_instr_extensions INTO l_auth_flag;
973 CLOSE c_instr_extensions;
974
975 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
976 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
977 END IF;
978
979 RETURN (NVL(l_auth_flag,'N') = 'N');
980 END IF;
981 END Payer_InstrAssignment_Valid;
982
983
984 FUNCTION Extension_Operation_Exists
985 (p_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
986 RETURN BOOLEAN
987 IS
988 l_count NUMBER;
989 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.Extension_Valid';
990
991 CURSOR c_operation
992 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
993 IS
994 SELECT count(1)
995 FROM iby_trxn_extensions_v
996 WHERE (trxn_extension_id = ci_extension_id)
997 AND (authorization_status IN ( 'AUTH_SUCCESS', 'AUTH_PENDING' ));
998
999 BEGIN
1000 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1001 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
1002 END IF;
1003
1004 IF (c_operation%ISOPEN) THEN CLOSE c_operation; END IF;
1005
1006 OPEN c_operation(p_extension_id);
1007 FETCH c_operation INTO l_count;
1008 IF (c_operation%NOTFOUND) THEN
1009 l_count := 0;
1010 END IF;
1011 CLOSE c_operation;
1012 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1013 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
1014 END IF;
1015
1016
1017 RETURN (l_count > 0);
1018 END Extension_Operation_Exists;
1019
1020 PROCEDURE Create_Transaction_Extension
1021 (
1022 p_api_version IN NUMBER,
1023 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
1024 p_commit IN VARCHAR2 := FND_API.G_TRUE,
1025 x_return_status OUT NOCOPY VARCHAR2,
1026 x_msg_count OUT NOCOPY NUMBER,
1027 x_msg_data OUT NOCOPY VARCHAR2,
1028 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1029 p_payer_equivalency IN VARCHAR2 :=
1030 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
1031 p_pmt_channel IN VARCHAR2,
1032 p_instr_assignment IN NUMBER,
1033 p_trxn_attribs IN TrxnExtension_rec_type,
1034 x_entity_id OUT NOCOPY NUMBER,
1035 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
1036 )
1037 IS
1038 l_api_version CONSTANT NUMBER := 1.0;
1039 l_module CONSTANT VARCHAR2(30) := 'Create_Transaction_Extension';
1040 l_prev_msg_count NUMBER;
1041
1042 l_payer_level VARCHAR2(30);
1043 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
1044 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
1045
1046 l_msg_count NUMBER;
1047 l_msg_data VARCHAR2(300);
1048 l_return_status VARCHAR2(1);
1049 l_resp_rec IBY_PAYMENT_ADAPTER_PUB.SecureCVVResp_rec_type;
1050 l_sec_code VARCHAR2(10);
1051 l_encrypted VARCHAR2(1) := 'N';
1052 l_segment_id NUMBER;
1053
1054 lx_channel_instr iby_fndcpt_pmt_chnnls_b.instrument_type%TYPE;
1055
1056 lx_result IBY_FNDCPT_COMMON_PUB.Result_rec_type;
1057
1058 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
1059 BEGIN
1060 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1061 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
1062 END IF;
1063
1064 -- test_debug('Create_Transaction_Extension=> Enter..');
1065
1066 IF NOT FND_API.Compatible_API_Call (l_api_version,
1067 p_api_version,
1068 l_module,
1069 G_PKG_NAME)
1070 THEN
1071 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1072 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
1073 debug_level => G_LEVEL_ERROR,
1074 module => G_DEBUG_MODULE || l_module);
1075 END IF;
1076 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
1077 FND_MSG_PUB.Add;
1078 RAISE FND_API.G_EXC_ERROR;
1079 END IF;
1080
1081 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1082 FND_MSG_PUB.initialize;
1083 END IF;
1084 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
1085
1086 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1087 iby_debug_pub.add('checking payer context',G_LEVEL_STATEMENT,l_dbg_mod);
1088 iby_debug_pub.add('p_payer.Party_Id: '|| p_payer.Party_Id,G_LEVEL_STATEMENT,l_dbg_mod);
1089 iby_debug_pub.add('p_payer.Org_Id: '|| p_payer.Org_Id,G_LEVEL_STATEMENT,l_dbg_mod);
1090 iby_debug_pub.add('p_payer.Cust_Account_Id: '|| p_payer.Cust_Account_Id,G_LEVEL_STATEMENT,l_dbg_mod);
1091 iby_debug_pub.add('p_payer.Account_Site_Id: '|| p_payer.Account_Site_Id,G_LEVEL_STATEMENT,l_dbg_mod);
1092 iby_debug_pub.add('p_instr_assignment: '|| p_instr_assignment,G_LEVEL_STATEMENT,l_dbg_mod);
1093 END IF;
1094 -- test_debug('Create_Transaction_Extension=> Checking Payer context..');
1095
1096 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
1097 l_payer_level,l_payer_id,l_payer_attribs);
1098
1099 iby_debug_pub.add('l_payer_level: '|| l_payer_level,G_LEVEL_STATEMENT,l_dbg_mod);
1100 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
1101
1102 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
1103 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
1104 ELSE
1105 -- We do not need to check against the MAX_TANGIBLEID_LEN, because
1106 -- we now generate the tangibleid using <apps short name>_<trxn_extension_id>
1107 IF (p_trxn_attribs.Order_Id IS NULL)
1108 -- OR (LENGTH(Get_Tangible_Id(p_trxn_attribs.Originating_Application_Id,
1109 -- p_trxn_attribs.Order_Id,
1110 -- p_trxn_attribs.Trxn_Ref_Number1,
1111 -- p_trxn_attribs.Trxn_Ref_Number2))
1112 -- > iby_bill_pkg.G_MAX_TANGIBLEID_LEN
1113 -- )
1114 THEN
1115 -- test_debug('invalid order id');
1116 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1117 iby_debug_pub.add('invalid order id',G_LEVEL_ERROR,l_dbg_mod);
1118 END IF;
1119 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
1120 iby_fndcpt_common_pub.Prepare_Result
1121 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1122 RETURN;
1123 END IF;
1124
1125 -- channel must be assigned to an equivalent payer
1126 --
1127 IF (NOT Payer_Channel_Valid(p_payer,l_payer_level,
1128 p_payer_equivalency,p_pmt_channel))
1129 THEN
1130 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_CHNNL;
1131 iby_fndcpt_common_pub.Prepare_Result
1132 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1133 RETURN;
1134 END IF;
1135
1136 iby_debug_pub.add('p_pmt_channel = '|| p_pmt_channel, iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
1137
1138 --
1139 -- instrument assignment must be to an instrument of the same type
1140 -- as the payment channel's
1141 --
1142 IF (NOT InstrAssignment_Channel_Valid(p_pmt_channel,p_instr_assignment,
1143 lx_channel_instr))
1144 THEN
1145 -- test_debug('instrument asssignment not valid for channel');
1146 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1147 iby_debug_pub.add('instrument asssignment not valid for channel',
1148 G_LEVEL_ERROR,l_dbg_mod);
1149 END IF;
1150 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTR_ASSIGN;
1151 iby_fndcpt_common_pub.Prepare_Result
1152 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1153 RETURN;
1154 END IF;
1155
1156 --
1157 -- instrument must be assigned to an equivalent payer
1158 --
1159 IF (NOT Payer_InstrAssignment_Valid(p_payer,l_payer_level,
1160 p_payer_equivalency,
1161 p_pmt_channel,
1162 p_instr_assignment,TRUE))
1163 THEN
1164 --test_debug('instrument asssignment not valid payer');
1165 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1166 iby_debug_pub.add('instrument asssignment not valid payer',
1167 G_LEVEL_ERROR,l_dbg_mod);
1168 END IF;
1169 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTR_ASSIGN;
1170 iby_fndcpt_common_pub.Prepare_Result
1171 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1172 RETURN;
1173 END IF;
1174
1175 -- validate bank end-dates
1176 IF (lx_channel_instr = IBY_FNDCPT_COMMON_PUB.G_INSTR_TYPE_BANKACCT) THEN
1177 null;
1178 END IF;
1179
1180 IF (NOT Extension_Valid(p_pmt_channel,p_trxn_attribs,FALSE,FALSE)) THEN
1181 --test_debug('invalid trxn extension attributes');
1182 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1183 iby_debug_pub.add('invalid trxn extension attributes',
1184 G_LEVEL_ERROR,l_dbg_mod);
1185 END IF;
1186 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
1187 ELSE
1188
1189 -- create payer on the fly if necessary
1190 IF (l_payer_id IS NULL) THEN
1191 IBY_FNDCPT_SETUP_PUB.Set_Payer_Attributes
1192 (1.0, FND_API.G_FALSE, FND_API.G_FALSE,
1193 x_return_status, x_msg_count, x_msg_data,
1194 p_payer, l_payer_attribs, l_payer_id, lx_result
1195 );
1196
1197 IF (lx_result.Result_Code <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS) THEN
1198 --test_debug('could not set payer attributes');
1199 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1200 iby_debug_pub.add('could not set payer attributes',
1201 G_LEVEL_ERROR,l_dbg_mod);
1202 END IF;
1203 x_response := lx_result;
1204 RETURN;
1205 END IF;
1206 END IF;
1207
1208 -- PABP: For IMMEDIATE mode of encryption, make an http callout --
1209 -- to the ECApp and encrypt the CVV value --
1210 IF (NOT ((p_trxn_attribs.Instrument_Security_Code IS NULL) OR
1211 (p_trxn_attribs.Instrument_security_Code = FND_API.G_MISS_CHAR))
1212 ) THEN
1213 -- Security code must be numeric
1214 IF('Y' <> IBY_UTILITY_PVT.isNumeric(l_sec_code)) THEN
1215 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1216 iby_debug_pub.add(debug_msg => 'Invalid CVV format',
1217 debug_level => G_LEVEL_ERROR,
1218 module => G_DEBUG_MODULE || l_module);
1219 END IF;
1220 FND_MESSAGE.SET_NAME('IBY', 'IBY_204900');
1221 FND_MSG_PUB.Add;
1222 RAISE FND_API.G_EXC_ERROR;
1223 END IF;
1224
1225 -- Security code should be 3-4 digits
1226 IF((LENGTH(l_sec_code) > 4) OR (LENGTH(l_sec_code) < 3) ) THEN
1227 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1228 iby_debug_pub.add(debug_msg => 'Invalid CVV length',
1229 debug_level => G_LEVEL_ERROR,
1230 module => G_DEBUG_MODULE || l_module);
1231 END IF;
1232 FND_MESSAGE.SET_NAME('IBY', 'IBY_204901');
1233 FND_MSG_PUB.Add;
1234 RAISE FND_API.G_EXC_ERROR;
1235 END IF;
1236 IF ('IMMEDIATE' = IBY_CREDITCARD_PKG.Get_CC_Encrypt_Mode()) THEN
1237 -- Make an HTTP call out to the middle tier
1238 -- test_debug('calling secure_extension..');
1239 IBY_PAYMENT_ADAPTER_PUB.OraSecureExtension
1240 (FND_API.G_FALSE,
1241 p_trxn_attribs.Instrument_security_Code,
1242 l_return_status,
1243 l_msg_count,
1244 l_msg_data,
1245 l_resp_rec
1246 );
1247
1248 --test_debug('after call to ora secure: respRec: '|| l_resp_rec.Segment_ID);
1249 IF (NOT (l_resp_rec.Segment_ID IS NULL)) THEN
1250 -- test_debug('cvv encryption successful..');
1251 l_segment_id := l_resp_rec.Segment_ID;
1252 l_encrypted := 'Y';
1253 l_sec_code := LPAD('X',LENGTH(p_trxn_attribs.Instrument_Security_Code),'X');
1254 ELSE
1255 -- test_debug('Unknown error occurred while cvv encryption !!');
1256 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1257 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1258 iby_debug_pub.add(debug_msg => 'Unknown error occurred while cvv encryption !!',
1259 debug_level => G_LEVEL_ERROR,
1260 module => G_DEBUG_MODULE || l_module);
1261 END IF;
1262 FND_MESSAGE.SET_NAME('IBY', 'IBY_204902');
1263 FND_MSG_PUB.Add;
1264 RAISE FND_API.G_EXC_ERROR;
1265 END IF;
1266 l_segment_id := null;
1267 l_encrypted := 'N';
1268 l_sec_code := null;
1269 END IF;
1270
1271 ELSE
1272 l_segment_id := null;
1273 l_encrypted := 'N';
1274 l_sec_code := p_trxn_attribs.Instrument_Security_Code;
1275 END IF;
1276 END IF;
1277 -- test_debug('l_segment_id: '|| l_segment_id);
1278 -- test_debug('l_encrypted: '|| l_encrypted);
1279 -- test_debug('l_sec_code: '|| l_sec_code);
1280
1281 SELECT iby_fndcpt_tx_extensions_s.NEXTVAL INTO x_entity_id FROM DUAL;
1282
1283 INSERT INTO iby_fndcpt_tx_extensions
1284 (trxn_extension_id, payment_channel_code, ext_payer_id,
1285 instr_assignment_id, origin_application_id, instrument_security_code,
1286 voice_authorization_flag, voice_authorization_date,
1287 voice_authorization_code, order_id, po_number,
1288 po_line_number, trxn_ref_number1, trxn_ref_number2, additional_info,
1289 instr_sec_code_length, encrypted, instr_code_sec_segment_id,
1290 created_by, creation_date, last_updated_by, last_update_date,
1291 last_update_login, object_version_number,seq_type_last
1292 )
1293 VALUES
1294 (
1295 x_entity_id, p_pmt_channel, l_payer_id, p_instr_assignment,
1296 p_trxn_attribs.Originating_Application_Id,
1297 l_sec_code,
1298 p_trxn_attribs.VoiceAuth_Flag,
1299 p_trxn_attribs.VoiceAuth_Date, p_trxn_attribs.VoiceAuth_Code,
1300 p_trxn_attribs.Order_Id, p_trxn_attribs.PO_Number,
1301 p_trxn_attribs.PO_Line_Number,
1302 p_trxn_attribs.Trxn_Ref_Number1, p_trxn_attribs.Trxn_Ref_Number2,
1303 p_trxn_attribs.Additional_Info,
1304 length(p_trxn_attribs.Instrument_Security_Code), l_encrypted,
1305 l_segment_id,
1306 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
1307 fnd_global.login_id, 1, p_trxn_attribs.seq_type_last
1308 );
1309 END IF;
1310
1311 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
1312 END IF;
1313
1314 iby_fndcpt_common_pub.Prepare_Result
1315 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1316
1317 IF FND_API.To_Boolean(p_commit) THEN
1318 COMMIT;
1319 END IF;
1320
1321 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1322 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
1323 END IF;
1324
1325
1326 EXCEPTION
1327
1328 WHEN FND_API.G_EXC_ERROR THEN
1329
1330 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
1331 debug_level => G_LEVEL_ERROR,
1332 module => G_DEBUG_MODULE || l_module);
1333 x_return_status := FND_API.G_RET_STS_ERROR;
1334 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1335 p_data => x_msg_data
1336 );
1337 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1338
1339 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
1340 debug_level => G_LEVEL_UNEXPECTED,
1341 module => G_DEBUG_MODULE || l_module);
1342 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1343 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1344 p_data => x_msg_data
1345 );
1346 WHEN OTHERS THEN
1347
1348 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
1349 debug_level => G_LEVEL_UNEXPECTED,
1350 module => G_DEBUG_MODULE || l_module);
1351
1352 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
1353
1354 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1355 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1356 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
1357 END IF;
1358 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1359 p_data => x_msg_data
1360 );
1361 END Create_Transaction_Extension;
1362
1363
1364 PROCEDURE Update_Transaction_Extension
1365 (
1366 p_api_version IN NUMBER,
1367 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
1368 p_commit IN VARCHAR2 := FND_API.G_TRUE,
1369 x_return_status OUT NOCOPY VARCHAR2,
1370 x_msg_count OUT NOCOPY NUMBER,
1371 x_msg_data OUT NOCOPY VARCHAR2,
1372 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1373 p_payer_equivalency IN VARCHAR2 :=
1374 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
1375 p_entity_id IN NUMBER,
1376 p_pmt_channel IN VARCHAR2,
1377 p_instr_assignment IN NUMBER,
1378 p_trxn_attribs IN TrxnExtension_rec_type,
1379 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
1380 )
1381 IS
1382 l_api_version CONSTANT NUMBER := 1.0;
1383 l_module CONSTANT VARCHAR2(30) := 'Update_Transaction_Extension';
1384 l_prev_msg_count NUMBER;
1385
1386 l_payer_level VARCHAR2(30);
1387 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
1388 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
1389
1390 l_xtension_id iby_fndcpt_tx_extensions.trxn_extension_id%TYPE;
1391 l_pmt_channel iby_fndcpt_pmt_chnnls_b.payment_channel_code%TYPE;
1392 l_instr_assign iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE;
1393 l_order_id iby_fndcpt_tx_extensions.order_id%TYPE;
1394 l_trxn_ref1 iby_fndcpt_tx_extensions.trxn_ref_number1%TYPE;
1395 l_trxn_ref2 iby_fndcpt_tx_extensions.trxn_ref_number2%TYPE;
1396 l_app_id iby_fndcpt_tx_extensions.origin_application_id%TYPE;
1397 -- l_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
1398
1399 lx_channel_instr iby_fndcpt_pmt_chnnls_b.instrument_type%TYPE;
1400
1401 l_msg_count NUMBER;
1402 l_msg_data VARCHAR2(300);
1403 l_return_status VARCHAR2(1);
1404 l_resp_rec IBY_PAYMENT_ADAPTER_PUB.SecureCVVResp_rec_type;
1405 l_sec_code VARCHAR2(10);
1406 l_encrypted VARCHAR2(1) := 'N';
1407 l_seg_id_old NUMBER;
1408 l_segment_id NUMBER;
1409 l_instrumenttype iby_fndcpt_pmt_chnnls_b.instrument_type%TYPE;
1410
1411 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || l_module;
1412
1413 CURSOR c_extension
1414 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
1415 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1416 ci_payer_level IN VARCHAR2,
1417 ci_payer_equiv IN VARCHAR2
1418 )
1419 IS
1420 SELECT
1421 x.trxn_extension_id, x.payment_channel_code, x.instr_assignment_id,
1422 x.order_id, x.trxn_ref_number1, x.trxn_ref_number2,
1423 x.origin_application_id, x.instr_code_sec_segment_id
1424 FROM iby_fndcpt_tx_extensions x, iby_external_payers_all p
1425 WHERE (x.ext_payer_id = p.ext_payer_id)
1426 AND (x.trxn_extension_id = ci_extension_id)
1427 AND (p.party_id = ci_payer.Party_Id)
1428 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
1429 (ci_payer.org_type, ci_payer.org_id,
1430 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
1431 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
1432 p.cust_account_id,p.acct_site_use_id) = 'T');
1433
1434 BEGIN
1435 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1436 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
1437 END IF;
1438
1439 -- test_debug('update_extension called..');
1440
1441 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
1442
1443 IF NOT FND_API.Compatible_API_Call (l_api_version,
1444 p_api_version,
1445 l_module,
1446 G_PKG_NAME)
1447 THEN
1448 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1449 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
1450 debug_level => G_LEVEL_ERROR,
1451 module => G_DEBUG_MODULE || l_module);
1452 END IF;
1453 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
1454 FND_MSG_PUB.Add;
1455 RAISE FND_API.G_EXC_ERROR;
1456 END IF;
1457
1458 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1459 FND_MSG_PUB.initialize;
1460 END IF;
1461 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
1462
1463 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1464 iby_debug_pub.add('checking payer context',G_LEVEL_STATEMENT,l_dbg_mod);
1465 END IF;
1466 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
1467 l_payer_level,l_payer_id,l_payer_attribs);
1468
1469 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
1470 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
1471 ELSE
1472 -- verify the transaction id is for a payer equivalent to the
1473 -- given one
1474 OPEN c_extension(p_entity_id,p_payer,l_payer_level,p_payer_equivalency);
1475 FETCH c_extension INTO l_xtension_id, l_pmt_channel, l_instr_assign,
1476 l_order_id, l_trxn_ref1, l_trxn_ref2, l_app_id, l_seg_id_old;
1477 CLOSE c_extension;
1478
1479 l_order_id := NVL(p_trxn_attribs.Order_Id,l_order_id);
1480 l_trxn_ref1 := NVL(p_trxn_attribs.Trxn_Ref_Number1,l_trxn_ref1);
1481 l_trxn_ref2 := NVL(p_trxn_attribs.Trxn_Ref_Number2,l_trxn_ref2);
1482 l_app_id := NVL(p_trxn_attribs.Originating_Application_Id,l_app_id);
1483
1484 IF (LENGTH(Get_Tangible_Id(l_app_id,l_order_id,l_trxn_ref1,
1485 l_trxn_ref2))
1486 > iby_bill_pkg.G_MAX_TANGIBLEID_LEN
1487 )
1488 THEN
1489 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1490 iby_debug_pub.add('invalid order id',G_LEVEL_ERROR,l_dbg_mod);
1491 END IF;
1492 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
1493 iby_fndcpt_common_pub.Prepare_Result
1494 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1495 RETURN;
1496 END IF;
1497
1498 l_pmt_channel := NVL(p_pmt_channel,l_pmt_channel);
1499 IF (p_instr_assignment = FND_API.G_MISS_NUM) THEN
1500 l_instr_assign := NULL;
1501 ELSIF (NOT p_instr_assignment IS NULL) THEN
1502 l_instr_ASSIGN := p_instr_assignment;
1503 END IF;
1504
1505 IF (NOT l_xtension_id IS NULL) THEN
1506 --
1507 -- validate the trxn attributes; note that mandatory ones
1508 -- may be NULL in which case the current values will be used
1509 --
1510 -- Bug# 9532083
1511 -- Retrieve instrument type for the given payment channel code
1512 --
1513 SELECT instrument_type into l_instrumenttype from iby_fndcpt_pmt_chnnls_b where
1514 payment_channel_code = l_pmt_channel;
1515
1516 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1517 iby_debug_pub.add('l_pmt_channel: ' || l_pmt_channel,G_LEVEL_STATEMENT,l_dbg_mod);
1518 iby_debug_pub.add('l_instrumenttype: ' || l_instrumenttype,G_LEVEL_STATEMENT,l_dbg_mod);
1519 iby_debug_pub.add('l_seg_id_old: ' || l_seg_id_old,G_LEVEL_STATEMENT,l_dbg_mod);
1520 END IF;
1521
1522 IF (NOT Extension_Valid(l_pmt_channel,p_trxn_attribs,TRUE,FALSE)) THEN
1523 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1524 iby_debug_pub.add('invalid extension attributes',G_LEVEL_ERROR,l_dbg_mod);
1525 END IF;
1526 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
1527 --
1528 -- make sure no operations already performed on the extension;
1529 --
1530 -- Bug# 9362804
1531 -- It is entirely possible that a customer may change their bank
1532 -- account within the duration of an invoice to be paid in installments e.g.
1533 -- annual council tax to be paid in 12 installments. Whatever logic there is to
1534 -- preventing a change of credit card, where there has been an authorization for
1535 -- the full amount, no such logic should be applied in changing bank accounts.
1536 --
1537 -- Bug# 9532083
1538 -- Comparing instrument type instead of payment channel code
1539 --
1540
1541 ELSIF ( Extension_Operation_Exists(p_entity_id) AND l_instrumenttype <> BA_INSTR_TYPE) THEN
1542 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1543 iby_debug_pub.add('operations exist for extension; cannot update',
1544 G_LEVEL_ERROR,l_dbg_mod);
1545 END IF;
1546 x_response.Result_Code := G_RC_EXTENSION_IMMUTABLE;
1547 ELSE
1548
1549 IF (NOT p_pmt_channel IS NULL) OR (NOT p_instr_assignment IS NULL)
1550 THEN
1551 IF (NOT Payer_Channel_Valid(p_payer,l_payer_level,
1552 p_payer_equivalency,l_pmt_channel))
1553 THEN
1554 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1555 iby_debug_pub.add('invalid payment channel for payer',G_LEVEL_ERROR,l_dbg_mod);
1556 END IF;
1557 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_CHNNL;
1558 iby_fndcpt_common_pub.Prepare_Result
1559 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,
1560 x_response);
1561 RETURN;
1562 END IF;
1563
1564 IF (NOT InstrAssignment_Channel_Valid(l_pmt_channel,l_instr_assign,
1565 lx_channel_instr))
1566 OR
1567 (NOT Payer_InstrAssignment_Valid(p_payer,l_payer_level,
1568 p_payer_equivalency,
1569 l_pmt_channel,
1570 l_instr_assign,FALSE))
1571 THEN
1572 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1573 iby_debug_pub.add('invalid payment channel for instrument or payer',
1574 G_LEVEL_ERROR,l_dbg_mod);
1575 END IF;
1576 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTR_ASSIGN;
1577 iby_fndcpt_common_pub.Prepare_Result
1578 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,
1579 x_response);
1580 RETURN;
1581 END IF;
1582 END IF;
1583
1584
1585 -- PABP: For IMMEDIATE mode of encryption, make an http callout --
1586 -- to the ECApp and encrypt the CVV value
1587 -- Bug# 12335720
1588 -- Skip the validation if the security code passed as 'XXX' or 'XXXX'
1589 IF (NOT ((p_trxn_attribs.Instrument_Security_Code IS NULL) OR
1590 (p_trxn_attribs.Instrument_security_Code = FND_API.G_MISS_CHAR) OR
1591 (p_trxn_attribs.Instrument_security_Code = 'XXX') OR
1592 (p_trxn_attribs.Instrument_security_Code = 'XXXX'))
1593 ) THEN
1594 IF('Y' <> IBY_UTILITY_PVT.isNumeric(l_sec_code)) THEN
1595 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1596 iby_debug_pub.add(debug_msg => 'Invalid CVV format',
1597 debug_level => G_LEVEL_ERROR,
1598 module => G_DEBUG_MODULE || l_module);
1599 END IF;
1600 FND_MESSAGE.SET_NAME('IBY', 'IBY_204900');
1601 FND_MSG_PUB.Add;
1602 RAISE FND_API.G_EXC_ERROR;
1603 END IF;
1604
1605 -- Security code should be 3-4 digits
1606 IF((LENGTH(l_sec_code) > 4) OR (LENGTH(l_sec_code) < 3) ) THEN
1607 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1608 iby_debug_pub.add(debug_msg => 'Invalid CVV length',
1609 debug_level => G_LEVEL_ERROR,
1610 module => G_DEBUG_MODULE || l_module);
1611 END IF;
1612 FND_MESSAGE.SET_NAME('IBY', 'IBY_204901');
1613 FND_MSG_PUB.Add;
1614 RAISE FND_API.G_EXC_ERROR;
1615 END IF;
1616
1617 IF ('IMMEDIATE' = IBY_CREDITCARD_PKG.Get_CC_Encrypt_Mode()) THEN
1618 -- Make an HTTP call out to the middle tier
1619 -- test_debug('calling secure_extension..');
1620 IBY_PAYMENT_ADAPTER_PUB.OraSecureExtension
1621 (FND_API.G_FALSE,
1622 p_trxn_attribs.Instrument_security_Code,
1623 l_return_status,
1624 l_msg_count,
1625 l_msg_data,
1626 l_resp_rec
1627 );
1628 IF (NOT (l_resp_rec.Segment_ID IS NULL) )
1629 THEN
1630
1631 -- test_debug('cvv encryption successful..');
1632
1633 l_segment_id := l_resp_rec.Segment_ID;
1634 l_encrypted := 'Y';
1635 l_sec_code := LPAD('X',LENGTH(p_trxn_attribs.Instrument_Security_Code),'X');
1636 ELSE
1637 -- test_debug('Unknown error occurred while cvv encryption !!');
1638 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1639 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1640 iby_debug_pub.add(debug_msg => 'Unknown error occurred while cvv encryption !!',
1641 debug_level => G_LEVEL_ERROR,
1642 module => G_DEBUG_MODULE || l_module);
1643 END IF;
1644 FND_MESSAGE.SET_NAME('IBY', 'IBY_204902');
1645 FND_MSG_PUB.Add;
1646 RAISE FND_API.G_EXC_ERROR;
1647 END IF;
1648 l_segment_id := null;
1649 l_encrypted := 'N';
1650 l_sec_code := null;
1651 END IF;
1652
1653 ELSE
1654 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1655 iby_debug_pub.add(debug_msg => 'Skipping the Security Code validation !!',
1656 debug_level => G_LEVEL_ERROR,
1657 module => G_DEBUG_MODULE || l_module);
1658 END IF;
1659 l_segment_id := null;
1660 -- Bug# 13893195
1661 -- Since the 'ENCRYPTED' column in iby_fndcpt_tx_extensions is not nullable,
1662 -- Setting the value to 'N'
1663 l_encrypted := 'N';
1664 l_sec_code := p_trxn_attribs.Instrument_Security_Code;
1665 END IF;
1666 END IF;
1667 -- test_debug('l_segment_id: '|| l_segment_id);
1668 -- test_debug('l_encrypted: '|| l_encrypted);
1669 -- test_debug('l_sec_code: '|| l_sec_code);
1670
1671
1672 --
1673 -- trxn attrib validation ensures that required columns will
1674 -- not be null'd out; note that GSCC standard File.Sql.48
1675 -- defines NULL values as missing and G_MISS_XXX values
1676 -- as an intention to NULL-out
1677 --
1678 -- test_debug('p_trxn_attribs.Instrument_Security_Code: '||p_trxn_attribs.Instrument_Security_Code);
1679 -- test_debug('encrypted: '||);
1680 --Bug# 14690786
1681 --When XXX or XXXX is passes as instrument security code, leave the original
1682 --as it is. Included these two values in the decode
1683 UPDATE iby_fndcpt_tx_extensions
1684 SET
1685 payment_channel_code = NVL(p_pmt_channel,payment_channel_code),
1686 instr_assignment_id =
1687 DECODE(p_instr_assignment, FND_API.G_MISS_NUM,NULL,
1688 NULL,instr_assignment_id, p_instr_assignment),
1689 origin_application_id =
1690 NVL(p_trxn_attribs.Originating_Application_Id,
1691 origin_application_id),
1692 instrument_security_code =
1693 DECODE(p_trxn_attribs.Instrument_Security_Code,
1694 FND_API.G_MISS_CHAR,NULL, NULL,instrument_security_code,
1695 'XXX', instrument_security_code,
1696 'XXXX', instrument_security_code,
1697 l_sec_code),
1698 instr_sec_code_length =
1699 length(DECODE(p_trxn_attribs.Instrument_Security_Code,
1700 FND_API.G_MISS_CHAR,NULL,
1701 NULL,instrument_security_code,
1702 'XXX', instrument_security_code,
1703 'XXXX', instrument_security_code,
1704 l_sec_code)
1705 ),
1706 encrypted =
1707 DECODE(p_trxn_attribs.Instrument_Security_Code,
1708 FND_API.G_MISS_CHAR,'N', NULL,encrypted, l_encrypted),
1709 instr_code_sec_segment_id =
1710 NVL(l_segment_id, instr_code_sec_segment_id),
1711 voice_authorization_flag =
1712 DECODE(p_trxn_attribs.VoiceAuth_Flag, FND_API.G_MISS_CHAR,NULL,
1713 NULL,voice_authorization_flag, p_trxn_attribs.VoiceAuth_Flag),
1714 voice_authorization_date =
1715 DECODE(p_trxn_attribs.VoiceAuth_Date, FND_API.G_MISS_DATE,NULL,
1716 NULL,voice_authorization_date, p_trxn_attribs.VoiceAuth_Date),
1717 voice_authorization_code =
1718 DECODE(p_trxn_attribs.VoiceAuth_Code, FND_API.G_MISS_CHAR,NULL,
1719 NULL,voice_authorization_code, p_trxn_attribs.VoiceAuth_Code),
1720 order_id = NVL(p_trxn_attribs.Order_Id, order_id),
1721 po_number = DECODE(p_trxn_attribs.PO_Number, FND_API.G_MISS_CHAR,NULL,
1722 NULL,po_number, p_trxn_attribs.PO_Number),
1723 po_line_number = DECODE(p_trxn_attribs.PO_Line_Number,
1724 FND_API.G_MISS_CHAR,NULL, NULL,po_line_number,
1725 p_trxn_attribs.PO_Line_Number),
1726 trxn_ref_number1 = DECODE(p_trxn_attribs.Trxn_Ref_Number1,
1727 FND_API.G_MISS_CHAR,NULL, NULL,trxn_ref_number1,
1728 p_trxn_attribs.Trxn_Ref_Number1),
1729 trxn_ref_number2 = DECODE(p_trxn_attribs.Trxn_Ref_Number2,
1730 FND_API.G_MISS_CHAR,NULL, NULL,trxn_ref_number2,
1731 p_trxn_attribs.Trxn_Ref_Number2),
1732 additional_info = DECODE(p_trxn_attribs.Additional_Info,
1733 FND_API.G_MISS_CHAR,NULL, NULL,additional_info,
1734 p_trxn_attribs.Additional_Info),
1735 last_updated_by = fnd_global.user_id,
1736 last_update_date = SYSDATE,
1737 last_update_login = fnd_global.login_id,
1738 object_version_number = object_version_number + 1
1739 WHERE (trxn_extension_id = p_entity_id);
1740
1741 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1742 iby_debug_pub.add('updating extension',G_LEVEL_STATEMENT,l_dbg_mod);
1743 END IF;
1744 IF (NOT p_trxn_attribs.Instrument_Security_Code IS NULL) AND
1745 (p_trxn_attribs.Instrument_Security_Code <> FND_API.G_MISS_CHAR)
1746 THEN
1747 iby_debug_pub.add('deleting l_seg_id_old',G_LEVEL_STATEMENT,l_dbg_mod);
1748 DELETE FROM iby_security_segments
1749 WHERE (sec_segment_id = l_seg_id_old);
1750 END IF;
1751
1752 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
1753 END IF;
1754 ELSE
1755 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
1756 END IF;
1757 END IF;
1758
1759 IF FND_API.To_Boolean(p_commit) THEN
1760 COMMIT;
1761 END IF;
1762
1763 iby_fndcpt_common_pub.Prepare_Result
1764 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1765
1766 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1767 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
1768 END IF;
1769
1770 EXCEPTION
1771
1772 WHEN FND_API.G_EXC_ERROR THEN
1773
1774 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
1775 debug_level => G_LEVEL_ERROR,
1776 module => G_DEBUG_MODULE || l_module);
1777 x_return_status := FND_API.G_RET_STS_ERROR;
1778 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1779 p_data => x_msg_data
1780 );
1781 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1782
1783 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
1784 debug_level => G_LEVEL_UNEXPECTED,
1785 module => G_DEBUG_MODULE || l_module);
1786 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1787 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1788 p_data => x_msg_data
1789 );
1790 WHEN OTHERS THEN
1791
1792 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
1793 debug_level => G_LEVEL_UNEXPECTED,
1794 module => G_DEBUG_MODULE || l_module);
1795
1796 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
1797
1798 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1799 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1800 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
1801 END IF;
1802
1803 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1804 p_data => x_msg_data
1805 );
1806
1807 END Update_Transaction_Extension;
1808
1809
1810 PROCEDURE Get_Transaction_Extension
1811 (
1812 p_api_version IN NUMBER,
1813 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
1814 x_return_status OUT NOCOPY VARCHAR2,
1815 x_msg_count OUT NOCOPY NUMBER,
1816 x_msg_data OUT NOCOPY VARCHAR2,
1817 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1818 p_entity_id IN NUMBER,
1819 x_trxn_attribs OUT NOCOPY TrxnExtension_rec_type,
1820 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
1821 )
1822 IS
1823 l_api_version CONSTANT NUMBER := 1.0;
1824 l_module CONSTANT VARCHAR2(30) := 'Get_Transaction_Extension';
1825 l_prev_msg_count NUMBER;
1826
1827 l_payer_level VARCHAR2(30);
1828 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
1829 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
1830
1831 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || l_module;
1832
1833 CURSOR c_extension
1834 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
1835 IS
1836 SELECT
1837 origin_application_id, RPAD('X',instr_sec_code_length,'X'),
1838 voice_authorization_flag, voice_authorization_date,
1839 voice_authorization_code, order_id, po_number,
1840 po_line_number, trxn_ref_number1, trxn_ref_number2, additional_info
1841 FROM iby_fndcpt_tx_extensions
1842 WHERE trxn_extension_id = ci_extension_id;
1843
1844 BEGIN
1845 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1846 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
1847 END IF;
1848
1849 IF (c_extension%ISOPEN) THEN
1850 CLOSE c_extension;
1851 END IF;
1852
1853 IF NOT FND_API.Compatible_API_Call (l_api_version,
1854 p_api_version,
1855 l_module,
1856 G_PKG_NAME)
1857 THEN
1858 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1859 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
1860 debug_level => G_LEVEL_ERROR,
1861 module => G_DEBUG_MODULE || l_module);
1862 END IF;
1863 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
1864 FND_MSG_PUB.Add;
1865 RAISE FND_API.G_EXC_ERROR;
1866 END IF;
1867
1868 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1869 FND_MSG_PUB.initialize;
1870 END IF;
1871 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
1872
1873 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1874 iby_debug_pub.add('checking payer contxt',G_LEVEL_STATEMENT,l_dbg_mod);
1875 END IF;
1876 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
1877 l_payer_level,l_payer_id,l_payer_attribs);
1878
1879 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
1880 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
1881 ELSE
1882 OPEN c_extension(p_entity_id);
1883 FETCH c_extension INTO
1884 x_trxn_attribs.Originating_Application_Id,
1885 x_trxn_attribs.Instrument_Security_Code,
1886 x_trxn_attribs.VoiceAuth_Flag, x_trxn_attribs.VoiceAuth_Date,
1887 x_trxn_attribs.VoiceAuth_Code, x_trxn_attribs.Order_Id,
1888 x_trxn_attribs.PO_Number, x_trxn_attribs.PO_Line_Number,
1889 x_trxn_attribs.Trxn_Ref_Number1, x_trxn_attribs.Trxn_Ref_Number2,
1890 x_trxn_attribs.Additional_Info;
1891
1892 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
1893 IF (c_extension%NOTFOUND) THEN
1894 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
1895 iby_debug_pub.add('could not find extension',G_LEVEL_ERROR,l_dbg_mod);
1896 END IF;
1897 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
1898 ELSE
1899 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
1900 END IF;
1901 CLOSE c_extension;
1902 END IF;
1903
1904 iby_fndcpt_common_pub.Prepare_Result
1905 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
1906
1907 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
1908 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
1909 END IF;
1910 EXCEPTION
1911
1912 WHEN FND_API.G_EXC_ERROR THEN
1913
1914 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
1915 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
1916 debug_level => G_LEVEL_EXCEPTION,
1917 module => G_DEBUG_MODULE || l_module);
1918 END IF;
1919 x_return_status := FND_API.G_RET_STS_ERROR;
1920 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1921 p_data => x_msg_data
1922 );
1923 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1924
1925 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
1926 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
1927 debug_level => G_LEVEL_UNEXPECTED,
1928 module => G_DEBUG_MODULE || l_module);
1929 END IF;
1930 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1931 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
1932 p_data => x_msg_data
1933 );
1934 WHEN OTHERS THEN
1935
1936 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
1937 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
1938 debug_level => G_LEVEL_UNEXPECTED,
1939 module => G_DEBUG_MODULE || l_module);
1940 END IF;
1941
1942 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
1943
1944 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1945 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1946 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
1947 END IF;
1948
1949 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
1950 p_data => x_msg_data
1951 );
1952
1953 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
1954 iby_debug_pub.add(debug_msg => 'x_return_status=' || x_return_status,
1955 debug_level => G_LEVEL_EXCEPTION,
1956 module => G_DEBUG_MODULE || l_module);
1957 iby_debug_pub.add(debug_msg => 'Exit Exception',
1958 debug_level => G_LEVEL_EXCEPTION,
1959 module => G_DEBUG_MODULE || l_module);
1960 END IF;
1961
1962 END Get_Transaction_Extension;
1963
1964
1965 PROCEDURE Delete_Transaction_Extension
1966 (
1967 p_api_version IN NUMBER,
1968 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
1969 p_commit IN VARCHAR2 := FND_API.G_TRUE,
1970 x_return_status OUT NOCOPY VARCHAR2,
1971 x_msg_count OUT NOCOPY NUMBER,
1972 x_msg_data OUT NOCOPY VARCHAR2,
1973 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1974 p_payer_equivalency IN VARCHAR2 :=
1975 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
1976 p_entity_id IN NUMBER,
1977 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
1978 )
1979 IS
1980 l_api_version CONSTANT NUMBER := 1.0;
1981 l_module CONSTANT VARCHAR2(30) := 'Delete_Transaction_Extension';
1982 l_prev_msg_count NUMBER;
1983
1984 l_payer_level VARCHAR2(30);
1985 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
1986 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
1987
1988 l_extension_id NUMBER;
1989 l_copy_count NUMBER;
1990
1991 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || l_module;
1992
1993 CURSOR c_extension
1994 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
1995 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
1996 ci_payer_level IN VARCHAR2,
1997 ci_payer_equiv IN VARCHAR2
1998 )
1999 IS
2000 SELECT x.trxn_extension_id
2001 FROM iby_fndcpt_tx_extensions x, iby_external_payers_all p,
2002 iby_pmt_instr_uses_all i
2003 WHERE (x.trxn_extension_id = ci_extension_id)
2004 AND (x.instr_assignment_id = i.instrument_payment_use_id(+))
2005 AND (NVL(x.ext_payer_id,i.ext_pmt_party_id) = p.ext_payer_id)
2006 AND (p.party_id = ci_payer.Party_Id)
2007 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
2008 (ci_payer.org_type, ci_payer.org_id,
2009 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
2010 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
2011 p.cust_account_id,p.acct_site_use_id) = 'T');
2012
2013 BEGIN
2014 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2015 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
2016 END IF;
2017
2018 IF (c_extension%ISOPEN) THEN
2019 CLOSE c_extension;
2020 END IF;
2021
2022 IF NOT FND_API.Compatible_API_Call (l_api_version,
2023 p_api_version,
2024 l_module,
2025 G_PKG_NAME)
2026 THEN
2027 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2028 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
2029 debug_level => G_LEVEL_ERROR,
2030 module => G_DEBUG_MODULE || l_module);
2031 END IF;
2032 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
2033 FND_MSG_PUB.Add;
2034 RAISE FND_API.G_EXC_ERROR;
2035 END IF;
2036
2037 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2038 FND_MSG_PUB.initialize;
2039 END IF;
2040 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
2041
2042 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2043 iby_debug_pub.add('checking payer contxt',G_LEVEL_STATEMENT,l_dbg_mod);
2044 END IF;
2045 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
2046 l_payer_level,l_payer_id,l_payer_attribs);
2047
2048 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
2049 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
2050 ELSE
2051 -- verify the transaction id is for a payer equivalent to the
2052 -- given one
2053 OPEN c_extension(p_entity_id,p_payer,l_payer_level,p_payer_equivalency);
2054 FETCH c_extension INTO l_extension_id;
2055 IF (NOT c_extension%NOTFOUND) THEN
2056 -- if trxn extension copied or associated with a payment operation,
2057 -- cannot be deleted
2058 l_copy_count := Get_Tx_Extension_Copy_Count(p_entity_id);
2059 IF ( Extension_Operation_Exists(p_entity_id)
2060 OR (l_copy_count>0) )
2061 THEN
2062 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2063 iby_debug_pub.add('extension copied or operation done; cannot delete',
2064 G_LEVEL_ERROR,l_dbg_mod);
2065 END IF;
2066 x_response.Result_Code := G_RC_EXTENSION_IMMUTABLE;
2067 ELSE
2068 SAVEPOINT Delete_Transaction_Extension;
2069
2070 -- delete all links to its source extensions
2071 DELETE iby_fndcpt_tx_xe_copies
2072 WHERE (copy_trxn_extension_id = p_entity_id);
2073
2074 DELETE iby_fndcpt_tx_extensions
2075 WHERE (trxn_extension_id = p_entity_id);
2076 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
2077 END IF;
2078 ELSE
2079 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
2080 END IF;
2081 CLOSE c_extension;
2082 END IF;
2083
2084 IF FND_API.To_Boolean(p_commit) THEN
2085 COMMIT;
2086 END IF;
2087
2088 iby_fndcpt_common_pub.Prepare_Result
2089 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2090
2091 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2092 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
2093 END IF;
2094 EXCEPTION
2095
2096 WHEN FND_API.G_EXC_ERROR THEN
2097 ROLLBACK TO Delete_Transaction_Extension;
2098 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
2099 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
2100 debug_level => G_LEVEL_EXCEPTION,
2101 module => G_DEBUG_MODULE || l_module);
2102 END IF;
2103 x_return_status := FND_API.G_RET_STS_ERROR;
2104 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2105 p_data => x_msg_data
2106 );
2107 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2108 ROLLBACK TO Delete_Transaction_Extension;
2109 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
2110 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
2111 debug_level => G_LEVEL_UNEXPECTED,
2112 module => G_DEBUG_MODULE || l_module);
2113 END IF;
2114 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2115 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2116 p_data => x_msg_data
2117 );
2118
2119 WHEN OTHERS THEN
2120 ROLLBACK TO Delete_Transaction_Extension;
2121 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
2122 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
2123 debug_level => G_LEVEL_UNEXPECTED,
2124 module => G_DEBUG_MODULE || l_module);
2125 END IF;
2126
2127 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
2128
2129 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2130 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2131 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
2132 END IF;
2133
2134 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
2135 p_data => x_msg_data
2136 );
2137
2138 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
2139 iby_debug_pub.add(debug_msg => 'x_return_status=' || x_return_status,
2140 debug_level => G_LEVEL_EXCEPTION,
2141 module => G_DEBUG_MODULE || l_module);
2142 iby_debug_pub.add(debug_msg => 'Exit Exception',
2143 debug_level => G_LEVEL_EXCEPTION,
2144 module => G_DEBUG_MODULE || l_module);
2145 END IF;
2146
2147 END Delete_Transaction_Extension;
2148
2149 PROCEDURE Copy_Transaction_Extension
2150 (
2151 p_api_version IN NUMBER,
2152 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
2153 p_commit IN VARCHAR2 := FND_API.G_TRUE,
2154 x_return_status OUT NOCOPY VARCHAR2,
2155 x_msg_count OUT NOCOPY NUMBER,
2156 x_msg_data OUT NOCOPY VARCHAR2,
2157 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
2158 p_payer_equivalency IN VARCHAR2 :=
2159 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
2160 p_entities IN IBY_FNDCPT_COMMON_PUB.Id_tbl_type,
2161 p_trxn_attribs IN TrxnExtension_rec_type,
2162 x_entity_id OUT NOCOPY NUMBER,
2163 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
2164 )
2165 IS
2166 l_api_version CONSTANT NUMBER := 1.0;
2167 l_module CONSTANT VARCHAR2(30) := 'Copy_Transaction_Extension';
2168 l_prev_msg_count NUMBER;
2169
2170 l_payer_level VARCHAR2(30);
2171 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
2172 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
2173
2174 l_pmt_channel iby_fndcpt_tx_extensions.payment_channel_code%TYPE;
2175 l_instr_assign_id iby_fndcpt_tx_extensions.instr_assignment_id%TYPE;
2176 lc_pmt_channel iby_fndcpt_tx_extensions.payment_channel_code%TYPE;
2177 lc_instr_assign_id iby_fndcpt_tx_extensions.instr_assignment_id%TYPE;
2178 lc_sec_code iby_fndcpt_tx_extensions.instrument_security_code%TYPE;
2179 lc_sec_code_len iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE;
2180 lc_va_flag iby_fndcpt_tx_extensions.voice_authorization_flag%TYPE;
2181 lc_va_code iby_fndcpt_tx_extensions.voice_authorization_code%TYPE;
2182 lc_va_date iby_fndcpt_tx_extensions.voice_authorization_date%TYPE;
2183 lc_encrypted iby_fndcpt_tx_extensions.encrypted%TYPE;
2184 lc_instr_code_sec_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
2185
2186 l_extension TrxnExtension_rec_type;
2187 l_x_not_found BOOLEAN;
2188 -- whether the new instrument assignment (if passed) was validated
2189 l_val_instr BOOLEAN;
2190 l_consumed_cvv2 BOOLEAN;
2191 l_copy_count NUMBER;
2192 l_persist_auth VARCHAR2(1);
2193
2194 lx_result IBY_FNDCPT_COMMON_PUB.Result_rec_type;
2195
2196 -- Variables to be used for IMMEDIATE security code
2197 -- Encryption
2198 l_msg_count NUMBER;
2199 l_msg_data VARCHAR2(300);
2200 l_return_status VARCHAR2(1);
2201 l_resp_rec IBY_PAYMENT_ADAPTER_PUB.SecureCVVResp_rec_type;
2202 l_sec_code VARCHAR2(10);
2203 l_encrypted VARCHAR2(1) := 'N';
2204 l_segment_id NUMBER;
2205
2206
2207 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || l_module;
2208 lc_PSON iby_fndcpt_tx_extensions.payment_system_order_number%TYPE;
2209 l_count NUMBER:=0;
2210
2211 -- Bug : 8612180
2212 -- Changing cursor to get PSON Number with other information.
2213 CURSOR c_extension
2214 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
2215 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
2216 ci_payer_level IN VARCHAR2,
2217 ci_payer_equiv IN VARCHAR2,
2218 ci_copy_instr_assign_id IN
2219 iby_pmt_instr_uses_all.instrument_payment_use_id%TYPE
2220 )
2221 IS
2222 SELECT x.payment_channel_code, x.instr_assignment_id,
2223 x.instrument_security_code, x.instr_sec_code_length,
2224 x.voice_authorization_flag, x.voice_authorization_code,
2225 x.voice_authorization_date, x.encrypted, x.instr_code_sec_segment_id,
2226 x.payment_system_order_number
2227 FROM iby_fndcpt_tx_extensions x, iby_pmt_instr_uses_all i,
2228 iby_pmt_instr_uses_all cpi, iby_external_payers_all p
2229 WHERE (x.instr_assignment_id = i.instrument_payment_use_id(+))
2230 -- bug 11675835 - kept an outer join for instrument details
2231 -- can assume this assignment is for funds capture
2232 -- bug 7017004 - use the payer information on the trxn extension
2233 --AND (i.ext_pmt_party_id = p.ext_payer_id)
2234 AND (x.ext_payer_id = p.ext_payer_id)
2235 AND (x.trxn_extension_id = ci_extension_id)
2236 AND (NVL(ci_copy_instr_assign_id,x.instr_assignment_id) = cpi.instrument_payment_use_id(+))
2237 -- bug 11675835 - kept an outer join for instrument details
2238 -- payer may change during copy; thus allow the instrument assignment id
2239 -- to change so long as the underlying instrument is the same
2240 --
2241 AND (
2242 --
2243 -- EXCLUSIVE OR: NULL-out the payer party id if a new
2244 -- instrument assignment id is passed so that the clause does
2245 -- not succeed should the new assignment's instrument id not match
2246 -- put its payer does
2247 --
2248 ((p.party_id = ci_payer.Party_Id)
2249 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
2250 (ci_payer.org_type, ci_payer.org_id,
2251 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
2252 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
2253 p.cust_account_id,p.acct_site_use_id) = 'T'
2254 )
2255 AND (ci_copy_instr_assign_id IS NULL)
2256 )
2257 OR
2258 (
2259 (i.instrument_type = cpi.instrument_type)
2260 AND (i.instrument_id = cpi.instrument_id)
2261 AND (NOT ci_copy_instr_assign_id IS NULL)
2262 )
2263 )
2264 ORDER BY x.creation_date DESC;
2265
2266 CURSOR c_auths
2267 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
2268 IS
2269 SELECT NVL(sp.settle_require_vrfy_flag,'Y')
2270 FROM iby_trxn_ext_auths_v x, iby_fndcpt_sys_eft_pf_b sp,
2271 iby_fndcpt_user_eft_pf_b up
2272 WHERE (x.trxn_extension_id = ci_extension_id)
2273 AND (DECODE(x.instrument_type,
2274 IBY_FNDCPT_COMMON_PUB.G_INSTR_TYPE_BANKACCT,x.process_profile_code,
2275 NULL) = up.user_eft_profile_code(+)
2276 )
2277 AND (up.sys_eft_profile_code = sp.sys_eft_profile_code(+));
2278
2279 BEGIN
2280 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2281 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
2282 END IF;
2283
2284 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
2285 IF (c_auths%ISOPEN) THEN CLOSE c_auths; END IF;
2286
2287 IF NOT FND_API.Compatible_API_Call (l_api_version,
2288 p_api_version,
2289 l_module,
2290 G_PKG_NAME)
2291 THEN
2292 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2293 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
2294 debug_level => G_LEVEL_ERROR,
2295 module => G_DEBUG_MODULE || l_module);
2296 END IF;
2297 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
2298 FND_MSG_PUB.Add;
2299 RAISE FND_API.G_EXC_ERROR;
2300 END IF;
2301
2302 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2303 FND_MSG_PUB.initialize;
2304 END IF;
2305 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
2306
2307 SAVEPOINT Copy_Txn_Extension_Merge;
2308
2309 l_extension := p_trxn_attribs;
2310
2311 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2312 iby_debug_pub.add('checking payer context',G_LEVEL_STATEMENT,l_dbg_mod);
2313 iby_debug_pub.add('party id =' || p_payer.Party_Id,G_LEVEL_STATEMENT,l_dbg_mod);
2314 iby_debug_pub.add('account id =' || p_payer.Cust_Account_Id,G_LEVEL_STATEMENT,l_dbg_mod);
2315 iby_debug_pub.add('account site use id =' || p_payer.Account_Site_Id,G_LEVEL_STATEMENT,l_dbg_mod);
2316 iby_debug_pub.add('org id =' || p_payer.Org_Id,G_LEVEL_STATEMENT,l_dbg_mod);
2317 iby_debug_pub.add('org type =' || p_payer.Org_Type,G_LEVEL_STATEMENT,l_dbg_mod);
2318 END IF;
2319
2320 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
2321 l_payer_level,l_payer_id,l_payer_attribs);
2322
2323 iby_debug_pub.add('l_payer_level: '|| l_payer_level,G_LEVEL_STATEMENT,l_dbg_mod);
2324 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
2325
2326
2327 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
2328 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
2329 ELSE
2330 IF (l_extension.Order_Id IS NULL)
2331 OR (LENGTH(Get_Tangible_Id(l_extension.Originating_Application_Id,
2332 l_extension.Order_Id,
2333 l_extension.Trxn_Ref_Number1,
2334 l_extension.Trxn_Ref_Number2))
2335 > iby_bill_pkg.G_MAX_TANGIBLEID_LEN
2336 )
2337 THEN
2338 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2339 iby_debug_pub.add('order id invalid',G_LEVEL_ERROR,l_dbg_mod);
2340 END IF;
2341 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
2342 iby_fndcpt_common_pub.Prepare_Result
2343 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2344 RETURN;
2345 END IF;
2346
2347 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
2348 l_payer_level,l_payer_id,l_payer_attribs);
2349
2350 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
2351
2352 -- create external payer if necessary
2353 IF (l_payer_id IS NULL) THEN
2354 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2355 iby_debug_pub.add('setting payer attribs',G_LEVEL_STATEMENT,l_dbg_mod);
2356 END IF;
2357 IBY_FNDCPT_SETUP_PUB.Set_Payer_Attributes
2358 (1.0, FND_API.G_FALSE, FND_API.G_FALSE,
2359 x_return_status, x_msg_count, x_msg_data,
2360 p_payer, l_payer_attribs, l_payer_id, lx_result
2361 );
2362
2363 IF (lx_result.Result_Code <> IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS) THEN
2364 x_response := lx_result;
2365 RETURN;
2366 END IF;
2367 END IF;
2368
2369 l_val_instr := (NOT p_trxn_attribs.Copy_Instr_Assign_Id IS NULL);
2370
2371 FOR i IN p_entities.FIRST..p_entities.LAST LOOP
2372 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2373 iby_debug_pub.add('trxn entity id:=' || p_entities(i),
2374 G_LEVEL_STATEMENT,l_dbg_mod);
2375 iby_debug_pub.add('copy instr assignment:=' || p_trxn_attribs.Copy_Instr_Assign_Id,
2376 G_LEVEL_STATEMENT,l_dbg_mod);
2377 END IF;
2378
2379 OPEN c_extension(p_entities(i), p_payer, l_payer_level,
2380 p_payer_equivalency,
2381 p_trxn_attribs.Copy_Instr_Assign_Id);
2382 FETCH c_extension
2383 INTO lc_pmt_channel, lc_instr_assign_id,
2384 lc_sec_code, lc_sec_code_len,
2385 lc_va_flag, lc_va_code, lc_va_date, lc_encrypted,
2386 lc_instr_code_sec_segment_id, lc_PSON;
2387 l_x_not_found := c_extension%NOTFOUND;
2388 CLOSE c_extension;
2389
2390 l_copy_count := Get_Tx_Extension_Copy_Count(p_entities(i));
2391
2392 -- Bug 8612180
2393 -- In split shipment scenario we will not inherit the PSON number
2394 -- Nulling out the lc_PSON for this case.
2395 IF (l_copy_count>0) THEN
2396 lc_PSON := NULL;
2397 END IF;
2398 -- End of 8612180
2399
2400
2401 l_pmt_channel := NVL(l_pmt_channel,lc_pmt_channel);
2402 l_instr_assign_id := NVL(l_instr_assign_id,lc_instr_assign_id);
2403
2404 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2405 iby_debug_pub.add('l_pmt_channel:=' || l_pmt_channel, G_LEVEL_STATEMENT,l_dbg_mod);
2406 iby_debug_pub.add('l_instr_assign_id:=' || l_instr_assign_id, G_LEVEL_STATEMENT,l_dbg_mod);
2407 END IF;
2408
2409 -- validate new instrument assignment here as payment channel
2410 -- is required
2411 -- Begin Bug# 9974102
2412 IF (l_val_instr) THEN
2413 --IF (NOT Payer_InstrAssignment_Valid(p_payer,l_payer_level, p_payer_equivalency, l_pmt_channel, p_trxn_attribs.Copy_Instr_Assign_Id, TRUE ) ) THEN
2414 --IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2415 --iby_debug_pub.add('payer instr assignment invalid ' || p_trxn_attribs.Copy_Instr_Assign_Id || ' for channel ' || l_pmt_channel, G_LEVEL_ERROR,l_dbg_mod);
2416 --END IF;
2417 --x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTR_ASSIGN;
2418 --iby_fndcpt_common_pub.Prepare_Result (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2419 --RETURN;
2420 --END IF;
2421 --l_instr_assign_id := p_trxn_attribs.Copy_Instr_Assign_Id;
2422 --l_val_instr := FALSE;
2423 iby_debug_pub.add('Check for valid instr assignment:', G_LEVEL_STATEMENT,l_dbg_mod);
2424
2425 SELECT COUNT(*) INTO l_count FROM iby_pmt_instr_uses_all
2426 WHERE instrument_payment_use_id = l_instr_assign_id AND
2427 NVL(end_date, sysdate + 10) > sysdate;
2428
2429 iby_debug_pub.add('Count of Instr Assignmentid:'|| l_count, G_LEVEL_STATEMENT,l_dbg_mod);
2430
2431 IF(l_count <=0) THEN
2432 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2433 iby_debug_pub.add('payer instr assignment invalid ' || l_instr_assign_id || ' for channel ' || l_pmt_channel, G_LEVEL_ERROR,l_dbg_mod);
2434 END IF;
2435 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTR_ASSIGN;
2436 iby_fndcpt_common_pub.Prepare_Result (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2437 RETURN;
2438 END IF;
2439 l_instr_assign_id := p_trxn_attribs.Copy_Instr_Assign_Id;
2440 l_val_instr := FALSE;
2441 END IF;
2442 -- Bug# 9974102
2443 -- End
2444
2445 IF (l_x_not_found) THEN
2446 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2447 iby_debug_pub.add('extension invalid for payer, or non-existant',
2448 G_LEVEL_ERROR,l_dbg_mod);
2449 END IF;
2450 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
2451 iby_fndcpt_common_pub.Prepare_Result
2452 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2453 RETURN;
2454 ELSIF ( (l_pmt_channel<>lc_pmt_channel)
2455 -- instr assignment may change;
2456 --OR (l_instr_assign_id<>lc_instr_assign_id)
2457 )
2458 THEN
2459 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2460 iby_debug_pub.add('incompatible pmt chanenel ' || l_pmt_channel,
2461 G_LEVEL_ERROR,l_dbg_mod);
2462 END IF;
2463 x_response.Result_Code := G_RC_INCMP_EXTENSION_GROUP;
2464 iby_fndcpt_common_pub.Prepare_Result
2465 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2466 RETURN;
2467 /*
2468 ELSIF (l_copy_count>0) THEN
2469 x_response.Result_Code := G_RC_DUP_EXTENSION_COPY;
2470 iby_fndcpt_common_pub.Prepare_Result
2471 (x_return_status,x_msg_count,x_msg_data,x_response);
2472 RETURN;
2473 */
2474 ELSE
2475 -- inherit from the first extension with non-NULL values
2476 l_extension.Instrument_Security_Code :=
2477 NVL(l_extension.Instrument_Security_Code,lc_sec_code);
2478 -- We don't expect the upstream product to pass a segment id.
2479 -- So, we will inherit the segment id if the security code is passed
2480 -- as NULL or 'XXX' or 'XXXX'
2481 IF ((l_extension.Instrument_Security_Code IS NULL) OR
2482 (l_extension.Instrument_Security_Code = 'XXX') OR
2483 (l_extension.Instrument_Security_Code = 'XXXX'))
2484 THEN
2485 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2486 iby_debug_pub.add('l_extension.Instrument_Security_Code is NULL, XXX or XXXX. Inherit the segmentid.',
2487 G_LEVEL_STATEMENT,l_dbg_mod);
2488 END IF;
2489 l_segment_id := lc_instr_code_sec_segment_id;
2490 ELSE
2491 -- New CVV value passed. Need to encrypt it if encryption
2492 -- is turned ON
2493 iby_debug_pub.add('New CVV passed for the copied extension.',
2494 G_LEVEL_ERROR,l_dbg_mod);
2495 IF ('IMMEDIATE' = IBY_CREDITCARD_PKG.Get_CC_Encrypt_Mode()) THEN
2496 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2497 iby_debug_pub.add('Encryption is IMMEDIATE.',G_LEVEL_STATEMENT,l_dbg_mod);
2498 END IF;
2499 -- Make an HTTP call out to the middle tier
2500 IBY_PAYMENT_ADAPTER_PUB.OraSecureExtension
2501 (FND_API.G_FALSE,
2502 l_extension.Instrument_security_Code,
2503 l_return_status,
2504 l_msg_count,
2505 l_msg_data,
2506 l_resp_rec
2507 );
2508
2509 lc_sec_code_len := length(p_trxn_attribs.Instrument_Security_Code);
2510 IF (NOT (l_resp_rec.Segment_ID IS NULL)) THEN
2511 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2512 iby_debug_pub.add('encryption successful!!',
2513 G_LEVEL_STATEMENT,l_dbg_mod);
2514 END IF;
2515 l_segment_id := l_resp_rec.Segment_ID;
2516 lc_encrypted := 'Y';
2517 l_extension.Instrument_Security_Code :=
2518 LPAD('X',LENGTH(p_trxn_attribs.Instrument_Security_Code),'X');
2519 ELSE
2520 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2521 iby_debug_pub.add('Unknown error occurred while cvv encryption !!',
2522 G_LEVEL_ERROR,l_dbg_mod);
2523 END IF;
2524 l_segment_id := null;
2525 lc_encrypted := 'N';
2526 l_sec_code := null;
2527 END IF;
2528 ELSE
2529 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2530 iby_debug_pub.add('Encryption mode is not IMMEDIATE. Clear text CVV would be stored',
2531 G_LEVEL_STATEMENT,l_dbg_mod);
2532 END IF;
2533 l_segment_id := null;
2534 l_encrypted := 'N';
2535 l_sec_code := p_trxn_attribs.Instrument_Security_Code;
2536 END IF;
2537 END IF;
2538
2539 l_extension.VoiceAuth_Flag :=
2540 NVL(l_extension.VoiceAuth_Flag,lc_va_flag);
2541 l_extension.VoiceAuth_Code :=
2542 NVL(l_extension.VoiceAuth_Code,lc_va_code);
2543 l_extension.VoiceAuth_Date :=
2544 NVL(l_extension.VoiceAuth_Date,lc_va_date);
2545
2546 -- new security codes always passed as clear-text; old
2547 -- ones will have the extensions existing encryptions state
2548 --
2549 --IF (NOT p_trxn_attribs.Instrument_Security_Code IS NULL) THEN
2550 -- lc_encrypted := 'N';
2551 -- lc_sec_code_len := length(p_trxn_attribs.Instrument_Security_Code);
2552 --END IF;
2553 END IF;
2554
2555 IF (p_entities.count > 1 and l_pmt_channel = 'BANKACCOUNT') THEN
2556 l_persist_auth := NULL;
2557
2558 OPEN c_auths(p_entities(i));
2559 FETCH c_auths INTO l_persist_auth;
2560 CLOSE c_auths;
2561
2562 IF (l_persist_auth = 'Y') THEN
2563 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2564 iby_debug_pub.add('persistent auth; cannot do 1-to-many copy',
2565 G_LEVEL_ERROR,l_dbg_mod);
2566 END IF;
2567 x_response.Result_Code := G_RC_INCMP_EXTENSION_GROUP;
2568 iby_fndcpt_common_pub.Prepare_Result
2569 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2570 RETURN;
2571 END IF;
2572 END IF;
2573
2574 END LOOP;
2575
2576 IF (NVL(lc_sec_code_len,0)>0)
2577 AND (l_extension.Instrument_Security_Code IS NULL)
2578 THEN
2579 l_consumed_cvv2 := TRUE;
2580 ELSE
2581 l_consumed_cvv2 := FALSE;
2582 END IF;
2583
2584 IF (NOT Extension_Valid(l_pmt_channel,l_extension,FALSE,
2585 l_consumed_cvv2)) THEN
2586 x_response.Result_Code := G_RC_INVALID_EXTENSION_ATTRIB;
2587 ELSE
2588 SELECT iby_fndcpt_tx_extensions_s.NEXTVAL INTO x_entity_id FROM DUAL;
2589 -- Bug: 8612180
2590 -- Insert PSON Number from parent record when copying transaction extension.
2591 INSERT INTO iby_fndcpt_tx_extensions
2592 (trxn_extension_id, payment_channel_code,
2593 ext_payer_id, instr_assignment_id,
2594 origin_application_id, instrument_security_code,
2595 instr_sec_code_length, encrypted, instr_code_sec_segment_id,
2596 voice_authorization_flag, voice_authorization_date,
2597 voice_authorization_code, order_id, po_number,
2598 po_line_number, trxn_ref_number1, trxn_ref_number2, additional_info,
2599 created_by, creation_date, last_updated_by, last_update_date,
2600 last_update_login, object_version_number,payment_system_order_number,
2601 seq_type_last
2602 )
2603 VALUES
2604 (
2605 x_entity_id, l_pmt_channel, l_payer_id, l_instr_assign_id,
2606 l_extension.Originating_Application_Id,
2607 l_extension.Instrument_Security_Code,
2608 lc_sec_code_len, lc_encrypted, l_segment_id,
2609 l_extension.VoiceAuth_Flag,
2610 l_extension.VoiceAuth_Date, l_extension.VoiceAuth_Code,
2611 l_extension.Order_Id, l_extension.PO_Number,
2612 l_extension.PO_Line_Number,
2613 l_extension.Trxn_Ref_Number1, l_extension.Trxn_Ref_Number2,
2614 l_extension.Additional_Info,
2615 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
2616 fnd_global.login_id, 1, lc_PSON,
2617 p_trxn_attribs.seq_type_last
2618 );
2619 --End of Bug : 8612180
2620
2621 FOR i IN p_entities.FIRST..p_entities.LAST LOOP
2622
2623 -- associate the merged copy with all its sources
2624 INSERT INTO iby_fndcpt_tx_xe_copies
2625 (source_trxn_extension_id, copy_trxn_extension_id,
2626 created_by, creation_date, last_updated_by, last_update_date,
2627 last_update_login, object_version_number
2628 )
2629 VALUES
2630 (p_entities(i), x_entity_id,
2631 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
2632 fnd_global.login_id, 1
2633 );
2634
2635 -- only the first copy receives an operations for the extension
2636 IF (l_copy_count < 1) THEN
2637 -- note this assumes all operations have already been
2638 -- propogated to the immediate copy source from the extensions
2639 -- which THEY copied
2640 --
2641 INSERT INTO iby_fndcpt_tx_operations
2642 (trxn_extension_id, transactionid,
2643 created_by, creation_date, last_updated_by, last_update_date,
2644 last_update_login, object_version_number
2645 )
2646 -- instrument may change during copy
2647 SELECT
2648 x_entity_id, transactionid,
2649 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
2650 fnd_global.login_id, 1
2651 FROM iby_fndcpt_tx_operations
2652 WHERE trxn_extension_id = p_entities(i);
2653 END IF;
2654 END LOOP;
2655
2656 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
2657 END IF;
2658
2659 END IF;
2660
2661 iby_fndcpt_common_pub.Prepare_Result
2662 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
2663
2664 IF FND_API.To_Boolean(p_commit) THEN
2665 COMMIT;
2666 END IF;
2667
2668 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2669 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
2670 END IF;
2671 EXCEPTION
2672
2673 WHEN FND_API.G_EXC_ERROR THEN
2674 ROLLBACK TO Copy_Txn_Extension_Merge;
2675 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2676 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
2677 debug_level => G_LEVEL_ERROR,
2678 module => G_DEBUG_MODULE || l_module);
2679 END IF;
2680 x_return_status := FND_API.G_RET_STS_ERROR;
2681 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2682 p_data => x_msg_data
2683 );
2684 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2685 ROLLBACK TO Copy_Txn_Extension_Merge;
2686 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
2687 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
2688 debug_level => G_LEVEL_UNEXPECTED,
2689 module => G_DEBUG_MODULE || l_module);
2690 END IF;
2691 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2692 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
2693 p_data => x_msg_data
2694 );
2695
2696 WHEN OTHERS THEN
2697 ROLLBACK TO Copy_Txn_Extension_Merge;
2698
2699 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
2700 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
2701 debug_level => G_LEVEL_UNEXPECTED,
2702 module => G_DEBUG_MODULE || l_module);
2703 END IF;
2704
2705 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
2706
2707 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2708 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2709 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
2710 END IF;
2711
2712 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
2713 p_data => x_msg_data
2714 );
2715
2716 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2717 iby_debug_pub.add(debug_msg => 'x_return_status=' || x_return_status,
2718 debug_level => G_LEVEL_STATEMENT,
2719 module => G_DEBUG_MODULE || l_module);
2720 iby_debug_pub.add(debug_msg => 'Exit Exception',
2721 debug_level => G_LEVEL_STATEMENT,
2722 module => G_DEBUG_MODULE || l_module);
2723 END IF;
2724
2725 END Copy_Transaction_Extension;
2726
2727 --
2728 -- This is a Private utility procedure.
2729 -- Used to securely wipe out the CVV after
2730 -- the first authorization.
2731 -- As the PABP guidelines, a secure wipeout of data could be essentially achieved
2732 -- by updating the column with a randomly generated value, issuing a commit, and
2733 -- then updating the value with NULL (or deleting the row) and then issuing another
2734 -- commit.
2735 -- We achieve this through the following autonomous transaction block
2736 --
2737 PROCEDURE Secure_Wipe_Segment
2738 (
2739 p_segment_id IN iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE
2740 )
2741 IS PRAGMA AUTONOMOUS_TRANSACTION;
2742 l_random_val NUMBER;
2743
2744 l_module CONSTANT VARCHAR2(30) := 'Secure_Wipe_Segment';
2745 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
2746 BEGIN
2747 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2748 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
2749 END IF;
2750 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2751 iby_debug_pub.add('p_segment_id = '|| p_segment_id,G_LEVEL_STATEMENT,l_dbg_mod);
2752 END IF;
2753 IF (p_segment_id IS NOT NULL) THEN
2754 SELECT trunc(DBMS_RANDOM.VALUE(1000,9999)) INTO l_random_val FROM dual;
2755
2756 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2757 iby_debug_pub.add('Updating the security code with random value.',
2758 G_LEVEL_STATEMENT,l_dbg_mod);
2759 END IF;
2760 UPDATE iby_security_segments
2761 SET segment_cipher_text = RAWTOHEX(fnd_crypto.randombytes(32))
2762 WHERE sec_segment_id = p_segment_id;
2763
2764 COMMIT;
2765
2766 UPDATE iby_security_segments
2767 SET segment_cipher_text = null
2768 WHERE sec_segment_id = p_segment_id;
2769
2770 -- DELETE iby_security_segments
2771 -- WHERE sec_segment_id = p_segment_id;
2772
2773 COMMIT;
2774 END IF;
2775 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2776 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
2777 END IF;
2778
2779 END Secure_Wipe_Segment;
2780
2781 PROCEDURE Create_Authorization
2782 (
2783 p_api_version IN NUMBER,
2784 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
2785 x_return_status OUT NOCOPY VARCHAR2,
2786 x_msg_count OUT NOCOPY NUMBER,
2787 x_msg_data OUT NOCOPY VARCHAR2,
2788 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
2789 p_payer_equivalency IN VARCHAR2 :=
2790 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
2791 p_payee IN PayeeContext_rec_type,
2792 p_trxn_entity_id IN NUMBER,
2793 p_auth_attribs IN AuthAttribs_rec_type,
2794 p_amount IN Amount_rec_type,
2795 x_auth_result OUT NOCOPY AuthResult_rec_type,
2796 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
2797 )
2798 IS
2799 l_api_version CONSTANT NUMBER := 1.0;
2800 l_module CONSTANT VARCHAR2(30) := 'Create_Authorization';
2801 l_prev_msg_count NUMBER;
2802
2803 l_payer_level VARCHAR2(30);
2804 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
2805 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
2806
2807 l_copy_count NUMBER;
2808 l_auth_flag iby_trxn_extensions_v.authorized_flag%TYPE;
2809 l_instr_auth_flag iby_trxn_extensions_v.authorized_flag%TYPE;
2810 l_single_use iby_fndcpt_payer_assgn_instr_v.card_single_use_flag%TYPE;
2811
2812 l_ecapp_id NUMBER;
2813 l_app_short_name fnd_application.application_short_name%TYPE;
2814 l_order_id iby_fndcpt_tx_extensions.order_id%TYPE;
2815 l_trxn_ref1 iby_fndcpt_tx_extensions.trxn_ref_number1%TYPE;
2816 l_trxn_ref2 iby_fndcpt_tx_extensions.trxn_ref_number2%TYPE;
2817 l_encrypted iby_fndcpt_tx_extensions.encrypted%TYPE;
2818 l_code_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
2819 l_sec_code_len iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE;
2820 l_payee IBY_PAYMENT_ADAPTER_PUB.Payee_rec_type;
2821 l_payer IBY_PAYMENT_ADAPTER_PUB.Payer_rec_type;
2822 l_tangible IBY_PAYMENT_ADAPTER_PUB.Tangible_rec_type;
2823 l_pmt_instr IBY_PAYMENT_ADAPTER_PUB.PmtInstr_rec_type;
2824 l_pmt_trxn IBY_PAYMENT_ADAPTER_PUB.PmtReqTrxn_rec_type;
2825 l_riskinfo IBY_PAYMENT_ADAPTER_PUB.RiskInfo_rec_type;
2826 l_reqresp IBY_PAYMENT_ADAPTER_PUB.ReqResp_rec_type;
2827 l_status iby_trxn_summaries_all.status%TYPE;
2828 l_trxn_id IBY_TRXN_SUMMARIES_ALL.transactionid%TYPE;
2829 l_auth_result iby_trxn_ext_auths_v.authorization_result_code%TYPE;
2830 l_pson iby_fndcpt_tx_extensions.payment_system_order_number%TYPE;
2831 l_return_status VARCHAR2(1);
2832 l_msg_count NUMBER;
2833 l_msg_data VARCHAR2(300);
2834 l_fail_msg VARCHAR2(500);
2835 l_op_count NUMBER;
2836 l_rec_mth_id NUMBER;
2837
2838 l_tmp_segmdnt_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
2839 l_ext_not_found BOOLEAN;
2840
2841 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
2842
2843 CURSOR c_extension
2844 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
2845 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
2846 ci_payer_level IN VARCHAR2,
2847 ci_payer_equiv IN VARCHAR2
2848 )
2849 IS
2850 SELECT NVL(i.instrument_type,pc.instrument_type),
2851 NVL(i.instrument_id,0),
2852 x.origin_application_id, a.application_short_name,
2853 x.order_id, x.trxn_ref_number1, x.trxn_ref_number2,
2854 x.instrument_security_code, x.instr_code_sec_segment_id,
2855 x.instr_sec_code_length, x.encrypted,
2856 x.po_number, x.voice_authorization_flag, x.voice_authorization_code,
2857 x.voice_authorization_date, i.card_single_use_flag,
2858 NVL(x.instr_assignment_id,0), x.payment_channel_code
2859 FROM iby_fndcpt_tx_extensions x, iby_fndcpt_payer_assgn_instr_v i,
2860 iby_external_payers_all p, fnd_application a,
2861 iby_fndcpt_pmt_chnnls_b pc
2862 WHERE (x.instr_assignment_id = i.instr_assignment_id(+))
2863 AND (x.payment_channel_code = pc.payment_channel_code)
2864 AND (x.origin_application_id = a.application_id)
2865 -- can assume this assignment is for funds capture
2866 AND (x.ext_payer_id = p.ext_payer_id)
2867 AND (x.trxn_extension_id = ci_extension_id)
2868 AND (p.party_id = ci_payer.Party_Id)
2869 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
2870 (ci_payer.org_type, ci_payer.org_id,
2871 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
2872 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
2873 p.cust_account_id,p.acct_site_use_id) = 'T');
2874
2875 /*CURSOR c_auth
2876 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
2877 IS
2878 SELECT authorized_flag
2879 FROM iby_trxn_extensions_v
2880 WHERE (trxn_extension_id = ci_extension_id); */
2881
2882 --Bug# 16353469
2883 --Changed the cursor query to get the auth status from the base tables.
2884 CURSOR c_auth
2885 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
2886 IS
2887 SELECT
2888 a.transactionid,
2889 DECODE(a.status, 0, 'AUTH_SUCCESS', 1, 'COMMUNICATION_ERROR', 2, 'DUPLICATE_AUTH', 4,
2890 'GENERAL_INVALID_PARAM', 5, 'PAYMENT_SYS_REJECT', 11, 'AUTH_PENDING', 12, 'AUTH_PENDING',
2891 13, 'AUTH_PENDING', 16, 'PAYMENT_SYS_REJECT', 17, 'PAYMENT_SYS_REJECT', 18,
2892 'AUTH_PENDING', 19, 'GENERAL_INVALID_PARAM', 20, 'PAYMENT_SYS_REJECT', 100,
2893 'AUTH_PENDING', 101, 'COMMUNICATION_ERROR', 111, 'AUTH_PENDING', 22,
2894 'FULLY_REVERSED', 23, 'PARTIALLY_REVERSED', 'GENERAL_SYS_ERROR') auth_result_code,
2895 x.payment_system_order_number
2896 FROM
2897 IBY_FNDCPT_TX_EXTENSIONS X,
2898 IBY_FNDCPT_TX_OPERATIONS O,
2899 IBY_TRXN_SUMMARIES_ALL A,
2900 IBY_TRXN_CORE C
2901 WHERE x.trxn_extension_id = ci_extension_id
2902 AND (x.trxn_extension_id = o.trxn_extension_id)
2903 AND (o.transactionid = a.transactionid)
2904 AND (a.trxnmid = c.trxnmid(+))
2905 AND (a.reqtype = 'ORAPMTREQ')
2906 AND (a.trxntypeid IN (2,3,20))
2907 ORDER BY a.trxnmid desc;
2908
2909 CURSOR c_instr_extensions
2910 (ci_instr_type IN iby_trxn_extensions_v.instrument_type%TYPE,
2911 ci_instr_id IN iby_trxn_extensions_v.instrument_id%TYPE,
2912 ci_trxn_x_id IN iby_trxn_extensions_v.trxn_extension_id%TYPE
2913 )
2914 IS
2915 SELECT NVL(authorized_flag,'N')
2916 FROM iby_trxn_extensions_v
2917 WHERE (instrument_id = ci_instr_id)
2918 AND (instrument_type = ci_instr_type)
2919 AND (trxn_extension_id <> ci_trxn_x_id);
2920
2921 CURSOR c_operation_count
2922 (ci_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
2923 ci_trxn_id IN iby_trxn_summaries_all.transactionid%TYPE)
2924 IS
2925 SELECT count(1)
2926 FROM iby_fndcpt_tx_operations o
2927 WHERE o.transactionid = ci_trxn_id
2928 AND o.trxn_extension_id = ci_trxn_extension_id;
2929
2930 CURSOR c_source_extns
2931 (
2932 ci_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE
2933 )
2934 IS
2935 SELECT cp.source_trxn_extension_id, ex.instr_code_sec_segment_id, ex.instrument_security_code
2936 FROM iby_fndcpt_tx_xe_copies cp, iby_fndcpt_tx_extensions ex
2937 WHERE cp.source_trxn_extension_id = ex.trxn_extension_id
2938 START WITH cp.copy_trxn_extension_id = ci_trxn_extension_id
2939 CONNECT BY PRIOR source_trxn_extension_id = copy_trxn_extension_id;
2940
2941 BEGIN
2942 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
2943 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_module);
2944 END IF;
2945
2946 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
2947 IF (c_auth%ISOPEN) THEN CLOSE c_auth; END IF;
2948 IF (c_instr_extensions%ISOPEN) THEN CLOSE c_instr_extensions; END IF;
2949 IF (c_operation_count%ISOPEN) THEN CLOSE c_operation_count; END IF;
2950
2951 IF NOT FND_API.Compatible_API_Call (l_api_version,
2952 p_api_version,
2953 l_module,
2954 G_PKG_NAME)
2955 THEN
2956 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
2957 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
2958 debug_level => G_LEVEL_ERROR,
2959 module => G_DEBUG_MODULE || l_module);
2960 END IF;
2961 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
2962 FND_MSG_PUB.Add;
2963 RAISE FND_API.G_EXC_ERROR;
2964 END IF;
2965
2966 IF FND_API.to_Boolean( p_init_msg_list ) THEN
2967 FND_MSG_PUB.initialize;
2968 END IF;
2969 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
2970
2971 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2972 iby_debug_pub.add('checking payer context',G_LEVEL_STATEMENT,l_dbg_mod);
2973 iby_debug_pub.add('party id =' || p_payer.Party_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
2974 iby_debug_pub.add('account id =' || p_payer.Cust_Account_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
2975 iby_debug_pub.add('account site use id =' || p_payer.Account_Site_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
2976 iby_debug_pub.add('org id =' || p_payer.Org_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
2977 iby_debug_pub.add('org type =' || p_payer.Org_Type,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
2978 END IF;
2979 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
2980 l_payer_level,l_payer_id,l_payer_attribs);
2981
2982 iby_debug_pub.add('l_payer_level: '|| l_payer_level,G_LEVEL_STATEMENT,l_dbg_mod);
2983 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
2984
2985 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
2986 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
2987 ELSE
2988 -- verify transaction entity is for a payer equivalent to the
2989 -- given one
2990 OPEN c_extension(p_trxn_entity_id,p_payer,l_payer_level,p_payer_equivalency);
2991 FETCH c_extension INTO l_pmt_instr.PmtInstr_Type,
2992 l_pmt_instr.PmtInstr_Id, l_ecapp_id, l_app_short_name,
2993 l_order_id, l_trxn_ref1, l_trxn_ref2,
2994 l_pmt_trxn.CVV2, l_code_segment_id,
2995 l_sec_code_len, l_encrypted,
2996 l_pmt_trxn.PONum, l_pmt_trxn.VoiceAuthFlag,
2997 l_pmt_trxn.AuthCode, l_pmt_trxn.DateOfVoiceAuthorization,
2998 l_single_use,
2999 l_pmt_instr.Pmtinstr_assignment_id,
3000 l_pmt_trxn.payment_channel_code;
3001 l_ext_not_found := c_extension%NOTFOUND;
3002 CLOSE c_extension;
3003
3004 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3005 iby_debug_pub.add('channel code:=' || l_pmt_trxn.payment_channel_code,
3006 G_LEVEL_STATEMENT,l_dbg_mod);
3007 iby_debug_pub.add('instrument type:=' || l_pmt_instr.pmtinstr_type,
3008 G_LEVEL_STATEMENT,l_dbg_mod);
3009 END IF;
3010 IF (NOT l_ext_not_found) THEN
3011
3012 -- map the records
3013 l_payee.Payee_Id := Get_Internal_Payee(p_payee);
3014 -- create on the fly??
3015 l_payer.Party_Id := p_payer.Party_Id;
3016
3017 l_copy_count := Get_Tx_Extension_Copy_Count(p_trxn_entity_id);
3018
3019 IF (l_payee.Payee_Id IS NULL) THEN
3020 x_response.Result_Code := G_RC_INVALID_PAYEE;
3021
3022 iby_fndcpt_common_pub.Prepare_Result
3023 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3024 RETURN;
3025 -- cannot do operations on a trxn entity already copied
3026 ELSIF (l_copy_count>0) THEN
3027 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3028 iby_debug_pub.add('extension has been copied ' || l_copy_count
3029 || ' times; cannot auth',G_LEVEL_ERROR,l_dbg_mod);
3030 END IF;
3031 x_response.Result_Code := G_RC_EXTENSION_IMMUTABLE;
3032 iby_fndcpt_common_pub.Prepare_Result
3033 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3034 RETURN;
3035 END IF;
3036
3037 --Changing the function here to generate new tangible_id
3038 l_tangible.Tangible_Id :=
3039 Get_Tangible_Id(l_app_short_name,p_trxn_entity_id);
3040 --l_tangible.Tangible_Id :=
3041 -- Get_Tangible_Id(l_app_short_name,l_order_id,l_trxn_ref1,l_trxn_ref2);
3042
3043 IF (l_pmt_instr.PmtInstr_Type =
3044 IBY_FNDCPT_COMMON_PUB.G_INSTR_TYPE_BANKACCT)
3045 THEN
3046 l_pmt_trxn.Auth_Type := IBY_PAYMENT_ADAPTER_PUB.G_AUTHTYPE_VERIFY;
3047 ELSE
3048 l_pmt_trxn.Auth_Type := IBY_PAYMENT_ADAPTER_PUB.G_AUTHTYPE_AUTHONLY;
3049 END IF;
3050
3051 l_tangible.Tangible_Amount := p_amount.Value;
3052 l_tangible.Currency_Code := p_amount.Currency_Code;
3053 l_tangible.Memo := p_auth_attribs.Memo;
3054 l_tangible.OrderMedium := p_auth_attribs.Order_Medium;
3055
3056 l_pmt_trxn.Org_Id := p_payee.Org_Id;
3057 l_pmt_trxn.Int_Bank_Country_Code := p_payee.Int_Bank_Country_Code;
3058 l_pmt_trxn.TaxAmount := p_auth_attribs.Tax_Amount.Value;
3059 l_pmt_trxn.ShipFromZip := p_auth_attribs.ShipFrom_PostalCode;
3060 l_pmt_trxn.ShipToZip := p_auth_attribs.ShipTo_PostalCode;
3061 l_pmt_trxn.Payment_Factor_Flag := p_auth_attribs.Payment_Factor_Flag;
3062
3063 -- ciphertext; get clear-text value in the engine
3064 IF (l_encrypted = 'Y') THEN
3065 l_pmt_trxn.CVV2 := NULL;
3066 l_pmt_trxn.Trxn_Extension_Id := p_trxn_entity_id;
3067 l_pmt_trxn.CVV2_Segment_id := l_code_segment_id;
3068 l_pmt_trxn.CVV2_Length := l_sec_code_len;
3069 END IF;
3070
3071 -- cannot use a single use instrument which already has
3072 -- an authorization
3073 IF (l_single_use = 'Y') THEN
3074 OPEN c_instr_extensions(l_pmt_instr.PmtInstr_Type,
3075 l_pmt_instr.PmtInstr_Id, p_trxn_entity_id);
3076 FETCH c_instr_extensions INTO l_instr_auth_flag;
3077 CLOSE c_instr_extensions;
3078 IF (NVL(l_instr_auth_flag,'N') = 'Y') THEN
3079 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3080 iby_debug_pub.add('single use instrument cannot be reused',G_LEVEL_ERROR,l_dbg_mod);
3081 END IF;
3082 x_response.Result_Code := IBY_FNDCPT_SETUP_PUB.G_RC_INVALID_INSTRUMENT;
3083 iby_fndcpt_common_pub.Prepare_Result
3084 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3085 RETURN;
3086 END IF;
3087 END IF;
3088
3089 --Bug# 16353469 (Begin)
3090 --If the result code is fully reversed then re-generate the tangibleid for Re-auth
3091 OPEN c_auth(p_trxn_entity_id);
3092 FETCH c_auth INTO l_trxn_id, l_auth_result, l_pson;
3093 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3094 iby_debug_pub.add('p_trxn_entity_id:' || p_trxn_entity_id,G_LEVEL_ERROR,l_dbg_mod);
3095 iby_debug_pub.add('l_trxn_id:' || l_trxn_id,G_LEVEL_ERROR,l_dbg_mod);
3096 iby_debug_pub.add('l_auth_result:'||l_auth_result,G_LEVEL_ERROR,l_dbg_mod);
3097 iby_debug_pub.add('l_pson:' || l_pson,G_LEVEL_ERROR,l_dbg_mod);
3098 END IF;
3099 IF (l_auth_result IN ('AUTH_SUCCESS', 'AUTH_PENDING')) THEN
3100 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3101 iby_debug_pub.add('Extension already authorized',G_LEVEL_ERROR,l_dbg_mod);
3102 END IF;
3103 x_response.Result_Code := G_RC_DUPLICATE_AUTHORIZATION;
3104 ELSE
3105 IF(l_auth_result = 'FULLY_REVERSED') THEN
3106 l_tangible.Tangible_Id :=
3107 Get_Reauth_Tangible_Id(l_app_short_name,p_trxn_entity_id);
3108 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3109 iby_debug_pub.add('Re-auth Tangible_Id:' || l_tangible.Tangible_Id,G_LEVEL_ERROR,l_dbg_mod);
3110 END IF;
3111 l_pmt_trxn.Trxn_ID := l_trxn_id;
3112 ELSE
3113 l_tangible.Tangible_Id := NVL(l_pson, get_tangible_id(l_app_short_name,p_trxn_entity_id));
3114 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3115 iby_debug_pub.add('Other than full reversal case:' || l_tangible.Tangible_Id,G_LEVEL_ERROR,l_dbg_mod);
3116 END IF;
3117 END IF;
3118 --Bug# 16353469 (End)
3119 IF (p_auth_attribs.RiskEval_Enable_Flag = 'Y') THEN
3120 l_pmt_trxn.AnalyzeRisk := 'TRUE';
3121 END IF;
3122
3123 -- Bug# 7707005. PAYEE ROUTING RULES BASED ON RECEIPT METHOD QUALIFIER ARE NOT WORKING.
3124
3125 l_rec_mth_id := p_auth_attribs.Receipt_Method_Id;
3126 IF (l_rec_mth_id IS NULL)
3127 THEN
3128 Begin
3129 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3130 iby_debug_pub.add('fetching the rec method id from AR',G_LEVEL_STATEMENT,l_dbg_mod);
3131 END IF;
3132 select RECEIPT_METHOD_ID
3133 into l_rec_mth_id
3134 from ar_cash_receipts_all
3135 where payment_trxn_extension_id = p_trxn_entity_id;
3136 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3137 iby_debug_pub.add('fetched method id '||l_rec_mth_id ,G_LEVEL_STATEMENT,l_dbg_mod);
3138 END IF;
3139 Exception
3140 When Others then
3141 l_rec_mth_id := NULL;
3142 End;
3143 END IF;
3144
3145 -- After fetching the receipt method id,populating in p_pmtreqtrxn_rec and sending in orapmtreq
3146
3147 l_pmt_trxn.Receipt_Method_Id := l_rec_mth_id;
3148
3149 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3150 iby_debug_pub.add('send auth',G_LEVEL_STATEMENT,l_dbg_mod);
3151 END IF;
3152 IBY_PAYMENT_ADAPTER_PUB.OraPmtReq
3153 (1.0,
3154 p_init_msg_list,
3155 FND_API.G_FALSE,
3156 FND_API.G_VALID_LEVEL_FULL,
3157 l_ecapp_id,
3158 l_payee,
3159 l_payer,
3160 l_pmt_instr,
3161 l_tangible,
3162 l_pmt_trxn,
3163 l_return_status,
3164 l_msg_count,
3165 l_msg_data,
3166 l_reqresp
3167 );
3168
3169 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3170 iby_debug_pub.add('status :=' || l_return_status,
3171 G_LEVEL_STATEMENT,l_dbg_mod);
3172 iby_debug_pub.add('auth status :=' ||
3173 to_char(l_reqresp.Response.Status),
3174 G_LEVEL_STATEMENT,l_dbg_mod);
3175 iby_debug_pub.add('auth engine code :=' ||
3176 to_char(l_reqresp.Response.ErrCode),
3177 G_LEVEL_STATEMENT,l_dbg_mod);
3178 iby_debug_pub.add('auth engine msg :=' ||
3179 to_char(l_reqresp.Response.ErrMessage),
3180 G_LEVEL_STATEMENT,l_dbg_mod);
3181
3182 iby_debug_pub.add('payment system code :=' ||
3183 to_char(l_reqresp.BEPErrCode),
3184 G_LEVEL_STATEMENT,l_dbg_mod);
3185 iby_debug_pub.add('payment system msg :=' ||
3186 to_char(l_reqresp.BEPErrMessage),
3187 G_LEVEL_STATEMENT,l_dbg_mod);
3188
3189 iby_debug_pub.add('trxn id :=' ||
3190 to_char(l_reqresp.Trxn_ID),
3191 G_LEVEL_STATEMENT,l_dbg_mod);
3192 END IF;
3193 IF (p_auth_attribs.RiskEval_Enable_Flag = 'Y') THEN
3194 x_auth_result.Risk_Result.Risk_Score :=
3195 l_reqresp.RiskResponse.Risk_Score;
3196 x_auth_result.Risk_Result.Risk_Threshold_Val :=
3197 l_reqresp.RiskResponse.Risk_Threshold_Val;
3198 IF (l_reqresp.RiskResponse.Risky_Flag = 'YES') THEN
3199 x_auth_result.Risk_Result.Risky_Flag := 'Y';
3200 ELSE
3201 x_auth_result.Risk_Result.Risky_Flag := 'N';
3202 END IF;
3203 END IF;
3204
3205 -- consume the security code
3206 UPDATE iby_fndcpt_tx_extensions
3207 SET instrument_security_code = NULL,
3208 --instr_sec_code_length = NULL,
3209 encrypted = 'N',
3210 last_updated_by = fnd_global.user_id,
3211 last_update_date = SYSDATE,
3212 last_update_login = fnd_global.login_id,
3213 object_version_number = object_version_number + 1
3214 WHERE trxn_extension_id = p_trxn_entity_id;
3215
3216 UPDATE iby_fndcpt_tx_extensions
3217 SET instrument_security_code = NULL,
3218 --instr_sec_code_length = NULL,
3219 encrypted = 'N',
3220 last_updated_by = fnd_global.user_id,
3221 last_update_date = SYSDATE,
3222 last_update_login = fnd_global.login_id,
3223 object_version_number = object_version_number + 1
3224 WHERE trxn_extension_id IN
3225 (SELECT source_trxn_extension_id
3226 FROM iby_fndcpt_tx_xe_copies
3227 START WITH copy_trxn_extension_id = p_trxn_entity_id
3228 CONNECT BY PRIOR source_trxn_extension_id = copy_trxn_extension_id
3229 );
3230
3231 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3232 iby_debug_pub.add('No. of source extensions updated= :'||SQL%ROWCOUNT,
3233 G_LEVEL_STATEMENT,l_dbg_mod);
3234 END IF;
3235
3236 -- As per PABP guidelines, the cvv value should be consumed
3237 -- securely. i.e, first update with a random value, do a commit
3238 -- then update with null and issue another commit.
3239 -- This is handled through the below procedure call.
3240 IF (l_code_segment_id IS NOT NULL) THEN
3241 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3242 iby_debug_pub.add('Call to Securely_Wipe_Segment.',
3243 G_LEVEL_STATEMENT,l_dbg_mod);
3244 END IF;
3245 Secure_Wipe_Segment(l_code_segment_id);
3246 FOR extn_rec IN c_source_extns(p_trxn_entity_id) LOOP
3247 Secure_Wipe_Segment(extn_rec.instr_code_sec_segment_id);
3248 END LOOP;
3249 END IF;
3250
3251
3252 IF (NOT l_reqresp.Trxn_Id IS NULL) THEN
3253
3254 -- populate the dirdeb_instruction_code column
3255 -- for settlement
3256 BEGIN
3257 IBY_FNDCPT_SETUP_PUB.Get_Trxn_Payer_Attributes(p_payer,p_payer_equivalency, l_payer_attribs);
3258
3259 UPDATE iby_trxn_summaries_all
3260 SET dirdeb_instruction_code = l_payer_attribs.DirectDebit_BankInstruction
3261 WHERE transactionid = l_reqresp.Trxn_Id;
3262
3263 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3264 iby_debug_pub.add('Set DirectDebit_BankInstruction for trxn',
3265 G_LEVEL_STATEMENT,l_dbg_mod);
3266 END IF;
3267
3268 EXCEPTION
3269 WHEN OTHERS THEN
3270 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3271 iby_debug_pub.add('Unable to retrieve/set payer attribs for trxn',
3272 G_LEVEL_EXCEPTION,l_dbg_mod);
3273 END IF;
3274 END;
3275
3276 -- Fix for bug# 7377455. Stamp the tangibleid on the PSON column of
3277 -- IBY_FNDCPT_TX_EXTENSIONS table
3278 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3279 iby_debug_pub.add( 'Stamping the PSON on the extension as '||
3280 l_tangible.Tangible_Id,
3281 G_LEVEL_STATEMENT,l_dbg_mod);
3282 END IF;
3283
3284 UPDATE iby_fndcpt_tx_extensions
3285 SET payment_system_order_number = l_tangible.Tangible_Id
3286 WHERE trxn_extension_id = p_trxn_entity_id;
3287
3288 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
3289 -- on the corresponding record in iby_trxn_summaries_all
3290 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3291 iby_debug_pub.add( 'Stamping '||p_trxn_entity_id ||' as the initiator_extension_id'
3292 ||'on the auth record', G_LEVEL_STATEMENT,l_dbg_mod);
3293 END IF;
3294 UPDATE iby_trxn_summaries_all
3295 SET initiator_extension_id = p_trxn_entity_id
3296 WHERE transactionid = l_reqresp.Trxn_Id
3297 AND reqtype = 'ORAPMTREQ';
3298
3299 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3300 iby_debug_pub.add('creating extension operation record for=' ||
3301 p_trxn_entity_id,G_LEVEL_STATEMENT,l_dbg_mod);
3302 END IF;
3303
3304 -- check to see if the operation is already recorded
3305 OPEN c_operation_count(p_trxn_entity_id,l_reqresp.Trxn_Id);
3306 FETCH c_operation_count INTO l_op_count;
3307 CLOSE c_operation_count;
3308 l_op_count := NVL(l_op_count,0);
3309
3310 IF ( l_op_count > 0 ) THEN
3311 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3312 iby_debug_pub.add( 'operation already recorded',G_LEVEL_STATEMENT,l_dbg_mod);
3313 END IF;
3314 ELSE
3315 INSERT INTO iby_fndcpt_tx_operations
3316 (trxn_extension_id, transactionid,
3317 created_by, creation_date, last_updated_by, last_update_date,
3318 last_update_login, object_version_number
3319 )
3320 VALUES
3321 (p_trxn_entity_id, l_reqresp.Trxn_Id,
3322 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
3323 fnd_global.login_id, 1
3324 );
3325
3326 --
3327 -- back-propagate the authorization
3328 --
3329 INSERT INTO iby_fndcpt_tx_operations
3330 (trxn_extension_id, transactionid,
3331 created_by, creation_date, last_updated_by, last_update_date,
3332 last_update_login, object_version_number
3333 )
3334 SELECT source_trxn_extension_id, l_reqresp.Trxn_Id,
3335 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
3336 fnd_global.login_id, 1
3337 FROM iby_fndcpt_tx_xe_copies
3338 START WITH copy_trxn_extension_id = p_trxn_entity_id
3339 CONNECT BY PRIOR source_trxn_extension_id = copy_trxn_extension_id;
3340
3341 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3342 iby_debug_pub.add('back-propogated rows:='||SQL%ROWCOUNT,G_LEVEL_STATEMENT,l_dbg_mod);
3343 END IF;
3344
3345 --
3346 -- forward propogate the authorization
3347 --
3348 INSERT INTO iby_fndcpt_tx_operations
3349 (trxn_extension_id, transactionid,
3350 created_by, creation_date, last_updated_by, last_update_date,
3351 last_update_login, object_version_number
3352 )
3353 SELECT copy_trxn_extension_id, l_reqresp.Trxn_Id,
3354 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
3355 fnd_global.login_id, 1
3356 FROM iby_fndcpt_tx_xe_copies
3357 START WITH source_trxn_extension_id = p_trxn_entity_id
3358 CONNECT BY source_trxn_extension_id = PRIOR copy_trxn_extension_id;
3359
3360 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3361 iby_debug_pub.add('forward-propogated rows:='||SQL%ROWCOUNT,G_LEVEL_STATEMENT,l_dbg_mod);
3362 END IF;
3363
3364 END IF;
3365
3366 x_auth_result.Auth_Id := l_reqresp.Trxn_Id;
3367 x_auth_result.Auth_Date := l_reqresp.Trxn_Date;
3368 x_auth_result.Auth_Code := l_reqresp.Authcode;
3369 x_auth_result.AVS_Code := l_reqresp.AVSCode;
3370 x_auth_result.Instr_SecCode_Check := l_reqresp.CVV2Result;
3371 x_auth_result.PaymentSys_Code := l_reqresp.BEPErrCode;
3372 x_auth_result.PaymentSys_Msg := l_reqresp.BEPErrMessage;
3373 --x_auth_result.Risk_Result;
3374
3375 END IF;
3376
3377 --COMMIT;
3378
3379 IF (l_reqresp.Response.Status = 0) THEN
3380 x_response.Result_Code := G_RC_AUTH_SUCCESS;
3381
3382 /* Bug 11903662*/
3383 IF (l_single_use = 'Y') THEN
3384 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3385 iby_debug_pub.add('Single Use Flag is True for the Credit Card Updating Marking Active Flag to N',G_LEVEL_STATEMENT,l_dbg_mod);
3386 END IF;
3387 UPDATE iby_creditcard SET active_flag = 'N' where instrid = l_pmt_instr.PmtInstr_Id;
3388 END IF;
3389 ELSE
3390 --x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR);
3391
3392 -- check if the result code is seeded in the result definitions
3393 -- table
3394 --
3395 IF (IBY_FNDCPT_COMMON_PUB.Get_Result_Category(x_response.Result_Code,iby_payment_adapter_pub.G_INTERFACE_CODE) IS NULL)
3396 THEN
3397 x_response.Result_Code := 'COMMUNICATION_ERROR';
3398 --IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
3399 END IF;
3400
3401 --Start of Bug:10240644.
3402 IF ( (NOT l_reqresp.BEPErrMessage IS NULL)
3403 OR (NOT l_reqresp.BEPErrCode IS NULL) )
3404 THEN
3405 --Changing Error Message that is displayed
3406 --This conveys more appropriate than generic msg
3407 --displayed previously.
3408 l_reqresp.Response.ErrMessage :=
3409 l_reqresp.BEPErrMessage || ' (' ||
3410 l_reqresp.BEPErrCode || ')';
3411 iby_debug_pub.add('Response Message from BEPErrMessage: '||l_reqresp.Response.ErrMessage,G_LEVEL_STATEMENT,l_dbg_mod);
3412 ELSIF( (NOT l_reqresp.Response.ErrMessage IS NULL)
3413 OR (NOT l_reqresp.Response.ErrCode IS NULL) )
3414 THEN
3415 --UnCommenting this for Bug: 10240644
3416 l_reqresp.Response.ErrMessage :=
3417 l_reqresp.Response.ErrMessage || ' (' ||
3418 l_reqresp.Response.ErrCode || ')';
3419 iby_debug_pub.add('Response Message from engine: '||l_reqresp.Response.ErrMessage,G_LEVEL_STATEMENT,l_dbg_mod);
3420 --End of Bug:10240644.
3421 ELSE
3422 l_reqresp.Response.ErrMessage := FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded => FND_API.G_FALSE) || ' (' ||
3423 FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded => FND_API.G_TRUE) || ')';
3424 l_reqresp.Response.ErrCode := FND_MSG_PUB.Get(p_msg_index => x_msg_count, p_encoded => FND_API.G_TRUE);
3425 iby_debug_pub.add('Response Message from FND Stack: '||l_reqresp.Response.ErrMessage,G_LEVEL_STATEMENT,l_dbg_mod);
3426 END IF;
3427
3428 iby_fndcpt_common_pub.Prepare_Result(
3429 iby_payment_adapter_pub.G_INTERFACE_CODE,
3430 l_reqresp.Response.ErrMessage,
3431 l_prev_msg_count,
3432 x_return_status,
3433 x_msg_count,
3434 x_msg_data,
3435 x_response
3436 );
3437
3438 --Commenting this for Bug: 9380078
3439 -- Need to pass the bepmessages to the source products.
3440 -- x_response.Result_Code := 'COMMUNICATION_ERROR';
3441 iby_debug_pub.add('*** assigning messages to the response object',
3442 G_LEVEL_STATEMENT,l_dbg_mod);
3443
3444 x_response.Result_Code := substr(to_char(l_reqresp.Response.ErrCode),0,30);
3445 x_response.Result_Category := substr(l_reqresp.BEPErrMessage,0,30);
3446 x_response.Result_Message := to_char(l_reqresp.Response.ErrMessage);
3447
3448 iby_debug_pub.add('x_response.Result_Code :=' || x_response.Result_Code ,
3449 G_LEVEL_STATEMENT,l_dbg_mod);
3450
3451 iby_debug_pub.add('x_response.Result_Category :=' || x_response.Result_Category,
3452 G_LEVEL_STATEMENT,l_dbg_mod);
3453
3454 iby_debug_pub.add('x_response.Result_Message :=' || x_response.Result_Message,
3455 G_LEVEL_STATEMENT,l_dbg_mod);
3456
3457 iby_debug_pub.add('*** assigned messages to the response object',
3458 G_LEVEL_STATEMENT,l_dbg_mod);
3459
3460 RETURN;
3461 END IF;
3462
3463 END IF;
3464 ELSE
3465 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
3466
3467 l_fail_msg := Get_Extension_Auth_Fail(p_trxn_entity_id,p_payer);
3468 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3469 iby_debug_pub.add('fail msg code:=' || l_fail_msg,G_LEVEL_ERROR,l_dbg_mod);
3470 END IF;
3471 IF (NOT l_fail_msg IS NULL) THEN
3472 FND_MESSAGE.SET_NAME('IBY',l_fail_msg);
3473 l_fail_msg := FND_MESSAGE.GET();
3474
3475 iby_fndcpt_common_pub.Prepare_Result
3476 (iby_payment_adapter_pub.G_INTERFACE_CODE,
3477 l_fail_msg,l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,
3478 x_response);
3479
3480 RETURN;
3481 END IF;
3482 END IF;
3483 END IF;
3484
3485 iby_fndcpt_common_pub.Prepare_Result
3486 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3487
3488 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3489 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_module);
3490 END IF;
3491 EXCEPTION
3492
3493 WHEN FND_API.G_EXC_ERROR THEN
3494
3495 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3496 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
3497 debug_level => G_LEVEL_EXCEPTION,
3498 module => G_DEBUG_MODULE || l_module);
3499 END IF;
3500 x_return_status := FND_API.G_RET_STS_ERROR;
3501 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3502 p_data => x_msg_data
3503 );
3504 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3505
3506 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3507 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
3508 debug_level => G_LEVEL_UNEXPECTED,
3509 module => G_DEBUG_MODULE || l_module);
3510 END IF;
3511 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3512 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3513 p_data => x_msg_data
3514 );
3515
3516 WHEN OTHERS THEN
3517
3518 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3519 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
3520 debug_level => G_LEVEL_UNEXPECTED,
3521 module => G_DEBUG_MODULE || l_module);
3522 END IF;
3523
3524 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
3525
3526 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3527 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3528 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
3529 END IF;
3530
3531 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
3532 p_data => x_msg_data
3533 );
3534
3535 END Create_Authorization;
3536
3537
3538
3539
3540 PROCEDURE Get_Authorization
3541 (
3542 p_api_version IN NUMBER,
3543 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
3544 x_return_status OUT NOCOPY VARCHAR2,
3545 x_msg_count OUT NOCOPY NUMBER,
3546 x_msg_data OUT NOCOPY VARCHAR2,
3547 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
3548 p_trxn_entity_id IN NUMBER,
3549 x_auth_result OUT NOCOPY AuthResult_rec_type,
3550 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
3551 )
3552 IS
3553 l_api_version CONSTANT NUMBER := 1.0;
3554 l_module CONSTANT VARCHAR2(30) := 'Get_Authorization';
3555 l_prev_msg_count NUMBER;
3556
3557 CURSOR c_auth
3558 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
3559 IS
3560 SELECT authorization_id, authorization_date, authorization_code,
3561 avs_code, instr_sec_code_check, pmt_sys_err_code, pmt_sys_err_msg
3562 FROM iby_trxn_ext_auths_v
3563 WHERE (trxn_extension_id = ci_extension_id)
3564 ORDER BY
3565 DECODE(authorization_result_code, 'AUTH_SUCCESS',10,
3566 'AUTH_PENDING',5, 0) DESC;
3567 BEGIN
3568 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3569 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_module);
3570 END IF;
3571
3572
3573 IF (c_auth%ISOPEN) THEN CLOSE c_auth; END IF;
3574
3575 IF NOT FND_API.Compatible_API_Call (l_api_version,
3576 p_api_version,
3577 l_module,
3578 G_PKG_NAME)
3579 THEN
3580 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3581 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
3582 debug_level => G_LEVEL_ERROR,
3583 module => G_DEBUG_MODULE || l_module);
3584 END IF;
3585 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
3586 FND_MSG_PUB.Add;
3587 RAISE FND_API.G_EXC_ERROR;
3588 END IF;
3589
3590 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3591 FND_MSG_PUB.initialize;
3592 END IF;
3593 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
3594
3595 OPEN c_auth(p_trxn_entity_id);
3596 FETCH c_auth INTO
3597 x_auth_result.Auth_Id, x_auth_result.Auth_Date,
3598 x_auth_result.Auth_Code, x_auth_result.AVS_Code,
3599 x_auth_result.Instr_SecCode_Check, x_auth_result.PaymentSys_Code,
3600 x_auth_result.PaymentSys_Msg;
3601 IF (c_auth%NOTFOUND) THEN
3602 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
3603 ELSE
3604 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
3605 END IF;
3606
3607 iby_fndcpt_common_pub.Prepare_Result
3608 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3609
3610 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3611 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_module);
3612 END IF;
3613
3614 EXCEPTION
3615
3616 WHEN FND_API.G_EXC_ERROR THEN
3617
3618 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3619 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
3620 debug_level => G_LEVEL_EXCEPTION,
3621 module => G_DEBUG_MODULE || l_module);
3622 END IF;
3623 x_return_status := FND_API.G_RET_STS_ERROR;
3624 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3625 p_data => x_msg_data
3626 );
3627 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3628
3629 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3630 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
3631 debug_level => G_LEVEL_UNEXPECTED,
3632 module => G_DEBUG_MODULE || l_module);
3633 END IF;
3634 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3635 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3636 p_data => x_msg_data
3637 );
3638
3639 WHEN OTHERS THEN
3640
3641 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
3642 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
3643 debug_level => G_LEVEL_UNEXPECTED,
3644 module => G_DEBUG_MODULE || l_module);
3645 END IF;
3646
3647 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
3648
3649 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3650 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3651 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
3652 END IF;
3653
3654 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
3655 p_data => x_msg_data
3656 );
3657
3658 END Get_Authorization;
3659
3660
3661 PROCEDURE Cancel_Authorization
3662 (
3663 p_api_version IN NUMBER,
3664 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
3665 x_return_status OUT NOCOPY VARCHAR2,
3666 x_msg_count OUT NOCOPY NUMBER,
3667 x_msg_data OUT NOCOPY VARCHAR2,
3668 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
3669 p_auth_id IN NUMBER,
3670 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
3671 )
3672 IS
3673 l_api_version CONSTANT NUMBER := 1.0;
3674 l_module CONSTANT VARCHAR2(30) := 'Cancel_Authorization';
3675 l_prev_msg_count NUMBER;
3676 BEGIN
3677 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3678 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_module);
3679 END IF;
3680
3681
3682 IF NOT FND_API.Compatible_API_Call (l_api_version,
3683 p_api_version,
3684 l_module,
3685 G_PKG_NAME)
3686 THEN
3687 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
3688 debug_level => G_LEVEL_ERROR,
3689 module => G_DEBUG_MODULE || l_module);
3690 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
3691 FND_MSG_PUB.Add;
3692 RAISE FND_API.G_EXC_ERROR;
3693 END IF;
3694
3695 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3696 FND_MSG_PUB.initialize;
3697 END IF;
3698 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
3699
3700 x_response.Result_Code := G_RC_AUTH_CANCEL_UNSUPPORTED;
3701
3702 iby_fndcpt_common_pub.Prepare_Result
3703 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3704
3705 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3706 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_module);
3707 END IF;
3708
3709 EXCEPTION
3710
3711 WHEN FND_API.G_EXC_ERROR THEN
3712
3713 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3714 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
3715 debug_level => G_LEVEL_ERROR,
3716 module => G_DEBUG_MODULE || l_module);
3717 END IF;
3718 x_return_status := FND_API.G_RET_STS_ERROR;
3719 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3720 p_data => x_msg_data
3721 );
3722 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3723 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
3724 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
3725 debug_level => G_LEVEL_UNEXPECTED,
3726 module => G_DEBUG_MODULE || l_module);
3727 END IF;
3728 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3729 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
3730 p_data => x_msg_data
3731 );
3732
3733 WHEN OTHERS THEN
3734
3735 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
3736 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
3737 debug_level => G_LEVEL_UNEXPECTED,
3738 module => G_DEBUG_MODULE || l_module);
3739 END IF;
3740
3741 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
3742
3743 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3744 IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3745 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
3746 END IF;
3747
3748 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
3749 p_data => x_msg_data
3750 );
3751
3752 END Cancel_Authorization;
3753
3754
3755
3756
3757 PROCEDURE Create_Settlement
3758 (
3759 p_api_version IN NUMBER,
3760 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
3761 x_return_status OUT NOCOPY VARCHAR2,
3762 x_msg_count OUT NOCOPY NUMBER,
3763 x_msg_data OUT NOCOPY VARCHAR2,
3764 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
3765 p_payer_equivalency IN VARCHAR2 :=
3766 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
3767 p_trxn_entity_id IN NUMBER,
3768 p_amount IN Amount_rec_type,
3769 p_receipt_attribs IN ReceiptAttribs_rec_type,
3770 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
3771 )
3772 IS
3773 l_api_version CONSTANT NUMBER := 1.0;
3774 l_module CONSTANT VARCHAR2(30) := 'Create_Settlement';
3775 l_prev_msg_count NUMBER;
3776
3777 l_payer_level VARCHAR2(30);
3778 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
3779 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
3780
3781 l_extension_count NUMBER;
3782 l_transactionid iby_fndcpt_tx_operations.transactionid%TYPE;
3783
3784 l_ecapp_id NUMBER;
3785 l_capture_trxn IBY_PAYMENT_ADAPTER_PUB.CaptureTrxn_rec_type;
3786 lx_capresp IBY_PAYMENT_ADAPTER_PUB.CaptureResp_rec_type;
3787 lx_return_status VARCHAR2(1);
3788 lx_msg_count NUMBER;
3789 lx_msg_data VARCHAR2(3000);
3790
3791
3792 l_app_short_name fnd_application.application_short_name%TYPE;
3793 l_order_id iby_fndcpt_tx_extensions.order_id%TYPE;
3794 l_trxn_ref1 iby_fndcpt_tx_extensions.trxn_ref_number1%TYPE;
3795 l_trxn_ref2 iby_fndcpt_tx_extensions.trxn_ref_number2%TYPE;
3796 l_encrypted iby_fndcpt_tx_extensions.encrypted%TYPE;
3797 l_code_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
3798 l_payee IBY_PAYMENT_ADAPTER_PUB.Payee_rec_type;
3799 l_payer IBY_PAYMENT_ADAPTER_PUB.Payer_rec_type;
3800 l_tangible IBY_PAYMENT_ADAPTER_PUB.Tangible_rec_type;
3801 l_pmt_instr IBY_PAYMENT_ADAPTER_PUB.PmtInstr_rec_type;
3802 l_pmt_trxn IBY_PAYMENT_ADAPTER_PUB.PmtReqTrxn_rec_type;
3803 l_reqresp IBY_PAYMENT_ADAPTER_PUB.ReqResp_rec_type;
3804 l_single_use iby_fndcpt_payer_assgn_instr_v.card_single_use_flag%TYPE;
3805
3806 l_op_count NUMBER;
3807
3808 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
3809
3810 CURSOR c_extension
3811 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
3812 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
3813 ci_payer_level IN VARCHAR2,
3814 ci_payer_equiv IN VARCHAR2
3815 )
3816 IS
3817 SELECT NVL(i.instrument_type,pc.instrument_type), NVL(i.instrument_id,0),
3818 x.origin_application_id, a.application_short_name,
3819 x.order_id, x.trxn_ref_number1, x.trxn_ref_number2,
3820 x.instrument_security_code, x.instr_code_sec_segment_id, x.encrypted,
3821 x.po_number, x.voice_authorization_flag, x.voice_authorization_code,
3822 x.voice_authorization_date, NVL(x.instr_assignment_id,0),
3823 x.payment_channel_code
3824 FROM iby_fndcpt_tx_extensions x, iby_pmt_instr_uses_all i,
3825 iby_external_payers_all p, fnd_application a,
3826 iby_fndcpt_pmt_chnnls_b pc
3827 WHERE (x.instr_assignment_id = i.instrument_payment_use_id(+))
3828 AND (x.payment_channel_code = pc.payment_channel_code)
3829 -- can assume this assignment is for funds capture
3830 AND (x.ext_payer_id = p.ext_payer_id)
3831 AND (x.trxn_extension_id = ci_extension_id)
3832 AND (x.origin_application_id = a.application_id)
3833 AND (p.party_id = ci_payer.Party_Id)
3834 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
3835 (ci_payer.org_type, ci_payer.org_id,
3836 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
3837 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
3838 p.cust_account_id,p.acct_site_use_id) = 'T');
3839
3840 CURSOR c_auth
3841 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
3842 IS
3843 SELECT authorization_id
3844 FROM iby_trxn_ext_auths_v
3845 WHERE (trxn_extension_id = ci_extension_id)
3846 AND (authorization_status = 0);
3847
3848
3849 CURSOR C_PAYEE (ci_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE) IS
3850 select s.payeeid, s.org_id, s.org_type
3851 from iby_trxn_summaries_all s, iby_fndcpt_tx_operations o
3852 where s.trxntypeid = 20
3853 and s.transactionid = o.transactionid
3854 and o.trxn_extension_id = ci_trxn_extension_id;
3855
3856 CURSOR c_operation_count
3857 (ci_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
3858 ci_trxn_id IN iby_trxn_summaries_all.transactionid%TYPE)
3859 IS
3860 SELECT count(1)
3861 FROM iby_fndcpt_tx_operations o
3862 WHERE o.transactionid = ci_trxn_id
3863 AND o.trxn_extension_id = ci_trxn_extension_id;
3864
3865 BEGIN
3866
3867 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
3868 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
3869 END IF;
3870
3871
3872 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
3873 IF (c_auth%ISOPEN) THEN CLOSE c_auth; END IF;
3874 IF (c_payee%ISOPEN) THEN CLOSE c_payee; END IF;
3875 IF (c_operation_count%ISOPEN) THEN CLOSE c_operation_count; END IF;
3876
3877 IF NOT FND_API.Compatible_API_Call (l_api_version,
3878 p_api_version,
3879 l_module,
3880 G_PKG_NAME)
3881 THEN
3882 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3883 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
3884 debug_level => G_LEVEL_ERROR,
3885 module => G_DEBUG_MODULE || l_module);
3886 END IF;
3887 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
3888 FND_MSG_PUB.Add;
3889 RAISE FND_API.G_EXC_ERROR;
3890 END IF;
3891
3892 IF FND_API.to_Boolean( p_init_msg_list ) THEN
3893 FND_MSG_PUB.initialize;
3894 END IF;
3895 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
3896
3897 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
3898 l_payer_level,l_payer_id,l_payer_attribs);
3899
3900 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
3901 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
3902 iby_debug_pub.add('invalid payer',G_LEVEL_ERROR,l_dbg_mod);
3903 END IF;
3904 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
3905 ELSE
3906 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3907 iby_debug_pub.add('Create Settlemnet- Valid Payer',G_LEVEL_STATEMENT,l_dbg_mod);
3908 END IF;
3909 OPEN c_extension(p_trxn_entity_id,p_payer,l_payer_level,p_payer_equivalency);
3910 FETCH c_extension INTO l_pmt_instr.PmtInstr_Type,
3911 l_pmt_instr.PmtInstr_Id, l_ecapp_id, l_app_short_name,
3912 l_order_id, l_trxn_ref1, l_trxn_ref2,
3913 l_pmt_trxn.CVV2, l_code_segment_id, l_encrypted,
3914 l_pmt_trxn.PONum, l_pmt_trxn.VoiceAuthFlag,
3915 l_pmt_trxn.AuthCode, l_pmt_trxn.DateOfVoiceAuthorization,
3916 l_pmt_instr.Pmtinstr_assignment_id,
3917 l_pmt_trxn.payment_channel_code;
3918 CLOSE c_extension;
3919
3920 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3921 iby_debug_pub.add('retrieveing extn attrs rows' || SQL%ROWCOUNT,G_LEVEL_STATEMENT,l_dbg_mod);
3922 END IF;
3923
3924
3925 IF (l_ecapp_id IS NULL) THEN
3926 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3927 iby_debug_pub.add('Create Settlemnet. l_ecapp_id is null ',G_LEVEL_STATEMENT,l_dbg_mod);
3928 END IF;
3929 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
3930 ELSE
3931 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3932 iby_debug_pub.add('Create Settlemnet. l_ecapp_id is not null. l_pmt_instr.PmtInstr_Type ' || l_pmt_instr.PmtInstr_Type,G_LEVEL_STATEMENT,l_dbg_mod);
3933 END IF;
3934 IF (l_pmt_instr.PmtInstr_Type = IBY_FNDCPT_COMMON_PUB.G_INSTR_TYPE_BANKACCT) THEN
3935 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3936 iby_debug_pub.add('Create Settlemnet. Entered Bank Account flow. p_trxn_entity_id ' || p_trxn_entity_id,G_LEVEL_STATEMENT,l_dbg_mod);
3937 END IF;
3938 OPEN C_PAYEE(p_trxn_entity_id);
3939 FETCH C_PAYEE INTO l_payee.Payee_Id, l_pmt_trxn.org_id, l_pmt_trxn.org_type;
3940 IF C_PAYEE%NOTFOUND THEN
3941 CLOSE C_PAYEE;
3942 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3943 iby_debug_pub.add('Invalid Payee ',G_LEVEL_STATEMENT,l_dbg_mod);
3944 END IF;
3945 x_response.Result_Code := G_RC_INVALID_PAYEE;
3946
3947 iby_fndcpt_common_pub.Prepare_Result
3948 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
3949 RETURN;
3950
3951 END IF;
3952 CLOSE C_PAYEE;
3953 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3954 iby_debug_pub.add('Payee id ' || l_payee.Payee_Id || ' org id ' || l_pmt_trxn.org_id || ' org type ' || l_pmt_trxn.org_type ,G_LEVEL_STATEMENT,l_dbg_mod);
3955 END IF;
3956
3957
3958 l_pmt_trxn.Auth_Type := IBY_PAYMENT_ADAPTER_PUB.G_AUTHTYPE_AUTHONLY;
3959 l_pmt_trxn.PmtMode := 'OFFLINE';
3960 l_pmt_trxn.Settlement_Date := sysdate;
3961
3962 l_payer.Party_Id := p_payer.Party_Id;
3963
3964 --Changing the way we generate tangible_id :Bug: 7628586
3965 l_tangible.Tangible_Id :=
3966 Get_Tangible_Id(l_app_short_name,p_trxn_entity_id);
3967 --l_tangible.Tangible_Id :=
3968 --Get_Tangible_Id(l_app_short_name,l_order_id,l_trxn_ref1,l_trxn_ref2);
3969
3970 l_tangible.Tangible_Amount := p_amount.Value;
3971 l_tangible.Currency_Code := p_amount.Currency_Code;
3972
3973
3974
3975 -- ciphertext; get clear-text value in the engine
3976 IF (l_encrypted = 'Y') THEN
3977 l_pmt_trxn.CVV2 := NULL;
3978 l_pmt_trxn.Trxn_Extension_Id := p_trxn_entity_id;
3979 END IF;
3980
3981 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3982 iby_debug_pub.add('calling IBY_PAYMENT_ADAPTER_PUB.oraPmtReq ',G_LEVEL_STATEMENT,l_dbg_mod);
3983 END IF;
3984 IBY_PAYMENT_ADAPTER_PUB.OraPmtReq
3985 (1.0, p_init_msg_list, FND_API.G_FALSE, FND_API.G_VALID_LEVEL_FULL,
3986 l_ecapp_id, l_payee, l_payer, l_pmt_instr,
3987 l_tangible,
3988 l_pmt_trxn,
3989 lx_return_status,
3990 lx_msg_count,
3991 lx_msg_data,
3992 l_reqresp
3993 );
3994
3995 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3996 iby_debug_pub.add('status :=' || lx_return_status,
3997 G_LEVEL_STATEMENT,l_dbg_mod);
3998 iby_debug_pub.add('auth status :=' ||
3999 to_char(l_reqresp.Response.Status),
4000 G_LEVEL_STATEMENT,l_dbg_mod);
4001 iby_debug_pub.add('auth engine code :=' ||
4002 to_char(l_reqresp.Response.ErrCode),
4003 G_LEVEL_STATEMENT,l_dbg_mod);
4004 iby_debug_pub.add('auth engine msg :=' ||
4005 to_char(l_reqresp.Response.ErrMessage),
4006 G_LEVEL_STATEMENT,l_dbg_mod);
4007
4008 iby_debug_pub.add('payment system code :=' ||
4009 to_char(l_reqresp.BEPErrCode),
4010 G_LEVEL_STATEMENT,l_dbg_mod);
4011 iby_debug_pub.add('payment system msg :=' ||
4012 to_char(l_reqresp.BEPErrMessage),
4013 G_LEVEL_STATEMENT,l_dbg_mod);
4014
4015 iby_debug_pub.add('trxn id :=' ||
4016 to_char(l_reqresp.Trxn_ID),
4017 G_LEVEL_STATEMENT,l_dbg_mod);
4018
4019 -- Fix for bug# 7377455. Stamp the tangibleid on the PSON column of
4020 -- IBY_FNDCPT_TX_EXTENSIONS table
4021 iby_debug_pub.add( 'Stamping the PSON on the extension as '||
4022 l_tangible.Tangible_Id,
4023 G_LEVEL_STATEMENT,l_dbg_mod);
4024 END IF;
4025
4026 UPDATE iby_fndcpt_tx_extensions
4027 SET payment_system_order_number = l_tangible.Tangible_Id
4028 WHERE trxn_extension_id = p_trxn_entity_id;
4029
4030 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
4031 -- on the corresponding record in iby_trxn_summaries_all
4032 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4033 iby_debug_pub.add( 'Stamping '||p_trxn_entity_id ||' as the initiator_extension_id'
4034 ||'on the auth record', G_LEVEL_STATEMENT,l_dbg_mod);
4035 END IF;
4036
4037 UPDATE iby_trxn_summaries_all
4038 SET initiator_extension_id = p_trxn_entity_id
4039 WHERE transactionid = l_reqresp.Trxn_Id
4040 AND reqtype = 'ORAPMTREQ';
4041
4042 IF (l_reqresp.Response.Status = 0) THEN
4043 --x_response.Result_Code := G_RC_AUTH_SUCCESS;
4044 x_response.Result_Code := 'SETTLEMENT_SUCCESS';
4045 ELSE
4046 --x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR);
4047
4048 -- check if the result code is seeded in the result definitions
4049 -- table
4050 --
4051 IF (IBY_FNDCPT_COMMON_PUB.Get_Result_Category(x_response.Result_Code,iby_payment_adapter_pub.G_INTERFACE_CODE) IS NULL)
4052 THEN
4053 x_response.Result_Code := 'COMMUNICATION_ERROR';
4054 --IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
4055 END IF;
4056
4057 IF ( (NOT l_reqresp.Response.ErrMessage IS NULL)
4058 OR (NOT l_reqresp.Response.ErrCode IS NULL) )
4059 THEN
4060 l_reqresp.Response.ErrMessage :=
4061 l_reqresp.Response.ErrMessage || ' (' ||
4062 l_reqresp.Response.ErrCode || ')';
4063 END IF;
4064
4065 iby_fndcpt_common_pub.Prepare_Result(
4066 iby_payment_adapter_pub.G_INTERFACE_CODE,
4067 l_reqresp.Response.ErrMessage,
4068 l_prev_msg_count,
4069 x_return_status,
4070 x_msg_count,
4071 x_msg_data,
4072 x_response
4073 );
4074
4075 RETURN;
4076
4077 END IF;
4078
4079 OPEN c_operation_count(p_trxn_entity_id,l_reqresp.Trxn_Id);
4080 FETCH c_operation_count INTO l_op_count;
4081 CLOSE c_operation_count;
4082
4083 IF (NVL(l_op_count,0) = 0) THEN
4084 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4085 iby_debug_pub.add('inserting into iby_fndcpt_tx_operations.',
4086 G_LEVEL_STATEMENT,l_dbg_mod);
4087 END IF;
4088 INSERT INTO iby_fndcpt_tx_operations
4089 (trxn_extension_id, transactionid,
4090 created_by, creation_date, last_updated_by, last_update_date,
4091 last_update_login, object_version_number
4092 )
4093 VALUES
4094 (p_trxn_entity_id, l_reqresp.Trxn_Id,
4095 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
4096 fnd_global.login_id, 1
4097 );
4098
4099 --
4100 -- back-propagate the authorization
4101 --
4102 INSERT INTO iby_fndcpt_tx_operations
4103 (trxn_extension_id, transactionid,
4104 created_by, creation_date, last_updated_by, last_update_date,
4105 last_update_login, object_version_number
4106 )
4107 SELECT source_trxn_extension_id, l_reqresp.Trxn_Id,
4108 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
4109 fnd_global.login_id, 1
4110 FROM iby_fndcpt_tx_xe_copies
4111 START WITH copy_trxn_extension_id = p_trxn_entity_id
4112 CONNECT BY PRIOR source_trxn_extension_id = copy_trxn_extension_id;
4113
4114 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4115 iby_debug_pub.add('back-propogated rows:='||SQL%ROWCOUNT,
4116 G_LEVEL_STATEMENT,l_dbg_mod);
4117 END IF;
4118
4119 --
4120 -- forward propogate the authorization
4121 --
4122 INSERT INTO iby_fndcpt_tx_operations
4123 (trxn_extension_id, transactionid,
4124 created_by, creation_date, last_updated_by, last_update_date,
4125 last_update_login, object_version_number
4126 )
4127 SELECT copy_trxn_extension_id, l_reqresp.Trxn_Id,
4128 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
4129 fnd_global.login_id, 1
4130 FROM iby_fndcpt_tx_xe_copies
4131 START WITH source_trxn_extension_id = p_trxn_entity_id
4132 CONNECT BY source_trxn_extension_id = PRIOR copy_trxn_extension_id;
4133
4134 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4135 iby_debug_pub.add('forward-propogated rows:='||SQL%ROWCOUNT,G_LEVEL_STATEMENT,l_dbg_mod);
4136 END IF;
4137 END IF;
4138 ELSE
4139 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4140 iby_debug_pub.add('not bank account settlement ',G_LEVEL_STATEMENT,l_dbg_mod);
4141 END IF;
4142
4143 OPEN c_auth(p_trxn_entity_id);
4144 FETCH c_auth INTO l_transactionid;
4145 CLOSE c_auth;
4146 IF (l_transactionid IS NULL) THEN
4147 x_response.Result_Code := G_RC_INVALID_AUTHORIZATION;
4148 ELSE
4149 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4150 iby_debug_pub.add('calling capture',G_LEVEL_STATEMENT,l_dbg_mod);
4151 END IF;
4152 l_capture_trxn.PmtMode := 'ONLINE';
4153 l_capture_trxn.Trxn_Id := l_transactionid;
4154 l_capture_trxn.Price := p_amount.Value;
4155 l_capture_trxn.Currency := p_amount.Currency_Code;
4156
4157 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4158 iby_debug_pub.add('Settlement_Date passed as: '||p_receipt_attribs.Settlement_Date,G_LEVEL_STATEMENT,l_dbg_mod);
4159 iby_debug_pub.add('Settlement_Due_Date passed as: '||p_receipt_attribs.Settlement_Due_Date,G_LEVEL_STATEMENT,l_dbg_mod);
4160 END IF;
4161 l_capture_trxn.Settlement_Date := p_receipt_attribs.Settlement_Date;
4162
4163 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4164 iby_debug_pub.add('Create Settlement- calling OraPmtCapture ' ,G_LEVEL_STATEMENT,l_dbg_mod);
4165 END IF;
4166 IBY_PAYMENT_ADAPTER_PUB.OraPmtCapture
4167 (1.0, p_init_msg_list, FND_API.G_FALSE, FND_API.G_VALID_LEVEL_FULL,
4168 l_ecapp_id, l_capture_trxn,
4169 lx_return_status, lx_msg_count, lx_msg_data, lx_capresp
4170 );
4171
4172 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4173 iby_debug_pub.add('status :=' || lx_return_status,
4174 G_LEVEL_STATEMENT,l_dbg_mod);
4175 iby_debug_pub.add('capture status :=' ||
4176 to_char(lx_capresp.Response.Status),
4177 G_LEVEL_STATEMENT,l_dbg_mod);
4178 iby_debug_pub.add('engine code :=' ||
4179 to_char(lx_capresp.Response.ErrCode),
4180 G_LEVEL_STATEMENT,l_dbg_mod);
4181 iby_debug_pub.add('engine msg :=' ||
4182 to_char(lx_capresp.Response.ErrMessage),
4183 G_LEVEL_STATEMENT,l_dbg_mod);
4184
4185 iby_debug_pub.add('payment system code :=' ||
4186 to_char(lx_capresp.BEPErrCode),
4187 G_LEVEL_STATEMENT,l_dbg_mod);
4188 iby_debug_pub.add('payment system msg :=' ||
4189 to_char(lx_capresp.BEPErrMessage),
4190 G_LEVEL_STATEMENT,l_dbg_mod);
4191
4192 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
4193 -- on the corresponding record in iby_trxn_summaries_all
4194 iby_debug_pub.add( 'Stamping '||p_trxn_entity_id ||' as the initiator_extension_id'
4195 ||'on the capture record', G_LEVEL_STATEMENT,l_dbg_mod);
4196 END IF;
4197
4198 UPDATE iby_trxn_summaries_all
4199 SET initiator_extension_id = p_trxn_entity_id
4200 WHERE transactionid = l_reqresp.Trxn_Id
4201 AND reqtype = 'ORAPMTCAPTURE';
4202
4203 IF (lx_capresp.Response.Status = 0) THEN
4204 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
4205 ELSE
4206 x_response.Result_Code :=
4207 NVL(lx_capresp.Response.ErrCode,IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR);
4208 -- check if the result code is seeded in the result definitions
4209 -- table
4210 --
4211 IF (IBY_FNDCPT_COMMON_PUB.Get_Result_Category(x_response.Result_Code,iby_payment_adapter_pub.G_INTERFACE_CODE) IS NULL)
4212 THEN
4213 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
4214 END IF;
4215
4216 IF ( (NOT lx_capresp.Response.ErrMessage IS NULL)
4217 OR (NOT lx_capresp.Response.ErrCode IS NULL) )
4218 THEN
4219 lx_capresp.Response.ErrMessage :=
4220 lx_capresp.Response.ErrMessage || ' (' ||
4221 lx_capresp.Response.ErrCode || ')';
4222 END IF;
4223
4224 iby_fndcpt_common_pub.Prepare_Result(
4225 iby_payment_adapter_pub.G_INTERFACE_CODE,
4226 lx_capresp.Response.ErrMessage,
4227 l_prev_msg_count,
4228 x_return_status,
4229 x_msg_count,
4230 x_msg_data,
4231 x_response
4232 );
4233 RETURN;
4234 END IF;
4235 END IF;
4236 END IF;
4237
4238 END IF;
4239 END IF;
4240
4241
4242
4243 iby_fndcpt_common_pub.Prepare_Result
4244 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
4245
4246 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
4247 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
4248 END IF;
4249
4250
4251 EXCEPTION
4252
4253 WHEN FND_API.G_EXC_ERROR THEN
4254
4255 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
4256 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
4257 debug_level => G_LEVEL_EXCEPTION,
4258 module => G_DEBUG_MODULE || l_module);
4259 END IF;
4260 x_return_status := FND_API.G_RET_STS_ERROR;
4261 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
4262 p_data => x_msg_data
4263 );
4264 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4265 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
4266 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
4267 debug_level => G_LEVEL_UNEXPECTED,
4268 module => G_DEBUG_MODULE || l_module);
4269 END IF;
4270 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4271 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
4272 p_data => x_msg_data
4273 );
4274
4275 WHEN OTHERS THEN
4276
4277 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
4278 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
4279 debug_level => G_LEVEL_UNEXPECTED,
4280 module => G_DEBUG_MODULE || l_module);
4281 END IF;
4282 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
4283
4284 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
4285 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4286 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
4287 END IF;
4288
4289 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
4290 p_data => x_msg_data
4291 );
4292
4293 END Create_Settlement;
4294
4295
4296 --Overloaded API for backward compatibility
4297 PROCEDURE Create_Settlement
4298 (
4299 p_api_version IN NUMBER,
4300 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
4301 x_return_status OUT NOCOPY VARCHAR2,
4302 x_msg_count OUT NOCOPY NUMBER,
4303 x_msg_data OUT NOCOPY VARCHAR2,
4304 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
4305 p_payer_equivalency IN VARCHAR2 :=
4306 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
4307 p_trxn_entity_id IN NUMBER,
4308 p_amount IN Amount_rec_type,
4309 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
4310 )
4311 IS
4312 p_receipt_attribs ReceiptAttribs_rec_type;
4313 l_module CONSTANT VARCHAR2(30) := 'Create_Settlement(2)';
4314 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
4315 BEGIN
4316 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
4317 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
4318 END IF;
4319
4320 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
4321 iby_debug_pub.add( 'Overloaded API invoked. ReceiptAttribs_rec_type will be defaulted to Null',
4322 G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
4323 END IF;
4324
4325 p_receipt_attribs.Settlement_Date := NULL;
4326 p_receipt_attribs.Settlement_Due_Date := NULL;
4327
4328 Create_Settlement
4329 (
4330 p_api_version,
4331 p_init_msg_list,
4332 x_return_status,
4333 x_msg_count,
4334 x_msg_data,
4335 p_payer,
4336 p_payer_equivalency,
4337 p_trxn_entity_id,
4338 p_amount,
4339 p_receipt_attribs,
4340 x_response
4341 );
4342 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
4343 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
4344 END IF;
4345
4346 END Create_Settlement;
4347
4348 -- Create_Settlements
4349 --
4350 -- API name : create_settlements
4351 -- Type : Public
4352 -- Pre-reqs : None
4353 -- Function : Pick up bulk settlment data from the the application
4354 -- views to insert the settlement record in
4355 -- IBY_TRXN_SUMMARIES_ALL. This API now optionally
4356 -- returns a table of reversal response
4357 --
4358 -- Current version : 1.0
4359 -- Previous version: 1.0
4360 -- Initial version : 1.0
4361 --
4362
4363 PROCEDURE Create_Settlements (
4364 p_api_version IN NUMBER,
4365 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.G_FALSE,
4366 p_calling_app_id IN NUMBER,
4367 p_calling_app_request_code IN IBY_TRXN_SUMMARIES_ALL.CALL_APP_SERVICE_REQ_CODE%TYPE,
4368 p_order_view_name IN VARCHAR2,
4369 x_return_status OUT NOCOPY VARCHAR2,
4370 x_msg_count OUT NOCOPY NUMBER,
4371 x_msg_data OUT NOCOPY VARCHAR2,
4372 x_responses OUT NOCOPY SettlementResult_tbl_type,
4373 x_rev_responses OUT NOCOPY ReversalResult_tbl_type
4374 ) IS
4375
4376 l_api_name CONSTANT VARCHAR2(30) := 'Create_Settlements';
4377 l_api_version CONSTANT NUMBER := 1.0;
4378 l_module_name CONSTANT VARCHAR2(200) := G_DEBUG_MODULE || '.' ||
4379 l_api_name;
4380 l_prev_msg_count NUMBER;
4381
4382 --
4383 -- This record are used to insert into the funds capture orders
4384 --
4385 TYPE TrxnTabType IS TABLE OF IBY_TRXN_SUMMARIES_ALL%ROWTYPE
4386 INDEX BY BINARY_INTEGER;
4387
4388 l_Trxn_Tab TrxnTabType;
4389 empty_Trxn_Tab TrxnTabType;
4390
4391 TYPE TrxnCoreTabType IS TABLE OF IBY_TRXN_CORE%ROWTYPE
4392 INDEX BY BINARY_INTEGER;
4393
4394 l_TrxnCore_Tab TrxnCoreTabType;
4395 empty_TrxnCore_Tab TrxnCoreTabType;
4396
4397 TYPE TangibleTabType IS TABLE OF IBY_TANGIBLE%ROWTYPE
4398 INDEX BY BINARY_INTEGER;
4399
4400 -- This record would be used in the create_settlements API to update the PSON
4401 -- attribute of an extension.
4402 -- This is the only attribute that we are populating in this table after a settlement
4403 -- so we will keep only this record in the record. We may add more in future
4404 TYPE Pson_rec_type IS RECORD (
4405 extension_id IBY_FNDCPT_TX_EXTENSIONS.trxn_extension_id%TYPE,
4406 tangibleid IBY_FNDCPT_TX_EXTENSIONS.payment_system_order_number%TYPE
4407 );
4408
4409 TYPE PsonTabType IS TABLE OF Pson_rec_type
4410 INDEX BY BINARY_INTEGER;
4411
4412 l_pson_Tab PsonTabType;
4413
4414 l_Tangible_Tab TangibleTabType;
4415 empty_Tangible_Tab TangibleTabType;
4416
4417 l_where_clause_index VARCHAR2(2000);
4418 l_view_name VARCHAR2(200);
4419 l_app_short_name VARCHAR2(200);
4420
4421 TYPE dyn_order_select IS REF CURSOR;
4422 l_orders_cursor dyn_order_select;
4423 l_orders_query VARCHAR2(32767);
4424
4425 l_settlement_trxn_rec FuncCaptureOrder_rec_type;
4426 l_caOrdersTab caFundcaptureOrdersTabType;
4427 emptyOrdersTab caFundcaptureOrdersTabType;
4428
4429 prev_trxn_ext_id NUMBER(15);
4430 current_trxn_ext_id NUMBER(15);
4431 l_mtangible NUMBER(15);
4432 l_tangibleid VARCHAR2(80);
4433
4434 indx PLS_INTEGER := 0;
4435 order_index PLS_INTEGER := 1;
4436 trxnCoreIndx PLS_INTEGER := 0;
4437 tangibleIndx PLS_INTEGER := 0;
4438
4439 -- Bug# 7658675.REMITTANCE BATCH (IBY_FNDCPT_TRXN_PUB.CREATE_SETTLEMENTS) LTD TO 1000 RECORDS
4440 -- new variables defined for inserting all the remitted records
4441 -- in the iby_trxn_summaries_all table.
4442 -- variable l is used to initialize the record# in the inner loop.
4443 -- rec_limit is the no of fecords processed in each fetch(iteration).It is
4444 -- initialized to 1000 as per design.
4445
4446 l PLS_INTEGER := 0;
4447 rec_limit NUMBER := 1000;
4448
4449 -- routing out parameters
4450
4451 lx_bep_id iby_bepinfo.bepid%TYPE;
4452 lx_process_profile iby_fndcpt_user_cc_pf_b.USER_CC_PROFILE_CODE %TYPE;
4453 lx_bep_key iby_bepkeys.key%TYPE;
4454 l_routing_failure BOOLEAN;
4455 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || 'Create_Settlements(2)';
4456 l_debit_auth_id iby_trxn_summaries_all.debit_authorization_id%TYPE;
4457 l_payment_type_code VARCHAR2(10);
4458 l_mandate_trxn_count NUMBER(10);
4459
4460 /* For reversal */
4461 l_rev_allowed VARCHAR2(1) := 'N';
4462 l_rev_trxn IBY_PAYMENT_ADAPTER_PUB.RevTrxn_rec_type;
4463 l_ecapp_id NUMBER;
4464 lx_return_status VARCHAR2(1);
4465 lx_msg_count NUMBER;
4466 lx_msg_data VARCHAR2(3000);
4467 lx_rev_resp IBY_PAYMENT_ADAPTER_PUB.RevResp_rec_type;
4468 l_result_category iby_result_codes.result_category%TYPE;
4469 l_interface_code iby_result_codes.request_interface_code%TYPE;
4470 l_cap_ex_auth_bep VARCHAR2(1) := 'Y';
4471 l_cap_ex_auth_issuer VARCHAR2(1) := 'Y';
4472
4473 CURSOR c_auth (c_tid IBY_TRXN_SUMMARIES_ALL.TRANSACTIONID%TYPE) IS
4474 SELECT CORE.authcode
4475 FROM IBY_TRXN_SUMMARIES_ALL TX,
4476 IBY_TRXN_CORE CORE
4477 WHERE TX.TRANSACTIONID = c_tid
4478 AND TX.TRXNMID=CORE.TRXNMID
4479 AND TX.TRXNTYPEID=2
4480 AND TX.STATUS=0;
4481
4482 CURSOR c_setup(ci_bepid iby_bepinfo.bepid%TYPE,
4483 ci_issuer IBY_CREDITCARD_ISSUERS_B.CARD_ISSUER_CODE%TYPE
4484 )
4485 IS
4486 SELECT NVL(B.ALLOW_CAPTURE_EX_AUTH_FLAG, 'Y') BEP_FLAG,
4487 NVL(i.ALLOW_CAPTURE_EX_AUTH_FLAG, 'Y') card_issuer_flag
4488 FROM IBY_BEPINFO B, IBY_CREDITCARD_ISSUERS_B I
4489 WHERE B.BEPID=ci_bepid
4490 AND I.CARD_ISSUER_CODE=ci_issuer;
4491
4492 BEGIN
4493
4494 --iby_debug_pub.add('ENTER',iby_debug_pub.G_LEVEL_PROCEDURE,l_module_name);
4495 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
4496 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
4497 END IF;
4498
4499 -- Close the cursors if open due to previous error
4500 IF (l_orders_cursor%ISOPEN) THEN CLOSE l_orders_cursor; END IF;
4501
4502
4503 SAVEPOINT create_settlements_pub;
4504
4505 -- Standard call to check for call compatibility.
4506 IF NOT FND_API.Compatible_API_Call(l_api_version,
4507 p_api_version,
4508 l_api_name,
4509 G_PKG_NAME) THEN
4510 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4511 END IF;
4512
4513 -- Initialize message list if p_init_msg_list is set to TRUE.
4514 IF FND_API.to_Boolean(p_init_msg_list) THEN
4515 FND_MSG_PUB.initialize;
4516 END IF;
4517 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
4518
4519 -- Initialize API return status to success
4520 x_return_status := FND_API.G_RET_STS_SUCCESS;
4521
4522 -- Start of API body
4523
4524 --
4525 -- Get the shortname of the calling app from the calling
4526 -- app id.
4527 --
4528 SELECT
4529 fnd.application_short_name
4530 INTO
4531 l_app_short_name
4532 FROM
4533 FND_APPLICATION fnd
4534 WHERE
4535 fnd.application_id = p_calling_app_id;
4536
4537 -- Read view name from parameter p_order_view_name
4538 -- if present
4539 IF (p_order_view_name is null) THEN
4540
4541 -- Remove 'SQL' FROM the Name of the view if the application short name
4542 -- begins with 'SQL' for e.g. SQLAP
4543 IF (INSTR(l_app_short_name, 'SQL') > 0) THEN
4544 l_app_short_name := SUBSTR(l_app_short_name, INSTR(l_app_short_name, 'SQL')+3,LENGTH(l_app_short_name));
4545 END IF;
4546
4547 print_debuginfo(l_module_name, 'Calling app short name: '
4548 || l_app_short_name);
4549
4550 --
4551 -- Dynamically form the view name.
4552 --
4553 -- The view name is dependent upon the calling
4554 -- app name and will be of the form
4555 -- <calling app name>_DOCUMENTS_PAYABLE.
4556 --
4557 l_view_name := l_app_short_name || '_FUNDS_CAPTURE_ORDERS_V';
4558 ELSE
4559 l_view_name := p_order_view_name;
4560 END IF;
4561
4562 IF l_view_name = 'AR_FUNDS_CAPTURE_ORDERS_V' THEN
4563 l_where_clause_index :=
4564 -- ' AND orders.selected_remittance_batch_id = decode(substr(:1,1,3),' ||
4565 -- '''AR_''' || ',to_number(substr(:2,4)),-99999)
4566 -- AND orders.worker_id = to_number(substr(:3,INSTR(:4,''_'',4) + 1)) ';
4567 ' AND orders.selected_remittance_batch_id = decode(substr(:1,1,3),' ||
4568 '''AR_''' || ',to_number(substr(substr(:2,1,INSTR(:3,''_'',4)-1),4)),-99999)
4569 AND orders.worker_id = to_number(substr(:4,INSTR(:5,''_'',4) + 1)) ';
4570 ELSE
4571 l_where_clause_index :=
4572 ' AND orders.CALL_APP_SERVICE_REQ_CODE = :1 ' ;
4573 END IF;
4574 --
4575 -- Read the documents for this payment service request
4576 -- from the calling app's view. The calling app's view
4577 -- will be prefixed with the application short name.
4578 --
4579 print_debuginfo(l_module_name, 'Fetching documents from '
4580 || l_view_name
4581 || ' view using CALL_APP_SERVICE_REQ_CODE '
4582 || p_calling_app_request_code
4583 || ' as key');
4584
4585 l_orders_query :=
4586 --OPEN l_orders_cursor FOR
4587 'SELECT
4588 IBY_TRXNSUMM_MID_S.NEXTVAL TRXNMID,
4589 TRXN_REF_NUMBER1,
4590 TRXN_REF_NUMBER2,
4591 PAYMENT_CHANNEL_CODE,
4592 PO_NUMBER,
4593 VOICE_AUTHORIZATION_FLAG,
4594 PAYMENT_FUNCTION,
4595 CALL_APP_SERVICE_REQ_CODE,
4596 SETTLEMENT_DATE,
4597 SETTLEMENT_DUE_DATE,
4598 BR_MATURITY_DATE,
4599 ORDER_DESCRIPTION,
4600 SETTLEMENT_CURRENCY_CODE,
4601 SETTLEMENT_AMOUNT,
4602 PAYMENT_TRXN_EXTENSION_ID,
4603 INTERNAL_BANK_ACCOUNT_ID,
4604 PAYER_PARTY_ID,
4605 CUST_ACCOUNT_ID,
4606 ACCT_SITE_USE_ID,
4607 ORG_ID,
4608 ORG_TYPE,
4609 LEGAL_ENTITY_ID,
4610 BILL_TO_ADDRESS_ID,
4611 SETTLEMENT_CUSTOMER_REFERENCE,
4612 AR_RECEIPT_METHOD_ID,
4613 BR_DRAWEE_ISSUED_FLAG,
4614 BR_SIGNED_FLAG,
4615 BR_DISPUTED_FLAG,
4616 ATTRIBUTE_CATEGORY,
4617 ATTRIBUTE1,
4618 ATTRIBUTE2,
4619 ATTRIBUTE3,
4620 ATTRIBUTE4,
4621 ATTRIBUTE5,
4622 ATTRIBUTE6,
4623 ATTRIBUTE7,
4624 ATTRIBUTE8,
4625 ATTRIBUTE9,
4626 ATTRIBUTE10,
4627 ATTRIBUTE11,
4628 ATTRIBUTE12,
4629 ATTRIBUTE13,
4630 ATTRIBUTE14,
4631 ATTRIBUTE15,
4632 CREATED_BY,
4633 CREATION_DATE,
4634 LAST_UPDATED_BY,
4635 LAST_UPDATE_DATE,
4636 LAST_UPDATE_LOGIN,
4637 OBJECT_VERSION_NUMBER,
4638 AUTH_TRANSACTION_ID,
4639 auth_sales_rep_party_id,
4640 auth_tangibleid,
4641 auth_bepkey,
4642 auth_payeeid,
4643 auth_bepid,
4644 auth_mpayeeid,
4645 auth_ecappid,
4646 auth_paymentmethodname,
4647 auth_mtangibleid,
4648 auth_payeeinstrid,
4649 auth_payerid,
4650 auth_payerinstrid,
4651 auth_detaillookup,
4652 auth_instrnumber,
4653 auth_instrtype,
4654 auth_instrsubtype,
4655 auth_currencynamecode,
4656 auth_desturl,
4657 auth_nlslang,
4658 auth_amount,
4659 auth_process_profile_code,
4660 auth_payment_channel_code,
4661 auth_proc_reference_code,
4662 auth_proc_reference_amount,
4663 auth_legal_entity_id,
4664 auth_settlement_due_date,
4665 auth_bill_to_address_id,
4666 auth_br_maturity_date,
4667 auth_factored_flag,
4668 auth_payment_function,
4669 auth_payer_party_id,
4670 auth_cust_account_id,
4671 auth_acct_site_use_id,
4672 auth_org_id,
4673 auth_org_type,
4674 bep_type,
4675 payer_instr_assignment_id,
4676 debit_auth_flag,
4677 debit_auth_method,
4678 debit_auth_reference,
4679 CAPTURE_TRANSACTION_ID,
4680 int_bank_country,
4681 settle_require_vrfy_flag,
4682 auth_count,
4683 auth_dirdeb_instruction_code,
4684 card_subtype_code,
4685 card_data_level
4686 FROM
4687 (SELECT /*+ leading(orders.intrm) cardinality(orders.intrm 10) */
4688 trxnext.TRXN_REF_NUMBER1,
4689 trxnext.TRXN_REF_NUMBER2,
4690 trxnext.PAYMENT_CHANNEL_CODE,
4691 trxnext.PO_NUMBER,
4692 trxnext.VOICE_AUTHORIZATION_FLAG,
4693 payer.PAYMENT_FUNCTION,
4694 SUBSTR(orders.CALL_APP_SERVICE_REQ_CODE, 1, 255) CALL_APP_SERVICE_REQ_CODE,
4695 orders.SETTLEMENT_DATE,
4696 orders.SETTLEMENT_DUE_DATE,
4697 orders.BR_MATURITY_DATE,
4698 SUBSTR(orders.ORDER_DESCRIPTION, 1, 255) ORDER_DESCRIPTION,
4699 SUBSTR(orders.SETTLEMENT_CURRENCY_CODE, 1, 10) SETTLEMENT_CURRENCY_CODE,
4700 orders.SETTLEMENT_AMOUNT,
4701 orders.PAYMENT_TRXN_EXTENSION_ID,
4702 orders.INTERNAL_BANK_ACCOUNT_ID,
4703 orders.PAYER_PARTY_ID,
4704 orders.CUST_ACCOUNT_ID,
4705 orders.ACCT_SITE_USE_ID,
4706 orders.ORG_ID,
4707 SUBSTR(orders.ORG_TYPE, 1, 30) ORG_TYPE,
4708 orders.LEGAL_ENTITY_ID,
4709 orders.BILL_TO_ADDRESS_ID,
4710 orders.SETTLEMENT_CUSTOMER_REFERENCE,
4711 orders.AR_RECEIPT_METHOD_ID,
4712 orders.BR_DRAWEE_ISSUED_FLAG,
4713 orders.BR_SIGNED_FLAG,
4714 orders.BR_DISPUTED_FLAG,
4715 SUBSTR(orders.ATTRIBUTE_CATEGORY, 1, 150) ATTRIBUTE_CATEGORY,
4716 SUBSTR(orders.ATTRIBUTE1, 1, 150) ATTRIBUTE1,
4717 SUBSTR(orders.ATTRIBUTE2, 1, 150) ATTRIBUTE2,
4718 SUBSTR(orders.ATTRIBUTE3, 1, 150) ATTRIBUTE3,
4719 SUBSTR(orders.ATTRIBUTE4, 1, 150) ATTRIBUTE4,
4720 SUBSTR(orders.ATTRIBUTE5, 1, 150) ATTRIBUTE5,
4721 SUBSTR(orders.ATTRIBUTE6, 1, 150) ATTRIBUTE6,
4722 SUBSTR(orders.ATTRIBUTE7, 1, 150) ATTRIBUTE7,
4723 SUBSTR(orders.ATTRIBUTE8, 1, 150) ATTRIBUTE8,
4724 SUBSTR(orders.ATTRIBUTE9, 1, 150) ATTRIBUTE9,
4725 SUBSTR(orders.ATTRIBUTE10, 1, 150) ATTRIBUTE10,
4726 SUBSTR(orders.ATTRIBUTE11, 1, 150) ATTRIBUTE11,
4727 SUBSTR(orders.ATTRIBUTE12, 1, 150) ATTRIBUTE12,
4728 SUBSTR(orders.ATTRIBUTE13, 1, 150) ATTRIBUTE13,
4729 SUBSTR(orders.ATTRIBUTE14, 1, 150) ATTRIBUTE14,
4730 SUBSTR(orders.ATTRIBUTE15, 1, 150) ATTRIBUTE15,
4731 orders.CREATED_BY,
4732 orders.CREATION_DATE,
4733 orders.LAST_UPDATED_BY,
4734 orders.LAST_UPDATE_DATE,
4735 orders.LAST_UPDATE_LOGIN,
4736 orders.OBJECT_VERSION_NUMBER,
4737 auth.transactionid AUTH_TRANSACTION_ID,
4738 auth.sales_rep_party_id auth_sales_rep_party_id,
4739 auth.tangibleid auth_tangibleid,
4740 auth.bepkey auth_bepkey,
4741 auth.payeeid auth_payeeid,
4742 auth.bepid auth_bepid,
4743 auth.mpayeeid auth_mpayeeid,
4744 auth.ecappid auth_ecappid,
4745 auth.paymentmethodname auth_paymentmethodname,
4746 auth.mtangibleid auth_mtangibleid,
4747 auth.payeeinstrid auth_payeeinstrid,
4748 auth.payerid auth_payerid,
4749 auth.payerinstrid auth_payerinstrid,
4750 auth.detaillookup auth_detaillookup,
4751 auth.instrnumber auth_instrnumber,
4752 auth.instrtype auth_instrtype,
4753 auth.instrsubtype auth_instrsubtype,
4754 auth.currencynamecode auth_currencynamecode,
4755 auth.desturl auth_desturl,
4756 auth.nlslang auth_nlslang,
4757 auth.amount auth_amount,
4758 auth.process_profile_code auth_process_profile_code,
4759 auth.payment_channel_code auth_payment_channel_code,
4760 auth.proc_reference_code auth_proc_reference_code,
4761 auth.proc_reference_amount auth_proc_reference_amount,
4762 auth.legal_entity_id auth_legal_entity_id,
4763 auth.settlement_due_date auth_settlement_due_date,
4764 auth.bill_to_address_id auth_bill_to_address_id,
4765 auth.br_maturity_date auth_br_maturity_date,
4766 decode(orders.remit_method_code, ''STANDARD'', ''N'', ''FACTORING'', ''Y'', ''STANDARD_AND_FACTORING'', ''Y'', ''N'') auth_factored_flag,
4767 auth_payer.payment_function auth_payment_function,
4768 auth_payer.party_id auth_payer_party_id,
4769 auth_payer.cust_account_id auth_cust_account_id,
4770 auth_payer.acct_site_use_id auth_acct_site_use_id,
4771 auth_payer.org_id auth_org_id,
4772 auth_payer.org_type auth_org_type,
4773 bep.bep_type,
4774 auth.payer_instr_assignment_id,
4775 auth.debit_auth_flag,
4776 auth.debit_auth_method,
4777 auth.debit_auth_reference,
4778 captures.transactionid CAPTURE_TRANSACTION_ID,
4779 BranchParty.country int_bank_country,
4780 eft_sys.settle_require_vrfy_flag,
4781 COUNT(auth.transactionid) OVER (PARTITION BY
4782 orders.PAYMENT_TRXN_EXTENSION_ID) auth_count,
4783 auth.dirdeb_instruction_code auth_dirdeb_instruction_code,
4784 auth_trxn_core.card_subtype_code card_subtype_code,
4785 auth_trxn_core.card_data_level card_data_level
4786 FROM '||l_view_name||' orders,
4787 IBY_FNDCPT_TX_EXTENSIONS trxnext,
4788 IBY_EXTERNAL_PAYERS_ALL payer,
4789 IBY_TRXN_SUMMARIES_ALL auth,
4790 IBY_FNDCPT_TX_OPERATIONS trxnop,
4791 IBY_TRXN_SUMMARIES_ALL captures,
4792 IBY_EXTERNAL_PAYERS_ALL auth_payer,
4793 IBY_BEPINFO bep,
4794 IBY_FNDCPT_USER_EFT_PF_B eft_user,
4795 IBY_FNDCPT_SYS_EFT_PF_B eft_sys,
4796 CE_BANK_ACCOUNTS int_ba,
4797 --CE_BANK_BRANCHES_V branch
4798 HZ_PARTIES BranchParty,
4799 HZ_ORGANIZATION_PROFILES BranchOrgProfile,
4800 IBY_TRXN_CORE auth_trxn_core
4801 WHERE orders.PAYMENT_TRXN_EXTENSION_ID = trxnext.TRXN_EXTENSION_ID(+)
4802 AND trxnop.transactionid = auth.transactionid(+)
4803 AND auth.payerid = auth_payer.ext_payer_id(+)
4804 AND auth.bepid = bep.bepid
4805 AND auth.reqtype(+) = ''ORAPMTREQ''
4806 AND DECODE(auth.status(+),''0'',1,''100'',1,''31'',1,''32'',1,0) = 1
4807 AND orders.PAYMENT_TRXN_EXTENSION_ID = trxnop.TRXN_EXTENSION_ID(+)
4808 AND trxnop.transactionid = captures.transactionid(+)
4809 AND DECODE(captures.reqtype(+), ''ORAPMTCAPTURE'',1, ''ORAPMTBATCHREQ'',1, 0) = 1
4810 AND DECODE(captures.status(+), 0,1, 100,1, 11,1, 0) = 1
4811 AND trxnext.EXT_PAYER_ID = payer.EXT_PAYER_ID(+)
4812 AND DECODE(auth.instrtype, ''BANKACCOUNT'',auth.PROCESS_PROFILE_CODE,
4813 NULL) = eft_user.USER_EFT_PROFILE_CODE(+)
4814 AND eft_user.SYS_EFT_PROFILE_CODE = eft_sys.SYS_EFT_PROFILE_CODE(+)
4815 AND orders.INTERNAL_BANK_ACCOUNT_ID = int_ba.BANK_ACCOUNT_ID(+)
4816 --AND int_ba.BANK_BRANCH_ID = branch.BRANCH_PARTY_ID(+)
4817 AND int_ba.BANK_BRANCH_ID = BranchParty.party_id(+)
4818 AND BranchOrgProfile.party_id(+) = BranchParty.party_id
4819 AND BranchParty.status(+) = ''A''
4820 AND SYSDATE BETWEEN TRUNC(BranchOrgProfile.effective_start_date(+))
4821 AND NVL(TRUNC(BranchOrgProfile.effective_end_date(+)),SYSDATE + 1 )
4822 AND auth_trxn_core.trxnmid(+) = auth.trxnmid
4823 '||l_where_clause_index||'
4824 ORDER BY orders.PAYMENT_TRXN_EXTENSION_ID)';
4825 --USING p_calling_app_request_code,p_calling_app_request_code,
4826 -- p_calling_app_request_code,p_calling_app_request_code,
4827 -- p_calling_app_request_code;
4828 IF l_view_name = 'AR_FUNDS_CAPTURE_ORDERS_V' THEN
4829 OPEN l_orders_cursor FOR
4830 l_orders_query
4831 USING p_calling_app_request_code,p_calling_app_request_code,
4832 p_calling_app_request_code,p_calling_app_request_code,
4833 p_calling_app_request_code;
4834 ELSE
4835 OPEN l_orders_cursor FOR
4836 l_orders_query
4837 USING p_calling_app_request_code;
4838 END IF;
4839
4840 LOOP
4841 -- process only a limited number of records per iteration
4842 FETCH l_orders_cursor BULK COLLECT INTO l_caOrdersTab LIMIT rec_limit;
4843
4844 print_debuginfo(l_module_name, 'Fetch '
4845 || order_index||' : '||l_caOrdersTab.COUNT
4846 || ' order rows fetched');
4847
4848 order_index := order_index + 1;
4849
4850 EXIT WHEN l_caOrdersTab.COUNT = 0;
4851
4852 FOR j in l_caOrdersTab.FIRST..l_caOrdersTab.LAST LOOP
4853
4854 l_routing_failure := FALSE;
4855
4856 l_settlement_trxn_rec := l_caOrdersTab(j);
4857
4858 current_trxn_ext_id := l_settlement_trxn_rec.PAYMENT_TRXN_EXTENSION_ID;
4859 print_debuginfo(l_module_name, 'Transaction Extension Id : '||
4860 current_trxn_ext_id);
4861 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4862 iby_debug_pub.add('processing extensionid: '|| current_trxn_ext_id,
4863 G_LEVEL_STATEMENT,l_module_name);
4864 iby_debug_pub.add('Factored flag: '|| l_settlement_trxn_rec.auth_factored_flag,
4865 G_LEVEL_STATEMENT,l_module_name);
4866 END IF;
4867
4868 /*
4869 Bug7658675# REMITTANCE BATCH (IBY_FNDCPT_TRXN_PUB.CREATE_SETTLEMENTS) LTD TO 1000 RECORDS
4870 l is the new variable defined to initailize the x_responses recrod TYPE.
4871 All the occurrences of x_responses(j) are replaced by x_responses(l).
4872 This will allow the remittance batch to process the records more than the 1000(i,e Limit) records.
4873 */
4874
4875 l := (order_index - 2)*rec_limit + j;
4876 x_responses(l).Trxn_Extension_Id := current_trxn_ext_id;
4877
4878 print_debuginfo(l_module_name, 'settlement no-reroute:='
4879 || l_settlement_trxn_rec.settle_req_vrfy
4880 );
4881
4882 -- if the profile allows it, reroute based upon additional
4883 -- data at settlement time
4884 IF (l_settlement_trxn_rec.settle_req_vrfy = 'N') THEN
4885
4886 print_debuginfo(l_module_name, 'rerouting trxn:=' ||
4887 l_settlement_trxn_rec.TRXNMID);
4888
4889 DECLARE
4890 lx_payeeid iby_payee.payeeid%TYPE;
4891 lx_order_id iby_trxn_summaries_all.tangibleid%TYPE;
4892 lx_pmt_name VARCHAR2(100);
4893 lx_bep_lang iby_bepinfo.nls_language%TYPE;
4894 lx_payee_user_name iby_payee.username%TYPE;
4895 lx_payee_passwd iby_payee.password%TYPE;
4896 lx_payee_opt NUMBER;
4897 lx_bep_suffix iby_bepinfo.suffix%TYPE;
4898 lx_bep_url iby_bepinfo.baseurl%TYPE;
4899 lx_bep_pmtscheme iby_pmtschemes.pmtschemename%TYPE;
4900 lx_bep_username iby_bepinfo.bepusername%TYPE;
4901 lx_bep_passwd iby_bepinfo.beppassword%TYPE;
4902 lx_bep_security NUMBER;
4903 lx_bep_setinit NUMBER;
4904 lx_bep_leadtime iby_bepinfo.leadtime%TYPE;
4905 lx_bep_type iby_bepinfo.bep_type%TYPE;
4906 lx_countrycode VARCHAR2(2);
4907 BEGIN
4908
4909 --13997087: ROUTING RULES USING "PAYER BANK COUNTRY" CRITERION ON PAYEE SCREEN DOESN'T WORK
4910 select country_code
4911 into lx_countrycode
4912 from iby_ext_bank_accounts
4913 where ext_bank_account_id =l_settlement_trxn_rec.auth_payerinstrid;
4914
4915 IBY_PAYMENTMANAGERDB_PKG.LISTBEP
4916 (l_settlement_trxn_rec.SETTLEMENT_AMOUNT,
4917 l_settlement_trxn_rec.PAYMENT_CHANNEL_CODE,
4918 l_settlement_trxn_rec.SETTLEMENT_CURRENCY_CODE,
4919 l_settlement_trxn_rec.AUTH_PAYEEID,
4920 l_settlement_trxn_rec.AUTH_INSTRSUBTYPE,
4921 l_settlement_trxn_rec.AUTH_INSTRNUMBER,
4922 NULL, -- ABA routing #
4923 l_settlement_trxn_rec.AUTH_ORG_ID,
4924 NULL, -- fin app type
4925 NULL, -- no transaction id
4926 'ORAPMTREQ',
4927 l_settlement_trxn_rec.AUTH_ECAPPID,
4928 l_settlement_trxn_rec.AUTH_INSTRSUBTYPE,
4929 NULL, -- ABA_ROUTING_NO_PY routing rule
4930 l_settlement_trxn_rec.int_bank_country,
4931 l_settlement_trxn_rec.AUTH_FACTORED_FLAG,
4932 l_settlement_trxn_rec.INTERNAL_BANK_ACCOUNT_ID,
4933 l_settlement_trxn_rec.BR_SIGNED_FLAG,
4934 l_settlement_trxn_rec.BR_DRAWEE_ISSUED_FLAG,
4935 l_settlement_trxn_rec.AR_RECEIPT_METHOD_ID,
4936 lx_payeeid,
4937 lx_order_id,
4938 lx_pmt_name,
4939 lx_bep_lang,
4940 lx_payee_user_name,
4941 lx_payee_passwd,
4942 lx_payee_opt,
4943 lx_bep_id,
4944 lx_bep_suffix,
4945 lx_bep_url,
4946 lx_bep_key,
4947 lx_bep_pmtscheme,
4948 lx_bep_username,
4949 lx_bep_passwd,
4950 lx_bep_security,
4951 lx_bep_setinit,
4952 lx_bep_leadtime,
4953 lx_bep_type,
4954 lx_process_profile,
4955 lx_countrycode
4956 );
4957 EXCEPTION
4958 WHEN OTHERS THEN
4959 l_routing_failure := TRUE;
4960 print_debuginfo(l_module_name, 'Exception : '
4961 || SQLERRM);
4962 END;
4963
4964 print_debuginfo(l_module_name, 'new process profile:='
4965 || lx_process_profile);
4966 print_debuginfo(l_module_name, 'new bep id:=' || lx_bep_id);
4967 print_debuginfo(l_module_name, 'new bep key:=' || lx_bep_key);
4968
4969 END IF;
4970
4971 -- Perform the necessary validations on the data
4972 --
4973 -- 1. No duplicate settlement capture must exist.
4974 -- 2. The transaction/order id must belong to an existing, successful authorization
4975 -- 3. Transaction amount is a positive number no greater than the amount of the previous authorization
4976 -- 4. Currency of the amount is the same as for the preceding auth
4977 --
4978
4979 print_debuginfo(l_module_name,'related capture is:=' ||
4980 l_settlement_trxn_rec.CAPTURE_TRANSACTION_ID);
4981
4982 IF (l_settlement_trxn_rec.bep_type IS NULL) THEN
4983 print_debuginfo(l_module_name,'Extension '||
4984 l_settlement_trxn_rec.PAYMENT_TRXN_EXTENSION_ID
4985 ||' (auth transactionid='||l_settlement_trxn_rec.auth_transactionid||
4986 ') has bep_type as null');
4987 END IF;
4988
4989 IF(c_setup % ISOPEN) THEN
4990 CLOSE c_setup;
4991 END IF;
4992 OPEN c_setup(l_settlement_trxn_rec.auth_bepid,
4993 l_settlement_trxn_rec.auth_instrsubtype);
4994 FETCH c_setup INTO l_cap_ex_auth_bep,l_cap_ex_auth_issuer;
4995 CLOSE c_setup;
4996 iby_debug_pub.add('l_cap_ex_auth_bep: '||l_cap_ex_auth_bep, G_LEVEL_STATEMENT,l_dbg_mod);
4997 iby_debug_pub.add('l_cap_ex_auth_issuer: '||l_cap_ex_auth_issuer, G_LEVEL_STATEMENT,l_dbg_mod);
4998
4999 -- Transaction Extension Id Check
5000 IF(current_trxn_ext_id is NULL) THEN
5001 x_responses(l).Result.Result_Code := G_RC_INVALID_EXTENSION_ID;
5002 ELSIF (l_routing_failure) THEN
5003 x_responses(l).Result.Result_Code := 'ROUTING_FAILURE';
5004
5005 ELSIF(current_trxn_ext_id = prev_trxn_ext_id) THEN
5006 --ignore duplicate record due to multiple auths or multiple
5007 -- duplicate settlements
5008 NULL;
5009 ELSIF(NOT l_settlement_trxn_rec.CAPTURE_TRANSACTION_ID IS NULL) THEN
5010 --flag a duplicate settlement
5011 x_responses(l).Result.Result_Code := G_RC_DUPLICATE_SETTLEMENT;
5012 ELSIF(l_settlement_trxn_rec.auth_count = 0) THEN
5013 --flag no auth record present
5014 x_responses(l).Result.Result_Code := G_RC_INVALID_AUTHORIZATION;
5015 ELSIF(l_settlement_trxn_rec.auth_count > 1 AND
5016 l_settlement_trxn_rec.PAYMENT_CHANNEL_CODE in ('CC_PMTCHANNEL_CODE', 'DC_PMTCHANNEL_CODE')) THEN
5017 --only one auth allowed for CreditCards and DebitCards
5018 x_responses(l).Result.Result_Code := G_RC_AUTH_GROUPING_ERROR;
5019 ELSIF(l_settlement_trxn_rec.PAYMENT_CHANNEL_CODE in ('CC_PMTCHANNEL_CODE', 'DC_PMTCHANNEL_CODE')
5020 AND (l_settlement_trxn_rec.auth_currencynamecode <> l_settlement_trxn_rec.SETTLEMENT_CURRENCY_CODE)) THEN
5021 -- Settlement currency check
5022 x_responses(l).Result.Result_Code := G_RC_INVALID_AMOUNT;
5023
5024 --
5025 -- Following check added for auth reversal project
5026 --
5027 ELSIF ((l_settlement_trxn_rec.auth_instrtype IN (CC_INSTR_TYPE, PC_INSTR_TYPE)) AND
5028 (l_settlement_trxn_rec.auth_amount < l_settlement_trxn_rec.SETTLEMENT_AMOUNT) AND
5029 (l_cap_ex_auth_bep = 'N')) THEN
5030 iby_debug_pub.add('capture amount > auth amount. Payment system does not allow!',
5031 G_LEVEL_STATEMENT,l_dbg_mod);
5032 x_responses(l).Result.Result_Code := G_RC_CAPT_EX_AUTH_UNSUP_PS;
5033 ELSIF ((l_settlement_trxn_rec.auth_instrtype IN (CC_INSTR_TYPE, PC_INSTR_TYPE)) AND
5034 (l_settlement_trxn_rec.auth_amount < l_settlement_trxn_rec.SETTLEMENT_AMOUNT) AND
5035 (l_cap_ex_auth_issuer = 'N')) THEN
5036 iby_debug_pub.add('capture amount > auth amount. Card issuer does not allow!',
5037 G_LEVEL_STATEMENT,l_dbg_mod);
5038 x_responses(l).Result.Result_Code := G_RC_CAPT_EX_AUTH_UNSUP_CB;
5039 ELSE
5040 -- Map to transaction table
5041 IF (x_responses(l).Result.Result_Code IS NULL) THEN
5042
5043 l_Trxn_Tab(indx).SALES_REP_PARTY_ID := l_settlement_trxn_rec.auth_SALES_REP_PARTY_ID;
5044 l_Trxn_Tab(indx).TRXNMID := l_settlement_trxn_rec.TRXNMID;
5045 l_Trxn_Tab(indx).TRANSACTIONID := l_settlement_trxn_rec.auth_transactionid;
5046 -- In the case of Bank Accounts and multiple authorizations,
5047 -- get tangible id from API and populate IBY_TANGIBLE table
5048 CASE (l_settlement_trxn_rec.auth_instrtype = BA_INSTR_TYPE
5049 AND l_settlement_trxn_rec.auth_count > 1)
5050 WHEN (TRUE) THEN
5051 print_debuginfo(l_module_name,'Calling IBY_FNDCPT_TRXN_PUB.Get_Tangible_Id...');
5052 print_debuginfo(l_module_name,'with data '||l_app_short_name
5053 ||', '|| l_settlement_trxn_rec.auth_tangibleid ||
5054 ', '|| l_settlement_trxn_rec.TRXN_REF_NUMBER1 ||
5055 ', '|| l_settlement_trxn_rec.TRXN_REF_NUMBER2);
5056
5057 --Bug: 7628586 :: New Functions for creating Tangible id
5058 l_tangibleid :=
5059 IBY_FNDCPT_TRXN_PUB.Get_Tangible_Id
5060 (p_app_short_name => l_app_short_name,
5061 p_trxn_extn_id => l_settlement_trxn_rec.PAYMENT_TRXN_EXTENSION_ID
5062 );
5063 -- l_tangibleid :=
5064 -- IBY_FNDCPT_TRXN_PUB.Get_Tangible_Id
5065 -- (p_app_short_name => l_app_short_name,
5066 -- p_order_id => l_settlement_trxn_rec.auth_tangibleid,
5067 -- p_trxn_ref1 => l_settlement_trxn_rec.TRXN_REF_NUMBER1,
5068 -- p_trxn_ref2 => l_settlement_trxn_rec.TRXN_REF_NUMBER2
5069 -- );
5070 l_Trxn_Tab(indx).TANGIBLEID := substr(l_tangibleid,0,80);
5071 print_debuginfo(l_module_name, 'Got Tangible Id '||
5072 l_Trxn_Tab(indx).TANGIBLEID);
5073
5074 -- insert row into IBY_TANGIBLE
5075 SELECT IBY_TANGIBLE_S.NEXTVAL
5076 INTO l_mtangible
5077 FROM DUAL;
5078
5079 print_debuginfo(l_module_name, 'Got MTtangible Id '
5080 ||l_mtangible);
5081
5082 l_Trxn_Tab(indx).MTANGIBLEID := l_mtangible;
5083 l_Tangible_Tab(tangibleIndx).MTANGIBLEID := l_mtangible;
5084 l_Tangible_Tab(tangibleIndx).TANGIBLEID := l_Trxn_Tab(indx).TANGIBLEID;
5085 l_Tangible_Tab(tangibleIndx).AMOUNT := l_settlement_trxn_rec.SETTLEMENT_AMOUNT;
5086 l_Tangible_Tab(tangibleIndx).CURRENCYNAMECODE := l_settlement_trxn_rec.SETTLEMENT_CURRENCY_CODE;
5087 l_Tangible_Tab(tangibleIndx).CREATED_BY := FND_GLOBAL.user_id;
5088 l_Tangible_Tab(tangibleIndx).CREATION_DATE := sysdate;
5089 l_Tangible_Tab(tangibleIndx).LAST_UPDATED_BY := FND_GLOBAL.user_id;
5090 l_Tangible_Tab(tangibleIndx).LAST_UPDATE_DATE := sysdate;
5091 l_Tangible_Tab(tangibleIndx).LAST_UPDATE_LOGIN := FND_GLOBAL.login_id;
5092 l_Tangible_Tab(tangibleIndx).OBJECT_VERSION_NUMBER := 1.0;
5093
5094
5095 --l_Tangible_Tab(tangibleIndx).SOURCE_OBJECT_TYPE_CODE :=
5096 --l_Tangible_Tab(tangibleIndx).SOURCE_OBJECT_ID :=
5097 --l_Tangible_Tab(tangibleIndx).ACCTNO :=
5098 --l_Tangible_Tab(tangibleIndx).MEMO :=
5099 --l_Tangible_Tab(tangibleIndx).ISSUEDATE :=
5100 --l_Tangible_Tab(tangibleIndx).ORDER_MEDIUM :=
5101 --l_Tangible_Tab(tangibleIndx).EFT_AUTH_METHOD :=
5102 --l_Tangible_Tab(tangibleIndx).SECURITY_GROUP_ID :=
5103
5104 tangibleIndx := tangibleIndx + 1;
5105
5106 print_debuginfo(l_module_name, 'Created Tangible record');
5107
5108 ELSE
5109 l_Trxn_Tab(indx).TANGIBLEID := l_settlement_trxn_rec.auth_tangibleid;
5110 l_Trxn_Tab(indx).MTANGIBLEID := l_settlement_trxn_rec.auth_mtangibleid;
5111
5112 END CASE;
5113 /*
5114 * Initiate a partial reversal for those settlements which have auth amt > sttlement amt.
5115 * and the BEP and Card Issuer expect a partial reversal to be fired.
5116 */
5117 BEGIN
5118 iby_debug_pub.add('Authorized amount = '|| l_settlement_trxn_rec.auth_amount, G_LEVEL_STATEMENT,l_module_name);
5119 iby_debug_pub.add('Settlement amount = '|| l_settlement_trxn_rec.SETTLEMENT_AMOUNT, G_LEVEL_STATEMENT,l_module_name);
5120 IF ((l_settlement_trxn_rec.auth_instrtype IN (CC_INSTR_TYPE, PC_INSTR_TYPE)) AND
5121 (l_settlement_trxn_rec.auth_amount > l_settlement_trxn_rec.SETTLEMENT_AMOUNT )
5122 ) THEN
5123 iby_debug_pub.add('settlement amt < auth amt for transactionid: '|| l_settlement_trxn_rec.auth_transactionid,
5124 G_LEVEL_STATEMENT,l_module_name);
5125
5126 SELECT DECODE(b.auth_reversal_flag, 'M', DECODE(i.auth_reversal_flag,'M','Y','N'), 'N')
5127 INTO l_rev_allowed
5128 FROM iby_bepinfo b, iby_creditcard_issuers_b i
5129 WHERE b.bepid = l_settlement_trxn_rec.auth_bepid
5130 AND i.card_issuer_code = l_settlement_trxn_rec.auth_instrsubtype;
5131
5132 iby_debug_pub.add('l_rev_allowed = '|| l_rev_allowed, G_LEVEL_STATEMENT,l_module_name);
5133
5134 IF (l_rev_allowed = 'Y') THEN
5135 iby_debug_pub.add('initiating partial reversel.', G_LEVEL_STATEMENT,l_module_name);
5136 l_rev_trxn.Trxn_ID := l_settlement_trxn_rec.auth_transactionid;
5137 l_rev_trxn.PmtMode := 'ONLINE';
5138 l_rev_trxn.Rev_Type := IBY_PAYMENT_ADAPTER_PUB.G_REV_TYPE_PARTIAL;
5139 l_rev_trxn.Revised_Amt := l_settlement_trxn_rec.SETTLEMENT_AMOUNT;
5140 l_ecapp_id := l_settlement_trxn_rec.AUTH_ECAPPID;
5141
5142 IF(c_auth % ISOPEN) THEN
5143 CLOSE c_auth;
5144 END IF;
5145 OPEN c_auth(l_rev_trxn.Trxn_ID);
5146 FETCH c_auth INTO l_rev_trxn.AuthCode;
5147 CLOSE c_auth;
5148
5149
5150 x_rev_responses(l).Result.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
5151 l_interface_code := IBY_FNDCPT_COMMON_PUB.G_INTERFACE_CODE;
5152
5153 IBY_PAYMENT_ADAPTER_PUB.OraPmtReverse
5154 (1.0, p_init_msg_list, FND_API.G_FALSE,
5155 FND_API.G_VALID_LEVEL_FULL, l_ecapp_id,
5156 l_rev_trxn, lx_return_status, lx_msg_count,
5157 lx_msg_data, lx_rev_resp
5158 );
5159 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5160 iby_debug_pub.add('status :=' || lx_return_status,
5161 G_LEVEL_STATEMENT,l_dbg_mod);
5162 iby_debug_pub.add('Rev status :=' ||
5163 to_char(lx_rev_resp.ReqResp.Response.Status),
5164 G_LEVEL_STATEMENT,l_dbg_mod);
5165 iby_debug_pub.add('rev engine code :=' ||
5166 to_char(lx_rev_resp.ReqResp.Response.ErrCode),
5167 G_LEVEL_STATEMENT,l_dbg_mod);
5168 iby_debug_pub.add('Rev engine msg :=' ||
5169 to_char(lx_rev_resp.ReqResp.Response.ErrMessage),
5170 G_LEVEL_STATEMENT,l_dbg_mod);
5171 iby_debug_pub.add('payment system code :=' ||
5172 to_char(lx_rev_resp.ReqResp.BEPErrCode),
5173 G_LEVEL_STATEMENT,l_dbg_mod);
5174 iby_debug_pub.add('payment system msg :=' ||
5175 to_char(lx_rev_resp.ReqResp.BEPErrMessage),
5176 G_LEVEL_STATEMENT,l_dbg_mod);
5177 END IF;
5178
5179 IF (lx_rev_resp.ReqResp.Response.Status = 0) THEN
5180 x_rev_responses(l).Result.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
5181 ELSIF (NOT lx_rev_resp.ReqResp.Response.ErrCode IS NULL) THEN --7
5182 x_rev_responses(l).result.Result_Code := lx_rev_resp.ReqResp.Response.ErrCode;
5183 l_interface_code := iby_payment_adapter_pub.G_INTERFACE_CODE;
5184 END IF;
5185
5186 IF (l_interface_code = iby_payment_adapter_pub.G_INTERFACE_CODE) THEN --8
5187 l_result_category := IBY_FNDCPT_COMMON_PUB.Get_Result_Category
5188 (x_rev_responses(l).result.Result_Code,l_interface_code);
5189 -- check if the result code is seeded in the result definitions
5190 -- table
5191 --
5192 IF (l_result_category IS NULL) THEN
5193 x_rev_responses(l).Result.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
5194 END IF;
5195 END IF;
5196
5197 -- iby_fndcpt_common_pub.Prepare_Result
5198 -- (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reversal_response);
5199 END IF ;
5200 END IF ;
5201 EXCEPTION
5202 WHEN OTHERS THEN
5203 iby_debug_pub.add('partial reversal failed with exception: '|| SQLERRM ,
5204 G_LEVEL_STATEMENT,l_module_name);
5205 END ;
5206 l_pson_Tab(indx).extension_id := l_settlement_trxn_rec.PAYMENT_TRXN_EXTENSION_ID;
5207 l_pson_Tab(indx).tangibleid := l_Trxn_Tab(indx).TANGIBLEID;
5208
5209 l_Trxn_Tab(indx).CALL_APP_SERVICE_REQ_CODE
5210 := l_settlement_trxn_rec.CALL_APP_SERVICE_REQ_CODE;
5211 l_Trxn_Tab(indx).PAYEEID := l_settlement_trxn_rec.auth_payeeid;
5212 l_Trxn_Tab(indx).BEPID :=
5213 NVL(lx_bep_id,l_settlement_trxn_rec.auth_bepid);
5214 l_Trxn_Tab(indx).BEPKEY :=
5215 NVL(lx_bep_key,l_settlement_trxn_rec.auth_bepkey);
5216 l_Trxn_Tab(indx).MPAYEEID := l_settlement_trxn_rec.auth_mpayeeid;
5217 l_Trxn_Tab(indx).ECAPPID := l_settlement_trxn_rec.auth_ecappid;
5218 l_Trxn_Tab(indx).PAYMENTMETHODNAME := l_settlement_trxn_rec.auth_paymentmethodname;
5219 l_Trxn_Tab(indx).PAYEEINSTRID := l_settlement_trxn_rec.auth_payeeinstrid;
5220 l_Trxn_Tab(indx).PAYERID := l_settlement_trxn_rec.auth_payerid;
5221 l_Trxn_Tab(indx).PAYERINSTRID := l_settlement_trxn_rec.auth_payerinstrid;
5222 l_Trxn_Tab(indx).DETAILLOOKUP := l_settlement_trxn_rec.auth_detaillookup;
5223 l_Trxn_Tab(indx).AMOUNT := l_settlement_trxn_rec.SETTLEMENT_AMOUNT;
5224 l_Trxn_Tab(indx).INSTRNUMBER := l_settlement_trxn_rec.auth_instrnumber;
5225 l_Trxn_Tab(indx).INSTRTYPE := l_settlement_trxn_rec.auth_instrtype;
5226 l_Trxn_Tab(indx).INSTRSUBTYPE := l_settlement_trxn_rec.auth_instrsubtype;
5227 l_Trxn_Tab(indx).CURRENCYNAMECODE := l_settlement_trxn_rec.auth_currencynamecode;
5228 -- Payer Context fields
5229 -- Note: The payer context should not be copied from the auth record but from
5230 -- orders view as Settlement can have a different payer context than the Auth.
5231 l_Trxn_Tab(indx).ORG_TYPE := l_settlement_trxn_rec.ORG_TYPE;
5232 l_Trxn_Tab(indx).ORG_ID := l_settlement_trxn_rec.org_id;
5233 l_Trxn_Tab(indx).CUST_ACCOUNT_ID := l_settlement_trxn_rec.cust_account_id;
5234 l_Trxn_Tab(indx).ACCT_SITE_USE_ID := l_settlement_trxn_rec.ACCT_SITE_USE_ID;
5235 l_Trxn_Tab(indx).BR_DRAWEE_ISSUED_FLAG := l_settlement_trxn_rec.BR_DRAWEE_ISSUED_FLAG;
5236 l_Trxn_Tab(indx).BR_SIGNED_FLAG := l_settlement_trxn_rec.BR_SIGNED_FLAG;
5237 l_Trxn_Tab(indx).AR_RECEIPT_METHOD_ID := l_settlement_trxn_rec.AR_RECEIPT_METHOD_ID;
5238 l_Trxn_Tab(indx).PAYEEINSTRID := l_settlement_trxn_rec.INTERNAL_BANK_ACCOUNT_ID;
5239 --Bug 7170445
5240 l_Trxn_Tab(indx).NEEDSUPDT := 'Y' ;
5241 CASE l_settlement_trxn_rec.bep_type
5242 WHEN 'GATEWAY' THEN
5243 l_Trxn_Tab(indx).STATUS := GATEWAY_SETTLEMENT_STATUS;
5244 WHEN 'PROCESSOR' THEN
5245 l_Trxn_Tab(indx).STATUS := PROCESSOR_SETTLEMENT_STATUS;
5246 END CASE;
5247 l_Trxn_Tab(indx).UPDATEDATE := sysdate;
5248 CASE l_settlement_trxn_rec.auth_instrtype
5249 WHEN BA_INSTR_TYPE THEN
5250 l_Trxn_Tab(indx).TRXNTYPEID := BA_CAPTURE_TRXNTYPE;
5251 ELSE
5252 l_Trxn_Tab(indx).TRXNTYPEID := CC_CAPTURE_TRXNTYPE;
5253 END CASE;
5254
5255 --
5256 -- No Sources for the following columns or the columns are not
5257 -- relevant at this stage.
5258 --
5259 --l_Trxn_Tab(indx).ERRORLOCATION := NULL;
5260 --l_Trxn_Tab(indx).BEPCODE := NULL;
5261 --l_Trxn_Tab(indx).BEPMESSAGE := NULL;
5262 --l_Trxn_Tab(indx).BATCHID := NULL;
5263 --l_Trxn_Tab(indx).MBATCHID := NULL;
5264 --l_Trxn_Tab(indx).ECBATCHID := NULL;
5265 --l_Trxn_Tab(indx).REQDATE := NULL;
5266 --l_Trxn_Tab(indx).REQSEQ := NULL;
5267 --l_Trxn_Tab(indx).NEEDSUPDT := NULL;
5268 --l_Trxn_Tab(indx).OVERALL_SCORE := NULL;
5269 --l_Trxn_Tab(indx).SUB_KEY_ID := NULL;
5270 --l_Trxn_Tab(indx).SECURITY_GROUP_ID := NULL;
5271
5272 l_Trxn_Tab(indx).SETTLEDATE := l_settlement_trxn_rec.settlement_date;
5273
5274 CASE l_settlement_trxn_rec.auth_instrtype
5275 WHEN BA_INSTR_TYPE THEN
5276 l_Trxn_Tab(indx).REQTYPE := 'ORAPMTBATCHREQ';
5277 ELSE
5278 l_Trxn_Tab(indx).REQTYPE := 'ORAPMTCAPTURE';
5279 END CASE;
5280 l_trxn_Tab(indx).REQDATE := sysdate;
5281 l_Trxn_Tab(indx).DESTURL := l_settlement_trxn_rec.auth_desturl;
5282 l_Trxn_Tab(indx).NLSLANG := l_settlement_trxn_rec.auth_nlslang;
5283
5284 l_Trxn_Tab(indx).OBJECT_VERSION_NUMBER := 1.0;
5285
5286 l_Trxn_Tab(indx).TRXNREF := l_settlement_trxn_rec.TRXN_REF_NUMBER1;
5287 l_Trxn_Tab(indx).LAST_UPDATE_DATE := sysdate;
5288 l_Trxn_Tab(indx).LAST_UPDATED_BY := FND_GLOBAL.user_id;
5289 l_Trxn_Tab(indx).CREATION_DATE := sysdate;
5290 l_Trxn_Tab(indx).CREATED_BY := FND_GLOBAL.user_id;
5291 l_Trxn_Tab(indx).LAST_UPDATE_LOGIN := FND_GLOBAL.login_id;
5292
5293
5294 -- New columns start here
5295 l_Trxn_Tab(indx).PAYER_PARTY_ID := l_settlement_trxn_rec.payer_party_id;
5296 l_Trxn_Tab(indx).PROCESS_PROFILE_CODE :=
5297 NVL(lx_process_profile,l_settlement_trxn_rec.auth_PROCESS_PROFILE_CODE);
5298 l_Trxn_Tab(indx).PAYMENT_CHANNEL_CODE := l_settlement_trxn_rec.PAYMENT_CHANNEL_CODE;
5299 l_Trxn_Tab(indx).PROC_REFERENCE_CODE := l_settlement_trxn_rec.auth_PROC_REFERENCE_CODE;
5300 l_Trxn_Tab(indx).PROC_REFERENCE_AMOUNT := l_settlement_trxn_rec.auth_PROC_REFERENCE_AMOUNT;
5301 -- l_Trxn_Tab(indx).SETTLEMENT_DUE_DATE := l_settlement_trxn_rec.auth_SETTLEMENT_DUE_DATE;
5302 l_Trxn_Tab(indx).SETTLEMENT_DUE_DATE := l_settlement_trxn_rec.SETTLEMENT_DUE_DATE;
5303 l_Trxn_Tab(indx).CALL_APP_SERVICE_REQ_CODE
5304 := l_settlement_trxn_rec.CALL_APP_SERVICE_REQ_CODE;
5305 l_Trxn_Tab(indx).SETTLEMENT_CUSTOMER_REFERENCE
5306 := l_settlement_trxn_rec.SETTLEMENT_CUSTOMER_REFERENCE;
5307 l_Trxn_Tab(indx).BILL_TO_ADDRESS_ID := l_settlement_trxn_rec.BILL_TO_ADDRESS_ID;
5308 l_Trxn_Tab(indx).BR_MATURITY_DATE := l_settlement_trxn_rec.BR_MATURITY_DATE;
5309 l_Trxn_Tab(indx).FACTORED_FLAG := l_settlement_trxn_rec.auth_FACTORED_FLAG;
5310 l_Trxn_Tab(indx).payer_instr_assignment_id := l_settlement_trxn_rec.payer_instr_assignment_id;
5311
5312 /* fetch the debit_auth_id for bank_accounts */
5313
5314 BEGIN
5315 SELECT MAX(debit_authorization_id) into l_debit_auth_id
5316 FROM iby_debit_authorizations
5317 WHERE external_bank_account_use_id = l_settlement_trxn_rec.payer_instr_assignment_id
5318 AND nvl(auth_cancel_date,sysdate+10) >= sysdate
5319 -- AND auth_cancel_date is null
5320 AND debit_auth_flag = 'Y'
5321 -- AND nvl(debit_auth_end,sysdate) <= sysdate
5322 AND nvl(debit_auth_end,sysdate+10) >= sysdate;
5323 EXCEPTION WHEN OTHERS THEN
5324 l_debit_auth_id := NULL;
5325 END;
5326
5327 print_debuginfo(l_module_name, 'l_debit_auth_id' || l_debit_auth_id);
5328
5329 IF (NOT l_debit_auth_id iS NULL)
5330 THEN
5331 SELECT payment_type_code into l_payment_type_code
5332 FROM iby_debit_authorizations
5333 WHERE debit_authorization_id = l_debit_auth_id;
5334
5335 IF (l_payment_type_code = 'OOFF') THEN
5336 l_Trxn_Tab(indx).seq_type := l_payment_type_code;
5337 ELSE
5338
5339 select count(*) into l_mandate_trxn_count
5340 from iby_trxn_summaries_all summ
5341 ,iby_fndcpt_tx_extensions ext
5342 ,iby_fndcpt_tx_operations op
5343 where summ.transactionid = op.transactionid
5344 and op.trxn_extension_id = ext.trxn_extension_id
5345 and op.transactionid = l_settlement_trxn_rec.auth_transactionid
5346 and ext.seq_type_last = 'Y';
5347
5348 IF (l_mandate_trxn_count > 0) THEN
5349 l_Trxn_Tab(indx).seq_type := 'FNAL';
5350 ELSE
5351
5352 select count(*) into l_mandate_trxn_count
5353 from iby_trxn_summaries_all
5354 where trxntypeid = 100
5355 and instrtype = 'BANKACCOUNT'
5356 and debit_authorization_id = l_debit_auth_id
5357 and status in (100,0,111);
5358
5359 IF (l_mandate_trxn_count = 0) THEN
5360 l_Trxn_Tab(indx).seq_type := 'FRST';
5361 ELSE
5362 l_Trxn_Tab(indx).seq_type := 'RCUR';
5363 END IF;
5364
5365 END IF;
5366
5367 END IF;
5368 END IF;
5369
5370 l_Trxn_Tab(indx).debit_authorization_id := l_debit_auth_id;
5371
5372 l_Trxn_Tab(indx).debit_auth_flag := l_settlement_trxn_rec.debit_auth_flag;
5373
5374 l_Trxn_Tab(indx).debit_auth_method := l_settlement_trxn_rec.debit_auth_method;
5375
5376 l_Trxn_Tab(indx).debit_auth_reference := l_settlement_trxn_rec.debit_auth_reference;
5377 l_Trxn_Tab(indx).dirdeb_instruction_code := l_settlement_trxn_rec.auth_dirdeb_instruction_code;
5378
5379 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
5380 -- on the corresponding record in iby_trxn_summaries_all
5381 l_Trxn_Tab(indx).initiator_extension_id := l_settlement_trxn_rec.PAYMENT_TRXN_EXTENSION_ID;
5382
5383 /*
5384 * Fix for bug 5614670:
5385 *
5386 * Populate the LE id on the settlement
5387 * transaction based on the internal bank
5388 * account id.
5389 */
5390 l_Trxn_Tab(indx).legal_entity_id :=
5391 get_le_from_bankacct_id(l_Trxn_Tab(indx).payeeinstrid);
5392
5393 indx := indx + 1;
5394
5395 IF (l_settlement_trxn_rec.PAYMENT_CHANNEL_CODE = CC_PMTCHANNEL_CODE) THEN
5396 -- populate Trxn Core record
5397 l_TrxnCore_Tab(trxnCoreIndx).TrxnMID := l_settlement_trxn_rec.TRXNMID;
5398 l_TrxnCore_Tab(trxnCoreIndx).REFERENCECODE := l_settlement_trxn_rec.TRXN_REF_NUMBER1;
5399 l_TrxnCore_Tab(trxnCoreIndx).PONumber := l_settlement_trxn_rec.PO_NUMBER;
5400 l_TrxnCore_Tab(trxnCoreIndx).last_update_date := sysdate;
5401 l_TrxnCore_Tab(trxnCoreIndx).last_updated_by := FND_GLOBAL.user_id;
5402 l_TrxnCore_Tab(trxnCoreIndx).creation_date := sysdate;
5403 l_TrxnCore_Tab(trxnCoreIndx).created_by := FND_GLOBAL.user_id;
5404 l_TrxnCore_Tab(trxnCoreIndx).last_update_login := FND_GLOBAL.login_id;
5405 l_TrxnCore_Tab(trxnCoreIndx).object_version_number := 1.0;
5406 l_TrxnCore_Tab(trxnCoreIndx).card_subtype_code := l_settlement_trxn_rec.card_subtype_code ;
5407 l_TrxnCore_Tab(trxnCoreIndx).card_data_level := l_settlement_trxn_rec.card_data_level;
5408
5409 trxnCoreIndx := trxnCoreIndx + 1;
5410 END IF;
5411 END IF;
5412
5413 /*
5414 * Fix for bug 4770275. Set the result code
5415 * and result message before exiting the loop.
5416 */
5417 x_responses(l).Result.Result_Code :=
5418 IBY_FNDCPT_COMMON_PUB.G_RC_SETTLE_PENDING;
5419 IBY_FNDCPT_COMMON_PUB.Prepare_Result
5420 (
5421 l_prev_msg_count,
5422 x_return_status,
5423 x_msg_count,
5424 x_msg_data,
5425 x_responses(l).Result
5426 );
5427
5428 END IF;
5429 -- save the current transaction id to compare
5430 -- in next iteration
5431 prev_trxn_ext_id := current_trxn_ext_id;
5432
5433 print_debuginfo(l_module_name, 'Transaction No: '||j||', '||'Result Code: '||
5434 x_responses(l).Result.Result_Code);
5435
5436 END LOOP; -- Settlement transaction loop
5437
5438 --
5439 -- Bulk Insert settlement records in IBY_TRXN_SUMMARIES_ALL
5440 --
5441 --
5442 print_debuginfo(l_module_name, 'Inserting ' || l_Trxn_Tab.count ||
5443 ' transactions');
5444
5445 IF (l_Trxn_Tab.COUNT > 0) THEN
5446 -- insert into IBY_TRXN_SUMMARIES_ALL
5447 FORALL j IN l_Trxn_Tab.first..l_Trxn_Tab.last
5448 INSERT INTO IBY_TRXN_SUMMARIES_ALL VALUES l_Trxn_Tab(j);
5449 END IF;
5450
5451 print_debuginfo(l_module_name, 'Inserted ' || SQL%ROWCOUNT
5452 || ' transactions');
5453
5454 IF (l_pson_Tab.COUNT > 0) THEN
5455
5456 -- Fix for bug# 7377455. Stamp the tangibleid on the PSON column of
5457 -- IBY_FNDCPT_TX_EXTENSIONS table
5458 -- FORALL j IN l_pson_Tab.first..l_pson_Tab.last
5459 -- UPDATE iby_fndcpt_tx_extensions
5460 -- SET payment_system_order_number = TREAT(l_pson_Tab(j) AS Pson_rec_type).tangibleid
5461 -- WHERE trxn_extension_id = TREAT(l_pson_Tab(j) AS Pson_rec_type).extension_id;
5462
5463 FOR i IN 0..(l_pson_Tab.COUNT-1) LOOP --index starts from 0 and ends at (COUNT-1)
5464
5465 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5466 iby_debug_pub.add('updating extension '|| l_pson_Tab(i).extension_id
5467 ||' with PSON '||l_pson_Tab(i).tangibleid, G_LEVEL_STATEMENT,l_module_name);
5468 END IF;
5469 UPDATE iby_fndcpt_tx_extensions
5470 SET payment_system_order_number = l_pson_Tab(i).tangibleid,
5471 object_version_number = object_version_number + 1
5472 WHERE trxn_extension_id = l_pson_Tab(i).extension_id;
5473 END LOOP;
5474 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5475 iby_debug_pub.add('updating extension complete..'
5476 , G_LEVEL_STATEMENT,l_module_name);
5477 END IF;
5478 END IF;
5479
5480 IF (l_TrxnCore_Tab.COUNT > 0) THEN
5481 -- insert into IBY_TRXN_CORE
5482 FORALL j IN l_Trxn_Tab.first..l_Trxn_Tab.last
5483 INSERT INTO IBY_TRXN_CORE VALUES l_TrxnCore_Tab(j);
5484 END IF;
5485
5486 IF (l_Tangible_Tab.COUNT > 0) THEN
5487 -- insert into IBY_TANGIBLE
5488 FORALL j IN l_Tangible_Tab.first..l_Tangible_Tab.last
5489 INSERT INTO IBY_TANGIBLE VALUES l_Tangible_Tab(j);
5490 END IF;
5491
5492 l_caOrdersTab := emptyOrdersTab;
5493 l_Trxn_Tab := empty_Trxn_Tab;
5494 l_Tangible_Tab := empty_Tangible_Tab;
5495
5496 END LOOP; -- Bulk Clause loop
5497
5498 CLOSE l_orders_cursor;
5499
5500 -- End of API body
5501
5502 -- get message count and if count is 1, get message info.
5503 fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
5504 p_count => x_msg_count,
5505 p_data => x_msg_data);
5506
5507 print_debuginfo(l_module_name, 'RETURN');
5508
5509 EXCEPTION
5510 WHEN fnd_api.g_exc_error THEN
5511 --ROLLBACK TO create_settlements_pub;
5512 x_return_status := fnd_api.g_ret_sts_error;
5513
5514 print_debuginfo(l_module_name, 'Exception : ' || SQLERRM);
5515
5516 fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
5517 p_count => x_msg_count,
5518 p_data => x_msg_data);
5519
5520
5521 WHEN fnd_api.g_exc_unexpected_error THEN
5522 --ROLLBACK TO create_settlements_pub;
5523 x_return_status := fnd_api.g_ret_sts_unexp_error;
5524
5525 print_debuginfo(l_module_name, 'Exception : ' || SQLERRM);
5526
5527 fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
5528 p_count => x_msg_count,
5529 p_data => x_msg_data);
5530
5531
5532 WHEN OTHERS THEN
5533 --ROLLBACK TO create_settlements_pub;
5534 x_return_status := fnd_api.g_ret_sts_unexp_error;
5535
5536 print_debuginfo(l_module_name, 'Exception : ' || SQLERRM);
5537
5538 fnd_message.set_name('IBY', 'IBY_API_OTHERS_EXCEP');
5539 fnd_message.set_token('ERROR',SQLERRM);
5540 fnd_msg_pub.add;
5541 fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
5542 p_count => x_msg_count,
5543 p_data => x_msg_data);
5544
5545 END Create_Settlements;
5546
5547 -- Create_Settlements
5548 --
5549 -- API name : create_settlements
5550 -- Type : Public
5551 -- Pre-reqs : None
5552 -- Function : Earlier version of the API kept for backward
5553 -- compatibility.
5554 -- Current version : 1.0
5555 -- Previous version: 1.0
5556 -- Initial version : 1.0
5557 --
5558
5559 PROCEDURE Create_Settlements (
5560 p_api_version IN NUMBER,
5561 p_init_msg_list IN VARCHAR2 DEFAULT FND_API.G_FALSE,
5562 p_calling_app_id IN NUMBER,
5563 p_calling_app_request_code IN IBY_TRXN_SUMMARIES_ALL.CALL_APP_SERVICE_REQ_CODE%TYPE,
5564 p_order_view_name IN VARCHAR2,
5565 x_return_status OUT NOCOPY VARCHAR2,
5566 x_msg_count OUT NOCOPY NUMBER,
5567 x_msg_data OUT NOCOPY VARCHAR2,
5568 x_responses OUT NOCOPY SettlementResult_tbl_type
5569 )
5570 IS
5571 l_api_name CONSTANT VARCHAR2(30) := 'Create_Settlements';
5572 l_api_version CONSTANT NUMBER := 1.0;
5573 l_module_name CONSTANT VARCHAR2(200) := G_DEBUG_MODULE || '.' ||
5574 l_api_name;
5575 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || 'Create_Settlements(1)';
5576
5577 l_rev_responses ReversalResult_tbl_type;
5578 BEGIN
5579 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
5580 Create_Settlements (
5581 p_api_version,
5582 p_init_msg_list,
5583 p_calling_app_id,
5584 p_calling_app_request_code,
5585 p_order_view_name,
5586 x_return_status,
5587 x_msg_count,
5588 x_msg_data,
5589 x_responses,
5590 l_rev_responses
5591 );
5592 END Create_Settlements;
5593
5594 PROCEDURE Create_Return
5595 (
5596 p_api_version IN NUMBER,
5597 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
5598 x_return_status OUT NOCOPY VARCHAR2,
5599 x_msg_count OUT NOCOPY NUMBER,
5600 x_msg_data OUT NOCOPY VARCHAR2,
5601 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
5602 p_payer_equivalency IN VARCHAR2 :=
5603 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
5604 p_trxn_entity_id IN NUMBER,
5605 p_amount IN Amount_rec_type,
5606 p_receipt_attribs IN ReceiptAttribs_rec_type,
5607 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
5608 )
5609 IS
5610 l_api_version CONSTANT NUMBER := 1.0;
5611 l_module CONSTANT VARCHAR2(30) := 'Create_Return';
5612 l_prev_msg_count NUMBER;
5613 l_rec_mth_id NUMBER;
5614 l_payer_level VARCHAR2(30);
5615 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
5616 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
5617 l_settled_flag VARCHAR2(1);
5618 l_returned_flag VARCHAR2(1);
5619 l_extension_found BOOLEAN;
5620
5621 l_ecapp_id NUMBER;
5622 l_app_short_name fnd_application.application_short_name%TYPE;
5623 l_order_id iby_fndcpt_tx_extensions.order_id%TYPE;
5624 l_trxn_ref1 iby_fndcpt_tx_extensions.trxn_ref_number1%TYPE;
5625 l_trxn_ref2 iby_fndcpt_tx_extensions.trxn_ref_number2%TYPE;
5626 l_payee IBY_PAYMENT_ADAPTER_PUB.Payee_rec_type;
5627 l_tangible IBY_PAYMENT_ADAPTER_PUB.Tangible_rec_type;
5628 l_pmt_instr IBY_PAYMENT_ADAPTER_PUB.PmtInstr_rec_type;
5629 l_return_trxn IBY_PAYMENT_ADAPTER_PUB.ReturnTrxn_rec_type;
5630 l_credit_trxn IBY_PAYMENT_ADAPTER_PUB.CreditTrxn_rec_type;
5631
5632 lx_creditresp IBY_PAYMENT_ADAPTER_PUB.CreditResp_rec_type;
5633 lx_returnresp IBY_PAYMENT_ADAPTER_PUB.ReturnResp_rec_type;
5634 lx_return_status VARCHAR2(1);
5635 lx_msg_count NUMBER;
5636 lx_msg_data VARCHAR2(3000);
5637
5638 l_result_category iby_result_codes.result_category%TYPE;
5639 l_interface_code iby_result_codes.request_interface_code%TYPE;
5640
5641 l_return_pson VARCHAR2(100);
5642 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
5643
5644
5645 CURSOR c_extension
5646 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
5647 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
5648 ci_payer_level IN VARCHAR2,
5649 ci_payer_equiv IN VARCHAR2
5650 )
5651 IS
5652 SELECT NVL(settled_flag,'N'), NVL(returned_flag,'N'),
5653 x.instrument_type, x.instrument_id,
5654 x.origin_application_id, a.application_short_name,
5655 x.order_id, x.trxn_ref_number1, x.trxn_ref_number2,
5656 x.payment_channel_code
5657 FROM iby_trxn_extensions_v x,
5658 iby_fndcpt_tx_extensions xt,
5659 -- iby_pmt_instr_uses_all i,
5660 iby_external_payers_all p,
5661 fnd_application a
5662 -- [lmallick] - Validate the payer context against the payer
5663 -- stamped on the extension. Not the assignment.
5664 WHERE --(x.instr_assignment_id = i.instrument_payment_use_id)
5665 -- can assume this assignment is for funds capture
5666 -- AND
5667 (x.origin_application_id = a.application_id)
5668 -- AND (i.ext_pmt_party_id = p.ext_payer_id)
5669 AND (xt.EXT_PAYER_ID = p.ext_payer_id)
5670 AND (x.trxn_extension_id = ci_extension_id)
5671 AND (p.party_id = ci_payer.Party_Id)
5672 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
5673 (ci_payer.org_type, ci_payer.org_id,
5674 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
5675 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
5676 p.cust_account_id,p.acct_site_use_id) = 'T');
5677
5678 CURSOR c_settlement
5679 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
5680 IS
5681 SELECT settlement_id, payee_id, org_id, payment_system_order_number
5682 FROM iby_trxn_ext_settlements_v
5683 WHERE (trxn_extension_id = ci_extension_id)
5684 ORDER BY settlement_id DESC;
5685 BEGIN
5686 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
5687 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
5688 END IF;
5689
5690 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
5691 IF (c_settlement%ISOPEN) THEN CLOSE c_settlement; END IF;
5692
5693 IF NOT FND_API.Compatible_API_Call (l_api_version,
5694 p_api_version,
5695 l_module,
5696 G_PKG_NAME)
5697 THEN
5698 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
5699 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
5700 debug_level => G_LEVEL_ERROR,
5701 module => G_DEBUG_MODULE || l_module);
5702 END IF;
5703 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
5704 FND_MSG_PUB.Add;
5705 RAISE FND_API.G_EXC_ERROR;
5706 END IF;
5707
5708 IF FND_API.to_Boolean( p_init_msg_list ) THEN
5709 FND_MSG_PUB.initialize;
5710 END IF;
5711 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
5712
5713 iby_debug_pub.add('party id =' || p_payer.Party_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
5714 iby_debug_pub.add('account id =' || p_payer.Cust_Account_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
5715 iby_debug_pub.add('account site use id =' || p_payer.Account_Site_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
5716 iby_debug_pub.add('org id =' || p_payer.Org_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
5717 iby_debug_pub.add('org type =' || p_payer.Org_Type,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
5718
5719 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
5720 l_payer_level,l_payer_id,l_payer_attribs);
5721
5722 iby_debug_pub.add('l_payer_level: '|| l_payer_level,G_LEVEL_STATEMENT,l_dbg_mod);
5723 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
5724
5725 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN
5726 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
5727 ELSE
5728 OPEN c_extension(p_trxn_entity_id,p_payer,l_payer_level,
5729 p_payer_equivalency);
5730 FETCH c_extension INTO l_settled_flag, l_returned_flag,
5731 l_pmt_instr.PmtInstr_Type, l_pmt_instr.PmtInstr_Id, l_ecapp_id,
5732 l_app_short_name, l_order_id, l_trxn_ref1, l_trxn_ref2,
5733 l_credit_trxn.payment_channel_code;
5734 l_extension_found := NOT c_extension%NOTFOUND;
5735 CLOSE c_extension;
5736
5737 IF (l_settled_flag IS NULL) THEN
5738 x_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
5739 ELSIF (l_settled_flag = 'N') THEN
5740 x_response.Result_Code := G_RC_INVALID_SETTLEMENT;
5741 ELSE
5742
5743 OPEN c_settlement(p_trxn_entity_id);
5744 FETCH c_settlement INTO l_return_trxn.Trxn_ID, l_payee.Payee_ID,
5745 l_credit_trxn.Org_ID, l_return_pson;
5746 CLOSE c_settlement;
5747
5748 IF (l_returned_flag = 'Y') THEN
5749 --Using overloaded trxn_extension_id :: 7628586
5750 l_tangible.Tangible_Id :=
5751 Get_Tangible_Id(l_app_short_name,p_trxn_entity_id);
5752 --l_tangible.Tangible_Id :=
5753 -- Get_Tangible_Id(l_app_short_name,l_order_id,l_trxn_ref1,l_trxn_ref2);
5754
5755 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5756 iby_debug_pub.add('Settlement_Date passed as: '||p_receipt_attribs.Settlement_Date,G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5757 iby_debug_pub.add('Settlement_Due_Date passed as: '||p_receipt_attribs.Settlement_Due_Date,G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5758 END IF;
5759 l_tangible.Tangible_Amount := p_amount.Value;
5760 l_tangible.Currency_Code := p_amount.Currency_Code;
5761 l_credit_trxn.PmtMode := 'ONLINE';
5762 l_credit_trxn.Payer_Party_Id := p_payer.Party_Id;
5763 l_credit_trxn.Settlement_Date := p_receipt_attribs.Settlement_Date;
5764
5765 --Bug 14310273: 2ND RMA CM DOES NOT USE PAYMENT ROUTING RULES FOR CC PYT
5766 BEGIN
5767 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5768 iby_debug_pub.add('fetching the rec method id from AR',G_LEVEL_STATEMENT,l_dbg_mod);
5769 END IF;
5770 SELECT RECEIPT_METHOD_ID
5771 INTO l_rec_mth_id
5772 FROM ar_cash_receipts_all
5773 WHERE payment_trxn_extension_id = p_trxn_entity_id;
5774 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5775 iby_debug_pub.add('fetched method id '||l_rec_mth_id ,G_LEVEL_STATEMENT,l_dbg_mod);
5776 END IF;
5777 EXCEPTION
5778 WHEN OTHERS THEN
5779 l_rec_mth_id := NULL;
5780 END;
5781
5782 -- After fetching the receipt method id,populating in l_credit_trxn and sending in OraPmtCredit
5783 l_credit_trxn.Receipt_Method_Id := l_rec_mth_id;
5784
5785
5786 IBY_PAYMENT_ADAPTER_PUB.OraPmtCredit
5787 (1.0, FND_API.G_FALSE, FND_API.G_FALSE, FND_API.G_VALID_LEVEL_FULL,
5788 l_ecapp_id, l_payee, l_pmt_instr, l_tangible, l_credit_trxn,
5789 lx_return_status, lx_msg_count, lx_msg_data, lx_creditresp
5790 );
5791
5792 IF (NOT lx_creditresp.Trxn_Id IS NULL) THEN
5793 INSERT INTO iby_fndcpt_tx_operations
5794 (trxn_extension_id, transactionid,
5795 created_by, creation_date, last_updated_by, last_update_date,
5796 last_update_login, object_version_number
5797 )
5798 VALUES
5799 (p_trxn_entity_id, lx_creditresp.Trxn_Id,
5800 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
5801 fnd_global.login_id, 1
5802 );
5803 --
5804 -- back-propagate the credit
5805 --
5806 INSERT INTO iby_fndcpt_tx_operations
5807 (trxn_extension_id, transactionid,
5808 created_by, creation_date, last_updated_by, last_update_date,
5809 last_update_login, object_version_number
5810 )
5811 SELECT source_trxn_extension_id, lx_creditresp.Trxn_Id,
5812 fnd_global.user_id, SYSDATE, fnd_global.user_id, SYSDATE,
5813 fnd_global.login_id, 1
5814 FROM iby_fndcpt_tx_xe_copies
5815 START WITH copy_trxn_extension_id = p_trxn_entity_id
5816 CONNECT BY source_trxn_extension_id = PRIOR copy_trxn_extension_id;
5817
5818 -- Fix for bug# 7377455. Stamp the tangibleid on the PSON column of
5819 -- IBY_FNDCPT_TX_EXTENSIONS table
5820 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5821 iby_debug_pub.add( 'Stamping the PSON on the extension as '||
5822 l_tangible.Tangible_Id,
5823 G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5824 END IF;
5825 UPDATE iby_fndcpt_tx_extensions
5826 SET payment_system_order_number = l_tangible.Tangible_Id
5827 WHERE trxn_extension_id = p_trxn_entity_id;
5828
5829 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
5830 -- on the corresponding record in iby_trxn_summaries_all
5831 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5832 iby_debug_pub.add( 'Stamping '||p_trxn_entity_id ||' as the initiator_extension_id'
5833 ||'on the credit record', G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5834 END IF;
5835 UPDATE iby_trxn_summaries_all
5836 SET initiator_extension_id = p_trxn_entity_id
5837 WHERE transactionid = lx_creditresp.Trxn_Id
5838 AND reqtype = 'ORAPMTCREDIT';
5839
5840 COMMIT;
5841 END IF;
5842
5843 IF (lx_creditresp.Response.Status = 0) THEN
5844 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
5845 ELSE
5846 x_response.Result_Code :=
5847 NVL(lx_creditresp.Response.ErrCode,IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR);
5848 END IF;
5849 ELSE
5850 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5851 iby_debug_pub.add('Settlement_Date passed as: '||p_receipt_attribs.Settlement_Date,G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5852 iby_debug_pub.add('Settlement_Due_Date passed as: '||p_receipt_attribs.Settlement_Due_Date,G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5853 END IF;
5854 l_return_trxn.Currency := p_amount.Currency_Code;
5855 l_return_trxn.Price := p_amount.Value;
5856 l_return_trxn.PmtMode := 'ONLINE';
5857 l_return_trxn.Settlement_Date := p_receipt_attribs.Settlement_Date;
5858
5859 IBY_PAYMENT_ADAPTER_PUB.OraPmtReturn
5860 (1.0, FND_API.G_FALSE, FND_API.G_FALSE, FND_API.G_VALID_LEVEL_FULL,
5861 l_ecapp_id, l_return_trxn, lx_return_status, lx_msg_count,
5862 lx_msg_data, lx_returnresp
5863 );
5864
5865 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
5866 l_interface_code := IBY_FNDCPT_COMMON_PUB.G_INTERFACE_CODE;
5867
5868 -- Fix for bug# 7377455. Stamp the tangibleid on the PSON column of
5869 -- IBY_FNDCPT_TX_EXTENSIONS table
5870 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5871 iby_debug_pub.add( 'Stamping the PSON on the extension as '||
5872 l_return_pson,
5873 G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5874 END IF;
5875 UPDATE iby_fndcpt_tx_extensions
5876 SET payment_system_order_number = l_return_pson
5877 WHERE trxn_extension_id = p_trxn_entity_id;
5878
5879 -- Fix for bug# 7530578. Stamp the initiator transaction extension id
5880 -- on the corresponding record in iby_trxn_summaries_all
5881 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5882 iby_debug_pub.add( 'Stamping '||p_trxn_entity_id ||' as the initiator_extension_id'
5883 ||'on the return record', G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
5884 END IF;
5885 UPDATE iby_trxn_summaries_all
5886 SET initiator_extension_id = p_trxn_entity_id
5887 WHERE transactionid = lx_returnresp.Trxn_Id
5888 AND reqtype = 'ORAPMTRETURN';
5889
5890 IF (lx_returnresp.Response.Status = 0) THEN
5891 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_SUCCESS;
5892 ELSIF (NOT lx_returnresp.Response.ErrCode IS NULL) THEN
5893 x_response.Result_Code := lx_returnresp.Response.ErrCode;
5894 l_interface_code := iby_payment_adapter_pub.G_INTERFACE_CODE;
5895 END IF;
5896 END IF;
5897
5898 IF (l_interface_code = iby_payment_adapter_pub.G_INTERFACE_CODE) THEN
5899 l_result_category :=
5900 IBY_FNDCPT_COMMON_PUB.Get_Result_Category
5901 (x_response.Result_Code,l_interface_code);
5902 -- check if the result code is seeded in the result definitions
5903 -- table
5904 --
5905 IF (l_result_category IS NULL) THEN
5906 x_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
5907 ELSIF (l_result_category = IBY_FNDCPT_COMMON_PUB.G_RCAT_DUP_REQ) THEN
5908 x_response.Result_Code := G_RC_DUPLICATE_RETURN;
5909 END IF;
5910 END IF;
5911 END IF;
5912 END IF;
5913
5914 iby_fndcpt_common_pub.Prepare_Result
5915 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_response);
5916 x_response.Result_Code := lx_returnresp.Response.ErrCode;
5917 x_response.Result_Message := lx_returnresp.Response.ErrMessage;
5918 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
5919
5920 iby_debug_pub.add('x_response.Result_Code :=' || x_response.Result_Code ,
5921 G_LEVEL_STATEMENT,l_dbg_mod);
5922
5923 iby_debug_pub.add('x_response.Result_Category :=' || x_response.Result_Category,
5924 G_LEVEL_STATEMENT,l_dbg_mod);
5925
5926 iby_debug_pub.add('x_response.Result_Message :=' || x_response.Result_Message,
5927 G_LEVEL_STATEMENT,l_dbg_mod);
5928
5929 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
5930 END IF;
5931
5932 EXCEPTION
5933
5934 WHEN FND_API.G_EXC_ERROR THEN
5935
5936 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
5937 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
5938 debug_level => G_LEVEL_ERROR,
5939 module => G_DEBUG_MODULE || l_module);
5940 END IF;
5941 x_return_status := FND_API.G_RET_STS_ERROR;
5942 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
5943 p_data => x_msg_data
5944 );
5945 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5946
5947 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
5948 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
5949 debug_level => G_LEVEL_UNEXPECTED,
5950 module => G_DEBUG_MODULE || l_module);
5951 END IF;
5952 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5953 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
5954 p_data => x_msg_data
5955 );
5956
5957 WHEN OTHERS THEN
5958
5959 IF( G_LEVEL_UNEXPECTED >= G_CURRENT_RUNTIME_LEVEL) THEN
5960 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
5961 debug_level => G_LEVEL_UNEXPECTED,
5962 module => G_DEBUG_MODULE || l_module);
5963 END IF;
5964
5965 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
5966
5967 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
5968 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5969 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
5970 END IF;
5971
5972 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
5973 p_data => x_msg_data
5974 );
5975
5976 END Create_Return;
5977
5978 PROCEDURE Create_Return
5979 (
5980 p_api_version IN NUMBER,
5981 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
5982 x_return_status OUT NOCOPY VARCHAR2,
5983 x_msg_count OUT NOCOPY NUMBER,
5984 x_msg_data OUT NOCOPY VARCHAR2,
5985 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
5986 p_payer_equivalency IN VARCHAR2 :=
5987 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
5988 p_trxn_entity_id IN NUMBER,
5989 p_amount IN Amount_rec_type,
5990 x_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type
5991 )
5992 IS
5993 p_receipt_attribs ReceiptAttribs_rec_type;
5994 l_module CONSTANT VARCHAR2(30) := 'Create_Return(2)';
5995 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
5996
5997 BEGIN
5998 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
5999 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6000 END IF;
6001
6002 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6003 iby_debug_pub.add( 'Overloaded API invoked. ReceiptAttribs_rec_type will be defaulted to Null',
6004 G_LEVEL_STATEMENT,G_DEBUG_MODULE || l_module);
6005 END IF;
6006 p_receipt_attribs.Settlement_Date := NULL;
6007 p_receipt_attribs.Settlement_Due_Date := NULL;
6008
6009 --Call the overloaded API with ReceiptAttribs_rec_type IN parameter
6010 Create_Return
6011 (
6012 p_api_version,
6013 p_init_msg_list,
6014 x_return_status,
6015 x_msg_count,
6016 x_msg_data,
6017 p_payer,
6018 p_payer_equivalency,
6019 p_trxn_entity_id,
6020 p_amount,
6021 p_receipt_attribs,
6022 x_response
6023 );
6024 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6025 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6026 END IF;
6027
6028 END Create_Return;
6029
6030 -- API name : Create_Reversal
6031 -- Type : Public
6032 -- Pre-reqs : None
6033 -- Function : Fully Reverses the authorization done against a
6034 -- transaction extension
6035 -- Current version : 1.0
6036 -- Previous version: 1.0
6037 -- Initial version : 1.0
6038 --
6039 PROCEDURE Create_Reversal
6040 (
6041 p_api_version IN NUMBER,
6042 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
6043 p_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
6044 p_payer_equivalency IN VARCHAR2 :=
6045 IBY_FNDCPT_COMMON_PUB.G_PAYER_EQUIV_UPWARD,
6046 p_trxn_entity_id IN NUMBER,
6047 p_rev_attribs IN RevAttribs_rec_type,
6048 x_return_status OUT NOCOPY VARCHAR2,
6049 x_msg_count OUT NOCOPY NUMBER,
6050 x_msg_data OUT NOCOPY VARCHAR2,
6051 x_reversal_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type,
6052 x_reauth_response OUT NOCOPY IBY_FNDCPT_COMMON_PUB.Result_rec_type,
6053 x_reauth_result OUT NOCOPY AuthResult_rec_type
6054 )
6055 IS
6056 l_api_version CONSTANT NUMBER := 1.0;
6057 l_prev_msg_count NUMBER;
6058
6059 l_payer_level VARCHAR2(30);
6060 l_payer_id iby_external_payers_all.ext_payer_id%TYPE;
6061 l_payer_attribs IBY_FNDCPT_SETUP_PUB.PayerAttributes_rec_type;
6062 l_instrtype IBY_FNDCPT_PMT_CHNNLS_B.instrument_type%TYPE;
6063 l_encrypted VARCHAR2(1);
6064 l_code_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
6065 l_sec_code_len iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE;
6066 l_app_short_name fnd_application.application_short_name%TYPE;
6067 l_pmt_chnl_code IBY_FNDCPT_PMT_CHNNLS_B.payment_channel_code%TYPE;
6068 l_trxn_id IBY_TRXN_SUMMARIES_ALL.transactionid%TYPE;
6069 l_auth_status IBY_TRXN_SUMMARIES_ALL.status%TYPE;
6070 l_auth_amt IBY_TRXN_SUMMARIES_ALL.amount%TYPE;
6071 l_auth_curr IBY_TRXN_SUMMARIES_ALL.currencynamecode%TYPE;
6072 l_bep_auth_rev VARCHAR2(1);
6073 l_card_auth_rev VARCHAR2(1);
6074 l_pson IBY_TRXN_SUMMARIES_ALL.tangibleid%TYPE;
6075 l_settled VARCHAR2(1);
6076 l_ecapp_id NUMBER;
6077 l_rev_trxn IBY_PAYMENT_ADAPTER_PUB.RevTrxn_rec_type;
6078 l_pmt_trxn IBY_PAYMENT_ADAPTER_PUB.PmtReqTrxn_rec_type;
6079 l_authorized_flag VARCHAR2(1);
6080 l_extension_found BOOLEAN;
6081
6082
6083 l_payee IBY_PAYMENT_ADAPTER_PUB.Payee_rec_type;
6084 l_payer IBY_PAYMENT_ADAPTER_PUB.Payer_rec_type;
6085 l_tangible IBY_PAYMENT_ADAPTER_PUB.Tangible_rec_type;
6086 l_pmt_instr IBY_PAYMENT_ADAPTER_PUB.PmtInstr_rec_type;
6087 l_org_id IBY_TRXN_SUMMARIES_ALL.org_id%TYPE;
6088 l_authcode IBY_TRXN_CORE.authcode%TYPE;
6089 l_tracenumber IBY_TRXN_CORE.tracenumber%TYPE;
6090 l_tax_amt IBY_TRXN_CORE.taxamount%TYPE;
6091 l_ship_from_zip IBY_TRXN_CORE.shipfromzip%TYPE;
6092 l_ship_to_zip IBY_TRXN_CORE.shiptozip%TYPE;
6093 l_factored_flag IBY_TRXN_SUMMARIES_ALL.factored_flag%TYPE;
6094 l_rcpt_method_id IBY_TRXN_SUMMARIES_ALL.ar_receipt_method_id%TYPE;
6095 l_reqresp IBY_PAYMENT_ADAPTER_PUB.ReqResp_rec_type;
6096
6097 lx_rev_resp IBY_PAYMENT_ADAPTER_PUB.RevResp_rec_type;
6098
6099 lx_return_status VARCHAR2(1);
6100 lx_msg_count NUMBER;
6101 lx_msg_data VARCHAR2(3000);
6102
6103 l_result_category iby_result_codes.result_category%TYPE;
6104 l_interface_code iby_result_codes.request_interface_code%TYPE;
6105
6106 l_module CONSTANT VARCHAR2(30) := 'Create_Reversal';
6107 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6108
6109 CURSOR c_extension
6110 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
6111 ci_payer IN IBY_FNDCPT_COMMON_PUB.PayerContext_rec_type,
6112 ci_payer_level IN VARCHAR2,
6113 ci_payer_equiv IN VARCHAR2
6114 )
6115 IS
6116 SELECT chnl.instrument_type, xt.origin_application_id,
6117 a.application_short_name, xt.payment_channel_code,
6118 xt.instrument_security_code, xt.encrypted,
6119 xt.instr_code_sec_segment_id, xt.instr_sec_code_length
6120 FROM iby_fndcpt_tx_extensions xt,
6121 iby_external_payers_all p,
6122 fnd_application a,
6123 iby_fndcpt_pmt_chnnls_b chnl
6124 WHERE (xt.origin_application_id = a.application_id)
6125 AND (xt.EXT_PAYER_ID = p.ext_payer_id)
6126 AND (xt.trxn_extension_id = ci_extension_id)
6127 AND (xt.payment_channel_code = chnl.payment_channel_code)
6128 AND (p.party_id = ci_payer.Party_Id)
6129 AND (IBY_FNDCPT_COMMON_PUB.Compare_Payer
6130 (ci_payer.org_type, ci_payer.org_id,
6131 ci_payer.Cust_Account_Id, ci_payer.Account_Site_Id,
6132 ci_payer_level,ci_payer_equiv,p.org_type,p.org_id,
6133 p.cust_account_id,p.acct_site_use_id) = 'T');
6134
6135 CURSOR c_auth
6136 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
6137 IS
6138 SELECT auth.transactionid, auth.status, auth.amount, auth.currencynamecode,
6139 bep.auth_reversal_flag, brand.auth_reversal_flag,
6140 xt.payment_system_order_number, auth.payeeid,
6141 auth.payerinstrid, tg.memo,tg.order_medium,
6142 auth.org_id, core.authcode, core.tracenumber,
6143 core.taxamount, core.shipfromzip, core.shiptozip,
6144 auth.factored_flag, auth.ar_receipt_method_id
6145 FROM iby_fndcpt_tx_extensions xt,
6146 iby_fndcpt_tx_operations op,
6147 iby_trxn_summaries_all auth,
6148 iby_tangible tg,
6149 iby_trxn_core core,
6150 iby_bepinfo bep,
6151 iby_creditcard_issuers_b brand
6152 WHERE (xt.trxn_extension_id = ci_extension_id)
6153 AND (xt.trxn_extension_id = op.trxn_extension_id)
6154 AND (op.transactionid = auth.transactionid)
6155 AND (auth.reqtype = 'ORAPMTREQ')
6156 AND (auth.status = 0)
6157 AND (auth.tangibleid = tg.tangibleid)
6158 AND (auth.trxnmid = core.trxnmid)
6159 AND (auth.bepid = bep.bepid)
6160 AND (auth.instrsubtype = brand.card_issuer_code);
6161
6162 CURSOR c_settlement
6163 (ci_transactionid IN iby_trxn_summaries_all.transactionid%TYPE)
6164 IS
6165 SELECT 1 FROM iby_trxn_summaries_all
6166 WHERE transactionid = ci_transactionid
6167 AND reqtype = 'ORAPMTCAPTURE'
6168 AND status IN (0,100,111,11);
6169
6170 BEGIN
6171 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6172 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6173 END IF;
6174
6175 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
6176 IF (c_auth%ISOPEN) THEN CLOSE c_auth; END IF;
6177 IF (c_settlement%ISOPEN) THEN CLOSE c_settlement; END IF;
6178
6179 IF NOT FND_API.Compatible_API_Call (l_api_version,
6180 p_api_version,
6181 l_module,
6182 G_PKG_NAME)
6183 THEN
6184 IF( G_LEVEL_ERROR >= G_CURRENT_RUNTIME_LEVEL) THEN
6185 iby_debug_pub.add(debug_msg => 'Incorrect API Version:=' || p_api_version,
6186 debug_level => G_LEVEL_ERROR,
6187 module => G_DEBUG_MODULE || l_module);
6188 END IF;
6189 FND_MESSAGE.SET_NAME('IBY', 'IBY_204400_API_VER_MISMATCH');
6190 FND_MSG_PUB.Add;
6191 RAISE FND_API.G_EXC_ERROR;
6192 END IF;
6193
6194 IF FND_API.to_Boolean( p_init_msg_list ) THEN
6195 FND_MSG_PUB.initialize;
6196 END IF;
6197 l_prev_msg_count := FND_MSG_PUB.Count_Msg;
6198
6199 iby_debug_pub.add('party id =' || p_payer.Party_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6200 iby_debug_pub.add('account id =' || p_payer.Cust_Account_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6201 iby_debug_pub.add('account site use id =' || p_payer.Account_Site_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6202 iby_debug_pub.add('org id =' || p_payer.Org_Id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6203 iby_debug_pub.add('org type =' || p_payer.Org_Type,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6204
6205 IBY_FNDCPT_SETUP_PUB.Get_Payer_Id(p_payer,FND_API.G_VALID_LEVEL_FULL,
6206 l_payer_level,l_payer_id,l_payer_attribs);
6207
6208 iby_debug_pub.add('l_payer_level: '|| l_payer_level,G_LEVEL_STATEMENT,l_dbg_mod);
6209 iby_debug_pub.add('l_payer_id: '|| l_payer_id,G_LEVEL_STATEMENT,l_dbg_mod);
6210
6211 IF (l_payer_level = IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER) THEN --1
6212 x_reversal_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_INVALID_PAYER;
6213 ELSE --1
6214 OPEN c_extension(p_trxn_entity_id,p_payer,l_payer_level,
6215 p_payer_equivalency);
6216 FETCH c_extension INTO l_instrtype, l_ecapp_id, l_app_short_name,
6217 l_pmt_chnl_code, l_pmt_trxn.CVV2, l_encrypted,
6218 l_code_segment_id, l_sec_code_len;
6219 l_extension_found := NOT c_extension%NOTFOUND;
6220 CLOSE c_extension;
6221
6222 IF (l_instrtype IS NULL ) THEN --2
6223 x_reversal_response.Result_Code := G_RC_INVALID_EXTENSION_ID;
6224 ELSIF (l_instrtype <> CC_INSTR_TYPE) THEN --2
6225 x_reversal_response.Result_Code := G_RC_INVALID_INSTRUMENT_TYPE;
6226 iby_debug_pub.add('l_instrtype =' || l_instrtype,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6227 ELSE --2
6228 OPEN c_auth(p_trxn_entity_id);
6229 FETCH c_auth INTO l_trxn_id, l_auth_status, l_auth_amt, l_auth_curr,
6230 l_bep_auth_rev, l_card_auth_rev, l_pson, l_payee.Payee_ID,
6231 l_pmt_instr.PmtInstr_ID, l_tangible.Memo,
6232 l_tangible.OrderMedium, l_org_id, l_authcode, l_tracenumber,
6233 l_tax_amt, l_ship_from_zip, l_ship_to_zip, l_factored_flag,
6234 l_rcpt_method_id;
6235 CLOSE c_auth;
6236
6237 IF(l_trxn_id IS NULL ) THEN --3
6238 x_reversal_response.Result_Code := G_RC_INVALID_AUTHORIZATION;
6239 ELSE --3
6240 IF (NVL(l_bep_auth_rev, 'U') = 'U') THEN
6241 x_reversal_response.Result_Code := G_RC_REVERSAL_UNSUP_PMT_SYS;
6242 iby_debug_pub.add('Reversal unsupported by payment system',G_LEVEL_STATEMENT,l_dbg_mod);
6243 iby_fndcpt_common_pub.Prepare_Result
6244 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reversal_response);
6245 RETURN;
6246 END IF;
6247 IF (NVL(l_card_auth_rev, 'U') = 'U') THEN
6248 x_reversal_response.Result_Code := G_RC_REVERSAL_UNSUP_CARD_BRAND;
6249 iby_debug_pub.add('Reversal unsupported by card brand',G_LEVEL_STATEMENT,l_dbg_mod);
6250 iby_fndcpt_common_pub.Prepare_Result
6251 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reversal_response);
6252 RETURN;
6253 END IF ;
6254
6255 iby_debug_pub.add('Auth transactionid: ' || l_trxn_id,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6256
6257 OPEN c_settlement(l_trxn_id);
6258 FETCH c_settlement INTO l_settled;
6259 CLOSE c_settlement;
6260 IF(l_settled IS NOT NULL ) THEN --4
6261 x_reversal_response.Result_Code := G_RC_SETTLEMENT_EXISTS;
6262 iby_debug_pub.add('Settlement Exists!!',iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6263 ELSE --4
6264 -- If re-auth has been requested bu the revised amount is the same
6265 -- then no need to initiate a reversal. return success
6266 IF(NVL(p_rev_attribs.Reauth_flag, 'N') = 'Y') THEN --5
6267 iby_debug_pub.add('p_rev_attribs.Revised_amount.Value = '|| p_rev_attribs.Revised_amount.Value,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6268 iby_debug_pub.add('p_rev_attribs.Revised_amount.Currency_Code = '|| p_rev_attribs.Revised_amount.Currency_Code,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6269 IF (p_rev_attribs.Revised_amount.Value IS NULL) THEN --6
6270 x_reversal_response.Result_Code := G_RC_INVALID_AMOUNT;
6271 ELSIF (p_rev_attribs.Revised_amount.Currency_Code IS NULL ) THEN --6
6272 x_reversal_response.Result_Code := G_RC_INVALID_CURRENCY;
6273 ELSIF (p_rev_attribs.Revised_amount.Value = l_auth_amt AND p_rev_attribs.Revised_amount.Currency_Code = l_auth_curr) THEN --6
6274 -- x_reversal_response.Result_Code := G_RC_REVERSAL_SUCCESS;
6275 iby_debug_pub.add('Re-auth amount is same as the original auth amt. Returning success..'
6276 ,iby_debug_pub.G_LEVEL_INFO,l_dbg_mod);
6277 x_reauth_response.Result_Code := G_RC_AUTH_SUCCESS;
6278 iby_fndcpt_common_pub.Prepare_Result
6279 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reauth_response);
6280 RETURN;
6281 END IF ;--6
6282 END IF ; --5
6283 -- initiate reversal
6284 l_rev_trxn.Trxn_ID := l_trxn_id;
6285 l_rev_trxn.PmtMode := 'ONLINE';
6286 l_rev_trxn.Rev_Type := IBY_PAYMENT_ADAPTER_PUB.G_REV_TYPE_FULL;
6287 l_rev_trxn.Revised_Amt := 0;
6288 l_rev_trxn.Authcode := l_authcode;
6289 l_rev_trxn.Tracenumber := l_tracenumber;
6290
6291 x_reversal_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
6292 l_interface_code := IBY_FNDCPT_COMMON_PUB.G_INTERFACE_CODE;
6293
6294
6295 IBY_PAYMENT_ADAPTER_PUB.OraPmtReverse
6296 (1.0, p_init_msg_list, FND_API.G_FALSE,
6297 FND_API.G_VALID_LEVEL_FULL, l_ecapp_id,
6298 l_rev_trxn, lx_return_status, lx_msg_count,
6299 lx_msg_data, lx_rev_resp
6300 );
6301 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6302 iby_debug_pub.add('status :=' || lx_return_status,
6303 G_LEVEL_STATEMENT,l_dbg_mod);
6304 iby_debug_pub.add('Rev status :=' ||
6305 to_char(lx_rev_resp.ReqResp.Response.Status),
6306 G_LEVEL_STATEMENT,l_dbg_mod);
6307 iby_debug_pub.add('rev engine code :=' ||
6308 to_char(lx_rev_resp.ReqResp.Response.ErrCode),
6309 G_LEVEL_STATEMENT,l_dbg_mod);
6310 iby_debug_pub.add('Rev engine msg :=' ||
6311 to_char(lx_rev_resp.ReqResp.Response.ErrMessage),
6312 G_LEVEL_STATEMENT,l_dbg_mod);
6313
6314 iby_debug_pub.add('payment system code :=' ||
6315 to_char(lx_rev_resp.ReqResp.BEPErrCode),
6316 G_LEVEL_STATEMENT,l_dbg_mod);
6317 iby_debug_pub.add('payment system msg :=' ||
6318 to_char(lx_rev_resp.ReqResp.BEPErrMessage),
6319 G_LEVEL_STATEMENT,l_dbg_mod);
6320 END IF;
6321
6322 IF (lx_rev_resp.ReqResp.Response.Status = 0) THEN --7
6323 x_reversal_response.Result_Code := G_RC_REVERSAL_SUCCESS;
6324 ELSIF (NOT lx_rev_resp.ReqResp.Response.ErrCode IS NULL) THEN --7
6325 x_reversal_response.Result_Code := lx_rev_resp.ReqResp.Response.ErrCode;
6326 l_interface_code := iby_payment_adapter_pub.G_INTERFACE_CODE;
6327 END IF; --7
6328
6329 IF (l_interface_code = iby_payment_adapter_pub.G_INTERFACE_CODE) THEN --8
6330 l_result_category := IBY_FNDCPT_COMMON_PUB.Get_Result_Category
6331 (x_reversal_response.Result_Code,l_interface_code);
6332 -- check if the result code is seeded in the result definitions
6333 -- table
6334 --
6335 IF (l_result_category IS NULL) THEN
6336 x_reversal_response.Result_Code := IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
6337 END IF;
6338 END IF; --8
6339
6340 iby_fndcpt_common_pub.Prepare_Result
6341 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reversal_response);
6342
6343 IF(NVL(p_rev_attribs.Reauth_flag, 'N') = 'Y' AND lx_rev_resp.ReqResp.Response.Status = 0) THEN --9
6344 iby_debug_pub.add('Re-auth requested.',G_LEVEL_STATEMENT,l_dbg_mod);
6345 l_payer.Party_Id := p_payer.Party_Id;
6346 l_pmt_instr.PmtInstr_Type := CC_INSTR_TYPE;
6347 l_tangible.Tangible_Id :=
6348 Get_Reauth_Tangible_Id(l_app_short_name,p_trxn_entity_id);
6349 iby_debug_pub.add('PSON for Re-auth: '|| l_tangible.Tangible_Id,G_LEVEL_STATEMENT,l_dbg_mod);
6350 l_tangible.Tangible_Amount := p_rev_attribs.Revised_amount.Value;
6351 l_tangible.Currency_Code := p_rev_attribs.Revised_amount.Currency_Code;
6352
6353 l_pmt_trxn.Trxn_ID := l_trxn_id;
6354 l_pmt_trxn.Org_Id := l_org_id;
6355 --l_pmt_trxn.Int_Bank_Country_Code := p_payee.Int_Bank_Country_Code;
6356 l_pmt_trxn.TaxAmount := l_tax_amt;
6357 l_pmt_trxn.ShipFromZip := l_ship_from_zip;
6358 l_pmt_trxn.ShipToZip := l_ship_to_zip;
6359 l_pmt_trxn.Payment_Factor_Flag := l_factored_flag;
6360 l_pmt_trxn.Receipt_Method_Id := l_rcpt_method_id;
6361 l_pmt_trxn.Auth_Type := IBY_PAYMENT_ADAPTER_PUB.G_AUTHTYPE_AUTHONLY;
6362
6363 /* IF (p_instr_sec_code IS NOT NULL ) THEN
6364 l_pmt_trxn.CVV2 := p_instr_sec_code;
6365 ELSIF(l_encrypted = 'Y') THEN -- ciphertext; get clear-text value in the engine
6366 l_pmt_trxn.CVV2 := NULL;
6367 l_pmt_trxn.Trxn_Extension_Id := p_trxn_entity_id;
6368 l_pmt_trxn.CVV2_Segment_id := l_code_segment_id;
6369 l_pmt_trxn.CVV2_Length := l_sec_code_len;
6370 END IF;*/
6371
6372 IF(l_encrypted = 'Y') THEN -- ciphertext; get clear-text value in the engine
6373 l_pmt_trxn.CVV2 := NULL;
6374 l_pmt_trxn.Trxn_Extension_Id := p_trxn_entity_id;
6375 l_pmt_trxn.CVV2_Segment_id := l_code_segment_id;
6376 l_pmt_trxn.CVV2_Length := l_sec_code_len;
6377 END IF;
6378
6379 IBY_PAYMENT_ADAPTER_PUB.OraPmtReq
6380 (1.0,
6381 p_init_msg_list,
6382 FND_API.G_FALSE,
6383 FND_API.G_VALID_LEVEL_FULL,
6384 l_ecapp_id,
6385 l_payee,
6386 l_payer,
6387 l_pmt_instr,
6388 l_tangible,
6389 l_pmt_trxn,
6390 lx_return_status,
6391 lx_msg_count,
6392 lx_msg_data,
6393 l_reqresp
6394 );
6395
6396 IF( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN --10
6397 iby_debug_pub.add('status :=' || lx_return_status,
6398 G_LEVEL_STATEMENT,l_dbg_mod);
6399 iby_debug_pub.add('auth status :=' ||
6400 to_char(l_reqresp.Response.Status),
6401 G_LEVEL_STATEMENT,l_dbg_mod);
6402 iby_debug_pub.add('auth engine code :=' ||
6403 to_char(l_reqresp.Response.ErrCode),
6404 G_LEVEL_STATEMENT,l_dbg_mod);
6405 iby_debug_pub.add('auth engine msg :=' ||
6406 to_char(l_reqresp.Response.ErrMessage),
6407 G_LEVEL_STATEMENT,l_dbg_mod);
6408
6409 iby_debug_pub.add('payment system code :=' ||
6410 to_char(l_reqresp.BEPErrCode),
6411 G_LEVEL_STATEMENT,l_dbg_mod);
6412 iby_debug_pub.add('payment system msg :=' ||
6413 to_char(l_reqresp.BEPErrMessage),
6414 G_LEVEL_STATEMENT,l_dbg_mod);
6415
6416 iby_debug_pub.add('trxn id :=' ||
6417 to_char(l_reqresp.Trxn_ID),
6418 G_LEVEL_STATEMENT,l_dbg_mod);
6419 END IF; --10
6420
6421 /*
6422 IF (p_auth_attribs.RiskEval_Enable_Flag = 'Y') THEN
6423 x_reauth_result.Risk_Result.Risk_Score :=
6424 l_reqresp.RiskResponse.Risk_Score;
6425 x_reauth_result.Risk_Result.Risk_Threshold_Val :=
6426 l_reqresp.RiskResponse.Risk_Threshold_Val;
6427 IF (l_reqresp.RiskResponse.Risky_Flag = 'YES') THEN
6428 x_reauth_result.Risk_Result.Risky_Flag := 'Y';
6429 ELSE
6430 x_auth_result.Risk_Result.Risky_Flag := 'N';
6431 END IF;
6432 END IF;
6433 */
6434
6435 UPDATE iby_fndcpt_tx_extensions
6436 SET payment_system_order_number = l_tangible.Tangible_Id
6437 WHERE trxn_extension_id = p_trxn_entity_id;
6438
6439 UPDATE iby_trxn_summaries_all
6440 SET initiator_extension_id = p_trxn_entity_id
6441 WHERE transactionid = l_reqresp.Trxn_Id
6442 AND reqtype = 'ORAPMTREQ'
6443 AND initiator_extension_id IS NULL;
6444
6445 COMMIT;
6446
6447 IF (NOT l_reqresp.Trxn_Id IS NULL) THEN --11
6448 x_reauth_result.Auth_Id := l_reqresp.Trxn_Id;
6449 x_reauth_result.Auth_Date := l_reqresp.Trxn_Date;
6450 x_reauth_result.Auth_Code := l_reqresp.Authcode;
6451 x_reauth_result.AVS_Code := l_reqresp.AVSCode;
6452 x_reauth_result.Instr_SecCode_Check := l_reqresp.CVV2Result;
6453 x_reauth_result.PaymentSys_Code := l_reqresp.BEPErrCode;
6454 x_reauth_result.PaymentSys_Msg := l_reqresp.BEPErrMessage;
6455 --x_auth_result.Risk_Result;
6456 END IF ; --11
6457
6458 IF (l_reqresp.Response.Status = 0) THEN --12
6459 x_reauth_response.Result_Code := G_RC_AUTH_SUCCESS;
6460 ELSE --12
6461 -- check if the result code is seeded in the result definitions
6462 -- table
6463 --
6464 IF (IBY_FNDCPT_COMMON_PUB.Get_Result_Category(x_reauth_response.Result_Code,iby_payment_adapter_pub.G_INTERFACE_CODE) IS NULL)
6465 THEN
6466 x_reauth_response.Result_Code := 'COMMUNICATION_ERROR';
6467 --IBY_FNDCPT_COMMON_PUB.G_RC_GENERIC_SYS_ERROR;
6468 END IF;
6469
6470 IF ( (NOT l_reqresp.Response.ErrMessage IS NULL)
6471 OR (NOT l_reqresp.Response.ErrCode IS NULL) )
6472 THEN
6473 --Commenting this for Bug: 8368913
6474 /*
6475 l_reqresp.Response.ErrMessage :=
6476 l_reqresp.Response.ErrMessage || ' (' ||
6477 l_reqresp.Response.ErrCode || ')';
6478 */
6479 --Changing Error Message that is displayed
6480 --This conveys more appropriate than generic msg
6481 --displayed previously.
6482 l_reqresp.Response.ErrMessage :=
6483 l_reqresp.BEPErrMessage || ' (' ||
6484 l_reqresp.BEPErrCode || ')';
6485 --End of Bug:8368913.
6486 END IF;
6487
6488 iby_fndcpt_common_pub.Prepare_Result(
6489 iby_payment_adapter_pub.G_INTERFACE_CODE,
6490 l_reqresp.Response.ErrMessage,
6491 l_prev_msg_count,
6492 x_return_status,
6493 x_msg_count,
6494 x_msg_data,
6495 x_reauth_response
6496 );
6497
6498 --Commenting this for Bug: 9380078
6499 -- Need to pass the bepmessages to the source products.
6500 -- x_response.Result_Code := 'COMMUNICATION_ERROR';
6501 iby_debug_pub.add('*** assigning messages to the response object',
6502 G_LEVEL_STATEMENT,l_dbg_mod);
6503
6504 x_reauth_response.Result_Code := to_char(l_reqresp.Response.ErrCode);
6505 x_reauth_response.Result_Category := l_reqresp.BEPErrMessage;
6506 x_reauth_response.Result_Message := to_char(l_reqresp.Response.ErrMessage);
6507
6508 iby_debug_pub.add('x_response.Result_Code :=' || x_reauth_response.Result_Code ,
6509 G_LEVEL_STATEMENT,l_dbg_mod);
6510
6511 iby_debug_pub.add('x_response.Result_Category :=' || x_reauth_response.Result_Category,
6512 G_LEVEL_STATEMENT,l_dbg_mod);
6513
6514 iby_debug_pub.add('x_response.Result_Message :=' || x_reauth_response.Result_Message,
6515 G_LEVEL_STATEMENT,l_dbg_mod);
6516
6517 iby_debug_pub.add('*** assigned messages to the response object',
6518 G_LEVEL_STATEMENT,l_dbg_mod);
6519 RETURN;
6520 END IF ; --12
6521 iby_fndcpt_common_pub.Prepare_Result
6522 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reauth_response);
6523
6524 END IF; --9
6525
6526 END IF; --4
6527 END IF ; --3
6528 END IF ; --2
6529 END IF ; --1
6530 iby_fndcpt_common_pub.Prepare_Result
6531 (l_prev_msg_count,x_return_status,x_msg_count,x_msg_data,x_reversal_response);
6532 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_module);
6533
6534 EXCEPTION
6535
6536 WHEN FND_API.G_EXC_ERROR THEN
6537
6538 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
6539 iby_debug_pub.add(debug_msg => 'In G_EXC_ERROR Exception',
6540 debug_level => G_LEVEL_EXCEPTION,
6541 module => G_DEBUG_MODULE || l_module);
6542 END IF;
6543 x_return_status := FND_API.G_RET_STS_ERROR;
6544 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6545 p_data => x_msg_data
6546 );
6547 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6548
6549 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
6550 iby_debug_pub.add(debug_msg => 'In G_EXC_UNEXPECTED_ERROR Exception',
6551 debug_level => G_LEVEL_UNEXPECTED,
6552 module => G_DEBUG_MODULE || l_module);
6553 END IF;
6554 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6555 FND_MSG_PUB.Count_And_Get ( p_count => x_msg_count,
6556 p_data => x_msg_data
6557 );
6558
6559 WHEN OTHERS THEN
6560
6561 IF( G_LEVEL_EXCEPTION >= G_CURRENT_RUNTIME_LEVEL) THEN
6562 iby_debug_pub.add(debug_msg => 'In OTHERS Exception',
6563 debug_level => G_LEVEL_UNEXPECTED,
6564 module => G_DEBUG_MODULE || l_module);
6565 END IF;
6566
6567 iby_fndcpt_common_pub.Clear_Msg_Stack(l_prev_msg_count);
6568
6569 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
6570 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6571 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_module, SUBSTR(SQLERRM,1,100));
6572 END IF;
6573
6574 FND_MSG_PUB.Count_And_Get( p_count => x_msg_count,
6575 p_data => x_msg_data
6576 );
6577
6578 END Create_Reversal;
6579
6580
6581 PROCEDURE Encrypt_Extensions
6582 (p_commit IN VARCHAR2,
6583 p_sys_security_key IN iby_security_pkg.DES3_KEY_TYPE,
6584 x_err_code OUT NOCOPY VARCHAR2
6585 )
6586 IS
6587 l_mode iby_sys_security_options.instr_sec_code_encryption_mode%TYPE;
6588 l_cvv2 VARCHAR2(100);
6589 lx_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
6590 l_subkey iby_security_pkg.DES3_KEY_TYPE;
6591 l_module CONSTANT VARCHAR2(30) := 'Encrypt_Extensions';
6592 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6593 CURSOR c_extensions
6594 IS
6595 SELECT x.trxn_extension_id, x.instrument_security_code
6596 FROM iby_fndcpt_tx_extensions x
6597 WHERE (NVL(x.encrypted,'N') = 'N')
6598 AND (NOT instrument_security_code IS NULL);
6599
6600 BEGIN
6601 l_mode := Get_Extension_Encrypt_Mode;
6602
6603 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6604 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6605 END IF;
6606
6607 IF (l_mode = iby_security_pkg.G_ENCRYPT_MODE_NONE) THEN
6608 RETURN;
6609 END IF;
6610
6611 iby_security_pkg.validate_sys_key(p_sys_security_key,x_err_code);
6612 IF (NOT x_err_code IS NULL) THEN
6613 RETURN;
6614 END IF;
6615
6616 FOR c_ext_rec IN c_extensions LOOP
6617 -- The CVV value should be padded upto 32 bytes of data
6618 -- as per the PABP norms. So, use the new Encode_CVV API
6619 -- instead of the previous Encode_Number API.
6620 IF('Y' = IBY_UTILITY_PVT.isNumeric(c_ext_rec.instrument_security_code)) THEN
6621 l_cvv2 :=
6622 IBY_SECURITY_PKG.Encode_CVV(c_ext_rec.instrument_security_code,TRUE);
6623
6624 IBY_SECURITY_PKG.Create_Segment
6625 (FND_API.G_FALSE,l_cvv2,iby_security_pkg.G_ENCODING_NUMERIC,
6626 p_sys_security_key,lx_segment_id);
6627
6628 UPDATE iby_fndcpt_tx_extensions
6629 SET
6630 instrument_security_code = LPAD('X',LENGTH(instrument_security_code),'X'),
6631 encrypted = 'Y',
6632 instr_code_sec_segment_id = lx_segment_id,
6633 last_updated_by = fnd_global.user_id,
6634 last_update_date = SYSDATE,
6635 last_update_login = fnd_global.login_id,
6636 object_version_number = object_version_number + 1
6637 WHERE trxn_extension_id = c_ext_rec.trxn_extension_id;
6638 ELSE
6639 fnd_file.put_line(fnd_file.log,'Could not encrypt the extension '|| c_ext_rec.trxn_extension_id
6640 || ' as the instrument security code value is invalid');
6641 END IF;
6642 END LOOP;
6643
6644 IF FND_API.To_Boolean(p_commit) THEN
6645 COMMIT;
6646 END IF;
6647 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6648 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6649 END IF;
6650 END Encrypt_Extensions;
6651
6652 PROCEDURE Encrypt_Security_Code
6653 (p_commit IN VARCHAR2 := FND_API.G_TRUE,
6654 p_sys_security_key IN iby_security_pkg.DES3_KEY_TYPE,
6655 p_security_code IN iby_fndcpt_tx_extensions.instrument_security_code%TYPE,
6656 x_segment_id OUT NOCOPY NUMBER,
6657 x_err_code OUT NOCOPY VARCHAR2
6658 )
6659 IS
6660 l_mode iby_sys_security_options.instr_sec_code_encryption_mode%TYPE;
6661 l_cvv2 VARCHAR2(100);
6662 lx_segment_id iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE;
6663 l_subkey iby_security_pkg.DES3_KEY_TYPE;
6664 l_module CONSTANT VARCHAR2(30) := 'Encrypt_Security_Code';
6665 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6666
6667 BEGIN
6668 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6669 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6670 END IF;
6671
6672 -- test_debug('Inside Encrypt_Security_Code.. ');
6673 l_mode := Get_Extension_Encrypt_Mode;
6674 IF (l_mode = iby_security_pkg.G_ENCRYPT_MODE_NONE) THEN
6675 RETURN;
6676 END IF;
6677 iby_security_pkg.validate_sys_key(p_sys_security_key,x_err_code);
6678 -- test_debug('sysKey valid.. ');
6679 IF (NOT x_err_code IS NULL) THEN
6680 RETURN;
6681 END IF;
6682 l_cvv2 := IBY_SECURITY_PKG.Encode_CVV(p_security_code,TRUE);
6683 -- test_debug('encoded cvv: '|| l_cvv2);
6684 IBY_SECURITY_PKG.Create_Segment
6685 (FND_API.G_FALSE,l_cvv2,iby_security_pkg.G_ENCODING_NUMERIC,
6686 p_sys_security_key,lx_segment_id);
6687 -- test_debug('segmentId: '|| lx_segment_id);
6688
6689 x_segment_id := lx_segment_id;
6690
6691 IF FND_API.To_Boolean(p_commit) THEN
6692 COMMIT;
6693 END IF;
6694 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6695 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6696 END IF;
6697
6698 END Encrypt_Security_Code;
6699
6700 PROCEDURE Decrypt_Extensions
6701 (p_commit IN VARCHAR2 := FND_API.G_TRUE,
6702 p_sys_security_key IN iby_security_pkg.DES3_KEY_TYPE,
6703 x_err_code OUT NOCOPY VARCHAR2
6704 )
6705 IS
6706 l_mode iby_sys_security_options.instr_sec_code_encryption_mode%TYPE;
6707 l_module CONSTANT VARCHAR2(30) := 'Decrypt_Extensions';
6708 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6709
6710 CURSOR c_extensions
6711 IS
6712 SELECT x.trxn_extension_id, x.instr_sec_code_length,
6713 NVL(x.encrypted,'N'), s.segment_cipher_text, k.subkey_cipher_text,
6714 s.sec_segment_id
6715 FROM iby_fndcpt_tx_extensions x, iby_security_segments s,
6716 iby_sys_security_subkeys k
6717 WHERE (NVL(x.encrypted,'N') = 'Y')
6718 AND (NOT instrument_security_code IS NULL)
6719 AND (x.instr_code_sec_segment_id = s.sec_segment_id(+))
6720 AND (s.sec_subkey_id = k.sec_subkey_id(+));
6721
6722 BEGIN
6723 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6724 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6725 END IF;
6726
6727 l_mode := Get_Extension_Encrypt_Mode;
6728 IF (NOT (l_mode = iby_security_pkg.G_ENCRYPT_MODE_NONE)) THEN
6729 RETURN;
6730 END IF;
6731
6732 iby_security_pkg.validate_sys_key(p_sys_security_key,x_err_code);
6733 IF (NOT x_err_code IS NULL) THEN
6734 RETURN;
6735 END IF;
6736
6737 FOR c_ext_rec IN c_extensions LOOP
6738 UPDATE iby_fndcpt_tx_extensions
6739 SET
6740 instrument_security_code =
6741 Get_Security_Code(p_sys_security_key,
6742 c_ext_rec.subkey_cipher_text,
6743 c_ext_rec.segment_cipher_text,
6744 c_ext_rec.instr_sec_code_length),
6745 encrypted = 'N',
6746 instr_code_sec_segment_id = NULL,
6747 last_updated_by = fnd_global.user_id,
6748 last_update_date = SYSDATE,
6749 last_update_login = fnd_global.login_id,
6750 object_version_number = object_version_number + 1
6751 WHERE trxn_extension_id = c_ext_rec.trxn_extension_id;
6752
6753 DELETE iby_security_segments
6754 WHERE sec_segment_id = c_ext_rec.sec_segment_id;
6755 END LOOP;
6756
6757 IF FND_API.To_Boolean(p_commit) THEN
6758 COMMIT;
6759 END IF;
6760 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6761 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6762 END IF;
6763
6764 END Decrypt_Extensions;
6765
6766 FUNCTION Get_Security_Code
6767 (p_sys_sec_key IN iby_security_pkg.DES3_KEY_TYPE,
6768 p_subkey_cipher IN iby_sys_security_subkeys.subkey_cipher_text%TYPE,
6769 p_sec_code_cipher IN iby_security_segments.segment_cipher_text%TYPE,
6770 p_sec_code_len IN iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE
6771 )
6772 RETURN iby_fndcpt_tx_extensions.instrument_security_code%TYPE
6773 IS
6774 --Increased the varchar2 size from 30 to 100 since we now
6775 --pad the cvv to 32 bytes of data.
6776 l_sec_code VARCHAR2(100);
6777 l_subkey iby_security_pkg.DES3_KEY_TYPE;
6778 l_module CONSTANT VARCHAR2(30) := 'Get_Security_Code(4)';
6779 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6780
6781 BEGIN
6782 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6783 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6784 END IF;
6785
6786 l_subkey :=
6787 IBY_SECURITY_PKG.Get_Sys_Subkey(p_sys_sec_key,p_subkey_cipher);
6788
6789 l_sec_code :=
6790 dbms_obfuscation_toolkit.des3decrypt
6791 ( input => p_sec_code_cipher, key => l_subkey,
6792 which => dbms_obfuscation_toolkit.ThreeKeyMode
6793 );
6794
6795 l_sec_code := IBY_SECURITY_PKG.Decode_Number(l_sec_code,p_sec_code_len,TRUE);
6796
6797 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6798 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6799 END IF;
6800
6801 RETURN l_sec_code;
6802 END Get_Security_Code;
6803
6804 FUNCTION Get_Security_Code
6805 (p_trxn_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE,
6806 p_sys_sec_key IN iby_security_pkg.DES3_KEY_TYPE
6807 )
6808 RETURN iby_fndcpt_tx_extensions.instrument_security_code%TYPE
6809 IS
6810 l_sec_code iby_fndcpt_tx_extensions.instrument_security_code%TYPE;
6811 l_sec_code_len iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE;
6812 l_segment_cipher iby_security_segments.segment_cipher_text%TYPE;
6813 l_subkey_cipher iby_sys_security_subkeys.subkey_cipher_text%TYPE;
6814 l_encrypted iby_fndcpt_tx_extensions.encrypted%TYPE;
6815 lx_err_code VARCHAR2(100);
6816 l_module CONSTANT VARCHAR2(30) := 'Get_Security_Code(2)';
6817 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6818
6819 CURSOR c_extension
6820 (ci_extension_id IN iby_fndcpt_tx_extensions.trxn_extension_id%TYPE)
6821 IS
6822 SELECT x.instrument_security_code, x.instr_sec_code_length,
6823 NVL(x.encrypted,'N'), s.segment_cipher_text, k.subkey_cipher_text
6824 FROM iby_fndcpt_tx_extensions x, iby_security_segments s,
6825 iby_sys_security_subkeys k
6826 WHERE (trxn_extension_id = ci_extension_id)
6827 AND (x.instr_code_sec_segment_id = s.sec_segment_id(+))
6828 AND (s.sec_subkey_id = k.sec_subkey_id(+));
6829
6830 BEGIN
6831 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6832 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6833 END IF;
6834
6835 IF (c_extension%ISOPEN) THEN CLOSE c_extension; END IF;
6836
6837 OPEN c_extension(p_trxn_extension_id);
6838 FETCH c_extension
6839 INTO l_sec_code, l_sec_code_len, l_encrypted, l_segment_cipher,
6840 l_subkey_cipher;
6841 CLOSE c_extension;
6842
6843 IF (l_encrypted = 'N') THEN
6844 RETURN l_sec_code;
6845 ELSE
6846 iby_security_pkg.validate_sys_key(p_sys_sec_key,lx_err_code);
6847 IF (NOT lx_err_code IS NULL) THEN
6848 raise_application_error(-20000, lx_err_code, FALSE);
6849 RETURN NULL;
6850 END IF;
6851 RETURN Get_Security_Code(p_sys_sec_key,l_subkey_cipher,
6852 l_segment_cipher,l_sec_code_len);
6853 END IF;
6854 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6855 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6856 END IF;
6857
6858 END Get_Security_Code;
6859
6860 FUNCTION Get_Security_Code
6861 (
6862 p_segment_id IN iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE,
6863 p_sec_code_len IN iby_fndcpt_tx_extensions.instr_sec_code_length%TYPE,
6864 p_sys_sec_key IN iby_security_pkg.DES3_KEY_TYPE
6865 )
6866 RETURN iby_fndcpt_tx_extensions.instrument_security_code%TYPE
6867 IS
6868 l_segment_cipher iby_security_segments.segment_cipher_text%TYPE;
6869 l_subkey_cipher iby_sys_security_subkeys.subkey_cipher_text%TYPE;
6870 lx_err_code VARCHAR2(100);
6871 l_module CONSTANT VARCHAR2(30) := 'Get_Security_Code(3)';
6872 l_dbg_mod VARCHAR2(100) := G_DEBUG_MODULE || '.' || l_module;
6873
6874 CURSOR c_segment
6875 (ci_segment_id IN iby_fndcpt_tx_extensions.instr_code_sec_segment_id%TYPE)
6876 IS
6877 SELECT s.segment_cipher_text, k.subkey_cipher_text
6878 FROM iby_security_segments s, iby_sys_security_subkeys k
6879 WHERE (s.sec_segment_id = ci_segment_id)
6880 AND (s.sec_subkey_id = k.sec_subkey_id);
6881
6882 BEGIN
6883 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6884 iby_debug_pub.add('Enter',G_LEVEL_PROCEDURE,l_dbg_mod);
6885 END IF;
6886
6887 IF (c_segment%ISOPEN) THEN CLOSE c_segment; END IF;
6888
6889 OPEN c_segment(p_segment_id);
6890 FETCH c_segment
6891 INTO l_segment_cipher, l_subkey_cipher;
6892 CLOSE c_segment;
6893
6894 iby_security_pkg.validate_sys_key(p_sys_sec_key,lx_err_code);
6895 IF (NOT lx_err_code IS NULL) THEN
6896 raise_application_error(-20000, lx_err_code, FALSE);
6897 RETURN NULL;
6898 END IF;
6899 IF( G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6900 iby_debug_pub.add('Exit',G_LEVEL_PROCEDURE,l_dbg_mod);
6901 END IF;
6902
6903 RETURN Get_Security_Code(p_sys_sec_key,l_subkey_cipher,
6904 l_segment_cipher,p_sec_code_len);
6905
6906 END Get_Security_Code;
6907
6908
6909 /*--------------------------------------------------------------------
6910 | NAME:
6911 | print_debuginfo
6912 |
6913 | PURPOSE:
6914 | This procedure prints the debug message to the concurrent manager
6915 | log file.
6916 |
6917 | PARAMETERS:
6918 | IN
6919 | p_debug_text - The debug message to be printed
6920 |
6921 | OUT
6922 |
6923 |
6924 | RETURNS:
6925 |
6926 | NOTES:
6927 |
6928 *---------------------------------------------------------------------*/
6929 PROCEDURE print_debuginfo(
6930 p_module IN VARCHAR2,
6931 p_debug_text IN VARCHAR2
6932 )
6933 IS
6934 BEGIN
6935
6936 IBY_TRANSACTIONCC_PKG.print_debuginfo(p_module, p_debug_text);
6937
6938 END print_debuginfo;
6939
6940
6941 /*--------------------------------------------------------------------
6942 | NAME:
6943 | get_le_from_bankacct_id
6944 |
6945 |
6946 | PURPOSE:
6947 |
6948 |
6949 | PARAMETERS:
6950 | IN
6951 |
6952 |
6953 | OUT
6954 |
6955 |
6956 | RETURNS:
6957 |
6958 | NOTES:
6959 |
6960 *---------------------------------------------------------------------*/
6961 FUNCTION get_le_from_bankacct_id(
6962 l_intbankacct_id IN IBY_TRXN_SUMMARIES_ALL.payeeinstrid%TYPE)
6963 RETURN NUMBER
6964 IS
6965
6966 l_le_id NUMBER;
6967 l_module_name CONSTANT VARCHAR2(200) := G_PKG_NAME ||
6968 '.get_le_from_bankacct_id';
6969
6970 BEGIN
6971
6972 IF (l_intbankacct_id IS NOT NULL) THEN
6973
6974 SELECT
6975 iba.account_owner_org_id -- legal_entity_id
6976 INTO
6977 l_le_id
6978 FROM
6979 CE_BANK_ACCOUNTS iba
6980 WHERE
6981 iba.bank_account_id = l_intbankacct_id
6982 ;
6983
6984 END IF;
6985
6986 RETURN l_le_id;
6987
6988 EXCEPTION
6989 WHEN OTHERS THEN
6990 print_debuginfo(l_module_name, 'Exception occured when '
6991 || 'retrieving LE id for '
6992 || 'internal bank account id: '
6993 || l_intbankacct_id
6994 );
6995
6996 print_debuginfo(l_module_name, 'SQLCODE: ' || SQLCODE);
6997 print_debuginfo(l_module_name, 'SQLERRM: ' || SQLERRM);
6998 print_debuginfo(l_module_name, 'Returning NULL for LE id');
6999 RETURN NULL;
7000
7001 END get_le_from_bankacct_id;
7002
7003 END IBY_FNDCPT_TRXN_PUB;