DBA Data[Home] [Help]

PACKAGE BODY: APPS.AR_RECEIPT_VAL_PVT

Source


1 Package Body      AR_RECEIPT_VAL_PVT AS
2 /* $Header: ARXPREVB.pls 120.46.12010000.5 2008/11/17 12:14:43 pbapna ship $    */
3 --Validation procedures are contained in this package
4 
5 G_MSG_UERROR    CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR;
6 G_MSG_ERROR     CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_ERROR;
7 G_MSG_SUCCESS   CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_SUCCESS;
8 G_MSG_HIGH      CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH;
9 G_MSG_MEDIUM    CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM;
10 G_MSG_LOW       CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW;
11 
12 PG_DEBUG varchar2(1) := NVL(FND_PROFILE.value('AFLOG_ENABLED'), 'N');
13 
14 PROCEDURE Validate_Receipt_Date(p_receipt_date  IN DATE,
15                                 p_return_status  OUT NOCOPY VARCHAR2) IS
16 BEGIN
17     IF PG_DEBUG in ('Y', 'C') THEN
18        arp_util.debug('Validate_Receipt_Date()+');
19     END IF;
20 
21     p_return_status := FND_API.G_RET_STS_SUCCESS;
22 
23     IF PG_DEBUG in ('Y', 'C') THEN
24        arp_util.debug('Validate_Receipt_Date()-');
25     END IF;
26 END Validate_Receipt_Date;
27 
28 PROCEDURE Validate_Gl_Date(p_gl_date IN DATE,
29                            p_return_status  OUT NOCOPY VARCHAR2) IS
30 BEGIN
31   IF PG_DEBUG in ('Y', 'C') THEN
32      arp_util.debug('Validate_Gl_Date ()+');
33   END IF;
34    p_return_status := FND_API.G_RET_STS_SUCCESS;
35    IF ( NOT arp_util.is_gl_date_valid( p_gl_date )) THEN
36     FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
37     FND_MESSAGE.set_token( 'GL_DATE', TO_CHAR( p_gl_date ));
38     FND_MSG_PUB.Add;
39     p_return_status := FND_API.G_RET_STS_ERROR;
40    END IF;
41   IF PG_DEBUG in ('Y', 'C') THEN
42      arp_util.debug('Validate_Gl_Date ()+');
43   END IF;
44 END Validate_Gl_Date;
45 
46 PROCEDURE Validate_Deposit_Date(p_deposit_date IN DATE,
47                                 p_return_status  OUT NOCOPY VARCHAR2) IS
48 BEGIN
49    IF PG_DEBUG in ('Y', 'C') THEN
50       arp_util.debug('Validate_Deposit_Date ()+');
51    END IF;
52    p_return_status := FND_API.G_RET_STS_SUCCESS;
53 
54 END Validate_Deposit_Date;
55 
56 PROCEDURE Validate_Maturity_Date(p_maturity_date IN DATE,
57                                  p_receipt_date IN DATE,
58                                  p_return_status OUT NOCOPY VARCHAR2) IS
59 BEGIN
60    IF PG_DEBUG in ('Y', 'C') THEN
61       arp_util.debug('Validate_Maturity_Date ()+');
62    END IF;
63  IF (p_maturity_date < p_receipt_date) THEN
64    p_return_status := FND_API.G_RET_STS_ERROR;
65    FND_MESSAGE.set_name( 'AR','AR_RW_MAT_BEFORE_RCT_DATE');
66   -- arp_util.debug('m'||FND_MESSAGE.GET_ENCODED);
67    FND_MSG_PUB.ADD;
68  ELSE
69    p_return_status := FND_API.G_RET_STS_SUCCESS;
70  END IF;
71    IF PG_DEBUG in ('Y', 'C') THEN
72       arp_util.debug('Validate_Maturity_Date ()-');
73    END IF;
74 END Validate_Maturity_Date;
75 
76 PROCEDURE Validate_amount(p_amount IN OUT NOCOPY NUMBER,
77                           p_factor_discount_amount IN NUMBER,
78                           p_state  IN VARCHAR2,
79                           p_type   IN VARCHAR2,
80                           p_return_status OUT NOCOPY VARCHAR2) IS
81 BEGIN
82   IF PG_DEBUG in ('Y', 'C') THEN
83      arp_util.debug('Validate_amount () +');
84   END IF;
85   p_return_status := FND_API.G_RET_STS_SUCCESS;
86 
87  --Raise error if the receipt amount is null or negative
88  IF p_amount IS NULL THEN
89     p_return_status := FND_API.G_RET_STS_ERROR;
90     FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCPT_AMOUNT_NULL');
91     FND_MSG_PUB.Add;
92 
93  ElSIF (p_amount < 0) AND (p_type = 'CASH')
94    THEN
95     p_return_status := FND_API.G_RET_STS_ERROR;
96     FND_MESSAGE.SET_NAME('AR','AR_RW_RCT_AMOUNT_NEGATIVE');
97     FND_MSG_PUB.Add;
98 
99  END IF;
100 
101 
102 -- If the profile option AR : Create bank charges = No or
103 -- the state is not CONFIRMED  then raise error if the
104 -- bank charges exist.
105 
106  IF (NVL(ar_receipt_lib_pvt.pg_profile_create_bk_charges,'N') = 'N')
107   THEN
108 
109     IF ( NVL(p_factor_discount_amount,0) <> 0 )
110      THEN
111       p_return_status := FND_API.G_RET_STS_ERROR;
112       FND_MESSAGE.SET_NAME('AR', 'AR_BK_CH_NOT_ALLWD_IF_NOT_CLR');
113       FND_MSG_PUB.Add;
114       IF PG_DEBUG in ('Y', 'C') THEN
115          arp_util.debug('Validate_amount: ' || 'Bank charges are not allowed ');
116       END IF;
117     END IF;
118 
119  ELSE
120 
121    IF (p_state <> 'CLEARED') AND (NVL(p_factor_discount_amount,0) <> 0 )
122     THEN
123      -- raise error about bank charges not allowed because the
124      -- state of the receipt is <> 'CLEARED'
125      p_return_status := FND_API.G_RET_STS_ERROR;
126      FND_MESSAGE.SET_NAME('AR','AR_BK_CH_NOT_ALLWD_IF_NOT_CLR');
127      FND_MSG_PUB.Add;
128      IF PG_DEBUG in ('Y', 'C') THEN
129         arp_util.debug('Validate_amount: ' || 'The bank charges are not allowed if the state <> CLEARED');
130      END IF;
131    END IF;
132 
133    IF p_factor_discount_amount < 0  THEN
134 
135     -- Raise error if the bank charges amount less than 0
136      p_return_status := FND_API.G_RET_STS_ERROR;
137      FND_MESSAGE.SET_NAME('AR','AR_JG_BC_AMOUNT_NEGATIVE');
138      FND_MSG_PUB.Add;
139    END IF;
140 
141    p_amount := nvl(p_amount,0) + nvl(p_factor_discount_amount,0);
142 
143    IF (p_amount < 0) AND (p_type = 'CASH')
144     THEN
145      p_return_status := FND_API.G_RET_STS_ERROR;
146      FND_MESSAGE.SET_NAME('AR','AR_RW_RCT_AMOUNT_NEGATIVE');
147      FND_MSG_PUB.Add;
148      IF PG_DEBUG in ('Y', 'C') THEN
149         arp_util.debug('Validate_amount: ' || 'Receipt amount is negative ');
150      END IF;
151    END IF;
152 
153  END IF;
154   IF PG_DEBUG in ('Y', 'C') THEN
155      arp_util.debug('Validate_amount () +');
156   END IF;
157 END Validate_amount;
158 
159 PROCEDURE Validate_Customer(p_customer_id  IN NUMBER,
160                             /* 6612301 */
161                             p_customer_bank_account_id  IN OUT NOCOPY NUMBER,
162                             p_location                  IN  VARCHAR2,
163                             p_customer_site_use_id      IN OUT NOCOPY NUMBER,
164                             p_currency_code             IN VARCHAR2,
165                             p_receipt_date              IN DATE,
166                             p_return_status             OUT NOCOPY VARCHAR2) IS
167 
168  l_temp BINARY_INTEGER;
169  l_dummy_cust  Customer_Rec;
170  l_record_exists_in_cache  VARCHAR2(2);
171 BEGIN
172        IF PG_DEBUG in ('Y', 'C') THEN
173           arp_util.debug('Validate_amount: ' || 'Validate_Customer_id()+');
174        END IF;
175         p_return_status := FND_API.G_RET_STS_SUCCESS;
176 /*         l_temp := Customer_Cache_Tbl.LAST;
177           IF PG_DEBUG in ('Y', 'C') THEN
178              arp_util.debug('Validate_amount: ' || 'cache ');
179           END IF;
180 
181           IF l_temp IS NULL THEN
182              --The cache is empty : populate it directly.
183              l_record_exists_in_cache := 'N';
184 
185           ELSE
186              --this is the case where records exist in the cache, compare the current record
187              --with these records.
188 
189              l_record_exists_in_cache := 'N';
190 
191             FOR l_counter IN 1..l_temp  LOOP
192              IF (Customer_Cache_Tbl(l_counter).customer_id = p_customer_id) AND
193                 (Customer_Cache_Tbl(l_counter).site_use_id = p_customer_site_use_id)
194               THEN
195                    --Current record exists in the cache
196                     l_record_exists_in_cache := 'Y';
197                     EXIT;
198               END IF;
199              END LOOP;
200           END IF;
201 
202        IF PG_DEBUG in ('Y', 'C') THEN
203           arp_util.debug('Validate_amount: ' || 'record_exists_in_cache = '||l_record_exists_in_cache);
204        END IF;
205 */
206        IF (p_customer_id IS NOT NULL) THEN
207           IF PG_DEBUG in ('Y', 'C') THEN
208              arp_util.debug('Validate_amount: ' || 'Now Validating Customer id ');
209           END IF;
210               /*--------------------------------+
211                |                                |
212                |   Validate Customer_id         |
213                |                                |
214                +--------------------------------*/
215 
216           -- IF l_record_exists_in_cache = 'N'  THEN
217 
218                   /* modified for tca uptake */
219                   /* fixed bug 1544201: removed references to
220                      customer_prospect_code */
221                   BEGIN
222                     SELECT cust.cust_account_id
223                     INTO   l_dummy_cust.customer_id
224                     FROM   hz_cust_accounts cust,
225                            hz_customer_profiles cp,
226                            hz_parties party
227                     WHERE  cust.cust_account_id = cp.cust_account_id (+) and
228                            cp.site_use_id is null and
229                            cust.cust_account_id = p_customer_id and
230                            cust.party_id = party.party_id;
231                   EXCEPTION
232                     WHEN NO_DATA_FOUND THEN
233                          p_return_status := FND_API.G_RET_STS_ERROR;
234                          FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_ID_INVALID');
235                          FND_MSG_PUB.Add;
236 
237                     WHEN OTHERS THEN
238                          IF PG_DEBUG in ('Y', 'C') THEN
239                             arp_util.debug('Validate_amount: ' || 'EXCEPTION: Cache_Customer_id() ');
240                             arp_util.debug('Validate_amount: ' || 'p_customer_id  =  ' ||TO_CHAR(p_customer_id));
241                          END IF;
242                          RAISE;
243                   END;
244 
245               /*------------------------------------+
246                |                                    |
247                | Validate Customer site_use_id      |
248                |                                    |
249                +------------------------------------*/
250                --There is no point in validating the customer_site_use_id
251                --and the customer bank account id if the validation of
252                --customer id has failed
253 
254              IF p_return_status = FND_API.G_RET_STS_SUCCESS THEN
255                --no need to validate site_use_id if derived from the transaction
256               IF ar_receipt_lib_pvt.pg_cust_derived_from IS NULL THEN
257 
258                IF p_customer_site_use_id IS NOT NULL  THEN
259                  --no need to validate site_use_id if derived from the transaction
260                  IF PG_DEBUG in ('Y', 'C') THEN
261                     arp_util.debug('Validate_amount: ' || 'Now validating Customer site_use_id ');
262                  END IF;
263                   BEGIN
264                     SELECT site_uses.site_use_id
265                     INTO   l_dummy_cust.site_use_id
266                     FROM   hz_cust_site_uses_all site_uses,
267                            hz_cust_acct_sites acct_site
268                     WHERE  acct_site.cust_account_id = p_customer_id
269                       /*AND  acct_site.status = 'A'  Bug 4317815*/
270                       AND  acct_site.cust_acct_site_id =
271                                      site_uses.cust_acct_site_id
272                       AND  site_uses.site_use_code IN ('BILL_TO','DRAWEE')
273                       /*AND  site_uses.status = 'A'  Bug 4317815*/
274                       AND  site_uses.site_use_id = p_customer_site_use_id;
275                      ar_receipt_lib_pvt.pg_cust_derived_from := NULL;
276                   EXCEPTION
277                     WHEN NO_DATA_FOUND THEN
278                          p_return_status := FND_API.G_RET_STS_ERROR;
279                          FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_STE_USE_ID_INVALID');
280                          FND_MSG_PUB.Add;
281 
282                     WHEN OTHERS THEN
283                          IF PG_DEBUG in ('Y', 'C') THEN
284                             arp_util.debug('Validate_amount: ' || 'EXCEPTION: Validate_Customer_Site_Use_id() ');
285                             arp_util.debug('Validate_amount: ' || 'p_customer_site_use_id  =  '
286                                   ||TO_CHAR(p_customer_site_use_id));
287                          END IF;
288                          RAISE;
289                   END;
290 
291                ELSE
292                   --here we need to differentiate between the case where the location was
293                   --passed in but the site_use_id could not be derived and the case where
294                   --location was not passed in
295                   IF p_location IS NOT NULL THEN
296                   -- for the specified location there is no data in
297                   -- hz_cust_site_uses
298                   -- the error message was not raised in the defaulting routine.
299                      p_return_status := FND_API.G_RET_STS_ERROR;
300                      FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_LOC_INVALID');
301                      FND_MSG_PUB.Add;
302                   ELSE
303 
304                   --This is the case where customer site use id is null, neither it was supplied
305                   --by the user nor it could be defaulted a WARNING message is raised to
306                   --indicate that the customer site use id could not be defaulted.
307 
308                    IF nvl(arp_global.sysparam.site_required_flag,'N') = 'Y'  THEN
309                     --error
310                       FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_STE_USE_ID_NOT_DEF');
311                       FND_MSG_PUB.Add;
312                       p_return_status := FND_API.G_RET_STS_ERROR;
313                    ELSE
314                     --warning
315                     IF FND_MSG_PUB.Check_Msg_Level(G_MSG_SUCCESS)
316                       THEN
317                       FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_STE_USE_ID_NOT_DEF');
318                       FND_MSG_PUB.Add;
319                       IF PG_DEBUG in ('Y', 'C') THEN
320                          arp_util.debug('Validate_amount: ' || 'Customer site use id is null');
321                       END IF;
322                     END IF;
323                    END IF;
324 
325                   END IF;
326                END IF;
327               ELSE
328                  ar_receipt_lib_pvt.pg_cust_derived_from := NULL;
329               END IF;
330 
331               /*------------------------------------+
332                |                                    |
333                | Validate Customer bank_account_id  |
334                |                                    |
335                +------------------------------------*/
336 /* 6612301 */
337 /*  Revert changes done for customer bank ref under payment uptake */
338                IF p_customer_bank_account_id IS NOT NULL THEN
339 
340                  BEGIN
341                  /*  SELECT   ba.bank_account_id
342                    INTO     l_dummy_cust.bank_account_id
343                    FROM     ap_bank_accounts ba,
344                             ap_bank_account_uses bau
345                    WHERE    ba.bank_account_id = bau.external_bank_account_id
346                         and bau.customer_id = p_customer_id
347                         and (bau.customer_site_use_id is null
348                               or bau.customer_site_use_id = p_customer_site_use_id)
349                         and (ba.currency_code = p_currency_code or
350                              ba.bank_branch_id = 1)
351                         -- OSTEINME 2/27/2001: change for iReceivables:
352                         -- for credit card bank accounts the currency is
353                         -- irrelevant.  See bug 1659130
354                         and p_receipt_date
355                              between nvl(bau.start_date,p_receipt_date)
356                         and nvl(bau.end_date,p_receipt_date)
357                         and nvl(ba.inactive_date,p_receipt_date) >=
358                              p_receipt_date
359                         and ba.bank_account_id = p_customer_bank_account_id; */
360 
361       select  bb.bank_account_id
362 			into  l_dummy_cust.bank_account_id
363 			from iby_fndcpt_payer_assgn_instr_v a,
364 			       iby_ext_bank_accounts_v bb
365 			where a.cust_account_id = p_customer_id
366 			and a.instrument_type = 'BANKACCOUNT'
367 			and ( a.acct_site_use_id =  p_customer_site_use_id or a.acct_site_use_id is null)
368 			and p_receipt_date  between nvl(bb.start_date,p_receipt_date)
369 						and nvl(bb.end_date,p_receipt_date)
370 			and a.currency_code = p_currency_code
371 			and bb.ext_bank_account_id = a.instrument_id
372 			and bb.bank_account_id = p_customer_bank_account_id;
373 
374                  EXCEPTION
375                    WHEN no_data_found THEN
376                     IF ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_id IS NOT NULL THEN
377                      p_return_status := FND_API.G_RET_STS_ERROR;
378                      FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_ID_INVALID');
379                      FND_MSG_PUB.Add;
380                     ELSIF ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_num IS NOT NULL THEN
381                      p_return_status := FND_API.G_RET_STS_ERROR;
382                      FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_NUM_INVALID');
383                      FND_MSG_PUB.Add;
384                     ELSIF  ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_name IS NOT NULL THEN
385                      p_return_status := FND_API.G_RET_STS_ERROR;
386                      FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_NAME_INVALID');
387                      FND_MSG_PUB.Add;
388                     END IF;
389                    WHEN too_many_rows THEN
390                      --Each customer site can have multiple accounts, so if it retrives more than
391                      --one record, the validation is true.
392                     null;
393                    WHEN OTHERS THEN
394                      IF PG_DEBUG in ('Y', 'C') THEN
395                         arp_util.debug('Validate_amount: ' || 'EXCEPTION: Validate_Customer_Bank_account_id() ');
396                         arp_util.debug('Validate_amount: ' || 'p_customer_bank_account_id  =  '
397                                ||TO_CHAR(p_customer_bank_account_id));
398                      END IF;
399                      RAISE;
400 
401                  END;
402 
403                ELSE
404                  --this is the case where the bank account id is neither entered
405                  --by the user not could it be defaulted from the bank account number or name.
406                  --the error for not being able to default the id from the name/number
407                  --already raised in the defaulting routine
408                 null;
409                END IF;
410 
411              END IF;
412 
413             /*  IF p_return_status =  FND_API.G_RET_STS_SUCCESS  THEN
414 
415                 l_temp := nvl(l_temp,0) + 1;
416                 Customer_Cache_Tbl(l_temp) :=  l_dummy_cust;
417 
418               END IF;
419             */
420            --END IF; --if record_exists_in_cache = 'N'
421 
422        ELSE
423              --If p_customer_id is null and the customer_bank_account_id or
424              --the site_use_id has been passed in, then raise an error.
425  /* 6612301 */
426           IF p_customer_bank_account_id IS NOT NULL THEN
427             IF ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_id IS NOT NULL
428              THEN
429               p_return_status := FND_API.G_RET_STS_ERROR;
430               FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_ID_INVALID');
431               FND_MSG_PUB.Add;
432             ELSIF ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_num IS NOT NULL
433              THEN
434               p_return_status := FND_API.G_RET_STS_ERROR;
435               FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_NUM_INVALID');
436               FND_MSG_PUB.Add;
437             ELSIF ar_receipt_api_pub.Original_create_cash_info.customer_bank_account_name IS NOT NULL
438              THEN
439               p_return_status := FND_API.G_RET_STS_ERROR;
440               FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_BK_AC_NAME_INVALID');
441               FND_MSG_PUB.Add;
442             END IF;
443 
444          END IF;    /* bichatte payment uptake commenting  ( Reverted) */
445 
446          IF p_customer_site_use_id IS NOT NULL THEN
447             IF  ar_receipt_api_pub.Original_create_cash_info.cust_site_use_id IS NOT NULL
448              THEN
449               p_return_status := FND_API.G_RET_STS_ERROR;
450               FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_SITE_USE_ID_INVALID');
451               FND_MSG_PUB.Add;
452             ELSIF ar_receipt_api_pub.Original_create_cash_info.location IS NULL THEN
453               p_return_status := FND_API.G_RET_STS_ERROR;
454               FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUS_LOC_INVALID');
455               FND_MSG_PUB.Add;
456             END IF;
457          END IF;
458 
459        END IF;
460    IF PG_DEBUG in ('Y', 'C') THEN
461       arp_util.debug('Validate_amount: ' || 'Validate_Customer_id ()-');
462    END IF;
463 END Validate_Customer;
464 
465 PROCEDURE Validate_receipt_method (p_receipt_method_id  IN NUMBER,
466                            p_remittance_bank_account_id  IN NUMBER,
467                            p_receipt_date    IN  DATE,
468                            p_currency_code   IN  VARCHAR2,
469                            p_state           IN VARCHAR2,
470                            p_called_from     IN VARCHAR2,
471                            p_return_status   OUT NOCOPY VARCHAR2) IS
472  l_temp BINARY_INTEGER;
473  l_dummy_method  Receipt_Method_Rec;
474  l_record_exists_in_cache  VARCHAR2(2);
475  receipt_md_null EXCEPTION;
476  remittance_bank_valid  EXCEPTION;
477  remittance_bank_invalid  EXCEPTION;
478  remittance_bank_null EXCEPTION;
479  receipt_method_invalid   EXCEPTION;
480 BEGIN
481 
482        IF PG_DEBUG in ('Y', 'C') THEN
483           arp_util.debug('Validate_amount: ' || 'Validate_Receipt_Method()+');
484        END IF;
485 
486        p_return_status := FND_API.G_RET_STS_SUCCESS;
487 
488        l_temp := Method_Info_Cache_Tbl.LAST;
489          IF l_temp IS NULL THEN
490               --The cache is empty : populate it directly.
491               l_record_exists_in_cache := 'N';
492 
493          ELSE
494             --The records exist in the cache, compare them with the current record
495               l_record_exists_in_cache := 'N';
496             FOR l_counter IN 1..l_temp  LOOP
497              IF Method_Info_Cache_Tbl(l_counter).method_id = p_receipt_method_id AND
498                 Method_Info_Cache_Tbl(l_counter).bank_account_id = p_remittance_bank_account_id
499                THEN
500                 --current record exists in the cache, exit out NOCOPY of the loop
501                 l_record_exists_in_cache := 'Y';
502                 EXIT;
503              END IF;
504             END LOOP;
505          END IF;
506             IF PG_DEBUG in ('Y', 'C') THEN
507                arp_util.debug('Validate_amount: ' || 'l_record_exists_in_cache = '||l_record_exists_in_cache);
508             END IF;
509           IF l_record_exists_in_cache = 'N'  THEN
510 
511             --validate the existing record against the database
512 
513               /*--------------------------------+
514                |                                |
515                |   Validate Receipt_method      |
516                |    and Remit bank_account_id   |
517                +--------------------------------*/
518              IF p_receipt_method_id IS NOT NULL
519               THEN
520 
521               --if the creation_status that was derived at the defaulting phase ,
522               -- for this receipt method , is null then the receipt method id is invalid
523                 IF p_state IS NULL THEN
524                     raise receipt_method_invalid;
525                 ELSE
526                 --this is for the case where user had entered the receipt_method
527                 --and the remittance bank id, and only the p_state was defaulted by
528                 --the defaulting routines.
529                 --As per the defaulting routines if remittance bank account id remains
530                 --null(can't be defaulted) then p_state shall also be null.
531                 --
532                 --We validate the receipt method and the remittance bank account id
533                 --seperately to get the relevant error message:
534                   BEGIN
535                    SELECT rm.receipt_method_id,
536                           ba.bank_acct_use_id,
537                           rc.creation_method_code,
538                           rc.remit_flag
539                    INTO  l_dummy_method.method_id,
540                          l_dummy_method.bank_account_id,
541                          l_dummy_method.state,
542                          l_dummy_method.remit_flag
543                    FROM  ar_receipt_methods rm,
544                          ce_bank_accounts cba,
545                          ce_bank_acct_uses ba,
546                          ar_receipt_method_accounts rma,
547                          ar_receipt_classes rc
548                    WHERE rm.receipt_method_id = p_receipt_method_id
549                      and (p_receipt_date between rm.start_date and nvl(rm.end_date, p_receipt_date))
550                      and  ((rc.creation_method_code = DECODE(p_called_from,'BR_REMITTED','BR_REMIT',
551                                                              'BR_FACTORED_WITH_RECOURSE','BR_REMIT',
552                                                              'BR_FACTORED_WITHOUT_RECOURSE','BR_REMIT','@*%?&')) or
553                            (rc.creation_method_code = 'MANUAL') or
554                            (rc.creation_method_code = 'NETTING') or
555                             (rc.creation_method_code = 'AUTOMATIC' and
556                              -- rc.remit_flag = 'Y' and
557                              -- OSTEINME 2/27/2001: removed remit_flag
558                              -- condition for iReceivables CC functionality.
559 			     -- See bug 1659109.
560                               rc.confirm_flag = decode(p_called_from, 'AUTORECAPI',rc.confirm_flag,'N')))
561                      and cba.account_classification = 'INTERNAL'
562                      and nvl(ba.end_date, p_receipt_date +1) > p_receipt_date
563                      and p_receipt_date between rma.start_date and
564                                 nvl(rma.end_date, p_receipt_date)
565                      and cba.currency_code = decode(cba.receipt_multi_currency_flag, 'Y',
566                                    cba.currency_code, p_currency_code)
567                      and rc.receipt_class_id = rm.receipt_class_id
568                      and rm.receipt_method_id = rma.receipt_method_id
569                      and rma.remit_bank_acct_use_id = ba.bank_acct_use_id
570                      and ba.bank_account_id = cba.bank_account_id
571                    --APANDIT: changes made for the misc receipt creation api.
572                      and  ((nvl(p_called_from,'*&#$') <> 'MISC')
573                               or
574                                (rm.receipt_class_id not in (
575                                              SELECT arc.receipt_class_id
576                                              FROM   ar_receipt_classes arc
577                                              WHERE  arc.notes_receivable='Y'
578                                                 or  arc.bill_of_exchange_flag='Y')));
579 
580                      --this above PL/SQL block will get successfully executed only in the case when
581                      --receipt method has only one valid remittance bank account and in this case
582                      --we can directly compare the remittance bank account id with the value obtained
583                      --from the above query and if it is not same then the remittance bank account id
584                      --is invalid
585 
586                    IF p_remittance_bank_account_id IS NOT NULL THEN
587                      IF l_dummy_method.bank_account_id = p_remittance_bank_account_id THEN
588                         IF PG_DEBUG in ('Y', 'C') THEN
589                            arp_util.debug('Validate_amount: ' || 'Remittance bank account id is valid ');
590                         END IF;
591 
592             			--Cache the valid record [Bug 6454022]
593             			IF (p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
594             			   l_temp := nvl(l_temp,0) + 1;
595             			   Method_Info_Cache_Tbl(l_temp) := l_dummy_method;
596             			END IF;
597 
598                         raise remittance_bank_valid;
599                      ELSE
600                        raise remittance_bank_invalid;
601                      END IF;
602                      --if the remittance bank account id is null then whatever has defaulted into
603                      --l_dummy_method.bank_account_id is valid is the above validation sql
604                      --got executed sucessfully
605                    END IF;
606                   EXCEPTION
607                    WHEN too_many_rows THEN
608                     --the receipt method is valid but has more than one remittance bank account
609                     --If the remittance bank account id is null at this stage that means that neither the
610                     --user had not entered one and nor could it be defaulted
611                       IF PG_DEBUG in ('Y', 'C') THEN
612                          arp_util.debug('Validate_amount: ' || 'Too_many_rows raised');
613                       END IF;
614                       null;
615                    WHEN no_data_found THEN
616                     IF PG_DEBUG in ('Y', 'C') THEN
617                        arp_util.debug('Validate_amount: ' || 'no_data_found_raised');
618                     END IF;
619                     raise receipt_method_invalid;
620                     --raising the exception here so that the next block which validates the
621                     --remittance bank_id does not executed and the exception in trapped in the
622                     --exception handler of the outer block.
623                   END;
624                 END IF; --p_state is null
625               ELSE
626                     raise receipt_md_null;
627               END IF; --p_method_id is null
628 
629               --this code would get executed only in case of the too_many_rows exception
630               --being raised in the previous block
631               IF p_remittance_bank_account_id IS NULL THEN
632                  raise remittance_bank_null;
633               ELSE
634 
635                   BEGIN
636                    SELECT rm.receipt_method_id,
637                           ba.bank_acct_use_id,
638                           rc.creation_method_code,
639                           rc.remit_flag
640                    INTO  l_dummy_method.method_id,
641                          l_dummy_method.bank_account_id,
642                          l_dummy_method.state,
643                          l_dummy_method.remit_flag
644                    FROM  ar_receipt_methods rm,
645                          ce_bank_accounts cba,
646                          ce_bank_acct_uses ba,
647                          ar_receipt_method_accounts rma,
648                          ar_receipt_classes rc
649                    WHERE rm.receipt_method_id = p_receipt_method_id
650                      and rma.remit_bank_acct_use_id = p_remittance_bank_account_id
651                      and (p_receipt_date between rm.start_date and nvl(rm.end_date, p_receipt_date))
652                      and  ((rc.creation_method_code = DECODE(p_called_from,'BR_REMITTED','BR_REMIT',
653                                                              'BR_FACTORED_WITH_RECOURSE','BR_REMIT',
654                                                              'BR_FACTORED_WITHOUT_RECOURSE','BR_REMIT','@*%?&')) or
655                            (rc.creation_method_code = 'MANUAL') or
656                            (rc.creation_method_code = 'NETTING') or
657                             (rc.creation_method_code = 'AUTOMATIC' and
658                              -- rc.remit_flag = 'Y' and
659                              -- OSTEINME 2/27/2001: removed remit_flag
660                              -- condition for iReceivables CC functionality.
661 			     -- See bug 1659109.
662                              -- bichatte autorecapi.
663                                rc.confirm_flag = decode(p_called_from, 'AUTORECAPI',rc.confirm_flag,'N')))
664                      and cba.account_classification = 'INTERNAL'
665                      and nvl(ba.end_date, p_receipt_date +1) > p_receipt_date
666                      and p_receipt_date between rma.start_date and
667                                 nvl(rma.end_date, p_receipt_date)
668                      and cba.currency_code = decode(cba.receipt_multi_currency_flag, 'Y',
669                                    cba.currency_code, p_currency_code)
670                      and rc.receipt_class_id = rm.receipt_class_id
671                      and rm.receipt_method_id = rma.receipt_method_id
672                      and rma.remit_bank_acct_use_id = ba.bank_acct_use_id
673                      and ba.bank_account_id = cba.bank_account_id
674                    --APANDIT: changes made for the misc receipt creation api.
675                      and  ((nvl(p_called_from,'*&#$') <> 'MISC')
676                            or
677                               (rm.receipt_class_id not in (
678                                        SELECT arc.receipt_class_id
679                                        FROM   ar_receipt_classes arc
680                                        WHERE  arc.notes_receivable='Y'
681                                           OR  arc.bill_of_exchange_flag='Y')));
682 
683                   EXCEPTION
684                    WHEN no_data_found THEN
685                     raise remittance_bank_invalid;
686                   END;
687              END IF;
688 
689              IF (p_return_status = FND_API.G_RET_STS_SUCCESS) THEN
690                l_temp := nvl(l_temp,0) + 1;
691                Method_Info_Cache_Tbl(l_temp) := l_dummy_method;
692              END IF;
693 
694           END IF;
695   IF PG_DEBUG in ('Y', 'C') THEN
696      arp_util.debug('Validate_amount: ' || 'Validate_Receipt_Method ()-');
697   END IF;
698 EXCEPTION
699 WHEN receipt_method_invalid THEN
700  IF ar_receipt_api_pub.Original_create_cash_info.receipt_method_id IS NOT NULL THEN
701   p_return_status := FND_API.G_RET_STS_ERROR;
702   FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCPT_MD_ID_INVALID');
703   FND_MSG_PUB.Add;
704   IF PG_DEBUG in ('Y', 'C') THEN
705      arp_util.debug('Validate_amount: ' || 'Invalid receipt method id ');
706   END IF;
707  ELSIF ar_receipt_api_pub.Original_create_cash_info.receipt_method_name IS NOT NULL THEN
708   p_return_status := FND_API.G_RET_STS_ERROR;
709   FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCT_MD_NAME_INVALID');
710   FND_MSG_PUB.Add;
711   IF PG_DEBUG in ('Y', 'C') THEN
712      arp_util.debug('Validate_amount: ' || 'Invalid receipt method name ');
713   END IF;
714  END IF;
715 
716 WHEN remittance_bank_valid THEN
717   null;
718   IF PG_DEBUG in ('Y', 'C') THEN
719      arp_util.debug('Validate_amount: ' || 'Exception: remittance_bank_valid ');
720   END IF;
721 
722 WHEN remittance_bank_invalid THEN
723  IF ar_receipt_api_pub.Original_create_cash_info.remit_bank_acct_use_id IS NOT NULL THEN
724   p_return_status := FND_API.G_RET_STS_ERROR;
725   FND_MESSAGE.SET_NAME('AR','AR_RAPI_REM_BK_AC_ID_INVALID');
726   FND_MSG_PUB.Add;
727   IF PG_DEBUG in ('Y', 'C') THEN
728      arp_util.debug('Validate_amount: ' || 'Invalid remittance bank account id');
729   END IF;
730  ELSIF ar_receipt_api_pub.Original_create_cash_info.remittance_bank_account_num IS NOT NULL THEN
731   p_return_status := FND_API.G_RET_STS_ERROR;
732   FND_MESSAGE.SET_NAME('AR','AR_RAPI_REM_BK_AC_NUM_INVALID');
733   FND_MSG_PUB.Add;
734   IF PG_DEBUG in ('Y', 'C') THEN
735      arp_util.debug('Validate_amount: ' || 'Invalid remittance bank account number');
736   END IF;
737  ELSIF ar_receipt_api_pub.Original_create_cash_info.remittance_bank_account_name IS NOT NULL THEN
738   p_return_status := FND_API.G_RET_STS_ERROR;
739   FND_MESSAGE.SET_NAME('AR','AR_RAPI_REM_BK_AC_NAME_INVALID');
740   FND_MSG_PUB.Add;
741   IF PG_DEBUG in ('Y', 'C') THEN
742      arp_util.debug('Validate_amount: ' || 'Invalid remittance bank account name');
743   END IF;
744  END IF;
745 
746 WHEN remittance_bank_null THEN
747   p_return_status := FND_API.G_RET_STS_ERROR;
748   FND_MESSAGE.SET_NAME('AR','AR_RAPI_REM_BK_AC_ID_NULL');
749   FND_MSG_PUB.Add;
750   IF PG_DEBUG in ('Y', 'C') THEN
751      arp_util.debug('Validate_amount: ' || 'The remittance bank account could not be defaulted ');
752   END IF;
753 WHEN receipt_md_null  THEN
754   p_return_status := FND_API.G_RET_STS_ERROR;
755   FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCPT_MD_ID_NULL');
756   FND_MSG_PUB.Add;
757   IF PG_DEBUG in ('Y', 'C') THEN
758      arp_util.debug('Validate_amount: ' || 'The receipt method id is null ');
759   END IF;
760 WHEN others THEN
761   IF PG_DEBUG in ('Y', 'C') THEN
762      arp_util.debug('Validate_amount: ' || 'EXCEPTION: Validate_Receipt_Method_() ');
763                         arp_util.debug('Validate_amount: ' || 'p_receipt_method_id  =  '
764                                ||TO_CHAR(p_receipt_method_id));
765                         arp_util.debug('Validate_amount: ' || 'p_remittance_bank_account_id = '
766                                ||TO_CHAR(p_remittance_bank_account_id));
767                      END IF;
768                      RAISE;
769 END Validate_Receipt_Method;
770 
771 PROCEDURE Validate_Exchange_Rate(
772                       p_currency_code       IN  VARCHAR2,
773                       p_exchange_rate_type  IN  VARCHAR2,
774                       p_exchange_rate       IN  NUMBER,
775                       p_exchange_rate_date  IN  DATE,
776                       p_return_status       OUT NOCOPY VARCHAR2) IS
777 l_euro_to_emu_rate  NUMBER;
778 l_cross_rate   NUMBER;
779 l_conversion_rate  NUMBER;
780 l_exchange_rate_valid   varchar2(2);
781 BEGIN
782 
783  p_return_status := FND_API.G_RET_STS_SUCCESS;
784 
785  IF p_currency_code <> arp_global.functional_currency THEN
786 
787    IF p_exchange_rate_type IS NULL THEN
788 
789      -- raise exception
790      p_return_status := FND_API.G_RET_STS_ERROR;
791      FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_TYPE_NULL');
792      FND_MSG_PUB.Add;
793     Return;
794 
795    ELSE
796      -- Validate the rate_type against the database values
797      -- if invalid then return
798     BEGIN
799      SELECT 'Y'
800      INTO   l_exchange_rate_valid
801      FROM   gl_daily_conversion_types
802      WHERE  conversion_type = p_exchange_rate_type;
803     EXCEPTION
804      WHEN no_data_found THEN
805       p_return_status := FND_API.G_RET_STS_ERROR;
806       FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_TYPE_INVALID');
807       FND_MSG_PUB.Add;
808       Return;
809     END;
810 
811     IF  p_exchange_rate_type = 'User' THEN
812 
813       IF p_exchange_rate IS NULL THEN
814         --raise error message, because for rate_type 'User' the rate should be specified.
815         p_return_status := FND_API.G_RET_STS_ERROR;
816         FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_NULL');
817         FND_MSG_PUB.Add;
818       ELSIF p_exchange_rate = 0 THEN
819         p_return_status := FND_API.G_RET_STS_ERROR ;
820         FND_MESSAGE.SET_NAME('AR','AR_EXCHANGE_RATE_ZERO');
821         FND_MSG_PUB.Add;
822       ELSIF p_exchange_rate < 0 THEN
823         p_return_status := FND_API.G_RET_STS_ERROR ;
824         FND_MESSAGE.SET_NAME('AR','AR_EXCHANGE_RATE_NEGATIVE');
825         FND_MSG_PUB.Add;
826       END IF;
827 
828     ELSE
829        --this is the case where rate_type <> 'User'
830       IF p_exchange_rate IS NULL THEN
831        --This could happen only in case if the defaulting routines
832        --could not get the exchange_rate
833        --raise an error message in that case
834 
835         p_return_status := FND_API.G_RET_STS_ERROR;
836         FND_MESSAGE.SET_NAME('AR','AR_NO_RATE_DATA_FOUND');
837         FND_MSG_PUB.Add;
838       END IF;
839 
840     END IF;
841 
842    END IF;
843  ELSE
844    --the functional and the entered currency are same
845    --so there should be no exchange_rate information
846 
847     IF (p_exchange_rate IS NOT NULL) THEN
848         p_return_status := FND_API.G_RET_STS_ERROR ;
849         FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_INVALID');
850         FND_MSG_PUB.Add;
851     END IF;
852     IF (p_exchange_rate_type IS NOT NULL)  THEN
853         p_return_status := FND_API.G_RET_STS_ERROR ;
854         FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_TYPE_INVALID');
855         FND_MSG_PUB.Add;
856     END IF;
857     IF (p_exchange_rate_date IS NOT NULL)  THEN
858         p_return_status := FND_API.G_RET_STS_ERROR ;
859         FND_MESSAGE.SET_NAME('AR','AR_RAPI_X_RATE_DATE_INVALID');
860         FND_MSG_PUB.Add;
861     END IF;
862  END IF;
863 EXCEPTION
864  WHEN others THEN
865   IF PG_DEBUG in ('Y', 'C') THEN
866      arp_util.debug('Validate_amount: ' || 'EXCEPTION: Validate_Exchange_Rate() ');
867      arp_util.debug('Validate_amount: ' || 'p_exchange_rate_type  =  '
868                  ||p_exchange_rate_type);
869   END IF;
870   RAISE;
871 END Validate_Exchange_Rate;
872 
873 FUNCTION Is_currency_valid(p_currency_code IN
874                             ar_cash_receipts.currency_code%TYPE) RETURN VARCHAR2 IS
875 l_currency_valid VARCHAR2(1);
876 BEGIN
877    SELECT 'Y'
878    INTO   l_currency_valid
879    FROM   fnd_currencies
880    WHERE  p_currency_code = currency_code;
881 
882    RETURN(l_currency_valid);
883 EXCEPTION
884 WHEN no_data_found THEN
885  l_currency_valid := 'N';
886  RETURN(l_currency_valid);
887 WHEN others THEN
888  IF PG_DEBUG in ('Y', 'C') THEN
889     arp_util.debug('Validate_amount: ' || 'EXCEPTION: Validate_Exchange_Rate() ');
890     arp_util.debug('Validate_amount: ' || 'p_currency_code  =  '||p_currency_code);
891  END IF;
892  raise;
893 END Is_currency_valid;
894 
895 PROCEDURE Validate_Currency(
896                     p_currency_code IN ar_cash_receipts.currency_code%TYPE,
897                     p_exchange_rate_type IN ar_cash_receipts.exchange_rate_type%TYPE,
898                     p_exchange_rate IN ar_cash_receipts.exchange_rate%TYPE,
899                     p_exchange_rate_date IN ar_cash_receipts.exchange_date%TYPE,
900                     p_return_status OUT NOCOPY VARCHAR2) IS
901 BEGIN
902      p_return_status := FND_API.G_RET_STS_SUCCESS;
903      IF (Is_currency_valid(p_currency_code) = 'Y') THEN
904 
905        IF  ((arp_global.functional_currency <> p_currency_code) OR
906             (p_exchange_rate_type IS NOT NULL OR
907              p_exchange_rate IS NOT NULL OR
908              p_exchange_rate_date IS NOT NULL)) THEN
909 
910           Validate_Exchange_Rate(p_currency_code,
911                                  p_exchange_rate_type,
912                                  p_exchange_rate,
913                                  p_exchange_rate_date,
914                                  p_return_status);
915          END IF;
916      ELSE
917         --the entered currency is invalid
918         p_return_status := FND_API.G_RET_STS_ERROR;
919         FND_MESSAGE.SET_NAME('AR','AR_RAPI_CURR_CODE_INVALID');
920         FND_MSG_PUB.Add;
921      END IF;
922 END Validate_Currency;
923 
924 PROCEDURE val_duplicate_receipt(p_receipt_number IN VARCHAR2,
925                         p_receipt_date   IN DATE,
926                         p_amount         IN NUMBER,
927                         p_type           IN VARCHAR2,
928                         p_customer_id    IN NUMBER,
929                         p_return_status  OUT NOCOPY VARCHAR2) IS
930 l_duplicate_receipt     varchar2(1) := 'N';
931 CURSOR validate_duplicate_receipt IS
932       SELECT 'Y'
933       FROM   ar_cash_receipts cr
934       WHERE  cr.receipt_number                 = p_receipt_number
935       AND    cr.receipt_date                   = p_receipt_date
936       AND    cr.amount                         = p_amount
937       AND    NVL(cr.pay_from_customer, -99999) = NVL(p_customer_id, -99999)
938       AND    cr.type                           = p_type
939       AND    cr.status                         <> 'REV';
940 
941 BEGIN
942  IF PG_DEBUG in ('Y', 'C') THEN
943     arp_util.debug('Validate_amount: ' || 'val_duplicate_receipt ()+');
944  END IF;
945     BEGIN
946 
947       OPEN  validate_duplicate_receipt;
948       FETCH validate_duplicate_receipt INTO l_duplicate_receipt;
949       CLOSE validate_duplicate_receipt;
950 
951     EXCEPTION
952       WHEN NO_DATA_FOUND THEN
953         null;
954       WHEN TOO_MANY_ROWS THEN
955         l_duplicate_receipt := 'Y';
956     END;
957 
958    IF PG_DEBUG in ('Y', 'C') THEN
959       arp_util.debug('Validate_amount: ' || 'l_duplicate_receipt  :'||l_duplicate_receipt);
960    END IF;
961    -- Do not allow to create duplicate receipts
962     IF l_duplicate_receipt = 'Y' THEN
963        IF p_type = 'CASH' THEN
964           FND_MESSAGE.SET_NAME('AR','AR_RW_CASH_DUPLICATE_RECEIPT');
965           FND_MSG_PUB.ADD;
966           p_return_status := FND_API.G_RET_STS_ERROR;
967        ELSIF p_type = 'MISC' THEN
968           FND_MESSAGE.SET_NAME('AR','AR_RW_MISC_DUPLICATE_RECEIPT');
969           FND_MSG_PUB.ADD;
970           p_return_status := FND_API.G_RET_STS_ERROR;
971        END IF;
972 
973     END IF;
974    IF PG_DEBUG in ('Y', 'C') THEN
975       arp_util.debug('Validate_amount: ' || 'val_duplicate_receipt ()-');
976    END IF;
977 END val_duplicate_receipt;
978 
979 PROCEDURE Validate_Cash_Receipt(
980                  p_receipt_number  IN ar_cash_receipts.receipt_number%TYPE,
981                  p_receipt_method_id IN ar_cash_receipts.receipt_method_id%TYPE,
982                  p_state         IN ar_receipt_classes.creation_status%TYPE,
983                  p_receipt_date  IN ar_cash_receipts.receipt_date%TYPE,
984                  p_gl_date       IN ar_cash_receipt_history.gl_date%TYPE,
985                  p_maturity_date IN DATE,
986                  p_deposit_date  IN ar_cash_receipts.deposit_date%TYPE,
987                  p_amount        IN OUT NOCOPY ar_cash_receipts.amount%TYPE,
988                  p_factor_discount_amount   IN ar_cash_receipts.factor_discount_amount%TYPE,
989                  p_customer_id              IN ar_cash_receipts.pay_from_customer%TYPE,
990                  /* 6612301 */
991                  p_customer_bank_account_id IN OUT NOCOPY ar_cash_receipts.customer_bank_account_id%TYPE,
992                  p_location                 IN hz_cust_site_uses.location%TYPE,
993                  p_customer_site_use_id     IN OUT NOCOPY ar_cash_receipts.customer_site_use_id%TYPE,
994                  p_remittance_bank_account_id   IN ar_cash_receipts.remit_bank_acct_use_id%TYPE,
995                  p_override_remit_account_flag  IN ar_cash_receipts.override_remit_account_flag%TYPE,
996                  p_anticipated_clearing_date    IN ar_cash_receipts.anticipated_clearing_date%TYPE,
997                  p_currency_code            IN ar_cash_receipts.currency_code%TYPE,
998                  p_exchange_rate_type       IN ar_cash_receipts.exchange_rate_type%TYPE,
999                  p_exchange_rate            IN ar_cash_receipts.exchange_rate%TYPE,
1000                  p_exchange_rate_date       IN ar_cash_receipts.exchange_date%TYPE,
1001                  p_doc_sequence_value       IN NUMBER,
1002                  p_called_from              IN VARCHAR2,
1003                  p_return_status            OUT NOCOPY VARCHAR2)
1004 IS
1005 l_receipt_date_return_status  VARCHAR2(1);
1006 l_gl_date_return_status  VARCHAR2(1);
1007 l_deposit_date_return_status  VARCHAR2(1);
1008 l_maturity_date_return_status  VARCHAR2(1);
1009 l_rcpt_md_return_status   VARCHAR2(1);
1010 l_amount_return_status   VARCHAR2(1);
1011 l_customer_return_status  VARCHAR2(1);
1012 l_override_remit_return_status  VARCHAR2(1);
1013 l_currency_return_status VARCHAR2(1);
1014 l_doc_seq_return_status  VARCHAR2(1);
1015 l_dup_return_status      VARCHAR2(1);
1016 BEGIN
1017 	IF PG_DEBUG in ('Y', 'C') THEN
1018 	   arp_util.debug('Validate_amount: ' || 'Validate_Receipt()+ ');
1019 	END IF;
1020 
1021       p_return_status := FND_API.G_RET_STS_SUCCESS;
1022 
1023     --Validate receipt_date
1024 
1025       Validate_Receipt_Date(p_receipt_date,
1026                             l_receipt_date_return_status);
1027       IF PG_DEBUG in ('Y', 'C') THEN
1028          arp_util.debug('Validate_amount: ' || 'l_receipt_date_return_status : '||l_receipt_date_return_status);
1029       END IF;
1030 
1031     --Validate gl_date
1032 
1033       Validate_Gl_Date(p_gl_date,
1034                        l_gl_date_return_status);
1035       IF PG_DEBUG in ('Y', 'C') THEN
1036          arp_util.debug('Validate_amount: ' || 'l_gl_date_return_status : '||l_gl_date_return_status);
1037       END IF;
1038     --Validate deposit_date
1039 
1040       Validate_Deposit_Date(p_deposit_date,
1041                             l_deposit_date_return_status);
1042       IF PG_DEBUG in ('Y', 'C') THEN
1043          arp_util.debug('Validate_amount: ' || 'l_deposit_date_return_status : '||l_deposit_date_return_status);
1044       END IF;
1045 
1046     --Validate maturity_date
1047 
1048       Validate_Maturity_Date(p_maturity_date,
1049                              p_receipt_date,
1050                              l_maturity_date_return_status);
1051        IF PG_DEBUG in ('Y', 'C') THEN
1052           arp_util.debug('Validate_amount: ' || 'l_maturity_date_return_status : '||l_maturity_date_return_status);
1053        END IF;
1054 
1055 
1056     --Validate Receipt_method
1057       Validate_Receipt_Method(p_receipt_method_id,
1058                               p_remittance_bank_account_id,
1059                               p_receipt_date,
1060                               p_currency_code,
1061                               p_state,
1062                               p_called_from,
1063                               l_rcpt_md_return_status);
1064        IF PG_DEBUG in ('Y', 'C') THEN
1065           arp_util.debug('Validate_amount: ' || 'l_rcpt_md_return_status : '||l_rcpt_md_return_status);
1066        END IF;
1067 
1068    --Validate document sequence value
1069 
1070       IF(NVL(ar_receipt_lib_pvt.pg_profile_doc_seq, 'N') = 'N' )  AND
1071           p_doc_sequence_value IS NOT NULL
1072         THEN
1073              l_doc_seq_return_status := FND_API.G_RET_STS_ERROR ;
1074              FND_MESSAGE.SET_NAME('AR','AR_RAPI_DOC_SEQ_VAL_INVALID');
1075              FND_MSG_PUB.Add;
1076        END IF;
1077    --Validate amount
1078       Validate_amount(p_amount ,
1079                       p_factor_discount_amount,
1080                       p_state,
1081                       'CASH',
1082                       l_amount_return_status);
1083       IF PG_DEBUG in ('Y', 'C') THEN
1084          arp_util.debug('Validate_amount: ' || 'l_amount_return_status : '||l_amount_return_status);
1085       END IF;
1086 
1087     --Validate Customer info
1088 
1089       Validate_Customer(p_customer_id,
1090                         /* 6612301 */
1091                         p_customer_bank_account_id,
1092                         p_location,
1093                         p_customer_site_use_id,
1094                         p_currency_code,
1095                         p_receipt_date,
1096                         l_customer_return_status);
1097       IF PG_DEBUG in ('Y', 'C') THEN
1098          arp_util.debug('Validate_amount: ' || 'l_customer_return_status : '||l_customer_return_status);
1099       END IF;
1100 
1101     --Validate the override_remit_bank_account_flag
1102       IF (p_override_remit_account_flag NOT IN ('Y','N')) THEN
1103        FND_MESSAGE.SET_NAME('AR','AR_OVERR_REM_BK_FLAG_INVALID');
1104        FND_MSG_PUB.ADD;
1105        l_override_remit_return_status := FND_API.G_RET_STS_ERROR;
1106       ELSE
1107        l_override_remit_return_status := FND_API.G_RET_STS_SUCCESS;
1108       END IF;
1109       IF PG_DEBUG in ('Y', 'C') THEN
1110          arp_util.debug('Validate_amount: ' || 'l_override_remit_return_status : '||l_override_remit_return_status);
1111       END IF;
1112 
1113     --Validate currency and exchange rate info.
1114      IF p_currency_code <> arp_global.functional_currency OR
1115         p_exchange_rate_type IS NOT NULL OR
1116         p_exchange_rate  IS NOT NULL OR
1117         p_exchange_rate_date  IS NOT NULL THEN
1118        Validate_currency(p_currency_code,
1119                          p_exchange_rate_type,
1120                          p_exchange_rate,
1121                          p_exchange_rate_date,
1122                          l_currency_return_status);
1123      END IF;
1124      IF PG_DEBUG in ('Y', 'C') THEN
1125         arp_util.debug('Validate_amount: ' || 'l_currency_return_status : '||l_currency_return_status);
1126      END IF;
1127 
1128      IF p_receipt_number IS NOT NULL AND
1129         p_amount IS NOT NULL THEN
1130         val_duplicate_receipt(p_receipt_number ,
1131                               p_receipt_date   ,
1132                               p_amount         ,
1133                               'CASH'           ,
1134                               p_customer_id    ,
1135                               l_dup_return_status );
1136      END IF;
1137 
1138      IF (l_receipt_date_return_status =  FND_API.G_RET_STS_ERROR) OR
1139         (l_gl_date_return_status = FND_API.G_RET_STS_ERROR) OR
1140         (l_deposit_date_return_status = FND_API.G_RET_STS_ERROR) OR
1141         (l_maturity_date_return_status = FND_API.G_RET_STS_ERROR) OR
1142         (l_rcpt_md_return_status = FND_API.G_RET_STS_ERROR) OR
1143         (l_amount_return_status = FND_API.G_RET_STS_ERROR) OR
1144         (l_customer_return_status = FND_API.G_RET_STS_ERROR) OR
1145         (l_override_remit_return_status = FND_API.G_RET_STS_ERROR) OR
1146         (l_currency_return_status = FND_API.G_RET_STS_ERROR) OR
1147         (l_doc_seq_return_status = FND_API.G_RET_STS_ERROR) OR
1148         (l_dup_return_status = FND_API.G_RET_STS_ERROR)
1149        THEN
1150         p_return_status := FND_API.G_RET_STS_ERROR;
1151      END IF;
1152     IF PG_DEBUG in ('Y', 'C') THEN
1153        arp_util.debug('Validate_amount: ' || 'Validate_Cash_Receipt Return status :'||p_return_status);
1154     END IF;
1155 
1156 EXCEPTION
1157  WHEN others THEN
1158   raise;
1159 
1160 END Validate_Cash_Receipt;
1161 
1162 
1163 PROCEDURE Validate_amount_applied(
1164                       p_amount_applied              IN NUMBER,
1165                       p_applied_payment_schedule_id IN NUMBER,
1166                       p_customer_trx_line_id        IN NUMBER,
1167                       p_inv_line_amount             IN NUMBER,
1168                       p_creation_sign               IN VARCHAR2,
1169                       p_allow_overappln_flag  IN VARCHAR2,
1170                       p_natural_appln_only_flag IN VARCHAR2,
1171                       p_discount                    IN NUMBER,
1172                       p_amount_due_remaining        IN NUMBER,
1173                       p_amount_due_original         IN NUMBER,
1174                       p_return_status               OUT NOCOPY VARCHAR2
1175                        ) IS
1176 l_message_name    VARCHAR2(50);
1177 BEGIN
1178    IF PG_DEBUG in ('Y', 'C') THEN
1179       arp_util.debug('Validate_amount_applied ()+');
1180    END IF;
1181    p_return_status := FND_API.G_RET_STS_SUCCESS;
1182 
1183 
1184   IF p_amount_applied IS NULL
1185     THEN
1186      p_return_status := FND_API.G_RET_STS_ERROR;
1187      FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
1188      FND_MSG_PUB.Add;
1189      return;
1190   /* The amount Applied can be greater than the line amount. The line level application
1191      is not supported yet: Bug 3476306 */
1192   /*ELSE
1193     IF (p_customer_trx_line_id IS NOT NULL) AND
1194        (nvl(p_inv_line_amount,0)  < p_amount_applied)
1195      --in case of line_number being not null and
1196      --inv_line_amount being null error message
1197      --would have been raised in the validate_line_number
1198       THEN
1199        p_return_status := FND_API.G_RET_STS_ERROR;
1200        FND_MESSAGE.SET_NAME('AR','AR_RW_APPLIED_GREATER_LINE');
1201        FND_MESSAGE.SET_TOKEN('AMOUNT',p_inv_line_amount);
1202        FND_MSG_PUB.Add;
1203     END IF; */
1204   END IF;
1205   IF PG_DEBUG in ('Y', 'C') THEN
1206      arp_util.debug('Validate_amount: ' || 'Before calling the check_natural_application routine ');
1207   END IF;
1208   IF p_applied_payment_schedule_id > 0 THEN
1209 
1210         arp_non_db_pkg.check_natural_application(
1211             p_creation_sign             => p_creation_sign
1212           , p_allow_overapplication_flag=> p_allow_overappln_flag
1213           , p_natural_app_only_flag     => p_natural_appln_only_flag
1214           , p_sign_of_ps                => '-'
1215           , p_chk_overapp_if_zero       => 'N'
1216           , p_payment_amount            => p_amount_applied
1217           , p_discount_taken            => p_discount
1218           , p_amount_due_remaining      => p_amount_due_remaining
1219           , p_amount_due_original       => p_amount_due_original
1220           , event                       => 'WHEN-VALIDATE-ITEM'
1221           , p_message_name              => l_message_name);
1222 
1223     IF ( l_message_name IS NOT NULL)
1224      THEN
1225          p_return_status := FND_API.G_RET_STS_ERROR;
1226          FND_MESSAGE.SET_NAME('AR',l_message_name);
1227          FND_MSG_PUB.Add;
1228     END IF;
1229 
1230   END IF;
1231 
1232   IF PG_DEBUG in ('Y', 'C') THEN
1233      arp_util.debug('Validate_amount_applied ()-');
1234   END IF;
1235 END Validate_amount_applied;
1236 
1237 --- LLCA
1238 PROCEDURE Validate_line_applied(
1239                       p_line_amount                 IN NUMBER,
1240                       p_applied_payment_schedule_id IN NUMBER,
1241                       p_customer_trx_line_id        IN NUMBER,
1242                       p_inv_line_amount             IN NUMBER,
1243                       p_creation_sign               IN VARCHAR2,
1244                       p_allow_overappln_flag	    IN VARCHAR2,
1245                       p_natural_appln_only_flag     IN VARCHAR2,
1246 		      p_llca_type		    IN VARCHAR2,
1247                       p_discount                    IN NUMBER,
1248                       p_line_items_remaining        IN NUMBER,
1249                       p_line_items_original         IN NUMBER,
1250                       p_return_status               OUT NOCOPY VARCHAR2
1251                        ) IS
1252 l_line_message_name    VARCHAR2(50);
1253 BEGIN
1254    IF PG_DEBUG in ('Y', 'C') THEN
1255       arp_util.debug('Validate_line_applied ()+');
1256    END IF;
1257    p_return_status := FND_API.G_RET_STS_SUCCESS;
1258 
1259   IF p_line_amount IS NULL THEN
1260      return;
1261   END IF;
1262 
1263   IF PG_DEBUG in ('Y', 'C') THEN
1264      arp_util.debug('Validate_amount: ' || 'Before calling the check_natural_application routine ');
1265   END IF;
1266 
1267   IF p_applied_payment_schedule_id > 0 THEN
1268 
1269         arp_non_db_pkg.check_natural_application(
1270             p_creation_sign             => p_creation_sign
1271           , p_allow_overapplication_flag=> p_allow_overappln_flag
1272           , p_natural_app_only_flag     => p_natural_appln_only_flag
1273           , p_sign_of_ps                => '-'
1274           , p_chk_overapp_if_zero       => 'N'
1275           , p_payment_amount            => p_line_amount
1276           , p_discount_taken            => p_discount
1277           , p_amount_due_remaining      => p_line_items_remaining
1278           , p_amount_due_original       => p_line_items_original
1279           , event                       => 'WHEN-VALIDATE-ITEM'
1280           , p_message_name              => l_line_message_name);
1281 
1282     IF ( l_line_message_name IS NOT NULL)
1283      THEN
1284          p_return_status := FND_API.G_RET_STS_ERROR;
1285          FND_MESSAGE.SET_NAME('AR',l_line_message_name);
1286          FND_MSG_PUB.Add;
1287     END IF;
1288 
1289   END IF;
1290 
1291   IF PG_DEBUG in ('Y', 'C') THEN
1292      arp_util.debug('Validate_line_applied ()-');
1293   END IF;
1294 END Validate_line_applied;
1295 --- LLCA
1296 PROCEDURE Validate_tax_applied(
1297                       p_tax_amount                  IN NUMBER,
1298                       p_applied_payment_schedule_id IN NUMBER,
1299                       p_creation_sign               IN VARCHAR2,
1300                       p_allow_overappln_flag	    IN VARCHAR2,
1301                       p_natural_appln_only_flag     IN VARCHAR2,
1302 		      p_llca_type		    IN VARCHAR2,
1303                       p_discount                    IN NUMBER,
1304                       p_tax_remaining		    IN NUMBER,
1305                       p_tax_original		    IN NUMBER,
1306                       p_return_status               OUT NOCOPY VARCHAR2
1307                        ) IS
1308 l_tax_message_name    VARCHAR2(50);
1309 BEGIN
1310    IF PG_DEBUG in ('Y', 'C') THEN
1311       arp_util.debug('Validate_tax_applied ()+');
1312    END IF;
1313    p_return_status := FND_API.G_RET_STS_SUCCESS;
1314 
1315   IF p_tax_amount IS NULL THEN
1316      return;
1317   END IF;
1318 
1319   IF PG_DEBUG in ('Y', 'C') THEN
1320      arp_util.debug('Validate_amount: ' || 'Before calling the check_natural_application routine ');
1321   END IF;
1322 
1323   IF p_applied_payment_schedule_id > 0 THEN
1324 
1325         arp_non_db_pkg.check_natural_application(
1326             p_creation_sign             => p_creation_sign
1327           , p_allow_overapplication_flag=> p_allow_overappln_flag
1328           , p_natural_app_only_flag     => p_natural_appln_only_flag
1329           , p_sign_of_ps                => '-'
1330           , p_chk_overapp_if_zero       => 'N'
1331           , p_payment_amount            => p_tax_amount
1332           , p_discount_taken            => p_discount
1333           , p_amount_due_remaining      => p_tax_remaining
1334           , p_amount_due_original       => p_tax_original
1335           , event                       => 'WHEN-VALIDATE-ITEM'
1336           , p_message_name              => l_tax_message_name);
1337 
1338     IF ( l_tax_message_name IS NOT NULL)
1339      THEN
1340          p_return_status := FND_API.G_RET_STS_ERROR;
1341          FND_MESSAGE.SET_NAME('AR',l_tax_message_name);
1342          FND_MSG_PUB.Add;
1343     END IF;
1344 
1345   END IF;
1346 
1347   IF PG_DEBUG in ('Y', 'C') THEN
1348      arp_util.debug('Validate_tax_applied ()-');
1349   END IF;
1350 END Validate_tax_applied;
1351 
1352 --- LLCA
1353 PROCEDURE Validate_freight_applied(
1354                       p_freight_amount              IN NUMBER,
1355                       p_applied_payment_schedule_id IN NUMBER,
1356                       p_customer_trx_line_id        IN NUMBER,
1357                       p_inv_line_amount             IN NUMBER,
1358                       p_creation_sign               IN VARCHAR2,
1359                       p_allow_overappln_flag	    IN VARCHAR2,
1360                       p_natural_appln_only_flag     IN VARCHAR2,
1361 		      p_llca_type		    IN VARCHAR2,
1362                       p_discount                    IN NUMBER,
1363                       p_freight_remaining	    IN NUMBER,
1364                       p_freight_original	    IN NUMBER,
1365                       p_return_status               OUT NOCOPY VARCHAR2
1366                        ) IS
1367 l_frt_message_name    VARCHAR2(50);
1368 BEGIN
1369    IF PG_DEBUG in ('Y', 'C') THEN
1370       arp_util.debug('Validate_freight_applied ()+');
1371    END IF;
1372    p_return_status := FND_API.G_RET_STS_SUCCESS;
1373 
1374   IF p_freight_amount IS NULL THEN
1375      return;
1376   END IF;
1377 
1378   IF PG_DEBUG in ('Y', 'C') THEN
1379      arp_util.debug('Validate_amount: ' || 'Before calling the check_natural_application routine ');
1380   END IF;
1381 
1382   IF p_applied_payment_schedule_id > 0 THEN
1383 
1384         arp_non_db_pkg.check_natural_application(
1385             p_creation_sign             => p_creation_sign
1386           , p_allow_overapplication_flag=> p_allow_overappln_flag
1387           , p_natural_app_only_flag     => p_natural_appln_only_flag
1388           , p_sign_of_ps                => '-'
1389           , p_chk_overapp_if_zero       => 'N'
1390           , p_payment_amount            => p_freight_amount
1391           , p_discount_taken            => p_discount
1392           , p_amount_due_remaining      => p_freight_remaining
1393           , p_amount_due_original       => p_freight_original
1394           , event                       => 'WHEN-VALIDATE-ITEM'
1395           , p_message_name              => l_frt_message_name);
1396 
1397     IF ( l_frt_message_name IS NOT NULL)
1398      THEN
1399          p_return_status := FND_API.G_RET_STS_ERROR;
1400          FND_MESSAGE.SET_NAME('AR',l_frt_message_name);
1401          FND_MSG_PUB.Add;
1402     END IF;
1403 
1404   END IF;
1405 
1406   IF PG_DEBUG in ('Y', 'C') THEN
1407      arp_util.debug('Validate_freight_applied ()-');
1408   END IF;
1409 END Validate_freight_applied;
1410 
1411 
1412 --- LLCA
1413 PROCEDURE Validate_charges_applied(
1414                       p_charges_amount              IN NUMBER,
1415                       p_applied_payment_schedule_id IN NUMBER,
1416                       p_customer_trx_line_id        IN NUMBER,
1417                       p_inv_line_amount             IN NUMBER,
1418                       p_creation_sign               IN VARCHAR2,
1419                       p_allow_overappln_flag	    IN VARCHAR2,
1420                       p_natural_appln_only_flag     IN VARCHAR2,
1421       		      p_llca_type		    IN VARCHAR2,
1422                       p_discount                    IN NUMBER,
1423 		      p_rec_charges_remaining 	    IN NUMBER,
1424                       p_rec_charges_charged	    IN NUMBER,
1425                       p_return_status               OUT NOCOPY VARCHAR2
1426                        ) IS
1427 l_message_name    VARCHAR2(50);
1428 BEGIN
1429    IF PG_DEBUG in ('Y', 'C') THEN
1430       arp_util.debug('Validate_charges_applied ()+');
1431    END IF;
1432    p_return_status := FND_API.G_RET_STS_SUCCESS;
1433 
1434   IF p_charges_amount IS NULL THEN
1435      return;
1436   END IF;
1437 
1438   IF PG_DEBUG in ('Y', 'C') THEN
1439      arp_util.debug('Validate_amount: ' || 'Before calling the check_natural_application routine ');
1440   END IF;
1441 
1442   IF p_applied_payment_schedule_id > 0 THEN
1443 
1444         arp_non_db_pkg.check_natural_application(
1445             p_creation_sign             => p_creation_sign
1446           , p_allow_overapplication_flag=> p_allow_overappln_flag
1447           , p_natural_app_only_flag     => p_natural_appln_only_flag
1448           , p_sign_of_ps                => '-'
1449           , p_chk_overapp_if_zero       => 'N'
1450           , p_payment_amount            => p_charges_amount
1451           , p_discount_taken            => p_discount
1452           , p_amount_due_remaining      => p_rec_charges_remaining
1453           , p_amount_due_original       => p_rec_charges_charged
1454           , event                       => 'WHEN-VALIDATE-ITEM'
1455           , p_message_name              => l_message_name);
1456 
1457     IF ( l_message_name IS NOT NULL)
1458      THEN
1459          p_return_status := FND_API.G_RET_STS_ERROR;
1460          FND_MESSAGE.SET_NAME('AR',l_message_name);
1461          FND_MSG_PUB.Add;
1462     END IF;
1463 
1464   END IF;
1465 
1466   IF PG_DEBUG in ('Y', 'C') THEN
1467      arp_util.debug('Validate_charges_applied ()-');
1468   END IF;
1469 END Validate_charges_applied;
1470 
1471 PROCEDURE Validate_amount_applied_from(
1472                            p_amount_applied_from  IN NUMBER,
1473                            p_amount_applied   IN NUMBER,
1474                            p_cr_unapp_amount IN NUMBER,
1475                            p_cr_currency_code IN VARCHAR2,
1476                            p_trx_currency_code IN VARCHAR2,
1477                            p_return_status OUT NOCOPY VARCHAR2
1478                                       ) IS
1479 l_remaining_unapp_rct_amt NUMBER;
1480 
1481 BEGIN
1482     IF PG_DEBUG in ('Y', 'C') THEN
1483        arp_util.debug('Validate_amount_applied_from ()+');
1484     END IF;
1485     p_return_status := FND_API.G_RET_STS_SUCCESS;
1486     /* Bugfix 2634721. Modified the NVL clause */
1487     l_remaining_unapp_rct_amt := p_cr_unapp_amount - nvl(p_amount_applied_from, p_amount_applied);
1488 
1489     IF l_remaining_unapp_rct_amt < 0 THEN
1490      IF PG_DEBUG in ('Y', 'C') THEN
1491         arp_util.debug('Validate_amount: ' || 'l_remaining_unapp_rct_amt :'||to_char(l_remaining_unapp_rct_amt));
1492      END IF;
1493        p_return_status := FND_API.G_RET_STS_ERROR;
1494        FND_MESSAGE.SET_NAME('AR','AR_RW_APP_NEG_UNAPP');
1495        FND_MSG_PUB.Add;
1496     END IF;
1497 
1498     IF p_cr_currency_code = p_trx_currency_code AND
1499        p_amount_applied_from IS NOT NULL
1500      THEN
1501        FND_MESSAGE.SET_NAME('AR','AR_RAPI_AMT_APP_FROM_INVALID');
1502        FND_MSG_PUB.Add;
1503        p_return_status := FND_API.G_RET_STS_ERROR;
1504     END IF;
1505      IF PG_DEBUG in ('Y', 'C') THEN
1506         arp_util.debug('Validate_amount_applied_from ()-');
1507      END IF;
1508 END  Validate_amount_applied_from;
1509 
1510 /* Added this over loaded procedure for bug 3119391 */
1511 PROCEDURE Validate_amount_applied_from(
1512                                p_receivable_application_id IN NUMBER,
1513 			       p_cr_unapp_amount IN NUMBER,
1514                                p_return_status OUT NOCOPY VARCHAR2
1515 			       ) IS
1516 l_amount_applied NUMBER;
1517 l_amount_applied_from NUMBER;
1518 l_remaining_unapp_rct_amt NUMBER;
1519 BEGIN
1520     IF PG_DEBUG in ('Y', 'C') THEN
1521        arp_util.debug('Validate_amount_applied_from over loaded()+');
1522     END IF;
1523     p_return_status := FND_API.G_RET_STS_SUCCESS;
1524 
1525     SELECT amount_applied,
1526            amount_applied_from INTO l_amount_applied,l_amount_applied_from
1527     FROM  ar_receivable_applications
1528     WHERE receivable_application_id = p_receivable_application_id;
1529 
1530     l_remaining_unapp_rct_amt := p_cr_unapp_amount + nvl(l_amount_applied_from, l_amount_applied);
1531 
1532     IF l_remaining_unapp_rct_amt < 0 THEN
1533       IF PG_DEBUG in ('Y', 'C') THEN
1534         arp_util.debug('Validate_amount_applied_from: ' || 'l_remaining_unapp_rct_amt :'||to_char(l_remaining_unapp_rct_amt));
1535       END IF;
1536       p_return_status := FND_API.G_RET_STS_ERROR;
1537       FND_MESSAGE.SET_NAME('AR','AR_RW_AMOUNT_LESS_THAN_APP');
1538       FND_MSG_PUB.Add;
1539     END IF;
1540     IF PG_DEBUG in ('Y', 'C') THEN
1541       arp_util.debug('Validate_amount_applied_from over loaded()-');
1542     END IF;
1543 END  Validate_amount_applied_from;
1544 
1545 PROCEDURE Validate_trans_to_receipt_rate(
1546                            p_trans_to_receipt_rate IN NUMBER,
1547                            p_cr_currency_code IN VARCHAR2,
1548                            p_trx_currency_code IN VARCHAR2,
1549                            p_amount_applied IN NUMBER,
1550                            p_amount_applied_from IN NUMBER,
1551                            p_return_status OUT NOCOPY VARCHAR2
1552                            ) IS
1553 l_amount_applied_cr  NUMBER; --amount_applied in receipt currency
1554 l_amount_applied_from  NUMBER;
1555 l_amount_applied   NUMBER;
1556 BEGIN
1557      IF PG_DEBUG in ('Y', 'C') THEN
1558         arp_util.debug('Validate_trans_to_receipt_rate ()+');
1559      END IF;
1560      p_return_status := FND_API.G_RET_STS_SUCCESS;
1561   --Validate the trans_to_receipt_rate
1562    IF p_trx_currency_code = p_cr_currency_code  AND
1563       p_trans_to_receipt_rate IS NOT NULL
1564     THEN
1565      --raise error because this is not a cross-currency application
1566      --and the user should not have specified a value for trans_to_receipt_rate
1567 
1568        p_return_status := FND_API.G_RET_STS_ERROR;
1569        FND_MESSAGE.SET_NAME('AR','AR_RAPI_CC_RATE_INVALID');
1570        FND_MSG_PUB.Add;
1571    ELSIF p_trx_currency_code <> p_cr_currency_code THEN
1572       IF p_trans_to_receipt_rate IS NULL THEN
1573 
1574          p_return_status := FND_API.G_RET_STS_ERROR;
1575          FND_MESSAGE.SET_NAME('AR','AR_RAPI_CC_RATE_NULL');
1576          FND_MSG_PUB.Add;
1577       ELSIF p_trans_to_receipt_rate < 0 THEN
1578 
1579          p_return_status := FND_API.G_RET_STS_ERROR;
1580          FND_MESSAGE.SET_NAME('AR','AR_RW_CC_RATE_POSITIVE');
1581          FND_MSG_PUB.Add;
1582 
1583       ELSE
1584 
1585       --Validate the trans_to_receipt_rate with reference to
1586       --amount_applied_from and amount_applied as we should
1587       --always maintain the following relationship between the
1588       --three :
1589       --amount_applied * trans_to_receipt_rate
1590       --                       = amount_applied_from.
1591       --this is to be done only if the user had passed in the values
1592       --for both amount_applied_from and trans_to_receipt_rate
1593        IF p_amount_applied IS NOT NULL AND
1594           ar_receipt_api_pub.Original_application_info.amount_applied_from IS NOT NULL AND
1595           ar_receipt_api_pub.Original_application_info.trans_to_receipt_rate IS NOT NULL
1596         THEN
1597          l_amount_applied := arp_util.CurrRound(
1598                                      p_amount_applied,
1599                                      p_trx_currency_code
1600                                     );
1601          l_amount_applied_cr := arp_util.CurrRound(
1602                                    l_amount_applied*p_trans_to_receipt_rate,
1603                                    p_cr_currency_code
1604                                     );
1605          l_amount_applied_from := arp_util.CurrRound(
1606                                    p_amount_applied_from,
1607                                    p_cr_currency_code
1608                                     );
1609 
1610          IF l_amount_applied_cr <> l_amount_applied_from  THEN
1611            p_return_status := FND_API.G_RET_STS_ERROR;
1612            FND_MESSAGE.SET_NAME('AR','AR_RAPI_CC_RATE_AMTS_INVALID');
1613            FND_MSG_PUB.Add;
1614          END IF;
1615        END IF;
1616    END IF;
1617   END IF;
1618      IF PG_DEBUG in ('Y', 'C') THEN
1619         arp_util.debug('Validate_trans_to_receipt_rate ()-');
1620      END IF;
1621 EXCEPTION
1622  WHEN others THEN
1623    IF PG_DEBUG in ('Y', 'C') THEN
1624       arp_util.debug('Validate_trans_to_receipt_rate: ' || 'EXCEPTION: Validate_Exchange_Rate() ');
1625    END IF;
1626    raise;
1627 END Validate_trans_to_receipt_rate;
1628 
1629 PROCEDURE Validate_discount(p_discount IN NUMBER,
1630                             p_amount_due_remaining IN NUMBER,
1631                             p_amount_due_original IN NUMBER,
1632                             p_amount_applied IN NUMBER,
1633                             p_partial_discount_flag IN VARCHAR2,
1634                             p_applied_payment_schedule_id IN NUMBER,
1635                             p_discount_earned_allowed IN NUMBER,
1636                             p_discount_max_allowed IN NUMBER,
1637                             p_trx_currency_code  IN VARCHAR2,
1638                             p_return_status OUT NOCOPY VARCHAR2
1639                             ) IS
1640 BEGIN
1641        IF PG_DEBUG in ('Y', 'C') THEN
1642           arp_util.debug('Validate_discount ()+');
1643        END IF;
1644         p_return_status := FND_API.G_RET_STS_SUCCESS;
1645        -- Do not allow discount for "On Account" applications
1646        IF (p_discount <> 0
1647            AND p_applied_payment_schedule_id = -1)
1648         THEN
1649           p_return_status := FND_API.G_RET_STS_ERROR;
1650           fnd_message.set_name ('AR','AR_RW_VAL_ONACC_DISC');
1651           fnd_msg_pub.Add;
1652 
1653        -- Do not negative discounts unless the amount applied is also
1654        -- negative.
1655        ELSIF p_amount_applied >= 0 and
1656              p_discount < 0 THEN
1657           p_return_status := FND_API.G_RET_STS_ERROR;
1658           fnd_message.set_name ('AR','AR_RW_VAL_NEG_DISCNT');
1659           fnd_msg_pub.Add;
1660        -- Bug 3527600: Do not allow positive discounts unless the amount
1661        -- applied is also positive.
1662        ELSIF p_amount_applied < 0 and
1663              p_discount > 0 THEN
1664           fnd_message.set_name ('AR','AR_RW_VAL_POS_DISCNT');
1665           fnd_msg_pub.Add;
1666           p_return_status := FND_API.G_RET_STS_ERROR;
1667 
1668        -- If partial payment discounts are not allowed.
1669 
1670        -- OSTEINME 3/9/01: Bug 1680623: partial discount
1671        -- should be allowed if payment amount + discount equal
1672        -- original balance (since it's not a partial discount!)
1673        -- Added p_discount to the 2nd AND clause.
1674        -- Bug 3527600: Allow for negative discount
1675 
1676        ELSIF p_partial_discount_flag = 'N'
1677              AND  p_discount <> 0
1678 	    -- AND (p_amount_due_original - (p_amount_applied+p_discount)) > 0
1679           -- Fixed the inconsistency between UI/Receipt API, Bug # 3072421
1680              -- Bug 3527600: Allow for negative discount
1681              -- Bug 3845905: Allow for overapplications
1682              AND (  (p_amount_applied >= 0 AND
1683 	            (p_amount_due_remaining - (p_amount_applied + p_discount)) > 0)
1684                   OR (p_amount_applied < 0 AND
1685 	            (p_amount_due_remaining - (p_amount_applied + p_discount)) < 0))
1686         THEN
1687           p_return_status := FND_API.G_RET_STS_ERROR;
1688           fnd_message.set_name ('AR','AR_NO_PARTIAL_DISC');
1689           fnd_msg_pub.Add;
1690 
1691        ELSIF p_discount IS NOT NULL THEN
1692 
1693       --Do not give discounts more than allowed.
1694            -- Bug 3527600: Allow for negative discount
1695           IF (ABS(p_discount) > ABS(p_discount_max_allowed))
1696            THEN
1697              fnd_message.set_name ('AR','AR_RW_VAL_DISCOUNT');
1698              fnd_message.set_token ('DISC_AVAILABLE'
1699                ,TO_CHAR(p_discount_max_allowed,
1700                fnd_currency.get_format_mask (p_trx_currency_code,30))
1701                ||' '||p_trx_currency_code);
1702              fnd_msg_pub.Add;
1703              p_return_status := FND_API.G_RET_STS_ERROR;
1704 
1705           -- Check for Unearned Discounts.
1706           -- Bug 3527600: Allow for negative discount
1707           ELSIF arp_global.sysparam.unearned_discount = 'N'
1708              AND ABS(p_discount) > ABS(p_discount_earned_allowed)
1709            THEN
1710              fnd_message.set_name ('AR','AR_RW_VAL_UNEARNED_DISCOUNT');
1711              fnd_msg_pub.Add;
1712              p_return_status := FND_API.G_RET_STS_ERROR;
1713           END IF;
1714        END IF;
1715 
1716        IF PG_DEBUG in ('Y', 'C') THEN
1717           arp_util.debug('Validate_discount ()-');
1718        END IF;
1719 END Validate_discount;
1720 
1721 PROCEDURE Validate_apply_gl_date(p_apply_gl_date IN DATE,
1722                                  p_trx_gl_date IN DATE,
1723                                  p_cr_gl_date  IN DATE,
1724                                  p_return_status OUT NOCOPY VARCHAR2
1725                                  ) IS
1726 l_bool  BOOLEAN;
1727 
1728 BEGIN
1729     IF PG_DEBUG in ('Y', 'C') THEN
1730        arp_util.debug('Validate_apply_gl_date ()+');
1731     END IF;
1732      p_return_status := FND_API.G_RET_STS_SUCCESS;
1733 
1734     IF p_apply_gl_date IS NOT NULL THEN
1735 
1736        -- Check that the application GL Date is not before the invoice GL Date.
1737        IF p_apply_gl_date < p_trx_gl_date THEN
1738           FND_MESSAGE.SET_NAME('AR','AR_VAL_GL_INV_GL');
1739           FND_MSG_PUB.Add;
1740           p_return_status := FND_API.G_RET_STS_ERROR;
1741 
1742         -- Check that the application GL Date is not before the receipt GL Date.
1743        END IF;
1744 
1745        IF p_apply_gl_date < p_cr_gl_date  THEN
1746           FND_MESSAGE.SET_NAME('AR','AR_RW_GL_DATE_BEFORE_REC_GL');
1747           FND_MSG_PUB.Add;
1748           p_return_status := FND_API.G_RET_STS_ERROR;
1749        END IF;
1750 
1751 
1752        -- Check that the Application GL Date is in an open or future GL period.
1753        IF ( NOT arp_util.is_gl_date_valid( p_apply_gl_date )) THEN
1754          FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
1755          FND_MESSAGE.set_token( 'GL_DATE', TO_CHAR( p_apply_gl_date ));
1756          FND_MSG_PUB.Add;
1757           p_return_status := FND_API.G_RET_STS_ERROR;
1758        END IF;
1759 
1760 
1761     END IF;
1762     IF PG_DEBUG in ('Y', 'C') THEN
1763        arp_util.debug('Validate_apply_gl_date ()-');
1764     END IF;
1765 
1766 END Validate_apply_gl_date;
1767 
1768 PROCEDURE Validate_apply_date(p_apply_date IN DATE,
1769                               p_trx_date IN DATE,
1770                               p_cr_date  IN DATE,
1771                               p_return_status OUT NOCOPY VARCHAR2
1772                                ) IS
1773 
1774 BEGIN
1775     IF PG_DEBUG in ('Y', 'C') THEN
1776        arp_util.debug('Validate_apply_date ()+');
1777     END IF;
1778      p_return_status := FND_API.G_RET_STS_SUCCESS;
1779 
1780     IF p_apply_date IS NOT NULL THEN
1781 
1782        -- check that the apply  date is not before the invoice date.
1783        IF p_apply_date < p_trx_date THEN
1784           FND_MESSAGE.SET_NAME('AR','AR_APPLY_BEFORE_TRANSACTION');
1785           FND_MSG_PUB.Add;
1786           p_return_status := FND_API.G_RET_STS_ERROR;
1787 
1788         -- check that the application date is not before the receipt date.
1789        END IF;
1790 
1791        IF p_apply_date < p_cr_date  THEN
1792           FND_MESSAGE.SET_NAME('AR','AR_APPLY_BEFORE_RECEIPT');
1793           FND_MSG_PUB.Add;
1794           p_return_status := FND_API.G_RET_STS_ERROR;
1795        END IF;
1796 
1797     END IF;
1798 
1799     IF PG_DEBUG in ('Y', 'C') THEN
1800        arp_util.debug('Validate_apply_date ()-');
1801     END IF;
1802 END Validate_apply_date;
1803 
1804 PROCEDURE Validate_Application_info(
1805                       p_apply_date                  IN DATE,
1806                       p_cr_date                     IN DATE,
1807                       p_trx_date                    IN DATE,
1808                       p_apply_gl_date               IN DATE,
1809                       p_trx_gl_date                 IN DATE,
1810                       p_cr_gl_date                  IN DATE,
1811                       p_amount_applied              IN NUMBER,
1812                       p_applied_payment_schedule_id IN NUMBER,
1813                       p_customer_trx_line_id        IN NUMBER,
1814                       p_inv_line_amount             IN NUMBER,
1815                       p_creation_sign               IN VARCHAR2,
1816                       p_allow_overappln_flag  IN VARCHAR2,
1817                       p_natural_appln_only_flag IN VARCHAR2,
1818                       p_discount                    IN NUMBER,
1819                       p_amount_due_remaining        IN NUMBER,
1820                       p_amount_due_original         IN NUMBER,
1821                       p_trans_to_receipt_rate       IN NUMBER,
1822                       p_cr_currency_code            IN VARCHAR2,
1823                       p_trx_currency_code           IN VARCHAR2,
1824                       p_amount_applied_from         IN NUMBER,
1825                       p_cr_unapp_amount             IN NUMBER,
1826                       p_partial_discount_flag       IN VARCHAR2,
1827                       p_discount_earned_allowed     IN NUMBER,
1828                       p_discount_max_allowed        IN NUMBER,
1829                       p_move_deferred_tax           IN VARCHAR2,
1830 	 	      p_llca_type		    IN VARCHAR2,
1831  		      p_line_amount		    IN NUMBER,
1832 		      p_tax_amount		    IN NUMBER,
1833 		      p_freight_amount		    IN NUMBER,
1834 		      p_charges_amount		    IN NUMBER,
1835 	              p_line_discount               IN NUMBER,
1836 	              p_tax_discount                IN NUMBER,
1837 	              p_freight_discount            IN NUMBER,
1838 		      p_line_items_original	    IN NUMBER,
1839 		      p_line_items_remaining	    IN NUMBER,
1840 		      p_tax_original		    IN NUMBER,
1841 		      p_tax_remaining		    IN NUMBER,
1842 		      p_freight_original	    IN NUMBER,
1843 		      p_freight_remaining	    IN NUMBER,
1844 		      p_rec_charges_charged	    IN NUMBER,
1845 		      p_rec_charges_remaining	    IN NUMBER,
1846                       p_return_status               OUT NOCOPY VARCHAR2
1847                           ) IS
1848 l_gl_date_return_status  VARCHAR2(1);
1849 l_amt_applied_return_status VARCHAR2(1);
1850 l_x_rate_return_status  VARCHAR2(1);
1851 l_disc_return_status  VARCHAR2(1);
1852 l_amt_app_from_return_status VARCHAR2(1);
1853 l_apply_date_return_status   VARCHAR2(1);
1854 --LLCA
1855 l_line_applied_return_status VARCHAR2(1);
1856 l_tax_applied_return_status  VARCHAR2(1);
1857 l_frt_applied_return_status  VARCHAR2(1);
1858 l_chg_applied_return_status  VARCHAR2(1);
1859 BEGIN
1860 
1861    --The customer_trx_id, cash_receipt_id and the applied_payment_schedule_id
1862    --have already been validated in the defaulting routines.
1863 
1864     IF PG_DEBUG in ('Y', 'C') THEN
1865        arp_util.debug('Validate_Application_info ()+');
1866     END IF;
1867       p_return_status := FND_API.G_RET_STS_SUCCESS;
1868         --validation of the trx_number/customer_trx_id and
1869         --receipt_number/cash_receipt_id entered by the user
1870         --is done in the process of defaulting the Trx info and
1871         --the Receipt Info by the respective defaulting routines
1872 
1873          validate_apply_date(p_apply_date,
1874                              p_trx_date,
1875                              p_cr_date,
1876                              l_apply_date_return_status
1877                              );
1878 
1879          validate_apply_gl_date(p_apply_gl_date ,
1880                                  p_trx_gl_date ,
1881                                  p_cr_gl_date  ,
1882                                  l_gl_date_return_status
1883                                  );
1884 
1885    IF PG_DEBUG in ('Y', 'C') THEN
1886       arp_util.debug('Validate_Application_info: ' || 'Apply gl_date return
1887 		status :'||l_gl_date_return_status);
1888    END IF;
1889         validate_amount_applied(
1890                       p_amount_applied ,
1891                       p_applied_payment_schedule_id ,
1892                       p_customer_trx_line_id ,
1893                       p_inv_line_amount      ,
1894                       p_creation_sign        ,
1895                       p_allow_overappln_flag ,
1896                       p_natural_appln_only_flag,
1897                       p_discount       ,
1898                       p_amount_due_remaining ,
1899                       p_amount_due_original,
1900                       l_amt_applied_return_status
1901                        );
1902      IF PG_DEBUG in ('Y', 'C') THEN
1903         arp_util.debug('Validate_Application_info: ' || 'Amount applied return
1904 		status :'||l_amt_applied_return_status);
1905      END IF;
1906 
1907      If p_llca_type = 'S' THEN
1908 	-- Validate the line/tax/freight/charges amount only if p_llca_type is
1909 	-- not null.
1910 	If nvl(p_line_amount,0) <> 0  THEN
1911 	   validate_line_applied(
1912 	                      p_line_amount ,
1913 	                      p_applied_payment_schedule_id ,
1914 		              p_customer_trx_line_id ,
1915 		  	      p_inv_line_amount      ,
1916 	                      p_creation_sign        ,
1917 		              p_allow_overappln_flag ,
1918 			      p_natural_appln_only_flag,
1919 			      p_llca_type,
1920 			      p_discount       ,
1921 			      p_line_items_remaining ,
1922 			      p_line_items_original,
1923 			      l_line_applied_return_status
1924 			     );
1925 	     IF PG_DEBUG in ('Y', 'C') THEN
1926 		arp_util.debug('Validate_Application_info: ' || 'Line
1927 			Amount applied return status :'||l_line_applied_return_status);
1928 	     END IF;
1929 	End If;
1930 
1931 	If nvl(p_tax_amount,0) <> 0 THEN
1932  	   validate_tax_applied(
1933 	                      p_tax_amount ,
1934 	                      p_applied_payment_schedule_id ,
1935 	                      p_creation_sign        ,
1936 		              p_allow_overappln_flag ,
1937 			      p_natural_appln_only_flag,
1938 			      p_llca_type,
1939 			      p_discount       ,
1940 			      p_tax_remaining ,
1941 			      p_tax_original,
1942 			      l_tax_applied_return_status
1943 			     );
1944 	     IF PG_DEBUG in ('Y', 'C') THEN
1945 		arp_util.debug('Validate_Application_info: ' || 'Tax Amount
1946 		 applied return status :'||l_tax_applied_return_status);
1947 	     END IF;
1948 	END IF;
1949 
1950 	IF nvl(p_freight_amount,0) <> 0	THEN
1951 	  validate_Freight_applied(
1952 	                      p_freight_amount ,
1953 	                      p_applied_payment_schedule_id ,
1954 		              p_customer_trx_line_id ,
1955 		  	      p_inv_line_amount      ,
1956 	                      p_creation_sign        ,
1957 		              p_allow_overappln_flag ,
1958 			      p_natural_appln_only_flag,
1959 			      p_llca_type,
1960 			      p_discount ,
1961 			      p_freight_remaining ,
1962 			      p_freight_original,
1963 			      l_frt_applied_return_status
1964 			     );
1965 	     IF PG_DEBUG in ('Y', 'C') THEN
1966 		arp_util.debug('Validate_Application_info: ' || 'Freight Amount
1967 		 applied return status :'||l_frt_applied_return_status);
1968 	     END IF;
1969 	END IF;
1970 
1971 	IF nvl(p_charges_amount,0) <> 0 THEN
1972 	  validate_charges_applied(
1973 	                      p_charges_amount ,
1974 	                      p_applied_payment_schedule_id ,
1975 		              p_customer_trx_line_id ,
1976 		  	      p_inv_line_amount      ,
1977 	                      p_creation_sign        ,
1978 		              p_allow_overappln_flag ,
1979 			      p_natural_appln_only_flag,
1980 			      p_llca_type,
1981 			      p_discount       ,
1982 			      p_rec_charges_remaining ,
1983 	--		      p_rec_charges_charged,   Pass original as remaining bcoz
1984 	--		      ar_open_trx_v does not have charges original
1985 			      p_rec_charges_remaining ,
1986 			      l_chg_applied_return_status
1987 			     );
1988 	     IF PG_DEBUG in ('Y', 'C') THEN
1989 		arp_util.debug('Validate_Application_info: ' || 'Charges Amount
1990 			applied return status :'||l_chg_applied_return_status);
1991 	     END IF;
1992 	END IF;
1993      END IF;
1994 
1995          validate_trans_to_receipt_rate(
1996                            p_trans_to_receipt_rate ,
1997                            p_cr_currency_code ,
1998                            p_trx_currency_code ,
1999                            p_amount_applied ,
2000                            p_amount_applied_from ,
2001                            l_x_rate_return_status
2002                            );
2003      IF PG_DEBUG in ('Y', 'C') THEN
2004         arp_util.debug('Validate_Application_info: ' || 'Trans to receipt rate return status :'||l_x_rate_return_status);
2005      END IF;
2006          validate_amount_applied_from(
2007                            p_amount_applied_from  ,
2008                            p_amount_applied,
2009                            p_cr_unapp_amount ,
2010                            p_cr_currency_code ,
2011                            p_trx_currency_code ,
2012                            l_amt_app_from_return_status
2013                                       );
2014      IF PG_DEBUG in ('Y', 'C') THEN
2015         arp_util.debug('Validate_Application_info: ' || 'Amount applied from return_status :'||l_amt_app_from_return_status);
2016      END IF;
2017 
2018           validate_discount(p_discount    ,
2019                             p_amount_due_remaining  ,
2020                             p_amount_due_original  ,
2021                             p_amount_applied       ,
2022                             p_partial_discount_flag,
2023                             p_applied_payment_schedule_id,
2024                             p_discount_earned_allowed    ,
2025                             p_discount_max_allowed       ,
2026                             p_trx_currency_code,
2027                             l_disc_return_status
2028                             );
2029 
2030        -- LLCA
2031 /*     If P_llca_type is NOT NULL
2032        THEN
2033 		IF (( Nvl(p_line_discount,0) + Nvl(p_tax_discount,0)
2034 			+ Nvl(p_freight_discount,0) )
2035 			> Nvl(p_discount_max_allowed,0)
2036 		   )
2037 		THEN
2038 		      FND_MESSAGE.SET_NAME( 'AR','AR_RAPI_LTFC_DISC_OAPP');
2039 		      FND_MSG_PUB.ADD;
2040 		      p_return_status := FND_API.G_RET_STS_ERROR ;
2041 		END IF;
2042 	END IF;   */
2043 
2044        --validate p_move_deferred_tax
2045        IF p_move_deferred_tax NOT IN ('Y','N') THEN
2046           FND_MESSAGE.SET_NAME('AR','AR_RAPI_DEF_TAX_FLAG_INVALID');
2047           FND_MSG_PUB.Add;
2048           p_return_status := FND_API.G_RET_STS_ERROR;
2049        END IF;
2050       IF PG_DEBUG in ('Y', 'C') THEN
2051          arp_util.debug('Validate_Application_info: ' || 'Discount return status :'||l_disc_return_status);
2052       END IF;
2053 
2054     IF l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
2055        l_amt_applied_return_status <> FND_API.G_RET_STS_SUCCESS OR
2056        l_x_rate_return_status  <> FND_API.G_RET_STS_SUCCESS OR
2057        l_disc_return_status <> FND_API.G_RET_STS_SUCCESS OR
2058        l_amt_app_from_return_status <> FND_API.G_RET_STS_SUCCESS OR
2059        l_apply_date_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
2060 
2061        p_return_status := FND_API.G_RET_STS_ERROR;
2062     END IF;
2063 
2064     IF PG_DEBUG in ('Y', 'C') THEN
2065        arp_util.debug('Validate_Application_info ()-');
2066     END IF;
2067 EXCEPTION
2068  WHEN others THEN
2069   IF PG_DEBUG in ('Y', 'C') THEN
2070      arp_util.debug('EXCEPTION: Validate_Application_Info() ');
2071   END IF;
2072   raise;
2073 END Validate_Application_info;
2074 
2075 PROCEDURE Validate_Rev_gl_date(p_reversal_gl_date IN DATE,
2076                                p_apply_gl_date  IN DATE,
2077                                p_receipt_gl_date IN DATE,
2078                                p_recpt_last_state_gl_date  IN DATE, /* Bug fix 2441105 */
2079                                p_return_status  OUT NOCOPY VARCHAR2
2080                                ) IS
2081 
2082 BEGIN
2083     IF PG_DEBUG in ('Y', 'C') THEN
2084        arp_util.debug('Validate_Rev_gl_date ()+');
2085     END IF;
2086     p_return_status := FND_API.G_RET_STS_SUCCESS;
2087   IF p_reversal_gl_date IS NOT NULL THEN
2088 
2089     IF  p_reversal_gl_date < NVL(p_apply_gl_date,p_reversal_gl_date)  THEN
2090         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_APP_GL_DATE');
2091         FND_MESSAGE.SET_TOKEN('GL_DATE', p_apply_gl_date);
2092         FND_MSG_PUB.Add;
2093         p_return_status := FND_API.G_RET_STS_ERROR;
2094     END IF;
2095     IF p_reversal_gl_date < nvl(p_receipt_gl_date,p_reversal_gl_date) THEN
2096         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_RECEIPT_GL_DATE');
2097         FND_MESSAGE.SET_TOKEN('GL_DATE', p_receipt_gl_date);
2098         FND_MSG_PUB.Add;
2099         p_return_status := FND_API.G_RET_STS_ERROR;
2100     END IF;
2101     /* Bug fix 2441105 */
2102     IF p_reversal_gl_date < nvl(p_recpt_last_state_gl_date,p_reversal_gl_date) THEN
2103         FND_MESSAGE.SET_NAME('AR','AR_RW_BEF_RCPT_STATE_GL_DATE');
2104         FND_MESSAGE.SET_TOKEN('GL_DATE', p_recpt_last_state_gl_date);
2105         FND_MSG_PUB.Add;
2106         p_return_status := FND_API.G_RET_STS_ERROR;
2107     END IF;
2108     IF ( NOT arp_util.is_gl_date_valid(p_reversal_gl_date)) THEN
2109         FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
2110         FND_MESSAGE.set_token( 'GL_DATE', TO_CHAR( p_reversal_gl_date ));
2111         FND_MSG_PUB.Add;
2112         p_return_status := FND_API.G_RET_STS_ERROR;
2113     END IF;
2114 
2115   ELSE
2116       FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_GL_DATE_NULL');
2117       FND_MSG_PUB.Add;
2118       p_return_status := FND_API.G_RET_STS_ERROR;
2119       IF PG_DEBUG in ('Y', 'C') THEN
2120          arp_util.debug('Validate_Rev_gl_date: ' || 'The Reversal gl date is null ');
2121       END IF;
2122   END IF;
2123 
2124   IF PG_DEBUG in ('Y', 'C') THEN
2125      arp_util.debug('Validate_Rev_gl_date ()+');
2126   END IF;
2127 EXCEPTION
2128   WHEN others THEN
2129       IF PG_DEBUG in ('Y', 'C') THEN
2130          arp_util.debug('EXCEPTION: Validate_rev_gl_date() ');
2131       END IF;
2132       raise;
2133 END Validate_Rev_gl_date;
2134 
2135 PROCEDURE Validate_receivable_appln_id(
2136                        p_receivable_application_id  IN  NUMBER,
2137                        p_application_type  IN VARCHAR2,
2138                        p_return_status OUT NOCOPY VARCHAR2) IS
2139 l_valid NUMBER;
2140 BEGIN
2141   p_return_status := FND_API.G_RET_STS_SUCCESS;
2142   IF PG_DEBUG in ('Y', 'C') THEN
2143      arp_util.debug('Validate_receivable_appln_id ()+');
2144   END IF;
2145    --validate the receivable application id only if it was passed in
2146    --directly as a parameter. No need to validate if it was derived.
2147    IF p_receivable_application_id IS NOT NULL AND
2148       ar_receipt_api_pub.Original_unapp_info.receivable_application_id IS NOT NULL
2149      THEN
2150        SELECT count(*)
2151        INTO   l_valid
2152        FROM   AR_RECEIVABLE_APPLICATIONS ra
2153        WHERE  ra.receivable_application_id = p_receivable_application_id
2154          and  ra.display = 'Y'
2155          and  ra.status = p_application_type
2156          and  ra.application_type = 'CASH';
2157 
2158      IF  l_valid = 0 THEN
2159         FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
2160         FND_MSG_PUB.Add;
2161         p_return_status := FND_API.G_RET_STS_ERROR;
2162      END IF;
2163 
2164    ELSIF p_receivable_application_id IS NULL  THEN
2165     IF ar_receipt_api_pub.Original_unapp_info.trx_number IS NULL AND
2166        ar_receipt_api_pub.Original_unapp_info.customer_trx_id IS NULL AND
2167        ar_receipt_api_pub.Original_unapp_info.applied_ps_id IS NULL AND
2168        ar_receipt_api_pub.Original_unapp_info.cash_receipt_id IS NULL AND
2169        ar_receipt_api_pub.Original_unapp_info.receipt_number  IS NULL
2170      THEN
2171      --receivable application id is null
2172        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_NULL');
2173        FND_MSG_PUB.Add;
2174        p_return_status := FND_API.G_RET_STS_ERROR;
2175     ELSIF ar_receipt_api_pub.Original_unapp_info.trx_number IS NULL AND
2176        ar_receipt_api_pub.Original_unapp_info.customer_trx_id IS NULL AND
2177        ar_receipt_api_pub.Original_unapp_info.applied_ps_id IS NULL AND
2178        (ar_receipt_api_pub.Original_unapp_info.cash_receipt_id IS NOT NULL OR
2179        ar_receipt_api_pub.Original_unapp_info.receipt_number IS NOT NULL)
2180      THEN
2181      --the transaction was not specified
2182         FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_NULL');
2183         FND_MSG_PUB.Add;
2184         p_return_status := FND_API.G_RET_STS_ERROR;
2185     ELSIF (ar_receipt_api_pub.Original_unapp_info.trx_number IS NOT NULL OR
2186        ar_receipt_api_pub.Original_unapp_info.customer_trx_id IS NOT NULL OR
2187        ar_receipt_api_pub.Original_unapp_info.applied_ps_id IS NOT NULL) AND
2188        ar_receipt_api_pub.Original_unapp_info.cash_receipt_id IS  NULL AND
2189        ar_receipt_api_pub.Original_unapp_info.receipt_number IS  NULL
2190     THEN
2191     --the receipt was not specified
2192         FND_MESSAGE.SET_NAME('AR','AR_RAPI_CASH_RCPT_ID_NULL');
2193         FND_MSG_PUB.Add;
2194         p_return_status := FND_API.G_RET_STS_ERROR;
2195     END IF;
2196 
2197    END IF;
2198   IF PG_DEBUG in ('Y', 'C') THEN
2199      arp_util.debug('Validate_receivable_appln_id ()-');
2200   END IF;
2201 EXCEPTION
2202  WHEN others THEN
2203    IF PG_DEBUG in ('Y', 'C') THEN
2204       arp_util.debug('EXCEPTION: Validate_receivable_appln_id()');
2205    END IF;
2206    raise;
2207 END Validate_receivable_appln_id;
2208 
2209 /*Added parameter p_cr_unapp_amount for bug 3119391 */
2210 PROCEDURE Validate_unapp_info(
2211                       p_receipt_gl_date             IN DATE,
2212                       p_receivable_application_id   IN NUMBER,
2213                       p_reversal_gl_date            IN DATE,
2214                       p_apply_gl_date               IN DATE,
2215 		      p_cr_unapp_amount             IN  NUMBER,
2216                       p_return_status               OUT NOCOPY VARCHAR2
2217                       ) IS
2218 l_rec_app_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2219 l_rev_gl_date_return_status  VARCHAR2(1) ;
2220 l_amt_app_from_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;/*Added for 3119391 */
2221 BEGIN
2222    p_return_status := FND_API.G_RET_STS_SUCCESS;
2223    IF PG_DEBUG in ('Y', 'C') THEN
2224       arp_util.debug('Validate_unapp_info ()+');
2225    END IF;
2226 
2227        --In case the user has entered the receivable application id
2228        -- as well as the receipt and transaction info, then the cross validation
2229        --is done at the defaulting phase itself so no need to do that here.
2230           Validate_receivable_appln_id(
2231                                   p_receivable_application_id,
2232                                   'APP',
2233                                   l_rec_app_return_status);
2234 
2235           Validate_rev_gl_date( p_reversal_gl_date ,
2236                                 p_apply_gl_date ,
2237                                 p_receipt_gl_date,
2238                                 NULL,
2239                                 l_rev_gl_date_return_status
2240                                   );
2241           /*Addded this call for bug 3119391 */
2242           Validate_amount_applied_from( p_receivable_application_id,
2243 	                                p_cr_unapp_amount,
2244 					l_amt_app_from_return_status);
2245           /*Added l_amt_app_from_return_status condition for bug 3119391 */
2246           IF l_rev_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
2247              l_rec_app_return_status <> FND_API.G_RET_STS_SUCCESS OR
2248              l_amt_app_from_return_status <> FND_API.G_RET_STS_SUCCESS
2249             THEN
2250                p_return_status := FND_API.G_RET_STS_ERROR;
2251           ELSE
2252                p_return_status := FND_API.G_RET_STS_SUCCESS;
2253           END IF;
2254    IF PG_DEBUG in ('Y', 'C') THEN
2255       arp_util.debug('Validate_unapp_info: ' || 'Recevable appln id return status '||l_rec_app_return_status);
2256       arp_util.debug('Validate_unapp_info: ' || 'Rev_gl_date_return_status :'||l_rev_gl_date_return_status);
2257       arp_util.debug('Validate_unapp_info ()-');
2258    END IF;
2259 END Validate_unapp_info;
2260 
2261 PROCEDURE check_std_reversible(p_cash_receipt_id  IN NUMBER,
2262                                p_reversal_date    IN DATE,
2263                                p_receipt_state    IN VARCHAR2,
2264                                p_called_from      IN VARCHAR2,
2265                                p_std_reversal_possible  OUT NOCOPY VARCHAR2
2266                                )  IS
2267 l_dummy NUMBER;
2268 l_reserved   VARCHAR2(1) DEFAULT 'N';
2269 l_std_appln  VARCHAR2(1) DEFAULT 'N';
2270 BEGIN
2271    IF PG_DEBUG in ('Y', 'C') THEN
2272       arp_util.debug('check_std_reversible ()+');
2273    END IF;
2274    --Check whether it has not been reversed yet
2275   IF p_reversal_date IS NULL  OR
2276      p_receipt_state <> 'APPROVED'  THEN
2277     --  Check if a 'CB' was created against this PMT to be reversed.
2278     --  Check if there are any PMT, ADJ, or CM or CB against this 'CB' records
2279     --  in AR_PAYMENT_SCHEDULES table.  Also check to see if the CB has
2280     --   already been posted.  If any of these 2 conditions is TRUE, then
2281     --  PMT can only be reversed using DM Reversal.
2282     --  Make sure that the adj which is automatically created against the CB
2283     --  associated with the receipt being reversed does not get caught in
2284     --  the SQL.  For such an adj, the adj.receivables_trx_id = -12
2285 
2286 
2287      SELECT  COUNT(payment_schedule_id)
2288      INTO    l_dummy
2289      FROM    ar_payment_schedules    ps,
2290              ra_cust_trx_line_gl_dist rctlg
2291      WHERE   ps.associated_cash_receipt_id = p_cash_receipt_id
2292      AND     ps.class = 'CB'
2293      AND     ps.customer_trx_id = rctlg.customer_trx_id
2294      AND (      nvl(ps.amount_applied, 0) <> 0
2295             OR  nvl(ps.amount_credited, 0) <> 0
2296             OR 0 <> ( SELECT sum(adj.amount)
2297                       FROM  ar_adjustments adj
2298                       WHERE adj.payment_schedule_id =
2299                              ps.payment_schedule_id
2300                         AND adj.receivables_trx_id <> -12
2301                      )
2302           );
2303 
2304      IF (l_dummy > 0) THEN
2305        p_std_reversal_possible := 'N';
2306      ELSE
2307        p_std_reversal_possible := 'Y';
2308      END IF;
2309   ELSE
2310        p_std_reversal_possible := 'N';
2311   END IF;
2312 
2313 
2314   --added code to check if there is a bill of type 'reserved' is
2315   --applied to the receipt
2316   IF p_std_reversal_possible = 'Y' THEN
2317 
2318       --check if there is a SHORT TERM DEBT application on the receipt
2319     BEGIN
2320        SELECT 'Y'
2321        INTO   l_std_appln
2322        FROM   ar_receivable_applications ra
2323        WHERE  ra.cash_receipt_id = p_cash_receipt_id
2324         AND   ra.status = 'ACTIVITY'
2325         AND   ra.applied_payment_schedule_id = -2
2326         AND   display = 'Y'
2327         AND   p_called_from NOT IN ('BR_REMITTED',
2328                       'BR_FACTORED_WITH_RECOURSE',
2329                       'BR_FACTORED_WITHOUT_RECOURSE');  --fixed bug 1450460
2330     EXCEPTION
2331       WHEN no_data_found THEN
2332        null;
2333       WHEN others THEN
2334        raise;
2335     END;
2336 
2337       --check the receipt has been applied to a bill for which
2338       --the reversed_type and the reversed_value columns in the payment_schedule
2339       --record have not null values(indicating that it is in the br remit process)
2340 
2341    IF p_called_from IN ('BR_REMITTED',
2342                       'BR_FACTORED_WITH_RECOURSE',
2343                       'BR_FACTORED_WITHOUT_RECOURSE') THEN
2344     --called from the BR Remittance program
2345     null;
2346    ELSE
2347 
2348       BEGIN
2349          SELECT 'Y'
2350          INTO   l_reserved
2351          FROM   ar_payment_schedules ps,
2352                 ar_receivable_applications ra
2353          WHERE  ra.cash_receipt_id = p_cash_receipt_id
2354            AND  ra.applied_payment_schedule_id = ps.payment_schedule_id
2355            AND  ps.reserved_type IS NOT NULL
2356            AND  ps.reserved_value IS NOT NULL
2357            AND  ra.status = 'APP'
2358            AND  ra.display  = 'Y';
2359       EXCEPTION
2360         WHEN no_data_found THEN
2361          null;
2362         WHEN others THEN
2363          raise;
2364       END;
2365 
2366    END IF;
2367 
2368       IF l_reserved = 'Y' OR
2369          l_std_appln = 'Y' THEN
2370         p_std_reversal_possible := 'N';
2371       END IF;
2372 
2373    END IF;
2374 IF PG_DEBUG in ('Y', 'C') THEN
2375    arp_util.debug('check_std_reversible ()-');
2376 END IF;
2377 
2378 EXCEPTION
2379   WHEN others THEN
2380     IF PG_DEBUG in ('Y', 'C') THEN
2381        arp_util.debug('EXCEPTION: check_std_reversible()');
2382     END IF;
2383     raise;
2384 END check_std_reversible;
2385 
2386 PROCEDURE Validate_cash_receipt_id(
2387                            p_type IN VARCHAR2,
2388                            p_cash_receipt_id IN NUMBER,
2389                            p_status1 IN VARCHAR2,
2390                            p_status2 IN VARCHAR2,
2391                            p_status3 IN VARCHAR2,
2392                            p_status4 IN VARCHAR2,
2393                            p_status5 IN VARCHAR2,
2394                            p_return_status OUT NOCOPY VARCHAR2) IS
2395 l_valid  NUMBER;
2396 BEGIN
2397   IF PG_DEBUG in ('Y', 'C') THEN
2398      arp_util.debug('Validate_cash_receipt_id ()+');
2399   END IF;
2400    IF p_cash_receipt_id IS NOT NULL THEN
2401 
2402      SELECT count(*)
2403      INTO   l_valid
2404      FROM   ar_cash_receipts cr,
2405             ar_cash_receipt_history crh
2406      WHERE  cr.cash_receipt_id = p_cash_receipt_id
2407        and  cr.cash_receipt_id = crh.cash_receipt_id
2408        and  crh.current_record_flag = 'Y'
2409        and  crh.status
2410                  IN (p_status1,p_status2,p_status3,p_status4,p_status5);
2411 
2412      IF l_valid = 0  THEN
2413        FND_MESSAGE.SET_NAME('AR','AR_RAPI_CASH_RCPT_ID_INVALID');
2414        FND_MSG_PUB.Add;
2415        p_return_status := FND_API.G_RET_STS_ERROR;
2416      END IF;
2417    ELSE
2418        FND_MESSAGE.SET_NAME('AR','AR_RAPI_CASH_RCPT_ID_NULL');
2419        FND_MSG_PUB.Add;
2420        p_return_status := FND_API.G_RET_STS_ERROR;
2421    END IF;
2422   IF PG_DEBUG in ('Y', 'C') THEN
2423      arp_util.debug('Validate_cash_receipt_id ()-');
2424   END IF;
2425 EXCEPTION
2426  WHEN others THEN
2427    IF PG_DEBUG in ('Y', 'C') THEN
2428       arp_util.debug('EXCEPTION: Validate_cash_receipt_id() ');
2429    END IF;
2430    raise;
2431 END Validate_cash_receipt_id;
2432 
2433 PROCEDURE Validate_reversal_catg_code(
2434                          p_reversal_category_code IN VARCHAR2,
2435                          p_return_status  OUT NOCOPY VARCHAR2
2436                                       ) IS
2437 l_valid  NUMBER;
2438 BEGIN
2439    IF PG_DEBUG in ('Y', 'C') THEN
2440       arp_util.debug('Validate_reversal_catg_code ()+');
2441    END IF;
2442   IF p_reversal_category_code IS NOT NULL  THEN
2443      SELECT count(*)
2444      INTO   l_valid
2445      FROM   ar_lookups
2446      WHERE  lookup_type = 'REVERSAL_CATEGORY_TYPE'
2447        and  enabled_flag = 'Y'
2448        and  lookup_code = p_reversal_category_code;
2449      IF l_valid =0 THEN
2450        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_CAT_CD_INVALID');
2451        FND_MSG_PUB.Add;
2452        p_return_status := FND_API.G_RET_STS_ERROR;
2453      END IF;
2454    ELSE
2455        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_CAT_CD_NULL');
2456        FND_MSG_PUB.Add;
2457        p_return_status := FND_API.G_RET_STS_ERROR;
2458    END IF;
2459    IF PG_DEBUG in ('Y', 'C') THEN
2460       arp_util.debug('Validate_reversal_catg_code ()-');
2461    END IF;
2462 EXCEPTION
2463  WHEN others THEN
2464   IF PG_DEBUG in ('Y', 'C') THEN
2465      arp_util.debug('EXCEPTION: Validate_reversal_catg_code() ');
2466   END IF;
2467   raise;
2468 END Validate_reversal_catg_code;
2469 
2470 PROCEDURE Validate_reversal_reason_code(
2471                        p_reversal_reason_code IN VARCHAR2,
2472                        p_return_status  OUT NOCOPY VARCHAR2
2473                                  ) IS
2474 l_valid NUMBER;
2475 BEGIN
2476   p_return_status := FND_API.G_RET_STS_SUCCESS;
2477    IF p_reversal_reason_code IS NOT NULL  THEN
2478      SELECT count(*)
2479      INTO   l_valid
2480      FROM   ar_lookups
2481      WHERE  lookup_type = 'CKAJST_REASON'
2482        and  enabled_flag = 'Y'
2483        and  lookup_code = p_reversal_reason_code;
2484      IF l_valid =0 THEN
2485        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_REAS_CD_INVALID');
2486        FND_MSG_PUB.Add;
2487        p_return_status := FND_API.G_RET_STS_ERROR;
2488      END IF;
2489    ELSE
2490        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_REAS_CD_NULL');
2491        FND_MSG_PUB.Add;
2492        p_return_status := FND_API.G_RET_STS_ERROR;
2493    END IF;
2494 EXCEPTION
2495  WHEN others THEN
2496   IF PG_DEBUG in ('Y', 'C') THEN
2497      arp_util.debug('EXCEPTION: Validate_reversal_reason_code() ');
2498   END IF;
2499   raise;
2500 END Validate_reversal_reason_code;
2501 
2502 PROCEDURE Validate_reverse_info(
2503                           p_cash_receipt_id         IN NUMBER,
2504                           p_receipt_gl_date         IN DATE,
2505                           p_reversal_category_code  IN VARCHAR2,
2506                           p_reversal_reason_code    IN VARCHAR2,
2507                           p_reversal_gl_date        IN DATE,
2508                           p_reversal_date           IN DATE,
2509                           p_return_status           OUT NOCOPY VARCHAR2
2510                           ) IS
2511 l_cr_return_status   VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
2512 l_rev_cat_return_status VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
2513 l_rev_res_return_status VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
2514 l_rev_gld_return_status VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
2515 BEGIN
2516     p_return_status := FND_API.G_RET_STS_SUCCESS;
2517     IF PG_DEBUG in ('Y', 'C') THEN
2518        arp_util.debug('Validate_reverse_info ()+');
2519     END IF;
2520     Validate_cash_receipt_id('ALL',
2521                            p_cash_receipt_id,
2522                            'APPROVED',
2523                            'CONFIRMED',
2524                            'CLEARED',
2525                            'REMITTED',
2526                            'RISK_ELIMINATED', /* Bug fix 3263841 */
2527                            l_cr_return_status);
2528 
2529      Validate_reversal_catg_code(p_reversal_category_code,
2530                                  l_rev_cat_return_status);
2531 
2532      Validate_reversal_reason_code(p_reversal_reason_code,
2533                                    l_rev_res_return_status
2534                                    );
2535 
2536      Validate_Rev_gl_date(p_reversal_gl_date,
2537                           NULL, --apply gl date not valid in this case.
2538                           NULL,
2539                           p_receipt_gl_date,
2540                           l_rev_gld_return_status
2541                           );
2542       IF l_rev_gld_return_status <> FND_API.G_RET_STS_SUCCESS OR
2543          l_rev_res_return_status <> FND_API.G_RET_STS_SUCCESS OR
2544          l_rev_cat_return_status <> FND_API.G_RET_STS_SUCCESS OR
2545          l_cr_return_status  <> FND_API.G_RET_STS_SUCCESS  THEN
2546           p_return_status := FND_API.G_RET_STS_ERROR;
2547        END IF;
2548     IF PG_DEBUG in ('Y', 'C') THEN
2549        arp_util.debug('Validate_reverse_info ()-');
2550     END IF;
2551 EXCEPTION
2552   WHEN others  THEN
2553     IF PG_DEBUG in ('Y', 'C') THEN
2554        arp_util.debug('EXCEPTION: Validate_reverse_info ()');
2555     END IF;
2556     raise;
2557 END  Validate_reverse_info;
2558 
2559 PROCEDURE validate_on_ac_app( p_cash_receipt_id IN NUMBER,
2560                               p_cr_gl_date  IN DATE,
2561                               p_cr_unapp_amount IN NUMBER,
2562                               p_cr_date IN DATE,
2563                               p_cr_payment_schedule_id IN NUMBER,
2564                               p_applied_amount IN NUMBER,
2565                               p_apply_gl_date IN DATE,
2566                               p_apply_date IN DATE,
2567                               p_return_status OUT NOCOPY VARCHAR2,
2568                               p_applied_ps_id IN NUMBER,
2569                               p_called_from IN VARCHAR2
2570                                ) IS
2571 l_cr_return_status  VARCHAR2(1);
2572 l_amt_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
2573 l_gl_date_return_status VARCHAR2(1);
2574 l_apply_date_return_status  VARCHAR2(1);
2575 BEGIN
2576         p_return_status := FND_API.G_RET_STS_SUCCESS;
2577         IF PG_DEBUG in ('Y', 'C') THEN
2578            arp_util.debug('validate_on_ac_app ()+');
2579         END IF;
2580 
2581          validate_cash_receipt_id('ALL',
2582                                    p_cash_receipt_id,
2583                                    NULL,
2584                                    'CONFIRMED',
2585                                    'CLEARED',
2586                                    'REMITTED',
2587                                    'RISK_ELIMINATED', /* Bug fix 3263841 */
2588                                    l_cr_return_status);
2589 
2590         validate_apply_date(p_apply_date,
2591                             p_apply_date,
2592                             p_cr_date,
2593                             l_apply_date_return_status
2594                              );
2595 
2596        --  validate amount applied
2597           IF  p_applied_amount IS NULL  THEN
2598               FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
2599               FND_MSG_PUB.Add;
2600               l_amt_return_status := FND_API.G_RET_STS_ERROR;
2601 
2602           -- Bug 2751910 - allow -ve amount on application to receipt (ps>0)
2603           ELSIF  (p_applied_amount < 0 AND NVL(p_applied_ps_id,-1) <> -4 AND
2604                   NVL(p_applied_ps_id,-1) <> -3 AND
2605                   NVL(p_applied_ps_id,-1) < 0) THEN
2606               IF p_applied_ps_id = -8 THEN
2607                  FND_MESSAGE.SET_NAME('AR','AR_REF_CM_APP_NEG');
2608                  FND_MSG_PUB.Add;
2609               ELSE
2610                  FND_MESSAGE.SET_NAME('AR','AR_RW_APP_NEG_ON_ACCT');
2611                  FND_MSG_PUB.Add;
2612    	      END IF;
2613               l_amt_return_status := FND_API.G_RET_STS_ERROR;
2614           -- Bug 2897244 - amount not checked if called from form/postbatch
2615           ELSIF ((nvl(p_cr_unapp_amount,0)- p_applied_amount) < 0 AND
2616                  NVL(p_applied_ps_id,-1) <> -4 AND
2617                  NVL(p_called_from,'RAPI') NOT IN ('ARXRWAPP','ARCAPB')) THEN
2618               FND_MESSAGE.SET_NAME('AR','AR_RW_AMOUNT_LESS_THAN_APP');
2619               FND_MSG_PUB.Add;
2620               l_amt_return_status := FND_API.G_RET_STS_ERROR;
2621           END IF;
2622 
2623                validate_apply_gl_date(p_apply_gl_date,
2624                                       p_apply_gl_date,
2625                                       p_cr_gl_date,
2626                                       l_gl_date_return_status
2627                                       );
2628 
2629           IF  l_cr_return_status <> FND_API.G_RET_STS_SUCCESS  OR
2630               l_amt_return_status <> FND_API.G_RET_STS_SUCCESS OR
2631               l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
2632               l_apply_date_return_status <> FND_API.G_RET_STS_SUCCESS
2633             THEN
2634                  p_return_status := FND_API.G_RET_STS_ERROR;
2635           END IF;
2636 
2637         IF PG_DEBUG in ('Y', 'C') THEN
2638            arp_util.debug('validate_on_ac_app ()-');
2639         END IF;
2640 EXCEPTION
2641 WHEN others  THEN
2642     IF PG_DEBUG in ('Y', 'C') THEN
2643        arp_util.debug('EXCEPTION:  validate_on_ac_app()');
2644     END IF;
2645     raise;
2646 END validate_on_ac_app;
2647 
2648 
2649  /*----------------------------------------------------------+
2650   | validate_unapp_on_ac_act_info routine is called for both |
2651   | 1) activity_unapplication and                            |
2652   | 2) on_account_unapplication                              |
2653   +----------------------------------------------------------*/
2654 PROCEDURE validate_unapp_on_ac_act_info(
2655                               p_receipt_gl_date  IN DATE,
2656                               p_receivable_application_id  IN NUMBER,
2657                               p_reversal_gl_date  IN DATE,
2658                               p_apply_gl_date    IN DATE,
2659                               p_cr_unapp_amt     IN NUMBER, /* Bug fix 3569640 */
2660                               p_return_status  OUT NOCOPY VARCHAR2
2661                                ) IS
2662 l_amt_app_from_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;/*Added for 3569640 */
2663 BEGIN
2664      p_return_status := FND_API.G_RET_STS_SUCCESS;
2665      IF PG_DEBUG in ('Y', 'C') THEN
2666         arp_util.debug('validate_unapp_on_ac_act_info: ' || 'Validate_unapp_on_acc_act_info ()+');
2667      END IF;
2668 
2669 
2670          --the receivable_application_id was validated in the defaulting stage
2671          --for all cases : 1. only receivable_application_id specified
2672          --                2. only cash receipt specified
2673          --                3. both cash receipt and receivable_application_id specified
2674          -- no need to validate it here
2675 
2676           Validate_rev_gl_date( p_reversal_gl_date ,
2677                                 p_apply_gl_date ,
2678                                 p_receipt_gl_date,
2679                                 NULL,
2680                                 p_return_status
2681                                   );
2682 
2683          /* Bug fix 3569640 */
2684          IF p_receivable_application_id IS NOT NULL
2685            AND p_cr_unapp_amt IS NOT NULL THEN
2686             Validate_amount_applied_from( p_receivable_application_id,
2687                                           p_cr_unapp_amt,
2688                                           l_amt_app_from_return_status);
2689          END IF;
2690          IF l_amt_app_from_return_status <> FND_API.G_RET_STS_SUCCESS OR
2691             p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2692             p_return_status := FND_API.G_RET_STS_ERROR;
2693          END IF;
2694 
2695     IF PG_DEBUG in ('Y', 'C') THEN
2696        arp_util.debug('validate_unapp_on_ac_act_info: ' || 'p_return_status :'||p_return_status);
2697        arp_util.debug('validate_unapp_on_ac_act_info: ' || 'Validate_unapp_on_acc_act_info ()-');
2698     END IF;
2699 END validate_unapp_on_ac_act_info;
2700 
2701 PROCEDURE validate_ccrefund(
2702                             p_cash_receipt_id IN NUMBER,
2703                             p_applied_ps_id IN NUMBER,
2704                             p_return_status IN OUT NOCOPY VARCHAR2
2705                             ) IS
2706 l_payment_type          VARCHAR2(30);
2707 
2708 BEGIN
2709 
2710  --If the applied payment schedule_id -7, we can issue the refund only to credit card.
2711 
2712  IF PG_DEBUG in ('Y', 'C') THEN
2713     arp_util.debug('Validate_ccrefund (+)');
2714  END IF;
2715  IF p_applied_ps_id = -6 THEN
2716     BEGIN
2717        SELECT NVL(arm.payment_channel_code,'NONE')
2718        INTO   l_payment_type
2719        FROM   ar_cash_receipts cr,
2720               ar_receipt_methods arm
2721        WHERE  cr.receipt_method_id = arm.receipt_method_id
2722        AND    cr.cash_receipt_id=p_cash_receipt_id;
2723 
2724        IF l_payment_type <> 'CREDIT_CARD' THEN
2725             FND_MESSAGE.SET_NAME('AR','AR_RW_CCR_RECEIPT_ONLY');
2726             FND_MSG_PUB.Add;
2727             p_return_status := FND_API.G_RET_STS_ERROR;
2728        END IF;
2729 
2730     EXCEPTION
2731        WHEN others then
2732             p_return_status := FND_API.G_RET_STS_ERROR;
2733             FND_MESSAGE.SET_NAME ('AR','GENERIC_MESSAGE');
2734             FND_MESSAGE.SET_TOKEN('GENERIC_TEXT','Validate ccrefund' ||SQLERRM);
2735             FND_MSG_PUB.Add;
2736     END;
2737  END IF;
2738     IF PG_DEBUG in ('Y', 'C') THEN
2739        arp_util.debug('Validate_ccrefund (-)');
2740     END IF;
2741 END validate_ccrefund;
2742 
2743 
2744 --
2745 --Bug 1645041 : Added parameters p_cr_currency_code, p_applied_amount
2746 -- and p_cash_receipt_id which were to be used in approval limit
2747 -- validation logic added in this procedure for the write-off activity.
2748 -- Bug 2270825 - validation for claims
2749 --
2750 PROCEDURE validate_activity(p_receivables_trx_id IN NUMBER,
2751                             p_applied_ps_id IN NUMBER,
2752                             p_cash_receipt_id IN NUMBER,
2753                             p_applied_amount IN NUMBER,
2754                             p_cr_currency_code IN VARCHAR2,
2755                             p_val_writeoff_limits_flag IN VARCHAR2,
2756                             p_return_status IN OUT NOCOPY VARCHAR2
2757                             ) IS
2758 l_activity_type   VARCHAR2(30);
2759 l_amount_from           NUMBER;
2760 l_amount_to             NUMBER;
2761 l_user_id               NUMBER;
2762 l_existing_wo_amount    NUMBER;
2763 l_tot_write_off_amt     NUMBER;
2764 l_max_wrt_off_amount    NUMBER;
2765 l_min_wrt_off_amount    NUMBER;
2766 
2767 --Bug 5367753
2768 l_exchange_rate         NUMBER;
2769 l_tot_writeoff_amt_func NUMBER;
2770 l_functional_currency   ar_cash_receipts.currency_code%TYPE;
2771 
2772 cursor activity_type is
2773  select type
2774  from   ar_receivables_trx rt
2775  where  receivables_trx_id = p_receivables_trx_id;
2776 
2777 BEGIN
2778 
2779  IF PG_DEBUG in ('Y', 'C') THEN
2780     arp_util.debug('validate_activity (+)');
2781  END IF;
2782 
2783  OPEN activity_type;
2784  FETCH activity_type INTO l_activity_type;
2785  IF activity_type%NOTFOUND THEN
2786    FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_TRX_ID_INVALID');
2787    FND_MSG_PUB.Add;
2788    p_return_status := FND_API.G_RET_STS_ERROR;
2789  END IF;
2790  CLOSE activity_type;
2791 
2792  IF l_activity_type IS NOT NULL THEN
2793   --Validate applied ps_id
2794   --additional conditions need to be added for the ps_id in future
2795   -- -2 corresponds to short term debit
2796     IF p_applied_ps_id = -2 THEN
2797       IF l_activity_type <> 'SHORT_TERM_DEBT' THEN
2798          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2799          FND_MSG_PUB.Add;
2800          p_return_status := FND_API.G_RET_STS_ERROR;
2801        END IF;
2802 
2803   --SNAMBIAR - Modified for Write-Off
2804     ELSIF p_applied_ps_id = -3 THEN
2805       IF l_activity_type <> 'WRITEOFF' THEN
2806          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2807          FND_MSG_PUB.Add;
2808          p_return_status := FND_API.G_RET_STS_ERROR;
2809       END IF;
2810 
2811       --some additional validation that we need to do for the Write-Off: Bug 1645041.
2812       -- Bug 2751910 - Validation against user limits excluded if flag set
2813 
2814 
2815        l_user_id       := to_number(fnd_profile.value('USER_ID'));
2816 
2817        --get the existing write-off amount on the receipt.
2818 
2819          BEGIN
2820           SELECT sum(amount_applied)
2821           INTO l_existing_wo_amount
2822   	  FROM ar_receivable_applications
2823   	  WHERE applied_payment_schedule_id = -3
2824           AND   status = 'ACTIVITY'
2825           AND   NVL(confirmed_flag,'Y') = 'Y'
2826           AND   cash_receipt_id = p_cash_receipt_id;
2827 
2828           --Bug 5367753 fetch exchange_rate of the receipt.
2829           SELECT nvl(exchange_rate,1)
2830           INTO l_exchange_rate
2831           FROM ar_cash_receipts
2832           WHERE cash_receipt_id = p_cash_receipt_id;
2833 
2834           l_tot_write_off_amt := NVL(l_existing_wo_amount,0) + NVL(p_applied_amount,0);
2835 
2836          EXCEPTION
2837            WHEN no_data_found THEN
2838              l_tot_write_off_amt := p_applied_amount;
2839          END;
2840 
2841        IF NVL(p_val_writeoff_limits_flag,'Y') <> 'N' THEN
2842          BEGIN
2843           SELECT NVL(amount_from,0),
2844                  NVL(amount_to,0)
2845           INTO   l_amount_from,
2846                  l_amount_to
2847           FROM   ar_approval_user_limits
2848           where  currency_code = p_cr_currency_code
2849           and    user_id = l_user_id
2850           and    document_type ='WRTOFF';
2851          EXCEPTION
2852           WHEN NO_DATA_FOUND THEN
2853            fnd_message.set_name ('AR','AR_WR_NO_LIMIT');
2854            FND_MSG_PUB.Add;
2855            p_return_status := FND_API.G_RET_STS_ERROR;
2856          END;
2857 
2858          IF (NVL(l_tot_write_off_amt,0) > l_amount_to) OR
2859             (NVL(l_tot_write_off_amt,l_amount_from) < l_amount_from)
2860           THEN
2861            fnd_message.set_name ('AR','AR_WR_USER_LIMIT');
2862            fnd_message.set_token('FROM_AMOUNT', to_char(l_amount_from), FALSE);
2863            fnd_message.set_token('TO_AMOUNT', to_char(l_amount_to), FALSE);
2864            FND_MSG_PUB.Add;
2865            p_return_status := FND_API.G_RET_STS_ERROR;
2866          END IF;
2867 
2868        END IF;
2869 
2870        -- Bug 2751910 - validate against system limits
2871        --Bug 5367753 Modified SQL to fetch functional currency code.
2872        SELECT MAX_WRTOFF_AMOUNT,
2873               MIN_WRTOFF_AMOUNT,
2874               sob.currency_code
2875        INTO   l_max_wrt_off_amount,
2876               l_min_wrt_off_amount,
2877               l_functional_currency
2878        FROM   AR_SYSTEM_PARAMETERS sys,gl_sets_of_books sob
2879        WHERE  sys.set_of_books_id = sob.set_of_books_id;
2880 
2881        -- Bug 3136127 - if writeoff amount > 0 then max limit must have a value
2882        -- if < 0, then min limit must have a value < 0
2883        IF ((l_max_wrt_off_amount IS NULL AND
2884             NVL(l_tot_write_off_amt,0) > 0 )
2885          OR
2886            (l_min_wrt_off_amount IS NULL AND
2887             NVL(l_tot_write_off_amt,0) < 0 )
2888         ) THEN
2889           fnd_message.set_name ('AR','AR_SYSTEM_WR_NO_LIMIT_SET');
2890           FND_MSG_PUB.Add;
2891           p_return_status := FND_API.G_RET_STS_ERROR;
2892        END IF;
2893 
2894        IF PG_DEBUG in ('Y', 'C') THEN
2895           arp_util.debug('l_max_wrt_off_amount = '||l_max_wrt_off_amount);
2896           arp_util.debug('l_min_wrt_off_amount = '||l_min_wrt_off_amount);
2897           arp_util.debug('l_tot_write_off_amt = '||l_tot_write_off_amt);
2898        END IF;
2899 
2900      /**Bug 5367753 Condition is added to convert the writeoff amount into
2901         functional currency for validation */
2902        IF l_functional_currency <> p_cr_currency_code THEN
2903           l_tot_writeoff_amt_func := arpcurr.functional_amount(
2904                                   l_tot_write_off_amt,
2905                                   l_functional_currency,
2906                                   l_exchange_rate,
2907                                   arp_global.base_precision,
2908                                   arp_global.base_min_acc_unit);
2909        END IF;
2910 
2911        IF l_tot_writeoff_amt_func IS NULL THEN
2912           l_tot_writeoff_amt_func := l_tot_write_off_amt;
2913        END IF;
2914 
2915        IF ( (NVL(l_tot_write_off_amt,0) > l_max_wrt_off_amount) OR
2916             (NVL(l_tot_write_off_amt,0) < l_min_wrt_off_amount) ) THEN
2917           arp_util.debug('ERROR l_tot_write_off_amt = '||l_tot_write_off_amt);
2918           fnd_message.set_name ('AR','AR_WR_TOTAL_EXCEED_MAX_AMOUNT');
2919           FND_MSG_PUB.Add;
2920           p_return_status := FND_API.G_RET_STS_ERROR;
2921        END IF;
2922 
2923     ELSIF p_applied_ps_id = -4 THEN
2924       IF l_activity_type <> 'CLAIM_INVESTIGATION' THEN
2925          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2926          FND_MSG_PUB.Add;
2927          p_return_status := FND_API.G_RET_STS_ERROR;
2928        END IF;
2929     ELSIF p_applied_ps_id = -5 THEN
2930        IF (l_activity_type <> 'ADJUST') OR (p_receivables_trx_id <> -11) THEN
2931          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2932          FND_MSG_PUB.Add;
2933          p_return_status := FND_API.G_RET_STS_ERROR;
2934        END IF;
2935     ELSIF p_applied_ps_id = -6 THEN
2936        IF l_activity_type <> 'CCREFUND' THEN
2937          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2938          FND_MSG_PUB.Add;
2939          p_return_status := FND_API.G_RET_STS_ERROR;
2940        END IF;
2941     ELSIF p_applied_ps_id = -7 THEN
2942       IF l_activity_type <> 'PREPAYMENT' THEN
2943          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2944          FND_MSG_PUB.Add;
2945          p_return_status := FND_API.G_RET_STS_ERROR;
2946        END IF;
2947     ELSIF p_applied_ps_id = -8 THEN
2948       IF l_activity_type <> 'CM_REFUND' THEN
2949          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
2950          FND_MSG_PUB.Add;
2951          p_return_status := FND_API.G_RET_STS_ERROR;
2952        END IF;
2953     ELSE
2954       --the applied payment schedule id is invalid
2955       FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
2956       FND_MSG_PUB.Add;
2957       p_return_status := FND_API.G_RET_STS_ERROR;
2958     END IF; --additional control structures to be added for new activity types.
2959   END IF;
2960  IF PG_DEBUG in ('Y', 'C') THEN
2961     arp_util.debug('validate_activity (-)');
2962  END IF;
2963 END validate_activity;
2964 
2965 PROCEDURE validate_activity_app( p_receivables_trx_id IN NUMBER,
2966                                  p_applied_ps_id  IN NUMBER,
2967                                  p_cash_receipt_id IN NUMBER,
2968                                  p_cr_gl_date  IN DATE,
2969                                  p_cr_unapp_amount IN NUMBER,
2970                                  p_cr_date IN DATE,
2971                                  p_cr_payment_schedule_id IN NUMBER,
2972                                  p_applied_amount IN NUMBER,
2973                                  p_apply_gl_date IN DATE,
2974                                  p_apply_date IN DATE,
2975                                  p_link_to_customer_trx_id IN NUMBER,
2976                                  p_cr_currency_code IN VARCHAR2,
2977                                  p_return_status OUT NOCOPY VARCHAR2,
2978                                  p_val_writeoff_limits_flag IN VARCHAR2,
2979                                  p_called_from IN VARCHAR2 -- Bug 2897244
2980                                  ) IS
2981 l_valid   VARCHAR2(1) DEFAULT 'N';
2982 BEGIN
2983   IF PG_DEBUG in ('Y', 'C') THEN
2984      arp_util.debug('validate_activity_app ()+');
2985   END IF;
2986   p_return_status := FND_API.G_RET_STS_SUCCESS;
2987      validate_on_ac_app(
2988                    p_cash_receipt_id,
2989                    p_cr_gl_date,
2990                    p_cr_unapp_amount,
2991                    p_cr_date,
2992                    p_cr_payment_schedule_id,
2993                    p_applied_amount,
2994                    p_apply_gl_date,
2995                    p_apply_date,
2996                    p_return_status,
2997                    p_applied_ps_id,
2998                    p_called_from -- Bug 2897244
2999                     );
3000      IF p_receivables_trx_id <> -16        -- Seeded netting activity
3001      THEN
3002         validate_activity(
3003                    p_receivables_trx_id,
3004                    p_applied_ps_id,
3005                    p_cash_receipt_id,
3006                    p_applied_amount,
3007                    p_cr_currency_code,
3008                    p_val_writeoff_limits_flag,
3009                    p_return_status
3010                     );
3011      END IF;
3012      -- if this routine is called for ccrefund,this routine will check whether
3013      -- the receipt is a credit card receipt or not. We can issue refund only
3014      -- to credit card at this point.
3015 
3016      validate_ccrefund(
3017                    p_cash_receipt_id,
3018                    p_applied_ps_id,
3019                    p_return_status
3020                    );
3021 
3022    --SNAMBIAR for chargeback activity,customer_trx_id of the CB should be passed and should
3023    --be valid
3024      IF p_applied_ps_id = -5 THEN
3025         IF p_link_to_customer_trx_id IS NOT NULL THEN
3026            BEGIN
3027              SELECT 'Y'
3028              INTO   l_valid
3029              FROM   ar_payment_schedules
3030              WHERE  customer_trx_id=p_link_to_customer_trx_id
3031              AND   class='CB';
3032     	   EXCEPTION
3033      	     WHEN no_data_found THEN
3034                   FND_MESSAGE.SET_NAME('AR','AR_RAPI_LK_CUS_TRX_ID_INVALID');
3035                   FND_MSG_PUB.Add;
3036                   p_return_status := FND_API.G_RET_STS_ERROR;
3037             WHEN others THEN
3038                  raise;
3039             END;
3040             IF l_valid <> 'Y' THEN
3041                FND_MESSAGE.SET_NAME('AR','AR_RAPI_LK_CUS_TRX_ID_INVALID');
3042                FND_MSG_PUB.Add;
3043                p_return_status := FND_API.G_RET_STS_ERROR;
3044             END IF;
3045             l_valid := Null;
3046         ELSE
3047          FND_MESSAGE.SET_NAME('AR','AR_RAPI_LK_CUS_TRX_ID_INVALID');
3048          FND_MSG_PUB.Add;
3049          p_return_status := FND_API.G_RET_STS_ERROR;
3050        END IF;
3051      END IF;
3052 
3053    --validate the p_link_to_customer_trx_id
3054    --SNAMBIAR Modified for Write-off
3055     IF p_link_to_customer_trx_id IS NOT NULL AND p_applied_ps_id <> -5 THEN
3056 
3057     BEGIN
3058      SELECT 'Y'
3059      INTO   l_valid
3060      FROM   ar_transaction_history
3061      WHERE  status IN ('FACTORED', 'MATURED_PEND_RISK_ELIMINATION',
3062                        'PENDING_REMITTANCE','CLOSED')
3063        AND  customer_trx_id = p_link_to_customer_trx_id
3064        AND  current_record_flag = 'Y';
3065 
3066        IF l_valid <> 'Y' THEN
3067          FND_MESSAGE.SET_NAME('AR','AR_RAPI_LK_CUS_TRX_ID_INVALID');
3068          FND_MSG_PUB.Add;
3069          p_return_status := FND_API.G_RET_STS_ERROR;
3070        END IF;
3071 
3072     EXCEPTION
3073      WHEN no_data_found THEN
3074       FND_MESSAGE.SET_NAME('AR','AR_RAPI_LK_CUS_TRX_ID_INVALID');
3075       FND_MSG_PUB.Add;
3076       p_return_status := FND_API.G_RET_STS_ERROR;
3077      WHEN others THEN
3078        raise;
3079     END;
3080    END IF;
3081      arp_util.debug('fnd_api.g_ret_sts_error = '||fnd_api.g_ret_sts_error);
3082   IF PG_DEBUG in ('Y', 'C') THEN
3083      arp_util.debug('validate_activity_app ()-');
3084   END IF;
3085 END validate_activity_app;
3086 
3087 -- Bug 2270825 - additional validation for claims
3088 PROCEDURE validate_application_ref(
3089                 p_applied_ps_id                IN     NUMBER,
3090                 p_application_ref_type         IN     VARCHAR2,
3091                 p_application_ref_id           IN     NUMBER,
3092                 p_application_ref_num          IN     VARCHAR2,
3093                 p_secondary_application_ref_id IN     NUMBER,
3094                 p_cash_receipt_id              IN     NUMBER,
3095                 p_amount_applied               IN     NUMBER,
3096                 p_amount_due_remaining         IN     NUMBER,
3097                 p_cr_currency_code             IN     VARCHAR2,
3098                 p_trx_currency_code            IN     VARCHAR2,
3099                 p_application_ref_reason       IN     VARCHAR2,
3100                 p_return_status                OUT NOCOPY    VARCHAR2
3101                    ) IS
3102 l_valid  VARCHAR2(1) := 'N';
3103 l_query_text     VARCHAR2(2000);
3104 l_dummy          VARCHAR2(100);
3105 l_claim_id       NUMBER;
3106 l_net_claim_amount   NUMBER;
3107 l_check_amount       NUMBER;
3108 l_reason_code_id     NUMBER;
3109 l_currency_code      fnd_currencies.currency_code%TYPE;
3110 invalid_claim    EXCEPTION;
3111 
3112 BEGIN
3113   arp_util.debug('validate_application_reference  ()+');
3114 
3115  IF (p_application_ref_type IS NOT NULL AND p_applied_ps_id < 0) THEN
3116   IF p_applied_ps_id IS NOT NULL  and p_applied_ps_id in (-4,-5,-6,-7) THEN
3117      BEGIN
3118          SELECT 'Y'
3119          INTO   l_valid
3120          FROM   ar_lookups
3121          WHERE  lookup_type = DECODE(p_applied_ps_id,-4,'APPLICATION_REF_TYPE',
3122                                                      -5,'CHARGEBACK',
3123                                                      -6, 'MISC_RECEIPT',
3124                                                      -7,'AR_PREPAYMENT_TYPE',
3125                                                      'NONE')
3126          AND    enabled_flag = 'Y'
3127          AND    lookup_code = p_application_ref_type;
3128      EXCEPTION
3129          WHEN no_data_found THEN
3130               FND_MESSAGE.SET_NAME('AR','AR_RAPI_INVALID_APP_REF');
3131               FND_MSG_PUB.Add;
3132               p_return_status := FND_API.G_RET_STS_ERROR;
3133      END;
3134   ELSE
3135        FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
3136        FND_MSG_PUB.Add;
3137        p_return_status := FND_API.G_RET_STS_ERROR;
3138   END IF;
3139  END IF;
3140  /* Bug 2270825 - claim specific validation */
3141  /* Bug 2751910 - reason no longer compulsory */
3142  IF p_application_ref_type = 'CLAIM'
3143  THEN
3144    IF (p_application_ref_num IS NULL AND p_secondary_application_ref_id IS NULL)
3145    THEN
3146      IF p_application_ref_reason IS NOT NULL THEN
3147        /* Bug 3780081: bind variable used for reason_code_id */
3148        l_reason_code_id := TO_NUMBER(p_application_ref_reason);
3149        l_query_text :=
3150          ' select reason_code_id from ozf_reason_codes_vl '||
3151          ' where reason_code_id = :application_ref_reason '||
3152          ' and sysdate between nvl(start_date_active,sysdate) '||
3153          ' and nvl(end_date_active,sysdate) ';
3154        BEGIN
3155          EXECUTE IMMEDIATE l_query_text INTO l_dummy USING l_reason_code_id;
3156        EXCEPTION
3157          WHEN OTHERS THEN
3158            FND_MESSAGE.SET_NAME('AR','AR_RAPI_INVALID_REF_REASON');
3159            FND_MSG_PUB.Add;
3160            p_return_status := FND_API.G_RET_STS_ERROR;
3161        END;
3162      END IF;
3163    ELSE
3164 
3165      /* Bug 3780081: split query into 2 variants using bind variables */
3166      IF p_applied_ps_id = -4
3167      THEN
3168        l_currency_code := p_cr_currency_code;
3169      ELSE
3170        l_currency_code := p_trx_currency_code;
3171      END IF;
3172      l_query_text :=
3173          ' select claim_id from ozf_ar_deductions_v ';
3174      IF p_secondary_application_ref_id IS NOT NULL
3175      THEN
3176        l_query_text := l_query_text ||
3177          ' where claim_id = :secondary_application_ref_id '||
3178          ' and currency_code = :currency_code ';
3179        arp_util.debug('claim query text : '||l_query_text);
3180        BEGIN
3181          EXECUTE IMMEDIATE l_query_text INTO l_claim_id
3182          USING p_secondary_application_ref_id, l_currency_code ;
3183        EXCEPTION
3184          WHEN OTHERS THEN
3185            RAISE invalid_claim;
3186        END;
3187      ELSE
3188        l_query_text := l_query_text ||
3189          ' where claim_number = :application_ref_num '||
3190          ' and currency_code = :currency_code ';
3191        arp_util.debug('claim query text : '||l_query_text);
3192        BEGIN
3193          EXECUTE IMMEDIATE l_query_text INTO l_claim_id
3194          USING p_application_ref_num, l_currency_code ;
3195        EXCEPTION
3196          WHEN OTHERS THEN
3197            RAISE invalid_claim;
3198        END;
3199      END IF;
3200 
3201      /* Bug 2353144 - amount checking uses net amount remaining for claim */
3202      IF p_applied_ps_id = -4
3203      THEN
3204        l_check_amount := (p_amount_applied * -1);
3205      ELSE
3206        l_check_amount := (p_amount_due_remaining - p_amount_applied);
3207      END IF;
3208      arp_util.debug('l_check_amount = '||l_check_amount);
3209      /* Bug 2751910 - no longer need to cross check the amount */
3210 
3211    END IF;
3212  END IF;
3213 
3214    arp_util.debug('validate_application_reference  ()-');
3215 EXCEPTION
3216   WHEN invalid_claim THEN
3217          IF p_secondary_application_ref_id IS NOT NULL
3218          THEN
3219            FND_MESSAGE.SET_NAME('AR','AR_RW_INVALID_CLAIM_ID');
3220            FND_MESSAGE.SET_TOKEN('CLAIM_ID',p_secondary_application_ref_id);
3221          ELSE
3222            FND_MESSAGE.SET_NAME('AR','AR_RAPI_INVALID_CLAIM_NUM');
3223            FND_MESSAGE.SET_TOKEN('CLAIM_NUM',p_application_ref_num);
3224          END IF;
3225          FND_MSG_PUB.Add;
3226          p_return_status := FND_API.G_RET_STS_ERROR;
3227 	 RAISE;
3228  WHEN others THEN
3229    p_return_status := FND_API.G_RET_STS_ERROR;
3230    arp_util.debug('EXCEPTION :validate_application_reference  ()-'||SQLERRM);
3231    raise;
3232 END;
3233 
3234 PROCEDURE Validate_misc_receipt(
3235                 p_receipt_number               IN     VARCHAR2,
3236                 p_receipt_method_id            IN     NUMBER,
3237                 p_state                        IN     VARCHAR2,
3238                 p_receipt_date                 IN     DATE,
3239                 p_gl_date                      IN     DATE,
3240                 p_deposit_date                 IN     DATE,
3241                 p_amount                       IN     NUMBER,
3242                 p_orig_receivables_trx_id      IN     NUMBER,
3243                 p_receivables_trx_id           IN     NUMBER,
3244                 p_distribution_set_id          IN OUT NOCOPY NUMBER,
3245                 p_orig_vat_tax_id              IN     NUMBER,
3246                 p_vat_tax_id                   IN     NUMBER,
3247                 p_tax_rate                     IN OUT NOCOPY NUMBER,
3248                 p_tax_amount                   IN     NUMBER,
3249                 p_reference_num                IN     VARCHAR2,
3250                 p_orig_reference_id            IN     NUMBER,
3251                 p_reference_id                 IN     NUMBER,
3252                 p_reference_type               IN     VARCHAR2,
3253                 p_remittance_bank_account_id   IN     NUMBER,
3254                 p_anticipated_clearing_date    IN     DATE,
3255                 p_currency_code                IN     VARCHAR2,
3256                 p_exchange_rate_type           IN     VARCHAR2,
3257                 p_exchange_rate                IN     NUMBER,
3258                 p_exchange_date                IN     DATE,
3259                 p_doc_sequence_value           IN     NUMBER,
3260                 p_return_status                   OUT NOCOPY VARCHAR2
3261                    )
3262 IS
3263 
3264 l_receipt_date_return_status  VARCHAR2(1);
3265 l_gl_date_return_status       VARCHAR2(1);
3266 l_deposit_date_return_status  VARCHAR2(1);
3267 l_rcpt_md_return_status       VARCHAR2(1);
3268 l_amount_return_status        VARCHAR2(1);
3269 l_currency_return_status      VARCHAR2(1);
3270 l_doc_seq_return_status       VARCHAR2(1);
3271 l_dup_return_status           VARCHAR2(1);
3272 l_activity_return_status      VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
3273 l_tax_id_return_status        VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
3274 l_tax_rate_return_status      VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
3275 l_tax_rate                    NUMBER;
3276 l_tax_validate_flag           VARCHAR2(1);
3277 l_reference_valid             VARCHAR2(1);
3278 l_ref_id_return_status        VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
3279 l_ref_type_return_status      VARCHAR2(1) DEFAULT FND_API.G_RET_STS_SUCCESS;
3280 BEGIN
3281         IF PG_DEBUG in ('Y', 'C') THEN
3282            arp_util.debug('Validate_misc_receipt()+ ');
3283         END IF;
3284 
3285       p_return_status := FND_API.G_RET_STS_SUCCESS;
3286 
3287     --Validate receipt_date
3288 
3289       Validate_Receipt_Date(p_receipt_date,
3290                             l_receipt_date_return_status);
3291       IF PG_DEBUG in ('Y', 'C') THEN
3292          arp_util.debug('Validate_misc_receipt: ' || 'l_receipt_date_return_status : '||l_receipt_date_return_status);
3293       END IF;
3294 
3295     --Validate gl_date
3296 
3297       Validate_Gl_Date(p_gl_date,
3298                        l_gl_date_return_status);
3299       IF PG_DEBUG in ('Y', 'C') THEN
3300          arp_util.debug('Validate_misc_receipt: ' || 'l_gl_date_return_status : '||l_gl_date_return_status);
3301       END IF;
3302 
3303     --Validate deposit_date
3304 
3305       Validate_Deposit_Date(p_deposit_date,
3306                             l_deposit_date_return_status);
3307       IF PG_DEBUG in ('Y', 'C') THEN
3308          arp_util.debug('Validate_misc_receipt: ' || 'l_deposit_date_return_status : '||l_deposit_date_return_status);
3309       END IF;
3310 
3311 
3312     --Validate Receipt_method
3313       Validate_Receipt_Method(p_receipt_method_id,
3314                               p_remittance_bank_account_id,
3315                               p_receipt_date,
3316                               p_currency_code,
3317                               p_state,
3318                               'MISC',
3319                               l_rcpt_md_return_status);
3320        IF PG_DEBUG in ('Y', 'C') THEN
3321           arp_util.debug('Validate_misc_receipt: ' || 'l_rcpt_md_return_status : '||l_rcpt_md_return_status);
3322        END IF;
3323 
3324    --Validate document sequence value
3325 
3326       IF(NVL(ar_receipt_lib_pvt.pg_profile_doc_seq, 'N') = 'N' )  AND
3327           p_doc_sequence_value IS NOT NULL
3328         THEN
3329              l_doc_seq_return_status := FND_API.G_RET_STS_ERROR ;
3330              FND_MESSAGE.SET_NAME('AR','AR_RAPI_DOC_SEQ_VAL_INVALID');
3331              FND_MSG_PUB.Add;
3332        END IF;
3333 
3334     --Validate currency and exchange rate info.
3335      IF p_currency_code <> arp_global.functional_currency OR
3336         p_exchange_rate_type  IS NOT NULL OR
3337         p_exchange_rate       IS NOT NULL OR
3338         p_exchange_date  IS NOT NULL
3339       THEN
3340        Validate_currency(p_currency_code,
3341                          p_exchange_rate_type,
3342                          p_exchange_rate,
3343                          p_exchange_date,
3344                          l_currency_return_status);
3345      END IF;
3346      IF PG_DEBUG in ('Y', 'C') THEN
3347         arp_util.debug('Validate_misc_receipt: ' || 'l_currency_return_status : '||l_currency_return_status);
3348      END IF;
3349 
3350      IF p_receipt_number IS NOT NULL AND
3351         p_amount IS NOT NULL
3352       THEN
3353         val_duplicate_receipt(p_receipt_number,
3354                               p_receipt_date,
3355                               p_amount,
3356                               'MISC',
3357                               null,
3358                               l_dup_return_status );
3359      END IF;
3360 
3361     --Validate the activity on the misc receipt.
3362     --Also default the distribution_set_id.
3363    IF PG_DEBUG in ('Y', 'C') THEN
3364       arp_util.debug('Validate_misc_receipt: ' || 'Validating the activity ');
3365    END IF;
3366     IF p_receivables_trx_id IS NOT NULL THEN
3367 
3368      --CC Chargeback logic
3369       BEGIN
3370              SELECT rt.default_acctg_distribution_set
3371              INTO   p_distribution_set_id
3372              FROM   ar_receivables_trx rt
3373              WHERE  rt.receivables_trx_id = p_receivables_trx_id
3374              AND    rt.type in
3375             ('MISCCASH', 'BANK_ERROR', 'CCREFUND', 'CM_REFUND','CC_CHARGEBACK')
3376              AND    nvl(rt.status, 'A') = 'A'
3377              AND    p_receipt_date >= nvl(rt.start_date_active, p_receipt_date)
3378              AND    p_receipt_date <= nvl(rt.end_date_active, p_receipt_date);
3379       EXCEPTION
3380        WHEN no_data_found THEN
3381          IF p_orig_receivables_trx_id IS NULL THEN
3382              l_activity_return_status := FND_API.G_RET_STS_ERROR ;
3383              FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_INVALID');
3384              FND_MSG_PUB.Add;
3385          ELSE
3386              l_activity_return_status := FND_API.G_RET_STS_ERROR ;
3387              FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_TRX_ID_INVALID');
3388              FND_MSG_PUB.Add;
3389          END IF;
3390       END;
3391     ELSE
3392              l_activity_return_status := FND_API.G_RET_STS_ERROR ;
3393              FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_TRX_ID_NULL');
3394              FND_MSG_PUB.Add;
3395     END IF;
3396 
3397 
3398     --Validate vat_tax_id
3399     IF PG_DEBUG in ('Y', 'C') THEN
3400        arp_util.debug('Validate_misc_receipt: ' || 'Validating vat_tax_id');
3401     END IF;
3402 
3403   IF arp_global.sysparam.accounting_method = 'ACCRUAL'
3404    THEN
3405       IF p_vat_tax_id IS NOT NULL THEN
3406         BEGIN
3407            SELECT percentage_rate
3408            INTO   l_tax_rate
3409            FROM   zx_sco_rates vt
3410            WHERE  p_receipt_date between
3411                           nvl(vt.effective_from, p_receipt_date)
3412                      and  nvl(vt.effective_to, p_receipt_date)
3413              AND  vt.tax_class =  decode(sign(p_amount), 1, 'OUTPUT',
3414                                         0, 'OUTPUT',-1, 'INPUT')
3415              AND  vt.tax_rate_id = p_vat_tax_id;
3416 /*  Bug 5955921 - Replaced the obsoleted ar_vat_tax with zx_sco_rates
3417             SELECT tax_rate, validate_flag
3418             INTO   l_tax_rate, l_tax_validate_flag
3419             FROM   ar_vat_tax vt
3420             WHERE  p_receipt_date between
3421 		          nvl(vt.start_date, p_receipt_date)
3422 	             and  nvl(vt.end_date, p_receipt_date)
3423               AND  vt.set_of_books_id = arp_global.set_of_books_id
3424               AND  vt.tax_class =  decode(sign(p_amount), 1, 'O', 0, 'O',  -1, 'I')
3425               AND  vt.enabled_flag='Y'
3426               AND  vt.tax_type <> 'TAX_GROUP'
3427               AND  vt.tax_type <> 'LOCATION'
3428               AND  vt.tax_type <> 'SALES_TAX'
3429               AND  vt.displayed_flag='Y'
3430               AND  vt.vat_tax_id = p_vat_tax_id;   */
3431 
3432         EXCEPTION
3433          WHEN no_data_found THEN
3434             IF p_orig_vat_tax_id IS NOT NULL THEN
3435               l_tax_id_return_status := FND_API.G_RET_STS_ERROR ;
3436               FND_MESSAGE.SET_NAME('AR','AR_RAPI_VAT_TAX_ID_INVALID');
3437               FND_MSG_PUB.Add;
3438             ELSE
3439               l_tax_id_return_status := FND_API.G_RET_STS_ERROR ;
3440               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TAX_CODE_INVALID');
3441               FND_MSG_PUB.Add;
3442             END IF;
3443         END;
3444 
3445        --In case where user has specified the tax_rate/tax amount , we need to verify
3446        --the adhoc flag on the tax_code as well as the profile option
3447        --'Tax: Allow Ad Hoc Tax Changes'
3448        --to see if he alowed to do so.
3449        --p_tax_rate is the user specified  tax rate or the tax rate derived from the
3450        --user specified tax amount and the receipt amount.
3451        /* 4743228 - use ZX profile instead */
3452        IF p_tax_rate IS NOT NULL THEN
3453            /* Bug 5955921  l_tax_validate_flag = 'N' OR */
3454           IF fnd_profile.value('ZX_ALLOW_TAX_UPDATE') = 'N'
3455           THEN
3456               l_tax_rate_return_status := FND_API.G_RET_STS_ERROR;
3457               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TAX_RATE_INVALID');
3458               FND_MSG_PUB.Add;
3459           END IF;
3460        ELSE
3461 
3462          IF arp_global.sysparam.accounting_method = 'ACCRUAL' THEN
3463           p_tax_rate := l_tax_rate;
3464          END IF;
3465 
3466        END IF;
3467 
3468 
3469       ELSE
3470      --this is the case where we dont have any vat_tax_id, but the user has specified the
3471      --tax rate as a input parameter.
3472         IF p_tax_rate IS NOT NULL THEN
3473               l_tax_id_return_status := FND_API.G_RET_STS_ERROR ;
3474               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TAX_RATE_INVALID');
3475               FND_MSG_PUB.Add;
3476         END IF;
3477       END IF;
3478 
3479   ELSE
3480     --if the accounting is cash basis.
3481     IF p_vat_tax_id IS NOT NULL THEN
3482        --raise error as no tax accounting is done for cash basis in misc receipt.
3483              l_tax_id_return_status := FND_API.G_RET_STS_ERROR ;
3484              FND_MESSAGE.SET_NAME('AR','AR_RAPI_VAT_TAX_ID_INVALID');
3485              FND_MSG_PUB.Add;
3486     END IF;
3487 
3488     IF p_tax_rate   IS NOT NULL  THEN
3489              l_tax_id_return_status := FND_API.G_RET_STS_ERROR ;
3490              FND_MESSAGE.SET_NAME('AR','AR_RAPI_TAX_RATE_INVALID');
3491              FND_MSG_PUB.Add;
3492     END IF;
3493 
3494   END IF;
3495 
3496 
3497 
3498     --Validate reference_id, reference_type
3499    IF PG_DEBUG in ('Y', 'C') THEN
3500       arp_util.debug('Validate_misc_receipt: ' || 'Validation for reference id begins');
3501    END IF;
3502    IF p_reference_type IS NOT NULL  THEN
3503     IF p_reference_id IS NOT NULL THEN
3504      BEGIN
3505         IF  (p_reference_type = 'PAYMENT')  THEN
3506           --get from ap_checks.
3507             select 'y'
3508             into   l_reference_valid
3509             from   ap_checks
3510             where  check_id = p_reference_id /* Bug fix 2982212 */
3511               and  bank_account_id = p_remittance_bank_account_id;
3512         ELSIF (p_reference_type = 'PAYMENT_BATCH' ) THEN
3513           --
3514             select 'y'
3515             into   l_reference_valid
3516             from   ap_invoice_selection_criteria isc
3517             where  isc.checkrun_id = p_reference_id /* Bug fix 2982212 */
3518               and  bank_account_id = p_remittance_bank_account_id;
3519         ELSIF (p_reference_type = 'RECEIPT' ) THEN
3520           --
3521             select 'y'
3522             into   l_reference_valid
3523             from   ar_cash_receipts
3524             where  cash_receipt_id = p_reference_id
3525              and   remit_bank_acct_use_id = p_remittance_bank_account_id;
3526         ELSIF (p_reference_type = 'REMITTANCE' ) THEN
3527          --
3528             select 'y'
3529             into   l_reference_valid
3530             from   ar_batches
3531             where  batch_id = p_reference_id /* Bug fix 2982212 */
3532              and   type = 'REMITTANCE'
3533              and   remit_bank_acct_use_id = p_remittance_bank_account_id;
3534         /* Bug 4112494 - added for credit memo refunds */
3535         ELSIF (p_reference_type = 'CREDIT_MEMO' ) THEN
3536           --
3537             select 'y'
3538             into   l_reference_valid
3539             from   ra_customer_trx
3540             where  customer_trx_id = p_reference_id;
3541         ELSE
3542          --the reference_type is invalid, raise error.
3543             l_ref_type_return_status := FND_API.G_RET_STS_ERROR;
3544             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_TYPE_INVALID');
3545             FND_MSG_PUB.Add;
3546 
3547         END IF;
3548      EXCEPTION
3549         WHEN no_data_found THEN
3550           IF p_orig_reference_id IS NULL THEN
3551             l_ref_id_return_status := FND_API.G_RET_STS_ERROR;
3552             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_NUM_INVALID');
3553             FND_MSG_PUB.Add;
3554           ELSE
3555             l_ref_id_return_status := FND_API.G_RET_STS_ERROR;
3556             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_ID_INVALID');
3557             FND_MSG_PUB.Add;
3558           END IF;
3559      END;
3560     ELSE
3561       --the reference_id is null, raise error.
3562       IF p_reference_num IS NOT NULL THEN
3563           --this would happen if the reference_id could not be
3564           --derived from reference number
3565             l_ref_id_return_status := FND_API.G_RET_STS_ERROR;
3566             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_NUM_INVALID');
3567             FND_MSG_PUB.Add;
3568       ELSE
3569             l_ref_id_return_status := FND_API.G_RET_STS_ERROR;
3570             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_ID_NULL');
3571             FND_MSG_PUB.Add;
3572       END IF;
3573 
3574     END IF;
3575 
3576    ELSE
3577        --reference_type is null
3578 
3579       IF p_orig_reference_id IS NULL  AND
3580          p_reference_num IS NULL
3581        THEN
3582             null;
3583       ELSE
3584         --this means any one of the orig_reference_id, reference_num or
3585         --reference_id is specified, so a null reference type should
3586         --raise an error.
3587             l_ref_type_return_status := FND_API.G_RET_STS_ERROR;
3588             FND_MESSAGE.SET_NAME('AR','AR_RAPI_REF_TYPE_NULL');
3589             FND_MSG_PUB.Add;
3590       END IF;
3591    END IF;
3592 
3593 
3594      IF (l_receipt_date_return_status   = FND_API.G_RET_STS_ERROR) OR
3595         (l_gl_date_return_status        = FND_API.G_RET_STS_ERROR) OR
3596         (l_deposit_date_return_status   = FND_API.G_RET_STS_ERROR) OR
3597         (l_rcpt_md_return_status        = FND_API.G_RET_STS_ERROR) OR
3598         (l_amount_return_status         = FND_API.G_RET_STS_ERROR) OR
3599         (l_currency_return_status       = FND_API.G_RET_STS_ERROR) OR
3600         (l_doc_seq_return_status        = FND_API.G_RET_STS_ERROR) OR
3601         (l_dup_return_status            = FND_API.G_RET_STS_ERROR) OR
3602         (l_activity_return_status       = FND_API.G_RET_STS_ERROR) OR
3603         (l_tax_id_return_status         = FND_API.G_RET_STS_ERROR) OR
3604         (l_ref_id_return_status         = FND_API.G_RET_STS_ERROR) OR
3605         (l_ref_type_return_status       = FND_API.G_RET_STS_ERROR)
3606        THEN
3607         p_return_status := FND_API.G_RET_STS_ERROR;
3608      END IF;
3609     IF PG_DEBUG in ('Y', 'C') THEN
3610        arp_util.debug('Validate_misc_receipt return status :'||p_return_status);
3611     END IF;
3612 
3613 EXCEPTION
3614  WHEN others THEN
3615    IF PG_DEBUG in ('Y', 'C') THEN
3616       arp_util.debug('EXCEPTION : Validate_misc_receipt()');
3617    END IF;
3618   raise;
3619 
3620 END Validate_misc_receipt;
3621 
3622 PROCEDURE validate_prepay_amount(
3623                 p_receipt_number              IN  VARCHAR2,
3624                 p_cash_receipt_id             IN  NUMBER,
3625                 p_applied_ps_id               IN  NUMBER,
3626                 p_receivable_application_id   IN  NUMBER,
3627                 p_refund_amount               IN  NUMBER,
3628                 p_return_status               OUT NOCOPY VARCHAR2
3629                                ) IS
3630 l_cash_receipt_id  NUMBER;
3631 l_prepay_amount    NUMBER;
3632 BEGIN
3633 
3634  arp_util.debug('Validate prepay amount (+)');
3635  p_return_status := FND_API.G_RET_STS_SUCCESS;
3636 
3637  l_cash_receipt_id := p_cash_receipt_id;
3638 
3639  IF p_receipt_number IS NOT NULL THEN
3640         ar_receipt_lib_pvt.Default_cash_receipt_id(l_cash_receipt_id ,
3641                                 p_receipt_number ,
3642                                 p_return_status);
3643  END IF;
3644 
3645  IF l_cash_receipt_id IS NOT NULL THEN
3646 
3647     SELECT sum(nvl(amount_applied,0))
3648     INTO   l_prepay_amount
3649     FROM   ar_receivable_applications
3650     WHERE  cash_receipt_id = p_cash_receipt_id
3651     AND    applied_payment_schedule_id = p_applied_ps_id
3652     AND    display = 'Y'
3653     AND    status = 'OTHER ACC';
3654 
3655  END IF;
3656 
3657  IF p_receivable_application_id IS NOT NULL THEN
3658 
3659     SELECT sum(nvl(amount_applied,0))
3660     INTO   l_prepay_amount
3661     FROM    ar_receivable_applications
3662     WHERE   receivable_application_id = p_receivable_application_id
3663     AND     display = 'Y'
3664     AND     applied_payment_schedule_id = p_applied_ps_id
3665     AND     status = 'OTHER ACC';
3666 
3667  END IF;
3668 
3669  IF nvl(p_refund_amount,0) > l_prepay_amount THEN
3670     --raise error X validation failed
3671       FND_MESSAGE.SET_NAME('AR','AR_RAPI_PREPAY_AMT_LESS');
3672       FND_MSG_PUB.Add;
3673       p_return_status := FND_API.G_RET_STS_ERROR ;
3674  END IF;
3675 
3676  arp_util.debug('Validate prepay amount (-)');
3677 
3678 EXCEPTION
3679      WHEN others THEN
3680           FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
3681           FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',SQLERRM);
3682           FND_MSG_PUB.Add;
3683           p_return_status := FND_API.G_RET_STS_ERROR ;
3684  arp_util.debug('EXCEPTION :Validate prepay amount '||SQLERRM);
3685 END;
3686 
3687 PROCEDURE validate_payment_type(
3688                 p_receipt_number              IN  VARCHAR2,
3689                 p_cash_receipt_id             IN  NUMBER,
3690                 p_receivable_application_id   IN  NUMBER,
3691                 p_payment_action              IN  VARCHAR2,
3692                 p_return_status               OUT NOCOPY VARCHAR2
3693                    ) IS
3694 
3695 l_payment_type_code     VARCHAR2(30);
3696 l_cash_receipt_id  NUMBER;
3697 
3698 BEGIN
3699  arp_util.debug('Validate payment Type (+)');
3700  p_return_status := FND_API.G_RET_STS_SUCCESS;
3701 
3702  l_cash_receipt_id := p_cash_receipt_id;
3703 
3704  IF p_receipt_number IS NOT NULL THEN
3705         ar_receipt_lib_pvt.Default_cash_receipt_id(l_cash_receipt_id ,
3706                                 p_receipt_number ,
3707                                 p_return_status);
3708  END IF;
3709 
3710  IF l_cash_receipt_id IS NOT NULL THEN
3711 
3712     SELECT NVL(payment_channel_code,'CASH')
3713     INTO   l_payment_type_code
3714     FROM   ar_receipt_methods arm,
3715            ar_cash_receipts cr
3716     WHERE  cr.receipt_method_id = arm.receipt_method_id
3717     AND    cr.cash_receipt_id=l_cash_receipt_id;
3718 
3719 
3720  ELSIF p_receivable_application_id is not null THEN
3721 
3722     SELECT NVL(payment_channel_code,'CASH')
3723     INTO   l_payment_type_code
3724     FROM   ar_receipt_methods arm,
3725            ar_cash_receipts cr,
3726            ar_receivable_applications app
3727     WHERE  cr.receipt_method_id = arm.receipt_method_id
3728     AND    app.cash_receipt_id=cr.cash_receipt_id
3729     AND    app.receivable_application_id = p_receivable_application_id;
3730 
3731  END IF;
3732 
3733  IF (NVL(l_payment_type_code,'CASH') <> 'CREDIT_CARD') THEN
3734 
3735        IF p_payment_action = 'CREATE_RCPT' THEN
3736 
3737          FND_MESSAGE.set_name ('AR','AR_RAPI_PREPAY_ONLYFOR_CC');
3738          FND_MSG_PUB.Add;
3739          p_return_status := FND_API.G_RET_STS_ERROR ;
3740 
3741        ELSIF  p_payment_action = 'REFUND_RCPT' THEN
3742 
3743          FND_MESSAGE.set_name ('AR','AR_RW_CCR_NOT_CC_RECEIPT');
3744          FND_MSG_PUB.Add;
3745          p_return_status := FND_API.G_RET_STS_ERROR ;
3746 
3747       END IF;
3748  END IF;
3749 
3750  arp_util.debug('Validate payment Type (-)');
3751 
3752 EXCEPTION
3753      WHEN others THEN
3754           FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
3755           FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',SQLERRM);
3756           FND_MSG_PUB.Add;
3757           p_return_status := FND_API.G_RET_STS_ERROR ;
3758  arp_util.debug('EXCEPTION :Validate payment type '||SQLERRM);
3759 END;
3760 
3761  -- Bug 2270809
3762  -- If a claim investigation app, then check the claim status.
3763  -- If not OPEN,CANCELLED,COMPLETE then disallow unapply
3764 
3765 PROCEDURE validate_claim_unapply(
3766                 p_secondary_app_ref_id        IN  VARCHAR2,
3767                 p_invoice_ps_id               IN  NUMBER,
3768                 p_customer_trx_id             IN  NUMBER,
3769                 p_cash_receipt_id             IN  NUMBER,
3770                 p_receipt_number              IN  VARCHAR2,
3771                 p_amount_applied              IN  NUMBER,
3772                 p_cancel_claim_flag           IN  VARCHAR2,
3773                 p_return_status               OUT NOCOPY VARCHAR2)
3774 IS
3775   l_claim_status                  VARCHAR2(30);
3776   l_msg_count                     NUMBER;
3777   l_msg_data                      VARCHAR2(2000);
3778   l_secondary_app_ref_id          NUMBER;
3779   l_claim_reason_code_id          NUMBER;
3780   l_claim_reason_name             VARCHAR2(100);
3781   l_claim_number                  VARCHAR2(30);
3782 
3783 
3784 BEGIN
3785   IF PG_DEBUG in ('Y', 'C') THEN
3786      arp_util.debug('ar_receipt_val_pvt.validate_claim_unapply()+');
3787   END IF;
3788 
3789   l_secondary_app_ref_id := p_secondary_app_ref_id;
3790 
3791   arp_process_application.update_claim(
3792                 p_claim_id      =>  l_secondary_app_ref_id
3793               , p_invoice_ps_id =>  p_invoice_ps_id
3794               , p_customer_trx_id => p_customer_trx_id
3795               , p_amount        =>  0
3796               , p_amount_applied => p_amount_applied
3797               , p_apply_date    =>  SYSDATE
3798               , p_cash_receipt_id => p_cash_receipt_id
3799               , p_receipt_number => p_receipt_number
3800               , p_action_type   => 'U'
3801               , x_claim_reason_code_id => l_claim_reason_code_id
3802               , x_claim_reason_name    => l_claim_reason_name
3803               , x_claim_number         => l_claim_number
3804               , x_return_status =>  p_return_status
3805               , x_msg_count     =>  l_msg_count
3806               , x_msg_data      =>  l_msg_data);
3807   IF PG_DEBUG in ('Y', 'C') THEN
3808      arp_util.debug('ar_receipt_val_pvt.validate_claim_unapply()-');
3809   END IF;
3810 EXCEPTION
3811      WHEN others THEN
3812           FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
3813           FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',SQLERRM);
3814           FND_MSG_PUB.Add;
3815           p_return_status := FND_API.G_RET_STS_ERROR ;
3816      IF PG_DEBUG in ('Y', 'C') THEN
3817         arp_util.debug('EXCEPTION :ar_receipt_val_pvt.validate_claim_unapply '||SQLERRM);
3818      END IF;
3819 END validate_claim_unapply;
3820 
3821 PROCEDURE validate_open_receipt_info(
3822        p_cash_receipt_id         IN  NUMBER
3823      , p_open_cash_receipt_id    IN  NUMBER
3824      , p_apply_date              IN  DATE
3825      , p_apply_gl_date           IN  DATE
3826      , p_cr_gl_date              IN  DATE
3827      , p_open_cr_gl_date         IN  DATE
3828      , p_cr_date                 IN  DATE
3829      , p_amount_applied          IN  NUMBER
3830      , p_other_amount_applied    IN  NUMBER
3831      , p_receipt_currency        IN  VARCHAR2
3832      , p_open_receipt_currency   IN  VARCHAR2
3833      , p_cr_customer_id          IN  NUMBER
3834      , p_open_cr_customer_id     IN  NUMBER
3835      , p_unapplied_cash          IN  NUMBER
3836      , p_called_from             IN  VARCHAR2
3837      , p_return_status           OUT NOCOPY VARCHAR2
3838 ) IS
3839 l_rct_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3840 l_gl_date_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3841 l_act_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3842 l_amt_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3843 l_cust_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3844 l_cur_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3845 l_apply_date_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
3846 l_func_currency         gl_sets_of_books.currency_code%TYPE;
3847 l_activity_name         ar_receivables_trx.name%TYPE;
3848 l_ccid			NUMBER;
3849 
3850 BEGIN
3851 
3852   IF PG_DEBUG in ('Y', 'C') THEN
3853       arp_util.debug('ar_receipt_val_pvt.validate_open_receipt_info()+');
3854   END IF;
3855 
3856   -- Bug 3235089: checks for activity existing and accounting set up
3857   BEGIN
3858      SELECT name, code_combination_id
3859      INTO   l_activity_name, l_ccid
3860      FROM   ar_receivables_trx
3861      WHERE  receivables_trx_id = -16;
3862 
3863      IF l_ccid IS NULL THEN
3864        FND_MESSAGE.SET_NAME('AR','AR_RW_NO_NETTING_ACCOUNT');
3865        FND_MSG_PUB.Add;
3866        l_act_return_status := FND_API.G_RET_STS_ERROR;
3867      END IF;
3868   EXCEPTION
3869      WHEN NO_DATA_FOUND THEN
3870        FND_MESSAGE.SET_NAME('AR','AR_RW_MISSING_NETTING_ACTIVITY');
3871        FND_MSG_PUB.Add;
3872        l_act_return_status := FND_API.G_RET_STS_ERROR;
3873   END;
3874 
3875   IF p_cash_receipt_id = p_open_cash_receipt_id THEN
3876     FND_MESSAGE.SET_NAME('AR','AR_RW_NET_RCT_APPLY_SELF');
3877     FND_MSG_PUB.Add;
3878     l_rct_return_status := FND_API.G_RET_STS_ERROR;
3879   END IF;
3880 
3881   -- Check if valid paying customer
3882   IF NOT arp_trx_validate.validate_paying_customer(
3883                p_paying_customer_id           => p_cr_customer_id,
3884                p_trx_date                     => p_cr_date,
3885                p_bill_to_customer_id          => p_open_cr_customer_id,
3886                p_ct_prev_paying_customer_id   => p_cr_customer_id,
3887                p_currency_code                => p_receipt_currency,
3888                p_pay_unrelated_invoices_flag  => arp_global.sysparam.pay_unrelated_invoices_flag,
3889                p_ct_prev_trx_date             => p_cr_date)  THEN
3890           FND_MESSAGE.SET_NAME('AR','ARTA_PYMNT_UNRELATED_CUST');
3891           FND_MSG_PUB.Add;
3892           l_cust_return_status := FND_API.G_RET_STS_ERROR;
3893        END IF;
3894 
3895 
3896          validate_apply_date(p_apply_date,
3897                              p_apply_date, /* Bug fix 3286069 */
3898                              p_cr_date,
3899                              l_apply_date_return_status
3900                              );
3901 
3902    IF PG_DEBUG in ('Y', 'C') THEN
3903       arp_util.debug('Validate_open_receipt_info: ' || 'Apply date return status :'||l_apply_date_return_status);
3904    END IF;
3905 
3906          validate_apply_gl_date(p_apply_gl_date ,
3907                                  p_cr_gl_date ,
3908                                  p_cr_gl_date  ,
3909                                  l_gl_date_return_status
3910                                  );
3911 
3912        IF p_apply_gl_date < p_open_cr_gl_date  THEN
3913           FND_MESSAGE.SET_NAME('AR','AR_RW_GL_DATE_BEFORE_OPEN_REC');
3914           FND_MSG_PUB.Add;
3915           l_gl_date_return_status := FND_API.G_RET_STS_ERROR;
3916        END IF;
3917 
3918 
3919    IF PG_DEBUG in ('Y', 'C') THEN
3920       arp_util.debug('Validate_open_receipt_info: ' || 'Apply gl_date return status :'||l_gl_date_return_status);
3921       arp_util.debug('Validate_open_receipt_info: ' || 'p_unapplied_cash :'||p_unapplied_cash);
3922       arp_util.debug('Validate_open_receipt_info: ' || 'p_amount_applied :'||p_amount_applied);
3923       arp_util.debug('Validate_open_receipt_info: ' || 'p_called_from :'||p_called_from);
3924    END IF;
3925        --  validate amount applied
3926           IF  p_amount_applied IS NULL  THEN
3927               FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
3928               FND_MSG_PUB.Add;
3929               l_amt_return_status := FND_API.G_RET_STS_ERROR;
3930 
3931           ELSE
3932             -- Bug 2897244 - receipt overapplication not checked if called
3933             -- from ARXRWAPP or PostBatch
3934             IF NVL(p_called_from,'RAPI') NOT IN ('ARXRWAPP','ARCAPB')
3935             THEN
3936               IF (nvl(p_unapplied_cash,0)- p_amount_applied) < 0 THEN
3937                 FND_MESSAGE.SET_NAME('AR','AR_RW_AMOUNT_LESS_THAN_APP');
3938                 FND_MSG_PUB.Add;
3939                 l_amt_return_status := FND_API.G_RET_STS_ERROR;
3940               END IF;
3941             END IF;
3942             IF ((SIGN(p_other_amount_applied * -1) <> SIGN(p_amount_applied)) OR
3943                 (ABS(p_amount_applied) > ABS(p_other_amount_applied)) ) THEN
3944               FND_MESSAGE.SET_NAME('AR','AR_RW_NET_OPEN_AMT_INC');
3945               FND_MSG_PUB.Add;
3946               l_amt_return_status := FND_API.G_RET_STS_ERROR;
3947             END IF;
3948 
3949           END IF;
3950 
3951    IF PG_DEBUG in ('Y', 'C') THEN
3952       arp_util.debug('Validate_open_receipt_info: ' || 'Amount return status :'||l_amt_return_status);
3953    END IF;
3954 
3955    SELECT sob.currency_code
3956    INTO   l_func_currency
3957    FROM   ar_system_parameters sp,
3958           gl_sets_of_books sob
3959    WHERE  sp.set_of_books_id = sob.set_of_books_id;
3960 
3961    IF (p_receipt_currency <> p_open_receipt_currency) THEN
3962         FND_MESSAGE.SET_NAME('AR','AR_RW_NET_DIFF_RCT_CURR');
3963         FND_MSG_PUB.Add;
3964         l_cur_return_status := FND_API.G_RET_STS_ERROR;
3965    END IF;
3966 
3967     IF l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
3968        l_rct_return_status <> FND_API.G_RET_STS_SUCCESS OR
3969        l_act_return_status <> FND_API.G_RET_STS_SUCCESS OR
3970        l_amt_return_status <> FND_API.G_RET_STS_SUCCESS OR
3971        l_cur_return_status <> FND_API.G_RET_STS_SUCCESS OR
3972        l_cust_return_status <> FND_API.G_RET_STS_SUCCESS OR
3973        l_apply_date_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
3974 
3975        p_return_status := FND_API.G_RET_STS_ERROR;
3976     END IF;
3977 
3978   IF PG_DEBUG in ('Y', 'C') THEN
3979      arp_util.debug('ar_receipt_val_pvt.validate_open_receipt_info()-');
3980   END IF;
3981 EXCEPTION
3982      WHEN others THEN
3983           FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
3984           FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',SQLERRM);
3985           FND_MSG_PUB.Add;
3986           p_return_status := FND_API.G_RET_STS_ERROR ;
3987      IF PG_DEBUG in ('Y', 'C') THEN
3988         arp_util.debug('EXCEPTION :ar_receipt_val_pvt.validate_open_receipt_info '||SQLERRM);
3989      END IF;
3990 
3991 END validate_open_receipt_info;
3992 
3993 PROCEDURE validate_unapp_open_receipt(
3994        p_applied_cash_receipt_id IN  NUMBER
3995      , p_amount_applied          IN  NUMBER
3996      , p_return_status           IN OUT NOCOPY VARCHAR2
3997 ) IS
3998 
3999   l_cr_amount             NUMBER;
4000   l_amount_applied        NUMBER;
4001 BEGIN
4002 
4003   IF PG_DEBUG in ('Y', 'C') THEN
4004       arp_util.debug('ar_receipt_val_pvt.validate_unapp_open_receipt()+');
4005   END IF;
4006 
4007   -- Check if unapplication will send the applied-to receipt negative
4008 
4009     SELECT amount
4010     INTO   l_cr_amount
4011     FROM   ar_cash_receipts
4012     WHERE  cash_receipt_id = p_applied_cash_receipt_id;
4013 
4014     SELECT NVL(SUM(amount_applied),0)
4015     INTO   l_amount_applied
4016     FROM   ar_receivable_applications
4017     WHERE  cash_receipt_id = p_applied_cash_receipt_id
4018     AND    display = 'Y';
4019 
4020     IF PG_DEBUG in ('Y', 'C') THEN
4021        arp_util.debug('validate_unapp_open_receipt-Receipt amount: '||l_cr_amount);
4022        arp_util.debug('validate_unapp_open_receipt-Applied amount: '||l_amount_applied);
4023     END IF;
4024 
4025     IF (l_cr_amount - l_amount_applied - p_amount_applied) < 0 THEN
4026        FND_MESSAGE.set_name('AR','AR_RW_NET_UNAPP_OVERAPP');
4027        FND_MSG_PUB.Add;
4028        p_return_status := FND_API.G_RET_STS_ERROR;
4029     END IF;
4030 
4031   IF PG_DEBUG in ('Y', 'C') THEN
4032      arp_util.debug('ar_receipt_val_pvt.validate_unapp_open_receipt()-');
4033   END IF;
4034 
4035 EXCEPTION
4036      WHEN others THEN
4037           FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
4038           FND_MESSAGE.SET_TOKEN('GENERIC_TEXT',SQLERRM);
4039           FND_MSG_PUB.Add;
4040           p_return_status := FND_API.G_RET_STS_ERROR ;
4041      IF PG_DEBUG in ('Y', 'C') THEN
4042         arp_util.debug('EXCEPTION :ar_receipt_val_pvt.validate_unapp_open_receipt '||SQLERRM);
4043      END IF;
4044 
4045 END validate_unapp_open_receipt;
4046 
4047 PROCEDURE validate_llca_insert_ad(
4048          p_cash_receipt_id       IN	NUMBER
4049         ,p_customer_trx_id       IN	NUMBER
4050         ,p_customer_trx_line_id  IN	NUMBER
4051         ,p_cr_unapp_amount       IN	NUMBER
4052         ,p_llca_type             IN	VARCHAR2
4053         ,p_group_id              IN	VARCHAR2
4054         ,p_line_amount           IN	NUMBER
4055         ,p_tax_amount            IN	NUMBER
4056         ,p_freight_amount        IN	NUMBER
4057         ,p_charges_amount        IN	NUMBER
4058         ,p_line_discount         IN	NUMBER
4059         ,p_tax_discount          IN	NUMBER
4060         ,p_freight_discount      IN	NUMBER
4061         ,p_amount_applied        IN     NUMBER
4062         ,p_amount_applied_from   IN	NUMBER
4063         ,p_trans_to_receipt_rate IN	NUMBER
4064         ,p_invoice_currency_code IN	VARCHAR2
4065         ,p_receipt_currency_code IN	VARCHAR2
4066         ,p_earned_discount       IN	NUMBER
4067         ,p_unearned_discount     IN	NUMBER
4068         ,p_max_discount          IN	NUMBER
4069         ,p_line_items_original	 IN	NUMBER
4070 	,p_line_items_remaining	 IN	NUMBER
4071 	,p_tax_original		 IN	NUMBER
4072 	,p_tax_remaining	 IN	NUMBER
4073 	,p_freight_original	 IN	NUMBER
4074 	,p_freight_remaining	 IN	NUMBER
4075 	,p_rec_charges_charged	 IN	NUMBER
4076 	,p_rec_charges_remaining IN	NUMBER
4077         ,p_attribute_category    IN	VARCHAR2
4078         ,p_attribute1            IN	VARCHAR2
4079         ,p_attribute2            IN	VARCHAR2
4080         ,p_attribute3            IN	VARCHAR2
4081         ,p_attribute4            IN	VARCHAR2
4082         ,p_attribute5            IN	VARCHAR2
4083         ,p_attribute6            IN	VARCHAR2
4084         ,p_attribute7            IN	VARCHAR2
4085         ,p_attribute8            IN	VARCHAR2
4086         ,p_attribute9            IN	VARCHAR2
4087         ,p_attribute10           IN	VARCHAR2
4088         ,p_attribute11           IN	VARCHAR2
4089         ,p_attribute12           IN	VARCHAR2
4090         ,p_attribute13           IN	VARCHAR2
4091         ,p_attribute14           IN	VARCHAR2
4092         ,p_attribute15           IN	VARCHAR2
4093         ,p_comments              IN	VARCHAR2
4094         ,p_return_status         OUT NOCOPY VARCHAR2
4095         ,p_msg_count             OUT NOCOPY NUMBER
4096         ,p_msg_data              OUT NOCOPY VARCHAR2
4097         ) IS
4098 
4099 cursor all_lines_in_grp (p_cust_trx_id in number,
4100 			 p_grp_id in number) is
4101 select to_char(line.line_number) apply_to,
4102        line.customer_trx_line_id LINE_ID,
4103        nvl(line.source_data_key4,0) GROUP_ID ,
4104        nvl(line.amount_due_remaining,0) line_to_apply,
4105        nvl(tax.amount_due_remaining,0) tax_to_apply
4106 from ra_customer_trx_lines line,
4107      (select link_to_cust_trx_line_id,
4108              line_type,
4109              sum(nvl(amount_due_original,0)) amount_due_original,
4110              sum(nvl(amount_due_remaining,0)) amount_due_remaining
4111        from ra_customer_trx_lines
4112        where customer_trx_id =  p_cust_trx_id  -- Bug 7241703 Added condition
4113           and nvl(line_type,'TAX') =  'TAX'
4114        group by link_to_cust_trx_line_id,line_type
4115       ) tax
4116 where line.customer_Trx_id = p_cust_trx_id
4117 and line.line_type = 'LINE'
4118 and line.customer_trx_line_id = tax.link_to_cust_trx_line_id (+)
4119 and line.source_data_key4 = p_grp_id;
4120 
4121 cursor all_lines_cur (p_cust_trx_id in number) is
4122 select  to_char(line.line_number) apply_to,
4123         line.customer_trx_line_id line_id,
4124         nvl(line.source_data_key4,0) group_id ,
4125         nvl(line.amount_due_remaining,0) line_to_apply,
4126         nvl(tax.amount_due_remaining,0)  tax_to_apply
4127 from ra_customer_trx_lines line,
4128      (select link_to_cust_trx_line_id,
4129              line_type,
4130              sum(nvl(amount_due_original,0)) amount_due_original,
4131              sum(nvl(amount_due_remaining,0)) amount_due_remaining
4132       from ra_customer_trx_lines
4133       where customer_trx_id =  p_cust_trx_id  -- Bug 7241703 Added condition
4134         and nvl(line_type,'TAX') =  'TAX'
4135       group by link_to_cust_trx_line_id,line_type
4136       ) tax
4137 where line.customer_Trx_id = p_cust_trx_id
4138 and line.line_type = 'LINE'
4139 and   line.customer_trx_line_id = tax.link_to_cust_trx_line_id (+)
4140 order by line_number;
4141 
4142 cursor gt_lines_cur (p_cust_trx_id in number) is
4143 select * from ar_llca_trx_lines_gt
4144 where customer_trx_id = p_cust_trx_id;
4145 
4146 ll_msg_data		varchar2(2000);
4147 ll_return_status	varchar2(1);
4148 ll_msg_count		number;
4149 l_gt_count		NUMBER :=0;
4150 
4151 l_ctl_id		number;
4152 llca_ra_rec		ar_receivable_applications%rowtype;
4153 
4154 -- LLCA - LINE LEVEL
4155 l_rowid			rowid;
4156 l_group_id		ra_customer_trx_lines.source_data_key4%type;
4157 l_line_amount_remaining	NUMBER;
4158 l_line_tax_remaining	NUMBER;
4159 l_line_number		NUMBER;
4160 l_calc_tot_amount_app   NUMBER;
4161 l_calc_amount_app_from  NUMBER; -- Amount in Receipt Currency
4162 l_calc_line_per		NUMBER;
4163 l_calc_line_amount	NUMBER;
4164 l_calc_tax_amount	NUMBER;
4165 l_calc_freight_amount	NUMBER;
4166 l_cr_unapp_bal		NUMBER;
4167 l_dflex_val_return_status VARCHAR2(1); --bug7311231
4168 l_attribute_rec         ar_receipt_api_pub.attribute_rec_type; --bug7311231
4169 BEGIN
4170   IF PG_DEBUG in ('Y', 'C') THEN
4171       arp_util.debug('ar_receipt_val_pvt.validate_llac_insert_ad()+');
4172   END IF;
4173 
4174   p_return_status := FND_API.G_RET_STS_SUCCESS;
4175 
4176   IF PG_DEBUG in ('Y', 'C') THEN
4177       arp_util.debug('Initialization the GT tables ...');
4178       arp_util.debug('DONE In the default initialization the GT tables ...');
4179   END IF;
4180 /*
4181   -- Initialize the Sys Parameters /INV PS /REC PS / Copy Trx lines into GT
4182   arp_process_det_pkg.initialization (p_customer_trx_id,
4183  	                              p_cash_receipt_id,
4184 	 	  	 	      p_return_status,
4185 				      p_msg_data,
4186 				      p_msg_count);  */
4187    IF PG_DEBUG in ('Y', 'C') THEN
4188       arp_util.debug('Initialization Return_status = '||p_return_status);
4189    END IF;
4190 
4191    -- LLCA Summary
4192    IF p_llca_type = 'S'
4193    THEN
4194 
4195      IF PG_DEBUG in ('Y', 'C') THEN
4196       arp_util.debug('Summary Level application... ');
4197       arp_util.debug('p_line_amount      ... '||p_line_amount);
4198       arp_util.debug('p_tax_amount       ... '||p_tax_amount);
4199       arp_util.debug('p_freight_amount   ... '||p_freight_amount);
4200       arp_util.debug('p_charges_amount   ... '||p_charges_amount);
4201       arp_util.debug('p_line_discount    ... '||p_line_discount);
4202       arp_util.debug('p_tax_discount     ... '||p_tax_discount);
4203       arp_util.debug('p_freight_discount ... '||p_freight_discount);
4204       arp_util.debug('Trans_to_receipt_rate='||p_trans_to_receipt_rate);
4205       arp_util.debug('Invoice Currency Code='||p_invoice_currency_code);
4206       arp_util.debug('Receipt Currency Code='||p_receipt_currency_code);
4207       arp_util.debug('............................ ');
4208      END IF;
4209 
4210 --bug7311231.
4211      ar_ll_rcv_summary_pkg.insert_row(
4212 		          x_cash_receipt_id     => p_cash_receipt_id,
4213 		          x_customer_trx_id     => p_customer_trx_id,
4214 			  x_lin                 => p_line_amount,
4215 		          x_tax                 => p_tax_amount,
4216 			  x_frt                 => p_freight_amount,
4217 		          x_chg                 => p_charges_amount,
4218 		          x_lin_dsc             => p_line_discount,
4219 			  x_tax_dsc             => p_tax_discount,
4220 		          x_frt_dsc             => p_freight_discount,
4221 			  x_created_by_module   => 'RAPI'
4222 		         ,x_inv_curr_code       => p_invoice_currency_code
4223 			 ,x_inv_to_rct_rate     => p_trans_to_receipt_rate
4224 		         ,x_rct_curr_code       => p_receipt_currency_code
4225 			 ,x_attribute_category  => p_attribute_category
4226 			 ,x_attribute1          => p_attribute1
4227 			 ,x_attribute2          => p_attribute2
4228 			 ,x_attribute3          => p_attribute3
4229 			 ,x_attribute4          => p_attribute4
4230 			 ,x_attribute5          => p_attribute5
4231 			 ,x_attribute6          => p_attribute6
4232 			 ,x_attribute7          => p_attribute7
4233 			 ,x_attribute8          => p_attribute8
4234 			 ,x_attribute9          => p_attribute9
4235 			 ,x_attribute10         => p_attribute10
4236 			 ,x_attribute11         => p_attribute11
4237 			 ,x_attribute12         => p_attribute12
4238 			 ,x_attribute13         => p_attribute13
4239 			 ,x_attribute14         => p_attribute14
4240 			 ,x_attribute15         => p_attribute15
4241 		        );
4242    -- Group Level
4243    ELSIF p_llca_type = 'G'
4244    THEN
4245 
4246       IF PG_DEBUG in ('Y', 'C') THEN
4247         arp_util.debug('Group Level application... ');
4248       END IF;
4249 
4250       If p_group_id is NOT NULL
4251       THEN
4252        -- Customer Select Specify Group
4253        l_cr_unapp_bal		:= Nvl(p_cr_unapp_amount,0);
4254 
4255         For line_grp in All_lines_in_grp (p_customer_trx_id,p_group_id)
4256         LOOP
4257 	 l_calc_tot_amount_app := Nvl(line_grp.line_to_apply,0)
4258 					+ Nvl(line_grp.tax_to_apply,0);
4259 
4260   	 If Nvl(l_cr_unapp_bal,0) = 0
4261 	 Then
4262 	    l_calc_tot_amount_app := 0;
4263 	    l_calc_line_amount	:= 0;
4264 	    l_calc_tax_amount	:= 0;
4265 	 Else
4266  	     If Nvl(l_calc_tot_amount_app,0) > Nvl(l_cr_unapp_bal,0) Then
4267 	        -- Unapplied balance is non zero and > than amount applied, so default the
4268 		-- Unapplied balance to total amount applied and calculate the line amount as
4269 		-- amount_applied * (line_bal/(line_bal+tax_bal)) and tax_amount =
4270 		-- amount_applied - line_amount
4271 
4272 		l_calc_tot_amount_app :=  arp_util.CurrRound(l_cr_unapp_bal
4273 					   ,p_invoice_currency_code);
4274 
4275 		Select decode ( ( Nvl(line_grp.line_to_apply,0)
4276 					 / (Nvl(line_grp.line_to_apply,0)
4277 					  + Nvl(line_grp.tax_to_apply,0)
4278 				           )
4279 				 ),0,1,
4280 				 ( Nvl(line_grp.line_to_apply,0)
4281 					 / (Nvl(line_grp.line_to_apply,0)
4282 					  + Nvl(line_grp.tax_to_apply,0)
4283 				           )
4284 				 )
4285 			      )
4286 		into l_calc_line_per
4287 		from dual;
4288 
4289 		l_calc_line_amount    :=  arp_util.CurrRound((l_calc_tot_amount_app
4290 					  * l_calc_line_per),p_invoice_currency_code);
4291  	        l_calc_tax_amount     :=  arp_util.CurrRound((Nvl(l_calc_tot_amount_app,0)
4292 		 			  - Nvl(l_calc_line_amount,0))
4293 					  ,p_invoice_currency_code);
4294  	     Else
4295 		l_calc_line_amount   := Nvl(line_grp.line_to_apply,0);
4296 		l_calc_tax_amount    := Nvl(line_grp.tax_to_apply,0);
4297 	     End If;
4298 
4299  	    -- Reset the balance
4300              l_cr_unapp_bal       := Nvl(l_cr_unapp_bal,0) - (Nvl(l_calc_line_amount,0)
4301 						+ Nvl(l_calc_tax_amount,0));
4302          End If;
4303 
4304 	 ar_activity_details_pkg.insert_row (
4305                       x_rowid                     => l_rowid,
4306                       x_cash_receipt_id           => p_cash_receipt_id,
4307                       x_customer_trx_line_id      => line_grp.line_id,
4308                       x_allocated_receipt_amount  => Nvl(l_calc_tot_amount_app,0),
4309                       x_amount                    => Nvl(l_calc_line_amount,0),
4310                       x_tax                       => Nvl(l_calc_tax_amount,0),
4311                       x_line_discount             => '',
4312                       x_tax_discount              => '',
4313                       x_line_balance              => line_grp.line_to_apply,
4314                       x_tax_balance               => Nvl(line_grp.tax_to_apply,0),
4315                       x_apply_to                  => line_grp.apply_to,
4316 	              x_attribute_category        => p_attribute_category,
4317 	              x_attribute1                => p_attribute1,
4318     		      x_attribute2                => p_attribute2,
4319 		      x_attribute3                => p_attribute3,
4320 	              x_attribute4                => p_attribute4,
4321 	              x_attribute5                => p_attribute5,
4322 	              x_attribute6                => p_attribute6,
4323 	              x_attribute7                => p_attribute7,
4324 	              x_attribute8                => p_attribute8,
4325 	              x_attribute9                => p_attribute9,
4326 	              x_attribute10               => p_attribute10,
4327 	              x_attribute11               => p_attribute11,
4328 	              x_attribute12               => p_attribute12,
4329 	              x_attribute13               => p_attribute13,
4330 	              x_attribute14               => p_attribute14,
4331 	              x_attribute15               => p_attribute15,
4332 	              x_comments                  => p_comments,
4333 		      x_group_id                  => line_grp.group_id,
4334                       x_object_version_number     => 1,
4335                       x_created_by_module         => 'RAPI',
4336                       x_reference1                => '',
4337 	              x_reference2                => '',
4338        	              x_reference3                => '',
4339 	              x_reference4                => '',
4340 	              x_reference5                => ''
4341 			);
4342  	  End Loop;
4343        End If;
4344    -- Line Level
4345    ELSIF p_llca_type = 'L'
4346    THEN
4347       IF PG_DEBUG in ('Y', 'C') THEN
4348         arp_util.debug('Line Level application... ');
4349       END IF;
4350 
4351 	select count(*)
4352 	into l_gt_count
4353 	from ar_llca_trx_lines_gt
4354 	where customer_trx_id = p_customer_trx_id
4355 	and rownum = 1;
4356 
4357      -- All Lines
4358      IF  nvl(l_gt_count,0) = 0
4359      THEN
4360       IF PG_DEBUG in ('Y', 'C') THEN
4361         arp_util.debug('All Lines... ');
4362       END IF;
4363        -- Customer Select All lines
4364        l_cr_unapp_bal		:= Nvl(p_cr_unapp_amount,0);
4365 
4366        For All_lines_row in All_lines_cur (p_customer_trx_id)
4367        LOOP
4368 
4369 	 l_calc_tot_amount_app := Nvl(All_lines_row.line_to_apply,0)
4370 					+ Nvl(All_lines_row.tax_to_apply,0);
4371         /* Bug 5438627  : Amount in Receipt Currency */
4372          If p_trans_to_receipt_rate <> 0 then
4373              l_calc_amount_app_from := arp_util.CurrRound((Nvl(l_calc_tot_amount_app,0) *
4374                                       nvl(p_trans_to_receipt_rate,0)), p_receipt_currency_code);
4375          Else
4376              l_calc_amount_app_from := Nvl(l_calc_tot_amount_app,0);
4377          End If;
4378 
4379   	 If Nvl(l_cr_unapp_bal,0) = 0
4380 	 Then
4381 	    l_calc_tot_amount_app  := 0;
4382             l_calc_amount_app_from := 0;
4383 	    l_calc_line_amount	   := 0;
4384 	    l_calc_tax_amount	   := 0;
4385 	 Else
4386              IF PG_DEBUG in ('Y', 'C') THEN
4387                 arp_util.debug('Customer_trx_line_id   => '||to_char(All_lines_row.line_id));
4388                 arp_util.debug('l_calc_tot_amount_app -> '||to_char(l_calc_tot_amount_app));
4389                 arp_util.debug('l_calc_amount_app_from-> '||to_char(l_calc_amount_app_from));
4390                 arp_util.debug('l_cr_unapp_bal        -> '||to_char(l_cr_unapp_bal));
4391              END IF;
4392  	     If Nvl(l_calc_amount_app_from,0) > Nvl(l_cr_unapp_bal,0) Then
4393 	        -- Unapplied balance is non zero and > than amount applied, so default the
4394 		-- Unapplied balance to total amount applied and calculate the line amount as
4395 		-- amount_applied * (line_bal/(line_bal+tax_bal)) and tax_amount =
4396 		-- amount_applied - line_amount
4397 
4398                 IF PG_DEBUG in ('Y', 'C') THEN
4399                    arp_util.debug('l_calc_amount_app_from > l_cr_unapp_bal' );
4400                    arp_util.debug('Resetting... amount applied and buckets');
4401                 END IF;
4402 
4403 		l_calc_amount_app_from :=  Nvl(l_cr_unapp_bal,0);
4404 
4405                 If p_trans_to_receipt_rate <> 0 then
4406                    l_calc_tot_amount_app :=  arp_util.CurrRound((l_cr_unapp_bal/p_trans_to_receipt_rate)
4407                                            ,p_invoice_currency_code);
4408                 Else
4409                    l_calc_tot_amount_app := arp_util.CurrRound(l_cr_unapp_bal
4410                                            ,p_invoice_currency_code);
4411                 End If;
4412 
4413 
4414 		Select decode ( ( Nvl(All_lines_row.line_to_apply,0)
4415 					 / (Nvl(All_lines_row.line_to_apply,0)
4416 					  + Nvl(All_lines_row.tax_to_apply,0)
4417 				           )
4418 				 ),0,1,
4419 				 ( Nvl(All_lines_row.line_to_apply,0)
4420 					 / (Nvl(All_lines_row.line_to_apply,0)
4421 					  + Nvl(All_lines_row.tax_to_apply,0)
4422 				           )
4423 				 )
4424 			      )
4425 		into l_calc_line_per
4426 		from dual;
4427 
4428 		l_calc_line_amount    :=  arp_util.CurrRound((l_calc_tot_amount_app
4429 					  * l_calc_line_per),p_invoice_currency_code);
4430  	        l_calc_tax_amount     :=  arp_util.CurrRound((Nvl(l_calc_tot_amount_app,0)
4431 		 			  - Nvl(l_calc_line_amount,0))
4432 					  ,p_invoice_currency_code);
4433  	     Else
4434 		l_calc_line_amount   := Nvl(All_lines_row.line_to_apply,0);
4435 		l_calc_tax_amount    := Nvl(All_lines_row.tax_to_apply,0);
4436 	     End If;
4437 
4438  	    -- Reset the balance
4439              l_cr_unapp_bal       := Nvl(l_cr_unapp_bal,0) - Nvl(l_calc_amount_app_from,0);
4440 
4441              IF PG_DEBUG in ('Y', 'C') THEN
4442                 arp_util.debug('l_calc_line_amount   -> '||to_char(l_calc_line_amount));
4443                 arp_util.debug('l_calc_tax_amount    -> '||to_char(l_calc_tax_amount));
4444                 arp_util.debug('l_cr_unapp_bal (R)    => '||to_char(l_cr_unapp_bal));
4445              END IF;
4446          End If;
4447 
4448 	 ar_activity_details_pkg.insert_row (
4449                       x_rowid                     => l_rowid,
4450                       x_cash_receipt_id           => p_cash_receipt_id,
4451                       x_customer_trx_line_id      => All_lines_row.line_id,
4452                       x_allocated_receipt_amount  => Nvl(l_calc_amount_app_from,0),
4453                       x_amount                    => Nvl(l_calc_line_amount,0),
4454                       x_tax                       => Nvl(l_calc_tax_amount,0),
4455                       x_line_discount             => '',
4456                       x_tax_discount              => '',
4457                       x_line_balance              => All_lines_row.line_to_apply,
4458                       x_tax_balance               => Nvl(All_lines_row.tax_to_apply,0),
4459                       x_apply_to                  => All_lines_row.apply_to,
4460 	              x_attribute_category        => p_attribute_category,
4461 	              x_attribute1                => p_attribute1,
4462     		      x_attribute2                => p_attribute2,
4463 		      x_attribute3                => p_attribute3,
4464 	              x_attribute4                => p_attribute4,
4465 	              x_attribute5                => p_attribute5,
4466 	              x_attribute6                => p_attribute6,
4467 	              x_attribute7                => p_attribute7,
4468 	              x_attribute8                => p_attribute8,
4469 	              x_attribute9                => p_attribute9,
4470 	              x_attribute10               => p_attribute10,
4471 	              x_attribute11               => p_attribute11,
4472 	              x_attribute12               => p_attribute12,
4473 	              x_attribute13               => p_attribute13,
4474 	              x_attribute14               => p_attribute14,
4475 	              x_attribute15               => p_attribute15,
4476 	              x_comments                  => p_comments,
4477 		      x_group_id                  => All_lines_row.group_id,
4478                       x_object_version_number     => 1,
4479                       x_created_by_module         => 'RAPI',
4480                       x_reference1                => '',
4481 	              x_reference2                => '',
4482        	              x_reference3                => '',
4483 	              x_reference4                => '',
4484 	              x_reference5                => ''
4485 			);
4486  	  End Loop;
4487       -- SPECIFIED LINES
4488       ELSIF  Nvl(l_gt_count,0) > 0
4489       THEN
4490 	---
4491        IF PG_DEBUG in ('Y', 'C') THEN
4492            arp_util.debug('Specified one or more lines in PLSQL table... ');
4493        END IF;
4494 
4495        -- Calculate the line level amounts
4496        l_cr_unapp_bal		 := Nvl(p_cr_unapp_amount,0);
4497 
4498 --bug7311231, start
4499        IF PG_DEBUG in ('Y', 'C') THEN
4500           arp_util.debug('Validating Value passed for Descriptive Flexfield at line level.');
4501        END IF;
4502        For sp_lines_row in gt_lines_cur(p_customer_trx_id)
4503        LOOP
4504           l_attribute_rec.attribute_category := sp_lines_row.attribute_category;
4505 	  l_attribute_rec.attribute1 := sp_lines_row.attribute1;
4506 	  l_attribute_rec.attribute2 := sp_lines_row.attribute2;
4507 	  l_attribute_rec.attribute3 := sp_lines_row.attribute3;
4508 	  l_attribute_rec.attribute4 := sp_lines_row.attribute4;
4509 	  l_attribute_rec.attribute5 := sp_lines_row.attribute5;
4510 	  l_attribute_rec.attribute6 := sp_lines_row.attribute6;
4511 	  l_attribute_rec.attribute7 := sp_lines_row.attribute7;
4512 	  l_attribute_rec.attribute8 := sp_lines_row.attribute8;
4513 	  l_attribute_rec.attribute9 := sp_lines_row.attribute9;
4514 	  l_attribute_rec.attribute10 := sp_lines_row.attribute10;
4515 	  l_attribute_rec.attribute11 := sp_lines_row.attribute11;
4516 	  l_attribute_rec.attribute12 := sp_lines_row.attribute12;
4517 	  l_attribute_rec.attribute13 := sp_lines_row.attribute13;
4518 	  l_attribute_rec.attribute14 := sp_lines_row.attribute14;
4519 	  l_attribute_rec.attribute15 := sp_lines_row.attribute15;
4520 
4521           ar_receipt_lib_pvt.Validate_Desc_Flexfield(
4522                                  l_attribute_rec,
4523                                  'AR_ACTIVITY_DETAILS',
4524                                   l_dflex_val_return_status
4525                                           );
4526 
4527 	  If l_dflex_val_return_status <> FND_API.G_RET_STS_SUCCESS Then
4528 	    p_return_status := 'X';
4529 	    ar_receipt_lib_pvt.populate_errors_gt(
4530 	        p_customer_trx_id => p_customer_trx_id,
4531 		p_customer_trx_line_id => sp_lines_row.customer_trx_line_id,
4532 		p_error_message =>
4533 		               'Flexfield Validation at Line Level Failed.',
4534 		p_invalid_value => NULL);
4535 	  End If;
4536        End Loop;
4537 
4538        If p_return_status = 'X' Then
4539           IF PG_DEBUG in ('Y', 'C') THEN
4540              arp_util.debug('Failed: Validation of Descriptive Flexfield at line level.');
4541           END IF;
4542           return;
4543        End If;
4544 --bug7311231, End.
4545 
4546        For sp_lines_row in gt_lines_cur(p_customer_trx_id)
4547        LOOP
4548 	BEGIN
4549 	select  nvl(line.source_data_key4,0) group_id,
4550 		nvl(line.amount_due_remaining,0),
4551 	        nvl(tax.amount_due_remaining,0)
4552 	into
4553 		l_group_id,
4554 		l_line_amount_remaining,
4555 		l_line_tax_remaining
4556 	from ra_customer_trx_lines line,
4557 	     (select link_to_cust_trx_line_id,
4558 		     line_type,
4559 	             sum(nvl(amount_due_original,0)) amount_due_original,
4560 		     sum(nvl(amount_due_remaining,0)) amount_due_remaining
4561 	      from ra_customer_trx_lines
4562 	      where customer_trx_id =  sp_lines_row.customer_trx_id  -- Bug 7241703 Added condition
4563 	      and nvl(line_type,'TAX') =  'TAX'
4564 	      group by link_to_cust_trx_line_id,line_type
4565 	      ) tax
4566 	where line.customer_Trx_id = sp_lines_row.customer_trx_id
4567 	and   line.customer_trx_line_id = sp_lines_row.customer_trx_line_id
4568 	and line.line_type = 'LINE'
4569 	and line.customer_trx_line_id = tax.link_to_cust_trx_line_id (+);
4570 	EXCEPTION
4571 	  WHEN NO_DATA_FOUND THEN
4572 	       p_return_status := FND_API.G_RET_STS_ERROR ;
4573 	      FND_MESSAGE.SET_NAME( 'AR','AR_RAPI_TRX_LINE_ID_INVALID');
4574 	      FND_MSG_PUB.ADD;
4575 	      RAISE;
4576 	  WHEN others THEN
4577 	    IF PG_DEBUG in ('Y', 'C') THEN
4578 	       arp_util.debug('' || 'EXCEPTION: validate_llac_insert_ad()');
4579 	    END IF;
4580 	    RAISE;
4581         END;
4582 
4583             /* Bug 5438627  : Amount in Receipt Currency */
4584             If p_trans_to_receipt_rate <> 0 then
4585                   l_calc_amount_app_from := arp_util.CurrRound((Nvl(sp_lines_row.amount_applied,0) *
4586                                       nvl(p_trans_to_receipt_rate,0)), p_receipt_currency_code);
4587             Else
4588                   l_calc_amount_app_from := Nvl(sp_lines_row.amount_applied,0);
4589             End If;
4590 
4591             IF PG_DEBUG in ('Y', 'C') THEN
4592                 arp_util.debug('Amount_applied        -> '||to_char(sp_lines_row.amount_applied));
4593                 arp_util.debug('l_calc_amount_app_from-> '||to_char(l_calc_amount_app_from));
4594                 arp_util.debug('l_cr_unapp_bal        -> '||to_char(l_cr_unapp_bal));
4595             END IF;
4596 
4597 	    -- Check the Unapplied balance
4598             /* Acctd amount will be validated via validate_amount_applied_from, so
4599                 the below validation is not required.
4600 	    If Nvl(l_calc_amount_app_from,0) > Nvl(l_cr_unapp_bal,0)
4601 	    Then
4602                 IF PG_DEBUG in ('Y', 'C') THEN
4603                    arp_util.debug('l_calc_amount_app_from > l_cr_unapp_bal' );
4604                    arp_util.debug('Raise an error... amount applied and buckets');
4605                 END IF;
4606                 p_return_status := FND_API.G_RET_STS_ERROR;
4607                 fnd_message.set_name ('AR','AR_RW_APP_NEG_UNAPP');
4608                 fnd_msg_pub.Add;
4609 	    End If;  */
4610 
4611  	    -- Reset the balance
4612             l_cr_unapp_bal       := Nvl(l_cr_unapp_bal,0) - Nvl(l_calc_amount_app_from,0);
4613 
4614             IF PG_DEBUG in ('Y', 'C') THEN
4615                 arp_util.debug('l_calc_line_amount   -> '||to_char(l_calc_line_amount));
4616                 arp_util.debug('l_calc_tax_amount    -> '||to_char(l_calc_tax_amount));
4617                 arp_util.debug('l_cr_unapp_bal (R)    => '||to_char(l_cr_unapp_bal));
4618             END IF;
4619  ---	End If;
4620 --bug7311231, Picking the flexfield value from ar_llca_trx_lines_gt, for each line.
4621 	ar_activity_details_pkg.insert_row(
4622 	          x_rowid                     => l_rowid,
4623 	          x_cash_receipt_id           => p_cash_receipt_id,
4624 		  x_customer_trx_line_id      => sp_lines_row.customer_trx_line_id,
4625                   x_allocated_receipt_amount  => Nvl(l_calc_amount_app_from,0),
4626                   x_amount                    => Nvl(sp_lines_row.line_amount,0),
4627                   x_tax                       => Nvl(sp_lines_row.tax_amount,0),
4628 	          x_line_discount             => Nvl(sp_lines_row.line_discount,0),
4629 	          x_tax_discount              => Nvl(sp_lines_row.tax_discount,0),
4630 	          x_line_balance              => l_line_amount_remaining,
4631 	          x_tax_balance               => l_line_tax_remaining,
4632 	          x_apply_to                  => sp_lines_row.line_number,
4633 	          x_attribute_category        => sp_lines_row.attribute_category,
4634 	          x_attribute1                => sp_lines_row.attribute1,
4635     		  x_attribute2                => sp_lines_row.attribute2,
4636 		  x_attribute3                => sp_lines_row.attribute3,
4637 	          x_attribute4                => sp_lines_row.attribute4,
4638 	          x_attribute5                => sp_lines_row.attribute5,
4639 	          x_attribute6                => sp_lines_row.attribute6,
4640 	          x_attribute7                => sp_lines_row.attribute7,
4641 	          x_attribute8                => sp_lines_row.attribute8,
4642 	          x_attribute9                => sp_lines_row.attribute9,
4643 	          x_attribute10               => sp_lines_row.attribute10,
4644 	          x_attribute11               => sp_lines_row.attribute11,
4645 	          x_attribute12               => sp_lines_row.attribute12,
4646 	          x_attribute13               => sp_lines_row.attribute13,
4647 	          x_attribute14               => sp_lines_row.attribute14,
4648 	          x_attribute15               => sp_lines_row.attribute15,
4649 	          x_comments                  => p_comments,
4650 	          x_group_id                  => l_group_id,
4651 	          x_object_version_number     => 1,
4652 	          x_created_by_module         => 'RAPI',
4653 	          x_reference1                => '',
4654 	          x_reference2                => '',
4655 	          x_reference3                => '',
4656 	          x_reference4                => '',
4657 	          x_reference5                => ''
4658 	       );
4659 	End Loop;
4660 	End IF;  /* End of l_gt_count  */
4661 
4662   -- Check for freight amount
4663      If  NVL(p_freight_amount,0) <> 0
4664      THEN
4665 	     ar_ll_rcv_summary_pkg.insert_frt_rows(
4666 		    x_cash_receipt_id     => p_cash_receipt_id,
4667 	            x_customer_trx_id     => p_customer_trx_id,
4668 	            x_frt                 => p_freight_amount,
4669 	            x_frt_dsc             => p_freight_discount,
4670 	            x_created_by_module   => 'RAPI'
4671 	            ,x_inv_curr_code      => p_invoice_currency_code
4672 	            ,x_inv_to_rct_rate	  => p_trans_to_receipt_rate
4673 	            ,x_rct_curr_code      => p_receipt_currency_code
4674 	            ,x_comments           => NULL
4675 						);
4676      END If;
4677 
4678   End If; /* End of LLCA TYPE */
4679 
4680   IF PG_DEBUG in ('Y', 'C') THEN
4681       arp_util.debug('ar_receipt_val_pvt.validate_llac_insert_ad()-');
4682   END IF;
4683 EXCEPTION
4684  WHEN others THEN
4685   IF PG_DEBUG in ('Y', 'C') THEN
4686       arp_util.debug('EXCEPTION: ar_receipt_val_pvt.validate_llac_insert_ad()');
4687   END IF;
4688   RAISE;
4689 END validate_llca_insert_ad;
4690 
4691 PROCEDURE validate_llca_insert_app(
4692          p_cash_receipt_id       IN	NUMBER
4693         ,p_customer_trx_id       IN	NUMBER
4694         ,p_disc_earn_allowed     IN	NUMBER
4695         ,p_disc_max_allowed      IN	NUMBER
4696         ,p_return_status         OUT NOCOPY VARCHAR2
4697         ,p_msg_count             OUT NOCOPY NUMBER
4698         ,p_msg_data              OUT NOCOPY VARCHAR2
4699         ) IS
4700 cursor rcv_lines_cur (p_cust_trx_id in number, p_cash_rec_id in number) is
4701      select
4702          trx_lines.line_type,
4703          trx_lines.source_data_key1 sdk1,
4704          trx_lines.source_data_key2 sdk2,
4705          trx_lines.source_data_key3 sdk3,
4706          trx_lines.source_data_key4 sdk4,
4707          trx_lines.source_data_key5 sdk5,
4708          trx_lines.customer_Trx_line_id ctl_id,
4709          --
4710          rcv_lines.amount lin,
4711          rcv_lines.tax tax,
4712          rcv_lines.freight frt,
4713          rcv_lines.charges chg,
4714          --
4715          --
4716          rcv_lines.line_discount lin_disc,
4717          rcv_lines.tax_discount tax_disc,
4718          rcv_lines.freight_discount frt_disc,
4719          0 chg_disc,
4720          --
4721          rcv_lines.allocated_receipt_amount
4722      from ar_activity_details rcv_lines,
4723 	  ra_customer_trx_lines trx_lines
4724      where  trx_lines.customer_trx_id = p_cust_trx_id
4725        and  rcv_lines.cash_receipt_id = p_cash_rec_id
4726        and  nvl(rcv_lines.CURRENT_ACTIVITY_FLAG, 'Y') = 'Y' -- Bug 7241111
4727        and  trx_lines.line_type = 'LINE'
4728        and   rcv_lines.customer_trx_line_id = trx_lines.customer_trx_line_id;
4729 
4730 cursor rcv_frtchg_cur (pf_ct_id in number, pf_cr_id in number) is
4731 select trx_lines.line_type,
4732           sum(Nvl(rcv_lines.amount,0)) lin,
4733           sum(Nvl(rcv_lines.tax,0)) tax,
4734           sum(Nvl(rcv_lines.freight,0)) frt,
4735           sum(Nvl(rcv_lines.charges,0)) chg,
4736           sum(Nvl(rcv_lines.line_discount,0)) lin_disc,
4737           sum(Nvl(rcv_lines.tax_discount,0))  tax_disc,
4738           sum(NVl(rcv_lines.freight_discount,0)) frt_disc,
4739           sum(Nvl(rcv_lines.allocated_receipt_amount,0)) allocated
4740 from ar_Activity_details rcv_lines,
4741      ra_customer_trx_lines_all trx_lines
4742 where trx_lines.customer_trx_id = pf_ct_id
4743   and  rcv_lines.cash_receipt_id = pf_cr_id
4744   and  nvl(rcv_lines.CURRENT_ACTIVITY_FLAG, 'Y') = 'Y' -- Bug 7241111
4745   and  trx_lines.line_type in ('FREIGHT','CHARGES')
4746   and  rcv_lines.customer_trx_line_id = trx_lines.customer_trx_line_id
4747  group by trx_lines.line_type;
4748 
4749 
4750 ll_msg_data		varchar2(2000);
4751 ll_return_status	varchar2(1);
4752 ll_msg_count		number;
4753 l_demon 	        NUMBER;
4754 l_calc_ed_line_disc	NUMBER :=0;
4755 l_calc_ued_line_disc    NUMBER :=0;
4756 l_calc_ed_tax_disc	NUMBER :=0;
4757 l_calc_ued_tax_disc     NUMBER :=0;
4758 l_calc_ed_frt_disc	NUMBER :=0;
4759 l_calc_ued_frt_disc     NUMBER :=0;
4760 lf_calc_ed_frt_disc	NUMBER :=0;
4761 lf_calc_ued_frt_disc    NUMBER :=0;
4762 Begin
4763   IF PG_DEBUG in ('Y', 'C') THEN
4764       arp_util.debug('ar_receipt_val_pvt.validate_llac_insert_app()+');
4765   END IF;
4766   ll_return_status := FND_API.G_RET_STS_SUCCESS;
4767   -- Execute the application and populate the Line wise details into RA GT
4768   For rcv_lines_row in rcv_lines_cur (p_customer_trx_id, p_cash_receipt_id)
4769   LOOP
4770 
4771     l_demon := p_disc_earn_allowed + (p_disc_max_allowed - p_disc_earn_allowed);
4772     If l_demon <> 0
4773     Then
4774      l_calc_ed_line_disc :=  (rcv_lines_row.lin_disc / l_demon) * p_disc_earn_allowed;
4775      l_calc_ued_line_disc :=  rcv_lines_row.lin_disc - l_calc_ed_line_disc;
4776      l_calc_ed_tax_disc  :=  (rcv_lines_row.tax_disc / l_demon) * p_disc_earn_allowed;
4777      l_calc_ued_tax_disc :=  rcv_lines_row.tax_disc - l_calc_ed_tax_disc;
4778      l_calc_ed_frt_disc  :=  (rcv_lines_row.frt_disc / l_demon) * p_disc_earn_allowed;
4779      l_calc_ued_frt_disc :=  rcv_lines_row.frt_disc - l_calc_ed_frt_disc;
4780     End If;
4781 
4782   IF PG_DEBUG in ('Y', 'C') THEN
4783       arp_util.debug('Calling Application Execute for Lines and Tax');
4784       arp_util.debug('Customer Trx Line ID  => '||rcv_lines_row.ctl_id);
4785       arp_util.debug('Line Amount           => '||rcv_lines_row.lin);
4786       arp_util.debug('Tax  Amount           => '||rcv_lines_row.Tax);
4787       arp_util.debug('Freight Amount        => '||rcv_lines_row.frt);
4788       arp_util.debug('Charges Amount        => '||rcv_lines_row.Chg);
4789       arp_util.debug('Line Earned Discount  => '||l_calc_ed_line_disc);
4790       arp_util.debug('Tax  Earned Discount  => '||l_calc_ed_tax_disc);
4791       arp_util.debug('Frt  Earned Discount  => '||l_calc_ed_frt_disc);
4792       arp_util.debug('Line UNearned Discount=> '||l_calc_ued_line_disc);
4793       arp_util.debug('Tax  UNearned Discount=> '||l_calc_ued_tax_disc);
4794       arp_util.debug('Frt  UNearned Discount=> '||l_calc_ued_frt_disc);
4795   END IF;
4796     arp_process_det_pkg.application_execute(
4797 	       p_app_level                      =>'LINE',
4798                p_source_data_key1               =>rcv_lines_row.sdk1,
4799                p_source_data_key2               =>rcv_lines_row.sdk2,
4800                p_source_data_key3               =>rcv_lines_row.sdk3,
4801                p_source_data_key4               =>rcv_lines_row.sdk4,
4802                p_source_data_key5               =>rcv_lines_row.sdk5,
4803                p_ctl_id                         =>rcv_lines_row.ctl_id,
4804                --
4805                p_line_applied                   =>rcv_lines_row.lin,
4806                p_tax_applied                    =>rcv_lines_row.tax,
4807                p_freight_applied                =>rcv_lines_row.frt,
4808                p_charges_applied                =>rcv_lines_row.chg,
4809 	       --
4810                p_line_ediscounted               =>l_calc_ed_line_disc,
4811 	       p_tax_ediscounted                =>l_calc_ed_tax_disc,
4812                p_freight_ediscounted            =>l_calc_ed_frt_disc,
4813                p_charges_ediscounted            =>0,
4814                --
4815                p_line_uediscounted              =>l_calc_ued_line_disc,
4816                p_tax_uediscounted               =>l_calc_ued_tax_disc,
4817                p_freight_uediscounted           =>l_calc_ued_frt_disc,
4818                p_charges_uediscounted           =>0,
4819                --
4820                x_return_status                  =>ll_return_status,
4821                x_msg_count                      =>ll_msg_count,
4822                x_msg_data                       =>ll_msg_data);
4823    End Loop;
4824 
4825    IF PG_DEBUG in ('Y', 'C') THEN
4826       arp_util.debug('ar_receipt_val_pvt.validate_llac_insert_app(Line)+');
4827    END IF;
4828 
4829 IF ll_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4830       ll_return_status := FND_API.G_RET_STS_ERROR;
4831 ELSE
4832    FOR rcv_frtchg_row in rcv_frtchg_cur (p_customer_trx_id, p_cash_receipt_id)
4833    LOOP
4834     l_demon := p_disc_earn_allowed + (p_disc_max_allowed - p_disc_earn_allowed);
4835     If l_demon <> 0
4836     Then
4837      lf_calc_ed_frt_disc  :=  (rcv_frtchg_row.frt_disc / l_demon) * p_disc_earn_allowed;
4838      lf_calc_ued_frt_disc :=  rcv_frtchg_row.frt_disc - lf_calc_ed_frt_disc;
4839     End If;
4840     IF PG_DEBUG in ('Y', 'C') THEN
4841       arp_util.debug('Calling Application Execute for Freight Lines ');
4842       arp_util.debug('Line Amount           => '||rcv_frtchg_row.lin);
4843       arp_util.debug('Tax  Amount           => '||rcv_frtchg_row.Tax);
4844       arp_util.debug('Freight Amount        => '||rcv_frtchg_row.frt);
4845       arp_util.debug('Charges Amount        => '||rcv_frtchg_row.Chg);
4846       arp_util.debug('Frt  Earned Discount  => '||lf_calc_ed_frt_disc);
4847       arp_util.debug('Frt  UNearned Discount=> '||lf_calc_ued_frt_disc);
4848     END IF;
4849              arp_process_det_pkg.application_execute(
4850                p_app_level                      =>'TRANSACTION',
4851                p_source_data_key1               =>NULL,
4852                p_source_data_key2               =>NULL,
4853                p_source_data_key3               =>NULL,
4854                p_source_data_key4               =>NULL,
4855                p_source_data_key5               =>NULL,
4856                p_ctl_id                         =>NULL,   -- Taxable line id
4857                --
4858                p_line_applied                   =>rcv_frtchg_row.lin,
4859                p_tax_applied                    =>rcv_frtchg_row.tax,
4860                p_freight_applied                =>rcv_frtchg_row.frt,
4861                p_charges_applied                =>rcv_frtchg_row.chg,
4862                --
4863                p_line_ediscounted               =>0,
4864 	       p_tax_ediscounted                =>0,
4865                p_freight_ediscounted            =>lf_calc_ed_frt_disc,
4866                p_charges_ediscounted            =>0,
4867                --
4868                p_line_uediscounted              =>0,
4869                p_tax_uediscounted               =>0,
4870                p_freight_uediscounted           =>lf_calc_ued_frt_disc,
4871                p_charges_uediscounted           =>0,
4872                --
4873                x_return_status                  =>ll_return_status,
4874                x_msg_count                      =>ll_msg_count,
4875                x_msg_data                       =>ll_msg_data);
4876     END LOOP;
4877   END IF;
4878   IF PG_DEBUG in ('Y', 'C') THEN
4879       arp_util.debug('ar_receipt_val_pvt.validate_llac_insert_app()-');
4880   END IF;
4881 
4882 EXCEPTION
4883 WHEN others THEN
4884   IF PG_DEBUG in ('Y', 'C') THEN
4885       arp_util.debug('EXCEPTION: ar_receipt_val_pvt.validate_llac_insert_app()');
4886   END IF;
4887   RAISE;
4888 END validate_llca_insert_app;
4889 
4890 END AR_RECEIPT_VAL_PVT;