DBA Data[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;