DBA Data[Home] [Help]

PACKAGE BODY: APPS.AR_CM_APP_VAL_PVT

Source


1 Package Body      AR_CM_APP_VAL_PVT AS
2 /* $Header: ARXCMAVB.pls 120.8 2012/05/17 22:00:55 dgaurab ship $    */
3 --Validation procedures are contained in this package
4 
5 G_MSG_UERROR    CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR;
6 G_MSG_ERROR     CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_ERROR;
7 G_MSG_SUCCESS   CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_SUCCESS;
8 G_MSG_HIGH      CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH;
9 G_MSG_MEDIUM    CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM;
10 G_MSG_LOW       CONSTANT NUMBER         := FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW;
11 
12 PG_DEBUG varchar2(1) := NVL(FND_PROFILE.value('AFLOG_ENABLED'), 'N');
13 
14 PROCEDURE Validate_apply_gl_date(p_apply_gl_date IN DATE,
15                                  p_trx_gl_date IN DATE,
16                                  p_return_status OUT NOCOPY VARCHAR2
17                                  ) IS
18 l_bool  BOOLEAN;
19 
20 BEGIN
21     IF PG_DEBUG in ('Y', 'C') THEN
22        arp_util.debug('Validate_apply_gl_date ()+');
23     END IF;
24      p_return_status := FND_API.G_RET_STS_SUCCESS;
25 
29        IF p_apply_gl_date < p_trx_gl_date THEN
26     IF p_apply_gl_date IS NOT NULL THEN
27 
28        -- Check that the application GL Date is not before the invoice GL Date.
30           FND_MESSAGE.SET_NAME('AR','AR_VAL_GL_INV_GL');
31           FND_MSG_PUB.Add;
32           p_return_status := FND_API.G_RET_STS_ERROR;
33        END IF;
34 
35        -- Check that the Application GL Date is in an open or future GL period.
36        IF ( NOT arp_util.is_gl_date_valid( p_apply_gl_date )) THEN
37          FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
38 	 --Int'l Calendar Project
39          FND_MESSAGE.set_token( 'GL_DATE', fnd_date.date_to_chardate(p_apply_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
40          FND_MSG_PUB.Add;
41           p_return_status := FND_API.G_RET_STS_ERROR;
42        END IF;
43 
44     END IF;
45     IF PG_DEBUG in ('Y', 'C') THEN
46        arp_util.debug('Validate_apply_gl_date ()-');
47     END IF;
48 
49 END Validate_apply_gl_date;
50 
51 PROCEDURE Validate_apply_date(p_apply_date IN DATE,
52                               p_trx_date IN DATE,
53                               p_return_status OUT NOCOPY VARCHAR2
54                                ) IS
55 
56 BEGIN
57     IF PG_DEBUG in ('Y', 'C') THEN
58        arp_util.debug('Validate_apply_date ()+');
59     END IF;
60      p_return_status := FND_API.G_RET_STS_SUCCESS;
61 
62     IF p_apply_date IS NOT NULL THEN
63 
64        -- check that the apply  date is not before the invoice date.
65        IF p_apply_date < p_trx_date THEN
66           FND_MESSAGE.SET_NAME('AR','AR_APPLY_BEFORE_TRANSACTION');
67           FND_MSG_PUB.Add;
68           p_return_status := FND_API.G_RET_STS_ERROR;
69        END IF;
70 
71     END IF;
72 
73     IF PG_DEBUG in ('Y', 'C') THEN
74        arp_util.debug('Validate_apply_date ()-');
75     END IF;
76 END Validate_apply_date;
77 
78 PROCEDURE Validate_amount_applied_from(
79                                p_receivable_application_id IN NUMBER,
80 			       p_cm_unapp_amount IN NUMBER,
81                                p_return_status OUT NOCOPY VARCHAR2
82 			       ) IS
83 l_amount_applied NUMBER;
84 l_amount_applied_from NUMBER;
85 l_remaining_unapp_cm_amt NUMBER;
86 BEGIN
87     IF PG_DEBUG in ('Y', 'C') THEN
88        arp_util.debug('Validate_amount_applied_from ()+');
89     END IF;
90     p_return_status := FND_API.G_RET_STS_SUCCESS;
91 
92     SELECT amount_applied,
93            amount_applied_from INTO l_amount_applied,l_amount_applied_from
94     FROM  ar_receivable_applications
95     WHERE receivable_application_id = p_receivable_application_id;
96 
97     l_remaining_unapp_cm_amt := p_cm_unapp_amount + nvl(l_amount_applied_from, l_amount_applied);
98 
99     IF l_remaining_unapp_cm_amt < 0 THEN
100       IF PG_DEBUG in ('Y', 'C') THEN
101         arp_util.debug('Validate_amount_applied_from: ' || 'l_remaining_unapp_cm_amt :'||to_char(l_remaining_unapp_cm_amt));
102       END IF;
103       p_return_status := FND_API.G_RET_STS_ERROR;
104       FND_MESSAGE.SET_NAME('AR','AR_CKAP_OVERAPP');
105       FND_MSG_PUB.Add;
106     END IF;
107     IF PG_DEBUG in ('Y', 'C') THEN
108       arp_util.debug('Validate_amount_applied_from ()-');
109     END IF;
110 END  Validate_amount_applied_from;
111 
112 
113 PROCEDURE Validate_Rev_gl_date(p_reversal_gl_date IN DATE,
114                                p_apply_gl_date  IN DATE,
115                                p_cm_gl_date IN DATE,
116                                p_return_status  OUT NOCOPY VARCHAR2
117                                ) IS
118 
119 BEGIN
120     IF PG_DEBUG in ('Y', 'C') THEN
121        arp_util.debug('Validate_Rev_gl_date ()+');
122     END IF;
123     p_return_status := FND_API.G_RET_STS_SUCCESS;
124   IF p_reversal_gl_date IS NOT NULL THEN
125 
126     IF  p_reversal_gl_date < NVL(p_apply_gl_date,p_reversal_gl_date)  THEN
127         FND_MESSAGE.SET_NAME('AR','AR_RW_BEFORE_APP_GL_DATE');
128 	--Int'l Calendar Project
129         FND_MESSAGE.SET_TOKEN('GL_DATE', fnd_date.date_to_chardate(p_apply_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
130         FND_MSG_PUB.Add;
131         p_return_status := FND_API.G_RET_STS_ERROR;
132     END IF;
133     IF p_reversal_gl_date < nvl(p_cm_gl_date,p_reversal_gl_date) THEN
134         FND_MESSAGE.SET_NAME('AR','AR_REF_BEFORE_CM_GL_DATE');
135 	--Int'l Calendar Project
136         FND_MESSAGE.SET_TOKEN('GL_DATE', fnd_date.date_to_chardate(p_cm_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
137         FND_MSG_PUB.Add;
138         p_return_status := FND_API.G_RET_STS_ERROR;
139     END IF;
140 
141     IF ( NOT arp_util.is_gl_date_valid(p_reversal_gl_date)) THEN
142         FND_MESSAGE.set_name( 'AR', 'AR_INVALID_APP_GL_DATE' );
143 	--Int'l Calendar Project
144         FND_MESSAGE.set_token( 'GL_DATE', fnd_date.date_to_chardate(p_reversal_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
145         FND_MSG_PUB.Add;
146         p_return_status := FND_API.G_RET_STS_ERROR;
147     END IF;
148 
149   ELSE
150       FND_MESSAGE.SET_NAME('AR','AR_RAPI_REV_GL_DATE_NULL');
151       FND_MSG_PUB.Add;
152       p_return_status := FND_API.G_RET_STS_ERROR;
153       IF PG_DEBUG in ('Y', 'C') THEN
154          arp_util.debug('Validate_Rev_gl_date: ' || 'The Reversal gl date is null ');
155       END IF;
156   END IF;
157 
158   IF PG_DEBUG in ('Y', 'C') THEN
159      arp_util.debug('Validate_Rev_gl_date ()-');
160   END IF;
161 EXCEPTION
162   WHEN others THEN
163       IF PG_DEBUG in ('Y', 'C') THEN
167 END Validate_Rev_gl_date;
164          arp_util.debug('EXCEPTION: Validate_rev_gl_date() ');
165       END IF;
166       raise;
168 
169 PROCEDURE Validate_receivable_appln_id(
170                        p_receivable_application_id  IN  NUMBER,
171                        p_application_type  IN VARCHAR2,
172                        p_return_status OUT NOCOPY VARCHAR2) IS
173 l_valid NUMBER;
174 BEGIN
175   p_return_status := FND_API.G_RET_STS_SUCCESS;
176   IF PG_DEBUG in ('Y', 'C') THEN
177      arp_util.debug('Validate_receivable_appln_id ()+');
178   END IF;
179    IF p_receivable_application_id IS NOT NULL
180      THEN
181        SELECT count(*)
182        INTO   l_valid
183        FROM   AR_RECEIVABLE_APPLICATIONS ra
184        WHERE  ra.receivable_application_id = p_receivable_application_id
185          and  ra.display = 'Y'
186          and  ra.status = p_application_type
187          and  ra.application_type = 'CM';
188 
189      IF  l_valid = 0 THEN
190         FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_INVALID');
191         FND_MSG_PUB.Add;
192         p_return_status := FND_API.G_RET_STS_ERROR;
193      END IF;
194 
195    ELSIF p_receivable_application_id IS NULL  THEN
196        FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_APP_ID_NULL');
197        FND_MSG_PUB.Add;
198        p_return_status := FND_API.G_RET_STS_ERROR;
199 
200    END IF;
201   IF PG_DEBUG in ('Y', 'C') THEN
202      arp_util.debug('Validate_receivable_appln_id ()-');
203   END IF;
204 EXCEPTION
205  WHEN others THEN
206    IF PG_DEBUG in ('Y', 'C') THEN
207       arp_util.debug('EXCEPTION: Validate_receivable_appln_id()');
208    END IF;
209    raise;
210 END Validate_receivable_appln_id;
211 
212 PROCEDURE validate_activity(p_receivables_trx_id IN NUMBER,
213 			    p_customer_trx_id IN NUMBER,
214                             p_applied_ps_id IN NUMBER,
215                             p_amount_applied IN NUMBER,
216                             p_currency_code IN VARCHAR2,
217                             p_chk_approval_limit_flag IN VARCHAR2,
218                             p_return_status IN OUT NOCOPY VARCHAR2
219                             ) IS
220 l_activity_type   VARCHAR2(30);
221 l_amount_from           NUMBER;
222 l_amount_to             NUMBER;
223 l_user_id               NUMBER;
224 l_existing_cmref_amount    NUMBER;
225 l_tot_cmref_amt     NUMBER;
226 
227 cursor activity_type is
228  select type
229  from   ar_receivables_trx rt
230  where  receivables_trx_id = p_receivables_trx_id;
231 
232 BEGIN
233 
234  IF PG_DEBUG in ('Y', 'C') THEN
235     arp_util.debug('validate_activity (+)');
236  END IF;
237 
238  OPEN activity_type;
239  FETCH activity_type INTO l_activity_type;
240  IF activity_type%NOTFOUND THEN
241    FND_MESSAGE.SET_NAME('AR','AR_RAPI_REC_TRX_ID_INVALID');
242    FND_MSG_PUB.Add;
243    p_return_status := FND_API.G_RET_STS_ERROR;
244  END IF;
245  CLOSE activity_type;
246 
247  IF l_activity_type IS NOT NULL THEN
248   --Validate applied ps_id
249     IF p_applied_ps_id = -8 THEN
250 --6865230
251       IF l_activity_type <> 'CM_REFUND' THEN
252          FND_MESSAGE.SET_NAME('AR','AR_RAPI_ACTIVITY_X_INVALID');
253          FND_MSG_PUB.Add;
254          p_return_status := FND_API.G_RET_STS_ERROR;
255        END IF;
256 
257        l_user_id       := to_number(fnd_profile.value('USER_ID'));
258 
259        --get the existing refund amount on the CM.
260 
261          BEGIN
262           SELECT sum(amount_applied)
263           INTO l_existing_cmref_amount
264   	  FROM ar_receivable_applications
265   	  WHERE applied_payment_schedule_id = -8
266           AND   status = 'ACTIVITY'
267           AND   NVL(confirmed_flag,'Y') = 'Y'
268           AND   customer_trx_id = p_customer_trx_id;
269 
270           l_tot_cmref_amt := NVL(l_existing_cmref_amount,0) + NVL(p_amount_applied,0);
271 
272          EXCEPTION
273            WHEN no_data_found THEN
274              l_tot_cmref_amt := p_amount_applied;
275          END;
276 
277        IF NVL(p_chk_approval_limit_flag,'Y') <> 'N' THEN
278          BEGIN
279           SELECT NVL(amount_from,0),
280                  NVL(amount_to,0)
281           INTO   l_amount_from,
282                  l_amount_to
283           FROM   ar_approval_user_limits
284           where  currency_code = p_currency_code
285           and    user_id = l_user_id
286           and    document_type ='CMREF';
287          EXCEPTION
288           WHEN NO_DATA_FOUND THEN
289            l_amount_from := NVL(l_tot_cmref_amt,0);
290            l_amount_to := NVL(l_tot_cmref_amt,0);
291          END;
292 
293          IF (NVL(l_tot_cmref_amt,0) > l_amount_to) OR
294             (NVL(l_tot_cmref_amt,l_amount_from) < l_amount_from)
295           THEN
296            fnd_message.set_name ('AR','AR_REF_USR_LMT_OUT_OF_RANGE');
297            fnd_message.set_token('FROM_AMOUNT', to_char(l_amount_from), FALSE);
298            fnd_message.set_token('TO_AMOUNT', to_char(l_amount_to), FALSE);
299            FND_MSG_PUB.Add;
300            p_return_status := FND_API.G_RET_STS_ERROR;
301          END IF;
302 
303        END IF;
304 
305     ELSE
306       --the applied payment schedule id is invalid
307       FND_MESSAGE.SET_NAME('AR','AR_RAPI_APP_PS_ID_INVALID');
308       FND_MSG_PUB.Add;
309       p_return_status := FND_API.G_RET_STS_ERROR;
310     END IF; --additional control structures to be added for new activity types.
311   END IF;
312  IF PG_DEBUG in ('Y', 'C') THEN
316 
313     arp_util.debug('validate_activity (-)');
314  END IF;
315 END validate_activity;
317 PROCEDURE validate_activity_app( p_receivables_trx_id IN NUMBER,
318                                  p_applied_ps_id  IN NUMBER,
319                                  p_customer_trx_id IN NUMBER,
320                                  p_cm_gl_date  IN DATE,
321                                  p_cm_unapp_amount IN NUMBER,
322                                  p_trx_date IN DATE,
323                                  p_amount_applied IN NUMBER,
324                                  p_apply_gl_date IN DATE,
325                                  p_apply_date IN DATE,
326                                  p_cm_currency_code IN VARCHAR2,
327                                  p_return_status OUT NOCOPY VARCHAR2,
328                                  p_chk_approval_limit_flag IN VARCHAR2,
329                                  p_called_from IN VARCHAR2
330                                  ) IS
331 l_valid   VARCHAR2(1) DEFAULT 'N';
332 l_cm_return_status  VARCHAR2(1);
333 l_act_return_status VARCHAR2(1);
334 l_amt_return_status VARCHAR2(1);
335 l_gl_date_return_status VARCHAR2(1);
336 l_apply_date_return_status  VARCHAR2(1);
337 BEGIN
338   IF PG_DEBUG in ('Y', 'C') THEN
339      arp_util.debug('validate_activity_app ()+');
340   END IF;
341      p_return_status := FND_API.G_RET_STS_SUCCESS;
342 
343      l_act_return_status := FND_API.G_RET_STS_SUCCESS;
344      l_amt_return_status := FND_API.G_RET_STS_SUCCESS;
345      l_cm_return_status  := FND_API.G_RET_STS_SUCCESS;
346      l_gl_date_return_status := FND_API.G_RET_STS_SUCCESS;
347      l_apply_date_return_status := FND_API.G_RET_STS_SUCCESS;
348 
349      validate_activity(
350                    p_receivables_trx_id,
351 		   p_customer_trx_id,
355                    p_chk_approval_limit_flag,
352                    p_applied_ps_id,
353                    p_amount_applied,
354                    p_cm_currency_code,
356                    l_act_return_status
357                     );
358      -- if this routine is called for cmrefund,this routine will check whether
359      -- the credit memo is suitable for refund
360 
361         validate_credit_memo(FND_API.G_FALSE,
362                              p_customer_trx_id,
363                              l_cm_return_status);
364 
365         validate_apply_date (p_apply_date,
366                              p_trx_date,
367                              l_apply_date_return_status
368                             			);
369 
370        --  validate amount applied
371           IF  p_amount_applied IS NULL  THEN
372               FND_MESSAGE.SET_NAME('AR','AR_RAPI_APPLIED_AMT_NULL');
373               FND_MSG_PUB.Add;
374               l_amt_return_status := FND_API.G_RET_STS_ERROR;
375 
376           ELSIF  (p_amount_applied < 0 AND NVL(p_applied_ps_id,-8) = -8) THEN
377               FND_MESSAGE.SET_NAME('AR','AR_REF_CM_APP_NEG');
378               FND_MSG_PUB.Add;
379               l_amt_return_status := FND_API.G_RET_STS_ERROR;
380           -- Bug 2897244 - amount not checked if called from form
381           ELSIF ((nvl(p_cm_unapp_amount,0)- p_amount_applied) < 0 AND
382                  NVL(p_called_from,'RAPI') <> 'ARXRWAPP') THEN
383               FND_MESSAGE.SET_NAME('AR','AR_CKAP_OVERAPP');
384               FND_MSG_PUB.Add;
385               l_amt_return_status := FND_API.G_RET_STS_ERROR;
386           END IF;
387 
388           validate_apply_gl_date(
389 				p_apply_gl_date,
390                                	p_cm_gl_date,
391                                 l_gl_date_return_status
392                                 );
393 
394           IF  l_cm_return_status <> FND_API.G_RET_STS_SUCCESS  OR
395               l_amt_return_status <> FND_API.G_RET_STS_SUCCESS OR
396               l_gl_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
397               l_apply_date_return_status <> FND_API.G_RET_STS_SUCCESS OR
398 	      l_act_return_status <> FND_API.G_RET_STS_SUCCESS
399             THEN
400                  p_return_status := FND_API.G_RET_STS_ERROR;
401           END IF;
402 
403         IF PG_DEBUG in ('Y', 'C') THEN
404            arp_util.debug('validate_activity_app ()-');
405         END IF;
406 EXCEPTION
407 WHEN others  THEN
408     IF PG_DEBUG in ('Y', 'C') THEN
409        arp_util.debug('EXCEPTION:  validate_activity_app()');
410     END IF;
411     raise;
412 END validate_activity_app;
413 
414 
415 PROCEDURE validate_unapp_activity(
416                               p_trx_gl_date  IN DATE,
417                               p_receivable_application_id  IN NUMBER,
418                               p_reversal_gl_date  IN DATE,
419                               p_apply_gl_date    IN DATE,
420                               p_cm_unapp_amt     IN NUMBER,
421                               p_return_status  OUT NOCOPY VARCHAR2
422                                ) IS
423 l_amt_app_from_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
424 BEGIN
425      p_return_status := FND_API.G_RET_STS_SUCCESS;
426      IF PG_DEBUG in ('Y', 'C') THEN
427         arp_util.debug('validate_unapp_activity  ()+');
428      END IF;
429 
430           Validate_rev_gl_date( p_reversal_gl_date ,
431                                 p_apply_gl_date ,
432                                 p_trx_gl_date,
433                                 p_return_status
434                                   );
435 
436          IF p_receivable_application_id IS NOT NULL
437            AND p_cm_unapp_amt IS NOT NULL THEN
438             Validate_amount_applied_from( p_receivable_application_id,
439                                           p_cm_unapp_amt,
440                                           l_amt_app_from_return_status);
441          END IF;
442          IF l_amt_app_from_return_status <> FND_API.G_RET_STS_SUCCESS OR
443             p_return_status <> FND_API.G_RET_STS_SUCCESS THEN
444             p_return_status := FND_API.G_RET_STS_ERROR;
445          END IF;
446 
447     IF PG_DEBUG in ('Y', 'C') THEN
448        arp_util.debug('validate_unapp_activity: ' || 'p_return_status :'||p_return_status);
449        arp_util.debug('validate_unapp_activity ()-');
450     END IF;
451 END validate_unapp_activity;
452 
453 
454 PROCEDURE validate_credit_memo (
455           p_init_msg_list IN VARCHAR2,
456           p_customer_trx_id IN NUMBER,
457           p_return_status OUT NOCOPY VARCHAR2) IS
458 
459   CURSOR c_cm IS
460     SELECT ct.receipt_method_id,
461 	   ct.customer_bank_account_id,
462 	   ct.previous_customer_trx_id,
463 	   ct.complete_flag,
464 	   rc.remit_flag,
465 	   rma.remittance_ccid
466     FROM   ra_customer_trx ct,
467            ar_receipt_methods rm,
468 	   ar_receipt_classes rc,
469            ar_receipt_method_accounts rma
470     WHERE  ct.customer_trx_id = p_customer_trx_id
471     AND    ct.receipt_method_id = rm.receipt_method_id(+)
472     AND    rm.receipt_class_id = rc.receipt_class_id(+)
473     AND    rm.receipt_method_id = rma.receipt_method_id(+)
474     AND    ROWNUM = 1;
475 
476     CURSOR c_ps IS
477     SELECT SUM(amount_due_original), SUM(amount_due_remaining)
478     FROM   ar_payment_schedules
479     WHERE  customer_trx_id = p_customer_trx_id;
480 
481    l_receipt_method_id		NUMBER;
482    l_customer_bank_account_id	NUMBER;
483    l_previous_customer_trx_id	NUMBER;
484    l_complete_flag		ra_customer_trx.complete_flag%TYPE;
485    l_remit_flag			ar_receipt_classes.remit_flag%TYPE;
486    l_remittance_ccid		NUMBER;
487    l_amount_due_original        NUMBER;
488    l_amount_due_remaining       NUMBER;
489 BEGIN
490  IF PG_DEBUG in ('Y', 'C') THEN
491     arp_util.debug('validate_credit_memo (+)');
492  END IF;
493        /*--------------------------------------------------------------+
494         |   Initialize message list if p_init_msg_list is set to TRUE  |
495         +--------------------------------------------------------------*/
496 
497         IF FND_API.to_Boolean( p_init_msg_list )
498           THEN
499               FND_MSG_PUB.initialize;
500         END IF;
501        /*-----------------------------------------+
502         |   Initialize return status to SUCCESS   |
503         +-----------------------------------------*/
504 
505         p_return_status := FND_API.G_RET_STS_SUCCESS;
506 
507    OPEN c_cm;
508    FETCH c_cm INTO l_receipt_method_id,
509 		   l_customer_bank_account_id,
510 		   l_previous_customer_trx_id,
511 		   l_complete_flag,
512 		   l_remit_flag,
513  		   l_remittance_ccid;
514    CLOSE c_cm;
515    IF l_previous_customer_trx_id IS NOT NULL THEN
516       FND_MESSAGE.SET_NAME('AR','AR_REF_NOT_OACM');
517       FND_MSG_PUB.Add;
518       p_return_status := FND_API.G_RET_STS_ERROR;
519    END IF;
520    IF NVL(l_complete_flag,'N') <> 'Y' THEN
521       FND_MESSAGE.SET_NAME('AR','AR_REF_CM_INCOMPLETE');
522       FND_MSG_PUB.Add;
523       p_return_status := FND_API.G_RET_STS_ERROR;
524    ELSE
525      OPEN c_ps;
526      FETCH c_ps INTO l_amount_due_original, l_amount_due_remaining;
527      CLOSE c_ps;
528      /* Bug 4203308 - checks the original amount for positive CM condition
529         instead of amount due which may be positive due to overapplication */
530      IF l_amount_due_original > 0 THEN
531         FND_MESSAGE.SET_NAME('AR','AR_REF_CM_POSITIVE');
532         FND_MSG_PUB.Add;
533         p_return_status := FND_API.G_RET_STS_ERROR;
534      END IF;
535      IF l_amount_due_remaining >= 0 THEN
536         FND_MESSAGE.SET_NAME('AR','AR_REF_MORE_THAN_CM_AMT');
537         FND_MSG_PUB.Add;
538         p_return_status := FND_API.G_RET_STS_ERROR;
539      END IF;
540    END IF;
541  IF PG_DEBUG in ('Y', 'C') THEN
542     arp_util.debug('validate_credit_memo (-)');
543  END IF;
544 EXCEPTION
545   WHEN OTHERS THEN
546       FND_MESSAGE.SET_NAME('AR','AR_RAPI_CUST_TRX_ID_INVALID');
547       FND_MSG_PUB.Add;
548       p_return_status := FND_API.G_RET_STS_ERROR;
549 
550 END validate_credit_memo;
551 
552 END AR_CM_APP_VAL_PVT;