DBA Data[Home] [Help]

PACKAGE BODY: APPS.HXC_TIMECARD_ATTRIBUTE_UTILS

Source


1 PACKAGE BODY hxc_timecard_attribute_utils AS
2 /* $Header: hxctcatut.pkb 120.1 2011/08/23 13:09:41 bbayragi ship $ */
3 
4 g_debug 	     boolean 	  := hr_utility.debug_enabled;
5 
6 type attribute_index is table of hxc_time_attributes.time_attribute_id%type index by binary_integer;
7 type bld_blk_info_type_ids is table of hxc_bld_blk_info_types.bld_blk_info_type%type index by binary_integer;
8 
9 g_bld_blk_info_type_ids bld_blk_info_type_ids;
10 
11 g_package varchar2(30) := 'hxc_timecard_attribute_utils';
12 
13 e_no_existing_attribute exception;
14 
15 Function next_time_attribute_id
16            (p_attributes in hxc_attribute_table_type)
17            return number is
18 
19 l_next_id number;
20 l_index   number;
21 
22 Begin
23 
24 if ((p_attributes is null) OR (p_attributes.count = 0)) then
25   l_next_id := 1;
26 else
27   l_index := p_attributes.first;
28   l_next_id := p_attributes(l_index).time_attribute_id;
29 
30   Loop
31     Exit when not p_attributes.exists(l_index);
32     if(l_next_id > p_attributes(l_index).time_attribute_id) then
33       l_next_id := p_attributes(l_index).time_attribute_id;
34     end if;
35     l_index := p_attributes.next(l_index);
36   End Loop;
37 end if;
38 
39 if (l_next_id > 0) then
40   return -100;
41 else
42   return (l_next_id-100);
43 end if;
44 
45 End next_time_attribute_id;
46 
47 FUNCTION get_bld_blk_info_type
48           (p_info_type_id in NUMBER)
49            return varchar2 is
50 
51 cursor get_info_type(p_info_type_id in number) is
52  select bld_blk_info_type
53    from hxc_bld_blk_info_types
54   where bld_blk_info_type_id = p_info_type_id;
55 
56 l_info_type HXC_BLD_BLK_INFO_TYPES.BLD_BLK_INFO_TYPE%TYPE;
57 
58 Begin
59 
60 --
61 -- See if we already have the id
62 --
63 if(g_bld_blk_info_type_ids.exists(p_info_type_id)) then
64   return g_bld_blk_info_type_ids(p_info_type_id);
65 else
66   open get_info_type(p_info_type_id);
67   fetch get_info_type into l_info_type;
68   if(get_info_type%NOTFOUND) then
69    close get_info_type;
70    FND_MESSAGE.SET_NAME('HXC','HXC_XXXXXX_NO_INFO_TYPE');
71    FND_MESSAGE.RAISE_ERROR;
72   else
73    close get_info_type;
74    g_bld_blk_info_type_ids(p_info_type_id) := l_info_type;
75    return l_info_type;
76   end if;
77 end if;
78 
79 End get_bld_blk_info_type;
80 
81 FUNCTION get_bld_blk_info_type_id
82           (p_info_type in varchar2)
83          RETURN number is
84 
85 cursor csr_get_bld_blk_info_type_id IS
86   select bld_blk_info_type_id
87     from hxc_bld_blk_info_types
88    where bld_blk_info_type = p_info_type;
89 
90 l_index        NUMBER;
91 l_info_type_id hxc_bld_blk_info_types.bld_blk_info_type_id%type := NULL;
92 
93 BEGIN
94 --
95 -- Check to see if we've cache the bld blk info type already
96 --
97 
98 l_index := g_bld_blk_info_type_ids.first;
99 
100 LOOP
101   EXIT when ((NOT g_bld_blk_info_type_ids.exists(l_index)) OR (l_info_type_id is NOT NULL));
102 
103   if (g_bld_blk_info_type_ids(l_index)=p_info_type) then
104 
105     l_info_type_id := l_index;
106 
107   end if;
108 
109   l_index := g_bld_blk_info_type_ids.next(l_index);
110 END LOOP;
111 
112 if(l_info_type_id is NULL) then
113 
114   open csr_get_bld_blk_info_type_id;
115   fetch csr_get_bld_blk_info_type_id into l_info_type_id;
116 
117   if(csr_get_bld_blk_info_type_id%NOTFOUND) then
118     close csr_get_bld_blk_info_type_id;
119     FND_MESSAGE.SET_NAME('HXC','HXC_NO_BLD_BLK_INFO_TYPE');
120     FND_MESSAGE.SET_TOKEN('TYPE',p_info_type);
121     FND_MESSAGE.raise_error;
122   else
123     close csr_get_bld_blk_info_type_id;
124   end if;
125   --
126   -- Add this info type to the cached bunch
127   -- use the id as the index in the table
128   --
129   g_bld_blk_info_type_ids(l_info_type_id) := p_info_type;
130 
131 end if;
132 
133 return l_info_type_id;
134 
135 END get_bld_blk_info_type_id;
136 
137 Function convert_to_dpwr_attributes
138           (p_attributes in HXC_ATTRIBUTE_TABLE_TYPE)
139           return HXC_SELF_SERVICE_TIME_DEPOSIT.building_block_attribute_info IS
140 
141 l_attributes HXC_SELF_SERVICE_TIME_DEPOSIT.building_block_attribute_info;
142 l_index      NUMBER;
143 l_proc       varchar2(72) := g_package||'convert_to_dpwr_attributes';
144 
145 BEGIN
146 
147 l_index := p_attributes.first;
148 
149 LOOP
150   EXIT WHEN NOT p_attributes.exists(l_index);
151 
152   l_attributes(l_index).TIME_ATTRIBUTE_ID := p_attributes(l_index).TIME_ATTRIBUTE_ID;
153   l_attributes(l_index).BUILDING_BLOCK_ID := p_attributes(l_index).BUILDING_BLOCK_ID;
154   l_attributes(l_index).ATTRIBUTE_CATEGORY := p_attributes(l_index).ATTRIBUTE_CATEGORY;
155   l_attributes(l_index).ATTRIBUTE1 := p_attributes(l_index).ATTRIBUTE1;
156   l_attributes(l_index).ATTRIBUTE2 := p_attributes(l_index).ATTRIBUTE2;
157   l_attributes(l_index).ATTRIBUTE3 := p_attributes(l_index).ATTRIBUTE3;
158   l_attributes(l_index).ATTRIBUTE4 := p_attributes(l_index).ATTRIBUTE4;
159   l_attributes(l_index).ATTRIBUTE5 := p_attributes(l_index).ATTRIBUTE5;
160   l_attributes(l_index).ATTRIBUTE6 := p_attributes(l_index).ATTRIBUTE6;
161   l_attributes(l_index).ATTRIBUTE7 := p_attributes(l_index).ATTRIBUTE7;
162   l_attributes(l_index).ATTRIBUTE8 := p_attributes(l_index).ATTRIBUTE8;
163   l_attributes(l_index).ATTRIBUTE9 := p_attributes(l_index).ATTRIBUTE9;
164   l_attributes(l_index).ATTRIBUTE10 := p_attributes(l_index).ATTRIBUTE10;
165   l_attributes(l_index).ATTRIBUTE11 := p_attributes(l_index).ATTRIBUTE11;
166   l_attributes(l_index).ATTRIBUTE12 := p_attributes(l_index).ATTRIBUTE12;
167   l_attributes(l_index).ATTRIBUTE13 := p_attributes(l_index).ATTRIBUTE13;
168   l_attributes(l_index).ATTRIBUTE14 := p_attributes(l_index).ATTRIBUTE14;
169   l_attributes(l_index).ATTRIBUTE15 := p_attributes(l_index).ATTRIBUTE15;
170   l_attributes(l_index).ATTRIBUTE16 := p_attributes(l_index).ATTRIBUTE16;
171   l_attributes(l_index).ATTRIBUTE17 := p_attributes(l_index).ATTRIBUTE17;
172   l_attributes(l_index).ATTRIBUTE18 := p_attributes(l_index).ATTRIBUTE18;
173   l_attributes(l_index).ATTRIBUTE19 := p_attributes(l_index).ATTRIBUTE19;
174   l_attributes(l_index).ATTRIBUTE20 := p_attributes(l_index).ATTRIBUTE20;
175   l_attributes(l_index).ATTRIBUTE21 := p_attributes(l_index).ATTRIBUTE21;
176   l_attributes(l_index).ATTRIBUTE22 := p_attributes(l_index).ATTRIBUTE22;
177   l_attributes(l_index).ATTRIBUTE23 := p_attributes(l_index).ATTRIBUTE23;
178   l_attributes(l_index).ATTRIBUTE24 := p_attributes(l_index).ATTRIBUTE24;
179   l_attributes(l_index).ATTRIBUTE25 := p_attributes(l_index).ATTRIBUTE25;
180   l_attributes(l_index).ATTRIBUTE26 := p_attributes(l_index).ATTRIBUTE26;
181   l_attributes(l_index).ATTRIBUTE27 := p_attributes(l_index).ATTRIBUTE27;
182   l_attributes(l_index).ATTRIBUTE28 := p_attributes(l_index).ATTRIBUTE28;
183   l_attributes(l_index).ATTRIBUTE29 := p_attributes(l_index).ATTRIBUTE29;
184   l_attributes(l_index).ATTRIBUTE30 := p_attributes(l_index).ATTRIBUTE30;
185   l_attributes(l_index).BLD_BLK_INFO_TYPE_ID := p_attributes(l_index).BLD_BLK_INFO_TYPE_ID;
186   l_attributes(l_index).OBJECT_VERSION_NUMBER := p_attributes(l_index).OBJECT_VERSION_NUMBER;
187   l_attributes(l_index).NEW := p_attributes(l_index).NEW;
188   l_attributes(l_index).CHANGED := p_attributes(l_index).CHANGED;
189   l_attributes(l_index).BLD_BLK_INFO_TYPE := p_attributes(l_index).BLD_BLK_INFO_TYPE;
190 
191   l_index := p_attributes.next(l_index);
192 
193 END LOOP;
194 
195 return l_attributes;
196 
197 End convert_to_dpwr_attributes;
198 
199 Function convert_to_type
200           (p_attributes in HXC_SELF_SERVICE_TIME_DEPOSIT.building_block_attribute_info)
201           return HXC_ATTRIBUTE_TABLE_TYPE is
202 
203 l_attributes HXC_ATTRIBUTE_TABLE_TYPE;
204 l_index      NUMBER;
205 
206 Begin
207 
208 -- Initialize the collection
209 
210 l_attributes := HXC_ATTRIBUTE_TABLE_TYPE();
211 
212 l_index := p_attributes.first;
213 
214 LOOP
215 
216   EXIT WHEN NOT p_attributes.exists(l_index);
217 
218   l_attributes.extend;
219 
220   l_attributes(l_attributes.last) :=
221     HXC_ATTRIBUTE_TYPE
222        (p_attributes(l_index).TIME_ATTRIBUTE_ID
223        ,p_attributes(l_index).BUILDING_BLOCK_ID
224        ,p_attributes(l_index).ATTRIBUTE_CATEGORY
225        ,p_attributes(l_index).ATTRIBUTE1
226        ,p_attributes(l_index).ATTRIBUTE2
227        ,p_attributes(l_index).ATTRIBUTE3
228        ,p_attributes(l_index).ATTRIBUTE4
229        ,p_attributes(l_index).ATTRIBUTE5
230        ,p_attributes(l_index).ATTRIBUTE6
231        ,p_attributes(l_index).ATTRIBUTE7
232        ,p_attributes(l_index).ATTRIBUTE8
233        ,p_attributes(l_index).ATTRIBUTE9
234        ,p_attributes(l_index).ATTRIBUTE10
235        ,p_attributes(l_index).ATTRIBUTE11
236        ,p_attributes(l_index).ATTRIBUTE12
237        ,p_attributes(l_index).ATTRIBUTE13
238        ,p_attributes(l_index).ATTRIBUTE14
239        ,p_attributes(l_index).ATTRIBUTE15
240        ,p_attributes(l_index).ATTRIBUTE16
241        ,p_attributes(l_index).ATTRIBUTE17
242        ,p_attributes(l_index).ATTRIBUTE18
243        ,p_attributes(l_index).ATTRIBUTE19
244        ,p_attributes(l_index).ATTRIBUTE20
245        ,p_attributes(l_index).ATTRIBUTE21
246        ,p_attributes(l_index).ATTRIBUTE22
247        ,p_attributes(l_index).ATTRIBUTE23
248        ,p_attributes(l_index).ATTRIBUTE24
249        ,p_attributes(l_index).ATTRIBUTE25
250        ,p_attributes(l_index).ATTRIBUTE26
251        ,p_attributes(l_index).ATTRIBUTE27
252        ,p_attributes(l_index).ATTRIBUTE28
253        ,p_attributes(l_index).ATTRIBUTE29
254        ,p_attributes(l_index).ATTRIBUTE30
255        ,p_attributes(l_index).BLD_BLK_INFO_TYPE_ID
256        ,p_attributes(l_index).OBJECT_VERSION_NUMBER
257        ,p_attributes(l_index).NEW
258        ,p_attributes(l_index).CHANGED
259        ,p_attributes(l_index).BLD_BLK_INFO_TYPE
260        ,'N' -- New process flag
261        ,null -- building block ovn
262        );
263 
264   l_index := p_attributes.next(l_index);
265 
266 END LOOP;
267 
268 return l_attributes;
269 
270 End convert_to_type;
271 
272 Function is_new_attribute
273           (p_attribute in HXC_ATTRIBUTE_TYPE)
274            return BOOLEAN is
275 
276 Begin
277 
278 if(p_attribute.new='Y') then
279   return true;
280 else
281   return false;
282 end if;
283 
284 End is_new_Attribute;
285 
286 Function is_new_attribute2
287           (p_attribute in HXC_ATTRIBUTE_TYPE)
288            return BOOLEAN is
289 
290 Begin
291 
292 if(p_attribute.new='Y') then
293   return true;
294 else
295   return false;
296 end if;
297 
298 End is_new_Attribute2;
299 
300 Function is_corresponding_block
301           (p_attribute in HXC_ATTRIBUTE_TYPE
302           ,p_block_id  in HXC_TIME_BUILDING_BLOCKS.TIME_BUILDING_BLOCK_ID%TYPE
303           ) RETURN BOOLEAN is
304 
305 Begin
306 
307 if(p_attribute.building_block_id =  p_block_id) then
308   return true;
309 else
310   return false;
311 end if;
312 
313 End is_corresponding_block;
314 
315 Function is_corresponding_block
316           (p_attribute in HXC_ATTRIBUTE_TYPE
317           ,p_block     in HXC_BLOCK_TYPE
318           ) RETURN BOOLEAN is
319 
320 Begin
321 
322 if(p_attribute.building_block_id =  p_block.time_building_block_id) then
323   return true;
324 else
325   return false;
326 end if;
327 
328 End is_corresponding_block;
329 
330 
331 Function is_system_context
332           (p_attribute in HXC_ATTRIBUTE_TYPE)
333           RETURN BOOLEAN is
334 
335 Begin
336 
337 --
338 -- These should be ordered so the most likely attribute
339 -- is first
340 --
341 
342 if(p_attribute.attribute_category = hxc_timecard.c_security_attribute) then
343   return true;
344 elsif(p_attribute.attribute_category = hxc_timecard.c_reason_attribute) then
345   return true;
346 elsif(p_attribute.attribute_category = hxc_timecard.c_layout_attribute) then
347   return true;
348 else
349   return false;
350 end if;
351 
352 End is_system_context;
353 
354 Function process_attribute
355           (p_attribute in hxc_attribute_type
356           ) return BOOLEAN is
357 
358 Begin
359 
360 if(p_attribute.process = hxc_timecard.c_process) then
361   return true;
362 else
363   return false;
364 end if;
365 
366 End process_attribute;
367 
368 Function build_attribute
369           (p_time_attribute_id in HXC_TIME_ATTRIBUTES.TIME_ATTRIBUTE_ID%TYPE
370           ,p_object_version_number in HXC_TIME_ATTRIBUTES.OBJECT_VERSION_NUMBER%TYPE
371           ,p_time_building_block_id in HXC_TIME_BUILDING_BLOCKS.TIME_BUILDING_BLOCK_ID%TYPE
372           ,p_time_building_block_ovn in hxc_time_building_blocks.object_version_number%type
373           ) return HXC_ATTRIBUTE_TYPE is
374 
375 cursor c_attribute
376         (p_time_attribute_id in HXC_TIME_ATTRIBUTES.TIME_ATTRIBUTE_ID%TYPE
377         ,p_object_version_number in HXC_TIME_ATTRIBUTES.OBJECT_VERSION_NUMBER%TYPE
378         ) is
379   select *
380     from hxc_time_attributes
381    where time_attribute_id = p_time_attribute_id
382      and object_version_number = p_object_version_number;
383 
384 l_new_attribute HXC_ATTRIBUTE_TYPE;
385 l_attribute_row c_attribute%ROWTYPE;
386 
387 Begin
388 
389 open c_attribute
390        (p_time_attribute_id
391        ,p_object_version_number
392        );
393 fetch c_attribute into l_attribute_row;
394 
395 if(c_attribute%FOUND) then
396   close c_attribute;
397   l_new_attribute :=
398     HXC_ATTRIBUTE_TYPE
399      (l_attribute_row.TIME_ATTRIBUTE_ID
400      ,p_time_building_block_id
401      ,l_attribute_row.ATTRIBUTE_CATEGORY
402      ,l_attribute_row.ATTRIBUTE1
403      ,l_attribute_row.ATTRIBUTE2
404      ,l_attribute_row.ATTRIBUTE3
405      ,l_attribute_row.ATTRIBUTE4
406      ,l_attribute_row.ATTRIBUTE5
407      ,l_attribute_row.ATTRIBUTE6
408      ,l_attribute_row.ATTRIBUTE7
409      ,l_attribute_row.ATTRIBUTE8
410      ,l_attribute_row.ATTRIBUTE9
411      ,l_attribute_row.ATTRIBUTE10
412      ,l_attribute_row.ATTRIBUTE11
413      ,l_attribute_row.ATTRIBUTE12
414      ,l_attribute_row.ATTRIBUTE13
415      ,l_attribute_row.ATTRIBUTE14
416      ,l_attribute_row.ATTRIBUTE15
417      ,l_attribute_row.ATTRIBUTE16
418      ,l_attribute_row.ATTRIBUTE17
419      ,l_attribute_row.ATTRIBUTE18
420      ,l_attribute_row.ATTRIBUTE19
421      ,l_attribute_row.ATTRIBUTE20
422      ,l_attribute_row.ATTRIBUTE21
423      ,l_attribute_row.ATTRIBUTE22
424      ,l_attribute_row.ATTRIBUTE23
425      ,l_attribute_row.ATTRIBUTE24
426      ,l_attribute_row.ATTRIBUTE25
427      ,l_attribute_row.ATTRIBUTE26
428      ,l_attribute_row.ATTRIBUTE27
429      ,l_attribute_row.ATTRIBUTE28
430      ,l_attribute_row.ATTRIBUTE29
431      ,l_attribute_row.ATTRIBUTE30
432      ,l_attribute_row.BLD_BLK_INFO_TYPE_ID
433      ,l_attribute_row.OBJECT_VERSION_NUMBER
434      ,'N'
435      ,'N'
436      ,get_bld_blk_info_type(l_attribute_row.BLD_BLK_INFO_TYPE_ID)
437      ,'N'
438      ,p_time_building_block_ovn
439      );
440 
441 else
442   close c_attribute;
443   raise e_no_existing_attribute;
444 end if;
445 
446 return l_new_attribute;
447 
448 End Build_Attribute;
449 
450 Function attributes_are_different
451            (p_attribute1 in HXC_ATTRIBUTE_TYPE
452            ,p_attribute2 in HXC_ATTRIBUTE_TYPE
453            ) return BOOLEAN is
454 
455 Begin
456 
457 -- Modified for Bug 12774447
458 if(nvl(p_attribute1.attribute_category,'NULL') <> nvl(p_attribute2.attribute_category,'NULL')) then
459   hxc_block_attribute_update.g_tc_api_flag := 'N';
460   return true;
461 end if;
462 
463 if(nvl(p_attribute1.attribute1,'NULL') <> nvl(p_attribute2.attribute1,'NULL')) then
464   hxc_block_attribute_update.g_tc_api_flag := 'N';
465   return true;
466 end if;
467 
468 if(nvl(p_attribute1.attribute2,'NULL') <> nvl(p_attribute2.attribute2,'NULL')) then
469   hxc_block_attribute_update.g_tc_api_flag := 'N';
470   return true;
471 end if;
472 
473 if(nvl(p_attribute1.attribute3,'NULL') <> nvl(p_attribute2.attribute3,'NULL')) then
474   hxc_block_attribute_update.g_tc_api_flag := 'N';
475   return true;
476 end if;
477 
478 if(nvl(p_attribute1.attribute4,'NULL') <> nvl(p_attribute2.attribute4,'NULL')) then
479   hxc_block_attribute_update.g_tc_api_flag := 'N';
480   return true;
481 end if;
482 
483 if(nvl(p_attribute1.attribute5,'NULL') <> nvl(p_attribute2.attribute5,'NULL')) then
484   hxc_block_attribute_update.g_tc_api_flag := 'N';
485   return true;
486 end if;
487 
488 if(nvl(p_attribute1.attribute6,'NULL') <> nvl(p_attribute2.attribute6,'NULL')) then
489   hxc_block_attribute_update.g_tc_api_flag := 'N';
490   return true;
491 end if;
492 
493 if(nvl(p_attribute1.attribute7,'NULL') <> nvl(p_attribute2.attribute7,'NULL')) then
494   hxc_block_attribute_update.g_tc_api_flag := 'N';
495   return true;
496 end if;
497 
498 if(nvl(p_attribute1.attribute8,'NULL') <> nvl(p_attribute2.attribute8,'NULL')) then
499   hxc_block_attribute_update.g_tc_api_flag := 'N';
500   return true;
501 end if;
502 
503 if(nvl(p_attribute1.attribute9,'NULL') <> nvl(p_attribute2.attribute9,'NULL')) then
504   hxc_block_attribute_update.g_tc_api_flag := 'N';
505   return true;
506 end if;
507 
508 if(nvl(p_attribute1.attribute10,'NULL') <> nvl(p_attribute2.attribute10,'NULL')) then
509   hxc_block_attribute_update.g_tc_api_flag := 'N';
510   return true;
511 end if;
512 
513 if(nvl(p_attribute1.attribute11,'NULL') <> nvl(p_attribute2.attribute11,'NULL')) then
514   hxc_block_attribute_update.g_tc_api_flag := 'N';
515   return true;
516 end if;
517 
518 if(nvl(p_attribute1.attribute12,'NULL') <> nvl(p_attribute2.attribute12,'NULL')) then
519   hxc_block_attribute_update.g_tc_api_flag := 'N';
520   return true;
521 end if;
522 
523 if(nvl(p_attribute1.attribute13,'NULL') <> nvl(p_attribute2.attribute13,'NULL')) then
524   hxc_block_attribute_update.g_tc_api_flag := 'N';
525   return true;
526 end if;
527 
528 if(nvl(p_attribute1.attribute14,'NULL') <> nvl(p_attribute2.attribute14,'NULL')) then
529   hxc_block_attribute_update.g_tc_api_flag := 'N';
530   return true;
531 end if;
532 
533 if(nvl(p_attribute1.attribute15,'NULL') <> nvl(p_attribute2.attribute15,'NULL')) then
534   hxc_block_attribute_update.g_tc_api_flag := 'N';
535   return true;
536 end if;
537 
538 if(nvl(p_attribute1.attribute16,'NULL') <> nvl(p_attribute2.attribute16,'NULL')) then
539   hxc_block_attribute_update.g_tc_api_flag := 'N';
540   return true;
541 end if;
542 
543 if(nvl(p_attribute1.attribute17,'NULL') <> nvl(p_attribute2.attribute17,'NULL')) then
544   hxc_block_attribute_update.g_tc_api_flag := 'N';
545   return true;
546 end if;
547 
548 if(nvl(p_attribute1.attribute18,'NULL') <> nvl(p_attribute2.attribute18,'NULL')) then
549   hxc_block_attribute_update.g_tc_api_flag := 'N';
550   return true;
551 end if;
552 
553 if(nvl(p_attribute1.attribute19,'NULL') <> nvl(p_attribute2.attribute19,'NULL')) then
554   hxc_block_attribute_update.g_tc_api_flag := 'N';
555   return true;
556 end if;
557 
558 if(nvl(p_attribute1.attribute20,'NULL') <> nvl(p_attribute2.attribute20,'NULL')) then
559   hxc_block_attribute_update.g_tc_api_flag := 'N';
560   return true;
561 end if;
562 
563 if(nvl(p_attribute1.attribute21,'NULL') <> nvl(p_attribute2.attribute21,'NULL')) then
564   hxc_block_attribute_update.g_tc_api_flag := 'N';
565   return true;
566 end if;
567 
568 if(nvl(p_attribute1.attribute22,'NULL') <> nvl(p_attribute2.attribute22,'NULL')) then
569   hxc_block_attribute_update.g_tc_api_flag := 'N';
570   return true;
571 end if;
572 
573 if(nvl(p_attribute1.attribute23,'NULL') <> nvl(p_attribute2.attribute23,'NULL')) then
574   hxc_block_attribute_update.g_tc_api_flag := 'N';
575   return true;
576 end if;
577 
578 if(nvl(p_attribute1.attribute24,'NULL') <> nvl(p_attribute2.attribute24,'NULL')) then
579   hxc_block_attribute_update.g_tc_api_flag := 'N';
580   return true;
581 end if;
582 
583 if(nvl(p_attribute1.attribute25,'NULL') <> nvl(p_attribute2.attribute25,'NULL')) then
584   hxc_block_attribute_update.g_tc_api_flag := 'N';
585   return true;
586 end if;
587 
588 if(nvl(p_attribute1.attribute26,'NULL') <> nvl(p_attribute2.attribute26,'NULL')) then
589   hxc_block_attribute_update.g_tc_api_flag := 'N';
590   return true;
591 end if;
592 
593 if(nvl(p_attribute1.attribute27,'NULL') <> nvl(p_attribute2.attribute27,'NULL')) then
594   hxc_block_attribute_update.g_tc_api_flag := 'N';
595   return true;
596 end if;
597 
598 if(nvl(p_attribute1.attribute28,'NULL') <> nvl(p_attribute2.attribute28,'NULL')) then
599   hxc_block_attribute_update.g_tc_api_flag := 'N';
600   return true;
601 end if;
602 
603 if(nvl(p_attribute1.attribute29,'NULL') <> nvl(p_attribute2.attribute29,'NULL')) then
604   hxc_block_attribute_update.g_tc_api_flag := 'N';
605   return true;
606 end if;
607 
608 if(nvl(p_attribute1.attribute30,'NULL') <> nvl(p_attribute2.attribute30,'NULL')) then
609   hxc_block_attribute_update.g_tc_api_flag := 'N';
610   return true;
611 end if;
612 --
613 -- If we get here, everything (that the user can change) is the same
614 -- so, don't process.
615 --
616 return false;
617 
618 End attributes_are_different;
619 
620 Function get_attribute_index
621           (p_attributes        in hxc_attribute_table_type
622           ,p_context           in hxc_time_attributes.attribute_category%type
623           ,p_building_block_id in hxc_time_building_blocks.time_building_block_id%type default null
624           ) return NUMBER is
625 
626 l_index     number;
627 l_found     boolean := false;
628 l_attribute number;
629 
630 Begin
631 
632 l_index := p_attributes.first;
633 
634 Loop
635   Exit when ((not p_attributes.exists(l_index)) or (l_found));
636 
637   if(p_attributes(l_index).attribute_category = p_context) then
638     if(p_building_block_id is not null) then
639       if(p_building_block_id = p_attributes(l_index).building_block_id) then
640       l_found := true;
641       l_attribute := l_index;
642       end if;
643     else
644       l_found := true;
645       l_attribute := l_index;
646     end if;
647   end if;
648   l_index := p_attributes.next(l_index);
649 End Loop;
650 
651 return l_attribute;
652 
653 End get_attribute_index;
654 
655 Procedure set_bld_blk_info_type_id
656            (p_attributes in out nocopy hxc_attribute_table_type) is
657 
658 l_index number;
659 
660 Begin
661 
662 l_index := p_attributes.first;
663 
664 Loop
665   Exit when not p_attributes.exists(l_index);
666   if(((p_attributes(l_index).bld_blk_info_type_id is null)
667     OR
668      (p_attributes(l_index).bld_blk_info_type_id = -1))
669     AND
670      (instr(p_attributes(l_index).bld_blk_info_type,hxc_timecard.c_alias_context_prefix) <1)
671     )then
672 
673     p_attributes(l_index).bld_blk_info_type_id := get_bld_blk_info_type_id(p_attributes(l_index).bld_blk_info_type);
674   end if;
675 
676   l_index := p_attributes.next(l_index);
677 
678 End Loop;
679 
680 End set_bld_blk_info_type_id;
681 
682 Function index_deposit_attributes(p_deposit_attributes in hxc_attribute_table_type)
683            return attribute_index is
684 
685 l_index           number;
686 l_attribute_index attribute_index;
687 
688 Begin
689 
690 l_index := p_deposit_attributes.first;
691 Loop
692   Exit when not p_deposit_attributes.exists(l_index);
693   l_attribute_index(p_deposit_attributes(l_index).time_attribute_id) := l_index;
694   l_index := p_deposit_attributes.next(l_index);
695 End Loop;
696 
697 return l_attribute_index;
698 
699 End index_deposit_attributes;
700 
701 Function attribute_present
702            (p_attribute_id in number
703            ,p_attribute_index in attribute_index
704            ) return boolean is
705 
706 Begin
707 
708 if(p_attribute_index.exists(p_attribute_id)) then
709   return true;
710 else
711   return false;
712 end if;
713 
714 End attribute_present;
715 
716 Procedure append_additional_reasons
717             (p_deposit_attributes in out nocopy hxc_attribute_table_type
718             ,p_attributes in                    hxc_attribute_table_type) is
719 
720 l_attribute_index attribute_index;
721 l_index           NUMBER;
722 
723 l_to_delete BOOLEAN;
724 l_index_to_delete 	NUMBER;
725 
726 Begin
727 
728 --First we need to remove the reason attributes which were added
729 --and not saved in the database.This happens when users first time
730 --enters the reaosns and then click on back and removes the reasons
731 
732 l_index:=p_deposit_attributes.first;
733 LOOP
734 EXIT WHEN NOT p_deposit_attributes.exists(l_index);
735 
736 l_to_delete := FALSE;
737 
738 if p_deposit_attributes(l_index).attribute_category='REASON' AND
739    p_deposit_attributes(l_index).time_attribute_id < 0 then
740 
741 	l_to_delete		:= TRUE;
742 	l_index_to_delete	:=l_index;
743 end if;
744 l_index:=p_deposit_attributes.next(l_index);
745 
746      IF l_to_delete = TRUE then
747 	p_deposit_attributes.delete(l_index_to_delete);
748      END IF;
749 END LOOP;
750 
751 --now we can add the new reasons
752 
753 l_attribute_index := index_deposit_attributes(p_deposit_attributes);
754 
755 l_index := p_attributes.first;
756 Loop
757   Exit when not p_attributes.exists(l_index);
758   if(p_attributes(l_index).attribute_category = hxc_timecard.c_reason_attribute) then
759     if(NOT attribute_present(p_attributes(l_index).time_attribute_id,l_attribute_index)) then
760       if(is_new_attribute(p_attributes(l_index))) then
761         p_deposit_attributes.extend;
762         p_deposit_attributes(p_deposit_attributes.last) := p_attributes(l_index);
763         p_deposit_attributes(p_deposit_attributes.last).process := hxc_timecard.c_yes;
764       end if;
765     end if;
766   end if;
767   l_index := p_attributes.next(l_index);
768 End Loop;
769 
770 End append_additional_reasons;
771 
772 Function effectively_deleted_attribute
773            (p_attribute in hxc_attribute_type)
774            return boolean is
775 Begin
776 
777 if(
778    (p_attribute.attribute_category is null)
779   AND
780    (p_attribute.attribute1 is null)
781   AND
782    (p_attribute.attribute2 is null)
783   AND
784    (p_attribute.attribute3 is null)
785   AND
786    (p_attribute.attribute4 is null)
787   AND
788    (p_attribute.attribute5 is null)
789   AND
790    (p_attribute.attribute6 is null)
791   AND
792    (p_attribute.attribute7 is null)
793   AND
794    (p_attribute.attribute8 is null)
795   AND
796    (p_attribute.attribute9 is null)
797   AND
798    (p_attribute.attribute10 is null)
799   AND
800    (p_attribute.attribute11 is null)
801   AND
802    (p_attribute.attribute12 is null)
803   AND
804    (p_attribute.attribute13 is null)
805   AND
806    (p_attribute.attribute14 is null)
807   AND
808    (p_attribute.attribute15 is null)
809   AND
810    (p_attribute.attribute16 is null)
811   AND
812    (p_attribute.attribute17 is null)
813   AND
814    (p_attribute.attribute18 is null)
815   AND
816    (p_attribute.attribute19 is null)
817   AND
818    (p_attribute.attribute20 is null)
819   AND
820    (p_attribute.attribute21 is null)
821   AND
822    (p_attribute.attribute22 is null)
823   AND
824    (p_attribute.attribute23 is null)
825   AND
826    (p_attribute.attribute24 is null)
827   AND
828    (p_attribute.attribute25 is null)
829   AND
830    (p_attribute.attribute26 is null)
831   AND
832    (p_attribute.attribute27 is null)
833   AND
834    (p_attribute.attribute28 is null)
835   AND
836    (p_attribute.attribute29 is null)
837   AND
838    (p_attribute.attribute30 is null)
839   ) then
840    return true;
841   else
842    return false;
843 end if;
844 
845 End effectively_deleted_attribute;
846 
847 Procedure remove_deleted_attributes
848             (p_attributes in out nocopy hxc_attribute_table_type) is
849 
850 l_index number;
851 
852 Begin
853 
854 l_index := p_attributes.first;
855 
856 Loop
857   Exit when not p_attributes.exists(l_index);
858 
859   if(effectively_deleted_attribute(p_attributes(l_index))) then
860     p_attributes.delete(l_index);
861   end if;
862 
863   l_index := p_attributes.next(l_index);
864 
865 End Loop;
866 
867 End remove_deleted_attributes;
868 
869 END hxc_timecard_attribute_utils;