1 PACKAGE BODY pnp_util_func AS
2 -- $Header: PNPFUNCB.pls 120.19.12010000.3 2008/11/12 06:33:02 rthumma ship $
3
4 /*===========================================================================+
5 -- NAME : get_total_payment_item_amt
6 -- DESCRIPTION : Sum up and return the 'CASH' type payment items amount for a given
7 -- payment schedule record
8 -- NOTES : Currently being used in view "PN_PAYMENT_SCHEDULES_V"
9 -- Requires the global table: currencies_table is populated
10 -- SCOPE : PUBLIC
11 -- INVOKED FROM :
12 -- ARGUMENTS : IN:
13 -- p_status
14 -- p_curr_code
15 -- p_date
16 -- p_payment_schedule_id
17 --
18 -- OUT:
19 -- none
20 -- RETURNS : The sum of 'CASH' payment item amounts
21 -- REFERENCE : PN_COMMON.debug()
22 -- HISTORY :
23 --
24 -- 14-MAY-98 Neeraj Tandon o Created
25 -- 28-FEB-02 ftanudja o Modified to read FROM accounted amount column
26 -- Added parameters: status, curr_code, date
27 -- 02-APR-02 ftanudja o Modified to default to p_def_conv_type
28 -- 02-MAY-02 achauhan o Used the lesser of due_date, SYSDATE to perform
29 -- conversion
30 -- 03-MAY-02 ftanudja o For conversion of type 'User', use 'rate'.
31 -- 06-MAY-02 ftanudja o Removed parameter 'p_def_conv_type'
32 -- 24-JUL-02 ftanudja o Added check for NULL conversion type
33 -- 30-OCT-02 Satish o Access _all table for performance issues.
34 -- 28-NOV-05 sdmahesh o Added org_id parameter
35 -- Passed org_id to check_conversion_type
36 +===========================================================================*/
37
38 FUNCTION get_total_payment_item_amt (
39 p_status IN VARCHAR2,
40 p_curr_code IN VARCHAR2,
41 p_payment_schedule_id IN NUMBER,
42 p_called_FROM IN VARCHAR2
43
44 ) RETURN NUMBER
45 IS
46
47 total_item_amount NUMBER := 0;
48 l_conv_date DATE;
49 l_conv_type PN_CURRENCIES.CONVERSION_TYPE%TYPE;
50 l_org_id NUMBER(15);
51
52 CURSOR amounts_cursor IS
53 SELECT actual_amount, accounted_amount, currency_code, due_date, rate, org_id
54 FROM pn_payment_items_all
55 WHERE payment_schedule_id = p_payment_schedule_id
56 AND payment_item_type_lookup_code = 'CASH';
57
58 BEGIN
59
60 FOR amounts_record IN amounts_cursor LOOP
61 l_org_id := amounts_record.org_id;
62 IF p_status = 'APPROVED' THEN
63 total_item_amount := total_item_amount + NVL(amounts_record.accounted_amount,0);
64 ELSE
65 IF (amounts_record.currency_code = p_curr_code) THEN
66 total_item_amount := total_item_amount + NVL(amounts_record.actual_amount,0);
67 ELSE
68 l_conv_type := pnp_util_func.check_conversion_type(p_curr_code,l_org_id);
69
70 IF upper(l_conv_type) <> 'USER' THEN
71
72 IF amounts_record.due_date >= SYSDATE THEN
73 l_conv_date := SYSDATE;
74 ELSE
75 l_conv_date := amounts_record.due_date;
76 END IF;
77
78 total_item_amount := total_item_amount +
79 NVL(pnp_util_func.export_curr_amount(
80 currency_code => amounts_record.currency_code,
81 export_currency_code => p_curr_code,
82 export_date => l_conv_date,
83 conversion_type => l_conv_type,
84 actual_amount => NVL(amounts_record.actual_amount,0),
85 p_called_FROM => p_called_FROM)
86 ,0);
87 ElSIF upper(l_conv_type) = 'USER' THEN
88 total_item_amount := total_item_amount + NVL(amounts_record.rate,0) * NVL(amounts_record.actual_amount,0);
89
90 END IF; /* ignore cases WHERE l_conv_type is NULL */
91
92 END IF;
93 END IF;
94 END LOOP;
95
96 RETURN total_item_amount;
97
98 EXCEPTION
99
100 WHEN OTHERS THEN
101 IF p_called_FROM = 'PNTAUPMT' THEN
102 NULL;
103 ELSE
104 RAISE;
105 END IF;
106
107 END;
108
109 /*===========================================================================+
110 -- NAME : get_total_payment_term_amt
111 -- DESCRIPTION : Sum up and return the 'CASH' type payment items amount for a given
112 -- payment term record
113 -- NOTES : Currently being used in view "PN_PAYMENT_TERRMS_V"
114 -- SCOPE : PUBLIC
115 -- INVOKED FROM :
116 -- ARGUMENTS : IN:
117 -- p_paymentTermId
118 --
119 -- OUT:
120 -- none
121 -- RETURNS : The sum of 'CASH' payment item amounts
122 -- REFERENCE :
123 -- HISTORY :
124 -- 14-MAY-98 Neeraj Tandon o Created
125 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
126 +===========================================================================*/
127
128 FUNCTION GET_TOTAL_PAYMENT_TERM_AMT (
129 p_paymentTermId IN NUMBER
130 ) RETURN NUMBER
131 IS
132
133 l_totalTermAmt NUMBER := NULL;
134
135 BEGIN
136
137 SELECT NVL(SUM(ppi.actual_amount),0)
138 INTO l_totalTermAmt
139 FROM pn_payment_items_all ppi
140 WHERE ppi.PAYMENT_TERM_ID = p_paymentTermId
141 AND ppi.payment_item_type_lookup_code = 'CASH';
142
143 RETURN l_totalTermAmt;
144
145 EXCEPTION
146
147 WHEN OTHERS THEN
148 RAISE;
149
150 END GET_TOTAL_PAYMENT_TERM_AMT ;
151
152 /*===========================================================================+
153 | FUNCTION
154 | get_concatenated_address
155 |
156 | DESCRIPTION
157 | This FUNCTION RETURNs a sigle string of concatenated address
158 | segments.
159 |
160 | SCOPE - PUBLIC
161 |
162 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
163 |
164 | ARGUMENTS : IN:
165 | address_style
166 | address_line1
167 | address_line2
168 | address_line3
169 | address_line4
170 | city
171 | county
172 | state
173 | province
174 | zip_code
175 |
176 | OUT:
177 | none
178 |
179 | RETURNS : Concatenated Address String
180 |
181 | NOTES : Currently being used in view "PN_COMPANY_SITES_V"
182 |
183 | MODIFICATION HISTORY
184 |
185 | 08-JUN-1998 Neeraj Tandon Created
186 +===========================================================================*/
187 FUNCTION get_concatenated_address (
188 address_style IN VARCHAR2,
189 address_line1 IN VARCHAR2,
190 address_line2 IN VARCHAR2,
191 address_line3 IN VARCHAR2,
192 address_line4 IN VARCHAR2,
193 city IN VARCHAR2,
194 county IN VARCHAR2,
195 state IN VARCHAR2,
196 province IN VARCHAR2,
197 zip_code IN VARCHAR2,
198 territory_short_name IN VARCHAR2
199 )RETURN VARCHAR2
200 IS
201 l_address VARCHAR2(1000);
202 BEGIN
203 -- pn_addresses.address_line1 is a NOT NULL field.
204 l_address := address_line1;
205
206 IF ( address_line2 IS NOT NULL ) THEN
207 l_address := l_address || ', ' || address_line2;
208 END IF;
209
210 IF ( address_line3 IS NOT NULL ) THEN
211 l_address := l_address || ', ' || address_line3;
212 END IF;
213
214 IF ( address_line4 IS NOT NULL ) THEN
215 l_address := l_address || ', ' || address_line4;
216 END IF;
217
218 IF ( city IS NOT NULL ) THEN
219 l_address := l_address || ', ' || city;
220 END IF;
221
222 IF ( county IS NOT NULL ) THEN
223 l_address := l_address || ', ' || county;
224 END IF;
225
226 IF ( state IS NOT NULL ) THEN
227 l_address := l_address || ', ' || state;
228 END IF;
229
230 IF ( province IS NOT NULL ) THEN
231 l_address := l_address || ', ' || province;
232 END IF;
233
234 IF ( zip_code IS NOT NULL ) THEN
235 l_address := l_address || ', ' || zip_code;
236 END IF;
237
238 IF ( territory_short_name IS NOT NULL ) THEN
239 l_address := l_address || ', ' || territory_short_name;
240 END IF;
241
242 RETURN( l_address );
243
244 END get_concatenated_address;
245
246
247 /*=============================================================================+
248 -- NAME : Get_Allocated_Area_By_CC
249 -- DESCRIPTION : RETURN the Allocated Area by Cost Center
250 -- NOTES : Currently being used in Space Allocations Report - PNSPALLO
251 -- SCOPE : PUBLIC
252 -- INVOKED FROM :
253 -- ARGUMENTS : IN: p_location_id , p_Cost_Center
254 -- OUT: none
255 -- RETURNS : Allocated area for a location_id (building/floor/office ),
256 -- for a cost center
257 -- REFERENCE :
258 -- HISTORY :
259
260 -- 04-SEP-99 Naga Vijayapuram o Created
261 -- 16-JUN-00 Daniel Thota o Included reference to PN_SPACE_ASSIGN_EMP
262 -- AND PN_SPACE_ASSIGN_CUST for new space
263 -- assignment architecture.
264 -- 17-AUG-00 Daniel Thota o Added new parameter p_as_of_date to the
265 -- function. Changed the WHERE clause to
266 -- include p_as_of_date - Bug Fix for #1379527
267 -- 08-SEP-00 Daniel Thota o Re-introduced comparison of p_as_of_date
268 -- with end date - Bug Fix for #1379527
269 -- 18-SEP-00 Lakshmikanth K o Using the variable
270 -- l_date Date:= TO_DATE('31-DEC-2199' ,
271 -- ('DD/MM/YYYY')) in the end date
272 -- comparision with the as_of_date
273 -- 19-SEP-00 Lakshmikanth K o Replacing the TO_DATE('31-DEC-2199' ,
274 -- ('DD/MM/YYYY')) with
275 -- TO_DATE('31/12/2199' , ('DD/MM/YYYY'))
276 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
277 -- 20-OCT-03 ftanudja o Removed nvl. 3197410.
278 -- 18-FEB-04 abanerje o Handled NO_DATA_FOUND to return 0.
279 -- All the select statements have been
280 -- converted to cursors. The l_location_type
281 -- is checked for null to return 0
282 -- Bug #3384965
283 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP
284 -- and PN_SPACE_ASSIGN_CUST with _ALL table.
285 +============================================================================*/
286
287 FUNCTION Get_Allocated_Area_By_CC ( p_Location_Id NUMBER ,
288 p_Cost_Center VARCHAR2,
289 p_As_Of_Date DATE )
290 RETURN NUMBER IS
291
292 l_Location_Type pn_locations.location_type_lookup_code%type;
293 l_Allocated_Area NUMBER;
294 l_Allocated_Area_Emp NUMBER;
295 l_Allocated_Area_Cust NUMBER;
296 l_date DATE := TO_DATE('31/12/4712' , 'DD/MM/YYYY');
297 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
298 INVALID_LOCATION_TYPE EXCEPTION;
299
300 CURSOR Alloc_Area_Emp_C ( p_Location_Id IN NUMBER
301 ,p_Cost_Center IN NUMBER
302 ,p_As_Of_Date IN DATE)
303 IS
304 (SELECT NVL(SUM(Allocated_Area), 0) AS area
305 FROM PN_SPACE_ASSIGN_EMP_ALL
306 WHERE Cost_Center_Code = p_Cost_Center
307 AND emp_assign_start_date <= p_As_Of_Date
308 AND NVL(emp_assign_end_date, l_date) >= p_As_Of_Date
309 AND Location_Id IN (
310 SELECT Location_Id
311 FROM PN_LOCATIONS_ALL
312 WHERE Location_Type_Lookup_Code = 'OFFICE'
313 AND p_As_Of_Date BETWEEN active_start_date AND active_end_date
314 START WITH Location_Id = p_Location_Id
315 CONNECT BY PRIOR Location_Id = Parent_Location_Id
316 AND p_As_Of_Date BETWEEN PRIOR active_start_date AND
317 PRIOR active_end_date)
318 );
319
320 CURSOR Alloc_Area_Cust_C ( p_Location_Id IN NUMBER
321 ,p_Cost_Center IN NUMBER
322 ,p_As_Of_Date IN DATE)
323 IS
324 (SELECT NVL(SUM(Allocated_Area), 0) AS area
325 FROM PN_SPACE_ASSIGN_CUST_ALL
326 WHERE cust_assign_start_date <= p_As_Of_Date
327 AND NVL(cust_assign_end_date, l_date) >= p_As_Of_Date
328 AND Location_Id IN (
329 SELECT Location_Id
330 FROM PN_LOCATIONS_ALL
331 WHERE Location_Type_Lookup_Code = 'OFFICE'
332 AND p_As_Of_Date BETWEEN active_start_date AND active_end_date
333 START WITH Location_Id = p_Location_Id
334 CONNECT BY PRIOR Location_Id = Parent_Location_Id
335 AND p_As_Of_Date BETWEEN PRIOR active_start_date AND PRIOR active_end_date)
336 );
337
338 BEGIN
339
340 l_location_type := pnp_util_func.get_location_type_lookup_code (
341 p_location_id => p_location_id,
342 p_as_of_date => l_as_of_date);
343
344 IF l_Location_Type IS NULL THEN
345
346 RETURN 0;
347
348 ELSIF l_Location_Type IN ('BUILDING', 'FLOOR', 'OFFICE') THEN
349
350 FOR emp_area IN Alloc_Area_Emp_C( p_Location_Id
351 ,p_Cost_Center
352 ,l_As_Of_Date)
353 LOOP
354 l_Allocated_Area_Emp := emp_area.area;
355 END LOOP;
356
357 FOR cust_area IN Alloc_Area_Cust_C( p_Location_Id
358 ,p_Cost_Center
359 ,l_As_Of_Date)
360 LOOP
361 l_Allocated_Area_Cust := cust_area.area;
362 END LOOP;
363
364 l_Allocated_Area := NVL(l_Allocated_Area_Emp,0)
365 + NVL(l_Allocated_Area_Cust,0);
366
367 RETURN ROUND(l_Allocated_Area, 0);
368
369 ELSE
370 RAISE INVALID_LOCATION_TYPE ;
371
372 END IF;
373
374 EXCEPTION
375 WHEN INVALID_LOCATION_TYPE THEN
376 RAISE;
377 WHEN NO_DATA_FOUND THEN
378 RETURN 0;
379 WHEN OTHERS THEN
380 RAISE;
381
382 END Get_Allocated_Area_By_CC ;
383
384 /*===========================================================================+
385 -- NAME : Get_Vacant_Area
386 -- DESCRIPTION : RETURN the Vacant Area
387 -- NOTES : Currently being used in views "PN_LOCATIONS_V",
388 -- "PN_BUILDING_V", "PN_FLOORS_V", "PN_OFFICES_V"
389 -- AND form PNTSPACE.fmb ( Space Assignments form )
390 -- ASSUMPTION : Sum of Usable Areas of Offices = Usable Area of Floor
391 -- Sum of Usable Areas of Floors = Usable Area of Building
392 -- ALGORITHM : Computation of Usable/Allocated/Vacant Areas proceeds FROM
393 -- Office --> Floor --> Building
394 -- SCOPE : PUBLIC
395 -- INVOKED FROM :
396 -- ARGUMENTS : IN: p_location_id
397 -- OUT: none
398 -- RETURNS : Vacant area for a location_id ( building/floor/office )
399 --
400 -- REFERENCE :
401 -- HISTORY :
402 -- 14-MAY-98 Neeraj o Created get_used_area
403 -- 05-AUG-98 Nagabh o Modified get_used_area to get_vacant_area
404 -- 04-SEP-99 Nagabh o Refined - Note ASSUMPTION/ALGORITHM above
405 -- 16-JUN-00 Daniel o Included reference to PN_SPACE_ASSIGN_EMP and
406 -- PN_SPACE_ASSIGN_CUST for new spc asgn architecture
407 -- 17-AUG-00 Daniel o Bug #1379527
408 -- 29-AUG-00 Daniel o calculation of vacant area to be dependent on assignabl
409 -- area instead of usable area - Bug #1386613
410 -- 08-SEP-00 Daniel o Bug #1379527 Re-introduced comparison of p_as_of_date
411 -- 18-SEP-00 Lakshmi o Using the variable
412 -- l_date Date:= TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
413 -- in the end date comparision with the as_of_date
414 -- 19-SEP-00 Lakshmi o Replacing the TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
415 -- with TO_DATE('31/12/2199' , ('DD/MM/YYYY'))
416 -- 01-MAR-01 Mrinal o Separated quries for 'BUILDING','FLOOR'/'OFFICE' AND
417 -- 'LAND','PARCEL'/'SECTION' by putting INTO IF-ELSE cond.
418 -- 14-MAY-01 Lakshmi o Bug #1766171. Do not round
419 -- l_Assignable_Area - l_Allocated_Area
420 -- 22-JAN-02 Kiran o Bug #2168485. SELECT only the active locations
421 -- 30-OCT-02 Satish o Access _all table for performance issues.
422 -- 10-JAN-03 Mrinal o In the IF condn. for OFFICE/SECTION, while getting the
423 -- allocated_area, the join between location and space
424 -- assignment tables was fetching duplicate records. Fix
425 -- by using EXISTS to check for status = 'A'.
426 -- 20-OCT-03 ftanudja o removed nvl's from locn query. 3197410.
427 -- 18-FEB-04 abanerje o Handled NO_DATA_FOUND to return 0. Select statements
428 -- have been converted to cursors. The l_location_type
429 -- is checked for null to return 0. Bug #3384965.
430 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pn_space_assign_emp
431 -- and pn_space_assign_cust with _ALL table.
432 +===========================================================================*/
433
434 FUNCTION get_vacant_area ( p_location_id NUMBER,
435 p_as_of_date DATE)
436 RETURN NUMBER IS
437
438 l_location_type pn_locations.location_type_lookup_code%type;
439 l_usable_area NUMBER;
440 l_allocated_area NUMBER;
441 l_assignable_area NUMBER;
442 l_allocated_area_emp NUMBER;
443 l_allocated_area_cust NUMBER;
444 l_date DATE := TO_DATE('31/12/4712', 'DD/MM/YYYY');
445 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
446
447
448 INVALID_LOCATION_TYPE EXCEPTION;
449
450 CURSOR Assignable_Area_C(p_Location_Id IN NUMBER
451 ,p_As_of_date IN DATE
452 ,p_location_type IN VARCHAR2) IS
453 (SELECT NVL(SUM(assignable_area), 0) AS Area
454 FROM pn_locations_all
455 WHERE location_type_lookup_code = p_location_type
456 AND status = 'A'
457 AND p_as_of_date BETWEEN active_start_date AND active_end_date
458 START WITH location_id = p_Location_Id
459 CONNECT BY PRIOR location_id = parent_location_id
460 AND p_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date
461 );
462
463 CURSOR Allocated_Area_Emp_C(p_Location_Id IN NUMBER
464 ,p_As_of_date IN DATE
465 ,p_location_type IN VARCHAR2) IS
466 (SELECT NVL(SUM(allocated_area), 0) AS Area
467 FROM pn_space_assign_emp_all
468 WHERE emp_assign_start_date <= p_as_of_date
469 AND NVL(emp_assign_end_date, l_date) >= p_as_of_date
470 AND location_id IN (SELECT Location_Id
471 FROM pn_locations_all
472 WHERE location_type_lookup_code = p_location_type
473 AND Status = 'A'
474 AND p_as_of_date BETWEEN active_start_date AND active_end_date
475 START WITH Location_Id = p_Location_Id
476 CONNECT BY PRIOR Location_Id = parent_location_id
477 AND p_as_of_date BETWEEN prior active_start_date AND
478 PRIOR active_end_date
479 )
480 );
481
482 CURSOR Allocated_Area_Cust_C(p_Location_Id IN NUMBER
483 ,p_As_of_date IN DATE
484 ,p_location_type IN VARCHAR2) IS
485 (SELECT NVL(SUM(allocated_area), 0) AS Area
486 FROM pn_space_assign_cust_all
487 WHERE cust_assign_start_date <= p_As_of_date
488 AND NVL(cust_assign_end_date, l_date) >= p_As_of_date
489 AND location_Id IN (SELECT location_id
490 FROM pn_locations_all
491 WHERE location_type_lookup_code = p_location_type
492 AND status = 'A'
493 AND p_as_of_date BETWEEN active_start_date AND active_end_date
494 START WITH location_id = p_location_id
495 CONNECT BY PRIOR location_id = parent_location_id
496 AND p_as_of_date between PRIOR active_start_date AND
497 PRIOR active_end_date)
498 );
499
500 CURSOR Assignable_Area_Child_C(p_Location_Id IN NUMBER
501 ,p_As_of_date IN DATE) IS
502 (SELECT NVL(SUM(assignable_area), 0) AS Area
503 FROM pn_locations_all
504 WHERE location_id = p_location_id
505 AND p_as_of_date BETWEEN active_start_date AND active_end_date
506 AND status = 'A'
507 );
508
509 CURSOR Allocated_Area_Child_Emp_C(p_Location_Id IN NUMBER
510 ,p_As_of_date IN DATE) IS
511 (SELECT NVL(SUM(e.allocated_area), 0) AS Area
512 FROM pn_space_assign_emp_all e
513 WHERE E.emp_assign_start_date <= p_as_of_date
514 AND NVL(e.emp_assign_end_date, l_date) >= p_as_of_date
515 AND e.location_id = p_location_id
516 AND EXISTS (SELECT NULL
517 FROM pn_locations_all l
518 WHERE l.status = 'A'
519 AND l.location_id = p_Location_Id)
520 );
521
522 CURSOR Allocated_Area_Child_Cust_C(p_Location_Id IN NUMBER
523 ,p_As_of_date IN DATE) IS
524 (SELECT NVL(SUM(c.allocated_area), 0) AS Area
525 FROM pn_space_assign_cust_all c
526 WHERE c.cust_assign_start_date <= p_as_of_date
527 AND NVL(c.cust_assign_end_date, l_date) >= p_as_of_date
528 AND c.location_id = p_location_id
529 AND EXISTS (SELECT NULL
530 FROM pn_locations_all l
531 WHERE l.status = 'A'
532 AND l.location_id = p_location_id)
533 );
534
535 BEGIN
536
537 l_location_type := pnp_util_func.get_location_type_lookup_code(
538 p_location_id => p_location_id,
539 p_as_of_date => l_as_of_date);
540
541
542 IF l_location_type IS NULL THEN
543 RETURN 0;
544
545 ELSIF (l_location_type IN ('BUILDING', 'FLOOR','LAND', 'PARCEL')) THEN
546 IF l_location_type in ('BUILDING', 'FLOOR') then
547 l_location_type := 'OFFICE' ;
548 ELSIF l_location_type in ('LAND', 'PARCEL') then
549 l_location_type := 'SECTION' ;
550 END IF;
551
552 FOR emp_area IN Allocated_Area_Emp_C( p_Location_Id
553 ,l_As_Of_Date
554 ,l_location_type)
555 LOOP
556 l_Allocated_Area_Emp := emp_area.area;
557 END LOOP;
558
559 FOR cust_area IN Allocated_Area_Cust_C( p_Location_Id
560 ,l_As_Of_Date
561 ,l_location_type)
562 LOOP
563 l_Allocated_Area_Cust := cust_area.area;
564 END LOOP;
565
566 FOR assignable_area IN Assignable_Area_C( p_Location_Id
567 ,l_As_Of_Date
568 ,l_location_type)
569 LOOP
570 l_assignable_area := assignable_area.area;
571 END LOOP;
572
573 l_Allocated_Area := NVL(l_Allocated_Area_Emp,0)
574 + NVL(l_Allocated_Area_Cust,0);
575
576 RETURN (NVL(l_assignable_area,0) - l_allocated_area);
577
578 ELSIF l_location_type in('OFFICE','SECTION') THEN
579
580 FOR emp_area IN Allocated_Area_Child_Emp_C( p_Location_Id
581 ,l_As_Of_Date)
582 LOOP
583 l_Allocated_Area_Emp := emp_area.area;
584 END LOOP;
585
586 FOR cust_area IN Allocated_Area_Child_Cust_C( p_Location_Id
587 ,l_As_Of_Date)
588 LOOP
589 l_Allocated_Area_Cust := cust_area.area;
590 END LOOP;
591
592 FOR assignable_area IN Assignable_Area_Child_C( p_Location_Id
593 ,l_As_Of_Date)
594 LOOP
595 l_assignable_area := assignable_area.area;
596 END LOOP;
597
598 l_Allocated_Area := NVL(l_Allocated_Area_Emp,0)
599 + NVL(l_Allocated_Area_Cust,0);
600
601 RETURN (NVL(l_assignable_area,0) - l_allocated_area);
602
603 ELSE
604
605 RAISE INVALID_LOCATION_TYPE ;
606
607 END IF;
608
609 EXCEPTION
610 WHEN INVALID_LOCATION_TYPE THEN
611 RAISE;
612 WHEN NO_DATA_FOUND THEN
613 RETURN 0;
614 WHEN OTHERS THEN
615 RAISE;
616
617 END get_vacant_area;
618
619 /*===========================================================================+
620 | FUNCTION
621 | Get_Vacant_Area_Percent
622 |
623 | DESCRIPTION
624 | RETURN the Vacant Area Percentage
625 |
626 | SCOPE - PUBLIC
627 |
628 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
629 |
630 | ARGUMENTS:
631 | IN: p_location_id
632 | OUT: none
633 |
634 | RETURNS:
635 | Vacant area percentage for a location_id ( building )
636 |
637 | NOTES:
638 | Currently being used in views "PN_LOCATIONS_V"
639 | "PN_BUILDING_V"
640 | AND form PNSULOCN.fmb ( Locations form )
641 |
642 | ASSUMPTION:
643 |
644 | ALGORITHM
645 |
646 | MODIFICATION HISTORY
647 |
648 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
649 | pnp_util_func.Get_Vacant_Area
650 | - Bug Fix for #1379527
651 | 05-FEB-2001 Lakshmikanth Replaced get_building_rentable_area by
652 | get_building_assignable_area in the
653 | get_vacant_area_percent.
654 | - Bug Fix for #1519506.
655 | 05-MAY-2004 ftanudja handle if location type is null.
656 +===========================================================================*/
657
658 FUNCTION get_vacant_area_percent ( p_Location_Id NUMBER ,
659 p_as_of_date DATE ) RETURN NUMBER IS
660
661 l_Location_Type pn_locations.location_type_lookup_code%type;
662 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
663 l_Vacant_Area NUMBER:= Get_Vacant_Area ( p_Location_Id,
664 pnp_util_func.get_as_of_date(p_as_of_date));
665 l_Assignable_Area NUMBER:= get_building_assignable_area ( p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
666 INVALID_LOCATION_TYPE EXCEPTION;
667 a NUMBER := 0;
668
669 BEGIN
670
671 l_location_type := pnp_util_func.get_location_type_lookup_code(
672 p_location_id => p_location_id,
673 p_as_of_date => l_as_of_date);
674
675 IF l_location_type IS NULL THEN
676 raise NO_DATA_FOUND;
677 ELSIF l_Location_Type in('BUILDING', 'LAND') THEN
678
679 IF (NVL(l_Assignable_Area, 0) = 0) THEN
680 a:= 0;
681 ELSE
682 a:= (l_Vacant_Area * 100/l_Assignable_Area);
683 END IF;
684
685 Else
686 Raise INVALID_LOCATION_TYPE ;
687
688 End IF;
689
690 RETURN a;
691
692 EXCEPTION
693 WHEN INVALID_LOCATION_TYPE THEN
694 RAISE;
695
696 WHEN OTHERS THEN
697 RAISE;
698
699 END get_vacant_area_percent;
700
701
702 /*===========================================================================+
703 | FUNCTION
704 | get_load_factor
705 |
706 | DESCRIPTION
707 | RETURN the Load Factor
708 |
709 | SCOPE - PUBLIC
710 |
711 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
712 |
713 | ARGUMENTS:
714 | IN: p_location_id
715 | OUT: none
716 |
717 | RETURNS:
718 | Load Factor for a location_id ( Building/LAND )
719 |
720 | NOTES:
721 | Currently being used in views "PN_LOCATIONS_V"
722 | "PN_BUILDING_V"
723 | AND form PNSULOCN.fmb ( Locations form )
724 |
725 | ASSUMPTION:
726 |
727 | ALGORITHM
728 |
729 | MODIFICATION HISTORY
730 | 05-MAY-04 ftanudja o handle if location type is null.
731 +===========================================================================*/
732
733
734 FUNCTION get_load_factor ( p_Location_Id NUMBER ,
735 p_as_of_date DATE ) RETURN NUMBER IS
736
737
738 l_Location_Type pn_locations.location_type_lookup_code%type;
739
740 l_Rentable_Area NUMBER:= get_building_rentable_area (p_location_id,
741 pnp_util_func.get_as_of_date(p_as_of_date));
742 l_Usable_Area NUMBER:= get_building_usable_area ( p_location_id,
743 pnp_util_func.get_as_of_date(p_as_of_date));
744 l_return_value NUMBER;
745 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
746 INVALID_LOCATION_TYPE EXCEPTION;
747 a NUMBER:= 0;
748
749 BEGIN
750
751
752 l_location_type := pnp_util_func.get_location_type_lookup_code (
753 p_location_id => p_location_id,
754 p_as_of_date => l_as_of_date);
755
756 IF l_location_type IS NULL THEN
757 raise NO_DATA_FOUND;
758 ELSIF l_Location_Type in ('BUILDING', 'LAND') THEN
759
760 IF (NVL(l_usable_area, 0) = 0) THEN
761 a:= 0;
762 ELSE
763 a:= ((l_Rentable_Area/l_Usable_Area) - 1);
764 END IF;
765 Else
766 Raise INVALID_LOCATION_TYPE ;
767
768 End IF;
769
770 RETURN a;
771
772 EXCEPTION
773 WHEN INVALID_LOCATION_TYPE THEN
774 RAISE;
775
776 WHEN OTHERS THEN
777 RAISE;
778
779 END get_load_factor;
780
781
782 /*===========================================================================+
783 | FUNCTION
784 | get_floors
785 |
786 | DESCRIPTION
787 | RETURN the NUMBER of floors associated with a ( Building/LAND )
788 |
789 | SCOPE - PUBLIC
790 |
791 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
792 |
793 | ARGUMENTS:
794 | IN: p_location_id
795 | OUT: none
796 |
797 | RETURNS:
798 | RETURN the NUMBER of floors associated with a ( Building/LAND )
799 |
800 | NOTES:
801 | Currently being used in views "PN_LOCATIONS_V"
802 | "PN_BUILDING_V"
803 | AND form PNSULOCN.fmb ( Locations form )
804 |
805 | ASSUMPTION:
806 |
807 | ALGORITHM
808 |
809 | MODIFICATION HISTORY
810 | 22-JAN-02 Kiran o Bug Fix for the Bug ID#2168485.
811 | Added the Status = 'A' condition for all the
812 | SELECT statements to SELECT only the active
813 | locations
814 | 30-OCT-02 Satish o Access _all table for performance issues.
815 |
816 | 31-OCT-01 graghuna o added p_as_of_date for Location Date-Effectivity.
817 | 20-OCT-03 ftanudja o removed nvl's for locations tbl. 3197410.
818 | 18-FEB-04 abanerje o Handled NO_DATA_FOUND exception to return null.
819 | The select statment has been changed to a
820 | cursor now.
821 | Bug #3384965.
822 +===========================================================================*/
823
824 FUNCTION get_floors ( p_Location_Id NUMBER ,
825 p_as_of_date DATE )
826 RETURN NUMBER IS
827
828 l_Location_Type pn_locations.location_type_lookup_code%type;
829 l_floors NUMBER;
830 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
831 INVALID_LOCATION_TYPE EXCEPTION;
832
833 CURSOR floor_count_C( p_Location_Id NUMBER
834 ,p_as_of_date DATE
835 ,p_location_type VARCHAR2) IS
836 (SELECT COUNT(pn_locations_all.floor) AS floor_count
837 FROM pn_locations_all
838 WHERE Location_Type_Lookup_Code = p_location_type
839 AND Status = 'A'
840 AND p_as_of_date BETWEEN active_start_date AND active_end_date
841 START WITH Location_Id = p_Location_Id
842 CONNECT BY PRIOR Location_Id = Parent_Location_Id
843 AND p_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date
844 );
845
846 BEGIN
847
848
849 l_location_type := pnp_util_func.get_location_type_lookup_code (
850 p_location_id => p_location_id,
851 p_as_of_date => l_as_of_date);
852
853 IF l_location_type IS NULL THEN
854 RETURN 0;
855 ELSIF l_location_type in ('BUILDING', 'LAND') THEN
856
857 IF l_location_type = 'BUILDING' then
858 l_location_type := 'FLOOR' ;
859 ELSE
860 l_location_type := 'PARCEL' ;
861 END IF;
862
863 FOR floor_cnt IN floor_count_C( p_Location_Id
864 ,l_As_Of_Date
865 ,l_location_type)
866 LOOP
867 l_floors := floor_cnt.floor_count;
868 END LOOP;
869
870 RETURN (NVL(l_floors,0));
871 ELSE
872 Raise INVALID_LOCATION_TYPE ;
873
874 END IF;
875
876 EXCEPTION
877 WHEN INVALID_LOCATION_TYPE THEN
878 RAISE;
879 WHEN NO_DATA_FOUND THEN
880 RETURN 0;
881 WHEN OTHERS THEN
882 RAISE;
883
884 END get_floors;
885
886
887 /*===========================================================================+
888 | FUNCTION
889 | get_offices
890 |
891 | DESCRIPTION
892 | RETURN the NUMBER of offices associated with a ( Building/LAND )
893 |
894 | SCOPE - PUBLIC
895 |
896 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
897 |
898 | ARGUMENTS:
899 | IN: p_location_id
900 | OUT: none
901 |
902 | RETURNS:
903 | RETURN the NUMBER of offices associated with a ( Building/LAND )
904 |
905 | NOTES:
906 | Currently being used in views "PN_LOCATIONS_V"
907 | "PN_BUILDING_V"
908 | AND form PNSULOCN.fmb ( Locations form )
909 |
910 | ASSUMPTION:
911 |
912 | ALGORITHM
913 |
914 | MODIFICATION HISTORY
915 | 22-JAN-2002 Kiran o Bug Fix for the Bug ID#2168485.
916 | Added the Status = 'A' condition for all the
917 | SELECT statements to SELECT only the active
918 |
919 | 30-OCT-2002 Satish o Access _all table for performance issues.
920 |
921 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
922 | 10-JUL-2003 Satish o Added for 'FLOOR/PARCEL'
923 | 20-OCT-2003 ftanudja o removed nvl's for locations tbl. 3197410.
924 | 05-MAY-2004 ftanudja o handle if location type is null.
925 +===========================================================================*/
926
927 FUNCTION get_offices ( p_Location_Id NUMBER ,
928 p_as_of_date IN DATE )
929 RETURN NUMBER IS
930
931 l_Location_Type pn_locations.location_type_lookup_code%type;
932 l_offices NUMBER;
933 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
934 INVALID_LOCATION_TYPE EXCEPTION;
935
936 BEGIN
937
938
939 l_location_type := pnp_util_func.get_location_type_lookup_code (
940 p_location_id => p_location_id,
941 p_as_of_date => l_as_of_date);
942
943 IF l_location_type IS NULL THEN
944 raise NO_DATA_FOUND;
945 ELSIF l_location_type IN ('BUILDING','LAND','FLOOR','PARCEL') THEN
946
947 IF l_location_type IN ('BUILDING','FLOOR') THEN
948 l_location_type := 'OFFICE' ;
949 ELSE
950 l_location_type := 'SECTION' ;
951 END IF;
952
953 SELECT COUNT(office)
954 INTO l_offices
955 FROM pn_locations_all
956 WHERE Location_Type_Lookup_Code = l_location_type --'OFFICE'
957 AND Status = 'A' --BUG#2168485
958 AND l_as_of_date BETWEEN active_start_date AND active_end_date
959 START WITH Location_Id = p_Location_Id
960 CONNECT BY PRIOR Location_Id = Parent_Location_Id
961 AND l_as_of_date between prior active_start_date and
962 PRIOR active_end_date;
963
964 Else
965 Raise INVALID_LOCATION_TYPE ;
966
967 End IF;
968
969 RETURN (l_offices);
970
971 EXCEPTION
972 WHEN NO_DATA_FOUND THEN
973 RETURN null;
974 WHEN INVALID_LOCATION_TYPE THEN
975 RAISE;
976
977 WHEN OTHERS THEN
978 RAISE;
979
980 END get_offices;
981
982
983
984 /*===========================================================================+
985 -- NAME : get_utilized_capacity
986 -- DESCRIPTION : RETURN the Utilized Capacity for a given location_id
987 -- NOTES : Currently being used in view "PN_LOCATIONS_V"
988 -- "PN_BUILDING_V", "PN_FLOORS_V", "PN_OFFICES_V"
989 -- AND Space Assignments form - "PNTSPACE.fmb"
990 -- SCOPE : PUBLIC
991 -- INVOKED FROM :
992 -- ARGUMENTS : IN: p_location_id
993 -- OUT: none
994 -- RETURNS : Total utilized capacity for a location
995 --
996 -- REFERENCE :
997 -- HISTORY :
998 --
999 -- 14-MAY-98 Neeraj o Created
1000 -- 05-AUG-98 Nagabh o Modified to take only location_id arg.
1001 -- 16-JUN-00 Daniel o Included reference to PN_SPACE_ASSIGN_EMP
1002 -- AND PN_SPACE_ASSIGN_CUST for new space
1003 -- assignment architecture.
1004 -- 17-AUG-00 Daniel o Added new parameter p_as_of_date to the
1005 -- function. Changed the WHERE clause to
1006 -- include p_as_of_date - Bug Fix for #1379527
1007 -- 01-SEP-00 Daniel o Changed to suit roll-up feature AND
1008 -- to use sum of utilized area
1009 -- Bug # 1377665 AND 1383188
1010 -- 08-SEP-00 Daniel o Re-introduced comparison of p_as_of_date
1011 -- with end date - Bug Fix for #1379527
1012 -- 18-SEP-00 Lakshmi K o Using the variable l_date
1013 -- Date:= TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
1014 -- in the end date comparision with the as_of_date
1015 -- 19-SEP-00 Lakshmi K o Replacing the
1016 -- TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
1017 -- with TO_DATE('31/12/2199' , ('DD/MM/YYYY'))
1018 -- 01-MAR-01 Mrinal o Separated queries for 'BUILDING/LAND',
1019 -- 'FLOOR/PARCEL' AND 'OFFICE/SECTION'
1020 -- by putting IF-ELSE condition.
1021 -- 30-OCT-02 Satish o Access _all table for performance issues.
1022 -- 20-OCT-03 ftanudja o removed nvl's for locations tbl. 3197410.
1023 -- 18-FEB-04 abanerje o Handled NO_DATA_FOUND to return 0.
1024 -- All the select statements have been converted
1025 -- to cursors. The l_location_type is checked
1026 -- for null to return 0 Bug #3384965.
1027 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
1028 -- PN_SPACE_ASSIGN_CUST with _ALL table.
1029 +===========================================================================*/
1030
1031 FUNCTION get_utilized_capacity ( p_location_id IN NUMBER,
1032 p_As_Of_Date IN DATE)
1033 RETURN NUMBER
1034 IS
1035 l_LocationType pn_locations.location_type_lookup_code%TYPE;
1036 l_UtilizedCapacity NUMBER:=0;
1037 l_UtilizedCapacityEmp NUMBER:=0;
1038 l_UtilizedCapacityCust NUMBER:=0;
1039 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1040
1041 CURSOR Utilised_Capacity_Emp_C( p_location_id IN NUMBER,
1042 p_As_Of_Date IN DATE) IS
1043 (SELECT SUM(NVL(UTILIZED_AREA,0)) AS Area
1044 FROM pn_space_assign_emp_all
1045 WHERE location_id IN (SELECT a.location_id
1046 FROM pn_locations_all a
1047 WHERE p_As_Of_Date BETWEEN active_start_date AND
1048 active_end_date
1049 START WITH a.location_id = p_location_id
1050 CONNECT BY PRIOR a.location_id = a.parent_location_id
1051 AND p_as_of_date
1052 BETWEEN PRIOR active_start_date AND PRIOR active_end_date)
1053 AND p_as_of_date BETWEEN emp_assign_start_date AND
1054 NVL(emp_assign_end_date, g_end_of_time)
1055 );
1056
1057 CURSOR Utilised_Capacity_Cust_C( p_location_id IN NUMBER
1058 ,p_As_Of_Date IN DATE) IS
1059 (SELECT SUM(NVL(UTILIZED_AREA,0)) AS Area
1060 FROM pn_space_assign_cust_all
1061 WHERE location_id IN (SELECT a.location_id
1062 FROM pn_locations_all a
1063 WHERE p_as_of_date BETWEEN active_start_date AND
1064 active_end_date
1065 START WITH a.location_id = p_location_id
1066 CONNECT BY PRIOR a.location_id = a.parent_location_id
1067 AND p_as_of_date
1068 BETWEEN PRIOR active_start_date AND PRIOR active_end_date)
1069 AND p_as_of_date BETWEEN cust_assign_start_date AND
1070 NVL(cust_assign_end_date, g_end_of_time)
1071 );
1072
1073 CURSOR Utilised_Capacity_Child_Emp_C( p_location_id IN NUMBER,
1074 p_As_Of_Date IN DATE) IS
1075 (SELECT SUM(NVL(UTILIZED_AREA,0)) AS Area
1076 FROM pn_space_assign_emp_all
1077 WHERE location_id = p_location_id
1078 AND p_as_of_date BETWEEN emp_assign_start_date AND
1079 NVL(emp_assign_end_date, g_end_of_time)
1080 );
1081
1082 CURSOR Utilised_Capacity_Child_Cust_C( p_location_id IN NUMBER,
1083 p_As_Of_Date IN DATE) IS
1084 (SELECT SUM(NVL(UTILIZED_AREA,0)) AS Area
1085 FROM pn_space_assign_cust_all
1086 WHERE location_id = p_location_id
1087 AND p_as_of_date BETWEEN cust_assign_start_date AND
1088 NVL(cust_assign_end_date, g_end_of_time)
1089 );
1090 BEGIN
1091
1092 l_locationtype := pnp_util_func.get_location_type_lookup_code (
1093 p_location_id => p_location_id,
1094 p_as_of_date => l_as_of_date);
1095 IF l_LocationType IS NULL THEN
1096 RETURN 0;
1097 ELSIF l_LocationType IN ('BUILDING','FLOOR','LAND','PARCEL') THEN
1098 FOR emp_area IN Utilised_Capacity_Emp_C( p_Location_Id
1099 ,l_As_Of_Date)
1100 LOOP
1101 l_UtilizedCapacityEmp := emp_area.area;
1102 END LOOP;
1103
1104 FOR cust_area IN Utilised_Capacity_Cust_C( p_Location_Id
1105 ,l_As_Of_Date)
1106 LOOP
1107 l_UtilizedCapacityCust := cust_area.area;
1108 END LOOP;
1109
1110 l_utilizedCapacity := NVL(l_UtilizedCapacityEmp,0) + NVL(l_UtilizedCapacityCust,0);
1111
1112 RETURN (l_utilizedCapacity);
1113
1114 ELSIF l_LocationType in ('OFFICE','SECTION') THEN
1115
1116 FOR emp_area IN Utilised_Capacity_Child_Emp_C( p_Location_Id
1117 ,l_As_Of_Date)
1118 LOOP
1119 l_UtilizedCapacityEmp := emp_area.area;
1120 END LOOP;
1121
1122 FOR cust_area IN Utilised_Capacity_Child_Cust_C( p_Location_Id
1123 ,l_As_Of_Date)
1124 LOOP
1125 l_UtilizedCapacityCust := cust_area.area;
1126 END LOOP;
1127
1128
1129 l_utilizedCapacity := NVL(l_UtilizedCapacityEmp,0) + NVL(l_UtilizedCapacityCust,0);
1130
1131 RETURN (l_utilizedCapacity);
1132
1133 END IF;
1134
1135 EXCEPTION
1136 WHEN NO_DATA_FOUND THEN
1137 RETURN 0;
1138 WHEN OTHERS THEN
1139 RAISE;
1140
1141 END get_utilized_capacity ;
1142
1143
1144
1145 /*===========================================================================+
1146 | FUNCTION
1147 | get_vacancy
1148 |
1149 | DESCRIPTION
1150 | RETURN the Vacant Capacity for a given location_id
1151 |
1152 | SCOPE - PUBLIC
1153 |
1154 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
1155 |
1156 | ARGUMENTS:
1157 | IN: p_location_id
1158 | OUT: none
1159 |
1160 | RETURNS : Vacant capacity for a location (building/LAND)
1161 |
1162 | NOTES : Currently being used in view "PN_LOCATIONS_V"
1163 | "PN_BUILDING_V"
1164 | AND Space Assignments form - "PNTSPACE.fmb"
1165 |
1166 | MODIFICATION HISTORY
1167 |
1168 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
1169 | pnp_util_func.get_utilized_capacity
1170 | - Bug Fix for #1379527
1171 |
1172 | 31-OCT-2001 graghuna o added p_as_of_date for Location
1173 | Date-Effectivity.
1174 | 24-FEB-2004 abanerje o Returned 0 for l_max_capacity < 0
1175 | 05-MAY-2004 ftanudja o handle if location type is null.
1176 +===========================================================================*/
1177
1178 FUNCTION get_vacancy ( p_Location_Id NUMBER,
1179 p_as_of_date IN DATE )
1180 RETURN NUMBER IS
1181
1182 l_Location_Type pn_locations.location_type_lookup_code%type;
1183 l_utilized_capacity NUMBER:= pnp_util_func.get_utilized_capacity (p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
1184 l_max_capacity NUMBER:= pnp_util_func.get_building_max_capacity ( p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
1185 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1186 INVALID_LOCATION_TYPE EXCEPTION;
1187
1188 BEGIN
1189
1190 l_location_type := pnp_util_func.get_location_type_lookup_code (
1191 p_location_id => p_location_id,
1192 p_as_of_date => l_as_of_date);
1193 IF l_location_type IS NULL THEN
1194 raise NO_DATA_FOUND;
1195 ELSIF l_Location_Type in ('BUILDING', 'LAND') THEN
1196 IF ROUND((l_max_capacity - l_utilized_capacity), 2) > 0 THEN
1197 RETURN ROUND((l_max_capacity - l_utilized_capacity), 2);
1198 ELSE
1199 RETURN 0;
1200 END IF;
1201
1202 ELSE
1203 Raise INVALID_LOCATION_TYPE ;
1204
1205 END IF;
1206
1207 EXCEPTION
1208 WHEN INVALID_LOCATION_TYPE THEN
1209 RAISE;
1210
1211 WHEN OTHERS THEN
1212 RAISE;
1213
1214 END get_vacancy;
1215
1216
1217 /*===========================================================================+
1218 | FUNCTION
1219 | get_occupancy_percent
1220 |
1221 | DESCRIPTION
1222 | RETURN the Occupancy Percentage for a given location_id
1223 |
1224 | SCOPE - PUBLIC
1225 |
1226 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
1227 |
1228 | ARGUMENTS:
1229 | IN: p_location_id
1230 | OUT: none
1231 |
1232 | RETURNS : Occupancy Percentage for a location (building/LAND)
1233 |
1234 | NOTES : Currently being used in view "PN_LOCATIONS_V"
1235 | "PN_BUILDING_V"
1236 | AND Space Assignments form - "PNTSPACE.fmb"
1237 |
1238 | MODIFICATION HISTORY
1239 |
1240 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
1241 | pnp_util_func.get_utilized_capacity
1242 | - Bug Fix for #1379527
1243 |
1244 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
1245 | 05-MAY-2004 ftanudja o handle if location type is null.
1246 +===========================================================================*/
1247
1248 FUNCTION get_occupancy_percent ( p_Location_Id NUMBER ,
1249 p_as_of_date IN DATE ) RETURN NUMBER IS
1250
1251 l_Location_Type pn_locations.location_type_lookup_code%type;
1252 l_utilized_capacity NUMBER:= pnp_util_func.get_utilized_capacity (p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
1253 l_max_capacity NUMBER:= get_building_max_capacity ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
1254 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1255 INVALID_LOCATION_TYPE EXCEPTION;
1256 a NUMBER:= 0;
1257
1258 BEGIN
1259
1260
1261
1262 l_location_type := pnp_util_func.get_location_type_lookup_code (
1263 p_location_id => p_location_id,
1264 p_as_of_date => l_as_of_date);
1265
1266 IF l_location_type IS NULL THEN
1267 raise NO_DATA_FOUND; --???
1268 ELSIF l_Location_Type in ('BUILDING', 'LAND') THEN
1269
1270 IF (NVL(l_max_capacity, 0) = 0) THEN
1271 a:=0;
1272 ELSE
1273 a:= (l_utilized_capacity *100/l_max_capacity);
1274 END IF;
1275
1276 Else
1277 Raise INVALID_LOCATION_TYPE ;
1278
1279 End IF;
1280
1281 RETURN a;
1282
1283 EXCEPTION
1284 WHEN INVALID_LOCATION_TYPE THEN
1285 RAISE;
1286
1287 WHEN OTHERS THEN
1288 RAISE;
1289
1290 END get_occupancy_percent;
1291
1292
1293 /*===========================================================================+
1294 | FUNCTION
1295 | get_area_utilized
1296 |
1297 | DESCRIPTION
1298 | RETURN the Utilized Area for a given location_id
1299 |
1300 | SCOPE - PUBLIC
1301 |
1302 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
1303 |
1304 | ARGUMENTS:
1305 | IN: p_location_id
1306 | OUT: none
1307 |
1308 | RETURNS : Utilized Area for a location (building/LAND)
1309 |
1310 | NOTES : Currently being used in view "PN_LOCATIONS_V"
1311 | "PN_BUILDING_V"
1312 | AND Space Assignments form - "PNTSPACE.fmb"
1313 |
1314 | MODIFICATION HISTORY
1315 |
1316 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
1317 | pnp_util_func.get_utilized_capacity
1318 | AND pnp_util_func.Get_Vacant_Area
1319 | - Bug Fix for #1379527
1320 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
1321 | 05-MAY-2004 ftanudja o handle if location type is null.
1322 +===========================================================================*/
1323
1324 FUNCTION get_area_utilized ( p_Location_Id NUMBER,
1325 p_as_of_date IN DATE
1326 ) RETURN NUMBER IS
1327
1328 l_Location_Type pn_locations.location_type_lookup_code%type;
1329
1330 l_Vacant_Area NUMBER:= Get_Vacant_Area ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
1331 l_rentable_area NUMBER:= get_building_rentable_area ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
1332 l_utilized_capacity NUMBER:= get_utilized_capacity ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
1333 INVALID_LOCATION_TYPE EXCEPTION;
1334 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1335 a NUMBER := 0;
1336
1337 BEGIN
1338
1339 l_location_type := pnp_util_func.get_location_type_lookup_code (
1340 p_location_id => p_location_id,
1341 p_as_of_date => l_as_of_date);
1342
1343 IF l_location_type IS NULL THEN
1344 raise NO_DATA_FOUND;
1345 ELSIF l_Location_Type in ('BUILDING', 'LAND') THEN
1346
1347 IF ((NVL(l_rentable_area, 0) = 0) OR (NVL(l_utilized_capacity, 0) = 0)) THEN
1348 a:= 0;
1349 ELSE
1350 a:= (l_rentable_area/l_utilized_capacity);
1351 END IF;
1352
1353
1354 Else
1355 Raise INVALID_LOCATION_TYPE ;
1356
1357 End IF;
1358
1359
1360 RETURN a;
1361
1362
1363 EXCEPTION
1364 WHEN INVALID_LOCATION_TYPE THEN
1365 RAISE;
1366
1367 WHEN OTHERS THEN
1368 RAISE;
1369
1370 END get_area_utilized;
1371
1372
1373
1374
1375 /*===========================================================================+
1376 | FUNCTION
1377 | GET_TOTAL_LEASED_AREA
1378 |
1379 | DESCRIPTION
1380 | Sum up the total leased area for a given lease
1381 |
1382 | SCOPE - PUBLIC
1383 |
1384 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
1385 |
1386 | ARGUMENTS : IN:
1387 | p_leaseId
1388 |
1389 | OUT:
1390 | none
1391 |
1392 | RETURNS : The sum of leased area for a given LEASE_ID
1393 |
1394 | NOTES : Currently being used in view "PN_PAYMENT_TERRMS_V"
1395 |
1396 | MODIFICATION HISTORY
1397 |
1398 | 14-MAY-98 Neeraj Tandon Created
1399 | 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
1400 | 31-OCT-01 graghuna o added p_as_of_date for Location
1401 | Date-Effectivity.
1402 | 20-OCT-03 ftanudja o Removed nvl's for locations tbl. 3197410.
1403 | 18-FEB-04 abanerje o Handled NO_DATA_FOUND to return 0.
1404 | All the select statements have been
1405 | converted to cursors. The l_location_type
1406 | is checked for null to return 0 .
1407 | Bug #3384965.
1408 +===========================================================================*/
1409
1410 FUNCTION get_total_leased_area (
1411 p_leaseId IN NUMBER,
1412 p_as_of_date IN DATE ) RETURN NUMBER
1413 IS
1414
1415 l_totalArea NUMBER := 0;
1416 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1417
1418
1419 CURSOR Total_Area_C(
1420 p_leaseId IN NUMBER,
1421 p_as_of_date IN DATE ) IS
1422
1423 (SELECT NVL(SUM(pnl.RENTABLE_AREA),0) AS Area
1424 FROM pn_locations_all pnl,
1425 pn_tenancies_all pnt
1426 WHERE pnt.lease_id = p_leaseId
1427 AND pnt.status = 'A'
1428 AND pnl.location_id = pnt.location_id
1429 AND p_as_of_date BETWEEN pnl.active_start_date AND pnl.active_end_date
1430 );
1431
1432
1433 BEGIN
1434
1435 FOR Total_Area IN Total_Area_C( p_leaseId ,l_As_Of_Date)
1436 LOOP
1437 l_totalArea := Total_Area .area;
1438 END LOOP;
1439
1440 RETURN (NVL(l_totalArea,0));
1441
1442 EXCEPTION
1443 WHEN NO_DATA_FOUND THEN
1444 RETURN null;
1445 WHEN OTHERS THEN
1446 RAISE;
1447
1448 END GET_TOTAL_LEASED_AREA;
1449
1450
1451 ----------------------------------------------------------------------
1452 -- GET_LEASE_STATUS --
1453 -- 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
1454 ----------------------------------------------------------------------
1455 FUNCTION GET_LEASE_STATUS (
1456 p_leaseId IN NUMBER
1457 )
1458 RETURN VARCHAR2
1459 IS
1460 l_leaseStatus VARCHAR2(2);
1461 BEGIN
1462
1463 SELECT status
1464 INTO l_leaseStatus
1465 FROM pn_leases_all
1466 WHERE lease_id = p_leaseId;
1467
1468 RETURN (l_leaseStatus);
1469
1470 END GET_LEASE_STATUS;
1471
1472
1473 ----------------------------------------------------------------------
1474 -- pn_distinct_zip_code --
1475 -- 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
1476 ----------------------------------------------------------------------
1477 FUNCTION pn_distinct_zip_code (
1478 p_address_id NUMBER,
1479 p_zip_code VARCHAR2
1480 ) RETURN NUMBER is
1481
1482 l_count NUMBER;
1483
1484 begin
1485
1486
1487 SELECT count(*)
1488 INTO l_count
1489 FROM pn_addresses_all
1490 WHERE zip_code = p_zip_code
1491 AND address_id <= p_address_id ;
1492
1493 RETURN l_count;
1494
1495 end pn_distinct_zip_code;
1496
1497
1498 -------------------------------------------------------------------------------
1499 -- NAME : GET_LOCATION_OCCUPANCY
1500 -- DESCRIPTION : This FUNCTION RETURNs the NUMBER of employees assigned
1501 -- to a location
1502 -- SCOPE : PUBLIC
1503 -- INVOKED FROM :
1504 -- ARGUMENTS : IN : p_locationId,
1505 -- p_As_Of_Date
1506 -- RETURNS : the NUMBER of employees assigned to a location
1507 -- HISTORY :
1508 -- 17-AUG-00 Daniel Thota o Added new parameter p_as_of_date to the
1509 -- function. Changed the WHERE clause to
1510 -- include p_as_of_date - Bug Fix for #1379527
1511 -- 08-SEP-00 Daniel Thota o Re-introduced comparison of p_as_of_date
1512 -- with end date - Bug Fix for #1379527
1513 -- 18-SEP-00 Lakshmikanth K o Using the variable l_date
1514 -- Date:= TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
1515 -- in the end date comparision with the as_of_date
1516 -- 19-SEP-00 Lakshmikanth K o Replacing the TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
1517 -- with TO_DATE('31/12/2199' , ('DD/MM/YYYY'))
1518 -- 31-OCT-01 graghuna o added p_as_of_date for Location Date-Effectivity.
1519 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
1520 -- PN_SPACE_ASSIGN_CUST with _ALL table.
1521 -------------------------------------------------------------------------------
1522 FUNCTION GET_LOCATION_OCCUPANCY (
1523 p_locationId IN NUMBER,
1524 p_As_Of_Date IN DATE
1525 )
1526 RETURN NUMBER IS
1527 l_occupancyCount NUMBER := 0;
1528 l_occupancyCountEmp NUMBER := 0;
1529 l_occupancyCountCust NUMBER := 0;
1530 l_date DATE := TO_DATE('31/12/2199' , 'DD/MM/YYYY');
1531 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
1532
1533 BEGIN
1534
1535 SELECT NVL(count (*), 0)
1536 INTO l_occupancyCountEmp
1537 FROM pn_space_assign_emp_all
1538 WHERE location_id = p_locationId
1539 AND emp_assign_start_date <= l_as_of_date
1540 AND NVL(emp_assign_end_date, l_date) >= l_as_of_date;
1541
1542 SELECT NVL(count (*), 0)
1543 INTO l_occupancyCountCust
1544 FROM pn_space_assign_cust_all
1545 WHERE location_id = p_locationId
1546 AND cust_assign_start_date <= l_as_of_date
1547 AND NVL(cust_assign_end_date, l_date) >= l_as_of_date;
1548
1549 l_occupancyCount := l_occupancyCountEmp + l_occupancyCountCust;
1550
1551 RETURN (l_occupancyCount);
1552
1553 EXCEPTION
1554 WHEN OTHERS THEN
1555 RETURN (0);
1556
1557 END GET_LOCATION_OCCUPANCY;
1558
1559 /*===========================================================================+
1560 | FUNCTION
1561 | get_cost_center
1562 |
1563 | DESCRIPTION
1564 | RETURN the cost center of an employee at HR assignment level
1565 |
1566 | SCOPE - PUBLIC
1567 |
1568 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
1569 |
1570 | ARGUMENTS : IN:
1571 | p_employee_id
1572 | p_column_name
1573 |
1574 | OUT:
1575 | none
1576 |
1577 | RETURNS : cost_center
1578 |
1579 | NOTES : Currently being used in Space Allocation Form (PNTSPACE.pll)
1580 |
1581 | MODIFICATION HISTORY
1582 |
1583 | 19-SEP-1998 Neeraj Tandon Created
1584 | Naga Vijay Modified to fix bug
1585 | 27-JUN-2003 Satish Tripathi o Added code to calculate p_column_name if
1586 | p_column_name is passed NULL.
1587 | 03-NOV-2005 sdmahesh o ATG mandated changes for SQL literals
1588 | 28-NOV-05 sdmahesh o Added parameter org_id
1589 | Passed org_id to get_profile_value
1590 +===========================================================================*/
1591 FUNCTION get_cost_center (
1592 p_employee_id IN NUMBER,
1593 p_column_name IN VARCHAR2,
1594 p_org_id IN NUMBER
1595 ) RETURN VARCHAR2 IS
1596
1597 l_column_name VARCHAR2 (25);
1598 l_set_of_books_id NUMBER;
1599 l_coa_id NUMBER;
1600 l_segnum VARCHAR2(25);
1601 l_appcol_name VARCHAR2(25);
1602 l_seg_name VARCHAR2(30);
1603 l_prompt VARCHAR2(80);
1604 l_value_set_name VARCHAR2(60);
1605 l_cost_center_code VARCHAR2(30);
1606 p_cost_center VARCHAR2(30) := NULL;
1607 sql_statement VARCHAR2(2000);
1608 l_employee_id NUMBER;
1609
1610 l_cursor INTEGER;
1611 l_rows INTEGER;
1612 l_count INTEGER;
1613
1614
1615 CURSOR get_coa_id (p_set_of_books_id IN NUMBER) IS
1616 SELECT gl_sob.chart_of_accounts_id
1617 FROM gl_sets_of_books gl_sob
1618 WHERE gl_sob.set_of_books_id = l_set_of_books_id;
1619
1620 BEGIN
1621
1622 IF p_column_name IS NULL THEN
1623
1624 l_set_of_books_id := TO_NUMBER(pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
1625 p_org_id));
1626
1627 OPEN get_coa_id(l_set_of_books_id);
1628 FETCH get_coa_id INTO l_coa_id;
1629 CLOSE get_coa_id;
1630
1631 IF fnd_flex_apis.get_qualifier_segnum
1632 (
1633 appl_id => 101
1634 ,key_flex_code => 'GL#'
1635 ,structure_number => l_coa_id
1636 ,flex_qual_name => 'FA_COST_CTR'
1637 ,segment_number => l_segnum
1638 )
1639 THEN
1640
1641 IF fnd_flex_apis.get_segment_info
1642 (
1643 x_application_id => 101
1644 ,x_id_flex_code => 'GL#'
1645 ,x_id_flex_num => l_coa_id
1646 ,x_seg_num => l_segnum
1647 ,x_appcol_name => l_appcol_name
1648 ,x_seg_name => l_seg_name
1649 ,x_prompt => l_prompt
1650 ,x_value_set_name => l_value_set_name
1651 )
1652 THEN
1653 l_column_name := l_appcol_name;
1654 END IF;
1655 END IF;
1656 ELSE
1657 l_column_name := p_column_name;
1658 END IF;
1659
1660 IF l_column_name IS NOT NULL THEN
1661
1662 l_employee_id := p_employee_id;
1663
1664 /* create statement */
1665 sql_statement :=
1666 'SELECT ' || l_column_name || '
1667 FROM gl_code_combinations,
1668 per_employees_current_x
1669 WHERE default_code_combination_id = code_combination_id
1670 AND employee_id = :l_employee_id';
1671
1672 /* open cursor */
1673 l_cursor := dbms_sql.open_cursor;
1674
1675 /* parse */
1676 dbms_sql.parse(l_cursor, sql_statement, dbms_sql.native);
1677
1678 /* bind variables */
1679 dbms_sql.bind_variable(l_cursor,'l_employee_id',l_employee_id);
1680
1681 /* define column */
1682 dbms_sql.define_column (l_cursor,1,p_cost_center,30);
1683
1684 /* execute query and fetch */
1685 l_rows := dbms_sql.execute(l_cursor);
1686 l_count := dbms_sql.fetch_rows(l_cursor);
1687
1688 /* get the value */
1689 dbms_sql.column_value(l_cursor,1,p_cost_center);
1690
1691 /* if cursor open, close */
1692 IF dbms_sql.is_open (l_cursor) THEN
1693 dbms_sql.close_cursor (l_cursor);
1694 END IF;
1695
1696
1697
1698 END IF;
1699
1700 RETURN p_cost_center;
1701
1702 EXCEPTION
1703 WHEN OTHERS THEN
1704 RETURN NULL;
1705
1706 END get_cost_center;
1707
1708
1709 -------------------------------------
1710 -- valid_lookup_code
1711 --------------------------------------
1712 FUNCTION valid_lookup_code (
1713 p_lookup_type VARCHAR2,
1714 p_lookup_code VARCHAR2 )
1715 RETURN BOOLEAN
1716
1717 is
1718
1719 l_dummy VARCHAR2(1);
1720
1721 begin
1722 SELECT 'x'
1723 INTO l_dummy
1724 FROM fnd_lookups
1725 WHERE lookup_type = p_lookup_type
1726 AND lookup_code = p_lookup_code ;
1727
1728 RETURN true;
1729
1730 exception
1731 WHEN others THEN
1732 RETURN false;
1733
1734 end valid_lookup_code;
1735
1736
1737 -------------------------------------
1738 -- valid_country_code
1739 --------------------------------------
1740 FUNCTION valid_country_code (
1741 p_country VARCHAR2 )
1742 RETURN BOOLEAN
1743
1744 is
1745
1746 l_dummy VARCHAR2(1);
1747
1748 begin
1749 SELECT 'x'
1750 INTO l_dummy
1751 FROM fnd_territories_vl
1752 WHERE territory_code = p_country;
1753
1754 RETURN true;
1755
1756 exception
1757 WHEN others THEN
1758 RETURN false;
1759
1760 end valid_country_code;
1761
1762
1763 -------------------------------------
1764 -- valid_uom_code
1765 --------------------------------------
1766 FUNCTION valid_uom_code ( p_uom_code VARCHAR2 ) RETURN BOOLEAN
1767 is
1768 l_dummy VARCHAR2(1);
1769
1770 begin
1771
1772 SELECT 'x'
1773 INTO l_dummy
1774 FROM fnd_lookups
1775 WHERE lookup_type = 'PN_UNITS_OF_MEASURE'
1776 AND lookup_code = p_uom_code;
1777
1778
1779 /*-----------------------------------------------------------------------------
1780
1781 ---------------------------------------------------------
1782 -- WHEN we finally integrate with INV, we can use this --
1783 ---------------------------------------------------------
1784
1785 SELECT 'x'
1786 INTO l_dummy
1787 FROM mtl_units_of_measure
1788 WHERE uom_class = 'Area'
1789 AND uom_code = p_uom_code;
1790
1791 -----------------------------------------------------------------------------*/
1792
1793 RETURN true;
1794
1795 exception
1796 WHEN others THEN
1797 RETURN false;
1798
1799 end;
1800
1801
1802 -------------------------------------
1803 -- valid_employee
1804 --------------------------------------
1805 FUNCTION valid_employee ( p_employee_id NUMBER ) RETURN BOOLEAN
1806 is
1807 l_dummy VARCHAR2(1);
1808
1809 begin
1810 SELECT 'x'
1811 INTO l_dummy
1812 FROM per_employees_current_x
1813 WHERE employee_id = p_employee_id;
1814
1815 RETURN true;
1816
1817 exception
1818 WHEN others THEN
1819 RETURN false;
1820
1821 end;
1822
1823
1824 -------------------------------------------------------------------------------
1825 -- get_chart_of_accounts_id
1826 --28-NOV-05 sdmahesh o Added parameter p_org_id
1827 -- Passed org_id to get_chart_of_accounts_id
1828 -------------------------------------------------------------------------------
1829 FUNCTION get_chart_of_accounts_id(p_org_id NUMBER)
1830 RETURN NUMBER IS
1831 l_set_of_books_id NUMBER;
1832 coa_id NUMBER;
1833
1834 BEGIN
1835 l_set_of_books_id := to_number(pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
1836 p_org_id));
1837
1838 SELECT chart_of_accounts_id
1839 INTO coa_id
1840 FROM gl_sets_of_books
1841 WHERE set_of_books_id = l_set_of_books_id;
1842
1843 RETURN coa_id;
1844
1845 END get_chart_of_accounts_id;
1846
1847
1848 -------------------------------------------------------------------------------
1849 -- get_segment_column_name
1850 --28-NOV-05 sdmahesh o Added parameter p_org_id
1851 -- Passed org_id to get_chart_of_accounts_id
1852 -------------------------------------------------------------------------------
1853 FUNCTION get_segment_column_name(p_org_id NUMBER)
1854 RETURN VARCHAR2 IS
1855 coa_id NUMBER;
1856 segnum VARCHAR2(25);
1857 appcol_name VARCHAR2(25);
1858 seg_name VARCHAR2(30);
1859 prompt VARCHAR2(80);
1860 value_set_name VARCHAR2(60);
1861
1862 BEGIN
1863
1864 coa_id := get_chart_of_accounts_id(p_org_id);
1865
1866 IF fnd_flex_apis.get_qualIFier_segnum (
1867 101, 'GL#', coa_id, 'FA_COST_CTR', segnum ) THEN
1868
1869 IF fnd_flex_apis.get_segment_info (
1870 101, 'GL#', coa_id, segnum,
1871 appcol_name, seg_name, prompt, value_set_name ) THEN
1872
1873 RETURN appcol_name;
1874 end IF;
1875
1876 RETURN 'UNKNOWN';
1877 end IF;
1878
1879 RETURN 'UNKNOWN';
1880
1881 END get_segment_column_name;
1882
1883
1884 ------------------------------------------------------------------------------------
1885 -- valid_cost_center
1886 -- 01-Nov-2002 Daniel Thota o Changed the sql_statement to pick up column name
1887 -- from segment name so that the appropriate
1888 -- column used by the client in the CC definiton is picked up
1889 -- Fix for bug # 2632150
1890 -- 28-OCT-2005 sdmahesh o ATG mandated changes for SQL literals
1891 -- 28-NOV-2005 sdmahesh o Added parameter p_org_id
1892 -- Passed org_id to get_segment_column_name
1893 ------------------------------------------------------------------------------------
1894 FUNCTION valid_cost_center ( p_cost_center VARCHAR2, p_org_id NUMBER)
1895 RETURN BOOLEAN is
1896
1897 l_column_name VARCHAR2(15);
1898 sql_statement VARCHAR2(2000);
1899 l_dummy VARCHAR2(1);
1900 l_cost_center VARCHAR2(15);
1901 l_cursor INTEGER;
1902 l_rows INTEGER;
1903 l_count INTEGER;
1904
1905 BEGIN
1906
1907 --Bug#6366630: Added the IF condition to control Cost Center Validation using Profile Option --
1908 IF nvl(pn_mo_cache_utils.get_profile_value('PN_VALIDATE_ASSIGN_CC', p_org_id),'Y') = 'Y' THEN
1909 l_column_name := ltrim(rtrim(get_segment_column_name(p_org_id)));
1910 l_cost_center := p_cost_center;
1911 l_cursor := dbms_sql.open_cursor;
1912
1913
1914 sql_statement :=
1915 'select account_type
1916 from gl_code_combinations where '||l_column_name||' = :l_cost_center';
1917
1918 dbms_sql.parse(l_cursor, sql_statement, dbms_sql.native);
1919 dbms_sql.bind_variable(l_cursor,'l_cost_center',l_cost_center);
1920 dbms_sql.define_column (l_cursor,1,l_dummy,1);
1921 l_rows := dbms_sql.execute(l_cursor);
1922 l_count := dbms_sql.fetch_rows(l_cursor);
1923 dbms_sql.column_value (l_cursor,1,l_dummy);
1924 IF dbms_sql.is_open (l_cursor) THEN
1925 dbms_sql.close_cursor (l_cursor);
1926 END IF;
1927 IF l_count <> 1 THEN
1928 RETURN false;
1929 END IF;
1930
1931 RETURN true;
1932
1933 --Bug#6366630: Added the IF condition to control Cost Center Validation using Profile Option --
1934 ELSE
1935 RETURN true;
1936 END IF;
1937 --Bug#6366630: Added the IF condition to control Cost Center Validation using Profile Option --
1938
1939 END valid_cost_center;
1940
1941
1942 -------------------------------------------------------------------------------
1943 -- valid_emp_cc_comb
1944 -- THIS FUNCTION HAS BEEN OBSOLETED.PLEASE DO NOT USE THIS
1945 -------------------------------------------------------------------------------
1946 FUNCTION valid_emp_cc_comb (
1947 p_employee_id NUMBER, p_cost_center VARCHAR2
1948 ) RETURN BOOLEAN is
1949
1950 l_dummy NUMBER;
1951 l_column_name VARCHAR2(15);
1952 l_cost_center VARCHAR2(5);
1953
1954 begin
1955
1956 l_column_name := get_segment_column_name(NULL);
1957
1958 l_cost_center := get_cost_center(p_employee_id, l_column_name,NULL);
1959
1960 IF (p_cost_center = l_cost_center) THEN
1961 RETURN true;
1962 else
1963 RETURN false;
1964 end IF;
1965
1966 -- This should NEVER be reached, something really wrong IF reached.
1967 RETURN false;
1968
1969 EXCEPTION
1970 WHEN others THEN
1971 RETURN false;
1972
1973 end valid_emp_cc_comb;
1974
1975
1976 -------------------------------------------------------------------------------
1977 -- GET_CC_CODE
1978 --28-NOV-05 sdmahesh o Added parameter P_ORG_ID
1979 -- o Passed org_id to get_cost_center
1980 -- o Passed org_id to get_segment_column_name
1981 -------------------------------------------------------------------------------
1982 FUNCTION get_cc_code ( p_employee_id NUMBER,
1983 p_org_id NUMBER) RETURN VARCHAR2 is
1984
1985 l_dummy NUMBER;
1986 l_column_name VARCHAR2(15);
1987 l_cost_center VARCHAR2(5);
1988
1989 BEGIN
1990
1991 l_column_name := get_segment_column_name(p_org_id);
1992 l_cost_center := get_cost_center(p_employee_id, l_column_name,p_org_id);
1993
1994 RETURN l_cost_center;
1995
1996 EXCEPTION
1997 WHEN others THEN
1998 RETURN 'N/A';
1999
2000 END get_cc_code;
2001
2002
2003 ---------------------------------------------------
2004 -- VALID_LOCATION --
2005 -- 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
2006 -- 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
2007 -- 20-OCT-2003 ftanudja o replaced GROUP BY w/ AND filter.319741.
2008 ---------------------------------------------------
2009 FUNCTION VALID_LOCATION ( p_Location_Id NUMBER ,
2010 p_as_of_date IN DATE )
2011 RETURN BOOLEAN Is
2012
2013 l_Dummy VARCHAR2(1);
2014
2015 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
2016
2017 Begin
2018
2019 SELECT 'X'
2020 INTO l_Dummy
2021 FROM pn_locations_all
2022 WHERE Status = 'A'
2023 AND Location_Id = p_Location_Id
2024 AND l_as_of_date BETWEEN active_start_date AND active_end_date;
2025
2026 RETURN True;
2027
2028 Exception
2029
2030 WHEN No_Data_Found THEN
2031 RETURN False;
2032
2033 WHEN Others THEN
2034 RAISE;
2035
2036 End VALID_LOCATION;
2037
2038
2039 -------------------------------------
2040 -- PN_GET_NEXT_LOCATION_ID
2041 --------------------------------------
2042 FUNCTION PN_GET_NEXT_LOCATION_ID RETURN NUMBER is
2043
2044 l_seqnum NUMBER;
2045
2046 begin
2047
2048 SELECT pn_locations_s.NEXTVAL
2049 INTO l_seqnum
2050 FROM DUAL;
2051
2052 RETURN l_seqnum;
2053
2054 exception
2055 WHEN others THEN
2056 RETURN -999;
2057
2058 end PN_GET_NEXT_LOCATION_ID;
2059
2060
2061 -------------------------------------
2062 -- PN_GET_NEXT_SPACE_ALLOC_ID
2063 --------------------------------------
2064 FUNCTION PN_GET_NEXT_SPACE_ALLOC_ID RETURN NUMBER is
2065
2066 l_seqnum NUMBER;
2067
2068 begin
2069
2070 SELECT PN_SPACE_ASSIGN_EMP_S.NEXTVAL
2071 INTO l_seqnum
2072 FROM dual;
2073
2074 RETURN l_seqnum;
2075
2076 exception
2077 WHEN others THEN
2078 RETURN -999;
2079
2080 end PN_GET_NEXT_SPACE_ALLOC_ID;
2081
2082
2083 -------------------------------------
2084 -- SET_VIEW_CONTEXT
2085 --------------------------------------
2086 PROCEDURE SET_VIEW_CONTEXT(p_ap_ar VARCHAR2) is
2087
2088 INVALID_PARAMETER EXCEPTION;
2089
2090 begin
2091
2092 IF (p_ap_ar <> 'AP' AND p_ap_ar <> 'AR') THEN
2093 raise INVALID_PARAMETER;
2094 else
2095 g_view_context := p_ap_ar;
2096 end IF;
2097
2098 exception
2099 WHEN others THEN
2100 RAISE;
2101
2102 end SET_VIEW_CONTEXT;
2103
2104
2105 -------------------------------------
2106 -- GET_VIEW_CONTEXT
2107 --------------------------------------
2108 FUNCTION GET_VIEW_CONTEXT RETURN VARCHAR2 is
2109
2110 BEGIN
2111 RETURN g_view_context;
2112
2113 EXCEPTION
2114 WHEN OTHERS THEN
2115 RETURN NULL;
2116
2117 END GET_VIEW_CONTEXT;
2118
2119 -------------------------------------------------------------------
2120 -- For getting the daily conversion rate FROM GL's new API in 11.5
2121 -- The form uses this, to display the amount in foreign currency,
2122 -- WHEN user chooses a currency code dIFferent FROM the functional
2123 -- currency.
2124 -------------------------------------------------------------------
2125 -- To RETURN EXPORT_CURRENCY_AMOUNT column
2126 -- Get Export Currency Amount FROM GL's API
2127 -------------------------------------------------------------------
2128 FUNCTION Export_Curr_Amount (
2129 currency_code VARCHAR2,
2130 export_currency_code VARCHAR2,
2131 export_date DATE,
2132 conversion_type VARCHAR2,
2133 actual_amount NUMBER,
2134 p_called_FROM VARCHAR2
2135 )
2136
2137 RETURN NUMBER
2138
2139 is
2140
2141 export_amount NUMBER;
2142
2143 begin
2144
2145 IF export_currency_code = currency_code THEN
2146 export_amount := actual_amount;
2147
2148 ELSE
2149 BEGIN
2150 export_amount := gl_currency_api.convert_amount (
2151 X_FROM_CURRENCY => currency_code,
2152 X_TO_CURRENCY => export_currency_code,
2153 X_CONVERSION_DATE => export_date,
2154 X_CONVERSION_TYPE => conversion_type,
2155 X_AMOUNT => actual_amount
2156 );
2157 EXCEPTION
2158 WHEN gl_currency_api.no_rate THEN
2159 IF p_called_FROM = 'PNTAUPMT' THEN
2160 NULL;
2161 ELSE
2162 fnd_message.set_name('PN','PN_EXP_NO_RATE');
2163 app_exception.raise_exception;
2164 END IF;
2165 WHEN gl_currency_api.invalid_currency THEN
2166 IF p_called_FROM = 'PNTAUPMT' THEN
2167 NULL;
2168 ELSE
2169 fnd_message.set_name('PN','PN_EXP_INVALID_CURRENCY');
2170 app_exception.raise_exception;
2171 END IF;
2172 WHEN OTHERS THEN
2173 IF p_called_FROM = 'PNTAUPMT' THEN
2174 NULL;
2175 ELSE
2176 app_exception.raise_exception;
2177 END IF;
2178 END;
2179
2180 END IF;
2181
2182 RETURN export_amount;
2183
2184 EXCEPTION
2185 WHEN OTHERS THEN
2186 app_exception.raise_exception;
2187
2188 END Export_Curr_Amount;
2189
2190
2191 -------------------------------------------------------------------------------
2192 -- FUNCTION Get_Start_Date
2193 --28-NOV-05 sdmahesh o Added parameter P_ORG_ID
2194 -- o Passed org_id to get_profile_value
2195 -------------------------------------------------------------------------------
2196 FUNCTION Get_Start_Date(p_Period_Name VARCHAR2,p_org_id NUMBER)
2197 RETURN DATE is
2198
2199 l_Set_Of_Books_Id NUMBER;
2200 l_start_date DATE;
2201
2202 BEGIN
2203
2204 l_Set_Of_Books_Id := pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
2205 p_org_id);
2206
2207 IF (p_period_name = NULL) THEN
2208 l_start_date := SYSDATE;
2209
2210 else
2211 SELECT glp.start_date
2212 INTO l_start_date
2213 FROM gl_sets_of_books gsob,
2214 gl_periods glp
2215 WHERE gsob.period_set_name = glp.period_set_name
2216 AND gsob.set_of_books_id = l_set_of_books_id
2217 AND glp.period_name = p_period_name;
2218
2219 end IF;
2220
2221 RETURN TRUNC(l_start_date);
2222
2223 EXCEPTION
2224 WHEN NO_DATA_FOUND THEN
2225 RETURN TRUNC(SYSDATE);
2226
2227 END Get_Start_Date;
2228
2229
2230 -------------------------------------------------------------------------------
2231 -- NAME : Get_Occupancy_Status
2232 -- DESCRIPTION : retrieves the Occupancy Status
2233 -- SCOPE : PUBLIC
2234 -- INVOKED FROM :
2235 -- ARGUMENTS : IN : p_location_id,
2236 -- p_As_Of_Date
2237 -- RETURNS : Occupancy Status
2238 -- HISTORY :
2239 -- 17-AUG-00 Daniel Thota o Added new parameter p_as_of_date to the
2240 -- function. Changed the WHERE clause to
2241 -- include p_as_of_date - Bug Fix for #1379527
2242 -- 08-SEP-00 Daniel Thota o Re-introduced comparison of p_as_of_date
2243 -- with end date - Bug Fix for #1379527
2244 -- 18-SEP-00 Lakshmikanth o Using the variable l_date
2245 -- Date:= TO_DATE('31-DEC-2199' , ('DD/MM/YYYY'))
2246 -- in the end date comparision with the as_of_date
2247 -- 19-SEP-00 Lakshmikanth o Replacing the TO_DATE('31-DEC-2199',('DD/MM/YYYY'))
2248 -- with TO_DATE('31/12/2199' , ('DD/MM/YYYY'))
2249 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
2250 -- PN_SPACE_ASSIGN_CUST with _ALL table.
2251 -------------------------------------------------------------------------------
2252 FUNCTION Get_Occupancy_Status(p_location_id NUMBER,
2253 p_As_Of_Date DATE)
2254 RETURN NUMBER
2255 IS
2256
2257 l_retnum NUMBER := 0;
2258 l_retnum_emp NUMBER := 0;
2259 l_retnum_cust NUMBER := 0;
2260 l_date DATE := TO_DATE('31/12/2199' , 'DD/MM/YYYY');
2261 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date); --ASHISH
2262
2263 BEGIN
2264
2265 SELECT 1
2266 INTO l_retnum_emp
2267 FROM pn_space_assign_emp_all
2268 WHERE location_id = p_location_id
2269 AND emp_assign_start_date <= l_as_of_date
2270 AND NVL(emp_assign_end_date, l_date) >= l_as_of_date
2271 AND rownum = 1 ;
2272
2273 SELECT 1
2274 INTO l_retnum_cust
2275 FROM pn_space_assign_cust_all
2276 WHERE location_id = p_location_id
2277 AND cust_assign_start_date <= l_as_of_date
2278 AND NVL(cust_assign_end_date, l_date) >= l_as_of_date
2279 AND rownum = 1 ;
2280
2281 l_retnum := l_retnum_emp + l_retnum_cust;
2282
2283 RETURN l_retnum;
2284
2285 EXCEPTION
2286
2287 WHEN others THEN
2288 RETURN l_retnum;
2289
2290 END Get_Occupancy_Status;
2291
2292 -------------------------------------------------------------------------------
2293 -- FUNCTION Get_Location_Code
2294 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
2295 -- 31-OCT-01 graghuna o added p_as_of_date for Location
2296 -- Date-Effectivity.
2297 -- 20-OCT-03 ftanudja o replaced GROUP BY w/ AND filter.3197410.
2298 -- 18-FEB-04 abanerje o Handled NO_DATA_FOUND to return 0.
2299 -- All the select statements have been
2300 -- converted to cursors. The l_location_type
2301 -- is checked for null to return 0.
2302 -- Bug #3384965.
2303 -- 24-MAR-2004 ftanudja o added p_ignore_date.3496483.
2304 -------------------------------------------------------------------------------
2305 FUNCTION Get_Location_Code (
2306 p_location_id NUMBER,
2307 p_as_of_date DATE,
2308 p_ignore_date BOOLEAN) RETURN VARCHAR2
2309 IS
2310 l_location_code pn_locations_all.location_code%TYPE;
2311 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
2312
2313 CURSOR fetch_loc_code IS
2314 SELECT location_code
2315 FROM pn_locations_all
2316 WHERE location_id = p_location_id
2317 AND p_as_of_date BETWEEN active_start_date AND active_end_date;
2318
2319 CURSOR fetch_loc_code_ignore_date IS
2320 SELECT location_code
2321 FROM pn_locations_all
2322 WHERE location_id = p_location_id
2323 AND ROWNUM < 2;
2324
2325 BEGIN
2326 IF p_ignore_date THEN
2327 FOR code_rec IN fetch_loc_code_ignore_date LOOP
2328 l_location_code := code_rec.location_code;
2329 END LOOP;
2330 ELSE
2331 FOR code_rec IN fetch_loc_code LOOP
2332 l_location_code := code_rec.location_code;
2333 END LOOP;
2334 END IF;
2335
2336 RETURN l_location_code;
2337
2338 EXCEPTION
2339 WHEN Others THEN
2340 RAISE;
2341 END;
2342
2343 -------------------------------------------------------
2344 -- FUNCTION Get_Location_Type_Lookup_Code
2345 -- 30-OCT-2002 Satish Tripathi o Removed DISTINCT, access _all table for performance issues.
2346 -- Removed active_start_date, active_end_date clause.
2347 -- 20-OCT-2003 ftanudja o replaced GROUP BY w/ AND filter.3197410.
2348 -- 24-MAR-2004 ftanudja o added p_ignore_date.3496483.
2349 -------------------------------------------------------
2350 FUNCTION Get_Location_Type_Lookup_Code (p_location_id NUMBER ,
2351 p_as_of_date DATE,
2352 p_ignore_date BOOLEAN) RETURN VARCHAR2
2353 IS
2354 l_location_type_lookup_code pn_locations_all.location_type_lookup_code%TYPE;
2355 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
2356
2357 CURSOR fetch_code IS
2358 SELECT location_type_lookup_code
2359 FROM pn_locations_all
2360 WHERE location_id = p_location_id
2361 AND l_as_of_date BETWEEN active_start_date AND active_end_date;
2362
2363 CURSOR fetch_code_ignore_date IS
2364 SELECT location_type_lookup_code
2365 FROM pn_locations_all
2366 WHERE location_id = p_location_id
2367 AND ROWNUM < 2;
2368
2369 BEGIN
2370
2371 IF p_ignore_date THEN
2372 FOR code_rec IN fetch_code_ignore_date LOOP
2373 l_location_type_lookup_code := code_rec.location_type_lookup_code;
2374 END LOOP;
2375 ELSE
2376 FOR code_rec IN fetch_code LOOP
2377 l_location_type_lookup_code := code_rec.location_type_lookup_code;
2378 END LOOP;
2379 END IF;
2380
2381 RETURN l_Location_Type_Lookup_Code ;
2382
2383 EXCEPTION
2384 WHEN Others THEN
2385 RAISE;
2386 END;
2387
2388 /*===========================================================================+
2389 | FUNCTION
2390 | get_higH_schedule_date
2391 |
2392 | DESCRIPTION
2393 | To GET the highest approved scheduled date FROM pn_payment_schedules_v
2394 | for the current lease. This date is used to compare with the
2395 | lease_termination_date so as not to allow early termination
2396 | in the event of an approved schedule payment existing.
2397 |
2398 | SCOPE - PUBLIC
2399 |
2400 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
2401 |
2402 | ARGUMENTS : IN:
2403 | p_leaseId
2404 |
2405 | OUT:
2406 | none
2407 |
2408 | RETURNS : The highest approved scheduled date.
2409 |
2410 | NOTES : Currently being used in view "PN_PAYMENT_SCHEDULES_V"
2411 |
2412 | MODIFICATION HISTORY
2413 |
2414 | 02-FEB-2000 Daniel Thota Created
2415 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
2416 +===========================================================================*/
2417
2418 FUNCTION GET_HIGH_SCHEDULE_DATE ( p_leaseId IN NUMBER )
2419 RETURN DATE IS
2420
2421 l_date DATE ;
2422
2423 BEGIN
2424 BEGIN
2425 SELECT MAX(schedule_date)
2426 INTO l_date
2427 FROM pn_payment_schedules_all
2428 WHERE payment_status_lookup_code = 'APPROVED'
2429 AND lease_id = p_leaseId;
2430
2431 EXCEPTION
2432 WHEN NO_DATA_FOUND THEN
2433 RETURN NULL;
2434 END;
2435 RETURN l_date;
2436 END GET_HIGH_SCHEDULE_DATE;
2437
2438 /*=============================================================================+
2439 | FUNCTION
2440 | create_virtual_schedules
2441 |
2442 | DESCRIPTION
2443 | Given term dates and schedule dates, schedule day, frequency, returns a
2444 | virtual schedule table. If a limit date is provided, the creation of
2445 | virtual schedule stops on passing the limit date.
2446 |
2447 | SCOPE - PUBLIC
2448 |
2449 | ARGUMENTS
2450 | p_start_date term start date
2451 | p_end_date term end date
2452 | p_sch_day schedule day on the term
2453 | p_term_freq term frequency
2454 | p_limit_date limit date for creating virtual schedule
2455 |
2456 | RETURNS : virtual_sched_tbl_type
2457 |
2458 | NOTES : Used by valid_early_term_date
2459 |
2460 | MODIFICATION HISTORY
2461 | 23-May-2004 Kiran o Created - bug # 3562487
2462 +===========================================================================*/
2463
2464 FUNCTION create_virtual_schedules
2465 ( p_start_date DATE
2466 ,p_end_date DATE
2467 ,p_sch_day NUMBER
2468 ,p_term_freq VARCHAR2
2469 ,p_limit_date DATE)
2470 RETURN PNP_UTIL_FUNC.virtual_sched_tbl_type IS
2471
2472
2473 CURSOR get_freq_num(p_freq_char IN VARCHAR2) IS
2474 SELECT TO_NUMBER(DECODE( p_freq_char
2475 , 'OT', 0
2476 , 'MON', 1
2477 , 'QTR', 3
2478 , 'SA', 6
2479 , 'YR', 12
2480 , -1)) AS freq_num
2481 FROM DUAL;
2482
2483 l_sched_tbl PNP_UTIL_FUNC.virtual_sched_tbl_type;
2484
2485 l_frequency NUMBER;
2486
2487 l_current_st_dt DATE;
2488 l_current_end_dt DATE;
2489 l_limit_dt DATE;
2490
2491 l_rec_count NUMBER;
2492
2493 INVALID_PARAM EXCEPTION;
2494
2495 BEGIN
2496
2497 IF p_start_date IS NULL OR
2498 p_end_date IS NULL OR
2499 p_sch_day IS NULL OR
2500 p_sch_day < 1 OR
2501 p_sch_day > 28 OR
2502 p_term_freq IS NULL THEN
2503
2504 RAISE INVALID_PARAM;
2505
2506 END IF;
2507
2508 /* get frequency */
2509 FOR freq_rec IN get_freq_num(p_term_freq) LOOP
2510 l_frequency := freq_rec.freq_num;
2511 END LOOP;
2512
2513 IF l_frequency = -1 THEN
2514 RAISE INVALID_PARAM;
2515 END IF;
2516
2517 IF l_frequency = 0 THEN
2518
2519 l_sched_tbl(1).start_date := p_start_date;
2520 l_sched_tbl(1).end_date := p_end_date;
2521 l_sched_tbl(1).schedule_date := LAST_DAY(ADD_MONTHS(p_start_date, -1)) + p_sch_day;
2522
2523 ELSE
2524
2525 l_current_st_dt := p_start_date;
2526 l_current_end_dt := p_end_date;
2527 l_limit_dt := LEAST(NVL(p_limit_date, p_end_date), p_end_date);
2528 l_rec_count := 1;
2529
2530 WHILE l_current_st_dt < l_limit_dt LOOP
2531
2532 IF l_frequency = 1 THEN
2533
2534 l_current_end_dt := LEAST(LAST_DAY(l_current_st_dt), p_end_date);
2535
2536 ELSE
2537
2538 l_current_end_dt := LEAST(ADD_MONTHS(l_current_st_dt, l_frequency) - 1
2539 , p_end_date);
2540
2541 END IF;
2542
2543 l_sched_tbl(l_rec_count).start_date := l_current_st_dt;
2544 l_sched_tbl(l_rec_count).end_date := l_current_end_dt;
2545 l_sched_tbl(l_rec_count).schedule_date := LAST_DAY(ADD_MONTHS(l_current_st_dt, -1)) + p_sch_day;
2546
2547 l_current_st_dt := l_current_end_dt + 1;
2548 l_rec_count := l_rec_count + 1;
2549
2550 END LOOP;
2551
2552 END IF;
2553
2554 RETURN l_sched_tbl;
2555
2556 EXCEPTION
2557
2558 WHEN OTHERS THEN RAISE;
2559
2560 END create_virtual_schedules;
2561
2562 /*=============================================================================+
2563 | FUNCTION
2564 | valid_early_term_date
2565 |
2566 | DESCRIPTION
2567 | Implements the rules
2568 | IF exists one approved schedule for lease
2569 | and exists one normalised term with start date > early termination date
2570 | THEN
2571 | ERROR - STOP USER
2572 |
2573 | IF early termination date < schedule date of (last approved schedule + 1)
2574 | for normalized
2575 | THEN
2576 | ERROR - STOP USER
2577 |
2578 | IF early termination date < last date of the last approved period
2579 | for not normalized
2580 | THEN
2581 | ERROR - STOP USER
2582 |
2583 | SCOPE - PUBLIC
2584 |
2585 | ARGUMENTS
2586 | p_lease_id lease ID
2587 | p_term_id payment/billign term ID. null if called from lease
2588 | p_normalized normalized flag. null if called from lease
2589 | p_frequency term frequency. null if called from lease
2590 | p_termination_date new termination date. lease termination date when
2591 | called from lease. term termination date when called
2592 | from term
2593 | p_called_from 'LEASE' or 'TERM'
2594 |
2595 |
2596 | RETURNS : BOOLEAN
2597 |
2598 | NOTES : Currently being used PNTLEASE to validate the
2599 | termination date at the lease and the term level.
2600 |
2601 | MODIFICATION HISTORY
2602 | 23-May-04 Kiran o Created - bug # 3562487
2603 | 30-Mar-05 Kiran o Changed the rules for bug # 4229248. New rules are
2604 | reflected in the Description section above.
2605 +===========================================================================*/
2606
2607 FUNCTION valid_early_term_date( p_lease_id NUMBER
2608 ,p_term_id NUMBER
2609 ,p_normalized VARCHAR2
2610 ,p_frequency VARCHAR2
2611 ,p_termination_date DATE
2612 ,p_called_from VARCHAR2)
2613 RETURN BOOLEAN IS
2614
2615 /* this cursor is to figure out if
2616 1. If there exists a normailzed term starting after the new termination date
2617 AND
2618 2. Atleast one schedule for the lease is approved
2619 */
2620 CURSOR exists_norm_term( p_lease_ID IN NUMBER
2621 ,p_termination_date IN DATE) IS
2622 SELECT 1
2623 FROM dual
2624 WHERE EXISTS
2625 (SELECT 1
2626 FROM pn_payment_schedules_all s,
2627 pn_payment_items_all i
2628 WHERE i.payment_term_id IN
2629 (SELECT payment_term_id
2630 FROM pn_payment_terms_all
2631 WHERE lease_id = p_lease_ID
2632 AND start_date > p_termination_date
2633 AND normalize = 'Y')
2634 AND i.payment_schedule_id = s.payment_schedule_id
2635 AND s.payment_status_lookup_code = 'APPROVED'
2636 AND s.lease_id = p_lease_ID);
2637
2638 /* cursor for normalized used when called from lease */
2639
2640 CURSOR max_appr_sched_norm(p_lease_ID IN NUMBER) IS
2641 SELECT MAX(s.schedule_date) AS schedule_date
2642 FROM pn_payment_schedules_all s,
2643 pn_payment_items_all i
2644 WHERE i.payment_term_id IN
2645 (SELECT t.payment_term_id
2646 FROM pn_payment_terms_all t
2647 WHERE t.lease_id = p_lease_ID
2648 AND t.normalize = 'Y')
2649 AND i.payment_schedule_id = s.payment_schedule_id
2650 AND s.payment_status_lookup_code = 'APPROVED'
2651 AND s.lease_id = p_lease_ID;
2652
2653
2654 /* cursorS for NOT normalized used when called from lease */
2655
2656 /* ONE TIME */
2657 CURSOR max_appr_sched_ot(p_lease_ID IN NUMBER) IS
2658 SELECT MAX(s.schedule_date) AS schedule_date
2659 FROM pn_payment_schedules_all s,
2660 pn_payment_items_all i
2661 WHERE i.payment_term_id IN
2662 (SELECT t.payment_term_id
2663 FROM pn_payment_terms_all t
2664 WHERE t.lease_id = p_lease_ID
2665 AND t.frequency_code = 'OT'
2666 AND NVL(t.normalize,'N')='N')
2667 AND i.payment_schedule_id = s.payment_schedule_id
2668 AND s.payment_status_lookup_code = 'APPROVED'
2669 AND s.lease_id = p_lease_ID;
2670
2671 /* MONTHLY */
2672 CURSOR max_appr_sched_mon(p_lease_ID IN NUMBER) IS
2673 SELECT MAX(s.schedule_date) AS schedule_date
2674 FROM pn_payment_schedules_all s,
2675 pn_payment_items_all i
2676 WHERE i.payment_term_id IN
2677 (SELECT t.payment_term_id
2678 FROM pn_payment_terms_all t
2679 WHERE t.lease_id = p_lease_ID
2680 AND t.frequency_code = 'MON'
2681 AND NVL(t.normalize,'N')='N')
2682 AND i.payment_schedule_id = s.payment_schedule_id
2683 AND s.payment_status_lookup_code = 'APPROVED'
2684 AND s.lease_id = p_lease_ID;
2685
2686 /* QUARTERLY, SEMI_ANNUAL, ANNUAL */
2687 CURSOR max_appr_sched_other(p_lease_ID IN NUMBER) IS
2688 SELECT MAX(s.schedule_date) AS schedule_date
2689 FROM pn_payment_schedules_all s,
2690 pn_payment_items_all i
2691 WHERE i.payment_term_id IN
2692 (SELECT t.payment_term_id
2693 FROM pn_payment_terms_all t
2694 WHERE t.lease_id = p_lease_ID
2695 AND t.frequency_code IN ('QTR', 'SA', 'YR')
2696 AND NVL(t.normalize,'N')='N')
2697 AND i.payment_schedule_id = s.payment_schedule_id
2698 AND s.payment_status_lookup_code = 'APPROVED'
2699 AND s.lease_id = p_lease_ID;
2700
2701 /* get terms for max approved schedule date */
2702 CURSOR terms_for_max_appr_sched( p_lease_ID IN NUMBER
2703 ,p_sched_date IN DATE) IS
2704 SELECT payment_term_ID
2705 ,start_date
2706 ,end_date
2707 ,schedule_day
2708 ,frequency_code
2709 FROM pn_payment_terms_all
2710 WHERE lease_ID = p_lease_ID
2711 AND payment_term_ID IN
2712 (SELECT DISTINCT i.payment_term_ID
2713 FROM pn_payment_items_all i
2714 ,pn_payment_schedules_all s
2715 WHERE s.schedule_date = p_sched_date
2716 AND s.lease_ID = p_lease_ID
2717 AND s.payment_status_lookup_code = 'APPROVED'
2718 AND i.payment_schedule_ID = s.payment_schedule_ID);
2719
2720 /* cursors used when called from term */
2721 /* get the max schedule date for the term */
2722 CURSOR max_appr_sched_term( p_lease_ID IN NUMBER
2723 ,p_term_ID IN NUMBER) IS
2724 SELECT MAX(s.schedule_date) AS schedule_date
2725 FROM pn_payment_schedules_all s,
2726 pn_payment_items_all i
2727 WHERE i.payment_term_id = p_term_ID
2728 AND i.payment_schedule_id = s.payment_schedule_id
2729 AND s.payment_status_lookup_code = 'APPROVED'
2730 AND s.lease_id = p_lease_ID;
2731
2732 CURSOR term_details(p_term_ID IN NUMBER) IS
2733 SELECT payment_term_ID
2734 ,start_date
2735 ,end_date
2736 ,schedule_day
2737 ,frequency_code
2738 FROM pn_payment_terms_all
2739 WHERE payment_term_ID = p_term_ID;
2740
2741 l_frequency NUMBER;
2742 l_sched_tbl PNP_UTIL_FUNC.virtual_sched_tbl_type;
2743
2744 /* user defined exceptions */
2745 INVALID_PARAM EXCEPTION;
2746 INVALID_TERMINATION_DATE EXCEPTION;
2747
2748 BEGIN
2749
2750 PNP_DEBUG_PKG.log('+++ valid_early_term_date +++');
2751 PNP_DEBUG_PKG.log('p_lease_id :'||p_lease_id);
2752 PNP_DEBUG_PKG.log('p_term_id :'||p_term_id);
2753 PNP_DEBUG_PKG.log('p_normalized :'||p_normalized);
2754 PNP_DEBUG_PKG.log('p_frequency :'||p_frequency);
2755 PNP_DEBUG_PKG.log('p_termination_date :'||p_termination_date);
2756 PNP_DEBUG_PKG.log('p_called_from :'||p_called_from);
2757
2758 /* lease ID must always be passed */
2759 IF p_lease_id IS NULL OR
2760 p_termination_date IS NULL THEN
2761 RAISE INVALID_PARAM;
2762 END IF;
2763
2764 IF UPPER(p_called_from) = 'LEASE' THEN
2765
2766 /* check if there exists a norm term starting after the new end date
2767 and if atleast one schedule for the lease has been APPROVED */
2768 FOR i IN exists_norm_term( p_lease_ID
2769 ,p_termination_date) LOOP
2770 RAISE INVALID_TERMINATION_DATE;
2771 END LOOP;
2772
2773 /* check for normalized term approved schedues */
2774 FOR sd_norm IN max_appr_sched_norm(p_lease_ID) LOOP
2775 IF p_termination_date < (LAST_DAY(sd_norm.schedule_date)+1) THEN
2776 RAISE INVALID_TERMINATION_DATE;
2777 END IF;
2778 END LOOP;
2779
2780 /* check for not normalized terms */
2781
2782 /* one time */
2783 FOR sd_ot IN max_appr_sched_ot(p_lease_ID) LOOP
2784 IF p_termination_date < sd_ot.schedule_date THEN
2785 RAISE INVALID_TERMINATION_DATE;
2786 END IF;
2787 END LOOP;
2788
2789 /* monthly */
2790 FOR sd_mon IN max_appr_sched_mon(p_lease_ID) LOOP
2791 IF p_termination_date < LAST_DAY(sd_mon.schedule_date) THEN
2792 RAISE INVALID_TERMINATION_DATE;
2793 END IF;
2794 END LOOP;
2795
2796 /* quarterly, semi-annual, annual */
2797 FOR sd_other IN max_appr_sched_other(p_lease_ID) LOOP
2798
2799 FOR term_rec IN terms_for_max_appr_sched( p_lease_ID
2800 ,sd_other.schedule_date)
2801 LOOP
2802
2803 l_sched_tbl := PNP_UTIL_FUNC.create_virtual_schedules
2804 ( p_start_date => term_rec.start_date
2805 ,p_end_date => term_rec.end_date
2806 ,p_sch_day => term_rec.schedule_day
2807 ,p_term_freq => term_rec.frequency_code
2808 ,p_limit_date => p_termination_date);
2809
2810 IF l_sched_tbl.COUNT < 1 THEN
2811 RAISE INVALID_TERMINATION_DATE;
2812 END IF;
2813
2814 IF p_termination_date < l_sched_tbl(l_sched_tbl.COUNT).end_date THEN
2815 RAISE INVALID_TERMINATION_DATE;
2816 END IF;
2817
2818 END LOOP;
2819
2820 END LOOP;
2821
2822 ELSIF UPPER(p_called_from) = 'TERM' THEN
2823
2824 /* validate if the mandatory params have been passed */
2825 IF p_term_id IS NULL OR
2826 p_normalized IS NULL OR
2827 p_frequency IS NULL THEN
2828 RAISE INVALID_PARAM;
2829 END IF;
2830
2831 FOR term_rec IN max_appr_sched_term(p_lease_ID, p_term_ID) LOOP
2832
2833 IF NVL(p_normalized, 'N') = 'Y' THEN
2834
2835 IF p_termination_date < LAST_DAY(term_rec.schedule_date) + 1 THEN
2836 RAISE INVALID_TERMINATION_DATE;
2837 END IF;
2838
2839 ELSE
2840
2841 IF p_frequency = 'MON' THEN
2842
2843 IF p_termination_date < LAST_DAY(term_rec.schedule_date) THEN
2844 RAISE INVALID_TERMINATION_DATE;
2845 END IF;
2846
2847 ELSE
2848
2849 IF UPPER(p_frequency) = 'QTR' THEN
2850 l_frequency := 3;
2851
2852 ELSIF UPPER(p_frequency) = 'SA' THEN
2853 l_frequency := 6;
2854
2855 ELSIF UPPER(p_frequency) = 'YR' THEN
2856 l_frequency := 12;
2857
2858 END IF;
2859
2860 FOR term_rec IN term_details(p_term_ID) LOOP
2861
2862 l_sched_tbl := PNP_UTIL_FUNC.create_virtual_schedules
2863 ( p_start_date => term_rec.start_date
2864 ,p_end_date => term_rec.end_date
2865 ,p_sch_day => term_rec.schedule_day
2866 ,p_term_freq => term_rec.frequency_code
2867 ,p_limit_date => p_termination_date);
2868
2869 IF l_sched_tbl.COUNT < 1 THEN
2870 RAISE INVALID_TERMINATION_DATE;
2871 END IF;
2872
2873 IF p_termination_date < l_sched_tbl(l_sched_tbl.COUNT).end_date THEN
2874 RAISE INVALID_TERMINATION_DATE;
2875 END IF;
2876
2877 END LOOP;
2878
2879 END IF;
2880
2881 END IF;
2882
2883 END LOOP;
2884
2885 ELSE
2886
2887 RAISE INVALID_PARAM;
2888
2889 END IF;
2890
2891 RETURN TRUE;
2892
2893 EXCEPTION
2894
2895 WHEN INVALID_PARAM THEN
2896 PNP_DEBUG_PKG.log('Invalid PARAM passed.');
2897 RETURN FALSE;
2898
2899 WHEN INVALID_TERMINATION_DATE THEN
2900 fnd_message.set_name ('PN', 'PN_NO_EARLY_TERMINATE_NORM');
2901 RETURN FALSE;
2902
2903 WHEN OTHERS THEN
2904 PNP_DEBUG_PKG.log('Something went wrong here!! - '||SQLCODE||': '||SQLERRM);
2905 RETURN FALSE;
2906
2907 END valid_early_term_date;
2908
2909 /*============================================================================+
2910 -- NAME : VALIDATE_LEASE_TERMINATE_DATE
2911 -- DESCRIPTION : To validate the user provided lease termination date against
2912 -- the system computed minimum lease termination date
2913 -- NOTES :
2914 -- SCOPE : PUBLIC
2915 -- ARGUMENTS
2916 -- p_lease_id
2917 -- p_termination_date
2918 --
2919 -- RETURNS : BOOLEAN
2920 --
2921 -- NOTES :
2922 --
2923 -- MODIFICATION HISTORY
2924 -- 11-SEP-07 rthumma Bug # 6366630. Enhancement for new profile
2925 -- option for lease early termination
2926 +=============================================================================*/
2927 FUNCTION validate_lease_terminate_date (p_lease_id IN NUMBER,
2928 p_termination_date IN DATE)
2929 RETURN BOOLEAN IS
2930
2931 l_min_lease_terminate_date DATE;
2932 INVALID_TERMINATION_DATE EXCEPTION;
2933 BEGIN
2934 l_min_lease_terminate_date := min_lease_terminate_date(p_lease_id);
2935 IF (l_min_lease_terminate_date > p_termination_date) THEN
2936 RAISE INVALID_TERMINATION_DATE;
2937 ELSE
2938 RETURN TRUE;
2939 END IF;
2940 EXCEPTION
2941 WHEN INVALID_TERMINATION_DATE THEN
2942 fnd_message.set_name ('PN', 'PN_INVALID_TERMINATE_DATE');
2943 RETURN FALSE;
2944 END validate_lease_terminate_date;
2945
2946 /*============================================================================+
2947 -- NAME : NORM_TRM_EXSTS
2948 -- DESCRIPTION : Find if a lease contains normalized terms
2949 -- NOTES :
2950 -- SCOPE : PUBLIC
2951 -- ARGUMENTS
2952 -- p_lease_id lease ID
2953 -- RETURNS : BOOLEAN
2954 --
2955 -- NOTES :
2956 --
2957 -- MODIFICATION HISTORY
2958 -- 11-SPE-07 rthumma Bug # 6366630. Enhancement for new profile
2959 -- option for lease early termination
2960 +=============================================================================*/
2961 FUNCTION norm_trm_exsts (p_lease_id IN NUMBER) RETURN BOOLEAN IS
2962
2963 l_norm_trm_exsts BOOLEAN := FALSE;
2964
2965 CURSOR csr_norm_term_exists(p_lease_id IN NUMBER) IS
2966 SELECT 1
2967 FROM pn_payment_terms_all
2968 WHERE NVL(normalize,'N') = 'Y'
2969 AND lease_id = p_lease_id;
2970
2971 BEGIN
2972 <<label>>
2973 FOR rec IN csr_norm_term_exists(p_lease_id) LOOP
2974 l_norm_trm_exsts := TRUE;
2975 EXIT label;
2976 END LOOP;
2977 RETURN l_norm_trm_exsts;
2978 END norm_trm_exsts;
2979
2980 /*============================================================================+
2981 -- NAME : MIN_LEASE_TERMINATE_DATE
2982 -- DESCRIPTION : To get the minimum lease termination date.This date is used
2983 -- to compare with the new lease termination for an
2984 -- ammendement so as not to allow a date earlier than this
2985 -- lease date
2986 -- NOTES :
2987 -- SCOPE : PUBLIC
2988 -- ARGUMENTS
2989 -- p_lease_id lease ID
2990 -- RETURNS : DATE
2991 --
2992 -- NOTES : Currently being used PNTLEASE to validate the
2993 -- termination date at the lease
2994 --
2995 -- MODIFICATION HISTORY
2996 -- 11-SEP-07 rthumma Bug # 6366630. Enhancement for new profile
2997 -- option for lease early termination
2998 +=============================================================================*/
2999 FUNCTION MIN_LEASE_TERMINATE_DATE (p_lease_id IN NUMBER) RETURN DATE IS
3000
3001 l_min_lease_terminate_date DATE;
3002 l_norm_trm_exsts BOOLEAN := FALSE;
3003 l_item_end_dt_tbl pnp_util_func.item_end_dt_tbl_type;
3004 i NUMBER;
3005 maxDt DATE := TO_DATE('01/01/0001', 'MM/DD/YYYY');
3006
3007 CURSOR csr_lst_appr_schd(p_lease_ID IN NUMBER) IS
3008 SELECT LAST_DAY(MAX(schedule_date)) AS last_appr_schd_month_end_dt
3009 FROM pn_payment_schedules_all
3010 WHERE payment_status_lookup_code = 'APPROVED'
3011 AND lease_id = p_lease_id;
3012
3013
3014 BEGIN
3015 l_norm_trm_exsts := norm_trm_exsts(p_lease_id);
3016 IF NOT l_norm_trm_exsts THEN
3017 FOR rec IN csr_lst_appr_schd(p_lease_id) LOOP
3018 l_min_lease_terminate_date := rec.last_appr_schd_month_end_dt;
3019 END LOOP;
3020 ELSIF l_norm_trm_exsts THEN
3021 l_item_end_dt_tbl := fetch_item_end_dates( p_lease_id);
3022 FOR i IN 1 .. l_item_end_dt_tbl.COUNT LOOP
3023 IF maxDt < l_item_end_dt_tbl(i).item_end_dt THEN
3024 maxDt := l_item_end_dt_tbl(i).item_end_dt;
3025 END IF;
3026 END LOOP;
3027 l_min_lease_terminate_date := maxDt;
3028 END IF;
3029 RETURN l_min_lease_terminate_date;
3030 END MIN_LEASE_TERMINATE_DATE;
3031
3032 /*============================================================================+
3033 -- NAME : ITEM_END_DATE
3034 -- DESCRIPTION : To get the item end date.This date is used
3035 -- to determine the term early termination date of a term while
3036 -- contracting a lease
3037 -- NOTES :
3038 -- SCOPE : PUBLIC
3039 -- ARGUMENTS
3040 -- p_term_id payment_term_id
3041 -- p_freq_code frequency_code
3042 --
3043 -- RETURNS : DATE
3044 --
3045 -- NOTES : Currently being used PNTLEASE to validate the
3046 -- termination date of the lease and find the termination date
3047 -- of the term
3048 --
3049 -- MODIFICATION HISTORY
3050 -- 11-SEP-07 rthumma Bug # 6366630. Enhancement for new profile
3051 -- option for lease early termination
3052 +=============================================================================*/
3053 FUNCTION item_end_date (p_term_id IN NUMBER,p_freq_code IN VARCHAR) RETURN DATE IS
3054
3055 l_item_end_dt DATE;
3056
3057 CURSOR csr_ot_item_end_date(p_term_id IN NUMBER) IS
3058 SELECT MAX(schedule_date) AS item_end_date
3059 FROM pn_payment_items_all item,
3060 pn_payment_terms_all term,
3061 pn_payment_schedules_all schd
3062 WHERE term.payment_term_id = p_term_id
3063 AND item.payment_term_id = term.payment_term_id
3064 AND item.payment_schedule_id = schd.payment_schedule_id
3065 AND item.payment_item_type_lookup_code = 'CASH'
3066 AND item.actual_amount <>0
3067 AND schd.payment_status_lookup_code = 'APPROVED';
3068
3069 CURSOR csr_mon_item_end_date(p_term_id IN NUMBER) IS
3070 SELECT LAST_DAY(MAX(schedule_date)) AS item_end_date
3071 FROM pn_payment_items_all item,
3072 pn_payment_terms_all term,
3073 pn_payment_schedules_all schd
3074 WHERE term.payment_term_id = p_term_id
3075 AND item.payment_term_id = term.payment_term_id
3076 AND item.payment_schedule_id = schd.payment_schedule_id
3077 AND item.payment_item_type_lookup_code = 'CASH'
3078 AND item.actual_amount <>0
3079 AND schd.payment_status_lookup_code = 'APPROVED';
3080
3081 CURSOR csr_qtr_item_end_date(p_term_id IN NUMBER) IS
3082 SELECT ADD_MONTHS(MAX(schedule_date),3) - 1 AS item_end_date
3083 FROM pn_payment_items_all item,
3084 pn_payment_terms_all term,
3085 pn_payment_schedules_all schd
3086 WHERE term.payment_term_id = p_term_id
3087 AND item.payment_term_id = term.payment_term_id
3088 AND item.payment_schedule_id = schd.payment_schedule_id
3089 AND item.payment_item_type_lookup_code = 'CASH'
3090 AND item.actual_amount <>0
3091 AND schd.payment_status_lookup_code = 'APPROVED';
3092
3093 CURSOR csr_sa_item_end_date(p_term_id IN NUMBER) IS
3094 SELECT ADD_MONTHS(MAX(schedule_date),6) - 1 AS item_end_date
3095 FROM pn_payment_items_all item,
3096 pn_payment_terms_all term,
3097 pn_payment_schedules_all schd
3098 WHERE term.payment_term_id = p_term_id
3099 AND item.payment_term_id = term.payment_term_id
3100 AND item.payment_schedule_id = schd.payment_schedule_id
3101 AND item.payment_item_type_lookup_code = 'CASH'
3102 AND item.actual_amount <>0
3103 AND schd.payment_status_lookup_code = 'APPROVED';
3104
3105 CURSOR csr_yr_item_end_date(p_term_id IN NUMBER) IS
3106 SELECT ADD_MONTHS(MAX(schedule_date),12) - 1 AS item_end_date
3107 FROM pn_payment_items_all item,
3108 pn_payment_terms_all term,
3109 pn_payment_schedules_all schd
3110 WHERE term.payment_term_id = p_term_id
3111 AND item.payment_term_id = term.payment_term_id
3112 AND item.payment_schedule_id = schd.payment_schedule_id
3113 AND item.payment_item_type_lookup_code = 'CASH'
3114 AND item.actual_amount <>0
3115 AND schd.payment_status_lookup_code = 'APPROVED';
3116
3117 BEGIN
3118 IF p_freq_code = 'OT' THEN
3119 FOR rec IN csr_ot_item_end_date(p_term_id) LOOP
3120 l_item_end_dt := rec.item_end_date;
3121 END LOOP;
3122 ELSIF p_freq_code = 'MON' THEN
3123 FOR rec IN csr_mon_item_end_date(p_term_id) LOOP
3124 l_item_end_dt := rec.item_end_date;
3125 END LOOP;
3126 ELSIF p_freq_code = 'QTR' THEN
3127 FOR rec IN csr_qtr_item_end_date(p_term_id) LOOP
3128 l_item_end_dt := rec.item_end_date;
3129 END LOOP;
3130 ELSIF p_freq_code = 'SA' THEN
3131 FOR rec IN csr_sa_item_end_date(p_term_id) LOOP
3132 l_item_end_dt := rec.item_end_date;
3133 END LOOP;
3134 ELSIF p_freq_code = 'YR' THEN
3135 FOR rec IN csr_yr_item_end_date(p_term_id) LOOP
3136 l_item_end_dt := rec.item_end_date;
3137 END LOOP;
3138 END IF;
3139 RETURN l_item_end_dt;
3140 END item_end_date;
3141
3142 /*============================================================================+
3143 -- NAME : FETCH_ITEM_END_DATES
3144 -- DESCRIPTION : To tabulate the item end dates for all terms in a lease
3145 -- NOTES :
3146 -- SCOPE : PUBLIC
3147 -- ARGUMENTS
3148 -- p_lease_id p_lease_id
3149 --
3150 -- RETURNS : item_end_dt_tbl_type
3151 --
3152 -- NOTES :
3153 --
3154 -- MODIFICATION HISTORY
3155 -- 11-SEP-07 rthumma Bug # 6366630. Enhancement for new profile
3156 -- option for lease early termination
3157 +=============================================================================*/
3158 FUNCTION fetch_item_end_dates( p_lease_id NUMBER)
3159 RETURN pnp_util_func.item_end_dt_tbl_type IS
3160
3161 CURSOR csr_term_info(p_lease_ID IN NUMBER) IS
3162 SELECT frequency_code,
3163 payment_term_id,
3164 index_period_id
3165 FROM pn_payment_terms_all
3166 WHERE lease_id = p_lease_id
3167 AND NVL(status,'APPROVED') = 'APPROVED';
3168
3169 l_item_end_dt_tbl pnp_util_func.item_end_dt_tbl_type;
3170 i NUMBER := 0;
3171
3172 BEGIN
3173 FOR rec IN csr_term_info(p_lease_id) LOOP
3174 i := i + 1;
3175 l_item_end_dt_tbl(i).term_id := rec.payment_term_id;
3176 l_item_end_dt_tbl(i).index_period_id := rec.index_period_id;
3177 l_item_end_dt_tbl(i).item_end_dt := item_end_date(rec.payment_term_id,
3178 rec.frequency_code);
3179 END LOOP;
3180 RETURN l_item_end_dt_tbl;
3181 END fetch_item_end_dates;
3182
3183 /*============================================================================+
3184 -- NAME : get_high_change_comm_date
3185 -- DESCRIPTION : To get the highest change commencement date FROM
3186 -- pn_lease_changes_v for the current lease. This date is used
3187 -- to compare with the new change_commencement_date for an
3188 -- ammendement so as not to allow a date earlier than the
3189 -- existing change_commencement_date.
3190 -- NOTES : Currently being used in view "PN_LEASE_CHANGES_V"
3191 -- SCOPE : PUBLIC
3192 -- INVOKED FROM :
3193 -- ARGUMENTS : IN : p_leaseId
3194 -- OUT : NONE
3195 -- RETURNS : The highest change commencement date.
3196 --
3197 -- REFERENCE :
3198 -- HISTORY :
3199 -- 03-FEB-00 Daniel Thota o Created
3200 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
3201 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pn_lease_changes
3202 -- with _ALL table.
3203 +=============================================================================*/
3204 FUNCTION GET_HIGH_CHANGE_COMM_DATE (p_leaseId IN NUMBER) RETURN DATE IS
3205 l_date DATE;
3206
3207 BEGIN
3208 SELECT MAX(change_commencement_date)
3209 INTO l_date
3210 FROM pn_lease_changes_all
3211 WHERE lease_id = p_leaseId;
3212
3213 RETURN l_date;
3214 EXCEPTION
3215 WHEN NO_DATA_FOUND THEN
3216 RETURN NULL;
3217
3218 END GET_HIGH_CHANGE_COMM_DATE;
3219
3220 /*===========================================================================+
3221 | FUNCTION
3222 | get_emp_hr_data
3223 |
3224 | DESCRIPTION
3225 | To get an employee's hr related data for populating PNTSPACE-Assignment
3226 | screen.
3227 |
3228 | SCOPE - PUBLIC
3229 |
3230 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3231 |
3232 | ARGUMENTS : IN:
3233 | p_personId
3234 |
3235 | OUT:
3236 | none
3237 |
3238 | RETURNS : A record of hr data related to the employee.
3239 |
3240 | NOTES : Currently being used in form "PNTSPACE-Assignmets-Employee"
3241 |
3242 | MODIFICATION HISTORY
3243 |
3244 | 04-MAY-2000 Daniel Thota Created
3245 | 26-OCT-2004 Satish Tripathi Fixed for BUG# 3927904; select job as of sysdate.
3246 +===========================================================================*/
3247
3248 FUNCTION GET_EMP_HR_DATA (p_personId IN NUMBER) RETURN EMP_HR_DATA_REC
3249 IS
3250
3251 l_emp_hr_data EMP_HR_DATA_REC ;
3252
3253 CURSOR get_emp_hr_data_csr
3254 IS
3255 SELECT ppf.person_id,
3256 ppf.effective_start_date,
3257 ppf.effective_end_date,
3258 paf.assignment_id,
3259 ppf.last_name last_name,
3260 ppf.employee_number employee_number,
3261 ppf.email_address email_address,
3262 ppf.first_name first_name,
3263 ppf.full_name full_name,
3264 ppf.person_type_id,
3265 ppttl.user_person_type employee_type,
3266 pp.phone_number phone_number,
3267 paf.position_id position_id,
3268 hr_general.decode_position_latest_name(paf.position_id) position,
3269 paf.job_id job_id,
3270 pj.name job ,
3271 paf.organization_id organization_id,
3272 hou.name organization,
3273 paf.employment_category employment_category,
3274 hrl.meaning employment_category_meaning
3275 FROM per_jobs pj,
3276 hr_organization_units hou,
3277 hr_lookups hrl,
3278 per_phones pp,
3279 per_person_types_tl ppttl,
3280 per_all_assignments_f paf,
3281 per_all_people_f ppf
3282 WHERE ppf.person_id = p_personId
3283 AND TRUNC(SYSDATE) BETWEEN ppf.effective_start_date AND ppf.effective_end_date
3284 AND paf.person_id = ppf.person_id
3285 AND TRUNC(SYSDATE) BETWEEN paf.effective_start_date AND paf.effective_end_date
3286 AND paf.primary_flag = 'Y'
3287 AND pp.parent_table(+) = 'PER_ALL_PEOPLE_F'
3288 AND pp.parent_id(+) = ppf.person_id
3289 AND ppf.effective_start_date BETWEEN pp.date_FROM(+)
3290 AND NVL(pp.date_to(+) ,TO_DATE('12/31/4712','MM/DD/YYYY'))
3291 AND pp.phone_type(+) = 'W1'
3292 AND ppttl.person_type_id = ppf.person_type_id
3293 AND ppttl.language = userenv('LANG')
3294 AND hou.organization_id = paf.organization_id -- no need of outer join it's mAND. col.
3295 AND pj.job_id (+) = paf.job_id
3296 AND hrl.lookup_type (+) = 'EMP_CAT'
3297 AND hrl.lookup_code (+) = paf.employment_category;
3298
3299 BEGIN
3300 FOR get_emp_hr_data IN get_emp_hr_data_csr
3301 LOOP
3302 l_emp_hr_data := get_emp_hr_data;
3303 EXIT;
3304 END LOOP;
3305
3306 RETURN l_emp_hr_data;
3307
3308 EXCEPTION
3309 WHEN OTHERS THEN
3310 RETURN NULL;
3311
3312 END GET_EMP_HR_DATA;
3313
3314 /*============================================================================+
3315 -- NAME : get_emp_pr_data
3316 -- DESCRIPTION : To get an employee's project related data for populating
3317 -- PNTSPACE-Assignment screen.
3318 -- NOTES : Currently being used in form "PNTSPACE-Assignmets-Employee"
3319 -- SCOPE : PUBLIC
3320 -- INVOKED FROM :
3321 -- ARGUMENTS : IN : p_projectId
3322 -- OUT : NONE
3323 -- RETURNS : A record of pr data related to the employee.
3324 --
3325 -- REFERENCE :
3326 -- HISTORY :
3327 -- 25-MAY-00 Daniel Thota o Created
3328 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PA_PROJECTS
3329 -- with _ALL table.
3330 +============================================================================*/
3331 FUNCTION GET_EMP_PR_DATA (p_projectId IN NUMBER) RETURN EMP_PR_DATA_REC IS
3332 l_emp_pr_data EMP_PR_DATA_REC ;
3333
3334 BEGIN
3335
3336 SELECT pa.segment1,
3337 hou.name
3338 INTO l_emp_pr_data
3339 FROM PA_PROJECTS_ALL pa,
3340 HR_ORGANIZATION_UNITS hou
3341 WHERE pa.project_id = p_projectId
3342 AND hou.organization_id = pa.carrying_out_organization_id;
3343
3344 RETURN l_emp_pr_data;
3345
3346 EXCEPTION
3347 WHEN others THEN
3348 RETURN NULL;
3349
3350 END GET_EMP_PR_DATA;
3351
3352 /*===========================================================================+
3353 | FUNCTION
3354 | get_emp_tr_data
3355 |
3356 | DESCRIPTION
3357 | To get an employee's project task related data for populating
3358 | PNTSPACE-Assignment screen.
3359 |
3360 | SCOPE - PUBLIC
3361 |
3362 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3363 |
3364 | ARGUMENTS : IN:
3365 | p_taskId
3366 |
3367 | OUT:
3368 | none
3369 |
3370 | RETURNS : A record of task data related to the employee.
3371 |
3372 | NOTES : Currently being used in form "PNTSPACE-Assignmets-Employee"
3373 |
3374 | MODIFICATION HISTORY
3375 |
3376 | 25-MAY-2000 Daniel Thota Created
3377 +===========================================================================*/
3378
3379 FUNCTION GET_EMP_TR_DATA (
3380 p_taskId IN NUMBER
3381 ) RETURN EMP_TR_DATA_REC
3382 IS
3383
3384 l_emp_tr_data EMP_TR_DATA_REC ;
3385
3386 BEGIN
3387
3388 SELECT pat.task_name
3389 INTO l_emp_tr_data
3390 FROM PA_TASKS pat
3391 WHERE pat.task_id = p_taskId;
3392
3393 RETURN l_emp_tr_data;
3394
3395 EXCEPTION
3396 WHEN others THEN
3397 RETURN NULL;
3398
3399 END GET_EMP_TR_DATA;
3400
3401 /*===========================================================================+
3402 | FUNCTION
3403 | get_building_rentable_area
3404 |
3405 | DESCRIPTION
3406 | RETURN the sum of rentable_area of offices associated with a ( Building/LAND )
3407 |
3408 | SCOPE - PUBLIC
3409 |
3410 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3411 |
3412 | ARGUMENTS:
3413 | IN: p_location_id
3414 | OUT: none
3415 |
3416 | RETURNS:
3417 | RETURN the sum of rentable_area of offices associated with a ( Building/LAND )
3418 |
3419 | NOTES:
3420 | Currently being used in views "PN_LOCATIONS_V"
3421 | "PN_BUILDING_V"
3422 | AND form PNSULOCN.fmb ( Locations form )
3423 |
3424 | ASSUMPTION:
3425 |
3426 | ALGORITHM
3427 |
3428 | MODIFICATION HISTORY
3429 |
3430 | 07-FEB-2001 Lakshmikanth K o An additional check of STATUS = 'A'
3431 | has been included for fixing the Bug No. 1630186.
3432 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3433 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
3434 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3435 | 25-FEB-2004 ftanudja o Revamped code for performance.
3436 | 05-MAY-2004 ftanudja o Handle if location type is null.
3437 +===========================================================================*/
3438
3439 FUNCTION get_building_rentable_area ( p_Location_Id NUMBER ,
3440 p_as_of_date IN DATE
3441 ) RETURN NUMBER
3442 IS
3443 l_location_type pn_locations.location_type_lookup_code%type;
3444 l_area pn_location_area_rec;
3445 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3446 invalid_location_type EXCEPTION;
3447
3448 BEGIN
3449
3450 l_location_type := get_location_type_lookup_code (
3451 p_location_id => p_location_id,
3452 p_as_of_date => l_as_of_date);
3453
3454 IF l_location_type IS NULL THEN
3455 return null;
3456 ELSIF l_location_type IN ('BUILDING','LAND') THEN
3457
3458 fetch_loctn_area(
3459 p_type => l_location_type,
3460 p_location_id => p_location_id,
3461 p_as_of_date => l_as_of_date,
3462 x_area => l_area);
3463
3464 ELSE
3465 raise invalid_location_type;
3466 END IF;
3467
3468 RETURN l_area.rentable_area;
3469
3470 EXCEPTION
3471 WHEN invalid_location_type THEN
3472 raise;
3473 WHEN others THEN
3474 raise;
3475
3476 END get_building_rentable_area;
3477
3478 /*===========================================================================+
3479 | FUNCTION
3480 | get_building_usable_area
3481 |
3482 | DESCRIPTION
3483 | RETURN the sum of usable_area of offices associated with a ( Building/LAND )
3484 |
3485 | SCOPE - PUBLIC
3486 |
3487 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3488 |
3489 | ARGUMENTS:
3490 | IN: p_location_id
3491 | OUT: none
3492 |
3493 | RETURNS:
3494 | RETURN the sum of usable_area of offices associated with a ( Building/LAND )
3495 |
3496 | NOTES:
3497 | Currently being used in views "PN_LOCATIONS_V"
3498 | "PN_BUILDING_V"
3499 | AND form PNSULOCN.fmb ( Locations form )
3500 |
3501 | ASSUMPTION:
3502 |
3503 | ALGORITHM
3504 |
3505 | MODIFICATION HISTORY
3506 |
3507 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3508 | Included the following INTO the WHERE CLAUSE
3509 | STATUS = 'A'
3510 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3511 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3512 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
3513 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3514 | 25-FEB-2004 ftanudja o Revamped code for performance.
3515 | 05-MAY-2004 ftanudja o Handle if location type is null.
3516 +===========================================================================*/
3517
3518 FUNCTION get_building_usable_area ( p_Location_Id NUMBER ,
3519 p_as_of_date IN DATE
3520 ) RETURN NUMBER
3521 IS
3522 l_location_type pn_locations.location_type_lookup_code%type;
3523 l_area pn_location_area_rec;
3524 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3525 invalid_location_type EXCEPTION;
3526
3527 BEGIN
3528
3529 l_location_type := get_location_type_lookup_code (
3530 p_location_id => p_location_id,
3531 p_as_of_date => l_as_of_date);
3532
3533 IF l_location_type IS NULL THEN
3534 return null;
3535 ELSIF l_location_type IN ('BUILDING','LAND') THEN
3536
3537 fetch_loctn_area(
3538 p_type => l_location_type,
3539 p_location_id => p_location_id,
3540 p_as_of_date => l_as_of_date,
3541 x_area => l_area);
3542
3543 ELSE
3544 raise invalid_location_type;
3545 END IF;
3546
3547 RETURN l_area.usable_area;
3548
3549 EXCEPTION
3550 WHEN invalid_location_type THEN
3551 raise;
3552 WHEN others THEN
3553 raise;
3554
3555 END get_building_usable_area;
3556
3557 /*===========================================================================+
3558 | FUNCTION
3559 | get_building_assignable_area
3560 |
3561 | DESCRIPTION
3562 | RETURN the sum of assignable_area of offices associated with a ( Building/LAND )
3563 |
3564 | SCOPE - PUBLIC
3565 |
3566 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3567 |
3568 | ARGUMENTS:
3569 | IN: p_location_id
3570 | OUT: none
3571 |
3572 | RETURNS:
3573 | RETURN the sum of assignable_area of offices associated with a ( Building/LAND )
3574 |
3575 | NOTES:
3576 | Currently being used in views "PN_LOCATIONS_V"
3577 | "PN_BUILDING_V"
3578 | AND form PNSULOCN.fmb ( Locations form )
3579 |
3580 | ASSUMPTION:
3581 |
3582 | ALGORITHM
3583 |
3584 | MODIFICATION HISTORY
3585 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3586 | Included the following INTO the WHERE CLAUSE
3587 | STATUS = 'A'
3588 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3589 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3590 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
3591 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3592 | 25-FEB-2004 ftanudja o Revamped code for performance.
3593 | 05-MAY-2004 ftanudja o Handle if location type is null.
3594 +===========================================================================*/
3595
3596 FUNCTION get_building_assignable_area (
3597 p_Location_Id NUMBER ,
3598 p_as_of_date IN DATE
3599 ) RETURN NUMBER
3600 IS
3601 l_location_type pn_locations.location_type_lookup_code%type;
3602 l_area pn_location_area_rec;
3603 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3604 invalid_location_type EXCEPTION;
3605
3606 BEGIN
3607
3608 l_location_type := get_location_type_lookup_code (
3609 p_location_id => p_location_id,
3610 p_as_of_date => l_as_of_date);
3611
3612 IF l_location_type IS NULL THEN
3613 return null;
3614 ELSIF l_location_type IN ('BUILDING','LAND') THEN
3615
3616 fetch_loctn_area(
3617 p_type => l_location_type,
3618 p_location_id => p_location_id,
3619 p_as_of_date => l_as_of_date,
3620 x_area => l_area);
3621
3622 ELSE
3623 raise invalid_location_type;
3624 END IF;
3625
3626 RETURN l_area.assignable_area;
3627
3628 EXCEPTION
3629 WHEN invalid_location_type THEN
3630 raise;
3631 WHEN others THEN
3632 raise;
3633
3634 END get_building_assignable_area;
3635
3636 /*===========================================================================+
3637 | FUNCTION
3638 | get_floor_rentable_area
3639 |
3640 | DESCRIPTION
3641 | RETURN the sum of rentable_area of offices associated with a ( Floor/Parcel )
3642 |
3643 | SCOPE - PUBLIC
3644 |
3645 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3646 |
3647 | ARGUMENTS:
3648 | IN: p_location_id
3649 | OUT: none
3650 |
3651 | RETURNS:
3652 | RETURN the sum of rentable_area of offices associated with a ( Floor/Parcel )
3653 |
3654 | NOTES:
3655 | Currently being used in views "PN_LOCATIONS_V"
3656 | "PN_BUILDING_V"
3657 | AND form PNSULOCN.fmb ( Locations form )
3658 |
3659 | ASSUMPTION:
3660 |
3661 | ALGORITHM
3662 |
3663 | MODIFICATION HISTORY
3664 | 07-FEB-2001 Lakshmikanth K o An additional check of STATUS = 'A'
3665 | has been included for fixing the Bug No. 1630186.
3666 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3667 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
3668 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3669 | 25-FEB-2004 ftanudja o Revamped code for performance.
3670 | 05-MAY-2004 ftanudja o Handle if location type is null.
3671 +===========================================================================*/
3672
3673 FUNCTION get_floor_rentable_area ( p_Location_Id IN NUMBER ,
3674 p_as_of_date IN DATE
3675 )
3676 RETURN NUMBER
3677 IS
3678 l_location_type pn_locations.location_type_lookup_code%type;
3679 l_area pn_location_area_rec;
3680 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3681 invalid_location_type EXCEPTION;
3682
3683 BEGIN
3684
3685 l_location_type := get_location_type_lookup_code (
3686 p_location_id => p_location_id,
3687 p_as_of_date => l_as_of_date);
3688
3689 IF l_location_type IS NULL THEN
3690 return null;
3691 ELSIF l_location_type IN ('FLOOR','PARCEL') THEN
3692
3693 fetch_loctn_area(
3694 p_type => l_location_type,
3695 p_location_id => p_location_id,
3696 p_as_of_date => l_as_of_date,
3697 x_area => l_area);
3698
3699 ELSE
3700 raise invalid_location_type;
3701 END IF;
3702
3703 RETURN l_area.rentable_area;
3704
3705 EXCEPTION
3706 WHEN invalid_location_type THEN
3707 raise;
3708 WHEN others THEN
3709 raise;
3710
3711 END get_floor_rentable_area;
3712
3713 /*===========================================================================+
3714 | FUNCTION
3715 | get_floor_usable_area
3716 |
3717 | DESCRIPTION
3718 | RETURN the sum of usable_area of offices associated with a ( Floor/Parcel )
3719 |
3720 | SCOPE - PUBLIC
3721 |
3722 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3723 |
3724 | ARGUMENTS:
3725 | IN: p_location_id
3726 | OUT: none
3727 |
3728 | RETURNS:
3729 | RETURN the sum of usable_area of offices associated with a ( Floor/Parcel )
3730 |
3731 | NOTES:
3732 | Currently being used in views "PN_LOCATIONS_V"
3733 | "PN_BUILDING_V"
3734 | AND form PNSULOCN.fmb ( Locations form )
3735 |
3736 | ASSUMPTION:
3737 |
3738 | ALGORITHM
3739 |
3740 | MODIFICATION HISTORY
3741 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3742 | Included the following INTO the WHERE CLAUSE
3743 | STATUS = 'A'
3744 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3745 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3746 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
3747 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3748 | 25-FEB-2004 ftanudja o Revamped code for performance.
3749 | 05-MAY-2004 ftanudja o Handle if location type is null.
3750 +===========================================================================*/
3751
3752 FUNCTION get_floor_usable_area ( p_Location_Id IN NUMBER ,
3753 p_as_of_date IN DATE )
3754 RETURN NUMBER
3755 IS
3756 l_location_type pn_locations.location_type_lookup_code%type;
3757 l_area pn_location_area_rec;
3758 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3759 invalid_location_type EXCEPTION;
3760
3761 BEGIN
3762
3763 l_location_type := get_location_type_lookup_code (
3764 p_location_id => p_location_id,
3765 p_as_of_date => l_as_of_date);
3766
3767 IF l_location_type IS NULL THEN
3768 return null;
3769 ELSIF l_location_type IN ('FLOOR','PARCEL') THEN
3770
3771 fetch_loctn_area(
3772 p_type => l_location_type,
3773 p_location_id => p_location_id,
3774 p_as_of_date => l_as_of_date,
3775 x_area => l_area);
3776
3777 ELSE
3778 raise invalid_location_type;
3779 END IF;
3780
3781 RETURN l_area.usable_area;
3782
3783 EXCEPTION
3784 WHEN invalid_location_type THEN
3785 raise;
3786 WHEN others THEN
3787 raise;
3788
3789 END get_floor_usable_area;
3790
3791 /*===========================================================================+
3792 | FUNCTION
3793 | get_floor_assignable_area
3794 |
3795 | DESCRIPTION
3796 | RETURN the sum of assignable_area of offices associated with a ( Floor/Parcel )
3797 |
3798 | SCOPE - PUBLIC
3799 |
3800 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3801 |
3802 | ARGUMENTS:
3803 | IN: p_location_id
3804 | OUT: none
3805 |
3806 | RETURNS:
3807 | RETURN the sum of assignable_area of offices associated with a ( Floor/Parcel )
3808 |
3809 | NOTES:
3810 | Currently being used in views "PN_LOCATIONS_V"
3811 | "PN_BUILDING_V"
3812 | AND form PNSULOCN.fmb ( Locations form )
3813 |
3814 | ASSUMPTION:
3815 |
3816 | ALGORITHM
3817 |
3818 | MODIFICATION HISTORY
3819 |
3820 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3821 | Included the following INTO the WHERE CLAUSE
3822 | STATUS = 'A'
3823 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3824 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3825 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
3826 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3827 | 25-FEB-2004 ftanudja o Revamped code for performance.
3828 | 05-MAY-2004 ftanudja o Handle if location type is null.
3829 +===========================================================================*/
3830
3831 FUNCTION get_floor_assignable_area ( p_Location_Id NUMBER ,
3832 p_as_of_date IN DATE )
3833 RETURN NUMBER
3834 IS
3835 l_location_type pn_locations.location_type_lookup_code%type;
3836 l_area pn_location_area_rec;
3837 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3838 invalid_location_type EXCEPTION;
3839
3840 BEGIN
3841
3842 l_location_type := get_location_type_lookup_code (
3843 p_location_id => p_location_id,
3844 p_as_of_date => l_as_of_date);
3845
3846 IF l_location_type IS NULL THEN
3847 return null;
3848 ELSIF l_location_type IN ('FLOOR','PARCEL') THEN
3849
3850 fetch_loctn_area(
3851 p_type => l_location_type,
3852 p_location_id => p_location_id,
3853 p_as_of_date => l_as_of_date,
3854 x_area => l_area);
3855
3856 ELSE
3857 raise invalid_location_type;
3858 END IF;
3859
3860 RETURN l_area.assignable_area;
3861
3862 EXCEPTION
3863 WHEN invalid_location_type THEN
3864 raise;
3865 WHEN others THEN
3866 raise;
3867
3868 END get_floor_assignable_area;
3869
3870 /*===========================================================================+
3871 | FUNCTION
3872 | get_floor_max_capacity
3873 |
3874 | DESCRIPTION
3875 | RETURN the sum of max_capacity of offices associated with a ( Floor/Parcel )
3876 |
3877 | SCOPE - PUBLIC
3878 |
3879 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3880 |
3881 | ARGUMENTS:
3882 | IN: p_location_id
3883 | OUT: none
3884 |
3885 | RETURNS:
3886 | RETURN the sum of max_capacity of offices associated with a ( Floor/Parcel )
3887 |
3888 | NOTES:
3889 | Currently being used in views "PN_LOCATIONS_V"
3890 | "PN_BUILDING_V"
3891 | AND form PNSULOCN.fmb ( Locations form )
3892 |
3893 | ASSUMPTION:
3894 |
3895 | ALGORITHM
3896 |
3897 | MODIFICATION HISTORY
3898 |
3899 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3900 | Included the following INTO the WHERE CLAUSE
3901 | STATUS = 'A'
3902 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3903 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3904 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
3905 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3906 | 25-FEB-2004 ftanudja o Revamped code for performance.
3907 | 05-MAY-2004 ftanudja o Handle if location type is null.
3908 +===========================================================================*/
3909
3910 FUNCTION get_floor_max_capacity (
3911 p_Location_Id NUMBER ,
3912 p_as_of_date IN DATE
3913 ) RETURN NUMBER
3914 IS
3915 l_location_type pn_locations.location_type_lookup_code%type;
3916 l_area pn_location_area_rec;
3917 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3918 invalid_location_type EXCEPTION;
3919
3920 BEGIN
3921
3922 l_location_type := get_location_type_lookup_code (
3923 p_location_id => p_location_id,
3924 p_as_of_date => l_as_of_date);
3925
3926 IF l_location_type IS NULL THEN
3927 return null;
3928 ELSIF l_location_type IN ('FLOOR','PARCEL') THEN
3929
3930 fetch_loctn_area(
3931 p_type => l_location_type,
3932 p_location_id => p_location_id,
3933 p_as_of_date => l_as_of_date,
3934 x_area => l_area);
3935
3936 ELSE
3937 raise invalid_location_type;
3938 END IF;
3939
3940 RETURN l_area.max_capacity;
3941
3942 EXCEPTION
3943 WHEN invalid_location_type THEN
3944 raise;
3945 WHEN others THEN
3946 raise;
3947
3948 END get_floor_max_capacity;
3949
3950 /*===========================================================================+
3951 | FUNCTION
3952 | get_floor_optimum_capacity
3953 |
3954 | DESCRIPTION
3955 | RETURN the sum of optimum_capacity of offices associated with a ( Floor/Parcel )
3956 |
3957 | SCOPE - PUBLIC
3958 |
3959 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
3960 |
3961 | ARGUMENTS:
3962 | IN: p_location_id
3963 | OUT: none
3964 |
3965 | RETURNS:
3966 | RETURN the sum of optimum_capacity of offices associated with a ( Floor/Parcel )
3967 |
3968 | NOTES:
3969 | Currently being used in views "PN_LOCATIONS_V"
3970 | "PN_BUILDING_V"
3971 | AND form PNSULOCN.fmb ( Locations form )
3972 |
3973 | ASSUMPTION:
3974 |
3975 | ALGORITHM
3976 |
3977 | MODIFICATION HISTORY
3978 |
3979 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
3980 | Included the following INTO the WHERE CLAUSE
3981 | STATUS = 'A'
3982 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
3983 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
3984 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
3985 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
3986 | 25-FEB-2004 ftanudja o Revamped code for performance.
3987 | 05-MAY-2004 ftanudja o Handle if location type is null.
3988 +===========================================================================*/
3989
3990 FUNCTION get_floor_optimum_capacity ( p_Location_Id NUMBER ,
3991 p_as_of_date IN DATE ) RETURN NUMBER
3992 IS
3993 l_location_type pn_locations.location_type_lookup_code%type;
3994 l_area pn_location_area_rec;
3995 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
3996 invalid_location_type EXCEPTION;
3997
3998 BEGIN
3999
4000 l_location_type := get_location_type_lookup_code (
4001 p_location_id => p_location_id,
4002 p_as_of_date => l_as_of_date);
4003
4004 IF l_location_type IS NULL THEN
4005 return null;
4006 ELSIF l_location_type IN ('FLOOR','PARCEL') THEN
4007
4008 fetch_loctn_area(
4009 p_type => l_location_type,
4010 p_location_id => p_location_id,
4011 p_as_of_date => l_as_of_date,
4012 x_area => l_area);
4013
4014 ELSE
4015 raise invalid_location_type;
4016 END IF;
4017
4018 RETURN l_area.optimum_capacity;
4019
4020 EXCEPTION
4021 WHEN invalid_location_type THEN
4022 raise;
4023 WHEN others THEN
4024 raise;
4025
4026 END get_floor_optimum_capacity;
4027
4028
4029 /*===========================================================================+
4030 | FUNCTION
4031 | get_building_max_capacity
4032 |
4033 | DESCRIPTION
4034 | RETURN the sum of max_capacity of offices associated with a ( Building/LAND )
4035 |
4036 | SCOPE - PUBLIC
4037 |
4038 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4039 |
4040 | ARGUMENTS:
4041 | IN: p_location_id
4042 | OUT: none
4043 |
4044 | RETURNS:
4045 | RETURN the sum of max_capacity of offices associated with a ( Building/LAND )
4046 |
4047 | NOTES:
4048 | Currently being used in views "PN_LOCATIONS_V"
4049 | "PN_BUILDING_V"
4050 | AND form PNSULOCN.fmb ( Locations form )
4051 |
4052 | ASSUMPTION:
4053 |
4054 | ALGORITHM
4055 |
4056 | MODIFICATION HISTORY
4057 |
4058 | 9-MAR-2001 Lakshmikanth K o Bug Fix #1666611
4059 | Included the following INTO the WHERE CLAUSE
4060 | STATUS = 'A'
4061 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
4062 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
4063 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
4064 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
4065 | 25-FEB-2004 ftanudja o Revamped code for performance.
4066 | 05-MAY-2004 ftanudja o Handle if location type is null.
4067 +===========================================================================*/
4068
4069 FUNCTION get_building_max_capacity ( p_Location_Id NUMBER ,
4070 p_as_of_date IN DATE ) RETURN NUMBER
4071 IS
4072 l_location_type pn_locations.location_type_lookup_code%type;
4073 l_area pn_location_area_rec;
4074 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4075 invalid_location_type EXCEPTION;
4076
4077 BEGIN
4078
4079 l_location_type := get_location_type_lookup_code (
4080 p_location_id => p_location_id,
4081 p_as_of_date => l_as_of_date);
4082
4083 IF l_location_type IS NULL THEN
4084 return null;
4085 ELSIF l_location_type IN ('BUILDING','LAND') THEN
4086
4087 fetch_loctn_area(
4088 p_type => l_location_type,
4089 p_location_id => p_location_id,
4090 p_as_of_date => l_as_of_date,
4091 x_area => l_area);
4092
4093 ELSE
4094 raise invalid_location_type;
4095 END IF;
4096
4097 RETURN l_area.max_capacity;
4098
4099 EXCEPTION
4100 WHEN invalid_location_type THEN
4101 raise;
4102 WHEN others THEN
4103 raise;
4104
4105 END get_building_max_capacity;
4106
4107 /*===========================================================================+
4108 | FUNCTION
4109 | get_building_optimum_capacity
4110 |
4111 | DESCRIPTION
4112 | RETURN the sum of optimum_capacity of offices associated with a ( Building/LAND )
4113 |
4114 | SCOPE - PUBLIC
4115 |
4116 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4117 |
4118 | ARGUMENTS:
4119 | IN: p_location_id
4120 | OUT: none
4121 |
4122 | RETURNS:
4123 | RETURN the sum of optimum_capacity of offices associated with a ( Building/LAND )
4124 |
4125 | NOTES:
4126 | Currently being used in views "PN_LOCATIONS_V"
4127 | "PN_BUILDING_V"
4128 | AND form PNSULOCN.fmb ( Locations form )
4129 |
4130 | ASSUMPTION:
4131 |
4132 | ALGORITHM
4133 |
4134 | MODIFICATION HISTORY
4135 |
4136 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
4137 | Included the following INTO the WHERE CLAUSE
4138 | STATUS = 'A'
4139 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
4140 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
4141 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
4142 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
4143 | 25-FEB-2004 ftanudja o Revamped code for performance.
4144 | 05-MAY-2004 ftanudja o Handle if location type is null.
4145 +===========================================================================*/
4146
4147 FUNCTION get_building_optimum_capacity ( p_Location_Id NUMBER ,
4148 p_as_of_date IN DATE ) RETURN NUMBER
4149 IS
4150 l_location_type pn_locations.location_type_lookup_code%type;
4151 l_area pn_location_area_rec;
4152 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4153 invalid_location_type EXCEPTION;
4154
4155 BEGIN
4156
4157 l_location_type := get_location_type_lookup_code (
4158 p_location_id => p_location_id,
4159 p_as_of_date => l_as_of_date);
4160
4161 IF l_location_type IS NULL THEN
4162 return null;
4163 ELSIF l_location_type IN ('BUILDING','LAND') THEN
4164
4165 fetch_loctn_area(
4166 p_type => l_location_type,
4167 p_location_id => p_location_id,
4168 p_as_of_date => l_as_of_date,
4169 x_area => l_area);
4170
4171 ELSE
4172 raise invalid_location_type;
4173 END IF;
4174
4175 RETURN l_area.optimum_capacity;
4176
4177 EXCEPTION
4178 WHEN invalid_location_type THEN
4179 raise;
4180 WHEN others THEN
4181 raise;
4182
4183 END get_building_optimum_capacity;
4184
4185 /*===========================================================================+
4186 | FUNTION
4187 | get_floor_vacancy
4188 |
4189 | DESCRIPTION
4190 | RETURN the Vacant Capacity for a given location_id
4191 |
4192 | SCOPE - PUBLIC
4193 |
4194 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4195 |
4196 | ARGUMENTS:
4197 | IN: p_location_id
4198 | OUT: none
4199 |
4200 | RETURNS : Vacant capacity for a location (Floor/Parcel)
4201 |
4202 | NOTES : Currently being used in view "PN_LOCATIONS_V"
4203 | "PN_BUILDING_V"
4204 | AND Space Assignments form - "PNTSPACE.fmb"
4205 |
4206 | MODIFICATION HISTORY
4207 |
4208 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
4209 | pnp_util_func.get_utilized_capacity
4210 | - Bug Fix for #1379527
4211 |
4212 | 18-FEB-2004 abanerje o Handled NO_DATA_FOUND to return 0.
4213 | All the select statements have been
4214 | converted to cursors. The l_location_type
4215 | is checked for null to return 0.
4216 | Bug #3384965.
4217 +===========================================================================*/
4218
4219 FUNCTION get_floor_vacancy ( p_Location_Id NUMBER,
4220 p_as_of_date DATE) RETURN NUMBER IS
4221
4222 l_Location_Type pn_locations.location_type_lookup_code%type;
4223
4224 l_utilized_capacity NUMBER:= pnp_util_func.get_utilized_capacity ( p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
4225 l_max_capacity NUMBER:= pnp_util_func.get_floor_max_capacity ( p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
4226 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4227 INVALID_LOCATION_TYPE EXCEPTION;
4228
4229
4230
4231 BEGIN
4232
4233 l_location_type := pnp_util_func.get_location_type_lookup_code (
4234 p_location_id => p_location_id,
4235 p_as_of_date => l_as_of_date);
4236 IF l_Location_Type IS NULL THEN
4237 RETURN 0;
4238 ELSIF l_Location_Type IN ('FLOOR','PARCEL') THEN
4239
4240 IF ROUND((NVL(l_max_capacity,0) - NVL(l_utilized_capacity,0)), 2) > 0 THEN
4241 RETURN ROUND((NVL(l_max_capacity,0) - NVL(l_utilized_capacity,0)), 2);
4242 ELSE
4243 RETURN 0;
4244 END IF;
4245
4246 ELSE
4247 Raise INVALID_LOCATION_TYPE ;
4248
4249 END IF;
4250
4251 EXCEPTION
4252 WHEN INVALID_LOCATION_TYPE THEN
4253 RAISE;
4254 WHEN NO_DATA_FOUND THEN
4255 RETURN 0;
4256 WHEN OTHERS THEN
4257 RAISE;
4258
4259 END get_floor_vacancy;
4260
4261 /*===========================================================================+
4262 | FUNCTION
4263 | get_office_vacancy
4264 |
4265 | DESCRIPTION
4266 | RETURN the Vacant Capacity for a given location_id
4267 |
4268 | SCOPE - PUBLIC
4269 |
4270 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4271 |
4272 | ARGUMENTS:
4273 | IN: p_location_id
4274 | OUT: none
4275 |
4276 | RETURNS : Vacant capacity for a location (Office/Section)
4277 |
4278 | NOTES : Currently being used in view "PN_LOCATIONS_V"
4279 | "PN_BUILDING_V"
4280 | AND Space Assignments form - "PNTSPACE.fmb"
4281 |
4282 | MODIFICATION HISTORY
4283 |
4284 | 17-AUG-2000 Daniel Thota Added default SYSDATE to call to
4285 | pnp_util_func.get_utilized_capacity
4286 | - Bug Fix for #1379527
4287 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
4288 | 31-OCT-2001 graghuna o added p_as_of_date for Location
4289 | Date-Effectivity
4290 | 20-OCT-2003 ftanudja o Removed nvl's from locn tbl. 3197410.
4291 | 18-FEB-2004 abanerje o Handled NO_DATA_FOUND to return 0.
4292 | All the select statements have been
4293 | converted to cursors. The l_location_type
4294 | is checked for null to return 0.
4295 | Bug #3384965.
4296 +===========================================================================*/
4297
4298 FUNCTION get_office_vacancy ( p_Location_Id NUMBER ,
4299 p_as_of_date IN DATE ) RETURN NUMBER IS
4300
4301 l_Location_Type pn_locations.location_type_lookup_code%type;
4302 l_utilized_capacity NUMBER:= get_utilized_capacity(p_location_id,pnp_util_func.get_as_of_date(p_as_of_date));
4303 l_max_capacity NUMBER;
4304 INVALID_LOCATION_TYPE EXCEPTION;
4305 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4306
4307
4308 CURSOR Office_Vacancy_C( p_Location_Id IN NUMBER
4309 ,p_as_of_date IN DATE
4310 ,p_location_type IN VARCHAR2) IS
4311 (SELECT NVL((max_capacity), 0) AS vacancy
4312 FROM pn_locations_all
4313 WHERE Location_Type_Lookup_Code = p_location_type
4314 AND p_as_of_date BETWEEN active_start_date AND active_end_date
4315 AND Location_Id = p_Location_Id
4316 );
4317
4318 BEGIN
4319
4320 l_location_type := pnp_util_func.get_location_type_lookup_code (
4321 p_location_id => p_location_id,
4322 p_as_of_date => l_as_of_date);
4323
4324 IF l_Location_Type IS NULL THEN
4325 RETURN 0;
4326 ELSIF l_Location_Type in('OFFICE' , 'SECTION') THEN
4327 FOR office_vacancy IN Office_Vacancy_C(p_Location_Id
4328 ,l_as_of_date
4329 ,l_location_type)
4330 LOOP
4331 l_max_capacity := office_vacancy.vacancy;
4332 END LOOP;
4333 IF ROUND((NVL(l_max_capacity,0) - NVL(l_utilized_capacity,0)), 2) > 0 THEN
4334 RETURN ROUND((NVL(l_max_capacity,0) - NVL(l_utilized_capacity,0)), 2);
4335 ELSE
4336 RETURN 0;
4337 END IF;
4338
4339 ELSE
4340 Raise INVALID_LOCATION_TYPE ;
4341
4342 End IF;
4343
4344 EXCEPTION
4345 WHEN NO_DATA_FOUND THEN
4346 RETURN 0;
4347 WHEN INVALID_LOCATION_TYPE THEN
4348 RAISE;
4349
4350 WHEN OTHERS THEN
4351 RAISE;
4352
4353 END get_office_vacancy;
4354
4355 /*============================================================================+
4356 -- NAME : get_space_assigned_status
4357 -- DESCRIPTION : Check IF any active assignments exist for the given
4358 -- Location_Id. RETURNs BOOLEAN TRUE IF any assignment exists,
4359 -- otherwise it RETURNs FALSE.
4360 -- NOTES : Currently being used in Locations form - "PNSULOCN.fmb"
4361 -- SCOPE : PUBLIC
4362 -- INVOKED FROM :
4363 -- ARGUMENTS : IN : p_location_id, p_as_of_date
4364 -- OUT : none
4365 -- RETURNS : True IF active assignments exist; else False
4366 --
4367 -- REFERENCE :
4368 -- HISTORY :
4369 -- 22-MAR-02 Kiran Hegde o Created
4370 -- 07-MAY-02 Satish Tripathi o Added parameter p_action_type.
4371 -- 14-MAY-02 Kiran Hegde o changed the FUNCTION to have only 2 params
4372 -- 21-MAY-02 Kiran Hegde o replaced p_as_of_date AND SYSDATE with
4373 -- TRUNC(p_as_of_date) AND TRUNC(SYSDATE) resp.
4374 -- in the SELECT statement. Fix For bug#2381299
4375 -- 30-OCT-02 Satish Tripathi o Idented CURSOR csr_current_assign, removed
4376 -- DISTINCT for performance issues.
4377 -- 31-OCT-01 graghuna o added p_as_of_date for Location Date-Effectivity
4378 -- 20-OCT-03 ftanudja o revamped code to remove 'OR', nvl,GROUP BY.
4379 -- 3197410
4380 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
4381 -- PN_SPACE_ASSIGN_CUST with _ALL table.
4382 -- 16-MAR-07 CSRIPERU o Bug#5959164. Modified cursors emp_assign_future
4383 -- and cust_assign_future to ignore allocated_area_pct
4384 -- while checking for active assignments for a location.
4385 +=============================================================================*/
4386
4387 FUNCTION get_space_assigned_status ( p_location_id IN NUMBER,
4388 p_as_of_date IN DATE )
4389 RETURN BOOLEAN
4390 IS
4391 l_exists VARCHAR2(1) := 'N';
4392 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4393
4394 CURSOR emp_assign_future (l_date DATE) IS
4395 SELECT 'Y'
4396 FROM pn_space_assign_emp_all
4397 WHERE emp_assign_start_date > l_date
4398 --Bug#5959164 AND allocated_area_pct > 0
4399 AND location_id IN (SELECT location_id
4400 FROM pn_locations_all
4401 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4402 START WITH location_id = p_Location_Id
4403 CONNECT BY PRIOR location_id = parent_location_id
4404 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4405
4406 CURSOR emp_assign_current (l_date DATE) IS
4407 SELECT 'Y'
4408 FROM pn_space_assign_emp_all
4409 WHERE l_date BETWEEN emp_assign_start_date AND emp_assign_end_date
4410 AND location_id IN (SELECT location_id
4411 FROM pn_locations_all
4412 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4413 START WITH location_id = p_Location_Id
4414 CONNECT BY PRIOR location_id = parent_location_id
4415 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4416
4417 CURSOR emp_assign_current_open (l_date DATE) IS
4418 SELECT 'Y'
4419 FROM pn_space_assign_emp_all
4420 WHERE l_date >= emp_assign_start_date AND emp_assign_end_date IS NULL -- for open assignments time
4421 AND location_id IN (SELECT location_id
4422 FROM pn_locations_all
4423 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4424 START WITH location_id = p_Location_Id
4425 CONNECT BY PRIOR location_id = parent_location_id
4426 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4427
4428 CURSOR cust_assign_future (l_date DATE) IS
4429 SELECT 'Y'
4430 FROM pn_space_assign_cust_all
4431 WHERE cust_assign_start_date > l_date
4432 --Bug#5959164 AND allocated_area_pct > 0
4433 AND location_id IN (SELECT location_id
4434 FROM pn_locations_all
4435 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4436 START WITH location_id = p_Location_Id
4437 CONNECT BY PRIOR location_id = parent_location_id
4438 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4439
4440 CURSOR cust_assign_current (l_date DATE) IS
4441 SELECT 'Y'
4442 FROM pn_space_assign_cust_all
4443 WHERE l_date BETWEEN cust_assign_start_date AND cust_assign_end_date
4444 AND location_id IN (SELECT location_id
4445 FROM pn_locations_all
4446 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4447 START WITH location_id = p_Location_Id
4448 CONNECT BY PRIOR location_id = parent_location_id
4449 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4450
4451 CURSOR cust_assign_current_open (l_date DATE) IS
4452 SELECT 'Y'
4453 FROM pn_space_assign_cust_all
4454 WHERE l_date >= cust_assign_start_date AND cust_assign_end_date IS NULL -- for open assignments time
4455 AND location_id IN (SELECT location_id
4456 FROM pn_locations_all
4457 WHERE l_as_of_date BETWEEN active_start_date AND active_end_date
4458 START WITH location_id = p_Location_Id
4459 CONNECT BY PRIOR location_id = parent_location_id
4460 AND l_as_of_date BETWEEN PRIOR active_start_date AND PRIOR active_end_date);
4461
4462 l_date DATE := NVL(TRUNC(l_as_of_date), TRUNC(SYSDATE));
4463
4464 BEGIN
4465
4466 FOR exists_cur IN emp_assign_future(l_date) LOOP
4467 l_exists:= 'Y'; exit;
4468 END LOOP;
4469
4470 IF l_exists = 'N' THEN
4471 FOR exists_cur IN emp_assign_current(l_date) LOOP
4472 l_exists:= 'Y'; exit;
4473 END LOOP;
4474 END IF;
4475
4476 IF l_exists = 'N' THEN
4477 FOR exists_cur IN emp_assign_current_open(l_date) LOOP
4478 l_exists:= 'Y'; exit;
4479 END LOOP;
4480 END IF;
4481
4482
4483 IF l_exists = 'N' THEN
4484 FOR exists_cur IN cust_assign_future(l_date) LOOP
4485 l_exists:= 'Y'; exit;
4486 END LOOP;
4487 END IF;
4488
4489
4490 IF l_exists = 'N' THEN
4491 FOR exists_cur IN cust_assign_current(l_date) LOOP
4492 l_exists:= 'Y'; exit;
4493 END LOOP;
4494 END IF;
4495
4496 IF l_exists = 'N' THEN
4497 FOR exists_cur IN cust_assign_current_open(l_date) LOOP
4498 l_exists:= 'Y'; exit;
4499 END LOOP;
4500 END IF;
4501
4502 IF l_exists = 'Y' THEN
4503 RETURN TRUE ;
4504 ELSE
4505 RETURN FALSE ;
4506 END IF;
4507
4508 EXCEPTION
4509 WHEN NO_DATA_FOUND THEN
4510 RETURN null;
4511 WHEN OTHERS THEN
4512 RAISE;
4513
4514 END get_space_assigned_status;
4515
4516 /*===========================================================================+
4517 | FUNCTION
4518 | get_floor_secondary_area
4519 |
4520 | DESCRIPTION
4521 | RETURN the secondary_circulation_area for a given location_id ( Floor/Parcel )
4522 |
4523 | SCOPE - PUBLIC
4524 |
4525 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4526 |
4527 | ARGUMENTS:
4528 | IN: p_location_id
4529 | OUT: none
4530 |
4531 | RETURNS : secondary_circulation_area for a given location_id ( Floor/Parcel )
4532 |
4533 | NOTES : Currently being used in view "PN_LOCATIONS_V"
4534 | "PN_BUILDING_V"
4535 | AND Space Assignments form - "PNTSPACE.fmb"
4536 |
4537 | MODIFICATION HISTORY
4538 | 05-MAY-2004 ftanudja o Handle if location type is null.
4539 |
4540 +===========================================================================*/
4541
4542 FUNCTION get_floor_secondary_area ( p_Location_Id NUMBER,
4543 p_as_of_date DATE ) RETURN NUMBER IS
4544
4545 l_Location_Type pn_locations.location_type_lookup_code%type;
4546 l_rentable_area NUMBER:= get_floor_rentable_area ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
4547 l_usable_area NUMBER:= get_floor_usable_area ( p_Location_Id,pnp_util_func.get_as_of_date(p_as_of_date));
4548 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date); --ASHISH
4549 INVALID_LOCATION_TYPE EXCEPTION;
4550
4551
4552
4553 BEGIN
4554
4555 l_location_type := pnp_util_func.get_location_type_lookup_code (
4556 p_location_id => p_location_id,
4557 p_as_of_date => l_as_of_date); --ASHISH
4558
4559 IF l_location_type IS NULL THEN
4560 raise NO_DATA_FOUND;
4561 ELSIF l_Location_Type in ('FLOOR', 'PARCEL') THEN
4562
4563 RETURN round((l_rentable_area - l_usable_area), 2);
4564
4565 Else
4566 Raise INVALID_LOCATION_TYPE ;
4567
4568 End IF;
4569
4570 EXCEPTION
4571 WHEN INVALID_LOCATION_TYPE THEN
4572 RAISE;
4573
4574 WHEN OTHERS THEN
4575 RAISE;
4576
4577 END get_floor_secondary_area;
4578
4579 /*===========================================================================+
4580 | FUNCTION
4581 | get_office_secondary_area
4582 |
4583 | DESCRIPTION
4584 | RETURN the secondary_circulation_area for a given location_id ( Office/Section )
4585 |
4586 | SCOPE - PUBLIC
4587 |
4588 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4589 |
4590 | ARGUMENTS:
4591 | IN: p_location_id
4592 | OUT: none
4593 |
4594 | RETURNS : secondary_circulation_area for a given location_id
4595 | ( Office/Section )
4596 |
4597 | NOTES : Currently being used in view "PN_LOCATIONS_V"
4598 | "PN_BUILDING_V"
4599 | AND Space Assignments form - "PNTSPACE.fmb"
4600 |
4601 | MODIFICATION HISTORY
4602 |
4603 | 21-MAR-2002 Kiran o Modified FUNCTION to RETURN 0 IF
4604 | secondary Area is less than 0
4605 | 30-OCT-2002 Satish o Access _all table for performance issues.
4606 | 20-OCT-2003 ftanudja o removed nvl from locn tbl filters. 3197410.
4607 | 18-FEB-2004 abanerje o Handled NO_DATA_FOUND to return 0.
4608 | All the select statements have been
4609 | converted to cursors. The l_location_type
4610 | is checked for null to return 0.
4611 | Bug #3384965
4612 +===========================================================================*/
4613
4614 FUNCTION get_office_secondary_area ( p_Location_Id NUMBER ,
4615 p_as_of_date IN DATE ) RETURN NUMBER IS
4616
4617 l_Location_Type pn_locations.location_type_lookup_code%type;
4618 l_assignable_area NUMBER;
4619 l_usable_area NUMBER;
4620 l_common_area NUMBER;
4621 l_secondary_area NUMBER;
4622 INVALID_LOCATION_TYPE EXCEPTION;
4623 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4624
4625 CURSOR Area_C( p_Location_Id IN NUMBER
4626 ,p_as_of_date IN DATE
4627 ,p_location_type IN VARCHAR2) IS
4628 (SELECT NVL((USABLE_AREA), 0) AS usable_area
4629 ,NVL((ASSIGNABLE_AREA), 0) AS assignable_area
4630 ,NVL((COMMON_AREA), 0) AS common_area
4631 FROM pn_locations_all
4632 WHERE Location_Type_Lookup_Code = p_location_type
4633 AND p_as_of_date BETWEEN active_start_date AND active_end_date
4634 AND Location_Id = p_Location_Id
4635 );
4636 BEGIN
4637
4638 l_location_type := pnp_util_func.get_location_type_lookup_code (
4639 p_location_id => p_location_id,
4640 p_as_of_date => l_as_of_date);
4641
4642 IF l_Location_Type IS NULL THEN
4643 RETURN 0;
4644 ELSIF l_Location_Type in ('OFFICE' , 'SECTION') THEN
4645 FOR area IN Area_C(p_Location_Id
4646 ,l_as_of_date
4647 ,l_location_type)
4648 LOOP
4649 l_usable_area := NVL(area.usable_area,0);
4650 l_assignable_area := NVL(area.assignable_area,0);
4651 l_common_area := NVL(area.common_area,0);
4652 END LOOP;
4653
4654 IF( (l_usable_area - l_assignable_area - l_common_area) < 0 ) THEN
4655 RETURN 0;
4656 ELSE
4657 RETURN ROUND((l_usable_area - l_assignable_area - l_common_area), 2);
4658 END IF;
4659
4660 ELSE
4661 RAISE INVALID_LOCATION_TYPE ;
4662
4663 END IF;
4664
4665 EXCEPTION
4666 WHEN INVALID_LOCATION_TYPE THEN
4667 RAISE;
4668 WHEN NO_DATA_FOUND THEN
4669 RETURN 0;
4670 WHEN OTHERS THEN
4671 RAISE;
4672
4673 END get_office_secondary_area;
4674
4675 /*===========================================================================+
4676 | FUNCTION
4677 | get_floor_common_area
4678 |
4679 | DESCRIPTION
4680 | RETURN the sum of common areas of offices associated with a ( Floor/Parcel )
4681 |
4682 | SCOPE - PUBLIC
4683 |
4684 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4685 |
4686 | ARGUMENTS:
4687 | IN: p_location_id
4688 | OUT: none
4689 |
4690 | RETURNS:
4691 | RETURN the sum of common areas of offices associated with a ( Floor/Parcel )
4692 |
4693 | NOTES:
4694 | Currently being used in views "PN_LOCATIONS_V"
4695 | "PN_BUILDING_V"
4696 | AND form PNSULOCN.fmb ( Locations form )
4697 |
4698 | ASSUMPTION:
4699 |
4700 | ALGORITHM
4701 |
4702 | MODIFICATION HISTORY
4703 |
4704 | 09-MAR-2001 Lakshmikanth K o Bug Fix #1666611
4705 | Included the following INTO the WHERE CLAUSE
4706 | STATUS = 'A'
4707 | to filter out NOCOPY INACTIVE OFFICES / SECTIONS.
4708 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
4709 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
4710 | 20-OCT-2003 ftanudja o Removed nvl from locn tbl. 3197410.
4711 | 05-MAY-2004 ftanudja o Handle if location type is null.
4712 +===========================================================================*/
4713
4714 FUNCTION get_floor_common_area ( p_Location_Id NUMBER ,
4715 p_as_of_date IN DATE ) RETURN NUMBER IS
4716
4717 l_Location_Type pn_locations.location_type_lookup_code%type;
4718 l_common_area NUMBER;
4719 INVALID_LOCATION_TYPE EXCEPTION;
4720
4721 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4722
4723 BEGIN
4724
4725 l_location_type := pnp_util_func.get_location_type_lookup_code (
4726 p_location_id => p_location_id,
4727 p_as_of_date => l_as_of_date);
4728
4729 IF l_location_type IS NULL THEN
4730 return null;
4731 ELSIF l_Location_Type in ('FLOOR', 'PARCEL') THEN
4732 if l_location_type = 'FLOOR' then
4733 l_location_type := 'OFFICE';
4734 else
4735 l_location_type := 'SECTION';
4736 end if;
4737
4738 SELECT NVL(SUM(COMMON_AREA),0)
4739 INTO l_common_area
4740 FROM pn_locations_all
4741 WHERE Location_Type_Lookup_Code = l_location_type --'OFFICE'
4742 AND Status = 'A'
4743 AND l_as_of_date BETWEEN active_start_date AND active_end_date
4744 START WITH Location_Id = p_Location_Id
4745 CONNECT BY PRIOR Location_Id = Parent_Location_Id
4746 AND l_as_of_date between prior active_start_date and --ASHISH
4747 PRIOR active_end_date;
4748
4749 Else
4750 Raise INVALID_LOCATION_TYPE ;
4751
4752 End IF;
4753
4754 RETURN (l_common_area);
4755
4756 EXCEPTION
4757 WHEN INVALID_LOCATION_TYPE THEN
4758 RAISE;
4759
4760 WHEN NO_DATA_FOUND THEN
4761 RETURN NULL;
4762
4763 WHEN OTHERS THEN
4764 RAISE;
4765
4766 END get_floor_common_area;
4767 /*===========================================================================+
4768 | FUNCTION
4769 | get_building_common_area
4770 |
4771 | DESCRIPTION
4772 | RETURN the sum of common areas of offices associated with a ( Building/Land )
4773 |
4774 | SCOPE - PUBLIC
4775 |
4776 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4777 |
4778 | ARGUMENTS:
4779 | IN: p_location_id
4780 | OUT: none
4781 |
4782 | RETURNS:
4783 | RETURN the sum of common areas of offices associated with a ( Building/Land )
4784 |
4785 | NOTES:
4786 |
4787 | ASSUMPTION:
4788 |
4789 | ALGORITHM
4790 |
4791 | MODIFICATION HISTORY
4792 |
4793 | 31-Jan-2003 Ashish oCreated
4794 | 20-OCT-2003 ftanudja o Removed nvl from locn tbl. 3197410.
4795 | 05-MAY-2004 ftanudja o Handle if location type is null.
4796 +===========================================================================*/
4797
4798 FUNCTION get_building_common_area ( p_Location_Id NUMBER ,
4799 p_as_of_date IN DATE ) RETURN NUMBER IS
4800
4801 l_Location_Type pn_locations.location_type_lookup_code%type;
4802 l_common_area NUMBER;
4803 INVALID_LOCATION_TYPE EXCEPTION;
4804
4805 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
4806
4807 BEGIN
4808
4809 l_location_type := pnp_util_func.get_location_type_lookup_code (
4810 p_location_id => p_location_id,
4811 p_as_of_date => l_as_of_date);
4812
4813 IF l_location_type IS NULL THEN
4814 return null;
4815 ELSIF l_Location_Type in ('BUILDING', 'LAND') THEN
4816 if l_location_type = 'BUILDING' then
4817 l_location_type := 'OFFICE';
4818 else
4819 l_location_type := 'SECTION';
4820 end if;
4821
4822 SELECT NVL(SUM(COMMON_AREA),0)
4823 INTO l_common_area
4824 FROM pn_locations_all
4825 WHERE Location_Type_Lookup_Code = l_location_type
4826 AND Status = 'A'
4827 AND l_as_of_date BETWEEN active_start_date AND active_end_date
4828 START WITH Location_Id = p_Location_Id
4829 CONNECT BY PRIOR Location_Id = Parent_Location_Id
4830 AND l_as_of_date between prior active_start_date and
4831 PRIOR active_end_date;
4832
4833 Else
4834 Raise INVALID_LOCATION_TYPE ;
4835
4836 End IF;
4837
4838 RETURN (l_common_area);
4839
4840 EXCEPTION
4841 WHEN INVALID_LOCATION_TYPE THEN
4842 RAISE;
4843
4844 WHEN NO_DATA_FOUND THEN
4845 RETURN NULL;
4846
4847 WHEN OTHERS THEN
4848 RAISE;
4849
4850 END get_building_common_area;
4851
4852
4853 /*===========================================================================+
4854 | FUNCTION
4855 | get_parent_location_id
4856 |
4857 | DESCRIPTION
4858 | Get the parent location id of a location of any type
4859 |
4860 | SCOPE - PUBLIC
4861 |
4862 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4863 |
4864 | ARGUMENTS : IN:
4865 | p_location_id
4866 |
4867 | OUT:
4868 | none
4869 |
4870 | RETURNS : parent_location_id FROM PN_LOCATIONS
4871 |
4872 | NOTES :
4873 |
4874 | MODIFICATION HISTORY
4875 |
4876 | 27-JUN-2000 Neeraj Tandon o Created
4877 | 30-OCT-2002 Satish Tripathi o Removed DISTINCT, access _all table for performance issues.
4878 | 20-OCT-2003 ftanudja o Created cursor get_parent_loc_id to
4879 | replace SELECT stmt and remove GROUP BY.
4880 | 3197410.
4881 +===========================================================================*/
4882
4883 FUNCTION get_parent_location_id (
4884 p_location_id IN NUMBER
4885 )
4886 RETURN NUMBER
4887 IS
4888
4889 CURSOR get_parent_loc_id IS
4890 SELECT parent_location_id
4891 FROM pn_locations_all
4892 WHERE location_id = p_location_id;
4893
4894 l_parent_location_id NUMBER;
4895 BEGIN
4896
4897 l_parent_location_id := 0;
4898 FOR get_cur IN get_parent_loc_id LOOP
4899 l_parent_location_id := get_cur.parent_location_id; exit;
4900 END LOOP;
4901
4902 RETURN l_parent_location_id;
4903
4904 EXCEPTION
4905 WHEN OTHERS THEN
4906 RAISE;
4907 END;
4908
4909 /*===========================================================================+
4910 | FUNCTION
4911 | get_normalize_flag
4912 |
4913 | DESCRIPTION
4914 | Get the normalize flag for a payment term
4915 |
4916 | SCOPE - PUBLIC
4917 |
4918 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4919 |
4920 | ARGUMENTS : IN:
4921 | p_paymentTermId
4922 |
4923 | OUT:
4924 | none
4925 |
4926 | RETURNS : normalize FROM PN_PAYMENT_TERMS
4927 |
4928 | NOTES :
4929 |
4930 | MODIFICATION HISTORY
4931 |
4932 | 31-JUL-2000 Lakshmikanth Katputur Created
4933 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
4934 +===========================================================================*/
4935
4936 FUNCTION get_normalize_flag ( p_paymentTermId IN NUMBER
4937 ) RETURN VARCHAR2
4938
4939 IS
4940
4941 normalize_flag VARCHAR2(1);
4942
4943 BEGIN
4944
4945 SELECT NVL(normalize ,'N')
4946 INTO normalize_flag
4947 FROM pn_payment_terms_all
4948 WHERE payment_term_id = p_paymentTermId ;
4949
4950 RETURN (normalize_flag);
4951
4952 EXCEPTION
4953
4954 WHEN NO_DATA_FOUND THEN
4955 RETURN 0;
4956
4957 WHEN OTHERS THEN
4958 RAISE;
4959
4960 END;
4961
4962 /*===========================================================================+
4963 | FUNCTION
4964 | get_hire_date
4965 |
4966 | DESCRIPTION
4967 | RETURNs the hire data of an employee given the person_id
4968 |
4969 | SCOPE - PUBLIC
4970 |
4971 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
4972 |
4973 | ARGUMENTS : IN:
4974 | p_Person_Id
4975 |
4976 | OUT:
4977 | none
4978 |
4979 | RETURNS : The Hire Date of the employee
4980 |
4981 | NOTES : Currently being used in an upgrade script pninsspa.sql
4982 |
4983 | MODIFICATION HISTORY
4984 |
4985 | 28-SEP-2000 Daniel Thota Created
4986 +===========================================================================*/
4987
4988 FUNCTION get_hire_date (p_PersonId IN NUMBER
4989 ) RETURN DATE
4990 IS
4991
4992 l_hire_date DATE;
4993
4994 BEGIN
4995
4996 SELECT MAX(date_start)
4997 INTO l_hire_date
4998 FROM per_periods_of_service
4999 WHERE PERSON_ID = p_PersonId ;
5000
5001 RETURN (l_hire_date);
5002
5003 EXCEPTION
5004
5005 WHEN NO_DATA_FOUND THEN
5006 RETURN NULL;
5007
5008 WHEN OTHERS THEN
5009 RAISE;
5010
5011 END;
5012
5013 /*============================================================================+
5014 -- NAME : Get_Location_Name
5015 -- DESCRIPTION : RETURNs Location Information given the Location_Id
5016 -- NOTES : Currently being used in RXi Reports
5017 -- SCOPE : PUBLIC
5018 -- INVOKED FROM :
5019 -- ARGUMENTS : IN : p_Location_Id
5020 -- OUT : NONE
5021 -- RETURNS : The Location Information of the Location
5022 -- REFERENCE :
5023 -- HISTORY :
5024 -- 24-OCT-00 Daniel Thota o Created
5025 -- 03-NOV-00 Daniel Thota o Added office_park_name,region_name in the
5026 -- SELECT clause AND added condition in WHERE
5027 -- clause to get the appropriate location_park_id
5028 -- AND parent_location_park_id
5029 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
5030 -- 31-OCT-01 graghuna o added p_as_of_date for Location Date-Effectivity
5031 -- 20-OCT-03 ftanudja o removed nvl from locn tbl filter. 3197410.
5032 -- 02-JUL-04 Satish Tripathi o Fixed for 3740584, added l_as_of_date BETWEEN
5033 -- ... for each pn_locations_all table.
5034 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_PROPERTIES
5035 -- with _ALL table.
5036 +============================================================================*/
5037
5038 FUNCTION get_location_name (p_Location_Id IN NUMBER,
5039 p_as_of_date IN DATE
5040 )
5041 RETURN location_name_rec
5042 IS
5043
5044 l_parent_location_id NUMBER;
5045 l_location_type_lookup_code pn_locations.location_type_lookup_code%type;
5046 l_location_name_rec LOCATION_NAME_REC;
5047 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
5048
5049 BEGIN
5050
5051 SELECT location_type_lookup_code,parent_location_id
5052 INTO l_location_type_lookup_code,l_parent_location_id
5053 FROM pn_locations_all
5054 WHERE location_id = p_Location_Id
5055 AND p_as_of_date BETWEEN active_start_date AND active_end_date;
5056
5057 IF l_location_type_lookup_code IN ('OFFICE','SECTION') THEN
5058
5059 SELECT a.location_code office_location_code,a.OFFICE,b.location_code floor_location_code,
5060 b.FLOOR,c.location_code building_location_code,c.BUILDING,
5061 prop.property_code,prop.property_name,
5062 d.name office_park_name, e.name region_name
5063 INTO l_location_name_rec
5064 FROM pn_locations_all a,
5065 pn_locations_all b,
5066 pn_locations_all c,
5067 pn_location_parks d,
5068 pn_location_parks e,
5069 pn_properties_all prop
5070 WHERE a.location_id = p_Location_Id
5071 AND l_as_of_date BETWEEN a.active_start_date AND a.active_end_date
5072 AND b.location_id = l_parent_location_id
5073 AND l_as_of_date BETWEEN b.active_start_date AND b.active_end_date
5074 AND c.location_id = pnp_util_func.GET_PARENT_LOCATION_ID(l_parent_location_id)
5075 AND l_as_of_date BETWEEN c.active_start_date AND c.active_end_date
5076 AND prop.property_id(+) = c.property_id
5077 AND d.location_park_id(+) = prop.location_park_id
5078 AND d.location_park_type(+) = 'OFFPRK'
5079 AND d.language(+) = userenv('LANG')
5080 AND e.location_park_id(+) = d.parent_location_park_id
5081 AND e.location_park_type(+) = 'REGION'
5082 AND e.language(+) = userenv('LANG');
5083
5084 ELSIF l_location_type_lookup_code IN ('FLOOR','PARCEL') THEN
5085
5086 SELECT '' office_location_code,'' OFFICE,b.location_code floor_location_code,
5087 b.FLOOR,c.location_code building_location_code,c.BUILDING,
5088 prop.property_code,prop.property_name,
5089 d.name office_park_name, e.name region_name
5090 INTO l_location_name_rec
5091 FROM pn_locations_all b,
5092 pn_locations_all c,
5093 pn_location_parks d,
5094 pn_location_parks e,
5095 pn_properties_all prop
5096 WHERE b.location_id = p_Location_Id
5097 AND l_as_of_date BETWEEN b.active_start_date AND b.active_end_date
5098 AND c.location_id = l_parent_location_id
5099 AND l_as_of_date BETWEEN c.active_start_date AND c.active_end_date
5100 AND prop.property_id(+) = c.property_id
5101 AND d.location_park_id(+) = prop.location_park_id
5102 AND d.location_park_type(+) = 'OFFPRK'
5103 AND d.language(+) = userenv('LANG')
5104 AND e.location_park_id(+) = d.parent_location_park_id
5105 AND e.location_park_type(+) = 'REGION'
5106 AND e.language(+) = userenv('LANG');
5107
5108 ELSE
5109
5110 SELECT '' office_location_code,'' OFFICE,'' floor_location_code,
5111 '' FLOOR,c.location_code building_location_code,c.BUILDING,
5112 prop.property_code,prop.property_name,
5113 d.name office_park_name, e.name region_name
5114 INTO l_location_name_rec
5115 FROM pn_locations_all c,
5116 pn_location_parks d,
5117 pn_location_parks e,
5118 pn_properties_all prop
5119 WHERE c.location_id = p_Location_Id
5120 AND l_as_of_date BETWEEN c.active_start_date AND c.active_end_date
5121 AND prop.property_id(+) = c.property_id
5122 AND d.location_park_id(+) = prop.location_park_id
5123 AND d.location_park_type(+) = 'OFFPRK'
5124 AND d.language(+) = userenv('LANG')
5125 AND e.location_park_id(+) = d.parent_location_park_id
5126 AND e.location_park_type(+) = 'REGION'
5127 AND e.language(+) = userenv('LANG');
5128
5129 END IF;
5130
5131 RETURN (l_location_name_rec);
5132
5133 EXCEPTION
5134
5135 WHEN NO_DATA_FOUND THEN
5136 RETURN NULL;
5137
5138 WHEN OTHERS THEN
5139 RAISE;
5140
5141 END;
5142
5143 /*===========================================================================+
5144 | FUNCTION
5145 | get_termination_date
5146 |
5147 | DESCRIPTION
5148 | RETURNs the termination data of an employee given the person_id
5149 |
5150 | SCOPE - PUBLIC
5151 |
5152 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5153 |
5154 | ARGUMENTS : IN:
5155 | p_Person_Id
5156 |
5157 | OUT:
5158 | none
5159 |
5160 | RETURNS : The Termination Date of the employee
5161 |
5162 | NOTES : Currently being used in PNEMPDSP.rdf
5163 |
5164 | MODIFICATION HISTORY
5165 |
5166 | 12-DEC-2000 Mrinal Misra Created
5167 +===========================================================================*/
5168
5169
5170 FUNCTION get_termination_date (p_PersonId IN NUMBER
5171 ) RETURN DATE
5172 IS
5173
5174
5175 l_termination_date DATE;
5176
5177 BEGIN
5178
5179 SELECT MAX(NVL(actual_termination_date,TO_DATE('12/31/4712','mm/dd/yyyy')))
5180 INTO l_termination_date
5181 FROM per_periods_of_service
5182 WHERE person_id = p_PersonId ;
5183
5184 IF l_termination_date = TO_DATE('12/31/4712','mm/dd/yyyy') THEN
5185 l_termination_date := NULL;
5186 end IF;
5187
5188 RETURN (l_termination_date);
5189
5190 EXCEPTION
5191
5192 WHEN NO_DATA_FOUND THEN
5193 RETURN NULL;
5194
5195 WHEN OTHERS THEN
5196 RAISE;
5197
5198 END get_termination_date;
5199
5200 /*===========================================================================+
5201 | FUNCTION
5202 | get_rentable_area
5203 |
5204 | DESCRIPTION
5205 | RETURNs the rentable area given the location type lookup code AND
5206 | location id.
5207 |
5208 | SCOPE - PUBLIC
5209 |
5210 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5211 |
5212 | ARGUMENTS : IN:
5213 | p_loc_type_lookup_code, p_location_id
5214 |
5215 | OUT:
5216 | none
5217 |
5218 | RETURNS : The Rentable Area
5219 |
5220 | NOTES : Currently being used in PNSPUTIL.rdf
5221 |
5222 | MODIFICATION HISTORY
5223 |
5224 | 22-JAN-2000 Mrinal Misra o Created
5225 | 07-FEB-2001 Lakshmikanth K o An additional check of STATUS = 'A'
5226 | has been included for fixing the Bug No. 1630186.
5227 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity.
5228 +===========================================================================*/
5229
5230 FUNCTION get_rentable_area (p_loc_type_lookup_code IN VARCHAR2,
5231 p_location_id IN NUMBER ,
5232 p_as_of_date IN DATE
5233 ) RETURN NUMBER
5234 IS
5235
5236 l_rentable_area NUMBER;
5237 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
5238
5239 BEGIN
5240
5241 IF p_loc_type_lookup_code IS NULL AND p_location_id IS NULL THEN
5242
5243 l_rentable_area := 0;
5244
5245 ElSIF p_loc_type_lookup_code IN ('BUILDING','LAND') THEN
5246
5247 l_rentable_area := get_building_rentable_area(p_location_id , l_as_of_date); --ASHISH ADDED L_AS_OF_DATE
5248
5249 ElSIF p_loc_type_lookup_code IN ('FLOOR','PARCEL') THEN
5250
5251 l_rentable_area := get_floor_rentable_area(p_location_id, l_as_of_date); --ASHISH ADDED L_AS_OF_DATE
5252
5253 ElSIF p_loc_type_lookup_code IN ('OFFICE','SECTION') THEN
5254
5255 /* Getting rentable area for Office/Section */
5256
5257 SELECT NVL(rentable_area,0)
5258 INTO l_rentable_area
5259 FROM pn_locations_all
5260 WHERE location_id = p_location_id
5261 AND active_start_date <= l_as_of_date
5262 AND active_end_date >= l_as_of_date;
5263
5264 END IF;
5265
5266 RETURN (l_rentable_area);
5267
5268 EXCEPTION
5269
5270 WHEN NO_DATA_FOUND THEN
5271 RETURN 0;
5272
5273 WHEN OTHERS THEN
5274 RETURN 0;
5275
5276 END get_rentable_area;
5277
5278 /*===========================================================================+
5279 | FUNCTION
5280 | get_default_gl_period
5281 |
5282 | DESCRIPTION
5283 | RETURNs GL period name for a given Schedule(GL) date AND Lease Class Code.
5284 | IF the GL period is closed for the givem Schedule(GL) DATE, next open GL
5285 | period name is RETURNed. IF there does not exist an open GL period
5286 | for the given Scheduel(GL) date THEN an error message is displayed. Lease
5287 | Class Code is used to get the application id of AR AND AP.
5288 |
5289 | SCOPE - PUBLIC
5290 |
5291 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5292 |
5293 | ARGUMENTS : IN:
5294 | p_sch_date, p_lease_class_code
5295 |
5296 | OUT:
5297 | None
5298 |
5299 | RETURNS : GL Period Name
5300 |
5301 | NOTES : None
5302 |
5303 | MODIFICATION HISTORY
5304 |
5305 | 02-FEB-2001 Mrinal Misra Created
5306 | 19-APR-2002 Kiran Hegde Fix for Bug#2236264 AND bug#2448324
5307 | Changed WHERE closing_status <> 'C' to
5308 | WHERE closing_status IN ('O', 'F')
5309 | 28-NOV-2005 sdmahesh o Added parameter P_ORG_ID
5310 | o Passed org_id to get_profile_value
5311 |
5312 +===========================================================================*/
5313
5314 FUNCTION get_default_gl_period(p_sch_date IN DATE,
5315 p_application_id IN NUMBER,
5316 p_org_id IN NUMBER
5317 ) RETURN VARCHAR2 IS
5318
5319 l_gl_period_name gl_period_statuses.period_name%TYPE;
5320 l_err_msg VARCHAR2(2000);
5321
5322 BEGIN
5323
5324 /* Selecting GL period name WHEN Schedule(GL) date lies between start date
5325 AND end date of an open GL period. */
5326
5327 SELECT period_name
5328 INTO l_gl_period_name
5329 FROM gl_period_statuses
5330 WHERE closing_status IN ('O', 'F')
5331 AND set_of_books_id = pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
5332 p_org_id)
5333 AND application_id = p_application_id
5334 AND adjustment_period_flag = 'N'
5335 AND p_sch_date BETWEEN start_date AND end_date;
5336
5337 RETURN(l_gl_period_name);
5338
5339 EXCEPTION
5340
5341 WHEN NO_DATA_FOUND THEN
5342
5343 BEGIN
5344
5345 /* WHEN GL period for a given Schedule(GL) date is closed
5346 next open GL period name is seleted. */
5347
5348 SELECT period_name
5349 INTO l_gl_period_name
5350 FROM gl_period_statuses
5351 WHERE closing_status IN ('O', 'F')
5352 AND set_of_books_id = pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
5353 p_org_id)
5354 AND application_id = p_application_id
5355 AND adjustment_period_flag = 'N'
5356 AND start_date = (SELECT MIN(start_date)
5357 FROM gl_period_statuses
5358 WHERE closing_status IN ('O', 'F')
5359 AND set_of_books_id = pn_mo_cache_utils.get_profile_value('PN_SET_OF_BOOKS_ID',
5360 p_org_id)
5361 AND application_id = p_application_id
5362 AND adjustment_period_flag = 'N'
5363 AND start_date >= p_sch_date);
5364
5365
5366 RETURN(l_gl_period_name);
5367
5368 EXCEPTION
5369
5370 WHEN NO_DATA_FOUND THEN
5371
5372 /* RETURNing NULL WHEN no open GL Period is found */
5373
5374 RETURN NULL;
5375
5376 END;
5377
5378 END get_default_gl_period;
5379
5380
5381 /*===========================================================================+
5382 | FUNCTION
5383 | Get_Unit_Of_Measure
5384 |
5385 | DESCRIPTION
5386 | RETURN The Unit Of Measure
5387 |
5388 | SCOPE - PUBLIC
5389 |
5390 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5391 |
5392 | ARGUMENTS:
5393 | IN: p_location_id
5394 | IN: p_loc_type
5395 | OUT: none
5396 |
5397 | RETURNS:
5398 | RETURN The Unit Of Measure for any location_id
5399 |
5400 | NOTES:
5401 |
5402 | ASSUMPTION:
5403 |
5404 | ALGORITHM
5405 |
5406 | MODIFICATION HISTORY
5407 | 05-FEB-2001 Lakshmikanth o Created this FUNCTION to populate
5408 | the UOM_CODE at the Floor/Parcel AND
5409 | Office/Section to be used in the PNTSPACE.fmb
5410 | Bug Fix for the Bug ID#1540803.
5411 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
5412 | 31-OCT-2001 graghuna o added p_as_of_date for Location Date-Effectivity
5413 | 20-OCT-2003 ftanudja o removed nvl for locn tbl. 3197410.
5414 | 05-MAY-2004 ftanudja o Handle if l_loc_type is null.
5415 | 21-MAY-2004 ftanudja o Removed second 'IF l_type_code = null' cond.
5416 +===========================================================================*/
5417
5418 FUNCTION Get_Unit_Of_Measure (p_location_id IN NUMBER,
5419 p_loc_type IN VARCHAR2 ,
5420 p_as_of_date IN DATE )
5421
5422 RETURN VARCHAR2 IS
5423
5424 l_uom PN_LOCATIONS.uom_code%type;
5425 l_loc_type PN_LOCATIONS.location_type_lookup_code%type;
5426 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
5427
5428 CURSOR get_uom_code_cur IS
5429 SELECT uom_code
5430 FROM pn_locations_all
5431 WHERE location_type_lookup_code = l_loc_type
5432 AND l_as_of_date BETWEEN active_start_date AND active_end_date
5433 Start with location_id = p_location_id
5434 CONNECT BY PRIOR parent_location_id = location_id
5435 and rownum < 2 ;
5436 begin
5437
5438 IF p_loc_type is NULL THEN
5439
5440 l_loc_type := pnp_util_func.get_location_type_lookup_code (
5441 p_location_id => p_location_id,
5442 p_as_of_date => l_as_of_date);
5443
5444 IF l_loc_type IS NULL THEN
5445 raise NO_DATA_FOUND;
5446 ELSIF l_loc_type in ('BUILDING', 'FLOOR' , 'OFFICE') THEN
5447 l_loc_type:= 'BUILDING';
5448 ElSIF l_loc_type in ('LAND', 'PARCEL' , 'SECTION') THEN
5449 l_loc_type:= 'LAND';
5450 END IF;
5451
5452 ELSE
5453
5454 IF p_loc_type in ('BUILDING', 'FLOOR' , 'OFFICE') THEN
5455 l_loc_type:= 'BUILDING';
5456 ElSIF p_loc_type in ('LAND', 'PARCEL' , 'SECTION') THEN
5457 l_loc_type:= 'LAND';
5458 END IF;
5459
5460 END IF;
5461
5462 FOR get_uom_rec in get_uom_code_cur LOOP
5463 l_uom := get_uom_rec.uom_code;
5464 END LOOP;
5465
5466 RETURN l_uom;
5467
5468 exception
5469 WHEN others THEN
5470 RAISE;
5471 l_uom := NULL;
5472 RETURN l_uom;
5473
5474 End Get_Unit_Of_Measure;
5475
5476 /*===========================================================================+
5477 | FUNCTION
5478 | get_ap_payment_term
5479 |
5480 | DESCRIPTION
5481 | This FUNCTION RETURNs Payment Terms Name for a given Payment Term Id
5482 | for Payables.
5483 |
5484 | SCOPE - PUBLIC
5485 |
5486 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5487 |
5488 | ARGUMENTS : IN:
5489 | p_ap_term_id
5490 |
5491 | OUT:
5492 | None
5493 |
5494 | RETURNS : Payment Term Name
5495 |
5496 | NOTES : None
5497 |
5498 | MODIFICATION HISTORY
5499 |
5500 | 23-MAY-2001 Mrinal Misra Created
5501 +===========================================================================*/
5502
5503 FUNCTION Get_Ap_Payment_term (p_ap_term_id IN NUMBER)
5504
5505 RETURN VARCHAR2 IS
5506
5507 l_payment_term_name ap_terms.name%type;
5508
5509 BEGIN
5510
5511 SELECT name
5512 INTO l_payment_term_name
5513 FROM ap_terms
5514 WHERE term_id = p_ap_term_id;
5515
5516 RETURN(l_payment_term_name);
5517
5518 EXCEPTION
5519
5520 WHEN NO_DATA_FOUND THEN
5521 RETURN NULL;
5522
5523 WHEN OTHERS THEN
5524 RAISE;
5525
5526 END Get_Ap_Payment_term;
5527
5528 /*===========================================================================+
5529 | FUNCTION
5530 | get_ar_payment_term
5531 |
5532 | DESCRIPTION
5533 | This FUNCTION RETURNs Payment Terms Name for a given Payment Term Id
5534 | for Receivables.
5535 |
5536 | SCOPE - PUBLIC
5537 |
5538 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5539 |
5540 | ARGUMENTS : IN:
5541 | p_ar_term_id
5542 |
5543 | OUT:
5544 | None
5545 |
5546 | RETURNS : Payment Term Name
5547 |
5548 | NOTES : None
5549 |
5550 | MODIFICATION HISTORY
5551 |
5552 | 23-MAY-2001 Mrinal Misra Created
5553 +===========================================================================*/
5554
5555 FUNCTION Get_Ar_Payment_term (p_ar_term_id IN NUMBER)
5556
5557 RETURN VARCHAR2 IS
5558
5559 l_payment_term_name ra_terms.name%type;
5560
5561 BEGIN
5562
5563 SELECT name
5564 INTO l_payment_term_name
5565 FROM ra_terms
5566 WHERE term_id = p_ar_term_id;
5567
5568 RETURN(l_payment_term_name);
5569
5570 EXCEPTION
5571
5572 WHEN NO_DATA_FOUND THEN
5573 RETURN NULL;
5574
5575 WHEN OTHERS THEN
5576 RAISE;
5577
5578 END Get_Ar_Payment_term;
5579
5580 /*===========================================================================+
5581 -- NAME : get_distribution_set_name
5582 -- DESCRIPTION : This FUNCTION RETURNs Distribution Name for a given Distribution Set Id.
5583 -- SCOPE : PUBLIC
5584 -- INVOKED FROM :
5585 -- ARGUMENTS : IN : p_dist_set_id
5586 -- RETURNS : Distribution Name
5587 -- REFERENCE :
5588 -- HISTORY :
5589 -- 23-MAY-01 Mrinal Misra o Created
5590 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced ap_distribution_sets
5591 -- with _ALL table.
5592 +===========================================================================*/
5593
5594 FUNCTION Get_Distribution_Set_Name (p_dist_set_id IN NUMBER)
5595
5596 RETURN VARCHAR2 IS
5597
5598 l_dist_set_name ap_distribution_sets.distribution_set_name%type;
5599
5600 BEGIN
5601
5602 SELECT distribution_set_name
5603 INTO l_dist_set_name
5604 FROM ap_distribution_sets_all
5605 WHERE distribution_set_id = p_dist_set_id;
5606
5607 RETURN(l_dist_set_name);
5608
5609 EXCEPTION
5610
5611 WHEN NO_DATA_FOUND THEN
5612 RETURN NULL;
5613
5614 WHEN OTHERS THEN
5615 RAISE;
5616
5617 END Get_Distribution_Set_Name;
5618
5619 /*===========================================================================+
5620 -- NAME : get_ap_project_name
5621 -- DESCRIPTION : This FUNCTION RETURNsProject Name for a given Project Id
5622 -- FROM Payables.
5623 -- SCOPE : PUBLIC
5624 -- INVOKED FROM :
5625 -- ARGUMENTS : IN : p_project_id
5626 -- RETURNS : Project Name
5627 -- REFERENCE :
5628 -- HISTORY :
5629 -- 23-MAY-01 Mrinal Misra o Created
5630 -- 23-APR-04 ftanudja o Changed pa_projects_expend_v to pa_projects
5631 -- for performance. #3239094.
5632 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pa_projects
5633 -- with _ALL table.
5634 +===========================================================================*/
5635 FUNCTION Get_Ap_Project_Name (p_project_id IN NUMBER) RETURN VARCHAR2 IS
5636
5637 l_project_name pa_projects.name%type;
5638
5639 BEGIN
5640
5641 SELECT name
5642 INTO l_project_name
5643 FROM pa_projects_all
5644 WHERE project_id = p_project_id;
5645
5646 RETURN(l_project_name);
5647
5648 EXCEPTION
5649
5650 WHEN NO_DATA_FOUND THEN
5651 RETURN NULL;
5652
5653 WHEN OTHERS THEN
5654 RAISE;
5655
5656 END Get_Ap_Project_Name;
5657
5658 /*===========================================================================+
5659 | FUNCTION
5660 | get_ap_task_name
5661 |
5662 | DESCRIPTION
5663 | This FUNCTION RETURNs Task Name for a given Task Id FROM Payables.
5664 |
5665 | SCOPE - PUBLIC
5666 |
5667 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5668 |
5669 | ARGUMENTS : IN:
5670 | p_task_id
5671 |
5672 | OUT:
5673 | None
5674 |
5675 | RETURNS : Task Name
5676 |
5677 | NOTES : None
5678 |
5679 | MODIFICATION HISTORY
5680 |
5681 | 23-MAY-2001 Mrinal Misra Created
5682 +===========================================================================*/
5683
5684 FUNCTION Get_Ap_Task_Name (p_task_id IN NUMBER)
5685
5686 RETURN VARCHAR2 IS
5687
5688 l_task_name pa_tasks_expend_v.task_name%type;
5689
5690 BEGIN
5691
5692 SELECT task_name
5693 INTO l_task_name
5694 FROM pa_tasks_expend_v
5695 WHERE task_id = p_task_id;
5696
5697 RETURN(l_task_name);
5698
5699 EXCEPTION
5700
5701 WHEN NO_DATA_FOUND THEN
5702 RETURN NULL;
5703
5704 WHEN OTHERS THEN
5705 RAISE;
5706
5707 END Get_Ap_Task_Name;
5708
5709 /*===========================================================================+
5710 | FUNCTION
5711 | get_ap_organization_name
5712 |
5713 | DESCRIPTION
5714 | This FUNCTION RETURNs organization Name for a given organization Id FROM Payables.
5715 |
5716 | SCOPE - PUBLIC
5717 |
5718 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5719 |
5720 | ARGUMENTS : IN:
5721 | p_org_id
5722 |
5723 | OUT:
5724 | None
5725 |
5726 | RETURNS : organization Name
5727 |
5728 | NOTES : None
5729 |
5730 | MODIFICATION HISTORY
5731 |
5732 | 23-MAY-2001 Mrinal Misra o Created
5733 | 25-MAR-2004 Mrinal Misra o Changed view name in SELECT statement.
5734 +===========================================================================*/
5735
5736 FUNCTION Get_Ap_organization_Name (p_org_id IN NUMBER)
5737
5738 RETURN VARCHAR2 IS
5739
5740 l_org_name pa_organizations_expend_v.name%type;
5741
5742 BEGIN
5743
5744 SELECT name
5745 INTO l_org_name
5746 FROM pa_organizations_expend_v
5747 WHERE organization_id = p_org_id;
5748
5749 RETURN(l_org_name);
5750
5751 EXCEPTION
5752
5753 WHEN NO_DATA_FOUND THEN
5754 RETURN NULL;
5755
5756 WHEN OTHERS THEN
5757 RAISE;
5758
5759 END Get_Ap_organization_Name;
5760
5761 /*============================================================================+
5762 -- NAME : get_ar_trx_type
5763 -- DESCRIPTION : This FUNCTION RETURNs Transaction Type for a given Customer
5764 -- Transaction Type Id FROM Receivables.
5765 -- SCOPE : PUBLIC
5766 -- INVOKED FROM :
5767 -- ARGUMENTS : IN : p_trx_id
5768 -- RETURNS : Transaction Type
5769 -- REFERENCE :
5770 -- HISTORY :
5771 -- 23-MAY-01 Mrinal Misra o Created
5772 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced ra_cust_trx_types
5773 -- with _ALL table.
5774 -- 24-Jun-05 Kiran o reverted the last change
5775 -- IMPORTANT - make not more changes to this function. This will be called
5776 -- pre MOAC / pre R12
5777 +============================================================================*/
5778 FUNCTION Get_Ar_Trx_type (p_trx_id IN NUMBER) RETURN VARCHAR2 IS
5779
5780 l_trx_type ra_cust_trx_types.name%TYPE;
5781
5782
5783 BEGIN
5784
5785 SELECT name
5786 INTO l_trx_type
5787 FROM ra_cust_trx_types
5788 WHERE cust_trx_type_id = p_trx_id;
5789
5790 RETURN(l_trx_type);
5791
5792 EXCEPTION
5793
5794 WHEN NO_DATA_FOUND THEN
5795 RETURN NULL;
5796
5797 WHEN OTHERS THEN
5798 RAISE;
5799
5800 END Get_Ar_Trx_type;
5801
5802 /*===========================================================================+
5803 | FUNCTION
5804 | get_ar_rule_name
5805 |
5806 | DESCRIPTION
5807 | This FUNCTION RETURNs Invoice Rule Name for a given Invoice Rule Id
5808 | FROM Receivables.
5809 |
5810 | SCOPE - PUBLIC
5811 |
5812 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5813 |
5814 | ARGUMENTS : IN:
5815 | p_rule_id
5816 |
5817 | OUT:
5818 | None
5819 |
5820 | RETURNS : Invoice Rule Name
5821 |
5822 | NOTES : None
5823 |
5824 | MODIFICATION HISTORY
5825 |
5826 | 23-MAY-2001 Mrinal Misra Created
5827 +===========================================================================*/
5828
5829 FUNCTION Get_Ar_Rule_Name (p_rule_id IN NUMBER)
5830
5831 RETURN VARCHAR2 IS
5832
5833 l_rule_name ra_rules.name%type;
5834
5835 BEGIN
5836
5837 SELECT name
5838 INTO l_rule_name
5839 FROM ra_rules
5840 WHERE rule_id = p_rule_id;
5841
5842 RETURN(l_rule_name);
5843
5844 EXCEPTION
5845
5846 WHEN NO_DATA_FOUND THEN
5847 RETURN NULL;
5848
5849 WHEN OTHERS THEN
5850 RAISE;
5851
5852 END Get_Ar_Rule_Name;
5853
5854 /*===========================================================================+
5855 | FUNCTION
5856 | get_salesrep_name
5857 |
5858 | DESCRIPTION
5859 | This FUNCTION RETURNs Sales Person Name for a given Sales Person Id
5860 | FROM Receivables.
5861 |
5862 | SCOPE - PUBLIC
5863 |
5864 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
5865 |
5866 | ARGUMENTS : IN:
5867 | p_salesrep_id
5868 |
5869 | OUT:
5870 | None
5871 |
5872 | RETURNS : Sales Person Name
5873 |
5874 | NOTES : None
5875 |
5876 | MODIFICATION HISTORY
5877 |
5878 | 23-MAY-2001 Mrinal Misra Created
5879 | 24-MAR-2006 Hareesha o Bug 5116270 Added org_id parameter to
5880 | get_salesrep_name
5881 +===========================================================================*/
5882
5883 FUNCTION Get_Salesrep_Name (p_salesrep_id IN NUMBER,
5884 p_org_id IN NUMBER)
5885
5886 RETURN VARCHAR2 IS
5887
5888 l_salesrep_name ra_salesreps.name%type;
5889
5890 CURSOR get_salesrep_cur IS
5891 SELECT name
5892 FROM ra_salesreps
5893 WHERE salesrep_id = p_salesrep_id
5894 AND org_id = p_org_id;
5895
5896 BEGIN
5897
5898 FOR rec IN get_salesrep_cur LOOP
5899 l_salesrep_name := rec.name;
5900 END LOOP;
5901
5902 RETURN(l_salesrep_name);
5903
5904 EXCEPTION
5905 WHEN OTHERS THEN
5906 RAISE;
5907
5908 END Get_Salesrep_Name;
5909
5910 /*===========================================================================+
5911 -- NAME : get_min_futr_str_dt
5912 -- DESCRIPTION : RETURNs minimum future assignment start date for a location.
5913 -- SCOPE : PUBLIC
5914 -- INVOKED FROM :
5915 -- ARGUMENTS : IN : p_loc_id,p_str_dt.
5916 -- OUT : l_emp_min_str_dt,l_cust_min_str_dt.
5917 -- RETURNS : Allocated Area
5918 -- REFERENCE :
5919 -- HISTORY :
5920 -- 01-APR-02 Mrinal Misra o Created
5921 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
5922 -- PN_SPACE_ASSIGN_CUST with _ALL table.
5923 +===========================================================================*/
5924 FUNCTION get_min_futr_str_dt(p_loc_id IN NUMBER,
5925 p_str_dt IN DATE)
5926 RETURN DATE IS
5927
5928 l_emp_min_str_dt DATE;
5929 l_cust_min_str_dt DATE;
5930
5931 BEGIN
5932
5933 SELECT MIN(emp_assign_start_date)
5934 INTO l_emp_min_str_dt
5935 FROM pn_space_assign_emp_all
5936 WHERE location_id = p_loc_id
5937 AND TRUNC(emp_assign_start_date) > TRUNC(p_str_dt);
5938
5939 SELECT MIN(cust_assign_start_date)
5940 INTO l_cust_min_str_dt
5941 FROM pn_space_assign_cust_all
5942 WHERE location_id = p_loc_id
5943 AND TRUNC(cust_assign_start_date) > TRUNC(p_str_dt);
5944
5945 IF NVL(TRUNC(l_emp_min_str_dt),TO_DATE('12/31/4712','mm/dd/yyyy')) <
5946 NVL(TRUNC(l_cust_min_str_dt),TO_DATE('12/31/4712','mm/dd/yyyy')) THEN
5947 RETURN l_emp_min_str_dt;
5948 ELSE
5949 RETURN l_cust_min_str_dt;
5950 END IF;
5951
5952 END get_min_futr_str_dt;
5953
5954 /*=============================================================================+
5955 -- NAME : get_allocated_area
5956 -- DESCRIPTION : RETURNs:
5957 -- o allocated area
5958 -- o new end date ( IF future assignment exists )
5959 -- o p_future = 'Y' ( IF future assignment exists )
5960 -- for an assigned location between given date range.
5961 -- SCOPE : PUBLIC
5962 -- INVOKED FROM :
5963 -- ARGUMENTS : IN : p_loc_id, p_str_dt, p_new_end_dt, p_allocated_area,
5964 -- p_future.
5965 -- IN OUT : p_new_end_dt
5966 -- OUT : p_allocated_area, p_future
5967 -- RETURNS :
5968 -- REFERENCE :
5969 -- HISTORY :
5970 -- 01-MAY-02 Mrinal Misra o Created
5971 -- 14-MAY-02 Kiran Hegde o Changed FROM FUNCTION to procedure
5972 -- Added parameters p_new_allocated_area,
5973 -- p_allocated_area, p_future
5974 -- o Changed SELECT for getting allocated_area
5975 -- 20-MAY-02 Mrinal Misra o Put emp_assign_end_date AND cust_assign_end_date
5976 -- in NVL.
5977 -- 07-JAN-04 Daniel Thota o Added new OUT parameter p_allocated_area_pct
5978 -- Included allocated_area_pct in the SELECT clauses
5979 -- Fix for bug # 3354278
5980 -- 30-DEC-04 Kiran o Bug # 4093603 - Added new param p_called_frm_mode
5981 -- if p_called_frm_mode is PNTSPACE_UPDATE then
5982 -- do not get min future start date.
5983 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
5984 -- PN_SPACE_ASSIGN_CUST with _ALL table.
5985 -- 30-JAN-07 csriperu o Bug 5854636 - Moved the future assignment check to
5986 -- validate_vacant_area
5987 +===========================================================================*/
5988
5989 PROCEDURE get_allocated_area ( p_loc_id IN NUMBER,
5990 p_str_dt IN DATE,
5991 p_new_end_dt IN OUT NOCOPY DATE,
5992 p_allocated_area OUT NOCOPY NUMBER,
5993 p_allocated_area_pct OUT NOCOPY NUMBER,
5994 p_future OUT NOCOPY VARCHAR2,
5995 p_called_frm_mode IN VARCHAR2) IS
5996
5997 l_allocated_area_emp NUMBER;
5998 l_allocated_area_cust NUMBER;
5999 l_allocated_area_pct_emp NUMBER;
6000 l_allocated_area_pct_cust NUMBER;
6001 l_fut_str_dt DATE;
6002
6003 BEGIN
6004 /* Commented and moved to validate_vacant_area Bug 5854636
6005 IF p_called_frm_mode IS NULL THEN
6006 l_fut_str_dt := pnp_util_func.get_min_futr_str_dt(p_loc_id,p_str_dt);
6007 ELSIF p_called_frm_mode = 'PNTSPACE_UPDATE' THEN
6008 l_fut_str_dt := g_end_of_time;
6009 END IF;
6010
6011 IF NVL( p_new_end_dt, g_end_of_time )
6012 > NVL( l_fut_str_dt, g_end_of_time )
6013 THEN
6014 p_new_end_dt := l_fut_str_dt - 1;
6015 p_future := 'Y';
6016 END IF;
6017 End Comments for Bug 5854636 */
6018
6019 SELECT NVL(SUM(allocated_area), 0)
6020 ,NVL(SUM(allocated_area_pct), 0)
6021 INTO l_allocated_area_emp
6022 ,l_allocated_area_pct_emp
6023 FROM pn_space_assign_emp_all
6024 WHERE location_id = p_loc_id
6025 AND emp_assign_start_date <= NVL(p_new_end_dt,TO_DATE('12/31/4712','mm/dd/yyyy'))
6026 AND NVL(emp_assign_end_date,TO_DATE('12/31/4712','mm/dd/yyyy')) >= p_str_dt;
6027
6028 SELECT NVL(SUM(allocated_area), 0)
6029 ,NVL(SUM(allocated_area_pct), 0)
6030 INTO l_allocated_area_cust
6031 ,l_allocated_area_pct_cust
6032 FROM pn_space_assign_cust_all
6033 WHERE location_id = p_loc_id
6034 AND cust_assign_start_date <= NVL(p_new_end_dt,TO_DATE('12/31/4712','mm/dd/yyyy'))
6035 AND NVL(cust_assign_end_date,TO_DATE('12/31/4712','mm/dd/yyyy')) >= p_str_dt;
6036
6037 p_allocated_area := l_allocated_area_emp + l_allocated_area_cust;
6038 p_allocated_area_pct := l_allocated_area_pct_emp + l_allocated_area_pct_cust;
6039
6040 END GET_ALLOCATED_AREA;
6041
6042 /*=============================================================================+
6043 | PROCEDURE
6044 | validate_vacant_area
6045 |
6046 | DESCRIPTION
6047 | RETURNs:
6048 | o assignable area
6049 | o new end date ( IF future assignment exists )
6050 | o p_future = 'Y' ( IF future assignment exists )
6051 | o p_available_vacant_area IF vacant area is available.
6052 | for an assigned location between given date range.
6053 |
6054 |
6055 | SCOPE - PUBLIC
6056 |
6057 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6058 |
6059 | ARGUMENTS:
6060 | IN : p_loc_id, p_str_dt, p_new_end_dt, p_allocated_area
6061 | IN OUT : p_new_end_dt
6062 | OUT NOCOPY : p_allocated_area, p_future
6063 |
6064 | MODIFICATION HISTORY
6065 | 14-MAY-02 Kiran o Created
6066 | 20-MAY-02 Mrinal o Put variables in NVL in the IF condition.
6067 | 30-OCT-02 Satish o Access _all table for performance issues.
6068 | 31-DEC-02 Mrinal o Added NO_DATA_FOUND exception.
6069 | 20-OCT-03 ftanudja o removed nvl from locn tbl filter. 3197410.
6070 | 07-JAN-04 Daniel o Added new OUT parameter l_total_allocated_area_pct in
6071 | call to pnp_util_func.get_allocated_area. bug # 3354278
6072 | 26-MAY-04 abanerje o Added NVL to the select statement so that the
6073 | p_assignable_area is set to -99 when the area is common
6074 | Using this method we are able to distinguish the
6075 | condition when
6076 | a) Location exists for the given date ranges but its a
6077 | common area then set p_assignable_area=-99
6078 | Bug 3598315.
6079 | 30-DEC-04 Kiran o Bug # 4093603 - Added new param p_called_frm_mode
6080 | and passed it to get_allocated_area.
6081 | Corrected the calculation of l_new_allocated_area_pct
6082 | and l_old_allocated_area_pct.
6083 | 16-Jun-06 piagrawa o Bug #4314940 - handle case if p_assignable_area = 0
6084 | 12-Jan-06 hkulkarn o Bug 4740867 - Deriving assignable_area based on underlying
6085 | property/location. This is useful incase of freshly imported
6086 | locations for assignment in Lease.
6087 | 23-FEB-06 Hareesha o Bug # 4926472. Pop-up msg PN_CANNOT_ASSIGN_SPC_COMM
6088 | when common-area-flag is set to Yes.
6089 | 25-JAN-07 csriperu o Bug 5854636 - Moved the future assignment check from
6090 | get_allocated_area
6091 +===========================================================================*/
6092
6093 PROCEDURE validate_vacant_area (p_location_id IN NUMBER,
6094 p_st_date IN DATE,
6095 p_end_dt IN OUT NOCOPY DATE,
6096 p_assignable_area IN OUT NOCOPY NUMBER,
6097 p_old_allocated_area IN NUMBER,
6098 p_new_allocated_area IN NUMBER,
6099 p_old_allocated_area_pct IN NUMBER,
6100 p_new_allocated_area_pct IN NUMBER,
6101 p_display_message IN VARCHAR2,
6102 p_future OUT NOCOPY VARCHAR2,
6103 p_available_vacant_area OUT NOCOPY BOOLEAN,
6104 p_called_frm_mode IN VARCHAR2) IS
6105
6106 l_new_allocated_area NUMBER;
6107 l_old_allocated_area NUMBER;
6108 l_new_allocated_area_pct NUMBER;
6109 l_old_allocated_area_pct NUMBER;
6110 l_total_allocated_area NUMBER;
6111 l_total_allocated_area_pct NUMBER;
6112 l_future VARCHAR2(1) := NULL;
6113 l_end_dt DATE := nvl(p_end_dt, g_end_of_time);
6114 l_area_rec pnp_util_func.pn_location_area_rec;
6115 l_fut_str_dt DATE; -- Added for bug#5854636
6116 l_common_flag VARCHAR2(1);
6117 CURSOR get_common_flag IS
6118 SELECT common_area_flag
6119 FROM pn_locations_all
6120 WHERE location_id = p_location_id
6121 AND active_start_date <= l_end_dt
6122 AND active_end_date >= p_st_date;
6123
6124 BEGIN
6125 PNP_DEBUG_PKG.debug ('validate_vacant_area(+)');
6126
6127 pnp_util_func.fetch_loctn_area(
6128 p_type => pnp_util_func.get_location_type_lookup_code
6129 (
6130 p_location_id => p_location_id,
6131 p_as_of_date => p_st_date
6132 ),
6133 p_location_id => p_location_id,
6134 p_as_of_date => p_st_date,
6135 x_area => l_area_rec);
6136
6137 FOR rec IN get_common_flag LOOP
6138 l_common_flag := rec.common_area_flag;
6139 END LOOP;
6140 IF l_common_flag = 'Y' THEN
6141 fnd_message.set_name('PN', 'PN_CANNOT_ASSIGN_SPC_COMM');
6142 fnd_message.set_token('LOCATION_ID', p_location_id);
6143 p_available_vacant_area := FALSE;
6144 p_future := 'N';
6145 RETURN;
6146 END IF;
6147
6148 p_assignable_area:= nvl(l_area_rec.assignable_area,-99); -- Bug 7562922
6149 l_new_allocated_area := NVL( p_new_allocated_area, (p_new_allocated_area_pct/100)*p_assignable_area );
6150 l_old_allocated_area := NVL( p_old_allocated_area, (p_old_allocated_area_pct/100)*p_assignable_area );
6151 IF ( p_assignable_area = 0 ) THEN
6152 l_new_allocated_area_pct := NVL( p_new_allocated_area_pct, 0 );
6153 l_old_allocated_area_pct := NVL( p_old_allocated_area_pct, 0 );
6154 ELSE
6155 l_new_allocated_area_pct := NVL( p_new_allocated_area_pct, (p_new_allocated_area/p_assignable_area)*100 );
6156 l_old_allocated_area_pct := NVL( p_old_allocated_area_pct, (p_old_allocated_area/p_assignable_area)*100 );
6157 END IF;
6158 pnp_util_func.get_allocated_area (p_loc_id => p_location_id,
6159 p_str_dt => p_st_date,
6160 p_new_end_dt => p_end_dt,
6161 p_allocated_area => l_total_allocated_area,
6162 p_allocated_area_pct => l_total_allocated_area_pct,
6163 p_future => l_future,
6164 p_called_frm_mode => p_called_frm_mode);
6165
6166 /* Modified the below code for Bug 5854636*/
6167 IF (NVL(l_new_allocated_area,0) - NVL(l_old_allocated_area,0)
6168 > NVL(p_assignable_area,0) - NVL(l_total_allocated_area,0)) AND
6169 (NVL(l_new_allocated_area_pct,0) - NVL(l_old_allocated_area_pct,0)
6170 > 100 - NVL(l_total_allocated_area_pct,0))
6171 THEN
6172 IF p_called_frm_mode IS NULL THEN
6173 l_fut_str_dt := pnp_util_func.get_min_futr_str_dt(p_location_id,p_st_date);
6174 ELSIF p_called_frm_mode = 'PNTSPACE_UPDATE' THEN
6175 l_fut_str_dt := g_end_of_time;
6176 END IF;
6177
6178 IF NVL( p_end_dt, g_end_of_time )
6179 > NVL( l_fut_str_dt, g_end_of_time )
6180 THEN
6181 p_end_dt := l_fut_str_dt - 1;
6182 pnp_util_func.get_allocated_area (p_loc_id => p_location_id,
6183 p_str_dt => p_st_date,
6184 p_new_end_dt => p_end_dt,
6185 p_allocated_area => l_total_allocated_area,
6186 p_allocated_area_pct => l_total_allocated_area_pct,
6187 p_future => l_future,
6188 p_called_frm_mode => p_called_frm_mode);
6189 l_future := 'Y';
6190 END IF;
6191 IF (NVL(l_new_allocated_area,0) - NVL(l_old_allocated_area,0)
6192 > NVL(p_assignable_area,0) - NVL(l_total_allocated_area,0)) AND
6193 (NVL(l_new_allocated_area_pct,0) - NVL(l_old_allocated_area_pct,0)
6194 > 100 - NVL(l_total_allocated_area_pct,0))
6195 THEN
6196 p_available_vacant_area := FALSE;
6197 fnd_message.set_name ('PN','PN_AREA_UNAVAILABLE');
6198 ELSE
6199 IF ( (NVL(l_future, 'N') = 'Y') AND (p_display_message = 'Y') ) THEN
6200 fnd_message.set_name ('PN','PN_FUTURE_ASGN_DT_MSG');
6201 fnd_message.set_token ('L_FUTURE_ASGN_DT', to_char(p_end_dt));
6202 p_future := l_future;
6203 END IF;
6204 p_available_vacant_area := TRUE;
6205 END IF;
6206 ELSE
6207 p_available_vacant_area := TRUE;
6208 END IF;
6209
6210 EXCEPTION
6211
6212 WHEN OTHERS THEN
6213 RAISE;
6214 PNP_DEBUG_PKG.debug ('validate_vacant_area(+)');
6215 END validate_vacant_area;
6216
6217
6218 /*===========================================================================+
6219 | FUNCTION
6220 | check_conversion_type
6221 |
6222 | DESCRIPTION
6223 | This FUNCTION check for Conversion Rate Type for a given Currency code
6224 | at the profile option level AND RETURNs the same, IF it doesn't find one
6225 | THEN looks at pn_currencies AND RETURNs Conversion Rate Type.
6226 |
6227 | SCOPE - PUBLIC
6228 |
6229 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6230 |
6231 | ARGUMENTS:
6232 | IN: p_curr_code
6233 | OUT: none
6234 |
6235 | RETURNS: Conversion Type
6236 |
6237 | MODIFICATION HISTORY
6238 | 25-MAR-2002 Mrinal Misra o Created
6239 | 28-NOV-2005 sdmahesh o Added parameter P_ORG_ID
6240 | o Passed org_id to get_profile_value
6241 +===========================================================================*/
6242 FUNCTION check_conversion_type(p_curr_code IN VARCHAR2,
6243 p_org_id IN NUMBER)
6244 RETURN VARCHAR2 IS
6245
6246 l_prof_optn_curr_type VARCHAR2(30);
6247 l_pn_curr_type VARCHAR2(30);
6248
6249 CURSOR curr_cursor IS
6250 SELECT conversion_type
6251 FROM pn_currencies
6252 WHERE currency_code = p_curr_code;
6253
6254 BEGIN
6255
6256 l_prof_optn_curr_type := pn_mo_cache_utils.get_profile_value('PN_CURRENCY_CONV_RATE_TYPE',
6257 p_org_id);
6258
6259 IF l_prof_optn_curr_type IS NOT NULL THEN
6260 RETURN l_prof_optn_curr_type;
6261 ELSE
6262 FOR curr_rec IN curr_cursor LOOP
6263 l_pn_curr_type := curr_rec.conversion_type;
6264 END LOOP;
6265 RETURN l_pn_curr_type;
6266 END IF;
6267
6268 END check_conversion_type;
6269
6270 /*=============================================================================+
6271 | PROCEDURE
6272 | loctn_assgn_area_update
6273 |
6274 | DESCRIPTION
6275 | This PROCEDURE creates day tracking for current space assignments IF assignable
6276 | area is changed for an assigned location AND updates percent allocated area.
6277 | FOR future dated assignments it just updates percent allocated area.
6278 |
6279 | SCOPE - PUBLIC
6280 |
6281 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6282 |
6283 | ARGUMENTS:
6284 | IN: p_loc_id,p_assgn_area,p_as_of_dt.
6285 | OUT: none
6286 |
6287 | MODIFICATION HISTORY
6288 | 02-MAY-02 Mrinal o Created
6289 | 13-MAY-02 Mrinal o Populated tlempinfo, tlcustinfo variables
6290 | used in row handlers. Removed record type
6291 | var. FROM input param. of UPDATE_ROW.
6292 | 15-MAY-02 Mrinal o Corrected passed values of assignment str dt
6293 | AND end dt. in update_row calls.
6294 | 10-JAN-03 Mrinal o Removed p_as_of_dt IN param's and added two
6295 | new IN param's p_str_dt,p_end_dt and modified
6296 | procedure to correct/update assignments as per
6297 | Location Day Tracking.
6298 | 27-aug-03 Kiran o Corrected the cursor queries to pick up the
6299 | correct assignment records.
6300 | Replaced p_str_dt with l_assgn_str_dt in calls
6301 | to UPDATE_ROW. Populated l_assgn_str_dt conditionally.
6302 | 10-Oct-03 Daniel o Created new cursors get_emp_assgn1 and get_cust_assgn2
6303 | to date track space assignment when location
6304 | attribute is changed. Fix for bug # 3174320
6305 | 10-Nov-03 Daniel o Removed _all from the declaration for emp_rec
6306 | and cust_rec
6307 | 14-Nov-03 Satish o Fix for BUG# 3260023 (Issue 4). Made emp_rec, cust_rec
6308 | as _ALL%ROWTYPE. Modified all 4 cursors to select from
6309 | _ALL tables.
6310 | 28-Apr-04 vmmehta o Fix for BUG# 3197182. Changed call to
6311 | pn_space_assign_cust_pkg.update_row
6312 | Added parameter x_return_status
6313 | 18-JUN-04 Mrinal o Fixed for BUG# 3297892, calculate allocated_area
6314 | based on alloc_area_pct.
6315 | 13-AUG-04 Anand o Added NVL for emp/cust_end_date attributes.
6316 | Also replaced all End Of Time occurances with
6317 | g_end_of_time. Bug # 3821420.
6318 +=============================================================================*/
6319 PROCEDURE loctn_assgn_area_update(p_loc_id IN NUMBER,
6320 p_assgn_area IN NUMBER,
6321 p_str_dt IN DATE,
6322 p_end_dt IN DATE) IS
6323
6324 l_new_emp_alloc_pct PN_SPACE_ASSIGN_EMP.allocated_area_pct%TYPE;
6325 l_new_cust_alloc_pct PN_SPACE_ASSIGN_CUST.allocated_area_pct%TYPE;
6326 l_new_emp_alloc_area PN_SPACE_ASSIGN_EMP.allocated_area%TYPE;
6327 l_new_cust_alloc_area PN_SPACE_ASSIGN_CUST.allocated_area%TYPE;
6328 l_assgn_str_dt DATE;
6329 l_assgn_end_dt DATE;
6330 l_date DATE;
6331 l_mode VARCHAR2(15);
6332 emp_rec pn_space_assign_emp_all%ROWTYPE;
6333 cust_rec pn_space_assign_cust_all%ROWTYPE;
6334 l_return_status VARCHAR2(30);
6335
6336 CURSOR get_emp_assgn(p_loc_id IN NUMBER,
6337 p_str_dt IN DATE,
6338 p_end_dt IN DATE) IS
6339 SELECT *
6340 FROM pn_space_assign_emp_all
6341 WHERE location_id = p_loc_id
6342 AND emp_assign_start_date <= p_end_dt
6343 AND NVL(emp_assign_end_date, g_end_of_time) >= p_str_dt;
6344
6345 CURSOR get_cust_assgn(p_loc_id IN NUMBER,
6346 p_str_dt IN DATE,
6347 p_end_dt IN DATE) IS
6348 SELECT *
6349 FROM pn_space_assign_cust_all
6350 WHERE location_id = p_loc_id
6351 AND cust_assign_start_date <= p_end_dt
6352 AND NVL(cust_assign_end_date, g_end_of_time) >= p_str_dt;
6353
6354 -- 102403 -- date track space assignment
6355
6356 CURSOR get_emp_assgn1(p_loc_id IN NUMBER,
6357 p_str_dt IN DATE,
6358 p_end_dt IN DATE) IS
6359 SELECT *
6360 FROM pn_space_assign_emp_all
6361 WHERE location_id = p_loc_id
6362 AND NVL(emp_assign_end_date, g_end_of_time) >= p_str_dt;
6363
6364 CURSOR get_cust_assgn1(p_loc_id IN NUMBER,
6365 p_str_dt IN DATE,
6366 p_end_dt IN DATE) IS
6367 SELECT *
6368 FROM pn_space_assign_cust_all
6369 WHERE location_id = p_loc_id
6370 AND NVL(cust_assign_end_date, g_end_of_time) >= p_str_dt;
6371
6372 -- 102403 -- date track space assignment
6373
6374 BEGIN
6375
6376 -- 102403 -- date track space assignment
6377 IF nvl(p_end_dt,g_end_of_time) >= g_end_of_time THEN
6378 OPEN get_emp_assgn1(p_loc_id,p_str_dt, p_end_dt);
6379 OPEN get_cust_assgn1(p_loc_id,p_str_dt, p_end_dt);
6380 ELSE
6381 OPEN get_emp_assgn(p_loc_id,p_str_dt, p_end_dt);
6382 OPEN get_cust_assgn(p_loc_id,p_str_dt, p_end_dt);
6383 END IF;
6384
6385 LOOP
6386
6387 IF get_emp_assgn1%ISOPEN THEN
6388 FETCH get_emp_assgn1 INTO emp_rec;
6389 EXIT WHEN get_emp_assgn1%NOTFOUND;
6390 ELSIF get_emp_assgn%ISOPEN THEN
6391 FETCH get_emp_assgn INTO emp_rec;
6392 EXIT WHEN get_emp_assgn%NOTFOUND;
6393 END IF;
6394 -- 102403 -- date track space assignment
6395
6396 PN_SPACE_ASSIGN_EMP_PKG.tlempinfo := emp_rec;
6397 l_new_emp_alloc_area := ROUND(((NVL(emp_rec.allocated_area_pct,0)*p_assgn_area)/100),2);
6398
6399 IF emp_rec.emp_assign_start_date >= p_str_dt AND
6400 NVL(emp_rec.emp_assign_end_date,g_end_of_time) <= p_end_dt THEN
6401 l_mode := 'CORRECT';
6402 l_assgn_str_dt := emp_rec.emp_assign_start_date;
6403 ELSE
6404 l_mode := 'UPDATE';
6405 -- 102403 -- date track space assignment
6406 IF emp_rec.emp_assign_start_date >= p_str_dt AND
6407 NVL(emp_rec.emp_assign_end_date,g_end_of_time) >= p_end_dt THEN
6408 l_assgn_str_dt := p_end_dt;
6409 ELSE
6410 l_assgn_str_dt := p_str_dt;
6411 END IF;
6412 END IF;
6413
6414 PN_SPACE_ASSIGN_EMP_PKG.UPDATE_ROW(
6415 X_EMP_SPACE_ASSIGN_ID => emp_rec.emp_space_assign_id,
6416 X_ATTRIBUTE1 => emp_rec.attribute1,
6417 X_ATTRIBUTE2 => emp_rec.attribute2,
6418 X_ATTRIBUTE3 => emp_rec.attribute3,
6419 X_ATTRIBUTE4 => emp_rec.attribute4,
6420 X_ATTRIBUTE5 => emp_rec.attribute5,
6421 X_ATTRIBUTE6 => emp_rec.attribute6,
6422 X_ATTRIBUTE7 => emp_rec.attribute7,
6423 X_ATTRIBUTE8 => emp_rec.attribute8,
6424 X_ATTRIBUTE9 => emp_rec.attribute9,
6425 X_ATTRIBUTE10 => emp_rec.attribute10,
6426 X_ATTRIBUTE11 => emp_rec.attribute11,
6427 X_ATTRIBUTE12 => emp_rec.attribute12,
6428 X_ATTRIBUTE13 => emp_rec.attribute13,
6429 X_ATTRIBUTE14 => emp_rec.attribute14,
6430 X_ATTRIBUTE15 => emp_rec.attribute15,
6431 X_LOCATION_ID => emp_rec.location_id,
6432 X_PERSON_ID => emp_rec.person_id,
6433 X_PROJECT_ID => emp_rec.project_id,
6434 X_TASK_ID => emp_rec.task_id,
6435 X_EMP_ASSIGN_START_DATE => l_assgn_str_dt,
6436 X_EMP_ASSIGN_END_DATE => emp_rec.emp_assign_end_date,
6437 X_COST_CENTER_CODE => emp_rec.cost_center_code,
6438 X_ALLOCATED_AREA_PCT => emp_rec.allocated_area_pct,
6439 X_ALLOCATED_AREA => l_new_emp_alloc_area,
6440 X_UTILIZED_AREA => emp_rec.utilized_area,
6441 X_EMP_SPACE_COMMENTS => emp_rec.emp_space_comments,
6442 X_ATTRIBUTE_CATEGORY => emp_rec.attribute_category,
6443 X_LAST_UPDATE_DATE => SYSDATE,
6444 X_LAST_UPDATED_BY => fnd_global.user_id,
6445 X_LAST_UPDATE_LOGIN => fnd_global.login_id,
6446 X_UPDATE_CORRECT_OPTION => l_mode,
6447 X_CHANGED_START_DATE => l_date);
6448
6449 END LOOP;
6450
6451 LOOP
6452
6453 IF get_cust_assgn1%ISOPEN THEN
6454 FETCH get_cust_assgn1 INTO cust_rec;
6455 EXIT WHEN get_cust_assgn1%NOTFOUND;
6456 ELSIF get_cust_assgn%ISOPEN THEN
6457 FETCH get_cust_assgn INTO cust_rec;
6458 EXIT WHEN get_cust_assgn%NOTFOUND;
6459 END IF;
6460
6461 PN_SPACE_ASSIGN_CUST_PKG.tlcustinfo := cust_rec;
6462 l_new_cust_alloc_area := ROUND(((NVL(cust_rec.allocated_area_pct,0)*p_assgn_area)/100),2);
6463
6464 IF cust_rec.cust_assign_start_date >= p_str_dt AND
6465 NVL(cust_rec.cust_assign_end_date,g_end_of_time) <= p_end_dt THEN
6466 l_mode := 'CORRECT';
6467 l_assgn_str_dt := cust_rec.cust_assign_start_date;
6468 ELSE
6469 l_mode := 'UPDATE';
6470 IF cust_rec.cust_assign_start_date >= p_str_dt AND
6471 NVL(cust_rec.cust_assign_end_date,g_end_of_time) >= p_end_dt THEN
6472 l_assgn_str_dt := p_end_dt;
6473 ELSE
6474 l_assgn_str_dt := p_str_dt;
6475 END IF;
6476 END IF;
6477
6478 PN_SPACE_ASSIGN_CUST_PKG.UPDATE_ROW(
6479 X_CUST_SPACE_ASSIGN_ID => cust_rec.CUST_SPACE_ASSIGN_ID,
6480 X_LOCATION_ID => cust_rec.LOCATION_ID,
6481 X_CUST_ACCOUNT_ID => cust_rec.CUST_ACCOUNT_ID,
6482 X_SITE_USE_ID => cust_rec.SITE_USE_ID,
6483 X_EXPENSE_ACCOUNT_ID => cust_rec.EXPENSE_ACCOUNT_ID,
6484 X_PROJECT_ID => cust_rec.PROJECT_ID,
6485 X_TASK_ID => cust_rec.TASK_ID,
6486 X_CUST_ASSIGN_START_DATE => l_assgn_str_dt,
6487 X_CUST_ASSIGN_END_DATE => cust_rec.CUST_ASSIGN_END_DATE,
6488 X_ALLOCATED_AREA_PCT => cust_rec.ALLOCATED_AREA_PCT,
6489 X_ALLOCATED_AREA => l_new_cust_alloc_area,
6490 X_UTILIZED_AREA => cust_rec.UTILIZED_AREA,
6491 X_CUST_SPACE_COMMENTS => cust_rec.CUST_SPACE_COMMENTS,
6492 X_ATTRIBUTE_CATEGORY => cust_rec.ATTRIBUTE_CATEGORY,
6493 X_ATTRIBUTE1 => cust_rec.ATTRIBUTE1,
6494 X_ATTRIBUTE2 => cust_rec.ATTRIBUTE2,
6495 X_ATTRIBUTE3 => cust_rec.ATTRIBUTE3,
6496 X_ATTRIBUTE4 => cust_rec.ATTRIBUTE4,
6497 X_ATTRIBUTE5 => cust_rec.ATTRIBUTE5,
6498 X_ATTRIBUTE6 => cust_rec.ATTRIBUTE6,
6499 X_ATTRIBUTE7 => cust_rec.ATTRIBUTE7,
6500 X_ATTRIBUTE8 => cust_rec.ATTRIBUTE8,
6501 X_ATTRIBUTE9 => cust_rec.ATTRIBUTE9,
6502 X_ATTRIBUTE10 => cust_rec.ATTRIBUTE10,
6503 X_ATTRIBUTE11 => cust_rec.ATTRIBUTE11,
6504 X_ATTRIBUTE12 => cust_rec.ATTRIBUTE12,
6505 X_ATTRIBUTE13 => cust_rec.ATTRIBUTE13,
6506 X_ATTRIBUTE14 => cust_rec.ATTRIBUTE14,
6507 X_ATTRIBUTE15 => cust_rec.ATTRIBUTE15,
6508 X_LAST_UPDATE_DATE => SYSDATE,
6509 X_LAST_UPDATED_BY => fnd_global.user_id,
6510 X_LAST_UPDATE_LOGIN => fnd_global.login_id,
6511 X_UPDATE_CORRECT_OPTION => l_mode,
6512 X_CHANGED_START_DATE => l_date,
6513 X_LEASE_ID => cust_rec.LEASE_ID,
6514 X_RECOVERY_SPACE_STD_CODE => cust_rec.RECOVERY_SPACE_STD_CODE,
6515 X_RECOVERY_TYPE_CODE => cust_rec.RECOVERY_TYPE_CODE,
6516 X_FIN_OBLIG_END_DATE => cust_rec.FIN_OBLIG_END_DATE,
6517 X_TENANCY_ID => cust_rec.TENANCY_ID,
6518 X_RETURN_STATUS => l_return_status);
6519
6520 END LOOP;
6521 END loctn_assgn_area_update;
6522
6523 /*============================================================================+
6524 -- NAME : get_area
6525 -- DESCRIPTION : This PROCEDURE RETURNs the Following for a location
6526 -- Assignable_area,Usable_area,rentable_area,common_area,
6527 -- Allocated_area ,Max_capacity,Optimum_capacity Vacancy,
6528 -- Occupancy_percent etc.
6529 -- SCOPE : PUBLIC
6530 -- INVOKED FROM :
6531 -- ARGUMENTS : IN : p_location_id,p_Location_type,p_area_type,
6532 -- p_as_of_date.
6533 -- OUT : p_loc_area ,p_space_area
6534 -- RETURNS :
6535 -- REFERENCE :
6536 -- HISTORY :
6537 -- 14-MAY-02 Ashish Kumar o Created
6538 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
6539 -- 31-OCT-01 graghuna o added p_as_of_date for Location Date-Effectivity
6540 -- 20-OCT-03 ftanudja o removed nvl from locn tbl filter. 3197410.
6541 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
6542 -- PN_SPACE_ASSIGN_CUST with _ALL table.
6543 +===========================================================================*/
6544 PROCEDURE get_area ( p_Location_Id IN NUMBER,
6545 p_location_type IN VARCHAR2,
6546 p_area_type IN VARCHAR2 ,
6547 p_as_of_date IN DATE ,
6548 p_loc_area OUT NOCOPY PN_LOCATION_AREA_REC,
6549 p_space_area OUT NOCOPY PN_SPACE_AREA_REC
6550 )
6551 IS
6552 l_location_type_lookup_code pn_locations.location_type_lookup_code%type;
6553 l_assignable_area NUMBER := 0;
6554 l_rentable_area NUMBER := 0;
6555 l_usable_area NUMBER := 0;
6556 l_common_area NUMBER := 0;
6557 l_secondary_area NUMBER := 0;
6558 l_max_capacity NUMBER := 0;
6559 l_optimum_capacity NUMBER := 0;
6560 l_Allocated_Area NUMBER := 0;
6561 l_Allocated_Area_emp NUMBER := 0;
6562 l_Allocated_Area_cust NUMBER := 0;
6563 l_UtilizedCapacityCust NUMBER := 0;
6564 l_UtilizedCapacityEmp NUMBER := 0;
6565 l_UtilizedCapacity NUMBER := 0;
6566 l_occupancy_percent NUMBER := 0;
6567 l_vacant_area NUMBER := 0;
6568 l_vacant_area_percent NUMBER := 0;
6569 l_vacancy NUMBER := 0;
6570 l_area_utilized NUMBER := 0;
6571 l_date DATE := TO_DATE('31/12/4712' , 'DD/MM/YYYY');
6572 l_as_of_date DATE := pnp_util_func.get_as_of_date(p_as_of_date);
6573
6574 CURSOR c_loc is
6575 SELECT NVL(SUM(ASSIGNABLE_AREA),0) , NVL(SUM(RENTABLE_AREA),0) , NVL(SUM(USABLE_AREA),0)
6576 , NVL(SUM(COMMON_AREA),0),NVL(SUM(MAX_CAPACITY),0), NVL(SUM(OPTIMUM_CAPACITY),0)
6577 FROM pn_locations_all
6578 WHERE Location_Type_Lookup_Code = l_location_type_lookup_code
6579 AND Status = 'A'
6580 AND l_as_of_date BETWEEN active_start_date AND active_end_date
6581 START WITH Location_Id = p_Location_Id
6582 CONNECT BY PRIOR Location_Id = Parent_Location_Id
6583 AND l_as_of_date between prior active_start_date and --ASHISH
6584 PRIOR active_end_date;
6585
6586 CURSOR c_space_emp is
6587 SELECT NVL(SUM(Allocated_Area), 0),NVL(SUM(UTILIZED_AREA),0)
6588 FROM PN_SPACE_ASSIGN_EMP_ALL
6589 WHERE emp_assign_start_date <= l_as_of_date
6590 AND NVL(emp_assign_end_date, l_date) >= l_as_of_date
6591 AND Location_Id IN (SELECT Location_Id
6592 FROM pn_locations_all
6593 WHERE Location_Type_Lookup_Code = l_location_type_lookup_code
6594 AND Status = 'A'
6595 AND l_as_of_date BETWEEN active_start_date AND active_end_date
6596 START WITH Location_Id = p_Location_Id
6597 CONNECT BY PRIOR Location_Id = Parent_Location_Id
6598 AND l_as_of_date between prior active_start_date and --ASHISH
6599 PRIOR active_end_date
6600 );
6601
6602 CURSOR c_space_cust is
6603 SELECT NVL(SUM(Allocated_Area), 0),NVL(SUM(UTILIZED_AREA),0)
6604 FROM PN_SPACE_ASSIGN_CUST_ALL
6605 WHERE cust_assign_start_date <= l_as_of_date
6606 AND NVL(cust_assign_end_date, l_date) >= l_as_of_date
6607 AND Location_Id IN (SELECT Location_Id
6608 FROM pn_locations_all
6609 WHERE Location_Type_Lookup_Code = l_location_type_lookup_code
6610 AND Status = 'A'
6611 AND l_as_of_date BETWEEN active_start_date AND active_end_date
6612 START WITH Location_Id = p_Location_Id
6613 CONNECT BY PRIOR Location_Id = Parent_Location_Id
6614 AND l_as_of_date between prior active_start_date and --ASHISH
6615 PRIOR active_end_date
6616 );
6617
6618 BEGIN
6619 IF p_location_type IN('BUILDING', 'FLOOR', 'OFFICE') THEN
6620 l_location_type_lookup_code := 'OFFICE' ;
6621 ElSIF p_location_type IN('LAND', 'PARCEL','SECTION') THEN
6622 l_location_type_lookup_code := 'SECTION' ;
6623 END IF;
6624 open c_loc ;
6625 fetch c_loc INTO l_assignable_area,l_rentable_area ,l_usable_area,
6626 l_common_area,l_max_capacity ,l_optimum_capacity ;
6627 IF c_loc%notfound THEN
6628 NULL;
6629 end IF;
6630 close c_loc;
6631
6632 IF p_area_type in ('VACANT_AREA','VACANT_AREA_PERCENT','UTILIZED_CAPACITY','VACANCY','OCCUPANCY_PERCENT',
6633 'AREA_UTILIZED') OR p_area_type is NULL THEN
6634 Open c_space_emp;
6635 fetch c_space_emp INTO l_Allocated_Area_Emp,l_UtilizedCapacityEmp;
6636 IF c_space_emp%notfound THEN
6637 NULL;
6638 end IF;
6639 close c_space_emp;
6640
6641 Open c_space_cust;
6642 fetch c_space_cust INTO l_Allocated_Area_Cust,l_UtilizedCapacityCust;
6643 IF c_space_cust%notfound THEN
6644 NULL;
6645 end IF;
6646
6647 l_Allocated_Area := l_Allocated_Area_Emp + l_Allocated_Area_Cust;
6648 l_vacant_area := l_assignable_area - l_allocated_area;
6649 l_utilizedCapacity := l_UtilizedCapacityEmp + l_UtilizedCapacityCust;
6650 l_vacancy := round((l_max_capacity - l_utilizedCapacity), 2);
6651 END IF;
6652 l_secondary_area := round((l_rentable_area - l_usable_area), 2);
6653 IF (l_Assignable_Area = 0) THEN
6654 l_vacant_area_percent := 0;
6655 ELSE
6656 l_vacant_area_percent:= (l_Vacant_Area * 100/l_Assignable_Area);
6657 END IF;
6658 IF (l_max_capacity = 0) THEN
6659 l_occupancy_percent:=0;
6660 ELSE
6661 l_occupancy_percent:= (l_utilizedCapacity *100/l_max_capacity);
6662 END IF;
6663 IF ((l_rentable_area = 0) OR (l_utilizedCapacity = 0)) THEN
6664 l_area_utilized:= 0;
6665 ELSE
6666 l_area_utilized:= (l_rentable_area/l_utilizedCapacity);
6667 END IF;
6668
6669 p_loc_area.secondary_area := l_secondary_area;
6670 p_loc_area.assignable_area := l_assignable_area;
6671 p_loc_area.rentable_area := l_rentable_area ;
6672 p_loc_area.usable_area := l_usable_area;
6673 p_loc_area.common_area := l_common_area ;
6674 p_loc_area.max_capacity := l_max_capacity;
6675 p_loc_area.optimum_capacity := l_optimum_capacity;
6676 p_space_area.allocated_area := l_allocated_area ;
6677 p_space_area.allocated_area_emp := l_allocated_area_emp;
6678 p_space_area.allocated_area_cust := l_allocated_area_cust;
6679 p_space_area.vacant_area_percent := l_vacant_area_percent;
6680 p_space_area.utilizedCapacityEmp := l_utilizedCapacityEmp;
6681 p_space_area.utilizedCapacityCust := l_utilizedCapacityCust;
6682 p_space_area.utilizedCapacity := l_utilizedCapacity;
6683 p_space_area.occupancy_percent := l_occupancy_percent;
6684 p_space_area.vacant_area := l_vacant_area;
6685 p_space_area.vacancy := l_vacancy;
6686 p_space_area.area_utilized := l_area_utilized;
6687
6688 END get_area;
6689
6690 /*============================================================================+
6691 -- NAME : validate_asignable_area
6692 -- DESCRIPTION : This FUNCTION checks IF Assignable_Area is greater than the
6693 -- Allocated_Area irrespective of the date.
6694 -- SCOPE : PUBLIC
6695 -- INVOKED FROM :
6696 -- ARGUMENTS : IN : Location_Id, Location_Type, Assignable_Area
6697 -- RETURNS : BOOLEAN
6698 -- REFERENCE :
6699 -- HISTORY :
6700 -- 29-MAY-02 Kiran Hegde o Created - Fix for Bug#2384573
6701 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
6702 -- PN_SPACE_ASSIGN_CUST with _ALL table.
6703 +===========================================================================*/
6704
6705 FUNCTION validate_assignable_area ( p_Location_Id IN NUMBER,
6706 p_Location_Type IN VARCHAR2,
6707 p_Assignable_Area IN NUMBER )
6708 RETURN BOOLEAN IS
6709
6710 v_location_rec pnp_util_func.PN_LOCATION_AREA_REC;
6711 v_space_allocation_rec pnp_util_func.PN_SPACE_AREA_REC;
6712 INVALID_ASSIGNABLE_AREA EXCEPTION;
6713
6714 CURSOR start_date_cur IS
6715 SELECT emp_assign_start_date
6716 FROM pn_space_assign_emp_all
6717 WHERE location_id = p_Location_Id
6718 UNION
6719 SELECT cust_assign_start_date
6720 FROM pn_space_assign_cust_all
6721 WHERE location_id = p_Location_Id
6722 ORDER BY 1;
6723
6724 BEGIN
6725
6726 for emp_cust_date in start_date_cur LOOP
6727
6728 get_area ( p_Location_Id => p_Location_Id,
6729 p_location_type => p_Location_Type,
6730 p_area_type => NULL,
6731 p_as_of_date => emp_cust_date.emp_assign_start_date,
6732 p_loc_area => v_location_rec,
6733 p_space_area => v_space_allocation_rec );
6734 End Loop;
6735
6736 RETURN TRUE;
6737
6738 EXCEPTION
6739
6740 WHEN INVALID_ASSIGNABLE_AREA THEN
6741 RETURN FALSE;
6742
6743 END validate_assignable_area;
6744
6745 /*===========================================================================+
6746 | FUNCTION
6747 | validate_term_template
6748 |
6749 | DESCRIPTION
6750 | This FUNCTION validates term template for all the reqiured data to create
6751 | payment term, in Index Rent AND Variable Rent modules.
6752 |
6753 | SCOPE - PUBLIC
6754 |
6755 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6756 | None.
6757 |
6758 | ARGUMENTS:
6759 | IN: p_term_temp_id, p_lease_cls_code
6760 | OUT: none
6761 |
6762 | RETURNS: BOOLEAN
6763 |
6764 | MODIFICATION HISTORY
6765 | 15-JUL-2002 Mrinal Misra o Created.
6766 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
6767 | 27-JAN-2003 Pooja Sidhu o Added check for distribution accounts.
6768 | 22-AUG-2003 Anand Tuppad o Changed the procedure to validate against
6769 | just 3 fields and rest validation will be
6770 | done against term at the time of Approve.
6771 | 13-APR-2004 Anand Tuppad o Changed the cursor to select only required
6772 | cols and not all cols(ie removed *)
6773 | 22-SEP-2008 kkorada o Modified the function to exclude customer information
6774 | while validating the term template. bug#6660956
6775
6776 +===========================================================================*/
6777
6778 FUNCTION validate_term_template(p_term_temp_id IN NUMBER,
6779 p_lease_cls_code IN VARCHAR2)
6780 RETURN BOOLEAN IS
6781
6782 CURSOR term_temp_type_cur(p_term_temp_id IN NUMBER) IS
6783 SELECT term_template_type
6784 FROM pn_term_templates_all
6785 WHERE term_template_id = p_term_temp_id;
6786
6787 CURSOR term_temp_bill_cur(p_term_temp_id IN NUMBER) IS
6788 SELECT payment_purpose_code,
6789 payment_term_type_code,
6790 currency_code,
6791 customer_id,
6792 customer_site_use_id,
6793 ap_ar_term_id,
6794 cust_trx_type_id
6795 FROM pn_term_templates_all
6796 WHERE term_template_id = p_term_temp_id;
6797
6798 CURSOR term_temp_pay_cur(p_term_temp_id IN NUMBER) IS
6799 SELECT payment_purpose_code,
6800 payment_term_type_code,
6801 currency_code,
6802 ap_ar_term_id,
6803 vendor_id,
6804 vendor_site_id
6805 FROM pn_term_templates_all
6806 WHERE term_template_id = p_term_temp_id;
6807
6808 BEGIN
6809
6810 FOR term_temp_type_rec IN term_temp_type_cur(p_term_temp_id) LOOP
6811 IF term_temp_type_rec.term_template_type = 'BILLING'
6812 THEN
6813 FOR template IN term_temp_bill_cur(p_term_temp_id)
6814 LOOP
6815 IF (template.payment_purpose_code IS NULL OR
6816 template.payment_term_type_code IS NULL OR
6817 template.currency_code IS NULL OR
6818 --template.customer_id IS NULL OR commented for bug 6660956
6819 --template.customer_site_use_id IS NULL OR commented for bug 6660956
6820 template.ap_ar_term_id IS NULL OR
6821 template.cust_trx_type_id IS NULL) THEN
6822 RETURN FALSE;
6823 END IF;
6824 END LOOP;
6825 ELSIF term_temp_type_rec.term_template_type = 'PAYMENT'
6826 THEN
6827 FOR template IN term_temp_pay_cur(p_term_temp_id)
6828 LOOP
6829 IF (template.payment_purpose_code IS NULL OR
6830 template.payment_term_type_code IS NULL OR
6831 template.currency_code IS NULL OR
6832 template.ap_ar_term_id IS NULL OR
6833 template.vendor_id IS NULL OR
6834 template.vendor_site_id IS NULL ) THEN
6835 RETURN FALSE;
6836 END IF;
6837 END LOOP;
6838 END IF;
6839
6840 END LOOP;
6841
6842 RETURN TRUE;
6843
6844 END validate_term_template;
6845
6846 /*===========================================================================+
6847 | FUNCTION
6848 | get_term_template_name
6849 |
6850 | DESCRIPTION
6851 | This FUNCTION RETURNs Term Template Name for a given Term Template Id
6852 | FROM pn_term_templates.
6853 |
6854 | SCOPE - PUBLIC
6855 |
6856 | EXETERNAL PROCEDURES/FUNCTIONS ACCESSED
6857 |
6858 | ARGUMENTS : IN:
6859 | p_term_temp_id
6860 |
6861 | OUT:
6862 | None
6863 |
6864 | RETURNS : Term Template Name
6865 |
6866 | NOTES : None
6867 |
6868 | MODIFICATION HISTORY
6869 |
6870 | 17-JUL-2002 Mrinal Misra Created
6871 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
6872 +===========================================================================*/
6873
6874 FUNCTION get_term_template_name (p_term_temp_id IN NUMBER)
6875
6876 RETURN VARCHAR2 IS
6877
6878 l_term_temp_name pn_term_templates.name%type;
6879
6880 BEGIN
6881
6882 SELECT name
6883 INTO l_term_temp_name
6884 FROM pn_term_templates_all
6885 WHERE term_template_id = p_term_temp_id;
6886
6887 RETURN(l_term_temp_name);
6888
6889 EXCEPTION
6890
6891 WHEN NO_DATA_FOUND THEN
6892 RETURN NULL;
6893
6894 WHEN OTHERS THEN
6895 RAISE;
6896
6897 END get_term_template_name;
6898
6899
6900 /*===========================================================================+
6901 | PROCEDURE
6902 | get_space_assignments
6903 |
6904 | DESCRIPTION
6905 | This PROCEDURE will get all the assigments for a location. IF the location is
6906 | a building THEN it will get assignments for all the offices in that building
6907 | for the supplied date range.
6908 |
6909 | | SCOPE - PUBLIC
6910 |
6911 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
6912 |
6913 | ARGUMENTS:
6914 | IN: p_location_id,p_Location_type,p_start_date,p_end_date,
6915 | OUT: x_space_assign_cust_tbl ,x_space_assign_emp_tbl
6916 |
6917 | MODIFICATION HISTORY
6918 | 26-JUL-2002 graghuna o Created
6919 | 27-aug-2003 kkhegde o Changed the cursor queries to pick all the ovelapping
6920 | assignments for given start-end dates.
6921 | 16-MAR-2007 CSRIPERU o Bug#5959164. Modified Cursors pn_space_assign_cust_cursor
6922 | and pn_space_assign_emp_cursor to ignore allocated_area while
6923 | checking for active assignments to a location.
6924 +===========================================================================*/
6925
6926
6927 PROCEDURE Get_space_assignments
6928 ( p_location_id IN NUMBER,
6929 p_location_type IN VARCHAR2 ,
6930 p_start_date IN DATE,
6931 p_end_date IN DATE,
6932 x_space_assign_cust_tbl OUT NOCOPY SPACE_ASSIGNMENT_TBL,
6933 x_space_assign_emp_tbl OUT NOCOPY SPACE_ASSIGNMENT_TBL,
6934 x_return_status OUT NOCOPY VARCHAR2,
6935 x_return_message OUT NOCOPY VARCHAR2
6936 )
6937 IS
6938 CURSOR pn_space_assign_cust_cursor IS
6939 SELECT *
6940 FROM pn_space_assign_cust_all
6941 WHERE location_id IN
6942 ( SELECT location_id
6943 FROM pn_locations_all
6944 START WITH location_id = p_location_id
6945 CONNECT BY PRIOR location_id = parent_location_id )
6946 AND NVL(cust_assign_end_date,g_end_of_time) >= p_start_date
6947 AND cust_assign_start_date <= NVL(p_end_date, g_end_of_time);
6948 --Bug#5959164 AND NVL(allocated_area,0) > 0;
6949
6950 CURSOR pn_space_assign_emp_cursor IS
6951 SELECT *
6952 FROM pn_space_assign_emp_all
6953 WHERE location_id IN
6954 ( SELECT location_id
6955 FROM pn_locations_all
6956 START WITH location_id = p_location_id
6957 CONNECT BY PRIOR location_id = parent_location_id )
6958 AND NVL(emp_assign_end_date,g_end_of_time) >= p_start_date
6959 AND emp_assign_start_date <= NVL(p_end_date, g_end_of_time);
6960 --Bug#5959164 AND NVL(allocated_area,0) > 0;
6961
6962 l_index INTEGER := 0;
6963 l_space_assign_cust_tbl SPACE_ASSIGNMENT_TBL;
6964 l_space_assign_emp_tbl SPACE_ASSIGNMENT_TBL;
6965 l_api_name VARCHAR2(50) := 'pnp_util_func.get_space_assignments';
6966
6967 BEGIN
6968
6969 PNP_DEBUG_PKG.DEBUG('----------------------------------');
6970 PNP_DEBUG_PKG.DEBUG('pnp_util_func.get_space_assignments (+)');
6971 PNP_DEBUG_PKG.DEBUG('Get space assignments:INPUT');
6972 PNP_DEBUG_PKG.DEBUG('----------------------------------');
6973 PNP_DEBUG_PKG.DEBUG('Location id : ' || p_location_id);
6974 PNP_DEBUG_PKG.DEBUG('Start Date : ' || p_start_date);
6975 PNP_DEBUG_PKG.DEBUG('End Date : ' || p_end_date);
6976 PNP_DEBUG_PKG.DEBUG('----------------------------------');
6977
6978
6979
6980 FOR space_assign_cust_rec in pn_space_assign_cust_cursor
6981 LOOP
6982 l_index := l_index + 1;
6983 PNP_DEBUG_PKG.DEBUG('Assigning Cust data index : '|| l_index);
6984 l_space_assign_cust_tbl(l_index).cust_account_id :=
6985 space_assign_cust_rec.cust_account_id ;
6986 l_space_assign_cust_tbl(l_index).location_id :=
6987 space_assign_cust_rec.location_id ;
6988 l_space_assign_cust_tbl(l_index).assignment_id :=
6989 space_assign_cust_rec.cust_space_assign_id;
6990 l_space_assign_cust_tbl(l_index).assign_start_date :=
6991 space_assign_cust_rec.cust_assign_start_date;
6992 l_space_assign_cust_tbl(l_index).assign_end_date :=
6993 NVL(space_assign_cust_rec.cust_assign_end_date,pnp_util_func.g_end_of_time);
6994 l_space_assign_cust_tbl(l_index).allocated_area :=
6995 space_assign_cust_rec.allocated_area;
6996 l_space_assign_cust_tbl(l_index).allocated_area_pct :=
6997 space_assign_cust_rec.allocated_area_pct;
6998 l_space_assign_cust_tbl(l_index).utilized_area :=
6999 space_assign_cust_rec.utilized_area;
7000 l_space_assign_cust_tbl(l_index).project_id :=
7001 space_assign_cust_rec.project_id;
7002 l_space_assign_cust_tbl(l_index).task_id :=
7003 space_assign_cust_rec.task_id;
7004 l_space_assign_cust_tbl(l_index).org_id :=
7005 space_assign_cust_rec.org_id;
7006 l_space_assign_cust_tbl(l_index).lease_id :=
7007 space_assign_cust_rec.lease_id;
7008
7009 END LOOP;
7010
7011 x_space_assign_cust_tbl := l_space_assign_cust_tbl;
7012
7013
7014 FOR space_assign_emp_rec in pn_space_assign_emp_cursor
7015 LOOP
7016 l_index := l_index + 1;
7017 PNP_DEBUG_PKG.DEBUG('Assigning emp data index : '|| l_index);
7018 l_space_assign_emp_tbl(l_index).person_id :=
7019 space_assign_emp_rec.person_id ;
7020 l_space_assign_emp_tbl(l_index).location_id :=
7021 space_assign_emp_rec.location_id ;
7022 l_space_assign_emp_tbl(l_index).assignment_id :=
7023 space_assign_emp_rec.emp_space_assign_id;
7024 l_space_assign_emp_tbl(l_index).assign_start_date :=
7025 space_assign_emp_rec.emp_assign_start_date;
7026 l_space_assign_emp_tbl(l_index).assign_end_date :=
7027 NVL(space_assign_emp_rec.emp_assign_end_date,pnp_util_func.g_end_of_time);
7028 l_space_assign_emp_tbl(l_index).allocated_area :=
7029 space_assign_emp_rec.allocated_area;
7030 l_space_assign_emp_tbl(l_index).allocated_area_pct :=
7031 space_assign_emp_rec.allocated_area_pct;
7032 l_space_assign_emp_tbl(l_index).utilized_area :=
7033 space_assign_emp_rec.utilized_area;
7034 l_space_assign_emp_tbl(l_index).project_id :=
7035 space_assign_emp_rec.project_id;
7036 l_space_assign_emp_tbl(l_index).task_id :=
7037 space_assign_emp_rec.task_id;
7038 l_space_assign_emp_tbl(l_index).org_id :=
7039 space_assign_emp_rec.org_id;
7040
7041 END LOOP;
7042 x_space_assign_emp_tbl := l_space_assign_emp_tbl;
7043
7044 x_return_status := FND_API.G_RET_STS_SUCCESS;
7045 PNP_DEBUG_PKG.DEBUG('pnp_util_func.get_space_assignments (-)');
7046
7047 EXCEPTION
7048 WHEN OTHERS THEN
7049 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
7050 fnd_message.set_token('ERR_MSG',l_api_name||'='|| sqlerrm);
7051 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7052 PNP_DEBUG_PKG.DEBUG('OTHERS EXCEPTION');
7053
7054
7055 END get_space_assignments;
7056
7057
7058 /*===========================================================================+
7059 -- NAME : validate_assignments_for_date
7060 -- DESCRIPTION : This routine will check IF there are any assignments within
7061 -- the specified dates for the locattion id. IF there are any
7062 -- assignments for that locations between the date range
7063 -- specified, the PROCEDURE RETURNs an error.
7064 -- SCOPE : PUBLIC
7065 -- INVOKED FROM :
7066 -- ARGUMENTS : IN : p_location_id,p_start_date,p_end_date,
7067 -- OUT : x_return_status ,x_return_message
7068 -- RETURNS :
7069 -- REFERENCE :
7070 -- HISTORY :
7071 -- 26-JUL-02 graghuna o Created.
7072 -- 30-OCT-02 Satish Tripathi o Access _all table for performance issues.
7073 -- 06-JAN-03 Mrinal Misra o Removed tokens from
7074 -- PN_INVALID_DATE_EFFECTIVITY mesg.
7075 -- 18-FEB-03 Mrinal Misra o Made two cursors to be called in
7076 -- conditionally for change in start date or
7077 -- end date of location.
7078 -- 07-APR-04 abanerje o Added NVL to end dates for cursors
7079 -- validate_start_date_cursor and
7080 -- validate_end_date_cursor. Bug #3486311
7081 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced PN_SPACE_ASSIGN_EMP,
7082 -- PN_SPACE_ASSIGN_CUST with _ALL table.
7083 -- 16-MAR-07 csriperu o Bug#5959164. Modified Cursors validate_start_date_cursor
7084 -- and validate_end_date_cursor to ignore allocated_area and
7085 -- allocated_area_pct while checking for active assignments
7086 -- to a location.
7087 +===========================================================================*/
7088 PROCEDURE Validate_assignment_for_date (
7089 p_location_id IN NUMBER,
7090 p_start_date IN DATE,
7091 p_end_date IN DATE,
7092 p_start_date_old IN DATE,
7093 p_end_date_old IN DATE,
7094 x_return_status OUT NOCOPY VARCHAR2,
7095 x_return_message OUT NOCOPY VARCHAR2
7096 )
7097 IS
7098 l_space_assign_cust_tbl SPACE_ASSIGNMENT_TBL;
7099 l_space_assign_emp_tbl SPACE_ASSIGNMENT_TBL;
7100 l_api_name VARCHAR2(50) := 'pnp_util_func.Validate_assignemnt_for_date ';
7101 USER_DEF_ERROR Exception;
7102
7103 CURSOR validate_start_date_cursor IS
7104 SELECT 'x'
7105 FROM DUAL
7106 WHERE EXISTS (SELECT 'x'
7107 FROM pn_space_assign_emp_all
7108 WHERE location_id IN (SELECT location_id
7109 FROM pn_locations_all
7110 START WITH location_id = p_location_id
7111 CONNECT BY PRIOR location_id = parent_location_id )
7112 --Bug#5959164 AND allocated_area > 0
7113 --Bug#5959164 AND allocated_area_pct > 0
7114 AND emp_assign_start_date < p_start_date
7115 AND NVL(emp_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= p_start_date_old
7116 UNION
7117 SELECT 'x'
7118 FROM pn_space_assign_cust_all
7119 WHERE location_id IN (SELECT location_id
7120 FROM pn_locations_all
7121 START WITH location_id = p_location_id
7122 CONNECT BY PRIOR location_id = parent_location_id )
7123 --Bug#5959164 AND allocated_area > 0
7124 --Bug#5959164 AND allocated_area_pct > 0
7125 AND cust_assign_start_date < p_start_date
7126 AND NVL(cust_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= p_start_date_old);
7127
7128 CURSOR validate_end_date_cursor IS
7129 SELECT 'x'
7130 FROM DUAL
7131 WHERE EXISTS (SELECT 'x'
7132 FROM pn_space_assign_emp_all
7133 WHERE location_id IN (SELECT location_id
7134 FROM pn_locations_all
7135 START WITH location_id = p_location_id
7136 CONNECT BY PRIOR location_id = parent_location_id )
7137 --Bug#5959164 AND allocated_area > 0
7138 --Bug#5959164 AND allocated_area_pct > 0
7139 AND NVL(emp_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) > p_end_date
7140 AND emp_assign_start_date <= p_end_date_old
7141 UNION
7142 SELECT 'x'
7143 FROM pn_space_assign_cust_all
7144 WHERE location_id IN (SELECT location_id
7145 FROM pn_locations_all
7146 START WITH location_id = p_location_id
7147 CONNECT BY PRIOR location_id = parent_location_id )
7148 --Bug#5959164 AND allocated_area > 0
7149 --Bug#5959164 AND allocated_area_pct > 0
7150 AND NVL(cust_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) > p_end_date AND
7151 cust_assign_start_date <= p_end_date_old);
7152
7153 BEGIN
7154 x_return_status := FND_API.G_RET_STS_SUCCESS;
7155
7156 PNP_DEBUG_PKG.log('----------------------------------');
7157 PNP_DEBUG_PKG.log('pnp_util_func.validate_assignment_for_date (+)');
7158 PNP_DEBUG_PKG.log('Validate Assignment for date:INPUT');
7159 PNP_DEBUG_PKG.log('----------------------------------');
7160 PNP_DEBUG_PKG.log('Location id : ' || p_location_id);
7161 PNP_DEBUG_PKG.log('Start Date : ' || p_start_date);
7162 PNP_DEBUG_PKG.log('End Date : ' || p_end_date);
7163 PNP_DEBUG_PKG.log('----------------------------------');
7164
7165 IF p_start_date > p_start_date_old THEN
7166
7167 FOR validate_start_date_rec in validate_start_date_cursor LOOP
7168 x_return_status := FND_API.G_RET_STS_ERROR;
7169 Raise USER_DEF_ERROR;
7170 EXIT;
7171 END LOOP;
7172
7173 END IF;
7174
7175 IF p_end_date < p_end_date_old THEN
7176
7177 FOR validate_end_date_rec in validate_end_date_cursor LOOP
7178 x_return_status := FND_API.G_RET_STS_ERROR;
7179 Raise USER_DEF_ERROR;
7180 EXIT;
7181 END LOOP;
7182
7183 END IF;
7184
7185 PNP_DEBUG_PKG.DEBUG('pnp_util_func.validate_assignment_for_date (-)');
7186
7187 EXCEPTION
7188
7189 WHEN USER_DEF_ERROR THEN
7190 x_return_status := FND_API.G_RET_STS_ERROR;
7191 fnd_message.set_name('PN','PN_INVALID_DATE_EFFECTIVITY');
7192 PNP_DEBUG_PKG.log('Assignment found for dates');
7193
7194 WHEN OTHERS THEN
7195 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
7196 fnd_message.set_token('ERR_MSG',l_api_name||'='|| sqlerrm);
7197 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7198 PNP_DEBUG_PKG.log('OTHERS ERROR');
7199
7200 END validate_assignment_for_date;
7201
7202
7203 /*===========================================================================+
7204 | PROCEDURE
7205 | validate_assignable_area
7206 |
7207 | DESCRIPTION
7208 | This routine validates to make sure that the change in assignable area
7209 | does not change exisiting allocations. IF the new assignable area
7210 | is less than the area that is currently being allocated in the specified
7211 | date range, the PROCEDURE RETURNs an error.
7212 |
7213 | | SCOPE - PUBLIC
7214 |
7215 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7216 |
7217 | Get_space_Assignments
7218 |
7219 | ARGUMENTS:
7220 | IN: p_location_id,,p_start_date,p_end_date,
7221 | OUT: x_return_status ,x_return_message
7222 |
7223 | MODIFICATION HISTORY
7224 | 26-JUL-2002 graghuna o Created
7225 +===========================================================================*/
7226
7227 PROCEDURE Validate_assignable_area (
7228 p_location_id IN NUMBER,
7229 p_assignable_area IN NUMBER,
7230 p_start_date IN DATE,
7231 p_end_date IN DATE,
7232 x_return_status OUT NOCOPY VARCHAR2,
7233 x_return_message OUT NOCOPY VARCHAR2
7234 )
7235 IS
7236 l_space_assign_cust_tbl SPACE_ASSIGNMENT_TBL;
7237 l_space_assign_emp_tbl SPACE_ASSIGNMENT_TBL;
7238 l_space_assign_tbl SPACE_ASSIGNMENT_TBL;
7239 l_total_Area NUMBER := 0;
7240 l_index NUMBER := 0;
7241 l_api_name VARCHAR2(50):= 'pnp_util_func.Validate_assignable_area';
7242
7243 UNEXPECTED_ERROR EXCEPTION;
7244 BEGIN
7245
7246 PNP_DEBUG_PKG.log('----------------------------------');
7247 PNP_DEBUG_PKG.log('pnp_util_func.validate_assignable_area (+)');
7248 PNP_DEBUG_PKG.log('Validate Assignable area: INPUT');
7249 PNP_DEBUG_PKG.log('----------------------------------');
7250 PNP_DEBUG_PKG.log('Location id : ' || p_location_id);
7251 PNP_DEBUG_PKG.log('Start Date : ' || p_start_date);
7252 PNP_DEBUG_PKG.log('End Date : ' || p_end_date);
7253 PNP_DEBUG_PKG.log('Assignable Area : ' || p_assignable_area);
7254 PNP_DEBUG_PKG.log('----------------------------------');
7255 PNP_DEBUG_PKG.log('Calling get space assignments');
7256
7257 x_return_status := FND_API.G_RET_STS_SUCCESS;
7258 Get_space_assignments (
7259 p_location_id => p_location_id,
7260 p_start_date => p_start_date,
7261 p_end_date => p_end_date,
7262 x_space_assign_cust_tbl => l_space_assign_cust_tbl,
7263 x_space_assign_emp_tbl => l_space_assign_emp_tbl,
7264 x_return_status => x_return_status,
7265 x_return_message => x_return_message
7266 );
7267
7268 IF not(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7269 PNP_DEBUG_PKG.log('Error in get space_assignments');
7270 Raise unexpected_error;
7271 END IF;
7272
7273 IF l_space_assign_cust_tbl.count > 0 THEN
7274 FOR I in l_space_assign_cust_tbl.FIRST .. l_space_assign_cust_tbl.LAST LOOP
7275 l_index := NVL(l_index,0) + 1;
7276 PNP_DEBUG_PKG.log('Assigning values to l_space_assign_tbl : '||l_index);
7277 l_space_assign_tbl(l_index).assignment_id :=
7278 l_space_assign_cust_tbl(i).assignment_id;
7279 l_space_assign_tbl(l_index).assign_start_date :=
7280 l_space_assign_cust_tbl(i).assign_start_date;
7281 l_space_assign_tbl(l_index).assign_end_date :=
7282 l_space_assign_cust_tbl(i).assign_end_date;
7283 l_space_assign_tbl(l_index).allocated_area :=
7284 l_space_assign_cust_tbl(i).allocated_area;
7285 l_space_assign_tbl(l_index).allocated_area_pct :=
7286 l_space_assign_cust_tbl(i).allocated_area_pct;
7287 l_space_assign_tbl(l_index).utilized_area :=
7288 l_space_assign_cust_tbl(i).utilized_area;
7289 END LOOP;
7290 END IF;
7291
7292 IF l_space_Assign_emp_tbl.count > 0 THEN
7293 FOR I in l_space_assign_emp_tbl.FIRST .. l_space_assign_emp_tbl.LAST LOOP
7294 PNP_DEBUG_PKG.log('Assigning values to l_space_assign_tbl for emp: '||l_index);
7295 l_index := NVL(l_index,1) + 1;
7296 l_space_assign_tbl(l_index).assignment_id :=
7297 l_space_assign_emp_tbl(i).assignment_id;
7298 l_space_assign_tbl(l_index).assign_start_date :=
7299 l_space_assign_emp_tbl(i).assign_start_date;
7300 l_space_assign_tbl(l_index).assign_end_date :=
7301 l_space_assign_emp_tbl(i).assign_end_date;
7302 l_space_assign_tbl(l_index).allocated_area :=
7303 l_space_assign_emp_tbl(i).allocated_area;
7304 l_space_assign_tbl(l_index).allocated_area_pct :=
7305 l_space_assign_emp_tbl(i).allocated_area_pct;
7306 l_space_assign_tbl(l_index).utilized_area :=
7307 l_space_assign_emp_tbl(i).utilized_area;
7308 END LOOP;
7309 END IF;
7310
7311
7312 IF l_space_assign_tbl.count > 0 THEN
7313 FOR I in l_space_assign_tbl.FIRST .. l_space_assign_tbl.LAST LOOP
7314 L_total_area :=0;
7315 PNP_DEBUG_PKG.log('I := ' ||i|| ' start_date ' || l_space_assign_tbl(i).assign_start_date || ' end date '|| l_space_assign_tbl(i).assign_end_date);
7316
7317 FOR J in l_space_assign_tbl.FIRST .. l_space_assign_tbl.LAST LOOP
7318
7319 PNP_DEBUG_PKG.log('J := ' ||J|| ' start_date ' || l_space_assign_tbl(j).assign_start_date || ' end date '|| l_space_assign_tbl(j).assign_end_date);
7320
7321 IF l_space_assign_Tbl(j).assign_start_date =
7322 l_space_assign_tbl(i).assign_start_date AND
7323 l_space_assign_Tbl(j).assign_end_date =
7324 l_space_assign_tbl(i).assign_end_date
7325 THEN
7326 l_total_area := l_total_area + l_space_assign_tbl(j).allocated_area;
7327 ElSIF l_space_assign_Tbl(j).assign_start_date <=
7328 l_space_assign_tbl(i).assign_start_date AND
7329 l_space_assign_Tbl(j).assign_end_date >
7330 l_space_assign_tbl(i).assign_start_date
7331 THEN
7332
7333 l_total_area := l_total_area + l_space_assign_tbl(j).allocated_area;
7334 PNP_DEBUG_PKG.log('Start date range : total : ' || l_total_area);
7335 ElSIF l_space_assign_Tbl(j).assign_start_date <
7336 l_space_assign_tbl(i).assign_end_date AND
7337 l_space_assign_Tbl(j).assign_end_date >=
7338 l_space_assign_tbl(i).assign_end_date
7339 THEN
7340
7341 PNP_DEBUG_PKG.log('end date range : total : ' || l_total_area);
7342 l_total_area := l_total_area + l_space_assign_tbl(j).allocated_area;
7343 END IF;
7344
7345 END LOOP;
7346
7347 END LOOP;
7348
7349 END IF;
7350
7351 PNP_DEBUG_PKG.log('pnp_util_func.validate_assignable_area (-)');
7352 EXCEPTION
7353
7354
7355 WHEN UNEXPECTED_ERROR THEN
7356 x_return_status := FND_API.G_RET_STS_ERROR;
7357 PNP_DEBUG_PKG.log('UNEXPECTED ERROR');
7358
7359 WHEN OTHERS THEN
7360 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
7361 fnd_message.set_token('ERR_MSG',l_api_name||'='|| sqlerrm);
7362 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7363 PNP_DEBUG_PKG.log('OTHERS ERROR');
7364
7365 END validate_assignable_area;
7366
7367
7368
7369
7370
7371 /*===========================================================================+
7372 | PROCEDURE
7373 | validate_date_assignable_area
7374 |
7375 | DESCRIPTION
7376 | This routine is a validation PROCEDURE that will be executed before the
7377 | Location Date-Effectivity changes AND the assignable area changes are commited.
7378 |
7379 | While changing the active_start_date or the active_end_date of any location
7380 | we need to make sure that space is not already assigned or there is not
7381 | future assigment. In case of change to the assignment area we need to make
7382 | sure that the current AND future assignments are able to handle the change in
7383 | assignable_area of the location
7384 |
7385 | | SCOPE - PUBLIC
7386 |
7387 | EXTERNAL PROCEDURES/FUNCTIONS ACCESSED
7388 |
7389 | ARGUMENTS:
7390 | IN: p_location_id,p_Location_type,p_start_date,p_end_date,
7391 p_assignable_area
7392 | OUT: x_return_status ,x_return_message
7393 |
7394 | MODIFICATION HISTORY
7395 | 26-JUL-2002 graghuna o Created
7396 | 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
7397 | 14-JAN-2003 Mrinal Misra o Assigned dates conditionally to Validate_assignment_for_date
7398 | for UPDATE/CORRECT mode.
7399 +===========================================================================*/
7400
7401
7402 PROCEDURE validate_date_assignable_area
7403 ( p_location_id IN NUMBER,
7404 p_location_type IN VARCHAR2,
7405 p_start_date IN DATE,
7406 p_end_date IN DATE,
7407 p_active_start_date_old IN DATE,
7408 p_active_end_date_old IN DATE,
7409 p_change_mode IN VARCHAR2 ,
7410 p_assignable_area IN NUMBER ,
7411 x_return_status OUT NOCOPY VARCHAR2,
7412 x_return_message OUT NOCOPY VARCHAR2
7413 )
7414 IS
7415
7416
7417 l_space_assign_tbl SPACE_ASSIGNMENT_TBL;
7418 l_api_name VARCHAR2(50) := 'pnp_util_func.validate_date_assignable_area';
7419 l_filename VARCHAR2(40) := 'Date_EFF'||to_char(SYSDATE,'DDMMYYHHMMSS');
7420
7421 UNEXPECTED_ERROR Exception;
7422 l_str_date_old DATE;
7423
7424 CURSOR pn_location_cursor IS
7425 SELECT *
7426 FROM pn_locations_all
7427 WHERE location_id = p_location_id
7428 AND active_start_date = p_Active_start_date_old
7429 AND active_end_date = p_active_end_date_old;
7430
7431 BEGIN
7432 -- Remove after debug
7433 x_return_status := FND_API.G_RET_STS_SUCCESS;
7434
7435 PNP_DEBUG_PKG.log('---------------------------------------');
7436 PNP_DEBUG_PKG.log('pnp_util_func.validate_date_assignable_area (+)');
7437 PNP_DEBUG_PKG.log('Validate date assignable_area : INPUT PARAMS');
7438 PNP_DEBUG_PKG.log('---------------------------------------');
7439 PNP_DEBUG_PKG.log('Location id : ' || p_location_id);
7440 PNP_DEBUG_PKG.log('Location Type : ' || p_location_type);
7441 PNP_DEBUG_PKG.log('Start Date : ' || p_start_date);
7442 PNP_DEBUG_PKG.log('End Date : ' || p_end_date);
7443 PNP_DEBUG_PKG.log('Assignable Area : ' || p_assignable_area);
7444 PNP_DEBUG_PKG.log('Start date old : ' || p_active_start_date_old);
7445 PNP_DEBUG_PKG.log('End date old : ' || p_active_end_date_old);
7446 PNP_DEBUG_PKG.log('---------------------------------------');
7447
7448 FOR p_location_rec in pn_location_cursor LOOP
7449
7450 IF NVL(p_location_rec.active_start_date,g_start_of_time) < p_start_date OR
7451 NVL(p_location_rec.active_end_date,g_end_of_time) > p_end_date
7452 THEN
7453
7454 /*************************
7455 * validate assignemts for that location IF the
7456 * location is an OFFICE or a SECTION. IF the location
7457 * is at any level above the office or a section THEN
7458 * drill down to the bottom most level to see IF there
7459 * are any crrent valid assignments for those locations
7460 * Valid locations are locations WHERE the allocated_area is
7461 * NULL or zero AND allocated percent is NULL or zero
7462 *************************/
7463
7464 IF p_change_mode = 'UPDATE' THEN
7465 l_str_date_old := p_start_date;
7466 ELSE
7467 l_str_date_old := p_active_start_date_old;
7468 END IF;
7469
7470 PNP_DEBUG_PKG.log('Calling PROCEDURE Validate_assignment_for_date');
7471 Validate_assignment_for_date
7472 ( p_location_id => p_location_id,
7473 p_start_date => p_start_date,
7474 p_end_date => p_end_date,
7475 p_start_date_old => l_str_date_old,
7476 p_end_date_old => p_active_end_date_old,
7477 x_return_status => x_return_status,
7478 x_return_message => x_return_message);
7479
7480 IF not(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7481 PNP_DEBUG_PKG.log('Error in validate_assignment_for_date');
7482 Raise unexpected_error;
7483 END IF;
7484 END IF;
7485 EXIT;
7486
7487 END LOOP;
7488
7489 PNP_DEBUG_PKG.log('-----------------------------');
7490 PNP_DEBUG_PKG.log('pnp_util_func.validate_date_assignable_area (-)');
7491 PNP_DEBUG_PKG.log('-----------------------------');
7492
7493 EXCEPTION
7494
7495 WHEN UNEXPECTED_ERROR THEN
7496 x_return_status := FND_API.G_RET_STS_ERROR;
7497 PNP_DEBUG_PKG.disable_file_debug;
7498
7499 WHEN OTHERS THEN
7500 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
7501 fnd_message.set_token('ERR_MSG',l_api_name||'='|| sqlerrm);
7502 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7503 PNP_DEBUG_PKG.disable_file_debug;
7504
7505 END validate_date_assignable_area;
7506
7507 ----------------------------------------------------
7508 -- 31-OCT-2002 graghuna o Created due for forms 6i issue.
7509 -- WHEN pnp_util_func are called from forms
7510 -- and the p_As_of_date is not passed, the
7511 -- form generates error even though
7512 -- p_as_of_date is declared as NULL in the
7513 -- package.
7514 -------------------------------------------------
7515 FUNCTION get_as_of_date ( p_as_of_date IN DATE )
7516 RETURN DATE
7517 IS
7518 BEGIN
7519
7520 IF p_as_of_date is NULL OR
7521 p_as_of_date = FND_API.G_MISS_DATE THEN
7522 RETURN SYSDATE;
7523 ELSE
7524 RETURN p_as_of_date;
7525
7526 END IF;
7527
7528
7529 END;
7530
7531 ----------------------------------------------------
7532 -- This PROCEDURE validates that the dates on space
7533 -- assignments are within the effective dates of
7534 -- the location
7535 -- 26-JUL-2002 graghuna o Created
7536 -- 30-OCT-2002 Satish Tripathi o Access _all table for performance issues.
7537 -- 05-NOV-2002 Satish Tripathi o Fix for BUG# 2657009, Changed < = to <= in
7538 -- the cursor Validate_date_for_assignments.
7539 -- 11-OCT-2006 acprakas o Bug#5587012. Modified query of Cursor locations_cursor
7540 -------------------------------------------------
7541
7542 PROCEDURE Validate_date_for_assignments
7543 ( p_location_id IN NUMBER,
7544 p_start_date IN DATE,
7545 p_end_date IN DATE,
7546 x_return_status OUT NOCOPY VARCHAR2,
7547 x_return_message OUT NOCOPY VARCHAR2
7548 )
7549 IS
7550
7551 CURSOR locations_cursor Is
7552 SELECT *
7553 FROM pn_locations_all
7554 WHERE location_id = p_location_id
7555 AND (active_start_date <= p_start_Date AND active_end_Date >= p_end_date);
7556
7557 BEGIN
7558
7559 x_return_status := FND_API.G_RET_STS_ERROR;
7560
7561 FOR locations_rec in locations_cursor LOOP
7562 x_return_status := FND_API.G_RET_STS_SUCCESS;
7563 EXIT;
7564 END LOOP;
7565
7566 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
7567 fnd_message.set_name('PN','PN_INVALID_SPACE_ASSIGN_DATE');
7568 END IF;
7569 END Validate_date_for_Assignments;
7570
7571 -------------------------------------------------------------------------------
7572 -- NAME : Exist_Tenancy_For_End_Date
7573 -- DESCRIPTION : This Function validates if there exists atleast one primary
7574 -- tenancy with an end date greater than the new end date
7575 -- SCOPE : PUBLIC
7576 -- INVOKED FROM :
7577 -- ARGUMENTS : IN : p_location_id,p_New_End_Date
7578 -- RETURNS : BOOLEAN
7579 -- REFERENCE :
7580 -- HISTORY :
7581 -- 24-jun-03 Kiran o Created. CAM impact on Locations.
7582 -- 20-OCT-03 ftanudja o removed GROUP BY expression. 3197410.
7583 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pn_tenancies and pn_locations
7584 -- with _ALL table.
7585 -------------------------------------------------------------------------------
7586
7587 FUNCTION Exist_Tenancy_For_End_Date
7588 ( p_Location_Id IN NUMBER,
7589 p_New_End_Date IN DATE
7590 )
7591 RETURN BOOLEAN IS
7592
7593 CURSOR tenancy_exists IS
7594 SELECT 'Y'
7595 FROM dual
7596 WHERE exists
7597 (select tenancy_id
7598 from pn_tenancies_all
7599 where location_id in
7600 (select loc.location_id
7601 from pn_locations_all loc
7602 connect by prior loc.location_id = loc.parent_location_id
7603 start with loc.location_id = p_Location_Id)
7604 and primary_flag = 'Y'
7605 and EXPIRATION_DATE > p_New_End_Date
7606 );
7607 BEGIN
7608
7609 FOR ten in tenancy_exists LOOP
7610 RETURN true;
7611 END LOOP;
7612
7613 RETURN false;
7614
7615 END Exist_Tenancy_For_End_Date;
7616
7617 -------------------------------------------------------------------------------
7618 -- NAME : Exist_Tenancy_For_Start_Date
7619 -- DESCRIPTION : This Function validates if there exists atleast one primary
7620 -- tenancy with a start date lesser than the new start date
7621 -- SCOPE : PUBLIC
7622 -- INVOKED FROM :
7623 -- ARGUMENTS : IN : p_location_id,p_New_Start_Date
7624 -- RETURNS : BOOLEAN
7625 -- REFERENCE :
7626 -- HISTORY :
7627 -- 24-jun-03 Kiran o Created. CAM impact on Locations.
7628 -- 20-OCT-03 ftanudja o removed GROUP BY expression. 3197410.
7629 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pn_tenancies and pn_locations
7630 -- with _ALL table.
7631 -------------------------------------------------------------------------------
7632
7633 FUNCTION Exist_Tenancy_For_Start_Date
7634 ( p_Location_Id IN NUMBER,
7635 p_New_Start_Date IN DATE
7636 )
7637 RETURN BOOLEAN IS
7638
7639 CURSOR tenancy_exists IS
7640 SELECT 'Y'
7641 FROM dual
7642 WHERE exists
7643 (select tenancy_id
7644 from pn_tenancies_all
7645 where location_id in
7646 (select loc.location_id
7647 from pn_locations_all loc
7648 connect by prior loc.location_id = loc.parent_location_id
7649 start with loc.location_id = p_Location_Id)
7650 and primary_flag = 'Y'
7651 and nvl(OCCUPANCY_DATE,ESTIMATED_OCCUPANCY_DATE) < p_New_Start_Date
7652 );
7653 BEGIN
7654
7655 FOR ten in tenancy_exists LOOP
7656 RETURN true;
7657 END LOOP;
7658
7659 RETURN false;
7660
7661 END Exist_Tenancy_For_Start_Date;
7662
7663 -------------------------------------------------------------------------------
7664 -- NAME : Exist_Tenancy_For_Start_Date
7665 -- DESCRIPTION : This function returns TRUE if there exists if there is atleast
7666 -- one Area Class Detail for the goven Location or any of its
7667 -- child locations. The check is actually mde against the
7668 -- pn_rec_arcl_dtlln table.
7669 -- SCOPE : PUBLIC
7670 -- INVOKED FROM :
7671 -- ARGUMENTS : IN : p_location_id,p_New_Start_Date
7672 -- RETURNS : BOOLEAN
7673 -- REFERENCE :
7674 -- HISTORY :
7675 -- 24-jun-03 Kiran o Created. CAM impact on Locations.
7676 -- 20-OCT-03 ftanudja o removed GROUP BY expression. 3197410.
7677 -- 15-JUN-05 piagrawa o Bug 4307795 - Replaced pn_rec_arcl_dtlln and
7678 -- pn_locations with _ALL table.
7679 -------------------------------------------------------------------------------
7680 FUNCTION Exist_Area_Class_Dtls_For_Loc
7681 ( p_Location_Id IN NUMBER,
7682 p_active_start_date IN DATE default NULL,
7683 p_active_end_date IN DATE default NULL)
7684 RETURN BOOLEAN IS
7685
7686 CURSOR Area_Class_Dtls_Exist IS
7687 SELECT 'Y'
7688 FROM dual
7689 WHERE exists
7690 (select area_class_dtl_line_id
7691 from pn_rec_arcl_dtlln_all
7692 where location_id in
7693 (select loc.location_id
7694 from pn_locations_all loc
7695 connect by prior loc.location_id = loc.parent_location_id
7696 start with loc.location_id = p_Location_Id)
7697 );
7698
7699 CURSOR Area_CLass_Dtls_Exist_For_Dt IS
7700 select 'Y'
7701 from dual
7702 where exists
7703 (select arclDtl.area_class_dtl_line_id
7704 from pn_rec_arcl_dtlln_all arclDtl
7705 where arclDtl.location_id = p_location_id
7706 and (arclDtl.from_date between p_active_start_date
7707 and p_active_end_date
7708 or
7709 arclDtl.to_date between p_active_start_date
7710 and p_active_end_date)
7711 );
7712
7713 BEGIN
7714
7715 IF (p_active_start_date IS NULL)
7716 AND (p_active_end_date IS NULL) THEN
7717
7718 FOR arcl_dtl in Area_Class_Dtls_Exist LOOP
7719 RETURN true;
7720 END LOOP;
7721
7722 RETURN false;
7723
7724 ELSE
7725
7726 FOR arcl_dlt_for_dt in Area_CLass_Dtls_Exist_For_Dt LOOP
7727 RETURN true;
7728 END LOOP;
7729
7730 RETURN false;
7731
7732 END IF;
7733
7734 END Exist_Area_Class_Dtls_For_Loc;
7735
7736 --------------------------------------------------------------------------
7737 -- PROCEDURE : batch_update_terms_area
7738 -- DESCRIPTION: performs batch updates of area value onto the payment
7739 -- terms table.
7740 -- HISTORY
7741 -- 08-JAN-04 ftanudja o created
7742 -- 24-MAR-04 ftanudja o set l_user to fnd_global.user_id.
7743 --------------------------------------------------------------------------
7744 PROCEDURE batch_update_terms_area(
7745 x_area_tbl num_tbl,
7746 x_term_id_tbl num_tbl)
7747 IS
7748 l_user NUMBER := fnd_global.user_id;
7749 BEGIN
7750
7751 FORALL i IN 0 .. x_term_id_tbl.COUNT - 1
7752 UPDATE pn_payment_terms_all
7753 SET area = x_area_tbl(i),
7754 last_updated_by = l_user,
7755 last_update_date = SYSDATE
7756 WHERE payment_term_id = x_term_id_tbl(i);
7757
7758 END batch_update_terms_area;
7759
7760 --------------------------------------------------------------------------
7761 -- FUNCTION : chk_terms_for_tenancy
7762 -- DESCRIPTION: checks payment terms for ties to tenancy
7763 -- RETURNS : TRUE if any payment term is associated to the tenancy
7764 -- : FALSE otherwise
7765 -- HISTORY
7766 -- 15-JAN-04 ftanudja o created.
7767 --------------------------------------------------------------------------
7768 FUNCTION chk_terms_for_tenancy(
7769 p_tenancy_id NUMBER,
7770 p_type VARCHAR2) RETURN BOOLEAN
7771 IS
7772
7773 -- note that tenancy dates are not used because there is no restriction
7774 -- that payment term dates has to lie between tenancy dates
7775
7776 CURSOR get_assoc_payment_terms_w_type IS
7777 SELECT 'Y' answer
7778 FROM pn_tenancies_all tnc
7779 WHERE tnc.tenancy_id = p_tenancy_id
7780 AND EXISTS (SELECT 'Y' FROM pn_payment_terms_all trm
7781 WHERE trm.lease_id = tnc.lease_id
7782 AND trm.location_id = tnc.location_id
7783 AND trm.area_type_code = p_type);
7784
7785 CURSOR get_assoc_payment_terms IS
7786 SELECT 'Y' answer
7787 FROM pn_tenancies_all tnc
7788 WHERE tnc.tenancy_id = p_tenancy_id
7789 AND EXISTS (SELECT 'Y' FROM pn_payment_terms_all trm
7790 WHERE trm.lease_id = tnc.lease_id
7791 AND trm.location_id = tnc.location_id);
7792
7793 l_answer BOOLEAN := FALSE;
7794
7795 BEGIN
7796
7797 IF p_type IS NOT NULL THEN
7798
7799 FOR chk_cur IN get_assoc_payment_terms_w_type LOOP
7800 IF chk_cur.answer = 'Y' THEN l_answer := TRUE; END IF;
7801 END LOOP;
7802
7803 ELSE
7804
7805 FOR chk_cur IN get_assoc_payment_terms LOOP
7806 IF chk_cur.answer = 'Y' THEN l_answer := TRUE; END IF;
7807 END LOOP;
7808
7809 END IF;
7810
7811 RETURN l_answer;
7812 END;
7813
7814 --------------------------------------------------------------------------
7815 -- PROCEDURE : chk_terms_for_lease_area_chg
7816 -- DESCRIPTION: checks payment terms for possible impacts of changes in
7817 -- lease rentable, usable or assignable area.
7818 -- RETURNS : 1) a table containing list of impacted term ID's.
7819 -- 2) a table containing their new respective areas.
7820 -- HISTORY
7821 -- 08-JAN-04 ftanudja o created
7822 -- 11-FEB-04 ftanudja o added NOCOPY hint for OUT param
7823 -- 20-FEB-04 ftanudja o added param p_share_pct. 3450659
7824 --------------------------------------------------------------------------
7825 PROCEDURE chk_terms_for_lease_area_chg (
7826 p_tenancy_id NUMBER,
7827 p_lease_id NUMBER,
7828 p_rentable NUMBER,
7829 p_usable NUMBER,
7830 p_assignable NUMBER,
7831 p_share_pct NUMBER,
7832 x_term_id_tbl OUT NOCOPY num_tbl,
7833 x_area_tbl OUT NOCOPY num_tbl)
7834 IS
7835 l_rentable_flag BOOLEAN := FALSE;
7836 l_usable_flag BOOLEAN := FALSE;
7837 l_assignable_flag BOOLEAN := FALSE;
7838 l_share_pct_flag BOOLEAN := FALSE;
7839 l_has_items BOOLEAN := FALSE;
7840 l_area_rec pn_location_area_rec;
7841
7842 CURSOR get_lease_area IS
7843 SELECT lease_rentable_area,
7844 lease_usable_area,
7845 lease_assignable_area,
7846 tenants_proportionate_share,
7847 estimated_occupancy_date,
7848 occupancy_date,
7849 expiration_date,
7850 location_id
7851 FROM pn_tenancies_all
7852 WHERE tenancy_id = p_tenancy_id;
7853
7854 CURSOR get_affected_payment_terms (p_loc_id NUMBER, p_occ_date DATE, p_exp_date DATE) IS
7855 SELECT trm.area_type_code,
7856 trm.payment_term_id,
7857 trm.start_date,
7858 loc.location_type_lookup_code,
7859 loc.rentable_area,
7860 loc.usable_area,
7861 loc.assignable_area
7862 FROM pn_payment_terms_all trm,
7863 pn_locations_all loc
7864 WHERE trm.lease_id = p_lease_id
7865 AND loc.location_id = p_loc_id
7866 AND trm.location_id = p_loc_id
7867 AND trm.area_type_code NOT IN ('OTHER')
7868 AND trm.area_type_code IS NOT NULL
7869 AND trm.start_date BETWEEN p_occ_date AND p_exp_date
7870 AND trm.start_date BETWEEN loc.active_start_date AND loc.active_end_date;
7871
7872 CURSOR search_for_items (p_payment_term_id NUMBER) IS
7873 SELECT 'Y' answer
7874 FROM dual
7875 WHERE EXISTS (SELECT 'Y' FROM pn_payment_items_all
7876 WHERE payment_term_id = p_payment_term_id);
7877
7878 BEGIN
7879 FOR chk_area IN get_lease_area LOOP
7880
7881 IF NOT ((chk_area.lease_rentable_area = p_rentable) OR
7882 (chk_area.lease_rentable_area IS NULL AND p_rentable IS NULL)) THEN
7883 l_rentable_flag := TRUE;
7884 END IF;
7885
7886 IF NOT ((chk_area.lease_usable_area = p_usable) OR
7887 (chk_area.lease_usable_area IS NULL AND p_usable IS NULL)) THEN
7888 l_usable_flag := TRUE;
7889 END IF;
7890
7891 IF NOT ((chk_area.lease_assignable_area = p_assignable) OR
7892 (chk_area.lease_assignable_area IS NULL AND p_assignable IS NULL)) THEN
7893 l_assignable_flag := TRUE;
7894 END IF;
7895
7896 IF NOT ((chk_area.tenants_proportionate_share = p_share_pct) OR
7897 (chk_area.tenants_proportionate_share IS NULL AND p_share_pct IS NULL)) THEN
7898 l_share_pct_flag := TRUE;
7899 END IF;
7900
7901 IF l_rentable_flag OR l_usable_flag OR l_assignable_flag OR l_share_pct_flag THEN
7902 FOR find_terms IN get_affected_payment_terms (chk_area.location_id, nvl(chk_area.occupancy_date, chk_area.estimated_occupancy_date), chk_area.expiration_date) LOOP
7903
7904 IF (l_rentable_flag AND find_terms.area_type_code = 'LEASE_RENTABLE') OR
7905 (l_usable_flag AND find_terms.area_type_code = 'LEASE_USABLE') OR
7906 (l_assignable_flag AND find_terms.area_type_code = 'LEASE_ASSIGNABLE') OR
7907 l_share_pct_flag THEN
7908
7909 l_has_items := FALSE;
7910 FOR find_items IN search_for_items(find_terms.payment_term_id) LOOP
7911 IF find_items.answer = 'Y' THEN l_has_items := TRUE; END IF;
7912 END LOOP;
7913
7914 IF NOT l_has_items THEN
7915 x_term_id_tbl(x_term_id_tbl.COUNT) := find_terms.payment_term_id;
7916
7917 IF find_terms.area_type_code = 'LEASE_RENTABLE' AND (l_share_pct_flag OR l_rentable_flag) THEN
7918 x_area_tbl(x_area_tbl.COUNT) := p_rentable * nvl(p_share_pct / 100, 1);
7919 ELSIF find_terms.area_type_code = 'LEASE_USABLE' AND (l_share_pct_flag OR l_usable_flag) THEN
7920 x_area_tbl(x_area_tbl.COUNT) := p_usable * nvl(p_share_pct / 100, 1);
7921 ELSIF find_terms.area_type_code = 'LEASE_ASSIGNABLE' AND (l_share_pct_flag OR l_assignable_flag) THEN
7922 x_area_tbl(x_area_tbl.COUNT) := p_assignable * nvl(p_share_pct / 100, 1);
7923 ELSIF l_share_pct_flag THEN
7924
7925 fetch_loctn_area(
7926 p_type => find_terms.location_type_lookup_code,
7927 p_location_id => chk_area.location_id,
7928 p_as_of_date => find_terms.start_date,
7929 x_area => l_area_rec);
7930
7931 IF find_terms.area_type_code = 'LOCTN_RENTABLE' THEN
7932 x_area_tbl(x_area_tbl.COUNT) := l_area_rec.rentable_area * nvl(p_share_pct / 100, 1);
7933 ELSIF find_terms.area_type_code = 'LOCTN_USABLE' THEN
7934 x_area_tbl(x_area_tbl.COUNT) := l_area_rec.usable_area * nvl(p_share_pct / 100, 1);
7935 ELSIF find_terms.area_type_code = 'LOCTN_ASSIGNABLE' THEN
7936 x_area_tbl(x_area_tbl.COUNT) := l_area_rec.assignable_area * nvl(p_share_pct / 100, 1);
7937 END IF;
7938
7939 END IF;
7940 END IF;
7941 END IF;
7942 END LOOP;
7943 END IF;
7944 END LOOP;
7945
7946 END chk_terms_for_lease_area_chg;
7947
7948 --------------------------------------------------------------------------
7949 -- FUNCTION : get_tenants_share
7950 -- RETURNS : gets share % for a given lease, location, and as_of_date
7951 -- NOTES : private function called by chk_terms_for_locn_area_chg
7952 -- HISTORY
7953 -- 20-FEB-04 ftanudja o created. #3450659
7954 --------------------------------------------------------------------------
7955 FUNCTION get_tenants_share (
7956 p_lease_id NUMBER,
7957 p_location_id NUMBER,
7958 p_as_of_date DATE) RETURN NUMBER
7959 IS
7960 CURSOR get_share IS
7961 SELECT tenants_proportionate_share share_pct
7962 FROM pn_tenancies_all
7963 WHERE location_id = p_location_id
7964 AND lease_id = p_lease_id
7965 AND p_as_of_date BETWEEN nvl(occupancy_date, estimated_occupancy_date)
7966 AND expiration_date;
7967
7968 l_result NUMBER := null;
7969
7970 BEGIN
7971
7972 FOR ans_cur IN get_share LOOP l_result := ans_cur.share_pct; exit; END LOOP;
7973
7974 RETURN l_result;
7975 END get_tenants_share;
7976
7977 -------------------------------------------------------------------------------
7978 -- FUNCTION : fetch_tenancy_area
7979 -- RETURNS : gets area given an area type code, taking into account
7980 -- the tenancy percentage share.
7981 -- NOTES : since overlapping tenancy is now allowed (ref #4150676)
7982 -- make sure the area and share pct is summed.
7983 -- HISTORY
7984 -- 21-APR-05 ftanudja o created. #4324777
7985 -- 01-SEP-05 Kiran o Changed the type of params from
7986 -- pn_payment_terms.%TYPE to pn_payment_terms_all.%TYPE
7987 ------------------------------------------------------------------------------
7988 FUNCTION fetch_tenancy_area (
7989 p_lease_id pn_payment_terms_all.lease_id%TYPE,
7990 p_location_id pn_payment_terms_all.location_id%TYPE,
7991 p_as_of_date pn_payment_terms_all.start_date%TYPE,
7992 p_area_type_code pn_payment_terms_all.area_type_code%TYPE)
7993 RETURN NUMBER
7994 IS
7995
7996 CURSOR get_tenancy_info IS
7997 SELECT sum(tnc.lease_assignable_area) lease_assignable_area,
7998 sum(tnc.lease_rentable_area) lease_rentable_area,
7999 sum(tnc.lease_usable_area) lease_usable_area
8000 FROM pn_tenancies_all tnc
8001 WHERE tnc.lease_id = p_lease_id
8002 AND tnc.location_id = p_location_id
8003 AND p_as_of_date BETWEEN nvl(tnc.occupancy_date, tnc.estimated_occupancy_date) AND tnc.expiration_date;
8004
8005 l_area_rec pnp_util_func.pn_location_area_rec;
8006 l_area NUMBER := null;
8007 l_desc VARCHAR2(100);
8008
8009 BEGIN
8010
8011 l_desc := 'pnp_util_func.fetch_tenancy_area';
8012
8013 pnp_debug_pkg.log(l_desc ||' (+)');
8014
8015 FOR area_cur IN get_tenancy_info LOOP
8016
8017 IF p_area_type_code IN ('LOCTN_RENTABLE','LOCTN_USABLE','LOCTN_ASSIGNABLE') THEN
8018
8019 pnp_util_func.fetch_loctn_area(
8020 p_type => pnp_util_func.get_location_type_lookup_code(
8021 p_location_id, p_as_of_date),
8022 p_location_id => p_location_id,
8023 p_as_of_date => p_as_of_date,
8024 x_area => l_area_rec);
8025
8026 IF p_area_type_code = 'LOCTN_RENTABLE' THEN
8027 l_area := l_area_rec.rentable_area;
8028 ELSIF p_area_type_code = 'LOCTN_USABLE' THEN
8029 l_area := l_area_rec.usable_area;
8030 ELSIF p_area_type_code = 'LOCTN_ASSIGNABLE' THEN
8031 l_area := l_area_rec.assignable_area;
8032 END IF;
8033
8034 ELSIF p_area_type_code IN ('LEASE_RENTABLE','LEASE_USABLE','LEASE_ASSIGNABLE') THEN
8035
8036 IF p_area_type_code = 'LEASE_RENTABLE' THEN
8037 l_area := area_cur.lease_rentable_area;
8038 ELSIF p_area_type_code = 'LEASE_USABLE' THEN
8039 l_area := area_cur.lease_usable_area;
8040 ELSIF p_area_type_code = 'LEASE_ASSIGNABLE' THEN
8041 l_area := area_cur.lease_assignable_area;
8042 END IF;
8043 END IF;
8044 END LOOP;
8045
8046 pnp_debug_pkg.log(l_desc ||' (-)');
8047
8048 RETURN ROUND(l_area, 2);
8049
8050 END fetch_tenancy_area;
8051
8052 --------------------------------------------------------------------------
8053 -- PROCEDURE : chk_terms_for_locn_area_chg
8054 -- DESCRIPTION: checks payment terms for possible impacts of changes in
8055 -- location rentable, usable or assignable area.
8056 -- RETURNS : 1) a table containing list of impacted term ID's.
8057 -- 2) a table containing their new respective areas.
8058 -- HISTORY
8059 -- 08-JAN-04 ftanudja o created
8060 -- 11-FEB-04 ftanudja o added NOCOPY hint for OUT param
8061 -- 20-FEB-04 ftanudja o take into account tenants' share %. #3450659
8062 --------------------------------------------------------------------------
8063 PROCEDURE chk_terms_for_locn_area_chg (
8064 p_bld_loc_id NUMBER,
8065 p_flr_loc_id NUMBER,
8066 p_ofc_loc_id NUMBER,
8067 p_rentable NUMBER,
8068 p_usable NUMBER,
8069 p_assignable NUMBER,
8070 x_term_id_tbl OUT NOCOPY num_tbl,
8071 x_area_tbl OUT NOCOPY num_tbl)
8072 IS
8073 l_bld_rentable NUMBER;
8074 l_bld_usable NUMBER;
8075 l_bld_assignable NUMBER;
8076 l_flr_rentable NUMBER;
8077 l_flr_usable NUMBER;
8078 l_flr_assignable NUMBER;
8079 l_share NUMBER;
8080 l_rentable_flag BOOLEAN := FALSE;
8081 l_usable_flag BOOLEAN := FALSE;
8082 l_assignable_flag BOOLEAN := FALSE;
8083 l_has_items BOOLEAN := FALSE;
8084 l_building_flag BOOLEAN := FALSE;
8085 l_floor_flag BOOLEAN := FALSE;
8086
8087 CURSOR get_locn_area IS
8088 SELECT rentable_area,
8089 usable_area,
8090 assignable_area,
8091 active_start_date,
8092 active_end_date
8093 FROM pn_locations_all
8094 WHERE location_id = p_ofc_loc_id;
8095
8096 CURSOR get_affected_payment_terms (p_ofc_id NUMBER, p_flr_id NUMBER, p_bld_id NUMBER,
8097 p_start_date DATE, p_end_date DATE) IS
8098 SELECT area_type_code,
8099 payment_term_id,
8100 start_date,
8101 location_id,
8102 lease_id,
8103 DECODE(location_id, p_ofc_id, 'OFFICE', p_flr_id, 'FLOOR', p_bld_id, 'BUILDING') type
8104 FROM pn_payment_terms_all
8105 WHERE location_id IN (p_ofc_id, p_flr_id, p_bld_id)
8106 AND area_type_code IN ('LOCTN_RENTABLE','LOCTN_USABLE','LOCTN_ASSIGNABLE')
8107 AND start_date BETWEEN p_start_date AND p_end_date;
8108
8109 CURSOR search_for_items (p_payment_term_id NUMBER) IS
8110 SELECT 'Y' answer
8111 FROM dual
8112 WHERE EXISTS (SELECT 'Y' FROM pn_payment_items_all
8113 WHERE payment_term_id = p_payment_term_id);
8114
8115 -- note that the old office area is excluded
8116 CURSOR get_flr_area (p_as_of_date DATE) IS
8117 SELECT sum(nvl(rentable_area,0)) rentable,
8118 sum(nvl(usable_area,0)) usable,
8119 sum(nvl(assignable_area,0)) assignable
8120 FROM pn_locations_all loc
8121 WHERE loc.parent_location_id = p_flr_loc_id
8122 AND p_as_of_date BETWEEN active_start_date AND active_end_date
8123 AND location_id <> p_ofc_loc_id;
8124
8125 -- note that the old office area is excluded
8126 CURSOR get_bld_area (p_as_of_date DATE) IS
8127 SELECT sum(nvl(o.rentable_area,0)) rentable,
8128 sum(nvl(o.usable_area,0)) usable,
8129 sum(nvl(o.assignable_area,0)) assignable
8130 FROM pn_locations_all f, pn_locations_all o
8131 WHERE p_bld_loc_id = f.parent_location_id
8132 AND f.location_id = o.parent_location_id
8133 AND p_as_of_date BETWEEN f.active_start_date AND f.active_end_date
8134 AND p_as_of_date BETWEEN o.active_start_date AND o.active_end_date
8135 AND o.location_id <> p_ofc_loc_id;
8136
8137 BEGIN
8138
8139 FOR chk_area IN get_locn_area LOOP
8140
8141 IF NOT ((chk_area.rentable_area = p_rentable) OR
8142 (chk_area.rentable_area IS NULL AND p_rentable IS NULL)) THEN
8143 l_rentable_flag := TRUE;
8144 END IF;
8145
8146 IF NOT ((chk_area.usable_area = p_usable) OR
8147 (chk_area.usable_area IS NULL AND p_usable IS NULL)) THEN
8148 l_usable_flag := TRUE;
8149 END IF;
8150
8151 IF NOT ((chk_area.assignable_area = p_assignable) OR
8152 (chk_area.assignable_area IS NULL AND p_assignable IS NULL)) THEN
8153 l_assignable_flag := TRUE;
8154 END IF;
8155
8156 IF l_rentable_flag OR l_usable_flag OR l_assignable_flag THEN
8157
8158 FOR find_terms IN get_affected_payment_terms (p_ofc_loc_id, p_flr_loc_id, p_bld_loc_id, chk_area.active_start_date, chk_area.active_end_date) LOOP
8159
8160 IF (l_rentable_flag AND find_terms.area_type_code = 'LOCTN_RENTABLE') OR
8161 (l_usable_flag AND find_terms.area_type_code = 'LOCTN_USABLE') OR
8162 (l_assignable_flag AND find_terms.area_type_code = 'LOCTN_ASSIGNABLE') THEN
8163
8164 l_has_items := FALSE;
8165 FOR find_items IN search_for_items(find_terms.payment_term_id) LOOP
8166 IF find_items.answer = 'Y' THEN l_has_items := TRUE; END IF;
8167 END LOOP;
8168
8169 IF NOT l_has_items THEN
8170 x_term_id_tbl(x_term_id_tbl.COUNT) := find_terms.payment_term_id;
8171
8172 IF find_terms.type = 'BUILDING' AND NOT l_building_flag THEN
8173
8174 FOR bld_area_cur IN get_bld_area(find_terms.start_date) LOOP
8175 l_bld_rentable := bld_area_cur.rentable;
8176 l_bld_usable := bld_area_cur.usable;
8177 l_bld_assignable := bld_area_cur.assignable;
8178
8179 END LOOP;
8180
8181 IF NOT (l_bld_rentable IS NULL AND p_rentable IS NULL) THEN
8182 l_bld_rentable := nvl(l_bld_rentable,0) + nvl(p_rentable,0);
8183 END IF;
8184
8185 IF NOT (l_bld_usable IS NULL AND p_usable IS NULL) THEN
8186 l_bld_usable := nvl(l_bld_usable,0) + nvl(p_usable,0);
8187 END IF;
8188
8189 IF NOT (l_bld_assignable IS NULL AND p_assignable IS NULL) THEN
8190 l_bld_assignable := nvl(l_bld_assignable,0) + nvl(p_assignable,0);
8191 END IF;
8192
8193 l_building_flag := TRUE;
8194
8195 ELSIF find_terms.type = 'FLOOR' AND NOT l_floor_flag THEN
8196
8197 FOR flr_area_cur IN get_flr_area(find_terms.start_date) LOOP
8198 l_flr_rentable := flr_area_cur.rentable;
8199 l_flr_usable := flr_area_cur.usable;
8200 l_flr_assignable := flr_area_cur.assignable;
8201 END LOOP;
8202
8203 IF NOT (l_flr_rentable IS NULL AND p_rentable IS NULL) THEN
8204 l_flr_rentable := nvl(l_flr_rentable,0) + nvl(p_rentable,0);
8205 END IF;
8206
8207 IF NOT (l_flr_usable IS NULL AND p_usable IS NULL) THEN
8208 l_flr_usable := nvl(l_flr_usable,0) + nvl(p_usable,0);
8209 END IF;
8210
8211 IF NOT (l_flr_assignable IS NULL AND p_assignable IS NULL) THEN
8212 l_flr_assignable := nvl(l_flr_assignable,0) + nvl(p_assignable,0);
8213 END IF;
8214
8215 l_floor_flag := TRUE;
8216
8217 END IF;
8218
8219 l_share := get_tenants_share(
8220 p_lease_id => find_terms.lease_id,
8221 p_location_id => find_terms.location_id,
8222 p_as_of_date => find_terms.start_date);
8223
8224 l_share := nvl(l_share / 100, 1);
8225
8226 IF l_rentable_flag AND find_terms.area_type_code = 'LOCTN_RENTABLE' THEN
8227 IF find_terms.type = 'BUILDING' THEN
8228 x_area_tbl(x_area_tbl.COUNT) := l_bld_rentable * l_share;
8229 ELSIF find_terms.type = 'FLOOR' THEN
8230 x_area_tbl(x_area_tbl.COUNT) := l_flr_rentable * l_share;
8231 ELSIF find_terms.type = 'OFFICE' THEN
8232 x_area_tbl(x_area_tbl.COUNT) := p_rentable * l_share;
8233 END IF;
8234 ELSIF l_usable_flag AND find_terms.area_type_code = 'LOCTN_USABLE' THEN
8235 IF find_terms.type = 'BUILDING' THEN
8236 x_area_tbl(x_area_tbl.COUNT) := l_bld_usable * l_share;
8237 ELSIF find_terms.type = 'FLOOR' THEN
8238 x_area_tbl(x_area_tbl.COUNT) := l_flr_usable * l_share;
8239 ELSIF find_terms.type = 'OFFICE' THEN
8240 x_area_tbl(x_area_tbl.COUNT) := p_usable * l_share;
8241 END IF;
8242 ELSIF l_assignable_flag AND find_terms.area_type_code = 'LOCTN_ASSIGNABLE' THEN
8243 IF find_terms.type = 'BUILDING' THEN
8244 x_area_tbl(x_area_tbl.COUNT) := l_bld_assignable * l_share;
8245 ELSIF find_terms.type = 'FLOOR' THEN
8246 x_area_tbl(x_area_tbl.COUNT) := l_flr_assignable * l_share;
8247 ELSIF find_terms.type = 'OFFICE' THEN
8248 x_area_tbl(x_area_tbl.COUNT) := p_assignable * l_share;
8249 END IF;
8250 END IF;
8251 END IF;
8252 END IF;
8253 END LOOP;
8254 END IF;
8255 END LOOP;
8256
8257 END chk_terms_for_locn_area_chg;
8258
8259 --------------------------------------------------------------------------
8260 -- PROCEDURE : fetch_loctn_area
8261 -- DESCRIPTION: Generic function to fetch area. Benefits:
8262 -- SQL more performant than prior schemes.
8263 -- Code reuse / centralized logic / maintenance.
8264 -- Higher db cache hit rate because same SQL is used.
8265 -- HISTORY
8266 -- 25-FEB-04 ftanudja o created.
8267 -- 05-MAY-04 ftanuja o added elsif for p_type = null.
8268 --------------------------------------------------------------------------
8269
8270 PROCEDURE fetch_loctn_area(
8271 p_type VARCHAR2,
8272 p_location_id NUMBER,
8273 p_as_of_date DATE,
8274 x_area OUT NOCOPY pn_location_area_rec)
8275 IS
8276 CURSOR building_area IS
8277 SELECT nvl(sum(ofc.rentable_area),0) rentable,
8278 nvl(sum(ofc.usable_area),0) usable,
8279 nvl(sum(ofc.assignable_area),0) assignable,
8280 nvl(sum(ofc.max_capacity),0) max_capacity,
8281 nvl(sum(ofc.optimum_capacity),0) optimum_capacity
8282 FROM pn_locations_all ofc,
8283 pn_locations_all flr
8284 WHERE p_as_of_date BETWEEN ofc.active_start_date AND ofc.active_end_date
8285 AND p_as_of_date BETWEEN flr.active_start_date AND flr.active_end_date
8286 AND flr.parent_location_id = p_location_id
8287 AND ofc.parent_location_id = flr.location_id;
8288
8289 CURSOR floor_area IS
8290 SELECT nvl(sum(ofc.rentable_area),0) rentable,
8291 nvl(sum(ofc.usable_area),0) usable,
8292 nvl(sum(ofc.assignable_area),0) assignable,
8293 nvl(sum(ofc.max_capacity),0) max_capacity,
8294 nvl(sum(ofc.optimum_capacity),0) optimum_capacity
8295 FROM pn_locations_all ofc
8296 WHERE p_as_of_date BETWEEN ofc.active_start_date AND ofc.active_end_date
8297 AND ofc.parent_location_id = p_location_id;
8298
8299 CURSOR office_area IS
8300 SELECT rentable_area rentable,
8301 usable_area usable,
8302 assignable_area assignable,
8303 max_capacity max_capacity,
8304 optimum_capacity optimum_capacity
8305 FROM pn_locations_all ofc
8306 WHERE p_as_of_date BETWEEN ofc.active_start_date AND ofc.active_end_date
8307 AND ofc.location_id = p_location_id;
8308
8309 BEGIN
8310
8311 IF p_type IN ('BUILDING','LAND') THEN
8312 FOR ans_cur IN building_area LOOP
8313 x_area.rentable_area := ans_cur.rentable;
8314 x_area.usable_area := ans_cur.usable;
8315 x_area.assignable_area := ans_cur.assignable;
8316 x_area.max_capacity := ans_cur.max_capacity;
8317 x_area.optimum_capacity:= ans_cur.optimum_capacity;
8318 END LOOP;
8319 ELSIF p_type IN ('FLOOR','PARCEL') THEN
8320 FOR ans_cur IN floor_area LOOP
8321 x_area.rentable_area := ans_cur.rentable;
8322 x_area.usable_area := ans_cur.usable;
8323 x_area.assignable_area := ans_cur.assignable;
8324 x_area.max_capacity := ans_cur.max_capacity;
8325 x_area.optimum_capacity:= ans_cur.optimum_capacity;
8326 END LOOP;
8327 ELSIF p_type IN ('OFFICE','SECTION') THEN
8328 FOR ans_cur IN office_area LOOP
8329 x_area.rentable_area := ans_cur.rentable;
8330 x_area.usable_area := ans_cur.usable;
8331 x_area.assignable_area := ans_cur.assignable;
8332 x_area.max_capacity := ans_cur.max_capacity;
8333 x_area.optimum_capacity:= ans_cur.optimum_capacity;
8334 END LOOP;
8335 /* added per Amita's request */
8336 ELSIF p_type IS NULL THEN
8337 x_area.rentable_area := 0;
8338 x_area.usable_area := 0;
8339 x_area.assignable_area := 0;
8340 x_area.max_capacity := 0;
8341 x_area.optimum_capacity:= 0;
8342 END IF;
8343
8344 END fetch_loctn_area;
8345
8346 -- Retro Start
8347 -------------------------------------------------------------------------------
8348 -- PROCEDURE : retro_enabled
8349 -- DESCRIPTION: Works as a On/Off switch for Lease Retro Changes Phase - 1
8350 -- functionality. Returns boolean value of TRUE if functionality
8351 -- is switched ON else returns FALSE.
8352 -- HISTORY
8353 -- 15-OCT-2004 Mrinal Misra o Created.
8354 -------------------------------------------------------------------------------
8355 FUNCTION retro_enabled RETURN BOOLEAN IS
8356
8357 BEGIN
8358
8359 RETURN g_retro_enabled;
8360
8361 END retro_enabled;
8362
8363 -------------------------------------------------------------------------------
8364 -- PROCEDURE : retro_enabled_char
8365 -- DESCRIPTION: Works as a On/Off switch for Lease Retro Changes Phase - 1
8366 -- functionality. Returns character value of 'Y' if functionality
8367 -- is switched ON else returns 'N'. It was created to be used in
8368 -- OA framewrork VOs.
8369 -- HISTORY
8370 -- 15-OCT-2004 Mrinal Misra o Created.
8371 -------------------------------------------------------------------------------
8372 FUNCTION retro_enabled_char RETURN VARCHAR2 IS
8373 BEGIN
8374
8375 IF g_retro_enabled THEN
8376 RETURN 'Y';
8377 ELSE
8378 RETURN 'N';
8379 END IF;
8380
8381 END retro_enabled_char;
8382
8383 --------------------------------------------------------------------------------
8384 --
8385 -- NAME : check_var_rent_retro
8386 -- DESCRIPTION : Stops the user if a Retro change in term dates will cause an
8387 -- abatement line for an invoice in VR to go out of the invoice
8388 -- date.
8389 -- PURPOSE :
8390 -- INVOKED FROM : PNTLEASE
8391 -- ARGUMENTS :
8392 -- REFERENCE : PN_COMMON.debug()
8393 -- HISTORY :
8394 --
8395 -- 12-NOV-2004 Kiran Hegde o Created.
8396 --------------------------------------------------------------------------------
8397 PROCEDURE check_var_rent_retro( p_term_id IN NUMBER
8398 ,p_new_start_date IN DATE
8399 ,p_new_end_date IN DATE
8400 ,p_error OUT NOCOPY BOOLEAN)
8401 IS
8402
8403 /* Get all abatements lines that will go bad with the new term dates */
8404 CURSOR chk_abat_retro IS
8405 SELECT pvr.rent_num
8406 FROM pn_var_rents_all pvr,
8407 pn_var_rent_inv_all pvri,
8408 pn_var_abatements_all pva
8409 WHERE pva.payment_term_id = p_term_id
8410 AND pvri.var_rent_inv_id = pva.var_rent_inv_id
8411 AND pvri.invoice_date NOT BETWEEN p_new_start_date
8412 AND p_new_end_date
8413 AND pvr.var_rent_ID = pvri.var_rent_ID;
8414
8415 l_var_rent_num VARCHAR2(30);
8416 RETRO_VARENT_EXCEPTION EXCEPTION;
8417
8418 BEGIN
8419 pnp_debug_pkg.log('check_var_rent_retro - (+)');
8420
8421 FOR abat IN chk_abat_retro LOOP
8422
8423 l_var_rent_num := abat.rent_num;
8424
8425 RAISE RETRO_VARENT_EXCEPTION;
8426
8427 END LOOP;
8428
8429 pnp_debug_pkg.log('check_var_rent_retro - (-)');
8430 EXCEPTION
8431
8432 WHEN RETRO_VARENT_EXCEPTION THEN
8433 fnd_message.set_name('PN', 'PN_RETRO_VARENT_ERR');
8434 fnd_message.set_token('VAR_RENT_NUM', l_var_rent_num);
8435 p_error := TRUE;
8436 RETURN;
8437
8438 WHEN others THEN
8439 RAISE;
8440
8441 END check_var_rent_retro;
8442
8443 -------------------------------------------------------------------------------
8444 -- PROCEDURE : get_yr_mth_days
8445 -- DESCRIPTION: For From and To date input params., procedure returns
8446 -- years, months and days between them.
8447 -- HISTORY
8448 -- 15-OCT-04 MMisra o Created.
8449 -- 19-SEP-05 pikhar o Added IF condition to supress negetive values of
8450 -- number of days returned
8451 -- 10-JAN-06 pikhar o Calculated number of days after reducing start and end
8452 -- dates by 1 day if start date is month end
8453 -------------------------------------------------------------------------------
8454 PROCEDURE get_yr_mth_days(p_from_date IN DATE
8455 ,p_to_date IN DATE
8456 ,p_yrs OUT NOCOPY NUMBER
8457 ,p_mths OUT NOCOPY NUMBER
8458 ,p_days OUT NOCOPY NUMBER) IS
8459
8460 l_days number;
8461 l_from_date DATE;
8462 l_to_date DATE;
8463 BEGIN
8464 pnp_debug_pkg.log('get_yr_mth_days - (+)');
8465
8466 /* init local start - end dates */
8467 l_from_date := p_from_date;
8468 l_to_date := p_to_date;
8469
8470 IF TO_NUMBER(TO_CHAR(p_from_date, 'mm'))
8471 <> TO_NUMBER(TO_CHAR(p_from_date + 1, 'mm')) THEN
8472 /* last day of month */
8473
8474 IF TO_NUMBER(TO_CHAR(p_from_date, 'mm')) = 2 AND
8475 TO_NUMBER(TO_CHAR(p_from_date, 'dd')) = 29 THEN
8476 /* 29th Feb in a leap year */
8477 l_from_date := p_from_date - 2;
8478 l_to_date := p_to_date - 2;
8479
8480 ELSE
8481 /* any other last day of month */
8482 l_from_date := p_from_date - 1;
8483 l_to_date := p_to_date - 1;
8484
8485 END IF;
8486
8487 END IF;
8488
8489 p_yrs := FLOOR(MONTHS_BETWEEN(l_to_date+1, l_from_date)/12);
8490 p_mths := MOD(FLOOR(MONTHS_BETWEEN(l_to_date+1, l_from_date)), 12);
8491 p_days := l_to_date + 1 - ADD_MONTHS(l_from_date, FLOOR(MONTHS_BETWEEN(l_to_date + 1, l_from_date)));
8492
8493 /* for handling exceptional situations */
8494 IF p_days<0 THEN
8495 p_days:=0;
8496 END IF;
8497
8498 pnp_debug_pkg.log('get_yr_mth_days - (-)');
8499
8500 END get_yr_mth_days;
8501
8502 -------------------------------------------------------------------------------
8503 -- FUNCTION : get_date_from_ymd
8504 -- DESCRIPTION: This functions returns a date if a From Date and Year/Month/Days
8505 -- are given as input parameters.
8506 -- HISTORY
8507 -- 13-JAN-2005 Mrinal Misra o Created.
8508 -------------------------------------------------------------------------------
8509 FUNCTION get_date_from_ymd(p_from_date IN DATE
8510 ,p_yrs IN NUMBER
8511 ,p_mths IN NUMBER
8512 ,p_days IN NUMBER)
8513 RETURN DATE IS
8514
8515 l_to_date DATE;
8516
8517 BEGIN
8518
8519 pnp_debug_pkg.log('get_yr_mth_days - (+)');
8520
8521 IF p_from_date IS NOT NULL THEN
8522 IF NVL(p_yrs,0) = 0 AND
8523 NVL(p_mths,0) = 0 AND
8524 NVL(p_days,0) = 0 THEN
8525
8526 RETURN p_from_date;
8527 ELSE
8528 SELECT ADD_MONTHS(p_from_date, NVL(p_yrs,0) * 12 + NVL(p_mths,0)) + NVL(p_days,0)
8529 INTO l_to_date
8530 FROM DUAL;
8531
8532 RETURN l_to_date - 1;
8533 END IF;
8534 ELSE
8535 RETURN NULL;
8536 END IF;
8537
8538 pnp_debug_pkg.log('get_yr_mth_days - (-)');
8539 END get_date_from_ymd;
8540 -- Retro End
8541
8542 /* public view as of date setter/getters functions */
8543 -------------------------------------------------------------------------------
8544 -- NAME : set_as_of_date_4_loc_pubview
8545 -- DESCRIPTION : Sets the as of date for location public view
8546 -- SCOPE : PUBLIC
8547 -- INVOKED FROM :
8548 -- ARGUMENTS : IN : p_Date
8549 -- RETURNS : NUMNER
8550 -- REFERENCE :
8551 -- HISTORY :
8552 -- 15-jun-05 piagrawa o Bug 4307795 - Created
8553 -------------------------------------------------------------------------------
8554 FUNCTION set_as_of_date_4_loc_pubview(p_date DATE) RETURN NUMBER IS
8555 BEGIN
8556 g_as_of_date_4_loc_pubview := p_date;
8557 RETURN 0;
8558
8559 EXCEPTION
8560 WHEN OTHERS THEN
8561 g_as_of_date_4_loc_pubview := SYSDATE;
8562 RETURN -1;
8563
8564 END set_as_of_date_4_loc_pubview;
8565
8566 -------------------------------------------------------------------------------
8567 -- NAME : get_as_of_date_4_loc_pubview
8568 -- DESCRIPTION : Retrieves the as of date for location public view
8569 -- SCOPE : PUBLIC
8570 -- INVOKED FROM :
8571 -- ARGUMENTS : NONE
8572 -- RETURNS : As of date value
8573 -- REFERENCE :
8574 -- HISTORY :
8575 -- 15-jun-05 piagrawa o Bug 4307795 - Created
8576 -------------------------------------------------------------------------------
8577 FUNCTION get_as_of_date_4_loc_pubview RETURN DATE IS
8578 BEGIN
8579 RETURN g_as_of_date_4_loc_pubview;
8580
8581 EXCEPTION
8582 WHEN OTHERS THEN
8583 RAISE;
8584
8585 END get_as_of_date_4_loc_pubview;
8586
8587 -------------------------------------------------------------------------------
8588 -- NAME : set_as_of_date_4_loc_pubview
8589 -- DESCRIPTION : Sets the as of date for location public view
8590 -- SCOPE : PUBLIC
8591 -- INVOKED FROM :
8592 -- ARGUMENTS : IN : p_Date
8593 -- RETURNS : NUMNER
8594 -- REFERENCE :
8595 -- HISTORY :
8596 -- 15-jun-05 piagrawa o Bug 4307795 - Created
8597 -------------------------------------------------------------------------------
8598 FUNCTION set_as_of_date_4_emp_pubview(p_date DATE) RETURN NUMBER IS
8599 BEGIN
8600 g_as_of_date_4_emp_pubview := p_date;
8601 RETURN 0;
8602
8603 EXCEPTION
8604 WHEN OTHERS THEN
8605 g_as_of_date_4_emp_pubview := SYSDATE;
8606 RETURN -1;
8607
8608 END set_as_of_date_4_emp_pubview;
8609
8610 -------------------------------------------------------------------------------
8611 -- NAME : get_as_of_date_4_loc_pubview
8612 -- DESCRIPTION : Retrieves the as of date for location public view
8613 -- SCOPE : PUBLIC
8614 -- INVOKED FROM :
8615 -- ARGUMENTS : NONE
8616 -- RETURNS : As of date value
8617 -- REFERENCE :
8618 -- HISTORY :
8619 -- 15-jun-05 piagrawa o Bug 4307795 - Created
8620 -------------------------------------------------------------------------------
8621 FUNCTION get_as_of_date_4_emp_pubview RETURN DATE IS
8622 BEGIN
8623 RETURN NVL(g_as_of_date_4_emp_pubview, SYSDATE);
8624
8625 EXCEPTION
8626 WHEN OTHERS THEN
8627 RAISE;
8628
8629 END get_as_of_date_4_emp_pubview;
8630 /* public view as of date setter/getters functions */
8631
8632 /* --- OVERLOADED functions and procedures for MOAC START --- */
8633 /*============================================================================+
8634 -- NAME : get_ar_trx_type
8635 -- DESCRIPTION : This FUNCTION RETURNs Transaction Type for a given Customer
8636 -- Transaction Type Id FROM Receivables.
8637 -- SCOPE : PUBLIC
8638 -- INVOKED FROM : forms libraries
8639 -- ARGUMENTS : IN : p_trx_id
8640 -- RETURNS : Transaction Type
8641 -- HISTORY :
8642 -- 24-Jun-05 Kiran o Created
8643 -- IMPORTANT - Use this function once MOAC is enabled. All form libraries
8644 -- must call this.
8645 +============================================================================*/
8646 FUNCTION Get_Ar_Trx_type( p_trx_id IN NUMBER
8647 ,p_org_id IN NUMBER) RETURN VARCHAR2 IS
8648
8649 l_trx_type ra_cust_trx_types.name%TYPE;
8650
8651 BEGIN
8652
8653 SELECT name
8654 INTO l_trx_type
8655 FROM ra_cust_trx_types_all
8656 WHERE cust_trx_type_id = p_trx_id
8657 AND org_id = p_org_id;
8658
8659 RETURN(l_trx_type);
8660
8661 EXCEPTION
8662
8663 WHEN NO_DATA_FOUND THEN
8664 RETURN NULL;
8665
8666 WHEN OTHERS THEN
8667 RAISE;
8668
8669 END Get_Ar_Trx_type;
8670
8671 /* --- OVERLOADED functions and procedures for MOAC END --- */
8672
8673 -------------------------------------------------------------------------------
8674 -- PROCEDURE : mini_retro_enabled
8675 -- DESCRIPTION: Works as a On/Off switch for Lease Mini Retro Changes
8676 -- functionality. Returns boolean value of TRUE if functionality
8677 -- is switched ON else returns FALSE.
8678 -- HISTORY
8679 -- 01-AUG-05 piagrawa o Created.
8680 -------------------------------------------------------------------------------
8681 FUNCTION mini_retro_enabled RETURN BOOLEAN IS
8682
8683 BEGIN
8684
8685 RETURN g_mini_retro_enabled;
8686
8687 END mini_retro_enabled;
8688
8689 -------------------------------------------------------------------------------
8690 -- PROCEDURE : mini_retro_enabled_char
8691 -- DESCRIPTION: Works as a On/Off switch for Lease Mini Retro Changes
8692 -- functionality. Returns character value of 'Y' if functionality
8693 -- is switched ON else returns 'N'. It was created to be used in
8694 -- OA framewrork VOs.
8695 -- HISTORY
8696 -- 01-AUG-05 piagrawa o Created.
8697 -------------------------------------------------------------------------------
8698 FUNCTION mini_retro_enabled_char RETURN VARCHAR2 IS
8699 BEGIN
8700
8701 IF g_mini_retro_enabled THEN
8702 RETURN 'Y';
8703 ELSE
8704 RETURN 'N';
8705 END IF;
8706
8707 END mini_retro_enabled_char;
8708
8709 /*============================================================================+
8710 -- NAME : get_loc_name_disp
8711 -- DESCRIPTION : RETURNs primary Location_name
8712 -- NOTES : Currently being called from leases form-view
8713 -- SCOPE : PUBLIC
8714 -- INVOKED FROM :
8715 -- ARGUMENTS : IN : p_lease_Id,p_as_of_date
8716 -- OUT : location_name
8717 -- RETURNS : The Location Information of the Location
8718 -- REFERENCE :
8719 -- HISTORY :
8720 -- 20-SEP-06 Hareesha o Created -MTM uptake
8721 +============================================================================*/
8722
8723 FUNCTION get_loc_name_disp(p_lease_id IN NUMBER,
8724 p_as_of_date IN DATE)
8725 RETURN VARCHAR2 IS
8726 l_location_name_rec location_name_rec;
8727
8728 CURSOR get_loc_cur(p_lease_id NUMBER) IS
8729 SELECT location_id
8730 FROM pn_tenancies_all
8731 WHERE lease_id = p_lease_id
8732 AND NVL(primary_flag ,'N') = 'Y'
8733 AND ROWNUM < 2;
8734
8735 BEGIN
8736
8737 FOR rec IN get_loc_cur(p_lease_id) LOOP
8738 l_location_name_rec := pnp_util_func.get_location_name(rec.location_id,p_as_of_date);
8739 END LOOP;
8740
8741 RETURN NVL(l_location_name_rec.office,
8742 NVL(l_location_name_rec.floor,l_location_name_rec.building)
8743 );
8744
8745 EXCEPTION
8746 WHEN NO_DATA_FOUND THEN
8747 RETURN NULL;
8748 WHEN OTHERS THEN
8749 RAISE;
8750
8751 END get_loc_name_disp;
8752
8753 /*============================================================================+
8754 -- NAME : get_loc_code_disp
8755 -- DESCRIPTION : RETURNs primary Location_code
8756 -- NOTES : Currently being called from leases form-view
8757 -- SCOPE : PUBLIC
8758 -- INVOKED FROM :
8759 -- ARGUMENTS : IN : p_lease_Id,p_as_of_date
8760 -- OUT : location_code
8761 -- RETURNS : The Location Information of the Location
8762 -- REFERENCE :
8763 -- HISTORY :
8764 -- 20-SEP-06 Hareesha o Created -MTM uptake
8765 +============================================================================*/
8766
8767 FUNCTION get_loc_code_disp(p_lease_id IN NUMBER,
8768 p_as_of_date IN DATE)
8769 RETURN VARCHAR2 IS
8770 l_location_name_rec location_name_rec;
8771
8772 CURSOR get_loc_cur(p_lease_id NUMBER) IS
8773 SELECT location_id
8774 FROM pn_tenancies_all
8775 WHERE lease_id = p_lease_id
8776 AND NVL(primary_flag ,'N') = 'Y'
8777 AND ROWNUM < 2;
8778
8779 BEGIN
8780
8781 FOR rec IN get_loc_cur(p_lease_id) LOOP
8782 l_location_name_rec := pnp_util_func.get_location_name(rec.location_id,p_as_of_date);
8783 END LOOP;
8784
8785 RETURN NVL(l_location_name_rec.office_location_code,
8786 NVL(l_location_name_rec.floor_location_code,l_location_name_rec.building_location_code)
8787 );
8788
8789 EXCEPTION
8790 WHEN NO_DATA_FOUND THEN
8791 RETURN NULL;
8792 WHEN OTHERS THEN
8793 RAISE;
8794
8795 END get_loc_code_disp;
8796
8797 /*============================================================================+
8798 -- NAME : get_prop_name_disp
8799 -- DESCRIPTION : RETURNs property associated with the primary location
8800 -- NOTES : Currently being called from leases form-view
8801 -- SCOPE : PUBLIC
8802 -- INVOKED FROM :
8803 -- ARGUMENTS : IN : p_lease_Id,p_as_of_date
8804 -- OUT : property_name
8805 -- RETURNS : The property Information of the Location
8806 -- REFERENCE :
8807 -- HISTORY :
8808 -- 20-SEP-06 Hareesha o Created -MTM uptake
8809 +============================================================================*/
8810
8811 FUNCTION get_prop_name_disp(p_lease_id IN NUMBER,
8812 p_as_of_date IN DATE)
8813 RETURN VARCHAR2 IS
8814 l_location_name_rec location_name_rec;
8815
8816 CURSOR get_loc_cur(p_lease_id NUMBER) IS
8817 SELECT location_id
8818 FROM pn_tenancies_all
8819 WHERE lease_id = p_lease_id
8820 AND NVL(primary_flag ,'N') = 'Y'
8821 AND ROWNUM < 2;
8822
8823 BEGIN
8824
8825 FOR rec IN get_loc_cur(p_lease_id) LOOP
8826 l_location_name_rec := pnp_util_func.get_location_name(rec.location_id,p_as_of_date);
8827 END LOOP;
8828
8829 RETURN l_location_name_rec.property_name;
8830
8831 EXCEPTION
8832 WHEN NO_DATA_FOUND THEN
8833 RETURN NULL;
8834 WHEN OTHERS THEN
8835 RAISE;
8836
8837 END get_prop_name_disp;
8838
8839 -------------------------------------
8840 -- End of Package --
8841 --------------------------------------
8842 END pnp_util_func;