DBA Data[Home] [Help]

PACKAGE BODY: APPS.HXC_TIMECARD_ATTRIBUTE_UTILS

Source


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