DBA Data[Home] [Help]
Skip to content

PACKAGE BODY: APPS.OTA_EVT_API_UPD2

Source


1 Package Body ota_evt_api_upd2 as
2 /* $Header: otevt02t.pkb 120.7.12020000.4 2013/02/11 04:52:08 jaysridh ship $ */
3 --
4 -- Package Variables
5 --
6 g_package  varchar2(33) := 'ota_evt_api_upd2.';
7 --
8 -- ----------------------------------------------------------------------------
9 -- |--------------------------< Check Status Change >-------------------------|
10 -- ----------------------------------------------------------------------------
11 --
12 -- PRIVATE
13 -- Description: Check the delegate booking Status when Updating.
14 --
15 --
16 procedure Check_Status_Change(p_event_id in number
17 			     ,p_event_status in out nocopy varchar2
18 			     ,p_booking_status_type_id in number
19 			     ,p_maximum_attendees in number) is
20 --
21 -- Bug 3493695
22    CURSOR c_attended_enr IS
23    SELECT null
24      FROM ota_delegate_bookings odb
25     WHERE event_id = p_event_id AND
26           booking_status_type_id IN
27           (SELECT booking_status_type_id
28              FROM ota_booking_status_types
29             WHERE type = 'A');
30 
31   l_att_enr_exists              VARCHAR2(1);
32 -- Bug 3493695
33   l_booking_status varchar2(30) := ota_tdb_bus.booking_status_type(
34 					p_booking_status_type_id);
35   l_event_rec			ota_evt_shd.g_rec_type;
36   l_event_exists		boolean;
37   l_total_places		number;
38 
39 --
40   l_proc 	varchar2(72) := g_package||'check_status_change';
41 --
42 begin
43   --
44   hr_utility.set_location('Entering:'||l_proc, 5);
45   --
46   -- Get Event Record
47   --
48     ota_evt_shd.get_event_details (p_event_id,
49                                  l_event_rec,
50                                  l_event_exists);
51   --
52   -- Check event status change for No change.
53   --
54   if l_event_rec.event_status = p_event_status then
55      fnd_message.set_name('OTA','OTA_13537_EVT_SAME_STATUS');
56      fnd_message.raise_error;
57   end if;
58   --
59   -- Check event status change for Full Events.
60   --
61   if p_event_status = 'F' then
62      fnd_message.set_name('OTA','OTA_13515_EVT_STATUS_F');
63      fnd_message.raise_error;
64   end if;
65   --
66   -- Cannot set a full event to Normal via change status.
67   --
68   if p_event_status = 'N'and l_event_rec.event_status = 'F' then
69      fnd_message.set_name('OTA','OTA_13556_EVT_NORMAL_STATUS');
70      fnd_message.raise_error;
71   end if;
72   --
73   -- Check enrollment status change for Planned Events.
74   --
75   if p_event_status in ('P') and l_booking_status not in ('W') then
76      fnd_message.set_name('OTA','OTA_13516_EVT_STATUS_P');
77      fnd_message.raise_error;
78   end if;
79   --
80   -- Check enrollment status change for Cancelled or Closed Events.
81   --
82   if p_event_status in ('A','C') and l_booking_status not in ('C') then
83      fnd_message.set_name('OTA','OTA_13517_EVT_STATUS_AC');
84      fnd_message.raise_error;
85   end if;
86 
87   --Bug 3493695
88   -- Check if there are any attended enrollments for a class being cancelled
89   IF p_event_status = 'A' THEN
90      OPEN c_attended_enr;
91     FETCH c_attended_enr INTO l_att_enr_exists;
92        IF c_attended_enr%FOUND THEN
93           CLOSE c_attended_enr;
94           fnd_message.set_name('OTA','OTA_13067_EVT_ATT_ENR_EXISTS');
95           fnd_message.raise_error;
96       END IF;
97     CLOSE c_attended_enr;
98   END IF;
99   -- Bug 3493695
100 
101   --
102   -- If Status Changed to Normal and Max Attendees = total Places taken
103   -- Then reset the Event Status to Full.  Would only apply if changing
104   -- Event Status from Closed to Normal.
105   --
106      if p_event_status in ('N') and p_maximum_attendees is not null then
107        l_total_places := ota_evt_bus2.get_total_places('ALL',p_event_id);
108        if l_total_places = p_maximum_attendees then
109          p_event_status := 'F';
110        end if;
111      end if;
112   --
113   --
114   hr_utility.set_location('Leaving:'||l_proc, 10);
115   --
116 end Check_Status_Change;
117 --
118 --
119 -- ----------------------------------------------------------------------------
120 -- |--------------------------< Check Maximum Attendees >---------------------|
121 -- ----------------------------------------------------------------------------
122 --
123 -- PRIVATE
124 -- Description: Check maximum attendees is not null and resent the event status
125 --              accordingly.
126 --
127 --
128 procedure Check_Maximum_Attendees(p_maximum_attendees in number,
129 				  p_event_status in out nocopy varchar2,
130 				  p_old_max_attendees in number,
131 				  p_event_id in number) is
132 --
133   l_total_places number;
134   l_proc 	 varchar2(72) := g_package||'check_maximum_attendees';
135 
136 
137   l_no_of_waitlist_candidate number;
138 
139 cursor  c_check_waitlist_candidates is
140 select  count(*)
141 from    ota_delegate_bookings odb
142 where   event_id = p_event_id and
143         booking_status_type_id in
144         (select booking_status_type_id
145          from   ota_booking_status_types
146          where  type = 'W');
147 
148 --
149 begin
150   --
151   hr_utility.set_location('Entering:'||l_proc, 5);
152   --
153   --
154     if p_maximum_attendees is null then
155      --Bug 6640334/6705591:Admin should be able to nullify the maximum attendees set previously.
156           --As maximum attendees is set to null,the class status is changed to Normal,if it was Full previously.
157           /*fnd_message.set_name('OTA','OTA_13553_MAND_MAX_ATTENDEES');
158           fnd_message.raise_error;*/
159           if p_event_status = 'F' then
160              p_event_status := 'N';
161           end if;
162     else
163 
164      if p_event_status in ('F','N') then
165       l_total_places := ota_evt_bus2.get_total_places('ALL',p_event_id);
166       if (p_maximum_attendees > p_old_max_attendees) and (l_total_places < p_maximum_attendees)
167         and (p_event_status = 'F') then
168 
169 -- *** Check if total places > max attendees + wait list then change the status to 'N' else 'F'
170 
171          open  c_check_waitlist_candidates;
172          fetch c_check_waitlist_candidates into l_no_of_waitlist_candidate;
173          if c_check_waitlist_candidates%notfound then
174 	        l_no_of_waitlist_candidate := 0;
175 	    end if;
176          close c_check_waitlist_candidates;
177 /* Start Bug 1712445 */
178          if  p_maximum_attendees  <= l_total_places + l_no_of_waitlist_candidate then
179            if ota_evt_shd.g_old_rec.maximum_internal_attendees is null then
180 	        	p_event_status := 'F';
181             else
182                p_event_status := 'N';
183 
184             end if;
185          else
186 	     	p_event_status := 'N';
187          end if;
188 /* End of Bug 1712445 */
189 -- ***
190        elsif (p_maximum_attendees = l_total_places) and (p_event_status = 'N') then
191         p_event_status := 'F';
192       end if;
193      end if;
194     end if;
195   --
196   hr_utility.set_location('Leaving:'||l_proc, 10);
197   --
198 end Check_Maximum_Attendees;
199 --
200 --
201 -- ----------------------------------------------------------------------------
202 -- |--------------------------< Process Event Change >------------------------|
203 -- ----------------------------------------------------------------------------
204 --
205 -- PRIVATE
206 -- Description: Update enrollments for the given Event.
207 --		The process will include the updating of the booking status, finance
208 --		lines of enrollments for the given Event.
209 --
210 procedure Process_Event_Change(p_event_id in number
211 			      ,p_event_status in varchar2
212 			      ,p_update_finance_line in varchar2 default 'N'
213 			      ,p_booking_status_type_id in varchar2 default null
214 			      ,p_date_status_changed in date)  is
215 
216 l_daemon_flag varchar2(1);
217 l_daemon_type varchar2(1);
218 l_booking_status varchar2(1);
219 --
220 --
221 cursor  c_get_event_enrollments is
222 select  tdb.booking_id, tdb.object_version_number, fl.object_version_number tfl_object_version_number,
223          fl.finance_line_id,
224         date_booking_placed, line_id,org_id,daemon_flag,daemon_type, tdb.booking_status_type_id,
225 	tdb.delegate_person_id
226 from    ota_delegate_bookings tdb
227 ,	ota_booking_status_types bst
228 ,     ota_finance_lines fl
229 where	tdb.event_id = p_event_id
230 and	tdb.booking_status_type_id = bst.booking_status_type_id
231 and   fl.booking_id(+) = tdb.booking_id
232 and	(((p_event_status = 'P') and (bst.type not in ('C','W')))
233 or	((p_event_status = 'C') and (bst.type in ('R')))
234 or	((p_event_status = 'A') and (bst.type <> 'C')));  -- Added check for "bst.type <> 'C'" for bug #2065808
235 
236 CURSOR c_get_booking_status(p_booking_status_type_id in number) is
237 select type
238 from ota_booking_status_types
239 where booking_status_type_id = p_booking_status_type_id;
240 
241 
242 --
243 l_status_change_comments varchar(1000) := fnd_message.get_string('OTA','OTA_13523_TDB_STATUS_COMMENTS');
244 l_proc 	varchar2(72) := g_package||'process_event_change';
245 --
246 begin
247   --
248     hr_utility.set_location('Entering:'|| l_proc, 5);
249   --
250     FOR c_get_enrollment in c_get_event_enrollments LOOP
251   --
252   --
253    /* For bug 1763422 */
254        l_booking_status  := null;
255        l_daemon_type := null;
256 	 l_daemon_flag := null;
257 
258     if p_event_status = 'A' or p_event_status = 'C' then
259        if  c_get_enrollment.daemon_flag is null  then
260            For enr_status in c_get_booking_status(c_get_enrollment.booking_status_type_id)
261            Loop
262              l_booking_status  := enr_status.type;
263            end loop;
264            if l_booking_status <> 'C' then
265               l_daemon_type :='W';
266               l_daemon_flag := 'Y';
267            else
268               l_daemon_type := null;
269 		  l_daemon_flag := null;
270            end if;
271        else
272            l_daemon_type := c_get_enrollment.daemon_type ;
273            l_daemon_flag := c_get_enrollment.daemon_flag ;
274        end if;
275     end if;
276      /*  End For bug 1763422 */
277        ota_tdb_api_upd2.update_enrollment(p_booking_id		=> c_get_enrollment.booking_id
278 		      ,p_object_version_number	=> c_get_enrollment.object_version_number
279 		      ,p_finance_line_id	=> c_get_enrollment.finance_line_id
280 		      ,p_event_id       	=> p_event_id
281 		      ,p_booking_status_type_id	=> p_booking_status_type_id
282 		      ,p_status_change_comments => l_status_change_comments
283 		      ,p_date_booking_placed    => c_get_enrollment.date_booking_placed
284 		      ,p_update_finance_line	=> p_update_finance_line
285 		      ,p_tfl_object_version_number => c_get_enrollment.tfl_object_version_number
286 		      ,p_date_status_changed	=> p_date_status_changed
287                   ,p_line_id              => c_get_enrollment.line_id
288                   ,p_org_id			=> c_get_enrollment.org_id
289 		      ,p_daemon_flag		=> l_daemon_flag
290 		      ,p_daemon_type          => l_daemon_type);
291 
292 	if p_event_status ='A' then
293               --send notification to the learner for class cancelletion
294    OTA_INITIALIZATION_WF.initialize_wf(p_process => 'OTA_CLASS_CANCEL_JSP_PRC',
295             p_item_type 	=> 'OTWF',
299 
296             p_person_id 	=> c_get_enrollment.delegate_person_id,
297             p_eventid 	=> p_event_id,
298             p_event_fired => 'CLASS_CANCEL');
300     end if;
301   --
302     END LOOP get_enrollment;
303   --
304     hr_utility.set_location('Leaving:'|| l_proc, 10);
305   --
306 --
307 end Process_Event_Change;
308 --
309 --
310 -- ----------------------------------------------------------------------------
311 -- |--------------------------< Reset Max Attendees >-------------------------|
312 -- ----------------------------------------------------------------------------
313 --
314 -- PRIVATE
315 -- Description: Reset Maximum_Attendees and Maximum_Internal_Attendees columns.
316 --
317 --
318 procedure Reset_Max_Attendees (p_event_id in number
319 			     ,p_event_status in varchar2
320 			     ,p_reset_max_attendees in boolean default false
321 			     ,p_maximum_attendees in out nocopy number
322 			     ,p_maximum_internal_attendees in out nocopy number) is
323 --
324 l_total_places number;
325 l_total_internal_places number;
326 --
327   l_proc 	varchar2(72) := g_package||'reset_max_attendees';
328 --
329 begin
330   --
331     hr_utility.set_location('Entering:'|| l_proc, 5);
332   --
333   -- If reset_max_attendees selected then only fire When new event Status is
334   -- Closed.
335   --
336   if p_event_status in ('C') then
337     if p_reset_max_attendees then
338       l_total_places := ota_evt_bus2.get_total_places('ALL',p_event_id);
339       l_total_internal_places := ota_evt_bus2.get_total_places('INTERNAL',p_event_id);
340       if p_maximum_internal_attendees > l_total_places then
341         p_maximum_internal_attendees := l_total_places;
342         p_maximum_attendees := l_total_places;
343       else
344  	 p_maximum_attendees := l_total_places;
345       end if;
346     end if;
347   end if;
348   --
349     hr_utility.set_location('Leaving:'|| l_proc, 10);
350   --
351 end Reset_Max_Attendees;
352 --
353 --
354 -- ----------------------------------------------------------------------------
355 -- |--------------------------< Update Event >--------------------------------|
356 -- ----------------------------------------------------------------------------
357 --
358 -- PUBLIC
359 -- Description: Updates an Event.  May also cascade changes to enrollments for
360 --		the given Event.
361 --
362 procedure update_event
363   (
364   p_event			 in varchar2,
365   p_event_id                     in number,
366   p_object_version_number        in out nocopy number,
367   p_event_status                 in out nocopy varchar2,
368   p_validate                     in boolean default false,
369   p_reset_max_attendees		 in boolean default false,
370   p_update_finance_line		 in varchar2 default 'N',
371   p_booking_status_type_id	 in number default null,
372   p_date_status_changed 	 in date default null,
373   p_maximum_attendees		 in number default null) is
374 --
375   l_event_rec			ota_evt_shd.g_rec_type;
376   l_event_rec_ovn               ota_evt_shd.g_rec_type;
377   l_event_exists		boolean;
378   l_event_exists_ovn            boolean;
379   l_event_status		varchar2(30);
380 --
381   l_proc 	varchar2(72) := g_package||'update_event';
382 --
383   begin
384   --
385     hr_utility.set_location('Entering:'|| l_proc, 5);
386   --
387   -- Issue a savepoint if operating in validation only mode.
388   --
389     if p_validate then
390       savepoint update_enrollment;
391     end if;
392   --
393     hr_utility.set_location(l_proc, 6);
394   --
395   -- Validation in addition to Table Handlers.
396   -- Lock Event
397   --
398     ota_evt_shd.lck(p_event_id, p_object_version_number);
399   --
400   -- Get Event record.
401   --
402     ota_evt_shd.get_event_details (p_event_id,
403                                  l_event_rec,
404                                  l_event_exists);
405   --
406   if p_event = 'STATUS' then
407   --
408   -- Check validation of status change.
409   --
410     Check_Status_Change(p_event_id => p_event_id
411  		       ,p_event_status => p_event_status
412 		       ,p_booking_status_type_id => p_booking_status_type_id
413 		       ,p_maximum_attendees => l_event_rec.maximum_attendees);
414   --
415   --
416     hr_utility.set_location(l_proc, 7);
417   --
418   -- Process Event Status change.
419   --
420     Process_Event_Change(p_event_id => p_event_id
421 		        ,p_event_status => p_event_status
422 		        ,p_update_finance_line => p_update_finance_line
423 		        ,p_booking_status_type_id => p_booking_status_type_id
424 		      	,p_date_status_changed => p_date_status_changed);
425 
426   --
427     hr_utility.set_location(l_proc, 8);
428   --
429   -- Reset Max Attendees and Max Internal Attendees.  Only when Closed Event
430   -- Status is selected.
431   --
432     if p_event_status in ('C') then
433       Reset_Max_Attendees (p_event_id => p_event_id
434   		        ,p_event_status => p_event_status
435 		        ,p_reset_max_attendees => p_reset_max_attendees
436 		        ,p_maximum_attendees => l_event_rec.maximum_attendees
437 		        ,p_maximum_internal_attendees => l_event_rec.maximum_internal_attendees);
438     end if;
439   --
440     hr_utility.set_location(l_proc, 9);
441   --
442   --
443   --
444   else
445     Check_Maximum_Attendees(p_maximum_Attendees => p_maximum_attendees,
446 			    p_event_status => p_event_status,
450   end if;
447 			    p_old_max_attendees => l_event_rec.maximum_attendees,
448 			    p_event_id => p_event_id);
449     l_event_rec.maximum_attendees := p_maximum_attendees;
451 
452   -- Bug 463742.
453   -- Requery event record, as object version number
454   -- may have changed.
455 
456   ota_evt_shd.get_event_details(p_event_id,
457 				l_event_rec_ovn,
458 				l_event_exists_ovn);
459 
460   -- Force Event update
461   --
462 /* Bug#9300792
463     ota_evt_upd.upd
464       (p_event_id => p_event_id
465       ,p_object_version_number => l_event_rec_ovn.object_version_number
466       ,p_event_status => p_event_status
467       ,p_maximum_attendees => l_event_rec.maximum_attendees
468       ,p_maximum_internal_attendees => l_event_rec.maximum_internal_attendees
469       ,p_validate => p_validate);
470 */
471   /* Bug 14148006 */
472    ota_event_api.update_class
473       (p_event_id => p_event_id
474 			,p_effective_date => sysdate
475 			,p_object_version_number => l_event_rec_ovn.object_version_number
476 			,p_event_status                 =>  p_event_status
477 			,p_maximum_attendees => l_event_rec.maximum_attendees
478 			,p_maximum_internal_attendees => l_event_rec.maximum_internal_attendees
479 			,p_validate => p_validate
480 			,p_vendor_id                    => l_event_rec.vendor_id
481 			,p_activity_version_id          => l_event_rec.activity_version_id
482 			,p_business_group_id            => l_event_rec.business_group_id
483 			,p_organization_id              => l_event_rec.organization_id
484 			,p_event_type                   => l_event_rec.event_type
485 			,p_title                        => l_event_rec.title
486 			,p_budget_cost                  => l_event_rec.budget_cost
487 			,p_actual_cost                  => l_event_rec.actual_cost
488 			,p_budget_currency_code         => l_event_rec.budget_currency_code
489 			,p_centre                       => l_event_rec.centre
490 			,p_comments                     => l_event_rec.comments
491 			,p_course_end_date              => l_event_rec.course_end_date
492 			,p_course_end_time              => l_event_rec.course_end_time
493 			,p_course_start_date            => l_event_rec.course_start_date
494 			,p_course_start_time            => l_event_rec.course_start_time
495 			,p_duration                     => l_event_rec.duration
496 			,p_duration_units               => l_event_rec.duration_units
497 			,p_enrolment_end_date           => l_event_rec.enrolment_end_date
498 			,p_enrolment_start_date         => l_event_rec.enrolment_start_date
499 			,p_language_id                  => l_event_rec.language_id
500 			,p_user_status                  => l_event_rec.user_status
501 			,p_development_event_type       => l_event_rec.development_event_type
502 			,p_price_basis                  => l_event_rec.price_basis
503 			,p_currency_code                => l_event_rec.currency_code
504 			,p_minimum_attendees            => l_event_rec.minimum_attendees
505 			,p_standard_price               => l_event_rec.standard_price
506 			,p_category_code                => l_event_rec.category_code
507 			,p_parent_event_id              => l_event_rec.parent_event_id
508 			,p_book_independent_flag        => l_event_rec.book_independent_flag
509 			,p_public_event_flag            => l_event_rec.public_event_flag
510 			,p_secure_event_flag            => l_event_rec.secure_event_flag
511 			,p_evt_information_category     => l_event_rec.evt_information_category
512 			,p_evt_information1             => l_event_rec.evt_information1
513 			,p_evt_information2             => l_event_rec.evt_information2
514 			,p_evt_information3             => l_event_rec.evt_information3
515 			,p_evt_information4             => l_event_rec.evt_information4
516 			,p_evt_information5             => l_event_rec.evt_information5
517 			,p_evt_information6             => l_event_rec.evt_information6
518 			,p_evt_information7             => l_event_rec.evt_information7
519 			,p_evt_information8             => l_event_rec.evt_information8
520 			,p_evt_information9             => l_event_rec.evt_information9
521 			,p_evt_information10            => l_event_rec.evt_information10
522 			,p_evt_information11            => l_event_rec.evt_information11
523 			,p_evt_information12            => l_event_rec.evt_information12
524 			,p_evt_information13            => l_event_rec.evt_information13
525 			,p_evt_information14            => l_event_rec.evt_information14
526 			,p_evt_information15            => l_event_rec.evt_information15
527 			,p_evt_information16            => l_event_rec.evt_information16
528 			,p_evt_information17            => l_event_rec.evt_information17
529 			,p_evt_information18            => l_event_rec.evt_information18
530 			,p_evt_information19            => l_event_rec.evt_information19
531 			,p_evt_information20            => l_event_rec.evt_information20
532 			,p_project_id                   => l_event_rec.project_id
533 			,p_owner_id			                => l_event_rec.owner_id
534 			,p_line_id			                => l_event_rec.line_id
535 			,p_org_id		                    => l_event_rec.org_id
536 			,p_training_center_id           => l_event_rec.training_center_id
537 			,p_location_id 	                => l_event_rec.location_id
538 			,p_offering_id		              => l_event_rec.offering_id
539 			,p_timezone		                  => l_event_rec.timezone
540 			,p_parent_offering_id	          => l_event_rec.parent_offering_id
541 			,p_data_source		              => l_event_rec.data_source);
542 
543   --
544   -- Commit the Changes
545   --
546 -- Enh# 1753511 hdshah Commented out the commit so that we can use update_event procedure for this enhancement.
547 -- Included app_form.quietcommit in OTAEVENT.pll.
548 --    commit;
549   --
550     hr_utility.set_location('Leaving:'|| l_proc, 10);
551   --
552   -- When in validation only mode raise the Validate_Enabled exception
553   --
554     if p_validate then
555       raise hr_api.validate_enabled;
556     end if;
557 
558 -- call ntf to instructor and learners for cancelled class
559   if p_event_status = 'A' and p_event = 'STATUS' then
560     --send notification to all instructors for class cancelletion
561    OTA_INITIALIZATION_WF.initialize_instructor_wf(
562             p_item_type 	=> 'OTWF',
563             p_eventid 	=> p_event_id,
564             p_event_fired => 'CLASS_CANCEL');
565 
566   end if;
567 
568   --
569   exception
570     when hr_api.validate_enabled then
571     --
572     -- As the Validate_Enabled exception has been raised
573     -- we must rollback to the savepoint
574     --
575       ROLLBACK TO update_event;
576     --
577     -- Only set output warning arguments
578     -- (Any key or derived arguments must be set to null
579     -- when validation only mode is being used.)
580     --
581   end Update_Event;
582 --
583 end ota_evt_api_upd2;