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