DBA Data[Home] [Help]

PACKAGE BODY: APPS.IBY_DISBURSEMENT_COMP_PUB

Source


1 PACKAGE BODY IBY_DISBURSEMENT_COMP_PUB AS
2 /*$Header: ibydiscb.pls 120.45 2011/08/10 12:08:39 gmaheswa ship $*/
3 
4  --
5  -- Declare Global variables
6  --
7 G_CURRENT_RUNTIME_LEVEL      CONSTANT NUMBER       := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
8 G_LEVEL_STATEMENT            CONSTANT NUMBER       := FND_LOG.LEVEL_STATEMENT;
9  -- User Defined Exceptions
10  g_abort_program EXCEPTION;
11 
12  -- Lookups for profile applicablility types (from IBY_PMT_PROF_LOV_APL_TYPES)
13  APL_TYPE_PAYER_ORG      CONSTANT VARCHAR2(100) := 'PAYER_ORG';
14  -- APL_TYPE_ORG_ID         CONSTANT VARCHAR2(100) := 'PAYER_ORG_ID';
15  -- APL_TYPE_ORG_TYPE       CONSTANT VARCHAR2(100) := 'PAYER_ORG_TYPE';
16  APL_TYPE_PMT_METHOD     CONSTANT VARCHAR2(100) := 'PAYMENT_METHOD';
17  APL_TYPE_PMT_FORMAT     CONSTANT VARCHAR2(100) := 'PAYMENT_FORMAT';
18  APL_TYPE_PMT_CURRENCY   CONSTANT VARCHAR2(100) := 'CURRENCY_CODE';
19  APL_TYPE_INT_BANK_ACCT  CONSTANT VARCHAR2(100) := 'INTERNAL_BANK_ACCOUNT';
20 
21  TYPE t_payee_bankacct_rec_type IS RECORD(
22    Payee_Party_Id        IBY_EXTERNAL_PAYEES_ALL.payee_party_id%TYPE,
23    Payee_Party_Site_Id   IBY_EXTERNAL_PAYEES_ALL.party_site_id%TYPE,
24    Supplier_Site_Id      IBY_EXTERNAL_PAYEES_ALL.supplier_site_id%TYPE,
25    Payee_Org_Id          IBY_EXTERNAL_PAYEES_ALL.org_id%TYPE,
26    Payee_Org_Type        IBY_EXTERNAL_PAYEES_ALL.org_type%TYPE,
27    Payment_Currency      IBY_DOCS_PAYABLE_ALL.payment_currency_code%TYPE,
28    Payment_Function      IBY_EXTERNAL_PAYEES_ALL.payment_function%TYPE,
29    Payee_BankAccount_Name  IBY_EXT_BANK_ACCOUNTS_V.bank_account_name%TYPE,
30    Payee_BankAccount_Id    IBY_EXT_BANK_ACCOUNTS_V.ext_bank_account_id%TYPE,
31    Payee_BankAccount_Num   IBY_EXT_BANK_ACCOUNTS_V.bank_account_number%TYPE,
32    Currency_Code           IBY_EXT_BANK_ACCOUNTS_V.CURRENCY_CODE%TYPE,
33    IBAN                    IBY_EXT_BANK_ACCOUNTS_V.IBAN_NUMBER%TYPE,
34    Payee_BankName          IBY_EXT_BANK_ACCOUNTS_V.BANK_NAME%TYPE,
35    Payee_BankNumber        IBY_EXT_BANK_ACCOUNTS_V.BANK_NUMBER%TYPE,
36    Payee_BranchName        IBY_EXT_BANK_ACCOUNTS_V.BANK_BRANCH_NAME%TYPE,
37    Payee_BranchNumber      IBY_EXT_BANK_ACCOUNTS_V.BRANCH_NUMBER%TYPE,
38    Bank_Country		   IBY_EXT_BANK_ACCOUNTS_V.COUNTRY_CODE%TYPE,
39    Alter_BankAccount_Name  IBY_EXT_BANK_ACCOUNTS_V.ALTERNATE_ACCOUNT_NAME%TYPE,
40    BankAccount_Type        IBY_EXT_BANK_ACCOUNTS_V.BANK_ACCOUNT_TYPE%TYPE,
41    BankAccount_Suffix      IBY_EXT_BANK_ACCOUNTS_V.ACCOUNT_SUFFIX%TYPE,
42    BankAccount_Desc        IBY_EXT_BANK_ACCOUNTS_V.DESCRIPTION%TYPE,
43    Foreign_PayUse_Flag     IBY_EXT_BANK_ACCOUNTS_V.FOREIGN_PAYMENT_USE_FLAG%TYPE,
44    Pay_Factor_Flag         IBY_EXT_BANK_ACCOUNTS_V.PAYMENT_FACTOR_FLAG%TYPE,
45    EFT_Swift_Code          IBY_EXT_BANK_ACCOUNTS_V.EFT_SWIFT_CODE%TYPE
46    );
47    TYPE t_payee_bankacct_tbl_type IS TABLE OF t_payee_bankacct_rec_type INDEX BY VARCHAR2(2000);
48    t_payee_bankacct_tbl  t_payee_bankacct_tbl_type;
49 
50  --
51  -- Forward Declarations
52  --
53  PROCEDURE print_debuginfo(p_module IN VARCHAR2,
54                            p_debug_text IN VARCHAR2);
55 
56  FUNCTION ifelse(p_bool IN BOOLEAN,
57                  x_true IN VARCHAR2,
58                  x_false IN VARCHAR2)
59                  RETURN VARCHAR2;
60 
61  PROCEDURE evaluate_Rule_Based_Default(
62                    p_trxn_attributes   IN   Trxn_Attributes_Rec_Type,
63                    x_pmt_method_rec    IN OUT NOCOPY  Payment_Method_Rec_Type);
64 
65 
66   -- Start of comments
67   --   API name     : Get_Applicable_Delivery_Channels
68   --   Type         : Public
69   --   Pre-reqs     : None.
70   --   Function     : get the list of applicable Delivery Channels.
71   --   Parameters   :
72   --   IN           :   p_api_version              IN  NUMBER   Required
73   --                    p_init_msg_list            IN  VARCHAR2 Optional
74   --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type  Required
75   --   OUT          :   x_return_status            OUT VARCHAR2 Required
76   --                    x_msg_count                OUT NUMBER   Required
77   --                    x_msg_data                 OUT VARCHAR2 Required
78   --                    x_delivery_channels_tbl    OUT Delivery_Channels_Tab_Type Required
79   --
80   --   Version   : Current version   1.0
81   --                      Previous version   None
82   --                      Initial version    1.0
83   -- End of comments
84 
85 PROCEDURE Get_Appl_Delivery_Channels (
86      p_api_version           IN   NUMBER,
87      p_init_msg_list         IN   VARCHAR2 default FND_API.G_FALSE,
88      p_trxn_attributes_rec   IN   Trxn_Attributes_Rec_Type,
89      x_return_status         OUT  NOCOPY VARCHAR2,
90      x_msg_count             OUT  NOCOPY NUMBER,
91      x_msg_data              OUT  NOCOPY VARCHAR2,
92      x_delivery_channels_tbl OUT  NOCOPY Delivery_Channel_Tab_Type
93 )
94 IS
95 
96    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Applicable_Dlvry_Channels';
97    l_api_version        CONSTANT NUMBER         := 1.0;
98    l_module_name        CONSTANT VARCHAR2(200)  := G_PKG_NAME || '.Get_Applicable_Dlvry_Channels';
99 
100    l_delivery_channels_tbl    Delivery_Channel_Tab_Type;
101    l_payer_country VARCHAR2(35);
102 
103    CURSOR delivery_channels_csr(p_payer_country VARCHAR2)
104    IS
105       SELECT delivery_channel_code,
106              meaning,
107              description,
108              territory_code
109        FROM IBY_DELIVERY_CHANNELS_VL ibydlv
110        WHERE (ibydlv.territory_code = p_payer_country OR ibydlv.territory_code is NULL)
111        AND   (ibydlv.inactive_date is NULL OR ibydlv.inactive_date >= trunc(sysdate));
112 
113    CURSOR payer_country_csr(p_payer_le_id NUMBER)
114    IS
115       SELECT xle.country
116       FROM XLE_FIRSTPARTY_INFORMATION_V xle
117       WHERE xle.legal_entity_id = p_payer_le_id;
118 
119 BEGIN
120 
121    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
122 	   print_debuginfo(l_module_name, 'ENTER');
123 	   print_debuginfo(l_module_name,'Application_id   : '|| p_trxn_attributes_rec.application_id);
124 	   print_debuginfo(l_module_name,'First party LE id  : '|| p_trxn_attributes_rec.payer_legal_entity_id);
125 
126    END IF;
127    -- Standard call to check for call compatibility.
128    IF NOT FND_API.Compatible_API_Call(l_api_version,
129                                        p_api_version,
130                                        l_api_name,
131                                        G_PKG_NAME) THEN
132       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
133    END IF;
134 
135    -- Initialize message list if p_init_msg_list is set to TRUE.
136    IF FND_API.to_Boolean(p_init_msg_list) THEN
137       FND_MSG_PUB.initialize;
138    END IF;
139 
140    --  Initialize API return status to success
141    x_return_status := FND_API.G_RET_STS_SUCCESS;
142 
143    IF (p_trxn_attributes_rec.payer_legal_entity_id IS NULL) THEN
144       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
145 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''First party legal entity Id'' missing.');
146       END IF;
147       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
148       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_1PARTY_LE_ID'));
149       FND_MSG_PUB.Add;
150       RAISE FND_API.G_EXC_ERROR;
151    END IF;
152 
153    OPEN payer_country_csr(p_trxn_attributes_rec.payer_legal_entity_id);
154    FETCH payer_country_csr INTO l_payer_country;
155    CLOSE payer_country_csr;
156 
157    IF (l_payer_country IS NULL) THEN
158       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
159 	      print_debuginfo(l_module_name,'Error: First party legal entity country not populated.');
160       END IF;
161       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_DATA');
162       FND_MESSAGE.SET_TOKEN('PARAM', 'First party legal entity country');
163       FND_MSG_PUB.Add;
164       RAISE FND_API.G_EXC_ERROR;
165    END IF;
166 
167    OPEN delivery_channels_csr(l_payer_country);
168    FETCH delivery_channels_csr BULK COLLECT INTO l_delivery_channels_tbl;
169    CLOSE delivery_channels_csr;
170 
171    IF (l_delivery_channels_tbl.COUNT = 0) THEN
172       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
173 	      print_debuginfo(l_module_name,'Warning: No Delivery Channels Applicable');
174       END IF;
175    ELSE
176       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
177 	      print_debuginfo(l_module_name,'Applicable Delivery Channels Count : '|| l_delivery_channels_tbl.COUNT);
178       END IF;
179       x_delivery_channels_tbl := l_delivery_channels_tbl;
180    END IF;
181 
182    -- End of API body.
183 
184    -- Standard call to get message count and if count is 1, get message info.
185    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
186 
187    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
188 	   print_debuginfo(l_module_name, 'RETURN');
189 
190    END IF;
191   EXCEPTION
192     WHEN FND_API.G_EXC_ERROR THEN
193       x_return_status := FND_API.G_RET_STS_ERROR;
194       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
195       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
196 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
197 	      print_debuginfo(l_module_name,'SQLerr is :'
198 	                           || substr(SQLERRM, 1, 150));
199       END IF;
200     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
201       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
202       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
203       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
204 	      print_debuginfo(l_module_name,'Unexpected ERROR: Exception occured during call to API ');
205 	      print_debuginfo(l_module_name,'SQLerr is :'
206 	                           || substr(SQLERRM, 1, 150));
207       END IF;
208     WHEN OTHERS THEN
209       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
210 
211       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
212          FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
213       END IF;
214       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
215 	      print_debuginfo(l_module_name,'Other ERROR: Exception occured during call to API ');
216 	      print_debuginfo(l_module_name,'SQLerr is :'
217 	                           || substr(SQLERRM, 1, 150));
218       END IF;
219       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
220 
221 END Get_Appl_Delivery_Channels;
222 
223 
224   -- Start of comments
225   --   API name     : Get_Applicable_Payee_BankAccts
226   --   Type         : Public
227   --   Pre-reqs     : None.
228   --   Function     : get the list of applicable Payee Bank Accounts.
229   --   Parameters   :
230   --   IN           :   p_api_version              IN  NUMBER   Required
231   --                    p_init_msg_list            IN  VARCHAR2 Optional
232   --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type  Required
233   --   OUT          :   x_return_status            OUT VARCHAR2 Required
234   --                    x_msg_count                OUT NUMBER   Required
235   --                    x_msg_data                 OUT VARCHAR2 Required
236   --                    x_payee_bankaccounts_tbl   OUT Payee_BankAccount_Tab_Type Required
237   --
238   --   Version   : Current version   1.0
239   --                      Previous version   None
240   --                      Initial version    1.0
241   -- End of comments
242 
243 PROCEDURE Get_Applicable_Payee_BankAccts (
244      p_api_version               IN   NUMBER,
245      p_init_msg_list             IN   VARCHAR2 default FND_API.G_FALSE,
246      p_trxn_attributes_rec       IN   Trxn_Attributes_Rec_Type,
247      x_return_status             OUT  NOCOPY VARCHAR2,
248      x_msg_count                 OUT  NOCOPY NUMBER,
249      x_msg_data                  OUT  NOCOPY VARCHAR2,
250      x_payee_bankaccounts_tbl    OUT  NOCOPY Payee_BankAccount_Tab_Type
251 )
252 IS
253 
254    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Applicable_Payee_BankAccts';
255    l_api_version        CONSTANT NUMBER         := 1.0;
256    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Applicable_Payee_BankAccts';
257 
258    l_payee_bankaccounts_tbl    Payee_BankAccount_Tab_Type;
259 
260    CURSOR payee_bankacct_csr(p_payee_party_id      NUMBER,
261                              p_payee_party_site_id NUMBER,
262                              p_supplier_site_id    NUMBER,
263                              p_payer_org_id        NUMBER,
264                              p_payer_org_type      VARCHAR2,
265                              p_payment_currency    VARCHAR2,
266                              p_payment_function    VARCHAR2)
267    IS
268       SELECT DISTINCT b.bank_account_name,
269              b.ext_bank_account_id,
270              b.bank_account_number,
271 	     b.currency_code,
272  	     b.iban_number,
273  	     b.bank_name,
274  	     b.bank_number,
275  	     b.bank_branch_name,
276  	     b.branch_number,
277  	     b.country_code,
278  	     b.alternate_account_name,
279  	     b.bank_account_type,
280  	     b.account_suffix,
281  	     b.description,
282  	     b.foreign_payment_use_flag,
283  	     b.payment_factor_flag,
284  	     b.eft_swift_code
285       FROM   IBY_PMT_INSTR_USES_ALL ibyu,
286              IBY_EXT_BANK_ACCOUNTS_V b,
287              IBY_EXTERNAL_PAYEES_ALL ibypayee
288       WHERE ibyu.instrument_id = b.ext_bank_account_id
289       AND ibyu.instrument_type = 'BANKACCOUNT'
290       AND (b.currency_code = p_payment_currency OR b.currency_code is null)
291       AND ibyu.ext_pmt_party_id = ibypayee.ext_payee_id
292       AND ibypayee.payment_function = p_payment_function
293       AND ibypayee.payee_party_id = p_payee_party_id
294       AND trunc(sysdate) between
295               NVL(ibyu.start_date,trunc(sysdate)) AND NVL(ibyu.end_date-1,trunc(sysdate))
296       AND trunc(sysdate) between
297               NVL(b.start_date,trunc(sysdate)) AND NVL(b.end_date-1,trunc(sysdate))
298       AND (ibypayee.party_site_id is null OR ibypayee.party_site_id = p_payee_party_site_id)
299       AND (ibypayee.supplier_site_id is null OR ibypayee.supplier_site_id = p_supplier_site_id)
300       AND (ibypayee.org_id is null OR
301            (ibypayee.org_id = p_payer_org_id AND ibypayee.org_type = p_payer_org_type));
302 
303 BEGIN
304 
305    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
306 	   print_debuginfo(l_module_name,'ENTER');
307 	   print_debuginfo(l_module_name,'Org Id           : '|| p_trxn_attributes_rec.payer_org_id);
308 	   print_debuginfo(l_module_name,'Org Type         : '|| p_trxn_attributes_rec.payer_org_type);
309 	   print_debuginfo(l_module_name,'Payee Id         : '|| p_trxn_attributes_rec.payee_party_id);
310 	   print_debuginfo(l_module_name,'Payee Site Id    : '|| p_trxn_attributes_rec.payee_party_site_id);
311 	   print_debuginfo(l_module_name,'Supplier Site Id : '|| p_trxn_attributes_rec.supplier_site_id);
312 	   print_debuginfo(l_module_name,'Payment Currency : '|| p_trxn_attributes_rec.payment_currency);
313 	   print_debuginfo(l_module_name,'Payment Amount   : '|| p_trxn_attributes_rec.payment_amount);
314 	   print_debuginfo(l_module_name,'Account Usage    : '|| p_trxn_attributes_rec.payment_function);
315 
316    END IF;
317    -- Standard call to check for call compatibility.
318    IF NOT FND_API.Compatible_API_Call(l_api_version,
319                                       p_api_version,
320                                       l_api_name,
321                                       G_PKG_NAME) THEN
322       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
323    END IF;
324 
325    -- Initialize message list if p_init_msg_list is set to TRUE.
326    IF FND_API.to_Boolean(p_init_msg_list) THEN
327       FND_MSG_PUB.initialize;
328    END IF;
329 
330    --  Initialize API return status to success
331    x_return_status := FND_API.G_RET_STS_SUCCESS;
332 
333    -- Check for mandatory params
334    IF (p_trxn_attributes_rec.payee_party_id IS NULL) THEN
335       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
336 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payee Party Id'' missing.');
337       END IF;
338       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
339       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PAYEE_PARTY_ID_FIELD'));
340       FND_MSG_PUB.Add;
341       RAISE FND_API.G_EXC_ERROR;
342    END IF;
343 
344    IF (p_trxn_attributes_rec.payment_currency IS NULL) THEN
345       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
346 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payment Currency'' missing.');
347       END IF;
348       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
349       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PMT_CURR_FIELD'));
350       FND_MSG_PUB.Add;
351       RAISE FND_API.G_EXC_ERROR;
352    END IF;
353 
354    IF (p_trxn_attributes_rec.payment_function IS NULL) THEN
355       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
356 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Account Usage'' missing.');
357       END IF;
358       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
359       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_ACCT_USG_FIELD'));
360       FND_MSG_PUB.Add;
361       RAISE FND_API.G_EXC_ERROR;
362    END IF;
363 
364    -- Start of API body.
365    OPEN payee_bankacct_csr(p_trxn_attributes_rec.Payee_Party_Id,
366                            p_trxn_attributes_rec.Payee_Party_Site_Id,
367                            p_trxn_attributes_rec.Supplier_Site_Id,
368                            p_trxn_attributes_rec.Payer_Org_Id,
369                            p_trxn_attributes_rec.Payer_Org_Type,
370                            p_trxn_attributes_rec.Payment_Currency,
371                            p_trxn_attributes_rec.Payment_Function);
372 
373    FETCH payee_bankacct_csr BULK COLLECT INTO l_payee_bankaccounts_tbl;
374    CLOSE payee_bankacct_csr;
375 
376    IF (l_payee_bankaccounts_tbl.COUNT = 0) THEN
377       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
378 	      print_debuginfo(l_module_name,'Warning: No Payee Bank Accounts Applicable');
379       END IF;
380    ELSE
381       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
382 	      print_debuginfo(l_module_name,'Applicable Payee Bank Accounts Count : '|| l_payee_bankaccounts_tbl.COUNT);
383       END IF;
384       x_payee_bankaccounts_tbl := l_payee_bankaccounts_tbl;
385    END IF;
386 
387    -- End of API body.
388 
389    -- Standard call to get message count and if count is 1, get message info.
390    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
391 
392    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
393 	   print_debuginfo(l_module_name, 'RETURN');
394 
395    END IF;
396   EXCEPTION
397     WHEN FND_API.G_EXC_ERROR THEN
398       x_return_status := FND_API.G_RET_STS_ERROR;
399       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
400       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
401 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
402 	      print_debuginfo(l_module_name,'SQLerr is :'
403 	                           || substr(SQLERRM, 1, 150));
404       END IF;
405     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
406       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
407       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
408       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
409 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
410 	      print_debuginfo(l_module_name,'SQLerr is :'
411 	                           || substr(SQLERRM, 1, 150));
412       END IF;
413     WHEN OTHERS THEN
414       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
415 
416       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR))
417         THEN
418           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
419       END IF;
420       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
421 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
422 	      print_debuginfo(l_module_name,'SQLerr is :'
423 	                           || substr(SQLERRM, 1, 150));
424       END IF;
425       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
426 
427 END Get_Applicable_Payee_BankAccts;
428 
429   -- Start of comments
430   --   API name     : Get_Applicable_Payment_Formats
431   --   Type         : Public
432   --   Pre-reqs     : None.
433   --   Function     : get the list of applicable Delivery Channels.
434   --   Parameters   :
435   --   IN           :   p_api_version              IN  NUMBER   Required
436   --                    p_init_msg_list            IN  VARCHAR2 Optional
437   --   OUT          :   x_return_status            OUT VARCHAR2 Required
438   --                    x_msg_count                OUT NUMBER   Required
439   --                    x_msg_data                 OUT VARCHAR2 Required
440   --                    x_payment_format_tbl       OUT Payment_Format_Tab_Type Required
441   --
442   --   Version   : Current version   1.0
443   --                      Previous version   None
444   --                      Initial version    1.0
445   -- End of comments
446   --
447   -- As the payment format of a transaction is uniquely determined by the payment profie,
448   -- this procedure to get the appliable payment formats is supposed to be rarely used.
449 
450 PROCEDURE Get_Applicable_Payment_Formats(
451      p_api_version         IN   NUMBER,
452      p_init_msg_list       IN   VARCHAR2 default FND_API.G_FALSE    ,
453      x_return_status       OUT  NOCOPY VARCHAR2                     ,
454      x_msg_count           OUT  NOCOPY NUMBER                       ,
455      x_msg_data            OUT  NOCOPY VARCHAR2                     ,
456      x_payment_formats_tbl OUT  NOCOPY Payment_Format_Tab_Type
457 )
458 IS
459    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Applicable_Payment_Formats';
460    l_api_version        CONSTANT NUMBER         := 1.0;
461    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Applicable_Payment_Formats';
462 
463    l_payment_formats_tbl    Payment_Format_Tab_Type;
464 
465    CURSOR payment_formats_csr
466    IS
467       SELECT f.format_name,
468              f.format_code
469       FROM IBY_PAYMENT_PROFILES p,
470            IBY_FORMATS_VL f,
471            IBY_APPLICABLE_PMT_PROFS apf,
472            IBY_APPLICABLE_PMT_PROFS apm,
473            IBY_PAYMENT_METHODS_B m
474       WHERE f.format_code = p.payment_format_code
475       AND   apf.system_profile_code = p.system_profile_code
476       AND   (apf.applicable_type_code = APL_TYPE_PMT_FORMAT AND
477                  (apf.applicable_value_to = f.format_code OR
478                   apf.applicable_value_to IS NULL))
479       AND   apm.system_profile_code = p.system_profile_code
480       AND   (m.inactive_date is null OR m.inactive_date >= trunc(sysdate))
481       AND   apm.applicable_type_code = APL_TYPE_PMT_METHOD
482       AND   apm.applicable_value_to = m.payment_method_code;
483 
484 BEGIN
485 
486    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
487 	   print_debuginfo(l_module_name, 'ENTER');
488 
489    END IF;
490    -- Standard call to check for call compatibility.
491    IF NOT FND_API.Compatible_API_Call(l_api_version,
492                                        p_api_version,
493                                        l_api_name,
494                                        G_PKG_NAME) THEN
495       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
496     END IF;
497 
498     -- Initialize message list if p_init_msg_list is set to TRUE.
499     IF FND_API.to_Boolean(p_init_msg_list) THEN
500        FND_MSG_PUB.initialize;
501     END IF;
502 
503     --  Initialize API return status to success
504     x_return_status := FND_API.G_RET_STS_SUCCESS;
505 
506     -- Start of API body.
507 
508     OPEN payment_formats_csr();
509     FETCH payment_formats_csr BULK COLLECT INTO l_payment_formats_tbl;
510     CLOSE payment_formats_csr;
511 
512     IF (l_payment_formats_tbl.COUNT = 0) THEN
513        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
514 	       print_debuginfo(l_module_name,'Warning: No Payment Formats Applicable');
515        END IF;
516     ELSE
517        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
518 	       print_debuginfo(l_module_name,'Applicable Payment Formats Count : '|| l_payment_formats_tbl.COUNT);
519        END IF;
520        x_payment_formats_tbl := l_payment_formats_tbl;
521     END IF;
522 
523     -- End of API body.
524 
525     -- Standard call to get message count and if count is 1, get message info.
526     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
527 
528     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
529 	    print_debuginfo(l_module_name, 'RETURN');
530 
531     END IF;
532   EXCEPTION
533     WHEN FND_API.G_EXC_ERROR THEN
534       x_return_status := FND_API.G_RET_STS_ERROR;
535       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
536       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
537 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
538 	      print_debuginfo(l_module_name,'SQLerr is :'
539 	                           || substr(SQLERRM, 1, 150));
540       END IF;
541     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
542       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
543       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
544       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
545 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
546 	      print_debuginfo(l_module_name,'SQLerr is :'
547 	                           || substr(SQLERRM, 1, 150));
548       END IF;
549     WHEN OTHERS THEN
550       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
551 
552       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR))
553         THEN
554           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
555       END IF;
556       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
557 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
558 	      print_debuginfo(l_module_name,'SQLerr is :'
559 	                           || substr(SQLERRM, 1, 150));
560       END IF;
561       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
562 
563 END Get_Applicable_Payment_Formats;
564 
565   -- Start of comments
566   --   API name     : Get_Applicable_Payment_Methods
567   --   Type         : Public
568   --   Pre-reqs     : None.
569   --   Function     : get the list of applicable Payment Methods.
570   --   Parameters   :
571   --   IN           :   p_api_version              IN  NUMBER   Required
572   --                    p_init_msg_list            IN  VARCHAR2 Optional
573   --                    p_ignore_payee_prefer      IN  VARCHAR2
574   --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type  Required
575   --   OUT          :   x_return_status            OUT VARCHAR2 Required
576   --                    x_msg_count                OUT NUMBER   Required
577   --                    x_msg_data                 OUT VARCHAR2 Required
578   --                    x_payment_methods_tbl      OUT Payment_Method_Tab_Type Required
579   --
580   --   Version   : Current version   1.0
581   --                      Previous version   None
582   --                      Initial version    1.0
583   -- End of comments
584 
585   PROCEDURE Get_Applicable_Payment_Methods(
586        p_api_version         IN NUMBER,
587        p_init_msg_list       IN VARCHAR2 DEFAULT FND_API.G_FALSE,
588        p_ignore_payee_prefer IN VARCHAR2,
589        p_trxn_attributes_rec IN Trxn_Attributes_Rec_Type,
590        x_return_status       OUT NOCOPY VARCHAR2,
591        x_msg_count           OUT NOCOPY NUMBER,
592        x_msg_data            OUT NOCOPY VARCHAR2,
593        x_payment_methods_tbl OUT NOCOPY Payment_Method_Tab_Type)
594   IS
595     l_api_name           CONSTANT VARCHAR2(30)            := 'Get_Applicable_Payment_Methods';
596     l_api_version        CONSTANT NUMBER                  := 1.0;
597     l_module_name        CONSTANT VARCHAR2(200)           := G_PKG_NAME || '.Get_Applicable_Payment_Methods';
598 
599     l_pmtmthd_table               Payment_Method_Tab_Type;
600     l_pmt_mthds_rec               Payment_Method_Rec_Type;
601     l_index                       NUMBER  := 1;
602 
603     l_payer_country               VARCHAR2(30);
604     l_payee_country               VARCHAR2(30);
605     l_accounting_curr             VARCHAR2(30);
606 
607     l_payer_le_match              BOOLEAN;
608     l_payer_org_match             BOOLEAN;
609     l_trxn_type_match             BOOLEAN;
610     l_currency_match              BOOLEAN;
611     l_cross_border_match          BOOLEAN;
612     l_match                       BOOLEAN;
613 
614     CURSOR payment_methods(p_application_id    NUMBER,
615                            p_payee_party_id    NUMBER,
616                            p_payee_psite_id    NUMBER,
617                            p_supplier_site_id  NUMBER,
618                            p_org_id            NUMBER,
619                            p_org_type          VARCHAR2,
620                            p_payment_function  VARCHAR2,
621                            p_ignore_flag       VARCHAR2)
622 
623     IS
624       SELECT m.Payment_Method_Name,
625              am.PAYMENT_METHOD_CODE,
626              m.SUPPORT_BILLS_PAYABLE_FLAG,
627              m.MATURITY_DATE_OFFSET_DAYS,
628              m.DESCRIPTION
629         FROM IBY_APPLICABLE_PMT_MTHDS am,
630              IBY_PAYMENT_METHODS_VL m
631        WHERE am.PAYMENT_FLOW = 'DISBURSEMENTS'
632          AND am.APPLICABLE_TYPE_CODE = 'PAYEE'
633          AND am.APPLICABLE_VALUE_TO is null
634          AND (am.APPLICATION_ID is null OR am.APPLICATION_ID = p_application_id)
635          AND (m.INACTIVE_DATE is null OR m.INACTIVE_DATE >= trunc(sysdate))
636          AND (am.INACTIVE_DATE is null OR am.INACTIVE_DATE >= trunc(sysdate))
637          AND am.PAYMENT_METHOD_CODE = m.PAYMENT_METHOD_CODE
638          AND NOT EXISTS (select 1
639                           from IBY_EXT_PARTY_PMT_MTHDS ppm,
640                                IBY_EXTERNAL_PAYEES_ALL payee
641                          where ppm.PAYMENT_FLOW = 'DISBURSEMENTS'
642                            and ppm.PAYMENT_METHOD_CODE = am.PAYMENT_METHOD_CODE
643                            and ppm.PAYMENT_FUNCTION = p_payment_function
644                            and ppm.INACTIVE_DATE < trunc(sysdate)
645                            and ppm.EXT_PMT_PARTY_ID = payee.EXT_PAYEE_ID
646                            and payee.PAYEE_PARTY_ID = p_payee_party_id
647                            AND (payee.PARTY_SITE_ID is null OR payee.PARTY_SITE_ID = p_payee_psite_id)
648                            AND (payee.SUPPLIER_SITE_ID is null OR payee.SUPPLIER_SITE_ID = p_supplier_site_id)
649                            AND (payee.ORG_ID is null OR (payee.ORG_ID = p_org_id AND payee.ORG_TYPE = p_org_type)))
650          AND p_ignore_flag = 'N'
651       UNION
652       SELECT m.Payment_Method_Name,
653              ppm.PAYMENT_METHOD_CODE,
654              m.SUPPORT_BILLS_PAYABLE_FLAG,
655              m.MATURITY_DATE_OFFSET_DAYS,
656              m.DESCRIPTION
657         FROM IBY_EXT_PARTY_PMT_MTHDS ppm,
658              IBY_EXTERNAL_PAYEES_ALL payee,
659              IBY_PAYMENT_METHODS_VL m
660        WHERE ppm.PAYMENT_FLOW = 'DISBURSEMENTS'
661          AND ppm.PAYMENT_FUNCTION = p_payment_function
662          AND (m.INACTIVE_DATE is null OR m.INACTIVE_DATE >= trunc(sysdate))
663          AND (ppm.INACTIVE_DATE is null OR ppm.INACTIVE_DATE >= trunc(sysdate))
664          AND ppm.PAYMENT_METHOD_CODE = m.PAYMENT_METHOD_CODE
665          AND ppm.EXT_PMT_PARTY_ID = payee.EXT_PAYEE_ID
666          AND payee.PAYEE_PARTY_ID = p_payee_party_id
667          AND (payee.PARTY_SITE_ID is null OR payee.PARTY_SITE_ID = p_payee_psite_id)
668          AND (payee.SUPPLIER_SITE_ID is null OR payee.SUPPLIER_SITE_ID = p_supplier_site_id)
669          AND (payee.ORG_ID is null OR (payee.ORG_ID = p_org_id AND payee.ORG_TYPE = p_org_type))
670          AND p_ignore_flag = 'N'
671       UNION
672       SELECT pmthds.Payment_Method_Name,
673              pmthds.Payment_Method_Code,
674              pmthds.SUPPORT_BILLS_PAYABLE_FLAG,
675              pmthds.MATURITY_DATE_OFFSET_DAYS,
676              pmthds.DESCRIPTION
677         FROM IBY_PAYMENT_METHODS_VL pmthds
678        WHERE (pmthds.inactive_date is NULL OR pmthds.inactive_date >= trunc(sysdate))
679          AND NOT EXISTS (select 1
680                           from IBY_EXT_PARTY_PMT_MTHDS ppm,
681                                IBY_EXTERNAL_PAYEES_ALL payee
682                          where ppm.PAYMENT_FLOW = 'DISBURSEMENTS'
683                            and PAYMENT_METHOD_CODE = pmthds.PAYMENT_METHOD_CODE
684                            and ppm.PAYMENT_FUNCTION = p_payment_function
685                            and ppm.INACTIVE_DATE < trunc(sysdate)
686                            and ppm.EXT_PMT_PARTY_ID = payee.EXT_PAYEE_ID
687                            and payee.PAYEE_PARTY_ID = p_payee_party_id
688                            AND (payee.PARTY_SITE_ID is null OR payee.PARTY_SITE_ID = p_payee_psite_id)
689                            AND (payee.SUPPLIER_SITE_ID is null OR payee.SUPPLIER_SITE_ID = p_supplier_site_id)
690                            AND (payee.ORG_ID is null OR (payee.ORG_ID = p_org_id AND payee.ORG_TYPE = p_org_type)))
691          AND p_ignore_flag = 'Y';
692 
693     CURSOR pmthd_drivers_csr(p_payment_method_code IN VARCHAR2,
694                              p_application_id IN NUMBER)
695     IS
696       SELECT Payment_Method_Code,
697              Applicable_Type_Code,
698              Applicable_Value_From,
699              Applicable_Value_To
700         FROM IBY_APPLICABLE_PMT_MTHDS apmthds
701        WHERE apmthds.Payment_method_code = p_payment_method_code
702          AND (apmthds.application_id = p_application_id
703              OR apmthds.application_id is NULL);
704 
705     CURSOR payer_info_csr(p_payer_le_id IN NUMBER)
706     IS
707       SELECT xlev.country,
708              glv.currency_code
709         FROM XLE_FIRSTPARTY_INFORMATION_V xlev,
710              GL_LEDGER_LE_V glv
711        WHERE xlev.legal_entity_id = glv.legal_entity_id
712          AND glv.ledger_category_code = 'PRIMARY'
713          AND xlev.legal_entity_id = p_payer_le_id;
714 
715     CURSOR payee_country_csr(p_payee_id IN NUMBER)
716     IS
717       SELECT country
718         FROM HZ_PARTIES
719        WHERE party_id = p_payee_id;
720 
721     CURSOR payeesite_country_csr(p_payee_id IN NUMBER,
722                                  p_payee_site_id IN NUMBER)
723     IS
724       SELECT locs.country
725         FROM HZ_PARTY_SITES sites,
726              HZ_LOCATIONS locs
727        WHERE sites.party_id = p_payee_id
728          AND sites.party_site_id = p_payee_site_id
729          AND sites.location_id = locs.location_id;
730 
731   BEGIN
732 
733     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
734 	    print_debuginfo(l_module_name, 'ENTER');
735 	    print_debuginfo(l_module_name,'Application_id   : '|| p_trxn_attributes_rec.application_id);
736 	    print_debuginfo(l_module_name,'1st party LE id  : '|| p_trxn_attributes_rec.payer_legal_entity_id);
737 	    print_debuginfo(l_module_name,'Org Id           : '|| p_trxn_attributes_rec.payer_org_id);
738 	    print_debuginfo(l_module_name,'Org Type         : '|| p_trxn_attributes_rec.payer_org_type);
739 	    print_debuginfo(l_module_name,'Payer Id         : '|| p_trxn_attributes_rec.payee_party_id);
740 	    print_debuginfo(l_module_name,'Payee Site Id    : '|| p_trxn_attributes_rec.payee_party_site_id);
741 	    print_debuginfo(l_module_name,'Supplier Site Id : '|| p_trxn_attributes_rec.supplier_site_id);
742 	    print_debuginfo(l_module_name,'Trxn Type Code   : '|| p_trxn_attributes_rec.pay_proc_trxn_type_code);
743 	    print_debuginfo(l_module_name,'Payment Currency : '|| p_trxn_attributes_rec.payment_currency);
744 	    print_debuginfo(l_module_name,'Payment Amount   : '|| p_trxn_attributes_rec.payment_amount);
745 	    print_debuginfo(l_module_name,'Account Usage    : '|| p_trxn_attributes_rec.payment_function);
746 
747     END IF;
748     -- Standard call to check for call compatibility.
749     IF NOT FND_API.Compatible_API_Call(l_api_version,
750                                        p_api_version,
751                                        l_api_name,
752                                        G_PKG_NAME) THEN
753         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
754     END IF;
755 
756     -- Initialize message list if p_init_msg_list is set to TRUE.
757     IF FND_API.to_Boolean(p_init_msg_list) THEN
758        FND_MSG_PUB.initialize;
759     END IF;
760 
761     --  Initialize API return status to success
762     x_return_status := FND_API.G_RET_STS_SUCCESS;
763 
764     -- Check for mandatory params
765     IF (p_trxn_attributes_rec.application_id IS NULL) THEN
766       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
767 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Application Id'' missing.');
768       END IF;
769       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
770       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_APP_ID'));
771       FND_MSG_PUB.Add;
772       RAISE FND_API.G_EXC_ERROR;
773     END IF;
774 
775     IF (p_trxn_attributes_rec.payer_legal_entity_id IS NULL) THEN
776       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
777 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''First party legal entity Id'' missing.');
778       END IF;
779       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
780       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_1PARTY_LE_ID'));
781       FND_MSG_PUB.Add;
782       RAISE FND_API.G_EXC_ERROR;
783     END IF;
784 
785     IF (p_trxn_attributes_rec.payee_party_id IS NULL) THEN
786       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
787 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payee Party Id'' missing.');
788       END IF;
789       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
790       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PAYEE_PARTY_ID_FIELD'));
791       FND_MSG_PUB.Add;
792       RAISE FND_API.G_EXC_ERROR;
793     END IF;
794 
795     IF (p_trxn_attributes_rec.pay_proc_trxn_type_code IS NULL) THEN
796       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
797 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Transaction Type Id'' missing.');
798       END IF;
799       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
800       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_TRANS_TYPE_ID'));
801       FND_MSG_PUB.Add;
802       RAISE FND_API.G_EXC_ERROR;
803     END IF;
804 
805     IF (p_trxn_attributes_rec.payment_currency IS NULL) THEN
806       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
807 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payment Currency'' missing.');
808       END IF;
809       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
810       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PMT_CURR_FIELD'));
811       FND_MSG_PUB.Add;
812       RAISE FND_API.G_EXC_ERROR;
813     END IF;
814 
815     IF (p_trxn_attributes_rec.payment_function IS NULL) THEN
816       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
817 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Account Usage'' missing.');
818       END IF;
819       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
820       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_ACCT_USG_FIELD'));
821       FND_MSG_PUB.Add;
822       RAISE FND_API.G_EXC_ERROR;
823     END IF;
824 
825     -- Fetch Accounting Currency and 1st part Payer country
826     IF (p_trxn_attributes_rec.payer_legal_entity_id IS NOT NULL) THEN
827        OPEN payer_info_csr(p_trxn_attributes_rec.payer_legal_entity_id);
828        FETCH payer_info_csr INTO l_payer_country, l_accounting_curr;
829        CLOSE payer_info_csr;
830     END IF;
831     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
832 	    print_debuginfo(l_module_name,'Accounting currency : '|| l_accounting_curr);
833 	    print_debuginfo(l_module_name,'First party legal entity country : '|| l_payer_country);
834 
835     END IF;
836     IF (p_trxn_attributes_rec.payee_party_id IS NOT NULL) THEN
837         IF (p_trxn_attributes_rec.payee_party_site_id IS NOT NULL) THEN
838             -- Fetch Payee Site Country
839             OPEN payeesite_country_csr(p_trxn_attributes_rec.payee_party_id,
840                                        p_trxn_attributes_rec.payee_party_site_id);
841             FETCH payeesite_country_csr INTO l_payee_country;
842             CLOSE payeesite_country_csr;
843         ELSE
844           -- Fetch Payee Country
845           OPEN payee_country_csr(p_trxn_attributes_rec.payee_party_site_id);
846           FETCH payee_country_csr INTO l_payee_country;
847           CLOSE payee_country_csr;
848         END IF;
849     END IF;
850 
851     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
852 	    print_debuginfo(l_module_name, 'Payee Country : '|| l_payee_country);
853 
854     END IF;
855     --
856     -- Pick up payment methods
857     --
858     OPEN payment_methods(p_trxn_attributes_rec.application_id,
859                          p_trxn_attributes_rec.payee_party_id,
860                          p_trxn_attributes_rec.payee_party_site_id,
861                          p_trxn_attributes_rec.supplier_site_id,
862                          p_trxn_attributes_rec.payer_org_id,
863                          p_trxn_attributes_rec.payer_org_type,
864                          p_trxn_attributes_rec.payment_function,
865                          p_ignore_payee_prefer);
866 
867     LOOP
868       l_payer_le_match     := FALSE;
869       l_payer_org_match    := FALSE;
870       l_trxn_type_match    := FALSE;
871       l_currency_match     := FALSE;
872       l_cross_border_match := FALSE;
873       l_match              := FALSE;
874 
875       -- If no rows are returned, no Payment Methods are defined for this application
876 
877       FETCH payment_methods INTO l_pmt_mthds_rec;
878       EXIT WHEN(payment_methods%NOTFOUND);
879 
880       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
881 	      print_debuginfo(l_module_name,'Payment Method : '|| l_pmt_mthds_rec.payment_method_code);
882 
883       END IF;
884       -- Pick up all driving parameters for this Payment Method
885       FOR pmthd_drivers_rec IN pmthd_drivers_csr(l_pmt_mthds_rec.payment_method_code,
886                                                  p_trxn_attributes_rec.application_id)
887         LOOP
888           IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
889 	          print_debuginfo(l_module_name,'   Applicable_Type_Code  : '|| pmthd_drivers_rec.Applicable_Type_Code);
890 	          print_debuginfo(l_module_name,'   Applicable_Type_Value : '|| pmthd_drivers_rec.Applicable_Value_To);
891 
892           END IF;
893           CASE pmthd_drivers_rec.Applicable_Type_Code
894             WHEN 'PAYER_LE' THEN
895               l_payer_le_match := l_payer_le_match
896                                   OR (pmthd_drivers_rec.Applicable_Value_To = p_trxn_attributes_rec.payer_legal_entity_id)
897                                   OR (pmthd_drivers_rec.Applicable_Value_To IS NULL);
898 
899               IF (l_payer_le_match) THEN
900                   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
901 	                  print_debuginfo(l_module_name,'   l_payer_le_match : TRUE');
902                   END IF;
903               END IF;
904 
905             WHEN 'PAYER_ORG' THEN
906               l_payer_org_match := l_payer_org_match
907                                    OR (pmthd_drivers_rec.Applicable_Value_To = p_trxn_attributes_rec.payer_org_id)
908                                    OR (pmthd_drivers_rec.Applicable_Value_To IS NULL);
909 
910               IF (l_payer_org_match) THEN
911                   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
912 	                  print_debuginfo(l_module_name,'   l_payer_org_match : TRUE');
913                   END IF;
914               END IF;
915 
916             WHEN 'PAY_PROC_TRXN_TYPE' THEN
917               l_trxn_type_match := l_trxn_type_match
918                                    OR (pmthd_drivers_rec.Applicable_Value_To =
919                                        to_char(p_trxn_attributes_rec.pay_proc_trxn_type_code))
920                                    OR (pmthd_drivers_rec.Applicable_Value_To IS NULL);
921 
922               IF (l_trxn_type_match) THEN
923                   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
924 	                  print_debuginfo(l_module_name,'   l_trxn_type_match : TRUE');
925                   END IF;
926               END IF;
927 
928             WHEN 'FOREIGN_CURRENCY_FLAG' THEN
929               l_currency_match := l_currency_match
930                                   OR (l_accounting_curr = p_trxn_attributes_rec.payment_currency
931                                       AND pmthd_drivers_rec.Applicable_Value_To = 'DOMESTIC')
932                                   OR (l_accounting_curr <> p_trxn_attributes_rec.payment_currency
933                                       AND pmthd_drivers_rec.Applicable_Value_To = 'FOREIGN')
934                                   OR (pmthd_drivers_rec.Applicable_Value_To = 'FOREIGN_AND_DOMESTIC')
935                                   OR (pmthd_drivers_rec.Applicable_Value_To IS NULL);
936 
937               IF (l_currency_match) THEN
938                   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
939 	                  print_debuginfo(l_module_name,'   l_currency_match : TRUE');
940                   END IF;
941               END IF;
942 
943             WHEN 'CROSS_BORDER_FLAG' THEN
944               l_cross_border_match := l_cross_border_match
945                                       OR (NVL(l_payee_country,l_payer_country) = l_payer_country
946                                           AND pmthd_drivers_rec.Applicable_Value_To = 'DOMESTIC')
947                                       OR (NVL(l_payee_country,l_payer_country) <> l_payer_country
948                                           AND pmthd_drivers_rec.Applicable_Value_To = 'FOREIGN')
949                                       OR (pmthd_drivers_rec.Applicable_Value_To = 'FOREIGN_AND_DOMESTIC')
950                                       OR (pmthd_drivers_rec.Applicable_Value_To IS NULL);
951 
952               IF (l_cross_border_match) THEN
953                   IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
954 	                  print_debuginfo(l_module_name,'   l_cross_border_match : TRUE');
955                   END IF;
956               END IF;
957 
958             ELSE
959               NULL; -- Not a recognized driving parameter, hence ignoring it
960           END CASE;
961 
962         -- driving parameters loop
963         END LOOP;
964 
965       l_match := (l_payer_le_match     AND l_payer_org_match  AND
966                   l_trxn_type_match    AND l_currency_match   AND
967                   l_cross_border_match );
968 
969       -- insert matched Payment Method record into pl/sql table
970       IF (l_match) THEN
971          l_pmtmthd_table(l_index) := l_pmt_mthds_rec;
972          l_index := l_index + 1;
973 
974          IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
975 	         print_debuginfo(l_module_name, 'Match Found');
976          END IF;
977       ELSE
978          IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
979 	         print_debuginfo(l_module_name, 'Not a Match');
980          END IF;
981       END IF;
982 
983     END LOOP;  -- applicable payment methods loop
984     CLOSE payment_methods;
985 
986     IF (l_pmtmthd_table.COUNT = 0) THEN
987        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
988 	       print_debuginfo(l_module_name,'Error: No Payment Methods Applicable');
989 
990        END IF;
991        FND_MESSAGE.set_name('IBY', 'IBY_NO_APPLICABLE_PAYMENT_METHODS');
992        FND_MSG_PUB.Add;
993        raise FND_API.G_EXC_ERROR;
994     ELSE
995       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
996 	      print_debuginfo(l_module_name,'Applicable Payment Methods Count : '|| l_pmtmthd_table.COUNT);
997       END IF;
998       x_payment_methods_tbl := l_pmtmthd_table;
999     END IF;
1000 
1001     -- End of API body.
1002     -- Standard call to get message count and if count is 1, get message info.
1003     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1004 
1005     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1006 	    print_debuginfo(l_module_name, 'RETURN');
1007 
1008     END IF;
1009   EXCEPTION
1010     WHEN FND_API.G_EXC_ERROR THEN
1011       x_return_status := FND_API.G_RET_STS_ERROR;
1012       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1013       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1014 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
1015 	      print_debuginfo(l_module_name,'SQLerr is :'
1016 	                           || substr(SQLERRM, 1, 150));
1017       END IF;
1018     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1019       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1020       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1021       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1022 	      print_debuginfo(l_module_name,'Unexpected ERROR: Exception occured during call to API ');
1023 	      print_debuginfo(l_module_name,'SQLerr is :'
1024 	                           || substr(SQLERRM, 1, 150));
1025       END IF;
1026     WHEN OTHERS THEN
1027       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1028 
1029       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR))
1030         THEN
1031           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
1032       END IF;
1033       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1034 	      print_debuginfo(l_module_name,'Other ERROR: Exception occured during call to API ');
1035 	      print_debuginfo(l_module_name,'SQLerr is :'
1036 	                           || substr(SQLERRM, 1, 150));
1037       END IF;
1038       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1039 
1040 END Get_Applicable_Payment_Methods;
1041 
1042   --   Start of comments
1043   --   API name     : Get_Applicable_Pmt_Profiles
1044   --   Type         : Public
1045   --   Pre-reqs     : None
1046   --   Function     : Get the list of applicable payment profiles
1047   --                  based on the given profile drivers
1048   --   Parameters   :
1049   --   IN           :   p_api_version              IN  NUMBER   Required
1050   --                    p_init_msg_list            IN  VARCHAR2 Optional
1051   --                    p_ppp_drivers_rec          IN  PPP_Drivers_Rec_Type
1052   --                                                       Required
1053   --   OUT          :   x_return_status            OUT VARCHAR2 Required
1054   --                    x_msg_count                OUT NUMBER   Required
1055   --                    x_msg_data                 OUT VARCHAR2 Required
1056   --                    x_payment_profiles_tbl     OUT
1057   --                                                 Payment_Profiles_Tab_Type
1058   --                                                     Required
1059   --   Version      : Current version   1.0
1060   --                  Previous version  None
1061   --                  Initial version   1.0
1062   --   End of comments
1063 
1064   PROCEDURE Get_Applicable_Pmt_Profiles(
1065        p_api_version          IN         NUMBER,
1066        p_init_msg_list        IN         VARCHAR2 DEFAULT FND_API.G_FALSE,
1067        p_ppp_drivers_rec      IN         PPP_Drivers_Rec_Type,
1068        x_return_status        OUT NOCOPY VARCHAR2,
1069        x_msg_count            OUT NOCOPY NUMBER,
1070        x_msg_data             OUT NOCOPY VARCHAR2,
1071        x_payment_profiles_tbl OUT NOCOPY Payment_Profile_Tab_Type)
1072   IS
1073     l_api_name           CONSTANT VARCHAR2(30)    := 'Get_Applicable_Pmt_Profiles';
1074     l_api_version        CONSTANT NUMBER          := 1.0;
1075     l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Applicable_Pmt_Profiles';
1076 
1077     l_pmt_profs_tab      Payment_Profile_Tab_Type;
1078     l_pmt_profs_rec      Payment_Profile_Rec_Type;
1079     l_index              NUMBER  := 1;
1080 
1081      /*
1082       * We need to select payment profiles that are applicable to
1083       * given (payment method, org, format, currency, int bank account).
1084       *
1085       *
1086       *     |  Profiles      |
1087       *     |  applicable to |
1088       *     |  given pmt     |    Profiles applicable to
1089       *     |  method        |    given payment currency
1090       *     |                |     /
1091       *     |     |          |    /
1092       *     |     V          |  L
1093       *     |                |
1094       *     |----------------|--------------------------
1095       *     |/              \|            Profiles
1096       *     |                |            applicable to
1097       *     |  Intersection  |     <--    given
1098       *     |                |            org
1099       *     |\              /|
1100       *     |----------------|--------------------------
1101       *     |                |
1102       *     |                |  .__
1103       *     |     ^          |  |\
1104       *     |     |          |    \
1105       *     |     |          |
1106       *     |                |   Profiles applicable to
1107       *     | Profiles       |   given internal bank
1108       *     | applicable to  |   account
1109       *     | given format   |
1110       *     |                |
1111       *
1112       * We need the intersection of (profiles applicable to
1113       * a given payment method) and (profiles applicable to
1114       * a given org) and (profiles applicable to a given
1115       * format) and (profiles applicable to given payment
1116       * currency) and (profiles applicable to given internal
1117       * bank account) as shown in the graphic.
1118       *
1119       * Therefore, we need to join with the IBY_APPLICABLE_PMT_PROFS
1120       * five times - once to get the profiles for the method, once to get
1121       * the profiles for the org, and once to get the profiles for the
1122       * format etc. If we are able to get a non-null intersect for these
1123       * five queries, it means that there is a profile that matches the
1124       * (org, method, format, currency, bank acct) combination.
1125       *
1126       * If the 'applicable_value_to' is set to NULL, it means that the
1127       * profile is applicable to 'all orgs' | 'all methods' |
1128       * 'all formats' etc., depending upon the applicable_type_code.
1129       * Therefore, we need to factor this condition in the join.
1130       *
1131       * Payment format is not a driving item for payment profile.
1132       */
1133      CURSOR c_profiles(
1134                 p_pmt_method_cd     IN IBY_DOCS_PAYABLE_ALL.
1135                                            payment_method_code%TYPE,
1136                 p_org_id            IN IBY_DOCS_PAYABLE_ALL.org_id%TYPE,
1137                 p_org_type          IN IBY_DOCS_PAYABLE_ALL.org_type%TYPE,
1138                 p_pmt_currency      IN IBY_DOCS_PAYABLE_ALL.
1139                                            payment_currency_code%TYPE,
1140                 p_int_bank_acct_id  IN IBY_DOCS_PAYABLE_ALL.
1141                                            internal_bank_account_id%TYPE
1142                 )
1143      IS
1144 
1145      SELECT
1146          prof.payment_profile_id,
1147          prof.payment_profile_name,
1148          prof.processing_type
1149      FROM
1150          IBY_APPLICABLE_PMT_PROFS app1,
1151          IBY_APPLICABLE_PMT_PROFS app2,
1152          IBY_APPLICABLE_PMT_PROFS app3,
1153          IBY_APPLICABLE_PMT_PROFS app4,
1154          IBY_PAYMENT_PROFILES     prof
1155      WHERE
1156          (app1.applicable_type_code=APL_TYPE_PAYER_ORG AND
1157              ((app1.applicable_value_to=TO_CHAR(p_org_id) AND
1158                  app1.applicable_value_from=p_org_type) OR
1159              (app1.applicable_value_to IS NULL AND
1160                  app1.applicable_value_from IS NULL)) )
1161      AND (app2.applicable_type_code=APL_TYPE_PMT_METHOD AND
1162              (app2.applicable_value_to=p_pmt_method_cd OR
1163                  app2.applicable_value_to IS NULL))
1164      AND (app3.applicable_type_code=APL_TYPE_PMT_CURRENCY AND
1165              (app3.applicable_value_to=p_pmt_currency OR
1166                  app3.applicable_value_to IS NULL))
1167      AND (app4.applicable_type_code=APL_TYPE_INT_BANK_ACCT AND
1168              (app4.applicable_value_to=TO_CHAR(p_int_bank_acct_id) OR
1169                  app4.applicable_value_to IS NULL))
1170      AND app1.system_profile_code=app2.system_profile_code
1171      AND app2.system_profile_code=app3.system_profile_code
1172      AND app3.system_profile_code=app4.system_profile_code
1173      AND app4.system_profile_code=app1.system_profile_code
1174      AND app1.system_profile_code=prof.system_profile_code
1175      /*
1176       * Fix for bug 5929889:
1177       *
1178       * Filter profiles by inactive date so that we do not
1179       * pick up end-dated profiles.
1180       */
1181      AND NVL(prof.inactive_date, SYSDATE + 1) > SYSDATE
1182      ;
1183 
1184   BEGIN
1185 
1186     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1187 	    print_debuginfo(l_module_name, 'ENTER');
1188 
1189 	    print_debuginfo(l_module_name, 'Checking for profiles '
1190 	        || 'applicable for given org '
1191 	        || p_ppp_drivers_rec.Payer_Org_Id
1192 	        || ' and org type '
1193 	        || p_ppp_drivers_rec.Payer_Org_Type
1194 	        || ' and payment method '
1195 	        || p_ppp_drivers_rec.Payment_Method_Code
1196 	        || ' and payment currency '
1197 	        || p_ppp_drivers_rec.Payment_Currency
1198 	        || ' and internal bank account '
1199 	        || p_ppp_drivers_rec.Int_Bank_Account_Id
1200 	        || ' combination ...'
1201 	        );
1202 
1203     END IF;
1204     -- Standard call to check for call compatibility.
1205     IF NOT FND_API.Compatible_API_Call(
1206                        l_api_version,
1207                        p_api_version,
1208                        l_api_name,
1209                        G_PKG_NAME) THEN
1210         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1211     END IF;
1212 
1213     -- Initialize message list if p_init_msg_list is set to TRUE.
1214     IF FND_API.to_Boolean(p_init_msg_list) THEN
1215       FND_MSG_PUB.initialize;
1216     END IF;
1217 
1218     --  Initialize API return status to success
1219     x_return_status := FND_API.G_RET_STS_SUCCESS;
1220 
1221     --
1222     -- Pick up all payment profiles that match the given profile drivers.
1223     --
1224     OPEN  c_profiles(p_ppp_drivers_rec.Payment_Method_Code,
1225               p_ppp_drivers_rec.Payer_Org_Id,
1226               p_ppp_drivers_rec.Payer_Org_Type,
1227               p_ppp_drivers_rec.Payment_Currency,
1228               p_ppp_drivers_rec.Int_Bank_Account_Id
1229               );
1230     FETCH c_profiles BULK COLLECT INTO l_pmt_profs_tab;
1231     CLOSE c_profiles;
1232 
1233     IF (l_pmt_profs_tab.COUNT = 0) THEN
1234       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1235 	      print_debuginfo(l_module_name,'Error: No applicable payment profiles '
1236 	          || 'were found.');
1237       END IF;
1238       FND_MESSAGE.set_name('IBY', 'IBY_NO_APPLICABLE_PAYMENT_PROFILES');
1239       FND_MSG_PUB.Add;
1240       raise FND_API.G_EXC_ERROR;
1241     ELSE
1242       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1243 	      print_debuginfo(l_module_name, 'Count of applicable payment profiles: '
1244 	        || l_pmt_profs_tab.COUNT);
1245       END IF;
1246       x_payment_profiles_tbl := l_pmt_profs_tab;
1247 
1248     END IF;
1249 
1250     -- End of API body.
1251 
1252     -- Standard call to get message count and if count is 1, get message info.
1253     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1254 
1255     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1256 	    print_debuginfo(l_module_name, 'RETURN');
1257 
1258     END IF;
1259   EXCEPTION
1260 
1261     WHEN FND_API.G_EXC_ERROR THEN
1262       x_return_status := FND_API.G_RET_STS_ERROR;
1263       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1264       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1265 	      print_debuginfo(l_module_name, 'ERROR: Exception occured '
1266 	          || 'during call to API ');
1267 	      print_debuginfo(l_module_name, 'SQLerr is :'
1268 	                           || substr(SQLERRM, 1, 150));
1269 
1270       END IF;
1271     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1272       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1273       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1274       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1275 	      print_debuginfo(l_module_name, 'ERROR: Exception occured during '
1276 	          || 'call to API ');
1277 	      print_debuginfo(l_module_name,'SQLerr is :'
1278 	                           || substr(SQLERRM, 1, 150));
1279 
1280       END IF;
1281     WHEN OTHERS THEN
1282       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1283 
1284       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
1285           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
1286       END IF;
1287 
1288       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1289 	      print_debuginfo(l_module_name, 'ERROR: Exception occured during '
1290 	          || 'call to API ');
1291 	      print_debuginfo(l_module_name,'SQLerr is :'
1292 	                           || substr(SQLERRM, 1, 150));
1293       END IF;
1294       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1295 
1296 END Get_Applicable_Pmt_Profiles;
1297 
1298   --   Start of comments
1299   --   API name     : Get_Pmt_Profiles_Intersect
1300   --   Type         : Public
1301   --   Pre-reqs     : None
1302   --   Function     : Get the list of applicable payment profiles
1303   --                  that are applicable across the given profile
1304   --                  drivers list.
1305   --
1306   --                  We already have a method to get the payment
1307   --                  profiles for a single set of profile drivers;
1308   --                  This method will attempt to get the payment profiles
1309   --                  for every given set of payment drivers in the list
1310   --                  and return their intersection.
1311   --
1312   --   Parameters   :
1313   --   IN           :   p_api_version              IN  NUMBER   Required
1314   --                    p_init_msg_list            IN  VARCHAR2 Optional
1315   --                    p_ppp_drivers_tab          IN  PPP_Drivers_Tab_Type
1316   --                                                       Required
1317   --   OUT          :   x_return_status            OUT VARCHAR2 Required
1318   --                    x_msg_count                OUT NUMBER   Required
1319   --                    x_msg_data                 OUT VARCHAR2 Required
1320   --                    x_payment_profiles_tbl     OUT
1321   --                                                 Payment_Profiles_Tab_Type
1322   --                                                     Required
1323   --   Version      : Current version   1.0
1324   --                  Previous version  None
1325   --                  Initial version   1.0
1326   --   End of comments
1327 
1328   PROCEDURE Get_Pmt_Profiles_Intersect(
1329                 p_api_version          IN         NUMBER,
1330                 p_init_msg_list        IN         VARCHAR2 DEFAULT
1331                                                       FND_API.G_FALSE,
1332                 p_ppp_drivers_tab      IN         PPP_Drivers_Tab_Type,
1333                 x_return_status        OUT NOCOPY VARCHAR2,
1334                 x_msg_count            OUT NOCOPY NUMBER,
1335                 x_msg_data             OUT NOCOPY VARCHAR2,
1336                 x_payment_profiles_tbl OUT NOCOPY Payment_Profile_Tab_Type)
1337   IS
1338     l_api_name           CONSTANT VARCHAR2(30)    :=
1339                              'Get_Pmt_Profiles_Intersect';
1340     l_api_version        CONSTANT NUMBER          := 1.0;
1341     l_module_name        CONSTANT VARCHAR2(200)   :=
1342                              G_PKG_NAME || '.Get_Pmt_Profiles_Intersect';
1343 
1344     l_prof_intsct_tab         Payment_Profile_Tab_Type;
1345     l_prof_tab                Payment_Profile_Tab_Type;
1346     l_pmt_prof_rec            Payment_Profile_Rec_Type;
1347 
1348     l_prof_tabs_list          Payment_Profile_2D_Tab_Type;
1349     l_index                   NUMBER  := 1;
1350     l_first_set               BOOLEAN := FALSE;
1351     l_match                   BOOLEAN := FALSE;
1352 
1353   BEGIN
1354 
1355     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1356 	    print_debuginfo(l_module_name, 'ENTER');
1357 
1358     END IF;
1359     -- Standard call to check for call compatibility.
1360     IF NOT FND_API.Compatible_API_Call(
1361                        l_api_version,
1362                        p_api_version,
1363                        l_api_name,
1364                        G_PKG_NAME) THEN
1365         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1366     END IF;
1367 
1368     -- Initialize message list if p_init_msg_list is set to TRUE.
1369     IF FND_API.to_Boolean(p_init_msg_list) THEN
1370       FND_MSG_PUB.initialize;
1371     END IF;
1372 
1373     --  Initialize API return status to success
1374     x_return_status := FND_API.G_RET_STS_SUCCESS;
1375 
1376     --
1377     -- If no driver sets are given, do nothing
1378     --
1379     IF (p_ppp_drivers_tab.COUNT = 0) THEN
1380 
1381         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1382 	        print_debuginfo(l_module_name, 'No profile drivers were '
1383 	            || 'specified. Exiting .. ');
1384 	        print_debuginfo(l_module_name, 'RETURN');
1385 
1386         END IF;
1387         RETURN;
1388 
1389     END IF;
1390 
1391     --
1392     -- Call the applicable payment profiles API for each set
1393     -- of profile drivers.
1394     --
1395     FOR i IN p_ppp_drivers_tab.FIRST .. p_ppp_drivers_tab.LAST LOOP
1396 
1397         Get_Applicable_Pmt_Profiles(
1398             p_api_version,
1399             p_init_msg_list ,
1400             p_ppp_drivers_tab(i),
1401             x_return_status,
1402             x_msg_count,
1403             x_msg_data,
1404             l_prof_tab
1405             );
1406 
1407         IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1408 
1409             /*
1410              * Add the returned list of payment profiles into
1411              * our list of payment profile tables.
1412              */
1413             l_prof_tabs_list(l_prof_tabs_list.COUNT + 1) := l_prof_tab;
1414 
1415         ELSE
1416 
1417             /*
1418              * We cannot proceed because the API call to get payment
1419              * profiles for a particular set of payment profile
1420              * drivers has failed. Raise an exception.
1421              */
1422             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1423 
1424         END IF;
1425 
1426 
1427     END LOOP;
1428 
1429     /*
1430      * Start processing the list of profile drivers for each document
1431      * one-by-one.
1432      */
1433 
1434     /* find intersect profiles */
1435     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1436 	    print_debuginfo(l_module_name, 'Finding intersect profiles .. ');
1437 
1438     END IF;
1439     l_first_set := TRUE;
1440     FOR i in l_prof_tabs_list.FIRST .. l_prof_tabs_list.LAST LOOP
1441 
1442         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1443 	        print_debuginfo(l_module_name, 'Popping table: ' || i);
1444 
1445         END IF;
1446         l_prof_tab := l_prof_tabs_list(i);
1447 
1448         IF (l_first_set = TRUE) THEN
1449 
1450             /* Add the first table to the intersect list */
1451             /*
1452              * We'll start eliminating those elements from
1453              * this intersect list that are not found in the
1454              * comparison list.
1455              */
1456             l_prof_intsct_tab := l_prof_tab;
1457 
1458             IF (l_prof_intsct_tab.COUNT > 0) THEN
1459 
1460                 FOR n in l_prof_intsct_tab.FIRST .. l_prof_intsct_tab.LAST LOOP
1461 
1462                     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1463 	                    print_debuginfo(l_module_name, 'Seeded intersect '
1464 	                        || 'profile id: '
1465 	                        || l_prof_intsct_tab(n).Payment_Profile_Id
1466 	                        );
1467 
1468                     END IF;
1469                 END LOOP;
1470 
1471             END IF;
1472 
1473             l_first_set := FALSE;
1474 
1475         END IF;
1476 
1477         /* eliminate from the intersect list */
1478 
1479         IF (l_prof_intsct_tab.COUNT > 0) THEN
1480         FOR k in l_prof_intsct_tab.FIRST .. l_prof_intsct_tab.LAST
1481             LOOP
1482 
1483             /*
1484              * Since we are eliminating rows from the intersect
1485              * table, we have to ensure that the rows exists before
1486              * each iteration begins.
1487              */
1488             IF (l_prof_intsct_tab.EXISTS(k)) THEN
1489 
1490                 IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1491 	                print_debuginfo(l_module_name, 'Current intersect '
1492 	                    || 'profile id: '
1493 	                    || l_prof_intsct_tab(k).Payment_Profile_Id
1494 	                    );
1495 
1496                 END IF;
1497                 /*
1498                  * Loop through all the given profiles searching
1499                  * if any of them is stored in the intersect
1500                  * table.
1501                  */
1502                 l_match := FALSE;
1503 
1504                 IF (l_prof_tab.COUNT > 0) THEN
1505 
1506                     FOR m in l_prof_tab.FIRST .. l_prof_tab.LAST LOOP
1507 
1508                         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1509 	                        print_debuginfo(l_module_name, 'Comparing intersect '
1510 	                            || 'profile id: '
1511 	                            || l_prof_intsct_tab(k).Payment_Profile_Id
1512 	                            || ' with profile '
1513 	                            || l_prof_tab(m).Payment_Profile_Id
1514 	                            );
1515 
1516                         END IF;
1517                         IF (l_prof_intsct_tab(k).Payment_Profile_Id =
1518                             l_prof_tab(m).Payment_Profile_Id) THEN
1519 
1520                             l_match := TRUE;
1521 
1522                             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1523 	                            print_debuginfo(l_module_name, 'Profile id: '
1524 	                                || l_prof_intsct_tab(k).Payment_Profile_Id
1525 	                                || ' matched.'
1526 	                                );
1527 
1528                             END IF;
1529                         ELSE
1530 
1531                             IF (l_match <> TRUE) THEN
1532                                 l_match := FALSE;
1533                             END IF;
1534 
1535                         END IF;
1536 
1537                     END LOOP; -- for each profile in current set
1538 
1539                 ELSE
1540 
1541                     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1542 	                    print_debuginfo(l_module_name, 'Comparison list is empty. '
1543 	                        || 'This means that there are no intersection '
1544 	                        || 'elements. Emptying out intersection list ..'
1545 	                        );
1546 
1547                     END IF;
1548                     l_match := FALSE;
1549 
1550                 END IF;
1551 
1552                 IF (l_match = FALSE) THEN
1553                     /*
1554                      * This means that the current profile
1555                      * from the intersect was not found
1556                      * in the entire list of profiles
1557                      * that we were comparing with.
1558                      *
1559                      * Therefore, this profile is no longer
1560                      * in the intersection. Eliminate this
1561                      * profile from the intersect list.
1562                      */
1563                     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1564 	                    print_debuginfo(l_module_name, 'Eliminating profile id: '
1565 	                        || l_prof_intsct_tab(k).Payment_Profile_Id);
1566 
1567                     END IF;
1568                     l_prof_intsct_tab.DELETE(k);
1569 
1570                     IF (l_prof_intsct_tab.COUNT = 0) THEN
1571 
1572                         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1573 	                        print_debuginfo(l_module_name, 'Intersect list '
1574 	                            || 'is empty. '
1575 	                            || 'Exiting ..');
1576 
1577                         END IF;
1578                         GOTO label_finish;
1579 
1580                     END IF;
1581 
1582                 END IF;
1583 
1584             END IF; -- if row exists in intersect table
1585 
1586         END LOOP; -- for each profile in intersect
1587         END IF; -- if intersect is non-zero
1588 
1589     END LOOP;
1590 
1591     <<label_finish>>
1592 
1593     /* Finally print the profile intersection */
1594     IF (l_prof_intsct_tab.COUNT = 0) THEN
1595 
1596         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1597 	        print_debuginfo(l_module_name, 'Profile intersection is NULL');
1598 
1599         END IF;
1600     ELSE
1601 
1602         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1603 	        print_debuginfo(l_module_name, '-----------------------');
1604         END IF;
1605         FOR i IN l_prof_intsct_tab.FIRST .. l_prof_intsct_tab.LAST LOOP
1606 
1607             IF (l_prof_intsct_tab.EXISTS(i)) THEN
1608 
1609                 IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1610 	                print_debuginfo(l_module_name, 'Intersection profile: '
1611 	                    || l_prof_intsct_tab(i).Payment_Profile_Id);
1612 
1613                 END IF;
1614             END IF;
1615 
1616         END LOOP;
1617         IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1618 	        print_debuginfo(l_module_name, '-----------------------');
1619 
1620         END IF;
1621     END IF;
1622 
1623     /*
1624      * Copy back the payment profiles intersect onto
1625      * the output param.
1626      */
1627     x_payment_profiles_tbl := l_prof_intsct_tab;
1628 
1629     -- End of API body.
1630     -- Standard call to get message count and if count is 1, get message info.
1631     FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1632 
1633     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1634 	    print_debuginfo(l_module_name, 'RETURN');
1635 
1636     END IF;
1637   EXCEPTION
1638 
1639     WHEN FND_API.G_EXC_ERROR THEN
1640       x_return_status := FND_API.G_RET_STS_ERROR;
1641       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1642       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1643 	      print_debuginfo(l_module_name, 'ERROR: Exception occured '
1644 	          || 'during call to API ');
1645 	      print_debuginfo(l_module_name, 'SQLerr is :'
1646 	                           || substr(SQLERRM, 1, 150));
1647 
1648       END IF;
1649     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1650       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1651       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1652       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1653 	      print_debuginfo(l_module_name, 'ERROR: Exception occured during '
1654 	          || 'call to API ');
1655 	      print_debuginfo(l_module_name,'SQLerr is :'
1656 	                           || substr(SQLERRM, 1, 150));
1657 
1658       END IF;
1659     WHEN OTHERS THEN
1660       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1661 
1662       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR))
1663           THEN
1664 
1665           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
1666 
1667       END IF;
1668 
1669       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1670 	      print_debuginfo(l_module_name, 'ERROR: Exception occured during '
1671 	          || 'call to API ');
1672 	      print_debuginfo(l_module_name,'SQLerr is :'
1673 	                           || substr(SQLERRM, 1, 150));
1674       END IF;
1675       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1676 
1677 END Get_Pmt_Profiles_Intersect;
1678 
1679   -- Start of comments
1680   --   API name     : Get_Applicable_Payment_Reasons
1681   --   Type         : Public
1682   --   Pre-reqs     : None.
1683   --   Function     : get the list of applicable Payment Reasons.
1684   --   Parameters   :
1685   --   IN           :   p_api_version              IN  NUMBER   Required
1686   --                    p_init_msg_list            IN  VARCHAR2 Optional
1687   --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type  Required
1688   --   OUT          :   x_return_status            OUT VARCHAR2 Required
1689   --                    x_msg_count                OUT NUMBER   Required
1690   --                    x_msg_data                 OUT VARCHAR2 Required
1691   --                    x_payment_reason_tbl       OUT Payment_Reason_Tab_Type Required
1692   --
1693   --   Version   : Current version   1.0
1694   --                      Previous version   None
1695   --                      Initial version    1.0
1696   -- End of comments
1697 
1698 PROCEDURE Get_Applicable_Payment_Reasons(
1699      p_api_version         IN   NUMBER,
1700      p_init_msg_list       IN   VARCHAR2 default FND_API.G_FALSE    ,
1701      p_trxn_attributes_rec IN   Trxn_Attributes_Rec_Type,
1702      x_return_status       OUT  NOCOPY VARCHAR2                     ,
1703      x_msg_count           OUT  NOCOPY NUMBER                       ,
1704      x_msg_data            OUT  NOCOPY VARCHAR2                     ,
1705      x_payment_reason_tbl  OUT  NOCOPY Payment_Reason_Tab_Type
1706 )
1707 IS
1708 
1709    l_api_name           CONSTANT VARCHAR2(30)    := 'Get_Applicable_Payment_Reason';
1710    l_api_version        CONSTANT NUMBER          := 1.0;
1711    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Applicable_Payment_Reason';
1712 
1713    l_payment_reason_tbl Payment_Reason_Tab_Type;
1714    l_payer_country VARCHAR2(35);
1715 
1716    CURSOR payment_reason_csr(p_payer_country VARCHAR2)
1717    IS
1718       SELECT payment_reason_code,
1719              description,
1720              meaning,
1721              territory_code
1722       FROM IBY_PAYMENT_REASONS_VL ibypr
1723       WHERE (ibypr.territory_code = p_payer_country OR ibypr.territory_code is NULL)
1724       AND   (ibypr.inactive_date is NULL OR ibypr.inactive_date >= trunc(sysdate));
1725 
1726    CURSOR payer_country_csr(p_payer_le_id NUMBER)
1727    IS
1728       SELECT xle.country
1729       FROM XLE_FIRSTPARTY_INFORMATION_V xle
1730       WHERE xle.legal_entity_id = p_payer_le_id;
1731 
1732 BEGIN
1733    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1734 	   print_debuginfo(l_module_name,'ENTER');
1735 
1736    END IF;
1737    -- Standard call to check for call compatibility.
1738    IF NOT FND_API.Compatible_API_Call(l_api_version,
1739                                       p_api_version,
1740                                       l_api_name,
1741                                       G_PKG_NAME) THEN
1742       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1743    END IF;
1744 
1745    -- Initialize message list if p_init_msg_list is set to TRUE
1746    IF FND_API.to_Boolean(p_init_msg_list) THEN
1747       FND_MSG_PUB.initialize;
1748    END IF;
1749 
1750    --  Initialize API return status to success
1751    x_return_status := FND_API.G_RET_STS_SUCCESS;
1752 
1753    IF (p_trxn_attributes_rec.payer_legal_entity_id IS NULL) THEN
1754       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1755 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''First party legal entity Id'' missing.');
1756       END IF;
1757       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
1758       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_1PARTY_LE_ID'));
1759       FND_MSG_PUB.Add;
1760       RAISE FND_API.G_EXC_ERROR;
1761    END IF;
1762 
1763    OPEN payer_country_csr(p_trxn_attributes_rec.payer_legal_entity_id);
1764    FETCH payer_country_csr INTO l_payer_country;
1765    CLOSE payer_country_csr;
1766 
1767    IF (l_payer_country IS NULL) THEN
1768       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1769 	      print_debuginfo(l_module_name,'Error: First party country Not populated.');
1770       END IF;
1771       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_DATA');
1772       FND_MESSAGE.SET_TOKEN('PARAM', 'First party country');
1773       FND_MSG_PUB.Add;
1774       RAISE FND_API.G_EXC_ERROR;
1775    END IF;
1776 
1777    OPEN payment_reason_csr(l_payer_country);
1778    FETCH payment_reason_csr BULK COLLECT INTO l_payment_reason_tbl;
1779    CLOSE payment_reason_csr;
1780 
1781    IF (l_payment_reason_tbl.COUNT = 0) THEN
1782       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1783 	      print_debuginfo(l_module_name,'Warning: No Payment Reasons Applicable');
1784       END IF;
1785    ELSE
1786       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1787 	      print_debuginfo(l_module_name,'Applicable Payment Reasons Count : '|| l_payment_reason_tbl.COUNT);
1788       END IF;
1789       x_payment_reason_tbl := l_payment_reason_tbl;
1790    END IF;
1791 
1792    -- End of API body.
1793 
1794    -- Standard call to get message count and if count is 1, get message info.
1795    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1796 
1797    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1798 	   print_debuginfo(l_module_name, 'RETURN');
1799 
1800    END IF;
1801   EXCEPTION
1802     WHEN FND_API.G_EXC_ERROR THEN
1803       x_return_status := FND_API.G_RET_STS_ERROR;
1804       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1805       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1806 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
1807 	      print_debuginfo(l_module_name,'SQLerr is :'
1808 	                           || substr(SQLERRM, 1, 150));
1809       END IF;
1810     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1811       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1812       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1813       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1814 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
1815 	      print_debuginfo(l_module_name,'SQLerr is :'
1816 	                           || substr(SQLERRM, 1, 150));
1817       END IF;
1818     WHEN OTHERS THEN
1819       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1820 
1821       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
1822           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
1823       END IF;
1824       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1825 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
1826 	      print_debuginfo(l_module_name,'SQLerr is :'
1827 	                           || substr(SQLERRM, 1, 150));
1828       END IF;
1829       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
1830 
1831 END Get_Applicable_Payment_Reasons;
1832 
1833 -- Start of comments
1834 --   API name     : Get_Default_Payment_Attributes
1835 --   Type         : Public
1836 --   Pre-reqs     : None.
1837 --   Function     : get the default values of all Payment attributes.
1838 --   Parameters   :
1839 --   IN           :   p_api_version              IN  NUMBER   Required
1840 --                    p_application_id           IN  NUMBER   Required
1841 --                    p_init_msg_list            IN  VARCHAR2 Optional
1842 --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type Required
1843 --   OUT          :   x_return_status            OUT VARCHAR2 Required
1844 --                    x_msg_count                OUT NUMBER   Required
1845 --                    x_msg_data                 OUT VARCHAR2 Required
1846 --                    x_default_pmt_attrs_rec    OUT Default_Pmt_Attrs_Rec_Type Required
1847 --
1848 --   Version   : Current version   1.0
1849 --                      Previous version   None
1850 --                      Initial version    1.0
1851 -- End of comments
1852 
1853 PROCEDURE Get_Default_Payment_Attributes(
1854     p_api_version             IN   NUMBER,
1855     p_init_msg_list           IN   VARCHAR2 default FND_API.G_FALSE,
1856     p_ignore_payee_pref       IN   VARCHAR2,
1857     p_trxn_attributes_rec     IN   Trxn_Attributes_Rec_Type,
1858     x_return_status           OUT  NOCOPY VARCHAR2,
1859     x_msg_count               OUT  NOCOPY NUMBER,
1860     x_msg_data                OUT  NOCOPY VARCHAR2,
1861     x_default_pmt_attrs_rec   OUT  NOCOPY Default_Pmt_Attrs_Rec_Type
1862 )
1863 IS
1864    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Default_Payment_Attributes';
1865    l_api_version        CONSTANT NUMBER         := 1.0;
1866    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Default_Payment_Attributes';
1867 
1868    l_payee_override_flag   VARCHAR2(1);
1869 
1870    l_payment_method_rec    Payment_Method_Rec_Type;
1871    l_payment_format_rec    Payment_Format_Rec_Type;
1872    l_payee_bankaccount_rec Payee_BankAccount_Rec_Type;
1873    l_payment_reason_rec    Payment_Reason_Rec_Type;
1874    l_delivery_channel_rec  Delivery_Channel_Rec_Type;
1875    l_bank_charge_bearer    Bank_Charge_Bearer_Rec_Type;
1876    l_settlement_priority   Settlement_Priority_Rec_Type;
1877 
1878    l_pay_alone             VARCHAR2(1);
1879    l_payment_reason_comments VARCHAR2(240);
1880 
1881    l_payee1                IBY_EXTERNAL_PAYEES_ALL.ext_payee_id%TYPE;
1882    l_payee2                IBY_EXTERNAL_PAYEES_ALL.ext_payee_id%TYPE;
1883    l_payee3                IBY_EXTERNAL_PAYEES_ALL.ext_payee_id%TYPE;
1884    l_payee4                IBY_EXTERNAL_PAYEES_ALL.ext_payee_id%TYPE;
1885 
1886    l_key                         VARCHAR2(2000);
1887 
1888 
1889    CURSOR payee_override_ent_cur IS
1890      SELECT payment_method_at_payee_flag
1891        FROM IBY_INTERNAL_PAYERS_ALL
1892       WHERE org_id is null;
1893 
1894    CURSOR payee_override_org_cur(p_org_id NUMBER,
1895                                  p_org_type VARCHAR2) IS
1896      SELECT payment_method_at_payee_flag
1897        FROM IBY_INTERNAL_PAYERS_ALL
1898       WHERE org_id = p_org_id
1899         AND org_type = p_org_type;
1900 
1901   /*
1902    * OBSOLETE:
1903    *
1904    * Left here for reference purposes.
1905    *
1906    * This cursor has been split into two parts;
1907    * payee_defaults_curA1 and payee_defaults_curB1
1908    * below are it's replacements.
1909    *
1910    * The split has been done to improve performance
1911    * and legibility.
1912    */
1913    CURSOR payee_defaults_cur (p_payee_party_id      NUMBER,
1914                               p_payee_party_site_id NUMBER,
1915                               p_supplier_site_id    NUMBER,
1916                               p_org_id              NUMBER,
1917                               p_org_type            VARCHAR2,
1918                               p_payment_function    VARCHAR2,
1919 			      p_Pay_Proc_Trxn_Type_Code VARCHAR2,
1920 			      p_payer_le_id NUMBER) IS
1921      SELECT pm.payment_method_code,
1922             m.payment_method_name,
1923             m.SUPPORT_BILLS_PAYABLE_FLAG,
1924             m.MATURITY_DATE_OFFSET_DAYS,
1925             payee.payment_format_code,
1926             f.format_name,
1927             payee.bank_charge_bearer,
1928             payee.delivery_channel_code,
1929             d.meaning delivery_channel_meaning,
1930             d.description delivery_channel_description,
1931             payee.payment_reason_code,
1932             r.meaning payment_reason,
1933             r.description payment_reason_description,
1934             payee.payment_reason_comments,
1935             payee.exclusive_payment_flag,
1936             payee.settlement_priority,
1937             d.territory_code delivery_channel_country,
1938             r.territory_code payment_reason_country
1939      FROM IBY_EXTERNAL_PAYEES_ALL payee,
1940      	  IBY_EXT_PARTY_PMT_MTHDS pm,
1941           IBY_PAYMENT_METHODS_VL m,
1942           IBY_FORMATS_VL f,
1943           IBY_DELIVERY_CHANNELS_VL d,
1944           IBY_PAYMENT_REASONS_VL r,
1945 	IBY_APPLICABLE_PMT_MTHDS am1,
1946 	IBY_APPLICABLE_PMT_MTHDS am2,
1947 	IBY_APPLICABLE_PMT_MTHDS am3
1948      WHERE payee.payee_party_id = p_payee_party_id
1949      AND am1.PAYMENT_METHOD_CODE(+) = m.PAYMENT_METHOD_CODE
1950      AND am1.PAYMENT_FLOW(+) = 'DISBURSEMENTS'
1951      AND am1.APPLICABLE_TYPE_CODE(+) = 'PAY_PROC_TRXN_TYPE'
1952      AND (am1.APPLICABLE_VALUE_TO is null OR
1953 	  am1.APPLICABLE_VALUE_TO=p_Pay_Proc_Trxn_Type_Code )
1954      AND (am1.INACTIVE_DATE is null OR am1.INACTIVE_DATE >= trunc(sysdate))
1955      AND am2.PAYMENT_METHOD_CODE(+) = am1.PAYMENT_METHOD_CODE
1956      AND am2.APPLICABLE_TYPE_CODE(+) = 'PAYER_LE'
1957      AND (am2.APPLICABLE_VALUE_TO is null OR am2.APPLICABLE_VALUE_TO=p_payer_le_id )
1958      AND (am2.INACTIVE_DATE is null OR am2.INACTIVE_DATE >= trunc(sysdate))
1959      AND am3.PAYMENT_METHOD_CODE(+) = am2.PAYMENT_METHOD_CODE
1960      AND am3.APPLICABLE_TYPE_CODE(+) = 'PAYER_ORG'
1961      AND (am3.APPLICABLE_VALUE_TO is null OR 	am3.APPLICABLE_VALUE_TO=p_org_id )
1962      AND (am3.INACTIVE_DATE is null OR am3.INACTIVE_DATE >= trunc(sysdate))
1963      AND   payee.payment_function = p_payment_function
1964      AND   payee.ext_payee_id = pm.ext_pmt_party_id(+)
1965      AND   pm.payment_method_code = m.payment_method_code(+)
1966      AND   pm.payment_function(+) = p_payment_function
1967      AND   pm.primary_flag(+) = 'Y'
1968      AND   (pm.inactive_date is null OR pm.inactive_date >= trunc(sysdate))
1969      AND   (m.inactive_date is null OR m.inactive_date >= trunc(sysdate))
1970      AND   payee.payment_format_code = f.format_code(+)
1971      AND   payee.delivery_channel_code = d.delivery_channel_code(+)
1972      AND   payee.payment_reason_code = r.payment_reason_code(+)
1973      AND   (payee.org_id is NULL
1974             OR (payee.org_id = p_org_id AND payee.org_type = p_org_type))
1975      AND   (payee.party_site_id is NULL OR payee.party_site_id = p_payee_party_site_id)
1976      AND   (payee.supplier_site_id is NULL OR payee.supplier_site_id = p_supplier_site_id)
1977      ORDER by payee.supplier_site_id,
1978               payee.party_site_id,
1979               payee.org_id;
1980 
1981    /*
1982     * Fix for performance bug 5548886:
1983     *
1984     * Use the ext payee id as the key to drive this
1985     * cursor as it will significantly improve
1986     * performance and improve maintainability.
1987     */
1988    CURSOR payee_defaults_curA1 (
1989                               p_payee_party_id          NUMBER,
1990                               p_payee_party_site_id     NUMBER,
1991                               p_supplier_site_id        NUMBER,
1992                               p_org_id                  NUMBER,
1993                               p_org_type                VARCHAR2,
1994                               p_payment_function        VARCHAR2,
1995                               p_Pay_Proc_Trxn_Type_Code VARCHAR2,
1996                               p_payer_le_id             NUMBER,
1997                               p_payee1                  NUMBER,
1998                               p_payee2                  NUMBER,
1999                               p_payee3                  NUMBER,
2000                               p_payee4                  NUMBER
2001                               )
2002      IS
2003      SELECT
2004             payee.payment_format_code,
2005             f.format_name,
2006             payee.bank_charge_bearer,
2007             payee.delivery_channel_code,
2008             d.meaning delivery_channel_meaning,
2009             d.description delivery_channel_description,
2010             payee.payment_reason_code,
2011             r.meaning payment_reason,
2012             r.description payment_reason_description,
2013             payee.payment_reason_comments,
2014             payee.exclusive_payment_flag,
2015             payee.settlement_priority,
2016             d.territory_code delivery_channel_country,
2017             r.territory_code payment_reason_country
2018      FROM
2019           IBY_EXTERNAL_PAYEES_ALL  payee,
2020           IBY_FORMATS_VL           f,
2021           IBY_DELIVERY_CHANNELS_VL d,
2022           IBY_PAYMENT_REASONS_VL   r
2023      WHERE
2024      payee.ext_payee_id                  IN
2025                                          (
2026                                          p_payee1,
2027                                          p_payee2,
2028                                          p_payee3,
2029                                          p_payee4
2030                                          )
2031      AND   payee.payment_format_code   = f.format_code(+)
2032      AND   payee.delivery_channel_code = d.delivery_channel_code(+)
2033      AND   payee.payment_reason_code   = r.payment_reason_code(+)
2034      ORDER BY
2035          payee.supplier_site_id,
2036          payee.party_site_id,
2037          payee.org_id
2038      ;
2039 
2040    /*
2041     * Fix for performance bug 5548886:
2042     *
2043     * Use the ext payee id as the key to drive this
2044     * cursor as it will significantly improve
2045     * performance and improve maintainability.
2046     */
2047    CURSOR payee_defaults_curB1 (
2048                               p_payee_party_id          NUMBER,
2049                               p_payee_party_site_id     NUMBER,
2050                               p_supplier_site_id        NUMBER,
2051                               p_org_id                  NUMBER,
2052                               p_org_type                VARCHAR2,
2053                               p_payment_function        VARCHAR2,
2054                               p_Pay_Proc_Trxn_Type_Code VARCHAR2,
2055                               p_payer_le_id             NUMBER,
2056                               p_payee1                  NUMBER,
2057                               p_payee2                  NUMBER,
2058                               p_payee3                  NUMBER,
2059                               p_payee4                  NUMBER
2060                               )
2061      IS
2062      SELECT
2063          pm.payment_method_code,
2064          m.payment_method_name,
2065          m.support_bills_payable_flag,
2066          m.maturity_date_offset_days
2067      FROM
2068          IBY_EXTERNAL_PAYEES_ALL payee,
2069          IBY_EXT_PARTY_PMT_MTHDS pm,
2070          IBY_PAYMENT_METHODS_VL  m
2071      WHERE
2072      payee.ext_payee_id  IN         (
2073                                     p_payee1,
2074                                     p_payee2,
2075                                     p_payee3,
2076                                     p_payee4
2077                                     )
2078      AND   payee.payment_function = p_payment_function
2079      AND   payee.ext_payee_id     = pm.ext_pmt_party_id
2080      AND   pm.payment_method_code = m.payment_method_code
2081      AND   pm.payment_function    = p_payment_function
2082      AND   pm.primary_flag        = 'Y'
2083      AND   (pm.inactive_date IS NULL OR pm.inactive_date >= trunc(sysdate))
2084      AND   (m.inactive_date IS NULL OR m.inactive_date >= trunc(sysdate))
2085      AND EXISTS (SELECT 1 FROM IBY_APPLICABLE_PMT_MTHDS am1
2086                  WHERE am1.payment_method_code = m.payment_method_code
2087                  AND am1.payment_flow(+) = 'DISBURSEMENTS'
2088                  AND am1.applicable_type_code = 'PAY_PROC_TRXN_TYPE'
2089                  AND (am1.applicable_value_to IS NULL OR
2090                          am1.applicable_value_to=p_pay_proc_trxn_type_code)
2091                  AND (am1.inactive_date IS null OR
2092                          am1.inactive_date >= trunc(sysdate)))
2093      AND EXISTS (SELECT 1 FROM IBY_APPLICABLE_PMT_MTHDS am2
2094                  WHERE am2.payment_method_code = m.payment_method_code
2095                  AND am2.applicable_type_code = 'PAYER_LE'
2096                  AND (am2.applicable_value_to IS NULL OR
2097                          am2.applicable_value_to=p_payer_le_id)
2098                  AND (am2.inactive_date IS NULL OR
2099                          am2.inactive_date >= trunc(sysdate)))
2100      AND EXISTS (SELECT 1 FROM IBY_APPLICABLE_PMT_MTHDS am3
2101                  WHERE am3.payment_method_code = m.payment_method_code
2102                  AND am3.applicable_type_code = 'PAYER_ORG'
2103                  AND (am3.applicable_value_to IS NULL OR
2104                          am3.applicable_value_to=p_org_id)
2105                  AND (am3.inactive_date IS NULL OR
2106                          am3.inactive_date >= trunc(sysdate))
2107                  )
2108      ORDER BY
2109          payee.supplier_site_id,
2110          payee.party_site_id,
2111          payee.org_id
2112      ;
2113 
2114 
2115      CURSOR payee_bankaccount_cur(p_payee_party_id      NUMBER,
2116                                   p_payee_party_site_id NUMBER,
2117                                   p_supplier_site_id    NUMBER,
2118                                   p_payer_org_id        NUMBER,
2119                                   p_payer_org_type      VARCHAR2,
2120                                   p_payment_function    VARCHAR2,
2121                                   p_payment_currency    VARCHAR2) IS
2122      SELECT b.bank_account_name,
2123             b.ext_bank_account_id,
2124             b.bank_account_number,
2125             b.currency_code,
2126             b.iban_number,
2127             b.bank_name,
2128             b.bank_number,
2129             b.bank_branch_name,
2130             b.branch_number,
2131             b.country_code,
2132             b.alternate_account_name,
2133             b.bank_account_type,
2134             b.account_suffix,
2135             b.description,
2136             b.foreign_payment_use_flag,
2137             b.payment_factor_flag,
2138             b.eft_swift_code
2139        FROM IBY_PMT_INSTR_USES_ALL ibyu,
2140             IBY_EXT_BANK_ACCOUNTS_V b,
2141             IBY_EXTERNAL_PAYEES_ALL ibypayee
2142        WHERE ibyu.instrument_id = b.ext_bank_account_id
2143        AND ibyu.instrument_type = 'BANKACCOUNT'
2144        AND (b.currency_code = p_payment_currency
2145             OR b.currency_code is null)
2146        AND ibyu.payment_function = p_payment_function
2147        AND ibyu.ext_pmt_party_id = ibypayee.ext_payee_id
2148        AND ibypayee.payee_party_id = p_payee_party_id
2149        AND trunc(sysdate) between NVL(trunc(ibyu.start_date),trunc(sysdate)) AND
2150                                   NVL(trunc(ibyu.end_date-1),trunc(sysdate))
2151        AND trunc(sysdate) between NVL(trunc(b.start_date),trunc(sysdate)) AND
2152                                   NVL(trunc(b.end_date-1),trunc(sysdate))
2153        AND (ibypayee.party_site_id is NULL OR ibypayee.party_site_id = p_payee_party_site_id)
2154        AND (ibypayee.supplier_site_id is NULL OR ibypayee.supplier_site_id = p_supplier_site_id)
2155        AND (ibypayee.org_id is null
2156             OR (ibypayee.org_id = p_payer_org_id AND ibypayee.org_type = p_payer_org_type) )
2157 
2158        /*
2159         * Fix for bug 5505267:
2160         *
2161         * Add payment flow predicate to improve
2162         * performance.
2163         */
2164        AND ibyu.payment_flow='DISBURSEMENTS'
2165        ORDER by ibypayee.supplier_site_id,
2166                 ibypayee.party_site_id,
2167                 ibypayee.org_id,
2168                 ibyu.order_of_preference;
2169 
2170        CURSOR get_fnd_lookup(p_lookup_type VARCHAR2,
2171                              p_lookup_code VARCHAR2)
2172        IS
2173        SELECT lookup_code,
2174               meaning,
2175               description
2176          FROM FND_LOOKUP_VALUES_VL
2177         WHERE lookup_type = p_lookup_type
2178           AND lookup_code = p_lookup_code
2179           AND (trunc(sysdate) BETWEEN NVL(start_date_active,trunc(sysdate)) AND
2180                                 NVL(end_date_active,trunc(sysdate)));
2181 
2182 BEGIN
2183 
2184     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2185 	    print_debuginfo(l_module_name,'ENTER');
2186 	    print_debuginfo(l_module_name,'Application_id   : '|| p_trxn_attributes_rec.application_id);
2187 	    print_debuginfo(l_module_name,'1st party LE id  : '|| p_trxn_attributes_rec.payer_legal_entity_id);
2188 	    print_debuginfo(l_module_name,'Org Id           : '|| p_trxn_attributes_rec.payer_org_id);
2189 	    print_debuginfo(l_module_name,'Org Type         : '|| p_trxn_attributes_rec.payer_org_type);
2190 	    print_debuginfo(l_module_name,'Payer Id         : '|| p_trxn_attributes_rec.payee_party_id);
2191 	    print_debuginfo(l_module_name,'Payee Site Id    : '|| p_trxn_attributes_rec.payee_party_site_id);
2192 	    print_debuginfo(l_module_name,'Supplier Site Id : '|| p_trxn_attributes_rec.supplier_site_id);
2193 	    print_debuginfo(l_module_name,'Trxn Type Code   : '|| p_trxn_attributes_rec.pay_proc_trxn_type_code);
2194 	    print_debuginfo(l_module_name,'Payment Currency : '|| p_trxn_attributes_rec.payment_currency);
2195 	    print_debuginfo(l_module_name,'Payment Amount   : '|| p_trxn_attributes_rec.payment_amount);
2196 	    print_debuginfo(l_module_name,'Payment Function : '|| p_trxn_attributes_rec.payment_function);
2197 
2198     END IF;
2199    -- Standard call to check for call compatibility.
2200    IF NOT FND_API.Compatible_API_Call (l_api_version,
2201                                        p_api_version,
2202                                        l_api_name,
2203                                        G_PKG_NAME)
2204    THEN
2205       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2206    END IF;
2207 
2208    -- Initialize message list if p_init_msg_list is set to TRUE.
2209    IF FND_API.to_Boolean( p_init_msg_list ) THEN
2210       FND_MSG_PUB.initialize;
2211    END IF;
2212 
2213    --  Initialize API return status to success
2214    x_return_status := FND_API.G_RET_STS_SUCCESS;
2215 
2216 
2217    /*
2218     * Fix for bug 5682499:
2219     *
2220     * Payment methods can be set up at the supplier level or
2221     * the supplier site level.
2222     *
2223     * If no payment method is setup at the supplier site level
2224     * then the payment method at the supplier level should be
2225     * used for defaulting.
2226     *
2227     * This means that we need to pick up two possible ext
2228     * payee ids - one ext payee id with exact context including
2229     * supplier site id, and one ext payee id with partial context
2230     * where supplier site id is null.
2231     *
2232     * The only purpose of the second ext payee id is to pick up
2233     * payment methods that are defaulted at the supplier level.
2234     *
2235     * The where clause below uses the IN syntax to pick up
2236     * these two ext payee ids.
2237     */
2238 
2239    /*
2240     * Update:
2241     *
2242     * We need to pick up all possible ext payee ids based on the
2243     * following chart. This means that there can be upto 4 possible
2244     * ext payee ids in the select statement.
2245     *
2246     *  EXT PARTY ID PRECEDENCE CHART
2247     * -------------------------------------------------------------
2248     *                      |         |         |         |         |
2249     *                      | supp    | org     | party   | party   |
2250     *                      | site    |         | site    |         |
2251     * -------------------------------------------------------------
2252     *                      |         |         |         |         |
2253     *  supp site           |   Y     |   Y     |   Y     |   Y     |
2254     *                      |         |         |         |         |
2255     * -------------------------------------------------------------
2256     *                      |         |         |         |         |
2257     *  party site (org)    |  null   |   Y     |   Y     |   Y     |
2258     *                      |         |         |         |         |
2259     * -------------------------------------------------------------
2260     *                      |         |         |         |         |
2261     *  party site (no org) |  null   |   null  |   Y     |   Y     |
2262     *                      |         |         |         |         |
2263     * -------------------------------------------------------------
2264     *                      |         |         |         |         |
2265     *  party               |  null   |   null  |   null  |   Y     |
2266     *                      |         |         |         |         |
2267     * --------------------------------------------------------------
2268     *
2269     * Y = value provided, null = no value provided
2270     *
2271     * Matching by supp site has the highest precedence
2272     * Matching by party alone has the lowest precedence
2273     *
2274     */
2275 
2276    /*
2277     * exact context:
2278     * supplier site level
2279     */
2280    l_payee1 := IBY_DISBURSE_SUBMIT_PUB_PKG.deriveExactPayeeIdFromContext(
2281                    p_trxn_attributes_rec.Payee_Party_Id,
2282                    p_trxn_attributes_rec.Payee_Party_Site_Id,
2283                    p_trxn_attributes_rec.Supplier_Site_Id,
2284                    p_trxn_attributes_rec.Payer_Org_Id,
2285                    p_trxn_attributes_rec.Payer_Org_Type,
2286                    p_trxn_attributes_rec.Payment_Function
2287                    );
2288 
2289    /*
2290     * partial context:
2291     * party site level with org
2292     */
2293    l_payee2 := IBY_DISBURSE_SUBMIT_PUB_PKG.deriveExactPayeeIdFromContext(
2294                    p_trxn_attributes_rec.Payee_Party_Id,
2295                    p_trxn_attributes_rec.Payee_Party_Site_Id,
2296                    null,
2297                    p_trxn_attributes_rec.Payer_Org_Id,
2298                    p_trxn_attributes_rec.Payer_Org_Type,
2299                    p_trxn_attributes_rec.Payment_Function
2300                    );
2301 
2302 
2303   /*
2304    * partial context:
2305    * party site level without org
2306    */
2307    l_payee3 := IBY_DISBURSE_SUBMIT_PUB_PKG.deriveExactPayeeIdFromContext(
2308                    p_trxn_attributes_rec.Payee_Party_Id,
2309                    p_trxn_attributes_rec.Payee_Party_Site_Id,
2310                    null,
2311                    null,
2312                    null,
2313                    p_trxn_attributes_rec.Payment_Function
2314                    );
2315 
2316 
2317    /*
2318     * partial context:
2319     * party level
2320     */
2321    l_payee4 := IBY_DISBURSE_SUBMIT_PUB_PKG.deriveExactPayeeIdFromContext(
2322                    p_trxn_attributes_rec.Payee_Party_Id,
2323                    null,
2324                    null,
2325                    null,
2326                    null,
2327                    p_trxn_attributes_rec.Payment_Function
2328                    );
2329 
2330 
2331    -- Start of API body
2332     FOR payee_defaults_rec in payee_defaults_curA1(
2333 				p_trxn_attributes_rec.Payee_Party_Id,
2334                                 p_trxn_attributes_rec.Payee_Party_Site_Id,
2335                                 p_trxn_attributes_rec.Supplier_Site_Id,
2336                                 p_trxn_attributes_rec.Payer_Org_Id,
2337                                 p_trxn_attributes_rec.Payer_Org_Type,
2338                                 p_trxn_attributes_rec.payment_function,
2339 				p_trxn_attributes_rec.Pay_Proc_Trxn_Type_Code,
2340 				p_trxn_attributes_rec.payer_legal_entity_id,
2341                                 l_payee1,
2342                                 l_payee2,
2343                                 l_payee3,
2344                                 l_payee4
2345                                 )
2346    LOOP
2347 
2348       -- Payment Format
2349       IF (l_payment_format_rec.Payment_Format_Code is NULL) THEN
2350          l_payment_format_rec.Payment_Format_Name := payee_defaults_rec.format_name;
2351          l_payment_format_rec.Payment_Format_Code :=  payee_defaults_rec.payment_format_code;
2352       END IF;
2353 
2354       -- Payment Reason
2355       IF (l_payment_reason_rec.Code is NULL) THEN
2356   -- bug 4880032
2357          l_payment_reason_rec.Code := payee_defaults_rec.payment_reason_code;
2358          l_payment_reason_rec.Meaning := payee_defaults_rec.payment_reason;
2359          l_payment_reason_rec.Description := payee_defaults_rec.payment_reason_description;
2360           l_payment_reason_rec.Country := payee_defaults_rec.payment_reason_country;
2361       END IF;
2362 
2363 
2364       -- Delivery Channel
2365       IF (l_delivery_channel_rec.Code is NULL) THEN
2366          l_delivery_channel_rec.Code := payee_defaults_rec.delivery_channel_code;
2367          l_delivery_channel_rec.Meaning := payee_defaults_rec.delivery_channel_meaning;
2368          l_delivery_channel_rec.Description := payee_defaults_rec.delivery_channel_description;
2369    l_delivery_channel_rec.Country := payee_defaults_rec.delivery_channel_Country;
2370 
2371       END IF;
2372 
2373       -- Bank Charge Bearer
2374       IF (l_bank_charge_bearer.Code is NULL) THEN
2375          l_bank_charge_bearer.Code := payee_defaults_rec.bank_charge_bearer;
2376 
2377       END IF;
2378 
2379       -- Pay Alone Flag
2380       IF (l_pay_alone is NULL) THEN
2381          l_pay_alone := payee_defaults_rec.exclusive_payment_flag;
2382       END IF;
2383 
2384       -- Payment reason comments
2385 
2386       IF(l_payment_reason_comments is NULL) THEN
2387        l_payment_reason_comments :=payee_defaults_rec.payment_reason_comments;
2388       END IF;
2389 
2390       -- Express Payment Flag
2391       IF (l_settlement_priority.code is NULL) THEN
2392          l_settlement_priority.code := payee_defaults_rec.settlement_priority;
2393       END IF;
2394 
2395    END LOOP;
2396 
2397    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2398 	   print_debuginfo(l_module_name,'Default Payment Format Name    : '|| l_payment_format_rec.Payment_Format_Name);
2399 	   print_debuginfo(l_module_name,'Default Payment Reason Code    : '|| l_payment_reason_rec.Code);
2400 	   print_debuginfo(l_module_name,'Default Delivery Channel Code  : '|| l_delivery_channel_rec.Code);
2401 	   print_debuginfo(l_module_name,'Default Bank Charge Bearer     : '|| l_bank_charge_bearer.Code);
2402 	   print_debuginfo(l_module_name,'Default Exclusive Payment Flag : '|| l_pay_alone);
2403 	   print_debuginfo(l_module_name,'Default Settlement Priority    : '|| l_settlement_priority.code);
2404 	     print_debuginfo(l_module_name,'Default Payment Reason Comments    : '|| l_payment_reason_comments);
2405 
2406      END IF;
2407    -- Start of API body
2408     FOR payee_defaults_rec in payee_defaults_curB1(
2409 				p_trxn_attributes_rec.Payee_Party_Id,
2410                                 p_trxn_attributes_rec.Payee_Party_Site_Id,
2411                                 p_trxn_attributes_rec.Supplier_Site_Id,
2412                                 p_trxn_attributes_rec.Payer_Org_Id,
2413                                 p_trxn_attributes_rec.Payer_Org_Type,
2414                                 p_trxn_attributes_rec.payment_function,
2415 				p_trxn_attributes_rec.Pay_Proc_Trxn_Type_Code,
2416 				p_trxn_attributes_rec.payer_legal_entity_id,
2417                                 l_payee1,
2418                                 l_payee2,
2419                                 l_payee3,
2420                                 l_payee4
2421                                 )
2422    LOOP
2423 
2424       -- Payment Method
2425       IF (l_payment_method_rec.Payment_Method_Name is NULL) THEN
2426          l_payment_method_rec.Payment_Method_Name := payee_defaults_rec.payment_method_name;
2427          l_payment_method_rec.Payment_Method_Code :=  payee_defaults_rec.payment_method_code;
2428          l_payment_method_rec.Bill_Payable_Flag := payee_defaults_rec.support_bills_payable_flag;
2429          l_payment_method_rec.Maturity_Date_Offset :=  payee_defaults_rec.maturity_date_offset_days;
2430       END IF;
2431 
2432    END LOOP;
2433 
2434    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2435 	   print_debuginfo(l_module_name,'Default Payment Method Name    : '|| l_payment_method_rec.Payment_Method_Name);
2436 
2437    END IF;
2438    -- Get Default Bank Charge Bearer record
2439    OPEN get_fnd_lookup(BANK_CHARGE_BEARER_LOOKUP,l_bank_charge_bearer.Code);
2440    FETCH get_fnd_lookup into l_bank_charge_bearer;
2441    CLOSE get_fnd_lookup;
2442 
2443    -- Get Default Express Payment record
2444    OPEN get_fnd_lookup(SETTLEMENT_PRIORITY_LOOKUP,l_settlement_priority.code);
2445    FETCH get_fnd_lookup into l_settlement_priority;
2446    CLOSE get_fnd_lookup;
2447 
2448    -- Change the default payment method according to the override setup
2449    OPEN payee_override_org_cur(p_trxn_attributes_rec.Payer_Org_Id,
2450                                p_trxn_attributes_rec.Payer_Org_Type);
2451    FETCH payee_override_org_cur into l_payee_override_flag;
2452    CLOSE payee_override_org_cur;
2453 
2454    IF (l_payee_override_flag is null) THEN
2455       OPEN payee_override_ent_cur;
2456       FETCH payee_override_ent_cur into l_payee_override_flag;
2457       CLOSE payee_override_ent_cur;
2458    END IF;
2459 
2460    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2461 	   print_debuginfo(l_module_name,'Payee OverRide Flag            : '|| l_payee_override_flag);
2462 
2463    END IF;
2464 /* Bug 6045110: When Allow Payee Override system option is set to 'Y',
2465    but, payment method is not set at supplier or supplier site level,
2466    it is expected that payment method needs to be defaulted from the
2467    defaulting rules.
2468 */
2469    IF (p_ignore_payee_pref = 'Y'
2470        OR (l_payee_override_flag = 'Y' AND l_payment_method_rec.Payment_Method_Code is null)  -- Bug 6045110
2471        OR l_payee_override_flag <> 'Y') THEN
2472       -- Initialize the payment method record as it will be purely rule-based
2473       l_payment_method_rec.Payment_Method_Name := null;
2474       l_payment_method_rec.Payment_Method_Code := null;
2475       l_payment_method_rec.Bill_Payable_Flag := null;
2476       l_payment_method_rec.Maturity_Date_Offset := null;
2477       evaluate_Rule_Based_Default(p_trxn_attributes_rec,l_payment_method_rec);
2478    END IF;
2479 
2480    -- Get Default Payee BankAccount cursor
2481    l_key := p_trxn_attributes_rec.Payee_Party_Id ||'$'|| p_trxn_attributes_rec.Payee_Party_Site_Id ||'$'|| p_trxn_attributes_rec.Supplier_Site_Id ||'$'|| p_trxn_attributes_rec.Payer_Org_Id ||'$'|| p_trxn_attributes_rec.Payer_Org_Type;
2482    l_key := l_key ||'$'|| p_trxn_attributes_rec.Payment_Currency ||'$'|| p_trxn_attributes_rec.Payment_Function;
2483    -- Start of API body.
2484    IF (NOT(t_payee_bankacct_tbl.EXISTS( l_key ))) THEN
2485 
2486    OPEN payee_bankaccount_cur(p_trxn_attributes_rec.Payee_Party_Id,
2487                               p_trxn_attributes_rec.Payee_Party_Site_Id,
2488                               p_trxn_attributes_rec.Supplier_Site_Id,
2489                               p_trxn_attributes_rec.Payer_Org_Id,
2490                               p_trxn_attributes_rec.Payer_Org_Type,
2491                               p_trxn_attributes_rec.Payment_Function,
2492                               p_trxn_attributes_rec.Payment_Currency);
2493    FETCH payee_bankaccount_cur INTO l_payee_bankaccount_rec;
2494    CLOSE payee_bankaccount_cur;
2495               t_payee_bankacct_tbl(l_key).Payee_Party_Id	 :=   p_trxn_attributes_rec.Payee_Party_Id;
2496 	      t_payee_bankacct_tbl(l_key).Payee_Party_Site_Id    :=   p_trxn_attributes_rec.Payee_Party_Site_Id;
2497 	      t_payee_bankacct_tbl(l_key).Supplier_Site_Id       :=   p_trxn_attributes_rec.Payer_Org_Id;
2498 	      t_payee_bankacct_tbl(l_key).Payee_Org_Id           :=   p_trxn_attributes_rec.Payer_Org_Id;
2499 	      t_payee_bankacct_tbl(l_key).Payee_Org_Type         :=   p_trxn_attributes_rec.Payer_Org_Type;
2500 	      t_payee_bankacct_tbl(l_key).Payment_Currency       :=   p_trxn_attributes_rec.Payment_Currency;
2501 	      t_payee_bankacct_tbl(l_key).Payment_Function       :=   p_trxn_attributes_rec.Payment_Function;
2502 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Name := l_payee_bankaccount_rec.Payee_BankAccount_Name;
2503 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Id   := l_payee_bankaccount_rec.Payee_BankAccount_Id  ;
2504 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Num  := l_payee_bankaccount_rec.Payee_BankAccount_Num ;
2505 	      t_payee_bankacct_tbl(l_key).Currency_Code          := l_payee_bankaccount_rec.Currency_Code         ;
2506 	      t_payee_bankacct_tbl(l_key).IBAN                   := l_payee_bankaccount_rec.IBAN                  ;
2507 	      t_payee_bankacct_tbl(l_key).Payee_BankName         := l_payee_bankaccount_rec.Payee_BankName        ;
2508 	      t_payee_bankacct_tbl(l_key).Payee_BankNumber       := l_payee_bankaccount_rec.Payee_BankNumber      ;
2509 	      t_payee_bankacct_tbl(l_key).Payee_BranchName       := l_payee_bankaccount_rec.Payee_BranchName      ;
2510 	      t_payee_bankacct_tbl(l_key).Payee_BranchNumber     := l_payee_bankaccount_rec.Payee_BranchNumber    ;
2511 	      t_payee_bankacct_tbl(l_key).Bank_Country           := l_payee_bankaccount_rec.Bank_Country          ;
2512 	      t_payee_bankacct_tbl(l_key).Alter_BankAccount_Name := l_payee_bankaccount_rec.Alter_BankAccount_Name;
2513 	      t_payee_bankacct_tbl(l_key).BankAccount_Type       := l_payee_bankaccount_rec.BankAccount_Type      ;
2514 	      t_payee_bankacct_tbl(l_key).BankAccount_Suffix     := l_payee_bankaccount_rec.BankAccount_Suffix    ;
2515 	      t_payee_bankacct_tbl(l_key).BankAccount_Desc       := l_payee_bankaccount_rec.BankAccount_Desc      ;
2516 	      t_payee_bankacct_tbl(l_key).Foreign_PayUse_Flag    := l_payee_bankaccount_rec.Foreign_PayUse_Flag   ;
2517 	      t_payee_bankacct_tbl(l_key).Pay_Factor_Flag        := l_payee_bankaccount_rec.Pay_Factor_Flag       ;
2518 	      t_payee_bankacct_tbl(l_key).EFT_Swift_Code         := l_payee_bankaccount_rec.EFT_Swift_Code        ;
2519 
2520    ELSE
2521               l_payee_bankaccount_rec.Payee_BankAccount_Name := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Name;
2522 	      l_payee_bankaccount_rec.Payee_BankAccount_Id   := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Id  ;
2523 	      l_payee_bankaccount_rec.Payee_BankAccount_Num  := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Num ;
2524 	      l_payee_bankaccount_rec.Currency_Code          := t_payee_bankacct_tbl(l_key).Currency_Code         ;
2525 	      l_payee_bankaccount_rec.IBAN                   := t_payee_bankacct_tbl(l_key).IBAN                  ;
2526 	      l_payee_bankaccount_rec.Payee_BankName         := t_payee_bankacct_tbl(l_key).Payee_BankName        ;
2527 	      l_payee_bankaccount_rec.Payee_BankNumber       := t_payee_bankacct_tbl(l_key).Payee_BankNumber      ;
2528 	      l_payee_bankaccount_rec.Payee_BranchName       := t_payee_bankacct_tbl(l_key).Payee_BranchName      ;
2529 	      l_payee_bankaccount_rec.Payee_BranchNumber     := t_payee_bankacct_tbl(l_key).Payee_BranchNumber    ;
2530 	      l_payee_bankaccount_rec.Bank_Country           := t_payee_bankacct_tbl(l_key).Bank_Country          ;
2531 	      l_payee_bankaccount_rec.Alter_BankAccount_Name := t_payee_bankacct_tbl(l_key).Alter_BankAccount_Name;
2532 	      l_payee_bankaccount_rec.BankAccount_Type       := t_payee_bankacct_tbl(l_key).BankAccount_Type      ;
2533 	      l_payee_bankaccount_rec.BankAccount_Suffix     := t_payee_bankacct_tbl(l_key).BankAccount_Suffix    ;
2534 	      l_payee_bankaccount_rec.BankAccount_Desc       := t_payee_bankacct_tbl(l_key).BankAccount_Desc      ;
2535 	      l_payee_bankaccount_rec.Foreign_PayUse_Flag    := t_payee_bankacct_tbl(l_key).Foreign_PayUse_Flag   ;
2536 	      l_payee_bankaccount_rec.Pay_Factor_Flag        := t_payee_bankacct_tbl(l_key).Pay_Factor_Flag       ;
2537 	      l_payee_bankaccount_rec.EFT_Swift_Code         := t_payee_bankacct_tbl(l_key).EFT_Swift_Code        ;
2538    END IF;
2539 
2540    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2541 	   print_debuginfo(l_module_name,'Default payee bank account     : '|| l_payee_bankaccount_rec.Payee_BankAccount_Name);
2542 
2543    END IF;
2544    -- Assign to ouput nested record structure
2545    x_default_pmt_attrs_rec.Payment_Method := l_payment_method_rec;
2546    x_default_pmt_attrs_rec.Payment_Format := l_payment_format_rec;
2547    x_default_pmt_attrs_rec.Payee_BankAccount := l_payee_bankaccount_rec;
2548    x_default_pmt_attrs_rec.Payment_Reason := l_payment_reason_rec;
2549    x_default_pmt_attrs_rec.Delivery_Channel := l_delivery_channel_rec;
2550    x_default_pmt_attrs_rec.Bank_Charge_Bearer := l_bank_charge_bearer;
2551    x_default_pmt_attrs_rec.Pay_Alone := l_pay_alone;
2552    x_default_pmt_attrs_rec.Settlement_Priority := l_settlement_priority;
2553    x_default_pmt_attrs_rec.payment_reason_comments :=l_payment_reason_comments;
2554    -- End of API body.
2555 
2556    -- Standard call to get message count and if count is 1, get message info.
2557    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2558                              p_data => x_msg_data);
2559 
2560    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2561 	   print_debuginfo(l_module_name, 'RETURN');
2562 
2563    END IF;
2564 EXCEPTION
2565     WHEN FND_API.G_EXC_ERROR THEN
2566        x_return_status := FND_API.G_RET_STS_ERROR ;
2567        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2568 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2569 	       print_debuginfo(l_module_name,'SQLerr is :'
2570 	                           || substr(SQLERRM, 1, 150));
2571        END IF;
2572        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2573                                  p_data => x_msg_data);
2574 
2575     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2576        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2577        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2578 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2579 	       print_debuginfo(l_module_name,'SQLerr is :'
2580 	                           || substr(SQLERRM, 1, 150));
2581        END IF;
2582        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2583                                  p_data => x_msg_data);
2584 
2585     WHEN OTHERS THEN
2586        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2587        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2588 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2589 	       print_debuginfo(l_module_name,'SQLerr is :'
2590 	                           || substr(SQLERRM, 1, 150));
2591        END IF;
2592        IF (FND_MSG_PUB.Check_Msg_Level
2593           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
2594           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
2595                                   l_api_name);
2596        END IF;
2597        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2598                                  p_data => x_msg_data);
2599 
2600 END Get_Default_Payment_Attributes;
2601 
2602 -- Start of comments
2603 --   API name     : Get_Default_Payee_Bank_Acc
2604 --   Type         : Public
2605 --   Pre-reqs     : None.
2606 --   Function     : get the default payee bank account attributes.
2607 --   Parameters   :
2608 --   IN           :   p_api_version              IN  NUMBER   Required
2609 --                    p_init_msg_list            IN  VARCHAR2 Optional
2610 --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type Required
2611 --   OUT          :   x_return_status            OUT VARCHAR2 Required
2612 --                    x_msg_count                OUT NUMBER   Required
2613 --                    x_msg_data                 OUT VARCHAR2 Required
2614 --                    x_payee_bankaccount        OUT Payee_BankAccount_Rec_Type Required
2615 --
2616 --   Version   : Current version   1.0
2617 --               Previous version   None
2618 --               Initial version    1.0
2619 -- End of comments
2620 
2621 PROCEDURE Get_Default_Payee_Bank_Acc(
2622     p_api_version             IN   NUMBER,
2623     p_init_msg_list           IN   VARCHAR2 default FND_API.G_FALSE,
2624     p_trxn_attributes_rec     IN   Trxn_Attributes_Rec_Type,
2625     x_return_status           OUT  NOCOPY VARCHAR2,
2626     x_msg_count               OUT  NOCOPY NUMBER,
2627     x_msg_data                OUT  NOCOPY VARCHAR2,
2628     x_payee_bankaccount       OUT  NOCOPY Payee_BankAccount_Rec_Type
2629 )
2630 IS
2631    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Default_Payee_Bank_Acc';
2632    l_api_version        CONSTANT NUMBER         := 1.0;
2633    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Default_Payee_Bank_Acc';
2634 
2635    l_payee_bankaccount_rec Payee_BankAccount_Rec_Type;
2636    l_key                         VARCHAR2(2000);
2637 
2638    CURSOR payee_bankaccount_cur(p_payee_party_id VARCHAR2,
2639                                 p_payee_party_site_id VARCHAR2,
2640 				p_supplier_site_id VARCHAR2,
2641                                 p_payer_org_id NUMBER,
2642                                 p_payer_org_type VARCHAR2,
2643                                 p_payment_function VARCHAR2,
2644                                 p_payment_currency  VARCHAR2)
2645      IS
2646      SELECT b.bank_account_name,
2647             b.ext_bank_account_id,
2648             b.bank_account_number,
2649             b.currency_code,
2650             b.iban_number,
2651             b.bank_name,
2652             b.bank_number,
2653             b.bank_branch_name,
2654             b.branch_number,
2655             b.country_code,
2656             b.alternate_account_name,
2657             b.bank_account_type,
2658             b.account_suffix,
2659             b.description,
2660             b.foreign_payment_use_flag,
2661             b.payment_factor_flag,
2662             b.eft_swift_code
2663        FROM IBY_PMT_INSTR_USES_ALL ibyu,
2664             IBY_EXT_BANK_ACCOUNTS_V b,
2665             IBY_EXTERNAL_PAYEES_ALL ibypayee
2666        WHERE ibyu.instrument_id = b.ext_bank_account_id
2667        AND ibyu.instrument_type = 'BANKACCOUNT'
2668        AND (b.currency_code = p_payment_currency
2669             OR b.currency_code is null)
2670        AND ibyu.payment_function = p_payment_function
2671        AND ibyu.ext_pmt_party_id = ibypayee.ext_payee_id
2672        AND ibypayee.payee_party_id = p_payee_party_id
2673        AND trunc(sysdate) between NVL(ibyu.start_date,trunc(sysdate)) AND
2674                                   NVL(ibyu.end_date-1,trunc(sysdate))
2675        AND trunc(sysdate) between NVL(b.start_date,trunc(sysdate)) AND
2676                                   NVL(b.end_date-1,trunc(sysdate))
2677        AND (ibypayee.party_site_id is null
2678             OR ibypayee.party_site_id = p_payee_party_site_id)
2679        AND (ibypayee.supplier_site_id is NULL OR ibypayee.supplier_site_id = p_supplier_site_id) --Bug 9194531
2680        AND (ibypayee.org_id is null
2681             OR (ibypayee.org_id = p_payer_org_id AND ibypayee.org_type = p_payer_org_type) )
2682        AND ibyu.payment_flow='DISBURSEMENTS'
2683        ORDER by ibypayee.supplier_site_id,
2684                 ibypayee.party_site_id,
2685                 ibypayee.org_id,
2686                 ibyu.order_of_preference;
2687 
2688 BEGIN
2689 
2690     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2691 	    print_debuginfo(l_module_name,'ENTER');
2692 	    print_debuginfo(l_module_name,'Application_id   : '|| p_trxn_attributes_rec.application_id);
2693 	    print_debuginfo(l_module_name,'Org Id           : '|| p_trxn_attributes_rec.payer_org_id);
2694 	    print_debuginfo(l_module_name,'Org Type         : '|| p_trxn_attributes_rec.payer_org_type);
2695 	    print_debuginfo(l_module_name,'Payee Id         : '|| p_trxn_attributes_rec.payee_party_id);
2696 	    print_debuginfo(l_module_name,'Payee Site Id    : '|| p_trxn_attributes_rec.payee_party_site_id);
2697     	    print_debuginfo(l_module_name,'Supplier Site ID : '|| p_trxn_attributes_rec.Supplier_Site_Id);
2698 	    print_debuginfo(l_module_name,'Payment Currency : '|| p_trxn_attributes_rec.payment_currency);
2699 	    print_debuginfo(l_module_name,'Payment Function : '|| p_trxn_attributes_rec.payment_function);
2700 
2701     END IF;
2702    -- Standard call to check for call compatibility.
2703    IF NOT FND_API.Compatible_API_Call (l_api_version,
2704                                        p_api_version,
2705                                        l_api_name,
2706                                        G_PKG_NAME)
2707    THEN
2708       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2709    END IF;
2710 
2711    -- Initialize message list if p_init_msg_list is set to TRUE.
2712    IF FND_API.to_Boolean( p_init_msg_list ) THEN
2713       FND_MSG_PUB.initialize;
2714    END IF;
2715 
2716    --  Initialize API return status to success
2717    x_return_status := FND_API.G_RET_STS_SUCCESS;
2718 
2719    l_key := p_trxn_attributes_rec.Payee_Party_Id ||'$'|| p_trxn_attributes_rec.Payee_Party_Site_Id ||'$'|| p_trxn_attributes_rec.Supplier_Site_Id ||'$'|| p_trxn_attributes_rec.Payer_Org_Id ||'$'|| p_trxn_attributes_rec.Payer_Org_Type;
2720    l_key := l_key ||'$'|| p_trxn_attributes_rec.Payment_Currency ||'$'|| p_trxn_attributes_rec.Payment_Function;
2721    -- Start of API body.
2722    IF (NOT(t_payee_bankacct_tbl.EXISTS( l_key ))) THEN
2723 
2724    OPEN payee_bankaccount_cur(p_trxn_attributes_rec.Payee_Party_Id,
2725                               p_trxn_attributes_rec.Payee_Party_Site_Id,
2726 			      p_trxn_attributes_rec.Supplier_Site_Id,
2727                               p_trxn_attributes_rec.Payer_Org_Id,
2728                               p_trxn_attributes_rec.Payer_Org_Type,
2729                               p_trxn_attributes_rec.Payment_Function,
2730                               p_trxn_attributes_rec.Payment_Currency);
2731    FETCH payee_bankaccount_cur INTO l_payee_bankaccount_rec;
2732    CLOSE payee_bankaccount_cur;
2733 
2734               t_payee_bankacct_tbl(l_key).Payee_Party_Id	 :=   p_trxn_attributes_rec.Payee_Party_Id;
2735 	      t_payee_bankacct_tbl(l_key).Payee_Party_Site_Id    :=   p_trxn_attributes_rec.Payee_Party_Site_Id;
2736 	      t_payee_bankacct_tbl(l_key).Supplier_Site_Id       :=   p_trxn_attributes_rec.Payer_Org_Id;
2737 	      t_payee_bankacct_tbl(l_key).Payee_Org_Id           :=   p_trxn_attributes_rec.Payer_Org_Id;
2738 	      t_payee_bankacct_tbl(l_key).Payee_Org_Type         :=   p_trxn_attributes_rec.Payer_Org_Type;
2739 	      t_payee_bankacct_tbl(l_key).Payment_Currency       :=   p_trxn_attributes_rec.Payment_Currency;
2740 	      t_payee_bankacct_tbl(l_key).Payment_Function       :=   p_trxn_attributes_rec.Payment_Function;
2741 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Name := l_payee_bankaccount_rec.Payee_BankAccount_Name;
2742 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Id   := l_payee_bankaccount_rec.Payee_BankAccount_Id  ;
2743 	      t_payee_bankacct_tbl(l_key).Payee_BankAccount_Num  := l_payee_bankaccount_rec.Payee_BankAccount_Num ;
2744 	      t_payee_bankacct_tbl(l_key).Currency_Code          := l_payee_bankaccount_rec.Currency_Code         ;
2745 	      t_payee_bankacct_tbl(l_key).IBAN                   := l_payee_bankaccount_rec.IBAN                  ;
2746 	      t_payee_bankacct_tbl(l_key).Payee_BankName         := l_payee_bankaccount_rec.Payee_BankName        ;
2747 	      t_payee_bankacct_tbl(l_key).Payee_BankNumber       := l_payee_bankaccount_rec.Payee_BankNumber      ;
2748 	      t_payee_bankacct_tbl(l_key).Payee_BranchName       := l_payee_bankaccount_rec.Payee_BranchName      ;
2749 	      t_payee_bankacct_tbl(l_key).Payee_BranchNumber     := l_payee_bankaccount_rec.Payee_BranchNumber    ;
2750 	      t_payee_bankacct_tbl(l_key).Bank_Country           := l_payee_bankaccount_rec.Bank_Country          ;
2751 	      t_payee_bankacct_tbl(l_key).Alter_BankAccount_Name := l_payee_bankaccount_rec.Alter_BankAccount_Name;
2752 	      t_payee_bankacct_tbl(l_key).BankAccount_Type       := l_payee_bankaccount_rec.BankAccount_Type      ;
2753 	      t_payee_bankacct_tbl(l_key).BankAccount_Suffix     := l_payee_bankaccount_rec.BankAccount_Suffix    ;
2754 	      t_payee_bankacct_tbl(l_key).BankAccount_Desc       := l_payee_bankaccount_rec.BankAccount_Desc      ;
2755 	      t_payee_bankacct_tbl(l_key).Foreign_PayUse_Flag    := l_payee_bankaccount_rec.Foreign_PayUse_Flag   ;
2756 	      t_payee_bankacct_tbl(l_key).Pay_Factor_Flag        := l_payee_bankaccount_rec.Pay_Factor_Flag       ;
2757 	      t_payee_bankacct_tbl(l_key).EFT_Swift_Code         := l_payee_bankaccount_rec.EFT_Swift_Code        ;
2758 
2759    ELSE
2760               l_payee_bankaccount_rec.Payee_BankAccount_Name := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Name;
2761 	      l_payee_bankaccount_rec.Payee_BankAccount_Id   := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Id  ;
2762 	      l_payee_bankaccount_rec.Payee_BankAccount_Num  := t_payee_bankacct_tbl(l_key).Payee_BankAccount_Num ;
2763 	      l_payee_bankaccount_rec.Currency_Code          := t_payee_bankacct_tbl(l_key).Currency_Code         ;
2764 	      l_payee_bankaccount_rec.IBAN                   := t_payee_bankacct_tbl(l_key).IBAN                  ;
2765 	      l_payee_bankaccount_rec.Payee_BankName         := t_payee_bankacct_tbl(l_key).Payee_BankName        ;
2766 	      l_payee_bankaccount_rec.Payee_BankNumber       := t_payee_bankacct_tbl(l_key).Payee_BankNumber      ;
2767 	      l_payee_bankaccount_rec.Payee_BranchName       := t_payee_bankacct_tbl(l_key).Payee_BranchName      ;
2768 	      l_payee_bankaccount_rec.Payee_BranchNumber     := t_payee_bankacct_tbl(l_key).Payee_BranchNumber    ;
2769 	      l_payee_bankaccount_rec.Bank_Country           := t_payee_bankacct_tbl(l_key).Bank_Country          ;
2770 	      l_payee_bankaccount_rec.Alter_BankAccount_Name := t_payee_bankacct_tbl(l_key).Alter_BankAccount_Name;
2771 	      l_payee_bankaccount_rec.BankAccount_Type       := t_payee_bankacct_tbl(l_key).BankAccount_Type      ;
2772 	      l_payee_bankaccount_rec.BankAccount_Suffix     := t_payee_bankacct_tbl(l_key).BankAccount_Suffix    ;
2773 	      l_payee_bankaccount_rec.BankAccount_Desc       := t_payee_bankacct_tbl(l_key).BankAccount_Desc      ;
2774 	      l_payee_bankaccount_rec.Foreign_PayUse_Flag    := t_payee_bankacct_tbl(l_key).Foreign_PayUse_Flag   ;
2775 	      l_payee_bankaccount_rec.Pay_Factor_Flag        := t_payee_bankacct_tbl(l_key).Pay_Factor_Flag       ;
2776 	      l_payee_bankaccount_rec.EFT_Swift_Code         := t_payee_bankacct_tbl(l_key).EFT_Swift_Code        ;
2777    END IF;
2778 
2779    x_payee_bankaccount := l_payee_bankaccount_rec;
2780    -- End of API body.
2781 
2782    -- Standard call to get message count and if count is 1, get message info.
2783    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2784                              p_data => x_msg_data);
2785 
2786    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2787 	   print_debuginfo(l_module_name, 'RETURN');
2788 
2789    END IF;
2790 EXCEPTION
2791     WHEN FND_API.G_EXC_ERROR THEN
2792        x_return_status := FND_API.G_RET_STS_ERROR ;
2793        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2794 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2795 	       print_debuginfo(l_module_name,'SQLerr is :'
2796 	                           || substr(SQLERRM, 1, 150));
2797        END IF;
2798        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2799                                  p_data => x_msg_data);
2800 
2801     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2802        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2803        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2804 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2805 	       print_debuginfo(l_module_name,'SQLerr is :'
2806 	                           || substr(SQLERRM, 1, 150));
2807        END IF;
2808        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2809                                  p_data => x_msg_data);
2810 
2811     WHEN OTHERS THEN
2812        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2813        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2814 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2815 	       print_debuginfo(l_module_name,'SQLerr is :'
2816 	                           || substr(SQLERRM, 1, 150));
2817        END IF;
2818        IF (FND_MSG_PUB.Check_Msg_Level
2819           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
2820           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
2821                                   l_api_name);
2822        END IF;
2823        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2824                                  p_data => x_msg_data);
2825 
2826 END Get_Default_Payee_Bank_Acc;
2827 
2828 -- Start of comments
2829 --   API name     : Get_Payment_Field_Properties
2830 --   Type         : Public
2831 --   Pre-reqs     : None.
2832 --   Function     : get the list of applicable Payment attributes.
2833 --   Parameters   :
2834 --   IN           :   p_api_version              IN  NUMBER   Required
2835 --                    p_application_id           IN  NUMBER   Required
2836 --                    p_init_msg_list            IN  VARCHAR2 Optional
2837 --                    p_validation_level         IN  NUMBER   Optional
2838 --                    p_payment_method_id        IN  BY_PAYMENT_METHODS_VL.payment_method_id%TYPE Required
2839 --   OUT          :   x_return_status            OUT VARCHAR2 Required
2840 --                    x_msg_count                OUT NUMBER   Required
2841 --                    x_msg_data                 OUT VARCHAR2 Required
2842 --                    x_Payment_Field_Properties OUT Payment_Field_Properties_Rec_Type Required
2843 --
2844 --   Version   : Current version   1.0
2845 --                      Previous version   None
2846 --                      Initial version    1.0
2847 -- End of comments
2848 
2849 PROCEDURE Get_Payment_Field_Properties (
2850      p_api_version              IN   NUMBER,
2851      p_init_msg_list            IN   VARCHAR2 default FND_API.G_FALSE,
2852      p_payment_method_id        IN
2853                         IBY_PAYMENT_METHODS_VL.payment_method_code%TYPE,
2854      x_return_status            OUT  NOCOPY VARCHAR2,
2855      x_msg_count                OUT  NOCOPY NUMBER,
2856      x_msg_data                 OUT  NOCOPY VARCHAR2,
2857      x_Payment_Field_Properties OUT  NOCOPY Applicable_Pmt_Attrs_Rec_Type
2858 )
2859 IS
2860    l_api_name         CONSTANT VARCHAR2(30)   := 'Get_Payment_Field_Properties';
2861    l_api_version      CONSTANT NUMBER         := 1.0;
2862    l_module_name      CONSTANT VARCHAR2(200)  := G_PKG_NAME || '.Get_Payment_Field_Properties';
2863 
2864    l_Payment_Field_Properties Applicable_Pmt_Attrs_Rec_Type;
2865 
2866    cursor pmt_field_prop_csr(p_payment_method_code varchar2)
2867    IS
2868    SELECT payment_reason_comnt_apl_flag,
2869           remittance_message1_apl_flag,
2870           remittance_message2_apl_flag,
2871           remittance_message3_apl_flag,
2872 
2873           unique_remittance_id_apl_flag,
2874           uri_check_digit_apl_flag,
2875           payment_format_apl_flag,
2876            delivery_channel_apl_flag,
2877           bank_charge_bearer_apl_flag,
2878           settlement_priority_apl_flag,
2879           payment_reason_apl_flag,
2880           external_bank_acct_apl_flag,
2881           exclusive_pmt_apl_flag,
2882           inactive_date
2883    FROM IBY_PAYMENT_METHODS_B
2884    WHERE payment_method_code = p_payment_method_code;
2885 
2886 BEGIN
2887 
2888    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2889 	   print_debuginfo(l_module_name, 'ENTER');
2890 	   print_debuginfo(l_module_name,'Payment Method Id : '|| p_payment_method_id);
2891 
2892    END IF;
2893    -- Standard call to check for call compatibility.
2894    IF NOT FND_API.Compatible_API_Call (l_api_version,
2895                                        p_api_version,
2896                                        l_api_name,
2897                                        G_PKG_NAME) THEN
2898       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2899    END IF;
2900 
2901    -- Initialize message list if p_init_msg_list is set to TRUE.
2902    IF FND_API.to_Boolean( p_init_msg_list ) THEN
2903       FND_MSG_PUB.initialize;
2904    END IF;
2905 
2906    --  Initialize API return status to success
2907    x_return_status := FND_API.G_RET_STS_SUCCESS;
2908  --  print_debuginfo(l_module_name,'Before fetch');
2909    OPEN pmt_field_prop_csr(p_payment_method_id);
2910    FETCH pmt_field_prop_csr INTO l_Payment_Field_Properties;
2911 
2912     --    print_debuginfo(l_module_name,'After fetch');
2913    IF (trunc(sysdate) < NVL(l_Payment_Field_Properties.inactive_date, trunc(sysdate))) THEN
2914       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2915 	      print_debuginfo(l_module_name,'Error: Payment Method is inactive.');
2916       END IF;
2917       FND_MESSAGE.set_name('IBY', 'IBY_INACTIVE_ATTRIBUTE');
2918       FND_MESSAGE.SET_TOKEN('PARAM', 'Payment Method');
2919       FND_MSG_PUB.Add;
2920       RAISE FND_API.G_EXC_ERROR;
2921    ELSE
2922       x_Payment_Field_Properties := l_Payment_Field_Properties;
2923    END IF;
2924 
2925    CLOSE pmt_field_prop_csr;
2926 
2927    -- End of API body.
2928 
2929    -- Standard call to get message count and if count is 1, get message info.
2930    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2931                              p_data => x_msg_data);
2932 
2933    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2934 	   print_debuginfo(l_module_name, 'RETURN');
2935    END IF;
2936  EXCEPTION
2937     WHEN FND_API.G_EXC_ERROR THEN
2938        x_return_status := FND_API.G_RET_STS_ERROR ;
2939        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2940 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2941 	       print_debuginfo(l_module_name,'SQLerr is :'
2942 	                           || substr(SQLERRM, 1, 150));
2943        END IF;
2944        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2945                                  p_data => x_msg_data);
2946 
2947     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2948        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2949        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2950 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2951 	       print_debuginfo(l_module_name,'SQLerr is :'
2952 	                           || substr(SQLERRM, 1, 150));
2953        END IF;
2954        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2955                                  p_data => x_msg_data);
2956 
2957     WHEN OTHERS THEN
2958        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
2959        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2960 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
2961 	       print_debuginfo(l_module_name,'SQLerr is :'
2962 	                           || substr(SQLERRM, 1, 150));
2963        END IF;
2964        IF (FND_MSG_PUB.Check_Msg_Level
2965           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
2966           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
2967                                   l_api_name);
2968        END IF;
2969        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2970                                  p_data => x_msg_data);
2971 
2972 END Get_Payment_Field_Properties;
2973 
2974 
2975 -- Start of comments
2976 --   API name     : ValidateDocument
2977 --   Type         : Public
2978 --   Pre-reqs     : None.
2979 --   Function     : validates the documents in the global temporary table
2980 --                  IBY_DOCUMENTS_PAYABLE_GT
2981 --   Parameters   :
2982 --   IN           :   p_api_version              IN  NUMBER   Required
2983 --                    p_application_id           IN  NUMBER   Required
2984 --                    p_init_msg_list            IN  VARCHAR2 Optional
2985 --                    p_validation_level         IN  NUMBER   Optional
2986 --
2987 --   OUT          :   x_return_status            OUT VARCHAR2 Required
2988 --                    x_msg_count                OUT NUMBER   Required
2989 --                    x_msg_data                 OUT VARCHAR2 Required
2990 --
2991 --
2992 --   Version   : Current version   1.0
2993 --                      Previous version   None
2994 --                      Initial version    1.0
2995 -- End of comments
2996 
2997 PROCEDURE Validate_Documents(
2998      p_api_version              IN   NUMBER,
2999      p_init_msg_list            IN   VARCHAR2 default FND_API.G_FALSE,
3000      p_document_id              IN   IBY_DOCS_PAYABLE_ALL.document_payable_id%TYPE,
3001      x_return_status            OUT  NOCOPY VARCHAR2,
3002      x_msg_count                OUT  NOCOPY NUMBER,
3003      x_msg_data                 OUT  NOCOPY VARCHAR2
3004 )
3005 IS
3006    l_api_name         CONSTANT VARCHAR2(30)   := 'ValidateDocument';
3007    l_api_version      CONSTANT NUMBER         := 1.0;
3008    l_module_name      CONSTANT VARCHAR2(200)  := G_PKG_NAME || '.ValidateDocument';
3009 
3010    l_return_status    VARCHAR2(10);
3011 
3012 BEGIN
3013 
3014     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3015 	    print_debuginfo(l_module_name, 'ENTER');
3016 
3017     END IF;
3018    -- Standard call to check for call compatibility.
3019    IF NOT FND_API.Compatible_API_Call (l_api_version,
3020                                        p_api_version,
3021                                        l_api_name,
3022                                        G_PKG_NAME)
3023    THEN
3024       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3025    END IF;
3026 
3027    -- Initialize message list if p_init_msg_list is set to TRUE.
3028    IF FND_API.to_Boolean( p_init_msg_list ) THEN
3029       FND_MSG_PUB.initialize;
3030    END IF;
3031 
3032    --  Initialize API return status to success
3033    x_return_status := FND_API.G_RET_STS_SUCCESS;
3034 
3035    -- Start of API body.
3036 
3037    IBY_VALIDATIONSETS_PUB.performOnlineValidations(p_document_id,l_return_status);
3038 
3039    IF (l_return_status = -1) THEN
3040        x_return_status := FND_API.G_RET_STS_ERROR;
3041    ELSE
3042        x_return_status := FND_API.G_RET_STS_SUCCESS;
3043    END IF;
3044 
3045    -- End of API body.
3046 
3047    -- Standard call to get message count and if count is 1, get message info.
3048    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3049                              p_data => x_msg_data);
3050 
3051    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3052 	   print_debuginfo(l_module_name, 'RETURN');
3053 
3054    END IF;
3055 EXCEPTION
3056     WHEN FND_API.G_EXC_ERROR THEN
3057        x_return_status := FND_API.G_RET_STS_ERROR ;
3058        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3059 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3060 	       print_debuginfo(l_module_name,'SQLerr is :'
3061 	                           || substr(SQLERRM, 1, 150));
3062        END IF;
3063        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3064                                  p_data => x_msg_data);
3065 
3066     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3067        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3068        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3069 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3070 	       print_debuginfo(l_module_name,'SQLerr is :'
3071 	                           || substr(SQLERRM, 1, 150));
3072        END IF;
3073        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3074                                  p_data => x_msg_data);
3075 
3076     WHEN OTHERS THEN
3077        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
3078        IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3079 	       print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3080 	       print_debuginfo(l_module_name,'SQLerr is :'
3081 	                           || substr(SQLERRM, 1, 150));
3082        END IF;
3083        IF (FND_MSG_PUB.Check_Msg_Level
3084           (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
3085           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
3086                                   l_api_name);
3087        END IF;
3088        FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3089                                  p_data => x_msg_data);
3090 
3091 END Validate_Documents;
3092 
3093 --
3094 --
3095 --
3096 
3097 Procedure evaluate_Rule_Based_Default(
3098                    p_trxn_attributes   IN   Trxn_Attributes_Rec_Type,
3099                    x_pmt_method_rec    IN OUT  NOCOPY Payment_Method_Rec_Type)
3100 IS
3101 
3102   l_module_name      CONSTANT VARCHAR2(200) := G_PKG_NAME || '.Evaluate_Rule_Based_Default';
3103 
3104   l_payer_le_flag             BOOLEAN      := FALSE;
3105   l_payer_org_flag            BOOLEAN      := FALSE;
3106   l_trxn_type_flag            BOOLEAN      := FALSE;
3107   l_currency_flag             BOOLEAN      := FALSE;
3108   l_cross_border_flag         BOOLEAN      := FALSE;
3109   l_pmt_amount_flag           BOOLEAN      := FALSE;
3110 
3111   l_match                     BOOLEAN      := FALSE;
3112 
3113   -- the cummulative flags for each driver type
3114   l_cumm_payer_le_match       BOOLEAN      := TRUE;
3115   l_cumm_payer_org_match      BOOLEAN      := TRUE;
3116   l_cumm_trxn_type_match      BOOLEAN      := TRUE;
3117   l_cumm_currency_match       BOOLEAN      := TRUE;
3118   l_cumm_cross_border_match   BOOLEAN      := TRUE;
3119   l_cumm_pmt_amount_match     BOOLEAN      := TRUE;
3120 
3121 
3122   l_payer_country               VARCHAR2(30);
3123   l_payee_country               VARCHAR2(30);
3124   l_accounting_curr             VARCHAR2(30);
3125 
3126     -- Pick up all rules for active payment methods.
3127 CURSOR DefaultingRules_csr( p_application_id NUMBER,
3128 			        p_pay_proc_trxn_type VARCHAR2,
3129 				p_payer_le_id NUMBER,
3130 				p_payer_org_id NUMBER)
3131     IS
3132       SELECT ibypmtrules.payment_rule_id,
3133              ibypmtmthds.payment_method_code,
3134              ibypmtmthds.payment_method_name,
3135              ibypmtmthds.support_bills_payable_flag,
3136              ibypmtmthds.maturity_date_offset_days
3137       FROM  IBY_PAYMENT_RULES ibypmtrules,
3138             IBY_PAYMENT_METHODS_VL ibypmtmthds,
3139 	    IBY_APPLICABLE_PMT_MTHDS am1,
3140 	    IBY_APPLICABLE_PMT_MTHDS am2,
3141 	    IBY_APPLICABLE_PMT_MTHDS am3
3142       WHERE ibypmtrules.payment_method_code = ibypmtmthds.payment_method_code
3143       AND   ibypmtrules.application_id = p_application_id
3144       AND   NVL(ibypmtmthds.inactive_date,trunc(sysdate)) >= trunc(sysdate)
3145       AND   am1.payment_method_code=ibypmtmthds.payment_method_code
3146       AND   am1.applicable_type_code='PAY_PROC_TRXN_TYPE'
3147       AND   am1.application_id= p_application_id
3148       AND   (am1.applicable_value_to is null or
3149 		am1.applicable_value_to=p_pay_proc_trxn_type)
3150       AND   am2.payment_method_code=am1.payment_method_code
3151       AND   am2.applicable_type_code='PAYER_LE'
3152       AND   am2.application_id= p_application_id
3153       AND   (am2.applicable_value_to is null or
3154 		am2.applicable_value_to=p_payer_le_id)
3155       AND   am3.payment_method_code=am2.payment_method_code
3156       AND   am3.applicable_type_code='PAYER_ORG'
3157       AND   am3.application_id= p_application_id
3158       AND   (am3.applicable_value_to is null or
3159 		am3.applicable_value_to=p_payer_org_id)
3160       ORDER BY ibypmtrules.payment_rule_priority;
3161 
3162 
3163      -- Pick up all conditions for a given payment rule.
3164     CURSOR DefaultingCondt_csr(p_payment_rule_id NUMBER)
3165     IS
3166       SELECT rule_condition_type_code,
3167              operator_code,
3168              rule_condition_value
3169       FROM IBY_RULE_CONDITIONS ibyruleconds
3170       WHERE ibyruleconds.payment_rule_id = p_payment_rule_id;
3171 
3172     CURSOR payer_info_csr(p_le_id IN NUMBER)
3173     IS
3174       SELECT xlev.country,
3175              glv.currency_code
3176         FROM XLE_FIRSTPARTY_INFORMATION_V xlev,
3177              GL_LEDGER_LE_V glv
3178        WHERE xlev.legal_entity_id = glv.legal_entity_id
3179          AND glv.ledger_category_code = 'PRIMARY'
3180          AND xlev.legal_entity_id = p_le_id;
3181 
3182     CURSOR payee_country_csr(p_payee_id IN NUMBER)
3183     IS
3184       SELECT country
3185         FROM HZ_PARTIES
3186        WHERE party_id = p_payee_id;
3187 
3188     CURSOR payeesite_country_csr(p_payee_id IN NUMBER,
3189                                  p_payee_site_id IN NUMBER)
3190     IS
3191       SELECT locs.country
3192         FROM HZ_PARTY_SITES sites,
3193              HZ_LOCATIONS locs
3194        WHERE sites.party_id = p_payee_id
3195          AND sites.party_site_id = p_payee_site_id
3196          AND sites.location_id = locs.location_id;
3197 
3198 BEGIN
3199    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3200 	   print_debuginfo(l_module_name, 'ENTER');
3201 
3202    END IF;
3203     -- Fetch 1st party Payer country
3204     IF (p_trxn_attributes.payer_legal_entity_id IS NOT NULL) THEN
3205         OPEN payer_info_csr(p_trxn_attributes.payer_legal_entity_id);
3206         FETCH payer_info_csr INTO l_payer_country, l_accounting_curr;
3207         CLOSE payer_info_csr;
3208     END IF;
3209 
3210     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3211 	    print_debuginfo(l_module_name,'Accounting currency : '|| l_accounting_curr);
3212 	    print_debuginfo(l_module_name,'First party country : '|| l_payer_country);
3213 
3214     END IF;
3215     IF (p_trxn_attributes.payee_party_id IS NOT NULL) THEN
3216         IF (p_trxn_attributes.payee_party_site_id IS NOT NULL) THEN
3217             -- Fetch Payee Site Country
3218             OPEN payeesite_country_csr(p_trxn_attributes.payee_party_id,
3219                                        p_trxn_attributes.payee_party_site_id);
3220             FETCH payeesite_country_csr INTO l_payee_country;
3221             CLOSE payeesite_country_csr;
3222         ELSE
3223           -- Fetch Payee Country
3224           OPEN payee_country_csr(p_trxn_attributes.payee_party_site_id);
3225           FETCH payee_country_csr INTO l_payee_country;
3226           CLOSE payee_country_csr;
3227         END IF;
3228     END IF;
3229 
3230     IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3231 	    print_debuginfo(l_module_name, 'Payee Country : '|| l_payee_country);
3232 
3233     END IF;
3234      FOR v_defaultingRules IN DefaultingRules_csr(
3235 				p_trxn_attributes.application_id,
3236 				p_trxn_attributes.pay_proc_trxn_type_code,
3237 				p_trxn_attributes.Payer_Legal_Entity_Id,
3238 				p_trxn_attributes.payer_org_id)
3239       LOOP
3240             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3241 	            print_debuginfo(l_module_name,'Evaluate Rule:' || v_defaultingRules.payment_rule_id);
3242             END IF;
3243       FOR v_ruleCondt IN DefaultingCondt_csr(v_defaultingRules.payment_rule_id)
3244          LOOP
3245               IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3246 	              print_debuginfo(l_module_name,'Evaluate Rule Condition:' || v_ruleCondt.rule_condition_value);
3247               END IF;
3248          --
3249          -- evaluate rule condition based on 'PAYMENT_AMOUNT'
3250          -- and the operators are "EQ", "NE", "LE", "LT",  "GE", "GT"
3251          --
3252          IF (v_ruleCondt.rule_condition_type_code = 'PAYMENT_AMOUNT') THEN
3253 
3254 	        CASE v_ruleCondt.operator_code
3255             WHEN 'EQ' THEN
3256                l_pmt_amount_flag := l_pmt_amount_flag
3257 	                                OR (p_trxn_attributes.payment_amount =
3258 				                        v_ruleCondt.rule_condition_value);
3259             WHEN 'NE' THEN
3260                l_pmt_amount_flag := l_pmt_amount_flag
3261 	                                OR (p_trxn_attributes.payment_amount <>
3262 				                        v_ruleCondt.rule_condition_value);
3263             WHEN 'LE' THEN
3264                l_pmt_amount_flag := l_pmt_amount_flag
3265 	                                OR (p_trxn_attributes.payment_amount <=
3266 				                        v_ruleCondt.rule_condition_value);
3267             WHEN 'LT' THEN
3268                l_pmt_amount_flag := l_pmt_amount_flag
3269 	                                OR (p_trxn_attributes.payment_amount <
3270 				                        v_ruleCondt.rule_condition_value);
3271             WHEN 'GE' THEN
3272                l_pmt_amount_flag := l_pmt_amount_flag
3273 	                                OR (p_trxn_attributes.payment_amount >=
3274 				                        v_ruleCondt.rule_condition_value);
3275             WHEN 'GT' THEN
3276                l_pmt_amount_flag := l_pmt_amount_flag
3277 	                                OR (p_trxn_attributes.payment_amount >
3278 		    	                        v_ruleCondt.rule_condition_value);
3279             ELSE
3280                NULL; -- Not a recognized operator code
3281             END CASE;
3282 
3283             l_cumm_pmt_amount_match := l_pmt_amount_flag;
3284             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3285 	            print_debuginfo(l_module_name, 'l_cumm_pmt_amount_match   :'
3286 	                            || ifelse(l_cumm_pmt_amount_match,'true','false'));
3287             END IF;
3288 
3289          --
3290          -- evaluate rule condition based on 'PAYER_ORG'
3291          -- and the operators are "EQ" , "NE"
3292          --
3293          ELSIF (v_ruleCondt.rule_condition_type_code = 'PAYER_ORG') THEN
3294 
3295             CASE v_ruleCondt.operator_code
3296             WHEN 'EQ' THEN
3297 	           l_payer_org_flag := l_payer_org_flag
3298                                          OR (v_ruleCondt.rule_condition_value is NULL)
3299 	                                OR (p_trxn_attributes.Payer_Org_Id =
3300 				                        v_ruleCondt.rule_condition_value);
3301             WHEN 'NE' THEN
3302                l_payer_org_flag := l_payer_org_flag
3303 	                                OR (p_trxn_attributes.Payer_Org_Id <>
3304 				                        v_ruleCondt.rule_condition_value);
3305             ELSE
3306                NULL; -- Not a recognized operator code
3307             END CASE;
3308 
3309             l_cumm_payer_org_match := l_payer_org_flag;
3310             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3311 	            print_debuginfo(l_module_name, 'l_cumm_payer_org_match    :'
3312 	                            || ifelse(l_cumm_payer_org_match,'true','false'));
3313 
3314             END IF;
3315          --
3316          -- evaluate rule condition based on 'PAYER_lE'
3317          -- and the operators are "EQ" , "NE"
3318          --
3319          ELSIF (v_ruleCondt.rule_condition_type_code = 'PAYER_LE') THEN
3320 
3321             CASE v_ruleCondt.operator_code
3322             WHEN 'EQ' THEN
3323 	           l_payer_le_flag := l_payer_le_flag
3324                                            OR (v_ruleCondt.rule_condition_value is NULL)
3325 	                                OR (p_trxn_attributes.payer_legal_entity_id =
3326 				                        v_ruleCondt.rule_condition_value);
3327             WHEN 'NE' THEN
3328                l_payer_le_flag := l_payer_le_flag
3329 	                                OR (p_trxn_attributes.payer_legal_entity_id <>
3330 				                        v_ruleCondt.rule_condition_value);
3331             ELSE
3332                NULL; -- Not a recognized operator code
3333             END CASE;
3334 
3335             l_cumm_payer_le_match := l_payer_le_flag;
3336             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3337 	            print_debuginfo(l_module_name, 'l_cumm_payer_le_match     :'
3338 	                            || ifelse(l_cumm_payer_le_match,'true','false'));
3339 
3340             END IF;
3341          --
3342          -- evaluate rule condition based on 'PAY_PROC_TRXN_TYPE'
3343          -- and the operators are "EQ" , "NE"
3344          --
3345          ELSIF (v_ruleCondt.rule_condition_type_code = 'PAY_PROC_TRXN_TYPE') THEN
3346 
3347             CASE v_ruleCondt.operator_code
3348             WHEN 'EQ' THEN
3349 	           l_trxn_type_flag := l_trxn_type_flag
3350                                            OR (v_ruleCondt.rule_condition_value is NULL)
3351 	                                OR (p_trxn_attributes.Pay_Proc_Trxn_Type_Code =
3352 				                        v_ruleCondt.rule_condition_value);
3353             WHEN 'NE' THEN
3354                l_trxn_type_flag := l_trxn_type_flag
3355 	                                OR (p_trxn_attributes.Pay_Proc_Trxn_Type_Code <>
3356 				                        v_ruleCondt.rule_condition_value);
3357             ELSE
3358                NULL; -- Not a recognized operator code
3359             END CASE;
3360 
3361             l_cumm_trxn_type_match := l_trxn_type_flag;
3362             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3363 	            print_debuginfo(l_module_name, 'l_cumm_trxn_type_match    :'
3364 	                            || ifelse(l_cumm_trxn_type_match,'true','false'));
3365 
3366 
3367             END IF;
3368          --
3369          -- evaluate rule condition based on 'CROSS_BORDER_FLAG'
3370          -- and the operators are "EQ"
3371          --
3372          ELSIF (v_ruleCondt.rule_condition_type_code = 'CROSS_BORDER_FLAG') THEN
3373 
3374             CASE v_ruleCondt.operator_code
3375             WHEN 'EQ' THEN
3376 	           l_cross_border_flag := l_cross_border_flag
3377                                           OR (v_ruleCondt.rule_condition_value='FOREIGN_AND_DOMESTIC')
3378 	                                  OR (v_ruleCondt.rule_condition_value = 'DOMESTIC'
3379 				                          AND NVL(l_payee_country,l_payer_country) = l_payer_country)
3380                                       OR (v_ruleCondt.rule_condition_value = 'FOREIGN'
3381 				                          AND NVL(l_payee_country,l_payer_country) <> l_payer_country);
3382             ELSE
3383                NULL; -- Not a recognized operator code
3384             END CASE;
3385 
3386             l_cumm_cross_border_match := l_cross_border_flag;
3387             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3388 	            print_debuginfo(l_module_name,'l_cumm_cross_border_match    :'
3389 	                            || ifelse(l_cumm_cross_border_match,'true','false'));
3390 
3391 
3392             END IF;
3393          --
3394          -- evaluate rule condition based on 'FOREIGN_CURRENCY_FLAG'
3395          -- and the operators are "EQ"
3396          --
3397          ELSIF (v_ruleCondt.rule_condition_type_code = 'FOREIGN_CURRENCY_FLAG') THEN
3398 
3399             CASE v_ruleCondt.operator_code
3400             WHEN 'EQ' THEN
3401 	           l_currency_flag := l_currency_flag
3402                                         OR (v_ruleCondt.rule_condition_value='FOREIGN_AND_DOMESTIC')
3403 	                              OR (v_ruleCondt.rule_condition_value = 'DOMESTIC'
3404                                       AND p_trxn_attributes.Payment_Currency = l_accounting_curr)
3405                                   OR (v_ruleCondt.rule_condition_value = 'FOREIGN'
3406                                       AND p_trxn_attributes.Payment_Currency <> l_accounting_curr);
3407 
3408             ELSE
3409                NULL; -- Not a recognized operator code
3410             END CASE;
3411 
3412             l_cumm_currency_match := l_currency_flag;
3413             IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3414 	            print_debuginfo(l_module_name,'l_cumm_currency_match    :'
3415 	                            || ifelse(l_cumm_currency_match,'true','false'));
3416             END IF;
3417          END IF; -- if v_ruleCondt.parameter_code = 'PAYMENT_AMOUNT'
3418 
3419       END LOOP;
3420 
3421       l_match := (l_cumm_payer_le_match AND l_cumm_payer_org_match AND
3422                   l_cumm_trxn_type_match AND l_cumm_currency_match AND
3423 	              l_cumm_cross_border_match AND l_cumm_pmt_amount_match);
3424 
3425       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3426 	      print_debuginfo(l_module_name, 'l_match                   :'
3427 	                      ||ifelse(l_match,'true','false'));
3428 
3429       END IF;
3430       IF (l_match = TRUE) THEN
3431          x_pmt_method_rec.Payment_Method_Name :=
3432                           v_DefaultingRules.payment_method_name;
3433          x_pmt_method_rec.Payment_Method_Code :=
3434                           v_DefaultingRules.payment_method_code;
3435          x_pmt_method_rec.Bill_Payable_Flag :=
3436                           v_DefaultingRules.support_bills_payable_flag;
3437          x_pmt_method_rec.Maturity_Date_Offset :=
3438                           v_DefaultingRules.maturity_date_offset_days;
3439          IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3440 	         print_debuginfo(l_module_name, 'Default Payment Method Name :'
3441 	                         ||v_DefaultingRules.payment_method_name);
3442          END IF;
3443          EXIT;
3444       END IF;
3445    END LOOP;
3446 
3447    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3448 	   print_debuginfo(l_module_name, 'RETURN');
3449 
3450    END IF;
3451 END Evaluate_Rule_Based_Default;
3452 
3453 
3454  --
3455  --
3456  --
3457  PROCEDURE print_debuginfo(p_module IN VARCHAR2,
3458                            p_debug_text IN VARCHAR2)
3459  IS
3460 
3461  l_default_debug_level VARCHAR2(200) := FND_LOG.LEVEL_STATEMENT;
3462 
3463  BEGIN
3464 
3465      --
3466      -- Writing debug text to the pl/sql debug file.
3467      --
3468      -- FND_FILE.PUT_LINE(FND_FILE.LOG, p_module||p_debug_text);
3469      --
3470 
3471      /*
3472       * Fix for bug 5578607:
3473       *
3474       * Call the underlying routine only if the current debug
3475       * level exceeds the runtime debug level.
3476       */
3477      IF (l_default_debug_level >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3478 
3479          iby_debug_pub.add(substr(RPAD(p_module,55)||' : '||
3480                            p_debug_text, 0, 150),
3481                            iby_debug_pub.G_LEVEL_INFO,
3482                            G_DEBUG_MODULE);
3483 
3484      END IF;
3485 
3486  END print_debuginfo;
3487 
3488  --
3489  --
3490  --
3491  FUNCTION ifelse(p_bool IN BOOLEAN,
3492                  x_true IN VARCHAR2,
3493                  x_false IN VARCHAR2)
3494  RETURN VARCHAR2
3495  IS
3496  BEGIN
3497      --
3498      --
3499      --
3500      IF (p_bool) THEN
3501         RETURN x_true;
3502      ELSE
3503         RETURN x_false;
3504      END IF;
3505 
3506  END ifelse;
3507 
3508 
3509    -- Start of comments
3510   --   API name     : Get_Applicable_Payee_Acc_list
3511   --   Type         : Public
3512   --   Pre-reqs     : None.
3513   --   Function     : get the list of all applicable Payee Bank Accounts.
3514   --   Parameters   :
3515   --   IN           :   p_api_version              IN  NUMBER   Required
3516   --                    p_init_msg_list            IN  VARCHAR2 Optional
3517   --                    p_trxn_attributes_rec      IN  Trxn_Attributes_Rec_Type  Required
3518   --   OUT          :   x_return_status            OUT VARCHAR2 Required
3519   --                    x_msg_count                OUT NUMBER   Required
3520   --                    x_msg_data                 OUT VARCHAR2 Required
3521   --                    x_payee_bankaccounts_tbl   OUT Payee_BankAccount_Tab_Type Required
3522   --
3523   --   Version   : Current version   1.0
3524   --                      Previous version   None
3525   --                      Initial version    1.0
3526   -- End of comments
3527 
3528 PROCEDURE Get_Applicable_Payee_Acc_list (
3529      p_api_version               IN   NUMBER,
3530      p_init_msg_list             IN   VARCHAR2 default FND_API.G_FALSE,
3531      p_trxn_attributes_rec       IN   Trxn_Attributes_Rec_Type,
3532      x_return_status             OUT  NOCOPY VARCHAR2,
3533      x_msg_count                 OUT  NOCOPY NUMBER,
3534      x_msg_data                  OUT  NOCOPY VARCHAR2,
3535      x_payee_bankaccounts_tbl    OUT  NOCOPY Payee_BankAccount_Tab_Type
3536 )
3537 IS
3538 
3539    l_api_name           CONSTANT VARCHAR2(30)   := 'Get_Applicable_Payee_BankAccts';
3540    l_api_version        CONSTANT NUMBER         := 1.0;
3541    l_module_name        CONSTANT VARCHAR2(200)   := G_PKG_NAME || '.Get_Applicable_Payee_BankAccts';
3542 
3543    l_payee_bankaccounts_tbl    Payee_BankAccount_Tab_Type;
3544 
3545    CURSOR payee_bankacct_csr(p_payee_party_id      NUMBER,
3546                              p_payee_party_site_id NUMBER,
3547                              p_supplier_site_id    NUMBER,
3548                              p_payer_org_id        NUMBER,
3549                              p_payer_org_type      VARCHAR2,
3550                              p_payment_currency    VARCHAR2,
3551                              p_payment_function    VARCHAR2)
3552    IS
3553       SELECT b.bank_account_name,
3554              b.ext_bank_account_id,
3555              b.bank_account_number,
3556 	     b.currency_code,
3557  	     b.iban_number,
3558  	     b.bank_name,
3559  	     b.bank_number,
3560  	     b.bank_branch_name,
3561  	     b.branch_number,
3562  	     b.country_code,
3563  	     b.alternate_account_name,
3564  	     b.bank_account_type,
3565  	     b.account_suffix,
3566  	     b.description,
3567  	     b.foreign_payment_use_flag,
3568  	     b.payment_factor_flag,
3569  	     b.eft_swift_code
3570       FROM   IBY_PMT_INSTR_USES_ALL ibyu,
3571              IBY_EXT_BANK_ACCOUNTS_V b,
3572              IBY_EXTERNAL_PAYEES_ALL ibypayee
3573       WHERE ibyu.instrument_id = b.ext_bank_account_id
3574       AND ibyu.instrument_type = 'BANKACCOUNT'
3575       AND (b.currency_code = p_payment_currency OR b.currency_code is null)
3576       AND ibyu.ext_pmt_party_id = ibypayee.ext_payee_id
3577       AND ibypayee.payment_function = p_payment_function
3578       AND ibypayee.payee_party_id = p_payee_party_id
3579       AND trunc(sysdate) between
3580               trunc(NVL(ibyu.start_date,sysdate)) AND trunc(NVL(ibyu.end_date-1,sysdate))
3581       AND trunc(sysdate) between
3582               trunc(NVL(b.start_date,sysdate)) AND trunc(NVL(b.end_date-1,sysdate))
3583       AND (ibypayee.party_site_id is null OR ibypayee.party_site_id = p_payee_party_site_id)
3584       AND (ibypayee.supplier_site_id is null OR ibypayee.supplier_site_id = p_supplier_site_id)
3585       AND (ibypayee.org_id is null OR
3586            (ibypayee.org_id = p_payer_org_id AND ibypayee.org_type = p_payer_org_type))
3587        AND ibyu.payment_flow='DISBURSEMENTS'
3588 	          ORDER BY
3589 		          ibypayee.supplier_site_id,
3590 		          ibypayee.party_site_id,
3591 			  ibypayee.org_id,
3592 			  ibyu.order_of_preference;
3593 
3594 BEGIN
3595 
3596    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3597 	   print_debuginfo(l_module_name,'ENTER');
3598 	   print_debuginfo(l_module_name,'Org Id           : '|| p_trxn_attributes_rec.payer_org_id);
3599 	   print_debuginfo(l_module_name,'Org Type         : '|| p_trxn_attributes_rec.payer_org_type);
3600 	   print_debuginfo(l_module_name,'Party Id         : '|| p_trxn_attributes_rec.payee_party_id);
3601 	   print_debuginfo(l_module_name,'Party Site Id    : '|| p_trxn_attributes_rec.payee_party_site_id);
3602 	   print_debuginfo(l_module_name,'Supplier Site Id : '|| p_trxn_attributes_rec.supplier_site_id);
3603 	   print_debuginfo(l_module_name,'Payment Currency : '|| p_trxn_attributes_rec.payment_currency);
3604 	   print_debuginfo(l_module_name,'Payment Amount   : '|| p_trxn_attributes_rec.payment_amount);
3605 	   print_debuginfo(l_module_name,'Account Usage    : '|| p_trxn_attributes_rec.payment_function);
3606 
3607    END IF;
3608    -- Standard call to check for call compatibility.
3609    IF NOT FND_API.Compatible_API_Call(l_api_version,
3610                                       p_api_version,
3611                                       l_api_name,
3612                                       G_PKG_NAME) THEN
3613       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3614    END IF;
3615 
3616    -- Initialize message list if p_init_msg_list is set to TRUE.
3617    IF FND_API.to_Boolean(p_init_msg_list) THEN
3618       FND_MSG_PUB.initialize;
3619    END IF;
3620 
3621    --  Initialize API return status to success
3622    x_return_status := FND_API.G_RET_STS_SUCCESS;
3623 
3624    -- Check for mandatory params
3625    IF (p_trxn_attributes_rec.payee_party_id IS NULL) THEN
3626       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3627 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payee Party Id'' missing.');
3628       END IF;
3629       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
3630       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PAYEE_PARTY_ID_FIELD'));
3631       FND_MSG_PUB.Add;
3632       RAISE FND_API.G_EXC_ERROR;
3633    END IF;
3634 
3635    IF (p_trxn_attributes_rec.payment_currency IS NULL) THEN
3636       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3637 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Payment Currency'' missing.');
3638       END IF;
3639       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
3640       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_PMT_CURR_FIELD'));
3641       FND_MSG_PUB.Add;
3642       RAISE FND_API.G_EXC_ERROR;
3643    END IF;
3644 
3645    IF (p_trxn_attributes_rec.payment_function IS NULL) THEN
3646       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3647 	      print_debuginfo(l_module_name,'Error: Mandatory Parameter ''Account Usage'' missing.');
3648       END IF;
3649       FND_MESSAGE.set_name('IBY', 'IBY_MISSING_MANDATORY_PARAM');
3650       FND_MESSAGE.SET_TOKEN('PARAM', fnd_message.GET_String('IBY','IBY_ACCT_USG_FIELD'));
3651       FND_MSG_PUB.Add;
3652       RAISE FND_API.G_EXC_ERROR;
3653    END IF;
3654 
3655    -- Start of API body.
3656    OPEN payee_bankacct_csr(p_trxn_attributes_rec.Payee_Party_Id,
3657                            p_trxn_attributes_rec.Payee_Party_Site_Id,
3658                            p_trxn_attributes_rec.Supplier_Site_Id,
3659                            p_trxn_attributes_rec.Payer_Org_Id,
3660                            p_trxn_attributes_rec.Payer_Org_Type,
3661                            p_trxn_attributes_rec.Payment_Currency,
3662                            p_trxn_attributes_rec.Payment_Function);
3663 
3664    FETCH payee_bankacct_csr BULK COLLECT INTO l_payee_bankaccounts_tbl;
3665    CLOSE payee_bankacct_csr;
3666 
3667    IF (l_payee_bankaccounts_tbl.COUNT = 0) THEN
3668       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3669 	      print_debuginfo(l_module_name,'Warning: No Payee Bank Accounts Applicable');
3670       END IF;
3671    ELSE
3672       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3673 	      print_debuginfo(l_module_name,'Applicable Payee Bank Accounts Count : '|| l_payee_bankaccounts_tbl.COUNT);
3674       END IF;
3675       x_payee_bankaccounts_tbl := l_payee_bankaccounts_tbl;
3676    END IF;
3677 
3678    -- End of API body.
3679 
3680    -- Standard call to get message count and if count is 1, get message info.
3681    FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
3682 
3683    IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3684 	   print_debuginfo(l_module_name, 'RETURN');
3685 
3686    END IF;
3687   EXCEPTION
3688     WHEN FND_API.G_EXC_ERROR THEN
3689       x_return_status := FND_API.G_RET_STS_ERROR;
3690       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
3691       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3692 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3693 	      print_debuginfo(l_module_name,'SQLerr is :'
3694 	                           || substr(SQLERRM, 1, 150));
3695       END IF;
3696     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3697       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3698       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
3699       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3700 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3701 	      print_debuginfo(l_module_name,'SQLerr is :'
3702 	                           || substr(SQLERRM, 1, 150));
3703       END IF;
3704     WHEN OTHERS THEN
3705       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3706 
3707       IF (FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR))
3708         THEN
3709           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
3710       END IF;
3711       IF ( G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3712 	      print_debuginfo(l_module_name,'ERROR: Exception occured during call to API ');
3713 	      print_debuginfo(l_module_name,'SQLerr is :'
3714 	                           || substr(SQLERRM, 1, 150));
3715       END IF;
3716       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count, p_data  => x_msg_data);
3717 
3718 END Get_Applicable_Payee_Acc_list;
3719 
3720 END IBY_DISBURSEMENT_COMP_PUB;