DBA Data[Home] [Help]

PACKAGE BODY: APPS.PNP_UTIL_FUNC

Source


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;