DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_TR_GEN_002

Source


1 PACKAGE BODY igs_tr_gen_002 AS
2 /* $Header: IGSTR02B.pls 120.1 2006/05/18 03:15:58 prbhardw noship $ */
3   --msrinivi 27 Aug,2001 Bug 1956374. Pointed genp_al_prsn_id to igs_co_val_oc
4 
5   FUNCTION trkp_del_tri(
6     p_tracking_id IN NUMBER ,
7     p_message_name OUT NOCOPY VARCHAR2 )
8   RETURN BOOLEAN AS
9 
10   /*******************************************************************************
11   Created by  : Oracle IDC
12   Date created:
13 
14   Purpose:
15      1. Used for deletion of tracking step notes, deletion of
16         tracking steps, for tracking items, deletion of tracking group members for
17         IGS_TR_ITEMS, deletion of tracking item notes for IGS_TR_ITEMS and deletion of
18         IGS_TR_ITEMS
19 
20   Usage: (e.g. restricted, unrestricted, where to call from)
21      1. Called from IGSTR007.fmb
22 
23   Known limitations/enhancements/remarks:
24      -
25 
26   Change History: (who, when, what: NO CREATION RECORDS HERE!)
27   Who             When            What
28   *******************************************************************************/
29 
30    lv_param_values  VARCHAR2(1080);
31    gv_other_detail  VARCHAR2(255);
32 
33   BEGIN
34 
35     -- trkp_del_tri
36     -- Delete a tracking item.
37     DECLARE
38 
39       e_resource_busy  EXCEPTION;
40       PRAGMA EXCEPTION_INIT(e_resource_busy, -54);
41       v_message_name   VARCHAR2(30);
42 
43       ------------------------------------------------------------------------------
44       -- 1. Delete tracking_step_notes for the IGS_TR_ITEM.
45       ------------------------------------------------------------------------------
46 
47       FUNCTION trkpl_del_tsn (
48         lp_tracking_id igs_tr_item.tracking_id%TYPE)
49       RETURN BOOLEAN  AS
50 	lv_param_values  VARCHAR2(1080);
51       BEGIN
52 
53 	DECLARE
54 
55           CURSOR c_del_tsn IS
56             SELECT   ROWID,reference_number
57             FROM     igs_tr_step_note
58             WHERE    tracking_id = lp_tracking_id
59             FOR UPDATE OF tracking_id NOWAIT;
60 
61         BEGIN
62 
63           FOR v_tsn_rec IN c_del_tsn LOOP
64 
65 	    igs_tr_step_note_pkg.delete_row(x_rowid => v_tsn_rec.ROWID);
66             IF igs_ge_gen_001.genp_del_note( v_tsn_rec.reference_number, v_message_name) = FALSE THEN
67               p_message_name := v_message_name;
68               EXIT;
69             END IF;
70           END LOOP;
71 
72           IF (v_message_name <> NULL) THEN
73             RETURN FALSE;
74           END IF;
75 
76           RETURN TRUE;
77 
78         END;
79 
80         EXCEPTION
81 
82 	  WHEN e_resource_busy THEN
83             p_message_name := 'IGS_TR_ITEM_STEP_NOTE_LOCKED';
84             RETURN FALSE;
85 
86 	  WHEN OTHERS THEN
87             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
88             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_tsn'||'-'||SQLERRM);
89             igs_ge_msg_stack.ADD;
90             lv_param_values:= TO_CHAR(lp_tracking_id);
91             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
92             fnd_message.set_token('VALUE',lv_param_values);
93             igs_ge_msg_stack.ADD;
94             app_exception.raise_exception;
95 
96       END trkpl_del_tsn;
97 
98       ------------------------------------------------------------------------------
99       -- 2. Delete tracking_step for the IGS_TR_ITEM.
100       ------------------------------------------------------------------------------
101       FUNCTION trkpl_del_ts(
102         lp_tracking_id igs_tr_item.tracking_id%TYPE)
103       RETURN BOOLEAN AS
104 
105         lv_param_values  VARCHAR2(1080);
106 
107       BEGIN
108 
109 	DECLARE
110 
111 	  CURSOR  c_del_ts IS
112           SELECT  igs_tr_step.*,ROWID
113           FROM    igs_tr_step
114           WHERE   tracking_id = lp_tracking_id
115           FOR UPDATE OF tracking_id NOWAIT;
116 
117         BEGIN
118 
119           FOR v_ts_rec IN c_del_ts LOOP
120             igs_tr_step_pkg.delete_row( x_rowid => v_ts_rec.ROWID);
121           END LOOP;
122           RETURN TRUE;
123 
124         END;
125 
126         EXCEPTION
127       	WHEN e_resource_busy THEN
128           p_message_name := 'IGS_TR_STEP_RECORD_LOCKED';
129           RETURN FALSE;
130 
131 	WHEN OTHERS THEN
132           fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
133           fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_ts'||'-'||SQLERRM);
134           igs_ge_msg_stack.ADD;
135           lv_param_values:= TO_CHAR(lp_tracking_id);
136           fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
137           fnd_message.set_token('VALUE',lv_param_values);
138           igs_ge_msg_stack.ADD;
139           app_exception.raise_exception;
140 
141       END trkpl_del_ts;
142 
143       ------------------------------------------------------------------------------
144       -- 3. Delete tracking_group_member for the IGS_TR_ITEM.
145       ------------------------------------------------------------------------------
146       FUNCTION trkpl_del_tgm(
147         lp_tracking_id igs_tr_item.tracking_id%TYPE)
148       RETURN BOOLEAN AS
149         lv_param_values  VARCHAR2(1080);
150       BEGIN
151 
152 	DECLARE
153 
154           CURSOR c_del_tgm IS
155           SELECT ROWID,igs_tr_group_member.*
156           FROM   igs_tr_group_member
157           WHERE  tracking_id = p_tracking_id
158           FOR UPDATE OF tracking_id NOWAIT;
159 
160         BEGIN
161 
162           FOR v_tgm_rec IN c_del_tgm LOOP
163             igs_tr_group_member_pkg.delete_row( x_rowid => v_tgm_rec.ROWID);
164           END LOOP;
165 
166           RETURN TRUE;
167         END;
168 
169         EXCEPTION
170           WHEN e_resource_busy THEN
171             p_message_name := 'IGS_TR_GRP_RECORD_LOCKED';
172             RETURN FALSE;
173 
174 	  WHEN OTHERS THEN
175             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
176             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_tgm'||'-'||SQLERRM);
177             igs_ge_msg_stack.ADD;
178             lv_param_values:= TO_CHAR(lp_tracking_id);
179             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
180             fnd_message.set_token('VALUE',lv_param_values);
181             igs_ge_msg_stack.ADD;
182             app_exception.raise_exception;
183 
184       END trkpl_del_tgm;
185 
186       ------------------------------------------------------------------------------
187       -- 4. Delete tracking_item_notes for the IGS_TR_ITEM.
188       ------------------------------------------------------------------------------
189       FUNCTION trkpl_del_tin (
190         lp_tracking_id igs_tr_item.tracking_id%TYPE)
191       RETURN BOOLEAN AS
192         lv_param_values  VARCHAR2(1080);
193       BEGIN
194 
195 	DECLARE
196 
197 	  CURSOR c_del_tin IS
198           SELECT ROWID, reference_number
199           FROM igs_tr_item_note
200           WHERE tracking_id = lp_tracking_id
201           FOR UPDATE OF tracking_id NOWAIT;
202 
203         BEGIN
204 
205           FOR v_tin_rec IN c_del_tin LOOP
206             igs_tr_item_note_pkg.delete_row( x_rowid => v_tin_rec.ROWID);
207             IF igs_ge_gen_001.genp_del_note( v_tin_rec.reference_number, v_message_name) = FALSE THEN
208               p_message_name := v_message_name;
209               EXIT;
210             END IF;
211           END LOOP;
212 
213           IF (v_message_name <> NULL) THEN
214             RETURN FALSE;
215           END IF;
216 
217           RETURN TRUE;
218         END;
219 
220         EXCEPTION
221 
222 	  WHEN e_resource_busy THEN
223             p_message_name := 'IGS_TR_ITEM_NOTE_REC_LOCKED';
224             RETURN FALSE;
225 
226 	  WHEN OTHERS THEN
227             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
228             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_tin'||'-'||SQLERRM);
229             igs_ge_msg_stack.ADD;
230             lv_param_values:= TO_CHAR(lp_tracking_id);
231             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
232             fnd_message.set_token('VALUE',lv_param_values);
233             igs_ge_msg_stack.ADD;
234             app_exception.raise_exception;
235 
236       END trkpl_del_tin;
237 
238       ------------------------------------------------------------------------------
239       -- 5. Delete the IGS_TR_ITEM.
240       ------------------------------------------------------------------------------
241       FUNCTION trkpl_del_tri(
242         lp_tracking_id igs_tr_item.tracking_id%TYPE)
243       RETURN BOOLEAN AS
244         lv_param_values  VARCHAR2(1080);
245       BEGIN
246 
247 	DECLARE
248 
249 	  CURSOR  c_del_tri IS
250           SELECT  ROWID, igs_tr_item.*
251           FROM    igs_tr_item
252           WHERE   tracking_id = lp_tracking_id
253           FOR UPDATE OF tracking_id NOWAIT;
254 
255         BEGIN
256 
257 	  FOR v_tri_rec IN c_del_tri LOOP
258             igs_tr_item_pkg.delete_row( x_rowid => v_tri_rec.ROWID);
259           END LOOP;
260 
261           RETURN TRUE;
262         END;
263 
264         EXCEPTION
265 
266 	  WHEN e_resource_busy THEN
267             p_message_name := 'IGS_TR_ITEM_RECORD_LOCKED';
268             RETURN FALSE;
269 
270 	  WHEN OTHERS THEN
271             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
272             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_tri'||'-'||SQLERRM);
273             igs_ge_msg_stack.ADD;
274             lv_param_values:= TO_CHAR(lp_tracking_id);
275             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
276             fnd_message.set_token('VALUE',lv_param_values);
277             igs_ge_msg_stack.ADD;
278             app_exception.raise_exception;
279 
280       END trkpl_del_tri;
281 
282 
283       ------------------------------------------------------------------------------
284       -- 6. Delete step group limit from IGS_TR_STEP_GRP_LMT
285       -- Function added by pradhakr as part of CCR for Tracking in Applicant
286       -- Self Service Part 3.
287       ------------------------------------------------------------------------------
288       FUNCTION trkpl_del_grp_lmt(
289         lp_tracking_id igs_tr_step_grp_lmt.tracking_id%TYPE )
290       RETURN BOOLEAN AS
291         lv_param_values  VARCHAR2(1080);
292       BEGIN
293 
294 	DECLARE
295 
296 	  CURSOR  c_del_grp_lmt IS
297           SELECT  ROWID
298           FROM    igs_tr_step_grp_lmt
299           WHERE   tracking_id = lp_tracking_id
300           FOR UPDATE OF tracking_id NOWAIT;
301 
302         BEGIN
303 
304 	  FOR rec_del_grp_lmt IN c_del_grp_lmt LOOP
305             igs_tr_step_grp_lmt_pkg.delete_row( x_rowid => rec_del_grp_lmt.rowid);
306           END LOOP;
307 
308           RETURN TRUE;
309         END;
310 
311         EXCEPTION
312 
313 	  WHEN e_resource_busy THEN
314             p_message_name := 'IGS_TR_LIMIT_RECORD_LOCKED';
315             RETURN FALSE;
316 
317 	  WHEN OTHERS THEN
318             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
319             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_del_grp_lmt'||'-'||SQLERRM);
320             igs_ge_msg_stack.add;
321             lv_param_values:= TO_CHAR(lp_tracking_id);
322             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
323             fnd_message.set_token('VALUE',lv_param_values);
324             igs_ge_msg_stack.add;
325             app_exception.raise_exception;
326 
327       END trkpl_del_grp_lmt;    /* End of the procedure  */
328 
329     BEGIN
330 
331       SAVEPOINT sp_del_tri;
332       p_message_name := NULL;
333 
334       IF ( -- Delete tracking_step_note
335         trkpl_del_tsn(p_tracking_id) = FALSE OR
336         -- Delete tracking_step
337         trkpl_del_ts(p_tracking_id) = FALSE  OR
338         -- Deleting step group limit from IGS_TR_STEP_GRP_LMT
339         trkpl_del_grp_lmt(p_tracking_id) = FALSE OR
340         -- Delete tracking_group_member
341         trkpl_del_tgm(p_tracking_id) = FALSE  OR
342         -- Delete tracking_item_note
343         trkpl_del_tin(p_tracking_id) = FALSE  OR
344         -- Delete tracking_item
345         trkpl_del_tri(p_tracking_id) = FALSE) THEN
346 
347 	ROLLBACK TO sp_del_tri;
348         RETURN FALSE;
349       END IF;
350       RETURN TRUE;
351 
352     END;
353 
354     EXCEPTION
355       WHEN OTHERS THEN
356         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
357         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_del_tri'||'-'||SQLERRM);
358         igs_ge_msg_stack.ADD;
359         lv_param_values:= TO_CHAR(p_tracking_id);
360         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
361         fnd_message.set_token('VALUE',lv_param_values);
362         igs_ge_msg_stack.ADD;
363         app_exception.raise_exception;
364 
365   END trkp_del_tri;
366 
367 
368   FUNCTION trkp_get_group_sts(
369     p_tracking_group_id IN NUMBER )
370   RETURN VARCHAR2 IS
371 
372   /*******************************************************************************
373   Created by  : Oracle IDC
374   Date created:
375 
376   Purpose:
377      1. This function returns the status of a tracking group
378 
379   Usage: (e.g. restricted, unrestricted, where to call from)
380      1. Called from IGSTR007.FMB
381 
382   Known limitations/enhancements/remarks:
383      -
384   Change History: (who, when, what: NO CREATION RECORDS HERE!)
385   Who             When            What
386   *******************************************************************************/
387 
388     BEGIN
389 
390     -- return status of a tracking group
391     DECLARE
392 
393       v_other_detail  VARCHAR2(255);
394       v_tracking_id  igs_tr_item.tracking_id%TYPE;
395       v_s_tracking_status igs_tr_status.s_tracking_status%TYPE;
396       v_active_flag  BOOLEAN DEFAULT FALSE;
397       v_cancelled_cnt  NUMBER(3) DEFAULT 0;
398       v_row_cnt  NUMBER(3) DEFAULT 0;
399 
400       CURSOR c_tracking_group_member ( cp_tracking_group_id igs_tr_group.tracking_group_id%TYPE) IS
401         SELECT  tracking_id
402         FROM    igs_tr_group_member
403         WHERE   tracking_group_id = cp_tracking_group_id;
404 
405     BEGIN
406 
407       OPEN c_tracking_group_member(p_tracking_group_id);
408 
409       LOOP
410 
411 	FETCH c_tracking_group_member INTO v_tracking_id;
412         EXIT WHEN c_tracking_group_member%NOTFOUND;
413         v_s_tracking_status := trkp_get_item_status(v_tracking_id);
414         -- exit if any tracking item has a system status of ACTIVE
415 
416 	IF (v_s_tracking_status = 'ACTIVE') THEN
417           v_active_flag := TRUE;
418           EXIT;
419 
420 	ELSIF (v_s_tracking_status = 'CANCELLED') THEN
421           v_cancelled_cnt := v_cancelled_cnt + 1;
422         END IF;
423 
424       END LOOP;
425 
426       v_row_cnt := c_tracking_group_member%rowcount;
427       CLOSE c_tracking_group_member;
428 
429       -- no members exist in the group
430       IF (v_row_cnt = 0) THEN
431         RETURN NULL;
432       END IF;
433 
434       -- there exists tracking item has a system status of 'ACTIVE'
435       IF (v_active_flag = TRUE) THEN
436         RETURN 'ACTIVE';
437       END IF;
438 
439       -- all tracking items have system status of 'CANCELLED'
440       IF (v_row_cnt = v_cancelled_cnt) THEN
441         RETURN 'CANCELLED';
442       END IF;
443       -- tracking items have system status of both 'CANCELLED' and 'COMPLETE'
444       RETURN 'COMPLETE';
445     END;
446 
447   END trkp_get_group_sts;
448 
449   FUNCTION trkp_get_item_status(
450     p_tracking_id IN NUMBER )
451   RETURN VARCHAR2 IS
452 
453   /*******************************************************************************
454   Created by  : Oracle IDC
455   Date created:
456 
457   Purpose:
458      1. This function returns the status of a tracking item
459 
460   Usage: (e.g. restricted, unrestricted, where to call from)
461      1. Called from IGSTR007.FMB
462 
463   Known limitations/enhancements/remarks:
464      -
465 
466   Change History: (who, when, what: NO CREATION RECORDS HERE!)
467   Who             When            What
468   *******************************************************************************/
469 
470   BEGIN
471 
472     -- Returns the status of tracking item
473     DECLARE
474 
475       v_other_detail  VARCHAR2(255);
476       v_s_tracking_status igs_tr_status.s_tracking_status%TYPE;
477 
478       CURSOR c_get_s_tracking_status ( cp_tracking_id igs_tr_item.tracking_id%TYPE) IS
479         SELECT   s_tracking_status
480         FROM     igs_tr_item it, igs_tr_status ts
481         WHERE    it.tracking_id  = cp_tracking_id
482 	AND      it.tracking_status  = ts.tracking_status;
483 
484     BEGIN
485 
486       -- Returns the status of the tracking item
487       OPEN c_get_s_tracking_status(p_tracking_id);
488       FETCH c_get_s_tracking_status INTO v_s_tracking_status;
489       IF (c_get_s_tracking_status%NOTFOUND) THEN
490         CLOSE c_get_s_tracking_status;
491         RAISE NO_DATA_FOUND;
492       END IF;
493       CLOSE c_get_s_tracking_status;
494       RETURN v_s_tracking_status;
495 
496     END;
497 
498   END trkp_get_item_status;
499 
500 
501   PROCEDURE trkp_ins_dflt_trst(
502     p_tracking_id IN NUMBER ,
503     p_message_name OUT NOCOPY VARCHAR2 )
504   IS
505 
506   /*******************************************************************************
507   Created by  : Oracle IDC
508   Date created:
509 
510   Purpose:
511    1. This program unit is used to insert the default tracking_steps for an item
512       based on the IGS_TR_TYPE and its associated tracking_type_steps, duplicate
513       existing IGS_GE_NOTE records and insert IGS_TR_STEP_NOTES
514 
515   Usage: (e.g. restricted, unrestricted, where to call from)
516    1. Called from IGSTR007.FMB upon creation of a tracking item.
517 
518   Known limitations/enhancements/remarks:
519      -
520 
521   Change History: (who, when, what: NO CREATION RECORDS HERE!)
522   Who             When            What
523   msrinivi        06 Jul,2001    Added logic to insert the newly added columns, i.e.
524                                  step catalog id,step group id and publish indicator
525   pradhakr        14-Feb-2002    Added code to insert step group limit after the
526                                  default of tracking type steps.
527   *******************************************************************************/
528 
529     gv_other_detail  VARCHAR2(255);
530     lv_param_values  VARCHAR2(1080);
531 
532   BEGIN
533 
534     -- trkp_ins_dftl_trst
535     -- Insert the default tracking_steps for an item based on the
536     -- the IGS_TR_TYPE and its associated tracking_type_steps.
537     -- This procedure should only be call on creation of a
538     -- tracking item.
539 
540     DECLARE
541 
542       v_other_detail  VARCHAR2(255);
543       v_tracking_type  igs_tr_item.tracking_type%TYPE;
544       v_originator_person_id igs_tr_item.originator_person_id%TYPE;
545       v_new_reference_number igs_ge_note.reference_number%TYPE;
546       p_rowid   VARCHAR2(25);
547       v_start_dt igs_tr_item.start_dt%TYPE;
548       v_completion_due_dt igs_tr_item.completion_due_dt%TYPE;
549       v_override_offset_clc_ind igs_tr_item.override_offset_clc_ind%TYPE;
550 
551       CURSOR c_tracking_item ( cp_tracking_id igs_tr_item.tracking_id%TYPE) IS
552         SELECT  tracking_type, originator_person_id,start_dt,completion_due_dt, override_offset_clc_ind
553         FROM    igs_tr_item
554         WHERE   tracking_id = cp_tracking_id;
555 
556       CURSOR c_tracking_type_step ( cp_tracking_type igs_tr_type.tracking_type%TYPE) IS
557         SELECT  *
558         FROM    igs_tr_type_step
559         WHERE   tracking_type  = cp_tracking_type;
560 
561       CURSOR c_tracking_type_step_note (
562         cp_tracking_type  igs_tr_type.tracking_type%TYPE,
563         cp_tracking_type_step_id  igs_tr_type_step.tracking_type_step_id%TYPE
564       ) IS
565         SELECT  reference_number, trk_note_type
566         FROM    igs_tr_typ_step_note
567         WHERE   tracking_type   = cp_tracking_type
568 	AND     tracking_type_step_id  = cp_tracking_type_step_id;
569 
570        -- Cursor to fetch group limit
571        CURSOR c_tracking_type_step_grplmt (cp_tracking_type igs_tr_type.tracking_type%TYPE) IS
572          SELECT step_group_id,
573                 step_group_limit
574          FROM   igs_tr_tstp_grp_lmt
575          WHERE  tracking_type = cp_tracking_type;
576 
577 
578       -- This procedure insert a IGS_TR_STEP record
579       PROCEDURE trkpl_ins_ts_rec (
580         p_tracking_id  igs_tr_step.tracking_id%TYPE,
581         p_tracking_step_id igs_tr_step.tracking_step_id%TYPE,
582         p_tracking_step_number igs_tr_step.tracking_step_number%TYPE,
583         p_description  igs_tr_step.description%TYPE,
584         p_completion_dt  igs_tr_step.completion_dt%TYPE,
585         p_action_days  igs_tr_step.action_days%TYPE,
586         p_step_completion_ind igs_tr_step.step_completion_ind%TYPE,
587         p_by_pass_ind  igs_tr_step.by_pass_ind%TYPE,
588         p_recipient_id  igs_tr_step.recipient_id%TYPE,
589         p_s_tracking_step_type igs_tr_type_step.s_tracking_step_type%TYPE,
590         p_step_catalog_cd igs_tr_type_step.step_catalog_cd%TYPE,
591         p_step_group_id igs_tr_type_step.step_group_id%TYPE,
592         p_publish_ind igs_tr_type_step.publish_ind%TYPE)
593 
594       AS
595 
596 	lv_param_values VARCHAR2(1080);
597         p_rowid   VARCHAR2(25);
598 
599       BEGIN
600 
601 	igs_tr_step_pkg.insert_row (
602           x_rowid => p_rowid,
603           x_tracking_id => p_tracking_id,
604           x_tracking_step_id => p_tracking_step_id ,
605           x_tracking_step_number => p_tracking_step_number,
606           x_description => p_description,
607           x_s_tracking_step_type=> p_s_tracking_step_type,
608           x_completion_dt => p_completion_dt,
609           x_action_days => p_action_days,
610           x_step_completion_ind => p_step_completion_ind,
611           x_by_pass_ind => p_by_pass_ind,
612           x_recipient_id => p_recipient_id,
613           x_mode => 'R',
614           x_step_catalog_cd => p_step_catalog_cd,
615           x_step_group_id => p_step_group_id,
616           x_publish_ind => p_publish_ind
617 	);
618 
619      EXCEPTION
620 
621       WHEN OTHERS THEN
622            app_exception.raise_exception;
623        DECLARE
624              l_message_name  VARCHAR2(30);
625              l_app           VARCHAR2(50);
626        BEGIN
627         FND_MESSAGE.PARSE_ENCODED(FND_MESSAGE.GET_ENCODED, l_app, l_message_name);
628          IF l_message_name = 'IGS_TR_STEP_CTLG_CLOSED' THEN
629 		fnd_message.set_name('IGS',l_message_name);
630 		igs_ge_msg_stack.ADD;
631                 app_exception.raise_exception;
632          ELSE
633            fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
634            fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_ins_ts_rec'||'-'||SQLERRM);
635            igs_ge_msg_stack.ADD;
636            lv_param_values:=TO_CHAR(p_tracking_id)||','||TO_CHAR(p_tracking_step_id);
637            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
638            fnd_message.set_token('VALUE',lv_param_values);
639            igs_ge_msg_stack.ADD;
640            lv_param_values:=TO_CHAR(p_tracking_step_number)||','||p_description;
641            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
642            fnd_message.set_token('VALUE',lv_param_values);
643            igs_ge_msg_stack.ADD;
644            lv_param_values:=igs_ge_date.igschar (p_completion_dt)||','||TO_CHAR(p_action_days);
645            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
646            fnd_message.set_token('VALUE',lv_param_values);
647            igs_ge_msg_stack.ADD;
648            lv_param_values:=p_step_completion_ind||','||p_by_pass_ind||','||TO_CHAR(p_recipient_id );
649            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
650            fnd_message.set_token('VALUE',lv_param_values);
651            igs_ge_msg_stack.ADD;
652            lv_param_values:=p_s_tracking_step_type;
653            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
654            fnd_message.set_token('VALUE',lv_param_values);
655            igs_ge_msg_stack.ADD;
656            app_exception.raise_exception;
657          END IF;
658        END;
659       END trkpl_ins_ts_rec;
660 
661       -- Duplicate existing IGS_GE_NOTE record
662       PROCEDURE trkpl_dup_note_rec (
663         p_reference_number   igs_ge_note.reference_number%TYPE,
664         p_new_reference_number OUT NOCOPY igs_ge_note.reference_number%TYPE)
665       AS
666 
667         lv_param_values  VARCHAR2(1080);
668         p_rowid  VARCHAR2(25);
669         v_s_note_format_type igs_ge_note.s_note_format_type%TYPE;
670         v_note_text  igs_ge_note.note_text%TYPE;
671         v_next_ref_number igs_ge_note.reference_number%TYPE;
672 
673         CURSOR c_note IS
674           SELECT  s_note_format_type, note_text
675           FROM    igs_ge_note
676           WHERE   reference_number = p_reference_number;
677 
678       BEGIN
679 
680         OPEN c_note;
681         FETCH c_note INTO  v_s_note_format_type, v_note_text;
682         CLOSE c_note;
683         SELECT igs_ge_note_rf_num_s.NEXTVAL INTO v_next_ref_number FROM dual;
684 
685 	p_new_reference_number := v_next_ref_number;
686        igs_ge_note_pkg.insert_row(
687          x_rowid => p_rowid,
688          x_reference_number => v_next_ref_number,
689          x_s_note_format_type => v_s_note_format_type,
690          x_note_text => v_note_text,
691          x_mode => 'R'
692         );
693 
694        /* CALL ROUTINE TO COPY OLE DATA HERE */
695        EXCEPTION
696          WHEN OTHERS THEN
697            fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
698            fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_dup_note_rec'||'-'||SQLERRM);
699            igs_ge_msg_stack.ADD;
700            lv_param_values:=TO_CHAR(p_reference_number);
701            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
702            fnd_message.set_token('VALUE',lv_param_values);
703            igs_ge_msg_stack.ADD;
704            app_exception.raise_exception;
705 
706       END trkpl_dup_note_rec;
707 
708       -- Insert IGS_TR_STEP_NOTE record
709       PROCEDURE trkpl_ins_tsn_rec(
710         p_tracking_id  igs_tr_step_note.tracking_id%TYPE,
711         p_tracking_step_id igs_tr_step_note.tracking_step_id%TYPE,
712         p_reference_number igs_tr_step_note.reference_number%TYPE,
713         p_trk_note_type  igs_tr_step_note.trk_note_type%TYPE)
714       AS
715 
716 	lv_param_values  VARCHAR2(1080);
717         p_rowid   VARCHAR2(25);
718 
719       BEGIN
720 
721 	igs_tr_step_note_pkg.insert_row(
722           x_rowid => p_rowid,
723           x_tracking_id => p_tracking_id,
724           x_tracking_step_id => p_tracking_step_id,
725           x_reference_number => p_reference_number,
726           x_trk_note_type => p_trk_note_type,
727           x_mode => 'R'
728         );
729 
730         EXCEPTION
731           WHEN OTHERS THEN
732             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
733             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_ins_tsn_rec'||'-'||SQLERRM);
734             igs_ge_msg_stack.ADD;
735             lv_param_values:=TO_CHAR(p_tracking_id)||','||TO_CHAR(p_tracking_step_id)||','||TO_CHAR(p_reference_number);
736             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
737             fnd_message.set_token('VALUE',lv_param_values);
738             igs_ge_msg_stack.ADD;
739             lv_param_values:=p_trk_note_type;
740             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
741             fnd_message.set_token('VALUE',lv_param_values);
742             igs_ge_msg_stack.ADD;
743             app_exception.raise_exception;
744       END trkpl_ins_tsn_rec;
745 
746 
747       -- API to default the tracking steps for item based on the Tracking Type
748       -- Added by pradhakr
749       PROCEDURE trkpl_ins_ts_grp_lmt (
750         p_tracking_id IN igs_tr_step_grp_lmt.tracking_id%TYPE,
751 	p_step_group_id  IN igs_tr_step_grp_lmt.step_group_id%TYPE,
752         p_step_group_limit IN igs_tr_step_grp_lmt.step_group_limit%TYPE
753        ) AS
754 
755         lv_param_values  VARCHAR2(1080);
756         l_rowid  VARCHAR2(25);
757 
758       BEGIN
759 
760 	IGS_TR_STEP_GRP_LMT_PKG.INSERT_ROW (
761 	  X_ROWID                 =>  l_rowid,
762           X_TRACKING_ID           =>  p_tracking_id,
763           X_STEP_GROUP_ID         =>  p_step_group_id,
764           X_STEP_GROUP_LIMIT      =>  p_step_group_limit
765 	);
766 
767        EXCEPTION
768          WHEN OTHERS THEN
769            fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
770            fnd_message.set_token('NAME','IGS_TR_GEN_002.trkpl_ins_ts_grp_lmt'||'-'||SQLERRM);
771            igs_ge_msg_stack.add;
772            lv_param_values:=TO_CHAR(p_tracking_id)||','||TO_CHAR(p_step_group_id)||','||TO_CHAR(p_step_group_limit);
773            fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
774            fnd_message.set_token('VALUE',lv_param_values);
775            igs_ge_msg_stack.add;
776            app_exception.raise_exception;
777 
778       END trkpl_ins_ts_grp_lmt; /* End of the procedure */
779 
780     BEGIN
781 
782       p_message_name := NULL;
783       -- Select the IGS_TR_TYPE, originator_person_id
784       OPEN c_tracking_item( p_tracking_id);
785       FETCH c_tracking_item
786       INTO
787       v_tracking_type,
788       v_originator_person_id,
789       v_start_dt,
790       v_completion_due_dt,
791       v_override_offset_clc_ind;
792 
793       IF (c_tracking_item%NOTFOUND) THEN
794         CLOSE c_tracking_item;
795         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
796         RETURN;
797       END IF;
798 
799       CLOSE c_tracking_item;
800 
801       -- Select all IGS_TR_TYPE_STEP records
802 
803       FOR v_tts_rec IN c_tracking_type_step( v_tracking_type) LOOP
804 
805 	IF (v_tts_rec.recipient_id IS NULL) THEN
806           v_tts_rec.recipient_id := v_originator_person_id;
807         END IF;
808 
809       -- If the override offset ind is set, then set the action days to be
810       -- completion due date minus the start date
811         IF (NVL(v_override_offset_clc_ind,'N') = 'Y') THEN
812         v_tts_rec.action_days := v_completion_due_dt - v_start_dt;
813         END IF;
814 
815         -- For each record found, create a new IGS_TR_STEP record
816 
817         trkpl_ins_ts_rec (
818           p_tracking_id,
819           v_tts_rec.tracking_type_step_id,
820           v_tts_rec.tracking_type_step_number,
821           v_tts_rec.description,
822           NULL,
823           v_tts_rec.action_days,
824           'N',
825           'N',
826           v_tts_rec.recipient_id,
827           v_tts_rec.s_tracking_step_type,
828           v_tts_rec.step_catalog_cd,
829           v_tts_rec.step_group_id,
830           v_tts_rec.publish_ind
831 	);
832 
833         -- If any tracking_type_step_notes exist then
834         -- create a new IGS_GE_NOTE record(s) which duplicates the existing one
835 
836         FOR v_ttsn_rec IN c_tracking_type_step_note ( v_tts_rec.tracking_type, v_tts_rec.tracking_type_step_id) LOOP
837 
838 	   trkpl_dup_note_rec(v_ttsn_rec.reference_number, v_new_reference_number);
839            -- then create a new IGS_TR_STEP_NOTE
840 
841 	   trkpl_ins_tsn_rec(
842              p_tracking_id,
843              v_tts_rec.tracking_type_step_id,
844              v_new_reference_number,
845              v_ttsn_rec.trk_note_type
846 	    );
847 
848         END LOOP;
849 
850       END LOOP;
851 
852 	-- If any tracking group limit exists then insert into IGS_TR_STEP_GRP_LMT
853 	FOR rec_tracking_type_step_grplmt IN c_tracking_type_step_grplmt(v_tracking_type) LOOP
854             trkpl_ins_ts_grp_lmt (p_tracking_id,
855                                   rec_tracking_type_step_grplmt.step_group_id,
856                                   rec_tracking_type_step_grplmt.step_group_limit);
857         END LOOP;
858 
859     END;
860 
861     EXCEPTION
862       WHEN OTHERS THEN
863        DECLARE
864              l_message_name  VARCHAR2(30);
865              l_app           VARCHAR2(50);
866        BEGIN
867         FND_MESSAGE.PARSE_ENCODED(FND_MESSAGE.GET_ENCODED, l_app, l_message_name);
868 	--kumma,2989286 , if l_message_name is not null then show message else unhandled
869          IF l_message_name IS NOT NULL THEN
870      		FND_MESSAGE.SET_NAME('IGS',l_message_name);
871 	     	IGS_GE_MSG_STACK.ADD;
872             APP_EXCEPTION.RAISE_EXCEPTION;
873          ELSE
874 		fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
875 		fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_ins_dflt_trst'||'-'||SQLERRM);
876 		igs_ge_msg_stack.ADD;
877 		lv_param_values:=TO_CHAR(p_tracking_id);
878 		lv_param_values:=fnd_message.get;
879 		fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
880 		fnd_message.set_token('VALUE',lv_param_values);
881 		igs_ge_msg_stack.ADD;
882 		app_exception.raise_exception;
883          END IF;
884         END;
885 
886   END trkp_ins_dflt_trst;
887 
888   PROCEDURE trkp_ins_trk_item(
889     p_tracking_status IN VARCHAR2 ,
890     p_tracking_type IN VARCHAR2 ,
891     p_source_person_id IN NUMBER ,
892     p_start_dt IN DATE ,
893     p_target_days IN NUMBER ,
894     p_sequence_ind IN VARCHAR2 ,
895     p_business_days_ind IN VARCHAR2 ,
896     p_originator_person_id IN NUMBER ,
897     p_s_created_ind IN VARCHAR2 ,
898     p_tracking_id OUT NOCOPY NUMBER ,
899     p_message_name OUT NOCOPY VARCHAR2,
900     p_override_offset_clc_ind IN VARCHAR2 ,
901     p_completion_due_dt IN DATE ,
902     p_publish_ind IN VARCHAR2  )
903   IS
904 
905   /*******************************************************************************
906   Created by  : Oracle IDC
907   Date created:
908 
909   Purpose:
910      1.  This procedure will be used by batch processing to create a tracking item
911          It will accept the details of the item to be created and insert a
912          IGS_TR_ITEM record. The tracking item step will be defaulted
913          when the database table  insert trigger fires for the tracking item.
914 
915   Usage: (e.g. restricted, unrestricted, where to call from)
916      1. Called from IGSTR007.FMB
917 
918   Known limitations/enhancements/remarks:
919      -
920 
921   Change History: (who, when, what: NO CREATION RECORDS HERE!)
922   Who             When            What
923   msrinivi        06 Jul,2001     Added 3 new columns : completion due dt,
924                                   override offset clc ind and publish ind
925   ssawhney        18 Oct 2002     p_target_days, use NVL with cursor value. RE03 was not passing them
926   *******************************************************************************/
927 
928     gv_other_detail  VARCHAR2(255);
929     lv_param_values  VARCHAR2(1080);
930     v_completion_due_dt igs_tr_item.completion_due_dt%TYPE;
931 
932   BEGIN
933 
934     -- trkp_ins_trk_item
935     -- This procedure will be used by batch processing to create a tracking item
936     -- It will accept the details of the item to be created and insert a
937     -- IGS_TR_ITEM record. The tracking item step will be defaulted
938     -- when the database table  insert trigger fires for the tracking item.
939 
940     DECLARE
941 
942       v_check   CHAR;
943       v_tracking_type  igs_tr_type%ROWTYPE;
944       v_nxt_tracking_id igs_tr_item.tracking_id%TYPE;
945       l_sequence_ind igs_tr_type.sequence_ind%TYPE;
946       l_business_days_ind igs_tr_type.business_days_ind%TYPE;
947       p_rowid   VARCHAR2(25);
948 
949       CURSOR c_tracking_status IS
950         SELECT  'x'
951         FROM    igs_tr_status
952         WHERE   tracking_status = p_tracking_status;
953 
954       CURSOR c_tracking_type IS
955         SELECT *
956         FROM   igs_tr_type
957         WHERE  tracking_type = p_tracking_type;
958 
959       -- person exists check from person_base_v
960       CURSOR c_person (cp_person_id igs_pe_person.person_id%TYPE) IS
961         SELECT 'x'
962         FROM igs_pe_person_base_v
963         WHERE person_id = cp_person_id;
964 
965       CURSOR c_tri_nxt_seq_num IS
966         SELECT igs_tr_item_tr_id_s.NEXTVAL
967         FROM dual;
968 
969     BEGIN
970 
971       p_message_name := NULL;
972 
973       IF (p_tracking_status IS NULL) THEN
974         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
975         RETURN;
976       END IF;
977 
978       OPEN c_tracking_status;
979 
980       FETCH c_tracking_status INTO v_check;
981       IF (c_tracking_status%NOTFOUND) THEN
982         CLOSE c_tracking_status;
983         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
984         RETURN;
985       END IF;
986 
987       CLOSE c_tracking_status;
988 
989       IF (p_tracking_type IS NULL) THEN
990         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
991         RETURN;
992       END IF;
993 
994       OPEN c_tracking_type;
995 
996       FETCH c_tracking_type INTO v_tracking_type;
997         IF (c_tracking_type%NOTFOUND) THEN
998           CLOSE c_tracking_type;
999           p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
1000           RETURN;
1001         END IF;
1002 
1003       CLOSE c_tracking_type;
1004 
1005       IF (p_originator_person_id IS NULL) THEN
1006         p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
1007         RETURN;
1008       END IF;
1009 
1010       OPEN c_person(p_originator_person_id);
1011       FETCH c_person INTO v_check;
1012 
1013       IF (c_person%NOTFOUND) THEN
1014         CLOSE c_person;
1015 	p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
1016         RETURN;
1017       END IF;
1018 
1019       CLOSE c_person;
1020 
1021       IF (p_source_person_id IS NOT NULL) THEN
1022         OPEN c_person(p_source_person_id);
1023         FETCH c_person INTO v_check;
1024         IF (c_person%NOTFOUND) THEN
1025           CLOSE c_person;
1026           p_message_name := 'IGS_GE_VAL_DOES_NOT_XS';
1027           RETURN;
1028         END IF;
1029         CLOSE c_person;
1030       END IF;
1031 
1032       l_sequence_ind := NVL(p_sequence_ind, v_tracking_type.sequence_ind);
1033       l_business_days_ind := NVL(p_business_days_ind, v_tracking_type.business_days_ind);
1034 
1035       IF (l_sequence_ind = 'Y' OR l_business_days_ind = 'Y') AND
1036          NVL(p_override_offset_clc_ind,'N') = 'Y' THEN
1037         p_message_name := 'IGS_TR_CANNOT_CHK_SEQ_OR_BD';
1038         RETURN;
1039       END IF;
1040 
1041 --Manu
1042       IF NVL(p_override_offset_clc_ind,'N') = 'Y' AND p_completion_due_dt IS NULL THEN
1043         p_message_name := 'IGS_TR_COMP_DUE_DATE_REQ';
1044         RETURN;
1045       END IF;
1046 
1047       IF NVL(p_override_offset_clc_ind,'N') = 'N' AND p_completion_due_dt IS NOT NULL THEN
1048         p_message_name := 'IGS_TR_COMP_DUE_DATE_NOT_SUPP';
1049         RETURN;
1050       END IF;
1051 
1052       -- ssawhney customer bug 2610394,
1053       -- RE was passing p_target_days as null and because of that v_comp_due_dt was coming out NOCOPY to be same as p_start_dt.
1054 
1055       IF p_completion_due_dt IS NULL THEN
1056          v_completion_due_dt := igs_tr_gen_001.trkp_clc_dt_offset(p_start_dt,
1057                                                                   NVL(p_target_days, v_tracking_type.target_days), -- p_target_days,
1058                                                                   l_business_days_ind,
1059                                                                   NVL(p_override_offset_clc_ind,'N'));
1060       END IF;
1061 --Manu
1062 
1063       OPEN c_tri_nxt_seq_num;
1064       FETCH c_tri_nxt_seq_num INTO v_nxt_tracking_id;
1065       CLOSE c_tri_nxt_seq_num;
1066       p_tracking_id := v_nxt_tracking_id;
1067 
1068       igs_tr_item_pkg.insert_row(
1069         x_rowid => p_rowid,
1070         x_tracking_id => v_nxt_tracking_id,
1071         x_tracking_status => p_tracking_status ,
1072         x_tracking_type => p_tracking_type,
1073         x_source_person_id => p_source_person_id,
1074         x_start_dt => NVL(p_start_dt, SYSDATE),
1075         x_target_days => NVL(p_target_days, v_tracking_type.target_days),
1076         x_sequence_ind => l_sequence_ind,
1077         x_business_days_ind => l_business_days_ind,
1078         x_originator_person_id => p_originator_person_id,
1079         x_s_created_ind => NVL(p_s_created_ind, 'N'),
1080         x_mode => 'R',
1081 	x_org_id => igs_ge_gen_003.get_org_id,
1082 	x_override_offset_clc_ind => NVL(p_override_offset_clc_ind,'N'),
1083         x_completion_due_dt => NVL(p_completion_due_dt,v_completion_due_dt),
1084         x_publish_ind => p_publish_ind
1085       );
1086 
1087     END;
1088 
1089     EXCEPTION
1090       WHEN OTHERS THEN
1091         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1092         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_ins_trk_item'||'-'||SQLERRM);
1093         igs_ge_msg_stack.ADD;
1094         lv_param_values:= p_tracking_status ||','||p_tracking_type||','||TO_CHAR(p_source_person_id );
1095         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1096         fnd_message.set_token('VALUE',lv_param_values);
1097         igs_ge_msg_stack.ADD;
1098         lv_param_values:= igs_ge_date.igschar (p_start_dt)||','|| TO_CHAR(p_target_days)||','||p_sequence_ind ;
1099         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1100         fnd_message.set_token('VALUE',lv_param_values);
1101         igs_ge_msg_stack.ADD;
1102         lv_param_values:= p_business_days_ind ||','||TO_CHAR(p_originator_person_id )||','||p_s_created_ind ;
1103         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1104         fnd_message.set_token('VALUE',lv_param_values);
1105         igs_ge_msg_stack.ADD;
1106         app_exception.raise_exception;
1107 
1108   END trkp_ins_trk_item;
1109 
1110   FUNCTION trkp_next_step_cmplt (
1111     p_tracking_id igs_tr_step.tracking_id%TYPE,
1112     p_tracking_step_number  igs_tr_step.tracking_step_number%TYPE,
1113     p_step_group_id igs_tr_step.step_group_id%TYPE,
1114     p_message_name OUT NOCOPY VARCHAR2
1115     ) RETURN BOOLEAN IS
1116   ------------------------------------------------------------------
1117   --Created by  : Apex, Oracle IDC (ssanyal.in)
1118   --Date created: 15-DEC-1999
1119   --
1120   --Purpose:
1121   --
1122   --
1123   --Known limitations/enhancements and/or remarks:
1124   --
1125   --Change History:
1126   --Who         When            What
1127   --msrinivi    13 Jul,2001     To check validity of change in by pass flag
1128   -------------------------------------------------------------------
1129     lv_param_values  VARCHAR2(1080);
1130     gv_other_detail  VARCHAR2(255);
1131 
1132     l_prev_grp_step_comp VARCHAR2(1) := 'N';
1133     l_next_step_comp VARCHAR2(1) := 'N';
1134 
1135     TYPE rec_step_group_id IS RECORD ( step_group_id NUMBER);
1136     TYPE tab_step_group_id IS TABLE OF
1137        rec_step_group_id  INDEX BY BINARY_INTEGER;
1138     plsql_step_group_id tab_step_group_id;
1139     cnt NUMBER DEFAULT 1;
1140     l_row_count NUMBER DEFAULT 0;
1141     l_num_rows NUMBER DEFAULT 0;
1142 
1143   -- ssawhney, table reference included instead of view
1144     CURSOR c_trst_all IS
1145       SELECT *
1146       FROM igs_tr_step
1147       WHERE tracking_id = p_tracking_id
1148       ORDER BY tracking_step_number;
1149 
1150     CURSOR c_trst_later IS
1151       SELECT *
1152       FROM igs_Tr_step
1153       WHERE tracking_id = p_tracking_id
1154       AND tracking_step_number > p_tracking_step_number
1155       ORDER BY tracking_step_number;
1156 
1157     c_trst_all_rec c_trst_all%ROWTYPE;
1158 
1159     BEGIN
1160       FOR l_trst_all IN c_trst_all LOOP
1161         EXIT WHEN (l_trst_all.tracking_step_number =  p_tracking_step_number);
1162         IF l_trst_all.step_group_id IS NOT NULL AND
1163            l_trst_all.step_completion_ind = 'Y' THEN
1164           plsql_step_group_id(cnt).step_group_id := l_trst_all.step_group_id;
1165           cnt := cnt + 1;
1166         END IF;
1167       END LOOP;
1168 
1169       FOR l_trst_all IN c_trst_all LOOP
1170         l_row_count := l_row_count+1;
1171         EXIT WHEN (l_trst_all.tracking_step_number =  p_tracking_step_number OR
1172                    l_prev_grp_step_comp = 'Y');
1173         IF l_trst_all.completion_dt IS NOT NULL AND
1174            l_trst_all.step_group_id IS NOT NULL THEN
1175           IF l_trst_all.step_group_id = p_step_group_id THEN
1176             l_prev_grp_step_comp := 'Y';
1177             EXIT;
1178           END IF;
1179         END IF;
1180       END LOOP;
1181 
1182     IF l_prev_grp_step_comp = 'Y' THEN
1183       RETURN FALSE;
1184     END IF;
1185 
1186     l_next_step_comp := 'N';
1187 
1188     FOR l_trst_all IN c_trst_all LOOP
1189       l_num_rows := l_num_rows + 1;
1190     END LOOP;
1191 
1192     IF l_num_rows = l_row_count THEN
1193       RETURN FALSE;
1194     END IF;
1195 
1196     FOR l_trst_later IN c_trst_later LOOP
1197       EXIT WHEN (l_next_step_comp = 'Y');
1198       IF (l_trst_later.completion_dt IS NOT NULL) THEN
1199         IF l_trst_later.step_group_id IS NOT NULL THEN
1200           l_next_step_comp := 'Y';
1201           FOR idx IN 1..plsql_step_group_id.COUNT
1202           LOOP
1203             IF plsql_step_group_id(idx).step_group_id = l_trst_later.step_group_id THEN
1204               l_next_step_comp := 'N';
1205               EXIT;
1206             END IF;
1207           END LOOP;
1208         ELSE
1209           l_next_step_comp := 'Y';
1210         END IF;
1211       END IF;
1212     END LOOP;
1213 
1214     IF l_next_step_comp = 'Y' THEN
1215       p_message_name := 'IGS_TR_CANNOT_UNCHK_COMPL_IND';
1216       RETURN TRUE;
1217     ELSE
1218       RETURN FALSE;
1219     END IF;
1220 
1221   EXCEPTION
1222     WHEN OTHERS THEN
1223         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1224         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_next_step_cmplt'||'-'||SQLERRM);
1225         igs_ge_msg_stack.ADD;
1226         lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number)||','||TO_CHAR(p_step_group_id);
1227         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1228         fnd_message.set_token('VALUE',lv_param_values);
1229         igs_ge_msg_stack.ADD;
1230         app_exception.raise_exception;
1231   END trkp_next_step_cmplt;
1232 
1233   FUNCTION trkp_next_grp_step_cmplt (
1234     p_tracking_id igs_tr_step.tracking_id%TYPE,
1235     p_tracking_step_number igs_tr_step.tracking_step_number%TYPE,
1236     p_step_group_id igs_tr_step.step_group_id%TYPE,
1237     p_message_name OUT NOCOPY VARCHAR2
1238   ) RETURN BOOLEAN IS
1239   ------------------------------------------------------------------
1240   --Created by  : Apex, Oracle IDC (ssanyal.in)
1241   --Date created: 15-DEC-1999
1242   --
1243   --Purpose:
1244   --
1245   --
1246   --Known limitations/enhancements and/or remarks:
1247   --
1248   --Change History:
1249   --Who         When            What
1250   -------------------------------------------------------------------
1251   lv_param_values  VARCHAR2(1080);
1252   gv_other_detail  VARCHAR2(255);
1253 
1254   l_next_step_comp VARCHAR2(1) := 'N';
1255 
1256   TYPE rec_step_group_id IS RECORD ( step_group_id NUMBER);
1257   TYPE tab_step_group_id IS TABLE OF
1258        rec_step_group_id  INDEX BY BINARY_INTEGER;
1259   plsql_step_group_id tab_step_group_id;
1260   cnt NUMBER DEFAULT 1;
1261   l_row_count NUMBER DEFAULT 0;
1262   l_num_rows NUMBER DEFAULT 0;
1263 
1264   --ssawhney, view reference changed to table.
1265   CURSOR c_trst_later IS
1266     SELECT *
1267     FROM igs_tr_step
1268     WHERE tracking_id = p_tracking_id
1269     AND tracking_step_number > p_tracking_step_number
1270     ORDER BY tracking_step_number;
1271 
1272   CURSOR c_trst_all IS
1273     SELECT *
1274     FROM igs_tr_step
1275     WHERE tracking_id = p_tracking_id
1276     ORDER BY tracking_step_number;
1277 
1278   CURSOR c_trst_next(p_tracking_step_number NUMBER) IS
1279     SELECT *
1280     FROM igs_tr_step
1281     WHERE tracking_id = p_tracking_id
1282     AND tracking_step_number > p_tracking_step_number
1283     ORDER BY tracking_step_number;
1284 
1285   c_trst_all_rec c_trst_all%ROWTYPE;
1286   c_trst_later_rec c_trst_later%ROWTYPE;
1287 
1288   BEGIN
1289 
1290     OPEN c_trst_later;
1291     FETCH c_trst_later INTO c_trst_later_rec;
1292       IF (c_trst_later%NOTFOUND) THEN
1293         CLOSE c_trst_later;
1294         RETURN FALSE;
1295       END IF;
1296     CLOSE c_trst_later;
1297 
1298     FOR l_trst_all IN c_trst_all LOOP
1299       EXIT WHEN (l_trst_all.tracking_step_number = p_tracking_step_number);
1300       IF l_trst_all.step_group_id IS NOT NULL AND
1301          l_trst_all.step_completion_ind = 'Y' THEN
1302         plsql_step_group_id(cnt).step_group_id := l_trst_all.step_group_id;
1303         cnt := cnt + 1;
1304       END IF;
1305     END LOOP;
1306 
1307     l_row_count := p_tracking_step_number;
1308 
1309     FOR l_trst_later IN c_trst_later LOOP
1310       l_row_count := l_row_count + 1;
1311       IF (l_trst_later.step_group_id = p_step_group_id AND
1312           l_trst_later.step_completion_ind = 'N' AND
1313           l_trst_later.by_pass_ind = 'N') THEN
1314         EXIT;
1315       END IF;
1316     END LOOP;
1317 
1318     FOR l_trst_all IN c_trst_all LOOP
1319       l_num_rows := l_num_rows + 1;
1320     END LOOP;
1321 
1322     l_next_step_comp := 'N';
1323 
1324     IF l_num_rows =  l_row_count THEN
1325       RETURN FALSE;
1326     END IF;
1327 
1328     FOR l_trst_next IN c_trst_next(l_row_count) LOOP
1329       EXIT WHEN (l_next_step_comp = 'Y');
1330       IF l_trst_next.completion_dt IS NOT NULL THEN
1331         l_next_step_comp := 'Y';
1332       ELSE
1333         l_next_step_comp := 'N';
1334       END IF;
1335     END LOOP;
1336 
1337     IF l_next_step_comp = 'Y' THEN
1338       p_message_name := 'IGS_TR_CANNOT_CHK_BYPAS_IND';
1339       RETURN TRUE;
1340     ELSE
1341       RETURN FALSE;
1342     END IF;
1343 
1344   EXCEPTION
1345     WHEN OTHERS THEN
1346         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1347         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_next_grp_step_cmplt'||'-'||SQLERRM);
1348         igs_ge_msg_stack.ADD;
1349         lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number)||','||TO_CHAR(p_step_group_id);
1350         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1351         fnd_message.set_token('VALUE',lv_param_values);
1352         igs_ge_msg_stack.ADD;
1353         app_exception.raise_exception;
1354   END trkp_next_grp_step_cmplt;
1355 
1356 
1357   FUNCTION trkp_check_step_group_limit (
1358     p_tracking_id  IN igs_tr_step.tracking_id%TYPE,
1359     p_tracking_step_number IN igs_tr_step.tracking_step_number%TYPE,
1360     p_step_group_id IN igs_tr_step.step_group_id%TYPE,
1361     p_message_name OUT NOCOPY VARCHAR2
1362   ) RETURN BOOLEAN IS
1363   ------------------------------------------------------------------
1364   --Created by  : pradhakr, Oracle IDC
1365   --Date created: 11-FEB-2002
1366   --
1367   --Purpose:
1368   --
1369   --
1370   --Known limitations/enhancements and/or remarks:
1371   --
1372   --Change History:
1373   --Who         When            What
1374   -------------------------------------------------------------------
1375 
1376   lv_param_values  VARCHAR2(1080);
1377 
1378   --  Cursor to get all step group ids and the number of completed steps prior to the
1379   --  passed step group id (p_step_group_id) and tracking step number (p_ tracking_step_number) and
1380   --  comparing the result with the one in the table IGS_TR_STEP_GRP_LMT
1381 
1382     CURSOR c_grp_limit IS
1383     SELECT tab.step_group_id, tab.step_group_limit
1384     FROM
1385 	  ( SELECT step_group_id, count(*) step_group_limit
1386 	    FROM   igs_tr_step trst
1387 	    WHERE  trst.tracking_id = p_tracking_id
1388 	    AND    trst.tracking_step_number < p_tracking_step_number
1389 	    AND    trst.step_group_id is not null
1390 	    AND    trst.step_group_id <> p_step_group_id
1391 	    AND    trst.step_completion_ind = 'Y'
1392 	    AND    trst.by_pass_ind = 'N'
1393 	    GROUP BY trst.step_group_id, trst.step_completion_ind
1394 	    MINUS
1395 	    SELECT step_group_id, step_group_limit
1396 	    FROM   igs_tr_step_grp_lmt
1397 	    WHERE  tracking_id = p_tracking_id
1398 	  ) tab ,
1399 	    igs_tr_step_grp_lmt trg
1400     WHERE   tab.step_group_id = trg.step_group_id
1401      AND    trg.tracking_id = p_tracking_id
1402     AND     tab.step_group_limit < trg.step_group_limit ;
1403 
1404     l_grp_limit c_grp_limit%ROWTYPE;
1405 
1406   BEGIN
1407 
1408     OPEN c_grp_limit;
1409     FETCH c_grp_limit INTO l_grp_limit;
1410     -- If record exists, it means that some of the step group limit has not been met for the step group id.
1411     IF c_grp_limit%FOUND THEN
1412        p_message_name := 'IGS_TR_STEP_GRPLMT_VIOLATE';
1413        RETURN FALSE;
1414     ELSE
1415        RETURN TRUE;
1416     END IF;
1417     CLOSE c_grp_limit;
1418 
1419   EXCEPTION
1420     WHEN OTHERS THEN
1421         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1422         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_check_step_group_limit'||'-'||SQLERRM);
1423         igs_ge_msg_stack.add;
1424         lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number)||','||TO_CHAR(p_step_group_id);
1425         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1426         fnd_message.set_token('VALUE',lv_param_values);
1427         igs_ge_msg_stack.add;
1428         app_exception.raise_exception;
1429 
1430   END trkp_check_step_group_limit;
1431 
1432 
1433   FUNCTION trkp_prev_step_cmplt (
1434     p_tracking_id igs_tr_step.tracking_id%TYPE,
1435     p_tracking_step_number igs_tr_step.tracking_step_number%TYPE,
1436     p_step_group_id igs_tr_step.step_group_id%TYPE,
1437     p_message_name OUT NOCOPY VARCHAR2
1438   ) RETURN BOOLEAN IS
1439   ------------------------------------------------------------------
1440   --Created by  : Apex, Oracle IDC (ssanyal.in)
1441   --Date created: 15-DEC-1999
1442   --
1443   --Purpose:
1444   --
1445   --
1446   --Known limitations/enhancements and/or remarks:
1447   --
1448   --Change History:
1449   --Who         When            What
1450   -------------------------------------------------------------------
1451     lv_param_values  VARCHAR2(1080);
1452     gv_other_detail  VARCHAR2(255);
1453 
1454 
1455     CURSOR c_earlier_step_trst IS
1456       SELECT DISTINCT TO_NUMBER('1')
1457       FROM igs_tr_step trst
1458       WHERE trst.tracking_id = p_tracking_id
1459       AND   trst.tracking_step_number < p_tracking_step_number
1460       AND   trst.step_group_id IS NULL
1461       AND   trst.step_completion_ind = 'N'
1462       AND   trst.by_pass_ind = 'N'
1463       UNION
1464       (
1465        SELECT   DISTINCT trst.step_group_id
1466        FROM     igs_tr_step trst
1467        WHERE    trst.tracking_id = p_tracking_id
1468        AND      trst.tracking_step_number < p_tracking_step_number
1469        AND      trst.step_group_id IS NOT NULL
1470        AND      trst.step_completion_ind = 'N'
1471        AND      trst.by_pass_ind = 'N'
1472        GROUP BY   trst.step_group_id, trst.step_completion_ind
1473        MINUS
1474        SELECT   DISTINCT trst.step_group_id
1475        FROM     igs_tr_step trst
1476        WHERE    trst.tracking_id = p_tracking_id
1477        AND      trst.tracking_step_number < p_tracking_step_number
1478        AND      trst.step_group_id IS NOT NULL
1479        AND      trst.step_completion_ind = 'Y'
1480        GROUP BY trst.step_group_id, trst.step_completion_ind
1481       );
1482     v_step_completion_ind_temp NUMBER;
1483 
1484   BEGIN
1485 
1486      OPEN c_earlier_step_trst;
1487      FETCH c_earlier_step_trst INTO v_step_completion_ind_temp;
1488      IF (c_earlier_step_trst%FOUND) THEN
1489        CLOSE c_earlier_step_trst;
1490        p_message_name := 'IGS_TR_PREV_STEP_COMPLETED';
1491        RETURN FALSE;
1492      END IF;
1493      CLOSE c_earlier_step_trst;
1494 
1495      IF trkp_check_step_group_limit (
1496                                   p_tracking_id,
1497 		                  p_tracking_step_number,
1498                     	          p_step_group_id,
1499 		                  p_message_name   ) THEN
1500 
1501         RETURN TRUE;
1502      ELSE
1503         RETURN FALSE;
1504      END IF;
1505 
1506   EXCEPTION
1507     WHEN OTHERS THEN
1508         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1509         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_next_grp_step_cmplt'||'-'||SQLERRM);
1510         igs_ge_msg_stack.ADD;
1511         lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number);
1512         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1513         fnd_message.set_token('VALUE',lv_param_values);
1514         igs_ge_msg_stack.ADD;
1515         app_exception.raise_exception;
1516   END trkp_prev_step_cmplt;
1517 
1518 
1519   FUNCTION trkp_upd_trst(
1520     p_tracking_id IN NUMBER ,
1521     p_tracking_step_id IN NUMBER ,
1522     p_s_tracking_step_type IN VARCHAR2 ,
1523     p_action_dt IN DATE ,
1524     p_completion_dt IN DATE ,
1525     p_step_completion_ind IN VARCHAR2,
1526     p_by_pass_ind IN VARCHAR2,
1527     p_recipient_id IN NUMBER ,
1528     p_message_name OUT NOCOPY VARCHAR2
1529   )
1530   RETURN BOOLEAN AS
1531 
1532   /***********************************************************************************************************
1533   Created by  : Oracle IDC
1534   Date created:
1535 
1536   Purpose:
1537      1.  This module will update fields of the action days of
1538          a IGS_TR_STEP record.
1539   Usage: (e.g. restricted, unrestricted, where to call from)
1540      1. Called from IGSTR007.FMB
1541 
1542   Known limitations/enhancements/remarks:
1543      -
1544 
1545   Change History: (who, when, what: NO CREATION RECORDS HERE!)
1546   Who             When           What
1547 
1548   msrinivi       06 Jul,2001     Modified to have the logic for step groups before update. msrinivi
1549 				 11 Jul,2001     Step update not allowed if item is complete,
1550                                  Complete item if all the steps are considered complete
1551 
1552   Aiyer          24-Apr-2002     This code has been modified by Aiyer for the bug 2309359
1553                                  In call to function igs_tr_gen_001.trkp_clc_bus_dt the p_business_days
1554 				 parameter was being passed as 'N'.This was causing a numeric conversion error .
1555 				 This has been set to NVL(p_action_days,0) in this fix.
1556 
1557   ssawhney       4-Nov-2003	 Bug 3206700. The cursor to check item completion modified.
1558 				 Logic also modified to concider BY PASS item as complete.
1559   **************************************************************************************************************/
1560 
1561     lv_param_values  VARCHAR2(1080);
1562     gv_other_detail  VARCHAR2(255);
1563 
1564 
1565   BEGIN
1566 
1567     -- trkp_upd_trst
1568     -- This module will update fields of the action days of
1569     -- a IGS_TR_STEP record.
1570 
1571     DECLARE
1572 
1573       e_resource_busy_exception EXCEPTION;
1574 
1575       PRAGMA EXCEPTION_INIT(e_resource_busy_exception, -54);
1576 
1577       v_tracking_step_id igs_tr_step.tracking_step_id%TYPE;
1578       v_action_days  NUMBER;
1579       v_completion_dt  igs_tr_step.completion_dt%TYPE;
1580       v_step_completion_ind igs_tr_step.step_completion_ind%TYPE;
1581       v_by_pass_ind  igs_tr_step.by_pass_ind%TYPE;
1582       v_recipient_id  igs_tr_step.recipient_id%TYPE;
1583       v_start_dt  igs_tr_item.start_dt%TYPE;
1584       v_business_days_ind igs_tr_item.business_days_ind%TYPE;
1585       v_sequence_ind  igs_tr_item.sequence_ind%TYPE;
1586       v_step_completion_ind_temp igs_tr_step.step_completion_ind%TYPE;
1587       v_action_dt  igs_tr_step_v.action_dt%TYPE;
1588       v_message_name  VARCHAR2(30);
1589       v_rowid   VARCHAR2(25);
1590       v_step_group_id igs_tr_step.step_group_id%TYPE;
1591       v_tracking_step_number igs_tr_step.tracking_step_number%TYPE;
1592       l_field_mod VARCHAR2(10) := NULL;
1593       l_end_dt DATE;
1594       l_action_days igs_tr_step.action_days%TYPE;
1595       l_action_dt DATE;
1596 
1597       TYPE rec_step_group_id IS RECORD ( step_group_id NUMBER);
1598       TYPE tab_step_group_id IS TABLE OF
1599         rec_step_group_id  INDEX BY BINARY_INTEGER;
1600       plsql_step_group_id tab_step_group_id;
1601       cnt NUMBER DEFAULT 1;
1602 
1603       CURSOR c_tri_all IS
1604         SELECT *
1605         FROM igs_tr_item
1606         WHERE tracking_id = p_tracking_id;
1607 
1608       CURSOR c_sys_trk_sts(p_tracking_status igs_tr_status.tracking_status%TYPE) IS
1609         SELECT s_tracking_status
1610         FROM igs_tr_status
1611         WHERE tracking_status = p_tracking_status;
1612 
1613       --ssawhney cant change view reference..using view logic in select.
1614       CURSOR c_update_trst IS
1615         SELECT trst.*, trst.rowid ROW_ID, igs_tr_gen_001.trkp_clc_action_dt ( trst.tracking_id, trst.tracking_step_number,
1616 							tri.start_dt, tri.sequence_ind,tri.business_days_ind ) action_dt
1617           FROM   igs_tr_step trst,
1618 	         igs_tr_item tri
1619           WHERE  trst.tracking_id = p_tracking_id
1620 	  AND    trst.tracking_id = tri.tracking_id
1621 	  AND   ((NVL(p_tracking_step_id, 0) = 0)
1622 	        OR
1623                 (trst.tracking_step_id = p_tracking_step_id))
1624 	  AND    ((NVL(p_s_tracking_step_type, 'NULL') = 'NULL')
1625 	        OR
1626                 (trst.s_tracking_step_type = p_s_tracking_step_type))
1627 	  AND    ROWNUM = 1
1628         ORDER BY trst.tracking_step_number DESC
1629         FOR  UPDATE OF trst.action_days NOWAIT;
1630 
1631         --Added by Manu to check if the item should be marked as complete
1632         --if the all the steps can be considered as complete
1633 	-- Cursor modified for Bug 3206700
1634 	-- first half gets info if any step outside the group is not complete
1635 	-- second half gets info if any group has steps open/bypass or steps are complete by group limit is not achieved.
1636 
1637 	--ssawhney view reference changed to table.
1638 	CURSOR   c_check_item_cmpltn  IS
1639 	SELECT DISTINCT TO_NUMBER('1')
1640         FROM igs_tr_step trst
1641         WHERE trst.tracking_id = p_tracking_id
1642         AND trst.step_group_id IS NULL
1643         AND trst.step_completion_ind = 'N'
1644         AND trst.by_pass_ind = 'N'
1645         UNION
1646         (
1647          SELECT distinct step_group_id
1648          FROM igs_tr_step a
1649          WHERE a.tracking_id = p_tracking_id
1650          AND a.step_group_id IS NOT NULL
1651 -- total no of groups for the tracking item
1652          MINUS
1653 -- subtract groups that are open
1654          SELECT c.step_group_id
1655          FROM (
1656                SELECT tab.step_group_id, tab.count_step
1657                FROM (
1658                      SELECT  trst.step_group_id step_group_id,
1659                              COUNT(*) count_step
1660                      FROM    igs_tr_step trst
1661                      WHERE   trst.tracking_id = p_tracking_id
1662                      AND     trst.step_group_id IS NOT NULL
1663                      AND     ((trst.step_completion_ind = 'Y' AND trst.by_pass_ind = 'N') OR
1664 		              (trst.step_completion_ind = 'N' AND trst.by_pass_ind = 'Y'))
1665                      GROUP BY   trst.step_group_id,
1666                                 trst.step_completion_ind
1667                     ) tab,
1668 -- a step is considered complete if either its BY PASSED or its completion ind is Y
1669                     igs_tr_step_grp_lmt trg
1670                WHERE tab.step_group_id = trg.step_group_id
1671                 AND  trg.tracking_id = p_tracking_id
1672                AND   tab.count_step >= trg.step_group_limit
1673 -- subtract only if the total steps completed are less than the group limit.
1674              ) c
1675         );
1676 
1677       CURSOR c_dflt_trk_sts IS
1678         SELECT tracking_status
1679         FROM igs_tr_status
1680         WHERE s_tracking_status = 'COMPLETE'
1681         AND default_ind = 'Y';
1682 
1683       igs_tr_step_rec  c_update_trst%ROWTYPE;
1684       igs_tr_item_rec  c_tri_all%ROWTYPE;
1685       l_sys_trk_sts igs_tr_status.s_tracking_status%TYPE;
1686       l_trk_sts igs_tr_status.tracking_status%TYPE;
1687       l_item_cmpl c_check_item_cmpltn%ROWTYPE;
1688 
1689       -- validitate action / completion date and get action days
1690       FUNCTION process_date (
1691           p_date_type IN VARCHAR2,
1692           p_tracking_id IN igs_tr_step.tracking_id%TYPE,
1693           p_tracking_step_number IN igs_tr_step.tracking_step_number%TYPE,
1694           p_end_dt IN OUT NOCOPY DATE,
1695           p_action_days IN OUT NOCOPY igs_tr_step.action_days%TYPE,
1696           p_message_name OUT NOCOPY VARCHAR2
1697       )RETURN BOOLEAN IS
1698         --ssawhney view reference changed to table in the second part..first part still referes to the function for getting the dates.
1699 
1700         CURSOR c_start_dt IS
1701           SELECT NVL(trst.completion_dt,igs_tr_gen_001.trkp_clc_action_dt ( trst.tracking_id, trst.tracking_step_number,
1702 							tri.start_dt, tri.sequence_ind,tri.business_days_ind )) start_dt
1703           FROM   igs_tr_step trst, igs_tr_item tri
1704           WHERE  trst.tracking_id = tri.tracking_id
1705 	  AND    trst.tracking_id = p_tracking_id
1706           AND    trst.tracking_step_number = (SELECT MAX(b.tracking_step_number)
1707                                          FROM   igs_tr_step b
1708                                          WHERE  b.tracking_id = p_tracking_id
1709                                          AND    b.tracking_step_number < p_tracking_step_number
1710                                          AND    b.by_pass_ind = 'N');
1711 
1712          --ssawhney view reference changed to table and introduced fucntions.
1713         CURSOR c_upd_next_dt IS
1714           SELECT trst.*, trst.rowid ROW_ID, igs_tr_gen_001.trkp_clc_action_dt ( trst.tracking_id, trst.tracking_step_number,
1715 							tri.start_dt, tri.sequence_ind,tri.business_days_ind ) action_dt
1716           FROM   igs_tr_step trst,
1717 	         igs_tr_item tri
1718           WHERE  trst.tracking_id = tri.tracking_id
1719 	  AND    trst.tracking_id = p_tracking_id
1720           AND    trst.tracking_step_number > p_tracking_step_number
1721           FOR  UPDATE OF trst.action_days NOWAIT;
1722 
1723         l_start_dt DATE;
1724         l_p_action_dt DATE;
1725         l_action_days igs_tr_step.action_days%TYPE;
1726         l_next_start_dt_diff NUMBER;
1727         l_next_start_dt DATE;
1728 
1729         FUNCTION validate_date (
1730             p_date_type IN VARCHAR2,
1731             p_tracking_id IN igs_tr_step.tracking_id%TYPE,
1732             p_tracking_step_number IN igs_tr_step.tracking_step_number%TYPE,
1733             p_start_dt IN DATE,
1734             p_end_dt IN OUT NOCOPY DATE,
1735             p_action_days IN OUT NOCOPY igs_tr_step.action_days%TYPE,
1736             p_message_name OUT NOCOPY VARCHAR2
1737         )RETURN BOOLEAN IS
1738 
1739           l_clc_end_dt DATE;
1740 
1741         BEGIN
1742           IF p_start_dt > p_end_dt THEN
1743             p_message_name := 'IGS_TR_DT_CANNOT_LT_ST_DATE';
1744             RETURN FALSE;
1745           END IF;
1746 
1747           IF igs_tr_item_rec.business_days_ind = 'Y' THEN
1748             -- This code has been changed by Aiyer for the bug 2309359
1749 	    -- In function igs_tr_gen_001.trkp_clc_bus_dt the p_business_days parameter was being passed as 'N'.
1750 	    -- This was causing a numeric conversion error . This has been set to NVL(p_action_days,0) in this fix.
1751             l_clc_end_dt := igs_tr_gen_001.trkp_clc_bus_dt(p_end_dt, NVL(p_action_days,0));
1752 
1753             IF p_end_dt IS NOT NULL AND p_end_dt <> l_clc_end_dt THEN
1754               p_end_dt := l_clc_end_dt;
1755               RETURN FALSE;
1756             ELSE
1757               p_end_dt := l_clc_end_dt;
1758             END IF;
1759           END IF;
1760 
1761 	  -- Validate that the action days has not exceeded the maximum allowable.
1762 	  --kumma, 2719789, Increased the length of the constant from 999 to 9999
1763           IF (TRUNC(p_start_dt) - TRUNC(p_end_dt)) > 9999 THEN
1764             p_message_name := 'IGS_TR_MAXIMUM_DAYS_EXCEEDED';
1765             RETURN FALSE;
1766           ELSE
1767             IF p_date_type = 'A' THEN
1768               p_action_days := TRUNC(p_end_dt) - TRUNC(p_start_dt);
1769             END IF;
1770           END IF;
1771 
1772           RETURN TRUE;
1773         EXCEPTION
1774 
1775           WHEN OTHERS THEN
1776             fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1777             fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_upd_trst.process_date.validate_date'||'-'||SQLERRM);
1778             igs_ge_msg_stack.ADD;
1779             lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number)||','||TO_CHAR(p_action_days)
1780                               ||','||p_date_type||','||igs_ge_date.igschar (p_start_dt)
1781                               ||','||igs_ge_date.igschar (p_end_dt);
1782             fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1783             fnd_message.set_token('VALUE',lv_param_values);
1784             igs_ge_msg_stack.ADD;
1785             app_exception.raise_exception;
1786         END validate_date;
1787 
1788       BEGIN
1789         IF igs_tr_item_rec.sequence_ind = 'Y' THEN
1790           IF (p_tracking_step_number - 1) = 0  THEN
1791             l_start_dt := igs_tr_item_rec.start_dt;
1792           ELSE
1793             OPEN c_start_dt;
1794             FETCH c_start_dt INTO l_start_dt;
1795             CLOSE c_start_dt;
1796           END IF;
1797         ELSE
1798           l_start_dt := igs_tr_item_rec.start_dt;
1799         END IF;
1800 
1801         IF NOT (validate_date (p_date_type,
1802                                p_tracking_id,
1803                                p_tracking_step_number,
1804                                l_start_dt,
1805                                p_end_dt,
1806                                p_action_days,
1807                                p_message_name)) THEN
1808           RETURN FALSE;
1809         END IF;
1810 
1811         IF p_date_type = 'A' THEN
1812           l_next_start_dt_diff := TRUNC(p_end_dt) - TRUNC(igs_tr_step_rec.action_dt);
1813           l_next_start_dt := TRUNC(p_end_dt);
1814         ELSIF p_date_type = 'C' THEN
1815           l_next_start_dt_diff := TRUNC(p_end_dt) - TRUNC(igs_tr_step_rec.completion_dt);
1816           l_next_start_dt := TRUNC(p_end_dt);
1817         END IF;
1818 
1819         IF igs_tr_item_rec.sequence_ind = 'Y' THEN
1820 
1821           FOR l_upd_next_dt_rec IN c_upd_next_dt LOOP
1822 
1823             IF (l_upd_next_dt_rec.step_completion_ind = 'N' AND l_upd_next_dt_rec.by_pass_ind = 'N') THEN
1824 
1825               l_p_action_dt := l_next_start_dt + l_upd_next_dt_rec.action_days;
1826               IF NOT (validate_date ('A',
1827                                      l_upd_next_dt_rec.tracking_id,
1828                                      l_upd_next_dt_rec.tracking_step_number,
1829                                      l_next_start_dt,
1830                                      l_p_action_dt,
1831                                      l_action_days,
1832                                      p_message_name)) THEN
1833                 RETURN FALSE;
1834               END IF;
1835 
1836               -- Update the record with NOWAIT option
1837 
1838               IF p_date_type = 'C' THEN
1839                 l_action_days := l_upd_next_dt_rec.action_days;
1840               END IF;
1841 
1842               igs_tr_step_pkg.update_row(
1843                   x_rowid                => l_upd_next_dt_rec.row_id,
1844                   x_tracking_id          => l_upd_next_dt_rec.tracking_id,
1845                   x_tracking_step_id     => l_upd_next_dt_rec.tracking_step_id,
1846                   x_tracking_step_number => l_upd_next_dt_rec.tracking_step_number,
1847                   x_description          => l_upd_next_dt_rec.description,
1848                   x_s_tracking_step_type => l_upd_next_dt_rec.s_tracking_step_type,
1849                   x_completion_dt        => l_upd_next_dt_rec.completion_dt,
1850                   x_action_days          => l_action_days,
1851                   x_step_completion_ind  => l_upd_next_dt_rec.step_completion_ind,
1852                   x_by_pass_ind          => l_upd_next_dt_rec.by_pass_ind,
1853                   x_recipient_id         => l_upd_next_dt_rec.recipient_id,
1854                   x_mode                 => 'R',
1855                   x_step_group_id        => l_upd_next_dt_rec.step_group_id,
1856                   x_step_catalog_cd      => l_upd_next_dt_rec.step_catalog_cd,
1857                   x_publish_ind          => NVL(l_upd_next_dt_rec.publish_ind,'N')
1858                );
1859 
1860               l_next_start_dt_diff := TRUNC(l_p_action_dt) - TRUNC(l_upd_next_dt_rec.action_dt);
1861               l_next_start_dt := TRUNC(l_p_action_dt);
1862 
1863             ELSIF l_upd_next_dt_rec.step_completion_ind = 'Y' THEN
1864               l_next_start_dt_diff := 0;
1865               l_next_start_dt := TRUNC(l_upd_next_dt_rec.completion_dt);
1866 
1867             ELSIF l_upd_next_dt_rec.by_pass_ind = 'Y' THEN
1868               NULL;
1869             END IF;
1870 
1871           END LOOP;
1872         END IF;
1873 
1874         RETURN TRUE;
1875 
1876       EXCEPTION
1877         WHEN e_resource_busy_exception THEN
1878           p_message_name := 'IGS_TR_CANNOT_UPDATE_STEP';
1879           RETURN FALSE;
1880 
1881         WHEN OTHERS THEN
1882           fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
1883           fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_upd_trst.process_date'||'-'||SQLERRM);
1884           igs_ge_msg_stack.ADD;
1885           lv_param_values:= p_date_type||','||TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_number)||
1886                             ','||igs_ge_date.igschar (p_end_dt)||','||TO_CHAR(p_action_days);
1887           fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
1888           fnd_message.set_token('VALUE',lv_param_values);
1889           igs_ge_msg_stack.ADD;
1890           app_exception.raise_exception;
1891       END process_date;
1892 
1893     BEGIN
1894 
1895       -- Set the default message number
1896       p_message_name := NULL;
1897 
1898       -- Validate that p_tracking_step_id and p_s_tracking_step_type cannot both be null.
1899       IF ((p_tracking_step_id IS NULL) AND (p_s_tracking_step_type IS NULL)) THEN
1900         p_message_name := 'IGS_TR_STEP_TYPE_ID_NOT_NULL';
1901         RETURN FALSE;
1902       END IF;
1903 
1904       -- Manu Validate that the step being updated does not
1905       -- belong to an item that is complete
1906       OPEN c_tri_all;
1907       FETCH c_tri_all INTO igs_tr_item_rec;
1908 
1909       IF c_tri_all%NOTFOUND THEN
1910         CLOSE c_tri_all;
1911         p_message_name := 'IGS_TR_INVALID_ITEM_ID';
1912         RETURN FALSE;
1913 
1914       ELSE
1915         OPEN c_sys_trk_sts(igs_tr_item_rec.tracking_status);
1916         FETCH c_sys_trk_sts INTO l_sys_trk_sts;
1917         CLOSE c_sys_trk_sts;
1918 
1919         IF (l_sys_trk_sts <> 'ACTIVE') THEN
1920           p_message_name := 'IGS_TR_ST_UPD_CMPLT_ITM_NA';
1921           CLOSE c_tri_all;
1922           RETURN FALSE;
1923         END IF;
1924 
1925         CLOSE c_tri_all;
1926       END IF;
1927 
1928       -- Select the original fields of the tracking step record for UPDATE NOWWAIT.
1929       -- Select only the first record from this query if p_tracking_id is null and
1930       -- multiple steps having the same s_tracking_step_type exists,
1931       -- since we are only interested in the first one.
1932 
1933       OPEN c_update_trst;
1934       FETCH c_update_trst INTO igs_tr_step_rec ;
1935 
1936       IF (c_update_trst%NOTFOUND) THEN
1937         CLOSE c_update_trst;
1938         p_message_name := 'IGS_TR_INVALID_STEP_ID';
1939         RETURN FALSE;
1940       END IF;
1941 
1942       IF (p_step_completion_ind IS NOT NULL AND
1943           p_step_completion_ind <> igs_tr_step_rec.step_completion_ind) THEN
1944         l_field_mod := l_field_mod || 'S';
1945       END IF;
1946 
1947       IF (p_by_pass_ind IS NOT NULL AND
1948           p_by_pass_ind <> igs_tr_step_rec.by_pass_ind) THEN
1949         l_field_mod := l_field_mod || 'B';
1950       END IF;
1951 
1952       IF (igs_tr_item_rec.override_offset_clc_ind = 'N' AND
1953           p_action_dt IS NOT NULL AND
1954           p_action_dt <> igs_tr_step_rec.action_dt AND
1955           igs_tr_step_rec.step_completion_ind = 'N' AND
1956           igs_tr_step_rec.by_pass_ind = 'N') THEN
1957         IF (igs_tr_item_rec.sequence_ind = 'Y' AND
1958             NVL(INSTR(l_field_mod,'S'),0) = 0 AND
1959             NVL(INSTR(l_field_mod,'B'),0) = 0) OR
1960            (igs_tr_item_rec.sequence_ind = 'N') THEN
1961           l_field_mod := l_field_mod || 'A';
1962         END IF;
1963       END IF;
1964 
1965       IF (NVL(INSTR(l_field_mod,'S'),0) = 0 AND
1966           NVL(INSTR(l_field_mod,'B'),0) = 0) THEN
1967         IF (p_completion_dt IS NOT NULL AND
1968           igs_tr_step_rec.step_completion_ind = 'Y' AND
1969           p_completion_dt <> igs_tr_step_rec.completion_dt) THEN
1970           l_field_mod := l_field_mod || 'C';
1971         END IF;
1972       END IF;
1973 
1974       IF (NVL(INSTR(l_field_mod,'S'),0) = 0 AND
1975           NVL(INSTR(l_field_mod,'B'),0) = 0 AND
1976           igs_tr_step_rec.step_completion_ind = 'N' AND
1977           igs_tr_step_rec.by_pass_ind = 'N') OR
1978          NVL(INSTR(l_field_mod,'S'),0) > 0 OR
1979          NVL(INSTR(l_field_mod,'B'),0) > 0 THEN
1980         IF (p_recipient_id IS NOT NULL) THEN
1981           IF (igs_tr_step_rec.recipient_id IS NOT NULL AND
1982               p_recipient_id <> igs_tr_step_rec.recipient_id ) OR
1983              (igs_tr_step_rec.recipient_id IS NULL) THEN
1984             l_field_mod := l_field_mod || 'R';
1985           END IF;
1986         END IF;
1987       END IF;
1988 
1989       -- Validate that the step being updated does not modify
1990       -- step_completion_ind and by_pass_ind together to 'Y'
1991       IF ((p_step_completion_ind = 'Y') AND
1992           (p_by_pass_ind = 'Y')) THEN
1993         p_message_name := 'IGS_TR_BOTH_CMP_BYPAS_UPD_Y_NA';
1994         CLOSE c_update_trst;
1995         RETURN FALSE;
1996       END IF;
1997 
1998       IF (igs_tr_item_rec.sequence_ind = 'Y') THEN
1999         IF NVL(INSTR(l_field_mod,'S'),0) > 0 THEN
2000           IF p_step_completion_ind = 'Y' THEN
2001           -- Validate new value, on error return false
2002             IF trkp_prev_step_cmplt (
2003                    igs_tr_step_rec.tracking_id,
2004                    igs_tr_step_rec.tracking_step_number,
2005                    igs_tr_step_rec.step_group_id,
2006                    p_message_name) THEN
2007 
2008               igs_tr_step_rec.step_completion_ind := 'Y';
2009               igs_tr_step_rec.by_pass_ind := 'N';
2010 
2011               l_end_dt := NVL(p_completion_dt,SYSDATE);
2012               IF NOT (process_date (
2013                       'C',
2014                       igs_tr_step_rec.tracking_id,
2015                       igs_tr_step_rec.tracking_step_number,
2016                       l_end_dt,
2017                       l_action_days,
2018                       p_message_name)) THEN
2019                 CLOSE c_update_trst;
2020                 RETURN FALSE;
2021               END IF;
2022               igs_tr_step_rec.completion_dt := l_end_dt;
2023 
2024             ELSE
2025               CLOSE c_update_trst;
2026               RETURN FALSE;
2027             END IF;
2028 
2029           ELSIF p_step_completion_ind = 'N' THEN
2030             -- Validate new value, on error return false
2031             IF NOT (trkp_next_step_cmplt (
2032                    igs_tr_step_rec.tracking_id,
2033                    igs_tr_step_rec.tracking_step_number,
2034                    igs_tr_step_rec.step_group_id,
2035                    p_message_name)) THEN
2036 
2037               IF NVL(INSTR(l_field_mod,'C'),0) > 0 AND
2038                  p_completion_dt IS NOT NULL THEN
2039                 p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2040                 CLOSE c_update_trst;
2041                 RETURN FALSE;
2042               END IF;
2043 
2044               igs_tr_step_rec.step_completion_ind := 'N';
2045               igs_tr_step_rec.completion_dt := NULL;
2046               IF NVL(INSTR(l_field_mod,'A'),0) = 0 THEN
2047                 l_action_dt := NVL(p_action_dt,igs_tr_step_rec.action_dt);
2048                 l_field_mod := l_field_mod || 'A';
2049               END IF;
2050 
2051             ELSE
2052               CLOSE c_update_trst;
2053               RETURN FALSE;
2054             END IF;
2055           END IF;
2056 
2057         END IF;
2058 
2059         IF NVL(INSTR(l_field_mod,'B'),0) > 0 THEN
2060           IF p_by_pass_ind = 'Y' THEN
2061             -- Validate new value, on error return false
2062             IF NOT (trkp_next_grp_step_cmplt (
2063                    igs_tr_step_rec.tracking_id,
2064                    igs_tr_step_rec.tracking_step_number,
2065                    igs_tr_step_rec.step_group_id,
2066                    p_message_name)) THEN
2067 
2068               IF NVL(INSTR(l_field_mod,'C'),0) > 0 AND
2069                  p_completion_dt IS NOT NULL THEN
2070                 p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2071                 CLOSE c_update_trst;
2072                 RETURN FALSE;
2073               END IF;
2074 
2075               igs_tr_step_rec.step_completion_ind := 'N';
2076               igs_tr_step_rec.by_pass_ind := 'Y';
2077               igs_tr_step_rec.completion_dt := NULL;
2078               IF NVL(INSTR(l_field_mod,'A'),0) = 0 THEN
2079                 l_action_dt := NVL(p_action_dt,igs_tr_step_rec.action_dt);
2080                 l_field_mod := l_field_mod || 'A';
2081               END IF;
2082 
2083             ELSE
2084               CLOSE c_update_trst;
2085               RETURN FALSE;
2086             END IF;
2087 
2088           ELSIF p_by_pass_ind = 'N' THEN
2089             -- Validate new value, on error return false
2090             IF NOT (trkp_next_step_cmplt (
2091                    igs_tr_step_rec.tracking_id,
2092                    igs_tr_step_rec.tracking_step_number,
2093                    igs_tr_step_rec.step_group_id,
2094                    p_message_name)) THEN
2095               IF NVL(INSTR(l_field_mod,'C'),0) > 0 THEN
2096                 p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2097                 CLOSE c_update_trst;
2098                 RETURN FALSE;
2099               END IF;
2100 
2101               igs_tr_step_rec.by_pass_ind := 'N';
2102 
2103             ELSE
2104               CLOSE c_update_trst;
2105               RETURN FALSE;
2106             END IF;
2107           END IF;
2108 
2109         END IF;
2110 
2111         IF NVL(INSTR(l_field_mod,'A'),0) > 0 THEN
2112           -- Validate new value, on error return false
2113           l_end_dt := NVL(p_action_dt,l_action_dt);
2114           IF NOT (process_date (
2115                   'A',
2116                   igs_tr_step_rec.tracking_id,
2117                   igs_tr_step_rec.tracking_step_number,
2118                   l_end_dt,
2119                   l_action_days,
2120                   p_message_name)) THEN
2121             CLOSE c_update_trst;
2122             RETURN FALSE;
2123           END IF;
2124 
2125           igs_tr_step_rec.action_dt := l_end_dt;
2126           igs_tr_step_rec.action_days := l_action_days;
2127 
2128         END IF;
2129 
2130         IF NVL(INSTR(l_field_mod,'C'),0) > 0 THEN
2131           -- Validate new value, on error return false
2132 
2133           l_end_dt := NVL(p_completion_dt,SYSDATE);
2134           IF NOT (process_date (
2135                   'C',
2136                   igs_tr_step_rec.tracking_id,
2137                   igs_tr_step_rec.tracking_step_number,
2138                   l_end_dt,
2139                   l_action_days,
2140                   p_message_name)) THEN
2141             CLOSE c_update_trst;
2142             RETURN FALSE;
2143           END IF;
2144           igs_tr_step_rec.completion_dt := l_end_dt;
2145         END IF;
2146 
2147         IF NVL(INSTR(l_field_mod,'R'),0) > 0 THEN
2148           -- Validate new value, on error return false
2149 
2150           IF NOT (igs_co_val_oc.genp_val_prsn_id(p_recipient_id, p_message_name)) THEN
2151             CLOSE c_update_trst;
2152             RETURN FALSE;
2153           ELSE
2154             igs_tr_step_rec.recipient_id := p_recipient_id;
2155           END IF;
2156 
2157         END IF;
2158 
2159       ELSIF (igs_tr_item_rec.sequence_ind = 'N') THEN
2160 
2161         IF NVL(INSTR(l_field_mod,'S'),0) > 0 THEN
2162           IF p_step_completion_ind = 'Y' THEN
2163             -- Validate new value, on error return false
2164 
2165             igs_tr_step_rec.step_completion_ind := 'Y';
2166             igs_tr_step_rec.by_pass_ind := 'N';
2167 
2168             l_end_dt := NVL(p_completion_dt,SYSDATE);
2169             IF NOT (process_date (
2170                     'C',
2171                     igs_tr_step_rec.tracking_id,
2172                     igs_tr_step_rec.tracking_step_number,
2173                     l_end_dt,
2174                     l_action_days,
2175                     p_message_name)) THEN
2176               CLOSE c_update_trst;
2177               RETURN FALSE;
2178             END IF;
2179             igs_tr_step_rec.completion_dt := l_end_dt;
2180 
2181           ELSIF p_step_completion_ind = 'N' THEN
2182             -- Validate new value, on error return false
2183 
2184             IF NVL(INSTR(l_field_mod,'C'),0) > 0 AND
2185                p_completion_dt IS NOT NULL THEN
2186               p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2187               CLOSE c_update_trst;
2188               RETURN FALSE;
2189             END IF;
2190 
2191             igs_tr_step_rec.step_completion_ind := 'N';
2192             igs_tr_step_rec.completion_dt := NULL;
2193 
2194           END IF;
2195 
2196         END IF;
2197 
2198         IF NVL(INSTR(l_field_mod,'B'),0) > 0 THEN
2199           IF p_by_pass_ind = 'Y' THEN
2200             -- Validate new value, on error return false
2201 
2202             IF NVL(INSTR(l_field_mod,'C'),0) > 0 AND
2203                p_completion_dt IS NOT NULL THEN
2204               p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2205               CLOSE c_update_trst;
2206               RETURN FALSE;
2207             END IF;
2208 
2209             igs_tr_step_rec.step_completion_ind := 'N';
2210             igs_tr_step_rec.by_pass_ind := 'Y';
2211             igs_tr_step_rec.completion_dt := NULL;
2212 
2213           ELSIF p_by_pass_ind = 'N' THEN
2214             -- Validate new value, on error return false
2215 
2216             IF NVL(INSTR(l_field_mod,'C'),0) > 0 THEN
2217               p_message_name := 'IGS_TR_CANNOT_SET_CMP_DATE';
2218               CLOSE c_update_trst;
2219               RETURN FALSE;
2220             END IF;
2221 
2222             igs_tr_step_rec.by_pass_ind := 'N';
2223 
2224           END IF;
2225 
2226         END IF;
2227 
2228         IF NVL(INSTR(l_field_mod,'A'),0) > 0 THEN
2229           -- Validate new value, on error return false
2230 
2231           IF p_action_dt IS NOT NULL THEN
2232             l_end_dt := p_action_dt;
2233             IF NOT (process_date (
2234                     'A',
2235                     igs_tr_step_rec.tracking_id,
2236                     igs_tr_step_rec.tracking_step_number,
2237                     l_end_dt,
2238                     l_action_days,
2239                     p_message_name)) THEN
2240               CLOSE c_update_trst;
2241               RETURN FALSE;
2242             END IF;
2243             igs_tr_step_rec.action_dt := l_end_dt;
2244             igs_tr_step_rec.action_days := l_action_days;
2245           END IF;
2246         END IF;
2247 
2248         IF NVL(INSTR(l_field_mod,'C'),0) > 0 THEN
2249           -- Validate new value, on error return false
2250 
2251           l_end_dt := NVL(p_completion_dt,SYSDATE);
2252           IF NOT (process_date (
2253                   'C',
2254                   igs_tr_step_rec.tracking_id,
2255                   igs_tr_step_rec.tracking_step_number,
2256                   l_end_dt,
2257                   l_action_days,
2258                   p_message_name)) THEN
2259             CLOSE c_update_trst;
2260             RETURN FALSE;
2261           END IF;
2262           igs_tr_step_rec.completion_dt := l_end_dt;
2263         END IF;
2264 
2265         IF NVL(INSTR(l_field_mod,'R'),0) > 0 THEN
2266           -- Validate new value, on error return false
2267 
2268           IF NOT (igs_co_val_oc.genp_val_prsn_id(p_recipient_id, p_message_name)) THEN
2269             CLOSE c_update_trst;
2270             RETURN FALSE;
2271           ELSE
2272             igs_tr_step_rec.recipient_id := p_recipient_id;
2273           END IF;
2274         END IF;
2275 
2276       END IF;   -- End of sequential validation
2277 
2278       -- Update the record with NOWAIT option
2279 
2280       igs_tr_step_pkg.update_row(
2281             x_rowid                => igs_tr_step_rec.row_id,
2282             x_tracking_id          => igs_tr_step_rec.tracking_id,
2283             x_tracking_step_id     => igs_tr_step_rec.tracking_step_id,
2284             x_tracking_step_number => igs_tr_step_rec.tracking_step_number,
2285             x_description          => igs_tr_step_rec.description,
2286             x_s_tracking_step_type => igs_tr_step_rec.s_tracking_step_type,
2287             x_completion_dt        => igs_tr_step_rec.completion_dt,
2288             x_action_days          => igs_tr_step_rec.action_days,
2289             x_step_completion_ind  => igs_tr_step_rec.step_completion_ind,
2290             x_by_pass_ind          => igs_tr_step_rec.by_pass_ind,
2291             x_recipient_id         => igs_tr_step_rec.recipient_id,
2292             x_mode                 => 'R',
2293             x_step_group_id        => igs_tr_step_rec.step_group_id,
2294             x_step_catalog_cd      => igs_tr_step_rec.step_catalog_cd,
2295             x_publish_ind          => NVL(igs_tr_step_rec.publish_ind,'N')
2296        );
2297 
2298       CLOSE c_update_trst;
2299 
2300       --Added by Manu : The following check if the item should be marked as complete
2301       OPEN c_check_item_cmpltn;
2302       FETCH c_check_item_cmpltn INTO l_item_cmpl;
2303       IF c_check_item_cmpltn%NOTFOUND THEN
2304         -- The item should be marked complete since the steps are considered complete
2305 
2306         OPEN c_dflt_trk_sts;
2307         FETCH c_dflt_trk_sts INTO l_trk_sts;
2308         IF c_dflt_trk_sts%NOTFOUND THEN
2309           CLOSE c_dflt_trk_sts;
2310           CLOSE c_check_item_cmpltn;
2311           p_message_name := 'IGS_TR_DFLT_STATUS_NOT_DEFINED';
2312           RETURN FALSE;
2313         END IF;
2314         CLOSE c_dflt_trk_sts;
2315 
2316         igs_tr_item_pkg.update_row(
2317           x_mode                     =>  'R',
2318           x_rowid                    => igs_tr_item_rec.row_id,
2319           x_tracking_id              => igs_tr_item_rec.tracking_id,
2320           x_tracking_status          => l_trk_sts,
2321           x_tracking_type            => igs_tr_item_rec.tracking_type,
2322           x_source_person_id         => igs_tr_item_rec.source_person_id,
2323           x_start_dt                 => igs_tr_item_rec.start_dt,
2324           x_target_days              => igs_tr_item_rec.target_days,
2325           x_sequence_ind             => igs_tr_item_rec.sequence_ind,
2326           x_business_days_ind        => igs_tr_item_rec.business_days_ind,
2327           x_originator_person_id     => igs_tr_item_rec.originator_person_id,
2328           x_s_created_ind            => igs_tr_item_rec.s_created_ind,
2329           x_override_offset_clc_ind  => igs_tr_item_rec.override_offset_clc_ind,
2330           x_completion_due_dt        => igs_tr_item_rec.completion_due_dt,
2331           x_publish_ind              => igs_tr_item_rec.publish_ind
2332           );
2333 
2334       END IF;
2335       CLOSE c_check_item_cmpltn;
2336 
2337     EXCEPTION
2338       WHEN e_resource_busy_exception THEN
2339         p_message_name := 'IGS_TR_CANNOT_UPDATE_STEP';
2340         RETURN FALSE;
2341 
2342     END;
2343     RETURN TRUE;
2344 
2345   EXCEPTION
2346     WHEN OTHERS THEN
2347         fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
2348         fnd_message.set_token('NAME','IGS_TR_GEN_002.trkp_upd_trst'||'-'||SQLERRM);
2349         igs_ge_msg_stack.ADD;
2350         lv_param_values:= TO_CHAR(p_tracking_id) ||','||TO_CHAR(p_tracking_step_id)||','||p_s_tracking_step_type;
2351         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
2352         fnd_message.set_token('VALUE',lv_param_values);
2353         igs_ge_msg_stack.ADD;
2354         lv_param_values:= igs_ge_date.igschar (p_action_dt)||','||igs_ge_date.igschar (p_completion_dt);
2355         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
2356         fnd_message.set_token('VALUE',lv_param_values);
2357         igs_ge_msg_stack.ADD;
2358         lv_param_values:= p_step_completion_ind ||','||p_by_pass_ind ||','||TO_CHAR(p_recipient_id);
2359         fnd_message.set_name('IGS','IGS_GE_PARAMETERS');
2360         fnd_message.set_token('VALUE',lv_param_values);
2361         igs_ge_msg_stack.ADD;
2362         app_exception.raise_exception;
2363 
2364   END trkp_upd_trst;
2365 
2366   PROCEDURE sync_trk_type_grplmt ( p_tracking_type  IGS_TR_TYPE_STEP_V.tracking_type%TYPE, p_execute VARCHAR2  )  IS
2367 
2368   /***********************************************************************************************************
2369 
2370    Created By:        pradhakr
2371    Date Created By:   11-Feb-2002
2372    Purpose:     This procedure will synchronise the content of the table IGS_TR_STEP_GRP_LMT with the content
2373                 of IGS_TR_TYPE_STEP_V.
2374 	        1. If that step group being deleted in form IGSTR001 ( block tracking step) is the last one of its
2375 	           kind for a particular tracking id, the step group id will be deleted  from IGS_TR_TSTP_GRP_LMT
2376    	           else Step Group Limit will be decremented by 1.
2377                 2. Any new Step Group ID being created in the form IGSTR001 ( block tracking step) will also be created
2378    	           in the table IGS_TR_TSTP_GRP_LMT and the Step Group Limit would be defaulted to 1.
2379 
2380    Known limitations,enhancements,remarks:
2381    Change History
2382    Who        When        What
2383    ************************************************************************************************************/
2384 
2385    --ssawhney view reference changed to table
2386    -- Decrements a step group limit
2387     CURSOR c_decrement_step_grp_lmt IS
2388     SELECT  step_group_id
2389       FROM  igs_tr_tstp_grp_lmt
2390      WHERE  tracking_type = p_tracking_type
2391      MINUS
2392     SELECT  step_group_id
2393       FROM  igs_tr_type_step  tts
2394      WHERE  tracking_type = p_tracking_type
2395             AND  tts.step_group_id IS NOT NULL
2396             GROUP BY tts.step_group_id;
2397 
2398    --ssawhney view reference changed to table
2399    -- Insert a step group limit
2400    CURSOR c_insert_step_grp_lmt IS
2401    SELECT step_group_id
2402      FROM igs_tr_type_step tts
2403     WHERE tracking_type = p_tracking_type
2404 	  AND tts.step_group_id IS NOT NULL
2405           GROUP BY tts.step_group_id
2406     MINUS
2407    SELECT  step_group_id
2408      FROM  igs_tr_tstp_grp_lmt
2409     WHERE  tracking_type = p_tracking_type;
2410 
2411 
2412   -- Cursor to fetch the Rowid
2413   CURSOR c_rowid (p_tracking_type IGS_TR_TYPE_STEP_V.tracking_type%TYPE, p_step_group_id igs_tr_tstp_grp_lmt.step_group_id%TYPE)  IS
2414   SELECT ROWID
2415     FROM igs_tr_tstp_grp_lmt
2416    WHERE tracking_type = p_tracking_type
2417          AND step_group_id = p_step_group_id;
2418 
2419   --ssawhney view reference changed to table
2420   -- Cursor to get the count of step group id from tracking type step
2421   CURSOR c_type_step (p_tracking_type igs_tr_type_step_v.tracking_type%TYPE)   IS
2422   SELECT step_group_id, COUNT(*) step_group_count
2423     FROM igs_tr_type_step
2424    WHERE tracking_type = p_tracking_type
2425          GROUP BY step_group_id;
2426 
2427   -- Cursor to get the step group limit from igs_tr_tstp_grp_lmt table
2428   CURSOR c_grp_lmt (p_tracking_type igs_tr_tstp_grp_lmt.tracking_type%TYPE, p_step_group_id  igs_tr_tstp_grp_lmt.step_group_id%TYPE)  IS
2429   SELECT step_group_limit
2430     FROM igs_tr_tstp_grp_lmt
2431    WHERE tracking_type = p_tracking_type
2432          AND step_group_id = p_step_group_id;
2433 
2434   lv_rowid VARCHAR2(25);
2435   l_rowid  VARCHAR2(25);
2436   l_step_group_limit igs_tr_tstp_grp_lmt.step_group_limit%TYPE;
2437   l_grp_lmt igs_tr_tstp_grp_lmt.step_group_limit%TYPE;
2438 
2439   BEGIN
2440 
2441    -- Do not execute the code if the records are being updated in group limit block
2442 
2443    IF p_execute = 'N' THEN
2444       RETURN;
2445    END IF;
2446 
2447    -- Delete records from IGS_TR_TSTP_GRP_LMT table when a tracking_type and step_group_id combination exists in
2448    -- IGS_TR_TSTP_GRP_LMT but does not exist in view IGS_TR_TYPE_STEP_V
2449 
2450    FOR rec_decrement_step_grp_lmt IN c_decrement_step_grp_lmt LOOP
2451 
2452       OPEN c_rowid(p_tracking_type, rec_decrement_step_grp_lmt.step_group_id );
2453       FETCH c_rowid INTO l_rowid;
2454       CLOSE c_rowid;
2455 
2456       igs_tr_tstp_grp_lmt_pkg.delete_row (  X_ROWID => l_rowid   );
2457 
2458    END LOOP;
2459 
2460 
2461    -- Insert records into IGS_TR_TSTP_GRP_LMT when tracking_type and step_group_id combination
2462    -- exists in IGS_TR_TYPE_STEP_V but not in IGS_TR_TSTP_GRP_LMT.
2463    -- Default the value of Step_group_limit to 1.
2464 
2465    FOR rec_insert_step_grp_lmt IN c_insert_step_grp_lmt LOOP
2466        igs_tr_tstp_grp_lmt_pkg.insert_row (
2467                                              X_ROWID                => lv_rowid                                   ,
2468                                              X_TRACKING_TYPE        => p_tracking_type                            ,
2469                                              X_STEP_GROUP_ID        => rec_insert_step_grp_lmt.step_group_id      ,
2470                                              X_STEP_GROUP_LIMIT     => 1                                          ,
2471                                              X_MODE                 => 'R'
2472                                           );
2473    END LOOP;
2474 
2475    FOR rec_type_step IN c_type_step (p_tracking_type)
2476    LOOP
2477       OPEN c_grp_lmt (p_tracking_type, rec_type_step.step_group_id);
2478       FETCH c_grp_lmt INTO l_grp_lmt;
2479       CLOSE c_grp_lmt;
2480 
2481       OPEN c_rowid(p_tracking_type, rec_type_step.step_group_id );
2482       FETCH c_rowid INTO l_rowid;
2483       CLOSE c_rowid;
2484 
2485       -- Checking whether Group limit is greater than the count of Tracking step types for a group id
2486       IF l_grp_lmt > rec_type_step.step_group_count THEN
2487 	        igs_tr_tstp_grp_lmt_pkg.update_row (
2488                                              X_ROWID                => l_rowid                                  ,
2489                                              X_TRACKING_TYPE        => p_tracking_type                          ,
2490                                              X_STEP_GROUP_ID        => rec_type_step.step_group_id              ,
2491                                              X_STEP_GROUP_LIMIT     => rec_type_step.step_group_count           ,
2492                                              X_MODE                 => 'R'
2493                                           );
2494       END IF;
2495    END LOOP;
2496 
2497   EXCEPTION
2498     WHEN OTHERS THEN
2499       fnd_message.Set_Name('IGS', 'IGS_GE_UNHANDLED_EXCEPTION');
2500       fnd_message.set_token('NAME','IGS_TR_GEN_002.sync_trk_type_grplmt'||'-'||SQLERRM);
2501       IGS_GE_MSG_STACK.ADD;
2502       App_Exception.Raise_Exception;
2503 
2504   END sync_trk_type_grplmt;
2505 
2506 PROCEDURE sync_trk_item_grplmt ( p_tracking_id  IGS_TR_STEP_V.tracking_id %TYPE,
2507                                   p_execute VARCHAR2
2508                                 )
2509  IS
2510 
2511 /***********************************************************************************************************
2512 
2513  Created By:        Arun Iyer
2514 
2515  Date Created By:   11-Feb-2002
2516 
2517  Purpose:     This procedure would be called from the post_forms commit trigger of the Form IGSTR007 (Tracking Items ).
2518               This procedure will synchronise the content of the table IGS_TR_STEP_GRP_LMT with the content
2519               of IGS_TR_STEP_V.
2520               1. If that step group being deleted in form IGSTR007 ( block tracking step) is the last one of its
2521 	        kind for a particular tracking id, the step group id will be deleted  from IGS_TR_STEP_GRP_LMT
2522 
2523               2. Any new Step Group ID being created in the form IGSTR007 ( block tracking step) will also be created
2524 	        in the table IGS_TR_STEP_GRP_LMT and the Step Group Limit would be defaulted to 1.
2525 
2526               3. In case IGS_TR_STEP_GRP_LMT.STEP_GROUP_LIMIT is greater than the count of step_group_id's for tracking_id and step_group_id
2527                 combination in IGS_TR_STEP_V view then set it equal to the lower value (i.e count of step_group_id's in the IGS_TR_STEP_V).
2528 
2529 
2530   Known limitations,enhancements,remarks:
2531 
2532   Change History
2533 
2534   Who        When        What
2535   ************************************************************************************************************/
2536 
2537 
2538 
2539  -- Fetch all the distinct step group id's for the given tracking id which are there in the table IGS_TR_STEP_GRP_LMT and not  in the view IGS_TR_STEP_V
2540  -- IF such records are found then delete them from the table igs_tr_step_grp_lmt
2541  -- ssawhney view reference changed to table
2542  CURSOR c_decrement_step_grp_lmt
2543  IS
2544        SELECT
2545                step_group_id
2546        FROM
2547               igs_tr_step_grp_lmt
2548        WHERE
2549               tracking_id = p_tracking_id
2550        MINUS
2551        SELECT
2552                step_group_id
2553        FROM
2554               igs_tr_step sv
2555        WHERE
2556               tracking_id = p_tracking_id
2557        AND
2558               sv.step_group_id IS NOT NULL
2559        GROUP BY
2560                sv.step_group_id;
2561 
2562 
2563  --  Fetch all the distinct step group id's for the given tracking id which are there in IGS_TR_STEP and not in the table IGS_TR_STEP_GRP_LMT
2564  --  IF such records are found then insert them from the table igs_tr_step_grp_lmt with a default group_limit of 1.
2565  --  ssawhney view reference changed to table
2566  CURSOR c_insert_step_grp_lmt
2567  IS
2568        SELECT
2569                step_group_id
2570        FROM
2571               igs_tr_step sv
2572        WHERE
2573               tracking_id = p_tracking_id
2574        AND
2575               sv.step_group_id IS NOT NULL
2576        GROUP BY
2577                sv.step_group_id
2578        MINUS
2579        SELECT
2580                step_group_id
2581        FROM
2582               igs_tr_step_grp_lmt
2583        WHERE
2584               tracking_id = p_tracking_id;
2585 
2586 
2587   -- Cursor to fetch the Rowid from the igs_tr_step_grp_lmt table for a tracking_id, step_group_id combination
2588 
2589   CURSOR c_rowid ( p_tracking_id   IGS_TR_STEP_GRP_LMT.TRACKING_ID%TYPE ,
2590                    p_step_group_id IGS_TR_STEP_GRP_LMT.STEP_GROUP_ID%TYPE
2591 		 )
2592   IS
2593   SELECT
2594            ROWID
2595   FROM
2596            igs_tr_step_grp_lmt
2597   WHERE
2598            tracking_id   = p_tracking_id
2599   AND
2600            step_group_id = p_step_group_id;
2601 
2602 
2603   -- Cursor to get the count of step_group_id's for a tracking item step
2604   -- ssawhney view reference changed to table
2605   CURSOR c_item_step ( p_tracking_id IGS_TR_STEP_V.TRACKING_ID%TYPE )
2606   IS
2607   SELECT
2608            step_group_id,
2609            COUNT(step_group_id) step_group_count
2610   FROM
2611            igs_tr_step
2612   WHERE
2613            tracking_id = p_tracking_id
2614   AND
2615            step_group_id IS NOT NULL
2616   GROUP BY
2617            step_group_id;
2618 
2619 
2620   -- Cursor to get the step group limit from igs_tr_step_grp_lmt table for a combination of tracking_id and step_group_id
2621 
2622   CURSOR  c_grp_lmt (p_tracking_id    igs_tr_step_grp_lmt.tracking_id%TYPE,
2623                      p_step_group_id  igs_tr_step_grp_lmt.step_group_id%TYPE)
2624   IS
2625   SELECT
2626           step_group_limit
2627   FROM
2628           igs_tr_step_grp_lmt
2629   WHERE
2630           tracking_id = p_tracking_id
2631   AND
2632           step_group_id = p_step_group_id;
2633 
2634 
2635  lv_rowid               VARCHAR2(25);
2636  ln_step_group_limit    igs_tr_step_grp_lmt.step_group_limit%TYPE;
2637  ln_grp_lmt             igs_tr_step_grp_lmt.step_group_limit%TYPE;
2638 
2639  BEGIN
2640 
2641   /************************************ Validation 1 ***********************************************************/
2642 
2643    -- Do not execute the code if the records are being updated in group limit block
2644    IF p_execute = 'N' THEN
2645       RETURN;
2646    END IF;
2647 
2648 
2649   /************************************ Validation 2 ***********************************************************/
2650    -- Fetch all the distinct step group id's for the given tracking id which are there in the table IGS_TR_STEP_GRP_LMT
2651    -- and not  in the view IGS_TR_STEP_V.
2652    -- IF such records are found then delete them from the table igs_tr_step_grp_lmt
2653 
2654    FOR rec_decrement_step_grp_lmt IN c_decrement_step_grp_lmt LOOP
2655      OPEN c_rowid(p_tracking_id, rec_decrement_step_grp_lmt.step_group_id );
2656      FETCH c_rowid INTO lv_rowid;
2657      CLOSE c_rowid;
2658      igs_tr_step_grp_lmt_pkg.delete_row ( X_ROWID => lv_rowid );
2659    END LOOP;
2660 
2661 
2662 
2663   /************************************* Validation 3 ***********************************************************/
2664    -- Insert records into IGS_TR_STEP_GRP_LMT when tracking_id and step_group_id combination exists in IGS_TR_STEP_V
2665    -- but not in IGS_TR_STEP_GRP_LMT.
2666    -- Default the value of Step_group_limit to 1.
2667 
2668    FOR rec_insert_step_grp_lmt IN c_insert_step_grp_lmt LOOP
2669        igs_tr_step_grp_lmt_pkg.insert_row (
2670                                              X_ROWID                => lv_rowid                                   ,
2671                                              X_TRACKING_ID          => p_tracking_id                              ,
2672                                              X_STEP_GROUP_ID        => rec_insert_step_grp_lmt.step_group_id      ,
2673                                              X_STEP_GROUP_LIMIT     => 1                                          ,
2674                                              X_MODE                 => 'R'
2675                                           );
2676    END LOOP;
2677 
2678 
2679   /*************************************** Validation 4 ***********************************************************/
2680    -- Check the step group limit for a combination of Tracking_Id and Step_group_id in the table IGS_TR_STEP_GRP_LMT
2681    -- and the view IGS_TR_STEP_V.
2682    -- In case IGS_TR_STEP_GRP_LMT.STEP_GROUP_LIMIT is greater than the count of step_group_id's for tracking_id and step_group_id
2683    -- combination in IGS_TR_STEP_V view then set it equal to the count of step_group_id's in the IGS_TR_STEP_V.
2684 
2685    FOR rec_item_step IN c_item_step (p_tracking_id)
2686    LOOP
2687      OPEN c_grp_lmt (p_tracking_id, rec_item_step.step_group_id);
2688      FETCH c_grp_lmt INTO ln_grp_lmt;
2689      CLOSE c_grp_lmt;
2690 
2691      OPEN c_rowid(p_tracking_id, rec_item_step.step_group_id );
2692      FETCH c_rowid INTO lv_rowid;
2693      CLOSE c_rowid;
2694 
2695      -- Check whether Step Group limit is greater than the count of Tracking item steps for a step group id and tracking_id combination
2696      -- then set the step group limit equal to the count of step group id's in the igs)tr)step_v view for a step group id and tracking_id combination.
2697 
2698      IF ln_grp_lmt > rec_item_step.step_group_count THEN
2699        igs_tr_step_grp_lmt_pkg.update_row (
2700                                              X_ROWID                => lv_rowid                                  ,
2701                                              X_TRACKING_ID          => p_tracking_id                            ,
2702                                              X_STEP_GROUP_ID        => rec_item_step.step_group_id              ,
2703                                              X_STEP_GROUP_LIMIT     => rec_item_step.step_group_count           ,
2704                                              X_MODE                 => 'R'
2705                                           );
2706      END IF;
2707    END LOOP;
2708 
2709   EXCEPTION
2710     WHEN OTHERS THEN
2711       fnd_message.Set_Name('IGS','IGS_GE_UNHANDLED_EXCEPTION');
2712       fnd_message.set_token('NAME','IGS_TR_GEN_002.sync_trk_item_grplmt'||'-'||SQLERRM);
2713       IGS_GE_MSG_STACK.ADD;
2714       App_Exception.Raise_Exception;
2715 
2716 END sync_trk_item_grplmt;
2717 
2718 
2719 FUNCTION validate_completion_status ( p_tracking_id     IN IGS_TR_STEP_V.TRACKING_ID%TYPE,
2720                                       p_tracking_status IN IGS_TR_ITEM_V.TRACKING_STATUS%TYPE,
2721 				      p_sequence_ind      IN IGS_TR_ITEM_V.SEQUENCE_IND%TYPE,
2722                                       p_message_name OUT NOCOPY VARCHAR2
2723                                      )
2724 RETURN BOOLEAN
2725 IS
2726 /***********************************************************************************************************
2727 
2728 Created By:        Arun Iyer
2729 
2730 Date Created By:   13-Feb-2002
2731 
2732 Purpose:      This procedure would be called from the post forms commit trigger of the form IGSTR007 (Tracking Items)
2733 
2734               1. IF the user has checked the sequential flag (value = Y' ) for the current tracking id then it would
2735 	         checks whether all the previous steps have been completed or not. In case they have not been completed
2736 	         it suitable raises an error.
2737 	      2. If in the form the tracking status has been set to COMPLETE then this procedure validate whether
2738 	         the tracking status changed to COMPLETE is correct or not.
2739 		 In case it is incorrect then a suitable error message is returned back to the calling form
2740 
2741 Known limitations,enhancements,remarks:
2742 
2743 Change History
2744 
2745 Who        When        What
2746 ************************************************************************************************************/
2747 
2748 -- ssawhney view reference changed to table
2749 CURSOR  c_tracking_step
2750 IS
2751 SELECT
2752        tracking_id,
2753        tracking_step_number,
2754        step_group_id
2755 FROM
2756        igs_tr_step
2757 WHERE
2758        tracking_id = p_tracking_id
2759      AND step_completion_ind = 'Y';
2760 
2761 -- ssawhney view reference changed to table
2762 CURSOR
2763          c_check_item_cmpltn
2764  IS
2765           SELECT
2766                    DISTINCT TO_NUMBER('1'),
2767 		   1
2768           FROM
2769                    igs_tr_step trst
2770           WHERE
2771                    trst.tracking_id = p_tracking_id
2772           AND
2773                    trst.step_group_id IS NULL
2774           AND
2775                    trst.step_completion_ind = 'N'
2776           AND
2777                    trst.by_pass_ind = 'N'
2778           UNION
2779 	  (
2780 	   SELECT tab.step_group_id , tab.count_step
2781 	   FROM (
2782 		  SELECT
2783 			   DISTINCT trst.step_group_id step_group_id,
2784 			   COUNT(*) count_step
2785 		  FROM
2786 			   igs_tr_step trst
2787 		  WHERE
2788 			   trst.tracking_id = p_tracking_id
2789 		  AND
2790 			   trst.step_group_id IS NOT NULL
2791 		  AND
2792 			   (trst.step_completion_ind = 'Y'
2793 		  OR
2794 			   trst.by_pass_ind = 'Y')
2795 		  GROUP BY
2796 			   trst.step_group_id
2797 			--   trst.step_completion_ind
2798 		  MINUS
2799 		  SELECT
2800 			  DISTINCT trgl.step_group_id step_group_id,
2801 				  step_group_limit count_step
2802 		  FROM
2803 			  igs_tr_step_grp_lmt trgl
2804 		  WHERE
2805 			  trgl.tracking_id = p_tracking_id
2806                 ) tab,
2807 		igs_tr_step_grp_lmt trg
2808 	   WHERE tab.step_group_id = trg.step_group_id
2809 	   AND
2810 	         trg.tracking_id = p_tracking_id
2811 	   AND
2812 	         tab.count_step < trg.step_group_limit
2813          );
2814 
2815 
2816   rec_check_item_cmpltn c_check_item_cmpltn%ROWTYPE;
2817 
2818 BEGIN
2819 
2820  /*******************************************   Validation 1 ************************************************/
2821   -- IF the Sequence_ind check box is checked then check if all the previous steps have been completed
2822 
2823   IF p_sequence_ind = 'Y' THEN
2824     FOR rec_tracking_step IN c_tracking_step LOOP
2825 
2826       IF  NOT trkp_prev_step_cmplt (
2827                                       rec_tracking_step.tracking_id,
2828                                       rec_tracking_step.tracking_step_number,
2829                                       rec_tracking_step.step_group_id,
2830                                       p_message_name
2831 			            ) THEN
2832          RETURN (FALSE);
2833       END IF;
2834     END LOOP;
2835   END IF;
2836 
2837  /*******************************************   Validation 2 ************************************************/
2838   -- Validate whether the tracking status changed to COMPLETE is correct or not.
2839 
2840   IF p_tracking_status = 'COMPLETE' THEN
2841     OPEN  c_check_item_cmpltn;
2842     FETCH c_check_item_cmpltn INTO rec_check_item_cmpltn ;
2843     IF (C_CHECK_ITEM_CMPLTN%FOUND) THEN
2844 	  CLOSE c_check_item_cmpltn;
2845       p_message_name := 'IGS_TR_ITST_NOT_COMPLETE';
2846       RETURN (FALSE);
2847     END IF;
2848     CLOSE c_check_item_cmpltn;
2849   END IF;
2850 
2851   RETURN (TRUE);
2852 
2853  EXCEPTION
2854     WHEN OTHERS THEN
2855       fnd_message.set_name('IGS','IGS_GE_UNHANDLED_EXP');
2856       fnd_message.set_token('NAME','IGS_TR_GEN_002.validate_completion_status'||'-'||SQLERRM);
2857       igs_ge_msg_stack.ADD;
2858       app_exception.raise_exception;
2859 
2860 END validate_completion_status;
2861 
2862 END igs_tr_gen_002;