[Home] [Help]
PACKAGE BODY: APPS.OZF_CLAIM_ACCRUAL_PVT
Source
1 PACKAGE BODY OZF_CLAIM_ACCRUAL_PVT AS
2 /* $Header: ozfvcacb.pls 120.60.12010000.19 2009/02/02 12:05:52 psomyaju ship $ */
3
4 g_pkg_name CONSTANT VARCHAR2(30):='OZF_Claim_Accrual_PVT';
5
6 G_FUNCTIONAL_CURRENCY VARCHAR2(15) := NULL;
7 G_OFFER_CURRENCY VARCHAR2(15) := NULL;
8 G_UNIV_CURRENCY VARCHAR2(15) := NULL;
9 G_CLAIM_CURRENCY VARCHAR2(15) := NULL;
10 G_ACCRUAL_CURRENCY VARCHAR2(15) := NULL;
11
12
13 -- object_type
14 G_CLAIM_OBJECT_TYPE CONSTANT VARCHAR2(30) := 'CLAM';
15
16 OZF_DEBUG_HIGH_ON CONSTANT BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_high);
17 OZF_DEBUG_LOW_ON CONSTANT BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_low);
18
19 CURSOR g_site_trade_profile_csr(p_id in number) IS
20 SELECT trade_profile_id,
21 cust_account_id,
22 site_use_id,
23 payment_method,
24 vendor_id,
25 vendor_site_id,
26 last_paid_date,
27 autopay_periodicity,
28 autopay_periodicity_type,
29 autopay_flag,
30 claim_threshold,
31 claim_currency,
32 org_id
33 FROM ozf_cust_trd_prfls
34 WHERE site_use_id = p_id;
35
36 CURSOR g_cust_trade_profile_csr(p_id in number) IS
37 SELECT trade_profile_id,
38 cust_account_id,
39 site_use_id,
40 payment_method,
41 vendor_id,
42 vendor_site_id,
43 last_paid_date,
44 autopay_periodicity,
45 autopay_periodicity_type,
46 autopay_flag,
47 claim_threshold,
48 claim_currency,
49 org_id
50 FROM ozf_cust_trd_prfls
51 WHERE cust_account_id = p_id;
52
53 CURSOR g_party_trade_profile_csr(p_id in number) IS
54 SELECT trade_profile_id,
55 cust_account_id,
56 site_use_id,
57 payment_method,
58 vendor_id,
59 vendor_site_id,
60 last_paid_date,
61 autopay_periodicity,
62 autopay_periodicity_type,
63 autopay_flag,
64 claim_threshold,
65 claim_currency,
66 org_id
67 FROM ozf_cust_trd_prfls
68 WHERE party_id = p_id
69 AND cust_account_id IS NULL;
70
71 l_original_total_amount NUMBER :=0;
72 l_entered_amount NUMBER :=0;
73
74 ---------------------------------------------------------------------
75 -- FUNCTION
76 -- Calculate_SD_FXGL_Amount
77 --
78 -- PURPOSE
79 -- Returns FXGL amount of the Ship - Debit claim line util
80 --
81 -- PARAMETERS
82 --
83 --
84 -- NOTES
85 -- created by psomyaju for Ship - Debit Claims
86 ---------------------------------------------------------------------
87 FUNCTION Calculate_SD_FXGL_Amount(
88 p_line_util_rec IN line_util_rec_type
89 ) RETURN NUMBER
90 IS
91
92 CURSOR csr_offr_util_details(cv_utilization_id IN NUMBER) IS
93 SELECT transaction_currency_code
94 , conversion_type
95 , conversion_date
96 , conversion_rate
97 FROM ozf_funds_utilized_all_b fu
98 , ozf_offers offr
99 , gl_daily_rates gl
100 WHERE utilization_id = cv_utilization_id
101 AND fu.plan_id = offr.qp_list_header_id
102 AND fu.exchange_rate_type = gl.conversion_type
103 AND TRUNC(fu.exchange_rate_date) = gl.conversion_date
104 AND offr.transaction_currency_code = gl.from_currency
105 AND gl.to_currency = G_FUNCTIONAL_CURRENCY;
106
107
108 CURSOR csr_function_currency IS
109 SELECT gs.currency_code
110 FROM gl_sets_of_books gs
111 , ozf_sys_parameters org
112 WHERE org.set_of_books_id = gs.set_of_books_id
113 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
114
115 l_offr_currency_code VARCHAR2(15);
116 l_offr_exc_rate NUMBER;
117 l_offr_exc_date DATE;
118 l_offr_exc_type VARCHAR2(30);
119 l_return_status VARCHAR2(1);
120 l_utilized_amount NUMBER := 0;
121 l_fxgl_acctd_amount NUMBER := 0;
122
123 BEGIN
124 OPEN csr_function_currency;
125 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
126 CLOSE csr_function_currency;
127
128
129 OPEN csr_offr_util_details(p_line_util_rec.utilization_id);
130 FETCH csr_offr_util_details INTO l_offr_currency_code, l_offr_exc_type , l_offr_exc_date , l_offr_exc_rate ;
131 CLOSE csr_offr_util_details;
132
133 IF OZF_DEBUG_HIGH_ON THEN
134 OZF_Utility_PVT.debug_message('FXGL l_offr_currency_code : '||l_offr_currency_code);
135 OZF_Utility_PVT.debug_message('G_FUNCTIONAL_CURRENCY : '||G_FUNCTIONAL_CURRENCY);
136 OZF_Utility_PVT.debug_message('l_fu_exc_rate : '||l_offr_exc_rate);
137 OZF_Utility_PVT.debug_message('p_line_util_rec.exchange_rate : '||p_line_util_rec.exchange_rate);
138 OZF_Utility_PVT.debug_message('p_line_util_rec.acctd_amount : '||p_line_util_rec.acctd_amount);
139 END IF;
140
141
142 IF p_line_util_rec.currency_code <> G_FUNCTIONAL_CURRENCY THEN
143
144 IF p_line_util_rec.exchange_rate <> l_offr_exc_rate AND l_offr_exc_rate IS NOT NULL THEN
145 OZF_UTILITY_PVT.Convert_Currency(
146 p_from_currency => p_line_util_rec.currency_code
147 ,p_to_currency => G_FUNCTIONAL_CURRENCY
148 ,p_conv_type => l_offr_exc_type
149 ,p_conv_rate => l_offr_exc_rate
150 ,p_conv_date => l_offr_exc_date
151 ,p_from_amount => p_line_util_rec.amount
152 ,x_return_status => l_return_status
153 ,x_to_amount => l_utilized_amount
154 ,x_rate => l_offr_exc_rate
155 );
156 IF l_return_status = FND_API.g_ret_sts_error THEN
157 RAISE FND_API.g_exc_error;
158 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
159 RAISE FND_API.g_exc_unexpected_error;
160 END IF;
161 END IF;
162 END IF;
163
164 IF l_utilized_amount <> 0 THEN
165 l_fxgl_acctd_amount := p_line_util_rec.acctd_amount - l_utilized_amount;
166 END IF;
167
168 RETURN l_fxgl_acctd_amount;
169
170 END Calculate_SD_FXGL_Amount;
171
172
173 ---------------------------------------------------------------------
174 -- PROCEDURE
175 -- Update_Fund_utils
176 -- 22-Oct-2005 Created Sahana
177 -- 08-Aug-06 azahmed Modified for FXGL Er
178 -- 21-Jan-08 psomyaju Modified for Ship - Debit Claims
179 ---------------------------------------------------------------------
180 PROCEDURE Update_Fund_Utils(
181 x_return_status OUT NOCOPY VARCHAR2
182 ,x_msg_count OUT NOCOPY NUMBER
183 ,x_msg_data OUT NOCOPY VARCHAR2
184
185 ,p_line_util_rec IN OUT NOCOPY line_util_rec_type
186 ,p_fu_diff_acctd_amt_rem IN NUMBER
187 ,p_mode IN VARCHAR2 := 'CALCULATE'
188 )
189 IS
190 l_api_version CONSTANT NUMBER := 1.0;
191 l_api_name CONSTANT VARCHAR2(30) := ' Update_Fund_Utils';
192 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
193 l_return_status VARCHAR2(1);
194
195 l_line_util_rec line_util_rec_type := p_line_util_rec;
196
197
198 l_fu_utiz_currency VARCHAR2(15);
199 l_fu_exc_rate NUMBER;
200 l_fu_exc_date DATE;
201 l_fu_exc_type VARCHAR2(30);
202 l_fu_old_acctd_amt_rem NUMBER;
203 l_fu_new_acctd_amt_rem NUMBER ;
204 l_fu_old_amt_rem NUMBER;
205 l_fu_new_amt_rem NUMBER;
206 l_fu_old_plan_amt_rem NUMBER;
207 l_fu_new_plan_amt_rem NUMBER;
208 l_fu_old_univ_amt_rem NUMBER;
209 l_fu_new_univ_amt_rem NUMBER;
210 l_fu_amt NUMBER;
211 l_fu_acctd_amt NUMBER;
212 l_fu_plan_amt NUMBER;
213 l_fu_plan_type VARCHAR2(30);
214 l_fu_plan_id NUMBER;
215 l_fu_old_scan_unit_rem NUMBER;
216 l_fu_new_scan_unit_rem NUMBER;
217 l_fu_component_type VARCHAR2(30);
218 l_fu_component_id NUMBER;
219 l_fu_fund_id NUMBER;
220
221 l_reference_id NUMBER;
222 l_source_object_class VARCHAR2(15);
223
224 CURSOR csr_offer_currency(cv_plan_id IN NUMBER) IS
225 SELECT transaction_currency_code
226 FROM ozf_offers
227 WHERE qp_list_header_id = cv_plan_id;
228
229 --reference_id added for Ship - Debit claims / Pranay
230 CURSOR csr_fu_old_amt_rem(cv_utilization_id IN NUMBER) IS
231 SELECT currency_code
232 , exchange_rate
233 , exchange_rate_type
234 , exchange_rate_date
235 , amount_remaining
236 , acctd_amount_remaining
237 , scan_unit_remaining
238 , plan_curr_amount_remaining
239 , amount
240 , acctd_amount
241 , plan_curr_amount
242 , plan_type
243 , plan_id
244 , univ_curr_amount_remaining
245 , component_type
246 , component_id
247 , fund_id
248 , reference_id
249 FROM ozf_funds_utilized_all_b
250 WHERE utilization_id = cv_utilization_id;
251
252 --csr_object_class added for Ship - Debit claims / Pranay
253 CURSOR csr_object_class (cv_request_id IN NUMBER) IS
254 SELECT cla.source_object_class
255 FROM ozf_claims cla
256 , ozf_claim_lines line
257 WHERE cla.claim_id = line.claim_id
258 AND line.activity_id = cv_request_id;
259
260 BEGIN
261 --------------------- initialize -----------------------
262 SAVEPOINT Update_Fund_Utils;
263
264 IF OZF_DEBUG_HIGH_ON THEN
265 OZF_Utility_PVT.debug_message(l_full_name||': start');
266 END IF;
267
268 x_return_status := FND_API.g_ret_sts_success;
269
270
271 OPEN csr_fu_old_amt_rem(l_line_util_rec.utilization_id);
272 FETCH csr_fu_old_amt_rem INTO l_fu_utiz_currency
273 , l_fu_exc_rate
274 , l_fu_exc_type
275 , l_fu_exc_date
276 , l_fu_old_amt_rem
277 , l_fu_old_acctd_amt_rem
278 , l_fu_old_scan_unit_rem
279 , l_fu_old_plan_amt_rem
280 , l_fu_amt
281 , l_fu_acctd_amt
282 , l_fu_plan_amt
283 , l_fu_plan_type
284 , l_fu_plan_id
285 , l_fu_old_univ_amt_rem
286 , l_fu_component_type
287 , l_fu_component_id
288 , l_fu_fund_id
289 , l_reference_id;
290 CLOSE csr_fu_old_amt_rem;
291
292 OPEN csr_object_class(l_reference_id);
293 FETCH csr_object_class INTO l_source_object_class;
294 CLOSE csr_object_class;
295
296 --l_source_object_class check added for Ship - Debit claims / Pranay
297 IF NVL(l_source_object_class,'X') <> 'SD_SUPPLIER' THEN
298 -- The amount passed is in accrual currency and thus amount field needs to be
299 -- reduced
300 l_fu_new_amt_rem := l_fu_old_amt_rem + p_fu_diff_acctd_amt_rem;
301 -- Functional Currency and Universal Currency are derived in the calling routine
302 --- Derive Offer Currency Here
303 G_OFFER_CURRENCY := OZF_ACTBUDGETS_PVT.Get_Object_Currency(
304 p_object => l_fu_plan_type
305 ,p_object_id => l_fu_plan_id
306 ,x_return_status => l_return_status
307 );
308 IF l_return_status = FND_API.g_ret_sts_error THEN
309 RAISE FND_API.g_exc_error;
310 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
311 RAISE FND_API.g_exc_unexpected_error;
312 END IF;
313
314 IF G_FUNCTIONAL_CURRENCY = l_fu_utiz_currency THEN
315 l_fu_new_acctd_amt_rem := l_fu_new_amt_rem ;
316 ELSE
317 IF l_fu_new_amt_rem = 0 THEN
318 l_fu_new_acctd_amt_rem := 0;
319 ELSE
320 OZF_UTILITY_PVT.Convert_Currency(
321 p_from_currency => l_fu_utiz_currency
322 ,p_to_currency => G_FUNCTIONAL_CURRENCY
323 ,p_conv_type => l_fu_exc_type
324 ,p_conv_rate => l_fu_exc_rate
325 ,p_conv_date => l_fu_exc_date
326 ,p_from_amount => l_fu_new_amt_rem
327 ,x_return_status => l_return_status
328 ,x_to_amount => l_fu_new_acctd_amt_rem
329 ,x_rate => l_fu_exc_rate
330 );
331 IF l_return_status = FND_API.g_ret_sts_error THEN
332 RAISE FND_API.g_exc_error;
333 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
334 RAISE FND_API.g_exc_unexpected_error;
335 END IF;
336 IF l_fu_new_acctd_amt_rem IS NOT NULL THEN
337 l_fu_new_acctd_amt_rem := OZF_UTILITY_PVT.CurrRound(l_fu_new_acctd_amt_rem, G_FUNCTIONAL_CURRENCY);
338 END IF;
339 END IF;
340 END IF;
341 -- plan_amount_remaining must be calculated based on the accrual amount
342 IF G_OFFER_CURRENCY = G_FUNCTIONAL_CURRENCY THEN
343 l_fu_new_plan_amt_rem := l_fu_new_acctd_amt_rem;
344 ELSIF G_OFFER_CURRENCY = l_fu_utiz_currency THEN
345 l_fu_new_plan_amt_rem := l_fu_new_amt_rem;
346 ELSE
347 IF l_fu_new_acctd_amt_rem = 0 THEN
348 l_fu_new_plan_amt_rem := 0;
349 ELSE
350 OZF_UTILITY_PVT.Convert_Currency(
351 p_from_currency => l_fu_utiz_currency
352 ,p_to_currency => G_OFFER_CURRENCY
353 ,p_conv_date => l_fu_exc_date
354 ,p_from_amount => l_fu_new_amt_rem
355 ,x_return_status => l_return_status
356 ,x_to_amount => l_fu_new_plan_amt_rem
357 );
358 IF l_return_status = FND_API.g_ret_sts_error THEN
359 RAISE FND_API.g_exc_error;
360 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
361 RAISE FND_API.g_exc_unexpected_error;
362 END IF;
363 IF l_fu_new_plan_amt_rem IS NOT NULL THEN
364 l_fu_new_plan_amt_rem := OZF_UTILITY_PVT.CurrRound(l_fu_new_plan_amt_rem, G_OFFER_CURRENCY);
365 END IF;
366 END IF;
367 END IF;
368
369
370 IF G_UNIV_CURRENCY = G_FUNCTIONAL_CURRENCY THEN
371 l_fu_new_univ_amt_rem := l_fu_new_acctd_amt_rem;
372 ELSIF G_UNIV_CURRENCY = l_fu_utiz_currency THEN
373 l_fu_new_univ_amt_rem := l_fu_new_amt_rem;
374 ELSIF G_UNIV_CURRENCY = G_OFFER_CURRENCY THEN
375 l_fu_new_univ_amt_rem := l_fu_new_plan_amt_rem;
376 ELSE
377 IF l_fu_new_acctd_amt_rem = 0 THEN
378 l_fu_new_univ_amt_rem := 0;
379 ELSE
380 OZF_UTILITY_PVT.Convert_Currency(
381 p_from_currency => l_fu_utiz_currency
382 ,p_to_currency => G_UNIV_CURRENCY
383 ,p_from_amount => l_fu_new_amt_rem
384 ,x_return_status => l_return_status
385 ,x_to_amount => l_fu_new_univ_amt_rem
386 );
387 IF l_return_status = FND_API.g_ret_sts_error THEN
388 RAISE FND_API.g_exc_error;
389 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
390 RAISE FND_API.g_exc_unexpected_error;
391 END IF;
392 IF l_fu_new_univ_amt_rem IS NOT NULL THEN
393 l_fu_new_univ_amt_rem := OZF_UTILITY_PVT.CurrRound(l_fu_new_univ_amt_rem, G_UNIV_CURRENCY);
394 END IF;
395 END IF;
396 END IF;
397
398
399 --- Update Funds Utilized
400 UPDATE ozf_funds_utilized_all_b
401 SET amount_remaining = l_fu_new_amt_rem
402 , acctd_amount_remaining = l_fu_new_acctd_amt_rem
403 , plan_curr_amount_remaining = l_fu_new_plan_amt_rem
404 , univ_curr_amount_remaining = l_fu_new_univ_amt_rem
405 --, scan_unit_remaining = l_fu_new_scan_unit_rem
406 WHERE utilization_id = l_line_util_rec.utilization_id;
407 END IF;
408 -- Calculate Amounts for Line_Utils Table. Insert/Update will be calling routine
409
410 IF p_mode = 'CALCULATE' THEN
411 --l_source_object_class check added for Ship - Debit Claims / Pranay
412 IF l_source_object_class IN ('SD_SUPPLIER','SD_INTERNAL') THEN
413 l_line_util_rec.fxgl_acctd_amount := Calculate_SD_FXGL_Amount(l_line_util_rec);
414 l_line_util_rec.utilized_acctd_amount := l_line_util_rec.acctd_amount - l_line_util_rec.fxgl_acctd_amount;
415 ELSE
416 --added for FXGL calculations
417 l_line_util_rec.fxgl_acctd_amount := Calculate_FXGL_Amount(l_line_util_rec);
418 l_line_util_rec.utilized_acctd_amount := l_line_util_rec.acctd_amount - l_line_util_rec.fxgl_acctd_amount;
419 END IF;
420
421 IF OZF_DEBUG_HIGH_ON THEN
422 OZF_Utility_PVT.debug_message('l_line_util_rec.fxgl_acctd_amount : '||l_line_util_rec.fxgl_acctd_amount );
423 OZF_Utility_PVT.debug_message('l_line_util_rec.utilized_acctd_amount : '||l_line_util_rec.utilized_acctd_amount );
424 END IF;
425
426 -- Convert util_curr_amount based on the amount
427 -- Current scenario always this will be true
428 IF l_line_util_rec.currency_code = l_fu_utiz_currency THEN
429 l_line_util_rec.util_curr_amount := l_line_util_rec.amount;
430 -- ELSE it is already set in create_line_util procedure or in update_line_util
431 /*ELSE
432 --
433 OZF_UTILITY_PVT.Convert_Currency(
434 p_from_currency => G_FUNCTIONAL_CURRENCY
435 ,p_to_currency => l_fu_utiz_currency
436 ,p_conv_type => l_fu_exc_type
437 ,p_conv_rate => l_fu_exc_rate
438 ,p_conv_date => l_fu_exc_date
439 ,p_from_amount => l_line_util_rec.acctd_amount
440 ,x_return_status => l_return_status
441 ,x_to_amount => l_line_util_rec.util_curr_amount
442 ,x_rate => l_fu_exc_rate
443 );
444 IF l_return_status = FND_API.g_ret_sts_error THEN
445 RAISE FND_API.g_exc_error;
446 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
447 RAISE FND_API.g_exc_unexpected_error;
448 END IF;
449 IF l_line_util_rec.util_curr_amount IS NOT NULL THEN
450 l_line_util_rec.util_curr_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.util_curr_amount, l_fu_utiz_currency);
451 END IF;*/
452 END IF;
453
454 IF G_OFFER_CURRENCY = G_FUNCTIONAL_CURRENCY THEN
455 l_line_util_rec.plan_curr_amount := l_line_util_rec.acctd_amount;
456 ELSIF G_OFFER_CURRENCY = l_fu_utiz_currency THEN
457 l_line_util_rec.plan_curr_amount := l_line_util_rec.util_curr_amount;
458 ELSE
459 -- the plan_curr_amount is calculated based on accrual amount
460 -- the accrual date is used and if the rate has changed on claim date
461 -- it is not considered
462 -- the plan_curr_amount is equal to amount reduced from plan_curr_amount_remaining in fu
463 OZF_UTILITY_PVT.Convert_Currency(
464 p_from_currency => l_fu_utiz_currency
465 ,p_to_currency => G_OFFER_CURRENCY
466 ,p_conv_date => l_fu_exc_date
467 ,p_from_amount => l_line_util_rec.util_curr_amount
468 ,x_return_status => l_return_status
469 ,x_to_amount => l_line_util_rec.plan_curr_amount
470 );
471 IF l_return_status = FND_API.g_ret_sts_error THEN
472 RAISE FND_API.g_exc_error;
473 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
474 RAISE FND_API.g_exc_unexpected_error;
475 END IF;
476 IF l_line_util_rec.plan_curr_amount IS NOT NULL THEN
477 l_line_util_rec.plan_curr_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.plan_curr_amount, G_OFFER_CURRENCY);
478 END IF;
479 END IF;
480
481 -- convert accrual amount --> amount(univ currency)
482 IF G_UNIV_CURRENCY = G_FUNCTIONAL_CURRENCY THEN
483 l_line_util_rec.univ_curr_amount := l_line_util_rec.acctd_amount;
484 ELSIF G_UNIV_CURRENCY = l_fu_utiz_currency THEN
485 l_line_util_rec.univ_curr_amount := l_line_util_rec.util_curr_amount;
486 ELSIF G_UNIV_CURRENCY = G_OFFER_CURRENCY THEN
487 l_line_util_rec.univ_curr_amount := l_line_util_rec.plan_curr_amount;
488 ELSE
489 OZF_UTILITY_PVT.Convert_Currency(
490 p_from_currency => l_fu_utiz_currency
491 ,p_to_currency => G_UNIV_CURRENCY
492 ,p_from_amount => l_line_util_rec.util_curr_amount
493 ,x_return_status => l_return_status
494 ,x_to_amount => l_line_util_rec.univ_curr_amount
495 );
496 IF l_return_status = FND_API.g_ret_sts_error THEN
497 RAISE FND_API.g_exc_error;
498 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
499 RAISE FND_API.g_exc_unexpected_error;
500 END IF;
501 IF l_line_util_rec.univ_curr_amount IS NOT NULL THEN
502 l_line_util_rec.univ_curr_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.univ_curr_amount, G_UNIV_CURRENCY);
503 END IF;
504 END IF;
505
506
507 END IF; -- p_mode = 'CALCULATE'
508
509 p_line_util_rec := l_line_util_rec;
510
511
512
513 FND_MSG_PUB.count_and_get(
514 p_encoded => FND_API.g_false,
515 p_count => x_msg_count,
516 p_data => x_msg_data
517 );
518
519 IF OZF_DEBUG_HIGH_ON THEN
520 OZF_Utility_PVT.debug_message(l_full_name ||': end');
521 END IF;
522
523 EXCEPTION
524 WHEN FND_API.g_exc_error THEN
525 ROLLBACK TO Update_Fund_Utils;
526 x_return_status := FND_API.g_ret_sts_error;
527 FND_MSG_PUB.count_and_get (
528 p_encoded => FND_API.g_false
529 ,p_count => x_msg_count
530 ,p_data => x_msg_data
531 );
532
533 WHEN FND_API.g_exc_unexpected_error THEN
534 ROLLBACK TO Update_Fund_Utils;
535 x_return_status := FND_API.g_ret_sts_unexp_error ;
536 FND_MSG_PUB.count_and_get (
537 p_encoded => FND_API.g_false
538 ,p_count => x_msg_count
539 ,p_data => x_msg_data
540 );
541
542 WHEN OTHERS THEN
543 ROLLBACK TO Update_Fund_Utils;
544 x_return_status := FND_API.g_ret_sts_unexp_error ;
545 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
546 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
547 END IF;
548 FND_MSG_PUB.count_and_get(
549 p_encoded => FND_API.g_false
550 ,p_count => x_msg_count
551 ,p_data => x_msg_data
552 );
553
554 END Update_Fund_Utils;
555
556
557 ---------------------------------------------------------------------
558 -- PROCEDURE
559 -- Get_Customer_For_Earnings
560 -- Helper procedure called by Get_Utiz_Sql_Stmt only.
561 --
562 -- PARAMETERS
563 -- p_cust_account_id : Claiming customer account id
564 -- p_relationship_type : Relationship_type
565 -- p_related_cust_account_id : Related customer account id
566 -- p_buy_group_party_id : Buying group/member party id
567 -- p_select_cust_children_flag : Include all member earnings
568 --
569 -- HISTORY
570 -- 14-FEB-2003 yizhang Create.
571 -- 05-MAY-2003 yizhang Use FND_DSQL for dynamic sql and bind vars
572 -- 28-feb-06 azahmed modified for bugfix 4958714
573 ---------------------------------------------------------------------
574 PROCEDURE Get_Customer_For_Earnings(
575 p_cust_account_id IN NUMBER
576 ,p_relationship_type IN VARCHAR2
577 ,p_related_cust_account_id IN NUMBER
578 ,p_buy_group_party_id IN NUMBER
579 ,p_select_cust_children_flag IN VARCHAR2
580 )
581 IS
582
583 l_bg_is_parent_of_cust NUMBER := 0;
584 l_bg_is_parent_of_relcust NUMBER := 0;
585
586 CURSOR csr_buy_group (cv_bg_party_id IN NUMBER, cv_cust_account_id IN NUMBER) IS
587 SELECT COUNT(seg.party_id)
588 FROM ams_party_market_segments seg
589 , hz_cust_accounts hca2
590 WHERE seg.market_qualifier_reference = cv_bg_party_id
591 AND hca2.party_id = seg.party_id
592 AND seg.market_qualifier_type = 'BG'
593 AND hca2.cust_account_id = cv_cust_account_id
594 AND seg.market_qualifier_reference <> seg.party_id;
595
596
597 BEGIN
598 IF p_select_cust_children_flag IS NULL OR
599 p_select_cust_children_flag = 'F' OR
600 p_select_cust_children_flag = 'N' THEN
601 -- not to include member earnings
602 IF p_buy_group_party_id IS NOT NULL THEN
603 FND_DSQL.add_text(' IN (SELECT c.cust_account_id FROM hz_cust_accounts c');
604 FND_DSQL.add_text(' WHERE c.party_id = ');
605 FND_DSQL.add_bind(p_buy_group_party_id);
606 FND_DSQL.add_text(')');
607 ELSIF p_relationship_type IS NOT NULL AND
608 p_related_cust_account_id IS NULL
609 THEN
610 FND_DSQL.add_text(' IN (SELECT related_cust_account_id FROM hz_cust_acct_relate');
611 FND_DSQL.add_text(' WHERE cust_account_id = ');
612 FND_DSQL.add_bind(p_cust_account_id);
613 FND_DSQL.add_text(' AND relationship_type = ');
614 FND_DSQL.add_bind(p_relationship_type);
615 FND_DSQL.add_text(')');
616 ELSE
617 FND_DSQL.add_text(' = ');
618 IF p_related_cust_account_id IS NOT NULL THEN
619 FND_DSQL.add_bind(p_related_cust_account_id);
620 ELSE
621 FND_DSQL.add_bind(p_cust_account_id);
622 END IF;
623 END IF;
624
625 ELSIF p_select_cust_children_flag = 'T' OR p_select_cust_children_flag = 'Y' THEN
626 -- to include member earnings
627 IF p_buy_group_party_id IS NOT NULL THEN
628 -- if buying group is parent of customer, do not include members
629 OPEN csr_buy_group(p_buy_group_party_id, p_cust_account_id);
630 FETCH csr_buy_group INTO l_bg_is_parent_of_cust;
631 CLOSE csr_buy_group;
632
633 IF l_bg_is_parent_of_cust <> 1 THEN
634 -- if buying group is parent of related customer, do not include members
635 IF p_related_cust_account_id IS NOT NULL THEN
636 OPEN csr_buy_group(p_buy_group_party_id, p_related_cust_account_id);
637 FETCH csr_buy_group INTO l_bg_is_parent_of_relcust;
638 CLOSE csr_buy_group;
639 END IF;
640 END IF;
641 END IF;
642
643 IF l_bg_is_parent_of_cust = 1 OR l_bg_is_parent_of_relcust = 1 THEN
644 FND_DSQL.add_text(' IN (SELECT c.cust_account_id ');
645 FND_DSQL.add_text(' FROM hz_cust_accounts c ');
646 FND_DSQL.add_text(' WHERE c.party_id = ');
647 FND_DSQL.add_bind(p_buy_group_party_id);
648 FND_DSQL.add_text(' OR c.cust_account_id = ');
649 IF p_related_cust_account_id is not NULL THEN
650 FND_DSQL.add_bind(p_related_cust_account_id);
651 ELSE
652 FND_DSQL.add_bind(p_cust_account_id);
653 END IF;
654 FND_DSQL.add_text(')');
655
656 ELSE
657 IF p_buy_group_party_id IS NOT NULL THEN
658 FND_DSQL.add_text(' IN (SELECT c2.cust_account_id ');
659 FND_DSQL.add_text(' FROM ams_party_market_segments sg, hz_cust_accounts c2 ');
660 FND_DSQL.add_text(' WHERE sg.market_qualifier_type = ''BG'' ');
661 FND_DSQL.add_text(' AND sg.party_id = c2.party_id ');
662 FND_DSQL.add_text(' AND sg.market_qualifier_reference = ');
663 FND_DSQL.add_bind(p_buy_group_party_id);
664 FND_DSQL.add_text(')');
665 ELSE
666 -- Modified for Bugfix 5346249
667 FND_DSQL.add_text(' IN (SELECT cust2.cust_account_id FROM hz_cust_accounts cust2 ');
668 FND_DSQL.add_text(' WHERE cust2.party_id IN (SELECT seg.party_id from ');
669 FND_DSQL.add_text(' ams_party_market_segments seg ,hz_cust_accounts cust1 ');
670 FND_DSQL.add_text(' where seg.market_qualifier_type = ''BG'' ');
671 FND_DSQL.add_text(' and seg.market_qualifier_reference = cust1.party_id ');
672 FND_DSQL.add_text(' and cust1.cust_account_id = ');
673 IF p_related_cust_account_id IS NOT NULL THEN
674 FND_DSQL.add_bind(p_related_cust_account_id);
675 ELSE
676 FND_DSQL.add_bind(p_cust_account_id);
677 END IF;
678 FND_DSQL.add_text(')');
679 FND_DSQL.add_text(')');
680 END IF;
681 END IF;
682 END IF;
683
684 END Get_Customer_For_Earnings;
685
686 ---------------------------------------------------------------------
687 -- PROCEDURE
688 -- Copy_Util_Flt
689 -- Helper procedure called by Get_Utiz_Sql_Stmt only.
690 --
691 -- PARAMETERS
692 --
693 -- HISTORY
694 -- 16-FEB-2004 yizhang Create.
695 ---------------------------------------------------------------------
696 PROCEDURE Copy_Util_Flt(
697 px_funds_util_flt IN OUT NOCOPY funds_util_flt_type
698 )
699 IS
700
701 l_line_util_flt funds_util_flt_type;
702 l_offer_id NUMBER;
703 l_offer_type VARCHAR2(30);
704 l_reference_type VARCHAR2(30);
705 l_reference_id NUMBER;
706
707 CURSOR csr_line_flt(cv_claim_line_id IN NUMBER) IS
708 SELECT ln.activity_type
709 , ln.activity_id
710 , ln.offer_type
711 , ln.source_object_class
712 , ln.source_object_id
713 , ln.item_type
714 , ln.item_id
715 , ln.relationship_type
716 , ln.related_cust_account_id
717 , ln.buy_group_party_id
718 , ln.select_cust_children_flag
719 , cla.cust_account_id
720 , ln.earnings_end_date
721 , ln.claim_currency_amount
722 , cla.source_object_class
723 , cla.source_object_id
724 FROM ozf_claim_lines ln
725 , ozf_claims cla
726 WHERE ln.claim_id = cla.claim_id
727 AND ln.claim_line_id = cv_claim_line_id;
728
729 CURSOR csr_offer_id(cv_request_id IN NUMBER) IS
730 SELECT offer_id
731 FROM ozf_request_headers_all_b
732 WHERE request_header_id = cv_request_id;
733
734 CURSOR csr_offer_type(cv_offer_id IN NUMBER) IS
735 SELECT offer_type
736 FROM ozf_offers
737 WHERE qp_list_header_id = cv_offer_id;
738
739 --Ship - Debit Enhancements / Added by Pranay
740 CURSOR csr_sd_offer_id(cv_request_id IN NUMBER) IS
741 SELECT offer_id
742 FROM ozf_sd_request_headers_all_b
743 WHERE request_header_id = cv_request_id;
744
745 BEGIN
746 OPEN csr_line_flt(px_funds_util_flt.claim_line_id);
747 FETCH csr_line_flt INTO l_line_util_flt.activity_type
748 , l_line_util_flt.activity_id
749 , l_line_util_flt.offer_type
750 , l_line_util_flt.document_class
751 , l_line_util_flt.document_id
752 , l_line_util_flt.product_level_type
753 , l_line_util_flt.product_id
754 , l_line_util_flt.relationship_type
755 , l_line_util_flt.related_cust_account_id
756 , l_line_util_flt.buy_group_party_id
757 , l_line_util_flt.select_cust_children_flag
758 , l_line_util_flt.cust_account_id
759 , l_line_util_flt.end_date
760 , l_line_util_flt.total_amount
761 , l_reference_type
762 , l_reference_id;
763 CLOSE csr_line_flt;
764
765 IF px_funds_util_flt.activity_type IS NULL THEN
766 px_funds_util_flt.activity_type := l_line_util_flt.activity_type;
767 END IF;
768 IF px_funds_util_flt.activity_id IS NULL THEN
769 px_funds_util_flt.activity_id := l_line_util_flt.activity_id;
770 END IF;
771 IF px_funds_util_flt.offer_type IS NULL THEN
772 px_funds_util_flt.offer_type := l_line_util_flt.offer_type;
773 END IF;
774 IF px_funds_util_flt.document_class IS NULL THEN
775 px_funds_util_flt.document_class := l_line_util_flt.document_class;
776 END IF;
777 IF px_funds_util_flt.document_id IS NULL THEN
778 px_funds_util_flt.document_id := l_line_util_flt.document_id;
779 END IF;
780 IF px_funds_util_flt.product_level_type IS NULL THEN
781 px_funds_util_flt.product_level_type := l_line_util_flt.product_level_type;
782 END IF;
783 IF px_funds_util_flt.product_id IS NULL THEN
784 px_funds_util_flt.product_id := l_line_util_flt.product_id;
785 END IF;
786 IF px_funds_util_flt.relationship_type IS NULL THEN
787 px_funds_util_flt.relationship_type := l_line_util_flt.relationship_type;
788 END IF;
789 IF px_funds_util_flt.related_cust_account_id IS NULL THEN
790 px_funds_util_flt.related_cust_account_id := l_line_util_flt.related_cust_account_id;
791 END IF;
792 IF px_funds_util_flt.buy_group_party_id IS NULL THEN
793 px_funds_util_flt.buy_group_party_id := l_line_util_flt.buy_group_party_id;
794 END IF;
795 IF px_funds_util_flt.select_cust_children_flag IS NULL THEN
796 px_funds_util_flt.select_cust_children_flag := l_line_util_flt.select_cust_children_flag;
797 END IF;
798 IF px_funds_util_flt.cust_account_id IS NULL THEN
799 px_funds_util_flt.cust_account_id := l_line_util_flt.cust_account_id;
800 END IF;
801 IF px_funds_util_flt.end_date IS NULL THEN
802 px_funds_util_flt.end_date := l_line_util_flt.end_date;
803 END IF;
804 IF px_funds_util_flt.total_amount IS NULL THEN
805 -- px_funds_util_flt.total_amount := l_line_util_flt.total_amount;
806 NULL; -- If null, then leave as null implies line is to be deleted. Bugfix 5101106
807
808 END IF;
809
810 IF px_funds_util_flt.reference_type IS NULL THEN
811 IF l_reference_type = 'REFERRAL' THEN
812 px_funds_util_flt.reference_type := 'LEAD_REFERRAL';
813 px_funds_util_flt.reference_id := l_reference_id;
814 ELSIF l_reference_type = 'BATCH' THEN
815 -- Added for Bug 4997509
816 px_funds_util_flt.reference_type := l_reference_type;
817 px_funds_util_flt.reference_id := l_reference_id;
818 END IF;
819 END IF;
820
821 -- for special price request and soft fund, search by offer
822 IF px_funds_util_flt.activity_type IN ('SPECIAL_PRICE', 'SOFT_FUND') THEN
823 px_funds_util_flt.activity_type := 'OFFR';
824
825 IF px_funds_util_flt.activity_id IS NOT NULL THEN
826 OPEN csr_offer_id(px_funds_util_flt.activity_id);
827 FETCH csr_offer_id INTO l_offer_id;
828 CLOSE csr_offer_id;
829
830 px_funds_util_flt.activity_id := l_offer_id;
831 END IF;
832 END IF;
833
834 --Ship - Debit Enhancements / Added by Pranay
835 IF px_funds_util_flt.activity_type = 'SD_REQUEST' THEN
836 px_funds_util_flt.activity_type := 'OFFR';
837
838 IF px_funds_util_flt.activity_id IS NOT NULL THEN
839 OPEN csr_sd_offer_id(px_funds_util_flt.activity_id);
840 FETCH csr_sd_offer_id INTO l_offer_id;
841 CLOSE csr_sd_offer_id;
842 px_funds_util_flt.activity_id := l_offer_id;
843 END IF;
844 END IF;
845
846 -- set offer_type
847 IF px_funds_util_flt.offer_type IS NULL AND
848 px_funds_util_flt.activity_type = 'OFFR' AND
849 px_funds_util_flt.activity_id IS NOT NULL
850 THEN
851 OPEN csr_offer_type(px_funds_util_flt.activity_id);
852 FETCH csr_offer_type INTO l_offer_type;
853 CLOSE csr_offer_type;
854
855 px_funds_util_flt.offer_type := l_offer_type;
856 END IF;
857
858 END Copy_Util_Flt;
859
860 ---------------------------------------------------------------------
861 -- PROCEDURE
862 -- Get_Utiz_Sql_Stmt_Where_Clause
863 --
864 -- PARAMETERS
865 --
866 -- NOTE
867 --
868 -- HISTORY
869 -- 17-FEB-2004 yizhang Create.
870 -- 08-AUg-2006 azahmed Modified for FXGL ER: Added condition fu.currency_code = claim_curr
871 ---------------------------------------------------------------------
872 PROCEDURE Get_Utiz_Sql_Stmt_Where_Clause(
873 p_summary_view IN VARCHAR2 := NULL
874 ,p_funds_util_flt IN funds_util_flt_type
875 )
876 IS
877 l_api_name CONSTANT VARCHAR2(30) := 'Get_Utiz_Sql_Stmt_Where_Clause';
878 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
879 l_return_status VARCHAR2(1);
880
881 l_funds_util_flt funds_util_flt_type := NULL;
882 l_cust_account_id NUMBER := NULL;
883 l_scan_data_flag VARCHAR2(1) := 'N';
884 l_org_id NUMBER;
885
886
887 CURSOR csr_claim_currency(cv_claim_line_id IN NUMBER) IS
888 SELECT currency_code
889 FROM ozf_claim_lines
890 where claim_line_id = cv_claim_line_id;
891
892
893 BEGIN
894 --------------------- start -----------------------
895 l_org_id := FND_PROFILE.VALUE('AMS_ITEM_ORGANIZATION_ID');
896
897 l_funds_util_flt := p_funds_util_flt;
898
899 -- get claim currency
900 OPEN csr_claim_currency(l_funds_util_flt.claim_line_id);
901 FETCH csr_claim_currency INTO G_CLAIM_CURRENCY;
902 CLOSE csr_claim_currency;
903 -- bug fix 4338584
904 -- when a fund line utilization is updated from the UI the account id should be picked up from the record
905 l_cust_account_id := l_funds_util_flt.cust_account_id;
906
907 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
908 l_scan_data_flag := 'Y';
909 END IF;
910
911 -- Bug5059770: Allow pay over for offers with zero available amount
912 --Bug 5154157 : Reverted change made for bug 4927201 as this will not be called if
913 -- total amount is to be overpaid
914 -- Modified for FXGL ER: only accruals in claim currency must be returned
915 IF p_summary_view IS NULL OR p_summary_view <> 'DEL_GRP_LINE_UTIL' THEN
916 FND_DSQL.add_text(' AND fu.amount_remaining <> 0 ');
917 IF l_funds_util_flt.utiz_currency_code is not null THEN
918 FND_DSQL.add_text(' AND fu.currency_code = ');
919 FND_DSQL.add_bind(l_funds_util_flt.utiz_currency_code);
920 END IF;
921 END IF;
922
923 -- for lead referral accruals, set utilization_type as LEAD_ACCRUAL
924 -- Fixed for Bug4576309
925 -- Modified for Bug4997509 to match ClaimAssoVO.getCommonWhereClause
926 IF l_funds_util_flt.utilization_type IS NULL OR l_funds_util_flt.utilization_type = 'ACCRUAL' THEN
927 IF l_funds_util_flt.reference_type = 'LEAD_REFERRAL' THEN
928 FND_DSQL.add_text(' AND fu.utilization_type IN (''LEAD_ACCRUAL'', ''LEAD_ADJUSTMENT'') ' );
929 ELSIF l_funds_util_flt.reference_type = 'BATCH' THEN
930 FND_DSQL.add_text(' AND fu.utilization_type = ''CHARGEBACK'' ');
931 ELSE
932 FND_DSQL.add_text(' AND fu.utilization_type IN (''ACCRUAL'', ''ADJUSTMENT'') ' );
933 END IF;
934 ELSE
935 FND_DSQL.add_text(' AND fu.utilization_type = ');
936 FND_DSQL.add_bind(l_funds_util_flt.utilization_type);
937 END IF;
938
939 IF l_funds_util_flt.utilization_type = 'ADJUSTMENT' THEN
940 FND_DSQL.add_text(' AND fu.cust_account_id IS NULL ');
941 ELSE
942 -- bug fix 4338584
943 IF l_funds_util_flt.cust_account_id IS NOT NULL AND l_scan_data_flag = 'N' AND l_funds_util_flt.run_mode is not null THEN
944 FND_DSQL.add_text(' AND fu.cust_account_id');
945
946 Get_Customer_For_Earnings(
947 p_cust_account_id => l_funds_util_flt.cust_account_id
948 ,p_relationship_type => l_funds_util_flt.relationship_type
949 ,p_related_cust_account_id => l_funds_util_flt.related_cust_account_id
950 ,p_buy_group_party_id => l_funds_util_flt.buy_group_party_id
951 ,p_select_cust_children_flag => l_funds_util_flt.select_cust_children_flag
952 );
953
954 ELSIF l_cust_account_id IS NOT NULL AND l_scan_data_flag = 'N' THEN
955 FND_DSQL.add_text(' AND fu.cust_account_id = ');
956 FND_DSQL.add_bind(l_cust_account_id);
957 END IF;
958 END IF;
959
960 -- Add fund_id as search filter for claim autopay program.
961 IF l_funds_util_flt.fund_id IS NOT NULL THEN
962 FND_DSQL.add_text(' AND fu.fund_id = ');
963 FND_DSQL.add_bind(l_funds_util_flt.fund_id);
964 END IF;
965
966 IF l_funds_util_flt.activity_id IS NOT NULL THEN
967 FND_DSQL.add_text(' AND fu.plan_id = ');
968 FND_DSQL.add_bind(l_funds_util_flt.activity_id);
969 END IF;
970
971 IF l_funds_util_flt.reference_type IS NOT NULL THEN
972 FND_DSQL.add_text(' AND fu.reference_type = ');
973 FND_DSQL.add_bind(l_funds_util_flt.reference_type);
974 END IF;
975
976 IF l_funds_util_flt.reference_id IS NOT NULL THEN
977 FND_DSQL.add_text(' AND fu.reference_id = ');
978 FND_DSQL.add_bind(l_funds_util_flt.reference_id);
979 END IF;
980
981 IF l_funds_util_flt.activity_product_id IS NOT NULL THEN
982 FND_DSQL.add_text(' AND fu.activity_product_id = ');
983 FND_DSQL.add_bind(l_funds_util_flt.activity_product_id);
984 END IF;
985
986 IF l_funds_util_flt.schedule_id IS NOT NULL AND l_scan_data_flag = 'N' THEN
987 FND_DSQL.add_text(' AND fu.component_type = ''CSCH'' ');
988 FND_DSQL.add_text(' AND fu.component_id = ');
989 FND_DSQL.add_bind(l_funds_util_flt.schedule_id);
990 END IF;
991
992 -- fix for 4308165
993 -- modified for bugfix 4990767
994 IF l_funds_util_flt.document_class IS NOT NULL AND l_scan_data_flag = 'N' THEN
995 IF l_funds_util_flt.document_class IN ('ORDER','TP_ORDER') THEN
996 FND_DSQL.add_text(' AND fu.object_type = ');
997 FND_DSQL.add_bind(l_funds_util_flt.document_class);
998 END IF;
999 END IF;
1000
1001 IF l_funds_util_flt.document_id IS NOT NULL AND l_scan_data_flag = 'N' THEN
1002 IF l_funds_util_flt.document_class = 'TP_ORDER' THEN
1003 FND_DSQL.add_text(' AND fu.object_id IN (SELECT chargeback_line_id FROM ozf_chargeback_lines WHERE chargeback_header_id = ');
1004 FND_DSQL.add_bind(l_funds_util_flt.document_id);
1005 FND_DSQL.add_text(') ');
1006 ELSE
1007 IF l_funds_util_flt.document_class = 'ORDER' THEN
1008 FND_DSQL.add_text(' AND fu.object_id = ');
1009 FND_DSQL.add_bind(l_funds_util_flt.document_id);
1010 END IF;
1011 END IF;
1012 END IF;
1013
1014 IF (l_funds_util_flt.product_level_type = 'PRODUCT' OR
1015 l_funds_util_flt.product_level_type IS NULL) AND
1016 l_funds_util_flt.product_id IS NOT NULL THEN
1017 FND_DSQL.add_text(' AND ((fu.product_level_type = ''PRODUCT'' ');
1018 FND_DSQL.add_text(' AND fu.product_id = ');
1019 FND_DSQL.add_bind(l_funds_util_flt.product_id);
1020 FND_DSQL.add_text(' ) OR (fu.product_level_type = ''FAMILY'' ');
1021 FND_DSQL.add_text(' AND fu.product_id IN (select category_id from mtl_item_categories ');
1022 FND_DSQL.add_text(' where inventory_item_id = ');
1023 FND_DSQL.add_bind(l_funds_util_flt.product_id);
1024 FND_DSQL.add_text(' and organization_id = ');
1025 FND_DSQL.add_bind(l_org_id);
1026 FND_DSQL.add_text(' ))) ');
1027 ELSIF l_funds_util_flt.product_level_type = 'FAMILY' AND
1028 l_funds_util_flt.product_id IS NOT NULL THEN
1029 FND_DSQL.add_text(' AND ((fu.product_level_type = ''FAMILY'' ');
1030 FND_DSQL.add_text(' AND fu.product_id = ');
1031 FND_DSQL.add_bind(l_funds_util_flt.product_id);
1032 FND_DSQL.add_text(' ) OR (fu.product_level_type = ''PRODUCT'' ');
1033 FND_DSQL.add_text(' AND fu.product_id IN (select b.inventory_item_id from eni_denorm_hierarchies a, mtl_item_categories b ');
1034 FND_DSQL.add_text(' where a.parent_id = ');
1035 FND_DSQL.add_text(l_funds_util_flt.product_id);
1036 FND_DSQL.add_text(' and b.organization_id = ');
1037 FND_DSQL.add_bind(l_org_id);
1038 FND_DSQL.add_text(' and a.object_type = ''CATEGORY_SET'' and b.category_id = a.child_id ');
1039 FND_DSQL.add_text(' ))) ');
1040 ELSIF l_funds_util_flt.product_level_type = 'MEDIA' THEN
1041 FND_DSQL.add_text(' AND fu.product_level_type = ''MEDIA'' ');
1042 IF l_funds_util_flt.product_id IS NOT NULL THEN
1043 FND_DSQL.add_text(' AND fu.product_id = ');
1044 FND_DSQL.add_bind(l_funds_util_flt.product_id);
1045 END IF;
1046 END IF;
1047
1048 IF l_funds_util_flt.end_date IS NOT NULL THEN
1049 FND_DSQL.add_text(' AND trunc(fu.creation_date) <= ');
1050 FND_DSQL.add_bind(l_funds_util_flt.end_date);
1051 END IF;
1052
1053 FND_DSQL.add_text(' AND fu.gl_posted_flag = ''Y'' ');
1054
1055 END Get_Utiz_Sql_Stmt_Where_Clause;
1056
1057 ---------------------------------------------------------------------
1058 -- PROCEDURE
1059 -- Get_Utiz_Sql_Stmt_From_Clause
1060 --
1061 -- PARAMETERS
1062 --
1063 -- NOTE
1064 --
1065 -- HISTORY
1066 -- 17-FEB-2004 yizhang Create.
1067 ---------------------------------------------------------------------
1068 PROCEDURE Get_Utiz_Sql_Stmt_From_Clause(
1069 p_summary_view IN VARCHAR2
1070 ,p_funds_util_flt IN funds_util_flt_type
1071 )
1072 IS
1073 l_api_name CONSTANT VARCHAR2(30) := 'Get_Utiz_Sql_Stmt_From_Clause';
1074 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1075
1076 l_funds_util_flt funds_util_flt_type := NULL;
1077 l_cust_account_id NUMBER := NULL;
1078 l_scan_data_flag VARCHAR2(1) := 'N';
1079 l_offer_flag VARCHAR2(1) := 'Y';
1080 l_price_list_flag VARCHAR2(1) := 'Y';
1081 l_resource_id NUMBER;
1082 l_sales_rep VARCHAR2(1) := FND_API.g_false;
1083 l_is_admin BOOLEAN := FALSE;
1084 l_orgId NUMBER;
1085 BEGIN
1086 --------------------- initialize -----------------------
1087 IF OZF_DEBUG_HIGH_ON THEN
1088 OZF_Utility_PVT.debug_message(l_full_name||': start');
1089 END IF;
1090
1091 --------------------- start -----------------------
1092 l_funds_util_flt := p_funds_util_flt;
1093
1094 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
1095 l_scan_data_flag := 'Y';
1096 END IF;
1097
1098 IF l_funds_util_flt.activity_type IS NOT NULL THEN
1099 IF l_funds_util_flt.activity_type = 'OFFR' THEN
1100 l_price_list_flag := 'N';
1101 ELSE
1102 l_offer_flag := 'N';
1103 END IF;
1104 END IF;
1105
1106 IF l_funds_util_flt.run_mode IN ('OFFER_AUTOPAY', 'OFFER_NO_AUTOPAY') THEN
1107 l_price_list_flag := 'N';
1108 END IF;
1109
1110 IF l_funds_util_flt.offer_type IS NOT NULL THEN
1111 l_price_list_flag := 'N';
1112 END IF;
1113
1114 l_resource_id := ozf_utility_pvt.get_resource_id(fnd_global.user_id);
1115 l_is_admin := ams_access_PVT.Check_Admin_Access(l_resource_id);
1116 l_orgId := MO_GLOBAL.GET_CURRENT_ORG_ID();
1117
1118 IF l_offer_flag = 'Y' THEN
1119 -- restrict offer access if user is sales rep
1120 IF l_funds_util_flt.reference_type = 'LEAD_REFERRAL' THEN
1121 l_sales_rep := FND_API.g_false;
1122 ELSE
1123 l_resource_id := ozf_utility_pvt.get_resource_id(fnd_global.user_id);
1124 l_sales_rep := ozf_utility_pvt.has_sales_rep_role(l_resource_id);
1125 END IF;
1126
1127
1128 FND_DSQL.add_text('SELECT fu.utilization_id, fu.cust_account_id '||
1129 ', fu.plan_type, fu.plan_id, o.offer_type, o.autopay_method '||
1130 ', fu.product_level_type, fu.product_id '||
1131 ', fu.acctd_amount_remaining, fu.amount_remaining, fu.scan_unit_remaining '||
1132 ', fu.creation_date , fu.currency_code , fu.bill_to_site_use_id '||
1133 'FROM ozf_funds_utilized_all_b fu, ozf_offers o ');
1134
1135 --Modified for Bugfix 5346249
1136 FND_DSQL.add_text('WHERE fu.plan_type = ''OFFR'' '||
1137 'AND fu.plan_id = o.qp_list_header_id ' ||
1138 'AND fu.org_id = ');
1139 FND_DSQL.add_bind(l_orgId);
1140
1141 IF l_funds_util_flt.offer_type IS NOT NULL THEN
1142 FND_DSQL.add_text(' AND o.offer_type = ');
1143 FND_DSQL.add_bind(l_funds_util_flt.offer_type);
1144 ELSE
1145 FND_DSQL.add_text(' AND o.offer_type <> ''SCAN_DATA'' ');
1146 END IF;
1147
1148 IF l_funds_util_flt.run_mode = 'OFFER_AUTOPAY' THEN
1149 FND_DSQL.add_text(' AND o.autopay_flag = ''Y'' ');
1150 ELSIF l_funds_util_flt.run_mode = 'OFFER_NO_AUTOPAY' THEN
1151 FND_DSQL.add_text(' AND (o.autopay_flag IS NULL OR o.autopay_flag = ''N'') ');
1152 END IF;
1153
1154 IF l_funds_util_flt.offer_payment_method IS NOT NULL THEN
1155 IF l_funds_util_flt.offer_payment_method = 'NULL' THEN
1156 FND_DSQL.add_text(' AND o.autopay_method IS NULL ');
1157 ELSE
1158 FND_DSQL.add_text(' AND o.autopay_method = ');
1159 FND_DSQL.add_bind(l_funds_util_flt.offer_payment_method);
1160 END IF;
1161 END IF;
1162
1163 IF (l_sales_rep = FND_API.g_true AND NOT l_is_admin ) THEN
1164 FND_DSQL.add_text(' AND (o.confidential_flag =''N'' OR ');
1165 FND_DSQL.add_text(' o.confidential_flag IS NULL OR ');
1166 FND_DSQL.add_text(' ( NVL(o.budget_offer_yn, ''N'') = ''N'' AND ');
1167 FND_DSQL.add_text(' EXISTS ( SELECT 1 FROM ams_act_access_denorm act ');
1168 FND_DSQL.add_text(' WHERE act.object_id = o.qp_list_header_id ');
1169 FND_DSQL.add_text(' AND act.object_type = ''OFFR'' ');
1170 FND_DSQL.add_text(' AND act.resource_id= ');
1171 FND_DSQL.add_bind(l_resource_id);
1172 FND_DSQL.add_text('))');
1173 FND_DSQL.add_text(' OR ( NVL(o.budget_offer_yn, ''N'') = ''Y'' ');
1174 FND_DSQL.add_text(' AND EXISTS ( SELECT 1 FROM ams_act_access_denorm act ');
1175 FND_DSQL.add_text(' WHERE act.object_id = fu.fund_id ');
1176 FND_DSQL.add_text(' AND act.object_type = ''FUND'' ');
1177 FND_DSQL.add_text(' AND act.resource_id= ' );
1178 FND_DSQL.add_bind(l_resource_id);
1179 FND_DSQL.add_text(')))');
1180 END IF;
1181
1182 Get_Utiz_Sql_Stmt_Where_Clause (
1183 p_summary_view => p_summary_view
1184 ,p_funds_util_flt => l_funds_util_flt
1185 );
1186
1187 END IF;
1188
1189 IF l_offer_flag = 'Y' AND l_price_list_flag = 'Y' THEN
1190 FND_DSQL.add_text('UNION ALL ');
1191 END IF;
1192
1193 IF l_price_list_flag = 'Y' THEN
1194 FND_DSQL.add_text('SELECT fu.utilization_id, fu.cust_account_id '||
1195 ', fu.plan_type, fu.plan_id, null, null '||
1196 ', fu.product_level_type, fu.product_id '||
1197 ', fu.acctd_amount_remaining, fu.amount_remaining, fu.scan_unit_remaining '||
1198 ', fu.creation_date , fu.currency_code , fu.bill_to_site_use_id '||
1199 'FROM ozf_funds_utilized_all_b fu '||
1200 'WHERE fu.plan_type = ''PRIC'' ' ||
1201 'AND fu.org_id =');
1202 FND_DSQL.add_bind(l_orgId);
1203 FND_DSQL.add_text(' AND fu.cust_account_id = ');
1204 FND_DSQL.add_bind(l_funds_util_flt.cust_account_id);
1205
1206
1207 Get_Utiz_Sql_Stmt_Where_Clause(
1208 p_summary_view => p_summary_view
1209 ,p_funds_util_flt => l_funds_util_flt
1210 );
1211 END IF;
1212
1213 END Get_Utiz_Sql_Stmt_From_Clause;
1214
1215 ---------------------------------------------------------------------
1216 -- PROCEDURE
1217 -- Get_Utiz_Sql_Stmt
1218 --
1219 -- PARAMETERS
1220 -- p_summary_view : Available values
1221 -- 1. OZF_AUTOPAY_PVT -- 'AUTOPAY'
1222 -- 2. OZF_CLAIM_LINE_PVT --'ACTIVITY', 'PRODUCT', 'SCHEDULE'
1223 -- p_funds_util_flt :
1224 -- p_cust_account_id : Only be used for OZF_AUTOPAY_PVT
1225 -- x_utiz_sql_stmt : Return datatype is VARCHAR2(500)
1226 --
1227 -- NOTE
1228 -- 1. This statement will be used for both OZF_AUTOPAY_PVT and OZF_CLAIM_LINE_PVT
1229 -- to get funds_utilized SQL statement by giving in search criteria.
1230 --
1231 -- HISTORY
1232 -- 25-JUN-2002 mchang Create.
1233 ---------------------------------------------------------------------
1234 PROCEDURE Get_Utiz_Sql_Stmt(
1235 p_api_version IN NUMBER
1236 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
1237 ,p_commit IN VARCHAR2 := FND_API.g_false
1238 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
1239
1240 ,x_return_status OUT NOCOPY VARCHAR2
1241 ,x_msg_count OUT NOCOPY NUMBER
1242 ,x_msg_data OUT NOCOPY VARCHAR2
1243
1244 ,p_summary_view IN VARCHAR2 := NULL
1245 ,p_funds_util_flt IN funds_util_flt_type
1246 ,p_cust_account_id IN NUMBER := NULL
1247
1248 ,x_utiz_sql_stmt OUT NOCOPY VARCHAR2
1249 )
1250 IS
1251 l_api_version CONSTANT NUMBER := 1.0;
1252 l_api_name CONSTANT VARCHAR2(30) := 'Get_Utiz_Sql_Stmt';
1253 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1254 l_return_status VARCHAR2(1);
1255
1256 l_utiz_sql VARCHAR2(3000) := NULL;
1257 l_utiz_sql_from_clause VARCHAR2(2000) := NULL;
1258 l_funds_util_flt funds_util_flt_type := NULL;
1259 l_line_util_flt funds_util_flt_type := NULL;
1260 l_cust_account_id NUMBER := NULL;
1261 l_scan_data_flag VARCHAR2(1) := 'N';
1262 l_org_id NUMBER;
1263
1264 CURSOR csr_request_offer(cv_request_id IN NUMBER) IS
1265 SELECT o.qp_list_header_id
1266 , o.offer_type
1267 FROM ozf_offers o
1268 , ozf_request_headers_all_b r
1269 WHERE o.qp_list_header_id = r.offer_id
1270 AND r.request_header_id = cv_request_id;
1271
1272 BEGIN
1273 --------------------- initialize -----------------------
1274 IF OZF_DEBUG_HIGH_ON THEN
1275 OZF_Utility_PVT.debug_message(l_full_name||': start');
1276 END IF;
1277
1278 IF FND_API.to_boolean(p_init_msg_list) THEN
1279 FND_MSG_PUB.initialize;
1280 END IF;
1281
1282 IF NOT FND_API.compatible_api_call(
1283 l_api_version,
1284 p_api_version,
1285 l_api_name,
1286 g_pkg_name
1287 ) THEN
1288 RAISE FND_API.g_exc_unexpected_error;
1289 END IF;
1290 x_return_status := FND_API.g_ret_sts_success;
1291
1292 l_org_id := FND_PROFILE.VALUE('AMS_ITEM_ORGANIZATION_ID');
1293
1294 --------------------- start -----------------------
1295 l_funds_util_flt := p_funds_util_flt;
1296
1297 -- default filter parameters based on claim line properties
1298 IF l_funds_util_flt.claim_line_id IS NOT NULL THEN
1299 IF p_summary_view IS NULL OR p_summary_view <> 'DEL_GRP_LINE_UTIL' THEN
1300 copy_util_flt(px_funds_util_flt => l_funds_util_flt);
1301 END IF;
1302 END IF;
1303
1304 -- for special pricing requests, set offer id
1305 IF l_funds_util_flt.reference_type = 'SPECIAL_PRICE' AND
1306 l_funds_util_flt.reference_id IS NOT NULL AND
1307 l_funds_util_flt.activity_id IS NULL
1308 THEN
1309 l_funds_util_flt.activity_type := 'OFFR';
1310 OPEN csr_request_offer(l_funds_util_flt.reference_id);
1311 FETCH csr_request_offer INTO l_funds_util_flt.activity_id
1312 , l_funds_util_flt.offer_type;
1313 CLOSE csr_request_offer;
1314 END IF;
1315
1316 IF OZF_DEBUG_HIGH_ON THEN
1317 OZF_Utility_PVT.debug_message('----- p_funds_util_flt -----');
1318 OZF_Utility_PVT.debug_message('cust_account_id : ' || l_funds_util_flt.cust_account_id);
1319 OZF_Utility_PVT.debug_message('activity_type : ' || l_funds_util_flt.activity_type);
1320 OZF_Utility_PVT.debug_message('activity_id : ' || l_funds_util_flt.activity_id);
1321 OZF_Utility_PVT.debug_message('offer_type : ' || l_funds_util_flt.offer_type);
1322 OZF_Utility_PVT.debug_message('product_level_type : ' || l_funds_util_flt.product_level_type);
1323 OZF_Utility_PVT.debug_message('product_id : ' || l_funds_util_flt.product_id);
1324 OZF_Utility_PVT.debug_message('----------------------------');
1325 END IF;
1326
1327 -- use FND_DSQL package to handle dynamic sql and bind variables
1328 FND_DSQL.init;
1329
1330 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
1331 l_scan_data_flag := 'Y';
1332 END IF;
1333
1334 IF p_summary_view = 'AUTOPAY' THEN
1335 -- if cust account is specified in autopay parameter, do
1336 -- not group by cust_account_id in query
1337 -- R12 Group By Offer Enhancement
1338 -- Modified for FXGL Enhancement, Need to derive amount_remaining instead of acctd_amount_remaining
1339 -- Also need to group by currency as amount of different currencies cannot be added
1340 -- Modified for R12.1 enhancements, Need to select the value of bill_to_site_use_id.
1341
1342 IF p_cust_account_id IS NOT NULL AND l_funds_util_flt.group_by_offer = 'N' THEN
1343 FND_DSQL.add_text('SELECT autopay_method, sum(amount_remaining), currency_code, bill_to_site_use_id ');
1344 ELSIF p_cust_account_id IS NULL AND l_funds_util_flt.group_by_offer = 'N' THEN
1345 FND_DSQL.add_text('SELECT autopay_method, sum(amount_remaining), currency_code , bill_to_site_use_id , cust_account_id ');
1346 ELSIF p_cust_account_id IS NOT NULL AND l_funds_util_flt.group_by_offer = 'Y' THEN
1347 FND_DSQL.add_text('SELECT autopay_method, sum(amount_remaining), currency_code , bill_to_site_use_id , plan_id ');
1348 ELSIF p_cust_account_id IS NULL AND l_funds_util_flt.group_by_offer = 'Y' THEN
1349 FND_DSQL.add_text('SELECT autopay_method, sum(amount_remaining), currency_code , bill_to_site_use_id , cust_account_id, plan_id ');
1350 END IF;
1351 FND_DSQL.add_text( 'FROM (');
1352 ELSIF p_summary_view = 'AUTOPAY_LINE' THEN
1353 FND_DSQL.add_text( 'SELECT cust_account_id, plan_type, plan_id, bill_to_site_use_id '||
1354 ', product_level_type, product_id '||
1355 ', sum(amount_remaining), currency_code '||
1356 'FROM ('||
1357 'SELECT cust_account_id, plan_type, plan_id '||
1358 ', decode(product_id, null, null, product_level_type) product_level_type '||
1359 ', product_id product_id '||
1360 ', acctd_amount_remaining , amount_remaining, currency_code, bill_to_site_use_id '||
1361 'FROM (');
1362 ELSIF p_summary_view = 'DEL_GRP_LINE_UTIL' THEN
1363 -- Modified for FXGL ER(amount selected)
1364 FND_DSQL.add_text( 'SELECT lu.claim_line_util_id, lu.utilization_id, lu.amount, lu.scan_unit, lu.currency_code '||
1365 'FROM (');
1366 ELSE
1367 -- Modified for FXGL ER
1368 FND_DSQL.add_text( 'SELECT utilization_id, amount_remaining, scan_unit_remaining, currency_code '||
1369 'FROM (');
1370 END IF;
1371
1372 Get_Utiz_Sql_Stmt_From_Clause(
1373 p_summary_view => p_summary_view
1374 ,p_funds_util_flt => l_funds_util_flt
1375 );
1376
1377 -- R12.1 autopay enhancement, Need to select and group by bill_to_site_use_id.
1378 -- for p_summary_view = AUTOPAY and AUTOPAY_LINE.
1379
1380 IF p_summary_view = 'AUTOPAY' THEN
1381 FND_DSQL.add_text( ') utiz ');
1382 -- R12 Enhancements: Group By Offer for Autopay.
1383 IF p_cust_account_id IS NOT NULL AND l_funds_util_flt.group_by_offer = 'N' THEN
1384 FND_DSQL.add_text('GROUP BY utiz.autopay_method, utiz.currency_code, utiz.bill_to_site_use_id ');
1385 ELSIF p_cust_account_id IS NULL AND l_funds_util_flt.group_by_offer = 'N' THEN
1386 FND_DSQL.add_text('GROUP BY utiz.cust_account_id, utiz.autopay_method, utiz.currency_code, utiz.bill_to_site_use_id ');
1387 ELSIF p_cust_account_id IS NOT NULL AND l_funds_util_flt.group_by_offer = 'Y' THEN
1388 FND_DSQL.add_text('GROUP BY utiz.plan_id, utiz.autopay_method , utiz.currency_code, utiz.bill_to_site_use_id ');
1389 ELSIF p_cust_account_id IS NULL AND l_funds_util_flt.group_by_offer = 'Y' THEN
1390 FND_DSQL.add_text('GROUP BY utiz.cust_account_id,utiz.plan_id, utiz.autopay_method , utiz.currency_code, utiz.bill_to_site_use_id ');
1391 END IF;
1392 ELSIF p_summary_view = 'AUTOPAY_LINE' THEN
1393 FND_DSQL.add_text( ') utiz ) '||
1394 'GROUP BY cust_account_id, plan_type, plan_id, bill_to_site_use_id, product_level_type, product_id, currency_code '||
1395 'ORDER BY cust_account_id, plan_type, plan_id, bill_to_site_use_id, product_level_type, product_id ');
1396 ELSIF p_summary_view = 'DEL_GRP_LINE_UTIL' THEN
1397 FND_DSQL.add_text( ') utiz, ozf_claim_lines_util lu '||
1398 'WHERE lu.utilization_id = utiz.utilization_id '||
1399 'AND lu.claim_line_id = ');
1400 FND_DSQL.add_bind( l_funds_util_flt.claim_line_id );
1401 FND_DSQL.add_text( ' ORDER BY utiz.creation_date desc ');
1402 ELSE
1403 FND_DSQL.add_text( ') utiz ');
1404 IF l_funds_util_flt.total_amount IS NOT NULL THEN
1405 IF l_funds_util_flt.total_amount >= 0 THEN
1406 FND_DSQL.add_text(' ORDER BY sign(utiz.amount_remaining) asc, utiz.creation_date asc');
1407 ELSE
1408 FND_DSQL.add_text(' ORDER BY sign(utiz.amount_remaining) desc, utiz.creation_date asc');
1409 END IF;
1410 ELSE
1411 FND_DSQL.add_text(' ORDER BY utiz.creation_date asc');
1412 END IF;
1413 END IF;
1414
1415 x_utiz_sql_stmt := FND_DSQL.get_text(FALSE);
1416
1417 IF OZF_DEBUG_HIGH_ON THEN
1418 l_utiz_sql := FND_DSQL.get_text(TRUE);
1419 OZF_Utility_PVT.debug_message('----- UTIZ SQL -----');
1420 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 1, 250));
1421 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 251, 250));
1422 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 501, 250));
1423 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 751, 250));
1424 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 1001, 250));
1425 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 1251, 250));
1426 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 1501, 250));
1427 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 1751, 250));
1428 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 2001, 250));
1429 OZF_Utility_PVT.debug_message(SUBSTR(l_utiz_sql, 2251, 250));
1430 OZF_Utility_PVT.debug_message('--------------------');
1431 OZF_Utility_PVT.debug_message(l_full_name||': end');
1432 END IF;
1433
1434
1435
1436 EXCEPTION
1437 WHEN OTHERS THEN
1438 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1439 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1440 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_ATPY_UTIZ_STMT_ERR');
1441 FND_MSG_PUB.add;
1442 END IF;
1443 END Get_Utiz_Sql_Stmt;
1444
1445
1446 ---------------------------------------------------------------------
1447 -- PROCEDURE
1448 -- Get_Cust_Trade_Profile
1449 --
1450 -- HISTORY
1451 -- 15/12/2003 yizhang Create.
1452 -- 05-Sep-08 ateotia Bug # 7379700 fixed.
1453 -- Claim does not get closed if customer trade profile is set at account level only.
1454 ---------------------------------------------------------------------
1455 PROCEDURE Get_Cust_Trade_Profile(
1456 p_cust_account_id IN NUMBER
1457 ,x_cust_trade_profile OUT NOCOPY g_cust_trade_profile_csr%rowtype
1458 ,p_site_use_id IN NUMBER := NULL
1459 ) IS
1460 l_api_name CONSTANT VARCHAR2(30) := 'Get_Cust_Trade_Profile';
1461 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1462
1463 l_cust_trade_profile g_cust_trade_profile_csr%rowtype;
1464 l_party_id NUMBER;
1465
1466 CURSOR csr_get_party_id(cv_cust_account_id IN NUMBER) IS
1467 SELECT party_id
1468 FROM hz_cust_accounts
1469 WHERE cust_account_id = cv_cust_account_id;
1470
1471 BEGIN
1472 IF OZF_DEBUG_HIGH_ON THEN
1473 OZF_Utility_PVT.debug_message(l_full_name||': start');
1474 END IF;
1475
1476 -- bug # 7379700 fixed by ateotia (+)
1477 IF p_site_use_id is not null THEN
1478 -- 1. get trade profile by site_use_id
1479 OPEN g_site_trade_profile_csr(p_site_use_id);
1480 FETCH g_site_trade_profile_csr into l_cust_trade_profile;
1481 CLOSE g_site_trade_profile_csr;
1482 END IF;
1483
1484 IF p_cust_account_id is not null
1485 AND l_cust_trade_profile.trade_profile_id IS NULL THEN
1486 -- 2. if trade profile is not there for site,
1487 -- then get trade profile at customer account level
1488 OPEN g_cust_trade_profile_csr(p_cust_account_id);
1489 FETCH g_cust_trade_profile_csr into l_cust_trade_profile;
1490 CLOSE g_cust_trade_profile_csr;
1491
1492 -- 3. if trade profile is not there for customer,
1493 -- then get trade profile by party_id level
1494 IF l_cust_trade_profile.trade_profile_id IS NULL THEN
1495 OPEN csr_get_party_id(p_cust_account_id);
1496 FETCH csr_get_party_id INTO l_party_id;
1497 CLOSE csr_get_party_id;
1498
1499 IF l_party_id IS NOT NULL THEN
1500 OPEN g_party_trade_profile_csr(l_party_id);
1501 FETCH g_party_trade_profile_csr INTO l_cust_trade_profile;
1502 CLOSE g_party_trade_profile_csr;
1503 END IF;
1504 END IF;
1505 END IF;
1506 -- bug # 7379700 fixed by ateotia (-)
1507
1508 x_cust_trade_profile := l_cust_trade_profile;
1509
1510 IF OZF_DEBUG_HIGH_ON THEN
1511 OZF_Utility_PVT.debug_message(l_full_name||': end');
1512 END IF;
1513 END Get_Cust_Trade_Profile;
1514
1515 ---------------------------------------------------------------------
1516 -- PROCEDURE
1517 -- Validate_Cust_Trade_Profile
1518 --
1519 -- HISTORY
1520 -- 15/12/2003 yizhang Create.
1521 ---------------------------------------------------------------------
1522 PROCEDURE Validate_Cust_Trade_Profile(
1523 p_cust_trade_profile IN g_cust_trade_profile_csr%rowtype
1524 ,x_return_status OUT NOCOPY VARCHAR2
1525 ) IS
1526 l_api_name CONSTANT VARCHAR2(30) := 'Validate_Cust_Trade_Profile';
1527 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1528
1529 CURSOR csr_cust_name(cv_cust_account_id IN NUMBER) IS
1530 SELECT CONCAT(CONCAT(party.party_name, ' ('), CONCAT(ca.account_number, ') '))
1531 FROM hz_cust_accounts ca
1532 , hz_parties party
1533 WHERE ca.party_id = party.party_id
1534 AND ca.cust_account_id = cv_cust_account_id;
1535
1536 l_cust_account_id number := p_cust_trade_profile.cust_account_id;
1537 l_cust_name_num VARCHAR2(70);
1538
1539 BEGIN
1540 IF OZF_DEBUG_HIGH_ON THEN
1541 OZF_Utility_PVT.debug_message(l_full_name||': start');
1542 END IF;
1543
1544 -- Initialize API return status to sucess
1545 x_return_status := FND_API.G_RET_STS_SUCCESS;
1546
1547 IF p_cust_trade_profile.claim_currency is null OR
1548 p_cust_trade_profile.claim_currency = FND_API.G_MISS_CHAR THEN -- [BUG 4217781 FIXING]
1549 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1550 OPEN csr_cust_name(l_cust_account_id);
1551 FETCH csr_cust_name INTO l_cust_name_num;
1552 CLOSE csr_cust_name;
1553
1554 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_ATPY_CURRENCY_MISS');
1555 FND_MESSAGE.Set_Token('ID',l_cust_name_num);
1556 FND_MSG_PUB.ADD;
1557 END IF;
1558 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1559 END IF;
1560
1561 IF p_cust_trade_profile.payment_method is null OR
1562 p_cust_trade_profile.payment_method = FND_API.G_MISS_CHAR THEN -- [BUG 4217781 FIXING]
1563 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1564 OPEN csr_cust_name(l_cust_account_id);
1565 FETCH csr_cust_name INTO l_cust_name_num;
1566 CLOSE csr_cust_name;
1567
1568 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_ATPY_PYMTHD_MISS');
1569 FND_MESSAGE.Set_Token('ID',l_cust_name_num);
1570 FND_MSG_PUB.ADD;
1571 END IF;
1572 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1573 END IF;
1574
1575 IF p_cust_trade_profile.payment_method = 'CHECK' THEN
1576 IF p_cust_trade_profile.vendor_id is NULL OR
1577 p_cust_trade_profile.vendor_site_id is NULL THEN
1578 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1579 OPEN csr_cust_name(l_cust_account_id);
1580 FETCH csr_cust_name INTO l_cust_name_num;
1581 CLOSE csr_cust_name;
1582
1583 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_ATPY_VENDOR_MISS');
1584 FND_MESSAGE.Set_Token('ID',l_cust_name_num);
1585 FND_MSG_PUB.ADD;
1586 END IF;
1587 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1588 END IF;
1589 ELSIF p_cust_trade_profile.payment_method = 'CREDIT_MEMO' THEN
1590 IF p_cust_trade_profile.site_use_id is NULL THEN
1591 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1592 OPEN csr_cust_name(l_cust_account_id);
1593 FETCH csr_cust_name INTO l_cust_name_num;
1594 CLOSE csr_cust_name;
1595
1596 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_ATPY_SITEID_MISS');
1597 FND_MESSAGE.Set_Token('ID',l_cust_name_num);
1598 FND_MSG_PUB.ADD;
1599 END IF;
1600 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1601 END IF;
1602 END IF;
1603
1604 IF OZF_DEBUG_HIGH_ON THEN
1605 OZF_Utility_PVT.debug_message(l_full_name||': end');
1606 END IF;
1607 EXCEPTION
1608 WHEN OTHERS THEN
1609 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1610 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1611 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_ATPY_CUSTOMER_ERR');
1612 FND_MSG_PUB.add;
1613 END IF;
1614 END Validate_Cust_Trade_Profile;
1615
1616 ---------------------------------------------------------------------
1617 -- PROCEDURE
1618 -- Get_Prorate_Earnings_Flag
1619 --
1620 -- HISTORY
1621 -- 01/21/2003 yizhang Create.
1622 ---------------------------------------------------------------------
1623 PROCEDURE Get_Prorate_Earnings_Flag(
1624 p_funds_util_flt IN funds_util_flt_type
1625 ,x_prorate_earnings_flag OUT NOCOPY VARCHAR2
1626 ) IS
1627 l_api_name CONSTANT VARCHAR2(30) := 'Get_Prorate_Earnings_Flag';
1628 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1629
1630 l_prorate_earnings_flag VARCHAR2(1);
1631
1632 CURSOR csr_line_flag(cv_claim_line_id IN NUMBER) IS
1633 SELECT prorate_earnings_flag
1634 FROM ozf_claim_lines
1635 WHERE claim_line_id = cv_claim_line_id;
1636
1637 -- fix for bug 5042046
1638 CURSOR csr_system_flag IS
1639 SELECT NVL(prorate_earnings_flag, 'F')
1640 FROM ozf_sys_parameters
1641 WHERE org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
1642
1643 BEGIN
1644 IF OZF_DEBUG_HIGH_ON THEN
1645 OZF_Utility_PVT.debug_message(l_full_name||': start');
1646 END IF;
1647
1648 IF p_funds_util_flt.prorate_earnings_flag IS NOT NULL THEN
1649 l_prorate_earnings_flag := p_funds_util_flt.prorate_earnings_flag;
1650 ELSE
1651 OPEN csr_line_flag(p_funds_util_flt.claim_line_id);
1652 FETCH csr_line_flag INTO l_prorate_earnings_flag;
1653 CLOSE csr_line_flag;
1654
1655 IF l_prorate_earnings_flag IS NULL THEN
1656 OPEN csr_system_flag;
1657 FETCH csr_system_flag INTO l_prorate_earnings_flag;
1658 CLOSE csr_system_flag;
1659 END IF;
1660 END IF;
1661 x_prorate_earnings_flag := l_prorate_earnings_flag;
1662
1663 IF OZF_DEBUG_HIGH_ON THEN
1664 OZF_Utility_PVT.debug_message(l_full_name||': end');
1665 END IF;
1666 END Get_Prorate_Earnings_Flag;
1667
1668 ---------------------------------------------------------------------
1669 -- PROCEDURE
1670 -- Create_Fund_Adjustment
1671 --
1672 -- PURPOSE
1673 -- This procedure creates a fund adjustment with amount zero
1674 -- for the given offer.
1675 -- Unlike Adjust_Fund_Utilization, which is called after claim
1676 -- is approved, this procedure is called when earnings are
1677 -- associated to the claim.
1678 --
1679 -- HISTORY
1680 -- 07/22/2004 yizhang Create.
1681 -- 07/29/2005 sshivali Cleared GSCC warning
1682 -- 14/06/06 azahmed Bugfix 5333804
1683 -- 06/08/06 azahmed Modified for FXGL ER: Adjustments must be created in
1684 -- fund currency and not in plan currrency
1685 ---------------------------------------------------------------------
1686 PROCEDURE Create_Fund_Adjustment(
1687 p_offer_id IN NUMBER
1688 ,p_cust_account_id IN NUMBER
1689 ,p_product_id IN NUMBER
1690 ,p_product_level_type IN VARCHAR2
1691 ,p_fund_id IN NUMBER
1692 ,p_reference_type IN VARCHAR2
1693 ,p_reference_id IN NUMBER
1694 ,x_return_status OUT NOCOPY VARCHAR2
1695 ,x_msg_count OUT NOCOPY NUMBER
1696 ,x_msg_data OUT NOCOPY VARCHAR2
1697 ,x_adj_util_id OUT NOCOPY NUMBER
1698 )
1699 IS
1700 l_api_name CONSTANT VARCHAR2(30) := 'Create_Fund_Adjustment';
1701 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
1702 l_return_status VARCHAR2(1);
1703
1704 l_cust_account_id NUMBER;
1705 l_fund_id NUMBER;
1706 l_act_budget_id NUMBER;
1707 l_fund_curr_code VARCHAR2(15);
1708 l_plan_curr_code VARCHAR2(15);
1709 l_accrual_curr_code VARCHAR2(15);
1710
1711 l_act_budgets_rec ozf_actbudgets_pvt.act_budgets_rec_type;
1712 l_act_util_rec ozf_actbudgets_pvt.act_util_rec_type ;
1713
1714 --Bug5333804
1715 -- Reverted back for Bugfix 5154157
1716 CURSOR csr_source_fund(cv_offer_id IN NUMBER, cv_fund_id IN NUMBER) IS
1717 SELECT budget_source_id,
1718 request_currency,
1719 ARC_ACT_BUDGET_USED_BY,
1720 ACT_BUDGET_USED_BY_ID,
1721 APPROVED_IN_CURRENCY
1722 FROM ozf_act_budgets
1723 WHERE transfer_type = 'REQUEST'
1724 AND act_budget_used_by_id = cv_offer_id
1725 AND budget_source_id = cv_fund_id;
1726
1727
1728
1729 l_fu_plan_type VARCHAR2(30);
1730 l_fu_plan_id NUMBER;
1731
1732 CURSOR csr_acc_adjustment(cv_offer_id IN NUMBER, cv_cust_account_id IN NUMBER, cv_fund_id IN NUMBER,
1733 cv_product_id IN NUMBER, cv_product_level_type IN VARCHAR2) IS
1734 SELECT utilization_id
1735 FROM ozf_funds_utilized_all_b
1736 WHERE plan_type = 'OFFR'
1737 AND org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
1738 AND plan_id = cv_offer_id
1739 AND fund_id = cv_fund_id
1740 AND adjustment_type_id IN ( -11, -1)
1741 AND ( ( cv_product_id IS NULL AND product_id IS NULL )
1742 OR product_id = cv_product_id )
1743 AND ( (cv_product_level_type IS NULL AND product_level_type IS NULL )
1744 OR product_level_type = cv_product_level_type )
1745 AND utilization_type IN ( 'ADJUSTMENT', 'LEAD_ADJUSTMENT')
1746 AND cust_account_id = cv_cust_account_id;
1747
1748 BEGIN
1749 ----------------------- initialize --------------------
1750 IF OZF_DEBUG_HIGH_ON THEN
1751 OZF_Utility_PVT.debug_message(l_full_name||': start');
1752 END IF;
1753
1754 x_return_status := FND_API.g_ret_sts_success;
1755
1756 -- This package is called only for non scan data offer adjustments
1757
1758
1759 -- Check if adjustment preexists
1760 OPEN csr_acc_adjustment(p_offer_id, p_cust_account_id, p_fund_id, p_product_id, p_product_level_type);
1761 FETCH csr_acc_adjustment INTO x_adj_util_id;
1762 CLOSE csr_acc_adjustment;
1763
1764 IF x_adj_util_id IS NOT NULL THEN
1765 RETURN;
1766 END IF;
1767
1768 -- create adjustment
1769 OPEN csr_source_fund(p_offer_id, p_fund_id);
1770 FETCH csr_source_fund INTO l_fund_id, l_fund_curr_code, l_fu_plan_type, l_fu_plan_id, l_accrual_curr_code;
1771
1772 -- bug 5059770
1773 -- Modified for Bugfix 5333804
1774 l_plan_curr_code := OZF_ACTBUDGETS_PVT.Get_Object_Currency(
1775 p_object => l_fu_plan_type
1776 ,p_object_id => l_fu_plan_id
1777 ,x_return_status => l_return_status
1778 );
1779
1780 IF OZF_DEBUG_HIGH_ON THEN
1781 OZF_Utility_PVT.debug_message('Offer sourcing budget: '||l_fund_id);
1782 END IF;
1783
1784
1785 l_act_budgets_rec.parent_src_apprvd_amt := 0;
1786 l_act_budgets_rec.request_amount := 0;
1787 l_act_budgets_rec.act_budget_used_by_id := p_offer_id;
1788 l_act_budgets_rec.arc_act_budget_used_by := 'OFFR';
1789 l_act_budgets_rec.budget_source_type := 'OFFR';
1790 l_act_budgets_rec.budget_source_id := p_offer_id;
1791 l_act_budgets_rec.request_currency := l_plan_curr_code;
1792 l_act_budgets_rec.request_date := SYSDATE;
1793 l_act_budgets_rec.status_code := 'APPROVED';
1794 l_act_budgets_rec.user_status_id := ozf_utility_pvt.get_default_user_status (
1795 'OZF_BUDGETSOURCE_STATUS'
1796 ,l_act_budgets_rec.status_code
1797 );
1798 l_act_budgets_rec.transfer_type := 'UTILIZED';
1799 l_act_budgets_rec.approval_date := SYSDATE;
1800 l_act_budgets_rec.approver_id := ozf_utility_pvt.get_resource_id (fnd_global.user_id);
1801 l_act_budgets_rec.parent_source_id := l_fund_id;
1802 -- Modified for FXGL ER
1803 -- adjustments created in the fund currency
1804 l_act_budgets_rec.parent_src_curr := l_accrual_curr_code;
1805
1806 l_act_util_rec.gl_date := SYSDATE;
1807 IF p_reference_type = 'LEAD_REFERRAL' THEN
1808 l_act_util_rec.utilization_type := 'LEAD_ADJUSTMENT';
1809 l_act_util_rec.adjustment_type_id := -1;
1810 ELSE
1811 l_act_util_rec.utilization_type := 'ADJUSTMENT';
1812 l_act_util_rec.adjustment_type_id := -11;
1813 END IF;
1814
1815 l_act_util_rec.adjustment_type := 'STANDARD';
1816
1817 l_act_util_rec.cust_account_id := p_cust_account_id;
1818 l_act_util_rec.product_id := p_product_id;
1819 l_act_util_rec.product_level_type := p_product_level_type;
1820
1821 -- Bug 4729839
1822 l_act_util_rec.org_id := MO_GLOBAL.GET_CURRENT_ORG_ID();
1823
1824 l_act_util_rec.reference_type := p_reference_type;
1825 l_act_util_rec.reference_id := p_reference_id;
1826
1827 OZF_Fund_Adjustment_PVT.process_act_budgets (
1828 x_return_status => l_return_status,
1829 x_msg_count => x_msg_count,
1830 x_msg_data => x_msg_data,
1831 p_act_budgets_rec => l_act_budgets_rec,
1832 p_act_util_rec =>l_act_util_rec,
1833 x_act_budget_id => l_act_budget_id
1834 );
1835 IF l_return_status = fnd_api.g_ret_sts_error THEN
1836 RAISE fnd_api.g_exc_error;
1837 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1838 RAISE fnd_api.g_exc_unexpected_error;
1839 END IF;
1840
1841 CLOSE csr_source_fund;
1842
1843 -- Query the adjustment created and return the util id
1844 OPEN csr_acc_adjustment(p_offer_id, p_cust_account_id, p_fund_id, p_product_id, p_product_level_type);
1845 FETCH csr_acc_adjustment INTO x_adj_util_id;
1846 CLOSE csr_acc_adjustment;
1847
1848
1849 ------------------------- finish -------------------------------
1850 IF OZF_DEBUG_HIGH_ON THEN
1851 OZF_Utility_PVT.debug_message(l_full_name ||': end');
1852 END IF;
1853
1854
1855
1856 EXCEPTION
1857 WHEN FND_API.g_exc_error THEN
1858 x_return_status := FND_API.g_ret_sts_error;
1859
1860 WHEN FND_API.g_exc_unexpected_error THEN
1861 x_return_status := FND_API.g_ret_sts_unexp_error ;
1862
1863 WHEN OTHERS THEN
1864 x_return_status := FND_API.g_ret_sts_unexp_error ;
1865 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
1866 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
1867 END IF;
1868
1869 END Create_Fund_Adjustment;
1870
1871 ---------------------------------------------------------------------
1872 -- PROCEDURE
1873 -- Create_Line_Util_Tbl
1874 --
1875 -- HISTORY
1876 -- 05/11/2001 mchang Create.
1877 -- 05/08/2006 azahmed Modified for FXGL ER
1878 -- 01/09/2009 kpatro Modified for Bug 7658894
1879 ---------------------------------------------------------------------
1880 PROCEDURE Create_Line_Util_Tbl(
1881 p_api_version IN NUMBER
1882 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
1883 ,p_commit IN VARCHAR2 := FND_API.g_false
1884 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
1885
1886 ,x_return_status OUT NOCOPY VARCHAR2
1887 ,x_msg_data OUT NOCOPY VARCHAR2
1888 ,x_msg_count OUT NOCOPY NUMBER
1889
1890 ,p_line_util_tbl IN line_util_tbl_type
1891 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
1892 ,x_error_index OUT NOCOPY NUMBER
1893 ) IS
1894 l_api_version CONSTANT NUMBER := 1.0;
1895 l_api_name CONSTANT VARCHAR2(30) := 'Create_Line_Util_Tbl';
1896 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
1897 l_return_status VARCHAR2(1);
1898
1899 l_claim_currency_code VARCHAR2(15);
1900 l_claim_exc_rate NUMBER;
1901 l_claim_exc_date DATE;
1902 l_claim_exc_type VARCHAR2(30);
1903
1904 l_line_util_rec line_util_rec_type;
1905 l_line_util_id NUMBER;
1906
1907 l_claim_id NUMBER;
1908 l_access VARCHAR2(1) := 'N';
1909 l_line_util_amount NUMBER;
1910 -- fix for bug 5042046
1911 CURSOR csr_function_currency IS
1912 SELECT gs.currency_code
1913 FROM gl_sets_of_books gs
1914 , ozf_sys_parameters org
1915 WHERE org.set_of_books_id = gs.set_of_books_id
1916 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
1917
1918 CURSOR csr_claim_exc(cv_claim_line_id IN NUMBER) IS
1919 SELECT cla.currency_code
1920 , cla.exchange_rate_type
1921 , cla.exchange_rate_date
1922 , cla.exchange_rate
1923 FROM ozf_claims cla
1924 , ozf_claim_lines ln
1925 WHERE ln.claim_id = cla.claim_id
1926 AND ln.claim_line_id = cv_claim_line_id;
1927
1928 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
1929 SELECT claim_id
1930 FROM ozf_claim_lines
1931 WHERE claim_line_id = cv_claim_line_id;
1932
1933 -- Bug fix 7463302
1934 CURSOR csr_claim_line_util_amount(cv_claim_line_util_id IN NUMBER) IS
1935 SELECT nvl(amount,0)
1936 FROM ozf_claim_lines_util
1937 WHERE claim_line_util_id = cv_claim_line_util_id;
1938
1939 l_sum_amount NUMBER :=0;
1940 l_last_record_num NUMBER :=0;
1941
1942 -- Added for Testing
1943 l_entered_diff_amount NUMBER := 0;
1944
1945 BEGIN
1946 --------------------- initialize -----------------------
1947 SAVEPOINT Create_Line_Util_Tbl;
1948
1949 IF OZF_DEBUG_HIGH_ON THEN
1950 OZF_Utility_PVT.debug_message(l_full_name||': start');
1951 END IF;
1952
1953 IF FND_API.to_boolean(p_init_msg_list) THEN
1954 FND_MSG_PUB.initialize;
1955 END IF;
1956
1957 IF NOT FND_API.compatible_api_call(
1958 l_api_version,
1959 p_api_version,
1960 l_api_name,
1961 g_pkg_name
1962 )
1963 THEN
1964 RAISE FND_API.g_exc_unexpected_error;
1965 END IF;
1966
1967 x_return_status := FND_API.g_ret_sts_success;
1968
1969 ---------------------- check claim access ------------------------
1970 IF p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode AND p_line_util_tbl.count > 0 THEN
1971 FOR j IN p_line_util_tbl.FIRST..p_line_util_tbl.LAST LOOP
1972 IF p_line_util_tbl.EXISTS(j) THEN
1973
1974 OPEN csr_claim_id(p_line_util_tbl(j).claim_line_id);
1975 FETCH csr_claim_id INTO l_claim_id;
1976 CLOSE csr_claim_id;
1977
1978 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
1979 P_Api_Version_Number => 1.0
1980 , P_Init_Msg_List => FND_API.G_FALSE
1981 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
1982 , P_Commit => FND_API.G_FALSE
1983 , P_object_id => l_claim_id
1984 , P_object_type => G_CLAIM_OBJECT_TYPE
1985 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
1986 , X_Return_Status => l_return_status
1987 , X_Msg_Count => x_msg_count
1988 , X_Msg_Data => x_msg_data
1989 , X_access => l_access);
1990
1991 IF l_access = 'N' THEN
1992 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1993 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
1994 FND_MSG_PUB.add;
1995 END IF;
1996 RAISE FND_API.G_EXC_ERROR;
1997 END IF;
1998 EXIT;
1999 END IF;
2000 END LOOP;
2001 END IF;
2002
2003 --------------------- Create Line Util Table -----------------------
2004 IF p_line_util_tbl.FIRST IS NOT NULL THEN
2005 -- set global functional currency
2006 OPEN csr_function_currency;
2007 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
2008 CLOSE csr_function_currency;
2009
2010 -- get exchange rate info from claim
2011 OPEN csr_claim_exc(p_line_util_tbl(p_line_util_tbl.FIRST).claim_line_id);
2012 FETCH csr_claim_exc INTO l_claim_currency_code
2013 , l_claim_exc_type
2014 , l_claim_exc_date
2015 , l_claim_exc_rate;
2016 CLOSE csr_claim_exc;
2017
2018 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
2019
2020 FOR i IN p_line_util_tbl.FIRST..p_line_util_tbl.LAST LOOP
2021 IF p_line_util_tbl.exists(i) THEN
2022 l_line_util_rec := p_line_util_tbl(i);
2023 l_line_util_rec.currency_code := l_claim_currency_code;
2024 l_line_util_rec.exchange_rate_type := l_claim_exc_type;
2025 l_line_util_rec.exchange_rate_date := l_claim_exc_date;
2026 l_line_util_rec.exchange_rate := l_claim_exc_rate;
2027
2028 Create_Line_Util(
2029 p_api_version => 1.0
2030 , p_init_msg_list => FND_API.g_false
2031 , p_commit => FND_API.g_false
2032 , p_validation_level => p_validation_level
2033 , x_return_status => l_return_status
2034 , x_msg_count => x_msg_count
2035 , x_msg_data => x_msg_data
2036 , p_line_util_rec => l_line_util_rec
2037 , p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
2038 , x_line_util_id => l_line_util_id
2039 );
2040
2041 -- Bug fix 7463302
2042 l_last_record_num := l_line_util_id;
2043
2044 IF OZF_DEBUG_LOW_ON THEN
2045 OZF_Utility_PVT.debug_message(' Sum of l_line_util_id'||l_line_util_id);
2046 END IF;
2047
2048 OPEN csr_claim_line_util_amount(l_line_util_id);
2049 FETCH csr_claim_line_util_amount INTO l_line_util_amount;
2050 CLOSE csr_claim_line_util_amount;
2051
2052 IF OZF_DEBUG_LOW_ON THEN
2053 OZF_Utility_PVT.debug_message(' Sum of l_line_util_amount'||l_line_util_amount);
2054 END IF;
2055
2056 l_sum_amount := NVL(l_sum_amount,0) + l_line_util_amount;
2057
2058 IF OZF_DEBUG_LOW_ON THEN
2059 OZF_Utility_PVT.debug_message(' Sum of Util amount'||l_sum_amount);
2060 END IF;
2061
2062 IF l_return_status = fnd_api.g_ret_sts_error THEN
2063 x_error_index := i;
2064 RAISE FND_API.g_exc_error;
2065 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2066 x_error_index := i;
2067 RAISE FND_API.g_exc_unexpected_error;
2068 END IF;
2069
2070 END IF;
2071 END LOOP;
2072
2073
2074 IF OZF_DEBUG_LOW_ON THEN
2075 OZF_Utility_PVT.debug_message('l_original_total_amount'||l_original_total_amount);
2076 OZF_Utility_PVT.debug_message('l_sum_amount'||l_sum_amount);
2077 OZF_Utility_PVT.debug_message('l_entered_amount'||l_entered_amount);
2078 END IF;
2079
2080 -- Bug fix 7463302
2081
2082 l_entered_diff_amount := l_original_total_amount - NVL(l_entered_amount,0);
2083
2084 IF OZF_DEBUG_LOW_ON THEN
2085 OZF_Utility_PVT.debug_message('l_entered_diff_amount'||l_entered_diff_amount);
2086 END IF;
2087
2088 IF (l_entered_diff_amount <> l_sum_amount) THEN
2089
2090 OPEN csr_claim_line_util_amount(l_last_record_num);
2091 FETCH csr_claim_line_util_amount INTO l_line_util_amount;
2092 CLOSE csr_claim_line_util_amount;
2093
2094 l_line_util_amount := l_line_util_amount + (l_entered_diff_amount - l_sum_amount);
2095
2096 IF OZF_DEBUG_LOW_ON THEN
2097 OZF_Utility_PVT.debug_message('l_line_util_amount'||l_line_util_amount);
2098 OZF_Utility_PVT.debug_message('l_original_total_amount'||l_original_total_amount);
2099 OZF_Utility_PVT.debug_message('l_sum_amount'||l_sum_amount);
2100 END IF;
2101
2102 UPDATE ozf_claim_lines_util_all
2103 SET amount = l_line_util_amount
2104 WHERE claim_line_util_id = l_last_record_num;
2105
2106 END IF;
2107
2108 -- Update Claim Line: set earnings_associated_flag to TRUE
2109 UPDATE ozf_claim_lines_all
2110 SET earnings_associated_flag = 'T'
2111 WHERE claim_line_id = l_line_util_rec.claim_line_id;
2112 END IF;
2113
2114 ------------------------- finish -------------------------------
2115 IF FND_API.to_boolean(p_commit) THEN
2116 COMMIT;
2117 END IF;
2118
2119 FND_MSG_PUB.count_and_get(
2120 p_encoded => FND_API.g_false,
2121 p_count => x_msg_count,
2122 p_data => x_msg_data
2123 );
2124
2125 IF OZF_DEBUG_HIGH_ON THEN
2126 OZF_Utility_PVT.debug_message(l_full_name ||': end');
2127 END IF;
2128
2129 EXCEPTION
2130 WHEN FND_API.g_exc_error THEN
2131 ROLLBACK TO Create_Line_Util_Tbl;
2132 x_return_status := FND_API.g_ret_sts_error;
2133 FND_MSG_PUB.count_and_get (
2134 p_encoded => FND_API.g_false
2135 ,p_count => x_msg_count
2136 ,p_data => x_msg_data
2137 );
2138
2139 WHEN FND_API.g_exc_unexpected_error THEN
2140 ROLLBACK TO Create_Line_Util_Tbl;
2141 x_return_status := FND_API.g_ret_sts_unexp_error ;
2142 FND_MSG_PUB.count_and_get (
2143 p_encoded => FND_API.g_false
2144 ,p_count => x_msg_count
2145 ,p_data => x_msg_data
2146 );
2147
2148 WHEN OTHERS THEN
2149 ROLLBACK TO Create_Line_Util_Tbl;
2150 x_return_status := FND_API.g_ret_sts_unexp_error ;
2151 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
2152 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2153 END IF;
2154 FND_MSG_PUB.count_and_get(
2155 p_encoded => FND_API.g_false
2156 ,p_count => x_msg_count
2157 ,p_data => x_msg_data
2158 );
2159
2160 END Create_Line_Util_Tbl;
2161
2162 ---------------------------------------------------------------------
2163 -- PROCEDURE
2164 -- Create_Line_Util
2165 --
2166 -- HISTORY
2167 -- 05/10/2001 mchang Create.
2168 -- 07/22/2002 yizhang add p_mode for security check
2169 -- 05/08/2006 azahmed Modified for FXGL ER
2170 ---------------------------------------------------------------------
2171 PROCEDURE Create_Line_Util(
2172 p_api_version IN NUMBER
2173 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
2174 ,p_commit IN VARCHAR2 := FND_API.g_false
2175 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
2176
2177 ,x_return_status OUT NOCOPY VARCHAR2
2178 ,x_msg_count OUT NOCOPY NUMBER
2179 ,x_msg_data OUT NOCOPY VARCHAR2
2180
2181 ,p_line_util_rec IN line_util_rec_type
2182 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
2183 ,x_line_util_id OUT NOCOPY NUMBER
2184 )
2185 IS
2186 l_api_version CONSTANT NUMBER := 1.0;
2187 l_api_name CONSTANT VARCHAR2(30) := 'Create_Line_Util';
2188 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2189 l_return_status VARCHAR2(1);
2190
2191 l_line_util_rec line_util_rec_type := p_line_util_rec;
2192 l_line_util_count NUMBER;
2193 l_total_exist_util_amt NUMBER;
2194 l_line_acctd_amount NUMBER;
2195
2196 l_utilization_rec OZF_Fund_Utilized_PVT.utilization_rec_type;
2197
2198 l_claim_id NUMBER;
2199 l_access VARCHAR2(1) := 'N';
2200 l_convert_exchange_rate NUMBER;
2201 l_utiz_currency VARCHAR2(15);
2202 l_line_util_amount NUMBER;
2203 l_update_fund_amount NUMBER;
2204 l_claim_date DATE;
2205 l_exchange_rate_type VARCHAR2(30);
2206 l_exchange_rate_date DATE;
2207 l_exchange_rate NUMBER;
2208
2209
2210 CURSOR csr_line_util_seq IS
2211 SELECT ozf_claim_lines_util_all_s.NEXTVAL
2212 FROM DUAL;
2213
2214 CURSOR csr_line_util_count(cv_line_util_id IN NUMBER) IS
2215 SELECT COUNT(claim_line_util_id)
2216 FROM ozf_claim_lines_util
2217 WHERE claim_line_util_id = cv_line_util_id;
2218
2219 -- fix for bug 5042046
2220 CURSOR csr_function_currency IS
2221 SELECT gs.currency_code
2222 FROM gl_sets_of_books gs
2223 , ozf_sys_parameters org
2224 WHERE org.set_of_books_id = gs.set_of_books_id
2225 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
2226
2227 CURSOR csr_claim_exc(cv_claim_line_id IN NUMBER) IS
2228 SELECT cla.currency_code
2229 , cla.exchange_rate_type
2230 , cla.exchange_rate_date
2231 , cla.exchange_rate
2232 , cla.creation_date
2233 FROM ozf_claims cla
2234 , ozf_claim_lines ln
2235 WHERE ln.claim_id = cla.claim_id
2236 AND ln.claim_line_id = cv_claim_line_id;
2237
2238
2239 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
2240 SELECT claim_id, acctd_amount
2241 FROM ozf_claim_lines
2242 WHERE claim_line_id = cv_claim_line_id;
2243
2244 CURSOR csr_total_exist_util_amt(cv_claim_line_id IN NUMBER) IS
2245 SELECT nvl(SUM(acctd_amount),0)
2246 FROM ozf_claim_lines_util
2247 WHERE claim_line_id = cv_claim_line_id;
2248
2249 CURSOR csr_claim_org(cv_claim_id IN NUMBER) IS
2250 SELECT org_id
2251 FROM ozf_claims_all
2252 WHERE claim_id = cv_claim_id;
2253
2254 -- Get Accrual Currency
2255 CURSOR csr_acc_currency(cv_utilization_id IN NUMBER) IS
2256 SELECT currency_code
2257 FROM ozf_funds_utilized_all_b
2258 where utilization_id = cv_utilization_id;
2259
2260 BEGIN
2261 --------------------- initialize -----------------------
2262 SAVEPOINT Create_Line_Util;
2263
2264 IF OZF_DEBUG_HIGH_ON THEN
2265 OZF_Utility_PVT.debug_message(l_full_name||': start');
2266 END IF;
2267
2268 IF FND_API.to_boolean(p_init_msg_list) THEN
2269 FND_MSG_PUB.initialize;
2270 END IF;
2271
2272 IF NOT FND_API.compatible_api_call(
2273 l_api_version,
2274 p_api_version,
2275 l_api_name,
2276 g_pkg_name
2277 ) THEN
2278 RAISE FND_API.g_exc_unexpected_error;
2279 END IF;
2280
2281 x_return_status := FND_API.g_ret_sts_success;
2282
2283 OPEN csr_claim_id(p_line_util_rec.claim_line_id);
2284 FETCH csr_claim_id INTO l_claim_id, l_line_acctd_amount;
2285 CLOSE csr_claim_id;
2286
2287 ---------------------- check claim access ------------------------
2288 IF l_line_util_rec.update_from_tbl_flag = FND_API.g_false AND p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode THEN
2289 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
2290 P_Api_Version_Number => 1.0
2291 , P_Init_Msg_List => FND_API.G_FALSE
2292 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2293 , P_Commit => FND_API.G_FALSE
2294 , P_object_id => l_claim_id
2295 , P_object_type => G_CLAIM_OBJECT_TYPE
2296 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
2297 , X_Return_Status => l_return_status
2298 , X_Msg_Count => x_msg_count
2299 , X_Msg_Data => x_msg_data
2300 , X_access => l_access);
2301
2302 IF l_access = 'N' THEN
2303 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
2304 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
2305 FND_MSG_PUB.add;
2306 END IF;
2307 RAISE FND_API.G_EXC_ERROR;
2308 END IF;
2309 END IF;
2310
2311 ----------------------- Start ------------------------
2312 l_line_util_rec.object_version_number := 1;
2313 l_line_util_rec.last_updated_by := NVL(FND_GLOBAL.user_id,-1);
2314 l_line_util_rec.created_by := NVL(FND_GLOBAL.user_id,-1);
2315 l_line_util_rec.last_update_login := NVL(FND_GLOBAL.conc_login_id,-1);
2316
2317 -- R12: Get Org from the claim
2318 OPEN csr_claim_org(l_claim_id);
2319 FETCH csr_claim_org INTO l_line_util_rec.org_id;
2320 CLOSE csr_claim_org;
2321 -- get exchange rate info from claim
2322 OPEN csr_claim_exc(p_line_util_rec.claim_line_id);
2323 FETCH csr_claim_exc INTO l_line_util_rec.currency_code
2324 , l_exchange_rate_type
2325 , l_exchange_rate_date
2326 , l_exchange_rate
2327 , l_claim_date;
2328 CLOSE csr_claim_exc;
2329
2330 IF l_line_util_rec.update_from_tbl_flag = FND_API.g_false THEN
2331 -- set global functional currency
2332 OPEN csr_function_currency;
2333 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
2334 CLOSE csr_function_currency;
2335
2336 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
2337 l_line_util_rec.exchange_rate_type := l_exchange_rate_type;
2338 l_line_util_rec.exchange_rate_date := l_exchange_rate_date;
2339 l_line_util_rec.exchange_rate := l_exchange_rate;
2340
2341 END IF;
2342
2343 ------------------ convert currency --------------------
2344 IF p_line_util_rec.amount IS NOT NULL THEN
2345
2346 IF l_line_util_rec.utilization_id > -1 THEN
2347 -- Get Accrual Currency
2348 OPEN csr_acc_currency(l_line_util_rec.utilization_id);
2349 FETCH csr_acc_currency INTO l_utiz_currency;
2350 CLOSE csr_acc_currency;
2351
2352 -- need to finish coding this bit
2353 -- Check whether amount is in claim currency or utiz currency
2354 -- As cross currency association is being allowed
2355 IF l_line_util_rec.currency_code <> l_utiz_currency THEN
2356 l_line_util_rec.util_curr_amount := l_line_util_rec.amount;
2357 -- Need to pass amount in accrual currency to update funds util
2358 l_update_fund_amount := l_line_util_rec.amount;
2359
2360 IF OZF_DEBUG_LOW_ON THEN
2361 OZF_Utility_PVT.debug_message('l_line_util_rec.currency_code : '||l_line_util_rec.currency_code);
2362 OZF_Utility_PVT.debug_message('l_line_util_rec.amount : '||l_line_util_rec.amount);
2363 OZF_Utility_PVT.debug_message('l_utiz_currency. : '||l_utiz_currency);
2364 OZF_Utility_PVT.debug_message('l_claim_date. : '||l_claim_date);
2365 END IF;
2366 -- Bugfix 5528210: use claim exchnage rate and not default rate
2367 OZF_UTILITY_PVT.Convert_Currency(
2368 p_from_currency => l_utiz_currency
2369 ,p_to_currency => l_line_util_rec.currency_code
2370 ,p_conv_type => l_exchange_rate_type
2371 ,p_conv_rate => (1/l_exchange_rate)
2372 ,p_conv_date => l_exchange_rate_date
2373 ,p_from_amount => l_line_util_rec.amount
2374 ,x_return_status => l_return_status
2375 ,x_to_amount => l_line_util_amount
2376 ,x_rate => l_convert_exchange_rate
2377 );
2378 IF l_return_status = FND_API.g_ret_sts_error THEN
2379 RAISE FND_API.g_exc_error;
2380 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
2381 RAISE FND_API.g_exc_unexpected_error;
2382 END IF;
2383 l_line_util_rec.amount := l_line_util_amount;
2384
2385 IF l_utiz_currency = G_FUNCTIONAL_CURRENCY THEN
2386 l_line_util_rec.acctd_amount := l_line_util_rec.util_curr_amount;
2387 ELSIF l_line_util_rec.currency_code = G_FUNCTIONAL_CURRENCY THEN
2388 l_line_util_rec.acctd_amount := l_line_util_amount;
2389 END IF;
2390 IF l_line_util_rec.acctd_amount IS NOT NULL THEN
2391 l_line_util_rec.acctd_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.acctd_amount, G_FUNCTIONAL_CURRENCY);
2392 END IF;
2393
2394 IF l_line_util_rec.amount IS NOT NULL THEN
2395 l_line_util_rec.amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.amount, l_line_util_rec.currency_code);
2396 END IF;
2397 ELSE
2398
2399 l_update_fund_amount := l_line_util_rec.amount;
2400 -- Convert amount --> acctd_amount(functional currency)
2401 IF G_FUNCTIONAL_CURRENCY = l_line_util_rec.currency_code THEN
2402 l_line_util_rec.acctd_amount := l_line_util_rec.amount;
2403 ELSE
2404 -- Bugfix 5528210
2405 -- Only when conv_type = 'User' p_conv_rate is used
2406 OZF_UTILITY_PVT.Convert_Currency(
2407 p_from_currency => l_line_util_rec.currency_code
2408 ,p_to_currency => G_FUNCTIONAL_CURRENCY
2409 ,p_conv_type => l_line_util_rec.exchange_rate_type
2410 ,p_conv_rate => l_line_util_rec.exchange_rate
2411 ,p_conv_date => l_line_util_rec.exchange_rate_date
2412 ,p_from_amount => l_line_util_rec.amount
2413 ,x_return_status => l_return_status
2414 ,x_to_amount => l_line_util_rec.acctd_amount
2415 ,x_rate => l_convert_exchange_rate
2416 );
2417 IF l_return_status = FND_API.g_ret_sts_error THEN
2418 RAISE FND_API.g_exc_error;
2419 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
2420 RAISE FND_API.g_exc_unexpected_error;
2421 END IF;
2422 IF l_line_util_rec.acctd_amount IS NOT NULL THEN
2423 l_line_util_rec.acctd_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.acctd_amount, G_FUNCTIONAL_CURRENCY);
2424 END IF;
2425 IF l_line_util_rec.amount IS NOT NULL THEN
2426 l_line_util_rec.amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.amount, G_CLAIM_CURRENCY);
2427 END IF;
2428 END IF;
2429 END IF;
2430 ELSE
2431 -- when scan data over utils record case(covert amt to acctd_amount)
2432 OZF_UTILITY_PVT.Convert_Currency(
2433 p_from_currency => l_line_util_rec.currency_code
2434 ,p_to_currency => G_FUNCTIONAL_CURRENCY
2435 ,p_conv_type => l_line_util_rec.exchange_rate_type
2436 ,p_conv_rate => l_line_util_rec.exchange_rate
2437 ,p_conv_date => l_line_util_rec.exchange_rate_date
2438 ,p_from_amount => l_line_util_rec.amount
2439 ,x_return_status => l_return_status
2440 ,x_to_amount => l_line_util_rec.acctd_amount
2441 ,x_rate => l_convert_exchange_rate
2442 );
2443 -- util_curr_amount, univ_curr_amount, fxgl_acctd_amount, utilized_acctd_amount
2444 -- are all null in this case
2445 -- these will all be set when Adjust_Fund_Utilization is called
2446
2447 END IF; -- l_line_util_rec.utilization_id > -1
2448 END IF; -- p_line_util_rec.amount <> null
2449
2450
2451
2452
2453 ------------------- update utilization --------------------
2454 -- skip dummy utils (line utils with utilization_id = -1)
2455
2456 IF l_line_util_rec.utilization_id > -1 THEN
2457
2458 Update_Fund_Utils(
2459 x_return_status => l_return_status
2460 ,x_msg_count => x_msg_count
2461 ,x_msg_data => x_msg_data
2462 ,p_line_util_rec => l_line_util_rec
2463 ,p_fu_diff_acctd_amt_rem => (-l_update_fund_amount)
2464 ,p_mode => 'CALCULATE'
2465 );
2466 IF l_return_status = fnd_api.g_ret_sts_error THEN
2467 RAISE FND_API.g_exc_error;
2468 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2469 RAISE FND_API.g_exc_unexpected_error;
2470 END IF;
2471
2472 END IF; -- IF l_utilization_id > -1
2473
2474 -------------------------- insert --------------------------
2475 IF OZF_DEBUG_HIGH_ON THEN
2476 OZF_Utility_PVT.debug_message(l_full_name ||': insert');
2477 OZF_Utility_PVT.debug_message('utilization_id : '||l_line_util_rec.utilization_id);
2478 OZF_Utility_PVT.debug_message('amount : '||l_line_util_rec.amount);
2479 OZF_Utility_PVT.debug_message('acctd amount : '||l_line_util_rec.acctd_amount);
2480 END IF;
2481
2482
2483 IF l_line_util_rec.claim_line_util_id IS NULL THEN
2484 LOOP
2485 -- Get the identifier
2486 OPEN csr_line_util_seq;
2487 FETCH csr_line_util_seq INTO l_line_util_rec.claim_line_util_id;
2488 CLOSE csr_line_util_seq;
2489 -- Check the uniqueness of the identifier
2490 OPEN csr_line_util_count(l_line_util_rec.claim_line_util_id);
2491 FETCH csr_line_util_count INTO l_line_util_count;
2492 CLOSE csr_line_util_count;
2493 -- Exit when the identifier uniqueness is established
2494 EXIT WHEN l_line_util_count = 0;
2495 END LOOP;
2496 END IF;
2497
2498 INSERT INTO ozf_claim_lines_util_all (
2499 claim_line_util_id,
2500 object_version_number,
2501 last_update_date,
2502 last_updated_by,
2503 creation_date,
2504 created_by,
2505 last_update_login,
2506 claim_line_id,
2507 utilization_id,
2508 amount,
2509 currency_code,
2510 exchange_rate_type,
2511 exchange_rate_date,
2512 exchange_rate,
2513 acctd_amount,
2514 util_curr_amount,
2515 plan_curr_amount,
2516 univ_curr_amount,
2517 scan_unit,
2518 activity_product_id,
2519 uom_code,
2520 quantity,
2521 org_id,
2522 fxgl_acctd_amount,
2523 utilized_acctd_amount
2524 )
2525 VALUES (
2526 l_line_util_rec.claim_line_util_id,
2527 l_line_util_rec.object_version_number,
2528 SYSDATE,
2529 l_line_util_rec.last_updated_by,
2530 SYSDATE,
2531 l_line_util_rec.created_by,
2532 l_line_util_rec.last_update_login,
2533 l_line_util_rec.claim_line_id,
2534 l_line_util_rec.utilization_id,
2535 l_line_util_rec.amount,
2536 l_line_util_rec.currency_code,
2537 l_line_util_rec.exchange_rate_type,
2538 l_line_util_rec.exchange_rate_date,
2539 l_line_util_rec.exchange_rate,
2540 l_line_util_rec.acctd_amount,
2541 l_line_util_rec.util_curr_amount,
2542 l_line_util_rec.plan_curr_amount,
2543 l_line_util_rec.univ_curr_amount,
2544 l_line_util_rec.scan_unit,
2545 l_line_util_rec.activity_product_id,
2546 l_line_util_rec.uom_code,
2547 l_line_util_rec.quantity,
2548 l_line_util_rec.org_id,
2549 l_line_util_rec.fxgl_acctd_amount,
2550 l_line_util_rec.utilized_acctd_amount
2551
2552 );
2553
2554 ------ Update Claim Line: set earnings_associated_flag to TRUE -----
2555 IF l_line_util_rec.update_from_tbl_flag = FND_API.g_false THEN
2556 UPDATE ozf_claim_lines_all
2557 SET earnings_associated_flag = 'T'
2558 WHERE claim_line_id = l_line_util_rec.claim_line_id;
2559 END IF;
2560
2561 ------------------------- finish -------------------------------
2562 x_line_util_id := l_line_util_rec.claim_line_util_id;
2563
2564 -- Check for commit
2565 IF FND_API.to_boolean(p_commit) THEN
2566 COMMIT;
2567 END IF;
2568
2569 FND_MSG_PUB.count_and_get(
2570 p_encoded => FND_API.g_false,
2571 p_count => x_msg_count,
2572 p_data => x_msg_data
2573 );
2574
2575 IF OZF_DEBUG_HIGH_ON THEN
2576 OZF_Utility_PVT.debug_message(l_full_name ||': end');
2577 END IF;
2578
2579 EXCEPTION
2580 WHEN FND_API.g_exc_error THEN
2581 ROLLBACK TO Create_Line_Util;
2582 x_return_status := FND_API.g_ret_sts_error;
2583 FND_MSG_PUB.count_and_get (
2584 p_encoded => FND_API.g_false
2585 ,p_count => x_msg_count
2586 ,p_data => x_msg_data
2587 );
2588
2589 WHEN FND_API.g_exc_unexpected_error THEN
2590 ROLLBACK TO Create_Line_Util;
2591 x_return_status := FND_API.g_ret_sts_unexp_error ;
2592 FND_MSG_PUB.count_and_get (
2593 p_encoded => FND_API.g_false
2594 ,p_count => x_msg_count
2595 ,p_data => x_msg_data
2596 );
2597
2598 WHEN OTHERS THEN
2599 ROLLBACK TO Create_Line_Util;
2600 x_return_status := FND_API.g_ret_sts_unexp_error ;
2601 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
2602 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2603 END IF;
2604 FND_MSG_PUB.count_and_get(
2605 p_encoded => FND_API.g_false
2606 ,p_count => x_msg_count
2607 ,p_data => x_msg_data
2608 );
2609
2610 END Create_Line_Util;
2611
2612
2613 ---------------------------------------------------------------------
2614 -- PROCEDURE
2615 -- Update_Line_Util_Tbl
2616 --
2617 -- HISTORY
2618 -- 05/12/2001 mchang Create.
2619 -- 07/22/2002 yizhang add p_mode for security check
2620 -- 7-Aug-06 azahmed Modified for FXGL ER
2621 ---------------------------------------------------------------------
2622 PROCEDURE Update_Line_Util_Tbl(
2623 p_api_version IN NUMBER
2624 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
2625 ,p_commit IN VARCHAR2 := FND_API.g_false
2626 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
2627
2628 ,x_return_status OUT NOCOPY VARCHAR2
2629 ,x_msg_data OUT NOCOPY VARCHAR2
2630 ,x_msg_count OUT NOCOPY NUMBER
2631
2632 ,p_line_util_tbl IN line_util_tbl_type
2633 ,p_mode IN VARCHAr2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
2634
2635 ,x_error_index OUT NOCOPY NUMBER
2636 ) IS
2637 l_api_version CONSTANT NUMBER := 1.0;
2638 l_api_name CONSTANT VARCHAR2(30) := 'Update_Line_Util_Tbl';
2639 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
2640 l_return_status VARCHAR2(1);
2641
2642 l_line_util_rec line_util_rec_type;
2643 l_claim_id NUMBER;
2644 l_object_version NUMBER;
2645 l_access VARCHAR2(1) := 'N';
2646 i PLS_INTEGER;
2647
2648
2649 -- Cursor to get claim_id
2650 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
2651 SELECT claim_id
2652 FROM ozf_claim_lines
2653 WHERE claim_line_id = cv_claim_line_id;
2654
2655 -- fix for bug 5042046
2656 CURSOR csr_function_currency IS
2657 SELECT gs.currency_code
2658 FROM gl_sets_of_books gs
2659 , ozf_sys_parameters org
2660 WHERE org.set_of_books_id = gs.set_of_books_id
2661 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
2662
2663 BEGIN
2664 --------------------- initialize -----------------------
2665 SAVEPOINT Update_Line_Util_Tbl;
2666
2667 IF OZF_DEBUG_HIGH_ON THEN
2668 OZF_Utility_PVT.debug_message(l_full_name||': start');
2669 END IF;
2670
2671 IF FND_API.to_boolean(p_init_msg_list) THEN
2672 FND_MSG_PUB.initialize;
2673 END IF;
2674
2675 IF NOT FND_API.compatible_api_call(
2676 l_api_version,
2677 p_api_version,
2678 l_api_name,
2679 g_pkg_name
2680 ) THEN
2681 RAISE FND_API.g_exc_unexpected_error;
2682 END IF;
2683
2684 x_return_status := FND_API.g_ret_sts_success;
2685
2686 ---------------------- check claim access ------------------------
2687 IF p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode AND p_line_util_tbl.count > 0 THEN
2688 FOR j IN p_line_util_tbl.FIRST..p_line_util_tbl.LAST LOOP
2689 IF p_line_util_tbl.EXISTS(j) THEN
2690
2691 OPEN csr_claim_id(p_line_util_tbl(j).claim_line_id);
2692 FETCH csr_claim_id INTO l_claim_id;
2693 CLOSE csr_claim_id;
2694
2695 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
2696 P_Api_Version_Number => 1.0
2697 , P_Init_Msg_List => FND_API.G_FALSE
2698 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2699 , P_Commit => FND_API.G_FALSE
2700 , P_object_id => l_claim_id
2701 , P_object_type => G_CLAIM_OBJECT_TYPE
2702 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
2703 , X_Return_Status => l_return_status
2704 , X_Msg_Count => x_msg_count
2705 , X_Msg_Data => x_msg_data
2706 , X_access => l_access);
2707
2708 IF l_access = 'N' THEN
2709 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
2710 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
2711 FND_MSG_PUB.add;
2712 END IF;
2713 RAISE FND_API.G_EXC_ERROR;
2714 END IF;
2715 EXIT;
2716 END IF;
2717 END LOOP;
2718 END IF;
2719
2720 --------------------- Update Claim Line Table -----------------------
2721
2722 i := p_line_util_tbl.FIRST;
2723 IF i IS NOT NULL THEN
2724 OPEN csr_function_currency;
2725 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
2726 CLOSE csr_function_currency;
2727 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
2728
2729 LOOP
2730 l_line_util_rec := p_line_util_tbl(i);
2731 IF l_line_util_rec.claim_line_util_id IS NOT NULL THEN
2732 l_line_util_rec.amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.amount, l_line_util_rec.currency_code);
2733 l_line_util_rec.update_from_tbl_flag := FND_API.g_true;
2734 Update_Line_Util(
2735 p_api_version => l_api_version
2736 , p_init_msg_list => FND_API.g_false
2737 , p_commit => FND_API.g_false
2738 , p_validation_level => p_validation_level
2739 , x_return_status => l_return_status
2740 , x_msg_count => x_msg_count
2741 , x_msg_data => x_msg_data
2742 , p_line_util_rec => l_line_util_rec
2743 , p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
2744 , x_object_version => l_object_version
2745 );
2746 IF l_return_status = fnd_api.g_ret_sts_error THEN
2747 x_error_index := i;
2748 RAISE FND_API.g_exc_error;
2749 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
2750 x_error_index := i;
2751 RAISE FND_API.g_exc_unexpected_error;
2752 END IF;
2753 END IF;
2754 EXIT WHEN i = p_line_util_tbl.LAST;
2755 i := p_line_util_tbl.NEXT(i);
2756 END LOOP;
2757 END IF;
2758
2759 ------------------------- finish -------------------------------
2760 IF FND_API.to_boolean(p_commit) THEN
2761 COMMIT;
2762 END IF;
2763
2764 FND_MSG_PUB.count_and_get(
2765 p_encoded => FND_API.g_false,
2766 p_count => x_msg_count,
2767 p_data => x_msg_data
2768 );
2769
2770 IF OZF_DEBUG_HIGH_ON THEN
2771 OZF_Utility_PVT.debug_message(l_full_name ||': end');
2772 END IF;
2773
2774 EXCEPTION
2775 WHEN FND_API.g_exc_error THEN
2776 ROLLBACK TO Update_Line_Util_Tbl;
2777 x_return_status := FND_API.g_ret_sts_error;
2778 FND_MSG_PUB.count_and_get (
2779 p_encoded => FND_API.g_false
2780 ,p_count => x_msg_count
2781 ,p_data => x_msg_data
2782 );
2783
2784 WHEN FND_API.g_exc_unexpected_error THEN
2785 ROLLBACK TO Update_Line_Util_Tbl;
2786 x_return_status := FND_API.g_ret_sts_unexp_error ;
2787 FND_MSG_PUB.count_and_get (
2788 p_encoded => FND_API.g_false
2789 ,p_count => x_msg_count
2790 ,p_data => x_msg_data
2791 );
2792
2793 WHEN OTHERS THEN
2794 ROLLBACK TO Update_Line_Util_Tbl;
2795 x_return_status := FND_API.g_ret_sts_unexp_error ;
2796 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
2797 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
2798 END IF;
2799 FND_MSG_PUB.count_and_get(
2800 p_encoded => FND_API.g_false
2801 ,p_count => x_msg_count
2802 ,p_data => x_msg_data
2803 );
2804
2805 END Update_Line_Util_Tbl;
2806
2807
2808 ---------------------------------------------------------------------
2809 -- PROCEDURE
2810 -- Update_Line_Util
2811 --
2812 -- HISTORY
2813 -- 05/10/2001 mchang Create.
2814 -- 07/22/2002 yizhang add p_mode for security check
2815 -- 15-Mar-06 azahmed Bugfix 5101106 added condition to update fu only when util_id > -1
2816 -- 08-Aug-06 azahmed Modifed for FXGL ER
2817 ----------------------------------------------------------------------
2818 PROCEDURE Update_Line_Util(
2819 p_api_version IN NUMBER
2820 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
2821 ,p_commit IN VARCHAR2 := FND_API.g_false
2822 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
2823
2824 ,x_return_status OUT NOCOPY VARCHAR2
2825 ,x_msg_count OUT NOCOPY NUMBER
2826 ,x_msg_data OUT NOCOPY VARCHAR2
2827
2828 ,p_line_util_rec IN line_util_rec_type
2829 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
2830 ,x_object_version OUT NOCOPY NUMBER
2831 )
2832 IS
2833 l_api_version CONSTANT NUMBER := 1.0;
2834 l_api_name CONSTANT VARCHAR2(30) := 'Update_Line_Util';
2835 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
2836 l_return_status VARCHAR2(1);
2837
2838 l_line_util_rec line_util_rec_type;
2839 l_claim_id NUMBER;
2840 l_lu_old_amt NUMBER;
2841 l_lu_old_scan_unit NUMBER;
2842 l_utilization_rec OZF_Fund_Utilized_PVT.utilization_rec_type;
2843
2844 l_access VARCHAR2(1) := 'N';
2845 l_total_exist_util_amt NUMBER;
2846 l_line_acctd_amount NUMBER;
2847 l_exchange_rate NUMBER;
2848 l_claim_date DATE;
2849 l_utiz_currency VARCHAR2(15);
2850 l_old_utiz_amount NUMBER;
2851 l_update_fund_amount NUMBER;
2852
2853 CURSOR csr_utiz_currency(cv_utilization_id IN NUMBER) IS
2854 SELECT fu.currency_code
2855 FROM ozf_funds_utilized_all_b fu
2856 where fu.utilization_id = cv_utilization_id;
2857
2858
2859 -- fix for bug 5042046
2860 CURSOR csr_function_currency IS
2861 SELECT gs.currency_code
2862 FROM gl_sets_of_books gs
2863 , ozf_sys_parameters org
2864 WHERE org.set_of_books_id = gs.set_of_books_id
2865 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
2866
2867 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
2868 SELECT claim_id, acctd_amount
2869 FROM ozf_claim_lines
2870 WHERE claim_line_id = cv_claim_line_id;
2871
2872 CURSOR csr_lu_old_amt(cv_line_util_id IN NUMBER) IS
2873 SELECT amount, scan_unit , util_curr_amount
2874 FROM ozf_claim_lines_util
2875 WHERE claim_line_util_id = cv_line_util_id;
2876
2877 CURSOR csr_total_exist_util_amt(cv_claim_line_id IN NUMBER) IS
2878 SELECT nvl(SUM(acctd_amount),0)
2879 FROM ozf_claim_lines_util
2880 WHERE claim_line_id = cv_claim_line_id;
2881
2882 CURSOR csr_claim_date(cv_claim_line_id IN NUMBER) IS
2883 SELECT cla.creation_date
2884 FROM ozf_claims cla, ozf_claim_lines cl
2885 WHERE cla.claim_id = cl.claim_id
2886 AND cl.claim_line_id = cv_claim_line_id;
2887
2888 BEGIN
2889 -------------------- initialize -------------------------
2890 SAVEPOINT Update_Line_Util;
2891
2892 IF OZF_DEBUG_HIGH_ON THEN
2893 OZF_Utility_PVT.debug_message(l_full_name||': start');
2894 END IF;
2895
2896 IF FND_API.to_boolean(p_init_msg_list) THEN
2897 FND_MSG_PUB.initialize;
2898 END IF;
2899
2900 IF NOT FND_API.compatible_api_call(
2901 l_api_version,
2902 p_api_version,
2903 l_api_name,
2904 g_pkg_name
2905 ) THEN
2906 RAISE FND_API.g_exc_unexpected_error;
2907 END IF;
2908
2909 x_return_status := FND_API.g_ret_sts_success;
2910
2911 ----------------------- validate ----------------------
2912 IF OZF_DEBUG_HIGH_ON THEN
2913 OZF_Utility_PVT.debug_message(l_full_name ||': validate');
2914 END IF;
2915
2916 -- replace g_miss_char/num/date with current column values
2917 Complete_Line_Util_Rec(
2918 p_line_util_rec => p_line_util_rec
2919 ,x_complete_rec => l_line_util_rec
2920 );
2921
2922 l_line_util_rec.object_version_number := l_line_util_rec.object_version_number + 1;
2923 l_line_util_rec.last_updated_by := NVL(FND_GLOBAL.user_id,-1);
2924 l_line_util_rec.last_update_login := NVL(FND_GLOBAL.conc_login_id,-1);
2925
2926 -- get claim_id
2927 OPEN csr_claim_id(p_line_util_rec.claim_line_id);
2928 FETCH csr_claim_id INTO l_claim_id, l_line_acctd_amount;
2929 CLOSE csr_claim_id;
2930
2931 OPEN csr_claim_date(p_line_util_rec.claim_line_id);
2932 FETCH csr_claim_date INTO l_claim_date;
2933 CLOSE csr_claim_date;
2934
2935
2936 ---------------------- check claim access ------------------------
2937 IF p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode THEN
2938 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
2939 P_Api_Version_Number => 1.0
2940 , P_Init_Msg_List => FND_API.G_FALSE
2941 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
2942 , P_Commit => FND_API.G_FALSE
2943 , P_object_id => l_claim_id
2944 , P_object_type => G_CLAIM_OBJECT_TYPE
2945 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
2946 , X_Return_Status => l_return_status
2947 , X_Msg_Count => x_msg_count
2948 , X_Msg_Data => x_msg_data
2949 , X_access => l_access);
2950
2951 IF l_access = 'N' THEN
2952 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
2953 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
2954 FND_MSG_PUB.add;
2955 END IF;
2956 RAISE FND_API.G_EXC_ERROR;
2957 END IF;
2958 END IF;
2959
2960 IF p_line_util_rec.update_from_tbl_flag = FND_API.g_false THEN
2961 -- get functional_currency
2962 OPEN csr_function_currency;
2963 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
2964 CLOSE csr_function_currency;
2965 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
2966
2967 END IF;
2968
2969 IF (p_line_util_rec.amount is not null
2970 AND p_line_util_rec.amount <> FND_API.g_miss_num) THEN
2971 OPEN csr_lu_old_amt(p_line_util_rec.claim_line_util_id);
2972 FETCH csr_lu_old_amt INTO l_lu_old_amt, l_lu_old_scan_unit, l_old_utiz_amount;
2973 CLOSE csr_lu_old_amt;
2974
2975 IF l_line_util_rec.amount <> l_lu_old_amt THEN
2976 ------------------ convert currency ----------------------
2977 -- mOdified for FXGL Enhancement
2978 -- Convert amount --> acctd_amount(functional currency)
2979 IF G_FUNCTIONAL_CURRENCY = l_line_util_rec.currency_code THEN
2980 l_line_util_rec.acctd_amount := l_line_util_rec.amount ;
2981 ELSE
2982 OZF_UTILITY_PVT.Convert_Currency(
2983 p_from_currency => l_line_util_rec.currency_code
2984 ,p_to_currency => G_FUNCTIONAL_CURRENCY
2985 ,p_conv_type => l_line_util_rec.exchange_rate_type
2986 ,p_conv_rate => l_line_util_rec.exchange_rate
2987 ,p_conv_date => l_line_util_rec.exchange_rate_date
2988 ,p_from_amount => l_line_util_rec.amount
2989 ,x_return_status => l_return_status
2990 ,x_to_amount => l_line_util_rec.acctd_amount
2991 ,x_rate => l_exchange_rate
2992 );
2993 IF l_return_status = FND_API.g_ret_sts_error THEN
2994 RAISE FND_API.g_exc_error;
2995 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
2996 RAISE FND_API.g_exc_unexpected_error;
2997 END IF;
2998 IF l_line_util_rec.acctd_amount IS NOT NULL THEN
2999 l_line_util_rec.acctd_amount := OZF_UTILITY_PVT.CurrRound(l_line_util_rec.acctd_amount, G_FUNCTIONAL_CURRENCY);
3000 END IF;
3001
3002 END IF;
3003
3004
3005 --------------------- update utilization ----------------------
3006 IF OZF_DEBUG_HIGH_ON THEN
3007 OZF_Utility_PVT.debug_message(l_full_name ||': update funds utilized');
3008 END IF;
3009
3010 IF l_line_util_rec.utilization_id > -1 THEN --added for bugfx 5101106
3011
3012 OPEN csr_utiz_currency(l_line_util_rec.utilization_id);
3013 FETCH csr_utiz_currency INTO l_utiz_currency;
3014 CLOSE csr_utiz_currency;
3015 -- Derive utiz curr
3016 -- if curr mismatch then convert amount to utiz amount and populate util_curr
3017 -- get diference between old utiz_amount and new_utiz_amount and pass that
3018 -- else pass the old value
3019 IF G_CLAIM_CURRENCY <> l_utiz_currency THEN
3020 -- Modifed for Bugfix 5528210: Use claim exchange rate
3021 OZF_UTILITY_PVT.Convert_Currency(
3022 p_from_currency => l_line_util_rec.currency_code
3023 ,p_to_currency => l_utiz_currency
3024 ,p_conv_type => l_line_util_rec.exchange_rate_type
3025 ,p_conv_rate => l_line_util_rec.exchange_rate
3026 ,p_conv_date => l_line_util_rec.exchange_rate_date
3027 ,p_from_amount => l_line_util_rec.amount
3028 ,x_return_status => l_return_status
3029 ,x_to_amount => l_line_util_rec.util_curr_amount
3030 ,x_rate => l_exchange_rate
3031 );
3032 IF l_return_status = FND_API.g_ret_sts_error THEN
3033 RAISE FND_API.g_exc_error;
3034 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
3035 RAISE FND_API.g_exc_unexpected_error;
3036 END IF;
3037 l_update_fund_amount := l_old_utiz_amount - l_line_util_rec.util_curr_amount;
3038 ELSE
3039 l_update_fund_amount := l_lu_old_amt - l_line_util_rec.amount;
3040 END IF;
3041
3042 Update_Fund_Utils(
3043 x_return_status => l_return_status
3044 ,x_msg_count => x_msg_count
3045 ,x_msg_data => x_msg_data
3046 ,p_line_util_rec => l_line_util_rec
3047 ,p_fu_diff_acctd_amt_rem => l_update_fund_amount
3048 ,p_mode => 'CALCULATE'
3049 );
3050 IF l_return_status = fnd_api.g_ret_sts_error THEN
3051 RAISE FND_API.g_exc_error;
3052 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3053 RAISE FND_API.g_exc_unexpected_error;
3054 END IF;
3055 END IF; -- -- Util > -1, calcualalte line util amount in plan and util currency
3056
3057 END IF;
3058 END IF;
3059
3060
3061 -------------------------- update -------------------------
3062 IF OZF_DEBUG_HIGH_ON THEN
3063 OZF_Utility_PVT.debug_message(l_full_name ||': update lines utilized');
3064 END IF;
3065
3066 UPDATE ozf_claim_lines_util_all SET
3067 object_version_number = l_line_util_rec.object_version_number,
3068 last_update_date = SYSDATE,
3069 last_updated_by = l_line_util_rec.last_updated_by,
3070 last_update_login = l_line_util_rec.last_update_login,
3071 claim_line_id = l_line_util_rec.claim_line_id,
3072 utilization_id = l_line_util_rec.utilization_id,
3073 amount = l_line_util_rec.amount,
3074 currency_code = l_line_util_rec.currency_code,
3075 exchange_rate_type = l_line_util_rec.exchange_rate_type,
3076 exchange_rate_date = l_line_util_rec.exchange_rate_date,
3077 exchange_rate = l_line_util_rec.exchange_rate,
3078 acctd_amount = l_line_util_rec.acctd_amount,
3079 util_curr_amount = l_line_util_rec.util_curr_amount,
3080 plan_curr_amount = l_line_util_rec.plan_curr_amount,
3081 univ_curr_amount = l_line_util_rec.univ_curr_amount,
3082 uom_code = l_line_util_rec.uom_code,
3083 quantity = l_line_util_rec.quantity,
3084 scan_unit = l_line_util_rec.scan_unit,
3085 fxgl_acctd_amount = l_line_util_rec.fxgl_acctd_amount,
3086 utilized_acctd_amount = l_line_util_rec.utilized_acctd_amount
3087 WHERE claim_line_util_id = p_line_util_rec.claim_line_util_id;
3088 --AND object_version_number = p_line_util_rec.object_version_number;
3089
3090 IF (SQL%NOTFOUND) THEN
3091 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
3092 FND_MESSAGE.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
3093 FND_MSG_PUB.add;
3094 END IF;
3095 RAISE FND_API.g_exc_error;
3096 END IF;
3097
3098 -------------------- finish --------------------------
3099 x_object_version := l_line_util_rec.object_version_number;
3100
3101 -- Check for commit
3102 IF FND_API.to_boolean(p_commit) THEN
3103 COMMIT;
3104 END IF;
3105
3106 FND_MSG_PUB.count_and_get(
3107 p_encoded => FND_API.g_false,
3108 p_count => x_msg_count,
3109 p_data => x_msg_data
3110 );
3111
3112 IF OZF_DEBUG_HIGH_ON THEN
3113 OZF_Utility_PVT.debug_message(l_full_name ||': end');
3114 END IF;
3115
3116 EXCEPTION
3117 WHEN FND_API.g_exc_error THEN
3118 ROLLBACK TO Update_Line_Util;
3119 x_return_status := FND_API.g_ret_sts_error;
3120 FND_MSG_PUB.count_and_get(
3121 p_encoded => FND_API.g_false,
3122 p_count => x_msg_count,
3123 p_data => x_msg_data
3124 );
3125
3126 WHEN FND_API.g_exc_unexpected_error THEN
3127 ROLLBACK TO Update_Line_Util;
3128 x_return_status := FND_API.g_ret_sts_unexp_error ;
3129 FND_MSG_PUB.count_and_get(
3130 p_encoded => FND_API.g_false,
3131 p_count => x_msg_count,
3132 p_data => x_msg_data
3133 );
3134
3135 WHEN OTHERS THEN
3136 ROLLBACK TO Update_Line_Util;
3137 x_return_status := FND_API.g_ret_sts_unexp_error ;
3138 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
3139 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
3140 END IF;
3141 FND_MSG_PUB.count_and_get(
3142 p_encoded => FND_API.g_false,
3143 p_count => x_msg_count,
3144 p_data => x_msg_data
3145 );
3146
3147 END Update_Line_Util;
3148
3149
3150 ---------------------------------------------------------------------
3151 -- PROCEDURE
3152 -- Delete_All_Line_Utils
3153 --
3154 -- HISTORY
3155 -- 04-Jul-2005 Sahana Created for Bug4348163
3156 -- 08-Aug-06 azahmed Modified for FXGL ER
3157 ---------------------------------------------------------------------
3158 PROCEDURE Delete_All_Line_Util(
3159 p_api_version IN NUMBER
3160 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
3161 ,p_commit IN VARCHAR2 := FND_API.g_false
3162 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
3163
3164 ,x_return_status OUT NOCOPY VARCHAR2
3165 ,x_msg_count OUT NOCOPY NUMBER
3166 ,x_msg_data OUT NOCOPY VARCHAR2
3167
3168 ,p_funds_util_flt IN funds_util_flt_type
3169 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
3170 )
3171 IS
3172 l_api_version CONSTANT NUMBER := 1.0;
3173 l_api_name CONSTANT VARCHAR2(30) := 'Delete_All_Line_Util';
3174 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3175 l_return_status VARCHAR2(1);
3176
3177 TYPE FundsUtilCsrTyp IS REF CURSOR;
3178 l_funds_util_csr NUMBER; --FundsUtilCsrTyp;
3179 l_funds_util_sql VARCHAR2(3000);
3180 l_line_util_tbl line_util_tbl_type;
3181 l_lu_line_util_id NUMBER;
3182 l_lu_utilization_id NUMBER;
3183 l_lu_amt NUMBER;
3184 l_lu_scan_unit NUMBER;
3185 l_counter PLS_INTEGER := 1;
3186 l_object_version_number NUMBER;
3187 l_ignore NUMBER;
3188 l_utiz_amount NUMBER;
3189 l_lu_currency_code VARCHAR2(15);
3190
3191 CURSOR csr_util_obj_ver(cv_line_util_id IN NUMBER) IS
3192 SELECT object_version_number
3193 FROM ozf_claim_lines_util_all
3194 WHERE claim_line_util_id = cv_line_util_id;
3195
3196 -- fix for bug 5042046
3197 CURSOR csr_function_currency IS
3198 SELECT gs.currency_code
3199 FROM gl_sets_of_books gs
3200 , ozf_sys_parameters org
3201 WHERE org.set_of_books_id = gs.set_of_books_id
3202 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
3203
3204 BEGIN
3205 --------------------- initialize -----------------------
3206 SAVEPOINT Delete_All_Line_Util;
3207
3208 IF OZF_DEBUG_HIGH_ON THEN
3209 OZF_Utility_PVT.debug_message(l_full_name||': start');
3210 END IF;
3211
3212 IF FND_API.to_boolean(p_init_msg_list) THEN
3213 FND_MSG_PUB.initialize;
3214 END IF;
3215
3216 IF NOT FND_API.compatible_api_call(
3217 l_api_version,
3218 p_api_version,
3219 l_api_name,
3220 g_pkg_name
3221 ) THEN
3222 RAISE FND_API.g_exc_unexpected_error;
3223 END IF;
3224
3225 x_return_status := FND_API.g_ret_sts_success;
3226
3227
3228 --------------------- start -----------------------
3229 Get_Utiz_Sql_Stmt(
3230 p_api_version => l_api_version
3231 ,p_init_msg_list => FND_API.g_false
3232 ,p_commit => FND_API.g_false
3233 ,p_validation_level => FND_API.g_valid_level_full
3234 ,x_return_status => l_return_status
3235 ,x_msg_count => x_msg_count
3236 ,x_msg_data => x_msg_data
3237 ,p_summary_view => 'DEL_GRP_LINE_UTIL'
3238 ,p_funds_util_flt => p_funds_util_flt
3239 ,p_cust_account_id => p_funds_util_flt.cust_account_id
3240 ,x_utiz_sql_stmt => l_funds_util_sql
3241 );
3242 IF l_return_status = FND_API.g_ret_sts_error THEN
3243 RAISE FND_API.g_exc_error;
3244 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
3245 RAISE FND_API.g_exc_unexpected_error;
3246 END IF;
3247
3248 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
3249 OPEN csr_function_currency;
3250 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
3251 CLOSE csr_function_currency;
3252
3253
3254 -- use FND_DSQL package for dynamic sql and bind variables
3255 l_funds_util_csr := DBMS_SQL.open_cursor;
3256 FND_DSQL.set_cursor(l_funds_util_csr);
3257 DBMS_SQL.parse(l_funds_util_csr, l_funds_util_sql, DBMS_SQL.native);
3258 DBMS_SQL.define_column(l_funds_util_csr, 1, l_lu_line_util_id);
3259 DBMS_SQL.define_column(l_funds_util_csr, 2, l_lu_utilization_id);
3260 DBMS_SQL.define_column(l_funds_util_csr, 3, l_lu_amt);
3261 DBMS_SQL.define_column(l_funds_util_csr, 4, l_lu_scan_unit);
3262 DBMS_SQL.define_column(l_funds_util_csr, 5, l_lu_currency_code, 15);
3263 -- DBMS_SQL.define_column(l_funds_util_csr, 5, l_utiz_amount);
3264 FND_DSQL.do_binds;
3265
3266 l_ignore := DBMS_SQL.execute(l_funds_util_csr);
3267 LOOP
3268 IF DBMS_SQL.fetch_rows(l_funds_util_csr) > 0 THEN
3269 DBMS_SQL.column_value(l_funds_util_csr, 1, l_lu_line_util_id);
3270 DBMS_SQL.column_value(l_funds_util_csr, 2, l_lu_utilization_id);
3271 DBMS_SQL.column_value(l_funds_util_csr, 3, l_lu_amt);
3272 DBMS_SQL.column_value(l_funds_util_csr, 4, l_lu_scan_unit);
3273 DBMS_SQL.column_value(l_funds_util_csr, 5, l_lu_currency_code);
3274 -- DBMS_SQL.define_column(l_funds_util_csr, 5, l_utiz_amount);
3275
3276 OPEN csr_util_obj_ver(l_lu_line_util_id);
3277 FETCH csr_util_obj_ver INTO l_object_version_number;
3278 CLOSE csr_util_obj_ver;
3279
3280 Delete_Line_Util(
3281 p_api_version => l_api_version
3282 ,p_init_msg_list => FND_API.g_false
3283 ,p_commit => FND_API.g_false
3284 ,x_return_status => l_return_status
3285 ,x_msg_data => x_msg_data
3286 ,x_msg_count => x_msg_count
3287 ,p_line_util_id => l_lu_line_util_id
3288 ,p_object_version => l_object_version_number
3289 ,p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
3290 );
3291 IF l_return_status = fnd_api.g_ret_sts_error THEN
3292 RAISE FND_API.g_exc_error;
3293 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3294 RAISE FND_API.g_exc_unexpected_error;
3295 END IF;
3296 ELSE
3297 EXIT;
3298 END IF;
3299 END LOOP;
3300 DBMS_SQL.close_cursor(l_funds_util_csr);
3301
3302 -- Check for commit
3303 IF FND_API.to_boolean(p_commit) THEN
3304 COMMIT;
3305 END IF;
3306
3307 FND_MSG_PUB.count_and_get(
3308 p_encoded => FND_API.g_false,
3309 p_count => x_msg_count,
3310 p_data => x_msg_data
3311 );
3312
3313 IF OZF_DEBUG_HIGH_ON THEN
3314 OZF_Utility_PVT.debug_message(l_full_name ||': end');
3315 END IF;
3316
3317 EXCEPTION
3318 WHEN FND_API.g_exc_error THEN
3319 ROLLBACK TO Delete_All_Line_Util;
3320 x_return_status := FND_API.g_ret_sts_error;
3321 FND_MSG_PUB.count_and_get (
3322 p_encoded => FND_API.g_false
3323 ,p_count => x_msg_count
3324 ,p_data => x_msg_data
3325 );
3326
3327 WHEN FND_API.g_exc_unexpected_error THEN
3328 ROLLBACK TO Delete_All_Line_Util;
3329 x_return_status := FND_API.g_ret_sts_unexp_error ;
3330 FND_MSG_PUB.count_and_get (
3331 p_encoded => FND_API.g_false
3332 ,p_count => x_msg_count
3333 ,p_data => x_msg_data
3334 );
3335
3336 WHEN OTHERS THEN
3337 ROLLBACK TO Delete_All_Line_Util;
3338 x_return_status := FND_API.g_ret_sts_unexp_error ;
3339 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
3340 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
3341 END IF;
3342 FND_MSG_PUB.count_and_get(
3343 p_encoded => FND_API.g_false
3344 ,p_count => x_msg_count
3345 ,p_data => x_msg_data
3346 );
3347
3348 END Delete_All_Line_Util;
3349
3350 ---------------------------------------------------------------------
3351 -- PROCEDURE
3352 -- Delete_Line_Util_Tbl
3353 --
3354 -- HISTORY
3355 -- 05/12/2001 mchang Create.
3356 ---------------------------------------------------------------------
3357 PROCEDURE Delete_Line_Util_Tbl(
3358 p_api_version IN NUMBER
3359 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
3360 ,p_commit IN VARCHAR2 := FND_API.g_false
3361 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
3362
3363 ,x_return_status OUT NOCOPY VARCHAR2
3364 ,x_msg_data OUT NOCOPY VARCHAR2
3365 ,x_msg_count OUT NOCOPY NUMBER
3366
3367 ,p_line_util_tbl IN line_util_tbl_type
3368 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
3369
3370 ,x_error_index OUT NOCOPY NUMBER
3371 ) IS
3372 l_api_version CONSTANT NUMBER := 1.0;
3373 l_api_name CONSTANT VARCHAR2(30) := 'Delete_Line_Util_Tbl';
3374 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name || '.' || l_api_name;
3375 l_return_status VARCHAR2(1);
3376
3377 i PLS_INTEGER;
3378
3379 l_line_util_id NUMBER;
3380 l_claim_id NUMBER;
3381 l_object_version NUMBER;
3382 l_access VARCHAR2(1) := 'N';
3383 l_final_lu_acctd_amt NUMBER;
3384
3385 -- Cursor to get claim_id
3386 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
3387 SELECT claim_id
3388 FROM ozf_claim_lines
3389 WHERE claim_line_id = cv_claim_line_id;
3390
3391 -- fix for bug 5042046
3392 CURSOR csr_function_currency IS
3393 SELECT gs.currency_code
3394 FROM gl_sets_of_books gs
3395 , ozf_sys_parameters org
3396 WHERE org.set_of_books_id = gs.set_of_books_id
3397 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
3398
3399 CURSOR csr_final_lu_acctd_amt(cv_claim_line_id IN NUMBER) IS
3400 SELECT SUM(acctd_amount)
3401 FROM ozf_claim_lines_util
3402 WHERE claim_line_id = cv_claim_line_id;
3403
3404 BEGIN
3405 --------------------- initialize -----------------------
3406 SAVEPOINT Delete_Line_Util_Tbl;
3407
3408 IF OZF_DEBUG_HIGH_ON THEN
3409 OZF_Utility_PVT.debug_message(l_full_name||': start');
3410 END IF;
3411
3412 IF FND_API.to_boolean(p_init_msg_list) THEN
3413 FND_MSG_PUB.initialize;
3414 END IF;
3415
3416 IF NOT FND_API.compatible_api_call(
3417 l_api_version,
3418 p_api_version,
3419 l_api_name,
3420 g_pkg_name
3421 ) THEN
3422 RAISE FND_API.g_exc_unexpected_error;
3423 END IF;
3424
3425 x_return_status := FND_API.g_ret_sts_success;
3426
3427 ---------------------- check claim access ------------------------
3428 IF p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode AND p_line_util_tbl.count > 0 THEN
3429 FOR j IN p_line_util_tbl.FIRST..p_line_util_tbl.LAST LOOP
3430 IF p_line_util_tbl.EXISTS(j) THEN
3431
3432 OPEN csr_claim_id(p_line_util_tbl(j).claim_line_id);
3433 FETCH csr_claim_id INTO l_claim_id;
3434 CLOSE csr_claim_id;
3435
3436 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
3437 P_Api_Version_Number => 1.0
3438 , P_Init_Msg_List => FND_API.G_FALSE
3439 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
3440 , P_Commit => FND_API.G_FALSE
3441 , P_object_id => l_claim_id
3442 , P_object_type => G_CLAIM_OBJECT_TYPE
3443 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
3444 , X_Return_Status => l_return_status
3445 , X_Msg_Count => x_msg_count
3446 , X_Msg_Data => x_msg_data
3447 , X_access => l_access);
3448
3449 IF l_access = 'N' THEN
3450 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
3451 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
3452 FND_MSG_PUB.add;
3453 END IF;
3454 RAISE FND_API.G_EXC_ERROR;
3455 END IF;
3456 EXIT;
3457 END IF;
3458 END LOOP;
3459 END IF;
3460
3461 --------------------- Delete Claim Line Table -----------------------
3462 i := p_line_util_tbl.FIRST;
3463 IF i IS NOT NULL THEN
3464 OPEN csr_function_currency;
3465 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
3466 CLOSE csr_function_currency;
3467
3468 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
3469
3470 LOOP
3471 l_line_util_id := p_line_util_tbl(i).claim_line_util_id;
3472 l_object_version := p_line_util_tbl(i).object_version_number;
3473 IF l_line_util_id IS NOT NULL THEN
3474 Delete_Line_Util(
3475 p_api_version => 1.0
3476 , p_init_msg_list => FND_API.g_false
3477 , p_commit => FND_API.g_false
3478 , x_return_status => l_return_status
3479 , x_msg_count => x_msg_count
3480 , x_msg_data => x_msg_data
3481 , p_line_util_id => l_line_util_id
3482 , p_object_version => l_object_version
3483 , p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
3484 );
3485 IF l_return_status = fnd_api.g_ret_sts_error THEN
3486 x_error_index := i;
3487 RAISE FND_API.g_exc_error;
3488 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3489 x_error_index := i;
3490 RAISE FND_API.g_exc_unexpected_error;
3491 END IF;
3492 END IF;
3493 EXIT WHEN i = p_line_util_tbl.LAST;
3494 i := p_line_util_tbl.NEXT(i);
3495 END LOOP;
3496
3497 -- update claim line earnings_associated_flag
3498 -- if there is no more earnings associated.
3499 OPEN csr_final_lu_acctd_amt(p_line_util_tbl(1).claim_line_id);
3500 FETCH csr_final_lu_acctd_amt INTO l_final_lu_acctd_amt;
3501 CLOSE csr_final_lu_acctd_amt;
3502
3503 IF l_final_lu_acctd_amt = 0 OR l_final_lu_acctd_amt IS NULL THEN
3504 UPDATE ozf_claim_lines_all
3505 SET earnings_associated_flag = 'F'
3506 WHERE claim_line_id = p_line_util_tbl(1).claim_line_id;
3507 END IF;
3508
3509 END IF;
3510
3511 ------------------------- finish -------------------------------
3512 IF FND_API.to_boolean(p_commit) THEN
3513 COMMIT;
3514 END IF;
3515
3516 FND_MSG_PUB.count_and_get(
3517 p_encoded => FND_API.g_false,
3518 p_count => x_msg_count,
3519 p_data => x_msg_data
3520 );
3521
3522 IF OZF_DEBUG_HIGH_ON THEN
3523 OZF_Utility_PVT.debug_message(l_full_name ||': end');
3524 END IF;
3525
3526 EXCEPTION
3527 WHEN FND_API.g_exc_error THEN
3528 ROLLBACK TO Delete_Line_Util_Tbl;
3529 x_return_status := FND_API.g_ret_sts_error;
3530 FND_MSG_PUB.count_and_get (
3531 p_encoded => FND_API.g_false
3532 ,p_count => x_msg_count
3533 ,p_data => x_msg_data
3534 );
3535
3536 WHEN FND_API.g_exc_unexpected_error THEN
3537 ROLLBACK TO Delete_Line_Util_Tbl;
3538 x_return_status := FND_API.g_ret_sts_unexp_error ;
3539 FND_MSG_PUB.count_and_get (
3540 p_encoded => FND_API.g_false
3541 ,p_count => x_msg_count
3542 ,p_data => x_msg_data
3543 );
3544
3545 WHEN OTHERS THEN
3546 ROLLBACK TO Delete_Line_Util_Tbl;
3547 x_return_status := FND_API.g_ret_sts_unexp_error ;
3548 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
3549 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
3550 END IF;
3551 FND_MSG_PUB.count_and_get(
3552 p_encoded => FND_API.g_false
3553 ,p_count => x_msg_count
3554 ,p_data => x_msg_data
3555 );
3556
3557 END Delete_Line_Util_Tbl;
3558
3559
3560 ---------------------------------------------------------------
3561 -- PROCEDURE
3562 -- Delete_Line_Util
3563 --
3564 -- HISTORY
3565 -- 05/11/2001 mchang Create.
3566 -- 07/22/2002 yizhang add p_mode for security check
3567 -- 08-Aug-06 azahmed Modified for FXGL ER (Amount passed to Update_Funds_Util)
3568 ---------------------------------------------------------------
3569 PROCEDURE Delete_Line_Util(
3570 p_api_version IN NUMBER
3571 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
3572 ,p_commit IN VARCHAR2 := FND_API.g_false
3573
3574 ,x_return_status OUT NOCOPY VARCHAR2
3575 ,x_msg_count OUT NOCOPY NUMBER
3576 ,x_msg_data OUT NOCOPY VARCHAR2
3577
3578 ,p_line_util_id IN NUMBER
3579 ,p_object_version IN NUMBER
3580 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
3581 )
3582 IS
3583 l_api_version CONSTANT NUMBER := 1.0;
3584 l_api_name CONSTANT VARCHAR2(30) := 'Delete_Line_Util';
3585 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
3586 l_return_status VARCHAR2(1);
3587
3588 l_claim_line_id NUMBER;
3589 l_claim_id NUMBER;
3590 l_utilization_id NUMBER;
3591 l_del_line_util_amt NUMBER;
3592 l_del_line_util_scan_unit NUMBER;
3593 l_claim_currency VARCHAR2(15);
3594 l_utiz_currency VARCHAR2(15);
3595 l_utiz_amount NUMBER;
3596
3597 l_access VARCHAR2(1) := 'N';
3598
3599 CURSOR csr_claim_line_details(cv_line_util_id IN NUMBER) IS
3600 SELECT clu.claim_line_id , clu.currency_code
3601 FROM ozf_claim_lines_util clu
3602 WHERE claim_line_util_id = cv_line_util_id;
3603
3604 CURSOR csr_utiz_currency(cv_utilization_id IN NUMBER) IS
3605 SELECT fu.currency_code
3606 FROM ozf_funds_utilized_all_b fu
3607 where fu.utilization_id = cv_utilization_id;
3608
3609 CURSOR csr_claim_id(cv_claim_line_id IN NUMBER) IS
3610 SELECT claim_id
3611 FROM ozf_claim_lines
3612 WHERE claim_line_id = cv_claim_line_id;
3613
3614 CURSOR csr_old_line_util_amt(cv_line_util_id IN NUMBER) IS
3615 SELECT claim_line_id
3616 , utilization_id
3617 , amount
3618 , scan_unit
3619 , util_curr_amount
3620 FROM ozf_claim_lines_util
3621 WHERE claim_line_util_id = cv_line_util_id;
3622
3623 l_line_util_rec line_util_rec_type;
3624
3625 BEGIN
3626 --------------------- initialize -----------------------
3627 SAVEPOINT Delete_Line_Util;
3628
3629 IF OZF_DEBUG_HIGH_ON THEN
3630 OZF_Utility_PVT.debug_message(l_full_name||': start');
3631 END IF;
3632
3633 IF FND_API.to_boolean(p_init_msg_list) THEN
3634 FND_MSG_PUB.initialize;
3635 END IF;
3636
3637 IF NOT FND_API.compatible_api_call(
3638 l_api_version,
3639 p_api_version,
3640 l_api_name,
3641 g_pkg_name
3642 ) THEN
3643 RAISE FND_API.g_exc_unexpected_error;
3644 END IF;
3645
3646 x_return_status := FND_API.G_RET_STS_SUCCESS;
3647
3648 OPEN csr_claim_line_details(p_line_util_id);
3649 FETCH csr_claim_line_details INTO l_claim_line_id , l_claim_currency;
3650 CLOSE csr_claim_line_details;
3651
3652 OPEN csr_claim_id(l_claim_line_id);
3653 FETCH csr_claim_id INTO l_claim_id;
3654 CLOSE csr_claim_id;
3655
3656 ---------------------- check claim access ------------------------
3657 IF p_mode = OZF_CLAIM_UTILITY_PVT.g_manu_mode THEN
3658 OZF_CLAIM_UTILITY_PVT.Check_Claim_access(
3659 P_Api_Version_Number => 1.0
3660 , P_Init_Msg_List => FND_API.G_FALSE
3661 , p_validation_level => FND_API.G_VALID_LEVEL_FULL
3662 , P_Commit => FND_API.G_FALSE
3663 , P_object_id => l_claim_id
3664 , P_object_type => G_CLAIM_OBJECT_TYPE
3665 , P_user_id => OZF_UTILITY_PVT.get_resource_id(NVL(FND_GLOBAL.user_id,-1))
3666 , X_Return_Status => l_return_status
3667 , X_Msg_Count => x_msg_count
3668 , X_Msg_Data => x_msg_data
3669 , X_access => l_access);
3670
3671 IF l_access = 'N' THEN
3672 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
3673 FND_MESSAGE.set_name('OZF','OZF_CLAIM_NO_ACCESS');
3674 FND_MSG_PUB.add;
3675 END IF;
3676 RAISE FND_API.G_EXC_ERROR;
3677 END IF;
3678 END IF;
3679
3680 --------------------- Start -----------------------
3681 OPEN csr_old_line_util_amt(p_line_util_id);
3682 FETCH csr_old_line_util_amt INTO l_claim_line_id
3683 , l_utilization_id
3684 , l_del_line_util_amt
3685 , l_del_line_util_scan_unit
3686 , l_utiz_amount;
3687 CLOSE csr_old_line_util_amt;
3688
3689 ----------------- Update Utilization -----------------
3690 -- skip dummy utils
3691 IF l_utilization_id <> -1 THEN
3692 IF OZF_DEBUG_HIGH_ON THEN
3693 OZF_Utility_PVT.debug_message(l_full_name ||': update funds_utilized');
3694 END IF;
3695
3696 OPEN csr_utiz_currency(l_utilization_id);
3697 FETCH csr_utiz_currency INTO l_utiz_currency;
3698 CLOSE csr_utiz_currency;
3699
3700 l_line_util_rec.utilization_id := l_utilization_id;
3701
3702 -- IF claim currency <> utiz currency then the
3703 -- accrual in fu needs to be reduced by util_curr_amount and not amount
3704 IF l_utiz_currency <> l_claim_currency THEN
3705 l_del_line_util_amt := l_utiz_amount;
3706 END IF;
3707 IF OZF_DEBUG_LOW_ON THEN
3708 OZF_Utility_PVT.debug_message('l_del_line_util_amt' || l_del_line_util_amt);
3709 OZF_Utility_PVT.debug_message('l_utiz_currency' || l_del_line_util_amt);
3710 OZF_Utility_PVT.debug_message('l_claim_currency' || l_del_line_util_amt);
3711 OZF_Utility_PVT.debug_message('l_claim_currency' || l_del_line_util_amt);
3712 END IF;
3713
3714 Update_Fund_Utils(
3715 x_return_status => l_return_status
3716 ,x_msg_count => x_msg_count
3717 ,x_msg_data => x_msg_data
3718 ,p_line_util_rec => l_line_util_rec
3719 ,p_fu_diff_acctd_amt_rem => l_del_line_util_amt
3720 ,p_mode => 'NONE'
3721 );
3722 IF l_return_status = fnd_api.g_ret_sts_error THEN
3723 RAISE FND_API.g_exc_error;
3724 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
3725 RAISE FND_API.g_exc_unexpected_error;
3726 END IF;
3727
3728 END IF; -- IF l_utilization_rec.utilization_id <> -1
3729
3730 ------------------------ delete ------------------------
3731 IF OZF_DEBUG_HIGH_ON THEN
3732 OZF_Utility_PVT.debug_message(l_full_name ||': delete');
3733 END IF;
3734
3735 DELETE FROM ozf_claim_lines_util_all
3736 WHERE claim_line_util_id = p_line_util_id
3737 AND object_version_number = p_object_version;
3738
3739 IF (SQL%NOTFOUND) THEN
3740 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
3741 FND_MESSAGE.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
3742 FND_MSG_PUB.add;
3743 END IF;
3744 RAISE FND_API.g_exc_error;
3745 END IF;
3746
3747 -------------------- finish --------------------------
3748 IF FND_API.to_boolean(p_commit) THEN
3749 COMMIT;
3750 END IF;
3751
3752 FND_MSG_PUB.count_and_get(
3753 p_encoded => FND_API.g_false,
3754 p_count => x_msg_count,
3755 p_data => x_msg_data
3756 );
3757
3758 IF OZF_DEBUG_HIGH_ON THEN
3759 OZF_Utility_PVT.debug_message(l_full_name ||': end');
3760 END IF;
3761
3762 EXCEPTION
3763 WHEN FND_API.g_exc_error THEN
3764 ROLLBACK TO Delete_Line_Util;
3765 x_return_status := FND_API.g_ret_sts_error;
3766 FND_MSG_PUB.count_and_get(
3767 p_encoded => FND_API.g_false,
3768 p_count => x_msg_count,
3769 p_data => x_msg_data
3770 );
3771
3772 WHEN FND_API.g_exc_unexpected_error THEN
3773 ROLLBACK TO Delete_Line_Util;
3774 x_return_status := FND_API.g_ret_sts_unexp_error ;
3775 FND_MSG_PUB.count_and_get(
3776 p_encoded => FND_API.g_false,
3777 p_count => x_msg_count,
3778 p_data => x_msg_data
3779 );
3780
3781 WHEN OTHERS THEN
3782 ROLLBACK TO Delete_Line_Util;
3783 x_return_status := FND_API.g_ret_sts_unexp_error ;
3784 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
3785 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
3786 END IF;
3787 FND_MSG_PUB.count_and_get(
3788 p_encoded => FND_API.g_false,
3789 p_count => x_msg_count,
3790 p_data => x_msg_data
3791 );
3792
3793 END Delete_Line_Util;
3794
3795
3796 ---------------------------------------------------------------------
3797 -- PROCEDURE
3798 -- Init_Line_Util_Rec
3799 --
3800 -- HISTORY
3801 -- 05/10/2001 mchang Create.
3802 ---------------------------------------------------------------------
3803 PROCEDURE Init_Line_Util_Rec(
3804 x_line_util_rec OUT NOCOPY line_util_rec_type
3805 )
3806 IS
3807 BEGIN
3808
3809 RETURN;
3810 END Init_Line_Util_Rec;
3811
3812
3813 ---------------------------------------------------------------------
3814 -- PROCEDURE
3815 -- Complete_Line_Util_Rec
3816 --
3817 -- HISTORY
3818 -- 05/10/2001 mchang Create.
3819 ---------------------------------------------------------------------
3820 PROCEDURE Complete_Line_Util_Rec(
3821 p_line_util_rec IN line_util_rec_type
3822 ,x_complete_rec OUT NOCOPY line_util_rec_type
3823 )
3824 IS
3825 CURSOR csr_line_util(cv_line_util_id IN NUMBER) IS
3826 SELECT object_version_number,
3827 claim_line_id,
3828 utilization_id,
3829 amount,
3830 currency_code,
3831 exchange_rate_type,
3832 exchange_rate_date,
3833 exchange_rate,
3834 acctd_amount,
3835 scan_unit,
3836 activity_product_id,
3837 uom_code,
3838 quantity,
3839 org_id,
3840 fxgl_acctd_amount,
3841 utilized_acctd_amount
3842 FROM ozf_claim_lines_util
3843 WHERE claim_line_util_id = cv_line_util_id;
3844
3845 l_line_util_rec csr_line_util%ROWTYPE;
3846
3847 BEGIN
3848 x_complete_rec := p_line_util_rec;
3849
3850 OPEN csr_line_util(p_line_util_rec.claim_line_util_id);
3851 FETCH csr_line_util INTO l_line_util_rec;
3852 IF csr_line_util%NOTFOUND THEN
3853 CLOSE csr_line_util;
3854 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
3855 FND_MESSAGE.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
3856 FND_MSG_PUB.add;
3857 END IF;
3858 RAISE FND_API.g_exc_error;
3859 END IF;
3860 CLOSE csr_line_util;
3861
3862 IF p_line_util_rec.object_version_number = FND_API.G_MISS_NUM THEN
3863 x_complete_rec.object_version_number := NULL;
3864 END IF;
3865 IF p_line_util_rec.object_version_number IS NULL THEN
3866 x_complete_rec.object_version_number := l_line_util_rec.object_version_number;
3867 END IF;
3868
3869 IF p_line_util_rec.claim_line_id = FND_API.G_MISS_NUM THEN
3870 x_complete_rec.claim_line_id := NULL;
3871 END IF;
3872 IF p_line_util_rec.claim_line_id IS NULL THEN
3873 x_complete_rec.claim_line_id := l_line_util_rec.claim_line_id;
3874 END IF;
3875
3876 IF p_line_util_rec.utilization_id = FND_API.G_MISS_NUM THEN
3877 x_complete_rec.utilization_id := NULL;
3878 END IF;
3879 IF p_line_util_rec.utilization_id IS NULL THEN
3880 x_complete_rec.utilization_id := l_line_util_rec.utilization_id;
3881 END IF;
3882
3883 IF p_line_util_rec.amount = FND_API.G_MISS_NUM THEN
3884 x_complete_rec.amount := NULL;
3885 END IF;
3886 IF p_line_util_rec.amount IS NULL THEN
3887 x_complete_rec.amount := l_line_util_rec.amount;
3888 END IF;
3889
3890 IF p_line_util_rec.currency_code = FND_API.G_MISS_CHAR THEN
3891 x_complete_rec.currency_code := NULL;
3892 END IF;
3893 IF p_line_util_rec.currency_code IS NULL THEN
3894 x_complete_rec.currency_code := l_line_util_rec.currency_code;
3895 END IF;
3896
3897 IF p_line_util_rec.exchange_rate_type = FND_API.G_MISS_CHAR THEN
3898 x_complete_rec.exchange_rate_type := NULL;
3899 END IF;
3900 IF p_line_util_rec.exchange_rate_type IS NULL THEN
3901 x_complete_rec.exchange_rate_type := l_line_util_rec.exchange_rate_type;
3902 END IF;
3903
3904 IF p_line_util_rec.exchange_rate_date = FND_API.G_MISS_DATE THEN
3905 x_complete_rec.exchange_rate_date := NULL;
3906 END IF;
3907 IF p_line_util_rec.exchange_rate_date IS NULL THEN
3908 x_complete_rec.exchange_rate_date := l_line_util_rec.exchange_rate_date;
3909 END IF;
3910
3911 IF p_line_util_rec.exchange_rate = FND_API.G_MISS_NUM THEN
3912 x_complete_rec.exchange_rate := NULL;
3913 END IF;
3914 IF p_line_util_rec.exchange_rate IS NULL THEN
3915 x_complete_rec.exchange_rate := l_line_util_rec.exchange_rate;
3916 END IF;
3917
3918 IF p_line_util_rec.acctd_amount = FND_API.G_MISS_NUM THEN
3919 x_complete_rec.acctd_amount := NULL;
3920 END IF;
3921 IF p_line_util_rec.acctd_amount IS NULL THEN
3922 x_complete_rec.acctd_amount := l_line_util_rec.acctd_amount;
3923 END IF;
3924
3925 IF p_line_util_rec.scan_unit = FND_API.G_MISS_NUM THEN
3926 x_complete_rec.scan_unit := NULL;
3927 END IF;
3928 IF p_line_util_rec.scan_unit IS NULL THEN
3929 x_complete_rec.scan_unit := l_line_util_rec.scan_unit;
3930 END IF;
3931
3932 IF p_line_util_rec.activity_product_id = FND_API.G_MISS_NUM THEN
3933 x_complete_rec.activity_product_id := NULL;
3934 END IF;
3935 IF p_line_util_rec.activity_product_id IS NULL THEN
3936 x_complete_rec.activity_product_id := l_line_util_rec.activity_product_id;
3937 END IF;
3938
3939 IF p_line_util_rec.uom_code = FND_API.G_MISS_CHAR THEN
3940 x_complete_rec.uom_code := NULL;
3941 END IF;
3942 IF p_line_util_rec.uom_code IS NULL THEN
3943 x_complete_rec.uom_code := l_line_util_rec.uom_code;
3944 END IF;
3945
3946 IF p_line_util_rec.quantity = FND_API.G_MISS_NUM THEN
3947 x_complete_rec.quantity := NULL;
3948 END IF;
3949 IF p_line_util_rec.quantity IS NULL THEN
3950 x_complete_rec.quantity := l_line_util_rec.quantity;
3951 END IF;
3952
3953 IF p_line_util_rec.org_id = FND_API.G_MISS_NUM THEN
3954 x_complete_rec.org_id := NULL;
3955 END IF;
3956 IF p_line_util_rec.org_id IS NULL THEN
3957 x_complete_rec.org_id := l_line_util_rec.org_id;
3958 END IF;
3959
3960 IF p_line_util_rec.fxgl_acctd_amount = FND_API.G_MISS_NUM THEN
3961 x_complete_rec.fxgl_acctd_amount := NULL;
3962 END IF;
3963 IF p_line_util_rec.fxgl_acctd_amount IS NULL THEN
3964 x_complete_rec.fxgl_acctd_amount := l_line_util_rec.fxgl_acctd_amount;
3965 END IF;
3966
3967
3968 IF p_line_util_rec.utilized_acctd_amount = FND_API.G_MISS_NUM THEN
3969 x_complete_rec.utilized_acctd_amount := NULL;
3970 END IF;
3971 IF p_line_util_rec.utilized_acctd_amount IS NULL THEN
3972 x_complete_rec.utilized_acctd_amount := l_line_util_rec.utilized_acctd_amount;
3973 END IF;
3974
3975 END Complete_Line_Util_Rec;
3976
3977 ---------------------------------------------------------------------
3978 -- PROCEDURE
3979 -- Check_Offer_Performance
3980 --
3981 -- PARAMETERS
3982 -- p_cust_account_id : customer account id
3983 -- p_offer_id : offer id
3984 --
3985 -- HISTORY
3986 ---------------------------------------------------------------------
3987 PROCEDURE Check_Offer_Performance(
3988 p_cust_account_id IN NUMBER
3989 ,p_offer_id IN NUMBER
3990 ,p_resale_flag IN VARCHAR2
3991 ,p_check_all_flag IN VARCHAR2
3992
3993 ,x_performance_flag OUT NOCOPY VARCHAR2
3994 ,x_offer_perf_tbl OUT NOCOPY offer_performance_tbl_type
3995 )
3996 IS
3997 l_offer_performance_id NUMBER;
3998 l_product_attr_context VARCHAR2(30);
3999 l_product_attribute VARCHAR2(30);
4000 l_product_attr_value VARCHAR2(240);
4001 l_start_date DATE;
4002 l_end_date DATE;
4003 l_requirement_type VARCHAR2(30);
4004 l_requirement_value NUMBER;
4005 l_uom_code VARCHAR2(30);
4006 l_common_quantity NUMBER;
4007 l_common_amount NUMBER;
4008 l_common_uom_code VARCHAR2(3);
4009 l_common_curr_code VARCHAR2(15);
4010 l_comm_curr_req_amt NUMBER;
4011 l_offer_currency VARCHAR2(15);
4012 l_return_status VARCHAR2(1);
4013 l_temp_sql VARCHAR2(2000);
4014 l_emp_csr NUMBER;
4015 l_ignore NUMBER;
4016 l_counter PLS_INTEGER := 0;
4017 l_performance_flag VARCHAR2(1);
4018 l_offer_perf_tbl offer_performance_tbl_type;
4019
4020 CURSOR csr_offer_perfs(cv_offer_id IN NUMBER) IS
4021 SELECT offer_performance_id
4022 , product_attribute_context
4023 , product_attribute
4024 , product_attr_value
4025 , start_date
4026 , end_date
4027 , requirement_type
4028 , estimated_value
4029 , uom_code
4030 FROM ozf_offer_performances
4031 WHERE required_flag = 'Y'
4032 AND product_attribute_context = 'ITEM'
4033 AND requirement_type IN ('AMOUNT', 'VOLUME')
4034 AND list_header_id = cv_offer_id;
4035
4036 -- fix for bug 5042046
4037 CURSOR csr_function_currency IS
4038 SELECT gs.currency_code
4039 FROM gl_sets_of_books gs
4040 , ozf_sys_parameters org
4041 WHERE org.set_of_books_id = gs.set_of_books_id
4042 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
4043
4044 BEGIN
4045 x_performance_flag := FND_API.g_true;
4046
4047 OPEN csr_offer_perfs(p_offer_id);
4048 LOOP
4049 FETCH csr_offer_perfs INTO l_offer_performance_id
4050 , l_product_attr_context
4051 , l_product_attribute
4052 , l_product_attr_value
4053 , l_start_date
4054 , l_end_date
4055 , l_requirement_type
4056 , l_requirement_value
4057 , l_uom_code;
4058 EXIT WHEN csr_offer_perfs%NOTFOUND;
4059
4060 l_performance_flag := 'T';
4061
4062 IF p_resale_flag IS NULL OR p_resale_flag = 'F' THEN
4063 FND_DSQL.init;
4064 FND_DSQL.add_text('SELECT NVL(sum(common_quantity), 0), NVL(sum(common_amount), 0), ');
4065 FND_DSQL.add_text(' common_uom_code, common_currency_code ');
4066 FND_DSQL.add_text(' FROM ozf_sales_transactions ');
4067 FND_DSQL.add_text(' WHERE sold_to_cust_account_id = ');
4068 FND_DSQL.add_bind(p_cust_account_id);
4069 FND_DSQL.add_text(' AND transaction_date between ');
4070 FND_DSQL.add_bind(l_start_date);
4071 FND_DSQL.add_text(' and ');
4072 FND_DSQL.add_bind(l_end_date);
4073 FND_DSQL.add_text(' AND inventory_item_id IN (SELECT s.product_id FROM ( ');
4074 l_temp_sql := OZF_OFFR_ELIG_PROD_DENORM_PVT.get_sql(
4075 p_context => l_product_attr_context,
4076 p_attribute => l_product_attribute,
4077 p_attr_value_from => l_product_attr_value,
4078 p_attr_value_to => NULL,
4079 p_comparison => NULL,
4080 p_type => 'PROD'
4081 );
4082 FND_DSQL.add_text(') s) ');
4083 FND_DSQL.add_text(' GROUP BY common_uom_code, common_currency_code ');
4084
4085 IF OZF_DEBUG_HIGH_ON THEN
4086 l_temp_sql := FND_DSQL.get_text(TRUE);
4087 OZF_Utility_PVT.debug_message('----- Check_Offer_Performance SQL -----');
4088 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 1, 254));
4089 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 255, 254));
4090 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 509, 254));
4091 OZF_Utility_PVT.debug_message('---------------------------------------');
4092 END IF;
4093
4094 l_emp_csr := DBMS_SQL.open_cursor;
4095 FND_DSQL.set_cursor(l_emp_csr);
4096 DBMS_SQL.parse(l_emp_csr, FND_DSQL.get_text(FALSE), DBMS_SQL.native);
4097 DBMS_SQL.define_column(l_emp_csr, 1, l_common_quantity);
4098 DBMS_SQL.define_column(l_emp_csr, 2, l_common_amount);
4099 DBMS_SQL.define_column(l_emp_csr, 3, l_common_uom_code, 3);
4100 DBMS_SQL.define_column(l_emp_csr, 4, l_common_curr_code, 15);
4101 FND_DSQL.do_binds;
4102
4103 l_ignore := DBMS_SQL.execute(l_emp_csr);
4104 IF DBMS_SQL.fetch_rows(l_emp_csr) > 0 THEN
4105 DBMS_SQL.column_value(l_emp_csr, 1, l_common_quantity);
4106 DBMS_SQL.column_value(l_emp_csr, 2, l_common_amount);
4107 DBMS_SQL.column_value(l_emp_csr, 3, l_common_uom_code);
4108 DBMS_SQL.column_value(l_emp_csr, 4, l_common_curr_code);
4109
4110 IF l_requirement_type = 'VOLUME' THEN
4111 IF l_uom_code = l_common_uom_code THEN
4112 IF l_common_quantity < l_requirement_value THEN
4113 l_performance_flag := FND_API.g_false;
4114 END IF;
4115 ELSE
4116 l_requirement_value := inv_convert.inv_um_convert(
4117 item_id => NULL
4118 ,precision => 2
4119 ,from_quantity => l_requirement_value
4120 ,from_unit => l_uom_code
4121 ,to_unit => l_common_uom_code
4122 ,from_name => NULL
4123 ,to_name => NULL
4124 );
4125 IF l_requirement_value = -99999 THEN
4126 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4127 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_CONVERT_UOM');
4128 FND_MSG_PUB.add;
4129 END IF;
4130 RAISE FND_API.g_exc_error;
4131 END IF;
4132
4133 IF l_common_quantity < l_requirement_value THEN
4134 l_performance_flag := FND_API.g_false;
4135 END IF;
4136 END IF;
4137 ELSIF l_requirement_type = 'AMOUNT' THEN
4138 l_offer_currency := OZF_ACTBUDGETS_PVT.Get_Object_Currency(
4139 p_object => 'OFFR'
4140 ,p_object_id => p_offer_id
4141 ,x_return_status => l_return_status
4142 );
4143 IF l_return_status = FND_API.g_ret_sts_error THEN
4144 RAISE FND_API.g_exc_error;
4145 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4146 RAISE FND_API.g_exc_unexpected_error;
4147 END IF;
4148
4149 IF l_offer_currency = l_common_curr_code THEN
4150 IF l_common_amount < l_requirement_value THEN
4151 l_performance_flag := FND_API.g_false;
4152 END IF;
4153 ELSE
4154 OZF_UTILITY_PVT.Convert_Currency(
4155 p_from_currency => l_offer_currency
4156 ,p_to_currency => l_common_curr_code
4157 ,p_conv_date => SYSDATE
4158 ,p_from_amount => l_requirement_value
4159 ,x_return_status => l_return_status
4160 ,x_to_amount => l_comm_curr_req_amt
4161 );
4162 IF l_return_status = FND_API.g_ret_sts_error THEN
4163 RAISE FND_API.g_exc_error;
4164 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4165 RAISE FND_API.g_exc_unexpected_error;
4166 END IF;
4167
4168 IF l_common_amount < l_comm_curr_req_amt THEN
4169 l_performance_flag := FND_API.g_false;
4170 END IF;
4171 END IF;
4172 END IF;
4173 ELSE
4174 -- no rows returned
4175 IF OZF_DEBUG_HIGH_ON THEN
4176 OZF_Utility_PVT.debug_message('No sales transactions found');
4177 END IF;
4178 l_performance_flag := FND_API.g_false;
4179 END IF;
4180 DBMS_SQL.close_cursor(l_emp_csr);
4181
4182 ELSE
4183 /********** Check resale data ***********/
4184 FND_DSQL.init;
4185 FND_DSQL.add_text('SELECT NVL(sum(quantity), 0), NVL(sum(quantity*acctd_selling_price), 0), ');
4186 FND_DSQL.add_text(' uom_code ');
4187 FND_DSQL.add_text(' FROM ozf_resale_lines ');
4188 FND_DSQL.add_text(' WHERE sold_from_cust_account_id = ');
4189 FND_DSQL.add_bind(p_cust_account_id);
4190 FND_DSQL.add_text(' AND date_ordered between ');
4191 FND_DSQL.add_bind(l_start_date);
4192 FND_DSQL.add_text(' and ');
4193 FND_DSQL.add_bind(l_end_date);
4194 FND_DSQL.add_text(' AND inventory_item_id IN (SELECT s.product_id FROM ( ');
4195 l_temp_sql := OZF_OFFR_ELIG_PROD_DENORM_PVT.get_sql(
4196 p_context => l_product_attr_context,
4197 p_attribute => l_product_attribute,
4198 p_attr_value_from => l_product_attr_value,
4199 p_attr_value_to => NULL,
4200 p_comparison => NULL,
4201 p_type => 'PROD'
4202 );
4203 FND_DSQL.add_text(') s) ');
4204 FND_DSQL.add_text(' GROUP BY uom_code ');
4205
4206 IF OZF_DEBUG_HIGH_ON THEN
4207 l_temp_sql := FND_DSQL.get_text(TRUE);
4208 OZF_Utility_PVT.debug_message('----- Check_Offer_Performance SQL -----');
4209 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 1, 254));
4210 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 255, 254));
4211 OZF_Utility_PVT.debug_message(SUBSTR(l_temp_sql, 509, 254));
4212 OZF_Utility_PVT.debug_message('---------------------------------------');
4213 END IF;
4214
4215 l_emp_csr := DBMS_SQL.open_cursor;
4216 FND_DSQL.set_cursor(l_emp_csr);
4217 DBMS_SQL.parse(l_emp_csr, FND_DSQL.get_text(FALSE), DBMS_SQL.native);
4218 DBMS_SQL.define_column(l_emp_csr, 1, l_common_quantity);
4219 DBMS_SQL.define_column(l_emp_csr, 2, l_common_amount);
4220 DBMS_SQL.define_column(l_emp_csr, 3, l_common_uom_code, 3);
4221 FND_DSQL.do_binds;
4222
4223 l_ignore := DBMS_SQL.execute(l_emp_csr);
4224 IF DBMS_SQL.fetch_rows(l_emp_csr) > 0 THEN
4225 DBMS_SQL.column_value(l_emp_csr, 1, l_common_quantity);
4226 DBMS_SQL.column_value(l_emp_csr, 2, l_common_amount);
4227 DBMS_SQL.column_value(l_emp_csr, 3, l_common_uom_code);
4228
4229 IF l_requirement_type = 'VOLUME' THEN
4230 IF l_uom_code = l_common_uom_code THEN
4231 IF l_common_quantity < l_requirement_value THEN
4232 l_performance_flag := FND_API.g_false;
4233 END IF;
4234 ELSE
4235 l_requirement_value := inv_convert.inv_um_convert(
4236 item_id => NULL
4237 ,precision => 2
4238 ,from_quantity => l_requirement_value
4239 ,from_unit => l_uom_code
4240 ,to_unit => l_common_uom_code
4241 ,from_name => NULL
4242 ,to_name => NULL
4243 );
4244 IF l_requirement_value = -99999 THEN
4245 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
4246 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_CONVERT_UOM');
4247 FND_MSG_PUB.add;
4248 END IF;
4249 RAISE FND_API.g_exc_error;
4250 END IF;
4251
4252 IF l_common_quantity < l_requirement_value THEN
4253 l_performance_flag := FND_API.g_false;
4254 END IF;
4255 END IF;
4256 ELSIF l_requirement_type = 'AMOUNT' THEN
4257 l_offer_currency := OZF_ACTBUDGETS_PVT.Get_Object_Currency(
4258 p_object => 'OFFR'
4259 ,p_object_id => p_offer_id
4260 ,x_return_status => l_return_status
4261 );
4262 IF l_return_status = FND_API.g_ret_sts_error THEN
4263 RAISE FND_API.g_exc_error;
4264 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4265 RAISE FND_API.g_exc_unexpected_error;
4266 END IF;
4267
4268 OPEN csr_function_currency;
4269 FETCH csr_function_currency INTO l_common_curr_code;
4270 CLOSE csr_function_currency;
4271
4272 IF l_offer_currency = l_common_curr_code THEN
4273 IF l_common_amount < l_requirement_value THEN
4274 l_performance_flag := FND_API.g_false;
4275 END IF;
4276 ELSE
4277 OZF_UTILITY_PVT.Convert_Currency(
4278 p_from_currency => l_offer_currency
4279 ,p_to_currency => l_common_curr_code
4280 ,p_conv_date => SYSDATE
4281 ,p_from_amount => l_requirement_value
4282 ,x_return_status => l_return_status
4283 ,x_to_amount => l_comm_curr_req_amt
4284 );
4285 IF l_return_status = FND_API.g_ret_sts_error THEN
4286 RAISE FND_API.g_exc_error;
4287 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4288 RAISE FND_API.g_exc_unexpected_error;
4289 END IF;
4290
4291 IF l_common_amount < l_comm_curr_req_amt THEN
4292 l_performance_flag := FND_API.g_false;
4293 END IF;
4294 END IF;
4295 END IF;
4296 ELSE
4297 -- no rows returned
4298 IF OZF_DEBUG_HIGH_ON THEN
4299 OZF_Utility_PVT.debug_message('No sales transactions found');
4300 END IF;
4301 l_performance_flag := FND_API.g_false;
4302 END IF;
4303 DBMS_SQL.close_cursor(l_emp_csr);
4304
4305 END IF;
4306
4307 IF l_performance_flag = 'F' THEN
4308 x_performance_flag := FND_API.g_false;
4309
4310 l_counter := l_counter + 1;
4311 l_offer_perf_tbl(l_counter).offer_id := p_offer_id;
4312 l_offer_perf_tbl(l_counter).offer_performance_id := l_offer_performance_id;
4313 l_offer_perf_tbl(l_counter).product_attribute := l_product_attribute;
4314 l_offer_perf_tbl(l_counter).product_attr_value := l_product_attr_value;
4315 l_offer_perf_tbl(l_counter).start_date := l_start_date;
4316 l_offer_perf_tbl(l_counter).end_date := l_end_date;
4317 l_offer_perf_tbl(l_counter).requirement_type := l_requirement_type;
4318 l_offer_perf_tbl(l_counter).estimated_value := l_requirement_value;
4319 l_offer_perf_tbl(l_counter).uom_code := l_uom_code;
4320
4321 IF p_check_all_flag = 'F' THEN
4322 EXIT;
4323 END IF;
4324 END IF;
4325
4326 END LOOP;
4327 CLOSE csr_offer_perfs;
4328 x_offer_perf_tbl := l_offer_perf_tbl;
4329
4330 END Check_Offer_Performance;
4331
4332 ---------------------------------------------------------------------
4333 -- PROCEDURE
4334 -- Settle_Claim
4335 --
4336 -- PURPOSE
4337 -- Close a claim
4338 --
4339 -- PARAMETERS
4340 -- p_claim_id: claim id
4341 --
4342 -- NOTES
4343 ---------------------------------------------------------------------
4344 PROCEDURE Settle_Claim(
4345 p_claim_id IN NUMBER
4346 ,x_return_status OUT NOCOPY VARCHAR2
4347 ,x_msg_count OUT NOCOPY NUMBER
4348 ,x_msg_data OUT NOCOPY VARCHAR2
4349 )
4350 IS
4351 l_api_version CONSTANT NUMBER := 1.0;
4352 l_api_name CONSTANT VARCHAR2(30) := 'Settle_Claim';
4353 l_return_status VARCHAR2(1);
4354
4355 l_claim_id NUMBER := p_claim_id;
4356 l_claim_rec OZF_CLAIM_PVT.claim_rec_type;
4357 l_object_version_number NUMBER;
4358 l_sales_rep_id NUMBER;
4359 l_salesrep_req_flag VARCHAR2(1);
4360
4361 CURSOR csr_claim_info(cv_claim_id in number) IS
4362 select object_version_number, sales_rep_id
4363 from ozf_claims_all
4364 where claim_id = cv_claim_id;
4365
4366 CURSOR csr_ar_system_options IS
4367 SELECT salesrep_required_flag
4368 FROM ar_system_parameters;
4369
4370 BEGIN
4371 --------------------- initialize -----------------------
4372 SAVEPOINT Settle_Claim;
4373
4374 x_return_status := FND_API.g_ret_sts_success;
4375
4376 ----------------- start ----------------
4377 OPEN csr_claim_info(l_claim_id);
4378 FETCH csr_claim_info into l_object_version_number, l_sales_rep_id;
4379 CLOSE csr_claim_info;
4380
4381 l_claim_rec.claim_id := l_claim_id;
4382 l_claim_rec.object_version_number := l_object_version_number;
4383 l_claim_rec.USER_STATUS_ID := to_number( ozf_utility_pvt.GET_DEFAULT_USER_STATUS(
4384 P_STATUS_TYPE=> 'OZF_CLAIM_STATUS',
4385 P_STATUS_CODE=> 'CLOSED'
4386 ));
4387
4388 ------------------------------------------------------
4389 -- Sales Credit
4390 -- Bug 2950241 fixing: default Sales Rep in Claims
4391 -- if "Requires Salesperson" in AR system options.
4392 ------------------------------------------------------
4393 IF l_sales_rep_id IS NULL THEN
4394 OPEN csr_ar_system_options;
4395 FETCH csr_ar_system_options INTO l_salesrep_req_flag;
4396 CLOSE csr_ar_system_options;
4397
4398 IF l_salesrep_req_flag = 'Y' THEN
4399 l_claim_rec.sales_rep_id := -3; -- No Sales Credit
4400 END IF;
4401 END IF;
4402
4403 OZF_claim_PVT.Update_claim(
4404 P_Api_Version => l_api_version,
4405 P_Init_Msg_List => FND_API.g_false,
4406 P_Commit => FND_API.g_false,
4407 P_Validation_Level => FND_API.g_valid_level_full,
4408 X_Return_Status => l_return_status,
4409 X_Msg_Count => x_msg_count,
4410 X_Msg_Data => x_msg_data,
4411 P_claim => l_claim_Rec,
4412 p_event => 'UPDATE',
4413 p_mode => OZF_claim_Utility_pvt.G_AUTO_MODE,
4414 X_Object_Version_Number => l_object_version_number
4415 );
4416 IF l_return_status = FND_API.g_ret_sts_error THEN
4417 RAISE FND_API.g_exc_error;
4418 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4419 RAISE FND_API.g_exc_unexpected_error;
4420 END IF;
4421
4422 EXCEPTION
4423 WHEN FND_API.g_exc_error THEN
4424 ROLLBACK TO Settle_Claim;
4425 x_return_status := FND_API.g_ret_sts_error;
4426 WHEN FND_API.g_exc_unexpected_error THEN
4427 ROLLBACK TO Settle_Claim;
4428 x_return_status := FND_API.g_ret_sts_unexp_error ;
4429 WHEN OTHERS THEN
4430 ROLLBACK TO Settle_Claim;
4431 x_return_status := FND_API.g_ret_sts_unexp_error ;
4432 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
4433 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
4434 END IF;
4435 END Settle_Claim;
4436
4437
4438 ---------------------------------------------------------------------
4439 -- PROCEDURE
4440 -- Create_Claim_For_Accruals
4441 --
4442 -- PURPOSE
4443 -- Create a claim and associate earnings based on search filters.
4444 --
4445 -- PARAMETERS
4446 -- p_claim_rec: claim record
4447 -- p_funds_util_flt: search filter for earnings
4448 --
4449 -- NOTES
4450 ---------------------------------------------------------------------
4451 PROCEDURE Create_Claim_For_Accruals(
4452 p_api_version IN NUMBER
4453 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
4454 ,p_commit IN VARCHAR2 := FND_API.g_false
4455 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
4456
4457 ,x_return_status OUT NOCOPY VARCHAR2
4458 ,x_msg_count OUT NOCOPY NUMBER
4459 ,x_msg_data OUT NOCOPY VARCHAR2
4460
4461 ,p_claim_rec IN ozf_claim_pvt.claim_rec_type
4462 ,p_funds_util_flt IN ozf_claim_accrual_pvt.funds_util_flt_type
4463
4464 ,x_claim_id OUT NOCOPY NUMBER
4465 ) IS
4466 l_api_version CONSTANT NUMBER := 1.0;
4467 l_api_name CONSTANT VARCHAR2(30) := 'Create_Claim_For_Accruals';
4468 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4469 l_return_status VARCHAR2(1);
4470
4471 l_funds_util_flt ozf_claim_accrual_pvt.funds_util_flt_type;
4472 l_line_tbl OZF_CLAIM_LINE_PVT.claim_line_tbl_type;
4473 l_claim_rec OZF_CLAIM_PVT.claim_rec_type := p_claim_rec;
4474 l_claim_id NUMBER;
4475 l_cust_account_id NUMBER;
4476 l_plan_type VARCHAR2(30);
4477 l_plan_id NUMBER;
4478 l_product_level_type VARCHAR2(30);
4479 l_product_id NUMBER;
4480 l_amount NUMBER;
4481 l_total_acctd_amount_rem NUMBER;
4482 l_performance_flag VARCHAR2(1) := FND_API.g_true;
4483
4484 l_emp_csr NUMBER;
4485 l_stmt VARCHAR2(3000);
4486 l_ignore NUMBER;
4487 l_counter PLS_INTEGER := 1;
4488 l_error_index NUMBER;
4489 l_ignore_text VARCHAR2(240);
4490 l_dummy NUMBER;
4491 l_offer_perf_tbl offer_performance_tbl_type;
4492 l_currency_code VARCHAR2(15);
4493 l_amount_ut_curr NUMBER; -- amount in utilization currency (source budget currency)
4494 l_bill_to_site_id NUMBER;
4495
4496
4497 CURSOR csr_claim_line(cv_claim_id IN NUMBER) IS
4498 SELECT claim_line_id
4499 , activity_type
4500 , activity_id
4501 , item_type
4502 , item_id
4503 , acctd_amount
4504 -- , claim_currency_amount
4505 FROM ozf_claim_lines
4506 WHERE claim_id = cv_claim_id;
4507
4508 CURSOR csr_uom_code(cv_item_id IN NUMBER) IS
4509 SELECT primary_uom_code
4510 FROM mtl_system_items
4511 WHERE inventory_item_id = cv_item_id
4512 AND organization_id = FND_PROFILE.VALUE('AMS_ITEM_ORGANIZATION_ID');
4513
4514 CURSOR csr_offer_perf(cv_list_header_id IN NUMBER) IS
4515 SELECT 1
4516 FROM ozf_offer_performances
4517 WHERE list_header_id = cv_list_header_id;
4518
4519 --Added for bug 7030415
4520 CURSOR c_get_conversion_type IS
4521 SELECT exchange_rate_type
4522 FROM ozf_sys_parameters_all
4523 WHERE org_id = MO_GLOBAL.GET_CURRENT_ORG_ID;
4524
4525 l_exchange_rate_type VARCHAR2(30) := FND_API.G_MISS_CHAR;
4526 l_rate NUMBER;
4527
4528 BEGIN
4529 --------------------- initialize -----------------------
4530 SAVEPOINT Create_Claim_For_Accruals;
4531
4532 IF OZF_DEBUG_HIGH_ON THEN
4533 OZF_Utility_PVT.debug_message(l_full_name||': start');
4534 END IF;
4535
4536 IF FND_API.to_boolean(p_init_msg_list) THEN
4537 FND_MSG_PUB.initialize;
4538 END IF;
4539
4540 IF NOT FND_API.compatible_api_call(
4541 l_api_version,
4542 p_api_version,
4543 l_api_name,
4544 g_pkg_name
4545 )
4546 THEN
4547 RAISE FND_API.g_exc_unexpected_error;
4548 END IF;
4549
4550 x_return_status := FND_API.g_ret_sts_success;
4551
4552 -------------------- start -------------------
4553 l_funds_util_flt := p_funds_util_flt;
4554 l_total_acctd_amount_rem := 0;
4555
4556 Get_Utiz_Sql_Stmt(
4557 p_api_version => 1.0
4558 ,p_init_msg_list => FND_API.g_false
4559 ,p_commit => FND_API.g_false
4560 ,p_validation_level => FND_API.g_valid_level_full
4561 ,x_return_status => l_return_status
4562 ,x_msg_count => x_msg_count
4563 ,x_msg_data => x_msg_data
4564 ,p_summary_view => 'AUTOPAY_LINE'
4565 ,p_funds_util_flt => l_funds_util_flt
4566 ,p_cust_account_id => l_funds_util_flt.cust_account_id
4567 ,x_utiz_sql_stmt => l_stmt
4568 );
4569
4570 IF l_return_status = FND_API.g_ret_sts_error THEN
4571 RAISE FND_API.g_exc_error;
4572 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4573 RAISE FND_API.g_exc_error;
4574 END IF;
4575
4576 l_emp_csr := DBMS_SQL.open_cursor;
4577 FND_DSQL.set_cursor(l_emp_csr);
4578 DBMS_SQL.parse(l_emp_csr, l_stmt, DBMS_SQL.native);
4579 DBMS_SQL.define_column(l_emp_csr, 1, l_cust_account_id);
4580 DBMS_SQL.define_column(l_emp_csr, 2, l_plan_type, 30);
4581 DBMS_SQL.define_column(l_emp_csr, 3, l_plan_id);
4582 DBMS_SQL.define_column(l_emp_csr, 4, l_bill_to_site_id); --R12.1 enhancements
4583 DBMS_SQL.define_column(l_emp_csr, 5, l_product_level_type, 30);
4584 DBMS_SQL.define_column(l_emp_csr, 6, l_product_id);
4585 DBMS_SQL.define_column(l_emp_csr, 7, l_amount);
4586 DBMS_SQL.define_column(l_emp_csr, 8, l_currency_code, 15);
4587 FND_DSQL.do_binds;
4588
4589 l_ignore := DBMS_SQL.execute(l_emp_csr);
4590 LOOP
4591 IF DBMS_SQL.fetch_rows(l_emp_csr) > 0 THEN
4592 DBMS_SQL.column_value(l_emp_csr, 1, l_cust_account_id);
4593 DBMS_SQL.column_value(l_emp_csr, 2, l_plan_type);
4594 DBMS_SQL.column_value(l_emp_csr, 3, l_plan_id);
4595 DBMS_SQL.column_value(l_emp_csr, 4, l_bill_to_site_id); --R12.1 enhancements
4596 DBMS_SQL.column_value(l_emp_csr, 5, l_product_level_type);
4597 DBMS_SQL.column_value(l_emp_csr, 6, l_product_id);
4598 DBMS_SQL.column_value(l_emp_csr, 7, l_amount);
4599 DBMS_SQL.column_value(l_emp_csr, 8, l_currency_code);
4600
4601 IF l_currency_code <> l_claim_rec.currency_code THEN
4602 l_amount_ut_curr := l_amount;
4603
4604 --Added for bug 7030415, get exchange_rate type
4605 OPEN c_get_conversion_type;
4606 FETCH c_get_conversion_type INTO l_exchange_rate_type;
4607 CLOSE c_get_conversion_type;
4608 --end
4609
4610 OZF_UTILITY_PVT.Convert_Currency(
4611 p_from_currency => l_currency_code
4612 ,p_to_currency => l_claim_rec.currency_code
4613 ,p_conv_type => l_exchange_rate_type
4614 ,p_conv_date => SYSDATE
4615 ,p_from_amount => l_amount_ut_curr -- amount in utilization currency (func currency)
4616 ,x_return_status => l_return_status
4617 ,x_to_amount => l_amount -- amount in claim currency
4618 ,x_rate => l_rate
4619 );
4620 IF l_return_status = FND_API.g_ret_sts_error THEN
4621 RAISE FND_API.g_exc_error;
4622 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4623 RAISE FND_API.g_exc_unexpected_error;
4624 END IF;
4625 END IF;
4626
4627 IF l_amount IS NOT NULL AND l_amount <> 0 THEN
4628 IF OZF_DEBUG_HIGH_ON THEN
4629 OZF_Utility_PVT.debug_message('---------------------------------');
4630 OZF_Utility_PVT.debug_message('Line ' || l_counter || ': Amount='||l_amount);
4631 OZF_Utility_PVT.debug_message('Plan Type : ' || l_plan_type);
4632 OZF_Utility_PVT.debug_message('Plan Id : ' || l_plan_id);
4633 OZF_Utility_PVT.debug_message('Product Level Type: ' || l_product_level_type);
4634 OZF_Utility_PVT.debug_message('Product Id : ' || l_product_id);
4635 END IF;
4636 IF p_claim_rec.created_from = 'AUTOPAY' THEN
4637 FND_FILE.PUT_LINE(FND_FILE.LOG, '---------------------------------');
4638 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Line ' || l_counter || ': Amount='||l_amount);
4639 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Plan Type : ' || l_plan_type);
4640 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Plan Id : ' || l_plan_id);
4641 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Product Level Type: ' || l_product_level_type);
4642 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Product Id : ' || l_product_id);
4643 END IF;
4644
4645 IF l_plan_type = 'OFFR' THEN
4646 Check_Offer_Performance(
4647 p_cust_account_id => l_cust_account_id
4648 ,p_offer_id => l_plan_id
4649 ,p_resale_flag => 'F'
4650 ,p_check_all_flag => 'F'
4651 ,x_performance_flag => l_performance_flag
4652 ,x_offer_perf_tbl => l_offer_perf_tbl
4653 );
4654 END IF;
4655
4656 --R12.1 enhancements. Added condition so that earnings accrued only against
4657 --the respective bill_to_site_id should be added.
4658
4659 IF l_performance_flag = FND_API.g_true THEN
4660 IF l_bill_to_site_id IS NOT NULL
4661 AND l_bill_to_site_id = l_funds_util_flt.bill_to_site_use_id THEN --nirma
4662
4663 -- assume single currency for now; add multi-curr later
4664 l_line_tbl(l_counter).claim_currency_amount := l_amount;
4665 l_line_tbl(l_counter).activity_type := l_plan_type;
4666 l_line_tbl(l_counter).activity_id := l_plan_id;
4667 l_line_tbl(l_counter).item_type := l_product_level_type;
4668 l_line_tbl(l_counter).item_id := l_product_id;
4669 l_line_tbl(l_counter).relationship_type := l_funds_util_flt.relationship_type;
4670 l_line_tbl(l_counter).related_cust_account_id := l_funds_util_flt.related_cust_account_id;
4671 l_line_tbl(l_counter).buy_group_party_id := l_funds_util_flt.buy_group_party_id;
4672 l_line_tbl(l_counter).select_cust_children_flag := l_funds_util_flt.select_cust_children_flag;
4673 IF l_product_level_type = 'PRODUCT' AND l_product_id IS NOT NULL THEN
4674 OPEN csr_uom_code(l_line_tbl(l_counter).item_id);
4675 FETCH csr_uom_code INTO l_line_tbl(l_counter).quantity_uom;
4676 IF csr_uom_code%NOTFOUND THEN
4677 CLOSE csr_uom_code;
4678 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4679 FND_MESSAGE.Set_Name('OZF', 'OZF_PRODUCT_UOM_MISSING');
4680 FND_MESSAGE.Set_Token('ITEM_ID', l_line_tbl(l_counter).item_id);
4681 FND_MSG_PUB.ADD;
4682 END IF;
4683 RAISE FND_API.g_exc_unexpected_error;
4684 END IF;
4685 CLOSE csr_uom_code;
4686 END IF;
4687
4688 l_total_acctd_amount_rem := l_total_acctd_amount_rem + l_amount;
4689
4690 IF l_plan_type = 'OFFR' AND l_plan_id IS NOT NULL THEN
4691 OPEN csr_offer_perf(l_plan_id);
4692 FETCH csr_offer_perf INTO l_dummy;
4693 CLOSE csr_offer_perf;
4694
4695 IF l_dummy = 1 THEN
4696 l_line_tbl(l_counter).performance_attached_flag := FND_API.G_TRUE;
4697 l_line_tbl(l_counter).performance_complete_flag := FND_API.G_TRUE;
4698 END IF;
4699 END IF;
4700
4701 l_counter := l_counter + 1;
4702
4703 ELSIF l_bill_to_site_id IS NULL
4704 AND l_funds_util_flt.bill_to_site_use_id IS NULL THEN
4705 l_line_tbl(l_counter).claim_currency_amount := l_amount;
4706 l_line_tbl(l_counter).activity_type := l_plan_type;
4707 l_line_tbl(l_counter).activity_id := l_plan_id;
4708 l_line_tbl(l_counter).item_type := l_product_level_type;
4709 l_line_tbl(l_counter).item_id := l_product_id;
4710 l_line_tbl(l_counter).relationship_type := l_funds_util_flt.relationship_type;
4711 l_line_tbl(l_counter).related_cust_account_id := l_funds_util_flt.related_cust_account_id;
4712 l_line_tbl(l_counter).buy_group_party_id := l_funds_util_flt.buy_group_party_id;
4713 l_line_tbl(l_counter).select_cust_children_flag := l_funds_util_flt.select_cust_children_flag;
4714 IF l_product_level_type = 'PRODUCT' AND l_product_id IS NOT NULL THEN
4715 OPEN csr_uom_code(l_line_tbl(l_counter).item_id);
4716 FETCH csr_uom_code INTO l_line_tbl(l_counter).quantity_uom;
4717 IF csr_uom_code%NOTFOUND THEN
4718 CLOSE csr_uom_code;
4719 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4720 FND_MESSAGE.Set_Name('OZF', 'OZF_PRODUCT_UOM_MISSING');
4721 FND_MESSAGE.Set_Token('ITEM_ID', l_line_tbl(l_counter).item_id);
4722 FND_MSG_PUB.ADD;
4723 END IF;
4724 RAISE FND_API.g_exc_unexpected_error;
4725 END IF;
4726 CLOSE csr_uom_code;
4727 END IF;
4728
4729 FND_FILE.PUT_LINE(FND_FILE.LOG, 'NP l_total_acctd_amount_rem : ' || l_total_acctd_amount_rem);
4730 FND_FILE.PUT_LINE(FND_FILE.LOG, 'NP l_amount : ' || l_amount);
4731
4732
4733 l_total_acctd_amount_rem := l_total_acctd_amount_rem + l_amount;
4734
4735 IF l_plan_type = 'OFFR' AND l_plan_id IS NOT NULL THEN
4736 OPEN csr_offer_perf(l_plan_id);
4737 FETCH csr_offer_perf INTO l_dummy;
4738 CLOSE csr_offer_perf;
4739
4740 IF l_dummy = 1 THEN
4741 l_line_tbl(l_counter).performance_attached_flag := FND_API.G_TRUE;
4742 l_line_tbl(l_counter).performance_complete_flag := FND_API.G_TRUE;
4743 END IF;
4744 END IF;
4745
4746 l_counter := l_counter + 1;
4747 END IF;--nirma
4748 ELSE
4749 IF OZF_DEBUG_HIGH_ON THEN
4750 OZF_Utility_PVT.debug_message('Performance requirements not met.');
4751 END IF;
4752 IF p_claim_rec.created_from = 'AUTOPAY' THEN
4753 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Performance requirements not met.');
4754 END IF;
4755 END IF;
4756 END IF;
4757 ELSE
4758 EXIT;
4759 END IF;
4760 END LOOP;
4761 DBMS_SQL.close_cursor(l_emp_csr);
4762
4763 IF l_total_acctd_amount_rem > 0 THEN
4764 l_claim_rec.amount := l_total_acctd_amount_rem;
4765
4766 -- create claim in OPEN status, ignoring the status passed in
4767 l_claim_rec.status_code := 'OPEN';
4768 l_claim_rec.user_status_id := to_number(ozf_utility_pvt.get_default_user_status(
4769 p_status_type => 'OZF_CLAIM_STATUS',
4770 p_status_code => l_claim_rec.status_code));
4771
4772 OZF_CLAIM_PVT.Create_Claim(
4773 p_api_version => l_api_version
4774 ,x_return_status => l_return_status
4775 ,x_msg_data => x_msg_data
4776 ,x_msg_count => x_msg_count
4777 ,p_claim => l_claim_rec
4778 ,x_claim_id => l_claim_id
4779 );
4780 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4781 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4782 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4783 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4784 END IF;
4785
4786 IF OZF_DEBUG_HIGH_ON THEN
4787 OZF_Utility_PVT.debug_message('Claim created id: ' || l_claim_id);
4788 END IF;
4789
4790 FOR i IN l_line_tbl.FIRST..l_line_tbl.LAST LOOP
4791 IF l_line_tbl.exists(i) IS NOT NULL THEN
4792 l_line_tbl(i).claim_id := l_claim_id;
4793 END IF;
4794 END LOOP;
4795
4796 OZF_CLAIM_LINE_PVT.Create_Claim_Line_Tbl(
4797 p_api_version => 1.0
4798 ,p_init_msg_list => FND_API.g_false
4799 ,p_commit => FND_API.g_false
4800 ,p_validation_level => FND_API.g_valid_level_full
4801 ,x_return_status => l_return_status
4802 ,x_msg_count => x_msg_count
4803 ,x_msg_data => x_msg_data
4804 ,p_claim_line_tbl => l_line_tbl
4805 ,x_error_index => l_error_index
4806 );
4807 IF l_return_status = FND_API.g_ret_sts_error THEN
4808 RAISE FND_API.g_exc_error;
4809 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4810 RAISE FND_API.g_exc_error;
4811 END IF;
4812
4813 IF OZF_DEBUG_HIGH_ON THEN
4814 OZF_Utility_PVT.debug_message('Claim lines created for claim_id=' || l_claim_id);
4815 END IF;
4816
4817 OPEN csr_claim_line(l_claim_id);
4818 LOOP
4819 FETCH csr_claim_line INTO l_funds_util_flt.claim_line_id
4820 , l_funds_util_flt.activity_type
4821 , l_funds_util_flt.activity_id
4822 , l_funds_util_flt.product_level_type
4823 , l_funds_util_flt.product_id
4824 , l_funds_util_flt.total_amount;
4825 EXIT WHEN csr_claim_line%NOTFOUND;
4826
4827 Update_Group_Line_Util(
4828 p_api_version => 1.0
4829 ,p_init_msg_list => FND_API.g_false
4830 ,p_commit => FND_API.g_false
4831 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
4832 ,x_return_status => l_return_status
4833 ,x_msg_count => x_msg_count
4834 ,x_msg_data => x_msg_data
4835 ,p_summary_view => 'ACTIVITY'
4836 ,p_funds_util_flt => l_funds_util_flt
4837 );
4838 IF l_return_status = FND_API.g_ret_sts_error THEN
4839 RAISE FND_API.g_exc_error;
4840 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
4841 RAISE FND_API.g_exc_error;
4842 END IF;
4843 END LOOP;
4844 CLOSE csr_claim_line;
4845 ELSIF l_claim_rec.created_from = 'PROMO_CLAIM' and l_claim_rec.amount <> 0 THEN
4846 IF OZF_DEBUG_HIGH_ON THEN
4847 OZF_Utility_PVT.debug_message('Created Form: ' || l_claim_rec.created_from);
4848 OZF_Utility_PVT.debug_message('Amount: ' || l_claim_rec.amount);
4849 END IF;
4850
4851 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4852 FND_MESSAGE.Set_Name('OZF', 'OZF_ACCRUAL_SCAN_DATA_ERROR');
4853 FND_MSG_PUB.ADD;
4854 END IF;
4855
4856 RAISE FND_API.g_exc_unexpected_error;
4857 ELSE
4858 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
4859 FND_MESSAGE.Set_Name('OZF', 'OZF_ACCRUAL_REM_AMOUNT_LT_ZERO');
4860 FND_MSG_PUB.ADD;
4861 END IF;
4862 RAISE FND_API.g_exc_unexpected_error;
4863 END IF;
4864
4865 x_claim_id := l_claim_id;
4866
4867 ------------------------- finish -------------------------------
4868 -- Check for commit
4869 IF FND_API.to_boolean(p_commit) THEN
4870 COMMIT;
4871 END IF;
4872
4873 FND_MSG_PUB.count_and_get(
4874 p_encoded => FND_API.g_false,
4875 p_count => x_msg_count,
4876 p_data => x_msg_data
4877 );
4878
4879 IF OZF_DEBUG_HIGH_ON THEN
4880 OZF_Utility_PVT.debug_message(l_full_name ||': end');
4881 END IF;
4882
4883 EXCEPTION
4884 WHEN FND_API.g_exc_error THEN
4885 ROLLBACK TO Create_Claim_For_Accruals;
4886 x_return_status := FND_API.g_ret_sts_error;
4887 FND_MSG_PUB.count_and_get (
4888 p_encoded => FND_API.g_false
4889 ,p_count => x_msg_count
4890 ,p_data => x_msg_data
4891 );
4892
4893 WHEN FND_API.g_exc_unexpected_error THEN
4894 ROLLBACK TO Create_Claim_For_Accruals;
4895 x_return_status := FND_API.g_ret_sts_unexp_error ;
4896 FND_MSG_PUB.count_and_get (
4897 p_encoded => FND_API.g_false
4898 ,p_count => x_msg_count
4899 ,p_data => x_msg_data
4900 );
4901
4902 WHEN OTHERS THEN
4903 ROLLBACK TO Create_Claim_For_Accruals;
4904 x_return_status := FND_API.g_ret_sts_unexp_error ;
4905 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
4906 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
4907 END IF;
4908 FND_MSG_PUB.count_and_get(
4909 p_encoded => FND_API.g_false
4910 ,p_count => x_msg_count
4911 ,p_data => x_msg_data
4912 );
4913
4914 END Create_Claim_For_Accruals;
4915
4916
4917 ---------------------------------------------------------------------
4918 -- PROCEDURE
4919 -- Pay_Claim_For_Accruals
4920 --
4921 -- PURPOSE
4922 -- Create a claim, associate earnings based on search filters, and
4923 -- close the claim
4924 --
4925 -- PARAMETERS
4926 -- p_claim_rec: claim record
4927 -- p_funds_util_flt: search filter for earnings
4928 --
4929 -- NOTES
4930 ---------------------------------------------------------------------
4931 PROCEDURE Pay_Claim_For_Accruals(
4932 p_api_version IN NUMBER
4933 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
4934 ,p_commit IN VARCHAR2 := FND_API.g_false
4935 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
4936
4937 ,x_return_status OUT NOCOPY VARCHAR2
4938 ,x_msg_count OUT NOCOPY NUMBER
4939 ,x_msg_data OUT NOCOPY VARCHAR2
4940
4941 ,p_claim_rec IN ozf_claim_pvt.claim_rec_type
4942 ,p_funds_util_flt IN ozf_claim_accrual_pvt.funds_util_flt_type
4943
4944 ,x_claim_id OUT NOCOPY NUMBER
4945 )
4946 IS
4947 l_api_version CONSTANT NUMBER := 1.0;
4948 l_api_name CONSTANT VARCHAR2(30) := 'Pay_Claim_For_Accruals';
4949 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
4950 l_return_status VARCHAR2(1);
4951
4952 l_funds_util_flt funds_util_flt_type;
4953 l_claim_rec OZF_CLAIM_PVT.claim_rec_type;
4954 l_claim_id NUMBER;
4955 l_cust_trade_profile g_cust_trade_profile_csr%rowtype;
4956 l_party_name VARCHAR2(360);
4957 l_close_claim_flag VARCHAR2(1);
4958
4959 CURSOR csr_party_name(cv_cust_account_id IN NUMBER) IS
4960 SELECT p.party_name
4961 FROM hz_parties p, hz_cust_accounts c
4962 WHERE p.party_id = c.party_id
4963 AND c.cust_account_id = cv_cust_account_id;
4964
4965 BEGIN
4966 --------------------- initialize -----------------------
4967 SAVEPOINT Pay_Claim_For_Accruals;
4968
4969 IF OZF_DEBUG_HIGH_ON THEN
4970 OZF_Utility_PVT.debug_message(l_full_name||': start');
4971 END IF;
4972
4973 IF FND_API.to_boolean(p_init_msg_list) THEN
4974 FND_MSG_PUB.initialize;
4975 END IF;
4976
4977 IF NOT FND_API.compatible_api_call(
4978 l_api_version,
4979 p_api_version,
4980 l_api_name,
4981 g_pkg_name
4982 ) THEN
4983 RAISE FND_API.g_exc_unexpected_error;
4984 END IF;
4985
4986 x_return_status := FND_API.g_ret_sts_success;
4987
4988 ----------------- start ----------------
4989 l_claim_rec := p_claim_rec;
4990
4991 l_close_claim_flag := 'T';
4992
4993 IF l_claim_rec.payment_method IS NULL THEN
4994 -- get payment method information from trade profile
4995 Get_Cust_Trade_Profile(
4996 p_cust_account_id => p_claim_rec.cust_account_id
4997 ,x_cust_trade_profile => l_cust_trade_profile
4998 ,p_site_use_id => p_claim_rec.cust_billto_acct_site_id
4999 );
5000
5001 IF l_cust_trade_profile.trade_profile_id IS NOT NULL THEN
5002 Validate_Cust_Trade_Profile(
5003 p_cust_trade_profile => l_cust_trade_profile
5004 ,x_return_status => l_return_status
5005 );
5006 IF l_return_status = FND_API.g_ret_sts_error or
5007 l_return_status = FND_API.g_ret_sts_unexp_error THEN
5008 -- trade profile has errors. do not close claim in batch process
5009 -- and raise error in other cases
5010 IF l_claim_rec.source_object_class = OZF_RESALE_COMMON_PVT.G_BATCH_OBJECT_CLASS THEN
5011 l_close_claim_flag := 'F';
5012 ELSE
5013 RAISE FND_API.g_exc_unexpected_error;
5014 END IF;
5015 END IF;
5016
5017 -- [BEGIN OF BUG 4217781 FIXING]
5018 IF l_claim_rec.source_object_class = OZF_RESALE_COMMON_PVT.G_BATCH_OBJECT_CLASS AND
5019 l_cust_trade_profile.autopay_flag <> 'T' THEN
5020 l_close_claim_flag := 'F';
5021 END IF;
5022 -- [END OF BUG 4217781 FIXING]
5023
5024 IF l_cust_trade_profile.payment_method <> FND_API.G_MISS_CHAR THEN -- [BUG 4217781 FIXING]
5025 l_claim_rec.payment_method := l_cust_trade_profile.payment_method;
5026 END IF;
5027 l_claim_rec.cust_billto_acct_site_id := l_cust_trade_profile.site_use_id;
5028 l_claim_rec.vendor_id := l_cust_trade_profile.vendor_id;
5029 l_claim_rec.vendor_site_id := l_cust_trade_profile.vendor_site_id;
5030 ELSE
5031 -- trade profile does not exists. do not close claim in batch process
5032 -- and raise error in other cases
5033 IF l_claim_rec.source_object_class = OZF_RESALE_COMMON_PVT.G_BATCH_OBJECT_CLASS THEN
5034 l_close_claim_flag := 'F';
5035 ELSE
5036 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5037 OPEN csr_party_name(p_claim_rec.cust_account_id);
5038 FETCH csr_party_name INTO l_party_name;
5039 CLOSE csr_party_name;
5040
5041 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_NO_TRADE_PROFILE');
5042 FND_MESSAGE.Set_Token('CUST_NAME', l_party_name);
5043 FND_MSG_PUB.ADD;
5044 END IF;
5045 RAISE FND_API.g_exc_unexpected_error;
5046 END IF;
5047 END IF;
5048 END IF;
5049
5050 IF OZF_DEBUG_HIGH_ON THEN
5051 OZF_Utility_PVT.debug_message('Payment method is '||l_claim_rec.payment_method);
5052 OZF_Utility_PVT.debug_message('Autopay Flag is '||l_cust_trade_profile.autopay_flag);
5053 OZF_Utility_PVT.debug_message('Close Claim Flag is '||l_close_claim_flag);
5054 END IF;
5055
5056 Create_Claim_For_Accruals(
5057 p_api_version => l_api_version
5058 ,p_init_msg_list => FND_API.g_false
5059 ,p_commit => FND_API.g_false
5060 ,p_validation_level => p_validation_level
5061 ,x_return_status => l_return_status
5062 ,x_msg_count => x_msg_count
5063 ,x_msg_data => x_msg_data
5064 ,p_claim_rec => l_claim_rec
5065 ,p_funds_util_flt => p_funds_util_flt
5066 ,x_claim_id => l_claim_id
5067 );
5068
5069 IF l_return_status = fnd_api.g_ret_sts_error THEN
5070 RAISE FND_API.g_exc_error;
5071 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5072 RAISE FND_API.g_exc_unexpected_error;
5073 END IF;
5074
5075 IF l_close_claim_flag = 'T' THEN
5076 Settle_Claim(
5077 p_claim_id => l_claim_id
5078 ,x_return_status => l_return_status
5079 ,x_msg_count => x_msg_count
5080 ,x_msg_data => x_msg_data
5081 );
5082 IF l_return_status = fnd_api.g_ret_sts_error THEN
5083 RAISE FND_API.g_exc_error;
5084 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5085 RAISE FND_API.g_exc_unexpected_error;
5086 END IF;
5087 END IF;
5088
5089 x_claim_id := l_claim_id;
5090
5091 ------------------------- finish -------------------------------
5092 -- Check for commit
5093 IF FND_API.to_boolean(p_commit) THEN
5094 COMMIT;
5095 END IF;
5096
5097 FND_MSG_PUB.count_and_get(
5098 p_encoded => FND_API.g_false,
5099 p_count => x_msg_count,
5100 p_data => x_msg_data
5101 );
5102
5103 IF OZF_DEBUG_HIGH_ON THEN
5104 OZF_Utility_PVT.debug_message(l_full_name ||': end');
5105 END IF;
5106
5107 EXCEPTION
5108 WHEN FND_API.g_exc_error THEN
5109 ROLLBACK TO Pay_Claim_For_Accruals;
5110 x_return_status := FND_API.g_ret_sts_error;
5111 FND_MSG_PUB.count_and_get (
5112 p_encoded => FND_API.g_false
5113 ,p_count => x_msg_count
5114 ,p_data => x_msg_data
5115 );
5116
5117 WHEN FND_API.g_exc_unexpected_error THEN
5118 ROLLBACK TO Pay_Claim_For_Accruals;
5119 x_return_status := FND_API.g_ret_sts_unexp_error ;
5120 FND_MSG_PUB.count_and_get (
5121 p_encoded => FND_API.g_false
5122 ,p_count => x_msg_count
5123 ,p_data => x_msg_data
5124 );
5125
5126 WHEN OTHERS THEN
5127 ROLLBACK TO Pay_Claim_For_Accruals;
5128 x_return_status := FND_API.g_ret_sts_unexp_error ;
5129 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
5130 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5131 END IF;
5132 FND_MSG_PUB.count_and_get(
5133 p_encoded => FND_API.g_false
5134 ,p_count => x_msg_count
5135 ,p_data => x_msg_data
5136 );
5137
5138 END Pay_Claim_For_Accruals;
5139
5140
5141 ---------------------------------------------------------------------
5142 -- PROCEDURE
5143 -- Asso_Accruals_To_Claim
5144 --
5145 -- PURPOSE
5146 -- Associate earnings to the given claim based on given filters.
5147 --
5148 -- PARAMETERS
5149 -- p_claim_id:
5150 -- p_funds_util_flt:
5151 --
5152 -- NOTES
5153 ---------------------------------------------------------------------
5154 PROCEDURE Asso_Accruals_To_Claim(
5155 p_api_version IN NUMBER
5156 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
5157 ,p_commit IN VARCHAR2 := FND_API.g_false
5158 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
5159
5160 ,x_return_status OUT NOCOPY VARCHAR2
5161 ,x_msg_count OUT NOCOPY NUMBER
5162 ,x_msg_data OUT NOCOPY VARCHAR2
5163
5164 ,p_claim_id IN NUMBER
5165 ,p_funds_util_flt IN funds_util_flt_type
5166 )
5167 IS
5168 l_api_version CONSTANT NUMBER := 1.0;
5169 l_api_name CONSTANT VARCHAR2(30) := 'Asso_Accruals_To_Claim';
5170 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5171 l_return_status VARCHAR2(1);
5172
5173 -- Added For Bug 7509079
5174 l_funds_util_flt funds_util_flt_type := p_funds_util_flt;
5175
5176 l_line_tbl OZF_CLAIM_LINE_PVT.claim_line_tbl_type;
5177 l_cust_account_id NUMBER;
5178 l_plan_type VARCHAR2(30);
5179 l_plan_id NUMBER;
5180 l_product_level_type VARCHAR2(30);
5181 l_product_id NUMBER;
5182 l_total_amount NUMBER;
5183 l_amount NUMBER;
5184
5185 l_emp_csr NUMBER;
5186 l_error_index NUMBER;
5187 l_counter PLS_INTEGER := 1;
5188 l_ignore NUMBER;
5189 l_dummy VARCHAR2(1);
5190 l_stmt VARCHAR2(3000);
5191 l_currency_code VARCHAR2(15);
5192 --Added For Bug 7605745
5193 l_bill_to_site_id NUMBER;
5194
5195 -- Fix for Bug 7632911
5196 l_claim_class VARCHAR2(15);
5197
5198 -- Added For Bug 7611966
5199 CURSOR csr_claim_line(cv_claim_id IN NUMBER) IS
5200 SELECT claim_line_id
5201 FROM ozf_claim_lines
5202 WHERE claim_id = cv_claim_id;
5203
5204 CURSOR csr_uom_code(cv_item_id IN NUMBER) IS
5205 SELECT primary_uom_code
5206 FROM mtl_system_items
5207 WHERE inventory_item_id = cv_item_id
5208 AND organization_id = FND_PROFILE.VALUE('AMS_ITEM_ORGANIZATION_ID');
5209
5210 -- Fix for Bug 7632911
5211 CURSOR csr_claim_info(cv_claim_id IN NUMBER) IS
5212 SELECT cust_account_id, amount,claim_class
5213 FROM ozf_claims
5214 WHERE claim_id = cv_claim_id;
5215
5216 --Fix For Bug 7611966
5217 CURSOR csr_claim_line_util(cv_claim_line_id IN NUMBER, cv_claim_id NUMBER) IS
5218 SELECT claim_line_id
5219 , activity_type
5220 , activity_id
5221 , item_id
5222 , claim_currency_amount
5223 FROM ozf_claim_lines
5224 WHERE claim_line_id = cv_claim_line_id
5225 AND claim_id = cv_claim_id;
5226
5227 BEGIN
5228 --------------------- initialize -----------------------
5229 SAVEPOINT Asso_Accruals_To_Claim;
5230
5231 IF OZF_DEBUG_HIGH_ON THEN
5232 OZF_Utility_PVT.debug_message(l_full_name||': start');
5233 END IF;
5234
5235 IF FND_API.to_boolean(p_init_msg_list) THEN
5236 FND_MSG_PUB.initialize;
5237 END IF;
5238
5239 IF NOT FND_API.compatible_api_call(
5240 l_api_version,
5241 p_api_version,
5242 l_api_name,
5243 g_pkg_name
5244 ) THEN
5245 RAISE FND_API.g_exc_unexpected_error;
5246 END IF;
5247
5248 x_return_status := FND_API.g_ret_sts_success;
5249
5250 ----------------- start ----------------
5251 -- verify the claim exists
5252 OPEN csr_claim_info(p_claim_id);
5253 FETCH csr_claim_info INTO l_cust_account_id, l_total_amount,l_claim_class;
5254 IF csr_claim_info%NOTFOUND THEN
5255 CLOSE csr_claim_info;
5256 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5257 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_ID_NOT_EXIST');
5258 FND_MESSAGE.Set_Token('CLAIM_ID', p_claim_id);
5259 FND_MSG_PUB.ADD;
5260 END IF;
5261 RAISE FND_API.g_exc_unexpected_error;
5262 END IF;
5263 CLOSE csr_claim_info;
5264
5265 -- default cust_account_id if not given in parameters
5266 IF l_funds_util_flt.cust_account_id IS NULL THEN
5267 l_funds_util_flt.cust_account_id := l_cust_account_id;
5268 END IF;
5269
5270 -- Fix for Bug 7632911
5271 IF l_funds_util_flt.total_amount IS NULL OR
5272 SIGN(l_funds_util_flt.total_amount) > SIGN(l_total_amount)
5273 THEN
5274 l_funds_util_flt.total_amount := l_total_amount;
5275 ELSE
5276 l_total_amount := l_funds_util_flt.total_amount;
5277 END IF;
5278
5279 Get_Utiz_Sql_Stmt(
5280 p_api_version => 1.0
5281 ,p_init_msg_list => FND_API.g_false
5282 ,p_commit => FND_API.g_false
5283 ,p_validation_level => FND_API.g_valid_level_full
5284 ,x_return_status => l_return_status
5285 ,x_msg_count => x_msg_count
5286 ,x_msg_data => x_msg_data
5287 ,p_summary_view => 'AUTOPAY_LINE'
5288 ,p_funds_util_flt => l_funds_util_flt
5289 ,p_cust_account_id => l_funds_util_flt.cust_account_id
5290 ,x_utiz_sql_stmt => l_stmt
5291 );
5292
5293 IF l_return_status = FND_API.g_ret_sts_error THEN
5294 RAISE FND_API.g_exc_error;
5295 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5296 RAISE FND_API.g_exc_error;
5297 END IF;
5298
5299 l_emp_csr := DBMS_SQL.open_cursor;
5300 FND_DSQL.set_cursor(l_emp_csr);
5301 DBMS_SQL.parse(l_emp_csr, l_stmt, DBMS_SQL.native);
5302 DBMS_SQL.define_column(l_emp_csr, 1, l_cust_account_id);
5303 DBMS_SQL.define_column(l_emp_csr, 2, l_plan_type, 30);
5304 DBMS_SQL.define_column(l_emp_csr, 3, l_plan_id);
5305 DBMS_SQL.define_column(l_emp_csr, 4, l_bill_to_site_id); --Fix for Bug 7605745
5306 DBMS_SQL.define_column(l_emp_csr, 5, l_product_level_type, 30);
5307 DBMS_SQL.define_column(l_emp_csr, 6, l_product_id);
5308 DBMS_SQL.define_column(l_emp_csr, 7, l_amount);
5309 DBMS_SQL.define_column(l_emp_csr, 8, l_currency_code, 15);
5310 FND_DSQL.do_binds;
5311
5312 l_ignore := DBMS_SQL.execute(l_emp_csr);
5313 LOOP
5314 IF DBMS_SQL.fetch_rows(l_emp_csr) > 0 AND l_total_amount <> 0 THEN
5315 DBMS_SQL.column_value(l_emp_csr, 1, l_cust_account_id);
5316 DBMS_SQL.column_value(l_emp_csr, 2, l_plan_type);
5317 DBMS_SQL.column_value(l_emp_csr, 3, l_plan_id);
5318 DBMS_SQL.column_value(l_emp_csr, 4, l_bill_to_site_id); --Fix for Bug 7605745
5319 DBMS_SQL.column_value(l_emp_csr, 5, l_product_level_type);
5320 DBMS_SQL.column_value(l_emp_csr, 6, l_product_id);
5321 DBMS_SQL.column_value(l_emp_csr, 7, l_amount);
5322 DBMS_SQL.column_value(l_emp_csr, 8, l_currency_code);
5323
5324 IF l_amount IS NOT NULL AND l_amount <> 0 THEN
5325 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Line ' || l_counter || ': Amount='||l_amount);
5326 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Plan Type : ' || l_plan_type);
5327 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Plan Id : ' || l_plan_id);
5328 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Product Level Type: ' || l_product_level_type);
5329 FND_FILE.PUT_LINE(FND_FILE.LOG, 'Product Id : ' || l_product_id);
5330 FND_FILE.PUT_LINE(FND_FILE.LOG, '---------------------------------');
5331
5332 -- Fix for Bug 7632911
5333 IF (l_total_amount >= l_amount AND l_claim_class <>'CHARGE') THEN
5334 l_line_tbl(l_counter).claim_currency_amount := l_amount;
5335 l_total_amount := l_total_amount - l_amount;
5336 ELSE
5337 l_line_tbl(l_counter).claim_currency_amount := l_total_amount;
5338 -- Fix for Bug 7632911
5339 IF (l_claim_class = 'CHARGE') THEN
5340 l_total_amount := l_total_amount - l_amount;
5341 ELSE
5342 l_total_amount := 0;
5343 END IF;
5344 END IF;
5345
5346 l_line_tbl(l_counter).claim_id := p_claim_id;
5347 l_line_tbl(l_counter).activity_type := l_plan_type;
5348 l_line_tbl(l_counter).activity_id := l_plan_id;
5349 l_line_tbl(l_counter).relationship_type := l_funds_util_flt.relationship_type;
5350 l_line_tbl(l_counter).related_cust_account_id := l_funds_util_flt.related_cust_account_id;
5351 l_line_tbl(l_counter).buy_group_party_id := l_funds_util_flt.buy_group_party_id;
5352 l_line_tbl(l_counter).select_cust_children_flag := l_funds_util_flt.select_cust_children_flag;
5353 IF l_product_level_type = 'PRODUCT' AND l_product_id IS NOT NULL THEN
5354 l_line_tbl(l_counter).item_id := l_product_id;
5355 OPEN csr_uom_code(l_line_tbl(l_counter).item_id);
5356 FETCH csr_uom_code INTO l_line_tbl(l_counter).quantity_uom;
5357 IF csr_uom_code%NOTFOUND THEN
5358 CLOSE csr_uom_code;
5359 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5360 FND_MESSAGE.Set_Name('OZF', 'OZF_PRODUCT_UOM_MISSING');
5361 FND_MESSAGE.Set_Token('ITEM_ID', l_product_id);
5362 FND_MSG_PUB.ADD;
5363 END IF;
5364 RAISE FND_API.g_exc_unexpected_error;
5365 END IF;
5366 CLOSE csr_uom_code;
5367 END IF;
5368
5369 /*
5370 IF l_funds_util_flt.activity_type = 'OFFR' THEN
5371 l_dummy := Check_for_Offer_Performance ( p_cust_account_id => l_funds_util_flt.cust_account_id
5372 , p_funds_util_flt => l_funds_util_flt
5373 , x_return_status => l_return_status
5374 );
5375
5376 IF l_return_status = FND_API.g_ret_sts_error THEN
5377 RAISE FND_API.g_exc_error;
5378 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5379 RAISE FND_API.g_exc_error;
5380 END IF;
5381
5382 IF l_dummy = FND_API.G_TRUE THEN
5383 l_line_tbl(l_counter).performance_attached_flag := FND_API.G_TRUE;
5384 l_line_tbl(l_counter).performance_complete_flag := FND_API.G_TRUE;
5385 END IF;
5386 END IF;
5387 */
5388
5389 l_counter := l_counter + 1;
5390 END IF;
5391 ELSE
5392 EXIT;
5393 END IF;
5394 END LOOP;
5395 DBMS_SQL.close_cursor(l_emp_csr);
5396
5397 -- if earnings are found
5398 IF l_counter > 1 THEN
5399 OZF_CLAIM_LINE_PVT.Create_Claim_Line_Tbl(
5400 p_api_version => 1.0
5401 ,p_init_msg_list => FND_API.g_false
5402 ,p_commit => FND_API.g_false
5403 ,p_validation_level => FND_API.g_valid_level_full
5404 ,x_return_status => l_return_status
5405 ,x_msg_count => x_msg_count
5406 ,x_msg_data => x_msg_data
5407 ,p_claim_line_tbl => l_line_tbl
5408 ,x_error_index => l_error_index
5409 );
5410
5411 IF l_return_status = FND_API.g_ret_sts_error THEN
5412 RAISE FND_API.g_exc_error;
5413 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5414 RAISE FND_API.g_exc_error;
5415 END IF;
5416
5417 -- Added For Bug 7611966
5418 OPEN csr_claim_line(p_claim_id);
5419 LOOP
5420 FETCH csr_claim_line INTO l_funds_util_flt.claim_line_id;
5421 EXIT WHEN csr_claim_line%NOTFOUND;
5422 END LOOP;
5423 CLOSE csr_claim_line;
5424
5425 -- Fix For Bug 7611966
5426 OPEN csr_claim_line_util(l_funds_util_flt.claim_line_id,p_claim_id);
5427 LOOP
5428 FETCH csr_claim_line_util INTO l_funds_util_flt.claim_line_id
5429 , l_funds_util_flt.activity_type
5430 , l_funds_util_flt.activity_id
5431 , l_funds_util_flt.product_id
5432 , l_funds_util_flt.total_amount;
5433 EXIT WHEN csr_claim_line_util%NOTFOUND;
5434
5435 Update_Group_Line_Util(
5436 p_api_version => 1.0
5437 ,p_init_msg_list => FND_API.g_false
5438 ,p_commit => FND_API.g_false
5439 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
5440 ,x_return_status => l_return_status
5441 ,x_msg_count => x_msg_count
5442 ,x_msg_data => x_msg_data
5443 ,p_summary_view => 'ACTIVITY'
5444 ,p_funds_util_flt => l_funds_util_flt
5445 );
5446
5447 IF l_return_status = FND_API.g_ret_sts_error THEN
5448 RAISE FND_API.g_exc_error;
5449 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
5450 RAISE FND_API.g_exc_error;
5451 END IF;
5452 END LOOP;
5453 CLOSE csr_claim_line_util;
5454 END IF;
5455
5456 ------------------------- finish -------------------------------
5457 -- Check for commit
5458 IF FND_API.to_boolean(p_commit) THEN
5459 COMMIT;
5460 END IF;
5461
5462 FND_MSG_PUB.count_and_get(
5463 p_encoded => FND_API.g_false,
5464 p_count => x_msg_count,
5465 p_data => x_msg_data
5466 );
5467
5468 IF OZF_DEBUG_HIGH_ON THEN
5469 OZF_Utility_PVT.debug_message(l_full_name ||': end');
5470 END IF;
5471
5472 EXCEPTION
5473 WHEN FND_API.g_exc_error THEN
5474 ROLLBACK TO Asso_Accruals_To_Claim;
5475 x_return_status := FND_API.g_ret_sts_error;
5476 FND_MSG_PUB.count_and_get (
5477 p_encoded => FND_API.g_false
5478 ,p_count => x_msg_count
5479 ,p_data => x_msg_data
5480 );
5481
5482 WHEN FND_API.g_exc_unexpected_error THEN
5483 ROLLBACK TO Asso_Accruals_To_Claim;
5484 x_return_status := FND_API.g_ret_sts_unexp_error ;
5485 FND_MSG_PUB.count_and_get (
5486 p_encoded => FND_API.g_false
5487 ,p_count => x_msg_count
5488 ,p_data => x_msg_data
5489 );
5490
5491 WHEN OTHERS THEN
5492 ROLLBACK TO Asso_Accruals_To_Claim;
5493 x_return_status := FND_API.g_ret_sts_unexp_error ;
5494 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
5495 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5496 END IF;
5497 FND_MSG_PUB.count_and_get(
5498 p_encoded => FND_API.g_false
5499 ,p_count => x_msg_count
5500 ,p_data => x_msg_data
5501 );
5502
5503 END Asso_Accruals_To_Claim;
5504
5505
5506 ---------------------------------------------------------------------
5507 -- PROCEDURE
5508 -- Asso_Accruals_To_Claim_Line
5509 --
5510 -- PURPOSE
5511 -- Associate earnings to the given claim line based on line
5512 -- properties
5513 --
5514 -- PARAMETERS
5515 -- p_claim_line_id:
5516 --
5517 -- NOTES
5518 -- modified for Bugfix 5182452 l_funds_util populated with claim line info.
5519 ---------------------------------------------------------------------
5520 PROCEDURE Asso_Accruals_To_Claim_Line(
5521 p_api_version IN NUMBER
5522 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
5523 ,p_commit IN VARCHAR2 := FND_API.g_false
5524 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
5525
5526 ,x_return_status OUT NOCOPY VARCHAR2
5527 ,x_msg_count OUT NOCOPY NUMBER
5528 ,x_msg_data OUT NOCOPY VARCHAR2
5529
5530 ,p_claim_line_id IN NUMBER
5531 )
5532 IS
5533 l_api_version CONSTANT NUMBER := 1.0;
5534 l_api_name CONSTANT VARCHAR2(30) := 'Asso_Accruals_To_Claim_Line';
5535 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5536 l_return_status VARCHAR2(1);
5537
5538 l_funds_util_flt funds_util_flt_type;
5539 l_line_id NUMBER;
5540
5541 --start of bugfix 5182452
5542 CURSOR csr_line_info(cv_claim_line_id IN NUMBER) IS
5543 select claim_line_id
5544 , offer_id -- >fund_id
5545 , activity_type
5546 , activity_id
5547 , offer_type
5548 , source_object_class --> document_class
5549 , source_object_id --> document_id
5550 , item_id -->product_id
5551 , amount -->total_amount
5552 , quantity
5553 , quantity_uom -->uom_code
5554 , relationship_type
5555 , related_cust_account_id
5556 , buy_group_cust_account_id
5557 , buy_group_party_id
5558 , select_cust_children_flag
5559 , prorate_earnings_flag
5560 from ozf_claim_lines_all
5561 WHERE claim_line_id = cv_claim_line_id;
5562
5563 --used to derive old_total_amount
5564 CURSOR csr_sum_util_amounts(cv_claim_line_id IN NUMBER) IS
5565 select sum(amount)
5566 from ozf_claim_lines_util
5567 where claim_line_id = cv_claim_line_id;
5568
5569 --used to derive old_total_units
5570 CURSOR csr_sum_scan_units(cv_claim_line_id IN NUMBER) IS
5571 select sum(scan_unit)
5572 from ozf_claim_lines_util
5573 where claim_line_id = cv_claim_line_id;
5574 --end of bugfix 5182452
5575
5576 BEGIN
5577 --------------------- initialize -----------------------
5578 SAVEPOINT Asso_Accruals_To_Claim_Line;
5579
5580 IF OZF_DEBUG_HIGH_ON THEN
5581 OZF_Utility_PVT.debug_message(l_full_name||': start');
5582 END IF;
5583
5584 IF FND_API.to_boolean(p_init_msg_list) THEN
5585 FND_MSG_PUB.initialize;
5586 END IF;
5587
5588 IF NOT FND_API.compatible_api_call(
5589 l_api_version,
5590 p_api_version,
5591 l_api_name,
5592 g_pkg_name
5593 ) THEN
5594 RAISE FND_API.g_exc_unexpected_error;
5595 END IF;
5596
5597 x_return_status := FND_API.g_ret_sts_success;
5598
5599 ----------------- Associate earnings ----------------
5600 -- verify the claim exists
5601 --start of bugfix 5182452
5602
5603 OPEN csr_line_info(p_claim_line_id);
5604 FETCH csr_line_info INTO l_funds_util_flt.claim_line_id,
5605 l_funds_util_flt.fund_id
5606 ,l_funds_util_flt.activity_type
5607 ,l_funds_util_flt.activity_id
5608 , l_funds_util_flt.offer_type
5609 , l_funds_util_flt.document_class
5610 , l_funds_util_flt.document_id
5611 ,l_funds_util_flt.product_id
5612 , l_funds_util_flt.total_amount
5613 , l_funds_util_flt.quantity
5614 , l_funds_util_flt.uom_code
5615 , l_funds_util_flt.relationship_type
5616 , l_funds_util_flt.related_cust_account_id
5617 , l_funds_util_flt.buy_group_cust_account_id
5618 , l_funds_util_flt.buy_group_party_id
5619 , l_funds_util_flt.select_cust_children_flag
5620 ,l_funds_util_flt.prorate_earnings_flag;
5621
5622 IF csr_line_info%NOTFOUND THEN
5623 CLOSE csr_line_info;
5624 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5625 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_LINEID_NOT_EXIST');
5626 FND_MESSAGE.Set_Token('LINE_ID', p_claim_line_id);
5627 FND_MSG_PUB.ADD;
5628 END IF;
5629 RAISE FND_API.g_exc_unexpected_error;
5630 END IF;
5631 CLOSE csr_line_info;
5632
5633 OPEN csr_sum_util_amounts(p_claim_line_id);
5634 FETCH csr_sum_util_amounts INTO l_funds_util_flt.old_total_amount;
5635
5636 IF csr_sum_util_amounts%NOTFOUND THEN
5637 CLOSE csr_line_info;
5638 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5639 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_LINEID_NOT_EXIST');
5640 FND_MESSAGE.Set_Token('LINE_ID', p_claim_line_id);
5641 FND_MSG_PUB.ADD;
5642 END IF;
5643 RAISE FND_API.g_exc_unexpected_error;
5644 END IF;
5645 CLOSE csr_sum_util_amounts;
5646
5647 OPEN csr_sum_scan_units(p_claim_line_id);
5648 FETCH csr_sum_scan_units INTO l_funds_util_flt.old_total_units;
5649
5650 IF csr_sum_scan_units%NOTFOUND THEN
5651 CLOSE csr_line_info;
5652 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5653 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_LINEID_NOT_EXIST');
5654 FND_MESSAGE.Set_Token('LINE_ID', p_claim_line_id);
5655 FND_MSG_PUB.ADD;
5656 END IF;
5657 RAISE FND_API.g_exc_unexpected_error;
5658 END IF;
5659 CLOSE csr_sum_scan_units;
5660 --end of bugfix 5182452
5661
5662 Update_Group_Line_Util(
5663 p_api_version => l_api_version
5664 ,p_init_msg_list => FND_API.g_false
5665 ,p_commit => FND_API.g_false
5666 ,p_validation_level => p_validation_level
5667 ,x_return_status => l_return_status
5668 ,x_msg_count => x_msg_count
5669 ,x_msg_data => x_msg_data
5670 ,p_summary_view => null
5671 ,p_funds_util_flt => l_funds_util_flt
5672 ,p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
5673 );
5674 IF l_return_status = fnd_api.g_ret_sts_error THEN
5675 RAISE FND_API.g_exc_error;
5676 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
5677 RAISE FND_API.g_exc_unexpected_error;
5678 END IF;
5679
5680 ------------------------- finish -------------------------------
5681 -- Check for commit
5682 IF FND_API.to_boolean(p_commit) THEN
5683 COMMIT;
5684 END IF;
5685
5686 FND_MSG_PUB.count_and_get(
5687 p_encoded => FND_API.g_false,
5688 p_count => x_msg_count,
5689 p_data => x_msg_data
5690 );
5691
5692 IF OZF_DEBUG_HIGH_ON THEN
5693 OZF_Utility_PVT.debug_message(l_full_name ||': end');
5694 END IF;
5695
5696 EXCEPTION
5697 WHEN FND_API.g_exc_error THEN
5698 ROLLBACK TO Asso_Accruals_To_Claim_Line;
5699 x_return_status := FND_API.g_ret_sts_error;
5700 FND_MSG_PUB.count_and_get (
5701 p_encoded => FND_API.g_false
5702 ,p_count => x_msg_count
5703 ,p_data => x_msg_data
5704 );
5705
5706 WHEN FND_API.g_exc_unexpected_error THEN
5707 ROLLBACK TO Asso_Accruals_To_Claim_Line;
5708 x_return_status := FND_API.g_ret_sts_unexp_error ;
5709 FND_MSG_PUB.count_and_get (
5710 p_encoded => FND_API.g_false
5711 ,p_count => x_msg_count
5712 ,p_data => x_msg_data
5713 );
5714
5715 WHEN OTHERS THEN
5716 ROLLBACK TO Asso_Accruals_To_Claim_Line;
5717 x_return_status := FND_API.g_ret_sts_unexp_error ;
5718 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
5719 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
5720 END IF;
5721 FND_MSG_PUB.count_and_get(
5722 p_encoded => FND_API.g_false
5723 ,p_count => x_msg_count
5724 ,p_data => x_msg_data
5725 );
5726
5727 END Asso_Accruals_To_Claim_Line;
5728
5729
5730 ---------------------------------------------------------------------
5731 -- PROCEDURE
5732 -- Initiate_Batch_Payment
5733 --
5734 -- PURPOSE
5735 -- Create claims and initiate payments for resale batches
5736 --
5737 -- PARAMETERS
5738 -- p_resale_batch_id: resale batch id
5739 --
5740 -- NOTES
5741 --
5742 -- HISTORY
5743 --
5744 -- 06-Oct-08 ateotia Bug # 7453430 fixed.
5745 -- FP:11510-R12 7423017 - SHIP AND DEBIT BATCH CREATES MULTIPLE CLAIMS
5746 ---------------------------------------------------------------------
5747 PROCEDURE Initiate_Batch_Payment(
5748 p_api_version IN NUMBER
5749 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
5750 ,p_commit IN VARCHAR2 := FND_API.g_false
5751 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
5752
5753 ,x_return_status OUT NOCOPY VARCHAR2
5754 ,x_msg_count OUT NOCOPY NUMBER
5755 ,x_msg_data OUT NOCOPY VARCHAR2
5756
5757 ,p_resale_batch_id IN NUMBER
5758 )
5759 IS
5760 l_api_version CONSTANT NUMBER := 1.0;
5761 l_api_name CONSTANT VARCHAR2(30) := 'Initiate_Batch_Payment';
5762 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
5763 l_return_status VARCHAR2(1);
5764
5765 l_cust_account_id NUMBER;
5766 l_partner_id NUMBER;
5767 l_claim_curr_code VARCHAR2(15);
5768 l_line_curr_code VARCHAR2(15);
5769 l_request_header_id NUMBER;
5770 l_request_number VARCHAR2(30);
5771 l_agreement_number VARCHAR2(240);
5772 l_product_id NUMBER;
5773 l_uom_code VARCHAR2(3);
5774 l_quantity NUMBER;
5775 l_line_amount NUMBER;
5776 l_new_line_amount NUMBER;
5777 l_claim_amount NUMBER;
5778 l_claim_id NUMBER;
5779 l_claim_rec OZF_CLAIM_PVT.claim_rec_type;
5780 l_line_tbl OZF_CLAIM_LINE_PVT.claim_line_tbl_type;
5781 l_cust_trade_profile g_cust_trade_profile_csr%rowtype;
5782 l_payment_method VARCHAR2(30);
5783 l_cust_billto_acct_site_id NUMBER;
5784 l_vendor_id NUMBER;
5785 l_vendor_site_id NUMBER;
5786 l_claim_line_id NUMBER;
5787 l_party_name VARCHAR2(360);
5788 l_close_claim_flag VARCHAR2(1);
5789 l_partner_claim_num VARCHAR2(30);
5790
5791 l_counter PLS_INTEGER := 1;
5792 l_error_index NUMBER;
5793
5794 l_scan_value NUMBER;
5795 l_offer_uom_code VARCHAR2(3);
5796 l_offer_quantity NUMBER;
5797 l_trans_curr_code VARCHAR2(15);
5798 l_new_claim_quantity NUMBER;
5799
5800 CURSOR csr_resale_batch(cv_batch_id IN NUMBER) IS
5801 SELECT partner_cust_account_id
5802 , partner_id
5803 , currency_code
5804 , partner_claim_number
5805 FROM ozf_resale_batches
5806 WHERE resale_batch_id = cv_batch_id;
5807
5808 -- bug # 7453430 fixed by ateotia(+)
5809 /*CURSOR csr_batch_request(cv_batch_id IN NUMBER, cv_partner_id IN NUMBER) IS
5810 SELECT r.request_header_id
5811 , r.request_number
5812 , s.agreement_name
5813 FROM ozf_resale_lines_int s
5814 , ozf_request_headers_all_b r
5815 WHERE s.resale_batch_id = cv_batch_id
5816 AND s.agreement_name = r.agreement_number
5817 AND r.partner_id = cv_partner_id
5818 AND r.status_code = 'APPROVED'
5819 AND r.request_class = 'SPECIAL_PRICE'
5820 GROUP BY r.request_header_id
5821 , r.request_number
5822 , s.agreement_name;
5823
5824
5825 -- Start of changes for bug 4523751
5826 CURSOR csr_batch_line(cv_batch_id IN NUMBER, cv_agreement_number IN VARCHAR2) IS
5827 SELECT inventory_item_id
5828 , uom_code
5829 , sum(quantity)
5830 , currency_code
5831 , sum(total_accepted_amount)
5832 FROM ozf_resale_lines_int
5833 WHERE resale_batch_id = cv_batch_id
5834 AND agreement_name = cv_agreement_number
5835 AND status_code = 'PROCESSED'
5836 GROUP BY inventory_item_id, uom_code, currency_code;
5837 -- End of changes for bug 4523751*/
5838
5839 CURSOR csr_batch_line(cv_batch_id IN NUMBER, cv_partner_id IN NUMBER) IS
5840 SELECT r.request_header_id
5841 , r.request_number
5842 , s.agreement_name
5843 , s.inventory_item_id
5844 , s.uom_code
5845 , s.currency_code
5846 , sum(s.quantity)
5847 , sum(s.total_accepted_amount)
5848 FROM ozf_resale_lines_int_all s,
5849 ozf_request_headers_all_b r
5850 WHERE s.resale_batch_id = cv_batch_id
5851 AND s.status_code = 'PROCESSED'
5852 AND s.agreement_name = r.agreement_number
5853 AND r.partner_id = cv_partner_id
5854 AND r.status_code = 'APPROVED'
5855 AND r.request_class = 'SPECIAL_PRICE'
5856 GROUP BY
5857 r.request_header_id
5858 , r.request_number
5859 , s.agreement_name
5860 , s.inventory_item_id
5861 , s.uom_code
5862 , s.currency_code;
5863 -- bug # 7453430 fixed by ateotia(-)
5864
5865 -- added for Bugfix 5404951
5866 CURSOR csr_ams_act_products(cv_agreement_number IN VARCHAR2 ,cv_product_id IN NUMBER) IS
5867 select act.SCAN_VALUE ,act.UOM_CODE , act.Quantity , off.TRANSACTION_CURRENCY_CODE
5868 from ozf_offers off , ams_act_products act
5869 where offer_code = cv_agreement_number
5870 and ARC_ACT_PRODUCT_USED_BY = 'OFFR'
5871 AND ACT_PRODUCT_USED_BY_ID = off.qp_list_header_id
5872 AND INVENTORY_ITEM_ID = cv_product_id;
5873
5874 CURSOR csr_claim_line(cv_claim_id IN NUMBER) IS
5875 SELECT claim_line_id
5876 FROM ozf_claim_lines
5877 WHERE claim_id = cv_claim_id;
5878
5879 CURSOR csr_party_name(cv_cust_account_id IN NUMBER) IS
5880 SELECT p.party_name
5881 FROM hz_parties p, hz_cust_accounts c
5882 WHERE p.party_id = c.party_id
5883 AND c.cust_account_id = cv_cust_account_id;
5884
5885 --Added for bug 7030415
5886 CURSOR c_get_conversion_type IS
5887 SELECT exchange_rate_type
5888 FROM ozf_sys_parameters_all
5889 WHERE org_id = MO_GLOBAL.GET_CURRENT_ORG_ID;
5890
5891 l_exchange_rate_type VARCHAR2(30) := FND_API.G_MISS_CHAR;
5892 l_rate NUMBER;
5893
5894
5895 BEGIN
5896 --------------------- initialize -----------------------
5897 SAVEPOINT Initiate_Batch_Payment;
5898
5899 IF OZF_DEBUG_HIGH_ON THEN
5900 OZF_Utility_PVT.debug_message(l_full_name||': start');
5901 END IF;
5902
5903 IF FND_API.to_boolean(p_init_msg_list) THEN
5904 FND_MSG_PUB.initialize;
5905 END IF;
5906
5907 IF NOT FND_API.compatible_api_call(
5908 l_api_version,
5909 p_api_version,
5910 l_api_name,
5911 g_pkg_name
5912 ) THEN
5913 RAISE FND_API.g_exc_unexpected_error;
5914 END IF;
5915
5916 x_return_status := FND_API.g_ret_sts_success;
5917
5918 ----------------- Process batch ----------------
5919 OPEN csr_resale_batch(p_resale_batch_id);
5920 FETCH csr_resale_batch INTO l_cust_account_id
5921 , l_partner_id
5922 , l_claim_curr_code
5923 , l_partner_claim_num;
5924 CLOSE csr_resale_batch;
5925
5926 IF OZF_DEBUG_HIGH_ON THEN
5927 OZF_Utility_PVT.debug_message('Process batch for customer id '||l_cust_account_id);
5928 END IF;
5929
5930 l_close_claim_flag := 'T';
5931
5932 -- get payment method information from trade profile
5933 Get_Cust_Trade_Profile(
5934 p_cust_account_id => l_cust_account_id
5935 ,x_cust_trade_profile => l_cust_trade_profile
5936 );
5937
5938 IF l_cust_trade_profile.trade_profile_id IS NOT NULL THEN
5939 Validate_Cust_Trade_Profile(
5940 p_cust_trade_profile => l_cust_trade_profile
5941 ,x_return_status => l_return_status
5942 );
5943
5944 -- do not settle claim if trade profile has errors
5945 IF l_return_status = FND_API.g_ret_sts_error or
5946 l_return_status = FND_API.g_ret_sts_unexp_error THEN
5947 l_close_claim_flag := 'F';
5948 END IF;
5949
5950 l_payment_method := l_cust_trade_profile.payment_method;
5951 l_cust_billto_acct_site_id := l_cust_trade_profile.site_use_id;
5952 l_vendor_id := l_cust_trade_profile.vendor_id;
5953 l_vendor_site_id := l_cust_trade_profile.vendor_site_id;
5954 ELSE
5955 /*
5956 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
5957 OPEN csr_party_name(l_cust_account_id);
5958 FETCH csr_party_name INTO l_party_name;
5959 CLOSE csr_party_name;
5960
5961 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_NO_TRADE_PROFILE');
5962 FND_MESSAGE.Set_Token('CUST_NAME', l_party_name);
5963 FND_MSG_PUB.ADD;
5964 END IF;
5965 RAISE FND_API.g_exc_unexpected_error;
5966 */
5967 -- do not settle claim if trade profile does not exists
5968 l_close_claim_flag := 'F';
5969 END IF;
5970
5971 -- bug # 7453430 fixed by ateotia(+)
5972 /*OPEN csr_batch_request(p_resale_batch_id, l_partner_id);
5973 LOOP
5974 FETCH csr_batch_request INTO l_request_header_id
5975 , l_request_number
5976 , l_agreement_number;
5977 EXIT WHEN csr_batch_request%NOTFOUND;
5978
5979 IF OZF_DEBUG_HIGH_ON THEN
5980 OZF_Utility_PVT.debug_message('request id:'||l_request_header_id);
5981 END IF;
5982 -- create a claim per request(agreement)*/
5983 -- bug # 7453430 fixed by ateotia(-)
5984
5985 l_claim_amount := 0;
5986 l_counter := 1;
5987
5988 --Added for 7360762
5989 IF l_line_tbl.EXISTS(1) THEN
5990 l_line_tbl.DELETE;
5991 END IF;
5992
5993 -- bug # 7453430 fixed by ateotia(+)
5994 /*OPEN csr_batch_line(p_resale_batch_id, l_agreement_number);
5995 LOOP
5996 FETCH csr_batch_line INTO l_product_id
5997 , l_uom_code
5998 , l_quantity
5999 , l_line_curr_code
6000 , l_line_amount;*/
6001 OPEN csr_batch_line(p_resale_batch_id, l_partner_id);
6002 LOOP
6003 FETCH csr_batch_line INTO l_request_header_id
6004 , l_request_number
6005 , l_agreement_number
6006 , l_product_id
6007 , l_uom_code
6008 , l_line_curr_code
6009 , l_quantity
6010 , l_line_amount;
6011 -- bug # 7453430 fixed by ateotia(-)
6012
6013 EXIT WHEN csr_batch_line%NOTFOUND;
6014
6015 OPEN csr_ams_act_products(l_agreement_number ,l_product_id );
6016 FETCH csr_ams_act_products INTO l_scan_value
6017 , l_offer_uom_code
6018 , l_offer_quantity
6019 , l_trans_curr_code;
6020 CLOSE csr_ams_act_products;
6021
6022 -- calculate claim amount
6023 IF l_line_curr_code = l_claim_curr_code THEN
6024 l_new_line_amount := l_line_amount;
6025 ELSE
6026 --Added for bug 7030415, get exchange_rate type
6027 OPEN c_get_conversion_type;
6028 FETCH c_get_conversion_type INTO l_exchange_rate_type;
6029 CLOSE c_get_conversion_type;
6030 OZF_UTILITY_PVT.Convert_Currency(
6031 p_from_currency => l_line_curr_code
6032 ,p_to_currency => l_claim_curr_code
6033 ,p_conv_type => l_exchange_rate_type
6034 ,p_conv_date => SYSDATE
6035 ,p_from_amount => l_line_amount
6036 ,x_return_status => l_return_status
6037 ,x_to_amount => l_new_line_amount
6038 ,x_rate => l_rate
6039 );
6040 IF l_return_status = FND_API.g_ret_sts_error THEN
6041 RAISE FND_API.g_exc_error;
6042 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
6043 RAISE FND_API.g_exc_unexpected_error;
6044 END IF;
6045 END IF;
6046 l_claim_amount := l_claim_amount + l_new_line_amount;
6047
6048 -- Bugfix 5404951
6049 IF l_offer_uom_code <> l_uom_code THEN
6050 l_new_claim_quantity := (l_line_amount * l_offer_quantity) / l_scan_value ; -- correct qty in offer_uom
6051 -- convert this to claim line uom
6052 l_quantity := inv_convert.inv_um_convert(
6053 item_id => l_product_id
6054 ,precision => 2
6055 ,from_quantity => l_new_claim_quantity
6056 ,from_unit => l_offer_uom_code
6057 ,to_unit => l_uom_code
6058 ,from_name => NULL
6059 ,to_name => NULL
6060 );
6061 IF l_quantity = -99999 THEN
6062 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6063 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_CONVERT_UOM');
6064 FND_MSG_PUB.add;
6065 END IF;
6066 RAISE FND_API.g_exc_error;
6067 END IF;
6068
6069 ELSE
6070 -- the uom is same, only need to recalculate the correct quantity
6071 l_quantity := (l_line_amount * l_offer_quantity) / l_scan_value;
6072 l_quantity := ROUND(l_quantity,2);
6073 END IF;
6074
6075 l_line_tbl(l_counter).activity_type := 'SPECIAL_PRICE';
6076 l_line_tbl(l_counter).activity_id := l_request_header_id;
6077 l_line_tbl(l_counter).item_type := 'PRODUCT';
6078 l_line_tbl(l_counter).item_id := l_product_id;
6079 l_line_tbl(l_counter).quantity_uom := l_uom_code;
6080 l_line_tbl(l_counter).quantity := l_quantity;
6081 l_line_tbl(l_counter).currency_code := l_line_curr_code;
6082 l_line_tbl(l_counter).amount := l_line_amount;
6083 l_line_tbl(l_counter).claim_currency_amount := l_new_line_amount;
6084
6085 l_counter := l_counter + 1;
6086 END LOOP;
6087 CLOSE csr_batch_line;
6088
6089 -- create claim
6090 l_claim_rec.cust_account_id := l_cust_account_id;
6091 l_claim_rec.source_object_class := 'SPECIAL_PRICE';
6092 -- bug # 7453430 fixed by ateotia(+)
6093 /*l_claim_rec.source_object_id := l_request_header_id;
6094 l_claim_rec.source_object_number := l_request_number;*/
6095 l_claim_rec.source_object_id := NULL;
6096 l_claim_rec.source_object_number := NULL;
6097 -- bug # 7453430 fixed by ateotia(-)
6098 l_claim_rec.batch_id := p_resale_batch_id;
6099 l_claim_rec.batch_type := OZF_Resale_Common_PVT.G_BATCH_REF_TYPE;
6100 l_claim_rec.currency_code := l_claim_curr_code;
6101 l_claim_rec.amount := l_claim_amount;
6102 l_claim_rec.payment_method := l_payment_method;
6103 l_claim_rec.cust_billto_acct_site_id := l_cust_billto_acct_site_id;
6104 l_claim_rec.vendor_id := l_vendor_id;
6105 l_claim_rec.vendor_site_id := l_vendor_site_id;
6106 l_claim_rec.status_code := 'OPEN';
6107 l_claim_rec.user_status_id := to_number(
6108 ozf_utility_pvt.get_default_user_status(
6109 p_status_type => 'OZF_CLAIM_STATUS',
6110 p_status_code => l_claim_rec.status_code));
6111 -- save batch's partner claim number as customer reference
6112 l_claim_rec.customer_ref_number := l_partner_claim_num;
6113
6114 OZF_CLAIM_PVT.Create_Claim(
6115 p_api_version => l_api_version
6116 ,x_return_status => l_return_status
6117 ,x_msg_data => x_msg_data
6118 ,x_msg_count => x_msg_count
6119 ,p_claim => l_claim_rec
6120 ,x_claim_id => l_claim_id
6121 );
6122 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6123 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6124 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6125 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6126 END IF;
6127
6128 IF OZF_DEBUG_HIGH_ON THEN
6129 OZF_Utility_PVT.debug_message('Created claim id:'||l_claim_id);
6130 END IF;
6131
6132 FOR i IN l_line_tbl.FIRST..l_line_tbl.LAST LOOP
6133 IF l_line_tbl.exists(i) IS NOT NULL THEN
6134 l_line_tbl(i).claim_id := l_claim_id;
6135 END IF;
6136 END LOOP;
6137
6138 OZF_CLAIM_LINE_PVT.Create_Claim_Line_Tbl(
6139 p_api_version => 1.0
6140 ,p_init_msg_list => FND_API.g_false
6141 ,p_commit => FND_API.g_false
6142 ,p_validation_level => FND_API.g_valid_level_full
6143 ,x_return_status => l_return_status
6144 ,x_msg_count => x_msg_count
6145 ,x_msg_data => x_msg_data
6146 ,p_claim_line_tbl => l_line_tbl
6147 ,x_error_index => l_error_index
6148 );
6149 IF l_return_status = FND_API.g_ret_sts_error THEN
6150 RAISE FND_API.g_exc_error;
6151 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
6152 RAISE FND_API.g_exc_error;
6153 END IF;
6154
6155 IF OZF_DEBUG_HIGH_ON THEN
6156 OZF_Utility_PVT.debug_message('Claim lines created for claim_id=' || l_claim_id);
6157 END IF;
6158
6159 OPEN csr_claim_line(l_claim_id);
6160 LOOP
6161 FETCH csr_claim_line INTO l_claim_line_id;
6162 EXIT WHEN csr_claim_line%NOTFOUND;
6163
6164 Asso_Accruals_To_Claim_Line(
6165 p_api_version => 1.0
6166 ,p_init_msg_list => FND_API.g_false
6167 ,p_commit => FND_API.g_false
6168 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
6169 ,x_return_status => l_return_status
6170 ,x_msg_count => x_msg_count
6171 ,x_msg_data => x_msg_data
6172 ,p_claim_line_id => l_claim_line_id
6173 );
6174 IF l_return_status = FND_API.g_ret_sts_error THEN
6175 RAISE FND_API.g_exc_error;
6176 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
6177 RAISE FND_API.g_exc_error;
6178 END IF;
6179 END LOOP;
6180 CLOSE csr_claim_line;
6181
6182 IF l_close_claim_flag = 'T' THEN
6183 Settle_Claim(
6184 p_claim_id => l_claim_id
6185 ,x_return_status => l_return_status
6186 ,x_msg_count => x_msg_count
6187 ,x_msg_data => x_msg_data
6188 );
6189 IF l_return_status = fnd_api.g_ret_sts_error THEN
6190 RAISE FND_API.g_exc_error;
6191 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
6192 RAISE FND_API.g_exc_unexpected_error;
6193 END IF;
6194 END IF;
6195
6196 -- bug # 7453430 fixed by ateotia(+)
6197 /*END LOOP;
6198 CLOSE csr_batch_request;*/
6199 -- bug # 7453430 fixed by ateotia(-)
6200
6201 ------------------------- finish -------------------------------
6202 -- Check for commit
6203 IF FND_API.to_boolean(p_commit) THEN
6204 COMMIT;
6205 END IF;
6206
6207 FND_MSG_PUB.count_and_get(
6208 p_encoded => FND_API.g_false,
6209 p_count => x_msg_count,
6210 p_data => x_msg_data
6211 );
6212
6213 IF OZF_DEBUG_HIGH_ON THEN
6214 OZF_Utility_PVT.debug_message(l_full_name ||': end');
6215 END IF;
6216
6217 EXCEPTION
6218 WHEN FND_API.g_exc_error THEN
6219 ROLLBACK TO Initiate_Batch_Payment;
6220 x_return_status := FND_API.g_ret_sts_error;
6221 FND_MSG_PUB.count_and_get (
6222 p_encoded => FND_API.g_false
6223 ,p_count => x_msg_count
6224 ,p_data => x_msg_data
6225 );
6226
6227 WHEN FND_API.g_exc_unexpected_error THEN
6228 ROLLBACK TO Initiate_Batch_Payment;
6229 x_return_status := FND_API.g_ret_sts_unexp_error ;
6230 FND_MSG_PUB.count_and_get (
6231 p_encoded => FND_API.g_false
6232 ,p_count => x_msg_count
6233 ,p_data => x_msg_data
6234 );
6235
6236 WHEN OTHERS THEN
6237 ROLLBACK TO Initiate_Batch_Payment;
6238 x_return_status := FND_API.g_ret_sts_unexp_error ;
6239 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
6240 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
6241 END IF;
6242 FND_MSG_PUB.count_and_get(
6243 p_encoded => FND_API.g_false
6244 ,p_count => x_msg_count
6245 ,p_data => x_msg_data
6246 );
6247
6248 END Initiate_Batch_Payment;
6249
6250
6251 ---------------------------------------------------------------------
6252 -- PROCEDURE
6253 -- Validate_Over_Utilization
6254 --
6255 -- HISTORY
6256 -- 10/15/2002 yizhang Create.
6257 ---------------------------------------------------------------------
6258 PROCEDURE Validate_Over_Utilization(
6259 p_api_version IN NUMBER
6260 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
6261 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
6262
6263 ,x_return_status OUT NOCOPY VARCHAR2
6264 ,x_msg_count OUT NOCOPY NUMBER
6265 ,x_msg_data OUT NOCOPY VARCHAR2
6266
6267 ,p_funds_util_flt IN funds_util_flt_type
6268 )
6269 IS
6270 l_api_version CONSTANT NUMBER := 1.0;
6271 l_api_name CONSTANT VARCHAR2(30) := 'Validate_Over_Utilization';
6272 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6273 l_return_status VARCHAR2(1);
6274
6275 l_adjustment_flag VARCHAR2(1);
6276 l_count_workflow NUMBER;
6277
6278 l_un_earned_pay_allow_to VARCHAR2(30);
6279 l_un_earned_pay_thold_type VARCHAR2(30);
6280 l_un_earned_pay_thold_amount NUMBER;
6281 l_un_earned_pay_thold_flag VARCHAR2(1);
6282 l_threshold_amount NUMBER;
6283 l_over_paid_amount NUMBER;
6284 l_trd_prf_exist BOOLEAN;
6285 l_total_amt_earned NUMBER;
6286 l_total_amt_remaining NUMBER;
6287
6288 CURSOR csr_auto_adjust(cv_activity_product_id IN NUMBER) IS
6289 SELECT adjustment_flag
6290 FROM ams_act_products
6291 WHERE activity_product_id = cv_activity_product_id;
6292
6293 CURSOR csr_count_workflow(cv_claim_line_id IN NUMBER) IS
6294 SELECT count(*)
6295 FROM ozf_claim_lines_util lu, ams_act_products ap
6296 ,ozf_claim_lines cln1, ozf_claim_lines cln2
6297 WHERE cln1.claim_line_id = cv_claim_line_id
6298 AND cln1.claim_id = cln2.claim_id
6299 AND lu.claim_line_id = cln2.claim_line_id
6300 AND lu.activity_product_id = ap.activity_product_id
6301 AND lu.utilization_id = -1
6302 AND ap.adjustment_flag = 'N';
6303
6304 CURSOR csr_cust_pay_unearned(cv_cust_account_id IN NUMBER) IS
6305 SELECT tp.un_earned_pay_allow_to, tp.un_earned_pay_thold_type
6306 , tp.un_earned_pay_thold_amount, tp.un_earned_pay_thold_flag
6307 FROM ozf_cust_trd_prfls tp
6308 WHERE tp.cust_account_id = cv_cust_account_id;
6309
6310 CURSOR csr_party_pay_unearned(cv_cust_account_id IN NUMBER) IS
6311 SELECT tp.un_earned_pay_allow_to, tp.un_earned_pay_thold_type
6312 , tp.un_earned_pay_thold_amount, tp.un_earned_pay_thold_flag
6313 FROM ozf_cust_trd_prfls tp, hz_cust_accounts hca
6314 WHERE tp.party_id = hca.party_id
6315 AND tp.cust_account_id IS NULL
6316 AND hca.cust_account_id = cv_cust_account_id;
6317
6318 -- fix for bug 5042046
6319 CURSOR csr_sys_pay_unearned IS
6320 SELECT un_earned_pay_allow_to, un_earned_pay_thold_type
6321 , un_earned_pay_thold_amount, un_earned_pay_thold_flag
6322 FROM ozf_sys_parameters
6323 WHERE org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
6324
6325 CURSOR csr_earnings(cv_cust_account_id IN NUMBER, cv_plan_id IN NUMBER) IS
6326 SELECT SUM(acctd_amount), SUM(acctd_amount_remaining)
6327 FROM ozf_funds_utilized_all_b
6328 WHERE utilization_type IN ('ACCRUAL', 'ADJUSTMENT')
6329 AND org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
6330 AND plan_type = 'OFFR'
6331 AND plan_id = cv_plan_id
6332 AND cust_account_id = cv_cust_account_id;
6333
6334
6335 BEGIN
6336 ----------------------- initialize --------------------
6337 IF OZF_DEBUG_HIGH_ON THEN
6338 OZF_Utility_PVT.debug_message(l_full_name||': start');
6339 END IF;
6340
6341 IF FND_API.to_boolean(p_init_msg_list) THEN
6342 FND_MSG_PUB.initialize;
6343 END IF;
6344
6345 IF NOT FND_API.compatible_api_call(
6346 l_api_version,
6347 p_api_version,
6348 l_api_name,
6349 g_pkg_name
6350 ) THEN
6351 RAISE FND_API.g_exc_unexpected_error;
6352 END IF;
6353
6354 x_return_status := FND_API.g_ret_sts_success;
6355
6356 ----------------------- validate ----------------------
6357 -- Scan Data over-utilization is configured in offer line
6358 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
6359 -- Check if auto-adjustment is set
6360 OPEN csr_auto_adjust(p_funds_util_flt.activity_product_id);
6361 FETCH csr_auto_adjust INTO l_adjustment_flag;
6362 CLOSE csr_auto_adjust;
6363
6364 IF l_adjustment_flag = 'N' THEN
6365 -- As of 15-JAN-2003, adjustment workflow is not supported. An error is raised
6366 -- if the offer is not auto-adjustable.
6367 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6368 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_ADJUST_SCANUNIT');
6369 FND_MSG_PUB.add;
6370 END IF;
6371 x_return_status := FND_API.g_ret_sts_error;
6372 RETURN;
6373
6374 /*
6375 -- Adjustment workflow can be invoked only when profile is set
6376 IF NVL(fnd_profile.value('OZF_CLAIM_SCAN_ADJUST_WORKFLOW'),'N') <> 'Y' THEN
6377 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6378 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_NO_ADJUST_WORKFLOW');
6379 FND_MSG_PUB.add;
6380 END IF;
6381 x_return_status := FND_API.g_ret_sts_error;
6382 RETURN;
6383 END IF;
6384
6385 -- At most one workflow can be invoked per claim
6386 OPEN csr_count_workflow(p_funds_util_flt.claim_line_id);
6387 FETCH csr_count_workflow INTO l_count_workflow;
6388 CLOSE csr_count_workflow;
6389
6390 IF l_count_workflow > 0 THEN
6391 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6392 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_MULTI_ADJ_WORKFLOW');
6393 FND_MSG_PUB.add;
6394 END IF;
6395 x_return_status := FND_API.g_ret_sts_error;
6396 RETURN;
6397 END IF;
6398 */
6399 END IF;
6400 ELSE
6401 -- non-scandata offers:
6402 -- offer must be specified for pay over earnings
6403 IF p_funds_util_flt.activity_id IS NULL OR
6404 p_funds_util_flt.activity_type IS NULL OR
6405 p_funds_util_flt.activity_type <> 'OFFR'
6406 THEN
6407 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6408 FND_MESSAGE.set_name('OZF', 'OZF_EARN_OVERPAY_NO_OFFER');
6409 FND_MSG_PUB.add;
6410 END IF;
6411 x_return_status := FND_API.g_ret_sts_error;
6412 RETURN;
6413 END IF;
6414
6415 --eligibility is in trade profile or system parameter
6416 l_trd_prf_exist := FALSE;
6417
6418 IF p_funds_util_flt.cust_account_id IS NOT NULL THEN
6419 -- first check cust account's trade profile
6420 OPEN csr_cust_pay_unearned(p_funds_util_flt.cust_account_id);
6421 FETCH csr_cust_pay_unearned INTO l_un_earned_pay_allow_to
6422 , l_un_earned_pay_thold_type
6423 , l_un_earned_pay_thold_amount
6424 , l_un_earned_pay_thold_flag;
6425 IF NOT csr_cust_pay_unearned%NOTFOUND THEN
6426 l_trd_prf_exist := TRUE;
6427 END IF;
6428 CLOSE csr_cust_pay_unearned;
6429
6430 -- if account has no trade profile, check party's trade profile
6431 IF NOT l_trd_prf_exist THEN
6432 OPEN csr_party_pay_unearned(p_funds_util_flt.cust_account_id);
6433 FETCH csr_party_pay_unearned INTO l_un_earned_pay_allow_to
6434 , l_un_earned_pay_thold_type
6435 , l_un_earned_pay_thold_amount
6436 , l_un_earned_pay_thold_flag;
6437 IF NOT csr_party_pay_unearned%NOTFOUND THEN
6438 l_trd_prf_exist := TRUE;
6439 END IF;
6440 CLOSE csr_party_pay_unearned;
6441 END IF;
6442
6443 IF l_un_earned_pay_allow_to = 'DISALLOW' THEN
6444 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6445 FND_MESSAGE.set_name('OZF', 'OZF_EARN_OVERPAY_NOT_ALLOWED');
6446 FND_MSG_PUB.add;
6447 END IF;
6448 x_return_status := FND_API.g_ret_sts_error;
6449 RETURN;
6450 END IF;
6451 END IF;
6452
6453 -- if no trade profile exists for the party, check sys parameters
6454 IF l_un_earned_pay_allow_to IS NULL THEN
6455 OPEN csr_sys_pay_unearned;
6456 FETCH csr_sys_pay_unearned INTO l_un_earned_pay_allow_to
6457 , l_un_earned_pay_thold_type
6458 , l_un_earned_pay_thold_amount
6459 , l_un_earned_pay_thold_flag;
6460 CLOSE csr_sys_pay_unearned;
6461
6462 IF l_un_earned_pay_allow_to IS NULL OR
6463 l_un_earned_pay_allow_to = 'ALLOW_SELECTED'
6464 THEN
6465 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6466 FND_MESSAGE.set_name('OZF', 'OZF_EARN_OVERPAY_NOT_ALLOWED');
6467 FND_MSG_PUB.add;
6468 END IF;
6469 x_return_status := FND_API.g_ret_sts_error;
6470 RETURN;
6471 END IF;
6472 END IF;
6473
6474 IF l_un_earned_pay_thold_type IS NULL OR
6475 l_un_earned_pay_thold_type <> 'UNCONDITIONAL'
6476 THEN
6477 OPEN csr_earnings(p_funds_util_flt.cust_account_id, p_funds_util_flt.activity_id);
6478 FETCH csr_earnings INTO l_total_amt_earned, l_total_amt_remaining;
6479 CLOSE csr_earnings;
6480
6481 IF l_un_earned_pay_thold_type = 'PERCENT' THEN
6482 l_threshold_amount := l_un_earned_pay_thold_amount * l_total_amt_earned / 100.0;
6483 ELSIF l_un_earned_pay_thold_type = 'AMOUNT' THEN
6484 l_threshold_amount := l_un_earned_pay_thold_amount;
6485 ELSE
6486 l_threshold_amount := 0.0;
6487 END IF;
6488
6489 l_over_paid_amount := p_funds_util_flt.total_amount - l_total_amt_remaining;
6490
6491 IF l_over_paid_amount > l_threshold_amount THEN
6492 IF l_un_earned_pay_thold_flag IS NULL OR l_un_earned_pay_thold_flag <> 'T' THEN
6493 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6494 FND_MESSAGE.set_name('OZF', 'OZF_EARN_OVERPAY_OVER_THOLD');
6495 FND_MSG_PUB.add;
6496 END IF;
6497 x_return_status := FND_API.g_ret_sts_error;
6498 RETURN;
6499 END IF;
6500 END IF;
6501 END IF;
6502 END IF;
6503
6504 IF OZF_DEBUG_HIGH_ON THEN
6505 OZF_Utility_PVT.debug_message(l_full_name||': end');
6506 END IF;
6507 END Validate_Over_Utilization;
6508
6509 ---------------------------------------------------------------------
6510 -- PROCEDURE
6511 -- Create_Group_Line_Util
6512 --
6513 -- HISTORY
6514 -- 05/16/2001 mchang Create.
6515 ---------------------------------------------------------------------
6516 PROCEDURE Create_Group_Line_Util(
6517 p_api_version IN NUMBER
6518 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
6519 ,p_commit IN VARCHAR2 := FND_API.g_false
6520 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
6521
6522 ,x_return_status OUT NOCOPY VARCHAR2
6523 ,x_msg_count OUT NOCOPY NUMBER
6524 ,x_msg_data OUT NOCOPY VARCHAR2
6525
6526 ,p_fund_util_flt IN funds_util_flt_type
6527 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
6528 )
6529 IS
6530 l_api_version CONSTANT NUMBER := 1.0;
6531 l_api_name CONSTANT VARCHAR2(30) := 'Create_Group_Line_Util';
6532 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6533 l_return_status VARCHAR2(1);
6534
6535 TYPE FundsUtilCsrTyp IS REF CURSOR;
6536 l_csr_funds_util FundsUtilCsrTyp;
6537 l_funds_util_sql VARCHAR2(2000);
6538 l_where_yet VARCHAR2(1) := 'N';
6539 l_accum_amount NUMBER := 0;
6540 l_acctd_amount NUMBER;
6541 l_line_util_tbl line_util_tbl_type;
6542 l_counter NUMBER := 1;
6543 l_error_index NUMBER;
6544
6545 BEGIN
6546 --------------------- initialize -----------------------
6547 SAVEPOINT Create_Group_Line_Util;
6548
6549 IF OZF_DEBUG_HIGH_ON THEN
6550 OZF_Utility_PVT.debug_message(l_full_name||': start');
6551 END IF;
6552
6553 IF FND_API.to_boolean(p_init_msg_list) THEN
6554 FND_MSG_PUB.initialize;
6555 END IF;
6556
6557 IF NOT FND_API.compatible_api_call(
6558 l_api_version,
6559 p_api_version,
6560 l_api_name,
6561 g_pkg_name
6562 ) THEN
6563 RAISE FND_API.g_exc_unexpected_error;
6564 END IF;
6565
6566 x_return_status := FND_API.g_ret_sts_success;
6567
6568 ------------------------- finish -------------------------------
6569 -- Check for commit
6570 IF FND_API.to_boolean(p_commit) THEN
6571 COMMIT;
6572 END IF;
6573
6574 FND_MSG_PUB.count_and_get(
6575 p_encoded => FND_API.g_false,
6576 p_count => x_msg_count,
6577 p_data => x_msg_data
6578 );
6579
6580 IF OZF_DEBUG_HIGH_ON THEN
6581 OZF_Utility_PVT.debug_message(l_full_name ||': end');
6582 END IF;
6583
6584 EXCEPTION
6585 WHEN FND_API.g_exc_error THEN
6586 ROLLBACK TO Create_Group_Line_Util;
6587 x_return_status := FND_API.g_ret_sts_error;
6588 FND_MSG_PUB.count_and_get (
6589 p_encoded => FND_API.g_false
6590 ,p_count => x_msg_count
6591 ,p_data => x_msg_data
6592 );
6593
6594 WHEN FND_API.g_exc_unexpected_error THEN
6595 ROLLBACK TO Create_Group_Line_Util;
6596 x_return_status := FND_API.g_ret_sts_unexp_error ;
6597 FND_MSG_PUB.count_and_get (
6598 p_encoded => FND_API.g_false
6599 ,p_count => x_msg_count
6600 ,p_data => x_msg_data
6601 );
6602
6603 WHEN OTHERS THEN
6604 ROLLBACK TO Create_Group_Line_Util;
6605 x_return_status := FND_API.g_ret_sts_unexp_error ;
6606 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
6607 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
6608 END IF;
6609 FND_MSG_PUB.count_and_get(
6610 p_encoded => FND_API.g_false
6611 ,p_count => x_msg_count
6612 ,p_data => x_msg_data
6613 );
6614
6615 END Create_Group_Line_Util;
6616
6617 ---------------------------------------------------------------------
6618 -- PROCEDURE
6619 -- Update_Group_Line_Util
6620 --
6621 -- HISTORY
6622 -- 10/05/2001 mchang Create.
6623 -- 15-Mar-06 azahmed Bugfix 5101106 issues with scan_unit and quantity
6624 -- 11-Apr-06 azahmed Bugfix 5154157 Do not execute earnings SQL if total amt is to be paid over
6625 -- 05-Aug-06 azahmed R12 ER: Support FXGL in earnings
6626 ---------------------------------------------------------------------
6627 PROCEDURE Update_Group_Line_Util(
6628 p_api_version IN NUMBER
6629 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
6630 ,p_commit IN VARCHAR2 := FND_API.g_false
6631 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
6632
6633 ,x_return_status OUT NOCOPY VARCHAR2
6634 ,x_msg_count OUT NOCOPY NUMBER
6635 ,x_msg_data OUT NOCOPY VARCHAR2
6636
6637 ,p_summary_view IN VARCHAR2 := NULL
6638 ,p_funds_util_flt IN funds_util_flt_type
6639 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
6640 )
6641 IS
6642 l_api_version CONSTANT NUMBER := 1.0;
6643 l_api_name CONSTANT VARCHAR2(30) := 'Update_Group_Line_Util';
6644 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
6645 l_return_status VARCHAR2(1);
6646
6647 l_diff_total_amount NUMBER;
6648
6649 TYPE FundsUtilCsrTyp IS REF CURSOR;
6650 l_funds_util_csr NUMBER; --FundsUtilCsrTyp;
6651 l_funds_util_sql VARCHAR2(3000);
6652 l_fu_amt_rem NUMBER;
6653 l_fu_scan_unit_rem NUMBER;
6654 l_funds_used_units NUMBER;
6655 l_total_amt_rem NUMBER;
6656 l_total_scan_unit_rem NUMBER;
6657 l_counter PLS_INTEGER := 1;
6658 l_new_total_amount NUMBER;
6659 l_cre_total_amount NUMBER;
6660 l_cre_total_units NUMBER;
6661 l_new_total_units NUMBER;
6662 l_new_total_acct_amount NUMBER;
6663 l_funds_util_end VARCHAR2(1) := 'N';
6664 l_error_index NUMBER;
6665 l_line_util_tbl line_util_tbl_type;
6666 l_offer_uom_code VARCHAR2(3);
6667 l_offer_quantity NUMBER;
6668 l_scan_value NUMBER;
6669 l_product_id NUMBER;
6670 l_uom_quantity NUMBER;
6671 l_util_quantity NUMBER;
6672 l_util_uom_code VARCHAR2(3);
6673 l_offer_status VARCHAR2(30);
6674 l_claim_status VARCHAR2(30);
6675 l_user_status_id NUMBER;
6676 l_prorate_earnings_flag VARCHAR2(1);
6677 l_util_id NUMBER;
6678 l_ignore NUMBER;
6679 l_funds_util_flt funds_util_flt_type := p_funds_util_flt;
6680 l_act_budgets_rec ozf_actbudgets_pvt.act_budgets_rec_type;
6681 l_act_util_rec ozf_actbudgets_pvt.act_util_rec_type ;
6682 l_act_budget_id NUMBER;
6683 l_total_pay_over_flag BOOLEAN;
6684 l_original_old_total_amount NUMBER;
6685 l_convert_exchange_rate NUMBER;
6686 l_claim_exc_rate NUMBER;
6687 l_claim_exc_date DATE;
6688 l_claim_exc_type VARCHAR2(30);
6689 l_fu_currency_code VARCHAR2(15);
6690 l_request_header_id NUMBER; --Bugfix : 7717638
6691 l_batch_line_id NUMBER; --Bugfix : 7811671
6692
6693 /* Bug fix */
6694 l_prorate_amount NUMBER :=0 ;
6695 l_total_prorate_amount NUMBER := 0;
6696
6697 TYPE funds_rem_rec_type IS RECORD (
6698 utilization_id NUMBER,
6699 amount_remaining NUMBER,
6700 scan_unit_remaining NUMBER
6701 );
6702 TYPE funds_rem_tbl_type is TABLE OF funds_rem_rec_type
6703 INDEX BY BINARY_INTEGER;
6704 l_funds_rem_tbl funds_rem_tbl_type;
6705
6706 -- fix for bug 5042046
6707 CURSOR csr_function_currency IS
6708 SELECT gs.currency_code
6709 FROM gl_sets_of_books gs
6710 , ozf_sys_parameters org
6711 WHERE org.set_of_books_id = gs.set_of_books_id
6712 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
6713
6714 CURSOR csr_offer_currency(cv_plan_id IN NUMBER) IS
6715 SELECT transaction_currency_code
6716 FROM ozf_offers
6717 WHERE qp_list_header_id = cv_plan_id;
6718
6719 CURSOR csr_offer_profile(cv_activity_product_id IN NUMBER) IS
6720 SELECT uom_code
6721 , quantity
6722 , scan_value
6723 , inventory_item_id
6724 FROM ams_act_products
6725 WHERE activity_product_id = cv_activity_product_id;
6726
6727 CURSOR csr_offer_status(cv_offer_id IN NUMBER) IS
6728 SELECT status_code
6729 FROM ozf_offers
6730 WHERE qp_list_header_id = cv_offer_id;
6731
6732 -- Modified for Bug 4926327: Adjustment Amounts are doubled for scan data
6733 -- Modified for Bug 5101106 quantity = coupon count * offer qty
6734 CURSOR csr_funds_used_units(cv_activity_product_id IN NUMBER) IS
6735 SELECT NVL(SUM(scan_unit * amp.quantity ), 0)
6736 FROM ozf_claim_lines_util lu,
6737 ozf_claims c,
6738 ozf_claim_lines cl,
6739 ams_act_products amp
6740 WHERE lu.activity_product_id = cv_activity_product_id
6741 AND cl.claim_line_id = lu.claim_line_id
6742 AND cl.claim_id = c.claim_id
6743 AND c.status_code <> 'CLOSED'
6744 AND lu.activity_product_id = amp.activity_product_id
6745 AND lu.utilization_id <> -1;
6746
6747 CURSOR csr_activity_product_id(cv_plan_id IN NUMBER, cv_product_id IN NUMBER) IS
6748 SELECT activity_product_id
6749 FROM ozf_funds_utilized_all_b
6750 WHERE plan_type = 'OFFR'
6751 AND org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
6752 AND plan_id = cv_plan_id
6753 AND product_level_type = 'PRODUCT'
6754 AND product_id = cv_product_id;
6755
6756 -- Modified for Bugfix 5404951
6757 --l_source_object_id added for ship - debit / Pranay
6758 CURSOR csr_claim_status(cv_claim_line_id IN NUMBER) IS
6759 SELECT cla.status_code
6760 ,cla.user_status_id
6761 ,cla.source_object_class
6762 ,cla.batch_type
6763 ,cla.currency_code
6764 ,cla.creation_date
6765 ,cla.exchange_rate_type
6766 ,cla.exchange_rate_date
6767 ,cla.exchange_rate
6768 ,cla.source_object_id
6769 ,cln.activity_id --Bugfix 7717638
6770 ,cln.batch_line_id --Bugfix 7811671
6771 FROM ozf_claims cla, ozf_claim_lines cln
6772 WHERE cla.claim_id = cln.claim_id
6773 AND cln.claim_line_id = cv_claim_line_id;
6774
6775 -- Introduced for Bug4348163
6776 l_dummy_counter NUMBER :=1;
6777 l_total_util_counter NUMBER :=1;
6778 l_prorate_adj_amt NUMBER :=0;
6779 l_tot_prorate_adj_amt NUMBER :=0;
6780 l_util_product_id NUMBER;
6781 l_util_product_level_type VARCHAR2(30);
6782 l_prorate_req_flag BOOLEAN;
6783 l_line_util_id NUMBER;
6784 l_line_util_obj_ver NUMBER;
6785 l_adj_util_id NUMBER;
6786 l_new_util_quantity NUMBER;
6787
6788 l_batch_type VARCHAR2(30);
6789 l_source_object_class VARCHAR2(30);
6790 l_claim_date DATE;
6791 l_source_object_id NUMBER;
6792 l_rate NUMBER;
6793
6794 CURSOR csr_funds_util_info(cv_utilization_id IN NUMBER) IS
6795 SELECT product_id, product_level_type, fund_id
6796 FROM ozf_funds_utilized_all_b
6797 WHERE utilization_id = cv_utilization_id;
6798
6799 -- Introduced for Bug4493735
6800 -- Modified for Multi-curr ER: need to use only accruals in claim currency
6801 CURSOR csr_source_fund(cv_offer_id IN NUMBER) IS
6802 SELECT budget_source_id,
6803 APPROVED_ORIGINAL_AMOUNT
6804 FROM ozf_act_budgets
6805 WHERE transfer_type = 'REQUEST'
6806 AND act_budget_used_by_id = cv_offer_id
6807 AND APPROVED_IN_CURRENCY = G_ACCRUAL_CURRENCY;
6808
6809 l_util_fund_id NUMBER;
6810 l_fund_amount NUMBER;
6811
6812 -- Modified for Multi-curr ER: need to use only accruals in claim currency
6813 -- The amount derived is in the fund currency and not in the functional currency
6814 CURSOR csr_source_fund_tot(cv_offer_id IN NUMBER) IS
6815 SELECT SUM(APPROVED_ORIGINAL_AMOUNT)
6816 FROM ozf_act_budgets
6817 WHERE transfer_type = 'REQUEST'
6818 AND act_budget_used_by_id = cv_offer_id
6819 AND APPROVED_IN_CURRENCY = G_ACCRUAL_CURRENCY;
6820
6821 l_fund_tot_amount NUMBER;
6822
6823 l_tot_accrual_amt NUMBER;
6824
6825 l_all_for_payover_flag BOOLEAN := FALSE;
6826
6827 --Added for 5059770
6828 -- Modified for 5191444 - Prorate based on already accrued earnings
6829 -- Modified for Multi-curr ER: Accrue based on amount and not on acctd_amount
6830 CURSOR csr_offer_products(cv_offer_id IN NUMBER, cv_product_id IN NUMBER,
6831 cv_product_level_type IN VARCHAR2, cv_cust_account_id IN NUMBER) IS
6832 SELECT product_level_type,
6833 product_id,
6834 fund_id,
6835 SUM(amount)
6836 FROM ozf_funds_utilized_all_b
6837 WHERE utilization_type = 'ACCRUAL'
6838 AND org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
6839 AND gl_posted_flag = 'Y'
6840 AND plan_type = 'OFFR'
6841 AND plan_id = cv_offer_id
6842 AND cust_account_id = cv_cust_account_id
6843 AND (cv_product_id IS NULL OR product_id = cv_product_id )
6844 AND (cv_product_level_type IS NULL OR product_level_type = cv_product_level_type )
6845 AND currency_code = G_ACCRUAL_CURRENCY
6846 GROUP BY product_level_type,product_id,fund_id;
6847 TYPE NumberTab IS TABLE OF NUMBER;
6848 l_item_id NumberTab;
6849 l_fund_id NumberTab;
6850 l_accrued_amt NumberTab;
6851 TYPE Varchar2Tab IS TABLE OF VARCHAR2(30);
6852 l_level_type Varchar2Tab;
6853
6854 --Following cursor added for ship - debit supplier claims/ Pranay
6855 --Added cv_product_id, cv_request_header_id parameters for bugfix 7717638
6856 --Added cv_batch_line_id for bugfix 7811671
6857 CURSOR csr_sd_accruals ( cv_batch_id IN NUMBER
6858 , cv_product_id IN NUMBER
6859 , cv_request_header_id IN NUMBER
6860 , cv_batch_line_id IN NUMBER
6861 ) IS
6862 SELECT util.utilization_id
6863 , line.batch_curr_claim_amount
6864 , offr.transaction_currency_code
6865 FROM ozf_funds_utilized_all_b util
6866 , ozf_sd_batch_lines_all line
6867 , ozf_offers offr
6868 WHERE util.utilization_id = line.utilization_id
6869 AND util.plan_id = offr.qp_list_header_id
6870 AND line.batch_id = cv_batch_id
6871 AND line.item_id = cv_product_id
6872 AND util.reference_id = cv_request_header_id
6873 AND line.batch_line_id = NVL(cv_batch_line_id,batch_line_id)
6874 AND util.reference_type = 'SD_REQUEST'
6875 AND line.batch_curr_claim_amount <> 0
6876 ORDER BY
6877 sign(batch_curr_claim_amount) ASC
6878 , util.creation_date ASC;
6879 BEGIN
6880 --------------------- initialize -----------------------
6881 SAVEPOINT Update_Group_Line_Util;
6882
6883 IF OZF_DEBUG_HIGH_ON THEN
6884 OZF_Utility_PVT.debug_message(l_full_name||': start');
6885 END IF;
6886
6887 IF FND_API.to_boolean(p_init_msg_list) THEN
6888 FND_MSG_PUB.initialize;
6889 END IF;
6890
6891 IF NOT FND_API.compatible_api_call(
6892 l_api_version,
6893 p_api_version,
6894 l_api_name,
6895 g_pkg_name
6896 ) THEN
6897 RAISE FND_API.g_exc_unexpected_error;
6898 END IF;
6899
6900 OPEN csr_function_currency;
6901 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
6902 CLOSE csr_function_currency;
6903
6904 x_return_status := FND_API.g_ret_sts_success;
6905
6906 ----------------- check claim status ----------------
6907 -- earnings cannot be associated when claim is not open
6908 OPEN csr_claim_status(l_funds_util_flt.claim_line_id);
6909 FETCH csr_claim_status INTO l_claim_status
6910 ,l_user_status_id
6911 , l_source_object_class
6912 , l_batch_type
6913 , G_CLAIM_CURRENCY
6914 ,l_claim_date
6915 ,l_claim_exc_type
6916 ,l_claim_exc_date
6917 ,l_claim_exc_rate
6918 ,l_source_object_id
6919 ,l_request_header_id --Bugfix 7717638
6920 ,l_batch_line_id; --Bugfix 7811671
6921 CLOSE csr_claim_status;
6922
6923 IF OZF_DEBUG_HIGH_ON THEN
6924 OZF_Utility_PVT.debug_message('Claim status: '||l_claim_status||' '||l_user_status_id);
6925 OZF_Utility_PVT.debug_message(l_full_name||'G_CLAIM_CURRENCY '||G_CLAIM_CURRENCY);
6926 END IF;
6927
6928 IF l_claim_status <> 'OPEN' THEN
6929 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6930 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_ASSO_NOT_OPEN');
6931 FND_MSG_PUB.add;
6932 END IF;
6933 RAISE FND_API.g_exc_error;
6934 END IF;
6935
6936
6937 ----------------- copy line info to filter ---------------
6938 IF l_funds_util_flt.claim_line_id IS NOT NULL THEN
6939 Copy_Util_Flt(px_funds_util_flt => l_funds_util_flt);
6940 END IF;
6941
6942
6943 -- Set Accrual Currency Variable
6944 -- In Associate Earnings page when cross utilization is done Accrual Currency
6945 -- will noy be the same as Claim Currency
6946 -- Need to pass l_funds_util_flt.utiz_currency_code for autopay and scan data preferably
6947 -- In Autopay cross utils will take place: Need to support
6948 IF l_funds_util_flt.utiz_currency_code is not null THEN
6949 G_ACCRUAL_CURRENCY := l_funds_util_flt.utiz_currency_code;
6950 ELSE
6951 G_ACCRUAL_CURRENCY := G_CLAIM_CURRENCY;
6952 END IF;
6953
6954 -- Currency Validation
6955 -- Allow association only in same currency as claim currency,
6956 -- or either accrual or claim currency must be in functional currency
6957 IF l_funds_util_flt.utiz_currency_code <> G_FUNCTIONAL_CURRENCY THEN
6958 IF l_funds_util_flt.utiz_currency_code is not null AND l_funds_util_flt.utiz_currency_code <> G_CLAIM_CURRENCY THEN
6959 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
6960 FND_MESSAGE.set_name('OZF', 'OZF_CROSS_CURR_UTILIZATION');
6961 FND_MSG_PUB.add;
6962 END IF;
6963 RAISE FND_API.g_exc_error;
6964 END IF;
6965 END IF;
6966
6967 -- store the amounts in claim currency
6968 l_original_total_amount :=l_funds_util_flt.total_amount;
6969 l_original_old_total_amount := l_funds_util_flt.old_total_amount;
6970 -- Fix for bug 7658894
6971 l_entered_amount := l_funds_util_flt.old_total_amount;
6972
6973 -- If claim currency <> accrual currency then convert claim amount
6974 -- to accrual amount. Proceed with association
6975 -- Before inserting record in clu convert back line util amount to claim currency
6976 -- Added for FXGL R12 Enhancement
6977 IF l_funds_util_flt.utiz_currency_code is not null and G_CLAIM_CURRENCY <> l_funds_util_flt.utiz_currency_code THEN
6978 -- Modified for Bugfix 5528210: Use claim rate for cross Utils
6979 OZF_UTILITY_PVT.Convert_Currency(
6980 p_from_currency => G_CLAIM_CURRENCY
6981 ,p_to_currency => l_funds_util_flt.utiz_currency_code
6982 ,p_conv_type => l_claim_exc_type
6983 ,p_conv_rate => l_claim_exc_rate
6984 ,p_conv_date => l_claim_exc_date
6985 ,p_from_amount => l_funds_util_flt.total_amount
6986 ,x_return_status => l_return_status
6987 ,x_to_amount => l_new_total_amount
6988 ,x_rate => l_convert_exchange_rate
6989 );
6990 IF l_return_status = FND_API.g_ret_sts_error THEN
6991 RAISE FND_API.g_exc_error;
6992 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
6993 RAISE FND_API.g_exc_unexpected_error;
6994 END IF;
6995
6996 IF l_funds_util_flt.old_total_amount is not null and l_funds_util_flt.old_total_amount <> 0 THEN
6997 OZF_UTILITY_PVT.Convert_Currency(
6998 p_from_currency => G_CLAIM_CURRENCY
6999 ,p_to_currency => l_funds_util_flt.utiz_currency_code
7000 ,p_conv_type => l_claim_exc_type
7001 ,p_conv_rate => l_claim_exc_rate
7002 ,p_conv_date => l_claim_exc_date
7003 ,p_from_amount => l_original_old_total_amount
7004 ,x_return_status => l_return_status
7005 ,x_to_amount => l_funds_util_flt.old_total_amount
7006 ,x_rate => l_convert_exchange_rate
7007 );
7008 END IF;
7009 IF l_return_status = FND_API.g_ret_sts_error THEN
7010 RAISE FND_API.g_exc_error;
7011 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
7012 RAISE FND_API.g_exc_unexpected_error;
7013 END IF;
7014 ELSE
7015 -- l_funds_util_flt.total_amount is in claim currency and not in functional currency
7016 l_new_total_amount := l_funds_util_flt.total_amount;
7017 END IF;
7018 ----------------- Scan Data conversions ----------------
7019 -- For Scan Data, convert quantity and uom to units and
7020 -- units to amount
7021
7022 -- Disallow change in UOM if updating validation done in UI
7023
7024 l_util_quantity := l_funds_util_flt.quantity;
7025 l_util_uom_code := l_funds_util_flt.uom_code;
7026 l_cre_total_units := l_funds_util_flt.total_units;
7027
7028 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7029 -- derive activity_product_id from offer and product
7030 IF l_funds_util_flt.activity_product_id IS NULL THEN
7031 OPEN csr_activity_product_id(l_funds_util_flt.activity_id, l_funds_util_flt.product_id);
7032 FETCH csr_activity_product_id INTO l_funds_util_flt.activity_product_id;
7033 CLOSE csr_activity_product_id;
7034 END IF;
7035
7036 OPEN csr_offer_profile(l_funds_util_flt.activity_product_id);
7037 FETCH csr_offer_profile INTO l_offer_uom_code
7038 , l_offer_quantity
7039 , l_scan_value
7040 , l_product_id;
7041 CLOSE csr_offer_profile;
7042
7043 -- calculate total units for given amount
7044 -- modified for Bugfix 5101106
7045 -- if only qty is entered then uom code is defaulted as offer uom code and units are calculated
7046 -- if only units are entered then uom code = offer code and qty is calculated
7047 -- this will work only if accrual curr and offer currency are the same
7048 IF l_cre_total_units IS NULL THEN
7049 l_cre_total_units := l_funds_util_flt.total_amount / l_scan_value;
7050 END IF;
7051
7052 IF l_funds_util_flt.quantity IS NOT NULL
7053 THEN
7054 IF l_funds_util_flt.uom_code IS NULL THEN
7055 l_util_uom_code := l_offer_uom_code;
7056 END IF;
7057
7058 IF l_funds_util_flt.uom_code <> l_offer_uom_code THEN
7059 l_util_quantity := inv_convert.inv_um_convert(
7060 item_id => l_product_id
7061 ,precision => 2
7062 ,from_quantity => l_funds_util_flt.quantity
7063 ,from_unit => l_funds_util_flt.uom_code
7064 ,to_unit => l_offer_uom_code
7065 ,from_name => NULL
7066 ,to_name => NULL
7067 );
7068 IF l_util_quantity = -99999 THEN
7069 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7070 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_CONVERT_UOM');
7071 FND_MSG_PUB.add;
7072 END IF;
7073 RAISE FND_API.g_exc_error;
7074 END IF;
7075 ELSE
7076 l_util_quantity := l_funds_util_flt.quantity;
7077 END IF;
7078 l_cre_total_units := l_util_quantity / l_offer_quantity;
7079
7080 ELSIF l_cre_total_units IS NOT NULL THEN
7081 IF l_funds_util_flt.uom_code IS NULL THEN
7082 l_util_uom_code := l_offer_uom_code;
7083 END IF;
7084
7085 IF l_funds_util_flt.uom_code <> l_offer_uom_code THEN
7086 l_util_quantity := inv_convert.inv_um_convert(
7087 item_id => l_product_id
7088 ,precision => 2
7089 ,from_quantity => l_cre_total_units * l_offer_quantity
7090 ,from_unit => l_offer_uom_code
7091 ,to_unit => l_funds_util_flt.uom_code
7092 ,from_name => NULL
7093 ,to_name => NULL
7094 );
7095 IF l_util_quantity = -99999 THEN
7096 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7097 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CANT_CONVERT_UOM');
7098 FND_MSG_PUB.add;
7099 END IF;
7100 RAISE FND_API.g_exc_error;
7101 END IF;
7102 ELSE
7103 l_util_quantity := l_cre_total_units * l_offer_quantity;
7104 END IF;
7105
7106 ELSE
7107 RETURN; --Not enough data calculate
7108 END IF;
7109
7110 -- Condition added for Bugfix 5404951
7111 -- In IDSM SSD Batch we must not recalculate the amount entered in claim line.
7112 -- SSD Batch will be called only once and not for update scenario
7113 --Ship - Debit Enhancements / Modified by Pranay
7114 --IF l_batch_type = 'BATCH' and l_source_object_class = 'SPECIAL_PRICE' THEN
7115 IF (l_batch_type = 'BATCH' and l_source_object_class = 'SPECIAL_PRICE') OR
7116 (l_batch_type = 'SD_BATCH' and l_source_object_class = 'SD_SUPPLIER') THEN
7117 l_new_total_amount := l_new_total_amount; -- do not recalculate
7118 ELSE
7119 l_new_total_amount := l_cre_total_units * l_scan_value; --recalculate amount bases on units
7120 END IF;
7121
7122 OPEN csr_offer_currency(l_funds_util_flt.activity_id);
7123 FETCH csr_offer_currency INTO G_OFFER_CURRENCY;
7124 CLOSE csr_offer_currency;
7125
7126 -- Amount field needs to be calculated in claim currency
7127 IF G_OFFER_CURRENCY <> G_CLAIM_CURRENCY THEN
7128 OZF_UTILITY_PVT.Convert_Currency(
7129 p_from_currency => G_OFFER_CURRENCY
7130 ,p_to_currency => G_CLAIM_CURRENCY
7131 ,p_conv_type => l_claim_exc_type
7132 ,p_conv_date => SYSDATE
7133 ,p_from_amount => l_new_total_amount
7134 ,x_return_status => l_return_status
7135 ,x_to_amount => l_new_total_acct_amount
7136 ,x_rate => l_rate
7137 );
7138 IF l_return_status = FND_API.g_ret_sts_error THEN
7139 RAISE FND_API.g_exc_error;
7140 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
7141 RAISE FND_API.g_exc_unexpected_error;
7142 END IF;
7143 IF l_new_total_acct_amount IS NOT NULL THEN
7144 l_new_total_amount := OZF_UTILITY_PVT.CurrRound(l_new_total_acct_amount, G_CLAIM_CURRENCY);
7145 END IF;
7146 END IF;
7147 l_funds_util_flt.total_amount := l_new_total_amount;
7148 l_funds_util_flt.uom_code := l_util_uom_code;
7149 l_funds_util_flt.quantity := l_util_quantity;
7150 l_funds_util_flt.total_units := l_cre_total_units;
7151 END IF;
7152
7153 --------------------- start -----------------------
7154 -- amounts are rounded to precision of claim currency
7155 l_diff_total_amount := NVL(ABS(l_new_total_amount), 0) - NVL(ABS(l_funds_util_flt.old_total_amount) ,0);
7156 l_diff_total_amount := OZF_UTILITY_PVT.CurrRound(l_diff_total_amount, G_ACCRUAL_CURRENCY);
7157
7158
7159 ------ update scan data quantity and uom for old line utils --------
7160 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7161
7162 -- check offer status; do not allow update when offer is completed
7163 IF l_diff_total_amount <> 0 THEN
7164 OPEN csr_offer_status(l_funds_util_flt.activity_id);
7165 FETCH csr_offer_status INTO l_offer_status;
7166 CLOSE csr_offer_status;
7167
7168 IF l_offer_status = 'COMPLETED' THEN
7169 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7170 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_ASSO_COMPLETE_OFFER');
7171 FND_MSG_PUB.add;
7172 END IF;
7173 RAISE FND_API.g_exc_error;
7174 END IF;
7175 END IF;
7176 END IF;
7177
7178 Get_Prorate_Earnings_Flag(
7179 p_funds_util_flt => l_funds_util_flt
7180 ,x_prorate_earnings_flag => l_prorate_earnings_flag
7181 );
7182
7183 -- Bug4348163: If prorate flag is checked, then we need to delete and
7184 -- recreate the line utils for following reasons:
7185 -- 1. Adjustment record if already created needs to be pro-rated.
7186 -- 2. Accrual utils themselves need proration
7187
7188 IF l_funds_util_flt.offer_type = 'SCAN_DATA'
7189 OR NVL(l_prorate_earnings_flag,'F') = 'F'
7190 OR NVL(l_funds_util_flt.old_total_amount ,0) =0 THEN
7191 l_prorate_req_flag := false;
7192 ELSE
7193 l_prorate_req_flag := true;
7194 END IF;
7195
7196 ---------------- start associate earnings -------------------
7197 IF l_diff_total_amount < 0 AND NOT (l_prorate_req_flag) THEN
7198 ---------- 1.Reduce Group Line Utils -------------------
7199 -- amounts might be in utiz_currency
7200 -- need to pass them in claim currency(hence revert)
7201 IF l_funds_util_flt.offer_type <> 'SCAN_DATA' THEN
7202 l_funds_util_flt.total_amount := l_original_total_amount;
7203 l_funds_util_flt.old_total_amount := l_original_old_total_amount;
7204 END IF;
7205
7206 Delete_Group_Line_Util(
7207 p_api_version => l_api_version
7208 ,p_init_msg_list => FND_API.g_false
7209 ,p_commit => FND_API.g_false
7210 ,p_validation_level => p_validation_level
7211 ,x_return_status => l_return_status
7212 ,x_msg_data => x_msg_data
7213 ,x_msg_count => x_msg_count
7214 ,p_funds_util_flt => l_funds_util_flt
7215 );
7216 IF l_return_status = fnd_api.g_ret_sts_error THEN
7217 RAISE FND_API.g_exc_error;
7218 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7219 RAISE FND_API.g_exc_unexpected_error;
7220 END IF;
7221 ELSIF ( l_diff_total_amount > 0 ) OR
7222 ( l_diff_total_amount <= 0 AND l_prorate_req_flag )
7223 THEN
7224
7225 IF l_prorate_req_flag THEN
7226 ---------- 1. Delete All Line Utils -------------------
7227 Delete_All_Line_Util(
7228 p_api_version => l_api_version
7229 ,p_init_msg_list => FND_API.g_false
7230 ,p_commit => FND_API.g_false
7231 ,p_validation_level => p_validation_level
7232 ,x_return_status => l_return_status
7233 ,x_msg_data => x_msg_data
7234 ,x_msg_count => x_msg_count
7235 ,p_funds_util_flt => l_funds_util_flt
7236 );
7237 IF l_return_status = FND_API.g_ret_sts_error THEN
7238 RAISE FND_API.g_exc_error;
7239 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
7240 RAISE FND_API.g_exc_error;
7241 END IF;
7242
7243 -- Recreate utils for the entire amount
7244 l_cre_total_amount := NVL(l_new_total_amount, 0);
7245 l_cre_total_amount := OZF_UTILITY_PVT.CurrRound(l_cre_total_amount, G_ACCRUAL_CURRENCY);
7246
7247 ELSE
7248 -- Create utils for the difference amount
7249 l_cre_total_amount := NVL(l_new_total_amount, 0) - NVL(l_funds_util_flt.old_total_amount ,0);
7250 l_cre_total_amount := OZF_UTILITY_PVT.CurrRound(l_cre_total_amount, G_ACCRUAL_CURRENCY);
7251 -- Bugfix 5101106: Recalculate qty and coupon count
7252 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7253 l_new_total_units := NVL(l_cre_total_units, 0) - NVL(l_funds_util_flt.old_total_units, 0);
7254 IF l_funds_util_flt.uom_code <> l_offer_uom_code THEN
7255 l_util_quantity := inv_convert.inv_um_convert(
7256 item_id => l_product_id
7257 ,precision => 2
7258 ,from_quantity => l_new_total_units * l_offer_quantity
7259 ,from_unit => l_offer_uom_code
7260 ,to_unit => l_funds_util_flt.uom_code
7261 ,from_name => NULL
7262 ,to_name => NULL
7263 );
7264 ELSE
7265 l_util_quantity := l_new_total_units * l_offer_quantity;
7266 END IF;
7267 END IF;
7268 END IF;
7269
7270 ------------ 2. CREATE Group Line Utils -----------------
7271 l_total_amt_rem := 0.0;
7272 l_total_scan_unit_rem := 0.0;
7273
7274 IF OZF_DEBUG_HIGH_ON THEN
7275 OZF_Utility_PVT.debug_message('l_source_object_class = '||l_source_object_class);
7276 OZF_Utility_PVT.debug_message('l_source_object_id = '||l_source_object_id);
7277 OZF_Utility_PVT.debug_message('l_funds_util_flt.product_id = '||l_funds_util_flt.product_id);
7278 OZF_Utility_PVT.debug_message('l_request_header_id = '||l_request_header_id);
7279 IF l_funds_util_flt.pay_over_all_flag THEN
7280 OZF_Utility_PVT.debug_message('l_total_pay_over_flag = TRUE');
7281 ELSE
7282 OZF_Utility_PVT.debug_message('l_total_pay_over_flag = FALSE');
7283 END IF;
7284 END IF;
7285
7286 --Associate Earnings for Ship-Debit Suppliers / Pranay
7287 IF NVL(l_source_object_class,'X') = 'SD_SUPPLIER' THEN
7288 OPEN csr_sd_accruals(l_source_object_id
7289 ,l_funds_util_flt.product_id
7290 ,l_request_header_id
7291 ,l_batch_line_id
7292 );
7293 LOOP
7294 FETCH csr_sd_accruals INTO l_util_id,l_fu_amt_rem,l_fu_currency_code;
7295 EXIT WHEN csr_sd_accruals%NOTFOUND;
7296 l_line_util_tbl(l_counter).utilization_id := l_util_id;
7297 l_line_util_tbl(l_counter).amount := l_fu_amt_rem;
7298 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7299 l_line_util_tbl(l_counter).activity_product_id := l_funds_util_flt.activity_product_id;
7300 l_line_util_tbl(l_counter).uom_code := l_util_uom_code;
7301 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7302 l_counter := l_counter + 1;
7303 END LOOP;
7304 CLOSE csr_sd_accruals;
7305 GOTO create_line_util;
7306 END IF;
7307
7308 --Bugfix 5144750 Do not call earnings SQL if total amount is to be paid over
7309 -- Get_Utiz_Statement will retrieve sum(amount_rem)
7310 -- and only for accruals in claim currency
7311 l_total_pay_over_flag := l_funds_util_flt.pay_over_all_flag;
7312 IF l_total_pay_over_flag IS NULL OR l_total_pay_over_flag = FALSE THEN
7313 Get_Utiz_Sql_Stmt(
7314 p_api_version => 1.0
7315 ,p_init_msg_list => FND_API.g_false
7316 ,p_commit => FND_API.g_false
7317 ,p_validation_level => FND_API.g_valid_level_full
7318 ,x_return_status => l_return_status
7319 ,x_msg_count => x_msg_count
7320 ,x_msg_data => x_msg_data
7321 ,p_summary_view => p_summary_view
7322 ,p_funds_util_flt => l_funds_util_flt
7323 ,p_cust_account_id => l_funds_util_flt.cust_account_id
7324 ,x_utiz_sql_stmt => l_funds_util_sql
7325 );
7326 IF l_return_status = FND_API.g_ret_sts_error THEN
7327 RAISE FND_API.g_exc_error;
7328 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
7329 RAISE FND_API.g_exc_error;
7330 END IF;
7331
7332 -- use FND_DSQL package for dynamic sql and bind variables
7333 l_funds_util_csr := DBMS_SQL.open_cursor;
7334 FND_DSQL.set_cursor(l_funds_util_csr);
7335 DBMS_SQL.parse(l_funds_util_csr, l_funds_util_sql, DBMS_SQL.native);
7336 DBMS_SQL.define_column(l_funds_util_csr, 1, l_util_id);
7337 DBMS_SQL.define_column(l_funds_util_csr, 2, l_fu_amt_rem);
7338 DBMS_SQL.define_column(l_funds_util_csr, 3, l_fu_scan_unit_rem);
7339 DBMS_SQL.define_column(l_funds_util_csr, 4, l_fu_currency_code, 15);
7340 FND_DSQL.do_binds;
7341
7342 l_ignore := DBMS_SQL.execute(l_funds_util_csr);
7343 --OPEN l_funds_util_csr FOR l_funds_util_sql;
7344 LOOP
7345 IF DBMS_SQL.fetch_rows(l_funds_util_csr) > 0 THEN
7346 DBMS_SQL.column_value(l_funds_util_csr, 1, l_util_id);
7347 DBMS_SQL.column_value(l_funds_util_csr, 2, l_fu_amt_rem);
7348 DBMS_SQL.column_value(l_funds_util_csr, 3, l_fu_scan_unit_rem);
7349 DBMS_SQL.column_value(l_funds_util_csr, 4, l_fu_currency_code);
7350
7351 OPEN csr_funds_used_units(l_funds_util_flt.activity_product_id);
7352 FETCH csr_funds_used_units INTO l_funds_used_units;
7353 CLOSE csr_funds_used_units;
7354
7355 l_funds_rem_tbl(l_counter).utilization_id := l_util_id;
7356 l_funds_rem_tbl(l_counter).amount_remaining := l_fu_amt_rem;
7357 l_funds_rem_tbl(l_counter).scan_unit_remaining := l_fu_scan_unit_rem - l_funds_used_units;
7358
7359 l_total_amt_rem := l_total_amt_rem +
7360 l_funds_rem_tbl(l_counter).amount_remaining;
7361 l_total_scan_unit_rem := l_total_scan_unit_rem +
7362 l_funds_rem_tbl(l_counter).scan_unit_remaining;
7363
7364 l_counter := l_counter + 1;
7365 ELSE
7366 EXIT;
7367 END IF;
7368 END LOOP;
7369 DBMS_SQL.close_cursor(l_funds_util_csr);
7370 END IF ; -- if pay_over_all flag = 'FALSE'
7371
7372 IF OZF_DEBUG_HIGH_ON THEN
7373 OZF_Utility_PVT.debug_message(l_full_name||': new associated amount '||l_cre_total_amount);
7374 OZF_Utility_PVT.debug_message(l_full_name||': available amount '||l_total_amt_rem);
7375 END IF;
7376
7377 -- Fix for Bug 7632911
7378 -- l_cre_total_amount => Budget Currency
7379 -- l_total_amt_rem => Budget Currency
7380
7381 -- bug 8198443(brach line fix for 7676521)
7382 -- bypass validation if it's batch flow
7383 IF l_batch_type = 'BATCH' THEN
7384 NULL;
7385 ELSE
7386 IF (l_cre_total_amount < 0 and l_total_amt_rem >0)
7387 THEN
7388 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7389 FND_MESSAGE.set_name('OZF', 'OZF_ASSO_NEG_AMT');
7390 FND_MSG_PUB.add;
7391 END IF;
7392 RAISE FND_API.g_exc_error;
7393 END IF;
7394 END IF;
7395
7396 --Condition modified for bugfix : 6042226.
7397 IF ( l_total_amt_rem >= 0 AND
7398 l_cre_total_amount > l_total_amt_rem
7399 ) OR
7400 ( l_total_amt_rem < 0 AND
7401 l_cre_total_amount < l_total_amt_rem
7402 )
7403 THEN
7404 -- IF l_cre_total_amount > l_total_amt_rem THEN
7405 Validate_Over_Utilization(
7406 p_api_version => l_api_version
7407 ,p_init_msg_list => FND_API.g_false
7408 ,p_validation_level => p_validation_level
7409 ,x_return_status => l_return_status
7410 ,x_msg_count => x_msg_count
7411 ,x_msg_data => x_msg_data
7412 ,p_funds_util_flt => l_funds_util_flt
7413 );
7414 IF l_return_status = fnd_api.g_ret_sts_error THEN
7415 RAISE FND_API.g_exc_error;
7416 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7417 RAISE FND_API.g_exc_unexpected_error;
7418 END IF;
7419
7420 IF l_total_amt_rem = 0 THEN
7421 /* When amount remaining is 0, offer must be able to create accruals */
7422 IF l_funds_util_flt.offer_type IS NULL OR
7423 l_funds_util_flt.offer_type NOT IN ('ACCRUAL','DEAL','LUMPSUM','NET_ACCRUAL','VOLUME_OFFER', 'SCAN_DATA')
7424 THEN
7425 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7426 FND_MESSAGE.set_name('OZF', 'OZF_EARN_AVAIL_AMT_ZERO');
7427 FND_MSG_PUB.add;
7428 END IF;
7429 RAISE FND_API.g_exc_error;
7430 END IF;
7431 END IF;
7432 END IF;
7433
7434 ----------------------------------------------------
7435 -- IF l_total_acctd_amt_rem > 0 AND l_cre_total_amount > 0 THEN
7436 -- Accruals are being paid. Avail Accrual Amt will decrease.
7437 -- If associated amt > avail accrual amt, then the excess will
7438 -- be used to pay over earnings
7439 -- ELSIF l_total_acctd_amt_rem < 0 AND l_cre_total_amount > 0 THEN
7440 -- Amount associated is used entirely to pay over earnings
7441 -- ELSIF l_total_acctd_amt_rem < 0 AND l_cre_total_amount < 0 THEN
7442 -- Amount associated is used to earn back over utils (or
7443 -- this is a distributor tracking accruals to claim from manufacturer)
7444 -- if l_cre_total_amount < l_total_acctd_amt_rem, then invalid
7445 -- Error is thrown in UI
7446 -- ELSIF l_total_acctd_amt_rem > 0 AND l_cre_total_amount > 0 THEN
7447 -- Not a valid scenario. Error is thrown from UI
7448 -- See Bug4929318 for examples
7449 ----------------------------------------------------
7450
7451 --- Condition modified for Bug4953092
7452 -- Condition modified for Bugfix 5154157
7453 IF l_total_pay_over_flag = TRUE THEN
7454 l_all_for_payover_flag := TRUE;
7455 END IF;
7456
7457
7458 IF l_funds_rem_tbl.COUNT <> 0 AND NOT l_all_for_payover_flag THEN
7459 IF l_funds_rem_tbl.COUNT > 1 AND l_prorate_earnings_flag = 'T'
7460 AND ABS(l_cre_total_amount) <= ABS(l_total_amt_rem)
7461 THEN
7462 l_counter := l_funds_rem_tbl.FIRST;
7463 IF OZF_DEBUG_LOW_ON THEN
7464 OZF_Utility_PVT.debug_message(' Prorate Among selected utilization Lines ');
7465 END IF;
7466 LOOP
7467 l_line_util_tbl(l_counter).utilization_id := l_funds_rem_tbl(l_counter).utilization_id;
7468 -- Bug Fix 4173273 : Check for the last record and if the l_cre_total_amount is less adjust the last line
7469 IF (l_counter = l_funds_rem_tbl.LAST) THEN
7470 l_prorate_amount := l_funds_rem_tbl(l_counter).amount_remaining * (l_cre_total_amount / l_total_amt_rem);
7471 l_prorate_amount := OZF_UTILITY_PVT.CurrRound(l_prorate_amount,G_ACCRUAL_CURRENCY);
7472 -- modified the condition to <> to account for either less or greater condition
7473 IF (l_total_prorate_amount + l_prorate_amount) <> l_cre_total_amount THEN
7474 l_prorate_amount := l_cre_total_amount - l_total_prorate_amount;
7475 END IF;
7476 l_line_util_tbl(l_counter).amount := l_prorate_amount;
7477 ELSE
7478 l_prorate_amount := l_funds_rem_tbl(l_counter).amount_remaining * (l_cre_total_amount / l_total_amt_rem);
7479 l_line_util_tbl(l_counter).amount := OZF_UTILITY_PVT.CurrRound(l_prorate_amount, G_ACCRUAL_CURRENCY);
7480 END IF;
7481 l_total_prorate_amount := l_total_prorate_amount + l_line_util_tbl(l_counter).amount;
7482
7483
7484 IF OZF_DEBUG_LOW_ON THEN
7485 OZF_Utility_PVT.debug_message(': amt remaining '||l_funds_rem_tbl(l_counter).amount_remaining);
7486 OZF_Utility_PVT.debug_message(': amount '||l_line_util_tbl(l_counter).amount);
7487 OZF_Utility_PVT.debug_message(l_full_name||'l_prorate_amount '||l_prorate_amount);
7488 OZF_Utility_PVT.debug_message(l_full_name||'l_total_prorate_amount '||l_total_prorate_amount);
7489 END IF;
7490 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7491 l_line_util_tbl(l_counter).activity_product_id := l_funds_util_flt.activity_product_id;
7492 l_line_util_tbl(l_counter).uom_code := l_util_uom_code;
7493 l_line_util_tbl(l_counter).quantity := l_util_quantity;
7494 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7495 EXIT WHEN l_counter = l_funds_rem_tbl.LAST;
7496 l_counter := l_funds_rem_tbl.NEXT(l_counter);
7497 END LOOP;
7498 l_cre_total_amount := 0;
7499 ----------------------------------------------------
7500 -- Associate Earnings on first-in-first-out basis --
7501 ----------------------------------------------------
7502 ELSIF l_funds_rem_tbl.FIRST IS NOT NULL THEN
7503 l_counter := l_funds_rem_tbl.FIRST;
7504 LOOP
7505 l_line_util_tbl(l_counter).utilization_id := l_funds_rem_tbl(l_counter).utilization_id;
7506 -- bug fix 4406491
7507 l_fu_amt_rem := l_funds_rem_tbl(l_counter).amount_remaining;
7508
7509 IF OZF_DEBUG_LOW_ON THEN
7510 ozf_utility_pvt.debug_message('l_cre_total_amount'||l_cre_total_amount);
7511 ozf_utility_pvt.debug_message('l_fu_amt_rem'||l_fu_amt_rem);
7512 ozf_utility_pvt.debug_message('l_util_quantity ='||l_util_quantity);
7513 ozf_utility_pvt.debug_message('l_new_total_units ='||l_new_total_units);
7514 ozf_utility_pvt.debug_message('fu.util_id ='||l_line_util_tbl(l_counter).utilization_id);
7515 END IF;
7516 -- end of fix
7517 IF (l_cre_total_amount < 0 AND l_fu_amt_rem < 0
7518 AND l_cre_total_amount > l_fu_amt_rem) OR
7519 (l_cre_total_amount > 0 AND l_fu_amt_rem > 0
7520 AND l_cre_total_amount < l_fu_amt_rem) THEN
7521 l_line_util_tbl(l_counter).amount := l_cre_total_amount;
7522 l_cre_total_amount := 0;
7523
7524 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7525 l_line_util_tbl(l_counter).scan_unit := l_new_total_units;
7526 l_line_util_tbl(l_counter).quantity := l_util_quantity;
7527 l_new_total_units := 0;
7528 END IF;
7529 l_funds_util_end := 'Y';
7530 ELSE
7531 l_line_util_tbl(l_counter).amount := l_funds_rem_tbl(l_counter).amount_remaining;
7532
7533 --8198443 (branch line fix for 7676521)
7534 IF (l_batch_type = 'BATCH' AND l_source_object_class = 'SPECIAL_PRICE' AND l_funds_util_flt.offer_type = 'SCAN_DATA') THEN
7535 l_line_util_tbl(l_counter).amount := l_cre_total_amount;
7536 END IF;
7537 --end of 8198443
7538
7539 -- Bug4485381: Add up the amount spent on backing out accruals separately
7540 IF SIGN(l_cre_total_amount) = SIGN(l_funds_rem_tbl(l_counter).amount_remaining) THEN
7541 l_tot_accrual_amt := NVL(l_tot_accrual_amt,0) + l_funds_rem_tbl(l_counter).amount_remaining ;
7542 END IF;
7543
7544 l_cre_total_amount := l_cre_total_amount - l_funds_rem_tbl(l_counter).amount_remaining;
7545
7546 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7547 -- Bugfix 4448859: Recalculate qty and coupon count
7548 -- az? will not work if accrual curr and offer curr are different
7549 -- need to modify
7550 l_line_util_tbl(l_counter).scan_unit := l_line_util_tbl(l_counter).amount / l_scan_value ;
7551 l_new_util_quantity := l_line_util_tbl(l_counter).scan_unit * l_offer_quantity;
7552 IF l_offer_uom_code <> l_util_uom_code THEN
7553 l_new_util_quantity := inv_convert.inv_um_convert(
7554 item_id => l_product_id
7555 ,precision => 2
7556 ,from_quantity => l_new_util_quantity
7557 ,from_unit => l_offer_uom_code
7558 ,to_unit => l_util_uom_code
7559 ,from_name => NULL
7560 ,to_name => NULL
7561 );
7562 END IF;
7563 l_line_util_tbl(l_counter).quantity := l_new_util_quantity;
7564
7565 l_util_quantity := l_util_quantity - l_new_util_quantity ;
7566 l_new_total_units := l_new_total_units - l_line_util_tbl(l_counter).scan_unit;
7567 END IF;
7568 END IF;
7569
7570 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7571 l_line_util_tbl(l_counter).activity_product_id := l_funds_util_flt.activity_product_id;
7572 l_line_util_tbl(l_counter).uom_code := l_util_uom_code;
7573 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7574
7575 EXIT WHEN l_cre_total_amount = 0;
7576 EXIT WHEN l_funds_util_end = 'Y';
7577 EXIT WHEN l_counter = l_funds_rem_tbl.LAST;
7578 l_counter := l_funds_rem_tbl.NEXT(l_counter);
7579 END LOOP;
7580 END IF;
7581 -- Pro-rate or FIFO basi
7582 END IF;
7583 -- l_all_for_payover_flag = ?
7584
7585
7586 ----------------- Over-Utilization -----------------------
7587 IF l_cre_total_amount > 0 THEN
7588 IF OZF_DEBUG_LOW_ON THEN
7589 OZF_Utility_PVT.debug_message(' Over Utilization ');
7590 ozf_utility_pvt.debug_message('l_cre_total_amount ='||l_cre_total_amount);
7591 ozf_utility_pvt.debug_message('l_new_total_units ='||l_new_total_units);
7592 ozf_utility_pvt.debug_message('l_util_quantity ='||l_util_quantity);
7593 END IF;
7594 IF l_funds_util_flt.offer_type = 'SCAN_DATA' THEN
7595 -- create dummy utilization
7596 -- The actual adjustments in funds util is created post approval
7597 -- The adjustments store the product information unlike the
7598 -- adjustments for non scan data offers which store product information
7599 -- only if prorate flag is checked.
7600 l_counter := l_counter + 1;
7601 l_line_util_tbl(l_counter).utilization_id := -1; -- -1 for scan data
7602 l_line_util_tbl(l_counter).amount := l_cre_total_amount;
7603 l_line_util_tbl(l_counter).scan_unit := l_new_total_units;
7604 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7605 l_line_util_tbl(l_counter).activity_product_id := l_funds_util_flt.activity_product_id;
7606 l_line_util_tbl(l_counter).uom_code := l_util_uom_code;
7607 l_line_util_tbl(l_counter).quantity := l_util_quantity;
7608 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7609 ELSE
7610 -- create fund adjustments for non scan data offers
7611
7612 -- Bug4348163: Adjustments should also be pro-rated if pro-rate flag is checked.
7613 -- If accruals are being backed out, prorate based on the line utils created.
7614 -- Bug5059770 + Bug5191444
7615 -- If entire amount is to be paid over earnings, then prorate the adjustment
7616 -- based on past accruals.
7617
7618 -- Bug4493735: There must be as many adj records as the no of source budgets
7619 -- If prorating, then the adjustment gets prorated over past accruals and
7620 -- consequently across budgets
7621 -- When not prorating the adjustment, the budget information should
7622 -- be fetched from the request records.
7623
7624
7625 IF l_prorate_earnings_flag = 'T' THEN
7626
7627 IF l_line_util_tbl.COUNT >= 1 THEN
7628 l_dummy_counter := l_line_util_tbl.FIRST;
7629 l_total_util_counter := l_line_util_tbl.LAST;
7630 IF OZF_DEBUG_LOW_ON THEN
7631 OZF_Utility_PVT.debug_message(' Prorating Adjustment Based on Accrual Information ');
7632 END IF;
7633
7634 LOOP
7635
7636 IF SIGN(l_line_util_tbl(l_dummy_counter).amount) <> SIGN(l_cre_total_amount) THEN
7637 -- This is an already backed out adjustment line continue
7638 NULL;
7639 ELSE
7640
7641 -- 1. Calculate the prorated amount
7642 l_prorate_adj_amt := l_line_util_tbl(l_dummy_counter).amount
7643 * (l_cre_total_amount / l_tot_accrual_amt);
7644 l_prorate_adj_amt := OZF_UTILITY_PVT.CurrRound(l_prorate_adj_amt, G_ACCRUAL_CURRENCY);
7645
7646 l_tot_prorate_adj_amt := NVL(l_tot_prorate_adj_amt,0) + l_prorate_adj_amt ;
7647
7648 --2. Get the product and budget information from the funds util line
7649 OPEN csr_funds_util_info(l_line_util_tbl(l_dummy_counter).utilization_id);
7650 FETCH csr_funds_util_info INTO l_util_product_id, l_util_product_level_type, l_util_fund_id;
7651 CLOSE csr_funds_util_info;
7652
7653 IF OZF_DEBUG_LOW_ON THEN
7654 ozf_utility_pvt.debug_message('l_prorate_adj_amt='||l_prorate_adj_amt);
7655 ozf_utility_pvt.debug_message('l_l_line_util_tbl.amount='||l_line_util_tbl(l_dummy_counter).amount);
7656 ozf_utility_pvt.debug_message('l_tot_prorate_adj_amt='||l_tot_prorate_adj_amt);
7657 END IF;
7658
7659 --3. Call function to check if the adjustment line is already created per product and budget (create if required)
7660 -- Must create adjustment record in fund currency
7661 Create_Fund_Adjustment(
7662 p_offer_id => l_funds_util_flt.activity_id
7663 ,p_cust_account_id => l_funds_util_flt.cust_account_id
7664 ,p_product_id => l_util_product_id
7665 ,p_product_level_type => l_util_product_level_type
7666 ,p_fund_id => l_util_fund_id
7667 ,p_reference_type => l_funds_util_flt.reference_type
7668 ,p_reference_id => l_funds_util_flt.reference_id
7669 ,x_return_status => l_return_status
7670 ,x_msg_count => x_msg_count
7671 ,x_msg_data => x_msg_data
7672 ,x_adj_util_id => l_adj_util_id
7673 );
7674 IF l_return_status = fnd_api.g_ret_sts_error THEN
7675 RAISE FND_API.g_exc_error;
7676 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7677 RAISE FND_API.g_exc_unexpected_error;
7678 END IF;
7679
7680 l_counter := l_counter + 1;
7681 l_line_util_tbl(l_counter).amount := l_prorate_adj_amt;
7682 l_line_util_tbl(l_counter).utilization_id := l_adj_util_id;
7683 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7684 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7685
7686 END IF;
7687 EXIT WHEN l_dummy_counter = l_total_util_counter;
7688 l_dummy_counter := l_dummy_counter + 1;
7689 END LOOP;
7690
7691 --4. Last record needs rounding
7692 IF l_tot_prorate_adj_amt <> l_cre_total_amount THEN
7693 l_line_util_tbl(l_counter).amount := l_line_util_tbl(l_counter).amount +
7694 (l_cre_total_amount - l_tot_prorate_adj_amt);
7695 END IF;
7696
7697 ELSE
7698 -- Condition to resolve Bug4941131 and Bug4927201
7699 -- Entire associated amount is used to pay over earnings
7700 -- Rewritten Again (!!) following Bug5191444
7701 IF OZF_DEBUG_LOW_ON THEN
7702 OZF_Utility_PVT.debug_message(' Prorating Based on Past Accruals. Adjustment Records have Product Info');
7703 END IF;
7704
7705 -- 1. Get the past accrual details.
7706 OPEN csr_offer_products(l_funds_util_flt.activity_id,
7707 NVL(l_funds_util_flt.activity_product_id,l_funds_util_flt.product_id),
7708 l_funds_util_flt.product_level_type,
7709 l_funds_util_flt.cust_account_id);
7710 FETCH csr_offer_products BULK COLLECT INTO l_level_type, l_item_id, l_fund_id, l_accrued_amt;
7711 CLOSE csr_offer_products;
7712
7713 FOR i IN 1..l_level_type.COUNT LOOP
7714 -- Recalculate l_tot_accrual_amt
7715 l_tot_accrual_amt := NVL(l_tot_accrual_amt,0) + l_accrued_amt(i);
7716 END LOOP;
7717 l_tot_prorate_adj_amt := 0;
7718 FOR i IN 1..l_level_type.COUNT LOOP
7719
7720 l_prorate_adj_amt := l_accrued_amt(i) * (l_cre_total_amount / l_tot_accrual_amt);
7721 l_prorate_adj_amt := OZF_UTILITY_PVT.CurrRound(l_prorate_adj_amt, G_ACCRUAL_CURRENCY);
7722 l_tot_prorate_adj_amt := NVL(l_tot_prorate_adj_amt,0) + l_prorate_adj_amt ;
7723
7724 --2. Call function to check if the adjustment line is already created per product and budget (create if required)
7725 Create_Fund_Adjustment(
7726 p_offer_id => l_funds_util_flt.activity_id
7727 ,p_cust_account_id => l_funds_util_flt.cust_account_id
7728 ,p_product_id => l_item_id(i)
7729 ,p_product_level_type => l_level_type(i)
7730 ,p_fund_id => l_fund_id(i)
7731 ,p_reference_type => l_funds_util_flt.reference_type
7732 ,p_reference_id => l_funds_util_flt.reference_id
7733 ,x_return_status => l_return_status
7734 ,x_msg_count => x_msg_count
7735 ,x_msg_data => x_msg_data
7736 ,x_adj_util_id => l_adj_util_id
7737 );
7738 IF l_return_status = fnd_api.g_ret_sts_error THEN
7739 RAISE FND_API.g_exc_error;
7740 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7741 RAISE FND_API.g_exc_unexpected_error;
7742 END IF;
7743
7744 l_counter := l_counter + 1;
7745 l_line_util_tbl(l_counter).amount := l_prorate_adj_amt;
7746 l_line_util_tbl(l_counter).utilization_id := l_adj_util_id;
7747 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7748 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7749
7750 IF OZF_DEBUG_LOW_ON THEN
7751 OZF_Utility_PVT.debug_message('l_line_util_tbl(l_counter).amount = ' ||l_line_util_tbl(l_counter).amount );
7752 OZF_Utility_PVT.debug_message('l_tot_prorate_adj_amt = ' ||l_tot_prorate_adj_amt );
7753 END IF;
7754
7755 END LOOP;
7756
7757 -- 3. Last record needs rounding
7758 IF l_tot_prorate_adj_amt <> l_cre_total_amount THEN
7759 l_line_util_tbl(l_counter).amount := l_line_util_tbl(l_counter).amount +
7760 (l_cre_total_amount - l_tot_prorate_adj_amt);
7761 END IF;
7762
7763 END IF; -- Partially paid over or all paid over
7764
7765 ELSE -- Prorate = 'N'
7766 -- 1. Bug4493735: There must be as many adj records as the no of source budgets irrespective of prorate flag
7767 OPEN csr_source_fund_tot(l_funds_util_flt.activity_id);
7768 FETCH csr_source_fund_tot INTO l_fund_tot_amount;
7769 CLOSE csr_source_fund_tot;
7770
7771 OPEN csr_source_fund(l_funds_util_flt.activity_id);
7772 LOOP
7773 FETCH csr_source_fund INTO l_util_fund_id, l_fund_amount;
7774 EXIT WHEN csr_source_fund%NOTFOUND;
7775 --2. Call function to check if the adjustment line is already created per product and budget (create if required)
7776 Create_Fund_Adjustment(
7777 p_offer_id => l_funds_util_flt.activity_id
7778 ,p_cust_account_id => l_funds_util_flt.cust_account_id
7779 ,p_product_id => NULL
7780 ,p_product_level_type => NULL
7781 ,p_fund_id => l_util_fund_id
7782 ,p_reference_type => l_funds_util_flt.reference_type
7783 ,p_reference_id => l_funds_util_flt.reference_id
7784 ,x_return_status => l_return_status
7785 ,x_msg_count => x_msg_count
7786 ,x_msg_data => x_msg_data
7787 ,x_adj_util_id => l_adj_util_id
7788 );
7789 IF l_return_status = fnd_api.g_ret_sts_error THEN
7790 RAISE FND_API.g_exc_error;
7791 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7792 RAISE FND_API.g_exc_unexpected_error;
7793 END IF;
7794
7795 l_counter := l_counter + 1;
7796
7797 --Fix for Division by zero error/ S-D Enhancements: Pranay
7798 IF l_fund_tot_amount = 0 THEN
7799 l_line_util_tbl(l_counter).amount := OZF_UTILITY_PVT.CurrRound(l_cre_total_amount , G_ACCRUAL_CURRENCY);
7800 ELSE
7801 l_line_util_tbl(l_counter).amount := OZF_UTILITY_PVT.CurrRound(l_cre_total_amount * ( l_fund_amount/l_fund_tot_amount)
7802 , G_ACCRUAL_CURRENCY);
7803 END IF;
7804 l_line_util_tbl(l_counter).utilization_id := l_adj_util_id;
7805 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
7806 l_line_util_tbl(l_counter).update_from_tbl_flag := FND_API.g_true;
7807 l_tot_prorate_adj_amt := NVL( l_tot_prorate_adj_amt,0) + l_line_util_tbl(l_counter).amount;
7808 END LOOP;
7809 CLOSE csr_source_fund;
7810 --3. Last record needs rounding
7811 IF l_tot_prorate_adj_amt <> l_cre_total_amount THEN
7812 l_line_util_tbl(l_counter).amount := l_line_util_tbl(l_counter).amount +
7813 (l_cre_total_amount - l_tot_prorate_adj_amt);
7814 END IF;
7815
7816 END IF; -- Prorate Flag = Y
7817 END IF;-- Scan Data and Non Scan Data
7818 END IF; -- Utils for payover earnings
7819
7820 <<create_line_util>>
7821 ---------- Create Group Line Utils -------------------
7822 IF l_counter > 0 THEN
7823 IF l_funds_util_flt.activity_type = 'OFFR' AND
7824 l_funds_util_flt.activity_id IS NOT NULL THEN
7825 OPEN csr_offer_currency(l_funds_util_flt.activity_id);
7826 FETCH csr_offer_currency INTO G_OFFER_CURRENCY;
7827 CLOSE csr_offer_currency;
7828 END IF;
7829
7830 Create_Line_Util_Tbl(
7831 p_api_version => l_api_version
7832 ,p_init_msg_list => FND_API.g_false
7833 ,p_commit => FND_API.g_false
7834 ,p_validation_level => p_validation_level
7835 ,x_return_status => l_return_status
7836 ,x_msg_data => x_msg_data
7837 ,x_msg_count => x_msg_count
7838 ,p_line_util_tbl => l_line_util_tbl
7839 ,x_error_index => l_error_index
7840 );
7841 IF l_return_status = fnd_api.g_ret_sts_error THEN
7842 RAISE FND_API.g_exc_error;
7843 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7844 RAISE FND_API.g_exc_unexpected_error;
7845 END IF;
7846 END IF;
7847 END IF;
7848
7849 ------------------------- finish -------------------------------
7850 -- Check for commit
7851 IF FND_API.to_boolean(p_commit) THEN
7852 COMMIT;
7853 END IF;
7854
7855 FND_MSG_PUB.count_and_get(
7856 p_encoded => FND_API.g_false,
7857 p_count => x_msg_count,
7858 p_data => x_msg_data
7859 );
7860
7861 IF OZF_DEBUG_HIGH_ON THEN
7862 OZF_Utility_PVT.debug_message(l_full_name ||': end');
7863 END IF;
7864
7865 EXCEPTION
7866 WHEN FND_API.g_exc_error THEN
7867 ROLLBACK TO Update_Group_Line_Util;
7868 x_return_status := FND_API.g_ret_sts_error;
7869 FND_MSG_PUB.count_and_get (
7870 p_encoded => FND_API.g_false
7871 ,p_count => x_msg_count
7872 ,p_data => x_msg_data
7873 );
7874
7875 WHEN FND_API.g_exc_unexpected_error THEN
7876 ROLLBACK TO Update_Group_Line_Util;
7877 x_return_status := FND_API.g_ret_sts_unexp_error ;
7878 FND_MSG_PUB.count_and_get (
7879 p_encoded => FND_API.g_false
7880 ,p_count => x_msg_count
7881 ,p_data => x_msg_data
7882 );
7883
7884 WHEN OTHERS THEN
7885 ROLLBACK TO Update_Group_Line_Util;
7886 x_return_status := FND_API.g_ret_sts_unexp_error ;
7887 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
7888 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
7889 END IF;
7890 FND_MSG_PUB.count_and_get(
7891 p_encoded => FND_API.g_false
7892 ,p_count => x_msg_count
7893 ,p_data => x_msg_data
7894 );
7895
7896 END Update_Group_Line_Util;
7897
7898 ---------------------------------------------------------------
7899 -- PROCEDURE
7900 -- Del_Line_Util_By_Group
7901 --
7902 -- NOTE
7903 -- p_line_util_rec contains claim_line_util_id
7904 -- , utilization_id
7905 -- , claim_line_id
7906 -- , acctd_amount
7907 --
7908 -- HISTORY
7909 -- 10/30/2002 mchang Create.
7910 -- 08-Aug-06 azahmed Modified for FXGL ER
7911 -- amount passed to Update_funds_util
7912 ---------------------------------------------------------------
7913 PROCEDURE Del_Line_Util_By_Group(
7914 x_return_status OUT NOCOPY VARCHAR2
7915 ,x_msg_count OUT NOCOPY NUMBER
7916 ,x_msg_data OUT NOCOPY VARCHAR2
7917
7918 ,p_line_util_rec IN line_util_rec_type
7919 )
7920 IS
7921 l_api_name CONSTANT VARCHAR2(30) := 'Del_Line_Util_By_Group';
7922 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
7923 l_return_status VARCHAR2(1);
7924
7925 l_line_util_rec line_util_rec_type := p_line_util_rec;
7926
7927 BEGIN
7928 --------------------- initialize -----------------------
7929 SAVEPOINT Del_Line_Util_By_Group;
7930
7931 x_return_status := FND_API.G_RET_STS_SUCCESS;
7932
7933 IF p_line_util_rec.utilization_id > 0 THEN
7934 ------------------ Update Uitlization ------------------
7935
7936 Update_Fund_Utils(
7937 p_line_util_rec => l_line_util_rec
7938 ,p_fu_diff_acctd_amt_rem => p_line_util_rec.amount
7939 ,p_mode => 'NONE'
7940 ,x_return_status => l_return_status
7941 ,x_msg_count => x_msg_count
7942 ,x_msg_data => x_msg_data
7943 );
7944 IF l_return_status = fnd_api.g_ret_sts_error THEN
7945 RAISE FND_API.g_exc_error;
7946 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
7947 RAISE FND_API.g_exc_unexpected_error;
7948 END IF;
7949
7950 END IF; -- p_line_util_rec.utilization_id > 0
7951
7952 ------------------------ delete ------------------------
7953 DELETE FROM ozf_claim_lines_util_all
7954 WHERE claim_line_util_id = p_line_util_rec.claim_line_util_id;
7955
7956 IF (SQL%NOTFOUND) THEN
7957 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
7958 FND_MESSAGE.set_name('OZF', 'OZF_API_RECORD_NOT_FOUND');
7959 FND_MSG_PUB.add;
7960 END IF;
7961 RAISE FND_API.g_exc_error;
7962 END IF;
7963
7964 -------------------- finish --------------------------
7965 FND_MSG_PUB.count_and_get(
7966 p_encoded => FND_API.g_false,
7967 p_count => x_msg_count,
7968 p_data => x_msg_data
7969 );
7970
7971 EXCEPTION
7972 WHEN FND_API.g_exc_error THEN
7973 ROLLBACK TO Del_Line_Util_By_Group;
7974 x_return_status := FND_API.g_ret_sts_error;
7975 FND_MSG_PUB.count_and_get(
7976 p_encoded => FND_API.g_false,
7977 p_count => x_msg_count,
7978 p_data => x_msg_data
7979 );
7980
7981 WHEN FND_API.g_exc_unexpected_error THEN
7982 ROLLBACK TO Del_Line_Util_By_Group;
7983 x_return_status := FND_API.g_ret_sts_unexp_error ;
7984 FND_MSG_PUB.count_and_get(
7985 p_encoded => FND_API.g_false,
7986 p_count => x_msg_count,
7987 p_data => x_msg_data
7988 );
7989
7990 WHEN OTHERS THEN
7991 ROLLBACK TO Del_Line_Util_By_Group;
7992 x_return_status := FND_API.g_ret_sts_unexp_error ;
7993 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
7994 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
7995 END IF;
7996 FND_MSG_PUB.count_and_get(
7997 p_encoded => FND_API.g_false,
7998 p_count => x_msg_count,
7999 p_data => x_msg_data
8000 );
8001
8002 END Del_Line_Util_By_Group;
8003
8004 ---------------------------------------------------------------------
8005 -- PROCEDURE
8006 -- Delete_Group_Line_Util
8007 --
8008 -- HISTORY
8009 -- 10/05/2001 mchang Create.
8010 -- 15-Mar-06 azahmed Bugfix 5101106
8011 -- 08-Aug-06 azahmed Modified for FXGL ER
8012 ---------------------------------------------------------------------
8013 PROCEDURE Delete_Group_Line_Util(
8014 p_api_version IN NUMBER
8015 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
8016 ,p_commit IN VARCHAR2 := FND_API.g_false
8017 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
8018
8019 ,x_return_status OUT NOCOPY VARCHAR2
8020 ,x_msg_count OUT NOCOPY NUMBER
8021 ,x_msg_data OUT NOCOPY VARCHAR2
8022
8023 ,p_funds_util_flt IN funds_util_flt_type
8024 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
8025 )
8026 IS
8027 l_api_version CONSTANT NUMBER := 1.0;
8028 l_api_name CONSTANT VARCHAR2(30) := 'Delete_Group_Line_Util';
8029 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8030 l_return_status VARCHAR2(1);
8031
8032 l_funds_util_flt funds_util_flt_type := p_funds_util_flt;
8033
8034 TYPE FundsUtilCsrTyp IS REF CURSOR;
8035 l_funds_util_csr NUMBER; --FundsUtilCsrTyp;
8036 l_funds_util_sql VARCHAR2(3000);
8037 l_line_util_tbl line_util_tbl_type;
8038 l_upd_line_util_rec line_util_rec_type;
8039 l_lu_line_util_id NUMBER;
8040 l_lu_utilization_id NUMBER;
8041 l_lu_amt NUMBER;
8042 l_lu_scan_unit NUMBER;
8043 l_del_total_amount NUMBER;
8044 l_del_total_units NUMBER;
8045 l_counter PLS_INTEGER := 1;
8046 i PLS_INTEGER;
8047 l_funds_util_end VARCHAR2(1) := 'N';
8048 l_final_lu_amt NUMBER;
8049 l_object_version_number NUMBER;
8050 l_ignore NUMBER;
8051 l_offer_uom_code VARCHAR2(3);
8052 l_offer_quantity NUMBER;
8053 l_scan_value NUMBER;
8054 l_product_id NUMBER;
8055 l_lu_acctd_amt NUMBER;
8056 l_utiz_currency VARCHAR2(15);
8057 l_utiz_amount NUMBER;
8058 l_lu_currency_code VARCHAR2(15);
8059
8060 CURSOR csr_utiz_currency(cv_utilization_id IN NUMBER) IS
8061 SELECT currency_code
8062 from ozf_funds_utilized_all_b
8063 where utilization_id = cv_utilization_id ;
8064
8065 CURSOR csr_final_lu_amt(cv_claim_line_id IN NUMBER) IS
8066 SELECT SUM(amount)
8067 FROM ozf_claim_lines_util
8068 WHERE claim_line_id = cv_claim_line_id;
8069
8070 -- fix for bug 5042046
8071 CURSOR csr_function_currency IS
8072 SELECT gs.currency_code
8073 FROM gl_sets_of_books gs
8074 , ozf_sys_parameters org
8075 WHERE org.set_of_books_id = gs.set_of_books_id
8076 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
8077
8078 CURSOR csr_claim_currency(cv_claim_line_id IN NUMBER) IS
8079 SELECT currency_code from ozf_claim_lines
8080 where claim_line_id = cv_claim_line_id;
8081
8082 CURSOR csr_offer_currency(cv_plan_id IN NUMBER) IS
8083 SELECT transaction_currency_code
8084 FROM ozf_offers
8085 WHERE qp_list_header_id = cv_plan_id;
8086
8087 CURSOR csr_over_util(cv_claim_line_id IN NUMBER, cv_act_product_id IN NUMBER) IS
8088 SELECT claim_line_util_id, acctd_amount, scan_unit
8089 FROM ozf_claim_lines_util
8090 WHERE claim_line_id = cv_claim_line_id
8091 AND activity_product_id = cv_act_product_id
8092 AND utilization_id = -1;
8093
8094 CURSOR csr_acc_over_util(cv_claim_line_id IN NUMBER, cv_offer_id IN NUMBER) IS
8095 SELECT claim_line_util_id, acctd_amount
8096 FROM ozf_claim_lines_util util
8097 WHERE claim_line_id = cv_claim_line_id
8098 AND activity_product_id = cv_offer_id
8099 AND utilization_id = -2;
8100
8101 -- Bugfix 5101106: Recalculate qty
8102 CURSOR csr_offer_profile(cv_activity_product_id IN NUMBER) IS
8103 SELECT uom_code
8104 , quantity
8105 , scan_value
8106 , inventory_item_id
8107 FROM ams_act_products
8108 WHERE activity_product_id = cv_activity_product_id;
8109
8110 CURSOR csr_utiz_amount(cv_line_util_id IN NUMBER) IS
8111 SELECT util_curr_amount
8112 FROM ozf_claim_lines_util
8113 WHERE claim_line_util_id = cv_line_util_id;
8114
8115 BEGIN
8116 --------------------- initialize -----------------------
8117 SAVEPOINT Delete_Group_Line_Util;
8118
8119 IF OZF_DEBUG_HIGH_ON THEN
8120 OZF_Utility_PVT.debug_message(l_full_name||': start');
8121 END IF;
8122
8123 IF FND_API.to_boolean(p_init_msg_list) THEN
8124 FND_MSG_PUB.initialize;
8125 END IF;
8126
8127 IF NOT FND_API.compatible_api_call(
8128 l_api_version,
8129 p_api_version,
8130 l_api_name,
8131 g_pkg_name
8132 ) THEN
8133 RAISE FND_API.g_exc_unexpected_error;
8134 END IF;
8135
8136 x_return_status := FND_API.g_ret_sts_success;
8137
8138 OPEN csr_function_currency;
8139 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
8140 CLOSE csr_function_currency;
8141
8142 G_UNIV_CURRENCY := FND_PROFILE.VALUE('OZF_TP_COMMON_CURRENCY');
8143
8144 Init_Line_Util_Rec(
8145 x_line_util_rec => l_upd_line_util_rec
8146 );
8147
8148 ----------------- copy line info to filter ---------------
8149
8150 IF p_funds_util_flt.claim_line_id IS NOT NULL THEN
8151 Copy_Util_Flt(px_funds_util_flt => l_funds_util_flt);
8152 END IF;
8153
8154 -- derive claim currency
8155 OPEN csr_claim_currency(l_funds_util_flt.claim_line_id);
8156 FETCH csr_claim_currency INTO G_CLAIM_CURRENCY;
8157 CLOSE csr_claim_currency;
8158
8159 -- Modified for FXGL ER
8160 -- deletion also to take place in amount and not acctd_amount
8161
8162 --------------------- start -----------------------
8163 l_del_total_amount := NVL(l_funds_util_flt.old_total_amount, 0) - NVL(l_funds_util_flt.total_amount ,0);
8164 l_del_total_amount := OZF_UTILITY_PVT.CurrRound(l_del_total_amount, G_CLAIM_CURRENCY);
8165 l_del_total_units := NVL(l_funds_util_flt.old_total_units, 0) - NVL(l_funds_util_flt.total_units, 0);
8166
8167 ------------ reduce the over-utilization first ---------
8168 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
8169 OPEN csr_over_util(l_funds_util_flt.claim_line_id, l_funds_util_flt.activity_product_id);
8170 LOOP
8171 FETCH csr_over_util INTO l_lu_line_util_id, l_lu_amt, l_lu_scan_unit;
8172 EXIT WHEN csr_over_util%NOTFOUND;
8173
8174 IF l_funds_util_flt.total_amount IS NULL THEN
8175 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8176 l_line_util_tbl(l_counter).utilization_id := -1;
8177 l_line_util_tbl(l_counter).amount := l_lu_amt;
8178 l_line_util_tbl(l_counter).scan_unit := l_lu_scan_unit;
8179 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8180 ELSIF l_del_total_amount >= l_lu_acctd_amt THEN
8181 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8182 l_line_util_tbl(l_counter).utilization_id := -1;
8183 l_line_util_tbl(l_counter).amount := l_lu_amt;
8184 l_line_util_tbl(l_counter).scan_unit := l_lu_scan_unit;
8185 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8186
8187 l_del_total_amount := l_del_total_amount - l_lu_amt;
8188 l_del_total_units := l_del_total_units - l_lu_scan_unit;
8189 ELSE
8190 l_upd_line_util_rec.claim_line_util_id := l_lu_line_util_id;
8191 l_upd_line_util_rec.amount := l_lu_amt - l_del_total_amount;
8192 l_upd_line_util_rec.scan_unit := l_lu_scan_unit - l_del_total_units;
8193
8194 l_del_total_amount := 0;
8195 l_del_total_units := 0;
8196 END IF;
8197
8198 l_counter := l_counter + 1;
8199
8200 EXIT WHEN l_del_total_amount = 0;
8201 END LOOP;
8202 CLOSE csr_over_util;
8203 ELSIF p_funds_util_flt.activity_type = 'OFFR' AND
8204 p_funds_util_flt.activity_id IS NOT NULL
8205 THEN
8206 NULL;
8207 /* -- We do not create -2 utilizations for non scan offers currently
8208 OPEN csr_acc_over_util(l_funds_util_flt.claim_line_id, l_funds_util_flt.activity_id);
8209 LOOP
8210 FETCH csr_acc_over_util INTO l_lu_line_util_id, l_lu_acctd_amt;
8211 EXIT WHEN csr_acc_over_util%NOTFOUND;
8212
8213 IF p_funds_util_flt.total_amount IS NULL THEN
8214 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8215 l_line_util_tbl(l_counter).utilization_id := l_lu_line_util_id;
8216 l_line_util_tbl(l_counter).acctd_amount := l_lu_acctd_amt;
8217 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8218 ELSIF l_del_total_amount >= l_lu_acctd_amt THEN
8219 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8220 l_line_util_tbl(l_counter).utilization_id := l_lu_line_util_id;
8221 l_line_util_tbl(l_counter).acctd_amount := l_lu_acctd_amt;
8222 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8223
8224 l_del_total_amount := l_del_total_amount - l_lu_acctd_amt;
8225 ELSE
8226 l_upd_line_util_rec.claim_line_util_id := l_lu_line_util_id;
8227 l_upd_line_util_rec.acctd_amount := l_lu_acctd_amt - l_del_total_amount;
8228
8229 l_del_total_amount := 0;
8230 END IF;
8231
8232 l_counter := l_counter + 1;
8233
8234 EXIT WHEN l_del_total_amount = 0;
8235 END LOOP;
8236 CLOSE csr_acc_over_util;
8237 */
8238 END IF;
8239
8240
8241 IF l_del_total_amount <> 0 THEN -- added for bugfix 4448859
8242 Get_Utiz_Sql_Stmt(
8243 p_api_version => l_api_version
8244 ,p_init_msg_list => FND_API.g_false
8245 ,p_commit => FND_API.g_false
8246 ,p_validation_level => FND_API.g_valid_level_full
8247 ,x_return_status => l_return_status
8248 ,x_msg_count => x_msg_count
8249 ,x_msg_data => x_msg_data
8250 ,p_summary_view => 'DEL_GRP_LINE_UTIL'
8251 ,p_funds_util_flt => l_funds_util_flt
8252 ,p_cust_account_id => l_funds_util_flt.cust_account_id
8253 ,x_utiz_sql_stmt => l_funds_util_sql
8254 );
8255 IF l_return_status = FND_API.g_ret_sts_error THEN
8256 RAISE FND_API.g_exc_error;
8257 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
8258 RAISE FND_API.g_exc_unexpected_error;
8259 END IF;
8260
8261 -- use FND_DSQL package for dynamic sql and bind variables
8262 l_funds_util_csr := DBMS_SQL.open_cursor;
8263 FND_DSQL.set_cursor(l_funds_util_csr);
8264 DBMS_SQL.parse(l_funds_util_csr, l_funds_util_sql, DBMS_SQL.native);
8265 DBMS_SQL.define_column(l_funds_util_csr, 1, l_lu_line_util_id);
8266 DBMS_SQL.define_column(l_funds_util_csr, 2, l_lu_utilization_id);
8267 DBMS_SQL.define_column(l_funds_util_csr, 3, l_lu_amt);
8268 DBMS_SQL.define_column(l_funds_util_csr, 4, l_lu_scan_unit);
8269 DBMS_SQL.define_column(l_funds_util_csr, 5, l_lu_currency_code, 15);
8270 -- DBMS_SQL.define_column(l_funds_util_csr, 5, l_utiz_amount);
8271 FND_DSQL.do_binds;
8272
8273 l_ignore := DBMS_SQL.execute(l_funds_util_csr);
8274 --OPEN l_funds_util_csr FOR l_funds_util_sql;
8275 LOOP
8276 /*
8277 FETCH l_funds_util_csr INTO l_lu_line_util_id
8278 , l_lu_utilization_id
8279 , l_lu_acctd_amt
8280 , l_lu_scan_unit;
8281 EXIT WHEN l_funds_util_csr%NOTFOUND;
8282 */
8283
8284 IF DBMS_SQL.fetch_rows(l_funds_util_csr) > 0 THEN
8285 DBMS_SQL.column_value(l_funds_util_csr, 1, l_lu_line_util_id);
8286 DBMS_SQL.column_value(l_funds_util_csr, 2, l_lu_utilization_id);
8287 DBMS_SQL.column_value(l_funds_util_csr, 3, l_lu_amt);
8288 DBMS_SQL.column_value(l_funds_util_csr, 4, l_lu_scan_unit);
8289 DBMS_SQL.column_value(l_funds_util_csr, 5, l_lu_currency_code);
8290 -- DBMS_SQL.define_column(l_funds_util_csr, 5, l_utiz_amount);
8291
8292 OPEN csr_utiz_amount(l_lu_line_util_id);
8293 FETCH csr_utiz_amount INTO l_utiz_amount;
8294 CLOSE csr_utiz_amount;
8295
8296 -- l_del_total_amount is in claim currency
8297 -- we are reducing this with l_lu_amt
8298 -- but assigning l_line_util_tbl(l_counter).amount := l_utiz_amount;
8299 -- iwhich is in utiz currency
8300 IF OZF_DEBUG_LOW_ON THEN
8301 OZF_Utility_PVT.debug_message('l_lu_line_util_id. : '||l_lu_line_util_id);
8302 OZF_Utility_PVT.debug_message('l_lu_utilization_id. : '||l_lu_utilization_id);
8303 OZF_Utility_PVT.debug_message('l_lu_amt. : '||l_lu_amt);
8304 OZF_Utility_PVT.debug_message('l_utiz_amount. : '||l_utiz_amount);
8305 OZF_Utility_PVT.debug_message('l_del_total_amount. : '||l_del_total_amount);
8306 END IF;
8307
8308 IF p_funds_util_flt.total_amount IS NULL THEN
8309 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8310 l_line_util_tbl(l_counter).utilization_id := l_lu_utilization_id;
8311 l_line_util_tbl(l_counter).amount := l_utiz_amount;
8312 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
8313 l_line_util_tbl(l_counter).scan_unit := l_lu_scan_unit;
8314 l_line_util_tbl(l_counter).uom_code := l_funds_util_flt.uom_code;
8315 l_line_util_tbl(l_counter).quantity := l_funds_util_flt.quantity;
8316 END IF;
8317 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8318 l_counter := l_counter + 1;
8319 ELSE
8320 IF ABS(l_del_total_amount) >= ABS(l_lu_amt) THEN
8321 l_line_util_tbl(l_counter).claim_line_util_id := l_lu_line_util_id;
8322 l_line_util_tbl(l_counter).utilization_id := l_lu_utilization_id;
8323 l_line_util_tbl(l_counter).amount := l_utiz_amount;
8324 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
8325 l_line_util_tbl(l_counter).scan_unit := l_lu_scan_unit;
8326 l_line_util_tbl(l_counter).uom_code := l_funds_util_flt.uom_code;
8327 l_line_util_tbl(l_counter).quantity := l_funds_util_flt.quantity;
8328 l_del_total_units := l_del_total_units - l_lu_scan_unit;
8329 END IF;
8330 l_line_util_tbl(l_counter).claim_line_id := l_funds_util_flt.claim_line_id;
8331
8332 l_del_total_amount := l_del_total_amount - l_lu_amt;
8333
8334 ELSE
8335 l_upd_line_util_rec.claim_line_util_id := l_lu_line_util_id;
8336 l_upd_line_util_rec.amount := l_lu_amt - l_del_total_amount;
8337 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
8338 l_upd_line_util_rec.scan_unit := l_lu_scan_unit - l_del_total_units;
8339 l_upd_line_util_rec.uom_code := l_funds_util_flt.uom_code;
8340 l_upd_line_util_rec.quantity := l_funds_util_flt.quantity;
8341 END IF;
8342
8343 l_funds_util_end := 'Y';
8344 END IF;
8345
8346 l_counter := l_counter + 1;
8347
8348 EXIT WHEN l_del_total_amount = 0;
8349 EXIT WHEN l_funds_util_end = 'Y';
8350 END IF;
8351 ELSE
8352 EXIT;
8353 END IF;
8354 END LOOP;
8355 --CLOSE l_funds_util_csr;
8356 DBMS_SQL.close_cursor(l_funds_util_csr);
8357 END IF; -- l_del_total_amount <> 0
8358
8359 --------------------- 1. delete -----------------------
8360 i := l_line_util_tbl.FIRST;
8361 IF i IS NOT NULL THEN
8362 IF p_funds_util_flt.activity_type = 'OFFR' AND
8363 p_funds_util_flt.activity_id IS NOT NULL THEN
8364 OPEN csr_offer_currency(p_funds_util_flt.activity_id);
8365 FETCH csr_offer_currency INTO G_OFFER_CURRENCY;
8366 CLOSE csr_offer_currency;
8367 END IF;
8368
8369 LOOP
8370 IF l_line_util_tbl(i).claim_line_util_id IS NOT NULL THEN
8371 Del_Line_Util_By_Group(
8372 x_return_status => l_return_status
8373 ,x_msg_count => x_msg_count
8374 ,x_msg_data => x_msg_data
8375 ,p_line_util_rec => l_line_util_tbl(i)
8376 );
8377 IF l_return_status = fnd_api.g_ret_sts_error THEN
8378 RAISE FND_API.g_exc_error;
8379 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
8380 RAISE FND_API.g_exc_unexpected_error;
8381 END IF;
8382 END IF;
8383 EXIT WHEN i = l_line_util_tbl.LAST;
8384 i := l_line_util_tbl.NEXT(i);
8385 END LOOP;
8386 END IF;
8387
8388 --------------------- 2. update -----------------------
8389 IF (l_upd_line_util_rec.claim_line_util_id is not null
8390 AND l_upd_line_util_rec.claim_line_util_id <> FND_API.G_MISS_NUM) THEN
8391 -- Bugfix 5101106: Recalculate qty
8392 IF p_funds_util_flt.offer_type = 'SCAN_DATA' THEN
8393 OPEN csr_offer_profile(l_funds_util_flt.activity_product_id);
8394 FETCH csr_offer_profile INTO l_offer_uom_code
8395 , l_offer_quantity
8396 , l_scan_value
8397 , l_product_id;
8398 CLOSE csr_offer_profile;
8399 IF l_funds_util_flt.uom_code <> l_offer_uom_code THEN
8400 l_upd_line_util_rec.quantity := inv_convert.inv_um_convert(
8401 item_id => l_product_id
8402 ,precision => 2
8403 ,from_quantity => l_upd_line_util_rec.scan_unit * l_offer_quantity
8404 ,from_unit => l_offer_uom_code
8405 ,to_unit => l_funds_util_flt.uom_code
8406 ,from_name => NULL
8407 ,to_name => NULL
8408 );
8409 ELSE
8410 l_upd_line_util_rec.quantity := l_upd_line_util_rec.scan_unit * l_offer_quantity;
8411 END IF;
8412 END IF;
8413
8414 Update_Line_Util(
8415 p_api_version => l_api_version
8416 ,p_init_msg_list => FND_API.g_false
8417 ,p_commit => FND_API.g_false
8418 ,p_validation_level => FND_API.g_valid_level_full
8419 ,x_return_status => l_return_status
8420 ,x_msg_count => x_msg_count
8421 ,x_msg_data => x_msg_data
8422 ,p_line_util_rec => l_upd_line_util_rec
8423 ,x_object_version => l_object_version_number
8424 );
8425 IF l_return_status = fnd_api.g_ret_sts_error THEN
8426 RAISE FND_API.g_exc_error;
8427 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
8428 RAISE FND_API.g_exc_unexpected_error;
8429 END IF;
8430 l_upd_line_util_rec.object_version_number := l_object_version_number;
8431 END IF;
8432
8433 -- 3. update claim line earnings_associated_flag -------
8434 -- if there is no more earnings associated.
8435 OPEN csr_final_lu_amt(p_funds_util_flt.claim_line_id);
8436 FETCH csr_final_lu_amt INTO l_final_lu_amt;
8437 CLOSE csr_final_lu_amt;
8438
8439 IF l_final_lu_amt = 0 OR
8440 l_final_lu_amt IS NULL THEN
8441 UPDATE ozf_claim_lines_all
8442 SET earnings_associated_flag = 'F'
8443 WHERE claim_line_id = p_funds_util_flt.claim_line_id;
8444 END IF;
8445
8446 ------------------------- finish -------------------------------
8447 -- Check for commit
8448 IF FND_API.to_boolean(p_commit) THEN
8449 COMMIT;
8450 END IF;
8451
8452 FND_MSG_PUB.count_and_get(
8453 p_encoded => FND_API.g_false,
8454 p_count => x_msg_count,
8455 p_data => x_msg_data
8456 );
8457
8458 IF OZF_DEBUG_HIGH_ON THEN
8459 OZF_Utility_PVT.debug_message(l_full_name ||': end');
8460 END IF;
8461
8462 EXCEPTION
8463 WHEN FND_API.g_exc_error THEN
8464 ROLLBACK TO Delete_Group_Line_Util;
8465 x_return_status := FND_API.g_ret_sts_error;
8466 FND_MSG_PUB.count_and_get (
8467 p_encoded => FND_API.g_false
8468 ,p_count => x_msg_count
8469 ,p_data => x_msg_data
8470 );
8471
8472 WHEN FND_API.g_exc_unexpected_error THEN
8473 ROLLBACK TO Delete_Group_Line_Util;
8474 x_return_status := FND_API.g_ret_sts_unexp_error ;
8475 FND_MSG_PUB.count_and_get (
8476 p_encoded => FND_API.g_false
8477 ,p_count => x_msg_count
8478 ,p_data => x_msg_data
8479 );
8480
8481 WHEN OTHERS THEN
8482 ROLLBACK TO Delete_Group_Line_Util;
8483 x_return_status := FND_API.g_ret_sts_unexp_error ;
8484 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
8485 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8486 END IF;
8487 FND_MSG_PUB.count_and_get(
8488 p_encoded => FND_API.g_false
8489 ,p_count => x_msg_count
8490 ,p_data => x_msg_data
8491 );
8492
8493 END Delete_Group_Line_Util;
8494
8495
8496 ---------------------------------------------------------------------
8497 -- PROCEDURE
8498 -- Update_Dummy_Utilizations
8499 --
8500 -- HISTORY
8501 -- 10/15/2002 yizhang Create.
8502 -- 08-Aug-06 azahmed Modified for FXGL ER
8503 --
8504 ---------------------------------------------------------------------
8505 PROCEDURE Update_Dummy_Utilizations(
8506 p_api_version IN NUMBER
8507 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
8508 ,p_commit IN VARCHAR2 := FND_API.g_false
8509 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
8510
8511 ,x_return_status OUT NOCOPY VARCHAR2
8512 ,x_msg_count OUT NOCOPY NUMBER
8513 ,x_msg_data OUT NOCOPY VARCHAR2
8514
8515 ,p_claim_line_util_id IN NUMBER
8516 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
8517 )
8518 IS
8519 l_api_version CONSTANT NUMBER := 1.0;
8520 l_api_name CONSTANT VARCHAR2(30) := 'Update_Dummy_Utilizations';
8521 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8522 l_return_status VARCHAR2(1);
8523 l_error_index NUMBER;
8524
8525 l_line_util_tbl line_util_tbl_type;
8526 l_amount_rem NUMBER;
8527 l_scan_unit_rem NUMBER;
8528 l_total_amount NUMBER;
8529 l_total_units NUMBER;
8530 l_counter NUMBER := 1;
8531
8532 l_claim_line_id NUMBER;
8533 l_activity_product_id NUMBER;
8534 l_utilization_id NUMBER;
8535 l_uom_code VARCHAR2(3);
8536 l_quantity NUMBER;
8537
8538 CURSOR csr_line_util_info(cv_claim_line_util_id IN NUMBER) IS
8539 SELECT claim_line_id
8540 ,activity_product_id
8541 ,uom_code
8542 ,quantity
8543 ,amount
8544 ,scan_unit
8545 ,utilization_id
8546 FROM ozf_claim_lines_util
8547 WHERE claim_line_util_id = cv_claim_line_util_id;
8548
8549 CURSOR csr_funds_utilized(cv_activity_product_id IN NUMBER) IS
8550 SELECT utilization_id
8551 ,amount_remaining
8552 ,scan_unit_remaining
8553 FROM ozf_funds_utilized_all_vl
8554 WHERE activity_product_id = cv_activity_product_id
8555 AND adjustment_type_id = -8
8556 AND utilization_type ='ADJUSTMENT'
8557 AND amount_remaining <> 0;
8558
8559 /*
8560 CURSOR csr_acc_adjustment(cv_offer_id IN NUMBER) IS
8561 SELECT utilization_id
8562 ,acctd_amount_remaining
8563 FROM ozf_funds_utilized_all_vl
8564 WHERE plan_type = 'OFFR'
8565 AND plan_id = cv_offer_id
8566 AND adjustment_type_id = -11
8567 AND utilization_type = 'ADJUSTMENT';
8568 */
8569
8570 BEGIN
8571 ----------------------- initialize --------------------
8572 SAVEPOINT Update_Dummy_Utilizations;
8573
8574 IF OZF_DEBUG_HIGH_ON THEN
8575 OZF_Utility_PVT.debug_message(l_full_name||': start');
8576 END IF;
8577
8578 IF FND_API.to_boolean(p_init_msg_list) THEN
8579 FND_MSG_PUB.initialize;
8580 END IF;
8581
8582 IF NOT FND_API.compatible_api_call(
8583 l_api_version,
8584 p_api_version,
8585 l_api_name,
8586 g_pkg_name
8587 ) THEN
8588 RAISE FND_API.g_exc_unexpected_error;
8589 END IF;
8590
8591 x_return_status := FND_API.g_ret_sts_success;
8592
8593 -------------------- update -----------------------
8594 OPEN csr_line_util_info(p_claim_line_util_id);
8595 FETCH csr_line_util_info INTO l_claim_line_id
8596 ,l_activity_product_id
8597 ,l_uom_code
8598 ,l_quantity
8599 ,l_total_amount
8600 ,l_total_units
8601 ,l_utilization_id;
8602 CLOSE csr_line_util_info;
8603
8604 -- associate adjustment for scan data
8605 -- amounts are reduced in claim currency and not in functional currency
8606 IF l_utilization_id = -1 THEN
8607 OPEN csr_funds_utilized(l_activity_product_id);
8608 LOOP
8609 FETCH csr_funds_utilized INTO l_line_util_tbl(l_counter).utilization_id
8610 , l_amount_rem
8611 , l_scan_unit_rem;
8612 EXIT WHEN csr_funds_utilized%NOTFOUND;
8613 IF l_total_amount > l_amount_rem THEN
8614 l_line_util_tbl(l_counter).amount := l_amount_rem;
8615 l_total_amount := l_total_amount - l_amount_rem;
8616 l_line_util_tbl(l_counter).scan_unit := l_scan_unit_rem;
8617 l_total_units := l_total_units - l_scan_unit_rem;
8618 ELSE
8619 l_line_util_tbl(l_counter).amount := l_total_amount;
8620 l_total_amount := 0;
8621 l_line_util_tbl(l_counter).scan_unit := l_total_units;
8622 l_total_units := 0;
8623 END IF;
8624
8625 l_line_util_tbl(l_counter).claim_line_id := l_claim_line_id;
8626 l_line_util_tbl(l_counter).activity_product_id := l_activity_product_id;
8627 l_line_util_tbl(l_counter).uom_code := l_uom_code;
8628 l_line_util_tbl(l_counter).quantity := l_quantity;
8629 l_counter := l_counter + 1;
8630 EXIT WHEN l_total_amount = 0;
8631 END LOOP;
8632 CLOSE csr_funds_utilized;
8633
8634 -- associate adjustment for accrual offer
8635 /*
8636 ELSIF l_utilization_id = -2 THEN
8637 OPEN csr_acc_adjustment(l_activity_product_id);
8638 LOOP
8639 FETCH csr_acc_adjustment INTO l_line_util_tbl(l_counter).utilization_id
8640 , l_acctd_amount_rem;
8641 EXIT WHEN csr_acc_adjustment%NOTFOUND;
8642 IF l_total_amount > l_acctd_amount_rem THEN
8643 l_line_util_tbl(l_counter).acctd_amount := l_acctd_amount_rem;
8644 l_total_amount := l_total_amount - l_acctd_amount_rem;
8645 ELSE
8646 l_line_util_tbl(l_counter).acctd_amount := l_total_amount;
8647 l_total_amount := 0;
8648 END IF;
8649
8650 l_line_util_tbl(l_counter).claim_line_id := l_claim_line_id;
8651 l_counter := l_counter + 1;
8652 EXIT WHEN l_total_amount = 0;
8653 END LOOP;
8654 CLOSE csr_acc_adjustment;
8655 */
8656 END IF;
8657
8658 -- delete dummy utilizations
8659 DELETE FROM ozf_claim_lines_util_all
8660 WHERE claim_line_util_id = p_claim_line_util_id;
8661
8662 ---------- Create Group Line Utils -------------------
8663 IF l_counter > 1 THEN
8664 Create_Line_Util_Tbl(
8665 p_api_version => l_api_version
8666 ,p_init_msg_list => FND_API.g_false
8667 ,p_commit => FND_API.g_false
8668 ,p_validation_level => p_validation_level
8669 ,x_return_status => l_return_status
8670 ,x_msg_data => x_msg_data
8671 ,x_msg_count => x_msg_count
8672 ,p_line_util_tbl => l_line_util_tbl
8673 ,p_mode => p_mode
8674 ,x_error_index => l_error_index
8675 );
8676 IF l_return_status = fnd_api.g_ret_sts_error THEN
8677 RAISE FND_API.g_exc_error;
8678 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
8679 RAISE FND_API.g_exc_unexpected_error;
8680 END IF;
8681 END IF;
8682
8683 ------------------------- finish -------------------------------
8684 -- Check for commit
8685 IF FND_API.to_boolean(p_commit) THEN
8686 COMMIT;
8687 END IF;
8688
8689 FND_MSG_PUB.count_and_get(
8690 p_encoded => FND_API.g_false,
8691 p_count => x_msg_count,
8692 p_data => x_msg_data
8693 );
8694
8695 IF OZF_DEBUG_HIGH_ON THEN
8696 OZF_Utility_PVT.debug_message(l_full_name ||': end');
8697 END IF;
8698
8699 EXCEPTION
8700 WHEN FND_API.g_exc_error THEN
8701 ROLLBACK TO Update_Dummy_Utilizations;
8702 x_return_status := FND_API.g_ret_sts_error;
8703 FND_MSG_PUB.count_and_get (
8704 p_encoded => FND_API.g_false
8705 ,p_count => x_msg_count
8706 ,p_data => x_msg_data
8707 );
8708
8709 WHEN FND_API.g_exc_unexpected_error THEN
8710 ROLLBACK TO Update_Dummy_Utilizations;
8711 x_return_status := FND_API.g_ret_sts_unexp_error ;
8712 FND_MSG_PUB.count_and_get (
8713 p_encoded => FND_API.g_false
8714 ,p_count => x_msg_count
8715 ,p_data => x_msg_data
8716 );
8717
8718 WHEN OTHERS THEN
8719 ROLLBACK TO Update_Dummy_Utilizations;
8720 x_return_status := FND_API.g_ret_sts_unexp_error ;
8721 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
8722 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
8723 END IF;
8724 FND_MSG_PUB.count_and_get(
8725 p_encoded => FND_API.g_false
8726 ,p_count => x_msg_count
8727 ,p_data => x_msg_data
8728 );
8729
8730 END Update_Dummy_Utilizations;
8731
8732 ---------------------------------------------------------------------
8733 -- PROCEDURE
8734 -- Adjust_Fund_Utilization
8735 --
8736 -- HISTORY
8737 -- 10/15/2002 yizhang Create.
8738 -- 01/15/2003 yizhang Calling point moved from post-approval to
8739 -- post-closed
8740 -- 03/24/2003 yizhang p_mode is used to indicate the calling point
8741 -- of the procedure.
8742 -- 16/03/06 azahmed Bugfix 5101106
8743 -- 27/03/06 azahmed Bugfix 5119143
8744 ---------------------------------------------------------------------
8745 PROCEDURE Adjust_Fund_Utilization(
8746 p_api_version IN NUMBER
8747 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
8748 ,p_commit IN VARCHAR2 := FND_API.g_false
8749 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
8750
8751 ,x_return_status OUT NOCOPY VARCHAR2
8752 ,x_msg_count OUT NOCOPY NUMBER
8753 ,x_msg_data OUT NOCOPY VARCHAR2
8754
8755 ,p_claim_id IN NUMBER
8756 ,p_mode IN VARCHAR2 := OZF_CLAIM_UTILITY_PVT.g_auto_mode
8757
8758 ,x_next_status OUT NOCOPY VARCHAR2
8759 )
8760 IS
8761 l_api_version CONSTANT NUMBER := 1.0;
8762 l_api_name CONSTANT VARCHAR2(30) := 'Adjust_Fund_Utilization';
8763 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
8764 l_return_status VARCHAR2(1);
8765
8766 l_next_status VARCHAR2(15) := 'CLOSED';
8767 l_cust_account_id NUMBER;
8768 l_claim_line_util_id NUMBER;
8769 l_activity_product_id NUMBER;
8770 l_scan_unit NUMBER;
8771 l_acctd_amount NUMBER;
8772 l_plan_id NUMBER;
8773 l_fund_id NUMBER;
8774 l_act_budget_id NUMBER;
8775 l_bill_to_site_id NUMBER;
8776 l_ship_to_site_id NUMBER;
8777 l_fund_curr_code VARCHAR2(15);
8778 l_plan_curr_code VARCHAR2(15);
8779 l_adjustment_flag VARCHAR2(1);
8780
8781 l_utilization_id NUMBER;
8782 l_total_scan_unit NUMBER;
8783 l_old_scan_unit_rem NUMBER;
8784 l_new_scan_unit_rem NUMBER;
8785 l_act_budgets_rec ozf_actbudgets_pvt.act_budgets_rec_type;
8786 l_act_util_rec ozf_actbudgets_pvt.act_util_rec_type ;
8787
8788 CURSOR csr_scan_over_utilized(cv_claim_id IN NUMBER) IS
8789 SELECT lu.claim_line_util_id
8790 ,lu.activity_product_id
8791 ,lu.scan_unit
8792 ,ap.act_product_used_by_id
8793 ,ap.adjustment_flag
8794 FROM ozf_claim_lines_util lu, ams_act_products ap
8795 ,ozf_claim_lines cln
8796 WHERE cln.claim_id = cv_claim_id
8797 AND lu.claim_line_id = cln.claim_line_id
8798 AND lu.activity_product_id = ap.activity_product_id
8799 AND lu.utilization_id = -1
8800 ORDER BY ap.adjustment_flag DESC;
8801
8802 /*
8803 CURSOR csr_acc_over_utilized(cv_claim_id IN NUMBER) IS
8804 SELECT lu.claim_line_util_id
8805 ,lu.activity_product_id
8806 ,lu.acctd_amount
8807 FROM ozf_claim_lines_util lu, ozf_claim_lines ln
8808 WHERE ln.claim_id = cv_claim_id
8809 AND lu.claim_line_id = ln.claim_line_id
8810 AND lu.utilization_id = -2;
8811 */
8812
8813 -- cursor modified for bugfix 5101106 : coupon count * offer quantity = quantity
8814 -- the coupon count(scan_unit) is independent of the offer and claim uom code
8815 CURSOR csr_line_utils(cv_claim_id IN NUMBER) IS
8816 SELECT SUM(lu.scan_unit * amp.quantity)
8817 ,lu.utilization_id
8818 FROM ozf_claim_lines_util_all lu
8819 ,ozf_claim_lines_all cln
8820 ,ams_act_products amp
8821 WHERE cln.claim_id = cv_claim_id
8822 AND lu.claim_line_id = cln.claim_line_id
8823 AND lu.activity_product_id = amp.activity_product_id
8824 GROUP BY lu.utilization_id;
8825
8826 CURSOR csr_source_fund(cv_offer_id IN NUMBER) IS
8827 SELECT fu.fund_id
8828 ,fu.currency_code
8829 ,qp.currency_code
8830 FROM ozf_funds_utilized_all_b fu
8831 ,qp_list_headers_vl qp
8832 WHERE fu.component_id = cv_offer_id
8833 AND fu.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
8834 AND fu.component_type = 'OFFR'
8835 AND fu.utilization_type = 'REQUEST'
8836 AND qp.list_header_id = fu.component_id
8837 GROUP BY fu.fund_id, fu.currency_code, qp.currency_code;
8838
8839 --modified for bugfix 5119143
8840 CURSOR csr_claim_info(cv_claim_id IN NUMBER) IS
8841 select CUST_ACCOUNT_ID , CUST_BILLTO_ACCT_SITE_ID , CUST_SHIPTO_ACCT_SITE_ID
8842 from ozf_claims_all
8843 where claim_id = cv_claim_id;
8844
8845
8846 BEGIN
8847 ----------------------- initialize --------------------
8848 SAVEPOINT Adjust_Fund_Utilization;
8849
8850 IF OZF_DEBUG_HIGH_ON THEN
8851 OZF_Utility_PVT.debug_message(l_full_name||': start');
8852 END IF;
8853
8854 IF FND_API.to_boolean(p_init_msg_list) THEN
8855 FND_MSG_PUB.initialize;
8856 END IF;
8857
8858 IF NOT FND_API.compatible_api_call(
8859 l_api_version,
8860 p_api_version,
8861 l_api_name,
8862 g_pkg_name
8863 ) THEN
8864 RAISE FND_API.g_exc_unexpected_error;
8865 END IF;
8866
8867 x_return_status := FND_API.g_ret_sts_success;
8868
8869 -- initialized x_next_status; Settlement process needs to be contine if there is no
8870 -- associated earnings attached to claim line.
8871 x_next_status := 'CLOSED';
8872
8873 ------------------ dummy utilizations -------------------
8874 IF p_mode = 'ADJ_FUND' THEN
8875 -- create adjustment for scan data offers
8876 OPEN csr_scan_over_utilized(p_claim_id);
8877 LOOP
8878 FETCH csr_scan_over_utilized INTO l_claim_line_util_id
8879 ,l_activity_product_id
8880 ,l_scan_unit
8881 ,l_plan_id
8882 ,l_adjustment_flag;
8883 EXIT WHEN csr_scan_over_utilized%NOTFOUND;
8884
8885 --Bugfix 5119143 get customer Info
8886 OPEN csr_claim_info(p_claim_id);
8887 FETCH csr_claim_info INTO l_cust_account_id , l_bill_to_site_id , l_ship_to_site_id ;
8888 CLOSE csr_claim_info;
8889
8890 IF l_adjustment_flag = 'Y' THEN
8891 --modified for Bugfix 5119143
8892 Ozf_Fund_Adjustment_Pvt.adjust_utilized_budget(
8893 p_claim_id => p_claim_id
8894 ,p_offer_id => l_plan_id
8895 ,p_product_activity_id => l_activity_product_id
8896 ,p_amount => l_scan_unit
8897 ,p_cust_acct_id => l_cust_account_id
8898 ,p_bill_to_cust_acct_id => l_cust_account_id
8899 ,p_bill_to_site_use_id => l_bill_to_site_id
8900 ,p_ship_to_site_use_id => l_ship_to_site_id
8901 ,p_api_version => l_api_version
8902 ,p_init_msg_list => FND_API.g_false
8903 ,p_commit => FND_API.g_false
8904 ,x_msg_count => x_msg_count
8905 ,x_msg_data => x_msg_data
8906 ,x_return_status => l_return_status
8907 );
8908 IF l_return_status = fnd_api.g_ret_sts_error THEN
8909 RAISE FND_API.g_exc_error;
8910 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
8911 RAISE FND_API.g_exc_unexpected_error;
8912 END IF;
8913
8914 Update_Dummy_Utilizations(
8915 p_api_version => l_api_version
8916 ,p_init_msg_list => FND_API.g_false
8917 ,p_commit => FND_API.g_false
8918 ,p_validation_level => p_validation_level
8919 ,x_return_status => l_return_status
8920 ,x_msg_count => x_msg_count
8921 ,x_msg_data => x_msg_data
8922 ,p_claim_line_util_id => l_claim_line_util_id
8923 ,p_mode => p_mode
8924 );
8925 IF l_return_status = fnd_api.g_ret_sts_error THEN
8926 RAISE FND_API.g_exc_error;
8927 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
8928 RAISE FND_API.g_exc_unexpected_error;
8929 END IF;
8930
8931 x_next_status := 'CLOSED';
8932 ELSE
8933 x_next_status := 'PENDING_CLOSED';
8934
8935 -- yizhang: 15-JAN-2003: should we decide to support adjustment workflow, we need to
8936 -- change the settlement fetcher process
8937 -- mchang: As of 24-OCT-2002, we don't support manual adjust over utilization. TM raise
8938 -- error everytime if ams_act_products.adjustment_flag is 'N'.
8939 IF OZF_DEBUG_LOW_ON THEN
8940 FND_MESSAGE.Set_Name('OZF','OZF_API_DEBUG_MESSAGE');
8941 FND_MESSAGE.Set_Token('TEXT',l_full_name||' : Manual Adjust Over Utilization is not supported.');
8942 FND_MSG_PUB.Add;
8943 END IF;
8944
8945 RAISE FND_API.g_exc_unexpected_error;
8946 --Invoke_Adjustment_Workflow();
8947 END IF;
8948
8949 END LOOP;
8950 CLOSE csr_scan_over_utilized;
8951
8952 /*
8953 -- create adjustment for non-scan data offers
8954 OPEN csr_acc_over_utilized(p_claim_id);
8955 LOOP
8956 FETCH csr_acc_over_utilized INTO l_claim_line_util_id
8957 ,l_activity_product_id
8958 ,l_acctd_amount;
8959 EXIT WHEN csr_acc_over_utilized%NOTFOUND;
8960
8961 OPEN csr_source_fund(l_activity_product_id);
8962 FETCH csr_source_fund INTO l_fund_id, l_fund_curr_code, l_plan_curr_code;
8963 CLOSE csr_source_fund;
8964
8965 OPEN csr_claim_info(p_claim_id);
8966 FETCH csr_claim_info INTO l_cust_account_id;
8967 CLOSE csr_claim_info;
8968
8969 IF OZF_DEBUG_HIGH_ON THEN
8970 OZF_Utility_PVT.debug_message('Offer sourcing budget: '||l_fund_id);
8971 OZF_Utility_PVT.debug_message('Claim cust_account_id: '||l_cust_account_id);
8972 END IF;
8973
8974 l_act_budgets_rec.parent_src_apprvd_amt := 0;
8975 l_act_budgets_rec.request_amount := 0;
8976 l_act_budgets_rec.act_budget_used_by_id := l_activity_product_id;
8977 l_act_budgets_rec.arc_act_budget_used_by := 'OFFR';
8978 l_act_budgets_rec.budget_source_type := 'OFFR';
8979 l_act_budgets_rec.budget_source_id := l_activity_product_id;
8980 l_act_budgets_rec.request_currency := l_plan_curr_code;
8981 l_act_budgets_rec.request_date := SYSDATE;
8982 l_act_budgets_rec.status_code := 'APPROVED';
8983 l_act_budgets_rec.user_status_id := ozf_utility_pvt.get_default_user_status (
8984 'OZF_BUDGETSOURCE_STATUS'
8985 ,l_act_budgets_rec.status_code
8986 );
8987 l_act_budgets_rec.transfer_type := 'UTILIZED';
8988 l_act_budgets_rec.approval_date := SYSDATE;
8989 l_act_budgets_rec.approver_id := ozf_utility_pvt.get_resource_id (fnd_global.user_id);
8990 l_act_budgets_rec.parent_source_id := l_fund_id;
8991 l_act_budgets_rec.parent_src_curr := l_fund_curr_code;
8992
8993 l_act_util_rec.gl_date := SYSDATE;
8994 l_act_util_rec.utilization_type := 'ADJUSTMENT';
8995 l_act_util_rec.adjustment_type := 'STANDARD';
8996 l_act_util_rec.adjustment_type_id := -11;
8997 l_act_util_rec.cust_account_id := l_cust_account_id;
8998
8999 OZF_Fund_Adjustment_PVT.process_act_budgets (
9000 x_return_status => l_return_status,
9001 x_msg_count => x_msg_count,
9002 x_msg_data => x_msg_data,
9003 p_act_budgets_rec => l_act_budgets_rec,
9004 p_act_util_rec =>l_act_util_rec,
9005 x_act_budget_id => l_act_budget_id
9006 );
9007 IF l_return_status = fnd_api.g_ret_sts_error THEN
9008 RAISE fnd_api.g_exc_error;
9009 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
9010 RAISE fnd_api.g_exc_unexpected_error;
9011 END IF;
9012
9013 Update_Dummy_Utilizations(
9014 p_api_version => l_api_version
9015 ,p_init_msg_list => FND_API.g_false
9016 ,p_commit => FND_API.g_false
9017 ,p_validation_level => p_validation_level
9018 ,x_return_status => l_return_status
9019 ,x_msg_count => x_msg_count
9020 ,x_msg_data => x_msg_data
9021 ,p_claim_line_util_id => l_claim_line_util_id
9022 ,p_mode => p_mode
9023 );
9024 IF l_return_status = fnd_api.g_ret_sts_error THEN
9025 RAISE FND_API.g_exc_error;
9026 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
9027 RAISE FND_API.g_exc_unexpected_error;
9028 END IF;
9029
9030 x_next_status := 'CLOSED';
9031 END LOOP;
9032 CLOSE csr_acc_over_utilized;
9033 */
9034 ELSIF p_mode = 'UPD_SCAN' THEN
9035 ----------------- update scan_unit_remaining -------------------
9036 --modified for bugfix 5101106
9037 OPEN csr_line_utils(p_claim_id);
9038 LOOP
9039 FETCH csr_line_utils INTO l_total_scan_unit
9040 ,l_utilization_id
9041 ;
9042
9043 EXIT WHEN csr_line_utils%NOTFOUND;
9044
9045 IF l_total_scan_unit IS NOT NULL THEN
9046
9047 UPDATE ozf_funds_utilized_all_b
9048 SET scan_unit_remaining = scan_unit_remaining - l_total_scan_unit
9049 WHERE utilization_id = l_utilization_id;
9050 END IF;
9051
9052 END LOOP;
9053 CLOSE csr_line_utils;
9054 END IF;
9055
9056 ------------------------- finish -------------------------------
9057 -- Check for commit
9058 IF FND_API.to_boolean(p_commit) THEN
9059 COMMIT;
9060 END IF;
9061
9062 FND_MSG_PUB.count_and_get(
9063 p_encoded => FND_API.g_false,
9064 p_count => x_msg_count,
9065 p_data => x_msg_data
9066 );
9067
9068 IF OZF_DEBUG_HIGH_ON THEN
9069 OZF_Utility_PVT.debug_message(l_full_name ||': end');
9070 END IF;
9071
9072 EXCEPTION
9073 WHEN FND_API.g_exc_error THEN
9074 ROLLBACK TO Adjust_Fund_Utilization;
9075 x_return_status := FND_API.g_ret_sts_error;
9076 FND_MSG_PUB.count_and_get (
9077 p_encoded => FND_API.g_false
9078 ,p_count => x_msg_count
9079 ,p_data => x_msg_data
9080 );
9081
9082 WHEN FND_API.g_exc_unexpected_error THEN
9083 ROLLBACK TO Adjust_Fund_Utilization;
9084 x_return_status := FND_API.g_ret_sts_unexp_error ;
9085 FND_MSG_PUB.count_and_get (
9086 p_encoded => FND_API.g_false
9087 ,p_count => x_msg_count
9088 ,p_data => x_msg_data
9089 );
9090
9091 WHEN OTHERS THEN
9092 ROLLBACK TO Adjust_Fund_Utilization;
9093 x_return_status := FND_API.g_ret_sts_unexp_error ;
9094 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
9095 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
9096 END IF;
9097 FND_MSG_PUB.count_and_get(
9098 p_encoded => FND_API.g_false
9099 ,p_count => x_msg_count
9100 ,p_data => x_msg_data
9101 );
9102
9103 END Adjust_Fund_Utilization;
9104 ---------------------------------------------------------------------
9105 -- FUNCTION
9106 -- Calculate_FXGL_Amount
9107 --
9108 -- PURPOSE
9109 -- Returns FXGL amount of the claim line util
9110 --
9111 -- PARAMETERS
9112 --
9113 --
9114 -- NOTES
9115 -- created by azahmed For FXGL ER:
9116 ---------------------------------------------------------------------
9117 FUNCTION Calculate_FXGL_Amount(
9118 p_line_util_rec IN line_util_rec_type
9119 ) RETURN NUMBER
9120 IS
9121
9122 CURSOR csr_funds_util_details(cv_utilization_id IN NUMBER) IS
9123 select CURRENCY_CODE , EXCHANGE_RATE_TYPE , EXCHANGE_RATE_DATE , EXCHANGE_RATE
9124 from ozf_funds_utilized_all_b
9125 where utilization_id = cv_utilization_id;
9126
9127
9128 CURSOR csr_function_currency IS
9129 SELECT gs.currency_code
9130 FROM gl_sets_of_books gs
9131 , ozf_sys_parameters org
9132 WHERE org.set_of_books_id = gs.set_of_books_id
9133 AND org.org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
9134
9135 l_fu_currency_code VARCHAR2(15);
9136 l_fu_exc_rate NUMBER;
9137 l_fu_exc_date DATE;
9138 l_fu_exc_type VARCHAR2(30);
9139 l_return_status VARCHAR2(1);
9140 l_utilized_amount NUMBER := 0;
9141 l_fxgl_acctd_amount NUMBER := 0;
9142
9143 BEGIN
9144 OPEN csr_function_currency;
9145 FETCH csr_function_currency INTO G_FUNCTIONAL_CURRENCY;
9146 CLOSE csr_function_currency;
9147
9148
9149 OPEN csr_funds_util_details(p_line_util_rec.utilization_id);
9150 FETCH csr_funds_util_details INTO l_fu_currency_code, l_fu_exc_type , l_fu_exc_date , l_fu_exc_rate ;
9151 CLOSE csr_funds_util_details;
9152
9153 IF OZF_DEBUG_HIGH_ON THEN
9154 OZF_Utility_PVT.debug_message('FXGL l_fu_currency_code : '||l_fu_currency_code);
9155 OZF_Utility_PVT.debug_message('G_FUNCTIONAL_CURRENCY : '||G_FUNCTIONAL_CURRENCY);
9156 OZF_Utility_PVT.debug_message('l_fu_exc_rate : '||l_fu_exc_rate);
9157 OZF_Utility_PVT.debug_message('p_line_util_rec.exchange_rate : '||p_line_util_rec.exchange_rate);
9158 OZF_Utility_PVT.debug_message('p_line_util_rec.acctd_amount : '||p_line_util_rec.acctd_amount);
9159 END IF;
9160
9161 -- If accruals are in functional currency then no FXGL
9162 IF l_fu_currency_code = G_FUNCTIONAL_CURRENCY THEN
9163 RETURN 0;
9164 END IF;
9165
9166 IF p_line_util_rec.currency_code = l_fu_currency_code THEN
9167
9168 IF p_line_util_rec.exchange_rate <> l_fu_exc_rate AND l_fu_exc_rate IS NOT NULL THEN
9169 OZF_UTILITY_PVT.Convert_Currency(
9170 p_from_currency => p_line_util_rec.currency_code
9171 ,p_to_currency => G_FUNCTIONAL_CURRENCY
9172 ,p_conv_type => l_fu_exc_type
9173 ,p_conv_rate => l_fu_exc_rate
9174 ,p_conv_date => l_fu_exc_date
9175 ,p_from_amount => p_line_util_rec.amount
9176 ,x_return_status => l_return_status
9177 ,x_to_amount => l_utilized_amount
9178 ,x_rate => l_fu_exc_rate
9179 );
9180 IF l_return_status = FND_API.g_ret_sts_error THEN
9181 RAISE FND_API.g_exc_error;
9182 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
9183 RAISE FND_API.g_exc_unexpected_error;
9184 END IF;
9185 END IF;
9186 ELSE
9187 -- Claim is in functional currency and association happening in another currency
9188 OZF_UTILITY_PVT.Convert_Currency(
9189 p_from_currency => l_fu_currency_code
9190 ,p_to_currency => G_FUNCTIONAL_CURRENCY
9191 ,p_conv_type => l_fu_exc_type
9192 ,p_conv_rate => l_fu_exc_rate
9193 ,p_conv_date => l_fu_exc_date
9194 ,p_from_amount => p_line_util_rec.util_curr_amount
9195 ,x_return_status => l_return_status
9196 ,x_to_amount => l_utilized_amount
9197 ,x_rate => l_fu_exc_rate
9198 );
9199 IF l_return_status = FND_API.g_ret_sts_error THEN
9200 RAISE FND_API.g_exc_error;
9201 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
9202 RAISE FND_API.g_exc_unexpected_error;
9203 END IF;
9204 END IF;
9205
9206 IF l_utilized_amount <> 0 THEN
9207 l_fxgl_acctd_amount := p_line_util_rec.acctd_amount - l_utilized_amount;
9208 END IF;
9209
9210 RETURN l_fxgl_acctd_amount;
9211 END Calculate_FXGL_Amount;
9212
9213
9214 ---------------------------------------------------------------------
9215 -- FUNCTION
9216 -- Perform_Approval_Required
9217 --
9218 -- PURPOSE
9219 -- Returns TRUE if the claim requires performance approval.
9220 --
9221 -- PARAMETERS
9222 -- p_claim_id
9223 --
9224 -- NOTES
9225 ---------------------------------------------------------------------
9226 FUNCTION Perform_Approval_Required(
9227 p_claim_id IN NUMBER
9228 ) RETURN VARCHAR2
9229 IS
9230
9231 l_offer_id NUMBER;
9232 l_cust_account_id NUMBER;
9233 l_performance_flag VARCHAR2(1);
9234 l_resale_flag VARCHAR2(1);
9235 l_offer_perf_tbl offer_performance_tbl_type;
9236 l_activity_type VARCHAR2(30);
9237 l_perf_appr_require VARCHAR2(1);
9238 l_cust_setup_id NUMBER;
9239
9240 CURSOR csr_line_util(cv_claim_id IN NUMBER) IS
9241 SELECT fu.plan_id, fu.cust_account_id, ln.activity_type
9242 FROM ozf_claim_lines_util lu, ozf_funds_utilized_all_b fu, ozf_claim_lines ln
9243 WHERE lu.utilization_id = fu.utilization_id
9244 AND lu.claim_line_id = ln.claim_line_id
9245 AND ln.claim_id = cv_claim_id
9246 GROUP BY fu.plan_id, fu.cust_account_id, ln.activity_type;
9247
9248 CURSOR csr_claim_setup_info(cv_claim_id IN NUMBER) IS
9249 SELECT custom_setup_id
9250 FROM ozf_claims
9251 WHERE claim_id = cv_claim_id;
9252
9253 CURSOR csr_claim_perf_req_attr(cv_custom_setup_id IN NUMBER) IS
9254 SELECT NVL(attr_available_flag, 'N')
9255 FROM ams_custom_setup_attr
9256 WHERE custom_setup_id = cv_custom_setup_id
9257 AND object_attribute = 'PAPR';
9258
9259 BEGIN
9260
9261 -- Fix for bug 5177341
9262 OPEN csr_claim_setup_info(p_claim_id);
9263 FETCH csr_claim_setup_info INTO l_cust_setup_id;
9264 CLOSE csr_claim_setup_info;
9265
9266 OPEN csr_claim_perf_req_attr(l_cust_setup_id);
9267 FETCH csr_claim_perf_req_attr INTO l_perf_appr_require;
9268 CLOSE csr_claim_perf_req_attr;
9269
9270 -- Approval is not required if claim performance approval is false
9271 -- in Claim Custom set up.
9272 IF l_perf_appr_require = 'N' THEN
9273 RETURN FND_API.g_false;
9274 END IF;
9275
9276 -- Approval is not required if override profile is Yes
9277 IF FND_PROFILE.VALUE('OZF_OFFR_OVERRIDE_PERF_FLAG') = 'Y' THEN
9278 RETURN FND_API.g_false;
9279 END IF;
9280
9281 OPEN csr_line_util(p_claim_id);
9282 LOOP
9283 FETCH csr_line_util INTO l_offer_id, l_cust_account_id, l_activity_type;
9284 EXIT WHEN csr_line_util%NOTFOUND;
9285
9286 -- check resale data for speical pricing requests
9287 IF l_activity_type = 'SPECIAL_PRICE' THEN
9288 l_resale_flag := 'T';
9289 ELSE
9290 l_resale_flag := 'F';
9291 END IF;
9292
9293 IF l_offer_id IS NOT NULL AND l_cust_account_id IS NOT NULL THEN
9294 Check_Offer_Performance(
9295 p_cust_account_id => l_cust_account_id
9296 ,p_offer_id => l_offer_id
9297 ,p_resale_flag => l_resale_flag
9298 ,p_check_all_flag => 'F'
9299 ,x_performance_flag => l_performance_flag
9300 ,x_offer_perf_tbl => l_offer_perf_tbl
9301 );
9302
9303 IF l_performance_flag = FND_API.g_false THEN
9304 -- update ozf_claims.approved_flag
9305 UPDATE ozf_claims_all
9306 SET approved_flag = 'F'
9307 WHERE claim_id = p_claim_id;
9308
9309 RETURN FND_API.g_true;
9310 END IF;
9311 END IF;
9312 END LOOP;
9313 CLOSE csr_line_util;
9314
9315 -- update ozf_claims.approved_flag
9316 UPDATE ozf_claims_all
9317 SET approved_flag = 'T'
9318 WHERE claim_id = p_claim_id;
9319
9320 RETURN FND_API.g_false;
9321 END Perform_Approval_Required;
9322
9323
9324 ---------------------------------------------------------------------
9325 -- FUNCTION
9326 -- Earnings_Approval_Required
9327 --
9328 -- PURPOSE
9329 -- Returns TRUE if the claim requires earnings approval.
9330 --
9331 -- PARAMETERS
9332 -- p_claim_id
9333 --
9334 -- NOTES
9335 ---------------------------------------------------------------------
9336 FUNCTION Earnings_Approval_Required(
9337 p_claim_id IN NUMBER
9338 ) RETURN VARCHAR2
9339 IS
9340
9341 l_cust_account_id NUMBER;
9342 l_un_earned_pay_thold_type VARCHAR2(30);
9343 l_un_earned_pay_thold_amount NUMBER;
9344 l_plan_id NUMBER;
9345 l_amount_claim_asso NUMBER;
9346 l_amount_earned NUMBER;
9347 l_amount_remaining NUMBER;
9348 l_amount_threshold NUMBER;
9349 l_util_cust_account_id NUMBER;
9350 l_un_earned_pay_thold_flag VARCHAR2(1) := 'F';
9351
9352 CURSOR csr_claim_info(cv_claim_id IN NUMBER) IS
9353 SELECT cust_account_id
9354 FROM ozf_claims
9355 WHERE claim_id = cv_claim_id;
9356
9357 CURSOR csr_cust_trd_prfl_info(cv_cust_account_id IN NUMBER) IS
9358 SELECT un_earned_pay_thold_type, un_earned_pay_thold_amount, un_earned_pay_thold_flag
9359 FROM ozf_cust_trd_prfls
9360 WHERE cust_account_id = cv_cust_account_id;
9361
9362 CURSOR csr_pty_trd_prfl_info(cv_cust_account_id IN NUMBER) IS
9363 SELECT p.un_earned_pay_thold_type, p.un_earned_pay_thold_amount, p.un_earned_pay_thold_flag
9364 FROM ozf_cust_trd_prfls p, hz_cust_accounts c
9365 WHERE p.party_id = c.party_id
9366 AND p.cust_account_id IS NULL
9367 AND c.cust_account_id = cv_cust_account_id;
9368
9369 -- fix for bug 5042046
9370 CURSOR csr_sys_param_info IS
9371 SELECT un_earned_pay_thold_type, un_earned_pay_thold_amount, un_earned_pay_thold_flag
9372 FROM ozf_sys_parameters
9373 WHERE org_id = MO_GLOBAL.GET_CURRENT_ORG_ID();
9374
9375 CURSOR csr_line_util(cv_claim_id IN NUMBER) IS
9376 SELECT fu.plan_id, fu.cust_account_id, sum(lu.acctd_amount)
9377 FROM ozf_claim_lines_util lu, ozf_funds_utilized_all_b fu
9378 , ozf_claim_lines ln
9379 WHERE lu.utilization_id = fu.utilization_id
9380 AND lu.claim_line_id = ln.claim_line_id
9381 AND ln.claim_id = cv_claim_id
9382 GROUP BY fu.plan_id, fu.cust_account_id;
9383
9384 CURSOR csr_funds_util(cv_cust_account_id IN NUMBER, cv_plan_id IN NUMBER) IS
9385 SELECT sum(acctd_amount), sum(acctd_amount_remaining)
9386 FROM ozf_funds_utilized_all_b
9387 WHERE utilization_type in ('ACCRUAL', 'ADJUSTMENT')
9388 AND org_id = MO_GLOBAL.GET_CURRENT_ORG_ID()
9389 AND gl_posted_flag = 'Y'
9390 AND plan_type = 'OFFR'
9391 AND plan_id = cv_plan_id
9392 AND cust_account_id = cv_cust_account_id;
9393
9394 BEGIN
9395 -- get claim info
9396 OPEN csr_claim_info(p_claim_id);
9397 FETCH csr_claim_info INTO l_cust_account_id;
9398 CLOSE csr_claim_info;
9399
9400 l_un_earned_pay_thold_type := NULL;
9401 l_un_earned_pay_thold_amount := NULL;
9402
9403 OPEN csr_cust_trd_prfl_info(l_cust_account_id);
9404 FETCH csr_cust_trd_prfl_info INTO l_un_earned_pay_thold_type,
9405 l_un_earned_pay_thold_amount,
9406 l_un_earned_pay_thold_flag;
9407 CLOSE csr_cust_trd_prfl_info;
9408
9409 IF l_un_earned_pay_thold_type IS NULL THEN
9410 OPEN csr_pty_trd_prfl_info(l_cust_account_id);
9411 FETCH csr_pty_trd_prfl_info INTO l_un_earned_pay_thold_type,
9412 l_un_earned_pay_thold_amount,
9413 l_un_earned_pay_thold_flag;
9414 CLOSE csr_pty_trd_prfl_info;
9415
9416 IF l_un_earned_pay_thold_type IS NULL THEN
9417 OPEN csr_sys_param_info;
9418 FETCH csr_sys_param_info INTO l_un_earned_pay_thold_type,
9419 l_un_earned_pay_thold_amount,
9420 l_un_earned_pay_thold_flag;
9421 CLOSE csr_sys_param_info;
9422 END IF;
9423 END IF;
9424
9425 -- Fix for bug 5177341
9426 IF l_un_earned_pay_thold_type = 'UNCONDITIONAL' OR
9427 l_un_earned_pay_thold_flag = 'F' THEN
9428 RETURN FND_API.g_false;
9429 END IF;
9430
9431 OPEN csr_line_util(p_claim_id);
9432 LOOP
9433 FETCH csr_line_util INTO l_plan_id,
9434 l_util_cust_account_id,
9435 l_amount_claim_asso;
9436 EXIT WHEN csr_line_util%NOTFOUND;
9437
9438 OPEN csr_funds_util(l_util_cust_account_id, l_plan_id);
9439 FETCH csr_funds_util INTO l_amount_earned, l_amount_remaining;
9440 CLOSE csr_funds_util;
9441
9442 --Fix for bug 7527018
9443 IF l_amount_remaining < 0 THEN
9444 IF l_un_earned_pay_thold_type = 'PERCENT' THEN
9445 l_amount_threshold := l_amount_earned * (l_un_earned_pay_thold_amount / 100.0);
9446 ELSE
9447 l_amount_threshold := l_un_earned_pay_thold_amount;
9448 END IF;
9449
9450 --Fix for bug 7527018
9451 IF ABS(l_amount_remaining) > l_amount_threshold THEN
9452 RETURN FND_API.g_true;
9453 END IF;
9454 END IF;
9455 END LOOP;
9456 CLOSE csr_line_util;
9457
9458 RETURN FND_API.g_false;
9459 END Earnings_Approval_Required;
9460
9461
9462 ---------------------------------------------------------------------
9463 -- PROCEDURE
9464 -- Check_Offer_Performance_Tbl
9465 --
9466 -- PURPOSE
9467 -- For the associated earnings in the given claim, find the offer
9468 -- performance requirements that the customer has not met.
9469 --
9470 -- PARAMETERS
9471 -- p_claim_id : customer account id
9472 --
9473 -- HISTORY
9474 ---------------------------------------------------------------------
9475 PROCEDURE Check_Offer_Performance_Tbl(
9476 p_claim_id IN NUMBER
9477
9478 ,x_offer_perf_tbl OUT NOCOPY offer_performance_tbl_type
9479 )
9480 IS
9481
9482 l_offer_id NUMBER;
9483 l_cust_account_id NUMBER;
9484 l_performance_flag VARCHAR2(1);
9485 l_resale_flag VARCHAR2(1);
9486 l_offer_perf_tbl offer_performance_tbl_type;
9487 l_x_offer_perf_tbl offer_performance_tbl_type;
9488 l_activity_type VARCHAR2(30);
9489 l_counter PLS_INTEGER := 0;
9490
9491 CURSOR csr_line_util(cv_claim_id IN NUMBER) IS
9492 SELECT fu.plan_id, fu.cust_account_id, ln.activity_type
9493 FROM ozf_claim_lines_util lu, ozf_funds_utilized_all_b fu, ozf_claim_lines ln
9494 WHERE lu.utilization_id = fu.utilization_id
9495 AND lu.claim_line_id = ln.claim_line_id
9496 AND ln.claim_id = cv_claim_id
9497 GROUP BY fu.plan_id, fu.cust_account_id, ln.activity_type;
9498
9499 BEGIN
9500 OPEN csr_line_util(p_claim_id);
9501 LOOP
9502 FETCH csr_line_util INTO l_offer_id, l_cust_account_id, l_activity_type;
9503 EXIT WHEN csr_line_util%NOTFOUND;
9504
9505 -- check resale data for speical pricing requests
9506 IF l_activity_type = 'SPECIAL_PRICE' THEN
9507 l_resale_flag := 'T';
9508 ELSE
9509 l_resale_flag := 'F';
9510 END IF;
9511
9512 IF l_offer_id IS NOT NULL AND l_cust_account_id IS NOT NULL THEN
9513 Check_Offer_Performance(
9514 p_cust_account_id => l_cust_account_id
9515 ,p_offer_id => l_offer_id
9516 ,p_resale_flag => l_resale_flag
9517 ,p_check_all_flag => 'F'
9518 ,x_performance_flag => l_performance_flag
9519 ,x_offer_perf_tbl => l_offer_perf_tbl
9520 );
9521
9522 IF l_performance_flag = FND_API.g_false AND
9523 l_offer_perf_tbl.count > 0
9524 THEN
9525 FOR j IN l_offer_perf_tbl.FIRST..l_offer_perf_tbl.LAST LOOP
9526 l_counter := l_counter + 1;
9527 l_x_offer_perf_tbl(l_counter) := l_offer_perf_tbl(j);
9528 END LOOP;
9529 END IF;
9530 END IF;
9531 END LOOP;
9532 CLOSE csr_line_util;
9533
9534 x_offer_perf_tbl := l_x_offer_perf_tbl;
9535 END Check_Offer_Performance_Tbl;
9536
9537
9538 ---------------------------------------------------------------------
9539 -- PROCEDURE
9540 -- Check_Offer_Earning_Tbl
9541 --
9542 -- PURPOSE
9543 -- For the associated earnings in the given claim, find the offers
9544 -- whose paid amount is greater than the available amount
9545 --
9546 -- PARAMETERS
9547 -- p_claim_id : customer account id
9548 --
9549 -- HISTORY
9550 ---------------------------------------------------------------------
9551 PROCEDURE Check_Offer_Earning_Tbl(
9552 p_claim_id IN NUMBER
9553
9554 ,x_offer_earn_tbl OUT NOCOPY offer_earning_tbl_type
9555 )
9556 IS
9557 l_plan_id NUMBER;
9558 l_acctd_amount NUMBER;
9559 l_counter PLS_INTEGER := 0;
9560
9561 CURSOR csr_pay_over_earn(cv_claim_id IN NUMBER) IS
9562 SELECT lu.activity_product_id, sum(lu.acctd_amount)
9563 FROM ozf_claim_lines_util lu, ozf_claim_lines ln
9564 WHERE lu.claim_line_id = ln.claim_line_id
9565 AND lu.utilization_id = -2
9566 AND ln.claim_id = cv_claim_id
9567 GROUP BY lu.activity_product_id;
9568
9569 BEGIN
9570 OPEN csr_pay_over_earn(p_claim_id);
9571 LOOP
9572 FETCH csr_pay_over_earn INTO l_plan_id, l_acctd_amount;
9573 EXIT WHEN csr_pay_over_earn%NOTFOUND;
9574
9575 l_counter := l_counter + 1;
9576 x_offer_earn_tbl(l_counter).offer_id := l_plan_id;
9577 x_offer_earn_tbl(l_counter).acctd_amount_over := l_acctd_amount;
9578
9579 END LOOP;
9580 CLOSE csr_pay_over_earn;
9581
9582 END Check_Offer_Earning_Tbl;
9583
9584 ---------------------------------------------------------------------
9585 -- PROCEDURE
9586 -- Initiate_SD_Payment
9587 -- R12.1 Enhancements
9588 --
9589 -- PARAMETERS
9590 -- p_ship_debit_id : Ship - Debit Request/Batch Id
9591 -- p_ship_debit_type : Request Type (SUPPLIER/INTERNAL)
9592 -- p_claim_number : For SUPPLIER type ONLY
9593 --
9594 -- NOTE
9595 -- Functionally, each request/batch will create only one claim at a time.
9596 -- Although, this API is designed to create multiple claims for each S-D
9597 -- request/batch process.
9598 --
9599 -- HISTORY
9600 -- 19-OCT-2007 psomyaju Created.
9601 ---------------------------------------------------------------------
9602
9603 PROCEDURE Initiate_SD_Payment(
9604 p_api_version IN NUMBER
9605 ,p_init_msg_list IN VARCHAR2 := FND_API.g_false
9606 ,p_commit IN VARCHAR2 := FND_API.g_false
9607 ,p_validation_level IN NUMBER := FND_API.g_valid_level_full
9608 ,x_return_status OUT NOCOPY VARCHAR2
9609 ,x_msg_count OUT NOCOPY NUMBER
9610 ,x_msg_data OUT NOCOPY VARCHAR2
9611 ,p_ship_debit_id IN NUMBER
9612 ,p_ship_debit_type IN VARCHAR2
9613 ,x_claim_id OUT NOCOPY NUMBER
9614 )
9615 IS
9616 l_api_version CONSTANT NUMBER := 1.0;
9617 l_api_name CONSTANT VARCHAR2(30) := 'Initiate_SD_Payment';
9618 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
9619 l_return_status VARCHAR2(1);
9620
9621 l_cust_account_id NUMBER;
9622 l_product_id NUMBER;
9623 l_total_amount NUMBER := 0;
9624 l_claim_id NUMBER;
9625 l_payment_method VARCHAR2(30);
9626 l_cust_billto_acct_site_id NUMBER;
9627 l_claim_line_id NUMBER;
9628 l_counter PLS_INTEGER := 1;
9629 l_error_index NUMBER;
9630 l_activity_type VARCHAR2(30);
9631 l_activity_id NUMBER;
9632 l_bill_to_site_id NUMBER;
9633 l_product_level_type VARCHAR2(30);
9634 l_amount NUMBER;
9635 l_amount_offr_curr NUMBER;
9636 l_batch_id NUMBER;
9637 l_source_object_class VARCHAR2(30);
9638 l_claim_number VARCHAR2(30);
9639 l_rec_num NUMBER := 1;
9640 l_check NUMBER := 0;
9641 l_batch_type VARCHAR2(30);
9642 l_resource_id NUMBER;
9643 l_access_id NUMBER;
9644 l_claim_currency_code VARCHAR2(15);
9645 l_rate NUMBER;
9646 l_offr_currency_code VARCHAR2(15);
9647 l_sd_org_id NUMBER;
9648
9649 --Vendor details added for bug 6921727
9650 l_vendor_id NUMBER;
9651 l_vendor_site_id NUMBER;
9652
9653 --Claim lines with/without grouping w.r.t. SDR/Product - Bugfix 7811671
9654 l_sd_claim_lines_grouping VARCHAR2(30) := NVL(FND_PROFILE.VALUE('OZF_SD_CLAIM_LINES_GROUPING'),'Y');
9655 l_batch_line_id NUMBER;
9656
9657 l_funds_util_flt ozf_claim_accrual_pvt.funds_util_flt_type;
9658 l_claim_rec OZF_CLAIM_PVT.claim_rec_type;
9659 l_line_tbl OZF_CLAIM_LINE_PVT.claim_line_tbl_type;
9660 l_access_rec ams_access_pvt.access_rec_type;
9661
9662 --User details added for bug 7578152
9663 l_resp_name VARCHAR2(100) := 'Oracle Trade Management User';
9664 l_appl_id NUMBER;
9665 l_resp_id NUMBER;
9666 l_user_id NUMBER;
9667
9668 TYPE cust_util_rec_type IS RECORD
9669 ( cust_account_id NUMBER
9670 , bill_to_site_id NUMBER
9671 , claim_number VARCHAR2(30)
9672 );
9673
9674 TYPE cust_util_tbl_type is TABLE OF cust_util_rec_type
9675 INDEX BY BINARY_INTEGER;
9676
9677 l_cust_util_tbl cust_util_tbl_type;
9678
9679 CURSOR csr_uom_code(cv_item_id IN NUMBER) IS
9680 SELECT ms.primary_uom_code
9681 FROM mtl_system_items ms
9682 , mtl_parameters mp
9683 , org_organization_definitions ood
9684 WHERE ms.inventory_item_id = cv_item_id
9685 AND ms.organization_id = mp.organization_id
9686 AND mp.organization_id = mp.master_organization_Id
9687 AND mp.organization_id = ood.organization_id
9688 AND ood.operating_unit = MO_GLOBAL.GET_CURRENT_ORG_ID();
9689
9690 CURSOR csr_req_uom_code ( cv_request_id IN NUMBER
9691 , cv_product_id IN NUMBER
9692 ) IS
9693 SELECT item_uom
9694 FROM ozf_sd_request_lines_all
9695 WHERE request_header_id = cv_request_id
9696 AND inventory_item_id = cv_product_id;
9697
9698 CURSOR csr_batch_uom_code ( cv_batch_id IN NUMBER
9699 , cv_product_id IN NUMBER
9700 ) IS
9701 SELECT shipped_quantity_uom
9702 FROM ozf_sd_batch_lines_all
9703 WHERE batch_id = cv_batch_id
9704 AND item_id = cv_product_id;
9705
9706 --Bugfix:7169388
9707 --For associate earnings, claim amount and not functional amount
9708 --should be use.
9709 --Bugfix:7231613
9710 --For associate earnings, accrual currency must be passed. Derived
9711 --it from budget currency as for Ship-Debit, offer sourced from
9712 --single budget retrieved from profile.
9713 CURSOR csr_claim_lines(cv_claim_id IN NUMBER) IS
9714 SELECT claim_line_id
9715 , activity_type
9716 , activity_id
9717 , item_type
9718 , item_id
9719 -- , acctd_amount
9720 , amount --7169388
9721 , fund.approved_in_currency --7231613
9722 FROM ozf_claim_lines_all lines
9723 , ozf_offers offr
9724 , ozf_act_budgets fund
9725 , ozf_sd_request_headers_all_b req
9726 WHERE claim_id = cv_claim_id
9727 AND lines.activity_id = req.request_header_id
9728 AND req.offer_id = offr.qp_list_header_id
9729 AND offr.qp_list_header_id = fund.act_budget_used_by_id
9730 AND arc_act_budget_used_by = 'OFFR'
9731 AND transfer_type = 'REQUEST';
9732
9733 --Added created_by for bug 7578152
9734 CURSOR csr_request_currency(cv_request_id IN NUMBER) IS
9735 SELECT request_currency_code, org_id, created_by
9736 FROM ozf_sd_request_headers_all_b
9737 WHERE request_header_id = cv_request_id;
9738
9739 CURSOR csr_request_header(cv_request_id IN NUMBER) IS
9740 SELECT DISTINCT
9741 util.cust_account_id
9742 , util.bill_to_site_use_id
9743 FROM ozf_funds_utilized_all_b util
9744 WHERE util.reference_id = cv_request_id;
9745
9746 --RMA (-ive accruals) support for bugfix: 6913855
9747 CURSOR csr_request_lines(cv_request_id IN NUMBER
9748 ,cv_cust_account_id IN NUMBER
9749 ,cv_bill_to_site_id IN NUMBER) IS
9750 SELECT cust_account_id
9751 , reference_type
9752 , reference_id
9753 , bill_to_site_use_id
9754 , product_level_type
9755 , product_id
9756 , sum(plan_curr_amount_remaining)
9757 FROM ozf_funds_utilized_all_b
9758 WHERE reference_id = cv_request_id
9759 AND cust_account_id = cv_cust_account_id
9760 AND NVL(bill_to_site_use_id,1) = NVL(cv_bill_to_site_id,1)
9761 AND reference_type = 'SD_REQUEST'
9762 AND gl_posted_flag = 'Y'
9763 GROUP BY
9764 cust_account_id
9765 , reference_type
9766 , reference_id
9767 , bill_to_site_use_id
9768 , product_level_type
9769 , product_id;
9770
9771 CURSOR cur_offer_currency(cv_request_id IN NUMBER) IS
9772 SELECT offr.transaction_currency_code
9773 FROM ozf_sd_request_headers_all_b req
9774 , ozf_offers offr
9775 WHERE offr.qp_list_header_id = req.offer_id
9776 AND req.request_header_id = cv_request_id;
9777
9778 --Vendor details added for bug 6921727
9779 --Added created_by for bug 7578152
9780 CURSOR csr_batch_currency(cv_batch_id IN NUMBER) IS
9781 SELECT currency_code, org_id, vendor_id, vendor_site_id, created_by
9782 FROM ozf_sd_batch_headers_all
9783 WHERE batch_id = cv_batch_id;
9784
9785 CURSOR csr_batch_header(cv_batch_id IN NUMBER) IS
9786 SELECT DISTINCT
9787 util.cust_account_id
9788 , util.bill_to_site_use_id
9789 , head.claim_number
9790 FROM ozf_funds_utilized_all_b util
9791 , ozf_sd_batch_headers_all head
9792 , ozf_sd_batch_lines_all line
9793 WHERE head.batch_id = cv_batch_id
9794 AND head.batch_id = line.batch_id
9795 AND util.utilization_id = line.utilization_id;
9796
9797 CURSOR csr_batch_lines(cv_batch_id IN NUMBER
9798 ,cv_cust_account_id IN NUMBER
9799 ,cv_bill_to_site_id IN NUMBER) IS
9800 SELECT util.cust_account_id
9801 , util.reference_type
9802 , util.reference_id
9803 , util.bill_to_site_use_id
9804 , util.product_level_type
9805 , util.product_id
9806 , sum(line.batch_curr_claim_amount)
9807 FROM ozf_funds_utilized_all_b util
9808 , ozf_sd_batch_lines_all line
9809 WHERE line.batch_id = cv_batch_id
9810 AND util.cust_account_id = cv_cust_account_id
9811 AND NVL(util.bill_to_site_use_id,1) = NVL(cv_bill_to_site_id,1)
9812 AND util.utilization_id = line.utilization_id
9813 GROUP BY cust_account_id
9814 , bill_to_site_use_id
9815 , reference_type
9816 , reference_id
9817 , product_level_type
9818 , product_id;
9819
9820 --Added for bugfix 7811671
9821 CURSOR csr_batch_nongrp_lines(cv_batch_id IN NUMBER
9822 ,cv_cust_account_id IN NUMBER
9823 ,cv_bill_to_site_id IN NUMBER) IS
9824 SELECT util.cust_account_id
9825 , util.reference_type
9826 , util.reference_id
9827 , util.bill_to_site_use_id
9828 , util.product_level_type
9829 , util.product_id
9830 , line.batch_curr_claim_amount
9831 , line.batch_line_id
9832 FROM ozf_funds_utilized_all_b util
9833 , ozf_sd_batch_lines_all line
9834 WHERE line.batch_id = cv_batch_id
9835 AND util.cust_account_id = cv_cust_account_id
9836 AND NVL(util.bill_to_site_use_id,1) = NVL(cv_bill_to_site_id,1)
9837 AND util.utilization_id = line.utilization_id;
9838
9839 CURSOR csr_access(cv_claim_id IN NUMBER) IS
9840 SELECT resource_id
9841 FROM ozf_sd_request_access req
9842 , ozf_claim_lines line
9843 , ozf_claims cla
9844 WHERE cla.claim_id = cv_claim_id
9845 AND cla.claim_id = line.claim_id
9846 AND line.activity_id = req.request_header_id
9847 AND req.enabled_flag = 'Y'
9848 AND NOT EXISTS ( SELECT NULL
9849 FROM ams_act_access
9850 WHERE user_or_role_id = req.resource_id
9851 AND arc_user_or_role_type = 'USER'
9852 AND arc_act_access_to_object = 'CLAM'
9853 );
9854
9855 --Added csr_resp for bug 7578152
9856 CURSOR csr_resp IS
9857 SELECT application_id, responsibility_id
9858 FROM fnd_responsibility_vl
9859 WHERE responsibility_name = l_resp_name;
9860
9861
9862 BEGIN
9863 --------------------- initialize -----------------------
9864 SAVEPOINT Initiate_SD_Payment;
9865
9866 IF OZF_DEBUG_HIGH_ON THEN
9867 OZF_Utility_PVT.debug_message(l_full_name||': start');
9868 OZF_Utility_PVT.debug_message('p_ship_debit_id : '||p_ship_debit_id);
9869 OZF_Utility_PVT.debug_message('p_ship_debit_type : '||p_ship_debit_type);
9870 END IF;
9871
9872 IF FND_API.to_boolean(p_init_msg_list) THEN
9873 FND_MSG_PUB.initialize;
9874 END IF;
9875
9876 IF NOT FND_API.compatible_api_call(
9877 l_api_version,
9878 p_api_version,
9879 l_api_name,
9880 g_pkg_name
9881 ) THEN
9882 RAISE FND_API.g_exc_unexpected_error;
9883 END IF;
9884
9885 x_return_status := FND_API.g_ret_sts_success;
9886
9887 ----------------- Process batch ----------------
9888
9889 IF p_ship_debit_id IS NULL OR p_ship_debit_type IS NULL THEN
9890 RETURN;
9891 END IF;
9892
9893 --Added csr_resp for bug 7578152
9894 OPEN csr_resp;
9895 FETCH csr_resp INTO l_appl_id, l_resp_id;
9896 CLOSE csr_resp;
9897
9898 IF p_ship_debit_type = 'INTERNAL' THEN
9899
9900 --Defaulting values for INTERNAL claim
9901 l_payment_method := 'ACCOUNTING_ONLY';
9902 l_source_object_class := 'SD_INTERNAL';
9903 l_batch_id := NULL;
9904 l_batch_type := NULL;
9905
9906 --For INTERNAL claims, claim currency will be request header currency
9907 --Added l_user_id for bug 7578152
9908 OPEN csr_request_currency(p_ship_debit_id);
9909 FETCH csr_request_currency INTO l_claim_currency_code, l_sd_org_id, l_user_id;
9910 CLOSE csr_request_currency;
9911
9912 --For supplied request, get customer account/bill to site combinations of
9913 --qualified accruals
9914 IF OZF_DEBUG_HIGH_ON THEN
9915 OZF_Utility_PVT.debug_message('bill_to_site_id duplicate check verification on following cust_account_id/bill_to_site_id');
9916 END IF;
9917
9918 OPEN csr_request_header(p_ship_debit_id);
9919 LOOP
9920 FETCH csr_request_header INTO l_cust_util_tbl(l_counter).cust_account_id
9921 ,l_cust_util_tbl(l_counter).bill_to_site_id;
9922
9923 EXIT WHEN csr_request_header%NOTFOUND;
9924
9925 IF OZF_DEBUG_HIGH_ON THEN
9926 OZF_Utility_PVT.debug_message('cust_account_id : '||l_cust_util_tbl(l_counter).cust_account_id);
9927 OZF_Utility_PVT.debug_message('bill_to_site_id : '||l_cust_util_tbl(l_counter).bill_to_site_id);
9928 END IF;
9929
9930 l_counter := l_counter + 1;
9931 END LOOP;
9932 CLOSE csr_request_header;
9933
9934 ELSIF p_ship_debit_type = 'SUPPLIER' THEN
9935
9936 --Default values for SUPPLIER claim
9937 l_payment_method := 'AP_DEBIT';
9938 l_source_object_class := 'SD_SUPPLIER';
9939 l_batch_id := p_ship_debit_id;
9940 l_batch_type := 'SD_BATCH';
9941
9942 --For SUPPLIER claims, claim currency will be batch header currency
9943 --Vendor details added for bug 6921727
9944 --Added l_user_id for bug 7578152
9945 OPEN csr_batch_currency(p_ship_debit_id);
9946 FETCH csr_batch_currency INTO l_claim_currency_code, l_sd_org_id, l_vendor_id, l_vendor_site_id, l_user_id;
9947 CLOSE csr_batch_currency;
9948
9949 --For supplied batch_id, get customer accounts, respective bill to site id and
9950 --claim number defined in batch header. If claim number doesn't exists, system
9951 --will use default claim number generation mechanism.
9952
9953 IF OZF_DEBUG_HIGH_ON THEN
9954 OZF_Utility_PVT.debug_message('bill_to_site_id duplicate check verification on following cust_account_id/bill_to_site_id');
9955 END IF;
9956
9957 OPEN csr_batch_header(p_ship_debit_id);
9958 LOOP
9959 FETCH csr_batch_header INTO l_cust_util_tbl(l_counter).cust_account_id
9960 , l_cust_util_tbl(l_counter).bill_to_site_id
9961 , l_cust_util_tbl(l_counter).claim_number;
9962 EXIT WHEN csr_batch_header%NOTFOUND;
9963
9964 IF OZF_DEBUG_HIGH_ON THEN
9965 OZF_Utility_PVT.debug_message('cust_account_id : '||l_cust_util_tbl(l_counter).cust_account_id);
9966 OZF_Utility_PVT.debug_message('bill_to_site_id : '||l_cust_util_tbl(l_counter).bill_to_site_id);
9967 OZF_Utility_PVT.debug_message('claim_number : '||l_cust_util_tbl(l_counter).claim_number);
9968 END IF;
9969
9970 l_counter := l_counter + 1;
9971 END LOOP;
9972 CLOSE csr_batch_header;
9973
9974 END IF;
9975
9976 --Initialization of organization context
9977 MO_GLOBAL.init('OZF');
9978 MO_GLOBAL.set_policy_context('S', l_sd_org_id);
9979
9980 -- Initialization added for bug 7578152
9981 IF Nvl(fnd_global.user_id,-1) IN (0,-1) THEN
9982 FND_GLOBAL.APPS_INITIALIZE(l_user_id, l_resp_id, l_appl_id);
9983 END IF;
9984
9985 OZF_Utility_PVT.debug_message('Org Id : OZF_CLAIM_ACCRUAL_PVT - '||MO_GLOBAL.GET_CURRENT_ORG_ID());
9986 OZF_Utility_PVT.debug_message('User Id : OZF_CLAIM_ACCRUAL_PVT - '||fnd_global.user_id);
9987
9988 IF OZF_DEBUG_HIGH_ON THEN
9989 OZF_Utility_PVT.debug_message('l_payment_method : '||l_payment_method);
9990 OZF_Utility_PVT.debug_message('l_source_object_class : '||l_source_object_class);
9991 OZF_Utility_PVT.debug_message('l_batch_id : '||l_batch_id);
9992 OZF_Utility_PVT.debug_message('l_batch_type : '||l_batch_type);
9993 OZF_Utility_PVT.debug_message('l_claim_currency_code : '||l_claim_currency_code);
9994 END IF;
9995
9996 l_counter := 1;
9997
9998 --If customer accounts have multiple bill to sites, then process will be aborted.
9999 --Since, INTERNAL claims always have 1:1 mapping with customer accounts and bill
10000 --to sites, so below validation will fail only for SUPPLIER claims.
10001 IF l_cust_util_tbl.COUNT > 1 THEN
10002 FOR i IN l_cust_util_tbl.FIRST..l_cust_util_tbl.LAST
10003 LOOP
10004 l_cust_account_id := l_cust_util_tbl(i).cust_account_id;
10005 l_check := 0;
10006 FOR j IN l_cust_util_tbl.FIRST..l_cust_util_tbl.LAST
10007 LOOP
10008 IF l_cust_account_id = l_cust_util_tbl(j).cust_account_id THEN
10009 l_check := l_check + 1;
10010 END IF;
10011 END LOOP;
10012 IF l_check > 1 THEN
10013 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10014 FND_MESSAGE.Set_Name('OZF', 'OZF_DUP_CUST_ACCTS');
10015 FND_MESSAGE.Set_Token('CUST_ACCOUNT_ID', l_cust_util_tbl(i).cust_account_id);
10016 FND_MSG_PUB.ADD;
10017 END IF;
10018 RAISE FND_API.g_exc_unexpected_error;
10019 END IF;
10020 END LOOP;
10021 END IF;
10022
10023 --Create claims for cust_account_id and bill_to_site_id
10024 IF OZF_DEBUG_HIGH_ON THEN
10025 OZF_Utility_PVT.debug_message('bill_to_site_id duplicate check passed: Creating claims for each cust_account_id/bill_to_site_id');
10026 END IF;
10027
10028 IF l_cust_util_tbl.COUNT > 0 THEN
10029 FOR i IN l_cust_util_tbl.FIRST..l_cust_util_tbl.LAST
10030 LOOP
10031 l_cust_account_id := l_cust_util_tbl(i).cust_account_id;
10032 l_bill_to_site_id := l_cust_util_tbl(i).bill_to_site_id;
10033 l_claim_number := l_cust_util_tbl(i).claim_number;
10034
10035 IF OZF_DEBUG_HIGH_ON THEN
10036 OZF_Utility_PVT.debug_message('l_cust_account_id : '||l_cust_account_id);
10037 OZF_Utility_PVT.debug_message('l_bill_to_site_id : '||l_bill_to_site_id);
10038 OZF_Utility_PVT.debug_message('l_claim_number : '||l_claim_number);
10039 END IF;
10040
10041 IF p_ship_debit_type = 'INTERNAL' THEN
10042 --Get all accurals which are qualifying for supplied request and
10043 --customer account and bill to sites combinations.
10044 OPEN csr_request_lines(p_ship_debit_id
10045 ,l_cust_account_id
10046 ,l_bill_to_site_id);
10047
10048 ELSIF p_ship_debit_type = 'SUPPLIER' THEN
10049 --Get all accruals which are qualifying for supplied batch and
10050 --customer account and bill to sites combinations.
10051 --l_sd_claim_lines_grouping check added for bugfix 7811671
10052 IF l_sd_claim_lines_grouping = 'Y' THEN
10053 OPEN csr_batch_lines(p_ship_debit_id
10054 ,l_cust_account_id
10055 ,l_bill_to_site_id);
10056 ELSIF l_sd_claim_lines_grouping = 'N' THEN
10057 OPEN csr_batch_nongrp_lines(p_ship_debit_id
10058 ,l_cust_account_id
10059 ,l_bill_to_site_id);
10060 END IF;
10061 END IF;
10062
10063 LOOP
10064 IF p_ship_debit_type = 'INTERNAL' THEN
10065 FETCH csr_request_lines INTO l_cust_account_id
10066 , l_activity_type
10067 , l_activity_id
10068 , l_bill_to_site_id
10069 , l_product_level_type
10070 , l_product_id
10071 , l_amount;
10072
10073 EXIT WHEN csr_request_lines%NOTFOUND;
10074 ELSIF p_ship_debit_type = 'SUPPLIER' THEN
10075 IF l_sd_claim_lines_grouping = 'Y' THEN
10076 FETCH csr_batch_lines INTO l_cust_account_id
10077 , l_activity_type
10078 , l_activity_id
10079 , l_bill_to_site_id
10080 , l_product_level_type
10081 , l_product_id
10082 , l_amount;
10083
10084 EXIT WHEN csr_batch_lines%NOTFOUND;
10085 ELSIF l_sd_claim_lines_grouping = 'N' THEN
10086 FETCH csr_batch_nongrp_lines INTO l_cust_account_id
10087 , l_activity_type
10088 , l_activity_id
10089 , l_bill_to_site_id
10090 , l_product_level_type
10091 , l_product_id
10092 , l_amount
10093 , l_batch_line_id;
10094
10095 EXIT WHEN csr_batch_nongrp_lines%NOTFOUND;
10096 END IF;
10097 END IF;
10098
10099 IF OZF_DEBUG_HIGH_ON THEN
10100 OZF_Utility_PVT.debug_message(' l_cust_account_id : '||l_cust_account_id);
10101 OZF_Utility_PVT.debug_message(' l_activity_type : '||l_activity_type);
10102 OZF_Utility_PVT.debug_message(' l_activity_id : '||l_activity_id);
10103 OZF_Utility_PVT.debug_message(' l_bill_to_site_id : '||l_bill_to_site_id);
10104 OZF_Utility_PVT.debug_message(' l_product_level_type : '||l_product_level_type);
10105 OZF_Utility_PVT.debug_message(' l_product_id : '||l_product_id);
10106 OZF_Utility_PVT.debug_message(' l_amount : '||l_amount);
10107 OZF_Utility_PVT.debug_message(' l_batch_line_id : '||l_batch_line_id);
10108 END IF;
10109
10110 --If claim currency and accrual(offer) currency is not same, then convert
10111 --offer amount from offer currency to claim currency.
10112 --This case is applicable only for INTERNAL claims as for SUPPLIER claims
10113 --amount in claim (batch header) currency retrieved.
10114 IF p_ship_debit_type = 'INTERNAL' THEN
10115 OPEN cur_offer_currency(p_ship_debit_id);
10116 FETCH cur_offer_currency INTO l_offr_currency_code;
10117 CLOSE cur_offer_currency;
10118
10119 IF l_offr_currency_code <> l_claim_currency_code THEN
10120 l_amount_offr_curr := l_amount;
10121 OZF_UTILITY_PVT.Convert_Currency(
10122 p_from_currency => l_offr_currency_code
10123 ,p_to_currency => l_claim_currency_code
10124 ,p_conv_date => SYSDATE
10125 ,p_from_amount => l_amount_offr_curr
10126 ,x_return_status => l_return_status
10127 ,x_to_amount => l_amount
10128 );
10129 IF l_return_status = FND_API.g_ret_sts_error THEN
10130 RAISE FND_API.g_exc_error;
10131 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
10132 RAISE FND_API.g_exc_unexpected_error;
10133 END IF;
10134 END IF;
10135 END IF;
10136
10137 --Ship-Debit doesn't require Prorate Earnings.
10138 --Setting line level attributes w.r.t. accrual details
10139 l_line_tbl(l_counter).prorate_earnings_flag := 'F';
10140 l_line_tbl(l_counter).claim_currency_amount := l_amount;
10141 l_line_tbl(l_counter).activity_type := l_activity_type;
10142 l_line_tbl(l_counter).activity_id := l_activity_id;
10143 l_line_tbl(l_counter).item_type := l_product_level_type;
10144 l_line_tbl(l_counter).item_id := l_product_id;
10145 l_line_tbl(l_counter).batch_line_id := l_batch_line_id;
10146
10147 --If product UOM is not defined then get primary UOM of product.
10148 IF l_product_level_type = 'PRODUCT' AND l_product_id IS NOT NULL THEN
10149 IF p_ship_debit_type = 'INTERNAL' THEN
10150 OPEN csr_req_uom_code(p_ship_debit_id,l_line_tbl(l_counter).item_id);
10151 FETCH csr_req_uom_code INTO l_line_tbl(l_counter).quantity_uom;
10152 CLOSE csr_req_uom_code;
10153 ELSIF p_ship_debit_type = 'SUPPLIER' THEN
10154 OPEN csr_batch_uom_code(p_ship_debit_id,l_line_tbl(l_counter).item_id);
10155 FETCH csr_batch_uom_code INTO l_line_tbl(l_counter).quantity_uom;
10156 CLOSE csr_batch_uom_code;
10157 END IF;
10158
10159 IF l_line_tbl(l_counter).quantity_uom IS NULL THEN
10160 OPEN csr_uom_code(l_line_tbl(l_counter).item_id);
10161 FETCH csr_uom_code INTO l_line_tbl(l_counter).quantity_uom;
10162 IF csr_uom_code%NOTFOUND THEN
10163 CLOSE csr_uom_code;
10164 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10165 FND_MESSAGE.Set_Name('OZF', 'OZF_PRODUCT_UOM_MISSING');
10166 FND_MESSAGE.Set_Token('ITEM_ID', l_line_tbl(l_counter).item_id);
10167 FND_MSG_PUB.ADD;
10168 END IF;
10169 RAISE FND_API.g_exc_unexpected_error;
10170 END IF;
10171 CLOSE csr_uom_code;
10172 END IF;
10173 END IF;
10174
10175 --Calculate claim header amount in claim currency
10176 l_total_amount := l_total_amount + l_amount;
10177 l_counter := l_counter + 1;
10178
10179 END LOOP;
10180
10181 --Raise error, if no accrual exists, may happen for INTERNAL claims only
10182 IF l_counter = 1 THEN
10183 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10184 FND_MESSAGE.Set_Name('OZF', 'OZF_ACCRUAL_NOT_EXISTS');
10185 FND_MSG_PUB.ADD;
10186 END IF;
10187 RAISE FND_API.g_exc_unexpected_error;
10188 END IF;
10189
10190 IF p_ship_debit_type = 'INTERNAL' THEN
10191 CLOSE csr_request_lines;
10192 ELSIF p_ship_debit_type = 'SUPPLIER' THEN
10193 IF l_sd_claim_lines_grouping = 'Y' THEN
10194 CLOSE csr_batch_lines;
10195 ELSIF l_sd_claim_lines_grouping = 'N' THEN
10196 CLOSE csr_batch_nongrp_lines;
10197 END IF;
10198 END IF;
10199
10200 --If multiple claims are created then claim number of batch will be used for first claim only.
10201 IF l_rec_num > 1 THEN
10202 l_claim_number := NULL;
10203 END IF;
10204
10205 --Setting values for claim header attributes
10206 --Vendor details added for bug 6921727
10207 l_claim_rec.cust_account_id := l_cust_account_id;
10208 l_claim_rec.claim_class := 'CLAIM';
10209 l_claim_rec.source_object_class := l_source_object_class;
10210 l_claim_rec.source_object_id := p_ship_debit_id;
10211 l_claim_rec.batch_id := l_batch_id;
10212 l_claim_rec.batch_type := l_batch_type;
10213 l_claim_rec.currency_code := l_claim_currency_code;
10214 l_claim_rec.amount := l_total_amount;
10215 l_claim_rec.payment_method := l_payment_method;
10216 l_claim_rec.cust_billto_acct_site_id := l_cust_billto_acct_site_id;
10217 l_claim_rec.status_code := 'OPEN';
10218 l_claim_rec.claim_number := l_claim_number;
10219 l_claim_rec.vendor_id := l_vendor_id;
10220 l_claim_rec.vendor_site_id := l_vendor_site_id;
10221 l_claim_rec.org_id := l_sd_org_id;
10222 l_claim_rec.user_status_id := to_number(
10223 ozf_utility_pvt.get_default_user_status(
10224 p_status_type => 'OZF_CLAIM_STATUS',
10225 p_status_code => l_claim_rec.status_code));
10226
10227 IF OZF_DEBUG_HIGH_ON THEN
10228 OZF_Utility_PVT.debug_message('Claim header information:');
10229 OZF_Utility_PVT.debug_message('l_cust_account_id : '||l_claim_rec.cust_account_id);
10230 OZF_Utility_PVT.debug_message('claim_class : '||l_claim_rec.claim_class);
10231 OZF_Utility_PVT.debug_message('source_object_class : '||l_claim_rec.source_object_class);
10232 OZF_Utility_PVT.debug_message('source_object_number : '||l_claim_rec.source_object_number);
10233 OZF_Utility_PVT.debug_message('batch_id : '||l_claim_rec.batch_id);
10234 OZF_Utility_PVT.debug_message('batch_type : '||l_claim_rec.batch_type);
10235 OZF_Utility_PVT.debug_message('currency_code : '||l_claim_rec.currency_code);
10236 OZF_Utility_PVT.debug_message('amount : '||l_claim_rec.amount);
10237 OZF_Utility_PVT.debug_message('payment_method : '||l_claim_rec.payment_method);
10238 OZF_Utility_PVT.debug_message('cust_billto_acct_site_id : '||l_claim_rec.cust_billto_acct_site_id);
10239 OZF_Utility_PVT.debug_message('status_code : '||l_claim_rec.status_code);
10240 OZF_Utility_PVT.debug_message('claim_number : '||l_claim_rec.claim_number);
10241 OZF_Utility_PVT.debug_message('vendor_id : '||l_claim_rec.vendor_id);
10242 OZF_Utility_PVT.debug_message('vendor_site_id : '||l_claim_rec.vendor_site_id);
10243 OZF_Utility_PVT.debug_message('org_id : '||l_claim_rec.org_id);
10244 OZF_Utility_PVT.debug_message('user_status_id : '||l_claim_rec.user_status_id);
10245 END IF;
10246
10247
10248 --For INTERNAL negative claims, claim class need to be changed.
10249 IF p_ship_debit_type = 'INTERNAL' and l_claim_rec.amount < 0 THEN
10250 l_claim_rec.claim_class := 'CHARGE';
10251 END IF;
10252
10253 --Create negative claims only for INTERNAL requests. For SUPPLIER, if
10254 --amount is negative, raise error.
10255 IF (p_ship_debit_type = 'SUPPLIER' and l_claim_rec.amount > 0) OR
10256 (p_ship_debit_type = 'INTERNAL' and l_claim_rec.amount <> 0) THEN
10257
10258 --Claim header creation
10259 OZF_CLAIM_PVT.Create_Claim(
10260 p_api_version => l_api_version
10261 ,x_return_status => l_return_status
10262 ,x_msg_data => x_msg_data
10263 ,x_msg_count => x_msg_count
10264 ,p_claim => l_claim_rec
10265 ,x_claim_id => l_claim_id
10266 );
10267
10268 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10269 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10270 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10271 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10272 END IF;
10273
10274 IF l_rec_num = 1 THEN
10275 x_claim_id := l_claim_id;
10276 END IF;
10277
10278 IF OZF_DEBUG_HIGH_ON THEN
10279 OZF_Utility_PVT.debug_message('Created claim id:'||l_claim_id);
10280 END IF;
10281
10282 FOR i IN l_line_tbl.FIRST..l_line_tbl.LAST
10283 LOOP
10284 IF l_line_tbl.exists(i) IS NOT NULL THEN
10285 l_line_tbl(i).claim_id := l_claim_id;
10286 END IF;
10287 END LOOP;
10288
10289 --Claim line creation
10290 OZF_CLAIM_LINE_PVT.Create_Claim_Line_Tbl(
10291 p_api_version => 1.0
10292 ,p_init_msg_list => FND_API.g_false
10293 ,p_commit => FND_API.g_false
10294 ,p_validation_level => FND_API.g_valid_level_full
10295 ,x_return_status => l_return_status
10296 ,x_msg_count => x_msg_count
10297 ,x_msg_data => x_msg_data
10298 ,p_claim_line_tbl => l_line_tbl
10299 ,x_error_index => l_error_index
10300 );
10301
10302 IF l_return_status = FND_API.g_ret_sts_error THEN
10303 RAISE FND_API.g_exc_error;
10304 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
10305 RAISE FND_API.g_exc_error;
10306 END IF;
10307
10308 IF OZF_DEBUG_HIGH_ON THEN
10309 OZF_Utility_PVT.debug_message('Claim lines created for claim_id=' || l_claim_id);
10310 END IF;
10311
10312 OPEN csr_claim_lines(l_claim_id);
10313 LOOP
10314 FETCH csr_claim_lines INTO l_funds_util_flt.claim_line_id
10315 , l_funds_util_flt.activity_type
10316 , l_funds_util_flt.activity_id
10317 , l_funds_util_flt.product_level_type
10318 , l_funds_util_flt.product_id
10319 , l_funds_util_flt.total_amount
10320 , l_funds_util_flt.utiz_currency_code; --7231613
10321 EXIT WHEN csr_claim_lines%NOTFOUND;
10322
10323 --Claim Line/Utilizations association
10324 Update_Group_Line_Util(
10325 p_api_version => l_api_version
10326 ,p_init_msg_list => FND_API.g_false
10327 ,p_commit => FND_API.g_false
10328 ,p_validation_level => p_validation_level
10329 ,x_return_status => l_return_status
10330 ,x_msg_count => x_msg_count
10331 ,x_msg_data => x_msg_data
10332 ,p_summary_view => 'ACTIVITY'
10333 ,p_funds_util_flt => l_funds_util_flt
10334 ,p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
10335 );
10336
10337 IF l_return_status = FND_API.g_ret_sts_error THEN
10338 RAISE FND_API.g_exc_error;
10339 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
10340 RAISE FND_API.g_exc_error;
10341 END IF;
10342
10343 END LOOP;
10344 CLOSE csr_claim_lines;
10345
10346 --Settle claim using settlement method as ACCOUNTING_ONLY/AP_DEBIT as per case.
10347 Settle_Claim(
10348 p_claim_id => l_claim_id
10349 ,x_return_status => l_return_status
10350 ,x_msg_count => x_msg_count
10351 ,x_msg_data => x_msg_data
10352 );
10353
10354
10355 IF l_return_status = fnd_api.g_ret_sts_error THEN
10356 RAISE FND_API.g_exc_error;
10357 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
10358 RAISE FND_API.g_exc_unexpected_error;
10359 END IF;
10360 ELSIF l_claim_rec.amount = 0 THEN
10361 --Raise error, if claim amount is zero. Claim header is not allowed with
10362 --zero amount.
10363 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10364 FND_MESSAGE.Set_Name('OZF', 'OZF_EARN_AVAIL_AMT_ZERO');
10365 FND_MSG_PUB.ADD;
10366 END IF;
10367 RAISE FND_API.g_exc_unexpected_error;
10368 ELSE
10369 --Raise error, if claim amount is negative.
10370 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10371 FND_MESSAGE.Set_Name('OZF', 'OZF_CLAIM_AMOUNT_NEGATIVE');
10372 FND_MSG_PUB.ADD;
10373 END IF;
10374 RAISE FND_API.g_exc_unexpected_error;
10375 END IF;
10376
10377 --Set Claim Access
10378 OPEN csr_access(l_claim_id);
10379 LOOP
10380 FETCH csr_access INTO l_resource_id;
10381 EXIT WHEN csr_access%NOTFOUND;
10382 l_access_rec.user_or_role_id := l_resource_id;
10383 l_access_rec.arc_user_or_role_type := 'USER';
10384 l_access_rec.act_access_to_object_id := l_claim_id;
10385 l_access_rec.arc_act_access_to_object := 'CLAM';
10386
10387 IF OZF_DEBUG_HIGH_ON THEN
10388 OZF_Utility_PVT.debug_message('Claim access information:');
10389 OZF_Utility_PVT.debug_message('user_or_role_id : '||l_access_rec.user_or_role_id);
10390 OZF_Utility_PVT.debug_message('arc_user_or_role_type : '||l_access_rec.arc_user_or_role_type);
10391 OZF_Utility_PVT.debug_message('act_access_to_object_id : '||l_access_rec.act_access_to_object_id);
10392 OZF_Utility_PVT.debug_message('arc_act_access_to_object : '||l_access_rec.arc_act_access_to_object);
10393 END IF;
10394
10395 ams_access_pvt.create_access ( p_api_version => l_api_version
10396 , p_init_msg_list => fnd_api.g_false
10397 , p_validation_level => fnd_api.g_valid_level_full
10398 , x_return_status => x_return_status
10399 , x_msg_count => x_msg_count
10400 , x_msg_data => x_msg_data
10401 , p_commit => fnd_api.g_false
10402 , p_access_rec => l_access_rec
10403 , x_access_id => l_access_id
10404 );
10405 END LOOP;
10406 CLOSE csr_access;
10407
10408 l_rec_num := l_rec_num + 1;
10409
10410 END LOOP;
10411 ELSE
10412 --Raise error, if no accrual exists, may happen for INTERNAL claims only
10413 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10414 FND_MESSAGE.Set_Name('OZF', 'OZF_ACCRUAL_NOT_EXISTS');
10415 FND_MSG_PUB.ADD;
10416 END IF;
10417 RAISE FND_API.g_exc_unexpected_error;
10418 END IF;
10419
10420 ------------------------- finish -------------------------------
10421 -- Check for commit
10422 IF FND_API.to_boolean(p_commit) THEN
10423 COMMIT;
10424 END IF;
10425
10426 FND_MSG_PUB.count_and_get(
10427 p_encoded => FND_API.g_false,
10428 p_count => x_msg_count,
10429 p_data => x_msg_data
10430 );
10431
10432 IF OZF_DEBUG_HIGH_ON THEN
10433 OZF_Utility_PVT.debug_message(l_full_name ||': end');
10434 END IF;
10435
10436 EXCEPTION
10437 WHEN FND_API.g_exc_error THEN
10438 ROLLBACK TO Initiate_SD_Payment;
10439 x_return_status := FND_API.g_ret_sts_error;
10440 FND_MSG_PUB.count_and_get (
10441 p_encoded => FND_API.g_false
10442 ,p_count => x_msg_count
10443 ,p_data => x_msg_data
10444 );
10445
10446 WHEN FND_API.g_exc_unexpected_error THEN
10447 ROLLBACK TO Initiate_SD_Payment;
10448 x_return_status := FND_API.g_ret_sts_unexp_error ;
10449 FND_MSG_PUB.count_and_get (
10450 p_encoded => FND_API.g_false
10451 ,p_count => x_msg_count
10452 ,p_data => x_msg_data
10453 );
10454
10455 WHEN OTHERS THEN
10456 ROLLBACK TO Initiate_SD_Payment;
10457 x_return_status := FND_API.g_ret_sts_unexp_error ;
10458 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_unexp_error) THEN
10459 FND_MSG_PUB.add_exc_msg(g_pkg_name, l_api_name);
10460 END IF;
10461 FND_MSG_PUB.count_and_get(
10462 p_encoded => FND_API.g_false
10463 ,p_count => x_msg_count
10464 ,p_data => x_msg_data
10465 );
10466
10467 END Initiate_SD_Payment;
10468
10469 END OZF_Claim_Accrual_PVT;