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.2.12020000.4 2013/03/06 06:03:02 kgnanase ship $ */
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                NVL(cm.paying_customer_id, cm.bill_to_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
320           SELECT rel.related_cust_account_id
321           FROM ar_paying_relationships_v rel,
322                hz_cust_accounts acc
323           WHERE rel.party_id = acc.party_id
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;
474 
475 PROCEDURE  validate_apply_gl_date(p_apply_gl_date IN DATE,
476                            p_inv_gl_date IN DATE,
477                            p_cm_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 	 --Int'l Calendar Project
512          FND_MESSAGE.set_token( 'GL_DATE', fnd_date.date_to_chardate(p_apply_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
513          FND_MSG_PUB.Add;
514           p_return_status := FND_API.G_RET_STS_ERROR;
515        END IF;
516 
517 
518     END IF;
519 
520     IF PG_DEBUG in ('Y', 'C') THEN
521        arp_util.debug('Validate_apply_gl_date ()-');
522     END IF;
523 
524 
525 END validate_apply_gl_date;
526 
527 PROCEDURE validate_amount_applied(
528                       p_amount_applied IN NUMBER,
529                       p_applied_payment_schedule_id IN NUMBER,
530                       p_customer_trx_line_id IN NUMBER,
531                       p_inv_line_amount      IN NUMBER,
532                       p_creation_sign       IN VARCHAR2 ,
533                       p_allow_overappln_flag IN VARCHAR2,
534                       p_natural_appln_only_flag IN VARCHAR2,
535                       p_amount_due_remaining IN NUMBER,
536                       p_return_status OUT NOCOPY VARCHAR2
537                        )
538 IS
539 
540 BEGIN
541 
542    IF PG_DEBUG in ('Y', 'C') THEN
543       arp_util.debug('Validate_amount_applied ()+');
544    END IF;
545    p_return_status := FND_API.G_RET_STS_SUCCESS;
546 
547 
548   IF p_amount_applied IS NULL THEN
549      p_return_status := FND_API.G_RET_STS_ERROR;
550      FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
551      FND_MSG_PUB.Add;
552      return;
553   END IF;
554 
555 
556   -- Should we check for natural application here???
557 
558   IF PG_DEBUG in ('Y', 'C') THEN
559      arp_util.debug('Validate_amount_applied ()-');
560   END IF;
561 
562 END validate_amount_applied;
563 
564 
565 
566 FUNCTION Get_trx_ps_id(p_inv_customer_trx_id IN OUT NOCOPY NUMBER,
567                        p_installment     IN NUMBER,
568                        p_return_status   OUT NOCOPY VARCHAR2
569                        ) RETURN NUMBER IS
570 l_inv_ps_id  NUMBER;
571 
572 BEGIN
573   IF PG_DEBUG in ('Y', 'C') THEN
574      arp_util.debug('Get_trx_ps_id ()+');
575   END IF;
576   p_return_status := FND_API.G_RET_STS_SUCCESS;
577 
578    IF p_installment IS NOT NULL THEN
579         BEGIN
580          SELECT ps.payment_schedule_id
581          INTO   l_inv_ps_id
582          FROM   ra_customer_trx ct,
583                 ar_payment_schedules ps
584          WHERE  ct.customer_trx_id = p_inv_customer_trx_id
585            AND  ct.customer_trx_id = ps.customer_trx_id
586            --AND  ps.class  IN ('CB','CM','DEP','DM','INV','BR')
587            AND  ps.terms_sequence_number = p_installment
588                 ;
589          EXCEPTION
590           WHEN no_data_found THEN
591             IF ar_cm_api_pub.Original_cm_unapp_info.inv_customer_trx_id IS NOT NULL THEN
592               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_ID_INST_INVALID');
593               FND_MSG_PUB.Add;
594               p_return_status := FND_API.G_RET_STS_ERROR;
595             ELSIF ar_cm_api_pub.Original_cm_unapp_info.inv_trx_number IS NOT NULL THEN
596               FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_NUM_INST_INVALID');
597               FND_MSG_PUB.Add;
598               p_return_status := FND_API.G_RET_STS_ERROR;
599             END IF;
600 
601          END;
602    ELSE
603       --if the user has not entered the installment then if the transaction
604       --has only one installment, get the ps_id for that installment
605          BEGIN
606            SELECT ps.payment_schedule_id
607            INTO   l_inv_ps_id
608            FROM   ra_customer_trx ct,
609                   ar_payment_schedules ps
610            WHERE  ct.customer_trx_id = p_inv_customer_trx_id
611              AND  ct.customer_trx_id = ps.customer_trx_id
612              --AND  ps.class  IN ('CB','CM','DEP','DM','INV','BR')
613                   ;
614          EXCEPTION
615            WHEN no_data_found THEN
616              FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
617              FND_MSG_PUB.Add;
618              p_return_status := FND_API.G_RET_STS_ERROR;
619            WHEN too_many_rows THEN
620              FND_MESSAGE.SET_NAME('AR','AR_RAPI_INSTALL_NULL');
621              FND_MSG_PUB.Add;
622              p_return_status := FND_API.G_RET_STS_ERROR;
623          END;
624 
625 
626   END IF;
627 
628  RETURN(l_inv_ps_id);
629 
630  IF PG_DEBUG in ('Y', 'C') THEN
631     arp_util.debug('Get_trx_ps_id ()-');
632  END IF;
633 
634 EXCEPTION
635  WHEN others THEN
636    IF PG_DEBUG in ('Y', 'C') THEN
637       arp_util.debug('EXCEPTION: Get_trx_ps_id()');
638    END IF;
639    raise;
640 END Get_trx_ps_id;
641 
642 PROCEDURE get_ra_info(
643                                    p_ra_id           IN NUMBER,
644                                    p_ra_app_ps_id    OUT NOCOPY NUMBER,
645                                    p_inv_customer_trx_id OUT NOCOPY NUMBER,
646                                    p_apply_gl_date   OUT NOCOPY DATE,
647                                    p_return_status   OUT NOCOPY VARCHAR2
648                                        ) IS
649 CURSOR rec_apppln IS
650 SELECT ra.applied_customer_trx_id, ra.applied_payment_schedule_id, ra.gl_date
651 FROM   ar_receivable_applications ra,
652        ar_payment_schedules ps
653 WHERE  ra.applied_payment_schedule_id = ps.payment_schedule_id
654   AND  ra.receivable_application_id = p_ra_id
655   AND  ra.display = 'Y'
656   AND  ra.status = 'APP'
657   AND  ps.reserved_value IS NULL
658   AND  ps.reserved_type IS NULL;
659 
660 BEGIN
661 
662   IF PG_DEBUG in ('Y', 'C') THEN
663      arp_util.debug('get_ra_info ()+');
664   END IF;
665 
666   p_return_status := FND_API.G_RET_STS_SUCCESS;
667 
668    OPEN rec_apppln;
669    FETCH rec_apppln INTO p_inv_customer_trx_id, p_ra_app_ps_id,p_apply_gl_date;
670        IF rec_apppln%NOTFOUND  THEN
671          FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
672          FND_MSG_PUB.Add;
673          p_return_status := FND_API.G_RET_STS_ERROR;
674        END IF;
675     CLOSE rec_apppln;
676 
677 
678   IF PG_DEBUG in ('Y', 'C') THEN
679      arp_util.debug('Get_ra_info ()-');
680      arp_util.debug('Applied PS ID: '|| p_ra_app_ps_id ||
681                     'Applied Trx ID: '|| p_inv_customer_trx_id ||
682                     'Apply GL date: '|| p_apply_gl_date);
683   END IF;
684 
685 
686 
687 END get_ra_info;
688 
689 PROCEDURE default_ra_id(
690                            p_cm_customer_trx_id          IN NUMBER,
691                            p_applied_payment_schedule_id IN NUMBER,
692                            p_apply_gl_date               OUT NOCOPY DATE,
693                            p_receivable_application_id   OUT NOCOPY NUMBER,
694                            p_return_status               OUT NOCOPY VARCHAR2
695                            )  IS
696 
697 BEGIN
698   IF PG_DEBUG in ('Y', 'C') THEN
699      arp_util.debug('Default_ra_id ()+');
700   END IF;
701   p_return_status := FND_API.G_RET_STS_SUCCESS;
702   IF p_cm_customer_trx_id IS NOT NULL AND
703      p_applied_payment_schedule_id IS NOT NULL
704    THEN
705       SELECT receivable_application_id, gl_date
706       INTO   p_receivable_application_id, p_apply_gl_date
707       FROM   ar_receivable_applications ra
708       WHERE  ra.customer_trx_id = p_cm_customer_trx_id
709         AND  ra.applied_payment_schedule_id = p_applied_payment_schedule_id
710         AND  ra.display = 'Y'
711         AND  ra.status = 'APP'
712         AND  ra.application_type = 'CM';
713 
714    END IF;
715   IF PG_DEBUG in ('Y', 'C') THEN
716      arp_util.debug('Default_ra_id ()+');
717   END IF;
718 EXCEPTION
719  WHEN no_data_found THEN
720   FND_MESSAGE.SET_NAME('AR','AR_CMAPI_CM_NOT_APP_TO_INV');
721   FND_MSG_PUB.Add;
722   p_return_status := FND_API.G_RET_STS_ERROR;
723    raise;
724  WHEN others THEN
725    IF PG_DEBUG in ('Y', 'C') THEN
726       arp_util.debug('Default_ra_id: ' || 'EXCEPTION: Get_ra_id()');
727    END IF;
728    raise;
729 END default_ra_id;
730 
731 PROCEDURE default_reversal_gl_date(
732                         p_receivable_application_id IN NUMBER,
733                         p_reversal_gl_date IN OUT NOCOPY DATE,
734                         p_apply_gl_date IN OUT NOCOPY DATE,
735                         p_cm_customer_trx_id IN OUT NOCOPY NUMBER
736                                    ) IS
737 l_apply_gl_date     DATE;
738 l_default_gl_date   DATE;
739 l_defaulting_rule_used  VARCHAR2(100);
740 l_error_message  VARCHAR2(240);
741 BEGIN
742   IF PG_DEBUG in ('Y', 'C') THEN
743      arp_util.debug('Default_reversal_gl_date ()+');
744   END IF;
745 
746     l_apply_gl_date := p_apply_gl_date;
747 
748     IF p_receivable_application_id IS NOT NULL THEN
749      IF p_apply_gl_date  IS NULL THEN
750       --get the gl_date for the application
751       BEGIN
752         SELECT gl_date, customer_trx_id
753           INTO   l_apply_gl_date, p_cm_customer_trx_id
754           FROM   ar_receivable_applications
755          WHERE  receivable_application_id =
756                    p_receivable_application_id;
757        EXCEPTION
758          WHEN OTHERS THEN
759            NULL;
760        END;
761      END IF;
762 
763       IF p_reversal_gl_date is null THEN
764          IF (arp_util.validate_and_default_gl_date(
765                 nvl(l_apply_gl_date,trunc(sysdate)),
766                 NULL,
767                 l_apply_gl_date,
768                 NULL,
769                 NULL,
770                 NULL,
771                 NULL,
772                 NULL,
773                 'N',
774                 NULL,
775                 arp_global.set_of_books_id,
776                 222,
777                 l_default_gl_date,
778                 l_defaulting_rule_used,
779                 l_error_message) = TRUE) THEN
780 
781            p_reversal_gl_date := l_default_gl_date;
782          ELSE
783          --we were not able to default the gl_date put the message
784          --here on the stack, but the return status will be set
785          --to FND_API.G_RET_STS_ERROR in the validation phase.
786            FND_MESSAGE.SET_NAME('AR', 'GENERIC_MESSAGE');
787            FND_MESSAGE.SET_TOKEN('GENERIC_TEXT', l_error_message);
788            FND_MSG_PUB.Add;
789          END IF;
790       END IF;
791     END IF;
792   IF PG_DEBUG in ('Y', 'C') THEN
793      arp_util.debug('Default_reversal_gl_date ()-');
794   END IF;
795 EXCEPTION
796  When others THEN
797     IF PG_DEBUG in ('Y', 'C') THEN
798        arp_util.debug('EXCEPTION: Default_reversal_gl_date()');
799     END IF;
800     raise;
801 END Default_reversal_gl_date;
802 
803 
804 PROCEDURE Validate_ra_id(
805                        p_receivable_application_id  IN  NUMBER,
806                        p_application_type  IN VARCHAR2,
807                        p_return_status OUT NOCOPY VARCHAR2) IS
808 l_valid NUMBER;
809 BEGIN
810   p_return_status := FND_API.G_RET_STS_SUCCESS;
811   IF PG_DEBUG in ('Y', 'C') THEN
812      arp_util.debug('Validate_ra_id ()+');
813   END IF;
814    --validate the receivable application id only if it was passed in
815    --directly as a parameter. No need to validate if it was derived.
816    IF p_receivable_application_id IS NOT NULL AND
817       ar_cm_api_pub.original_cm_unapp_info.receivable_application_id IS NOT NULL
818      THEN
819        SELECT count(*)
820        INTO   l_valid
821        FROM   AR_RECEIVABLE_APPLICATIONS ra
822        WHERE  ra.receivable_application_id = p_receivable_application_id
823          and  ra.display = 'Y'
824          and  ra.status = p_application_type
825          and  ra.application_type = 'CM';
826 
827      IF  l_valid = 0 THEN
828         FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
829         FND_MSG_PUB.Add;
830         p_return_status := FND_API.G_RET_STS_ERROR;
831      END IF;
832 
833    ELSIF p_receivable_application_id IS NULL  THEN
834     IF ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS NULL AND
835        ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS NULL AND
836        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NULL AND
837        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NULL AND
838        ar_cm_api_pub.original_cm_unapp_info.inv_trx_number  IS NULL
839      THEN
840      --receivable application id is null
841        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_NULL');
842        FND_MSG_PUB.Add;
843        p_return_status := FND_API.G_RET_STS_ERROR;
844     ELSIF ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NULL AND
845        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NULL AND
846        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NULL AND
847        (ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS NOT NULL OR
848        ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS NOT NULL)
849      THEN
850      --the transaction was not specified
851         FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_NULL');
852         FND_MSG_PUB.Add;
853         p_return_status := FND_API.G_RET_STS_ERROR;
854     ELSIF (ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NOT NULL OR
855        ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NOT NULL OR
856        ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NOT NULL) AND
857        ar_cm_api_pub.original_cm_unapp_info.cm_customer_trx_id IS  NULL AND
858        ar_cm_api_pub.original_cm_unapp_info.cm_trx_number IS  NULL
859     THEN
860     --the credit memo was not specified
861         FND_MESSAGE.SET_NAME('AR','AR_CMAPI_CM_TRX_ID_NULL');
862         FND_MSG_PUB.Add;
863         p_return_status := FND_API.G_RET_STS_ERROR;
864     END IF;
865 
866    END IF;
867   IF PG_DEBUG in ('Y', 'C') THEN
868      arp_util.debug('Validate_receivable_appln_id ()-');
869   END IF;
870 EXCEPTION
871  WHEN others THEN
872    IF PG_DEBUG in ('Y', 'C') THEN
873       arp_util.debug('EXCEPTION: Validate_ra_id(-)');
874    END IF;
875    raise;
876 
877 END Validate_ra_id;
878 
879 
880 PROCEDURE Validate_Rev_gl_date(p_reversal_gl_date IN DATE,
881                                p_apply_gl_date  IN DATE,
882                                p_cm_gl_date IN DATE,
883                                p_return_status  OUT NOCOPY VARCHAR2
884                                ) IS
885 
886 BEGIN
887     IF PG_DEBUG in ('Y', 'C') THEN
888        arp_util.debug('Validate_Rev_gl_date ()+');
889     END IF;
890     p_return_status := FND_API.G_RET_STS_SUCCESS;
891   IF p_reversal_gl_date IS NOT NULL THEN
892 
893     IF  p_reversal_gl_date < NVL(p_apply_gl_date,p_reversal_gl_date)  THEN
894         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_APP_GL_DATE');
895 	--Int'l Calendar Project
896         FND_MESSAGE.SET_TOKEN('GL_DATE', fnd_date.date_to_chardate(p_apply_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
897         FND_MSG_PUB.Add;
898         p_return_status := FND_API.G_RET_STS_ERROR;
899     END IF;
900    IF p_reversal_gl_date < nvl(p_cm_gl_date,p_reversal_gl_date) THEN
901         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_CM_GL_DATE');
902 	--Int'l Calendar Project
903         FND_MESSAGE.SET_TOKEN('GL_DATE', fnd_date.date_to_chardate(p_cm_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
904         FND_MSG_PUB.Add;
905         p_return_status := FND_API.G_RET_STS_ERROR;
906     END IF;
907 
908     IF ( NOT arp_util.is_gl_date_valid(p_reversal_gl_date)) THEN
909         FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
910 	--Int'l Calendar Project
911         FND_MESSAGE.set_token( 'GL_DATE', fnd_date.date_to_chardate(p_reversal_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
912         FND_MSG_PUB.Add;
913         p_return_status := FND_API.G_RET_STS_ERROR;
914     END IF;
915 
916   ELSE
917       FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_GL_DATE_NULL');
918       FND_MSG_PUB.Add;
919       p_return_status := FND_API.G_RET_STS_ERROR;
920       IF PG_DEBUG in ('Y', 'C') THEN
921          arp_util.debug('Validate_Rev_gl_date: ' || 'The Reversal gl date is null ');
922       END IF;
923   END IF;
924 
925   IF PG_DEBUG in ('Y', 'C') THEN
926      arp_util.debug('Validate_Rev_gl_date ()+');
927   END IF;
928 EXCEPTION
929   WHEN others THEN
930       IF PG_DEBUG in ('Y', 'C') THEN
931          arp_util.debug('EXCEPTION: Validate_rev_gl_date() ');
932       END IF;
933       raise;
934 END Validate_Rev_gl_date;
935 
936 -- PUBLIC PROCEDURES/FUNCTIONS
937 
938 PROCEDURE default_app_ids(
939                 p_cm_customer_trx_id   IN OUT NOCOPY NUMBER,
940                 p_cm_trx_number        IN VARCHAR2,
941                 p_inv_customer_trx_id  IN OUT NOCOPY NUMBER,
942                 p_inv_trx_number       IN VARCHAR2,
943                 p_inv_customer_trx_line_id  IN OUT NOCOPY NUMBER,
944                 p_inv_line_number          IN NUMBER,
945                 p_installment       IN OUT NOCOPY NUMBER,
946                 p_applied_payment_schedule_id   IN NUMBER,
947                 p_return_status     OUT NOCOPY VARCHAR2 )
948 
949 IS
950 
951 
952 CURSOR c_pay_sched IS
953 SELECT customer_trx_id, terms_sequence_number
954 FROM   ar_payment_schedules
955 WHERE  payment_schedule_id = p_applied_payment_schedule_id and
956        payment_schedule_id >0 and
957        class in ('INV','DM');  -- Should we include DM, DEP, GUAR, CB?
958 
959 CURSOR c_trx_type(c_customer_trx_id number ) IS
960  SELECT tt.type
961  FROM   ra_cust_trx_types tt, ra_customer_trx	ct
962  WHERE  ct.customer_trx_id =  c_customer_trx_id
963  and tt.cust_trx_type_id=ct.cust_trx_type_id;
964 
965 l_class varchar2(20);
966 
967 l_inv_customer_trx_id  NUMBER;
968 l_installment      NUMBER;
969 p_inv_return_status_lines  VARCHAR2(100);
970 
971 BEGIN
972 
973   IF PG_DEBUG in ('Y', 'C') THEN
974     arp_util.debug('default_app_ids(+)');
975   END IF;
976 
977   p_return_status := FND_API.G_RET_STS_SUCCESS;
978 
979   -- Step 1: Get CM customer_trx_id and validate.
980   IF  p_cm_trx_number  IS NOT NULL THEN
981     default_customer_trx_id(p_cm_customer_trx_id ,
982                             p_cm_trx_number ,
983                             p_return_status);
984   END IF;
985 
986   OPEN c_trx_type(p_cm_customer_trx_id);
987   FETCH c_trx_type into l_class;
988   CLOSE c_trx_type;
989 
990   IF (l_class <> 'CM')    then
991      FND_MESSAGE.SET_NAME('AR','AR_CMAPI_CM_TRX_ID_INVALID');
992      FND_MSG_PUB.Add;
993      p_return_status := FND_API.G_RET_STS_ERROR ;
994   END IF;
995 
996   -- Step 2: Get DM/INV customer_trx_id and validate
997   IF  p_inv_trx_number  IS NOT NULL THEN
998     default_customer_trx_id(p_inv_customer_trx_id ,
999                             p_inv_trx_number ,
1000                             p_return_status);
1001   END IF;
1002 
1003   OPEN c_trx_type(p_inv_customer_trx_id);
1004   FETCH c_trx_type into l_class;
1005   CLOSE c_trx_type;
1006 
1007   If (l_class not in ( 'INV','DM') )   then
1008      FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
1009      FND_MSG_PUB.Add;
1010      p_return_status := FND_API.G_RET_STS_ERROR ;
1011   end if;
1012 
1013    -- Step 3: Get a valid value for DM customer trx line id
1014    default_customer_trx_line_id(p_inv_customer_trx_id,
1015                                  p_inv_customer_trx_line_id,
1016                                  p_inv_line_number,
1017                                  p_inv_return_status_lines);
1018 
1019    -- Step 4: Get inv_customer_trx_id from applied_payment_schedule_id and
1020    --         installment
1021 
1022    IF p_applied_payment_schedule_id IS NOT NULL THEN
1023      OPEN c_pay_sched;
1024      FETCH c_pay_sched
1025       INTO l_inv_customer_trx_id,
1026            l_installment;
1027      IF c_pay_sched%NOTFOUND THEN
1028        FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
1029        FND_MSG_PUB.Add;
1030        p_return_status := FND_API.G_RET_STS_ERROR ;
1031      END IF;
1032      CLOSE c_pay_sched;
1033 
1034      IF  p_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1035       IF nvl(p_inv_customer_trx_id,nvl(l_inv_customer_trx_id,-99)) = nvl(l_inv_customer_trx_id,-99) THEN
1036         p_inv_customer_trx_id := l_inv_customer_trx_id;
1037       END IF;
1038       IF nvl(p_installment,nvl(l_installment,-99)) = nvl(l_installment,-99) THEN
1039          p_installment := l_installment;
1040       END IF;
1041     END IF;
1042    ELSE -- p_payment_schedule_id is null
1043      --default the installment from the customer_trx_id if not entered
1044      IF p_inv_customer_trx_id IS NOT NULL THEN
1045        IF p_installment IS NULL THEN
1046          BEGIN
1047           SELECT terms_sequence_number
1048           INTO   p_installment
1049           FROM   ar_payment_schedules
1050           WHERE  customer_trx_id = p_inv_customer_trx_id;
1051          EXCEPTION
1052           WHEN no_data_found THEN
1053            FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
1054            FND_MSG_PUB.Add;
1055            p_return_status := FND_API.G_RET_STS_ERROR;
1056           WHEN too_many_rows THEN
1057            FND_MESSAGE.SET_NAME('AR','AR_RAPI_INSTALL_NULL');
1058            FND_MSG_PUB.Add;
1059            p_return_status := FND_API.G_RET_STS_ERROR;
1060          END;
1061        END IF;
1062      END IF;
1063    END IF;
1064 
1065 
1066    IF (p_inv_return_status_lines = FND_API.G_RET_STS_ERROR OR
1067        p_return_status = FND_API.G_RET_STS_ERROR) THEN
1068        p_return_status := FND_API.G_RET_STS_ERROR;
1069   END IF;
1070 
1071   IF PG_DEBUG in ('Y', 'C') THEN
1072      arp_util.debug('Default_app_ids: ' || 'Defaulted Value for the application ids');
1073      arp_util.debug('Default_app_ids: ' || 'p_cm_customer_trx_id             :'||to_char(p_cm_customer_trx_id));
1074      arp_util.debug('Default_app_ids: ' || 'p_inv_customer_trx_id             :'||to_char(p_inv_customer_trx_id));
1075      arp_util.debug('Default_appln_ids: ' || 'p_installment                 :'||to_char(p_installment));
1076      arp_util.debug('Default_app_ids: ' || 'p_applied_payment_schedule_id :'||to_char(p_applied_payment_schedule_id));
1077      arp_util.debug('Default_app_ids ()- ');
1078   END IF;
1079 EXCEPTION
1080  WHEN others THEN
1081    IF PG_DEBUG in ('Y', 'C') THEN
1082       arp_util.debug('EXCEPTION: Default_appln_ids()');
1083    END IF;
1084    RAISE;
1085 
1086 END Default_app_ids;
1087 
1088 
1089 PROCEDURE default_app_info(
1090               p_cm_customer_trx_id  IN NUMBER,
1091               p_inv_customer_trx_id IN  NUMBER,
1092               p_inv_customer_trx_line_id  IN NUMBER,
1093               p_show_closed_invoices  IN VARCHAR2,
1094               p_installment         IN OUT NOCOPY NUMBER,
1095               p_apply_date           IN OUT NOCOPY DATE,
1096               p_apply_gl_date        IN OUT NOCOPY DATE,
1097               p_amount_applied       IN OUT NOCOPY NUMBER,
1098               p_applied_payment_schedule_id IN OUT NOCOPY NUMBER,
1099               p_cm_gl_date          OUT NOCOPY DATE,
1100               p_cm_trx_date         OUT NOCOPY DATE,
1101               p_cm_amount_rem       OUT NOCOPY NUMBER,
1102               p_cm_currency_code    OUT NOCOPY VARCHAR2,
1103               p_inv_due_date         OUT NOCOPY DATE,
1104               p_inv_currency_code    OUT NOCOPY VARCHAR2,
1105               p_inv_amount_rem       OUT NOCOPY NUMBER,
1106               p_inv_trx_date         OUT NOCOPY DATE,
1107               p_inv_gl_date          OUT NOCOPY DATE,
1108               p_allow_overappln_flag OUT NOCOPY VARCHAR2,
1109               p_natural_appln_only_flag  OUT NOCOPY VARCHAR2,
1110               p_creation_sign        OUT NOCOPY VARCHAR2,
1111               p_cm_payment_schedule_id  OUT NOCOPY NUMBER,
1112               p_inv_line_amount       OUT NOCOPY NUMBER,
1113               p_return_status    OUT NOCOPY VARCHAR2
1114                )
1115 IS
1116 
1117 l_cm_gl_date      DATE;
1118 l_cm_amount_rem   NUMBER;
1119 l_cm_trx_date     DATE;
1120 l_cm_ps_id        NUMBER;
1121 l_cm_currency_code     fnd_currencies.currency_code%TYPE;
1122 l_cm_customer_id      NUMBER;
1123 l_cm_info_return_status  VARCHAR2(1);
1124 
1125 l_inv_customer_id    NUMBER;  --customer on transaction
1126 l_inv_cust_trx_type_id     NUMBER;
1127 l_inv_due_date             DATE;
1128 l_inv_trx_date             DATE;
1129 l_inv_gl_date              DATE;
1130 l_allow_overappln_flag     VARCHAR2(1);
1131 l_natural_appln_only_flag  VARCHAR2(1);
1132 l_creation_sign            VARCHAR2(1);
1133 --l_applied_payment_schedule_id  NUMBER;
1134 l_app_gl_date              DATE;
1135 l_inv_amount_rem           NUMBER;
1136 l_trx_info_return_status   VARCHAR2(1);
1137 l_inv_line_amount           NUMBER;
1138 
1139 l_inv_currency_code     fnd_currencies.currency_code%TYPE;
1140 l_def_amt_return_status VARCHAR2(1);
1141 
1142 l_return  BOOLEAN;
1143 l_default_gl_date  DATE;
1144 l_defaulting_rule_used VARCHAR2(100);
1145 l_error_message  VARCHAR2(200);
1146 
1147 BEGIN
1148 
1149    IF PG_DEBUG in ('Y', 'C') THEN
1150        arp_util.debug('Default_app_info ()+');
1151    END IF;
1152 
1153    p_return_status := FND_API.G_RET_STS_SUCCESS;
1154 
1155    -- Step 1: Default CM Info:
1156    default_cm_info(
1157           p_cm_customer_trx_id,
1158           l_cm_gl_date,
1159           l_cm_amount_rem,
1160           l_cm_trx_date,
1161           l_cm_ps_id,
1162           l_cm_currency_code,
1163           l_cm_customer_id,
1164           l_cm_info_return_status );
1165 
1166    IF PG_DEBUG in ('Y', 'C') THEN
1167          arp_util.debug('Default_app_info: ' || 'Default_CM_Info return status = '||l_cm_info_return_status);
1168    END IF;
1169 
1170    -- Step 2: Default DM info
1171 
1172    IF l_cm_info_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1173       Default_Trx_Info(
1174             p_inv_customer_trx_id     ,
1175             p_inv_customer_trx_line_id ,
1176             p_show_closed_invoices     ,
1177             l_cm_gl_date               ,
1178             l_cm_customer_id           ,
1179             l_cm_currency_code         ,
1180             l_cm_ps_id                 ,
1181             l_cm_trx_date              ,
1182             --- Out variables
1183             l_inv_customer_id          , --customer on transaction
1184             l_inv_cust_trx_type_id     ,
1185             l_inv_due_date             ,
1186             l_inv_trx_date             ,
1187             l_inv_gl_date              ,
1188             l_allow_overappln_flag     ,
1189             l_natural_appln_only_flag  ,
1190             l_creation_sign            ,
1191             p_applied_payment_schedule_id  ,
1192             l_app_gl_date              , --this is the application gl_date
1193             p_installment              ,
1194             l_inv_amount_rem             ,
1195             l_inv_currency_code        ,
1196             l_trx_info_return_status
1197       );
1198 
1199 
1200    END IF;
1201 
1202    IF PG_DEBUG in ('Y', 'C') THEN
1203       arp_util.debug('Default_app_info: ' || 'Default trx info return status = '||l_trx_info_return_status);
1204       arp_util.debug('Applied PS ID : ' || p_applied_payment_schedule_id);
1205    END IF;
1206 
1207 
1208    -- Step 3: Default apply date
1209 
1210     IF p_apply_date IS NULL THEN
1211       p_apply_date := GREATEST(sysdate,
1212                                GREATEST(NVL(l_cm_trx_date,sysdate),
1213                                         NVL(l_inv_trx_date,sysdate)));
1214     END IF;
1215 
1216 
1217    -- Step 4: Default GL Date
1218 
1219    IF p_apply_gl_date IS NULL THEN
1220       l_return :=
1221               arp_util.validate_and_default_gl_date(
1222                   gl_date                => l_app_gl_date,
1223                   trx_date               => null,
1224                   validation_date1       => null,
1225                   validation_date2       => null,
1226                   validation_date3       => null,
1227                   default_date1          => l_app_gl_date,
1228                   default_date2          => null,
1229                   default_date3          => null,
1230                   p_allow_not_open_flag  => 'N',
1231                   p_invoicing_rule_id    => null,
1232                   p_set_of_books_id      => arp_global.set_of_books_id,
1233                   p_application_id       => 222,
1234                   default_gl_date        => l_default_gl_date ,
1235                   defaulting_rule_used   => l_defaulting_rule_used,
1236                   error_message          => l_error_message);
1237 
1238              IF l_return = TRUE  THEN
1239                p_apply_gl_date := l_default_gl_date;
1240              END IF;
1241 
1242     END IF;
1243 
1244 
1245    -- Step 5: Default amount applied
1246    default_amt_applied(
1247                  l_inv_currency_code ,
1248                  l_cm_currency_code  ,
1249                  l_cm_amount_rem        ,
1250                  l_inv_amount_rem       ,
1251                  p_amount_applied    ,
1252                  l_def_amt_return_status
1253      );
1254 
1255 
1256               p_cm_gl_date         := l_cm_gl_date;
1257               p_cm_trx_date        := l_cm_trx_date;
1258               p_cm_amount_rem      := l_cm_amount_rem;
1259               p_cm_currency_code   := l_cm_currency_code;
1260               p_inv_due_date       := l_inv_due_date;
1261               p_inv_currency_code  := l_inv_currency_code;
1262               p_inv_amount_rem      := l_inv_amount_rem;
1263               p_inv_trx_date       := l_inv_trx_date;
1264               p_inv_gl_date        := l_inv_gl_date;
1265               p_allow_overappln_flag := l_allow_overappln_flag;
1266               p_natural_appln_only_flag  := l_natural_appln_only_flag;
1267               p_creation_sign        := l_creation_sign;
1268               p_cm_payment_schedule_id  := l_cm_ps_id;
1269               p_inv_line_amount       := l_inv_line_amount;
1270 
1271 
1272 
1273     IF PG_DEBUG in ('Y', 'C') THEN
1274       arp_util.debug('Default_appl_info: ' || 'Default amount return status :'||l_def_amt_return_status );
1275     END IF;
1276 
1277 
1278 END default_app_info;
1279 
1280 
1281 PROCEDURE validate_app_info(
1282                       p_apply_date   IN DATE,
1283                       p_cm_trx_date  IN DATE,
1284                       p_inv_trx_date IN DATE,
1285                       p_apply_gl_date IN DATE,
1286                       p_cm_gl_date    IN DATE,
1287                       p_inv_gl_date   IN DATE,
1288                       p_amount_applied IN NUMBER,
1289                       p_applied_payment_schedule_id IN NUMBER,
1290                       p_customer_trx_line_id  IN NUMBER,
1291                       p_inv_line_amount   IN NUMBER,
1292                       p_creation_sign   IN VARCHAR2,
1293                       p_allow_overappln_flag  IN VARCHAR2,
1294                       p_natural_appln_only_flag  IN VARCHAR2,
1295                       p_cm_amount_rem    IN NUMBER,
1296                       p_inv_amount_rem   IN NUMBER,
1297                       p_cm_currency_code IN VARCHAR2,
1298                       p_inv_currency_code IN VARCHAR2,
1299                       p_return_status     OUT NOCOPY VARCHAR2
1300      ) IS
1301 
1302 l_gl_date_return_status  VARCHAR2(1);
1303 l_amt_applied_return_status VARCHAR2(1);
1304 l_apply_date_return_status   VARCHAR2(1);
1305 
1306 
1307 BEGIN
1308 
1309     -- Validations of cm_customer_trx_id, inv_customer_trx_id,
1310     -- applied_payment_schedule_id are done in defaulting routines
1311 
1312     IF PG_DEBUG in ('Y', 'C') THEN
1313        arp_util.debug('Validate_App_info ()+');
1314     END IF;
1315 
1316     p_return_status := FND_API.G_RET_STS_SUCCESS;
1317 
1318     validate_apply_date(p_apply_date,
1319                          p_inv_trx_date,
1320                          p_cm_trx_date,
1321                          l_apply_date_return_status
1322                          );
1323 
1324     validate_apply_gl_date(p_apply_gl_date ,
1325                            p_inv_gl_date ,
1326                            p_cm_gl_date  ,
1327                            l_gl_date_return_status
1328                                  );
1329 
1330     IF PG_DEBUG in ('Y', 'C') THEN
1331       arp_util.debug('Validate_Application_info: ' || 'Apply gl_date return status :'||l_gl_date_return_status);
1332    END IF;
1333         validate_amount_applied(
1334                      p_amount_applied ,
1335                       p_applied_payment_schedule_id ,
1336                       p_customer_trx_line_id ,
1337                       p_inv_line_amount      ,
1338                       p_creation_sign        ,
1339                       p_allow_overappln_flag ,
1340                       p_natural_appln_only_flag ,
1341                       p_inv_amount_rem ,
1342                       l_amt_applied_return_status
1343                        );
1344     IF l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
1345        l_amt_applied_return_status <> FND_API.G_RET_STS_SUCCESS OR
1346        l_apply_date_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
1347        p_return_status := FND_API.G_RET_STS_ERROR;
1348     END IF;
1349 
1350     IF PG_DEBUG in ('Y', 'C') THEN
1351        arp_util.debug('Validate_App_info ()-');
1352     END IF;
1353 EXCEPTION
1354  WHEN others THEN
1355   IF PG_DEBUG in ('Y', 'C') THEN
1356      arp_util.debug('EXCEPTION: Validate_App_Info() ');
1357   END IF;
1358   raise;
1359 
1360 
1361 END validate_app_info;
1362 
1363 PROCEDURE Default_unapp_ids(
1364                    p_cm_trx_number                   IN VARCHAR2,
1365                    p_cm_customer_trx_id              IN OUT NOCOPY NUMBER,
1366                    p_inv_trx_number                   IN VARCHAR2,
1367                    p_inv_customer_trx_id              IN OUT NOCOPY NUMBER,
1368                    p_receivable_application_id    IN OUT NOCOPY NUMBER,
1369                    p_installment                  IN NUMBER,
1370                    p_applied_payment_schedule_id  IN OUT NOCOPY NUMBER,
1371                    p_apply_gl_date                OUT NOCOPY DATE,
1372                    p_return_status                OUT NOCOPY VARCHAR2
1373                    ) IS
1374 
1375 CURSOR c_pay_sched IS
1376 SELECT customer_trx_id, terms_sequence_number
1377 FROM   ar_payment_schedules
1378 WHERE  payment_schedule_id = p_applied_payment_schedule_id and
1379        payment_schedule_id >0 and
1380        class in ('INV','DM');  -- Should we include BR, DEP, GUAR, CB?
1381 
1382 
1383 l_cm_cust_trx_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1384 l_inv_cust_trx_return_status   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1385 l_applied_ps_id_return_status    VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1386 l_inv_customer_trx_id    NUMBER;
1387 l_applied_payment_schedule_id NUMBER;
1388 l_ra_app_ps_id                NUMBER;
1389 l_receivable_application_id   NUMBER;
1390 l_installment                 NUMBER(15);
1391 l_ra_return_status            VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1392 
1393 BEGIN
1394 
1395 
1396   IF PG_DEBUG in ('Y', 'C') THEN
1397      arp_util.debug('Default_unapp_ids ()+');
1398   END IF;
1399   p_return_status := FND_API.G_RET_STS_SUCCESS ;
1400 
1401   --Step 1: Get a valid value for the CM customer_trx_id
1402   IF p_cm_trx_number IS NOT NULL THEN
1403     Default_customer_trx_id(p_cm_customer_trx_id ,
1404                             p_cm_trx_number ,
1405                             l_cm_cust_trx_return_status);
1406   END IF;
1407 
1408   -- Step 2: Get a valid value for DM customer_trx_id
1409   IF  p_inv_trx_number  IS NOT NULL THEN
1410     default_customer_trx_id(p_inv_customer_trx_id ,
1411                             p_inv_trx_number ,
1412                             l_inv_cust_trx_return_status);
1413   END IF;
1414 
1415 
1416   -- Step 3: Get payment schedule info
1417   --if error is raised in deriving the customer_trx_id from the trx_number,
1418   --do not process the applied_payment_schedule_id any further.
1419   IF l_cm_cust_trx_return_status= FND_API.G_RET_STS_SUCCESS AND
1420      l_inv_cust_trx_return_status= FND_API.G_RET_STS_SUCCESS THEN
1421     IF  p_applied_payment_schedule_id IS NOT NULL THEN
1422       OPEN c_pay_sched;
1423       FETCH c_pay_sched
1424        INTO l_inv_customer_trx_id,
1425             l_installment;
1426       IF c_pay_sched%NOTFOUND THEN
1427         FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
1428         FND_MSG_PUB.Add;
1429         p_return_status := FND_API.G_RET_STS_ERROR ;
1430       END IF;
1431       CLOSE c_pay_sched;
1432 
1433      IF  p_return_status = FND_API.G_RET_STS_SUCCESS  THEN
1434         IF (nvl(p_inv_customer_trx_id,l_inv_customer_trx_id) <> l_inv_customer_trx_id OR
1435           nvl(p_installment,l_installment)  <>  l_installment) THEN
1436           FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_PS_ID_X_INVALID');
1437            FND_MSG_PUB.Add;
1438            p_return_status := FND_API.G_RET_STS_ERROR;
1439        ELSE
1440            p_inv_customer_trx_id := l_inv_customer_trx_id;
1441        END IF;
1442 
1443      END IF;
1444    ELSE -- p_applied_ayment_schedule_id is null
1445       IF p_inv_customer_trx_id IS NOT NULL THEN
1446         l_applied_payment_schedule_id :=
1447                       Get_trx_ps_id(p_inv_customer_trx_id,
1448                                     p_installment,
1449                                     l_applied_ps_id_return_status);
1450         p_applied_payment_schedule_id
1451                           :=l_applied_payment_schedule_id;
1452       END IF;
1453    END IF;
1454 
1455   END IF;
1456 
1457   -- Step 4: get related info for receivable_application_id
1458 
1459   IF p_receivable_application_id IS NOT NULL THEN
1460        get_ra_info(p_receivable_application_id,
1461                    l_ra_app_ps_id,
1462                    l_inv_customer_trx_id,
1463                    p_apply_gl_date,
1464                    l_ra_return_status);
1465 
1466       IF nvl( l_ra_app_ps_id,-99) <> nvl(p_applied_payment_schedule_id,
1467                                                     nvl( l_ra_app_ps_id,-99))
1468        THEN
1469         IF ar_cm_api_pub.original_cm_unapp_info.inv_customer_trx_id IS NOT NULL OR
1470            ar_cm_api_pub.original_cm_unapp_info.inv_trx_number IS NOT NULL THEN
1471             FND_MESSAGE.SET_NAME('AR','AR_RAPI_TRX_RA_ID_X_INVALID');
1472             FND_MSG_PUB.Add;
1473             p_return_status := FND_API.G_RET_STS_ERROR;
1474         ELSIF ar_cm_api_pub.original_cm_unapp_info.applied_ps_id IS NOT NULL THEN
1475            FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_RA_ID_X_INVALID');
1476            FND_MSG_PUB.Add;
1477            p_return_status := FND_API.G_RET_STS_ERROR;
1478         END IF;
1479       ELSE
1480         p_applied_payment_schedule_id := l_ra_app_ps_id;
1481       END IF;
1482 
1483        IF nvl(l_inv_customer_trx_id,-99) <> nvl(p_inv_customer_trx_id,nvl(l_inv_customer_trx_id,-99)) THEN
1484         --Invalid receivable application identifier for the entered
1485         -- invoice customer trx id
1486          FND_MESSAGE.SET_NAME('AR','AR_RAPI_RCPT_RA_ID_X_INVALID');
1487          FND_MSG_PUB.Add;
1488          p_return_status := FND_API.G_RET_STS_ERROR;
1489       ELSE
1490         p_inv_customer_trx_id := l_inv_customer_trx_id;
1491       END IF;
1492   ELSE --the user has not passed in the receivable application id
1493    --
1494    -- derive receivable_application_id
1495    --
1496    --If app_ps_id and the cash_receipt_id are not null then
1497    --get the default receivable_application_id which will be
1498    --used for defaulting or cross-validation
1499     IF p_cm_customer_trx_id IS NOT NULL AND
1500        p_applied_payment_schedule_id IS NOT NULL
1501      THEN
1502        --derive the receivable application id using the CM customer trx id
1503        --and the applied payment schedule id
1504                     default_ra_id(
1505                                   p_cm_customer_trx_id,
1506                                   p_applied_payment_schedule_id,
1507                                   p_apply_gl_date,
1508                                   l_receivable_application_id,
1509                                   l_ra_return_status);
1510               p_receivable_application_id := l_receivable_application_id;
1511     END IF;
1512 
1513   END IF;
1514 
1515 
1516 END default_unapp_ids;
1517 
1518 
1519 PROCEDURE Default_unapp_info(
1520                         p_receivable_application_id IN NUMBER,
1521                         p_apply_gl_date    IN  DATE,
1522                         p_cm_customer_trx_id  IN  NUMBER,
1523                         p_reversal_gl_date IN OUT NOCOPY DATE,
1524                         p_cm_gl_date  OUT NOCOPY DATE
1525                           ) IS
1526 l_cm_customer_trx_id   NUMBER(15);
1527 l_apply_gl_date        DATE;
1528 BEGIN
1529 
1530   IF PG_DEBUG in ('Y', 'C') THEN
1531      arp_util.debug('Default_unapp_info ()+');
1532   END IF;
1533 
1534   l_apply_gl_date := p_apply_gl_date;
1535   l_cm_customer_trx_id := p_cm_customer_trx_id;
1536 
1537   default_reversal_gl_date(p_receivable_application_id,
1538                            p_reversal_gl_date,
1539                            l_apply_gl_date,
1540                            l_cm_customer_trx_id);
1541 
1542   --default the cm gl date which is to be used later
1543   --in the validation of the reversal gl date.
1544     IF  p_cm_gl_date IS NULL AND
1545         l_cm_customer_trx_id IS NOT NULL
1546       THEN
1547        BEGIN
1548          SELECT gl_date
1549          INTO   p_cm_gl_date
1550          FROM   ar_payment_schedules
1551          WHERE  customer_trx_id  = l_cm_customer_trx_id;
1552        EXCEPTION
1553          WHEN no_data_found THEN
1554           null;
1555           IF PG_DEBUG in ('Y', 'C') THEN
1556              arp_util.debug('Default_unapp_info: ' || 'Could not get the cm_gl_date. ');
1557           END IF;
1558        END;
1559     END IF;
1560   IF PG_DEBUG in ('Y', 'C') THEN
1561      arp_util.debug('Default_unapp_info ()-');
1562   END IF;
1563 
1564 END default_unapp_info;
1565 
1566 PROCEDURE Validate_unapp_info(
1567                       p_cm_gl_date             IN DATE,
1568                       p_receivable_application_id   IN NUMBER,
1569                       p_reversal_gl_date            IN DATE,
1570                       p_apply_gl_date               IN DATE,
1571                       p_return_status               OUT NOCOPY VARCHAR2
1572                       ) IS
1573 l_rec_app_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1574 l_rev_gl_date_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1575 
1576 BEGIN
1577 
1578    p_return_status := FND_API.G_RET_STS_SUCCESS;
1579    IF PG_DEBUG in ('Y', 'C') THEN
1580       arp_util.debug('Validate_unapp_info ()+');
1581    END IF;
1582 
1583    --In case the user has entered the receivable application id
1584    -- as well as the receipt and transaction info, then the cross validation
1585    --is done at the defaulting phase itself so no need to do that here.
1586                   Validate_ra_id(
1587                                 p_receivable_application_id,
1588                                 'APP',
1589                                l_rec_app_return_status);
1590 
1591      Validate_rev_gl_date( p_reversal_gl_date ,
1592                                 p_apply_gl_date ,
1593                                 p_cm_gl_date,
1594                                 l_rev_gl_date_return_status
1595                                   );
1596 END validate_unapp_info;
1597 
1598 END AR_CM_VAL_PVT;