DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_UTILITY_PVT

Source


1 PACKAGE BODY AHL_UTILITY_PVT AS
2 /* $Header: AHLVUTLB.pls 120.3 2006/06/30 09:11:54 sathapli noship $ */
3 
4   -- Added for use by bind_parse.
5   TYPE col_val_rec IS RECORD (
6       col_name    VARCHAR2(2000),
7       col_op      VARCHAR2(10),
8       col_value   VARCHAR2(2000) );
9 
10   TYPE col_val_tbl IS TABLE OF col_val_rec INDEX BY BINARY_INTEGER;
11 
12 
13 ---------------------------------------------------------------------
14 -- PROCEDURE
15 --    bind_parse
16 -- USAGE
17 --    bind_parse (varchar2, col_val_tbl);
18 --    The input string must have a space between the AND and operator clause
19 --    and it must exclude the initial WHERE/AND statement.
20 --    Example: source_code = 'xyz' and campaign_id <> 1
21 ---------------------------------------------------------------------
22 PROCEDURE bind_parse (
23    p_string IN VARCHAR2,
24    x_col_val_tbl OUT NOCOPY col_val_tbl)
25 IS
26    l_new_str   VARCHAR2(4000);
27    l_str       VARCHAR2(4000) := p_string;
28    l_curr_pos  NUMBER;  -- the position index of the operator string
29    l_eq_pos    NUMBER;
30    l_not_pos   NUMBER;
31    l_and_pos   NUMBER;
32    i         NUMBER := 1;
33 BEGIN
34    LOOP
35       l_and_pos := INSTR (UPPER (l_str), ' AND ');
36       -- handle condition where no more AND's are
37       -- left -- usually if only one condition or
38       -- the last condition in the WHERE clause.
39       IF l_and_pos = 0 THEN
40          l_new_str := l_str;
41       ELSE
42          l_new_str := SUBSTR (l_str, 1, l_and_pos - 1);
43       END IF;
44 
45       --
46       -- The operator should also be passed
47       -- back to the calling program.
48       l_eq_pos := INSTR (l_new_str, '=');
49       l_not_pos := INSTR (l_new_str, '<>');
50       --
51       -----------------------------------
52       -- operator    equal    not equal
53       -- error       0        0
54       -- =           1        0
55       -- <>          0        1
56       -- =           1        2
57       -- <>          2        1
58       -----------------------------------
59       IF l_eq_pos = 0 AND l_not_pos = 0 THEN
60          -- Could not find either an = or an <>
61          -- operator.
62          IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
63             Fnd_Message.set_name('AHL', 'AHL_UTIL_NO_WHERE_OPERATOR');
64             Fnd_Msg_Pub.ADD;
65             RAISE Fnd_Api.g_exc_unexpected_error;
66          END IF;
67       ELSIF l_eq_pos > 0 AND l_not_pos = 0 THEN
68          l_curr_pos := l_eq_pos;
69          x_col_val_tbl(i).col_op := '=';
70       ELSIF l_not_pos > 0 AND l_eq_pos = 0 THEN
71          l_curr_pos := l_not_pos;
72          x_col_val_tbl(i).col_op := '<>';
73       ELSIF l_eq_pos < l_not_pos THEN
74          l_curr_pos := l_eq_pos;
75          x_col_val_tbl(i).col_op := '=';
76       ELSE
77          l_curr_pos := l_not_pos;
78          x_col_val_tbl(i).col_op := '<>';
79       END IF;
80 
81       x_col_val_tbl(i).col_name := UPPER (LTRIM (RTRIM (SUBSTR (l_new_str, 1, l_curr_pos - 1))));
82       -- Add 2 to the current position for '<>'.
83       x_col_val_tbl(i).col_value := LTRIM (RTRIM (SUBSTR (l_new_str, l_curr_pos + 2)));
84       --
85       -- Remove the single quotes from the begin and end of the string value;
86       -- no action if a numeric value.
87       IF INSTR (x_col_val_tbl(i).col_value, '''', 1) = 1 THEN
88          x_col_val_tbl(i).col_value := SUBSTR (x_col_val_tbl(i).col_value,2);
89          x_col_val_tbl(i).col_value := SUBSTR (x_col_val_tbl(i).col_value, 1, LENGTH(x_col_val_tbl(i).col_value) - 1);
90       END IF;
91 
92       IF l_and_pos = 0 THEN
93          EXIT; -- no more to parse
94       END IF;
95 
96       l_str := SUBSTR (l_str, l_and_pos + 4);
97       i := i + 1;
98    END LOOP;
99 END bind_parse;
100 
101 ---------------------------------------------------------------------
102 -- FUNCTION
103 --    check_fk_exists
104 --
105 -- HISTORY
106 ---------------------------------------------------------------------
107 FUNCTION check_fk_exists(
108    p_table_name   IN VARCHAR2,
109    p_pk_name      IN VARCHAR2,
110    p_pk_value     IN VARCHAR2,
111    p_pk_data_type IN NUMBER := g_number,
112    p_additional_where_clause  IN VARCHAR2 := NULL
113 )
114 RETURN VARCHAR2
115 IS
116 
117    l_sql   VARCHAR2(4000);
118    l_count NUMBER;
119 
120 BEGIN
121    l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || UPPER(p_table_name);
122    l_sql := l_sql || ' WHERE ' || UPPER(p_pk_name) || ' = :b1';
123 
124    IF p_additional_where_clause IS NOT NULL THEN
125       -- given time, incorporate bind_parse
126       l_sql := l_sql || ' AND ' || p_additional_where_clause;
127    END IF;
128 
129    l_sql := l_sql || ')';
130 
131    debug_message('SQL statement: '||l_sql);
132    BEGIN
133       EXECUTE IMMEDIATE l_sql INTO l_count
134       USING p_pk_value;
135    EXCEPTION
136       WHEN NO_DATA_FOUND THEN
137          l_count := 0;
138    END;
139 
140    IF l_count = 0 THEN
141       RETURN Fnd_Api.g_false;
142    ELSE
143       RETURN Fnd_Api.g_true;
144    END IF;
145 
146 END check_fk_exists;
147 
148 
149 ---------------------------------------------------------------------
150 -- FUNCTION
151 --    check_lookup_exists
152 --
153 -- HISTORY
154 ---------------------------------------------------------------------
155 FUNCTION check_lookup_exists(
156    p_lookup_table_name  IN VARCHAR2 := g_ahl_lookups,
157    p_lookup_type        IN VARCHAR2,
158    p_lookup_code        IN VARCHAR2
159 )
160 RETURN VARCHAR2
161 IS
162 
163    l_sql   VARCHAR2(4000);
164    l_count NUMBER;
165 
166 BEGIN
167 
168    l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || p_lookup_table_name;
169    l_sql := l_sql || ' WHERE LOOKUP_TYPE = :b1';
170    l_sql := l_sql || ' AND LOOKUP_CODE = :b2';
171    l_sql := l_sql || ' AND ENABLED_FLAG = ''Y'')';
172 
173    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
174        Ahl_Debug_Pub.debug( 'SQL statement'||l_sql);
175     END IF;
176    debug_message('SQL statement: '||l_sql);
177    BEGIN
178       EXECUTE IMMEDIATE l_sql INTO l_count
179       USING p_lookup_type, p_lookup_code;
180    EXCEPTION
181       WHEN NO_DATA_FOUND THEN
182          l_count := 0;
183    END;
184 
185    IF l_count = 0 THEN
186       RETURN Fnd_Api.g_false;
187    ELSE
188       RETURN Fnd_Api.g_true;
189    END IF;
190 
191 END check_lookup_exists;
192 
193 
194 ---------------------------------------------------------------------
195 -- FUNCTION
196 --    check_uniqueness
197 --
198 -- HISTORY
199 --    Use bind_parse to enable use of bind variables.
200 ---------------------------------------------------------------------
201 FUNCTION check_uniqueness(
202    p_table_name    IN VARCHAR2,
203    p_where_clause  IN VARCHAR2
204 )
205 RETURN VARCHAR2
206 IS
207 
208    l_sql   VARCHAR2(4000);
209    l_count NUMBER;
210 
211    l_bind_tbl  col_val_tbl;
212 
213 BEGIN
214 
215    l_sql := 'SELECT 1 FROM DUAL WHERE EXISTS (SELECT 1 FROM ' || UPPER(p_table_name);
216    bind_parse (p_where_clause, l_bind_tbl);
217    --
218    -- Support up to 4 WHERE conditions for uniqueness.  If
219    -- the number of conditions changes, then must also revise
220    -- the execute portion of the code.
221    IF l_bind_tbl.COUNT <= 4 THEN
222       l_sql := l_sql || ' WHERE ' || l_bind_tbl(1).col_name || ' ' || l_bind_tbl(1).col_op || ' :b1';
223       FOR i IN 2..l_bind_tbl.COUNT LOOP
224          l_sql := l_sql || ' AND ' || l_bind_tbl(i).col_name || ' ' || l_bind_tbl(i).col_op || ' :b' || i;
225       END LOOP;
226    ELSE
227       -- Exceeded the number of conditions supported
228       -- for bind variables.
229       l_sql := l_sql || ' WHERE ' || p_where_clause;
230    END IF;
231 
232    l_sql := l_sql || ')';
233 
234    debug_message('SQL statement: '||l_sql);
235    --
236    -- Modify here if number of WHERE conditions
237    -- supported changes.
238    BEGIN
239       IF l_bind_tbl.COUNT = 1 THEN
240          EXECUTE IMMEDIATE l_sql INTO l_count
241          USING l_bind_tbl(1).col_value;
242       ELSIF l_bind_tbl.COUNT = 2 THEN
243          EXECUTE IMMEDIATE l_sql INTO l_count
244          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value;
245       ELSIF l_bind_tbl.COUNT = 3 THEN
246          EXECUTE IMMEDIATE l_sql INTO l_count
247          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value, l_bind_tbl(3).col_value;
248       ELSIF l_bind_tbl.COUNT = 4 THEN
249          EXECUTE IMMEDIATE l_sql INTO l_count
250          USING l_bind_tbl(1).col_value, l_bind_tbl(2).col_value, l_bind_tbl(3).col_value, l_bind_tbl(4).col_value;
251       ELSE
252          EXECUTE IMMEDIATE l_sql INTO l_count;
253       END IF;
254    EXCEPTION
255       WHEN NO_DATA_FOUND THEN
256          l_count := 0;
257    END;
258 
259    IF l_count = 0 THEN
260       RETURN Fnd_Api.g_true;
261    ELSE
262       RETURN Fnd_Api.g_false;
263    END IF;
264 
265 END check_uniqueness;
266 
267 ---------------------------------------------------------------------
268 -- FUNCTION
269 --    is_Y_or_N
270 --
271 -- HISTORY
272 --
273 ---------------------------------------------------------------------
274 FUNCTION is_Y_or_N(
275    p_value IN VARCHAR2
276 )
277 RETURN VARCHAR2
278 IS
279 BEGIN
280    IF p_value = 'Y' OR p_value = 'N' THEN
281       RETURN Fnd_Api.g_true;
282    ELSE
283       RETURN Fnd_Api.g_false;
284    END IF;
285 END is_Y_or_N;
286 
287 
288 ---------------------------------------------------------------------
289 -- PROCEDURE
290 --    debug_message
291 --
292 -- HISTORY
293 --   Modified cxcheng fix bug 3856899
294 --
295 ---------------------------------------------------------------------
296 PROCEDURE debug_message(
297    p_message_text   IN  VARCHAR2,
298    p_message_level  IN  NUMBER := Fnd_Msg_Pub.g_msg_lvl_debug_high --Not used
299 )
300 IS
301 BEGIN
302 
303     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
304     fnd_log.string(
305         fnd_log.level_statement,
306         'ahl.plsql.AHL_UTILITY_PVT.debug_message',
307         p_message_text);
308     END IF;
309 END debug_message;
310 
311 ---------------------------------------------------------------------
312 -- PROCEDURE
313 --    error_message
314 --
315 -- HISTORY
316 --
317 ---------------------------------------------------------------------
318 PROCEDURE error_message(
319    p_message_name VARCHAR2,
320    p_token_name   VARCHAR2 := NULL,
321    P_token_value  VARCHAR2 := NULL
322 )
323 IS
324 BEGIN
325    IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
326       Fnd_Message.set_name('AHL', p_message_name);
327       IF p_token_name IS NOT NULL THEN
328          Fnd_Message.set_token(p_token_name, p_token_value);
329       END IF;
330       Fnd_Msg_Pub.ADD;
331    END IF;
332 END error_message;
333 
334 --======================================================================
335 -- FUNCTION
336 --    Check_User_Status
337 --
338 -- PURPOSE
339 --    Created to check if the User has status change permissions
340 --    Returns true, if it is allowed user status
341 --
342 -- HISTORY
343 --    18-Dec-2001  srini  Create.
344 --======================================================================
345 FUNCTION Check_User_Status(
346    p_user_status_id  IN VARCHAR2,
347    p_status_type     IN  VARCHAR2,
348    p_next_status     IN VARCHAR2)
349 
350 RETURN VARCHAR2
351 IS
352   CURSOR cur_usr_stat_det IS
353   SELECT  1 FROM DUAL
354   WHERE EXISTS (SELECT *  FROM AHL_USER_STATUSES_VL
355                 WHERE user_status_id = p_user_status_id
356                   AND system_status_type = p_status_type
357                   AND system_status_code = p_next_status
358                   AND active_flag = 'Y');
359 
360 l_dummy NUMBER;
361 BEGIN
362      OPEN cur_usr_stat_det;
363      FETCH cur_usr_stat_det INTO l_dummy;
364      CLOSE cur_usr_stat_det;
365 
366      IF l_dummy IS NULL THEN
367         RETURN Fnd_Api.G_FALSE;
368      ELSE
369          RETURN Fnd_Api.G_TRUE;
370      END IF;
371 END Check_User_Status;
372 
373 --======================================================================
374 -- PROCEDURE
375 --    Check_Status_Change
376 --
377 -- PURPOSE
378 --    Created to check if the status change is valid and allowed or not.
379 --    Returns success, if it is valid allowed status change
380 --
381 -- HISTORY
382 --    18-Dec-2001  srini  Create.
383 --======================================================================
384 
385 PROCEDURE Check_status_change (
386    p_object_type      IN  VARCHAR2,
387    p_user_status_id   IN  NUMBER,
388    p_status_type      IN  VARCHAR2,
389    p_current_status   IN  VARCHAR2,
390    p_next_status      IN  VARCHAR2,
391    x_return_status    OUT NOCOPY VARCHAR2)
392 IS
393 -- Cursor to check next status code is valid
394   CURSOR cur_stat_det IS
395   SELECT  1 FROM DUAL
396   WHERE EXISTS (SELECT *  FROM AHL_STATUS_ORDER_RULES
397                 WHERE system_status_type = p_status_type
398                   AND current_status_code = p_current_status
399                   AND next_status_code = p_next_status);
400 -- Cursor to get system status code
401   CURSOR cur_user_stat  (c_status_type IN VARCHAR2,
402                          c_status_code IN VARCHAR2)
403       IS
404   SELECT system_status_code
405     FROM AHL_USER_STATUSES_VL
406    WHERE system_status_type = c_status_type
407      AND name               = c_status_code;
408    l_dummy            NUMBER;
409    l_c_system_status  VARCHAR2(30);
410    l_n_system_status  VARCHAR2(30);
411 BEGIN
412      -- get currant system status code
413      OPEN cur_user_stat(p_status_type,p_current_status);
414      FETCH cur_user_stat INTO l_c_system_status;
415      IF cur_user_stat%NOTFOUND THEN
416         Fnd_Message.set_name('AHL', 'AHL_COM_RECORD_FOUND');
417         Fnd_Msg_Pub.ADD;
418      END IF;
419      CLOSE cur_user_stat;
420      -- get system status code for new status code
421      OPEN cur_user_stat(p_status_type,p_next_status);
422      FETCH cur_user_stat INTO l_n_system_status;
423      IF cur_user_stat%NOTFOUND THEN
424         Fnd_Message.set_name('AHL', 'AHL_COM_RECORD_FOUND');
425         Fnd_Msg_Pub.ADD;
426      END IF;
427      CLOSE cur_user_stat;
428      -- System status is same then return
429      IF l_c_system_status = l_n_system_status THEN
430          RETURN;
431      END IF;
432      --
433      OPEN cur_stat_det;
434      FETCH cur_stat_det INTO l_dummy;
435      CLOSE cur_stat_det;
436     IF l_dummy IS NOT NULL THEN
437        x_return_status:= Fnd_Api.G_RET_STS_SUCCESS;
438          ELSE
439        x_return_status := Fnd_Api.G_RET_STS_ERROR;
440     END IF;
441 EXCEPTION
442    WHEN NO_DATA_FOUND THEN
443       x_return_status := Fnd_Api.G_RET_STS_ERROR;
444    WHEN TOO_MANY_ROWS THEN
445       x_return_status := Fnd_Api.G_RET_STS_ERROR;
446    WHEN OTHERS THEN
447       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
448       RAISE;
449 
450 END check_status_change;
451 
452 --======================================================================
453 -- PROCEDURE
454 --    Check_Status_Order_Change
455 --
456 -- PURPOSE
457 --    Created to check if the status change is valid and allowed or not.
458 --    Returns success, if it is valid allowed status change
459 --
460 -- HISTORY
461 --    18-Dec-2001  srini  Create.
462 --======================================================================
463 
464 PROCEDURE check_status_order_change (
465    p_status_type      IN  VARCHAR2,
466    p_current_status   IN  VARCHAR2,
467    p_next_status      IN  VARCHAR2,
468    x_return_status    OUT NOCOPY VARCHAR2)
469 IS
470 -- Cursor to check next status code is valid
471   CURSOR cur_stat_det (c_status_type  IN VARCHAR2,
472                        c_current_status  IN  VARCHAR2,
473                        c_next_status  IN VARCHAR2)
474   IS
475   SELECT '1'  FROM AHL_STATUS_ORDER_RULES
476     WHERE system_status_type = c_status_type
477       AND current_status_code = c_current_status
478       AND next_status_code = c_next_status;
479    l_dummy            NUMBER;
480 
481 BEGIN
482 
483    Ahl_Debug_Pub.enable_debug;
484    -- Debug info.
485    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
486        Ahl_Debug_Pub.debug( 'status TYPE'||p_status_type);
487        Ahl_Debug_Pub.debug( 'status TYPE'||p_status_type);
488        Ahl_Debug_Pub.debug('ccode' ||p_current_status);
489        Ahl_Debug_Pub.debug('ncode:' ||p_next_status);
490     END IF;
491 
492      -- get currant system status code
493      OPEN cur_stat_det(p_status_type,
494                        p_current_status,
495                        p_next_status);
496      FETCH cur_stat_det INTO l_dummy;
497      IF l_dummy IS NULL THEN
498         Fnd_Message.set_name('AHL', 'AHL_INVALID_STATUS');
499         Fnd_Msg_Pub.ADD;
500         x_return_status:= Fnd_Api.G_RET_STS_ERROR;
501     ELSE
502         x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
503      END IF;
504      CLOSE cur_stat_det;
505      --
506 EXCEPTION
507    WHEN NO_DATA_FOUND THEN
508       x_return_status := Fnd_Api.G_RET_STS_ERROR;
509    WHEN TOO_MANY_ROWS THEN
510       x_return_status := Fnd_Api.G_RET_STS_ERROR;
511    WHEN OTHERS THEN
512       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
513       RAISE;
514 
515 END check_status_order_change;
516 
517 --======================================================================
518 -- PROCEDURE
519 --   Get_WF_Process_Name
520 --
521 -- PURPOSE
522 --    Returns workflow process name for the given type object
523 --    Returns 'E' for active if the no workflow is defined.
524 --
525 --======================================================================
526 
527 PROCEDURE Get_WF_Process_Name (
528    p_object         IN  VARCHAR2,
529    p_application_usg_code IN VARCHAR2 DEFAULT 'AHL',
530    x_active         OUT NOCOPY VARCHAR2,
531    x_process_name   OUT NOCOPY VARCHAR2,
532    x_item_type      OUT NOCOPY VARCHAR2,
533    x_return_status  OUT NOCOPY VARCHAR2,
534    x_msg_count      OUT NOCOPY VARCHAR2,
535    x_msg_data       OUT NOCOPY VARCHAR2)
536 
537 IS
538    l_active         VARCHAR2(1);
539    l_process_name   VARCHAR2(30);
540    l_item_type      VARCHAR2(8);
541    l_count          NUMBER;
542 
543       CURSOR c_wf_data (in_object IN VARCHAR2,
544         in_appl_usg_code IN VARCHAR2) IS
545       SELECT  wf_process_name, Item_type, Active_flag
546       FROM    AHL_WF_MAPPING
547       WHERE   Approval_object = in_object
548       AND APPLICATION_USG_CODE = in_appl_usg_code;
549 
550     CURSOR c_wf_data_null (in_appl_usg_code IN VARCHAR2) IS
551       SELECT  wf_process_name, Item_type, Active_flag
552       FROM    AHL_WF_MAPPING
553       WHERE   Approval_object IS NULL
554       AND APPLICATION_USG_CODE = in_appl_usg_code;
555 
556    CURSOR chk_appl_usg_code IS
557     SELECT 1 FROM FND_LOOKUPS
558     WHERE lookup_code = p_application_usg_code
559     AND LOOKUP_TYPE = 'AHL_APPLICATION_USAGE_CODE';
560   BEGIN
561    OPEN chk_appl_usg_code;
562       FETCH chk_appl_usg_code INTO l_count;
563     IF chk_appl_usg_code%NOTFOUND THEN
564           CLOSE chk_appl_usg_code;
565           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
566           Fnd_Message.set_name ('AHL', 'AHL_APPR_APPUSG_INVALID');
567           Fnd_Msg_Pub.ADD;
568           END IF;
569              x_return_status := Fnd_Api.g_ret_sts_error;
570              RETURN;
571       ELSE
572           CLOSE chk_appl_usg_code;
573       END IF;
574 
575     OPEN c_wf_data(p_object, p_application_usg_code);
576     FETCH c_wf_data INTO l_process_name,l_item_type,l_active;
577    IF c_wf_data%FOUND THEN
578        CLOSE c_wf_data;
579 
580        x_active       := l_active;
581        x_process_name := l_process_name;
582        x_item_type    := l_item_type;
583        x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
584        RETURN;
585    ELSE
586       CLOSE c_wf_data;
587       OPEN c_wf_data_null(p_application_usg_code);
588       FETCH c_wf_data_null INTO l_process_name,l_item_type,l_active;
589       IF c_wf_data_null%NOTFOUND THEN
590            CLOSE c_wf_data_null;
591             x_active       := 'E';
592             x_process_name := NULL;
593             x_item_type    := NULL;
594 --should not return error if no wf is found as this condition is not an error, and each module should handle it as they see fit.
595             x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
596            RETURN;
597       ELSE
598            CLOSE c_wf_data_null;
599 
600             x_active       := l_active;
601             x_process_name := l_process_name;
602             x_item_type    := l_item_type;
603             x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
604             RETURN;
605       END IF;
606    END IF;
607 
608    Fnd_Msg_Pub.count_and_get (
609          p_encoded => Fnd_Api.g_false,
610          p_count   => x_msg_count,
611          p_data    => x_msg_data
612    );
613 
614 END Get_WF_Process_Name;
615 
616 --This function is to get the highest standalone unit name to which the instance belongs to
617 --This unit name is not the sub unit but the root unit
618 FUNCTION   Get_Unit_Name(p_instance_id Number) RETURN VARCHAR2 IS
619   l_unit_name VARCHAR2(80);
620   l_instance_id    NUMBER;
621   CURSOR get_uc_instance_id IS
622     SELECT object_id
623       FROM csi_ii_relationships
624      WHERE object_id IN (SELECT csi_item_instance_id
625                            FROM ahl_unit_config_headers
626                           WHERE trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE))
627 START WITH subject_id = p_instance_id
628        AND relationship_type_code = 'COMPONENT-OF'
629        AND trunc(nvl(active_start_date, SYSDATE)) <= trunc(SYSDATE)
630        AND trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE)
631 CONNECT BY subject_id = PRIOR object_id
632        AND relationship_type_code = 'COMPONENT-OF'
633        AND trunc(nvl(active_start_date, SYSDATE)) <= trunc(SYSDATE)
634        AND trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE);
635 
636   CURSOR get_uc_header_name(c_instance_id NUMBER) IS
637     SELECT name
638       FROM ahl_unit_config_headers
639      WHERE csi_item_instance_id = c_instance_id
640        AND trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE);
641 
642 BEGIN
643   OPEN get_uc_instance_id;
644   LOOP
645     FETCH get_uc_instance_id INTO l_instance_id;
646     EXIT when get_uc_instance_id%NOTFOUND;
647   END LOOP;
648   CLOSE get_uc_instance_id;
649 
650   IF l_instance_id IS NULL THEN
651     l_instance_id := p_instance_id;
652   END IF;
653   OPEN get_uc_header_name(l_instance_id);
654   FETCH get_uc_header_name INTO l_unit_name;
655   CLOSE get_uc_header_name;
656   RETURN l_unit_name;
657 END;
658 
659 --======================================================================
660 -- FUNCTION
661 --    Is_Org_In_User_Ou
662 --
663 -- PURPOSE
664 --    Created to check if the Organization is in users operating unit or not.
665 --    Returns FND_API.G_TRUE if the org belongs to user's operating unit
666 --    Returns FND_API.G_FALSE if the org doesnt belong to user's operating unit
667 --    Returns 'X' on error.
668 --======================================================================
669 -- Function added for transit check.
670 FUNCTION IS_ORG_IN_USER_OU
671 (
672 p_org_id        IN          NUMBER,
673 p_org_name      IN          VARCHAR2,
674 x_return_status OUT NOCOPY  VARCHAR2,
675 x_msg_data  OUT NOCOPY  VARCHAR2
676 )
677 RETURN VARCHAR2
678 IS
679 
680 -- Cursor for getting organization id out of org name
681 CURSOR get_org_id_csr(p_org_name IN VARCHAR2)
682 IS
683 SELECT hou.organization_id
684 FROM HR_ORGANIZATION_UNITS hou
685 WHERE hou.name = p_org_name;
686 
687 --Cursor for checking if the given organization belongs to user's OU.
688 -- SATHAPLI::Bug# 5246136 fix
689 -- Changed reference of ORG_ORGANIZATION_DEFINITIONS to INV_ORGANIZATION_INFO_V
690 CURSOR is_user_in_ou_csr(p_org_id IN NUMBER)
691 IS
692 SELECT hou.organization_id
693 FROM HR_ORGANIZATION_UNITS hou,
694 MTL_PARAMETERS mtl
695 WHERE
696 hou.organization_id IN (
697                 SELECT organization_id
698                 FROM INV_ORGANIZATION_INFO_V
699 
700                 WHERE NVL(operating_unit, mo_global.get_current_org_id()) =
701                                       mo_global.get_current_org_id()
702 
703                    )
704 AND mtl.organization_id = hou.organization_id
705 AND mtl.eam_enabled_flag = 'Y'
706 AND hou.organization_id = p_org_id;
707 
708 l_org_id NUMBER;
709 l_ou_org_id NUMBER;
710 
711 BEGIN
712     --Initialize return status to success.
713     x_return_status := FND_API.G_RET_STS_SUCCESS;
714     IF p_org_id IS NULL AND
715        p_org_name IS NULL
716     THEN
717         x_return_status := FND_API.G_RET_STS_ERROR;
718         x_msg_data  := 'AHL_UA_ORG_INFO_NULL';
719         RETURN 'X';
720     END IF;
721 
722     l_org_id  := p_org_id;
723     IF p_org_id IS NULL THEN
724         OPEN get_org_id_csr(p_org_name);
725         FETCH get_org_id_csr INTO l_org_id;
726         CLOSE get_org_id_csr;
727     END IF;
728 
729     -- operating unit check
730     IF l_org_id IS NOT NULL
731     THEN
732         OPEN is_user_in_ou_csr(l_org_id);
733         FETCH is_user_in_ou_csr INTO l_ou_org_id;
734         CLOSE is_user_in_ou_csr;
735         IF l_ou_org_id IS NOT NULL
736         THEN
737             RETURN FND_API.G_TRUE;
738         ELSE
739             RETURN FND_API.G_FALSE;
740         END IF;
741     ELSE
742         x_return_status := FND_API.G_RET_STS_ERROR;
743         x_msg_data  := 'AHL_UA_ORG_INFO_NULL';
744         RETURN 'X';
745     END IF;
746 
747 END IS_ORG_IN_USER_OU;
748 
749 --======================================================================
750 -- FUNCTION
751 --    GET_LOOKUP_MEANING
752 --
753 -- PURPOSE
754 --    Return fnd_lookup_values_vl.meaning, given lookup_type and lookup_code.
755 --    This function will either return the correct meaning, or return null.
756 --    This function also will not raise any error.
757 --======================================================================
758 FUNCTION GET_LOOKUP_MEANING
759 (
760     p_lookup_type   IN  VARCHAR2,
761     p_lookup_code   IN  VARCHAR2
762 )
763 RETURN VARCHAR2
764 IS
765     l_meaning   VARCHAR2(80);
766 
767     CURSOR get_meaning
768     IS
769         SELECT meaning
770         FROM fnd_lookup_values
771         WHERE lookup_type = p_lookup_type
772         AND lookup_code = p_lookup_code
773         AND language = userenv('LANG');
774 BEGIN
775     OPEN get_meaning;
776     FETCH get_meaning INTO l_meaning;
777     CLOSE get_meaning;
778 
779     RETURN l_meaning;
780 END GET_LOOKUP_MEANING;
781 
782 END Ahl_Utility_Pvt;
783