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