DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_RE_SPRVSR_LGCY_PUB

Source


1 PACKAGE BODY igs_re_sprvsr_lgcy_pub AS
2 /* $Header: IGSRE19B.pls 120.4 2006/02/15 01:45:32 bdeviset noship $ */
3 
4 /*------------------------------------------------------------------------------+
5  |  Copyright (c) 1994, 1996 Oracle Corp. Redwood Shores, California, USA       |
6  |                            All rights reserved.                              |
7  +==============================================================================+
8  |                                                                              |
9  | DESCRIPTION                                                                  |
10  |      PL/SQL body for package: igs_re_sprvsr_lgcy_pub                         |
11  |                                                                              |
12  | NOTES : Research Supervisor Legacy API. This API imports supervisor          |
13  |         information against the specified program attempt / candidature.     |
14  |         Created as part of Enrollment Legacy build. Bug# 2661533             |
15  |                                                                              |
16  | HISTORY                                                                      |
17  | Who      When           What                                                 |
18  |                                                                              |
19  +==============================================================================+
20  |Nalin Kumar   28-Jan-2003  Modified create_sprvsr.c_repl_person_dtls cursor to fetch sequence_number by comparing person_id; |
21  |                           Previously it was fetching replaced_sequence_number by comparing replaced_person_id;              |
22  |                           This is to fix bug# 2725852.                                                                      |
23  *==============================================================================*/
24 
25   g_pkg_name  CONSTANT VARCHAR2(30) := 'IGS_RE_SPRVSR_LGCY_PUB';
26 
27   FUNCTION validate_parameters
28   (
29     p_sprvsr_dtls_rec IN sprvsr_dtls_rec_type
30   ) RETURN VARCHAR2 AS
31 
32  /**********************************************************************************************
33   Created By      : pradhakr
34   Date Created By : 14-Nov-02
35   Purpose         :  This function is used to validate the input parameters.
36   Known limitations,enhancements,remarks:
37   Change History
38   Who     When       What
39  ***********************************************************************************************/
40    l_msg_count      NUMBER;
41    l_msg_data       VARCHAR2(2000);
42    l_sprvsr_status  VARCHAR2(10) := 'VALID';
43 
44  BEGIN
45 
46     -- Check whether the passed person number is null or not.
47     IF p_sprvsr_dtls_rec.ca_person_number IS NULL OR p_sprvsr_dtls_rec.person_number IS NULL THEN
48       FND_MESSAGE.SET_NAME('IGS','IGS_EN_PER_NUM_NULL');
49       FND_MSG_PUB.Add;
50       l_sprvsr_status := 'INVALID';
51     END IF;
52 
53     -- Check whether the user has passed program code or not.
54     IF p_sprvsr_dtls_rec.program_cd IS NULL THEN
55        FND_MESSAGE.SET_NAME('IGS','IGS_EN_PRGM_CD_NULL');
56        FND_MSG_PUB.Add;
57        l_sprvsr_status := 'INVALID';
58     END IF;
59 
60     -- Check whether the start date is null or not.
61     IF p_sprvsr_dtls_rec.start_dt IS NULL THEN
62        FND_MESSAGE.SET_NAME('IGS','IGS_PS_STARDT_NOT_NULL');
63        FND_MSG_PUB.Add;
64        l_sprvsr_status := 'INVALID';
65     END IF;
66 
67     -- Check whether the research supervisor type is null or not
68     IF p_sprvsr_dtls_rec.research_supervisor_type IS NULL THEN
69        FND_MESSAGE.SET_NAME('IGS','IGS_RE_SPRVSR_TYP_NULL');
70        FND_MSG_PUB.Add;
71        l_sprvsr_status := 'INVALID';
72     ELSE
73       BEGIN
74 
75         -- If research supervisor is specified then validate it by calling the check constraints. Incase if there is
76         -- any error it will log an error message "IGS_GE_INVALID_VALUE", which doesn't give much info. to the user.
77         -- So we delete that message and add a meaningful message to the stack.
78 
79         igs_re_sprvsr_pkg.check_constraints ('RESEARCH_SUPERVISOR_TYPE', p_sprvsr_dtls_rec.research_supervisor_type);
80 
81       EXCEPTION
82          WHEN OTHERS THEN
83            FND_MSG_PUB.COUNT_AND_GET( p_count          => l_msg_count,
84                                       p_data           => l_msg_data);
85 
86            -- Delete the message 'IGS_GE_INVALID_VALUE'
87            FND_MSG_PUB.DELETE_MSG (l_msg_count);
88 
89            -- set the customized message
90            FND_MESSAGE.Set_Name('IGS','IGS_RE_SPRVSR_TYPE_VAL');
91            FND_MSG_PUB.Add;
92            l_sprvsr_status := 'INVALID';
93        END;
94     END IF;
95 
96 
97     IF p_sprvsr_dtls_rec.supervision_percentage IS NOT NULL THEN
98       BEGIN
99         igs_re_sprvsr_pkg.check_constraints ('SUPERVISION_PERCENTAGE', p_sprvsr_dtls_rec.supervision_percentage);
100       EXCEPTION
101         WHEN OTHERS THEN
102           FND_MSG_PUB.COUNT_AND_GET( p_count          => l_msg_count,
103                                      p_data           => l_msg_data);
104 
105           FND_MSG_PUB.DELETE_MSG (l_msg_count);
106           FND_MESSAGE.Set_Name('IGS','IGS_RE_SPRVSN_PERC_INVALID_VAL');
107           FND_MSG_PUB.Add;
108           l_sprvsr_status := 'INVALID';
109       END;
110     END IF;
111 
112 
113     IF p_sprvsr_dtls_rec.funding_percentage IS NOT NULL THEN
114       BEGIN
115          igs_re_sprvsr_pkg.check_constraints ('FUNDING_PERCENTAGE', p_sprvsr_dtls_rec.funding_percentage);
116       EXCEPTION
117          WHEN OTHERS THEN
118            FND_MSG_PUB.COUNT_AND_GET( p_count          => l_msg_count,
119                                       p_data           => l_msg_data);
120 
121            FND_MSG_PUB.DELETE_MSG (l_msg_count);
122            FND_MESSAGE.Set_Name('IGS','IGS_RE_FUND_PERC_INVALID_VAL');
123            FND_MSG_PUB.Add;
124            l_sprvsr_status := 'INVALID';
125       END;
126     END IF;
127 
128 
129     IF p_sprvsr_dtls_rec.org_unit_cd IS NOT NULL THEN
130       BEGIN
131          igs_re_sprvsr_pkg.check_constraints ('ORG_UNIT_CD', p_sprvsr_dtls_rec.org_unit_cd);
132       EXCEPTION
133          WHEN OTHERS THEN
134            FND_MSG_PUB.COUNT_AND_GET( p_count          => l_msg_count,
135                                       p_data           => l_msg_data);
136            FND_MSG_PUB.DELETE_MSG (l_msg_count);
137            FND_MESSAGE.Set_Name('IGS','IGS_FI_INVALID_ORG_UNIT_CD');
138            FND_MESSAGE.SET_TOKEN('ORG_CD',p_sprvsr_dtls_rec.org_unit_cd);
139            FND_MSG_PUB.Add;
140            l_sprvsr_status := 'INVALID';
141       END;
142     END IF;
143 
144     RETURN l_sprvsr_status;
145 
146  END validate_parameters;
147 
148 
149  FUNCTION validate_sprvsr
150  (
151    p_person_id          IN  igs_re_sprvsr.person_id%TYPE,
152    p_sprvsr_dtls_rec    IN  sprvsr_dtls_rec_type,
153    p_ca_person_id       IN  igs_re_sprvsr.ca_person_id%TYPE,
154    p_ca_sequence_number IN  igs_re_sprvsr.ca_sequence_number%TYPE,
155    p_ou_start_dt        IN  igs_re_sprvsr.ou_start_dt%TYPE
156  ) RETURN VARCHAR2 AS
157 
158  /**********************************************************************************************
159   Created By      : pradhakr
160   Date Created By : 14-Nov-02
161   Purpose         :  This function is used to validate the business logic.
162   Known limitations,enhancements,remarks:
163   Change History
164   Who         When          What
165   bdeviset    27-Jan-2006   Modified cursor c_date_ovrlp.Used the call igs_en_gen_003.get_staff_ind
166                             and removed cursor c_staff_ind for bug# 4995230
167   bdeviset    13-Feb-2006   REplaced cursor c_meaning with fnd_message.set and get and using the cursor c_org_unit_exists
168                             instead of literal when no where clause exists.Bug# 5034696
169  ***********************************************************************************************/
170 
171 
172 
173   -- Cursor to get the sequence number of the person
174   CURSOR c_person_dtls ( l_person_id igs_re_sprvsr.person_id%TYPE, l_ca_person_id igs_re_sprvsr.ca_person_id%TYPE,
175                          l_ca_sequence_number igs_re_sprvsr.ca_sequence_number%TYPE ) IS
176     SELECT sequence_number
177     FROM   igs_re_sprvsr
178     WHERE  person_id = l_person_id
179     AND    ca_person_id = l_ca_person_id
180     AND    ca_sequence_number = l_ca_sequence_number;
181 
182   -- Cursor to get the replaced sequence number of the person
183   CURSOR c_repl_person_dtls ( l_repl_person_id igs_re_sprvsr.replaced_person_id%TYPE ) IS
184     SELECT  replaced_sequence_number
185     FROM    igs_re_sprvsr
186     WHERE   replaced_person_id = l_repl_person_id;
187 
188   CURSOR c_date_ovrlp (l_sequence_number IN NUMBER ) IS
189     SELECT 'x'
190     FROM igs_re_sprvsr rsup, igs_pe_person_base_v pdv
191     WHERE rsup.ca_person_id = p_ca_person_id
192     AND rsup.ca_sequence_number = p_ca_sequence_number
193     AND rsup.person_id = p_person_id
194     AND rsup.sequence_number = l_sequence_number
195     AND (rsup.end_dt IS NULL OR rsup.end_dt > p_sprvsr_dtls_rec.start_dt)
196     AND rsup.person_id = pdv.person_id;
197 
198   CURSOR c_org_unit_exists (cp_org_unit_cd igs_or_unit.org_unit_cd%TYPE) IS
199     SELECT 'X'
200     FROM igs_or_unit
201     WHERE org_unit_cd = cp_org_unit_cd;
202 
203   TYPE c_ref_cur IS REF CURSOR;
204 
205  l_staff_member_ind   igs_pe_person.staff_member_ind%TYPE;
206  l_message_name       VARCHAR2(30) DEFAULT NULL;
207  l_result             BOOLEAN;
208  l_where_clause       VARCHAR2(450);
209  c_org_cur            c_ref_cur ;
210  curr_stat            VARCHAR2(500);
211  l_rec_found          varchar2(1);
212  l_ca_person_id       igs_re_sprvsr.ca_person_id%TYPE;
213  l_legacy             VARCHAR2(1)  DEFAULT 'Y';
214  l_sprvsr_status      VARCHAR2(10) DEFAULT 'VALID';
215  l_sequence_number     igs_re_sprvsr.sequence_number%TYPE;
216  l_replaced_person_id  igs_re_sprvsr.replaced_person_id%TYPE;
217  l_replaced_sequence_number igs_re_sprvsr.replaced_sequence_number%TYPE;
218  l_date_ovrlp         c_date_ovrlp%ROWTYPE;
219  l_message_text       fnd_new_messages.message_text%TYPE;
220 
221  BEGIN
222 
223   l_staff_member_ind := igs_en_gen_003.get_staff_ind(p_person_id) ;
224 
225    -- Call to check all funding related validations.
226    l_result :=  igs_re_val_rsup.resp_val_rsup_fund (
227                      p_person_id ,
228                      p_sprvsr_dtls_rec.org_unit_cd ,
229                      p_ou_start_dt ,
230                      p_sprvsr_dtls_rec.funding_percentage ,
231                      l_staff_member_ind,
232                      l_legacy,
233                      l_message_name
234                    );
235 
236    IF l_message_name IS NOT NULL THEN
237       l_sprvsr_status := 'INVALID';
238       l_message_name := NULL;
239    END IF;
240 
241    -- Check for Oraganisation Unit Code when the person is a staff member.
242    IF l_staff_member_ind = 'Y' THEN
243       l_result := igs_re_val_rsup.resp_val_rsup_ou (
244                     p_person_id ,
245                     p_sprvsr_dtls_rec.org_unit_cd ,
246                     p_ou_start_dt,
247                     l_staff_member_ind ,
248                     l_legacy,
249                     l_message_name
250                   );
251 
252       IF l_message_name IS NOT NULL THEN
253          l_sprvsr_status := 'INVALID';
254          l_message_name := NULL;
255       END IF;
256 
257    END IF;
258 
259    IF p_sprvsr_dtls_rec.end_dt IS NOT NULL THEN
260       OPEN c_person_dtls(p_person_id, p_ca_person_id, p_ca_sequence_number);
261       FETCH c_person_dtls INTO l_sequence_number;
262       CLOSE c_person_dtls;
263 
264       -- Check whether Supervision end date must be earlier than the start date of replacement supervisor.
265       l_result := igs_re_val_rsup.resp_val_rsup_end_dt (
266                      p_ca_person_id ,
267                      p_ca_sequence_number ,
268                      p_person_id ,
269                      l_sequence_number  ,
270                      p_sprvsr_dtls_rec.start_dt,
271                      p_sprvsr_dtls_rec.end_dt ,
272                      l_legacy,
273                      l_message_name
274                    );
275 
276       IF l_message_name IS NOT NULL THEN
277          l_sprvsr_status := 'INVALID';
278          l_message_name := NULL;
279       END IF;
280 
281       -- Check whether there is any overlap of date.
282       OPEN c_date_ovrlp(l_sequence_number);
283       FETCH c_date_ovrlp INTO l_date_ovrlp;
284       IF c_date_ovrlp%FOUND THEN
285          FND_MESSAGE.SET_NAME('IGS', 'IGS_RE_END_DT_CANT_GE_ST_DT');
286          FND_MSG_PUB.Add;
287       END IF;
288       CLOSE c_date_ovrlp;
289 
290    END IF;
291 
292 
293     IF p_sprvsr_dtls_rec.replaced_person_number IS NOT NULL THEN
294 
295        l_replaced_person_id := Igs_Ge_Gen_003.Get_Person_id (p_sprvsr_dtls_rec.replaced_person_number);
296 
297        OPEN c_repl_person_dtls(l_replaced_person_id);
298        FETCH c_repl_person_dtls INTO l_replaced_sequence_number;
299        CLOSE c_repl_person_dtls;
300 
301        -- The call to the function resp_val_rsup_repl does the following validations
302        -- A supervisor cannot replace themselves.
303        -- A supervisor can only replace the latest instance of another supervisor
304        -- A replaced supervisor must have been ended.
305        -- A replacement supervisor cannot overlap the replaced supervisor
306 
307         l_result := igs_re_val_rsup.resp_val_rsup_repl(
308                      p_ca_person_id ,
309                      p_ca_sequence_number ,
310                      p_person_id ,
311                      p_sprvsr_dtls_rec.start_dt,
312                      l_replaced_person_id ,
313                      l_replaced_sequence_number ,
314                      l_legacy,
315                      l_message_name
316                    );
317 
318        IF l_message_name IS NOT NULL THEN
319           l_sprvsr_status := 'INVALID';
320           l_message_name := NULL;
321        END IF;
322 
323     END IF;
324 
325    -- Organisation unit filter integration validation. Call to find the filter condition
326    -- modified the code for bug 5028599
327    IF p_sprvsr_dtls_rec.org_unit_cd IS NOT NULL THEN
328 
329       l_rec_found := NULL;
330       igs_or_gen_012_pkg.get_where_clause_api('RES_SPRVSR_LGCY', l_where_clause);
331       IF l_where_clause IS NOT NULL THEN
332          l_where_clause := CONCAT(' AND ',l_where_clause);
333 
334          curr_stat := 'SELECT ''x'' FROM igs_or_unit WHERE org_unit_cd = :1 '||l_where_clause;
335          OPEN c_org_cur FOR curr_stat USING p_sprvsr_dtls_rec.org_unit_cd,'RES_SPRVSR_LGCY';
336          FETCH c_org_cur INTO l_rec_found;
337          CLOSE c_org_cur;
338 
339       ELSE
340 
341         OPEN c_org_unit_exists (p_sprvsr_dtls_rec.org_unit_cd);
342         FETCH c_org_unit_exists INTO l_rec_found;
343         CLOSE c_org_unit_exists;
344 
345       END IF;
346 
347 
348 
349       IF l_rec_found IS NULL THEN
350 
351          FND_MESSAGE.SET_NAME('IGS','IGS_RE_ORG_UNIT_CD');
352          l_message_text := FND_MESSAGE.GET();
353 
354          FND_MESSAGE.SET_NAME('IGS','IGS_EN_INV');
355          FND_MESSAGE.SET_TOKEN('PARAM',l_message_text);
356          FND_MSG_PUB.Add;
357          l_sprvsr_status := 'INVALID';
358       END IF;
359 
360    END IF;
361 
362    -- Check whether research student is the same as the supervisor
363    IF NOT igs_re_val_rsup.resp_val_rsup_person( p_ca_person_id, p_person_id, l_legacy , l_message_name ) THEN
364       IF l_message_name IS NOT NULL THEN
365          FND_MESSAGE.SET_NAME('IGS',l_message_name);
366          FND_MSG_PUB.Add;
367          l_sprvsr_status := 'INVALID';
368 	 l_message_name := NULL;
369       END IF;
370    END IF;
371 
372   -- Validate research supervisor overlaps.
373    IF igs_re_val_rsup.resp_val_rsup_ovrlp( p_ca_person_id, p_ca_sequence_number, p_person_id, l_sequence_number,
374                                            p_sprvsr_dtls_rec.start_dt, p_sprvsr_dtls_rec.end_dt, l_legacy, l_message_name ) THEN
375      IF l_message_name IS NOT NULL THEN
376         l_sprvsr_status := 'INVALID';
377      END IF;
378    END IF;
379 
380 
381    RETURN l_sprvsr_status;
382 
383  END validate_sprvsr;
384 
385 
386 
387  FUNCTION validate_sprvsr_db_cons
388  (
389    p_person_id          IN   igs_re_sprvsr.person_id%TYPE,
390    p_sprvsr_dtls_rec    IN   sprvsr_dtls_rec_type,
391    p_ca_person_id       IN   igs_re_sprvsr.ca_person_id%TYPE,
392    p_ca_sequence_number IN   igs_re_sprvsr.ca_sequence_number%TYPE,
393    p_sprvsr_status      OUT  NOCOPY VARCHAR2
394  ) RETURN VARCHAR2 AS
395 
396  /**********************************************************************************************
397   Created By      : pradhakr
398   Date Created By : 14-Nov-02
399   Purpose         :  This function is used to validate the database constraints.
400   Known limitations,enhancements,remarks:
401   Change History
402   Who     When       What
403  ***********************************************************************************************/
404 
405   CURSOR c_person_dtls ( l_person_id igs_re_sprvsr.person_id%TYPE, l_ca_person_id igs_re_sprvsr.ca_person_id%TYPE,
406                          l_ca_sequence_number igs_re_sprvsr.ca_sequence_number%TYPE ) IS
407     SELECT sequence_number, start_dt
408     FROM   igs_re_sprvsr
409     WHERE  person_id = l_person_id
410     AND    ca_person_id = l_ca_person_id
411     AND    ca_sequence_number = l_ca_sequence_number;
412 
413   l_person_dtls         c_person_dtls%ROWTYPE;
414   l_ret_value           VARCHAR2(1) := 'S';
415   l_ca_person_id        igs_re_sprvsr.ca_person_id%TYPE;
416   l_ca_sequence_number  igs_re_sprvsr.ca_sequence_number%TYPE;
417   l_result              BOOLEAN;
418 
419  BEGIN
420 
421    p_sprvsr_status := 'VALID';
422 
423    OPEN c_person_dtls(p_person_id, p_ca_person_id, p_ca_sequence_number);
424    FETCH c_person_dtls INTO l_person_dtls;
425    CLOSE c_person_dtls;
426 
427    -- Check for Unique Key validation. If validation fails, stop the processing and return back
428    -- to the calling procedure.
429 
430   IF igs_re_sprvsr_pkg.get_uk1_for_validation ( p_ca_person_id, p_ca_sequence_number,
431                                                  p_person_id, p_sprvsr_dtls_rec.start_dt ) THEN
432       FND_MESSAGE.Set_Name('IGS','IGS_RE_SPRVSR_EXTS');
433       FND_MSG_PUB.Add;
434       p_sprvsr_status := 'INVALID';
435       l_ret_value := 'W';
436       RETURN l_ret_value;
437    END IF;
438 
439    IF NOT igs_re_candidature_pkg.get_pk_for_validation (  p_ca_person_id, p_ca_sequence_number ) THEN
440       FND_MESSAGE.Set_Name('IGS','IGS_RE_CAND_NOT_EXTS');
441       FND_MSG_PUB.Add;
442       p_sprvsr_status := 'INVALID';
443       l_ret_value := 'E';
444    END IF;
445 
446    IF  NOT igs_re_sprvsr_type_pkg.get_pk_for_validation (p_sprvsr_dtls_rec.research_supervisor_type) THEN
447       FND_MESSAGE.Set_Name('IGS','IGS_RE_SPRVSR_TYP_NT_EXTS');
448       fnd_message.set_token('TYPE',p_sprvsr_dtls_rec.research_supervisor_type);
449       FND_MSG_PUB.Add;
450       p_sprvsr_status := 'INVALID';
451       l_ret_value := 'E';
452    END IF;
453 
454    RETURN l_ret_value;
455 
456  END validate_sprvsr_db_cons;
457 
458 
459  PROCEDURE create_sprvsr
460  (
461     p_api_version             IN           NUMBER,
462     p_init_msg_list           IN           VARCHAR2,
463     p_commit                  IN           VARCHAR2,
464     p_validation_level        IN           NUMBER,
465     p_sprvsr_dtls_rec         IN           sprvsr_dtls_rec_type ,
466     x_return_status           OUT  NOCOPY  VARCHAR2,
467     x_msg_count               OUT  NOCOPY  NUMBER,
468     x_msg_data                OUT  NOCOPY  VARCHAR2
469  ) AS
470 
471  /**********************************************************************************************
472   Created By      : pradhakr
473   Date Created By : 14-Nov-02
474   Purpose         : This procedure imports the legacy data inot OSS tables. Before inserting it
475                     validates the input parameters, checks for Data Integrity Constraints and
476                     business validations.
477   Known limitations,enhancements,remarks:
478   Change History
479   Who           When         What
480   Nalin Kumar   28-Jan-2003  Modified create_sprvsr.c_repl_person_dtls cursor to fetch sequence_number by comparing person_id;
481                              Previously it was fetching replaced_sequence_number by comparing replaced_person_id;
482                              This is to fix bug# 2725852.
483  ***********************************************************************************************/
484 
485   CURSOR c_next_val IS
486     SELECT igs_re_sprvsr_seq_num_s.nextval
487     FROM dual;
488 
489   CURSOR c_repl_person_dtls (l_repl_person_id igs_re_sprvsr.replaced_person_id%TYPE) IS
490     SELECT sequence_number
491     FROM igs_re_sprvsr
492     WHERE person_id = l_repl_person_id;
493 
494 
495   l_ca_sequence_number          igs_re_sprvsr.ca_sequence_number%TYPE;
496   l_ca_person_id                igs_re_sprvsr.ca_person_id%TYPE;
497   l_person_id                   igs_re_sprvsr.person_id%TYPE;
498   l_replaced_person_id          igs_re_sprvsr.replaced_person_id%TYPE;
499   l_ou_start_dt                 DATE;
500   l_result                      BOOLEAN;
501   l_api_name                    CONSTANT    VARCHAR2(30) := 'Create_Sprvsr';
502   l_api_version                 CONSTANT    NUMBER       := 1.0;
503   p_sprvsr_status               VARCHAR2(10) DEFAULT 'VALID';
504   l_sequence_number             NUMBER;
505   l_replaced_sequence_number    igs_re_sprvsr.replaced_sequence_number%TYPE;
506 
507   l_creation_date               DATE;
508   l_last_update_date            DATE;
509   l_created_by                  NUMBER;
510   l_last_updated_by             NUMBER;
511   l_last_update_login           NUMBER;
512   l_ret_val                     VARCHAR2(1) DEFAULT 'S';
513 
514  BEGIN
515 
516     -- Create a savepoint.
517     SAVEPOINT    create_re_sprvsr_pub;
518 
519     -- Check for the Compatible API call
520     IF NOT FND_API.Compatible_Api_Call(  l_api_version,
521                                          p_api_version,
522                                          l_api_name,
523                                          g_pkg_name) THEN
524 
525       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
526     END IF;
527 
528     -- If the calling program has passed the parameter for initializing the message list
529     IF FND_API.To_Boolean(p_init_msg_list) THEN
530        FND_MSG_PUB.Initialize;
531     END IF;
532 
533     -- Set the return status to success
534     x_return_status := FND_API.G_RET_STS_SUCCESS;
535 
536     -- Validate input paramaters
537     p_sprvsr_status := validate_parameters(p_sprvsr_dtls_rec);
538 
539     IF p_sprvsr_status = 'INVALID' THEN
540        x_return_status := FND_API.G_RET_STS_ERROR;
541     END IF;
542 
543     IF p_sprvsr_status = 'VALID' THEN
544        -- Check whether ca_person_number is valid or not.
545        l_ca_person_id := Igs_Ge_Gen_003.Get_Person_id (p_sprvsr_dtls_rec.ca_person_number);
546 
547        IF l_ca_person_id IS NULL THEN
548           -- Add exception to stack
549           FND_MESSAGE.Set_Name('IGS','IGS_GE_INVALID_PERSON_NUMBER');
550           FND_MSG_PUB.Add;
551           p_sprvsr_status := 'INVALID';
552        END IF;
553 
554        -- Check whether ca_person_number is valid or not.
555        l_person_id := Igs_Ge_Gen_003.Get_Person_id (p_sprvsr_dtls_rec.person_number);
556 
557        IF l_person_id IS NULL THEN
558           FND_MESSAGE.Set_Name('IGS','IGS_GE_INVALID_PERSON_NUMBER');
559           FND_MSG_PUB.Add;
560           p_sprvsr_status := 'INVALID';
561        END IF;
562 
563        --  Check whether candidacy details exists, if it exists then get the ca_sequence_number
564        l_result := igs_re_val_the.get_candidacy_dtls (
565                      l_ca_person_id,
566                      p_sprvsr_dtls_rec.program_cd,
567                      l_ca_sequence_number
568                    );
569 
570   	IF NOT l_result THEN
571            FND_MESSAGE.Set_Name('IGS','IGS_RE_CAND_NOT_EXTS');
572            FND_MSG_PUB.Add;
573            p_sprvsr_status := 'INVALID';
574         END IF;
575 
576         -- Get the start date of the organisation
577         l_result :=  igs_re_val_rsup.get_org_unit_dtls (
578                        p_sprvsr_dtls_rec.org_unit_cd ,
579                        l_ou_start_dt
580                      );
581 
582         IF p_sprvsr_status = 'INVALID' THEN
583            x_return_status := FND_API.G_RET_STS_ERROR;
584         END IF;
585 
586     END IF;
587 
588 
589     IF p_sprvsr_status = 'VALID' THEN
590        -- Validate all db constraints
591        l_ret_val := validate_sprvsr_db_cons ( l_person_id, p_sprvsr_dtls_rec, l_ca_person_id, l_ca_sequence_number, p_sprvsr_status );
592 
593        IF l_ret_val = 'E' THEN
594           x_return_status := FND_API.G_RET_STS_ERROR;
595        ELSIF l_ret_val = 'W' THEN
596           x_return_status := 'W';
597        ELSIF l_ret_val = 'S' THEN
598          x_return_status := FND_API.G_RET_STS_SUCCESS;
599        END IF;
600     END IF;
601 
602 
603     IF p_sprvsr_status = 'VALID' THEN
604 
605        IF p_sprvsr_dtls_rec.replaced_person_number IS NOT NULL THEN
606           l_replaced_person_id := Igs_Ge_Gen_003.Get_Person_id (p_sprvsr_dtls_rec.replaced_person_number);
607           OPEN c_repl_person_dtls(l_replaced_person_id);
608           FETCH c_repl_person_dtls INTO l_replaced_sequence_number;
609           CLOSE c_repl_person_dtls;
610        END IF;
611 
612        -- Validate the business rules
613        p_sprvsr_status := validate_sprvsr ( l_person_id, p_sprvsr_dtls_rec, l_ca_person_id, l_ca_sequence_number , l_ou_start_dt);
614 
615        IF p_sprvsr_status = 'INVALID' THEN
616           x_return_status := FND_API.G_RET_STS_ERROR;
617        END IF;
618 
619     END IF;
620 
621 
622 
623     IF p_sprvsr_status = 'VALID' THEN
624        x_return_status := FND_API.G_RET_STS_SUCCESS;
625 
626        l_creation_date := SYSDATE;
627        l_created_by := FND_GLOBAL.USER_ID;
628        l_last_update_date := SYSDATE;
629        l_last_updated_by := FND_GLOBAL.USER_ID;
630        l_last_update_login :=FND_GLOBAL.LOGIN_ID;
631 
632        IF l_created_by IS NULL THEN
633           l_created_by := -1;
634        END IF;
635 
636        IF l_last_updated_by IS NULL THEN
637           l_last_updated_by := -1;
638        END IF;
639 
640        IF l_last_update_login IS NULL THEN
641           l_last_update_login := -1;
642        END IF;
643 
644        BEGIN
645 
646          OPEN c_next_val;
647          FETCH c_next_val INTO l_sequence_number;
648          CLOSE c_next_val;
649 
650          -- Insert the record in IGS_RE_SPRVSR table
651          INSERT INTO igs_re_sprvsr (
652             ca_person_id,
653             ca_sequence_number,
654             person_id,
655             sequence_number,
656             start_dt,
657             end_dt,
658             research_supervisor_type,
659             supervisor_profession,
660             supervision_percentage,
661             funding_percentage,
662             org_unit_cd,
663             ou_start_dt,
664             replaced_person_id,
665             replaced_sequence_number,
666             comments,
667             created_by,
668             creation_date,
669             last_updated_by,
670             last_update_date,
671             last_update_login )
672          VALUES (
673             l_ca_person_id,
674             l_ca_sequence_number,
675             l_person_id,
676             l_sequence_number,
677             p_sprvsr_dtls_rec.start_dt,
678             p_sprvsr_dtls_rec.end_dt,
679             p_sprvsr_dtls_rec.research_supervisor_type,
680             p_sprvsr_dtls_rec.supervisor_profession,
681             p_sprvsr_dtls_rec.supervision_percentage,
682             p_sprvsr_dtls_rec.funding_percentage,
683             p_sprvsr_dtls_rec.org_unit_cd,
684             l_ou_start_dt,
685             l_replaced_person_id,
686             l_replaced_sequence_number,
687             p_sprvsr_dtls_rec.comments,
688             l_created_by,
689             l_creation_date,
690             l_last_updated_by,
691             l_last_update_date,
692             l_last_update_login
693           );
694 
695        EXCEPTION
696           WHEN OTHERS THEN
697              x_return_status := FND_API.G_RET_STS_ERROR;
698              p_sprvsr_status := 'INVALID';
699              ROLLBACK TO create_re_sprvsr_pub;
700        END;
701 
702        -- Commit the record which is inserted in the table.
703        IF (FND_API.To_Boolean(p_commit) and p_sprvsr_status = 'VALID') THEN
704           COMMIT WORK;
705        END IF;
706 
707     END IF;
708 
709     FND_MSG_PUB.COUNT_AND_GET( p_count   => x_msg_count,
710                                p_data    => x_msg_data);
711 
712  EXCEPTION
713    WHEN FND_API.G_EXC_ERROR THEN
714       ROLLBACK TO create_re_sprvsr_pub;
715       x_return_status := FND_API.G_RET_STS_ERROR;
716       FND_MSG_PUB.COUNT_AND_GET( p_count          => x_msg_count,
717                                 p_data           => x_msg_data);
718 
719    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
720       ROLLBACK TO create_re_sprvsr_pub;
721       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
722       FND_MSG_PUB.COUNT_AND_GET( p_count          => x_msg_count,
723                                  p_data           => x_msg_data);
724 
725    WHEN OTHERS THEN
726       ROLLBACK TO create_re_sprvsr_pub;
727       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
728       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
729          FND_MSG_PUB.Add_Exc_Msg(g_pkg_name,
730                                  l_api_name);
731       END IF;
732       FND_MSG_PUB.COUNT_AND_GET( p_count          => x_msg_count,
733                                  p_data           => x_msg_data);
734 
735   END create_sprvsr;
736 
737 END igs_re_sprvsr_lgcy_pub;