[Home] [Help]
PACKAGE BODY: APPS.OZF_CLAIM_UTILITY_PVT
Source
1 PACKAGE BODY OZF_claim_Utility_pvt as
2 /* $Header: ozfvcutb.pls 120.11.12020000.3 2012/08/08 09:53:51 ninarasi ship $ */
3 -- Start of Comments
4 -- Package name : OZF_claim_Utility_pvt
5 -- Purpose :
6 -- History : Fix for Bug#12882998 : THE CLAIMS RULE BASED SETTLEMENT ENGINE
7 -- PROGRAM IS NOT LOOKING AT THE REMAINING
8 -- NOTE :
9 --8-Aug-2012 ninarasi Bug 13498038 - CLAIM CUSTOMER REFERENCE NEEDS TO EXPAND TO 100 CHARACTERS TO BE SAME AS AR
10 -- End of Comments
11
12 G_PKG_NAME CONSTANT VARCHAR2(30) := 'OZF_CLAIM_UTILITY_PVT';
13
14 G_FILE_NAME CONSTANT VARCHAR2(12) := 'ozfvcutb.pls';
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_high);
18 g_bulk_limit CONSTANT NUMBER := 5000; -- yzhao: Sep 8,2005 bulk fetch limit. It should get from profile.
19
20
21
22 -- *******************************************************
23 -- Start of Comments
24 -- *******************************************************
25 -- API Name: Check_Claim_Access
26 -- Type : Public
27 -- Pre-Req :
28 -- Parameters:
29 -- IN
30 -- p_api_version_number IN NUMBER Required
31 -- p_init_msg_list IN VARCHAR2 Optional Default = FND_API_G_FALSE
32 -- p_commit IN VARCHAR2 Optional Default = FND_API.G_FALSE
33 -- p_validation_level IN NUMBER Optional Default = FND_API.G_VALID_LEVEL_FULL
34 -- P_object_id IN NUMBER
35 -- P_object_type IN VARCHAR2
36 -- P_user_id IN NUMBER
37 --
38 -- OUT:
39 -- x_return_status OUT VARCHAR2
40 -- x_msg_count OUT NUMBER
41 -- x_msg_data OUT VARCHAR2
42 -- x_access OUT VARCHAR2 F : FULL: User can update any data
43 -- R : RESTRICTED : User can only update data other than owner
44 -- N : NULL : User has no update priviledge
45 -- Version : Current version 1.0
46 --
47 -- Note: This procedure checks security access to a claim of a user
48 --
49 -- End of Comments
50 --
51 PROCEDURE Check_Claim_access(
52 P_Api_Version_Number IN NUMBER,
53 P_Init_Msg_List IN VARCHAR2 := FND_API.G_FALSE,
54 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
55 P_Commit IN VARCHAR2 := FND_API.G_FALSE,
56 P_object_id IN NUMBER,
57 P_object_type IN VARCHAR2,
58 P_user_id IN NUMBER,
59
60 X_Return_Status OUT NOCOPY VARCHAR2,
61 X_Msg_Count OUT NOCOPY NUMBER,
62 X_Msg_Data OUT NOCOPY VARCHAR2,
63 x_access OUT NOCOPY VARCHAR2
64 )
65 IS
66 l_api_name CONSTANT VARCHAR2(30) := 'Check_Claim_access';
67 l_api_version_number CONSTANT NUMBER := 1.0;
68 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
69 l_profile_value VARCHAR2(30);
70
71 l_access varchar2(1) :='N'; -- F : FULL: User can update sensitive metric data
72 -- R : RESTRICTED : User can only update data other than sensitive metric data
73 -- N : NULL : User is no
74 BEGIN
75 -- Standard Start of API savepoint
76 SAVEPOINT Check_Claim_ACC;
77
78 IF OZF_DEBUG_HIGH_ON THEN
79 OZF_Utility_PVT.debug_message(l_full_name||': start');
80 END IF;
81
82 -- Standard call to check for call compatibility.
83 IF NOT FND_API.Compatible_API_Call ( l_api_version_number,
84 p_api_version_number,
85 l_api_name,
86 G_PKG_NAME)
87 THEN
88 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
89 END IF;
90
91 -- Initialize message list if p_init_msg_list is set to TRUE.
92 IF FND_API.to_Boolean( p_init_msg_list )
93 THEN
94 FND_MSG_PUB.initialize;
95 END IF;
96
97 -- Initialize API return status to SUCCESS
98 x_return_status := FND_API.G_RET_STS_SUCCESS;
99
100 /* IF AMS_access_PVT.check_owner(
101 p_object_id IN NUMBER,
102 p_object_type IN VARCHAR2,
103 p_user_or_role_id IN NUMBER,
104 p_user_or_role_type ) OR
105 */
106 -- There is no need to check the owner since owner and group memeber has the same update priviledge.
107 l_access :=AMS_access_PVT.check_update_access(
108 p_object_id => P_object_id,
109 p_object_type => P_object_type,
110 p_user_or_role_id => p_user_id,
111 p_user_or_role_type => 'USER'
112 );
113
114 IF l_access = 'F' OR AMS_access_PVT.Check_Admin_access(p_resource_id => p_user_id) THEN
115 x_access := 'F';
116 ELSE
117 l_profile_value := NVL(fnd_profile.value('OZF_CLAIM_UPDATE_ACCESS'), 'VIEW');
118 IF l_profile_value = 'UPDATE' THEN
119 x_access := 'R';
120 ELSE
121 x_access := 'N';
122 END IF;
123 END IF;
124
125 IF OZF_DEBUG_HIGH_ON THEN
126 OZF_Utility_PVT.debug_message('user_id='||p_user_id||' update_access is '||l_access);
127 OZF_Utility_PVT.debug_message('claim access is '||x_access);
128 END IF;
129
130 --
131 -- End of API body
132 --
133 -- Standard check for p_commit
134 IF FND_API.to_Boolean( p_commit )
135 THEN
136 COMMIT WORK;
137 END IF;
138
139 IF OZF_DEBUG_HIGH_ON THEN
140 OZF_Utility_PVT.debug_message(l_full_name||': end');
141 END IF;
142
143 -- Standard call to get message count and if count is 1, get message info.
144 FND_MSG_PUB.Count_And_Get
145 (p_count => x_msg_count,
146 p_data => x_msg_data
147 );
148 EXCEPTION
149 WHEN FND_API.G_EXC_ERROR THEN
150 ROLLBACK TO Check_Claim_ACC;
151 x_return_status := FND_API.G_RET_STS_ERROR;
152 -- Standard call to get message count and if count=1, get the message
153 FND_MSG_PUB.Count_And_Get (
154 p_encoded => FND_API.G_FALSE,
155 p_count => x_msg_count,
156 p_data => x_msg_data
157 );
158 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
159 ROLLBACK TO Check_Claim_ACC;
160 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
161 -- Standard call to get message count and if count=1, get the message
162 FND_MSG_PUB.Count_And_Get (
163 p_encoded => FND_API.G_FALSE,
164 p_count => x_msg_count,
165 p_data => x_msg_data
166 );
167 WHEN OTHERS THEN
168 ROLLBACK TO Check_Claim_ACC;
169 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
170 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
171 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CHK_ACS_ERR');
172 FND_MSG_PUB.add;
173 END IF;
174 -- Standard call to get message count and if count=1, get the message
175 FND_MSG_PUB.Count_And_Get (
176 p_encoded => FND_API.G_FALSE,
177 p_count => x_msg_count,
178 p_data => x_msg_data
179 );
180 End Check_Claim_access;
181
182 -- *******************************************************
183 -- Start of Comments
184 -- *******************************************************
185 -- API Name: Normalize_Customer_Reference
186 -- Type : Public
187 -- Pre-Req :
188 -- Parameters:
189 -- IN
190 -- p_customer_reference IN VARCHAR2
191 --
192 -- OUT:
193 -- x_normalized_reference OUT VARCHAR2
194 -- Version : Current version 1.0
195 --
196 -- Note: This procedure normalizes the customer reference number.
197 --
198 -- End of Comments
199 --
200 PROCEDURE Normalize_Customer_Reference (
201 p_customer_reference IN VARCHAR2
202 ,x_normalized_reference OUT NOCOPY VARCHAR2
203 )
204 IS
205
206 l_normalized_reference VARCHAR2(100) := ''; --Fix for bug 13498038
207 l_char VARCHAR2(1);
208
209 BEGIN
210 -- loop over all characters
211 FOR i IN 1..LENGTH(p_customer_reference) LOOP
212 l_char := SUBSTRB(p_customer_reference, i, 1);
213
214 -- change 'O' and 'o' to '0'
215 IF l_char = 'O' OR l_char = 'o' THEN
216 l_normalized_reference := l_normalized_reference || '0';
217
218 -- change 'I' and 'l' to '1'
219 ELSIF l_char = 'I' OR l_char = 'l' THEN
220 l_normalized_reference := l_normalized_reference || '1';
221
222 -- ignore special characters; change characters to upper case
223 ELSIF INSTR(' !"#$%&''()*+,-./:;<>=?@[\]^{|}~', l_char) = 0 THEN
224 l_normalized_reference := l_normalized_reference || UPPER(l_char);
225 END IF;
226 END LOOP;
227
228 -- remove prefix 'DM'
229 l_normalized_reference := LTRIM(l_normalized_reference, 'DM');
230
231 -- remove leading '0's
232 l_normalized_reference := LTRIM(l_normalized_reference, '0');
233
234 x_normalized_reference := l_normalized_reference;
235 END Normalize_Customer_Reference;
236
237 /*=======================================================================*
238 | Procedure
239 | Normalize_Credit_Reference
240 |
241 | PURPOSE
242 | Returns Normalized Credit Reference Number
243 |
244 | NOTES
245 |
246 | HISTORY
247 | 20-JUN-2009 KPATRO Create.
248 *=======================================================================*/
249 FUNCTION Normalize_Credit_Reference (p_credit_ref IN VARCHAR2)
250 RETURN VARCHAR2
251 IS
252
253 l_credit_ref_norm VARCHAR2(30);
254
255 BEGIN
256
257 Normalize_Customer_Reference(
258 p_customer_reference => p_credit_ref
259 ,x_normalized_reference => l_credit_ref_norm
260 );
261
262 return l_credit_ref_norm;
263
264 EXCEPTION
265 WHEN OTHERS THEN
266 return NULL;
267 END Normalize_Credit_Reference;
268
269 /*=======================================================================*
270 | Procedure
271 | Create_Log
272 |
273 | PURPOSE
274 | This procedure wll help to audit the number of records
275 | processed by Rule Based Engine
276 |
277 | NOTES
278 |
279 | HISTORY
280 | 20-JUN-2009 KPATRO Create.
281 | 19-Aug-2009 KPATRO Removed the Bulk insert for Bug 8809877
282 |
283 *=======================================================================*/
284
285 PROCEDURE Create_Log(
286 p_api_version IN NUMBER,
287 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
288 p_commit IN VARCHAR2 := FND_API.g_false,
289 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
290 p_exact_match_tbl IN ozf_rule_match_tbl_type,
291 p_possible_match_tbl IN ozf_rule_match_tbl_type,
292 p_accrual_match_tbl IN ozf_accrual_match_tbl_type,
293 x_Return_Status OUT NOCOPY VARCHAR2,
294 x_Msg_Count OUT NOCOPY NUMBER,
295 x_Msg_Data OUT NOCOPY VARCHAR2
296
297 )
298 IS
299 l_api_name CONSTANT VARCHAR2(30) := 'Create_Log';
300 l_api_version_number CONSTANT NUMBER := 1.0;
301 l_full_name CONSTANT VARCHAR2(60) := g_pkg_name ||'.'|| l_api_name;
302
303 l_msg_count NUMBER;
304 l_msg_data VARCHAR2(2000);
305 l_return_status VARCHAR2(10);
306
307 l_api_version NUMBER := 1.0;
308
309
310 l_exactmatchTbl ozf_rule_match_tbl_type := p_exact_match_tbl;
311 l_possiblematchTbl ozf_rule_match_tbl_type := p_possible_match_tbl;
312 l_accrualmatchTbl ozf_accrual_match_tbl_type := p_accrual_match_tbl;
313
314 l_exact_match_rec_type ozf_rule_match_rec_type;
315 l_poss_match_rec_type ozf_rule_match_rec_type;
316 l_accrual_match_rec_type ozf_accrual_match_rec_type;
317
318 BEGIN
319 SAVEPOINT CREATE_LOG;
320
321 IF OZF_DEBUG_HIGH_ON THEN
322 OZF_Utility_PVT.debug_message(l_full_name||': start');
323 END IF;
324
325 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*------------------------------ Rule Based Settlement Report --------------------------------_*');
326 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Start Date & Time: ' || to_char(sysdate,'MM-DD-YYYY HH24:MI:SS'));
327 --FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'End Date & Time: ' || to_char(sysdate,'MM-DD-YYYY HH24:MI:SS'));
328 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
329
330 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
331 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '100% Credit Matches :' || l_exactmatchTbl.count);
332 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Possible Credit Matches :' || l_possiblematchTbl.count);
333 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Accrual Matches :' || l_accrualmatchTbl.count);
334 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
335
336 IF (l_exactmatchTbl.count >0) THEN
337 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '100% Credit Matches ');
338 FOR j IN l_exactmatchTbl.FIRST..l_exactmatchTbl.LAST LOOP
339 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
340 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Deduction #', 40, ' ') || ': ' || l_exactmatchTbl(j).claim_number);
341 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Credit Memo #', 40, ' ') || ': ' || l_exactmatchTbl(j).credit_memo_number);
342 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Deduction Amount', 40, ' ') || ': ' || l_exactmatchTbl(j).claim_amount ||' ' || l_exactmatchTbl(j).currency_code);
343 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Credit Amount', 40, ' ') || ': ' || l_exactmatchTbl(j).credit_amount || ' '|| l_exactmatchTbl(j).currency_code);
344 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
345
346 IF l_exactmatchTbl.exists(j) THEN
347 l_exact_match_rec_type := l_exactmatchTbl(j);
348
349 INSERT INTO OZF_RULE_BASED_LOG
350 (
351 LOG_ID
352 , LAST_UPDATE_DATE
353 , LAST_UPDATED_BY
354 , CREATION_DATE
355 , CREATED_BY
356 , LAST_UPDATE_LOGIN
357 , REQUEST_ID
358 , PROGRAM_APPLICATION_ID
359 , CREATED_FROM
360 , CLAIM_ID
361 , QP_LIST_HEADER_ID
362 , CUSTOMER_TRX_ID
363 , PROCESSED_MATCH_TYPE
364 )
365 VALUES
366 (
367 OZF_RULE_BASED_LOG_S.nextval
368 , SYSDATE
369 , NVL(FND_GLOBAL.user_id,-1)
370 , SYSDATE
371 , NVL(FND_GLOBAL.user_id,-1)
372 , NVL(FND_GLOBAL.conc_login_id,-1)
373 , NVL(FND_GLOBAL.CONC_REQUEST_ID,-1)
374 , NVL(FND_GLOBAL.PROG_APPL_ID,-1)
375 , 'RULEBASED'
376 --, l_exactmatchTbl(I).claim_id
377 , l_exact_match_rec_type.claim_id
378 , null
379 --, l_exactmatchTbl(I).customer_trx_id
380 , l_exact_match_rec_type.customer_trx_id
381 , 'C'
382 );
383
384 END IF;
385
386 END LOOP;
387 END IF;
388
389 IF (l_possiblematchTbl.count >0) THEN
390 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Possible Credit Matches');
391 FOR k IN l_possiblematchTbl.FIRST..l_possiblematchTbl.LAST LOOP
392 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
393 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Deduction #', 40, ' ') || ': ' || l_possiblematchTbl(k).claim_number);
394 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Credit Memo #', 40, ' ') || ': ' || l_possiblematchTbl(k).credit_memo_number);
395 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Deduction Amount', 40, ' ') || ': ' || l_possiblematchTbl(k).claim_amount || ' ' || l_possiblematchTbl(k).currency_code);
396 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Credit Amount', 40, ' ') || ': ' || l_possiblematchTbl(k).credit_amount || ' ' || l_possiblematchTbl(k).currency_code);
397 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
398
399 IF l_possiblematchTbl.exists(k) THEN
400 l_poss_match_rec_type := l_possiblematchTbl(k);
401
402 INSERT INTO OZF_RULE_BASED_LOG
403 (
404 LOG_ID
405 , LAST_UPDATE_DATE
406 , LAST_UPDATED_BY
407 , CREATION_DATE
408 , CREATED_BY
409 , LAST_UPDATE_LOGIN
410 , REQUEST_ID
411 , PROGRAM_APPLICATION_ID
412 , CREATED_FROM
413 , CLAIM_ID
414 , QP_LIST_HEADER_ID
415 , CUSTOMER_TRX_ID
416 , PROCESSED_MATCH_TYPE
417 )
418 VALUES
419 (
420 OZF_RULE_BASED_LOG_S.nextval
421 , SYSDATE
422 , NVL(FND_GLOBAL.user_id,-1)
423 , SYSDATE
424 , NVL(FND_GLOBAL.user_id,-1)
425 , NVL(FND_GLOBAL.conc_login_id,-1)
426 , NVL(FND_GLOBAL.CONC_REQUEST_ID,-1)
427 , NVL(FND_GLOBAL.PROG_APPL_ID,-1)
428 , 'RULEBASED'
429 --, l_possiblematchTbl(J).claim_id
430 , l_poss_match_rec_type.claim_id
431 , null
432 --, l_possiblematchTbl(J).customer_trx_id
433 , l_poss_match_rec_type.customer_trx_id
434 , 'P'
435 );
436 END IF;
437 END LOOP;
438 END IF;
439
440 IF (l_accrualmatchTbl.count >0) THEN
441 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Accrual Matches :');
442 FOR i IN l_accrualmatchTbl.FIRST..l_accrualmatchTbl.LAST LOOP
443 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
444 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Deduction #', 40, ' ') || ': ' || l_accrualmatchTbl(i).claim_number);
445 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Offer Code', 40, ' ') || ': ' || l_accrualmatchTbl(i).Offer_Code);
446 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, rpad('Claim Amount', 40, ' ') || ': ' || l_accrualmatchTbl(i).claim_amount || ' ' || l_accrualmatchTbl(i).currency_code);
447 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
448 IF l_accrualmatchTbl.exists(i) THEN
449 l_accrual_match_rec_type := l_accrualmatchTbl(i);
450
451 INSERT INTO OZF_RULE_BASED_LOG
452 (
453 LOG_ID
454 , LAST_UPDATE_DATE
455 , LAST_UPDATED_BY
456 , CREATION_DATE
457 , CREATED_BY
458 , LAST_UPDATE_LOGIN
459 , REQUEST_ID
460 , PROGRAM_APPLICATION_ID
461 , CREATED_FROM
462 , CLAIM_ID
463 , QP_LIST_HEADER_ID
464 , CUSTOMER_TRX_ID
465 , PROCESSED_MATCH_TYPE
466 )
467 VALUES
468 (
469 OZF_RULE_BASED_LOG_S.nextval
470 , SYSDATE
471 , NVL(FND_GLOBAL.user_id,-1)
472 , SYSDATE
473 , NVL(FND_GLOBAL.user_id,-1)
474 , NVL(FND_GLOBAL.conc_login_id,-1)
475 , NVL(FND_GLOBAL.CONC_REQUEST_ID,-1)
476 , NVL(FND_GLOBAL.PROG_APPL_ID,-1)
477 , 'RULEBASED'
478 , l_accrual_match_rec_type.claim_id
479 , l_accrual_match_rec_type.qp_list_header_id
480 , null
481 , 'A'
482 );
483
484 END IF;
485 END LOOP;
486
487 END IF;
488
489 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*---------------------------------------------------------------------------------------------*');
490 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Execution Status: Successful' );
491 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Execution Ends On: ' || to_char(sysdate,'MM-DD-YYYY HH24:MI:SS'));
492 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '*----------------------------------------------------------------------------------------------*');
493
494 EXCEPTION
495
496 WHEN FND_API.G_EXC_ERROR THEN
497 ROLLBACK TO CREATE_LOG;
498 x_return_status := FND_API.G_RET_STS_ERROR;
499 -- Standard call to get message count and if count=1, get the message
500 FND_MSG_PUB.Count_And_Get (
501 p_encoded => FND_API.G_FALSE,
502 p_count => l_msg_count,
503 p_data => l_msg_data
504 );
505 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
506 ROLLBACK TO CREATE_LOG;
507 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
508 -- Standard call to get message count and if count=1, get the message
509 FND_MSG_PUB.Count_And_Get (
510 p_encoded => FND_API.G_FALSE,
511 p_count => l_msg_count,
512 p_data => l_msg_data
513 );
514 WHEN OTHERS THEN
515 ROLLBACK TO CREATE_LOG;
516 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
517 IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
518 FND_MESSAGE.set_name('OZF', 'OZF_CLAIM_CHK_ACS_ERR');
519 FND_MSG_PUB.add;
520 END IF;
521 -- Standard call to get message count and if count=1, get the message
522 FND_MSG_PUB.Count_And_Get (
523 p_encoded => FND_API.G_FALSE,
524 p_count => l_msg_count,
525 p_data => l_msg_data
526 );
527
528 END Create_Log;
529
530 /*=======================================================================*
531 | Procedure
532 | Start_Rule_Based_Settlement
533 |
534 | PURPOSE
535 | This procedure will process the deduction records
536 | that is eligible by Rule Based Engine.
537 | If 100% Credit Match found, then deduction offset with CM
538 | If 100% Match not found and possible match found based on setup
539 | it will go to possible queue.
540 | If 100% Credit Match or possible match not found then it will
541 | look for PAD number. If found then utilized the unbalance accruals
542 | and initiate the settlement.
543 |
544 | NOTES
545 |
546 | HISTORY
547 | 20-JUN-2009 KPATRO Create.
548 | 06-Aug-2009 KPATRO Changed the Synonyms to base tables
549 | 07-Aug-2009 KPATRO Need to Consider all the bill to site's of cudtomer
550 | creditmemo along with related customer
551 | in case of include related customer
552 | 19-Aug-2009 KPATRO Changed CONTINURE to GOTO for Bug 8809877
553 | 19-Aug-2009 KPATRO Changed the Customer Reference Information for Bug 8814596
554 | 25-Aug-2009 KPATRO Fix for Bug 8834586
555 *=======================================================================*/
556 PROCEDURE Start_Rule_Based_Settlement (
557 ERRBUF OUT NOCOPY VARCHAR2,
558 RETCODE OUT NOCOPY NUMBER,
559 --p_org_id IN NUMBER DEFAULT NULL,
560 p_start_date IN VARCHAR2,
561 p_end_date IN VARCHAR2,
562 p_pay_to_customer IN VARCHAR2 := NULL
563 )
564 IS
565 l_api_name CONSTANT VARCHAR2(30) := 'Start_Rule_Based_Settlement';
566 l_api_version CONSTANT NUMBER := 1.0;
567 l_full_name CONSTANT VARCHAR2(60) := G_PKG_NAME ||'.'|| l_api_name;
568 l_msg_count NUMBER;
569 l_msg_data VARCHAR2(2000);
570 l_return_status VARCHAR2(10);
571
572 l_claim_rec OZF_CLAIM_PVT.claim_rec_type;
573
574 TYPE claimTbl IS TABLE OF ozf_claims_all.claim_number%TYPE;
575 TYPE amountTbl IS TABLE OF ozf_claims_all.amount%TYPE;
576 TYPE acctdamountTbl IS TABLE OF ozf_claims_all.acctd_amount%TYPE;
577 TYPE claimidTbl IS TABLE OF ozf_claims_all.claim_id%TYPE;
578 TYPE custrefdTbl IS TABLE OF ozf_claims_all.customer_ref_number%TYPE;
579 TYPE custrefnormTbl IS TABLE OF ozf_claims_all.customer_ref_normalized%TYPE;
580 TYPE custaccountTbl IS TABLE OF ozf_claims_all.cust_account_id%TYPE;
581 TYPE custbilltositeTbl IS TABLE OF ozf_claims_all.cust_billto_acct_site_id%TYPE;
582 TYPE claimobjverTbl IS TABLE OF ozf_claims_all.object_version_number%TYPE;
583 TYPE curcodeTbl IS TABLE OF ozf_claims_all.currency_code%TYPE;
584 TYPE padTbl IS TABLE OF ozf_claims_all.pre_auth_deduction_number%TYPE;
585 TYPE padnormTbl IS TABLE OF ozf_claims_all.pre_auth_deduction_normalized%TYPE;
586 TYPE siteUseIdTbl IS TABLE OF ozf_claims_all.cust_billto_acct_site_id%TYPE;
587 TYPE offerIdTbl IS TABLE OF ozf_claims_all.offer_id%TYPE;
588
589
590 -- For System Parameter Check
591 l_enable_rule_based VARCHAR2(1);
592 l_cre_threshold_type VARCHAR2(50);
593 l_cre_threshold_val NUMBER;
594 l_cust_name_match_type VARCHAR2(50);
595
596
597 -- For Input Parameter from CC Job
598 l_start_date date;
599 l_end_date date;
600 l_cust_account_number NUMBER;
601
602 -- Get the Default Org
603 l_org_id NUMBER := MO_GLOBAL.GET_CURRENT_ORG_ID();
604
605 -- Fetch the System Parameter Details
606 CURSOR chk_rule_based_csr IS
607 SELECT NVL(rule_based, 'F'),
608 NVL(cust_name_match_type,'EXCLUDE_REL_CUST'),
609 credit_matching_thold_type,
610 credit_tolerance_operand
611 FROM ozf_sys_parameters_all
612 WHERE org_id = l_org_id;
613
614 -- Fix for Bug 8834586 : truncating the dates if not passed from cc job.
615 -- Fix for Bug 12882998
616 CURSOR open_ded_csr(p_cust_account_id IN NUMBER,p_start_date IN DATE , p_end_date IN DATE) IS
617 SELECT claim_id,
618 claim_number,
619 amount_remaining,
620 acctd_amount_remaining,
621 customer_ref_number,
622 customer_ref_normalized,
623 cust_account_id,
624 cust_billto_acct_site_id,
625 object_version_number,
626 currency_code,
627 pre_auth_deduction_number,
628 pre_auth_deduction_normalized,
629 cust_billto_acct_site_id,
630 offer_id
631 FROM ozf_claims_all
632 WHERE
633 status_code = 'OPEN'
634 AND claim_class = 'DEDUCTION'
635 AND (customer_ref_number IS NOT NULL
636 OR pre_auth_deduction_number IS NOT NULL)
637 AND org_id = l_org_id
638 AND cust_account_id = nvl(p_cust_account_id,cust_account_id)
639 AND trunc(creation_date) between nvl(p_start_date, trunc(creation_date)) AND nvl(p_end_date, trunc(creation_date))
640 ORDER BY creation_date ASC;
641
642 -- Exact Match with Exclude related Customer
643 CURSOR csr_exact_cm_exc_cust(p_cust_account_id IN NUMBER,p_currency_code IN VARCHAR2, p_site_use_id IN NUMBER,
644 p_deduction_amount IN NUMBER, p_ref_number IN VARCHAR2) IS
645 SELECT ps.customer_trx_id,
646 ps.trx_number,
647 ps.amount_due_remaining
648 FROM ar_payment_schedules_all ps,
649 ra_cust_trx_types_all ctt,
650 ra_customer_trx_all ct
651 WHERE
652 ps.class in ('CM') --class = Credit Memo
653 AND ps.status = 'OP' -- status = Open
654 AND ps.customer_id = p_cust_account_id
655 AND ps.invoice_currency_code = p_currency_code --deduction currency code
656 AND ps.customer_site_use_id = p_site_use_id --deduction site_use_id
657 AND ctt.type = 'CM'
658 AND ABS(ps.amount_due_remaining) = p_deduction_amount --deduction amount
659 AND ctt.cust_trx_type_id = ps.cust_trx_type_id --transaction type = Credit Memo
660 AND Normalize_Credit_Reference(ct.customer_reference) = p_ref_number
661 AND ct.customer_trx_id = ps.customer_trx_id
662 AND ps.org_id = l_org_id
663 AND rownum = 1 -- for 100% match it should be one
664 ORDER BY ct.creation_date ASC;
665
666 -- Exact Match with Include related Customer
667 CURSOR csr_exact_cm_rel_cust(p_cust_account_id IN NUMBER,p_claim_id IN NUMBER,p_currency_code IN VARCHAR2,
668 p_deduction_amount IN NUMBER, p_ref_number IN VARCHAR2) IS
669 SELECT ps.customer_trx_id,
670 ps.trx_number,
671 ps.amount_due_remaining
672 FROM ar_payment_schedules_all ps,
673 ra_cust_trx_types_all ctt,
674 ra_customer_trx_all ct,
675 (
676 SELECT SITE.site_use_id site_use_id
677 FROM HZ_CUST_ACCT_RELATE_ALL REL, HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
678 HZ_CUST_SITE_USES_ALL SITE
679 WHERE
680 REL.status = 'A'
681 AND REL.cust_account_id = p_cust_account_id --cust_account_id from deduction
682 AND (REL.relationship_type is NULL OR REL.relationship_type IN ('ALL','Reciprocal','Parent')) --For Bug 13489587 to search as ALL for having relationship_type of related customer as null.
683 AND REL.related_cust_account_id = ACCT_SITE.cust_account_id
684 AND ACCT_SITE.cust_acct_site_id = SITE.cust_acct_site_id
685 AND SITE.SITE_USE_CODE = 'BILL_TO'
686 AND SITE.status = 'A'
687 AND REL.org_id = l_org_id
688 UNION
689 SELECT SITE.site_use_id site_use_id
690 FROM HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
691 HZ_CUST_SITE_USES_ALL SITE
692 WHERE
693 ACCT_SITE.cust_account_id = p_cust_account_id
694 AND ACCT_SITE.cust_acct_site_id = SITE.cust_acct_site_id
695 AND SITE.SITE_USE_CODE = 'BILL_TO'
696 AND SITE.status = 'A'
697 AND SITE.org_id = l_org_id
698 ) site_use
699 WHERE
700 ps.class in ('CM') --class = Credit Memo
701 AND ps.status = 'OP' -- status = Open
702 AND ps.invoice_currency_code = p_currency_code --deduction currency code
703 AND ABS(ps.amount_due_remaining) = p_deduction_amount --deduction amount
704 AND ps.customer_site_use_id = site_use.site_use_id --deduction site_use_id / related customer site_use_id
705 AND ctt.type = 'CM'
706 AND ctt.cust_trx_type_id = ps.cust_trx_type_id --transaction type = Credit Memo
707 AND Normalize_Credit_Reference(ct.customer_reference) = p_ref_number
708 AND ct.customer_trx_id = ps.customer_trx_id
709 AND ps.org_id = l_org_id
710 AND rownum = 1 -- for 100% match it should be one.
711 ORDER BY ct.creation_date ASC;
712
713 -- Possible Match with Exclude related Customer
714 CURSOR csr_poss_cm_exc_cust(p_cust_account_id IN NUMBER,p_currency_code IN VARCHAR2, p_site_use_id IN NUMBER,
715 p_deduction_lower_amount IN NUMBER,p_deduction_upper_amount IN NUMBER,
716 p_ref_number IN VARCHAR2) IS
717 SELECT ps.customer_trx_id,
718 ps.trx_number,
719 ps.amount_due_remaining
720 FROM
721 ar_payment_schedules_all ps,
722 ra_cust_trx_types_all ctt,
723 ra_customer_trx_all ct
724 WHERE
725 ps.class in ('CM') --class = Credit Memo
726 AND ps.status = 'OP' -- status = Open
727 AND ps.customer_id = p_cust_account_id
728 AND ps.invoice_currency_code = p_currency_code --deduction currency code
729 AND ps.customer_site_use_id = p_site_use_id --deduction site_use_id
730 AND ctt.type = 'CM'
731 AND ABS(ps.amount_due_remaining) between p_deduction_lower_amount AND p_deduction_upper_amount --deduction amount
732 AND ctt.cust_trx_type_id = ps.cust_trx_type_id --transaction type = Credit Memo
733 AND Normalize_Credit_Reference(ct.customer_reference) = p_ref_number
734 AND ct.customer_trx_id = ps.customer_trx_id
735 AND ps.org_id = l_org_id
736 ORDER BY ct.creation_date ASC;
737
738 -- Possible Match with Include related Customer
739 CURSOR csr_poss_cm_rel_cust(p_cust_account_id IN NUMBER,p_claim_id IN NUMBER,p_currency_code IN VARCHAR2,
740 p_deduction_lower_amount IN NUMBER,p_deduction_upper_amount IN NUMBER, p_ref_number IN VARCHAR2) IS
741 SELECT ps.customer_trx_id,
742 ps.trx_number,
743 ps.amount_due_remaining
744 FROM
745 ar_payment_schedules_all ps,
746 ra_cust_trx_types_all ctt,
747 ra_customer_trx_all ct,
748 (
749 SELECT SITE.site_use_id site_use_id
750 FROM HZ_CUST_ACCT_RELATE_ALL REL,
751 HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
752 HZ_CUST_SITE_USES_ALL SITE
753 WHERE REL.status = 'A'
754 AND REL.cust_account_id = p_cust_account_id --cust_account_id from deduction
755 AND (REL.relationship_type is NULL OR REL.relationship_type IN ('ALL','Reciprocal','Parent')) --For Bug 13489587 to search as ALL for having relationship_type of related customer as null.
756 AND REL.related_cust_account_id = ACCT_SITE.cust_account_id
757 AND ACCT_SITE.cust_acct_site_id = SITE.cust_acct_site_id
758 AND SITE.SITE_USE_CODE = 'BILL_TO'
759 AND SITE.status = 'A'
760 AND REL.org_id = l_org_id
761 UNION
762 SELECT SITE.site_use_id site_use_id
763 FROM HZ_CUST_ACCT_SITES_ALL ACCT_SITE,
764 HZ_CUST_SITE_USES_ALL SITE
765 WHERE ACCT_SITE.cust_account_id = p_cust_account_id
766 AND ACCT_SITE.cust_acct_site_id = SITE.cust_acct_site_id
767 AND SITE.SITE_USE_CODE = 'BILL_TO'
768 AND SITE.status = 'A'
769 AND SITE.org_id = l_org_id
770 ) site_use
771 WHERE
772 ps.class in ('CM') --class = Credit Memo
773 AND ps.status = 'OP' -- status = Open
774 AND ps.invoice_currency_code = p_currency_code --deduction currency code
775 AND ABS(ps.amount_due_remaining) BETWEEN p_deduction_lower_amount AND p_deduction_upper_amount --deduction amount
776 AND ps.customer_site_use_id = site_use.site_use_id --deduction site_use_id / related customer site_use_id
777 AND ctt.type = 'CM'
778 AND ctt.cust_trx_type_id = ps.cust_trx_type_id --transaction type = Credit Memo
779 AND Normalize_Credit_Reference(ct.customer_reference) = p_ref_number
780 AND ct.customer_trx_id = ps.customer_trx_id
781 AND ps.org_id = l_org_id
782 ORDER BY ct.creation_date ASC;
783
784
785 CURSOR csr_offer_info(p_ref_number VARCHAR2) IS
786 SELECT qp_list_header_id,offer_code
787 FROM ozf_offers
788 WHERE offer_code =p_ref_number;
789
790 CURSOR csr_claim_line_info (p_claim_id NUMBER) IS
791 SELECT claim_line_id,object_version_number
792 FROM ozf_claim_lines_all
793 WHERE claim_id = p_claim_id;
794
795 CURSOR csr_claim_line_util_info (p_claim_line_id NUMBER) IS
796 SELECT COUNT(*)
797 FROM ozf_claim_lines_util_all
798 WHERE claim_line_id = p_claim_line_id;
799
800 -- For PAD
801 l_offer_code VARCHAR2(30);
802 l_list_header_id NUMBER;
803 l_object_version_number NUMBER;
804 l_claim_line_id NUMBER;
805 l_claim_line_object_version NUMBER;
806 l_funds_util_flt OZF_Claim_Accrual_PVT.funds_util_flt_type;
807 l_claim_line_tbl OZF_CLAIM_LINE_PVT.claim_line_tbl_type;
808 l_claim_line_rec OZF_CLAIM_LINE_PVT.claim_line_rec_type;
809 l_error_index NUMBER;
810 l_ind NUMBER :=1;
811 l_count_earnings NUMBER := 0;
812
813
814 l_trx_id NUMBER;
815 l_trx_number VARCHAR2(400);
816 l_crditmemo_amount NUMBER;
817 l_reference_number VARCHAR2(30);
818 l_refer_norm_number VARCHAR2(30);
819
820 l_possible_count NUMBER :=0;
821 l_exactfound_count NUMBER :=0;
822 l_accrual_count NUMBER :=0;
823
824 l_upper_thres_amount NUMBER :=0;
825 l_lower_thres_amount NUMBER :=0;
826
827 l_claimTbl claimTbl;
828 l_amountTbl amountTbl;
829 l_acctdamountTbl acctdamountTbl;
830 l_claimidTbl claimidTbl;
831 l_custrefdTbl custrefdTbl;
832 l_custrefnormTbl custrefnormTbl;
833 l_custaccountTbl custaccountTbl;
834 l_custbilltositeTbl custbilltositeTbl;
835 l_claimobjverTbl claimobjverTbl;
836 l_curcodeTbl curcodeTbl;
837 l_padTbl padTbl;
838 l_padnormTbl padnormTbl;
839 l_siteUseIdTbl siteUseIdTbl;
840 l_offerIdTbl offerIdTbl;
841
842 l_possiblematchTbl ozf_rule_match_tbl_type;
843 l_exactmatchTbl ozf_rule_match_tbl_type;
844 l_accrualmatchTbl ozf_accrual_match_tbl_type;
845
846
847 l_count NUMBER :=0;
848 l_rel_cust_account_id NUMBER;
849 l_found BOOLEAN := false;
850
851 l_cm_match_found VARCHAR2(1) := 'F';
852
853
854 BEGIN
855
856 SAVEPOINT RuleBased;
857
858
859 OZF_Utility_PVT.write_conc_log('*------------------------------ Claims Rule Based Settlement Log ------------------------------*');
860 OZF_Utility_PVT.write_conc_log('Execution Starts On: ' || to_char(sysdate,'MM-DD-YYYY HH24:MI:SS'));
861 OZF_Utility_PVT.write_conc_log('*-------------------------------------------------------------------------------------------------*');
862
863 IF OZF_DEBUG_HIGH_ON THEN
864 FND_MESSAGE.Set_Name('OZF','OZF_API_DEBUG_MESSAGE');
865 FND_MESSAGE.Set_Token('TEXT',l_full_name||': Start');
866 FND_MSG_PUB.Add;
867 END IF;
868
869
870
871 IF OZF_DEBUG_HIGH_ON THEN
872 OZF_Utility_PVT.write_conc_log('Start Rule Based Settlement');
873 OZF_Utility_PVT.write_conc_log('--- Start Parameter List ---');
874 OZF_Utility_PVT.write_conc_log('l_org_id: ' || l_org_id);
875 OZF_Utility_PVT.write_conc_log('p_start_date: ' || p_start_date);
876 OZF_Utility_PVT.write_conc_log('p_end_date: ' || p_end_date);
877 OZF_Utility_PVT.write_conc_log('p_pay_to_customer: ' || p_pay_to_customer);
878 OZF_Utility_PVT.write_conc_log('--- End Parameter List -----');
879
880
881 END IF;
882
883 -- Check For Rule Based Settlemnet setup in System Parameter.
884 OPEN chk_rule_based_csr;
885 FETCH chk_rule_based_csr INTO l_enable_rule_based,l_cust_name_match_type,l_cre_threshold_type,l_cre_threshold_val;
886 CLOSE chk_rule_based_csr;
887
888 IF OZF_DEBUG_HIGH_ON THEN
889 OZF_Utility_PVT.write_conc_log('Processing Claims for Operating Unit: ' || MO_GLOBAL.get_ou_name(l_org_id));
890 OZF_Utility_PVT.write_conc_log('Rule Based Settlement : '|| l_enable_rule_based);
891 OZF_Utility_PVT.write_conc_log('Customer Name Matching Type : ' || l_cust_name_match_type);
892 OZF_Utility_PVT.write_conc_log('Cr Threshold Type : ' || l_cre_threshold_type);
893 OZF_Utility_PVT.write_conc_log('Cr Threshold Value : ' || l_cre_threshold_val);
894 END IF;
895
896
897 IF(l_enable_rule_based = 'F') THEN
898
899 OZF_Utility_PVT.write_conc_log('Rule Based Flag is disabled in System Parameter page for Operating unit :' ||MO_GLOBAL.get_ou_name(l_org_id));
900 OZF_Utility_PVT.write_conc_log('Please Enable the Rule Based Settlement checkbox to process the deductions');
901
902 ELSE
903
904 OZF_Utility_PVT.write_conc_log('Proceed with Rule Based Engine');
905
906
907 IF p_start_date IS NOT NULL THEN
908 l_start_date := to_date(p_start_date,'YYYY/MM/DD HH24:MI:SS');
909 ELSE
910 l_start_date :=NULL;
911 END IF ;
912
913 IF p_end_date IS NOT NULL THEN
914 l_end_date := to_date(p_end_date, 'YYYY/MM/DD HH24:MI:SS');
915 ELSE
916 l_end_date := NULL;
917 END IF ;
918
919 IF p_pay_to_customer IS NOT NULL THEN
920 l_cust_account_number := p_pay_to_customer ;
921 ELSE
922 l_cust_account_number := NULL;
923 END IF ;
924
925
926 IF OZF_DEBUG_HIGH_ON THEN
927 OZF_Utility_PVT.write_conc_log('Operating Unit: ' || l_org_id);
928 OZF_Utility_PVT.write_conc_log('Start Date: ' || l_start_date);
929 OZF_Utility_PVT.write_conc_log('End Date: ' || l_end_date);
930 OZF_Utility_PVT.write_conc_log('Customer Account: ' || l_cust_account_number);
931 END IF;
932
933 OPEN open_ded_csr (l_cust_account_number,l_start_date,l_end_date);
934 LOOP
935 FETCH open_ded_csr BULK COLLECT INTO l_claimidTbl,l_claimTbl,l_amountTbl, l_acctdamountTbl,
936 l_custrefdTbl,l_custrefnormTbl,l_custaccountTbl,
937 l_custbilltositeTbl,l_claimobjverTbl,l_curcodeTbl,l_padTbl,
938 l_padnormTbl,l_siteUseIdTbl, l_offerIdTbl
939 LIMIT g_bulk_limit;
940
941 FOR i IN NVL(l_claimidTbl.FIRST, 1) .. NVL(l_claimidTbl.LAST, 0) LOOP
942
943 l_trx_id := null;
944 l_trx_number := null;
945 l_crditmemo_amount := null;
946 l_reference_number := null;
947 l_refer_norm_number := null;
948 l_cm_match_found := 'F';
949
950
951
952 IF OZF_DEBUG_HIGH_ON THEN
953 OZF_Utility_PVT.write_conc_log('-------------------------------------------------');
954 OZF_Utility_PVT.write_conc_log('START : Fetching Claim ' || i);
955 OZF_Utility_PVT.write_conc_log('-------------------------------------------------');
956 OZF_Utility_PVT.write_conc_log('Claim ID: ' || l_claimidTbl(i));
957 OZF_Utility_PVT.write_conc_log('Claim Number: ' || l_claimTbl(i));
958 OZF_Utility_PVT.write_conc_log('Claim Amount: ' || l_amountTbl(i));
959 OZF_Utility_PVT.write_conc_log('Claim Acctd Amount: ' || l_acctdamountTbl(i));
960 OZF_Utility_PVT.write_conc_log('Customer Reference: ' || l_custrefdTbl(i));
961 OZF_Utility_PVT.write_conc_log('Customer Reference Norm: ' || l_custrefnormTbl(i));
962 OZF_Utility_PVT.write_conc_log('Customer Account: ' || l_custaccountTbl(i));
963 OZF_Utility_PVT.write_conc_log('Customer Bill To: ' || l_custbilltositeTbl(i));
964 OZF_Utility_PVT.write_conc_log('Claim Obj Version#: ' || l_claimobjverTbl(i));
965 OZF_Utility_PVT.write_conc_log('Claim Currency Code: ' || l_curcodeTbl(i));
966 OZF_Utility_PVT.write_conc_log('Claim PAD#: ' || l_padTbl(i));
967 OZF_Utility_PVT.write_conc_log('Claim PAD NORM#: ' || l_padnormTbl(i));
968 OZF_Utility_PVT.write_conc_log('Claim Site Used Id: ' || l_siteUseIdTbl(i));
969 OZF_Utility_PVT.write_conc_log('Offer ID: ' || l_offerIdTbl(i));
970 END IF;
971
972 -- For 100% Credit Match
973 IF(l_cust_name_match_type = 'EXCLUDE_REL_CUST') THEN
974 OPEN csr_exact_cm_exc_cust(l_custaccountTbl(i),l_curcodeTbl(i),l_siteUseIdTbl(i),l_amountTbl(i),l_custrefnormTbl(i));
975 FETCH csr_exact_cm_exc_cust INTO l_trx_id,l_trx_number,l_crditmemo_amount;
976 IF OZF_DEBUG_HIGH_ON THEN
977 OZF_Utility_PVT.write_conc_log('100% Credit Match - Exclude Related Customer ');
978 OZF_Utility_PVT.write_conc_log('l_trx_id: ' ||l_trx_id);
979 OZF_Utility_PVT.write_conc_log('l_trx_number: ' || l_trx_number);
980 OZF_Utility_PVT.write_conc_log('l_crditmemo_amount: ' || l_crditmemo_amount);
981 END IF;
982 CLOSE csr_exact_cm_exc_cust;
983 ELSIF(l_cust_name_match_type = 'INCLUDE_REL_CUST') THEN
984 OPEN csr_exact_cm_rel_cust(l_custaccountTbl(i),l_claimidTbl(i),l_curcodeTbl(i),l_amountTbl(i),l_custrefnormTbl(i));
985 FETCH csr_exact_cm_rel_cust INTO l_trx_id,l_trx_number,l_crditmemo_amount;
986 IF OZF_DEBUG_HIGH_ON THEN
987 OZF_Utility_PVT.write_conc_log('100% Credit Match - Include Related Customer');
988 OZF_Utility_PVT.write_conc_log('l_trx_id: ' ||l_trx_id);
989 OZF_Utility_PVT.write_conc_log('l_trx_number: ' || l_trx_number);
990 OZF_Utility_PVT.write_conc_log('l_crditmemo_amount: ' || l_crditmemo_amount);
991 END IF;
992 CLOSE csr_exact_cm_rel_cust;
993 END IF;
994
995 IF (l_trx_id IS NOT NULL) THEN
996
997 l_claim_rec.claim_id := l_claimidTbl(i);
998 l_claim_rec.payment_method := 'PREV_OPEN_CREDIT';
999 l_claim_rec.payment_reference_number := l_trx_number;
1000 l_claim_rec.payment_reference_id := l_trx_id;
1001 l_claim_rec.object_version_number := l_claimobjverTbl(i);
1002 l_claim_rec.status_code := 'CLOSED';
1003 l_claim_rec.user_status_id := to_number(
1004 ozf_utility_pvt.get_default_user_status(
1005 p_status_type => 'OZF_CLAIM_STATUS',
1006 p_status_code => l_claim_rec.status_code));
1007 l_claim_rec.request_id := NVL(FND_GLOBAL.CONC_REQUEST_ID,-1);
1008 l_claim_rec.program_id := NVL(FND_GLOBAL.PROG_APPL_ID,-1);
1009 l_claim_rec.settled_from := 'RULEBASED';
1010
1011 OZF_Claim_PVT.Update_Claim(
1012 p_api_version => l_api_version
1013 ,p_init_msg_list => FND_API.g_false
1014 ,p_commit => FND_API.g_false
1015 ,p_validation_level => FND_API.g_valid_level_full
1016 ,x_return_status => l_return_status
1017 ,x_msg_data => l_msg_data
1018 ,x_msg_count => l_msg_count
1019 ,p_claim => l_claim_rec
1020 ,p_event => 'UPDATE'
1021 ,p_mode => 'AUTO'
1022 ,x_object_version_number => l_object_version_number
1023 );
1024 OZF_Utility_PVT.write_conc_log('Return Status for 100%: ' || l_return_status);
1025
1026 IF l_return_status = fnd_api.g_ret_sts_success THEN
1027 l_cm_match_found := 'T';
1028 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
1029 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1030 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1031 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1032 END IF;
1033 l_exactfound_count := l_exactfound_count +1;
1034 l_exactmatchTbl(l_exactfound_count).claim_id := l_claimidTbl(i);
1035 l_exactmatchTbl(l_exactfound_count).claim_number := l_claimTbl(i);
1036 l_exactmatchTbl(l_exactfound_count).credit_memo_number := l_trx_number;
1037 l_exactmatchTbl(l_exactfound_count).claim_amount := l_amountTbl(i);
1038 l_exactmatchTbl(l_exactfound_count).credit_amount := l_crditmemo_amount;
1039 l_exactmatchTbl(l_exactfound_count).currency_code := l_curcodeTbl(i);
1040 l_exactmatchTbl(l_exactfound_count).customer_trx_id := l_trx_id;
1041
1042 -- If exact match found then go to next deduction
1043 GOTO END_OF_DEDUCTION;
1044
1045 END IF;
1046 -- End For 100% Credit Match
1047
1048 -- For Possible Match
1049 -- Find the threshold
1050 IF l_cre_threshold_type = '%' THEN
1051 l_upper_thres_amount := l_amountTbl(i) + (l_amountTbl(i) * l_cre_threshold_val / 100);
1052 l_lower_thres_amount := l_amountTbl(i) - (l_amountTbl(i) * l_cre_threshold_val / 100);
1053 ELSIF l_cre_threshold_type = 'AMT' THEN
1054 l_upper_thres_amount := l_amountTbl(i) + l_cre_threshold_val;
1055 l_lower_thres_amount := l_amountTbl(i) - l_cre_threshold_val;
1056 END IF;
1057
1058
1059 IF(l_cust_name_match_type = 'EXCLUDE_REL_CUST') THEN
1060 IF OZF_DEBUG_HIGH_ON THEN
1061 OZF_Utility_PVT.write_conc_log('Possible Match - Exclude Related Customer');
1062 END IF;
1063
1064 OPEN csr_poss_cm_exc_cust(l_custaccountTbl(i),l_curcodeTbl(i),l_siteUseIdTbl(i),l_lower_thres_amount,l_upper_thres_amount,l_custrefnormTbl(i));
1065 LOOP
1066 FETCH csr_poss_cm_exc_cust INTO l_trx_id,l_trx_number,l_crditmemo_amount;
1067 EXIT WHEN csr_poss_cm_exc_cust%NOTFOUND;
1068 -- Populate the possible records
1069 l_possible_count := l_possible_count +1;
1070 l_possiblematchTbl(l_possible_count).claim_id := l_claimidTbl(i);
1071 l_possiblematchTbl(l_possible_count).claim_number := l_claimTbl(i);
1072 l_possiblematchTbl(l_possible_count).credit_memo_number := l_trx_number;
1073 l_possiblematchTbl(l_possible_count).claim_amount := l_amountTbl(i);
1074 l_possiblematchTbl(l_possible_count).credit_amount := l_crditmemo_amount;
1075 l_possiblematchTbl(l_possible_count).currency_code := l_curcodeTbl(i);
1076 l_possiblematchTbl(l_possible_count).customer_trx_id := l_trx_id;
1077
1078 IF OZF_DEBUG_HIGH_ON THEN
1079 OZF_Utility_PVT.write_conc_log('Possible Match - l_trx_id :' || l_trx_id);
1080 END IF;
1081
1082 IF(l_trx_id IS NOT NULL) THEN
1083 l_cm_match_found := 'T';
1084 END IF;
1085
1086 END LOOP;
1087
1088 CLOSE csr_poss_cm_exc_cust;
1089
1090 ELSIF(l_cust_name_match_type = 'INCLUDE_REL_CUST') THEN
1091 IF OZF_DEBUG_HIGH_ON THEN
1092 OZF_Utility_PVT.write_conc_log('Possible Match - Include Related Customer');
1093 END IF;
1094
1095
1096 OPEN csr_poss_cm_rel_cust(l_custaccountTbl(i),l_claimidTbl(i),l_curcodeTbl(i),l_lower_thres_amount,l_upper_thres_amount,l_custrefnormTbl(i));
1097 LOOP
1098 FETCH csr_poss_cm_rel_cust INTO l_trx_id,l_trx_number,l_crditmemo_amount;
1099 EXIT WHEN csr_poss_cm_rel_cust%NOTFOUND;
1100 l_possible_count := l_possible_count +1;
1101 l_possiblematchTbl(l_possible_count).claim_id := l_claimidTbl(i);
1102 l_possiblematchTbl(l_possible_count).claim_number := l_claimTbl(i);
1103 l_possiblematchTbl(l_possible_count).credit_memo_number := l_trx_number;
1104 l_possiblematchTbl(l_possible_count).claim_amount := l_amountTbl(i);
1105 l_possiblematchTbl(l_possible_count).credit_amount := l_crditmemo_amount;
1106 l_possiblematchTbl(l_possible_count).currency_code := l_curcodeTbl(i);
1107 l_possiblematchTbl(l_possible_count).customer_trx_id := l_trx_id;
1108
1109 IF OZF_DEBUG_HIGH_ON THEN
1110 OZF_Utility_PVT.write_conc_log('Possible Match - l_trx_id :' || l_trx_id);
1111 END IF;
1112
1113 IF(l_trx_id IS NOT NULL) THEN
1114 l_cm_match_found := 'T';
1115 END IF;
1116
1117 END LOOP;
1118
1119 CLOSE csr_poss_cm_rel_cust;
1120
1121 END IF;
1122 -- If possible match found then go to next deduction
1123 IF OZF_DEBUG_HIGH_ON THEN
1124 OZF_Utility_PVT.write_conc_log('l_possiblematchTbl.count :' || l_possiblematchTbl.count);
1125 OZF_Utility_PVT.write_conc_log('l_cm_match_found :' || l_cm_match_found);
1126 END IF;
1127
1128 IF (l_possiblematchTbl.count > 0 AND l_cm_match_found = 'T' )THEN
1129 GOTO END_OF_DEDUCTION;
1130 END IF;
1131
1132 BEGIN
1133 SAVEPOINT Update_Claim_From_Association;
1134
1135 IF (l_padnormTbl(i) IS NOT NULL) THEN
1136
1137 l_list_header_id := l_offerIdTbl(i);
1138 l_offer_code := l_padnormTbl(i);
1139
1140 IF OZF_DEBUG_HIGH_ON THEN
1141 OZF_Utility_PVT.write_conc_log('Offer Found: ' || l_offer_code);
1142 OZF_Utility_PVT.write_conc_log('Offer ID: ' || l_list_header_id);
1143 END IF;
1144
1145
1146 IF l_list_header_id IS NULL THEN
1147 IF OZF_DEBUG_HIGH_ON THEN
1148 OZF_Utility_PVT.write_conc_log('Invalid PAD Number ' || l_padnormTbl(i));
1149 END IF;
1150
1151 ELSE
1152
1153 l_ind :=1;
1154 OPEN csr_claim_line_info(l_claimidTbl(i));
1155 LOOP
1156 FETCH csr_claim_line_info into l_claim_line_id, l_claim_line_object_version;
1157 EXIT when csr_claim_line_info%NOTFOUND;
1158 l_claim_line_tbl(l_ind).claim_line_id := l_claim_line_id;
1159 l_claim_line_tbl(l_ind).object_version_number := l_claim_line_object_version;
1160 l_ind := l_ind +1;
1161 END LOOP;
1162 CLOSE csr_claim_line_info;
1163
1164
1165 IF(l_claim_line_tbl.COUNT > 0 ) THEN
1166 -- delete the claim line if there is any
1167 OZF_Claim_Line_PVT.Delete_Claim_Line_Tbl(
1168 p_api_version => l_api_version
1169 ,p_init_msg_list => FND_API.g_false
1170 ,p_commit => FND_API.g_false
1171 ,p_validation_level => FND_API.g_valid_level_full
1172 ,x_return_status => l_return_status
1173 ,x_msg_count => l_msg_count
1174 ,x_msg_data => l_msg_data
1175 ,p_claim_line_tbl => l_claim_line_tbl
1176 ,p_change_object_version => FND_API.g_false
1177 ,x_error_index => l_error_index
1178 );
1179 IF l_return_status = FND_API.g_ret_sts_error THEN
1180 RAISE FND_API.g_exc_unexpected_error;
1181 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
1182 RAISE FND_API.g_exc_unexpected_error;
1183 END IF;
1184 END IF; -- End of delete claim line
1185
1186 IF OZF_DEBUG_HIGH_ON THEN
1187 OZF_Utility_PVT.write_conc_log('Claim Line Deleted');
1188 END IF;
1189
1190 l_claim_line_rec.claim_id := l_claimidTbl(i);
1191 l_claim_line_rec.activity_type := 'OFFR';
1192 l_claim_line_rec.activity_id := l_list_header_id;
1193 l_claim_line_rec.currency_code := l_curcodeTbl(i);
1194 l_claim_line_rec.amount := l_amountTbl(i);
1195 l_claim_line_rec.acctd_amount := l_acctdamountTbl(i);
1196 l_claim_line_rec.claim_currency_amount := l_amountTbl(i);
1197
1198 -- New claim line creation
1199 OZF_Claim_Line_PVT.Create_Claim_Line(
1200 p_api_version => 1.0
1201 , p_init_msg_list => FND_API.g_false
1202 , p_commit => FND_API.g_false
1203 , p_validation_level => FND_API.g_valid_level_full
1204 , x_return_status => l_return_status
1205 , x_msg_data => l_msg_data
1206 , x_msg_count => l_msg_count
1207 , p_claim_line_rec => l_claim_line_rec
1208 , p_mode => OZF_CLAIM_UTILITY_PVT.g_auto_mode
1209 , x_claim_line_id => l_claim_line_id
1210 );
1211 IF l_return_status = fnd_api.g_ret_sts_error THEN
1212 RAISE FND_API.g_exc_error;
1213 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1214 RAISE FND_API.g_exc_unexpected_error;
1215 END IF;
1216
1217 IF OZF_DEBUG_HIGH_ON THEN
1218 OZF_Utility_PVT.write_conc_log('Claim Line Created');
1219 OZF_Utility_PVT.write_conc_log('New Claim Line Created' || l_claim_line_id);
1220 END IF;
1221
1222 -- Associate Accruals to Claim Line
1223 OZF_Claim_Accrual_PVT.Asso_Accruals_To_Claim_Line(
1224 p_api_version => 1.0
1225 ,p_init_msg_list => FND_API.g_false
1226 ,p_commit => FND_API.g_false
1227 ,p_validation_level => FND_API.G_VALID_LEVEL_FULL
1228 ,x_return_status => l_return_status
1229 ,x_msg_count => l_msg_count
1230 ,x_msg_data => l_msg_data
1231 ,p_claim_line_id => l_claim_line_id
1232 );
1233
1234 OZF_Utility_PVT.write_conc_log('Return Status for Asso_Accruals_To_Claim_Line: ' || l_return_status);
1235
1236 IF l_return_status = FND_API.g_ret_sts_error THEN
1237 RAISE FND_API.g_exc_error;
1238 ELSIF l_return_status = FND_API.g_ret_sts_unexp_error THEN
1239 RAISE FND_API.g_exc_error;
1240 END IF;
1241
1242
1243 OPEN csr_claim_line_util_info (l_claim_line_id);
1244 FETCH csr_claim_line_util_info INTO l_count_earnings;
1245 CLOSE csr_claim_line_util_info;
1246
1247 -- Need to check here add the return status check as yes
1248 IF (l_count_earnings = 0) THEN
1249 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_error) THEN
1250 FND_MESSAGE.set_name('OZF', 'OZF_EARN_AVAIL_AMT_ZERO');
1251 FND_MSG_PUB.add;
1252 END IF;
1253 ROLLBACK TO Update_Claim_From_Association;
1254 ELSE
1255 -- Initiate the Settlement
1256 l_claim_rec.claim_id := l_claimidTbl(i);
1257 l_claim_rec.payment_method := 'CREDIT_MEMO';
1258 l_claim_rec.object_version_number := l_claimobjverTbl(i);
1259 l_claim_rec.status_code := 'CLOSED';
1260 l_claim_rec.user_status_id := to_number(
1261 ozf_utility_pvt.get_default_user_status(
1262 p_status_type => 'OZF_CLAIM_STATUS',
1263 p_status_code => l_claim_rec.status_code));
1264 l_claim_rec.request_id := NVL(FND_GLOBAL.CONC_REQUEST_ID,-1);
1265 l_claim_rec.program_id := NVL(FND_GLOBAL.PROG_APPL_ID,-1);
1266 l_claim_rec.settled_from := 'RULEBASED';
1267
1268 OZF_Claim_PVT.Update_Claim(
1269 p_api_version => l_api_version
1270 ,p_init_msg_list => FND_API.g_false
1271 ,p_commit => FND_API.g_false
1272 ,p_validation_level => FND_API.g_valid_level_full
1273 ,x_return_status => l_return_status
1274 ,x_msg_data => l_msg_data
1275 ,x_msg_count => l_msg_count
1276 ,p_claim => l_claim_rec
1277 ,p_event => 'UPDATE'
1278 ,p_mode => 'AUTO'
1279 ,x_object_version_number => l_object_version_number
1280 );
1281 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1282 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1283 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1284 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1285 END IF;
1286
1287 END IF; -- End of Association check
1288 -- Populate the accrual records
1289 l_accrual_count := l_accrual_count +1;
1290 l_accrualmatchTbl(l_accrual_count).claim_id := l_claimidTbl(i);
1291 l_accrualmatchTbl(l_accrual_count).claim_number := l_claimTbl(i);
1292 l_accrualmatchTbl(l_accrual_count).Offer_Code := l_offer_code;
1293 l_accrualmatchTbl(l_accrual_count).claim_amount := l_amountTbl(i);
1294 l_accrualmatchTbl(l_accrual_count).currency_code := l_curcodeTbl(i);
1295 l_accrualmatchTbl(l_accrual_count).qp_list_header_id := l_list_header_id;
1296
1297 END IF; -- End of Offer Check
1298
1299 END IF; -- End of PAD check
1300
1301 EXCEPTION
1302 WHEN FND_API.g_exc_error THEN
1303 ROLLBACK TO Update_Claim_From_Association;
1304 OZF_Utility_PVT.write_conc_log('Expected errors:l_msg_count' || l_msg_count);
1305 IF OZF_DEBUG_HIGH_ON THEN
1306 OZF_UTILITY_PVT.write_conc_log;
1307 ELSE
1308 FOR I IN 1..l_msg_count LOOP
1309 IF I = l_msg_count THEN
1310 OZF_Utility_PVT.write_conc_log(SUBSTR(FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F'), 1, 254));
1311 END IF;
1312 END LOOP;
1313 END IF;
1314
1315 WHEN FND_API.g_exc_unexpected_error THEN
1316 ROLLBACK TO Update_Claim_From_Association;
1317 OZF_Utility_PVT.write_conc_log('Unexpected errors:l_msg_count' || l_msg_count);
1318 IF OZF_DEBUG_HIGH_ON THEN
1319 OZF_UTILITY_PVT.write_conc_log;
1320 ELSE
1321 FOR I IN 1..l_msg_count LOOP
1322 IF I = l_msg_count THEN
1323 OZF_Utility_PVT.write_conc_log(SUBSTR(FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F'), 1, 254));
1324 END IF;
1325 END LOOP;
1326 END IF;
1327
1328 WHEN OTHERS THEN
1329 ROLLBACK TO Update_Claim_From_Association;
1330 IF OZF_DEBUG_HIGH_ON THEN
1331 OZF_Utility_PVT.write_conc_log('Fail For Deduction OTHERS : ' || l_claimTbl(i) || ' - Error Message: ' || SQLERRM);
1332 END IF;
1333
1334 FND_MSG_PUB.count_and_get(
1335 p_encoded => FND_API.g_false
1336 ,p_count => l_msg_count
1337 ,p_data => l_msg_data
1338 );
1339
1340 END;
1341
1342 <<END_OF_DEDUCTION>>
1343 NULL;
1344 END LOOP;
1345 EXIT WHEN open_ded_csr%NOTFOUND;
1346 END LOOP;
1347 -- Need to Call the Log procedure
1348 IF OZF_DEBUG_HIGH_ON THEN
1349 OZF_Utility_PVT.write_conc_log('Credit Count' || l_exactmatchTbl.count);
1350 OZF_Utility_PVT.write_conc_log('Credit Possible Count' || l_possiblematchTbl.count);
1351 OZF_Utility_PVT.write_conc_log('Accrual Count' || l_accrualmatchTbl.count);
1352 END IF;
1353
1354 -- For logging
1355 Create_Log(
1356 p_api_version => 1.0
1357 ,p_init_msg_list => FND_API.g_false
1358 ,p_commit => FND_API.g_false
1359 ,p_validation_level => FND_API.g_valid_level_full
1360 ,p_exact_match_tbl => l_exactmatchTbl
1361 ,p_possible_match_tbl => l_possiblematchTbl
1362 ,p_accrual_match_tbl => l_accrualmatchTbl
1363 ,x_return_status => l_return_status
1364 ,x_msg_count => l_msg_data
1365 ,x_msg_data => l_msg_count
1366 );
1367
1368 IF l_return_status = fnd_api.g_ret_sts_error THEN
1369 RAISE FND_API.g_exc_error;
1370 ELSIF l_return_status = fnd_api.g_ret_sts_unexp_error THEN
1371 RAISE FND_API.g_exc_unexpected_error;
1372 END IF;
1373
1374 CLOSE open_ded_csr;
1375
1376
1377 END IF;
1378
1379 EXCEPTION
1380 WHEN FND_API.G_EXC_ERROR THEN
1381 ROLLBACK TO RuleBased;
1382 FND_FILE.PUT_LINE(FND_FILE.LOG, '===> Failed.');
1383 OZF_UTILITY_PVT.write_conc_log;
1384 FND_FILE.PUT_LINE(FND_FILE.LOG, '/*--- End ---*/');
1385 FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
1386 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Status : Rule Based Engine Failed. ');
1387 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Error : ' || FND_MSG_PUB.get(FND_MSG_PUB.count_msg, FND_API.g_false));
1388 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
1389 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1390 ROLLBACK TO RuleBased;
1391 FND_FILE.PUT_LINE(FND_FILE.LOG, '===> Failed.');
1392 OZF_UTILITY_PVT.write_conc_log;
1393 FND_FILE.PUT_LINE(FND_FILE.LOG, '/*--- End ---*/');
1394 FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
1395 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Status : Rule Based Engine Failed. ');
1396 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Error : ' || FND_MSG_PUB.get(FND_MSG_PUB.count_msg, FND_API.g_false));
1397 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
1398
1399 WHEN OTHERS THEN
1400 ROLLBACK TO RuleBased;
1401 FND_FILE.PUT_LINE(FND_FILE.LOG, '===> Failed.');
1402 IF OZF_DEBUG_HIGH_ON THEN
1403 FND_MESSAGE.Set_Name('OZF','OZF_API_DEBUG_MESSAGE');
1404 FND_MESSAGE.Set_Token('TEXT',sqlerrm);
1405 FND_MSG_PUB.Add;
1406 END IF;
1407 OZF_UTILITY_PVT.write_conc_log;
1408 FND_FILE.PUT_LINE(FND_FILE.LOG, '/*--- End ---*/');
1409 FND_FILE.PUT_LINE(FND_FILE.LOG, ' ');
1410 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Status : Rule Based Engine Failed. ');
1411 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, 'Error : ' || SQLCODE||SQLERRM);
1412 FND_FILE.PUT_LINE(FND_FILE.OUTPUT, '');
1413 END Start_Rule_Based_Settlement;
1414
1415
1416 End OZF_claim_Utility_pvt;
1417