DBA Data[Home] [Help]

PACKAGE BODY: APPS.AR_CM_VAL_PVT

Source


1 PACKAGE BODY AR_CM_VAL_PVT AS
2 /* $Header: ARXVCMEB.pls 120.0.12000000.1 2007/02/27 12:06:50 mpsingh noship $ */
3 
4 G_MSG_UERROR    CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR;
5 G_MSG_ERROR     CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_ERROR;
6 G_MSG_SUCCESS   CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_SUCCESS;
7 
8 PG_DEBUG varchar2(1) := NVL(FND_PROFILE.value('AFLOG_ENABLED'), 'N');
9 PG_PROFILE_APPLN_GL_DATE_DEF varchar2(30)  := FND_PROFILE.value('AR_APPLICATION_GL_DATE_DEFAULT');
10 
11 -- PRIVATE PROCEDURES/FUNCTIONS
12 
13 PROCEDURE default_customer_trx_id(
14                           p_customer_trx_id IN OUT NOCOPY NUMBER,
15                           p_trx_number  IN VARCHAR,
16                           p_return_status OUT NOCOPY VARCHAR2
17                            ) IS
18 BEGIN
19   IF PG_DEBUG in ('Y', 'C') THEN
20      arp_util.debug('Default_customer_trx_id ()+');
21      arp_util.debug(' Trx Number is '|| p_trx_number);
22   END IF;
23     p_return_status := FND_API.G_RET_STS_SUCCESS;
24    IF p_customer_trx_id IS NULL THEN
25      IF  p_trx_number IS NOT NULL THEN
26        BEGIN
27          SELECT customer_trx_id
28          INTO   p_customer_trx_id
29          FROM   ra_customer_trx
30          WHERE   trx_number = p_trx_number;
31        EXCEPTION
32          WHEN no_data_found THEN
33            FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_NUM_INVALID');
34            FND_MSG_PUB.Add;
35            p_return_status := FND_API.G_RET_STS_ERROR ;
36        END;
37      END IF;
38 
39    ELSE -- p_customer_trx_id IS NOT NULL
40 
41       IF p_trx_number IS NOT NULL
42       THEN
43        --give a warning message to indicate that the trx number
44        --entered by the user has been ignored.
45        IF FND_MSG_PUB.Check_Msg_Level(G_MSG_SUCCESS)
46         THEN
47          FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_NUM_IGN');
48          FND_MSG_PUB.Add;
49        END IF;
50      END IF;
51    END IF;
52  IF PG_DEBUG in ('Y', 'C') THEN
53     arp_util.debug('Default_customer_trx_id ()-');
54  END IF;
55 EXCEPTION
56   WHEN others THEN
57    IF PG_DEBUG in ('Y', 'C') THEN
58       arp_util.debug('EXCEPTION: default_customer_trx_id()', G_MSG_UERROR);
59    END IF;
60 END default_customer_trx_id;
61 
62 PROCEDURE default_customer_trx_line_id(
63                           p_inv_customer_trx_id IN OUT NOCOPY NUMBER,
64                           p_inv_customer_trx_line_id IN OUT NOCOPY NUMBER,
65                           p_inv_line_number  IN NUMBER,
66                           p_return_status OUT NOCOPY VARCHAR2
67                            ) IS
68 BEGIN
69   IF PG_DEBUG in ('Y', 'C') THEN
70      arp_util.debug('Default_customer_trx_line_id ()+');
71   END IF;
72     p_return_status := FND_API.G_RET_STS_SUCCESS;
73 
74    IF p_inv_customer_trx_line_id IS NOT NULL AND
75       p_inv_line_number IS NOT NULL
76         THEN
77         --give a warning message to indicate that the line number
78         --entered by the user has been ignored.
79           IF FND_MSG_PUB.Check_Msg_Level(G_MSG_SUCCESS)
80            THEN
81              FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_LINE_NUM_IGN');
82              FND_MSG_PUB.Add;
83           END IF;
84    END IF;
85 
86    IF p_inv_customer_trx_id IS NOT NULL THEN
87      IF p_inv_customer_trx_line_id IS NULL THEN
88         IF  p_inv_line_number IS NOT NULL THEN
89            BEGIN
90              SELECT customer_trx_line_id
91              INTO   p_inv_customer_trx_line_id
92              FROM   ra_customer_trx_lines
93              WHERE  customer_trx_id = p_inv_customer_trx_id
94                AND   line_number = p_inv_line_number
95                AND   line_type =   'LINE';
96            EXCEPTION
97              WHEN no_data_found THEN
98                 FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_LINE_NO_INVALID');
99                 FND_MSG_PUB.Add;
100                 p_return_status := FND_API.G_RET_STS_ERROR ;
101            END;
102         END IF;
103     END IF;
104    ELSE
105      IF p_inv_customer_trx_line_id IS NOT NULL THEN
106         BEGIN
107              SELECT customer_trx_id
108              INTO   p_inv_customer_trx_id
109              FROM   ra_customer_trx_lines
110              WHERE  customer_trx_line_id = p_inv_customer_trx_line_id
111                AND  line_type =   'LINE';
112         EXCEPTION
113              WHEN no_data_found THEN
114                FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_LINE_ID_INVALID');
115                 FND_MSG_PUB.Add;
116                 p_return_status := FND_API.G_RET_STS_ERROR ;
117         END;
118      END IF;
119    END IF;
120  IF PG_DEBUG in ('Y', 'C') THEN
121     arp_util.debug('Default_customer_trx_line_id ()-');
122  END IF;
123 EXCEPTION
124   WHEN others THEN
125    IF PG_DEBUG in ('Y', 'C') THEN
126       arp_util.debug('EXCEPTION: Default_customer_trx_line_id()', G_MSG_UERROR);
127    END IF;
128 END default_customer_trx_line_id;
129 
130 
131 PROCEDURE default_cm_info(
132           p_cm_customer_trx_id   IN ra_customer_trx.customer_trx_id%TYPE,
133           p_cm_gl_date           OUT NOCOPY DATE,
134           p_cm_amount_rem        OUT NOCOPY ar_payment_schedules.amount_due_remaining%TYPE,
135           p_cm_trx_date          OUT NOCOPY DATE,
136           p_cm_ps_id             OUT NOCOPY ar_payment_schedules.payment_schedule_id%TYPE ,
137           p_cm_currency_code     OUT NOCOPY fnd_currencies.currency_code%TYPE,
138           p_cm_customer_id       OUT NOCOPY ra_customer_trx.paying_customer_id%TYPE,
139           p_return_status         OUT NOCOPY VARCHAR2
140     ) IS
141 
142 BEGIN
143 
144    p_return_status := FND_API.G_RET_STS_SUCCESS;
145 
146    IF PG_DEBUG in ('Y', 'C') THEN
147       arp_util.debug('Default_CM_Info ()+');
148    END IF;
149 
150    IF p_cm_customer_trx_id IS NOT NULL THEN
151       BEGIN
152 
153         SELECT ps.payment_schedule_id,
154                cm.trx_date,
155                ps.gl_date,
156                ps.amount_due_remaining,
157                cm.paying_customer_id,
158                cm.invoice_currency_code
159          INTO  p_cm_ps_id,
160                p_cm_trx_date,
161                p_cm_gl_date,
162                p_cm_amount_rem,
163                p_cm_customer_id,
164                p_cm_currency_code
165          FROM  ra_customer_trx cm,
166                ar_payment_schedules ps
167         WHERE  ps.customer_trx_id = cm.customer_trx_id
168           AND  cm.customer_trx_id = p_cm_customer_trx_id;
169 
170      EXCEPTION
171        WHEN NO_DATA_FOUND THEN
172          FND_MESSAGE.SET_NAME( 'AR','AR_CMAPI_CM_TRX_ID_INVALID');
173          FND_MSG_PUB.ADD;
174          p_return_status := FND_API.G_RET_STS_ERROR;
175       WHEN OTHERS THEN
176         IF PG_DEBUG in ('Y', 'C') THEN
177           arp_util.debug('EXCEPTION: Default_CM_Info()');
178         END IF;
179       END;
180 
181    ELSE
182        FND_MESSAGE.SET_NAME( 'AR','AR_CMAPI_CM_TRX_ID_NULL');
183        FND_MSG_PUB.ADD;
184          p_return_status := FND_API.G_RET_STS_ERROR ;
185    END IF;
186 
187 
188    IF PG_DEBUG in ('Y', 'C') THEN
189       arp_util.debug('Default_CM_Info ()-');
190    END IF;
191 
192 END default_cm_info;
193 
194 
195 
196 PROCEDURE default_trx_info(
197             p_inv_customer_trx_id     IN ra_customer_trx.customer_trx_id%TYPE,
198             p_inv_customer_trx_line_id IN NUMBER,
199             p_show_closed_invoices     IN VARCHAR2,
200             p_cm_gl_date               IN DATE,
201             p_cm_customer_id           IN ra_customer_trx.paying_customer_id%TYPE,
202             p_cm_currency_code         IN fnd_currencies.currency_code%TYPE,
203             p_cm_ps_id                 IN NUMBER,
204             p_cm_trx_date              IN DATE,
205             p_inv_customer_id          OUT NOCOPY NUMBER, --customer on transaction
206             p_inv_cust_trx_type_id     OUT NOCOPY ra_customer_trx.cust_trx_type_id%TYPE ,
207             p_inv_due_date             OUT NOCOPY DATE,
208             p_inv_trx_date             OUT NOCOPY DATE,
209             p_inv_gl_date              OUT NOCOPY DATE,
210             p_allow_overappln_flag     OUT NOCOPY VARCHAR2,
211             p_natural_appln_only_flag  OUT NOCOPY VARCHAR2,
212             p_creation_sign            OUT NOCOPY VARCHAR2,
213             p_applied_payment_schedule_id  IN OUT NOCOPY NUMBER,
214             p_app_gl_date              OUT NOCOPY DATE, --this is the application gl_date
215             p_installment              IN OUT NOCOPY NUMBER,
216             p_inv_amount_rem              OUT NOCOPY NUMBER,
217             p_inv_currency_code           OUT NOCOPY VARCHAR,
218             p_return_status            OUT NOCOPY VARCHAR2
219          )
220 
221 IS
222 
223 l_applied_payment_schedule_id  NUMBER;
224 
225 BEGIN
226 
227   IF PG_DEBUG in ('Y', 'C') THEN
228     arp_util.debug('Default_Trx_Info ()+');
229   END IF;
230   p_return_status := FND_API.G_RET_STS_SUCCESS;
231 
232   IF p_inv_customer_trx_id IS NOT NULL AND
233      p_installment IS NOT NULL THEN
234     IF arp_global.sysparam.pay_unrelated_invoices_flag = 'Y' THEN
235         SELECT
236           ot.customer_id ,
237           ot.cust_trx_type_id ,
238           ot.trx_due_date ,
239           ot.trx_date,
240           ot.trx_gl_date ,
241           ot.allow_overapplication_flag ,
242           ot.natural_application_only_flag ,
243           ot.creation_sign ,
244           ot.payment_schedule_id ,
245           greatest(p_cm_gl_date,ot.trx_gl_date,
246                    decode(pg_profile_appln_gl_date_def,
247                           'INV_REC_SYS_DT', sysdate, 'INV_REC_DT', ot.trx_gl_date,
248                            ot.trx_gl_date)) gl_date,
249           ot.balance_due_functional,
250           ot.invoice_currency_code
251         INTO
252           p_inv_customer_id ,
253           p_inv_cust_trx_type_id ,
254           p_inv_due_date ,
255           p_inv_trx_date,
256           p_inv_gl_date ,
257           p_allow_overappln_flag ,
258           p_natural_appln_only_flag ,
259           p_creation_sign ,
260           l_applied_payment_schedule_id ,
261           p_app_gl_date, --this is the application gl_date
262           p_inv_amount_rem,
263           p_inv_currency_code
264         FROM
265           ar_open_trx_v ot
266         WHERE
267           ot.customer_trx_id =  p_inv_customer_trx_id and
268           ot.invoice_currency_code = p_cm_currency_code and
269           ot.status=decode(p_show_closed_invoices,'Y',ot.status,'OP') and
270           ot.terms_sequence_number = p_installment;
271 
272      ELSE
273      --This is the case where pay_unrelated_invoices_flag is 'N'
274         SELECT
275           ot.customer_id ,
276           ot.cust_trx_type_id ,
277           ot.trx_due_date ,
278           ot.trx_date,
279           ot.trx_gl_date ,
280           ot.allow_overapplication_flag ,
281           ot.natural_application_only_flag ,
282           ot.creation_sign ,
283           ot.payment_schedule_id ,
284           greatest(p_cm_gl_date,ot.trx_gl_date,
285                    decode(pg_profile_appln_gl_date_def,
286                           'INV_REC_SYS_DT', sysdate, 'INV_REC_DT', ot.trx_gl_date,
287                  ot.trx_gl_date)) gl_date,
288           ot.balance_due_functional,
289           ot.invoice_currency_code
290         INTO
291           p_inv_customer_id ,
292           p_inv_cust_trx_type_id ,
293           p_inv_due_date ,
294           p_inv_trx_date,
295           p_inv_gl_date ,
296           p_allow_overappln_flag,
297           p_natural_appln_only_flag,
298           p_creation_sign,
299           l_applied_payment_schedule_id,
300           p_app_gl_date, --this is the defaulted application gl_date
301           p_inv_amount_rem,
302           p_inv_currency_code
303         FROM
304           ar_open_trx_v ot
305         WHERE
306           ot.customer_trx_id =  p_inv_customer_trx_id and
307           ot.invoice_currency_code = p_cm_currency_code and
308           ot.status=decode(p_show_closed_invoices,'Y',ot.status,'OP') and
309           ot.terms_sequence_number = p_installment and
310           ot.customer_id IN (
311           SELECT rcr.related_cust_account_id
312           FROM hz_cust_acct_relate rcr
313           WHERE rcr.status='A' and
314                 rcr.cust_account_id= p_cm_customer_id
315             and rcr.bill_to_flag = 'Y'
316           UNION
317           SELECT p_cm_customer_id
318           FROM dual
319           UNION
323           WHERE rel.party_id = acc.party_id
320           SELECT rel.related_cust_account_id
321           FROM ar_paying_relationships_v rel,
322                hz_cust_accounts acc
324             AND acc.cust_account_id = p_cm_customer_id
325             AND p_cm_trx_date BETWEEN effective_start_date
326                               AND effective_end_date
327           );
328 
329      END IF;
330 
331 
332 
333  --If the defaulted payment_schedule_id does not match the
334  --applied_ps_id entered by the user, then raise error.
335  IF p_applied_payment_schedule_id IS NOT NULL THEN
336    IF l_applied_payment_schedule_id <>
337                              p_applied_payment_schedule_id THEN
338       FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_PS_ID_X_INVALID');
339       FND_MSG_PUB.Add;
340       p_return_status := FND_API.G_RET_STS_ERROR ;
341    END IF;
342  ELSE
343       p_applied_payment_schedule_id := l_applied_payment_schedule_id;
344  END IF;
345 
346 
347 ELSE --case when p_customer_trx_id is null
348   --no further validation done in the validation routines for customer_trx_id
349   FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_NULL');
350   FND_MSG_PUB.Add;
351   p_return_status := FND_API.G_RET_STS_ERROR ;
352 
353 END IF;
354 
355 IF PG_DEBUG in ('Y', 'C') THEN
356      arp_util.debug('Default_Trx_Info: ' || 'p_applied_payment_schedule_id : '||to_char(p_applied_payment_schedule_id));
357      arp_util.debug('Default_Trx_Info: ' || 'p_allow_overappln_flag         : '||p_allow_overappln_flag);
358      arp_util.debug('Default_Trx_Info: ' || 'p_natural_appln_only_flag      : '||p_natural_appln_only_flag);
359      arp_util.debug('Default_Trx_Info: ' || 'p_creation_sign                : '||p_creation_sign);
360    arp_util.debug('Default_Trx_Info ()-');
361 END IF;
362 EXCEPTION
363   WHEN no_data_found THEN
364     IF PG_DEBUG in ('Y', 'C') THEN
365        arp_util.debug('Default_Trx_Info : No data found ');
366     END IF;
367   WHEN others THEN
368     IF PG_DEBUG in ('Y', 'C') THEN
369        arp_util.debug('EXCEPTION: Default_Trx_Info()');
370     END IF;
371     raise;
372 
373 END default_trx_info;
374 
375 PROCEDURE default_amt_applied(
376                  p_inv_currency_code IN fnd_currencies.currency_code%TYPE,
377                  p_cm_currency_code  IN fnd_currencies.currency_code%TYPE,
378                  p_cm_amount_rem        IN ar_payment_schedules.amount_due_remaining%TYPE,
379                  p_inv_amount_rem       IN ar_payment_schedules.amount_due_Remaining%TYPE,
380                  p_amount_applied    IN OUT NOCOPY NUMBER,
381                  p_return_status     OUT NOCOPY VARCHAR2
382       )
383 
384 IS
385 
386 BEGIN
387 
388   IF PG_DEBUG in ('Y', 'C') THEN
389        arp_util.debug('Default_amt_applied ()+');
390   END IF;
391 
392     p_return_status := FND_API.G_RET_STS_SUCCESS;
393 
394   IF  p_amount_applied  IS NULL THEN
395     IF PG_DEBUG in ('Y', 'C') THEN
396        arp_util.debug('Default_amt_applied: ' || 'p_amount_applied is NULL ');
397        arp_util.debug('Invoice currency code: ' || p_inv_currency_code);
398        arp_util.debug('CM currency code: ' || p_cm_currency_code);
399     END IF;
400 
401     IF p_inv_currency_code = p_cm_currency_code  -- Same currency case
402       THEN
403 
404        IF (sign(p_inv_amount_rem) <> sign(p_cm_amount_rem) ) THEN
405          IF abs(p_inv_amount_rem) > abs(p_cm_amount_rem)  THEN
406             p_amount_applied := abs(p_cm_amount_rem)*sign(p_inv_amount_rem);
407          ELSE
408            p_amount_applied := p_inv_amount_rem;
409          END IF;
410        END IF;
411        p_amount_applied := arp_util.CurrRound(p_amount_applied,
412                                          p_inv_currency_code);
413     END IF;
414     IF PG_DEBUG in ('Y', 'C') THEN
415        arp_util.debug('Default_amt_applied: ' || p_amount_applied );
416     END IF;
417   END IF;
418 
419   IF PG_DEBUG in ('Y', 'C') THEN
420      arp_util.debug('Default_amt_applied ()-');
421   END IF;
422 
423 EXCEPTION
424  WHEN others THEN
425   IF PG_DEBUG in ('Y', 'C') THEN
426      arp_util.debug('Default_amt_applied: ' || 'EXCEPTION: Default_amt_applied()');
427   END IF;
428   raise;
429 
430 
431 END default_amt_applied;
432 
433 
434 PROCEDURE validate_apply_date(
435                    p_apply_date  IN DATE,
436                          p_inv_trx_date IN DATE,
437                          p_cm_trx_date  IN DATE,
438                          p_return_status OUT NOCOPY VARCHAR2
439                          )
440 IS
441 
442 BEGIN
443 
444    IF PG_DEBUG in ('Y', 'C') THEN
445        arp_util.debug('Validate_apply_date ()+');
446     END IF;
447      p_return_status := FND_API.G_RET_STS_SUCCESS;
448 
449     IF p_apply_date IS NOT NULL THEN
450 
451        -- check that the apply  date is not before the invoice date.
452        IF p_apply_date < p_inv_trx_date THEN
453           FND_MESSAGE.SET_NAME('AR','AR_APPLY_BEFORE_TRANSACTION');
454           FND_MSG_PUB.Add;
455           p_return_status := FND_API.G_RET_STS_ERROR;
456 
457         -- check that the application date is not before the CM trx date.
458        END IF;
459 
460        IF p_apply_date < p_cm_trx_date  THEN
461           FND_MESSAGE.SET_NAME('AR','AR_APPLY_BEFORE_CM');
462           FND_MSG_PUB.Add;
463           p_return_status := FND_API.G_RET_STS_ERROR;
464        END IF;
465 
466     END IF;
467 
468     IF PG_DEBUG in ('Y', 'C') THEN
469        arp_util.debug('Validate_apply_date ()-');
470     END IF;
471 
472 
473 END validate_apply_date;
477                            p_cm_gl_date  IN DATE,
474 
475 PROCEDURE  validate_apply_gl_date(p_apply_gl_date IN DATE,
476                            p_inv_gl_date IN DATE,
478                            p_return_status OUT NOCOPY VARCHAR2
479                                  )
480 
481 IS
482 
483 BEGIN
484 
485     IF PG_DEBUG in ('Y', 'C') THEN
486        arp_util.debug('Validate_apply_gl_date ()+');
487     END IF;
488 
489     p_return_status := FND_API.G_RET_STS_SUCCESS;
490 
491     IF p_apply_gl_date IS NOT NULL THEN
492 
493        -- Check that the application GL Date is not before the invoice GL Date.
494        IF p_apply_gl_date < p_inv_gl_date THEN
495           FND_MESSAGE.SET_NAME('AR','AR_VAL_GL_INV_GL');
496           FND_MSG_PUB.Add;
497           p_return_status := FND_API.G_RET_STS_ERROR;
498 
499         -- Check that the application GL Date is not before the CM GL Date.
500        END IF;
501        IF p_apply_gl_date < p_cm_gl_date  THEN
502           FND_MESSAGE.SET_NAME('AR','AR_RW_GL_DATE_BEFORE_CM_GL');
503           FND_MSG_PUB.Add;
504           p_return_status := FND_API.G_RET_STS_ERROR;
505        END IF;
506 
507 
508        -- Check that the Application GL Date is in an open or future GL period.
509        IF ( NOT arp_util.is_gl_date_valid( p_apply_gl_date )) THEN
510          FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
511          FND_MESSAGE.set_token( 'GL_DATE', TO_CHAR( p_apply_gl_date ));
512          FND_MSG_PUB.Add;
513           p_return_status := FND_API.G_RET_STS_ERROR;
514        END IF;
515 
516 
517     END IF;
518 
519     IF PG_DEBUG in ('Y', 'C') THEN
520        arp_util.debug('Validate_apply_gl_date ()-');
521     END IF;
522 
523 
524 END validate_apply_gl_date;
525 
526 PROCEDURE validate_amount_applied(
527                       p_amount_applied IN NUMBER,
528                       p_applied_payment_schedule_id IN NUMBER,
529                       p_customer_trx_line_id IN NUMBER,
530                       p_inv_line_amount      IN NUMBER,
531                       p_creation_sign       IN VARCHAR2 ,
532                       p_allow_overappln_flag IN VARCHAR2,
533                       p_natural_appln_only_flag IN VARCHAR2,
534                       p_amount_due_remaining IN NUMBER,
535                       p_return_status OUT NOCOPY VARCHAR2
536                        )
537 IS
538 
539 BEGIN
540 
541    IF PG_DEBUG in ('Y', 'C') THEN
542       arp_util.debug('Validate_amount_applied ()+');
543    END IF;
544    p_return_status := FND_API.G_RET_STS_SUCCESS;
545 
546 
547   IF p_amount_applied IS NULL THEN
548      p_return_status := FND_API.G_RET_STS_ERROR;
549      FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
550      FND_MSG_PUB.Add;
551      return;
552   END IF;
553 
554 
555   -- Should we check for natural application here???
556 
557   IF PG_DEBUG in ('Y', 'C') THEN
558      arp_util.debug('Validate_amount_applied ()-');
559   END IF;
560 
561 END validate_amount_applied;
562 
563 
564 
565 FUNCTION Get_trx_ps_id(p_inv_customer_trx_id IN OUT NOCOPY NUMBER,
566                        p_installment     IN NUMBER,
567                        p_return_status   OUT NOCOPY VARCHAR2
568                        ) RETURN NUMBER IS
569 l_inv_ps_id  NUMBER;
570 
571 BEGIN
572   IF PG_DEBUG in ('Y', 'C') THEN
573      arp_util.debug('Get_trx_ps_id ()+');
574   END IF;
575   p_return_status := FND_API.G_RET_STS_SUCCESS;
576 
577    IF p_installment IS NOT NULL THEN
578         BEGIN
579          SELECT ps.payment_schedule_id
580          INTO   l_inv_ps_id
581          FROM   ra_customer_trx ct,
582                 ar_payment_schedules ps
583          WHERE  ct.customer_trx_id = p_inv_customer_trx_id
584            AND  ct.customer_trx_id = ps.customer_trx_id
585            --AND  ps.class  IN ('CB','CM','DEP','DM','INV','BR')
586            AND  ps.terms_sequence_number = p_installment
587                 ;
588          EXCEPTION
589           WHEN no_data_found THEN
590             IF ar_cm_api_pub.Original_cm_unapp_info.inv_customer_trx_id IS NOT NULL THEN
591               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_ID_INST_INVALID');
592               FND_MSG_PUB.Add;
593               p_return_status := FND_API.G_RET_STS_ERROR;
594             ELSIF ar_cm_api_pub.Original_cm_unapp_info.inv_trx_number IS NOT NULL THEN
595               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_NUM_INST_INVALID');
596               FND_MSG_PUB.Add;
597               p_return_status := FND_API.G_RET_STS_ERROR;
598             END IF;
599 
600          END;
601    ELSE
602       --if the user has not entered the installment then if the transaction
603       --has only one installment, get the ps_id for that installment
604          BEGIN
605            SELECT ps.payment_schedule_id
606            INTO   l_inv_ps_id
607            FROM   ra_customer_trx ct,
608                   ar_payment_schedules ps
609            WHERE  ct.customer_trx_id = p_inv_customer_trx_id
610              AND  ct.customer_trx_id = ps.customer_trx_id
611              --AND  ps.class  IN ('CB','CM','DEP','DM','INV','BR')
612                   ;
613          EXCEPTION
614            WHEN no_data_found THEN
615              FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
616              FND_MSG_PUB.Add;
617              p_return_status := FND_API.G_RET_STS_ERROR;
618            WHEN too_many_rows THEN
619              FND_MESSAGE.SET_NAME('AR','AR_RAPI_INSTALL_NULL');
620              FND_MSG_PUB.Add;
621              p_return_status := FND_API.G_RET_STS_ERROR;
622          END;
623 
624 
628 
625   END IF;
626 
627  RETURN(l_inv_ps_id);
629  IF PG_DEBUG in ('Y', 'C') THEN
630     arp_util.debug('Get_trx_ps_id ()-');
631  END IF;
632 
633 EXCEPTION
634  WHEN others THEN
635    IF PG_DEBUG in ('Y', 'C') THEN
636       arp_util.debug('EXCEPTION: Get_trx_ps_id()');
637    END IF;
638    raise;
639 END Get_trx_ps_id;
640 
641 PROCEDURE get_ra_info(
642                                    p_ra_id           IN NUMBER,
643                                    p_ra_app_ps_id    OUT NOCOPY NUMBER,
644                                    p_inv_customer_trx_id OUT NOCOPY NUMBER,
645                                    p_apply_gl_date   OUT NOCOPY DATE,
646                                    p_return_status   OUT NOCOPY VARCHAR2
647                                        ) IS
648 CURSOR rec_apppln IS
649 SELECT ra.applied_customer_trx_id, ra.applied_payment_schedule_id, ra.gl_date
650 FROM   ar_receivable_applications ra,
651        ar_payment_schedules ps
652 WHERE  ra.applied_payment_schedule_id = ps.payment_schedule_id
653   AND  ra.receivable_application_id = p_ra_id
654   AND  ra.display = 'Y'
655   AND  ra.status = 'APP'
656   AND  ps.reserved_value IS NULL
657   AND  ps.reserved_type IS NULL;
658 
659 BEGIN
660 
661   IF PG_DEBUG in ('Y', 'C') THEN
662      arp_util.debug('get_ra_info ()+');
663   END IF;
664 
665   p_return_status := FND_API.G_RET_STS_SUCCESS;
666 
667    OPEN rec_apppln;
668    FETCH rec_apppln INTO p_inv_customer_trx_id, p_ra_app_ps_id,p_apply_gl_date;
669        IF rec_apppln%NOTFOUND  THEN
670          FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
671          FND_MSG_PUB.Add;
672          p_return_status := FND_API.G_RET_STS_ERROR;
673        END IF;
674     CLOSE rec_apppln;
675 
676 
677   IF PG_DEBUG in ('Y', 'C') THEN
678      arp_util.debug('Get_ra_info ()-');
679      arp_util.debug('Applied PS ID: '|| p_ra_app_ps_id ||
680                     'Applied Trx ID: '|| p_inv_customer_trx_id ||
681                     'Apply GL date: '|| p_apply_gl_date);
682   END IF;
683 
684 
685 
686 END get_ra_info;
687 
688 PROCEDURE default_ra_id(
689                            p_cm_customer_trx_id          IN NUMBER,
690                            p_applied_payment_schedule_id IN NUMBER,
691                            p_apply_gl_date               OUT NOCOPY DATE,
692                            p_receivable_application_id   OUT NOCOPY NUMBER,
693                            p_return_status               OUT NOCOPY VARCHAR2
694                            )  IS
698      arp_util.debug('Default_ra_id ()+');
695 
696 BEGIN
697   IF PG_DEBUG in ('Y', 'C') THEN
699   END IF;
700   p_return_status := FND_API.G_RET_STS_SUCCESS;
701   IF p_cm_customer_trx_id IS NOT NULL AND
702      p_applied_payment_schedule_id IS NOT NULL
703    THEN
704       SELECT receivable_application_id, gl_date
705       INTO   p_receivable_application_id, p_apply_gl_date
706       FROM   ar_receivable_applications ra
707       WHERE  ra.customer_trx_id = p_cm_customer_trx_id
708         AND  ra.applied_payment_schedule_id = p_applied_payment_schedule_id
709         AND  ra.display = 'Y'
710         AND  ra.status = 'APP'
711         AND  ra.application_type = 'CM';
712 
713    END IF;
714   IF PG_DEBUG in ('Y', 'C') THEN
715      arp_util.debug('Default_ra_id ()+');
716   END IF;
717 EXCEPTION
718  WHEN no_data_found THEN
719   FND_MESSAGE.SET_NAME('AR','AR_CMAPI_CM_NOT_APP_TO_INV');
720   FND_MSG_PUB.Add;
721   p_return_status := FND_API.G_RET_STS_ERROR;
722    raise;
723  WHEN others THEN
724    IF PG_DEBUG in ('Y', 'C') THEN
725       arp_util.debug('Default_ra_id: ' || 'EXCEPTION: Get_ra_id()');
726    END IF;
727    raise;
728 END default_ra_id;
729 
730 PROCEDURE default_reversal_gl_date(
731                         p_receivable_application_id IN NUMBER,
732                         p_reversal_gl_date IN OUT NOCOPY DATE,
733                         p_apply_gl_date IN OUT NOCOPY DATE,
734                         p_cm_customer_trx_id IN OUT NOCOPY NUMBER
735                                    ) IS
736 l_apply_gl_date     DATE;
737 l_default_gl_date   DATE;
738 l_defaulting_rule_used  VARCHAR2(100);
739 l_error_message  VARCHAR2(240);
740 BEGIN
741   IF PG_DEBUG in ('Y', 'C') THEN
742      arp_util.debug('Default_reversal_gl_date ()+');
743   END IF;
744 
745     l_apply_gl_date := p_apply_gl_date;
746 
747     IF p_receivable_application_id IS NOT NULL THEN
748      IF p_apply_gl_date  IS NULL THEN
749       --get the gl_date for the application
750       BEGIN
751         SELECT gl_date, customer_trx_id
752           INTO   l_apply_gl_date, p_cm_customer_trx_id
753           FROM   ar_receivable_applications
754          WHERE  receivable_application_id =
755                    p_receivable_application_id;
756        EXCEPTION
757          WHEN OTHERS THEN
758            NULL;
759        END;
760      END IF;
761 
762       IF p_reversal_gl_date is null THEN
763          IF (arp_util.validate_and_default_gl_date(
764                 nvl(l_apply_gl_date,trunc(sysdate)),
765                 NULL,
766                 l_apply_gl_date,
767                 NULL,
768                 NULL,
769                 NULL,
770                 NULL,
771                 NULL,
772                 'N',
773                 NULL,
774                 arp_global.set_of_books_id,
775                 222,
776                 l_default_gl_date,
777                 l_defaulting_rule_used,
778                 l_error_message) = TRUE) THEN
779 
780            p_reversal_gl_date := l_default_gl_date;
781          ELSE
782          --we were not able to default the gl_date put the message
783          --here on the stack, but the return status will be set
784          --to FND_API.G_RET_STS_ERROR in the validation phase.
785            FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
786            FND_MESSAGE.SET_TOKEN('GENERIC_TEXT', l_error_message);
787            FND_MSG_PUB.Add;
788          END IF;
789       END IF;
790     END IF;
791   IF PG_DEBUG in ('Y', 'C') THEN
792      arp_util.debug('Default_reversal_gl_date ()-');
793   END IF;
794 EXCEPTION
795  When others THEN
796     IF PG_DEBUG in ('Y', 'C') THEN
797        arp_util.debug('EXCEPTION: Default_reversal_gl_date()');
798     END IF;
799     raise;
800 END Default_reversal_gl_date;
801 
802 
803 PROCEDURE Validate_ra_id(
804                        p_receivable_application_id  IN  NUMBER,
805                        p_application_type  IN VARCHAR2,
806                        p_return_status OUT NOCOPY VARCHAR2) IS
807 l_valid NUMBER;
808 BEGIN
809   p_return_status := FND_API.G_RET_STS_SUCCESS;
810   IF PG_DEBUG in ('Y', 'C') THEN
811      arp_util.debug('Validate_ra_id ()+');
812   END IF;
813    --validate the receivable application id only if it was passed in
814    --directly as a parameter. No need to validate if it was derived.
815    IF p_receivable_application_id IS NOT NULL AND
816       ar_cm_api_pub.original_cm_unapp_info.receivable_application_id IS NOT NULL
817      THEN
818        SELECT count(*)
819        INTO   l_valid
820        FROM   AR_RECEIVABLE_APPLICATIONS ra
821        WHERE  ra.receivable_application_id = p_receivable_application_id
822          and  ra.display = 'Y'
823          and  ra.status = p_application_type
824          and  ra.application_type = 'CM';
825 
826      IF  l_valid = 0 THEN
827         FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
828         FND_MSG_PUB.Add;
829         p_return_status := FND_API.G_RET_STS_ERROR;
830      END IF;
831 
832    ELSIF p_receivable_application_id IS NULL  THEN
833     IF ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS NULL AND
834        ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS NULL AND
835        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NULL AND
836        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NULL AND
837        ar_cm_api_pub.original_cm_unapp_info.inv_trx_number  IS NULL
838      THEN
839      --receivable application id is null
840        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_NULL');
844        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NULL AND
841        FND_MSG_PUB.Add;
842        p_return_status := FND_API.G_RET_STS_ERROR;
843     ELSIF ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NULL AND
845        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NULL AND
846        (ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS NOT NULL OR
847        ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS NOT NULL)
848      THEN
849      --the transaction was not specified
850         FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_NULL');
851         FND_MSG_PUB.Add;
852         p_return_status := FND_API.G_RET_STS_ERROR;
853     ELSIF (ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NOT NULL OR
854        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NOT NULL OR
855        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NOT NULL) AND
856        ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS  NULL AND
857        ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS  NULL
858     THEN
859     --the credit memo was not specified
860         FND_MESSAGE.SET_NAME('AR','AR_CMAPI_CM_TRX_ID_NULL');
861         FND_MSG_PUB.Add;
862         p_return_status := FND_API.G_RET_STS_ERROR;
863     END IF;
864 
865    END IF;
866   IF PG_DEBUG in ('Y', 'C') THEN
867      arp_util.debug('Validate_receivable_appln_id ()-');
868   END IF;
869 EXCEPTION
870  WHEN others THEN
871    IF PG_DEBUG in ('Y', 'C') THEN
872       arp_util.debug('EXCEPTION: Validate_ra_id(-)');
873    END IF;
874    raise;
875 
876 END Validate_ra_id;
877 
878 
879 PROCEDURE Validate_Rev_gl_date(p_reversal_gl_date IN DATE,
880                                p_apply_gl_date  IN DATE,
881                                p_cm_gl_date IN DATE,
882                                p_return_status  OUT NOCOPY VARCHAR2
883                                ) IS
884 
885 BEGIN
886     IF PG_DEBUG in ('Y', 'C') THEN
887        arp_util.debug('Validate_Rev_gl_date ()+');
888     END IF;
889     p_return_status := FND_API.G_RET_STS_SUCCESS;
890   IF p_reversal_gl_date IS NOT NULL THEN
891 
892     IF  p_reversal_gl_date < NVL(p_apply_gl_date,p_reversal_gl_date)  THEN
893         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_APP_GL_DATE');
894         FND_MESSAGE.SET_TOKEN('GL_DATE', p_apply_gl_date);
895         FND_MSG_PUB.Add;
896         p_return_status := FND_API.G_RET_STS_ERROR;
897     END IF;
898    IF p_reversal_gl_date < nvl(p_cm_gl_date,p_reversal_gl_date) THEN
899         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_CM_GL_DATE');
900         FND_MESSAGE.SET_TOKEN('GL_DATE', p_cm_gl_date);
901         FND_MSG_PUB.Add;
902         p_return_status := FND_API.G_RET_STS_ERROR;
903     END IF;
904 
905     IF ( NOT arp_util.is_gl_date_valid(p_reversal_gl_date)) THEN
906         FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
907         FND_MESSAGE.set_token( 'GL_DATE', TO_CHAR( p_reversal_gl_date ));
908         FND_MSG_PUB.Add;
909         p_return_status := FND_API.G_RET_STS_ERROR;
910     END IF;
911 
912   ELSE
913       FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_GL_DATE_NULL');
914       FND_MSG_PUB.Add;
915       p_return_status := FND_API.G_RET_STS_ERROR;
916       IF PG_DEBUG in ('Y', 'C') THEN
917          arp_util.debug('Validate_Rev_gl_date: ' || 'The Reversal gl date is null ');
918       END IF;
919   END IF;
920 
921   IF PG_DEBUG in ('Y', 'C') THEN
922      arp_util.debug('Validate_Rev_gl_date ()+');
923   END IF;
924 EXCEPTION
925   WHEN others THEN
926       IF PG_DEBUG in ('Y', 'C') THEN
927          arp_util.debug('EXCEPTION: Validate_rev_gl_date() ');
928       END IF;
929       raise;
930 END Validate_Rev_gl_date;
931 
932 -- PUBLIC PROCEDURES/FUNCTIONS
933 
934 PROCEDURE default_app_ids(
935                 p_cm_customer_trx_id   IN OUT NOCOPY NUMBER,
936                 p_cm_trx_number        IN VARCHAR2,
937                 p_inv_customer_trx_id  IN OUT NOCOPY NUMBER,
938                 p_inv_trx_number       IN VARCHAR2,
939                 p_inv_customer_trx_line_id  IN OUT NOCOPY NUMBER,
940                 p_inv_line_number          IN NUMBER,
941                 p_installment       IN OUT NOCOPY NUMBER,
942                 p_applied_payment_schedule_id   IN NUMBER,
943                 p_return_status     OUT NOCOPY VARCHAR2 )
944 
945 IS
946 
947 
948 CURSOR c_pay_sched IS
949 SELECT customer_trx_id, terms_sequence_number
950 FROM   ar_payment_schedules
951 WHERE  payment_schedule_id = p_applied_payment_schedule_id and
952        payment_schedule_id >0 and
953        class in ('INV','DM');  -- Should we include DM, DEP, GUAR, CB?
954 
955 l_inv_customer_trx_id  NUMBER;
956 l_installment      NUMBER;
957 p_inv_return_status_lines  VARCHAR2(100);
958 
959 BEGIN
960 
961   IF PG_DEBUG in ('Y', 'C') THEN
962     arp_util.debug('default_app_ids(+)');
963   END IF;
964 
965   p_return_status := FND_API.G_RET_STS_SUCCESS;
966 
967   -- Step 1: Get a valid value for CM customer_trx_id
968   IF  p_cm_trx_number  IS NOT NULL THEN
969     default_customer_trx_id(p_cm_customer_trx_id ,
970                             p_cm_trx_number ,
971                             p_return_status);
972   END IF;
973 
974   -- Step 2: Get a valid value for DM customer_trx_id
975   IF  p_inv_trx_number  IS NOT NULL THEN
976     default_customer_trx_id(p_inv_customer_trx_id ,
977                             p_inv_trx_number ,
978                             p_return_status);
979   END IF;
980 
981    -- Step 3: Get a valid value for DM customer trx line id
985                                  p_inv_return_status_lines);
982    default_customer_trx_line_id(p_inv_customer_trx_id,
983                                  p_inv_customer_trx_line_id,
984                                  p_inv_line_number,
986 
987    -- Step 4: Get inv_customer_trx_id from applied_payment_schedule_id and
988    --         installment
989 
990    IF p_applied_payment_schedule_id IS NOT NULL THEN
991      OPEN c_pay_sched;
992      FETCH c_pay_sched
993       INTO l_inv_customer_trx_id,
994            l_installment;
995      IF c_pay_sched%NOTFOUND THEN
996        FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
997        FND_MSG_PUB.Add;
998        p_return_status := FND_API.G_RET_STS_ERROR ;
999      END IF;
1000      CLOSE c_pay_sched;
1001 
1002      IF  p_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1003       IF nvl(p_inv_customer_trx_id,nvl(l_inv_customer_trx_id,-99)) = nvl(l_inv_customer_trx_id,-99) THEN
1004         p_inv_customer_trx_id := l_inv_customer_trx_id;
1005       END IF;
1006       IF nvl(p_installment,nvl(l_installment,-99)) = nvl(l_installment,-99) THEN
1007          p_installment := l_installment;
1008       END IF;
1009     END IF;
1010    ELSE -- p_payment_schedule_id is null
1011      --default the installment from the customer_trx_id if not entered
1012      IF p_inv_customer_trx_id IS NOT NULL THEN
1013        IF p_installment IS NULL THEN
1014          BEGIN
1015           SELECT terms_sequence_number
1016           INTO   p_installment
1017           FROM   ar_payment_schedules
1018           WHERE  customer_trx_id = p_inv_customer_trx_id;
1019          EXCEPTION
1020           WHEN no_data_found THEN
1021            FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
1022            FND_MSG_PUB.Add;
1023            p_return_status := FND_API.G_RET_STS_ERROR;
1024           WHEN too_many_rows THEN
1025            FND_MESSAGE.SET_NAME('AR','AR_RAPI_INSTALL_NULL');
1026            FND_MSG_PUB.Add;
1027            p_return_status := FND_API.G_RET_STS_ERROR;
1028          END;
1029        END IF;
1030      END IF;
1031    END IF;
1032 
1033 
1034    IF (p_inv_return_status_lines = FND_API.G_RET_STS_ERROR OR
1035        p_return_status = FND_API.G_RET_STS_ERROR) THEN
1036        p_return_status := FND_API.G_RET_STS_ERROR;
1037   END IF;
1038 
1039   IF PG_DEBUG in ('Y', 'C') THEN
1040      arp_util.debug('Default_app_ids: ' || 'Defaulted Value for the application ids');
1041      arp_util.debug('Default_app_ids: ' || 'p_cm_customer_trx_id             :'||to_char(p_cm_customer_trx_id));
1042      arp_util.debug('Default_app_ids: ' || 'p_inv_customer_trx_id             :'||to_char(p_inv_customer_trx_id));
1043      arp_util.debug('Default_appln_ids: ' || 'p_installment                 :'||to_char(p_installment));
1044      arp_util.debug('Default_app_ids: ' || 'p_applied_payment_schedule_id :'||to_char(p_applied_payment_schedule_id));
1045      arp_util.debug('Default_app_ids ()- ');
1046   END IF;
1047 EXCEPTION
1048  WHEN others THEN
1049    IF PG_DEBUG in ('Y', 'C') THEN
1050       arp_util.debug('EXCEPTION: Default_appln_ids()');
1051    END IF;
1052    RAISE;
1053 
1054 END Default_app_ids;
1055 
1056 
1057 PROCEDURE default_app_info(
1058               p_cm_customer_trx_id  IN NUMBER,
1059               p_inv_customer_trx_id IN  NUMBER,
1060               p_inv_customer_trx_line_id  IN NUMBER,
1061               p_show_closed_invoices  IN VARCHAR2,
1062               p_installment         IN OUT NOCOPY NUMBER,
1063               p_apply_date           IN OUT NOCOPY DATE,
1064               p_apply_gl_date        IN OUT NOCOPY DATE,
1065               p_amount_applied       IN OUT NOCOPY NUMBER,
1066               p_applied_payment_schedule_id IN OUT NOCOPY NUMBER,
1067               p_cm_gl_date          OUT NOCOPY DATE,
1068               p_cm_trx_date         OUT NOCOPY DATE,
1069               p_cm_amount_rem       OUT NOCOPY NUMBER,
1070               p_cm_currency_code    OUT NOCOPY VARCHAR2,
1071               p_inv_due_date         OUT NOCOPY DATE,
1072               p_inv_currency_code    OUT NOCOPY VARCHAR2,
1073               p_inv_amount_rem       OUT NOCOPY NUMBER,
1074               p_inv_trx_date         OUT NOCOPY DATE,
1075               p_inv_gl_date          OUT NOCOPY DATE,
1076               p_allow_overappln_flag OUT NOCOPY VARCHAR2,
1077               p_natural_appln_only_flag  OUT NOCOPY VARCHAR2,
1078               p_creation_sign        OUT NOCOPY VARCHAR2,
1079               p_cm_payment_schedule_id  OUT NOCOPY NUMBER,
1080               p_inv_line_amount       OUT NOCOPY NUMBER,
1081               p_return_status    OUT NOCOPY VARCHAR2
1082                )
1083 IS
1084 
1085 l_cm_gl_date      DATE;
1086 l_cm_amount_rem   NUMBER;
1087 l_cm_trx_date     DATE;
1088 l_cm_ps_id        NUMBER;
1089 l_cm_currency_code     fnd_currencies.currency_code%TYPE;
1090 l_cm_customer_id      NUMBER;
1091 l_cm_info_return_status  VARCHAR2(1);
1092 
1093 l_inv_customer_id    NUMBER;  --customer on transaction
1094 l_inv_cust_trx_type_id     NUMBER;
1095 l_inv_due_date             DATE;
1096 l_inv_trx_date             DATE;
1097 l_inv_gl_date              DATE;
1098 l_allow_overappln_flag     VARCHAR2(1);
1099 l_natural_appln_only_flag  VARCHAR2(1);
1100 l_creation_sign            VARCHAR2(1);
1101 --l_applied_payment_schedule_id  NUMBER;
1102 l_app_gl_date              DATE;
1103 l_inv_amount_rem           NUMBER;
1104 l_trx_info_return_status   VARCHAR2(1);
1105 l_inv_line_amount           NUMBER;
1106 
1107 l_inv_currency_code     fnd_currencies.currency_code%TYPE;
1108 l_def_amt_return_status VARCHAR2(1);
1109 
1110 l_return  BOOLEAN;
1111 l_default_gl_date  DATE;
1112 l_defaulting_rule_used VARCHAR2(100);
1113 l_error_message  VARCHAR2(200);
1114 
1115 BEGIN
1116 
1117    IF PG_DEBUG in ('Y', 'C') THEN
1121    p_return_status := FND_API.G_RET_STS_SUCCESS;
1118        arp_util.debug('Default_app_info ()+');
1119    END IF;
1120 
1122 
1123    -- Step 1: Default CM Info:
1124    default_cm_info(
1125           p_cm_customer_trx_id,
1126           l_cm_gl_date,
1127           l_cm_amount_rem,
1128           l_cm_trx_date,
1129           l_cm_ps_id,
1130           l_cm_currency_code,
1131           l_cm_customer_id,
1132           l_cm_info_return_status );
1133 
1134    IF PG_DEBUG in ('Y', 'C') THEN
1135          arp_util.debug('Default_app_info: ' || 'Default_CM_Info return status = '||l_cm_info_return_status);
1136    END IF;
1137 
1138    -- Step 2: Default DM info
1139 
1140    IF l_cm_info_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1141       Default_Trx_Info(
1142             p_inv_customer_trx_id     ,
1143             p_inv_customer_trx_line_id ,
1144             p_show_closed_invoices     ,
1145             l_cm_gl_date               ,
1146             l_cm_customer_id           ,
1147             l_cm_currency_code         ,
1148             l_cm_ps_id                 ,
1149             l_cm_trx_date              ,
1150             --- Out variables
1151             l_inv_customer_id          , --customer on transaction
1152             l_inv_cust_trx_type_id     ,
1153             l_inv_due_date             ,
1154             l_inv_trx_date             ,
1155             l_inv_gl_date              ,
1156             l_allow_overappln_flag     ,
1157             l_natural_appln_only_flag  ,
1158             l_creation_sign            ,
1159             p_applied_payment_schedule_id  ,
1160             l_app_gl_date              , --this is the application gl_date
1161             p_installment              ,
1162             l_inv_amount_rem             ,
1163             l_inv_currency_code        ,
1164             l_trx_info_return_status
1165       );
1166 
1167 
1168    END IF;
1169 
1170    IF PG_DEBUG in ('Y', 'C') THEN
1171       arp_util.debug('Default_app_info: ' || 'Default trx info return status = '||l_trx_info_return_status);
1172       arp_util.debug('Applied PS ID : ' || p_applied_payment_schedule_id);
1173    END IF;
1174 
1175 
1176    -- Step 3: Default apply date
1177 
1178     IF p_apply_date IS NULL THEN
1179       p_apply_date := GREATEST(sysdate,
1180                                GREATEST(NVL(l_cm_trx_date,sysdate),
1181                                         NVL(l_inv_trx_date,sysdate)));
1182     END IF;
1183 
1184 
1185    -- Step 4: Default GL Date
1186 
1187    IF p_apply_gl_date IS NULL THEN
1188       l_return :=
1189               arp_util.validate_and_default_gl_date(
1190                   gl_date                => l_app_gl_date,
1191                   trx_date               => null,
1192                   validation_date1       => null,
1193                   validation_date2       => null,
1194                   validation_date3       => null,
1195                   default_date1          => l_app_gl_date,
1196                   default_date2          => null,
1197                   default_date3          => null,
1198                   p_allow_not_open_flag  => 'N',
1199                   p_invoicing_rule_id    => null,
1200                   p_set_of_books_id      => arp_global.set_of_books_id,
1201                   p_application_id       => 222,
1202                   default_gl_date        => l_default_gl_date ,
1203                   defaulting_rule_used   => l_defaulting_rule_used,
1204                   error_message          => l_error_message);
1205 
1206              IF l_return = TRUE  THEN
1207                p_apply_gl_date := l_default_gl_date;
1208              END IF;
1209 
1210     END IF;
1211 
1212 
1213    -- Step 5: Default amount applied
1214    default_amt_applied(
1215                  l_inv_currency_code ,
1216                  l_cm_currency_code  ,
1217                  l_cm_amount_rem        ,
1218                  l_inv_amount_rem       ,
1219                  p_amount_applied    ,
1220                  l_def_amt_return_status
1221      );
1222 
1223 
1224               p_cm_gl_date         := l_cm_gl_date;
1225               p_cm_trx_date        := l_cm_trx_date;
1226               p_cm_amount_rem      := l_cm_amount_rem;
1227               p_cm_currency_code   := l_cm_currency_code;
1228               p_inv_due_date       := l_inv_due_date;
1229               p_inv_currency_code  := l_inv_currency_code;
1230               p_inv_amount_rem      := l_inv_amount_rem;
1231               p_inv_trx_date       := l_inv_trx_date;
1232               p_inv_gl_date        := l_inv_gl_date;
1233               p_allow_overappln_flag := l_allow_overappln_flag;
1234               p_natural_appln_only_flag  := l_natural_appln_only_flag;
1235               p_creation_sign        := l_creation_sign;
1236               p_cm_payment_schedule_id  := l_cm_ps_id;
1237               p_inv_line_amount       := l_inv_line_amount;
1238 
1239 
1240 
1241     IF PG_DEBUG in ('Y', 'C') THEN
1242       arp_util.debug('Default_appl_info: ' || 'Default amount return status :'||l_def_amt_return_status );
1243     END IF;
1244 
1245 
1246 END default_app_info;
1247 
1248 
1249 PROCEDURE validate_app_info(
1250                       p_apply_date   IN DATE,
1251                       p_cm_trx_date  IN DATE,
1252                       p_inv_trx_date IN DATE,
1253                       p_apply_gl_date IN DATE,
1254                       p_cm_gl_date    IN DATE,
1255                       p_inv_gl_date   IN DATE,
1256                       p_amount_applied IN NUMBER,
1257                       p_applied_payment_schedule_id IN NUMBER,
1261                       p_allow_overappln_flag  IN VARCHAR2,
1258                       p_customer_trx_line_id  IN NUMBER,
1259                       p_inv_line_amount   IN NUMBER,
1260                       p_creation_sign   IN VARCHAR2,
1262                       p_natural_appln_only_flag  IN VARCHAR2,
1263                       p_cm_amount_rem    IN NUMBER,
1264                       p_inv_amount_rem   IN NUMBER,
1265                       p_cm_currency_code IN VARCHAR2,
1266                       p_inv_currency_code IN VARCHAR2,
1267                       p_return_status     OUT NOCOPY VARCHAR2
1268      ) IS
1269 
1270 l_gl_date_return_status  VARCHAR2(1);
1271 l_amt_applied_return_status VARCHAR2(1);
1272 l_apply_date_return_status   VARCHAR2(1);
1273 
1274 
1275 BEGIN
1276 
1277     -- Validations of cm_customer_trx_id, inv_customer_trx_id,
1278     -- applied_payment_schedule_id are done in defaulting routines
1279 
1280     IF PG_DEBUG in ('Y', 'C') THEN
1281        arp_util.debug('Validate_App_info ()+');
1282     END IF;
1283 
1284     p_return_status := FND_API.G_RET_STS_SUCCESS;
1285 
1286     validate_apply_date(p_apply_date,
1287                          p_inv_trx_date,
1288                          p_cm_trx_date,
1289                          l_apply_date_return_status
1290                          );
1291 
1292     validate_apply_gl_date(p_apply_gl_date ,
1293                            p_inv_gl_date ,
1294                            p_cm_gl_date  ,
1295                            l_gl_date_return_status
1296                                  );
1297 
1298     IF PG_DEBUG in ('Y', 'C') THEN
1299       arp_util.debug('Validate_Application_info: ' || 'Apply gl_date return status :'||l_gl_date_return_status);
1300    END IF;
1301         validate_amount_applied(
1302                      p_amount_applied ,
1303                       p_applied_payment_schedule_id ,
1304                       p_customer_trx_line_id ,
1305                       p_inv_line_amount      ,
1306                       p_creation_sign        ,
1307                       p_allow_overappln_flag ,
1308                       p_natural_appln_only_flag ,
1309                       p_inv_amount_rem ,
1310                       l_amt_applied_return_status
1311                        );
1312     IF l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
1313        l_amt_applied_return_status <> FND_API.G_RET_STS_SUCCESS OR
1314        l_apply_date_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
1315        p_return_status := FND_API.G_RET_STS_ERROR;
1316     END IF;
1317 
1318     IF PG_DEBUG in ('Y', 'C') THEN
1319        arp_util.debug('Validate_App_info ()-');
1320     END IF;
1321 EXCEPTION
1322  WHEN others THEN
1323   IF PG_DEBUG in ('Y', 'C') THEN
1324      arp_util.debug('EXCEPTION: Validate_App_Info() ');
1325   END IF;
1326   raise;
1327 
1328 
1329 END validate_app_info;
1330 
1331 PROCEDURE Default_unapp_ids(
1332                    p_cm_trx_number                   IN VARCHAR2,
1333                    p_cm_customer_trx_id              IN OUT NOCOPY NUMBER,
1334                    p_inv_trx_number                   IN VARCHAR2,
1335                    p_inv_customer_trx_id              IN OUT NOCOPY NUMBER,
1336                    p_receivable_application_id    IN OUT NOCOPY NUMBER,
1337                    p_installment                  IN NUMBER,
1338                    p_applied_payment_schedule_id  IN OUT NOCOPY NUMBER,
1339                    p_apply_gl_date                OUT NOCOPY DATE,
1340                    p_return_status                OUT NOCOPY VARCHAR2
1341                    ) IS
1342 
1343 CURSOR c_pay_sched IS
1344 SELECT customer_trx_id, terms_sequence_number
1345 FROM   ar_payment_schedules
1346 WHERE  payment_schedule_id = p_applied_payment_schedule_id and
1347        payment_schedule_id >0 and
1348        class in ('INV','DM');  -- Should we include BR, DEP, GUAR, CB?
1349 
1350 
1351 l_cm_cust_trx_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1352 l_inv_cust_trx_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1353 l_applied_ps_id_return_status    VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1354 l_inv_customer_trx_id    NUMBER;
1355 l_applied_payment_schedule_id NUMBER;
1356 l_ra_app_ps_id                NUMBER;
1357 l_receivable_application_id   NUMBER;
1358 l_installment                 NUMBER(15);
1359 l_ra_return_status            VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1360 
1361 BEGIN
1362 
1363 
1364   IF PG_DEBUG in ('Y', 'C') THEN
1365      arp_util.debug('Default_unapp_ids ()+');
1366   END IF;
1367   p_return_status := FND_API.G_RET_STS_SUCCESS ;
1368 
1369   --Step 1: Get a valid value for the CM customer_trx_id
1370   IF p_cm_trx_number IS NOT NULL THEN
1371     Default_customer_trx_id(p_cm_customer_trx_id ,
1372                             p_cm_trx_number ,
1373                             l_cm_cust_trx_return_status);
1374   END IF;
1375 
1376   -- Step 2: Get a valid value for DM customer_trx_id
1377   IF  p_inv_trx_number  IS NOT NULL THEN
1378     default_customer_trx_id(p_inv_customer_trx_id ,
1379                             p_inv_trx_number ,
1380                             l_inv_cust_trx_return_status);
1381   END IF;
1382 
1383 
1384   -- Step 3: Get payment schedule info
1385   --if error is raised in deriving the customer_trx_id from the trx_number,
1386   --do not process the applied_payment_schedule_id any further.
1387   IF l_cm_cust_trx_return_status= FND_API.G_RET_STS_SUCCESS AND
1388      l_inv_cust_trx_return_status= FND_API.G_RET_STS_SUCCESS THEN
1389     IF  p_applied_payment_schedule_id IS NOT NULL THEN
1393             l_installment;
1390       OPEN c_pay_sched;
1391       FETCH c_pay_sched
1392        INTO l_inv_customer_trx_id,
1394       IF c_pay_sched%NOTFOUND THEN
1395         FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
1396         FND_MSG_PUB.Add;
1397         p_return_status := FND_API.G_RET_STS_ERROR ;
1398       END IF;
1399       CLOSE c_pay_sched;
1400 
1401      IF  p_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1402         IF (nvl(p_inv_customer_trx_id,l_inv_customer_trx_id) <> l_inv_customer_trx_id OR
1403           nvl(p_installment,l_installment)  <>  l_installment) THEN
1404           FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_PS_ID_X_INVALID');
1405            FND_MSG_PUB.Add;
1406            p_return_status := FND_API.G_RET_STS_ERROR;
1407        ELSE
1408            p_inv_customer_trx_id := l_inv_customer_trx_id;
1409        END IF;
1410 
1411      END IF;
1412    ELSE -- p_applied_ayment_schedule_id is null
1413       IF p_inv_customer_trx_id IS NOT NULL THEN
1414         l_applied_payment_schedule_id :=
1415                       Get_trx_ps_id(p_inv_customer_trx_id,
1416                                     p_installment,
1417                                     l_applied_ps_id_return_status);
1418         p_applied_payment_schedule_id
1419                           :=l_applied_payment_schedule_id;
1420       END IF;
1421    END IF;
1422 
1423   END IF;
1424 
1425   -- Step 4: get related info for receivable_application_id
1426 
1427   IF p_receivable_application_id IS NOT NULL THEN
1428        get_ra_info(p_receivable_application_id,
1429                    l_ra_app_ps_id,
1430                    l_inv_customer_trx_id,
1431                    p_apply_gl_date,
1432                    l_ra_return_status);
1433 
1434       IF nvl( l_ra_app_ps_id,-99) <> nvl(p_applied_payment_schedule_id,
1435                                                     nvl( l_ra_app_ps_id,-99))
1436        THEN
1437         IF ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NOT NULL OR
1438            ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NOT NULL THEN
1439             FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_RA_ID_X_INVALID');
1440             FND_MSG_PUB.Add;
1441             p_return_status := FND_API.G_RET_STS_ERROR;
1442         ELSIF ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NOT NULL THEN
1443            FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_RA_ID_X_INVALID');
1444            FND_MSG_PUB.Add;
1445            p_return_status := FND_API.G_RET_STS_ERROR;
1446         END IF;
1447       ELSE
1448         p_applied_payment_schedule_id := l_ra_app_ps_id;
1449       END IF;
1450 
1451        IF nvl(l_inv_customer_trx_id,-99) <> nvl(p_inv_customer_trx_id,nvl(l_inv_customer_trx_id,-99)) THEN
1452         --Invalid receivable application identifier for the entered
1453         -- invoice customer trx id
1454          FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCPT_RA_ID_X_INVALID');
1455          FND_MSG_PUB.Add;
1456          p_return_status := FND_API.G_RET_STS_ERROR;
1457       ELSE
1458         p_inv_customer_trx_id := l_inv_customer_trx_id;
1459       END IF;
1460   ELSE --the user has not passed in the receivable application id
1461    --
1462    -- derive receivable_application_id
1463    --
1464    --If app_ps_id and the cash_receipt_id are not null then
1465    --get the default receivable_application_id which will be
1466    --used for defaulting or cross-validation
1467     IF p_cm_customer_trx_id IS NOT NULL AND
1468        p_applied_payment_schedule_id IS NOT NULL
1469      THEN
1470        --derive the receivable application id using the CM customer trx id
1471        --and the applied payment schedule id
1472                     default_ra_id(
1473                                   p_cm_customer_trx_id,
1474                                   p_applied_payment_schedule_id,
1475                                   p_apply_gl_date,
1476                                   l_receivable_application_id,
1477                                   l_ra_return_status);
1478               p_receivable_application_id := l_receivable_application_id;
1479     END IF;
1480 
1481   END IF;
1482 
1483 
1484 END default_unapp_ids;
1485 
1486 
1487 PROCEDURE Default_unapp_info(
1488                         p_receivable_application_id IN NUMBER,
1489                         p_apply_gl_date    IN  DATE,
1490                         p_cm_customer_trx_id  IN  NUMBER,
1491                         p_reversal_gl_date IN OUT NOCOPY DATE,
1492                         p_cm_gl_date  OUT NOCOPY DATE
1493                           ) IS
1494 l_cm_customer_trx_id   NUMBER(15);
1495 l_apply_gl_date        DATE;
1496 BEGIN
1497 
1498   IF PG_DEBUG in ('Y', 'C') THEN
1499      arp_util.debug('Default_unapp_info ()+');
1500   END IF;
1501 
1502   l_apply_gl_date := p_apply_gl_date;
1503   l_cm_customer_trx_id := p_cm_customer_trx_id;
1504 
1505   default_reversal_gl_date(p_receivable_application_id,
1506                            p_reversal_gl_date,
1507                            l_apply_gl_date,
1508                            l_cm_customer_trx_id);
1509 
1510   --default the cm gl date which is to be used later
1511   --in the validation of the reversal gl date.
1512     IF  p_cm_gl_date IS NULL AND
1513         l_cm_customer_trx_id IS NOT NULL
1514       THEN
1515        BEGIN
1516          SELECT gl_date
1517          INTO   p_cm_gl_date
1518          FROM   ar_payment_schedules
1519          WHERE  customer_trx_id  = l_cm_customer_trx_id;
1520        EXCEPTION
1521          WHEN no_data_found THEN
1522           null;
1523           IF PG_DEBUG in ('Y', 'C') THEN
1524              arp_util.debug('Default_unapp_info: ' || 'Could not get the cm_gl_date. ');
1525           END IF;
1526        END;
1527     END IF;
1528   IF PG_DEBUG in ('Y', 'C') THEN
1529      arp_util.debug('Default_unapp_info ()-');
1530   END IF;
1531 
1532 END default_unapp_info;
1533 
1534 PROCEDURE Validate_unapp_info(
1535                       p_cm_gl_date             IN DATE,
1536                       p_receivable_application_id   IN NUMBER,
1537                       p_reversal_gl_date            IN DATE,
1538                       p_apply_gl_date               IN DATE,
1539                       p_return_status               OUT NOCOPY VARCHAR2
1540                       ) IS
1541 l_rec_app_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1542 l_rev_gl_date_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1543 
1544 BEGIN
1545 
1546    p_return_status := FND_API.G_RET_STS_SUCCESS;
1547    IF PG_DEBUG in ('Y', 'C') THEN
1548       arp_util.debug('Validate_unapp_info ()+');
1549    END IF;
1550 
1551    --In case the user has entered the receivable application id
1552    -- as well as the receipt and transaction info, then the cross validation
1553    --is done at the defaulting phase itself so no need to do that here.
1554                   Validate_ra_id(
1555                                 p_receivable_application_id,
1556                                 'APP',
1557                                l_rec_app_return_status);
1558 
1559      Validate_rev_gl_date( p_reversal_gl_date ,
1560                                 p_apply_gl_date ,
1561                                 p_cm_gl_date,
1562                                 l_rev_gl_date_return_status
1563                                   );
1564 END validate_unapp_info;
1565 
1566 END AR_CM_VAL_PVT;