DBA Data[Home] [Help]

PACKAGE BODY: APPS.PNP_UTIL_FUNC

Source


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