DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_JOB_UTILS

Source


1 PACKAGE BODY pa_job_utils AS
2 -- $Header: PAJBUTLB.pls 120.5.12010000.4 2009/04/21 05:50:33 snizam ship $
3 
4 
5 --------------------------------------------------------------------------------------------------------------
6 -- This procedure prints the text which is being passed as the input
7 -- Input parameters
8 -- Parameters                   Type           Required  Description
9 --  p_log_msg                   VARCHAR2        YES      It stores text which you want to print on screen
10 -- Out parameters
11 ----------------------------------------------------------------------------------------------------------------
12 P_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N'); /* Added Debug Profile Option  variable initialization for bug#2674619 */
13 -- Added Debug Profile Option  variable initialization for bug#5094780
14 G_HR_CROSS_BUSINESS_GROUP varchar2(1) :=  fnd_profile.value('HR_CROSS_BUSINESS_GROUP');
15 G_PA_PROJ_RES_JOB_GRP NUMBER := to_number(fnd_profile.value('PA_PROJ_RES_JOB_GRP'));
16 
17 PROCEDURE log_message (p_log_msg IN VARCHAR2)
18 IS
19 BEGIN
20     --dbms_output.put_line('log: ' || p_log_msg);
21     IF P_DEBUG_MODE = 'Y' THEN /* Added Debug Profile Option Check for bug#2674619 */
22        pa_debug.write('log_message: ' || 'HR_UPDATE_API', 'log: ' || p_log_msg, 3);
23     END IF;
24     NULL;
25 END log_message;
26 
27 --
28 --  PROCEDURE
29 --              Check_JobName_Or_Id
30 --  PURPOSE
31 --              This procedure does the following
32 --              If Job name is passed converts it to the id
33 --		If Job Id is passed,
34 --		based on the check_id_flag validates it
35 --  HISTORY
36 --   27-JUN-2000      P.Bandla       Created
37 --   11-APR-2001      virangan       Added LOV fixes
38 --   27-APR-2001      virangan       Removed LOV fixes
39 --
40  PROCEDURE Check_JobName_Or_Id(
41 			 p_job_id		IN	NUMBER,
42 			 p_job_name		IN	VARCHAR2,
43 			 p_check_id_flag	IN	VARCHAR2,
44 			 p_job_group_id         IN      NUMBER := NULL, -- 5130421
45 			 x_job_id		OUT	NOCOPY NUMBER, --File.Sql.39 bug 4440895
46 			 x_return_status	OUT	NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
47 			 x_error_message_code	OUT	NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
48  BEGIN
49 	IF p_job_id IS NOT NULL AND p_job_id<>FND_API.G_MISS_NUM THEN
50 		IF p_check_id_flag = 'Y' THEN
51 			 SELECT job_id
52 			 INTO   x_job_id
53 		         FROM   per_jobs
54 		         WHERE  job_id = p_job_id
55                          AND job_group_id = nvl(p_job_group_id, job_group_id) -- 5130421
56                          ;
57 	        ELSE
58 		         x_job_id := p_job_id;
59 	        END IF;
60         ELSE
61 	        SELECT job_id
62 	        INTO   x_job_id
63 	        FROM   per_jobs
64 	        WHERE  name = p_job_name
65                 AND job_group_id = nvl(p_job_group_id, job_group_id) -- 5130421
66                 ;
67         END IF;
68         x_return_status := FND_API.G_RET_STS_SUCCESS;
69 
70  EXCEPTION
71         WHEN NO_DATA_FOUND THEN
72           x_return_status := FND_API.G_RET_STS_ERROR;
73           x_error_message_code := 'PA_JOB_INVALID_AMBIGUOUS';
74         WHEN TOO_MANY_ROWS THEN
75           x_return_status := FND_API.G_RET_STS_ERROR;
76           x_error_message_code := 'PA_JOB_INVALID_AMBIGUOUS';
77         WHEN OTHERS THEN
78         --PA_Error_Utils.Set_Error_Stack
79         -- (`pa_job_utils.check_jobname_or_id');
80            -- This sets the current program unit name in the
81            -- error stack. Helpful in Debugging
82          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
83 
84  END Check_JobName_Or_id;
85 
86 --
87 --  PROCEDURE
88 --              Check_JobLevel
89 --  PURPOSE
90 --              This procedure validates the job level.
91 --  HISTORY
92 --   04-AUG-2000      P.Bandla	 Created
93 --   24-DEC-2001      A.Abdullah Modified to reflect the change in job
94 --                               level implementation
95 --                               It checks from pa_setup_job_levels_v if
96 --                               the job level exists
97 --
98 
99  PROCEDURE Check_JobLevel(
100 			 p_level		IN	NUMBER,
101 			 x_valid		OUT	NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
102 			 x_return_status	OUT	NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
103 			 x_error_message_code	OUT	NOCOPY VARCHAR2)  --File.Sql.39 bug 4440895
104  IS
105 	l_level NUMBER;
106 
107         CURSOR joblevels IS
108             select job_level
109             from PA_SETUP_JOB_LEVELS_V
110             where job_level = p_level;
111 
112  BEGIN
113         OPEN joblevels;
114         FETCH joblevels into l_level;
115 
116         IF l_level IS NOT NULL  THEN
117            x_valid := 'Y' ;
118            x_return_status := FND_API.G_RET_STS_SUCCESS;
119         ELSE
120            x_valid := 'N';
121            x_return_status := FND_API.G_RET_STS_ERROR;
122            x_error_message_code := 'PA_JOBLEVEL_INVALID_AMBIGUOUS';
123         END IF;
124 
125         CLOSE joblevels;
126 
127  EXCEPTION
128         WHEN NO_DATA_FOUND THEN
129           x_return_status := FND_API.G_RET_STS_ERROR;
130           x_error_message_code := 'PA_JOBLEVEL_INVALID_AMBIGUOUS';
131         WHEN OTHERS THEN
132         --PA_Error_Utils.Set_Error_Stack
133         -- (`pa_job_utils.check_jobname_or_id');
134            -- This sets the current program unit name in the
135            -- error stack. Helpful in Debugging
136          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
137 
138  END Check_JobLevel;
139 
140 --  PROCEDURE
141 --              Check_Job_GroupName_Or_Id
142 --  PURPOSE
143 --              This procedure does the following
144 --              If job group name is passed converts it to the id
145 --              If job group Id is passed,
146 --              based on the check_id_flag validates it
147 --  HISTORY
148 --   21-NOV-2000      P. Bandla       Created
149 --   11-APR-2001      virangan        Added LOV fixes
150 --
151  PROCEDURE Check_Job_GroupName_Or_Id(
152 			p_job_group_id		IN	NUMBER,
153 			p_job_group_name	IN	VARCHAR2,
154 			p_check_id_flag		IN	VARCHAR2,
155 			x_job_group_id		OUT	NOCOPY NUMBER, --File.Sql.39 bug 4440895
156 			x_return_status		OUT	NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
157 			x_error_message_code	OUT	NOCOPY VARCHAR2 )  --File.Sql.39 bug 4440895
158  IS
159 
160       l_current_id NUMBER := NULL;
161       l_num_ids NUMBER := 0;
162       l_id_found_flag VARCHAR(1) := 'N';
163 
164       CURSOR j_ids IS
165           SELECT job_group_id
166           FROM per_job_groups
167           WHERE displayed_name = p_job_group_name;
168  BEGIN
169 
170 	IF p_job_group_id IS NOT NULL AND p_job_group_id<>FND_API.G_MISS_NUM THEN
171 		IF p_check_id_flag = 'Y' THEN
172 			SELECT job_group_id
173 		        INTO   x_job_group_id
174 		        FROM   per_job_groups
175 		        WHERE  job_group_id = p_job_group_id;
176 	        ELSIF p_check_id_flag = 'N' THEN
177 			x_job_group_id := p_job_group_id;
178                 ELSIF (p_check_id_flag = 'A') THEN
179                      IF (p_job_group_name IS NULL) THEN
180                         -- Return a null ID since the name is null.
181                         x_job_group_id := NULL;
182                      ELSE
183                         -- Find the ID which matches the Name passed
184                         OPEN j_ids;
185                         LOOP
186                            FETCH j_ids INTO l_current_id;
187                            EXIT WHEN j_ids%NOTFOUND;
188                            IF (l_current_id = p_job_group_id) THEN
189                               l_id_found_flag := 'Y';
190                               x_job_group_id := p_job_group_id;
191                            END IF;
192                         END LOOP;
193                         l_num_ids := j_ids%ROWCOUNT;
194                         CLOSE j_ids;
195 
196                         IF (l_num_ids = 0) THEN
197                            -- No IDs for name
198                            RAISE NO_DATA_FOUND;
199                         ELSIF (l_num_ids = 1) THEN
200                            -- Since there is only one ID for the name use it.
201                            x_job_group_id := l_current_id;
202                         ELSIF (l_id_found_flag = 'N') THEN
203                            -- More than one ID for the name and none of the IDs matched
204                            -- the ID passed in.
205                            RAISE TOO_MANY_ROWS;
206                         END IF;
207                      END IF;
208 		END IF;
209         ELSE
210             IF (p_job_group_name IS NOT NULL) THEN
211 		SELECT job_group_id
212 	        INTO   x_job_group_id
213 	        FROM   per_job_groups
214 	        WHERE  displayed_name = p_job_group_name;
215             ELSE
216                x_job_group_id := NULL;
217             END IF;
218         END IF;
219 
220         x_return_status := FND_API.G_RET_STS_SUCCESS;
221 
222  EXCEPTION
223         WHEN NO_DATA_FOUND THEN
224                 x_job_group_id := NULL;
225 	        x_return_status := FND_API.G_RET_STS_ERROR;
226 		x_error_message_code := 'PA_JOBGROUP_INVALID';
227         WHEN TOO_MANY_ROWS THEN
228                 x_job_group_id := NULL;
229 	        x_return_status := FND_API.G_RET_STS_ERROR;
230 		x_error_message_code := 'PA_JOBGROUP_INVALID';
231         WHEN OTHERS THEN
232                 x_job_group_id := NULL;
233 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
234 
235  END Check_Job_GroupName_Or_Id;
236 
237 --
238 --
239 -- Procedure
240 -- created by Ranga Iyengar  : 05-DEC-2000
241 -- This Api validates the given job_id and job_group_id is a part of
242 -- the pa_job_relationships entity.the IN parameters will be job_id and
243 -- job_group_id
244 --
245 --
246 PROCEDURE validate_job_relationship
247             ( p_job_id             IN  per_jobs.job_id%type
248              ,p_job_group_id       IN  per_jobs.job_group_id%type
249              ,x_return_status      OUT NOCOPY varchar2 --File.Sql.39 bug 4440895
250              ,x_error_message_code OUT NOCOPY varchar2 --File.Sql.39 bug 4440895
251             ) IS
252 
253         v_return_status        VARCHAR2(2000);
254         v_error_message_code   VARCHAR2(2000):='PA_INVALID_JOB_RELATION';
255                                    --'This Job Not  Belongs to Valid Job Group';
256         v_job_group_id         per_jobs.job_group_id%type ;
257 
258 
259 BEGIN
260         -- Initialize the Error stack
261         PA_DEBUG.init_err_stack('PA_JOB_UTILS.validate_job_relationship');
262         x_return_status := FND_API.G_RET_STS_SUCCESS;
263         SELECT job_group_id
264         INTO   v_job_group_id
265         FROM   per_jobs
266         WHERE  job_id = p_job_id
267          AND   job_group_id = p_job_group_id;
268 
269         If v_job_group_id is NOT NULL then
270            v_return_status := FND_API.G_RET_STS_SUCCESS;
271         End if;
272 
273         -- reset the Error stack
274         PA_DEBUG.Reset_Err_Stack;
275 EXCEPTION
276 
277         WHEN NO_DATA_FOUND THEN
278              x_return_status := FND_API.G_RET_STS_ERROR;
279              x_error_message_code  := v_error_message_code;
280 
281         WHEN TOO_MANY_ROWS THEN
282              x_return_status := FND_API.G_RET_STS_SUCCESS;
283 
284         WHEN OTHERS THEN
285           -- Set the exception Message and the stack
286           FND_MSG_PUB.add_exc_msg(p_pkg_name => 'PA_JOB_UTILS.validate_job_relationship'
287                                   ,p_procedure_name => PA_DEBUG.G_Err_Stack );
288           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
289           raise;
290 END validate_job_relationship;
291 
292 
293 --------------------------------------------------------------------------------
294 -- Function:    Get_Proj_Res_Job_Group
295 -- Description: This function returns the project resource job group in the system
296 --------------------------------------------------------------------------------
297 Function Get_Proj_Res_Job_Group(p_job_id IN NUMBER)
298 RETURN NUMBER
299 IS
300 l_prjg_id           NUMBER;
301 l_business_group_id NUMBER;
302 BEGIN
303 
304 /*Commented for 5094780
305 IF fnd_profile.value('HR_CROSS_BUSINESS_GROUP') = 'Y'
306   THEN
307      log_message('CBGA Profile is Y');
308      RETURN to_number(fnd_profile.value('PA_PROJ_RES_JOB_GRP'));
309  else */
310 -- changed for 5094780
311   IF G_HR_CROSS_BUSINESS_GROUP = 'Y'
312   THEN
313      log_message('CBGA Profile is Y');
314      RETURN G_PA_PROJ_RES_JOB_GRP;
315   ELSE
316      log_message('CBGA Profile is N');
317 
318      -- if the p_job_id parameter is null, we get the business group id
319      -- from the profile option: this method is also called from the
320      -- parvw031.sql view
321      IF p_job_id is null THEN
322 
323         log_message('Get business group id from profile option');
324         l_business_group_id := fnd_profile.value('PER_BUSINESS_GROUP_ID');
325 
326      ELSE
327 
328         log_message('Get business group id using job id');
329         -- Get the business group of the job id
330         SELECT BUSINESS_GROUP_ID
331         INTO l_business_group_id
332         FROM PER_JOBS
333         WHERE job_id = p_job_id;
334 
335      END IF;
336 
337      log_message('l_business_group_id = ' || l_business_group_id);
338 
339      SELECT ORG_INFORMATION1
340      INTO l_prjg_id
341      FROM HR_ORGANIZATION_INFORMATION
342      WHERE ORGANIZATION_ID=l_business_group_id
343      AND ORG_INFORMATION_CONTEXT='Project Resource Job Group';
344 
345      log_message('PRJG id returned from context = ' || l_prjg_id);
346      RETURN to_number(l_prjg_id);
347   END IF;
348 
349 EXCEPTION
350   WHEN NO_DATA_FOUND THEN
351       RETURN NULL;
352   WHEN OTHERS THEN
353       RETURN NULL;
354 END;
355 
356 --------------------------------------------------------------------------------
357 -- Function:    Proj_Res_Job_Group_Exists
358 -- Description: This function checks if a Project Resource Job Group Exists
359 --              in the system. Returns 'Y' if it does and returns 'N' if it does
360 --              not.
361 --------------------------------------------------------------------------------
362 Function Proj_Res_Job_Group_Exists(p_job_id IN NUMBER)
363 RETURN VARCHAR2
364 IS
365 BEGIN
366    IF Get_Proj_Res_Job_Group(p_job_id => p_job_id) is null THEN
367       RETURN 'N';
368    ELSE
369       RETURN 'Y';
370    END IF;
371 END;
372 --------------------------------------------------------------------------------
373 -- Function:    Is_Proj_Res_Job_Group
374 -- Description: This function checks if a job group passed in is a
375 --              Project Resource Job Group.
376 --              Returns 'Y' if it is and returns 'N' if it is not
377 --------------------------------------------------------------------------------
378 Function Is_Proj_Res_Job_Group(p_job_id       IN NUMBER,
379                                p_job_group_id IN NUMBER)
380 RETURN VARCHAR2
381 IS
382 BEGIN
383   IF p_job_group_id = Get_Proj_Res_Job_Group(p_job_id => p_job_id) THEN
384      RETURN 'Y';
385   ELSE
386      RETURN 'N';
387   END IF;
388 END;
389 --------------------------------------------------------------------------------
390 -- Function:    Get_Job_Mapping
391 -- Description: This function returns the job in the Project Resource Job
392 --              Group towhich p_job_id is mapped.
393 --              Returns the job_id of the job in PRJG
394 --------------------------------------------------------------------------------
395 Function Get_Job_Mapping(p_job_id       IN NUMBER,
396                          p_job_group_id IN NUMBER)
397 RETURN NUMBER
398 IS
399   l_master_job_id       NUMBER;
400   l_master_job_group_id NUMBER;
401   l_prjg_job_id         NUMBER;
402   l_prjg_id             NUMBER;
403 
404   CURSOR get_master_job_to IS
405            SELECT to_job_id,to_job_group_id
406            FROM pa_job_relationships, per_job_groups pjg
407            WHERE from_job_id = P_job_id
408            AND from_job_group_id = P_job_group_id
409            AND to_job_group_id = pjg.job_group_id
410            AND pjg.master_flag = 'Y';
411 
412   CURSOR get_master_job_from IS
413            SELECT from_job_id,from_job_group_id
414            FROM pa_job_relationships, per_job_groups pjg
415            WHERE to_job_id = P_job_id
416            AND to_job_group_id = P_job_group_id
417            AND from_job_group_id = pjg.job_group_id
418            AND pjg.master_flag = 'Y';
419 
420   CURSOR get_prjg_job_to IS
421            SELECT to_job_id
422            FROM pa_job_relationships
423            WHERE from_job_id = l_master_job_id
424            AND from_job_group_id = l_master_job_group_id
425            AND to_job_group_id = l_prjg_id;
426 
427   CURSOR get_prjg_job_from IS
428            SELECT from_job_id
429            FROM pa_job_relationships
430            WHERE to_job_id = l_master_job_id
431            AND to_job_group_id = l_master_job_group_id
432            AND from_job_group_id = l_prjg_id;
433 BEGIN
434 
435    l_prjg_id := Get_Proj_Res_Job_Group(p_job_id => p_job_id);
436    log_message('PRJG Job Group Id = ' || l_prjg_id);
437 
438    IF l_prjg_id is null THEN
439       RETURN NULL;
440    END IF;
441 
442    -- only if it is not a master job, do we use the master cursor
443    IF(NOT check_master_job(p_job_id)) THEN
444 
445       log_message('Not a master job in Get Job Mapping');
446       OPEN get_master_job_to;
447       FETCH get_master_job_to INTO l_master_job_id,l_master_job_group_id;
448 
449       IF get_master_job_to%NOTFOUND THEN
450          OPEN get_master_job_from;
451          FETCH get_master_job_from INTO l_master_job_id,l_master_job_group_id;
452 
453          IF get_master_job_from%NOTFOUND THEN
454             -- There is no mapping with the master job, so we cannot find the mapping
455             -- with the Project Resource Job Group
456 	    CLOSE get_master_job_from ; -- Added for 5338664
457 	    CLOSE get_master_job_to ; -- Added for 5338664
458             RETURN NULL;
459 	 ELSE -- Added for 5338664
460 	    CLOSE get_master_job_from ;
461          END IF;
462       END IF;
463 
464       IF get_master_job_to%ISOPEN THEN --Added for 5338664
465       CLOSE get_master_job_to;
466       END IF;
467 
468    ELSE
469       log_message('Is a master job in Get Job Mapping');
470       -- it's already a master job, so just assign to the local params
471       l_master_job_id := p_job_id;
472       l_master_job_group_id := p_job_group_id;
473    END IF;
474 
475    IF Is_Proj_Res_Job_Group(p_job_id       => l_master_job_id,
476                             p_job_group_id => l_master_job_group_id) = 'Y'
477    THEN
478        RETURN l_master_job_id;
479    END IF;
480 
481    OPEN get_prjg_job_to;
482    FETCH get_prjg_job_to INTO l_prjg_job_id;
483 
484    IF get_prjg_job_to%NOTFOUND THEN
485       OPEN get_prjg_job_from;
486       FETCH get_prjg_job_from INTO l_prjg_job_id;
487       CLOSE get_prjg_job_from;
488    END IF;
489    CLOSE get_prjg_job_to;
490 
491    RETURN l_prjg_job_id;
492 END;
493 
494 --------------------------------------------------------------------------------
495 -- Function:    Get_job_level
496 -- Description: This function returns the Job Level of the job passed in
497 --              by looking at the 'Project Job Level' DFF segmeent of the
498 --              'Job Category' DFF.
499 --------------------------------------------------------------------------------
500 
501 FUNCTION get_job_level(p_job_id IN NUMBER)
502 RETURN NUMBER
503 IS
504 l_job_level       per_job_extra_info.jei_information4%type;
505 BEGIN
506 
507   SELECT jei_information4
508   INTO l_job_level
509   FROM per_job_extra_info
510   WHERE job_id = p_job_id
511   AND information_type = 'Job Category'
512   AND jei_information4 IS NOT NULL; -- Bug 2898766
513 
514   log_message('Job Level in get_job_level = ' || l_job_level);
515   RETURN TO_NUMBER(l_job_level);
516 
517 EXCEPTION
518 /* Bug 2898766 - Handled the exception if more than one rows are returned */
519   WHEN TOO_MANY_ROWS THEN
520       l_job_level := '-99';
521       RETURN TO_NUMBER(l_job_level);
522   WHEN NO_DATA_FOUND THEN
523       RETURN NULL;
524   WHEN OTHERS THEN
525       RETURN NULL;
526 END;
527 
528 --------------------------------------------------------------------------------
529 -- Function get_job_level
530 -- This function returns the job level DFF based on the job_id and Job_group_id
531 -- If there is no Project Resource Job Group (PRJG) in the system,
532 --     return the Job Level associated to the job.
533 -- If the Job belongs to a Job Group which is the PRJG,
534 --       Return the  Job Level.
535 -- Find the mapping of the job to a job in PRJG.
536 --       If no mapping, return null job group.
537 --       If there is mappping, return the job level associated to the job in PRJG.
538 --------------------------------------------------------------------------------
539 
540 FUNCTION get_job_level
541 (P_job_id             IN  per_jobs.job_id%type,
542  P_job_group_id       IN  per_job_groups.job_group_id%type)
543 RETURN NUMBER
544 IS
545         l_job_level       per_job_extra_info.jei_information4%type;
546         l_job_info_type   VARCHAR2(20) := 'Job Category';
547         l_master_job_id   pa_job_relationships.to_job_id%type;
548         l_job_id          per_jobs.job_id%type;
549         l_job_mapping     NUMBER;
550         c_job_group_id    NUMBER;
551 
552 
553 BEGIN
554 
555         /*IF Proj_Res_Job_Group_Exists(p_job_id => p_job_id) = 'N' THEN    -- Commented as part of the performance bug logged 6875253
556            -- There is no Project Resource Job Group in the system, so
557            -- pass back the passed in job's job level.
558            log_message('No PRJG in system, get job level using Job Id');
559            RETURN Get_Job_Level(p_job_id => p_job_id);
560         END IF;
561 
562         -- Check if the Job group of the job is a PRJG
563         IF Is_Proj_Res_Job_Group(p_job_id       => p_job_id,
564                                  p_job_group_id => p_job_group_id) = 'Y'
565         THEN
566            -- The job group of the job is the Project Resource Job Group, so
567            -- pass back the passed in job's job level.
568            log_message('Job is in PRJG group, get job level using Job Id');
569            RETURN Get_Job_Level(p_job_id => p_job_id);
570         END IF;*/
571 
572         c_job_group_id := Get_Proj_Res_Job_Group(p_job_id => p_job_id);     -- newly added code in place of the above commented code -- 6875253
573 
574         IF 	c_job_group_id IS NULL THEN
575             log_message('No PRJG in system, get job level using Job Id');
576             RETURN Get_Job_Level(p_job_id => p_job_id);
577 
578         ELSE
579              IF p_job_group_id = c_job_group_id  THEN
580              	 log_message('Job is in PRJG group, get job level using Job Id');
581              	 RETURN Get_Job_Level(p_job_id => p_job_id);
582              END IF;
583         END IF;
584 
585                 -- Get the mapping with a job in PRJG
586         log_message('Job is not in PRJG group, get mapping first');
587         l_job_mapping := Get_Job_Mapping(p_job_id       => p_job_id,
588                                          p_job_group_id => p_job_group_id);
589 
590         log_message('l_job_mapping_id = ' || l_job_mapping);
591         IF l_job_mapping is null THEN
592            RETURN NULL;
593         ELSE
594            RETURN Get_Job_Level(p_job_id => l_job_mapping);
595         END IF;
596 
597 END get_job_level;
598 
599 -- This Function returns boolean value of true if a job is master job otherwise
600 -- it returns false -- IN parameter will be job_id
601 FUNCTION check_master_job(P_job_id  IN per_Jobs.job_id%type)
602                        RETURN  boolean
603 IS
604         v_job_group_id    per_jobs.job_group_id%type;
605         v_master_flag     per_job_groups.master_flag%type;
606 
607 BEGIN
608         v_job_group_id := get_job_group_id(P_job_id);
609 
610         -- Bug 4350734 - Changed to base table from per_job_groups_v
611         SELECT master_flag
612         INTO   v_master_flag
613         FROM   per_job_groups
614         WHERE  job_group_id = v_job_group_id;
615 
616         if v_master_flag = 'Y' then
617              return TRUE;
618         else
619              return FALSE;
620         end if;
621 EXCEPTION
622 
623         WHEN NO_DATA_FOUND then
624            return FALSE;
625 
626 END check_master_job;
627 
628 -- This API returns the job group id for the corresponding Job
629 FUNCTION get_job_group_id(
630                           P_job_id             IN   per_jobs.job_id%type
631                          ) RETURN per_job_groups.job_group_id%type
632 IS
633         v_job_grp_id   per_job_groups.job_group_id%type;
634 
635 BEGIN
636         -- Bug 4350734 - Removed max sine it is not needed.
637 
638         SELECT job_group_id
639         INTO   v_job_grp_id
640         FROM   per_jobs
641         WHERE  job_id = P_job_id;
642 
643         return (v_job_grp_id);
644 
645 EXCEPTION
646 
647       WHEN NO_DATA_FOUND THEN --Bug 8263219
648         return NULL;
649 
650 END get_job_group_id;
651 
652 
653 --------------------------------------------------------------------------------
654 -- Function get_job_name
655 -- This function returns the job level DFF based on the job_id and Job_group_id
656 -- If there is no Project Resource Job Group (PRJG) in the system,
657 --     return the Job Level associated to the job.
658 -- If the Job belongs to a Job Group which is the PRJG,
659 --       Return the  Job Level.
660 -- Find the mapping of the job to a job in PRJG.
661 --       If no mapping, return null job group.
662 --       If there is mappping, return the job level associated to the job in PRJG.
663 --------------------------------------------------------------------------------
664 
665 FUNCTION get_job_name
666 (P_job_id             IN  per_jobs.job_id%type,
667  P_job_group_id       IN  per_job_groups.job_group_id%type)
668 RETURN VARCHAR2
669 IS
670         l_mapped_job_id   NUMBER;
671 BEGIN
672         -- If there is no Project Resource Job Group in the system or
673         -- the Job group of the job is the PRJG, pass back the passed
674         -- in job's job level.
675         IF (Proj_Res_Job_Group_Exists(p_job_id => p_job_id) = 'N' OR
676             Is_Proj_Res_Job_Group(p_job_id       => p_job_id,
677                                   p_job_group_id => p_job_group_id) = 'Y') THEN
678            log_message('No PRJG in system or job group=PRJG, get job level using Job Id');
679            RETURN PA_HR_UPDATE_API.Get_Job_Name (p_job_id => p_job_id);
680         END IF;
681 
682         -- Get the mapping with a job in PRJG
683         log_message('Job is not in PRJG group, get mapping first');
684         l_mapped_job_id := Get_Job_Mapping(p_job_id       => p_job_id,
685                                            p_job_group_id => p_job_group_id);
686 
687         log_message('l_mapped_job_id = ' || l_mapped_job_id);
688         IF l_mapped_job_id is null THEN
689            RETURN NULL;
690         ELSE
691            RETURN PA_HR_UPDATE_API.Get_Job_Name(p_job_id => l_mapped_job_id);
692         END IF;
693 
694 END get_job_name;
695 
696 -----------------------------------------------------------------------------
697 -- Procedure : check_job_relationships
698 -- This procedure checks if there are any relatioships existing in PA
699 -- for a given job_id.
700 
701 -- Called by HR API, before deleting a job
702 -----------------------------------------------------------------------------
703 
704  PROCEDURE check_job_relationships (p_job_id IN number)
705    IS
706          l_job_relationship  PA_JOB_RELATIONSHIPS%ROWTYPE;
707          Cursor C1 IS Select * from PA_JOB_RELATIONSHIPS where
708                 FROM_JOB_ID = p_job_id OR TO_JOB_ID = p_job_id;
709         begin
710 
711         Open C1;
712         fetch C1 into l_job_relationship;
713 
714         IF C1%FOUND Then
715                 Close C1;
716                 dbms_standard.raise_application_error
717                (num => -20999
718                ,msg => 'Relations involving this job exist in Projects. Please delete those relations before deleting the job!');
719         END IF;
720 
721     Close C1;
722   END check_job_relationships;
723 
724 END pa_job_utils ;
725