DBA Data[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;