[Home] [Help]
PACKAGE BODY: APPS.PA_BILLING_WRKBNCH_EVENTS
Source
1 Package Body PA_Billing_Wrkbnch_Events as
2 /* $Header: PABWBCHB.pls 120.2.12010000.2 2010/02/24 05:35:24 dbudhwar ship $ */
3
4 /*----------------- Private Procedure/Function Declarations -----------------*/
5
6 /*----------------------------------------------------------------------------+
7 | This Private Procedure Get_Next_Event_Num gets the maximum event num + 1 |
8 | for the project and task. |
9 +----------------------------------------------------------------------------*/
10 Procedure Get_Next_Event_Num ( P_Project_ID IN NUMBER,
11 P_Task_ID IN NUMBER,
12 X_Event_Num OUT NOCOPY NUMBER ) AS --File.Sql.39 bug 4440895
13
14 Cursor c_Event_Num_Project Is
15 select nvl(max(event_num), 0) + 1 from pa_events
16 where project_id = P_Project_ID
17 and task_id is null;
18
19 Cursor c_Event_Num_Task Is
20 select nvl(max(event_num), 0) + 1 from pa_events
21 where project_id = P_Project_ID
22 and task_id = P_Task_ID;
23 BEGIN
24
25 If nvl(P_Task_Id, 0) <= 0 Then
26 Open c_Event_Num_Project;
27 Fetch c_Event_Num_Project Into X_Event_Num;
28 Close c_Event_Num_Project;
29 Else
30 Open c_Event_Num_Task;
31 Fetch c_Event_Num_Task Into X_Event_Num;
32 Close c_Event_Num_Task;
33 End If;
34
35
36 EXCEPTION
37 WHEN OTHERS THEN
38 /* ATG NOCOPY */
39 X_Event_Num := null;
40 RAISE;
41 END Get_Next_Event_Num;
42
43
44 /*----------------------------------------------------------------------------+
45 | This Private Procedure Check_Create_Update_Event validates the funding lvl |
46 | and also if the event number is unique or not. |
47 +----------------------------------------------------------------------------*/
48
49 Procedure Check_Event_Action ( P_Project_Id IN NUMBER,
50 P_Task_ID IN NUMBER,
51 P_Event_Num IN NUMBER,
52 P_Event_Id IN NUMBER,
53 P_Event_Action IN VARCHAR2,
54 P_Action_Name IN VARCHAR2,
55 P_Init_Msg_List IN VARCHAR2,
56 P_Event_Num_Chg IN VARCHAR2,
57 P_Rec_Ver_Num IN NUMBER,
58 P_Mcb_Enabled_Flag IN VARCHAR2,
59 P_Pfc_Rate_Date_Code IN VARCHAR2,
60 P_Pc_Rate_Date_Code IN VARCHAR2,
61 P_Fc_Rate_Date_Code IN VARCHAR2,
62 P_Projfunc_Curr_Code IN VARCHAR2,
63 P_Project_Curr_Code IN VARCHAR2,
64 P_Bill_Trans_Curr_Code IN VARCHAR2,
65 P_Pfc_Rate_Type IN VARCHAR2,
66 P_Pc_Rate_Type IN VARCHAR2,
67 P_Fc_Rate_Type IN VARCHAR2,
68 P_Pfc_Rate_Date IN DATE,
69 P_Pc_Rate_Date IN DATE,
70 P_Fc_Rate_Date IN DATE,
71 P_Pfc_Excg_Rate IN NUMBER,
72 P_Pc_Excg_Rate IN NUMBER,
73 P_Fc_Excg_Rate IN NUMBER,
74 P_Event_Type IN VARCHAR2,
75 P_Bill_Txn_Cur IN VARCHAR2,
76 P_Invoice_Amt IN NUMBER,
77 P_Revenue_Amt IN NUMBER,
78 P_Event_Org IN NUMBER,
79 X_Msg_Data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
80 X_Msg_Count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
81 X_Return_Status OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
82 AS
83
84 Invalid_event_action exception; /* Added for bug 3850381 */
85 l_return_status varchar2(1) := FND_API.G_RET_STS_SUCCESS;
86 l_err_message varchar2(240) := null;
87 l_event_processed varchar2(1) := 'Y';
88 l_rec_ver_num pa_events.record_version_number%type;
89 /* Added for bug 3850381 */
90 l_msg_count NUMBER := 0;
91 l_data VARCHAR2(2000) := null;
92 l_msg_data VARCHAR2(2000) := null;
93 l_msg_index_out NUMBER := 0;
94
95 BEGIN
96
97 X_Return_Status := FND_API.G_RET_STS_SUCCESS;
98
99 IF FND_API.TO_BOOLEAN(nvl(p_init_msg_list,FND_API.G_TRUE)) THEN
100 FND_MSG_PUB.initialize;
101 END IF;
102
103 If P_Event_Action = 'Delete'
104 Then
105 l_event_processed :=PA_EVENT_UTILS.CHECK_EVENT_PROCESSED
106 (P_event_id => P_Event_Id );
107
108 If l_event_processed <> 'Y'
109 Then
110 x_return_status := FND_API.G_RET_STS_ERROR;
111 l_err_message := FND_MESSAGE.GET_STRING('PA', 'PA_TK_EVENT_IN_USE');
112 PA_UTILS.ADD_MESSAGE
113 ( p_app_short_name => 'PA',
114 p_msg_name => 'PA_ACTION_NAME_ERR',
115 p_token1 => 'ACTION_NAME',
116 p_value1 => P_Action_Name,
117 p_token2 => 'MESSAGE',
118 p_value2 => l_Err_Message);
119 End If;
120
121 Else
122
123 /* Added for bug 3935772 */
124 If P_Event_Type is null
125 Then
126 x_return_status := FND_API.G_RET_STS_ERROR;
127 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_NO_EVENT_TYPE');
128 PA_UTILS.ADD_MESSAGE
129 ( p_app_short_name => 'PA',
130 p_msg_name => 'PA_ACTION_NAME_ERR',
131 p_token1 => 'ACTION_NAME',
132 p_value1 => P_Action_Name,
133 p_token2 => 'MESSAGE',
134 p_value2 => l_Err_Message);
135 End If;
136
137 If P_Bill_Txn_Cur is null
138 Then
139 x_return_status := FND_API.G_RET_STS_ERROR;
140 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_BIL_TRX_CUR_AMG');
141 PA_UTILS.ADD_MESSAGE
142 ( p_app_short_name => 'PA',
143 p_msg_name => 'PA_ACTION_NAME_ERR',
144 p_token1 => 'ACTION_NAME',
145 p_value1 => P_Action_Name,
146 p_token2 => 'MESSAGE',
147 p_value2 => l_Err_Message);
148 End If;
149
150 If P_Invoice_Amt is null
151 Then
152 x_return_status := FND_API.G_RET_STS_ERROR;
153 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_INV_AMT');
154 PA_UTILS.ADD_MESSAGE
155 ( p_app_short_name => 'PA',
156 p_msg_name => 'PA_ACTION_NAME_ERR',
157 p_token1 => 'ACTION_NAME',
158 p_value1 => P_Action_Name,
159 p_token2 => 'MESSAGE',
160 p_value2 => l_Err_Message);
161 End If;
162
163 If P_Revenue_Amt is null
164 Then
165 x_return_status := FND_API.G_RET_STS_ERROR;
166 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_REV_AMT');
167 PA_UTILS.ADD_MESSAGE
168 ( p_app_short_name => 'PA',
169 p_msg_name => 'PA_ACTION_NAME_ERR',
170 p_token1 => 'ACTION_NAME',
171 p_value1 => P_Action_Name,
172 p_token2 => 'MESSAGE',
173 p_value2 => l_Err_Message);
174 End If;
175
176 If P_Event_Org is null
177 Then
178 x_return_status := FND_API.G_RET_STS_ERROR;
179 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_EVNT_ORG_AMG');
180 PA_UTILS.ADD_MESSAGE
181 ( p_app_short_name => 'PA',
182 p_msg_name => 'PA_ACTION_NAME_ERR',
183 p_token1 => 'ACTION_NAME',
184 p_value1 => P_Action_Name,
185 p_token2 => 'MESSAGE',
186 p_value2 => l_Err_Message);
187 End If;
188
189 IF X_Return_Status <> FND_API.G_RET_STS_SUCCESS
190 THEN
191 raise Invalid_event_action;
192 END IF;
193
194 /* End of changes for bug 3935772 */
195
196 If PA_EVENT_CORE.CHECK_FUNDING ( P_Project_Id,
197 P_Task_Id ) = 'N'
198 Then
199 x_return_status := FND_API.G_RET_STS_ERROR;
200 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_TASK_FUND_NO_PROJ_EVENT_AMG');
201 PA_UTILS.ADD_MESSAGE
202 ( p_app_short_name => 'PA',
203 p_msg_name => 'PA_ACTION_NAME_ERR',
204 p_token1 => 'ACTION_NAME',
205 p_value1 => P_Action_Name,
206 p_token2 => 'MESSAGE',
207 p_value2 => l_Err_Message);
208 End If;
209
210
211 If P_Event_Num_Chg = 'Y'
212 Then
213 If PA_EVENT_CORE.CHECK_VALID_EVENT_NUM( P_Project_Id,
214 P_Task_Id,
215 P_Event_Num) = 'N'
216 Then
217 x_return_status := FND_API.G_RET_STS_ERROR;
218 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INV_EVNT_NUM_AMG');
219 PA_UTILS.ADD_MESSAGE
220 ( p_app_short_name => 'PA',
221 p_msg_name => 'PA_ACTION_NAME_ERR',
222 p_token1 => 'ACTION_NAME',
223 p_value1 => P_Action_Name,
224 p_token2 => 'MESSAGE',
225 p_value2 => l_Err_Message);
226 End If;
227 End If;
228
229 IF (P_Mcb_Enabled_Flag = 'Y' )
230 Then
231 If p_Bill_Trans_Curr_Code <> p_Projfunc_Curr_Code
232 Then
233
234 If (p_Pfc_Rate_Date_Code = 'FIXED_DATE' and p_Pfc_Rate_Type <> 'User' and p_Pfc_Rate_Date is null)
235 Then
236 x_return_status := FND_API.G_RET_STS_ERROR;
237 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_PROJFUNC_DATE_AMG');
238 PA_UTILS.ADD_MESSAGE
239 ( p_app_short_name => 'PA',
240 p_msg_name => 'PA_ACTION_NAME_ERR',
241 p_token1 => 'ACTION_NAME',
242 p_value1 => P_Action_Name,
243 p_token2 => 'MESSAGE',
244 p_value2 => l_Err_Message);
245 End If;
246
247 If (p_Pfc_Rate_Type = 'User' and nvl(p_Pfc_Excg_Rate, 0) <= 0)
248 Then
249 x_return_status := FND_API.G_RET_STS_ERROR;
250 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_EXCH_RATE_NULL_PF_AMG');
251 PA_UTILS.ADD_MESSAGE
252 ( p_app_short_name => 'PA',
253 p_msg_name => 'PA_ACTION_NAME_ERR',
254 p_token1 => 'ACTION_NAME',
255 p_value1 => P_Action_Name,
256 p_token2 => 'MESSAGE',
257 p_value2 => l_Err_Message);
258 End If;
259
260 End If;
261
262 If (p_Bill_Trans_Curr_Code <> p_Project_Curr_Code and p_Project_Curr_Code <> p_Projfunc_Curr_Code)
263 Then
264
265 If (p_Pc_Rate_Date_Code = 'FIXED_DATE' and p_Pc_Rate_Type <> 'User' and p_Pc_Rate_Date is null)
266 Then
267 x_return_status := FND_API.G_RET_STS_ERROR;
268 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_PROJ_DATE_AMG');
269 PA_UTILS.ADD_MESSAGE
270 ( p_app_short_name => 'PA',
271 p_msg_name => 'PA_ACTION_NAME_ERR',
272 p_token1 => 'ACTION_NAME',
273 p_value1 => P_Action_Name,
274 p_token2 => 'MESSAGE',
275 p_value2 => l_Err_Message);
276 End If;
277
278 If (p_Pc_Rate_Type = 'User' and nvl(p_Pc_Excg_Rate, 0) <= 0 )
279 Then
280 x_return_status := FND_API.G_RET_STS_ERROR;
281 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_EXCH_RATE_NULL_PC_AMG');
282 PA_UTILS.ADD_MESSAGE
283 ( p_app_short_name => 'PA',
284 p_msg_name => 'PA_ACTION_NAME_ERR',
285 p_token1 => 'ACTION_NAME',
286 p_value1 => P_Action_Name,
287 p_token2 => 'MESSAGE',
288 p_value2 => l_Err_Message);
289 End If;
290
291 End If;
292
293 If (p_Fc_Rate_Date_Code = 'FIXED_DATE' and p_Fc_Rate_Type <> 'User' and p_Fc_Rate_Date is null)
294 Then
295 x_return_status := FND_API.G_RET_STS_ERROR;
296 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_INVALID_FUND_DATE_AMG');
297 PA_UTILS.ADD_MESSAGE
298 ( p_app_short_name => 'PA',
299 p_msg_name => 'PA_ACTION_NAME_ERR',
300 p_token1 => 'ACTION_NAME',
301 p_value1 => P_Action_Name,
302 p_token2 => 'MESSAGE',
303 p_value2 => l_Err_Message);
304 End If;
305
306 If ( p_Fc_Rate_Type = 'User' and nvl(p_Fc_Excg_Rate, 0) <= 0 )
307 Then
308 x_return_status := FND_API.G_RET_STS_ERROR;
309 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_FUND_EXCG_RATE_INV_AMG');
310 PA_UTILS.ADD_MESSAGE
311 ( p_app_short_name => 'PA',
312 p_msg_name => 'PA_ACTION_NAME_ERR',
313 p_token1 => 'ACTION_NAME',
314 p_value1 => P_Action_Name,
315 p_token2 => 'MESSAGE',
316 p_value2 => l_Err_Message);
317 End If;
318
319 End If;
320
321
322 If P_Event_Action = 'Update'
323 Then
324 Begin
325 select record_version_number
326 into l_rec_ver_num
327 from pa_events
328 where event_id = p_event_id;
329
330 If l_rec_ver_num <> p_rec_ver_num
331 Then
332 x_return_status := FND_API.G_RET_STS_ERROR;
333 l_err_message := FND_MESSAGE.GET_STRING('PA','PA_XC_RECORD_CHANGED');
334 PA_UTILS.ADD_MESSAGE
335 ( p_app_short_name => 'PA',
336 p_msg_name => 'PA_ACTION_NAME_ERR',
337 p_token1 => 'ACTION_NAME',
338 p_value1 => P_Action_Name,
339 p_token2 => 'MESSAGE',
340 p_value2 => l_Err_Message);
341 End If;
342 Exception When others then
343 l_return_status := FND_API.G_RET_STS_ERROR;
344 /* raise; */
345 End;
346 End If;
347
348 End If;
349
350 IF X_Return_Status <> FND_API.G_RET_STS_SUCCESS
351 THEN
352 raise Invalid_event_action;
353 END IF;
354
355 EXCEPTION
356 WHEN Invalid_event_action THEN
357 x_return_status := FND_API.G_RET_STS_ERROR;
358 l_msg_count := FND_MSG_PUB.count_msg;
359
360 IF l_msg_count = 1 THEN
361 PA_INTERFACE_UTILS_PUB.get_messages
362 (p_encoded => FND_API.G_TRUE,
363 p_msg_index => 1,
364 p_msg_count => l_msg_count,
365 p_msg_data => l_msg_data,
366 p_data => l_data,
367 p_msg_index_out => l_msg_index_out);
368 x_msg_data := l_data;
369 x_msg_count := l_msg_count;
370 ELSE
371 x_msg_count := l_msg_count;
372 END IF;
373 RETURN;
374
375 WHEN OTHERS THEN
376 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
377 x_msg_count := 1;
378 x_msg_data := SQLERRM;
379
380 FND_MSG_PUB.add_exc_msg( p_pkg_name=> 'PA_BILLING_WRKBNCH_EVENTS'
381 ,p_procedure_name => 'CHECK_EVENT_ACTION');
382
383 RETURN;
384 /* RAISE; */
385 END Check_Event_Action;
386
387 /*----------------------------------------------------------------------------+
388 | This Private Function Check_Delv_Event_Processed returns 'Y' if an event |
389 | associated with an action processed else returns 'N'.
390 +----------------------------------------------------------------------------*/
391 Function Check_Delv_Event_Processed ( P_Project_Id IN NUMBER,
392 P_Deliverable_Id IN NUMBER,
393 P_Action_Id IN NUMBER)
394 RETURN VARCHAR2
395 IS
396
397 l_return_status varchar2(1) := 'Y';
398 l_event_Id pa_events.event_id%type;
399
400 BEGIN
401
402 SELECT event_id
403 INTO l_event_id
404 FROM pa_events
405 WHERE project_id = P_Project_Id
406 AND deliverable_id = P_Deliverable_Id
407 AND action_id = P_Action_Id;
408
409 l_return_status :=PA_EVENT_UTILS.CHECK_EVENT_PROCESSED
410 (P_event_id => l_event_Id );
411
412 IF l_return_status in ('N', 'P', 'C','I','R') /* for bug 9278197 */
413 Then
414 return 'Y';
415 else
416 return 'N';
417 End If;
418
419 EXCEPTION WHEN OTHERS
420 THEN
421 return 'N';
422 END Check_Delv_Event_Processed;
423
424 /*----------------------------------------------------------------------------+
425 | This Private Function Check_Delv_Event_Processed returns 'Y' if an event |
426 | associated with an action processed else returns 'N'.
427 +----------------------------------------------------------------------------*/
428 Procedure Delete_Delv_Event ( P_Project_Id IN NUMBER,
429 P_Deliverable_Id IN NUMBER,
430 P_Action_Id IN NUMBER,
431 P_Action_Name IN VARCHAR2,
432 X_Return_Status OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
433 AS
434
435 l_tmp_return_status varchar2(1) := null;
436 l_return_status varchar2(1) := FND_API.G_RET_STS_SUCCESS;
437 l_err_message varchar2(240) := null;
438 l_tmp_rowid rowid;
439 cursor c_rowid is
440 select rowid from pa_events
441 where project_id = P_Project_Id
442 and deliverable_id = P_Deliverable_Id
443 and action_id = P_Action_Id;
444
445 BEGIN
446 l_tmp_return_status := Check_Delv_Event_Processed ( P_Project_Id
447 ,P_Deliverable_Id
448 ,P_Action_Id);
449
450 IF l_tmp_return_status = 'Y'
451 Then
452 l_err_message := FND_MESSAGE.GET_STRING('PA', 'PA_TK_EVENT_IN_USE');
453 PA_UTILS.ADD_MESSAGE
454 ( p_app_short_name => 'PA',
455 p_msg_name => 'PA_TK_EVENT_IN_USE',
456 p_token1 => 'ACTION_NAME',
457 p_value1 => P_Action_Name,
458 p_token2 => 'MESSAGE',
459 p_value2 => l_Err_Message);
460 l_return_status := FND_API.G_RET_STS_ERROR;
461 Else
462 open c_rowid;
463 fetch c_rowid into l_tmp_rowid;
464
465 if c_rowid%rowcount = 1
466 then
467 PA_EVENTS_PKG.Delete_Row (X_RowId => l_tmp_rowid);
468 end if;
469
470 close c_rowid;
471
472 End If;
473 X_Return_Status := l_return_status;
474 EXCEPTION WHEN OTHERS
475 THEN
476 raise;
477 END Delete_Delv_Event;
478
479
480 Procedure Get_Proj_Carry_Out_Org ( P_Project_ID IN NUMBER,
481 X_Org_ID OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
482 X_Org_Name OUT NOCOPY VARCHAR2 ) AS --File.Sql.39 bug 4440895
483 Begin
484
485 SELECT to_char(o.organization_id),
486 o.name
487 INTO X_Org_ID,
488 X_Org_Name
489 FROM pa_projects p, hr_organization_units o
490 WHERE p.carrying_out_organization_id = o.organization_id
491 AND p.project_id = P_Project_ID;
492
493 Exception WHEN OTHERS
494 THEN
495 NULL;
496 End Get_Proj_Carry_Out_Org;
497
498
499 Function CHECK_BILLING_EVENT_EXISTS
500 (
501 p_project_id IN pa_projects_all.project_id%TYPE,
502 p_dlv_element_id IN pa_proj_elements.proj_element_id%TYPE
503 ) RETURN VARCHAR2
504 IS
505
506 l_Deliverable_Id pa_events.deliverable_id%TYPE;
507 l_Dlv_Count Number := 0;
508
509 Begin
510
511 select element_version_id
512 into l_Deliverable_Id
513 from pa_proj_element_versions
514 where proj_element_id = p_dlv_element_id
515 and object_type = 'PA_DELIVERABLES'
516 and project_id = p_project_id;
517
518 If nvl(l_Deliverable_Id, 0) > 0 Then
519
520 Select count(*)
521 into l_Dlv_Count
522 from pa_events e
523 where e.project_id = p_project_id
524 and e.deliverable_id = l_deliverable_id;
525 End If;
526
527 If nvl(l_Dlv_Count, 0) > 0 Then
528 return('Y');
529 Else
530 return('N');
531 End If;
532
533 Exception when others Then
534 return('N');
535
536 End CHECK_BILLING_EVENT_EXISTS;
537
538
539 /* Added for bug 3941159 */
540 Procedure Upd_Event_Comp_Date
541 (
542 P_Deliverable_Id IN NUMBER,
543 P_Action_Id IN NUMBER,
544 P_Event_Date IN DATE
545 )
546 IS
547 BEGIN
548 IF nvl(P_Deliverable_Id, 0) > 0 AND nvl(P_Action_Id, 0) > 0
549 Then
550 Update PA_EVENTS
551 set Completion_Date = trunc(P_Event_Date)
552 Where deliverable_id = P_Deliverable_Id
553 and action_id = P_Action_Id;
554 End If;
555 EXCEPTION WHEN OTHERS THEN
556 null;
557 END Upd_Event_Comp_Date;
558
559 /*------------- End of Public Procedure/Function Declarations ----------------*/
560
561 end PA_Billing_Wrkbnch_Events;