1 PACKAGE BODY PA_ADVERTISEMENTS_PUB AS
2 --$Header: PARAVPBB.pls 120.1 2005/08/19 16:48:46 mwasowic noship $
3 --
4
5
6 ----------------------------------------------------------------------
7 -- Procedure
8 -- Validate Advertisement Action Line
9 --
10 -- Purpose
11 -- This API is currently empty.
12 -- Validate a single action line of an advertisement action set
13 -- template or an advertisement action set on a requirement.
14 ----------------------------------------------------------------------
15 P_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N'); /* Added Debug Profile Option variable initialization for bug#2674619 */
16
17 PROCEDURE Validate_Action_Set_Line (
18 p_action_set_type_code IN pa_action_sets.action_set_type_code%TYPE
19 , p_action_set_line_rec IN pa_action_set_lines%ROWTYPE
20 , p_action_line_conditions_tbl IN pa_action_set_utils.action_line_cond_tbl_type
21 , x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
22 ) IS
23
24 BEGIN
25
26 NULL;
27
28 END Validate_Action_Set_Line;
29
30 ----------------------------------------------------------------------
31 -- Procedure
32 -- Process Advertisement Action Set
33 --
34 -- Purpose
35 -- Re-order the action lines and validate the advertisement
36 -- action set or advertisement action lines on a requirement.
37 -- Invoked when a new action set is created, an existing action
38 -- set or action lines on the requirement are updated, or an action
39 -- set is started on a requirement.
40 ----------------------------------------------------------------------
41 PROCEDURE Process_Action_Set (
42 p_action_set_type_code IN pa_action_sets.action_set_type_code%TYPE
43 , p_action_set_id IN NUMBER
44 , p_action_set_template_flag IN pa_action_sets.action_set_template_flag%TYPE :=NULL
45 , x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
46 ) IS
47
48 TYPE varchar_tbl IS TABLE OF VARCHAR2(30)
49 INDEX BY BINARY_INTEGER;
50 TYPE number_tbl IS TABLE OF NUMBER
51 INDEX BY BINARY_INTEGER;
52 TYPE date_tbl IS TABLE OF DATE
53 INDEX BY BINARY_INTEGER;
54
55 l_start_date pa_project_assignments.start_date%TYPE := NULL;
56 l_adv_action_set_status_code pa_action_sets.status_code%TYPE := NULL;
57 l_adv_action_set_start_date pa_action_sets.actual_start_date%TYPE := NULL;
58 l_pub_to_org_line_id pa_action_set_lines.action_set_line_id%TYPE := NULL;
59 l_action_code_tbl varchar_tbl;
60 l_condition_code_tbl varchar_tbl;
61 l_condition_attribute1_tbl varchar_tbl;
62 l_condition_attribute2_tbl varchar_tbl;
63 l_condition_date_tbl date_tbl;
64 l_action_set_line_id_tbl number_tbl;
65 l_action_status_code_tbl varchar_tbl;
66 l_action_attribute1_tbl varchar_tbl;
67 l_action_attribute3_tbl varchar_tbl;
68 l_action_attribute4_tbl varchar_tbl;
69 l_action_set_line_number_tbl number_tbl;
70 i NUMBER;
71 l_need_validation VARCHAR2(1) := 'F';
72 l_undeleted_action_code_tbl varchar_tbl;
73
74 l_return_status VARCHAR2(1);
75 l_msg_data fnd_new_messages.message_name%TYPE;
76 l_msg_count NUMBER;
77 l_msg_index_out NUMBER;
78
79 --cursor to get the related details of the requirement
80 CURSOR get_req_action_set_info IS
81 SELECT pa.start_date,
82 ast.status_code,
83 ast.actual_start_date
84 FROM pa_project_assignments pa,
85 pa_action_sets ast
86 WHERE pa.assignment_id = ast.object_id
87 AND ast.action_set_id = p_action_set_id;
88
89 --cursor to get pending and complete action lines
90 CURSOR get_action_lines IS
91 SELECT action_code
92 FROM pa_action_set_lines
93 WHERE action_set_id = p_action_set_id
94 AND (status_code = 'PENDING'
95 OR status_code = 'UPDATE_PENDING'
96 OR status_code = 'COMPLETE');
97
98 --cursor to get pending and complete action lines
99 CURSOR get_undeleted_action_lines IS
100 SELECT action_code
101 FROM pa_action_set_lines
102 WHERE action_set_id = p_action_set_id
103 AND line_deleted_flag = 'N';
104
105 --cursor to check if validation is needed
106 CURSOR check_esc_to_next_lvl_exists IS
107 SELECT 'T'
108 FROM pa_action_set_lines
109 WHERE action_set_id = p_action_set_id
110 AND action_code = 'ADVERTISEMENT_ESC_TO_NEXT_LVL'
111 AND (status_code = 'PENDING'
112 OR status_code = 'UPDATE_PENDING'
113 OR status_code = 'COMPLETE')
114 AND rownum=1;
115
116 --cursor to check if a Publish to Organizations action line exist before
117 --the first Escalate to next level action line for
118 --requirement's action set
119 CURSOR check_pub_to_org_exists IS
120 SELECT action_set_line_id
121 FROM pa_action_set_lines
122 WHERE action_set_id = p_action_set_id
123 AND rownum = 1
124 AND action_code = 'ADVERTISEMENT_PUB_TO_START_ORG'
125 AND (status_code = 'PENDING'
126 OR status_code = 'UPDATE_PENDING'
127 OR status_code = 'COMPLETE')
128 AND action_set_line_number < (
129 SELECT MIN(action_set_line_number)
130 FROM pa_action_set_lines
131 WHERE action_code = 'ADVERTISEMENT_ESC_TO_NEXT_LVL'
132 AND action_set_id = p_action_set_id
133 AND (status_code = 'PENDING'
134 OR status_code = 'UPDATE_PENDING'
135 OR status_code = 'COMPLETE'));
136
137 --cursor to check if a Publish to Organizations action line exist before
138 --the first Escalate to next level action line for action set template
139 CURSOR check_pub_to_org_in_template IS
140 SELECT action_set_line_id
141 FROM pa_action_set_lines
142 WHERE action_set_id = p_action_set_id
143 AND rownum = 1
144 AND action_code = 'ADVERTISEMENT_PUB_TO_START_ORG'
145 AND action_set_line_number < (
146 SELECT MIN(action_set_line_number)
147 FROM pa_action_set_lines
148 WHERE action_code = 'ADVERTISEMENT_ESC_TO_NEXT_LVL'
149 AND action_set_id = p_action_set_id);
150
151 BEGIN
152
153 --dbms_output.put_line('PA_ADVERTISEMENTS_PUB.Process_Action_Set');
154
155 IF P_DEBUG_MODE = 'Y' THEN /* Added Debug Profile Option Check for bug#2674619 */
156 PA_DEBUG.WRITE_LOG(x_Module => 'pa.plsql.PA_ADVERTISEMENTS_PUB.Prepare_Adv_Action_Set.begin',x_Msg => 'in PA_ADVERTISEMENTS_PUB.Prepare_Adv_Action_Set', x_Log_Level => 6);
157 END IF;
158
159 --initialize the return status.
160 x_return_status := FND_API.G_RET_STS_SUCCESS;
161
162 -- Initialise the error stack
163 PA_DEBUG.init_err_stack('PA_ADVERTISEMENTS_PUB.Prepare_Adv_Action_Set');
164
165 --get the related details of the requirement if
166 --validating the action set of the requirement
167 IF p_action_set_template_flag='N' OR p_action_set_template_flag IS NULL THEN
168 OPEN get_req_action_set_info;
169 FETCH get_req_action_set_info INTO
170 l_start_date,
171 l_adv_action_set_status_code,
172 l_adv_action_set_start_date;
173 CLOSE get_req_action_set_info;
174 END IF;
175
176 --dbms_output.put_line('calling PA_ADVERTISEMENTS_PVT.Order_Adv_Action_Lines');
177
178 --
179 -- order the action lines
180 --
181 PA_ADVERTISEMENTS_PVT.Order_Adv_Action_Lines (
182 p_action_set_id => p_action_set_id
183 , p_action_set_template_flag => p_action_set_template_flag
184 , p_object_start_date => l_start_date
185 , p_action_set_status_code => l_adv_action_set_status_code
186 , p_action_set_actual_start_date => l_adv_action_set_start_date
187 , x_return_status => l_return_status
188 );
189
190 --dbms_output.put_line('Action Line has been ordered');
191
192 --
193 -- validate the action lines
194 --
195 -- get all Pending, Change Pending and Performed action lines
196 OPEN get_action_lines;
197 FETCH get_action_lines BULK COLLECT INTO l_action_code_tbl;
198 CLOSE get_action_lines;
199
200 -- get all undeleted action lines
201 OPEN get_undeleted_action_lines;
202 FETCH get_undeleted_action_lines BULK COLLECT INTO l_undeleted_action_code_tbl;
203 CLOSE get_undeleted_action_lines;
204
205
206 -- CHECK 1: if there is no such action line, returns error
207 IF l_undeleted_action_code_tbl.COUNT=0 THEN
208
209 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
210 ,p_msg_name => 'PA_NO_ACTION_LINE');
211
212 -- CHECK 2: if Escalate to Next Level is the only action line, returns error
213 ELSIF l_action_code_tbl.COUNT = 1 AND
214 l_action_code_tbl(1)='ADVERTISEMENT_ESC_TO_NEXT_LVL' THEN
215
216 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
217 ,p_msg_name => 'PA_ADV_ESC_NEXT_LVL_ERR');
218
219 -- CHECK 3: if there are more than 1 action lines,
220 -- further validation is needed
221 ELSIF l_action_code_tbl.COUNT > 1 THEN
222
223 --dbms_output.put_line('More than 1 action lines');
224
225 -- CHECK 4: need further validation only if Escalate to Next Level
226 -- action line exists
227 OPEN check_esc_to_next_lvl_exists;
228 FETCH check_esc_to_next_lvl_exists INTO l_need_validation;
229 CLOSE check_esc_to_next_lvl_exists;
230
231 IF l_need_validation = 'T' THEN
232
233 --dbms_output.put_line('Need validation');
234
235 -- CHECK 5: if the advertisement action set has
236 -- been started on the requirement
237 IF l_adv_action_set_status_code <> 'NOT_STARTED' AND
238 l_adv_action_set_status_code <> 'CLOSED' AND
239 l_adv_action_set_start_date IS NOT NULL THEN
240
241 -- dbms_output.put_line('Validate action set on Requirement');
242
243 -- CHECK 5.1:check if a Publish to Organizations action line exist before
244 -- the first Escalate to next level action line
245 OPEN check_pub_to_org_exists;
246 FETCH check_pub_to_org_exists INTO l_pub_to_org_line_id;
247 CLOSE check_pub_to_org_exists;
248
249 IF l_pub_to_org_line_id IS NULL THEN
250
251 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
252 ,p_msg_name => 'PA_ADV_ESC_NEXT_LVL_ERR');
253 END IF;
254
255 -- CHECK 6: if this is template action set,
256 -- or action set has not been started on the requirement
257 ELSE
258
259 --dbms_output.put_line('Validate template action set');
260
261 -- Get the condition codes and condition parameters of action
262 -- lines with action codes equal Publish to Organizations or
263 -- Escalate to next level order by line number
264 SELECT aslc.condition_code, aslc.condition_attribute1, aslc.condition_attribute2
265 BULK COLLECT INTO l_condition_code_tbl, l_condition_attribute1_tbl, l_condition_attribute2_tbl
266 FROM pa_action_set_lines asl,
267 pa_action_set_line_cond aslc
268 WHERE asl.action_set_id = p_action_set_id
269 AND asl.action_set_line_id = aslc.action_set_line_id
270 AND (asl.action_code = 'ADVERTISEMENT_ESC_TO_NEXT_LVL'
271 OR asl.action_code = 'ADVERTISEMENT_PUB_TO_START_ORG')
272 AND (asl.status_code = 'PENDING'
273 OR asl.status_code = 'UPDATE_PENDING'
274 OR asl.status_code = 'COMPLETE')
275 ORDER BY asl.action_set_line_number;
276
277 FOR i in l_condition_code_tbl.FIRST+1 ..l_condition_code_tbl.LAST LOOP
278
279 -- CHECK 6.1: If these lines use different condition code,
280 -- returns error
281 IF l_condition_code_tbl(i) <> l_condition_code_tbl(i-1) THEN
282
283 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
284 ,p_msg_name => 'PA_ADV_DIFF_COND_ERR');
285 EXIT; -- exit the loop
286 END IF;
287
288 -- CHECK 6.2: If the condition code is Days Open or Remaining and
289 -- the Number of Days Remaining is not in descending order
290 -- then returns error
291 IF l_condition_code_tbl(i) = 'ADVERTISEMENT_DAYS_OPN_REMAIN' AND
292 to_number(l_condition_attribute2_tbl(i)) > to_number(l_condition_attribute2_tbl(i-1)) THEN
293
294 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
295 ,p_msg_name => 'PA_ADV_COND_ATT_ERR');
296 EXIT; -- exit the loop
297
298 END IF;
299
300 END LOOP;
301
302 -- CHECK 6.3: check if a Publish to Organizations action line
303 -- exist before the first Escalate to next level action line
304 OPEN check_pub_to_org_in_template;
305 FETCH check_pub_to_org_in_template INTO l_pub_to_org_line_id;
306 CLOSE check_pub_to_org_in_template;
307
308 IF l_pub_to_org_line_id IS NULL THEN
309
310 PA_UTILS.Add_Message ( p_app_short_name => 'PA'
311 ,p_msg_name => 'PA_ADV_ESC_NEXT_LVL_ERR');
312 END IF;
313
314 END IF; -- if it is requirement and advertisement has been started
315 END IF; -- need validation
316 END IF; -- more than 1 action line
317
318 -- Reset the error stack when returning to the calling program
319 PA_DEBUG.Reset_Err_Stack;
320
321 -- If there are any messages in the stack then set x_return_status
322
323 IF FND_MSG_PUB.Count_Msg > 0 THEN
324
325 x_return_status := FND_API.G_RET_STS_ERROR;
326
327 END IF;
328
329 -- Put any message text from message stack into the Message ARRAY
330 EXCEPTION
331 WHEN OTHERS THEN
332
333 -- Set the excetption Message and the stack
334 FND_MSG_PUB.add_exc_msg ( p_pkg_name => 'PA_ADVERTISEMENTS_PUB.Prepare_Adv_Action_Set'
335 ,p_procedure_name => PA_DEBUG.G_Err_Stack );
336 --
337 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
338 RAISE; -- This is optional depending on the needs
339
340 END Process_Action_Set;
341
342
343 ----------------------------------------------------------------------
344 -- Procedure
345 -- Perform Advertisement Action Set Line
346 --
347 -- Purpose
348 -- Invoked by the generic perform action set API to perform an action
349 -- line in the advertisement action set on an object.
350 ----------------------------------------------------------------------
351 PROCEDURE Perform_Action_Set_Line (
352 p_action_set_type_code IN pa_action_sets.action_set_type_code%TYPE
353 , p_action_set_details_rec IN pa_action_sets%ROWTYPE
354 , p_action_set_line_rec IN pa_action_set_lines%ROWTYPE
355 , p_action_line_conditions_tbl IN pa_action_set_utils.action_line_cond_tbl_type
356 , x_action_line_audit_tbl OUT NOCOPY pa_action_set_utils.insert_audit_lines_tbl_type -- For 1159 mandate changes bug#2674619
357 , x_action_line_result_code OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
358 ) IS
359
360 TYPE varchar_tbl IS TABLE OF VARCHAR2(30)
361 INDEX BY BINARY_INTEGER;
362 TYPE number_tbl IS TABLE OF NUMBER
363 INDEX BY BINARY_INTEGER;
364 TYPE date_tbl IS TABLE OF DATE
365 INDEX BY BINARY_INTEGER;
366
367 l_msg_index_out NUMBER;
368 l_object_id pa_project_assignments.assignment_id%TYPE;
369 l_project_id pa_project_assignments.project_id%TYPE;
370 l_start_date pa_project_assignments.start_date%TYPE;
371 l_record_version_number pa_project_assignments.record_version_number%TYPE;
372 l_adv_action_set_status_code pa_action_sets.status_code%TYPE;
373 l_adv_action_set_start_date pa_action_sets.actual_start_date%TYPE;
374 l_return_status VARCHAR2(1);
375
376 --cursor to get the related details of the requirement
377 CURSOR get_req_action_set_info IS
378 SELECT pa.assignment_id,
379 pa.project_id,
380 pa.start_date,
381 pa.record_version_number
382 FROM pa_project_assignments pa,
383 pa_action_sets ast
384 WHERE pa.assignment_id = ast.object_id
385 AND ast.action_set_id = p_action_set_line_rec.action_set_id;
386
387 BEGIN
388
389 --dbms_output.put_line('begin of PA_ADVERTISEMENTS_PUB.Perform_Adv_Action_Set');
390
391 IF P_DEBUG_MODE = 'Y' THEN /* Added Debug Profile Option Check for bug#2674619 */
392 PA_DEBUG.WRITE_LOG(x_Module => 'pa.plsql.PA_ADVERTISEMENTS_PUB.Perform_Adv_Action_Set.begin',x_Msg => 'in PA_ADVERTISEMENTS_PUB.Perform_Adv_Action_Set ', x_Log_Level => 6);
393 END IF;
394
395 -- Initialise the error stack
396 PA_DEBUG.init_err_stack('PA_ADVERTISEMENTS_PUB.Perform_Adv_Action_Set');
397
398 -- Initialize audit record table
399 g_action_line_audit_tbl.DELETE;
400
401 --get the related details of the requirement
402 OPEN get_req_action_set_info;
403 FETCH get_req_action_set_info INTO
404 l_object_id,
405 l_project_id,
406 l_start_date,
407 l_record_version_number;
408 CLOSE get_req_action_set_info;
409
410 --
411 -- Process the action if if the condition of the action line is met
412 -- or if the line status is UPDATE_PENDING
413 --
414 IF p_action_line_conditions_tbl(p_action_line_conditions_tbl.COUNT).condition_date <= SYSDATE OR p_action_set_line_rec.status_code = 'UPDATE_PENDING' THEN
415
416 -- CASE 1: Publish to All
417 IF p_action_set_line_rec.action_code = 'ADVERTISEMENT_PUB_TO_ALL' THEN
418
419 PA_ADVERTISEMENTS_PVT.Publish_To_all(
420 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
421 , p_object_id => l_object_id
422 , p_action_code => p_action_set_line_rec.action_code
423 , p_action_status_code => p_action_set_line_rec.status_code
424 , x_return_status => l_return_status
425 );
426
427 -- CASE 2: Publish to Starting Organization
428 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_PUB_TO_START_ORG' THEN
429
430 PA_ADVERTISEMENTS_PVT.Publish_To_Organizations(
431 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
432 , p_object_id => l_object_id
433 , p_action_code => p_action_set_line_rec.action_code
434 , p_action_status_code => p_action_set_line_rec.status_code
435 , p_org_hierarchy_version_id => to_number(p_action_set_line_rec.action_attribute1)
436 , p_starting_organization_id => to_number(p_action_set_line_rec.action_attribute2)
437 , x_return_status => l_return_status
438 );
439
440 -- CASE 3: Publish to Staffing Manager
441 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_PUB_TO_SM' THEN
442
443 PA_ADVERTISEMENTS_PVT.Publish_To_Staffing_Managers(
444 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
445 , p_object_id => l_object_id
446 , p_action_code => p_action_set_line_rec.action_code
447 , p_action_status_code => p_action_set_line_rec.status_code
448 , p_organization_id => to_number(p_action_set_line_rec.action_attribute1)
449 , x_return_status => l_return_status
450 );
451
452 -- CASE 4: Escalate to Next Level
453 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_ESC_TO_NEXT_LVL' THEN
454
455 PA_ADVERTISEMENTS_PVT.Escalate_to_Next_Level(
456 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
457 , p_action_set_line_number => p_action_set_line_rec.action_set_line_number
458 , p_action_set_id => p_action_set_line_rec.action_set_id
459 , p_action_set_line_rec_ver_num => p_action_set_line_rec.record_version_number
460 , p_action_set_line_cond_tbl => p_action_line_conditions_tbl
461 , p_object_id => l_object_id
462 , p_action_code => p_action_set_line_rec.action_code
463 , p_action_status_code => p_action_set_line_rec.status_code
464 , x_return_status => l_return_status
465 );
466
467 -- CASE 5: Send Email
468 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_EMAIL' THEN
469
470 PA_ADVERTISEMENTS_PVT.Send_Email(
471 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
472 , p_object_id => l_object_id
473 , p_action_code => p_action_set_line_rec.action_code
474 , p_action_status_code => p_action_set_line_rec.status_code
475 , p_email_address => p_action_set_line_rec.action_attribute1
476 , p_project_id => l_project_id
477 , x_return_status => l_return_status
478 );
479
480 -- CASE 6: Send Notification to Person
481 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_PERSON' THEN
482
483 PA_ADVERTISEMENTS_PVT.Send_Notification(
484 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
485 , p_object_id => l_object_id
486 , p_action_code => p_action_set_line_rec.action_code
487 , p_action_status_code => p_action_set_line_rec.status_code
488 , p_method => 'PERSON'
489 , p_person_id => to_number(p_action_set_line_rec.action_attribute1)
490 , p_project_id => l_project_id
491 , p_project_role_id => null
492 , x_return_status => l_return_status
493 );
494
495 -- CASE 7: Send Notification to Project Role
496 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_ROLE' THEN
497
498 PA_ADVERTISEMENTS_PVT.Send_Notification(
499 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
500 , p_object_id => l_object_id
501 , p_action_code => p_action_set_line_rec.action_code
502 , p_action_status_code => p_action_set_line_rec.status_code
503 , p_method => 'PROJECT_ROLE'
504 , p_person_id => null
505 , p_project_id => l_project_id
506 , p_project_role_id => to_number(p_action_set_line_rec.action_attribute1)
507 , x_return_status => l_return_status
508
509 );
510
511 -- CASE 8: Update Staffing Priority
512 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_UPDATE_SP' THEN
513
514 PA_ADVERTISEMENTS_PVT.Update_Staffing_Priority(
515 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
516 , p_object_id => l_object_id
517 , p_action_code => p_action_set_line_rec.action_code
518 , p_action_status_code => p_action_set_line_rec.status_code
519 , p_staffing_priority_code => p_action_set_line_rec.action_attribute1
520 , p_record_version_number => l_record_version_number
521 , x_return_status => l_return_status
522 );
523
524 -- CASE 9: Remove Advertisement
525 ELSIF p_action_set_line_rec.action_code = 'ADVERTISEMENT_REMOVE_ADV' THEN
526
527 PA_ADVERTISEMENTS_PVT.Remove_Advertisement(
528 p_action_set_line_id => p_action_set_line_rec.action_set_line_id
529 , p_object_id => l_object_id
530 , p_action_code => p_action_set_line_rec.action_code
531 , p_action_status_code => p_action_set_line_rec.status_code
532 , p_project_id => l_project_id
533 , x_return_status => l_return_status
534 );
535
536 END IF;
537
538 --
539 -- Set the Result Code to be returned to generic API
540 --
541 IF p_action_set_line_rec.status_code = 'PENDING' THEN
542
543 x_action_line_result_code := pa_action_set_utils.G_PERFORMED_COMPLETE;
544
545 ELSIF p_action_set_line_rec.status_code = 'REVERSE_PENDING' THEN
546
547 IF p_action_set_line_rec.action_code = 'ADVERTISEMENT_REMOVE_ADV' OR
548 p_action_set_line_rec.action_code = 'ADVERTISEMENT_UPDATE_SP' THEN
549 x_action_line_result_code := pa_action_set_utils.G_REVERSED_CUSTOM_AUDIT;
550 ELSIF (p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_EMAIL' OR
551 p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_PERSON' OR
552 p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_ROLE')
553 AND l_return_status = FND_API.G_RET_STS_ERROR THEN
554 x_action_line_result_code := pa_action_set_utils.G_REVERSED_CUSTOM_AUDIT;
555 ELSE
556 x_action_line_result_code := pa_action_set_utils.G_REVERSED_DEFAULT_AUDIT;
557 END IF;
558
559 ELSE -- update pending
560
561 IF p_action_set_line_rec.action_code = 'ADVERTISEMENT_REMOVE_ADV' OR
562 p_action_set_line_rec.action_code = 'ADVERTISEMENT_UPDATE_SP' THEN
563 x_action_line_result_code := pa_action_set_utils.G_UPDATED_CUSTOM_AUDIT;
564 ELSIF (p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_EMAIL' OR
565 p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_PERSON' OR
566 p_action_set_line_rec.action_code = 'ADVERTISEMENT_SEND_NTF_ROLE')
567 AND l_return_status = FND_API.G_RET_STS_ERROR THEN
568 x_action_line_result_code := pa_action_set_utils.G_UPDATED_CUSTOM_AUDIT;
569 ELSE
570 x_action_line_result_code := pa_action_set_utils.G_UPDATED_DEFAULT_AUDIT;
571 END IF;
572
573 END IF; -- action line status
574
575 ELSE -- condition met
576 x_action_line_result_code := pa_action_set_utils.G_NOT_PERFORMED;
577 END IF;
578
579 x_action_line_audit_tbl := g_action_line_audit_tbl;
580
581 --dbms_output.put_line('result code = '||x_action_line_result_code);
582
583 -- Reset the error stack when returning to the calling program
584 PA_DEBUG.Reset_Err_Stack;
585
586 EXCEPTION
587 WHEN OTHERS THEN
588
589 -- Set the excetption Message and the stack
590 FND_MSG_PUB.add_exc_msg ( p_pkg_name => 'PA_ADVERTISEMENTS_PUB.Perform_Adv_Action_Set'
591 ,p_procedure_name => PA_DEBUG.G_Err_Stack );
592
593 x_action_line_result_code := pa_action_set_utils.G_NOT_PERFORMED;
594 RAISE; -- This is optional depending on the needs
595
596 END Perform_Action_Set_Line;
597
598
599 ----------------------------------------------------------------------
600 -- Procedure
601 -- Reevaluate Advertisement Action Set
602 --
603 -- Purpose
604 -- Re-evaluate the advertisement action lines on the requirement by
605 -- updating the statuses of the action lines based on the
606 -- condition and the new requirement start date.
607 ----------------------------------------------------------------------
608 PROCEDURE Reevaluate_Adv_Action_Set (
609 p_object_id IN pa_action_sets.object_id%TYPE
610 , p_object_type IN pa_action_sets.object_type%TYPE
611 , p_new_object_start_date IN DATE
612 , p_validate_only IN VARCHAR2 := FND_API.G_TRUE
613 , p_api_version IN NUMBER := 1.0
614 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
615 , p_commit IN VARCHAR2 := FND_API.G_FALSE
616 , x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
617 ) IS
618
619 l_return_status VARCHAR2(1);
620 l_msg_count NUMBER;
621 l_msg_data VARCHAR2(2000);
622 l_project_id pa_project_assignments.project_id%TYPE;
623 l_start_date pa_project_assignments.start_date%TYPE;
624 l_adv_action_set_status_code pa_action_sets.status_code%TYPE;
625 l_adv_action_set_start_date pa_action_sets.actual_start_date%TYPE;
626 l_action_set_id pa_action_sets.action_set_id%TYPE;
627 l_action_set_line_id_tbl pa_action_set_utils.number_tbl_type;
628 l_action_status_code_tbl pa_action_set_utils.varchar_tbl_type;
629 l_condition_date_tbl pa_action_set_utils.date_tbl_type;
630 l_action_line_cond_id_tbl pa_action_set_utils.number_tbl_type;
631 l_action_set_template_flag VARCHAR2(1);
632 l_msg_index_out NUMBER;
633
634 --cursor to get the related details of the requirement
635 CURSOR get_req_action_set_info IS
636 SELECT pa.project_id,
637 pa.start_date,
638 ast.status_code,
639 ast.actual_start_date,
640 ast.action_set_id,
641 ast.action_set_template_flag
642 FROM pa_project_assignments pa,
643 pa_action_sets ast
644 WHERE pa.assignment_id = p_object_id
645 AND ast.object_id = p_object_id
646 AND ast.object_type = p_object_type
647 AND ast.action_set_type_code = 'ADVERTISEMENT'
648 AND ast.status_code <> 'DELETED';
649
650 BEGIN
651
652 IF P_DEBUG_MODE = 'Y' THEN /* Added Debug Profile Option Check for bug#2674619 */
653 PA_DEBUG.WRITE_LOG(x_Module => 'pa.plsql.PA_ADVERTISEMENTS_PUB.Reevaluate_Adv_Action_Set.begin',x_Msg => 'in PA_ADVERTISEMENTS_PUB.Reevaluate_Adv_Action_Set', x_Log_Level => 6);
654 END IF;
655
656 --initialize the return status.
657 x_return_status := FND_API.G_RET_STS_SUCCESS;
658
659 -- Initialise the error stack
660 PA_DEBUG.init_err_stack('PA_ADVERTISEMENTS_PUB.Reevaluate_Adv_Action_Set');
661
662 --get the related details of the requirement
663 OPEN get_req_action_set_info;
664 FETCH get_req_action_set_info INTO
665 l_project_id,
666 l_start_date,
667 l_adv_action_set_status_code,
668 l_adv_action_set_start_date,
669 l_action_set_id,
670 l_action_set_template_flag;
671 CLOSE get_req_action_set_info;
672
673 --get the action lines on the requirement if the advertisement
674 --action set has started and is not closed
675 IF (l_adv_action_set_status_code <> 'NOT_STARTED'
676 AND l_adv_action_set_status_code <> 'CLOSED')
677 AND l_adv_action_set_start_date IS NOT NULL THEN
678
679 -- re-order the action lines and generate the new condition dates
680 PA_ADVERTISEMENTS_PVT.Order_Adv_Action_Lines (
681 p_action_set_id => l_action_set_id
682 , p_action_set_template_flag => l_action_Set_template_flag
683 , p_object_start_date => p_new_object_start_date
684 , p_action_set_status_code => l_adv_action_set_status_code
685 , p_action_set_actual_start_date => l_adv_action_set_start_date
686 , x_return_status => l_return_status
687 );
688 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
689 x_return_status := FND_API.G_RET_STS_ERROR;
690 END IF;
691
692 -- get all completed action lines whose conditions are no longer met
693 SELECT asl.action_set_line_id, 'UPDATE_PENDING', aslc.condition_date, aslc.action_set_line_condition_id
694 BULK COLLECT INTO l_action_set_line_id_tbl, l_action_status_code_tbl, l_condition_date_tbl, l_action_line_cond_id_tbl
695 FROM pa_action_set_lines asl,
696 pa_action_set_line_cond aslc
697 WHERE asl.action_set_id = l_action_set_id
698 AND asl.status_code = 'COMPLETE'
699 AND asl.action_set_line_id = aslc.action_set_line_id
700 AND aslc.condition_date > SYSDATE;
701
702 -- bulk udpate advertisement action line status and condition date
703 PA_ACTION_SETS_PVT.Bulk_Update_Line_Status(
704 p_action_set_line_id_tbl => l_action_set_line_id_tbl
705 ,p_line_status_tbl => l_action_status_code_tbl
706 ,x_return_status => l_return_status
707 );
708 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
709 x_return_status := FND_API.G_RET_STS_ERROR;
710 END IF;
711
712 PA_ACTION_SETS_PVT.Bulk_Update_Condition_Date(
713 p_action_line_condition_id_tbl => l_action_line_cond_id_tbl
714 ,p_condition_date_tbl => l_condition_date_tbl
715 ,x_return_status => l_return_status
716 );
717 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
718 x_return_status := FND_API.G_RET_STS_ERROR;
719 END IF;
720
721 -- reset the plsql tables
722 l_action_set_line_id_tbl.DELETE;
723 l_action_status_code_tbl.DELETE;
724 l_condition_date_tbl.DELETE;
725 l_action_line_cond_id_tbl.DELETE;
726
727 -- Bug 2450716: PJ.J:B1:AVT: SHIFTING DURATION IS FIRING
728 -- THE WRONG ADVT. ACTION LINE
729 -- Bulk update the line status and condition date for lines that
730 -- were reversed due to Cancel Advertisement and the condition
731 -- is no longer met
732 -- These lines will be in REVERSED status with deleted_flag <> 'Y'
733 SELECT asl.action_set_line_id, 'PENDING', aslc.condition_date, aslc.action_set_line_condition_id
734 BULK COLLECT INTO l_action_set_line_id_tbl, l_action_status_code_tbl, l_condition_date_tbl, l_action_line_cond_id_tbl
735 FROM pa_action_set_lines asl,
736 pa_action_set_line_cond aslc
737 WHERE asl.action_set_id = l_action_set_id
738 AND asl.status_code = 'REVERSED'
739 AND nvl(asl.line_deleted_flag, 'N') = 'N'
740 AND asl.action_set_line_id = aslc.action_set_line_id
741 AND aslc.condition_date > SYSDATE;
742
743 PA_ACTION_SETS_PVT.Bulk_Update_Line_Status(
744 p_action_set_line_id_tbl => l_action_set_line_id_tbl
745 ,p_line_status_tbl => l_action_status_code_tbl
746 ,x_return_status => l_return_status
747 );
748 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
749 x_return_status := FND_API.G_RET_STS_ERROR;
750 END IF;
751
752 PA_ACTION_SETS_PVT.Bulk_Update_Condition_Date(
753 p_action_line_condition_id_tbl => l_action_line_cond_id_tbl
754 ,p_condition_date_tbl => l_condition_date_tbl
755 ,x_return_status => l_return_status
756 );
757 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
758 x_return_status := FND_API.G_RET_STS_ERROR;
759 END IF;
760
761 -- call generic action set API to perform the action set again
762 PA_ACTION_SETS_PUB.Perform_Single_Action_Set(
763 p_action_set_id => l_action_set_id
764 ,p_action_set_type_code => 'ADVERTISEMENT'
765 ,p_object_id => p_object_id
766 ,p_object_type => 'OPEN_ASSIGNMENT'
767 ,p_validate_only => p_validate_only
768 ,p_commit => p_commit
769 ,p_init_msg_list => FND_API.G_FALSE
770 ,x_return_status => l_return_status
771 ,x_msg_count => l_msg_count
772 ,x_msg_data => l_msg_data);
773 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
774 x_return_status := FND_API.G_RET_STS_ERROR;
775 END IF;
776
777 END IF;
778
779 -- Reset the error stack when returning to the calling program
780 PA_DEBUG.Reset_Err_Stack;
781
782 -- If there are any messages in the stack then set x_return_status
783
784 IF FND_MSG_PUB.Count_Msg > 0 THEN
785
786 x_return_status := FND_API.G_RET_STS_ERROR;
787
788 END IF;
789
790 -- Put any message text from message stack into the Message ARRAY
791 EXCEPTION
792 WHEN OTHERS THEN
793
794 -- Set the excetption Message and the stack
795 FND_MSG_PUB.add_exc_msg ( p_pkg_name => 'PA_ADVERTISEMENTS_PUB.Reevaluate_Adv_Action_Set'
796 ,p_procedure_name => PA_DEBUG.G_Err_Stack );
797 --
798 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
799 RAISE; -- This is optional depending on the needs
800
801 END Reevaluate_Adv_Action_Set;
802
803
804 ----------------------------------------------------------------------
805 -- Function
806 -- Is Action Set Started On Apply
807 --
808 -- Purpose
809 -- Check if the action set should be started upon application.
810 ----------------------------------------------------------------------
811 FUNCTION Is_Action_Set_Started_On_Apply(
812 p_action_set_type_code IN pa_action_sets.action_set_type_code%TYPE
813 ,p_object_type IN pa_action_sets.object_type%TYPE
814 ,p_object_id IN pa_action_sets.object_id%TYPE
815 ) RETURN VARCHAR2 IS
816
817 l_action_set_start_flag VARCHAR2(1);
818
819 BEGIN
820
821 pa_debug.init_err_stack ('PA_ADVERTISEMENTS_PUB.Is_Action_Set_Started_On_Apply');
822
823
824 IF PA_ADVERTISEMENTS_PUB.g_start_adv_action_set_flag IS NOT NULL THEN
825 l_action_set_start_flag := PA_ADVERTISEMENTS_PUB.g_start_adv_action_set_flag;
826 ELSE
827
828 SELECT proj.start_adv_action_set_flag
829 INTO l_action_set_start_flag
830 FROM pa_project_assignments asgn,
831 pa_projects_all proj
832 WHERE asgn.assignment_id = p_object_id
833 AND asgn.project_id = proj.project_id;
834
835 END IF;
836
837 PA_ADVERTISEMENTS_PUB.g_start_adv_action_set_flag := NULL;
838
839 RETURN l_action_set_start_flag;
840
841 EXCEPTION
842 WHEN NO_DATA_FOUND THEN
843 RETURN 'N';
844 WHEN OTHERS THEN
845 RETURN 'N';
846 END Is_Action_Set_Started_On_Apply;
847
848 END PA_ADVERTISEMENTS_PUB;