DBA Data[Home] [Help]

PACKAGE BODY: APPS.OZF_AR_VALIDATION_PVT

Source


1 PACKAGE BODY OZF_AR_VALIDATION_PVT AS
2 /* $Header: ozfvarvb.pls 120.2 2005/10/24 00:48:09 sshivali ship $ */
3 
4 G_PKG_NAME          CONSTANT VARCHAR2(30) := 'OZF_AR_VALIDATION_PVT';
5 G_FILE_NAME         CONSTANT VARCHAR2(12) := 'ozfvarvb.pls';
6 
7 OZF_DEBUG_HIGH_ON   CONSTANT BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_high);
8 OZF_DEBUG_LOW_ON    CONSTANT BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_low);
9 
10 
11 
12 /*=======================================================================*
13  | Function
14  |    Check_to_Process_SETL_WF
15  |
16  | Return
17  |    FND_API.g_true / FND_API.g_false
18  |
19  | NOTES
20  |   When settling by invoice creditmemo, settlement should be done by
21  |   receivable role in the following cases:
22  |   1. Different credit types are mixed.
23  |   2. Credit is not to source invoice.
24  |
25  |
26  | HISTORY
27  |    16-May-2005  Sahana  Created for Bug4308173
28  |
29  *=======================================================================*/
30 FUNCTION Check_to_Process_SETL_WF(
31     p_claim_rec              IN    OZF_CLAIM_PVT.claim_rec_type
32    ,x_return_status          OUT NOCOPY   VARCHAR2
33 ) RETURN BOOLEAN IS
34 
35  CURSOR csr_claim_line_invoice(cv_claim_id IN NUMBER) IS
36     SELECT source_object_id
37     ,      source_object_line_id
38     ,      credit_to
39     ,      SUM(quantity) qty
40     ,      AVG(rate)  rate
41     ,      SUM(NVL(claim_currency_amount,0)) amount
42     FROM ozf_claim_lines
43     WHERE claim_id = cv_claim_id
44     GROUP BY source_object_id, source_object_line_id, credit_to;
45   l_trx_lines  csr_claim_line_invoice%ROWTYPE;
46 
47   CURSOR csr_invoice_apply_count(cv_receipt_id IN NUMBER, cv_invoice_id IN NUMBER) IS
48     SELECT COUNT(rec.cash_receipt_id)
49     FROM ar_receivable_applications rec
50     WHERE rec.applied_customer_trx_id = cv_invoice_id
51     AND   rec.cash_receipt_id = cv_receipt_id
52     AND rec.display = 'Y';
53   l_apply_receipt_count            NUMBER;
54 
55 l_api_name     CONSTANT VARCHAR2(30) := 'Check_to_Process_SETL_WF()';
56 l_full_name    CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
57 
58 l_process_setl_wf                BOOLEAN   := FALSE;
59 l_line_level_crediting           BOOLEAN   := FALSE;
60 l_type_crediting                 BOOLEAN   := FALSE;
61 l_header_crediting               BOOLEAN   := FALSE;
62 
63 l_prev_source_object_id          NUMBER ;
64 
65 BEGIN
66    x_return_status := FND_API.g_ret_sts_success;
67 
68 
69    IF OZF_DEBUG_LOW_ON THEN
70           OZF_Utility_PVT.debug_message(l_full_name || ': Start');
71    END IF;
72 
73    OPEN csr_claim_line_invoice(p_claim_rec.claim_id);
74    LOOP
75       FETCH csr_claim_line_invoice INTO l_trx_lines;
76       EXIT WHEN csr_claim_line_invoice%NOTFOUND;
77 
78       IF l_trx_lines.source_object_id <> l_prev_source_object_id THEN
79          l_process_setl_wf      := FALSE;
80          l_line_level_crediting := FALSE;
81          l_type_crediting       := FALSE;
82          l_header_crediting     := FALSE;
83 
84          IF OZF_DEBUG_LOW_ON THEN
85              OZF_Utility_PVT.debug_message('Credit to more then one invoice');
86          END IF;
87          EXIT ;
88       END IF;
89       l_prev_source_object_id := l_trx_lines.source_object_id ;
90 
91       IF p_claim_rec.claim_class = 'DEDUCTION' AND p_claim_rec.source_object_id IS NOT NULL THEN
92            IF l_trx_lines.source_object_id <> p_claim_rec.source_object_id THEN
93               l_process_setl_wf := TRUE;
94               IF OZF_DEBUG_LOW_ON THEN
95                  OZF_Utility_PVT.debug_message('Credit to Invoice other then Source Invoice');
96               END IF;
97               EXIT ;
98            END IF;
99       ELSIF p_claim_rec.claim_class = 'DEDUCTION' AND p_claim_rec.source_object_id IS NULL THEN
100             OPEN csr_invoice_apply_count(p_claim_rec.receipt_id, l_trx_lines.source_object_id);
101             FETCH csr_invoice_apply_count INTO l_apply_receipt_count;
102             CLOSE csr_invoice_apply_count;
103 
104             IF l_apply_receipt_count = 0 THEN
105                 l_process_setl_wf := TRUE;
106                 IF OZF_DEBUG_LOW_ON THEN
107                    OZF_Utility_PVT.debug_message('Credit to Invoice not on the Source Receipt');
108                 END IF;
109                 EXIT;
110             END IF;
111       END IF;
112 
113       IF l_trx_lines.credit_to IS NOT NULL THEN
114             l_type_crediting := TRUE;
115           OZF_Utility_PVT.debug_message(l_full_name || ': End1');
116 
117       END IF;
118 
119       IF l_trx_lines.credit_to IS NULL AND l_trx_lines.source_object_line_id IS NULL THEN
120              l_header_crediting := TRUE;
121           OZF_Utility_PVT.debug_message(l_full_name || ': End2');
122 
123       END IF;
124 
125       IF l_trx_lines.source_object_line_id IS NOT NULL THEN
126              l_line_level_crediting := TRUE;
127             OZF_Utility_PVT.debug_message(l_full_name || ': End3');
128 
129       END IF;
130 
131 
132       -- Check evaluates if there is more then one line.
133       IF  l_line_level_crediting AND l_header_crediting THEN
134            l_process_setl_wf := TRUE;
135            EXIT;
136       ELSIF  l_line_level_crediting AND l_type_crediting  THEN
137            l_process_setl_wf := TRUE;
138            EXIT;
139       ELSIF l_header_crediting AND l_type_crediting  THEN
140            l_process_setl_wf := TRUE;
141            EXIT;
142       END IF;
143 
144    END LOOP;
145    CLOSE csr_claim_line_invoice;
146 
147    IF OZF_DEBUG_LOW_ON THEN
148           OZF_Utility_PVT.debug_message(l_full_name || ': End');
149    END IF;
150 
151    RETURN l_process_setl_wf;
152 
153 EXCEPTION
154    WHEN OTHERS THEN
155       x_return_status := FND_API.g_ret_sts_unexp_error ;
156       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
157          FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
158       END IF;
159 END Check_to_Process_SETL_WF;
160 
161 
162 FUNCTION Check_Credit_To_Balance(
163      p_cash_receipt_id     IN NUMBER
164    , p_customer_trx_id     IN NUMBER
165    , p_line_type           IN VARCHAR2
166    , p_claim_line_amount   IN NUMBER
167 ) RETURN BOOLEAN
168 IS
169 
170 CURSOR csr_transaction_balance(cv_customer_trx_id IN NUMBER) IS
171    SELECT payment_schedule_id
172    ,      trx_number
173    ,      amount_line_items_remaining
174    ,      tax_remaining
175    ,      freight_remaining
176    FROM ar_payment_schedules
177    WHERE customer_trx_id = cv_customer_trx_id;
178 
179 
180 l_payment_schedule_id         NUMBER;
181 l_trx_number                  VARCHAR2(30);
182 l_line_remaining              NUMBER;
183 l_tax_remaining               NUMBER;
184 l_freight_remaining           NUMBER;
185 
186 BEGIN
187    OPEN csr_transaction_balance(p_customer_trx_id);
188    FETCH csr_transaction_balance INTO l_payment_schedule_id
189                                     , l_trx_number
190                                     , l_line_remaining
191                                     , l_tax_remaining
192                                     , l_freight_remaining;
193    CLOSE csr_transaction_balance;
194 
195 
196    IF p_line_type = 'LINE' AND
197       p_claim_line_amount > l_line_remaining  THEN
198       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
199          FND_MESSAGE.set_name('OZF', 'OZF_SETL_CR_TO_LINE_AMT_ERR');
200          FND_MESSAGE.set_token('TRX_NUMBER', l_trx_number);
201          FND_MSG_PUB.add;
202       END IF;
203       RETURN FALSE;
204    ELSIF p_line_type = 'TAX' AND
205          p_claim_line_amount > l_tax_remaining  THEN
206       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
207          FND_MESSAGE.set_name('OZF', 'OZF_SETL_CR_TO_TAX_AMT_ERR');
208          FND_MESSAGE.set_token('TRX_NUMBER', l_trx_number);
209          FND_MSG_PUB.add;
210       END IF;
211       RETURN FALSE;
212    ELSIF p_line_type = 'FREIGHT' AND
213          p_claim_line_amount > l_freight_remaining  THEN
214       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
215          FND_MESSAGE.set_name('OZF', 'OZF_SETL_CR_TO_FREIGHT_AMT_ERR');
216          FND_MESSAGE.set_token('TRX_NUMBER', l_trx_number);
217          FND_MSG_PUB.add;
218       END IF;
219       RETURN FALSE;
220    END IF;
221 
222    RETURN TRUE;
223 END Check_Credit_To_Balance;
224 
225 
226 /*=======================================================================*
227  | PROCEDURE
228  |    Validate_CreditTo_Information
229  |
230  | NOTES
231  | Credit Memo-Invoice settlement validation
232  |   1. When credit to specific types, check balance
233  |   2. When credit to line, check line balance
234  |   3. Check overall invoice balance
235  |
236  |
237  | HISTORY
238  |    03-May-2005   Sahana   Created for Bug4308173
239  *=======================================================================*/
240 
241 PROCEDURE  Validate_CreditTo_Information(
242     p_claim_rec             IN  OZF_CLAIM_PVT.claim_rec_type
243    ,p_invoice_id            IN  NUMBER DEFAULT NULL
244    ,x_return_status         OUT NOCOPY VARCHAR2
245 )
246 IS
247 l_api_version  CONSTANT NUMBER := 1.0;
248 l_api_name     CONSTANT VARCHAR2(30) := 'Validate_CreditTo_Information';
249 l_full_name    CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
250 
251 
252 CURSOR csr_get_inv_info(cv_claim_id IN NUMBER, cv_invoice_id IN NUMBER) IS
253   SELECT  source_object_id, SUM(NVL(claim_currency_amount,0))
254   FROM ozf_claim_lines
255   WHERE claim_id = cv_claim_id
256   AND ( cv_invoice_id IS NULL OR source_object_id = cv_invoice_id )
257   GROUP BY source_object_id;
258 
259 CURSOR csr_get_creditto_info(cv_claim_id IN NUMBER, cv_invoice_id IN NUMBER) IS
260    SELECT source_object_id
261    ,      credit_to
262    ,      SUM(NVL(claim_currency_amount,0))
263    FROM  ozf_claim_lines
264    WHERE claim_id = cv_claim_id
265    AND   source_object_class IN ('INVOICE', 'DM', 'CB')
266    AND ( cv_invoice_id IS NULL OR source_object_id = cv_invoice_id )
267    GROUP BY source_object_id, credit_to;
268 
269 CURSOR csr_get_lineid_info(cv_claim_id IN NUMBER, cv_invoice_id IN NUMBER) IS
270    SELECT source_object_id
271    ,      source_object_line_id
272    ,      SUM(NVL(claim_currency_amount,0))
273    FROM ozf_claim_lines
274    WHERE claim_id = cv_claim_id
275    AND ( cv_invoice_id IS NULL OR source_object_id = cv_invoice_id )
276    GROUP BY source_object_id,source_object_line_id;
277 
278 CURSOR csr_trx_line_amount(cv_invoice_line_id IN NUMBER) IS
279    SELECT extended_amount
280    FROM   ra_customer_trx_lines
281    WHERE  customer_trx_line_id = cv_invoice_line_id;
282 
283 CURSOR csr_trx_details(cv_customer_trx_id IN NUMBER) IS
284    SELECT trx_number from ar_payment_schedules_all
285    WHERE  customer_trx_id = cv_customer_trx_id;
286 
287 l_credit_to_type      VARCHAR2(15);
288 l_object_class        VARCHAR2(15);
289 l_sum_line_amt        NUMBER;
290 l_invoice_id          NUMBER;
291 l_trx_line_amt        NUMBER;
292 l_invoice_line_id     NUMBER;
293 l_error               BOOLEAN;
294 l_process_setl_wf     BOOLEAN;
295 l_trx_number          AR_PAYMENT_SCHEDULES_ALL.TRX_NUMBER%TYPE;
296 
297 BEGIN
298    IF OZF_DEBUG_HIGH_ON THEN
299       OZF_Utility_PVT.debug_message(l_full_name||' : start');
300    END IF;
301 
302    -- Initialize API return status to sucess
303    x_return_status := FND_API.g_ret_sts_success;
304 
305 
306    -- Proceed with validation only if settlement is not by receivable role
307 
308    -- This check is skipped for non invoice deductions since
309    -- the check is performed before this procedure is called.
310    IF p_claim_rec.claim_class = 'CLAIM' OR
311          ( p_claim_rec.claim_class = 'DEDUCTION' AND   p_claim_rec.source_object_id IS NOT NULL )  THEN
312          l_process_setl_wf := Check_to_Process_SETL_WF(
313                             p_claim_rec      => p_claim_rec
314                            ,x_return_status  => x_return_status
315                          );
316         IF x_return_status =  FND_API.g_ret_sts_error THEN
317    	       RAISE FND_API.g_exc_error;
318         ELSIF x_return_status = FND_API.g_ret_sts_unexp_error THEN
319  	       RAISE FND_API.g_exc_unexpected_error;
320         END IF;
321         IF l_process_setl_wf THEN
322            RETURN;
323         END IF;
324    END IF;
325 
326 
327    OPEN csr_get_inv_info(p_claim_rec.claim_id, p_invoice_id);
328    LOOP
329        FETCH csr_get_inv_info INTO l_invoice_id, l_sum_line_amt;
330        EXIT WHEN csr_get_inv_info%NOTFOUND;
331 
332        OZF_CLAIM_SETTLEMENT_PVT.Check_Transaction_Balance(
333           p_customer_trx_id    => l_invoice_id
334          ,p_claim_amount       => l_sum_line_amt
335          ,p_claim_number       => p_claim_rec.claim_number
336          ,x_return_status      => x_return_status    );
337        IF x_return_status <>  FND_API.g_ret_sts_success THEN
338            RETURN;
339        END IF;
340    END LOOP;
341    CLOSE csr_get_inv_info;
342 
343 
344    OPEN csr_get_creditto_info(p_claim_rec.claim_id, p_invoice_id);
345    LOOP
346        FETCH csr_get_creditto_info INTO l_invoice_id, l_credit_to_type,l_sum_line_amt;
347   	   EXIT WHEN csr_get_creditto_info%NOTFOUND;
348 
349    	   IF l_credit_to_type IS NOT NULL THEN
350             l_error :=  Check_Credit_To_Balance(
351                      p_cash_receipt_id   => p_claim_rec.receipt_id
352                    , p_customer_trx_id   => l_invoice_id
353                    , p_line_type         => l_credit_to_type
354                    , p_claim_line_amount => l_sum_line_amt);
355          	 IF NOT l_error THEN
356          		x_return_status := FND_API.g_ret_sts_error;
357                 RETURN;
358 	         END IF;
359        END IF;
360   END LOOP;
361   CLOSE csr_get_creditto_info;
362 
363   OPEN csr_get_lineid_info(p_claim_rec.claim_id, p_invoice_id);
364   LOOP
365       FETCH csr_get_lineid_info INTO l_invoice_id, l_invoice_line_id,l_sum_line_amt;
366       EXIT WHEN csr_get_lineid_info%NOTFOUND;
367 
368       OPEN csr_trx_line_amount(l_invoice_line_id);
369    	  FETCH csr_trx_line_amount INTO l_trx_line_amt;
370 	  CLOSE csr_trx_line_amount;
371       IF ABS(l_trx_line_amt) < l_sum_line_amt THEN
372          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
373             OPEN  csr_trx_details(l_invoice_id);
374             FETCH csr_trx_details INTO l_trx_number;
375             CLOSE csr_trx_details;
376         	FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_TRX_BAL_ERR');
377         	FND_MESSAGE.set_token('TRX_NUMBER',l_trx_number);
378 	        FND_MSG_PUB.add;
379          END IF;
380          x_return_status := FND_API.g_ret_sts_error;
381          RETURN;
382 	END IF;
383    END LOOP;
384    CLOSE csr_get_lineid_info;
385 
386    IF OZF_DEBUG_HIGH_ON THEN
387       OZF_Utility_PVT.debug_message(l_full_name||' : end');
388    END IF;
389 
390 EXCEPTION
391    WHEN OTHERS THEN
392     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
393          FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
394     END IF;
395     x_return_status := FND_API.g_ret_sts_unexp_error;
396 END Validate_CreditTo_Information;
397 
398 
399 
400 
404  |
401 /*=======================================================================*
402  | Procedure
403  |    Complete_AR_Validation
405  | Return
406  |
407  | NOTES
408  |
409  | HISTORY
410  |    21-JUL-2002  mchang  Create.
411  *=======================================================================*/
412 PROCEDURE Complete_AR_Validation(
413     p_api_version            IN    NUMBER
414    ,p_init_msg_list          IN    VARCHAR2 := FND_API.g_false
415    ,p_commit                 IN    VARCHAR2 := FND_API.g_false
416    ,p_validation_level       IN    NUMBER   := FND_API.g_valid_level_full
417 
418    ,x_return_status          OUT NOCOPY   VARCHAR2
419    ,x_msg_data               OUT NOCOPY   VARCHAR2
420    ,x_msg_count              OUT NOCOPY   NUMBER
421 
422    ,p_claim_rec              IN    OZF_CLAIM_PVT.claim_rec_type
423 )
424 IS
425 l_api_version  CONSTANT NUMBER := 1.0;
426 l_api_name     CONSTANT VARCHAR2(30) := 'Complete_AR_Validation';
427 l_full_name    CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
428 
429 CURSOR csr_sum_line_amt(cv_claim_id IN NUMBER) IS
430   SELECT NVL(SUM(claim_currency_amount), 0)
431   FROM ozf_claim_lines
432   WHERE claim_id = cv_claim_id;
433 
434 CURSOR csr_sysparam_defaults(cv_set_of_books_id IN NUMBER) IS
435   SELECT batch_source_id
436   ,      post_to_gl
437   ,      gl_rec_clearing_account
438   ,      cm_trx_type_id
439   ,      billback_trx_type_id
440   ,      cb_trx_type_id
441   ,      adj_rec_trx_id
442   ,      wo_rec_trx_id
443   ,      neg_wo_rec_trx_id
444   FROM ozf_sys_parameters
445   WHERE set_of_books_id = cv_set_of_books_id;
446 
447 CURSOR csr_sysparam_trx(cv_set_of_books_id IN NUMBER) IS
448   SELECT billback_trx_type_id, cm_trx_type_id
449   FROM ozf_sys_parameters
450   WHERE set_of_books_id = cv_set_of_books_id;
451 
452 CURSOR csr_chk_trx_type(cv_trx_type_id IN NUMBER) IS
453   SELECT type, creation_sign
454   FROM ra_cust_trx_types
455   WHERE cust_trx_type_id = cv_trx_type_id;
456 
457 CURSOR csr_reason(cv_reason_code_id IN NUMBER) IS
458   SELECT reason_code
459   ,      adjustment_reason_code
460   ,      name
461   FROM   ozf_reason_codes_vl
462   WHERE  reason_code_id = cv_reason_code_id;
463 
464 CURSOR csr_trx_type(cv_claim_type_id IN NUMBER) IS
465    SELECT cm_trx_type_id
466    ,      dm_trx_type_id
467    ,      cb_trx_type_id
468    ,      wo_rec_trx_id
469    ,      neg_wo_rec_trx_id
470    ,      adj_rec_trx_id
471    FROM ozf_claim_types_vl
472    WHERE claim_type_id = cv_claim_type_id;
473 
474 CURSOR csr_trx_balance(cv_customer_trx_id IN NUMBER) IS
475    SELECT SUM(amount_due_remaining),
476           invoice_currency_code
477    FROM ar_payment_schedules
478    WHERE customer_trx_id = cv_customer_trx_id
479    GROUP BY invoice_currency_code;
480 
481 CURSOR csr_chk_line_product(cv_claim_id IN NUMBER) IS
482   SELECT item_id
483   ,      quantity_uom
484   --,      org_id
485   ,      FND_PROFILE.value('AMS_ITEM_ORGANIZATION_ID')
486   FROM ozf_claim_lines
487   WHERE item_type = 'PRODUCT'
488   AND claim_id = cv_claim_id;
489 
490 CURSOR csr_validate_primary_uom( cv_item_id IN NUMBER, cv_org_id  IN NUMBER) IS
491   SELECT primary_uom_code
492   FROM mtl_system_items
493   WHERE inventory_item_id = cv_item_id
494   AND organization_id = cv_org_id;
495 
496 CURSOR csr_validate_uom_class(cv_uom_code IN VARCHAR2) IS
497   SELECT uom_class
498   FROM mtl_units_of_measure
499   WHERE uom_code = cv_uom_code;
500 
501 CURSOR csr_ar_system_options IS
502   SELECT salesrep_required_flag
503   FROM ar_system_parameters;
504 
505 CURSOR csr_get_inv_info(cv_claim_id IN NUMBER) IS
506   SELECT  source_object_id, source_object_class, SUM(NVL(claim_currency_amount,0))
507   FROM ozf_claim_lines
508   WHERE claim_id = cv_claim_id
509   GROUP BY source_object_id, source_object_class;
510 
511 l_object_class        VARCHAR2(15);
512 l_invoice_id          NUMBER;
513 
514 l_sum_line_amt        NUMBER;
515 l_sum_util_amt        NUMBER;
516 l_line_acctd_amt      NUMBER;
517 l_line_util_err       VARCHAR2(1)   := FND_API.g_false;
518 l_return_status       VARCHAR2(1);
519 l_complete_flag       VARCHAR2(1);
520 l_complete_yet        VARCHAR2(1)   := FND_API.g_true;
521 l_line_currency       VARCHAR2(3);
522 l_line_amount         NUMBER;
523 l_line_claim_curr_amt NUMBER;
524 l_claim_line_id       NUMBER;
525 l_line_amt_err_flag   VARCHAR2(1)   := FND_API.g_true;
526 l_asso_earning_exist  VARCHAR2(1)   := FND_API.g_false;
527 l_asso_earning        VARCHAR2(1);
528 l_vendor_in_sys       NUMBER        := NULL;
529 l_rec_clr_in_sys      NUMBER        := NULL;
530 l_trx_type_id         NUMBER        := NULL;
531 l_trx_type            VARCHAR2(20);
532 l_creation_sign       VARCHAR2(30);
533 l_gl_count            NUMBER := 0;
534 l_gl_date_type        VARCHAR2(30);
535 l_gl_acc_checking     VARCHAR2(1);
536 l_batch_source_id     NUMBER;
537 l_dummy               NUMBER;
538 l_credit_memo_reason  VARCHAR2(30);
539 l_adjust_reason       VARCHAR2(30);
540 l_claim_reason_name   VARCHAR2(60);
541 l_reason_type         VARCHAR2(30);
542 l_cm_trx_type_id      NUMBER;
546 l_neg_wo_rec_trx_id   NUMBER;
543 l_dm_trx_type_id      NUMBER;
544 l_cb_trx_type_id      NUMBER;
545 l_wo_rec_trx_id       NUMBER;
547 l_adj_rec_trx_id      NUMBER;
548 l_sp_cm_trx_type_id   NUMBER;
549 l_sp_dm_trx_type_id   NUMBER;
550 l_sp_cb_trx_type_id   NUMBER;
551 l_sp_adj_rec_trx_id   NUMBER;
552 l_sp_wo_rec_trx_id    NUMBER;
553 l_sp_neg_wo_rec_trx_id NUMBER;
554 l_error               BOOLEAN  := FALSE;
555 l_trx_balance         NUMBER;
556 l_process_setl_wf     VARCHAR2(1);
557 l_count               NUMBER;
558 l_line_item_id        NUMBER;
559 l_line_uom_code       VARCHAR2(30);
560 l_line_quantity       NUMBER;
561 l_line_rate           NUMBER;
562 l_line_org_id         NUMBER;
563 l_primary_uom_code    VARCHAR2(3);
564 l_primary_uom_class   VARCHAR2(10);
565 l_line_uom_class      VARCHAR2(10);
566 l_prod_uom_code       VARCHAR2(30);
567 l_prod_inv_flag       VARCHAR2(1);
568 l_asso_offr_perf_id   NUMBER;
569 l_offr_perf_flag_err  BOOLEAN  := FALSE;
570 l_promo_distinct_err  BOOLEAN  := FALSE;
571 l_earnings_asso_flag  VARCHAR2(1);
572 l_payment_schedule_id NUMBER;
573 l_salesrep_req_flag   VARCHAR2(1);
574 l_trx_currency        VARCHAR2(15);
575 
576 BEGIN
577    IF OZF_DEBUG_HIGH_ON THEN
578       OZF_Utility_PVT.debug_message(l_full_name||' : start');
579    END IF;
580 
581    -- Initialize API return status to sucess
582    x_return_status := FND_API.g_ret_sts_success;
583 
584    l_return_status := FND_API.g_ret_sts_success;
585 
586    OPEN csr_sum_line_amt(p_claim_rec.claim_id);
587    FETCH csr_sum_line_amt INTO l_sum_line_amt;
588    CLOSE csr_sum_line_amt;
589 
590    -- check if GL Accounting Flg is turning on in System Parameer.
591    OPEN csr_sysparam_defaults(p_claim_rec.set_of_books_id);
592    FETCH csr_sysparam_defaults INTO l_batch_source_id
593                                   , l_gl_acc_checking
594                                   , l_rec_clr_in_sys
595                                   , l_sp_cm_trx_type_id
596                                   , l_sp_dm_trx_type_id
597                                   , l_sp_cb_trx_type_id
598                                   , l_sp_adj_rec_trx_id
599                                   , l_sp_wo_rec_trx_id
600                                   , l_sp_neg_wo_rec_trx_id;
601    CLOSE csr_sysparam_defaults;
602 
603 
604   /*-----------------------------------------------------*
605    | CREDIT_MEMO / DEBIT_MEMO: Receivables Batch Source is required for Interface
606    *-----------------------------------------------------*/
607    IF p_claim_rec.payment_method IN ('CREDIT_MEMO', 'DEBIT_MEMO') AND
608       l_batch_source_id IS NULL THEN
609       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
610          FND_MESSAGE.set_name('OZF','OZF_BATCH_SRC_REQ_FOR_INTF');
611          FND_MSG_PUB.add;
612       END IF;
613       RAISE FND_API.G_EXC_ERROR;
614    END IF;
615 
616 
617    ------------------------------------------------------
618    -- Sales Credit
619    --   Bug 2851466 fixing: Sales Rep is required in Claims
620    --   if "Requires Salesperson" in AR system options.
621    ------------------------------------------------------
622    IF p_claim_rec.payment_method IN ('CREDIT_MEMO', 'DEBIT_MEMO')
623       OR  p_claim_rec.payment_method = 'RMA' THEN
624       OPEN csr_ar_system_options;
625       FETCH csr_ar_system_options INTO l_salesrep_req_flag;
626       CLOSE csr_ar_system_options;
627 
628       IF l_salesrep_req_flag = 'Y' AND
629          p_claim_rec.sales_rep_id IS NULL THEN
630          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
631             FND_MESSAGE.set_name('OZF', 'OZF_SETL_MISS_SALESREP');
632             FND_MSG_PUB.add;
633          END IF;
634          RAISE FND_API.G_EXC_ERROR;
635       END IF;
636    END IF;
637 
638    /*------------------------------------------------------
639     | Claim Type / Creation Sign / Reason Code
640     *-----------------------------------------------------*/
641     OPEN csr_trx_type(p_claim_rec.claim_type_id);
642     FETCH csr_trx_type INTO l_cm_trx_type_id
643                        ,    l_dm_trx_type_id
644                        ,    l_cb_trx_type_id
645                        ,    l_wo_rec_trx_id
646                        ,    l_neg_wo_rec_trx_id
647                        ,    l_adj_rec_trx_id;
648     CLOSE csr_trx_type;
649 
650     l_cm_trx_type_id    := NVL(l_cm_trx_type_id    ,l_sp_cm_trx_type_id);
651     l_dm_trx_type_id    := NVL(l_dm_trx_type_id    ,l_sp_dm_trx_type_id);
652     l_cb_trx_type_id    := NVL(l_cb_trx_type_id    ,l_sp_cb_trx_type_id);
653     l_wo_rec_trx_id     := NVL(NVL(p_claim_rec.wo_rec_trx_id,l_wo_rec_trx_id),l_sp_wo_rec_trx_id);
654     l_neg_wo_rec_trx_id := NVL(NVL(p_claim_rec.wo_rec_trx_id,l_neg_wo_rec_trx_id) ,l_sp_neg_wo_rec_trx_id);
655     l_adj_rec_trx_id    := NVL(NVL(p_claim_rec.wo_rec_trx_id,l_adj_rec_trx_id),l_sp_adj_rec_trx_id);
656 
657 
658     OPEN csr_reason(p_claim_rec.reason_code_id);
659     FETCH csr_reason INTO l_credit_memo_reason
660                         , l_adjust_reason
661                         , l_claim_reason_name;
662     CLOSE csr_reason;
663 
667                                      , 'CHARGEBACK'
664     -- creation sign should match the claim settlement amount sign
665     IF p_claim_rec.payment_method IN ( 'CREDIT_MEMO'
666                                      , 'DEBIT_MEMO'
668                                      ) THEN
669        IF p_claim_rec.payment_method = 'CREDIT_MEMO' AND
670           l_cm_trx_type_id IS NOT NULL THEN
671           OPEN csr_chk_trx_type(l_cm_trx_type_id);
672           FETCH csr_chk_trx_type INTO l_trx_type, l_creation_sign;
673           CLOSE csr_chk_trx_type;
674        ELSIF p_claim_rec.payment_method = 'DEBIT_MEMO' AND
675           l_dm_trx_type_id IS NOT NULL THEN
676           OPEN csr_chk_trx_type(l_dm_trx_type_id);
677           FETCH csr_chk_trx_type INTO l_trx_type, l_creation_sign;
678           CLOSE csr_chk_trx_type;
679        ELSIF p_claim_rec.payment_method = 'CHARGEBACK' AND
680           l_cb_trx_type_id IS NOT NULL THEN
681           OPEN csr_chk_trx_type(l_cb_trx_type_id);
682           FETCH csr_chk_trx_type INTO l_trx_type, l_creation_sign;
683           CLOSE csr_chk_trx_type;
684        END IF;
685 
686        IF p_claim_rec.amount > 0 AND
687           l_creation_sign = 'P' THEN
688           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
689              FND_MESSAGE.set_name('OZF', 'OZF_SETL_TRX_TYPE_CS_WRONG');
690              FND_MSG_PUB.add;
691           END IF;
692           l_error := TRUE;
693        ELSIF p_claim_rec.amount < 0 AND
694              l_creation_sign = 'N' THEN
695           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
696              FND_MESSAGE.set_name('OZF', 'OZF_SETL_TRX_TYPE_CS_WRONG');
697              FND_MSG_PUB.add;
698           END IF;
699           l_error := TRUE;
700        END IF;
701     END IF;
702 
703     -- Receivable Transaction Type should match to payment method.
704     -- Credit Memo Reason is required for CREDIT_MEMO and RMA settlement
705     -- Adjustment Reason can't be ENDORSEMENT or EXCHANGE for CHARGEBACK settlement
706     ------------ REG_CREDIT_MEMO ----------------
707     IF p_claim_rec.payment_method = 'REG_CREDIT_MEMO' THEN
708        IF l_credit_memo_reason IS NULL THEN
709           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
710              FND_MESSAGE.set_name('OZF', 'OZF_SETL_CM_REASON_ERR');
711              FND_MSG_PUB.add;
712           END IF;
713           l_error := TRUE;
714        END IF;
715 
716     ------------ CREDIT_MEMO ----------------
717     ELSIF p_claim_rec.payment_method = 'CREDIT_MEMO' THEN
718        IF l_cm_trx_type_id IS NULL THEN
719           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
720              FND_MESSAGE.set_name('OZF', 'OZF_SETL_CM_TRX_ID_REQ');
721              FND_MSG_PUB.add;
722           END IF;
723           l_error := TRUE;
724        END IF;
725        IF p_claim_rec.claim_class = 'DEDUCTION' AND
726           p_claim_rec.source_object_id IS NOT NULL AND
727           l_sum_line_amt < p_claim_rec.amount_remaining THEN
728           -- adj_rec_trx_id is required later in case of tax_impact transaction
729           IF l_adj_rec_trx_id IS NULL THEN
730              IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
731                 FND_MESSAGE.set_name('OZF', 'OZF_SETL_ADJ_TRX_ID_REQ');
732                 FND_MSG_PUB.add;
733              END IF;
734              l_error := TRUE;
735           END IF;
736        END IF;
737 
738     ------------ DEBIT_MEMO ----------------
739     ELSIF p_claim_rec.payment_method = 'DEBIT_MEMO' THEN
740        IF l_dm_trx_type_id IS NULL THEN
741           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
742              FND_MESSAGE.set_name('OZF', 'OZF_SETL_DM_TRX_ID_REQ');
743              FND_MSG_PUB.add;
744           END IF;
745           l_error := TRUE;
746        END IF;
747 
748     ------------ CHARGEBACK ----------------
749     ELSIF p_claim_rec.payment_method = 'CHARGEBACK' THEN
750        IF l_adjust_reason IN ('ENDORSEMENT', 'EXCHANGE') THEN
751           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
752              FND_MESSAGE.set_name('OZF', 'OZF_SETL_CB_REACODE_ERR');
753              FND_MSG_PUB.add;
754           END IF;
755           l_error := TRUE;
756        END IF;
757        IF l_cb_trx_type_id IS NULL THEN
758           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
759              FND_MESSAGE.set_name('OZF', 'OZF_SETL_CB_TRX_ID_REQ');
760              FND_MSG_PUB.add;
761           END IF;
762           l_error := TRUE;
763        END IF;
764 
765     ------------ WRITE_OFF ----------------
766     ELSIF p_claim_rec.payment_method = 'WRITE_OFF' THEN
767        IF p_claim_rec.claim_class = 'DEDUCTION' THEN
768           IF p_claim_rec.source_object_id IS NOT NULL AND
769              l_adj_rec_trx_id IS NULL THEN
770              IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
771                 FND_MESSAGE.set_name('OZF', 'OZF_SETL_ADJ_TRX_ID_REQ');
772                 FND_MSG_PUB.add;
773              END IF;
774              l_error := TRUE;
775           -- 11.5.10 Negative Receipt Write Off
776           ELSIF p_claim_rec.source_object_id IS NULL AND
777                 ARP_DEDUCTION_COVER.negative_rct_writeoffs_allowed() AND
778                 l_neg_wo_rec_trx_id IS NULL THEN
782              END IF;
779              IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
780                 FND_MESSAGE.set_name('OZF', 'OZF_SETL_NEG_WO_TRX_ID_REQ');
781                 FND_MSG_PUB.add;
783              l_error := TRUE;
784           END IF;
785        ELSIF p_claim_rec.claim_class = 'OVERPAYMENT' AND
786              l_wo_rec_trx_id IS NULL THEN
787           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
788              FND_MESSAGE.set_name('OZF', 'OZF_SETL_WO_TRX_ID_REQ');
789              FND_MSG_PUB.add;
790           END IF;
791           l_error := TRUE;
792        END IF;
793     ------------ RMA ----------------
794     ELSIF p_claim_rec.payment_method = 'RMA' THEN
795        IF l_credit_memo_reason IS NULL THEN
796           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
797              FND_MESSAGE.set_name('OZF', 'OZF_SETL_RMA_REASON_REQ');
798              FND_MESSAGE.set_token('REASON', l_claim_reason_name);
799              FND_MSG_PUB.add;
800           END IF;
801           l_error := TRUE;
802        END IF;
803     END IF;
804 
805     IF l_error THEN
806        RAISE FND_API.G_EXC_ERROR;
807     END IF;
808 
809    /*-----------------------------------------------------
810     | Related Customer and Site checking
811     *-----------------------------------------------------*/
812     -- related customer and site check
813     IF p_claim_rec.pay_related_account_flag = FND_API.g_true THEN
814       -- related_cust_acct_id should exist if pay_related_customer_flag is 'T'
815       IF p_claim_rec.related_cust_account_id IS NULL THEN
816         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
817           FND_MESSAGE.set_name('OZF', 'OZF_SETL_RELCUST_REQ');
818           FND_MSG_PUB.add;
819         END IF;
820         RAISE FND_API.G_EXC_ERROR;
821       END IF;
822       -- related_site_use_id should exist if pay_related_customer_flag is 'T'
823       IF p_claim_rec.related_site_use_id IS NULL THEN
824         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
825           FND_MESSAGE.set_name('OZF', 'OZF_SETL_RELCUST_SITE_REQ');
826           FND_MSG_PUB.add;
827         END IF;
828         RAISE FND_API.G_EXC_ERROR;
829       END IF;
830     ELSE
831      /*-----------------------------------------------------
832       | Bill To Site is required
833       *-----------------------------------------------------*/
834       IF p_claim_rec.cust_billto_acct_site_id IS NULL THEN
835          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
836            FND_MESSAGE.set_name('OZF', 'OZF_SETL_BILLTO_SITE_REQ');
837            FND_MSG_PUB.add;
838          END IF;
839          RAISE FND_API.G_EXC_ERROR;
840       END IF;
841     END IF;
842    /*-----------------------------------------------------
843     | Ship To Site is required for RMA settlement
844     *-----------------------------------------------------*/
845     IF p_claim_rec.payment_method = 'RMA' AND
846        p_claim_rec.cust_shipto_acct_site_id IS NULL THEN
847        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
848           FND_MESSAGE.set_name('OZF', 'OZF_SETL_SHIPTO_SITE_REQ');
849           FND_MSG_PUB.add;
850        END IF;
851        RAISE FND_API.G_EXC_ERROR;
852     END IF;
853 
854 
855    /*-----------------------------------------------------
856     | Receivable Clearing Account
857     *-----------------------------------------------------*/
858     -- receivable clearning account must exist in system parameter
859     IF l_gl_acc_checking = FND_API.g_true AND
860        l_rec_clr_in_sys IS NULL AND
861        p_claim_rec.payment_method <> 'RMA' THEN
862        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
863           FND_MESSAGE.set_name('OZF', 'OZF_SETL_RECCLRACC_REQ');
864           FND_MSG_PUB.add;
865        END IF;
866        RAISE FND_API.G_EXC_ERROR;
867     END IF;
868 
869    /*-----------------------------------------------------
870     | Prev Open Credit Memo/Debit Memo: open balance amount checking
871     *-----------------------------------------------------*/
872     IF p_claim_rec.payment_method IN ('PREV_OPEN_CREDIT', 'PREV_OPEN_DEBIT') THEN
873       IF p_claim_rec.payment_reference_id IS NULL THEN
874          IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
875             FND_MESSAGE.set_name('OZF','OZF_PAY_REFERENCE_REQD');
876             FND_MSG_PUB.add;
877          END IF;
878          RAISE FND_API.G_EXC_ERROR;
879       ELSE
880          OPEN csr_trx_balance(p_claim_rec.payment_reference_id);
881          FETCH csr_trx_balance INTO l_trx_balance, l_trx_currency;
882          CLOSE csr_trx_balance;
883 
884          IF p_claim_rec.currency_code = l_trx_currency AND
885             ABS(p_claim_rec.amount_remaining) > ABS(l_trx_balance) THEN
886             IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
887              FND_MESSAGE.set_name('OZF', 'OZF_SETL_CM_DM_OP_BAL_ERR');
888              FND_MSG_PUB.add;
889             END IF;
890             RAISE FND_API.G_EXC_ERROR;
891          END IF;
892       END IF;
893     END IF;
894 
895 
896    /*-----------------------------------------------------*
897     | Credit Memo-Invoice settlement validation
898     |   Modified for 4308173
899     *-----------------------------------------------------*/
900     IF p_claim_rec.payment_method = 'REG_CREDIT_MEMO' THEN
901 
902        -- Invoice information needs to exist on claim line.
903        OPEN  csr_get_inv_info(p_claim_rec.claim_id);
904        LOOP
905           FETCH csr_get_inv_info INTO l_invoice_id, l_object_class,l_sum_line_amt;
906           EXIT WHEN csr_get_inv_info%NOTFOUND;
907           IF l_invoice_id IS NULL THEN
908              FND_MESSAGE.set_name('OZF', 'OZF_SETL_INV_CR_TRX_MISS');
909              FND_MSG_PUB.add;
910              RAISE FND_API.G_EXC_ERROR;
911           ELSIF  l_object_class IS NULL OR l_object_class NOT IN ('INVOICE','DM', 'CB') THEN
912              FND_MESSAGE.set_name('OZF', 'OZF_SETL_INVALID_OBJ_CLASS');
913              FND_MSG_PUB.add;
914              RAISE FND_API.G_EXC_ERROR;
915           END IF;
916        END LOOP;
917        CLOSE csr_get_inv_info;
918 
919        -- Validation for non invoice deductions is done during payment.
920        IF p_claim_rec.claim_class = 'CLAIM' OR
921          ( p_claim_rec.claim_class = 'DEDUCTION' AND   p_claim_rec.source_object_id IS NOT NULL )  THEN
922            Validate_CreditTo_Information(
923                   p_claim_rec       => p_claim_rec
924 		         ,x_return_status   => l_return_status
925              );
926            IF l_return_status =  FND_API.g_ret_sts_error THEN
927          		RAISE FND_API.g_exc_error;
928 	       ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
929       	        RAISE FND_API.g_exc_unexpected_error;
930            END IF;
931        END IF;
932 
933     END IF; -- REG_CREDIT_MEMO
934 
935 
936    /*-----------------------------------------------------
937     | Product Information Validation
938     | Check only for CREDIT_MEMO / DEBIT_MEMO / RMA settlement.
939     *-----------------------------------------------------*/
940     IF p_claim_rec.payment_method IN ('CREDIT_MEMO', 'DEBIT_MEMO', 'RMA') THEN
941        OPEN csr_chk_line_product(p_claim_rec.claim_id);
942        LOOP
943           FETCH csr_chk_line_product INTO l_line_item_id
944                                         , l_line_uom_code
945                                         , l_line_org_id;
946           EXIT WHEN csr_chk_line_product%NOTFOUND;
947 
948           IF l_line_item_id IS NOT NULL THEN
949              IF l_line_uom_code IS NOT NULL THEN
950                 -- Primary UOM validation
951                 OPEN csr_validate_primary_uom(l_line_item_id, l_line_org_id);
952                 FETCH csr_validate_primary_uom INTO l_primary_uom_code;
953                 CLOSE csr_validate_primary_uom;
954 
955                 -- UOM class sharing validation
956                 IF l_primary_uom_code <> l_line_uom_code THEN
957                    OPEN csr_validate_uom_class(l_primary_uom_code);
958                    FETCH csr_validate_uom_class INTO l_primary_uom_class;
959                    CLOSE csr_validate_uom_class;
960                    OPEN csr_validate_uom_class(l_line_uom_code);
961                    FETCH csr_validate_uom_class INTO l_line_uom_class;
962                    CLOSE csr_validate_uom_class;
963                    IF l_primary_uom_class <> l_line_uom_class THEN
964                       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
965                          FND_MESSAGE.set_name('OZF', 'OZF_SETL_PROD_UOM_INVALID');
966                          FND_MSG_PUB.add;
967                       END IF;
968                       l_error := TRUE;
969                    END IF;
970                 END IF;
971              ELSE
972                 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
973                    FND_MESSAGE.set_name('OZF', 'OZF_SETL_PROD_UOM_MISSING');
974                    FND_MSG_PUB.add;
975                 END IF;
976                 l_error := TRUE;
977              END IF;
978           END IF;
979        END LOOP;
980        CLOSE csr_chk_line_product;
981     END IF;
982 
983     IF l_error THEN
984        RAISE FND_API.G_EXC_ERROR;
985     END IF;
986 
987 
988   IF OZF_DEBUG_HIGH_ON THEN
989      OZF_Utility_PVT.debug_message(l_full_name||' : end');
990   END IF;
991 
992 EXCEPTION
993    WHEN FND_API.G_EXC_ERROR THEN
994       x_return_status := FND_API.G_RET_STS_ERROR;
995    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
996       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
997    WHEN OTHERS THEN
998       x_return_status := FND_API.g_ret_sts_unexp_error ;
999       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
1000          FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
1001       END IF;
1002 END Complete_AR_Validation;
1003 
1004 
1005 END OZF_AR_VALIDATION_PVT;