1 PACKAGE BODY pn_tenancies_pkg AS
2 -- $Header: PNTTENTB.pls 120.9 2007/07/06 07:34:05 rdonthul ship $
3
4 TYPE loc_info_rec IS
5 RECORD (active_start_date pn_locations.active_start_date%TYPE,
6 active_end_date pn_locations.active_end_date%TYPE,
7 assignable_area pn_locations.assignable_area%TYPE);
8
9 TYPE loc_info_type IS
10 TABLE OF loc_info_rec
11 INDEX BY BINARY_INTEGER;
12
13 loc_info_tbl loc_info_type;
14
15 ------------------------------------------------------------------------------------
16 -- 22-AUG-2003 Satish Tripathi o Fixed for BUG# 3085758, Added fin_oblig_end_date.
17 ------------------------------------------------------------------------------------
18 TYPE space_assign_info_rec IS
19 RECORD (cust_assign_start_date pn_space_assign_cust.cust_assign_start_date%TYPE,
20 cust_assign_end_date pn_space_assign_cust.cust_assign_end_date%TYPE,
21 fin_oblig_end_date pn_space_assign_cust.fin_oblig_end_date%TYPE,
22 allocated_area pn_space_assign_cust.allocated_area%TYPE,
23 allocated_area_pct pn_space_assign_cust_all.allocated_area_pct%TYPE);
24
25 TYPE space_assign_info_type IS
26 TABLE OF space_assign_info_rec
27 INDEX BY BINARY_INTEGER;
28
29 space_assign_info_tbl space_assign_info_type;
30
31 -------------------------------------------------------------------------------
32 -- PROCDURE : INSERT_ROW
33 -- INVOKED FROM : insert_row procedure
34 -- PURPOSE : inserts the row
35 -- HISTORY :
36 -- 11-SEP-02 STripathi o If returnStatus = 'W', return parameter
37 -- x_tenancy_ovelap_wrn 'Y' for Multi-Tenancy-Lease changes.
38 -- 16-JAN-02 PSidhu o bug#2730279 - Removed call to
39 -- pn_tenancies_pkg.check_unique_primary_location.
40 -- 04-DEC-04 ftanudja o Added 8 parameters for lease rentable area. 3257508.
41 -- 05-JUL-05 sdmahesh o Bug 4284035 - Replaced pn_tenancies with _ALL table.
42 -- 28-NOV-05 pikhar o fetched org_id using cursor
43 -------------------------------------------------------------------------------
44 PROCEDURE Insert_Row
45 (
46 X_ROWID IN OUT NOCOPY VARCHAR2,
47 X_TENANCY_ID IN OUT NOCOPY NUMBER,
48 X_LOCATION_ID IN NUMBER,
49 X_LEASE_ID IN NUMBER,
50 X_LEASE_CHANGE_ID IN NUMBER,
51 X_TENANCY_USAGE_LOOKUP_CODE IN VARCHAR2,
52 X_PRIMARY_FLAG IN VARCHAR2,
53 X_ESTIMATED_OCCUPANCY_DATE IN DATE,
54 X_OCCUPANCY_DATE IN DATE,
55 X_EXPIRATION_DATE IN DATE,
56 X_ASSIGNABLE_FLAG IN VARCHAR2,
57 X_SUBLEASEABLE_FLAG IN VARCHAR2,
58 X_TENANTS_PROPORTIONATE_SHARE IN NUMBER,
59 X_ALLOCATED_AREA_PCT IN NUMBER,
60 X_ALLOCATED_AREA IN NUMBER,
61 X_STATUS IN VARCHAR2,
62 X_ATTRIBUTE_CATEGORY IN VARCHAR2,
63 X_ATTRIBUTE1 IN VARCHAR2,
64 X_ATTRIBUTE2 IN VARCHAR2,
65 X_ATTRIBUTE3 IN VARCHAR2,
66 X_ATTRIBUTE4 IN VARCHAR2,
67 X_ATTRIBUTE5 IN VARCHAR2,
68 X_ATTRIBUTE6 IN VARCHAR2,
69 X_ATTRIBUTE7 IN VARCHAR2,
70 X_ATTRIBUTE8 IN VARCHAR2,
71 X_ATTRIBUTE9 IN VARCHAR2,
72 X_ATTRIBUTE10 IN VARCHAR2,
73 X_ATTRIBUTE11 IN VARCHAR2,
74 X_ATTRIBUTE12 IN VARCHAR2,
75 X_ATTRIBUTE13 IN VARCHAR2,
76 X_ATTRIBUTE14 IN VARCHAR2,
77 X_ATTRIBUTE15 IN VARCHAR2,
78 X_CREATION_DATE IN DATE,
79 X_CREATED_BY IN NUMBER,
80 X_LAST_UPDATE_DATE IN DATE,
81 X_LAST_UPDATED_BY IN NUMBER,
82 X_LAST_UPDATE_LOGIN IN NUMBER,
83 X_ORG_ID IN NUMBER,
84 X_TENANCY_OVELAP_WRN OUT NOCOPY VARCHAR2,
85 X_RECOVERY_TYPE_CODE IN VARCHAR2,
86 X_RECOVERY_SPACE_STD_CODE IN VARCHAR2,
87 X_FIN_OBLIG_END_DATE IN DATE,
88 X_CUSTOMER_ID IN NUMBER,
89 X_CUSTOMER_SITE_USE_ID IN NUMBER,
90 X_LEASE_RENTABLE_AREA IN NUMBER,
91 X_LEASE_USABLE_AREA IN NUMBER,
92 X_LEASE_ASSIGNABLE_AREA IN NUMBER,
93 X_LEASE_LOAD_FACTOR IN NUMBER,
94 X_LOCATION_RENTABLE_AREA IN NUMBER,
95 X_LOCATION_USABLE_AREA IN NUMBER,
96 X_LOCATION_ASSIGNABLE_AREA IN NUMBER,
97 X_LOCATION_LOAD_FACTOR IN NUMBER
98 )
99 IS
100 CURSOR C IS
101 SELECT ROWID
102 FROM pn_tenancies_all
103 WHERE tenancy_id = x_tenancy_id;
104
105 l_returnStatus VARCHAR2(30) := NULL;
106
107 CURSOR org_cur IS
108 SELECT org_id
109 FROM pn_leases_all
110 WHERE lease_id = x_lease_id;
111
112 l_org_id NUMBER;
113
114
115
116 BEGIN
117
118 pnp_debug_pkg.debug('PN_TENANCIES_PKG.INSERT_ROW (+)');
119
120
121 IF x_org_id IS NULL THEN
122 FOR rec IN org_cur LOOP
123 l_org_id := rec.org_id;
124 END LOOP;
125 ELSE
126 l_org_id := x_org_id;
127 END IF;
128
129 x_tenancy_ovelap_wrn := NULL;
130
131 ---------------------------------------------------
132 -- Check tenancy dates
133 ---------------------------------------------------
134 l_returnStatus := NULL;
135 PN_TENANCIES_PKG.CHECK_TENANCY_DATES
136 (
137 l_returnStatus
138 ,X_ESTIMATED_OCCUPANCY_DATE
139 ,X_OCCUPANCY_DATE
140 ,X_EXPIRATION_DATE
141 );
142 IF (l_returnStatus IS NOT NULL) THEN
143 app_exception.Raise_Exception;
144 END IF;
145
146 ---------------------------------------------------
147 -- Check IF the tenancy dates overlap
148 ---------------------------------------------------
149 l_returnStatus := NULL;
150 PN_TENANCIES_PKG.CHECK_FOR_OVELAP_OF_TENANCY
151 (
152 l_returnStatus
153 ,X_TENANCY_ID
154 ,X_LOCATION_ID
155 ,X_LEASE_ID
156 ,X_ESTIMATED_OCCUPANCY_DATE
157 ,X_OCCUPANCY_DATE
158 ,X_EXPIRATION_DATE
159 );
160 IF (l_returnStatus = 'W') THEN
161 x_tenancy_ovelap_wrn := 'Y';
162 ELSIF (l_returnStatus IS NOT NULL) THEN
163 app_exception.Raise_Exception;
164 END IF;
165
166
167 ---------------------------------------------------
168 -- Assign Nextval WHEN argument value IS passed
169 -- as NULL
170 ---------------------------------------------------
171 IF x_tenancy_ID IS NULL THEN
172
173 SELECT pn_tenancies_s.NEXTVAL
174 INTO x_tenancy_id
175 FROM DUAL;
176
177 END IF;
178
179 INSERT INTO pn_tenancies_all
180 (
181 TENANCY_ID,
182 LAST_UPDATE_DATE,
183 LAST_UPDATED_BY,
184 CREATION_DATE,
185 CREATED_BY,
186 LAST_UPDATE_LOGIN,
187 LOCATION_ID,
188 LEASE_ID,
189 LEASE_CHANGE_ID,
190 TENANCY_USAGE_LOOKUP_CODE,
191 PRIMARY_FLAG,
192 ESTIMATED_OCCUPANCY_DATE,
193 OCCUPANCY_DATE,
194 EXPIRATION_DATE,
195 ASSIGNABLE_FLAG,
196 SUBLEASEABLE_FLAG,
197 TENANTS_PROPORTIONATE_SHARE,
198 ALLOCATED_AREA_PCT,
199 ALLOCATED_AREA,
200 STATUS,
201 ATTRIBUTE_CATEGORY,
202 ATTRIBUTE1,
203 ATTRIBUTE2,
204 ATTRIBUTE3,
205 ATTRIBUTE4,
206 ATTRIBUTE5,
207 ATTRIBUTE6,
208 ATTRIBUTE7,
209 ATTRIBUTE8,
210 ATTRIBUTE9,
211 ATTRIBUTE10,
212 ATTRIBUTE11,
213 ATTRIBUTE12,
214 ATTRIBUTE13,
215 ATTRIBUTE14,
216 ATTRIBUTE15,
217 ORG_ID,
218 RECOVERY_TYPE_CODE,
219 RECOVERY_SPACE_STD_CODE,
220 FIN_OBLIG_END_DATE,
221 CUSTOMER_ID,
222 CUSTOMER_SITE_USE_ID,
223 LEASE_RENTABLE_AREA,
224 LEASE_USABLE_AREA,
225 LEASE_ASSIGNABLE_AREA,
226 LEASE_LOAD_FACTOR,
227 LOCATION_RENTABLE_AREA,
228 LOCATION_USABLE_AREA,
229 LOCATION_ASSIGNABLE_AREA,
230 LOCATION_LOAD_FACTOR
231 )
232 VALUES
233 (
234 X_TENANCY_ID,
235 X_LAST_UPDATE_DATE,
236 X_LAST_UPDATED_BY,
237 X_CREATION_DATE,
238 X_CREATED_BY,
239 X_LAST_UPDATE_LOGIN,
240 X_LOCATION_ID,
241 X_LEASE_ID,
242 X_LEASE_CHANGE_ID,
243 X_TENANCY_USAGE_LOOKUP_CODE,
244 X_PRIMARY_FLAG,
245 X_ESTIMATED_OCCUPANCY_DATE,
246 X_OCCUPANCY_DATE,
247 X_EXPIRATION_DATE,
248 X_ASSIGNABLE_FLAG,
249 X_SUBLEASEABLE_FLAG,
250 X_TENANTS_PROPORTIONATE_SHARE,
251 X_ALLOCATED_AREA_PCT,
252 X_ALLOCATED_AREA,
253 X_STATUS,
254 X_ATTRIBUTE_CATEGORY,
255 X_ATTRIBUTE1,
256 X_ATTRIBUTE2,
257 X_ATTRIBUTE3,
258 X_ATTRIBUTE4,
259 X_ATTRIBUTE5,
260 X_ATTRIBUTE6,
261 X_ATTRIBUTE7,
262 X_ATTRIBUTE8,
263 X_ATTRIBUTE9,
264 X_ATTRIBUTE10,
265 X_ATTRIBUTE11,
266 X_ATTRIBUTE12,
267 X_ATTRIBUTE13,
268 X_ATTRIBUTE14,
269 X_ATTRIBUTE15,
270 l_ORG_ID,
271 X_RECOVERY_TYPE_CODE,
272 X_RECOVERY_SPACE_STD_CODE,
273 X_FIN_OBLIG_END_DATE,
274 X_CUSTOMER_ID,
275 X_CUSTOMER_SITE_USE_ID,
276 X_LEASE_RENTABLE_AREA,
277 X_LEASE_USABLE_AREA,
278 X_LEASE_ASSIGNABLE_AREA,
279 X_LEASE_LOAD_FACTOR,
280 X_LOCATION_RENTABLE_AREA,
281 X_LOCATION_USABLE_AREA,
282 X_LOCATION_ASSIGNABLE_AREA,
283 X_LOCATION_LOAD_FACTOR
284 );
285
286 OPEN c;
287 FETCH c INTO X_ROWID;
288 IF (c%NOTFOUND) THEN
289 CLOSE c;
290 RAISE NO_DATA_FOUND;
291 END IF;
292 CLOSE c;
293
294 pnp_debug_pkg.debug('PN_TENANCIES_PKG.INSERT_ROW (-)');
295
296 END Insert_Row;
297
298 -------------------------------------------------------------------------------
299 -- PROCDURE : Lock_Row
300 -- INVOKED FROM : Lock_Row procedure
301 -- PURPOSE : locks the row
302 -- HISTORY :
303 -- 04-DEC-04 ftanudja o Added 8 parameters for lease rentable area. 3257508.
304 -- 10-FEB-04 ftanudja o Removed locn areas (4 params).
305 -- 05-JUL-05 sdmahesh o Bug 4284035 - Replaced pn_tenancies with _ALL table.
306 -------------------------------------------------------------------------------
307 PROCEDURE Lock_Row
308 (
309 X_TENANCY_ID IN NUMBER,
310 X_LOCATION_ID IN NUMBER,
311 X_LEASE_ID IN NUMBER,
312 X_LEASE_CHANGE_ID IN NUMBER,
313 X_TENANCY_USAGE_LOOKUP_CODE IN VARCHAR2,
314 X_PRIMARY_FLAG IN VARCHAR2,
315 X_ESTIMATED_OCCUPANCY_DATE IN DATE,
316 X_OCCUPANCY_DATE IN DATE,
317 X_EXPIRATION_DATE IN DATE,
318 X_ASSIGNABLE_FLAG IN VARCHAR2,
319 X_SUBLEASEABLE_FLAG IN VARCHAR2,
320 X_TENANTS_PROPORTIONATE_SHARE IN NUMBER,
321 X_ALLOCATED_AREA_PCT IN NUMBER,
322 X_ALLOCATED_AREA IN NUMBER,
323 X_STATUS IN VARCHAR2,
324 X_ATTRIBUTE_CATEGORY IN VARCHAR2,
325 X_ATTRIBUTE1 IN VARCHAR2,
326 X_ATTRIBUTE2 IN VARCHAR2,
327 X_ATTRIBUTE3 IN VARCHAR2,
328 X_ATTRIBUTE4 IN VARCHAR2,
329 X_ATTRIBUTE5 IN VARCHAR2,
330 X_ATTRIBUTE6 IN VARCHAR2,
331 X_ATTRIBUTE7 IN VARCHAR2,
332 X_ATTRIBUTE8 IN VARCHAR2,
333 X_ATTRIBUTE9 IN VARCHAR2,
334 X_ATTRIBUTE10 IN VARCHAR2,
335 X_ATTRIBUTE11 IN VARCHAR2,
336 X_ATTRIBUTE12 IN VARCHAR2,
337 X_ATTRIBUTE13 IN VARCHAR2,
338 X_ATTRIBUTE14 IN VARCHAR2,
339 X_ATTRIBUTE15 IN VARCHAR2,
340 X_RECOVERY_TYPE_CODE IN VARCHAR2,
341 X_RECOVERY_SPACE_STD_CODE IN VARCHAR2,
342 X_FIN_OBLIG_END_DATE IN DATE,
343 X_CUSTOMER_ID IN NUMBER,
347 X_LEASE_ASSIGNABLE_AREA IN NUMBER,
344 X_CUSTOMER_SITE_USE_ID IN NUMBER,
345 X_LEASE_RENTABLE_AREA IN NUMBER,
346 X_LEASE_USABLE_AREA IN NUMBER,
348 X_LEASE_LOAD_FACTOR IN NUMBER
349 )
350 IS
351 CURSOR c1 IS
352 SELECT *
353 FROM pn_tenancies_all
354 WHERE tenancy_id = x_tenancy_id
355 FOR UPDATE OF tenancy_id NOWAIT;
356
357 tlinfo c1%ROWTYPE;
358
359 BEGIN
360 pnp_debug_pkg.debug('PN_TENANCIES_PKG.LOCK_ROW (+)');
361
362 OPEN c1;
363 FETCH c1 INTO tlinfo;
364 IF (c1%NOTFOUND) THEN
365 CLOSE c1;
366 RETURN;
367 END IF;
368 CLOSE c1;
369
370 IF NOT (tlinfo.TENANCY_ID = X_TENANCY_ID) THEN
371 pn_var_rent_pkg.lock_row_exception('TENANCY_ID',tlinfo.TENANCY_ID);
372 END IF;
373
374 IF NOT (tlinfo.LOCATION_ID = X_LOCATION_ID) THEN
375 pn_var_rent_pkg.lock_row_exception('LOCATION_ID',tlinfo.LOCATION_ID);
376 END IF;
377
378 IF NOT (tlinfo.LEASE_ID = X_LEASE_ID) THEN
379 pn_var_rent_pkg.lock_row_exception('LEASE_ID',tlinfo.LEASE_ID);
380 END IF;
381
382 IF NOT (tlinfo.LEASE_CHANGE_ID = X_LEASE_CHANGE_ID) THEN
383 pn_var_rent_pkg.lock_row_exception('LEASE_CHANGE_ID',tlinfo.LEASE_CHANGE_ID);
384 END IF;
385
386 IF NOT (tlinfo.TENANCY_USAGE_LOOKUP_CODE = X_TENANCY_USAGE_LOOKUP_CODE) THEN
387 pn_var_rent_pkg.lock_row_exception('TENANCY_USAGE_LOOKUP_CODE',tlinfo.TENANCY_USAGE_LOOKUP_CODE);
388 END IF;
389
390 IF NOT (tlinfo.PRIMARY_FLAG = X_PRIMARY_FLAG) THEN
391 pn_var_rent_pkg.lock_row_exception('PRIMARY_FLAG',tlinfo.PRIMARY_FLAG);
392 END IF;
393
394 IF NOT ((tlinfo.ESTIMATED_OCCUPANCY_DATE = X_ESTIMATED_OCCUPANCY_DATE)
395 OR ((tlinfo.ESTIMATED_OCCUPANCY_DATE IS NULL) AND (X_ESTIMATED_OCCUPANCY_DATE IS NULL))) THEN
396 pn_var_rent_pkg.lock_row_exception('ESTIMATED_OCCUPANCY_DATE',tlinfo.ESTIMATED_OCCUPANCY_DATE);
397 END IF;
398
399 IF NOT ((tlinfo.OCCUPANCY_DATE = X_OCCUPANCY_DATE)
400 OR ((tlinfo.OCCUPANCY_DATE IS NULL) AND (X_OCCUPANCY_DATE IS NULL))) THEN
401 pn_var_rent_pkg.lock_row_exception('OCCUPANCY_DATE',tlinfo.OCCUPANCY_DATE);
402 END IF;
403
404 IF NOT ((tlinfo.EXPIRATION_DATE = X_EXPIRATION_DATE)
405 OR ((tlinfo.EXPIRATION_DATE IS NULL) AND (X_EXPIRATION_DATE IS NULL))) THEN
406 pn_var_rent_pkg.lock_row_exception('EXPIRATION_DATE',tlinfo.EXPIRATION_DATE);
407 END IF;
408
409 IF NOT ((tlinfo.ASSIGNABLE_FLAG = X_ASSIGNABLE_FLAG)
410 OR ((tlinfo.ASSIGNABLE_FLAG IS NULL) AND (X_ASSIGNABLE_FLAG IS NULL))) THEN
411 pn_var_rent_pkg.lock_row_exception('ASSIGNABLE_FLAG',tlinfo.ASSIGNABLE_FLAG);
412 END IF;
413
414 IF NOT ((tlinfo.SUBLEASEABLE_FLAG = X_SUBLEASEABLE_FLAG)
415 OR ((tlinfo.SUBLEASEABLE_FLAG IS NULL) AND (X_SUBLEASEABLE_FLAG IS NULL))) THEN
416 pn_var_rent_pkg.lock_row_exception('SUBLEASEABLE_FLAG',tlinfo.SUBLEASEABLE_FLAG);
417 END IF;
418
419 IF NOT ((tlinfo.TENANTS_PROPORTIONATE_SHARE = X_TENANTS_PROPORTIONATE_SHARE)
420 OR ((tlinfo.TENANTS_PROPORTIONATE_SHARE IS NULL) AND (X_TENANTS_PROPORTIONATE_SHARE IS NULL))) THEN
421 pn_var_rent_pkg.lock_row_exception('TENANTS_PROPORTIONATE_SHARE',tlinfo.TENANTS_PROPORTIONATE_SHARE);
422 END IF;
423
424 IF NOT ((tlinfo.STATUS = X_STATUS)
425 OR ((tlinfo.STATUS IS NULL) AND (X_STATUS IS NULL))) THEN
426 pn_var_rent_pkg.lock_row_exception('STATUS',tlinfo.STATUS);
427 END IF;
428
429 IF NOT ((tlinfo.ATTRIBUTE_CATEGORY = X_ATTRIBUTE_CATEGORY)
430 OR ((tlinfo.ATTRIBUTE_CATEGORY IS NULL) AND (X_ATTRIBUTE_CATEGORY IS NULL))) THEN
431 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE_CATEGORY',tlinfo.ATTRIBUTE_CATEGORY);
432 END IF;
433
434 IF NOT ((tlinfo.ATTRIBUTE1 = X_ATTRIBUTE1)
435 OR ((tlinfo.ATTRIBUTE1 IS NULL) AND (X_ATTRIBUTE1 IS NULL))) THEN
436 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE1',tlinfo.ATTRIBUTE1);
437 END IF;
438
439 IF NOT ((tlinfo.ATTRIBUTE2 = X_ATTRIBUTE2)
440 OR ((tlinfo.ATTRIBUTE2 IS NULL) AND (X_ATTRIBUTE2 IS NULL))) THEN
441 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE2',tlinfo.ATTRIBUTE2);
442 END IF;
443
444 IF NOT ((tlinfo.ATTRIBUTE3 = X_ATTRIBUTE3)
445 OR ((tlinfo.ATTRIBUTE3 IS NULL) AND (X_ATTRIBUTE3 IS NULL))) THEN
446 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE3',tlinfo.ATTRIBUTE3);
447 END IF;
448
449 IF NOT ((tlinfo.ATTRIBUTE4 = X_ATTRIBUTE4)
450 OR ((tlinfo.ATTRIBUTE4 IS NULL) AND (X_ATTRIBUTE4 IS NULL))) THEN
451 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE4',tlinfo.ATTRIBUTE4);
452 END IF;
453
454 IF NOT ((tlinfo.ATTRIBUTE5 = X_ATTRIBUTE5)
455 OR ((tlinfo.ATTRIBUTE5 IS NULL) AND (X_ATTRIBUTE5 IS NULL))) THEN
456 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE5',tlinfo.ATTRIBUTE5);
457 END IF;
458
459 IF NOT ((tlinfo.ATTRIBUTE6 = X_ATTRIBUTE6)
460 OR ((tlinfo.ATTRIBUTE6 IS NULL) AND (X_ATTRIBUTE6 IS NULL))) THEN
461 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE6',tlinfo.ATTRIBUTE6);
462 END IF;
463
464 IF NOT ((tlinfo.ATTRIBUTE7 = X_ATTRIBUTE7)
465 OR ((tlinfo.ATTRIBUTE7 IS NULL) AND (X_ATTRIBUTE7 IS NULL))) THEN
466 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE7',tlinfo.ATTRIBUTE7);
467 END IF;
468
469 IF NOT ((tlinfo.ATTRIBUTE8 = X_ATTRIBUTE8)
473
470 OR ((tlinfo.ATTRIBUTE8 IS NULL) AND (X_ATTRIBUTE8 IS NULL))) THEN
471 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE8',tlinfo.ATTRIBUTE8);
472 END IF;
474 IF NOT ((tlinfo.ATTRIBUTE9 = X_ATTRIBUTE9)
475 OR ((tlinfo.ATTRIBUTE9 IS NULL) AND (X_ATTRIBUTE9 IS NULL))) THEN
476 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE9',tlinfo.ATTRIBUTE9);
477 END IF;
478
479 IF NOT ((tlinfo.ATTRIBUTE10 = X_ATTRIBUTE10)
480 OR ((tlinfo.ATTRIBUTE10 IS NULL) AND (X_ATTRIBUTE10 IS NULL))) THEN
481 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE10',tlinfo.ATTRIBUTE10);
482 END IF;
483
484 IF NOT ((tlinfo.ATTRIBUTE11 = X_ATTRIBUTE11)
485 OR ((tlinfo.ATTRIBUTE11 IS NULL) AND (X_ATTRIBUTE11 IS NULL))) THEN
486 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE11',tlinfo.ATTRIBUTE11);
487 END IF;
488
489 IF NOT ((tlinfo.ATTRIBUTE12 = X_ATTRIBUTE12)
490 OR ((tlinfo.ATTRIBUTE12 IS NULL) AND (X_ATTRIBUTE12 IS NULL))) THEN
491 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE12',tlinfo.ATTRIBUTE12);
492 END IF;
493
494 IF NOT ((tlinfo.ATTRIBUTE13 = X_ATTRIBUTE13)
495 OR ((tlinfo.ATTRIBUTE13 IS NULL) AND (X_ATTRIBUTE13 IS NULL))) THEN
496 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE13',tlinfo.ATTRIBUTE13);
497 END IF;
498
499 IF NOT ((tlinfo.ATTRIBUTE14 = X_ATTRIBUTE14)
500 OR ((tlinfo.ATTRIBUTE14 IS NULL) AND (X_ATTRIBUTE14 IS NULL))) THEN
501 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE14',tlinfo.ATTRIBUTE14);
502 END IF;
503
504 IF NOT ((tlinfo.ATTRIBUTE15 = X_ATTRIBUTE15)
505 OR ((tlinfo.ATTRIBUTE15 IS NULL) AND (X_ATTRIBUTE15 IS NULL))) THEN
506 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE15',tlinfo.ATTRIBUTE15);
507 END IF;
508
509 IF NOT ((tlinfo.RECOVERY_TYPE_CODE = X_RECOVERY_TYPE_CODE)
510 OR ((tlinfo.RECOVERY_TYPE_CODE IS NULL) AND (X_RECOVERY_TYPE_CODE IS NULL))) THEN
511 pn_var_rent_pkg.lock_row_exception('RECOVERY_TYPE_CODE',tlinfo.RECOVERY_TYPE_CODE);
512 END IF;
513
514 IF NOT ((tlinfo.RECOVERY_SPACE_STD_CODE = X_RECOVERY_SPACE_STD_CODE)
515 OR ((tlinfo.RECOVERY_SPACE_STD_CODE IS NULL) AND (X_RECOVERY_SPACE_STD_CODE IS NULL))) THEN
516 pn_var_rent_pkg.lock_row_exception('RECOVERY_SPACE_STD_CODE',tlinfo.RECOVERY_SPACE_STD_CODE);
517 END IF;
518
519 IF NOT ((tlinfo.FIN_OBLIG_END_DATE = X_FIN_OBLIG_END_DATE)
520 OR ((tlinfo.FIN_OBLIG_END_DATE IS NULL) AND (X_FIN_OBLIG_END_DATE IS NULL))) THEN
521 pn_var_rent_pkg.lock_row_exception('FIN_OBLIG_END_DATE',tlinfo.FIN_OBLIG_END_DATE);
522 END IF;
523
524 IF NOT ((tlinfo.CUSTOMER_ID = X_CUSTOMER_ID)
525 OR ((tlinfo.CUSTOMER_ID IS NULL) AND (X_CUSTOMER_ID IS NULL))) THEN
526 pn_var_rent_pkg.lock_row_exception('CUSTOMER_ID',tlinfo.CUSTOMER_ID);
527 END IF;
528
529 IF NOT ((tlinfo.CUSTOMER_SITE_USE_ID = X_CUSTOMER_SITE_USE_ID)
530 OR ((tlinfo.CUSTOMER_SITE_USE_ID IS NULL) AND (X_CUSTOMER_SITE_USE_ID IS NULL))) THEN
531 pn_var_rent_pkg.lock_row_exception('CUSTOMER_SITE_USE_ID',tlinfo.CUSTOMER_SITE_USE_ID);
532 END IF;
533
534 IF NOT ((tlinfo.LEASE_RENTABLE_AREA = X_LEASE_RENTABLE_AREA)
535 OR ((tlinfo.LEASE_RENTABLE_AREA IS NULL) AND (X_LEASE_RENTABLE_AREA IS NULL))) THEN
536 pn_var_rent_pkg.lock_row_exception('LEASE_RENTABLE_AREA',tlinfo.LEASE_RENTABLE_AREA);
537 END IF;
538
539 IF NOT ((tlinfo.LEASE_USABLE_AREA = X_LEASE_USABLE_AREA)
540 OR ((tlinfo.LEASE_USABLE_AREA IS NULL) AND (X_LEASE_USABLE_AREA IS NULL))) THEN
541 pn_var_rent_pkg.lock_row_exception('LEASE_USABLE_AREA',tlinfo.LEASE_USABLE_AREA);
542 END IF;
543
544 IF NOT ((tlinfo.LEASE_ASSIGNABLE_AREA = X_LEASE_ASSIGNABLE_AREA)
545 OR ((tlinfo.LEASE_ASSIGNABLE_AREA IS NULL) AND (X_LEASE_ASSIGNABLE_AREA IS NULL))) THEN
546 pn_var_rent_pkg.lock_row_exception('LEASE_ASSIGNABLE_AREA',tlinfo.LEASE_ASSIGNABLE_AREA);
547 END IF;
548
549 IF NOT ((tlinfo.LEASE_LOAD_FACTOR = X_LEASE_LOAD_FACTOR)
550 OR ((tlinfo.LEASE_LOAD_FACTOR IS NULL) AND (X_LEASE_LOAD_FACTOR IS NULL))) THEN
551 pn_var_rent_pkg.lock_row_exception('LEASE_LOAD_FACTOR',tlinfo.LEASE_LOAD_FACTOR);
552 END IF;
553
554 pnp_debug_pkg.debug('PN_TENANCIES_PKG.LOCK_ROW (-)');
555
556 END Lock_Row;
557
558 -------------------------------------------------------------------------------
559 -- PROCDURE : Update_Row
560 -- INVOKED FROM : Update_Row procedure
561 -- PURPOSE : updates the row
562 -- HISTORY :
563 -- 11-SEP-02 STripathi o If returnStatus = 'W', return parameter
564 -- x_tenancy_ovelap_wrn 'Y' for Multi-Tenancy-Lease changes.
565 -- 16-JAN-02 Pooja Sidhu o bug#2730279 - Removed call to
566 -- pn_tenancies_pkg.check_unique_primary_location.
567 -- 04-DEC-04 ftanudja o Added 8 parameters for lease rentable area. 3257508.
568 -- 05-JUL-05 sdmahesh o Bug 4284035 - Replaced pn_tenancies with _ALL table.
569 -------------------------------------------------------------------------------
570 PROCEDURE Update_Row
571 (
572 X_TENANCY_ID IN NUMBER,
573 X_LOCATION_ID IN NUMBER,
574 X_LEASE_ID IN NUMBER,
575 X_LEASE_CHANGE_ID IN NUMBER,
576 X_TENANCY_USAGE_LOOKUP_CODE IN VARCHAR2,
577 X_PRIMARY_FLAG IN VARCHAR2,
578 X_ESTIMATED_OCCUPANCY_DATE IN DATE,
579 X_OCCUPANCY_DATE IN DATE,
580 X_EXPIRATION_DATE IN DATE,
581 X_ASSIGNABLE_FLAG IN VARCHAR2,
585 X_ALLOCATED_AREA IN NUMBER,
582 X_SUBLEASEABLE_FLAG IN VARCHAR2,
583 X_TENANTS_PROPORTIONATE_SHARE IN NUMBER,
584 X_ALLOCATED_AREA_PCT IN NUMBER,
586 X_STATUS IN VARCHAR2,
587 X_ATTRIBUTE_CATEGORY IN VARCHAR2,
588 X_ATTRIBUTE1 IN VARCHAR2,
589 X_ATTRIBUTE2 IN VARCHAR2,
590 X_ATTRIBUTE3 IN VARCHAR2,
591 X_ATTRIBUTE4 IN VARCHAR2,
592 X_ATTRIBUTE5 IN VARCHAR2,
593 X_ATTRIBUTE6 IN VARCHAR2,
594 X_ATTRIBUTE7 IN VARCHAR2,
595 X_ATTRIBUTE8 IN VARCHAR2,
596 X_ATTRIBUTE9 IN VARCHAR2,
597 X_ATTRIBUTE10 IN VARCHAR2,
598 X_ATTRIBUTE11 IN VARCHAR2,
599 X_ATTRIBUTE12 IN VARCHAR2,
600 X_ATTRIBUTE13 IN VARCHAR2,
601 X_ATTRIBUTE14 IN VARCHAR2,
602 X_ATTRIBUTE15 IN VARCHAR2,
603 X_LAST_UPDATE_DATE IN DATE,
604 X_LAST_UPDATED_BY IN NUMBER,
605 X_LAST_UPDATE_LOGIN IN NUMBER,
606 X_TENANCY_OVELAP_WRN OUT NOCOPY VARCHAR2,
607 X_RECOVERY_TYPE_CODE IN VARCHAR2,
608 X_RECOVERY_SPACE_STD_CODE IN VARCHAR2,
609 X_FIN_OBLIG_END_DATE IN DATE,
610 X_CUSTOMER_ID IN NUMBER,
611 X_CUSTOMER_SITE_USE_ID IN NUMBER,
612 X_LEASE_RENTABLE_AREA IN NUMBER,
613 X_LEASE_USABLE_AREA IN NUMBER,
614 X_LEASE_ASSIGNABLE_AREA IN NUMBER,
615 X_LEASE_LOAD_FACTOR IN NUMBER,
616 X_LOCATION_RENTABLE_AREA IN NUMBER,
617 X_LOCATION_USABLE_AREA IN NUMBER,
618 X_LOCATION_ASSIGNABLE_AREA IN NUMBER,
619 X_LOCATION_LOAD_FACTOR IN NUMBER
620 )
621 IS
622
623 CURSOR c2 IS
624 SELECT *
625 FROM pn_tenancies_all
626 WHERE tenancy_id = x_tenancy_id;
627
628 recInfoForHist c2%ROWTYPE;
629
630 l_leaseStatus VARCHAR2(30) := NULL;
631 l_returnStatus VARCHAR2(30) := NULL;
632 BEGIN
633
634 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_ROW (+)');
635
636 x_tenancy_ovelap_wrn := NULL;
637
638 ---------------------------------------------------
639 -- Check tenancy dates
640 ---------------------------------------------------
641 l_returnStatus := NULL;
642 PN_TENANCIES_PKG.CHECK_TENANCY_DATES
643 (
644 l_returnStatus
645 ,X_ESTIMATED_OCCUPANCY_DATE
646 ,X_OCCUPANCY_DATE
647 ,X_EXPIRATION_DATE
648 );
649 IF (l_returnStatus IS NOT NULL) THEN
650 app_exception.Raise_Exception;
651 END IF;
652
653 ---------------------------------------------------
654 -- Check IF the tenancy dates overlap
655 ---------------------------------------------------
656 l_returnStatus := NULL;
657 PN_TENANCIES_PKG.CHECK_FOR_OVELAP_OF_TENANCY
658 (
659 l_returnStatus
660 ,X_TENANCY_ID
661 ,X_LOCATION_ID
662 ,X_LEASE_ID
663 ,X_ESTIMATED_OCCUPANCY_DATE
664 ,X_OCCUPANCY_DATE
665 ,X_EXPIRATION_DATE
666 );
667 IF (l_returnStatus = 'W') THEN
668 x_tenancy_ovelap_wrn := 'Y';
669 ELSIF (l_returnStatus IS NOT NULL) THEN
670 app_exception.Raise_Exception;
671 END IF;
672
673 ----------------------------------------------------
674 -- get the lease status
675 ----------------------------------------------------
676 l_leaseStatus := PNP_UTIL_FUNC.GET_LEASE_STATUS (X_LEASE_ID);
677
678 ---------------------------------------------------------------
679 -- We need to INsert the history row IF the lease IS finalised
680 ---------------------------------------------------------------
681 IF (l_leaseStatus = 'F') THEN
682
683 OPEN c2;
684 FETCH c2 INTO recInfoForHist;
685 IF (c2%NOTFOUND) THEN
686 CLOSE c2;
687 RAISE NO_DATA_FOUND;
688 END IF;
689 CLOSE c2;
690
691 IF (recInfoForHist.lease_change_id <> x_lease_change_id) THEN
692
693 INSERT INTO PN_TENANCIES_HISTORY
694 (
695 TENANCY_HISTORY_ID,
696 TENANCY_ID,
697 LAST_UPDATE_DATE,
698 LAST_UPDATED_BY,
699 CREATION_DATE,
700 CREATED_BY,
701 LAST_UPDATE_LOGIN,
702 LOCATION_ID,
703 LEASE_ID,
704 LEASE_CHANGE_ID,
705 NEW_LEASE_CHANGE_ID,
706 TENANCY_USAGE_LOOKUP_CODE,
707 PRIMARY_FLAG,
708 ESTIMATED_OCCUPANCY_DATE,
709 OCCUPANCY_DATE,
710 EXPIRATION_DATE,
711 ASSIGNABLE_FLAG,
712 SUBLEASEABLE_FLAG,
713 TENANTS_PROPORTIONATE_SHARE,
714 STATUS,
715 ATTRIBUTE_CATEGORY,
716 ATTRIBUTE1,
717 ATTRIBUTE2,
718 ATTRIBUTE3,
719 ATTRIBUTE4,
720 ATTRIBUTE5,
721 ATTRIBUTE6,
725 ATTRIBUTE10,
722 ATTRIBUTE7,
723 ATTRIBUTE8,
724 ATTRIBUTE9,
726 ATTRIBUTE11,
727 ATTRIBUTE12,
728 ATTRIBUTE13,
729 ATTRIBUTE14,
730 ATTRIBUTE15,
731 ORG_ID,
732 RECOVERY_TYPE_CODE,
733 RECOVERY_SPACE_STD_CODE,
734 FIN_OBLIG_END_DATE,
735 CUSTOMER_ID,
736 CUSTOMER_SITE_USE_ID,
737 LEASE_RENTABLE_AREA,
738 LEASE_USABLE_AREA,
739 LEASE_ASSIGNABLE_AREA,
740 LEASE_LOAD_FACTOR,
741 LOCATION_RENTABLE_AREA,
742 LOCATION_USABLE_AREA,
743 LOCATION_ASSIGNABLE_AREA,
744 LOCATION_LOAD_FACTOR
745 )
746 VALUES
747 (
748 pn_tenancies_history_s.NEXTVAL,
749 recInfoForHist.TENANCY_ID,
750 recInfoForHist.LAST_UPDATE_DATE,
751 recInfoForHist.LAST_UPDATED_BY,
752 recInfoForHist.CREATION_DATE,
753 recInfoForHist.CREATED_BY,
754 recInfoForHist.LAST_UPDATE_LOGIN,
755 recInfoForHist.LOCATION_ID,
756 recInfoForHist.LEASE_ID,
757 recInfoForHist.LEASE_CHANGE_ID,
758 X_LEASE_CHANGE_ID,
759 recInfoForHist.TENANCY_USAGE_LOOKUP_CODE,
760 recInfoForHist.PRIMARY_FLAG,
761 recInfoForHist.ESTIMATED_OCCUPANCY_DATE,
762 recInfoForHist.OCCUPANCY_DATE,
763 recInfoForHist.EXPIRATION_DATE,
764 recInfoForHist.ASSIGNABLE_FLAG,
765 recInfoForHist.SUBLEASEABLE_FLAG,
766 recInfoForHist.TENANTS_PROPORTIONATE_SHARE,
767 recInfoForHist.STATUS,
768 recInfoForHist.ATTRIBUTE_CATEGORY,
769 recInfoForHist.ATTRIBUTE1,
770 recInfoForHist.ATTRIBUTE2,
771 recInfoForHist.ATTRIBUTE3,
772 recInfoForHist.ATTRIBUTE4,
773 recInfoForHist.ATTRIBUTE5,
774 recInfoForHist.ATTRIBUTE6,
775 recInfoForHist.ATTRIBUTE7,
776 recInfoForHist.ATTRIBUTE8,
777 recInfoForHist.ATTRIBUTE9,
778 recInfoForHist.ATTRIBUTE10,
779 recInfoForHist.ATTRIBUTE11,
780 recInfoForHist.ATTRIBUTE12,
781 recInfoForHist.ATTRIBUTE13,
782 recInfoForHist.ATTRIBUTE14,
783 recInfoForHist.ATTRIBUTE15,
784 recInfoForHist.ORG_ID,
785 recInfoForHist.RECOVERY_TYPE_CODE,
786 recInfoForHist.RECOVERY_SPACE_STD_CODE,
787 recInfoForHist.FIN_OBLIG_END_DATE,
788 recInfoForHist.CUSTOMER_ID,
789 recInfoForHist.CUSTOMER_SITE_USE_ID,
790 recInfoForHist.LEASE_RENTABLE_AREA,
791 recInfoForHist.LEASE_USABLE_AREA,
792 recInfoForHist.LEASE_ASSIGNABLE_AREA,
793 recInfoForHist.LEASE_LOAD_FACTOR,
794 recInfoForHist.LOCATION_RENTABLE_AREA,
795 recInfoForHist.LOCATION_USABLE_AREA,
796 recInfoForHist.LOCATION_ASSIGNABLE_AREA,
797 recInfoForHist.LOCATION_LOAD_FACTOR
798 );
799 END IF;
800 END IF;
801
802 UPDATE pn_tenancies_all
803 SET LOCATION_ID = X_LOCATION_ID,
804 LEASE_CHANGE_ID = X_LEASE_CHANGE_ID,
805 TENANCY_USAGE_LOOKUP_CODE = X_TENANCY_USAGE_LOOKUP_CODE,
806 PRIMARY_FLAG = X_PRIMARY_FLAG,
807 ESTIMATED_OCCUPANCY_DATE = X_ESTIMATED_OCCUPANCY_DATE,
808 OCCUPANCY_DATE = X_OCCUPANCY_DATE,
809 EXPIRATION_DATE = X_EXPIRATION_DATE,
810 ASSIGNABLE_FLAG = X_ASSIGNABLE_FLAG,
811 SUBLEASEABLE_FLAG = X_SUBLEASEABLE_FLAG,
812 TENANTS_PROPORTIONATE_SHARE = X_TENANTS_PROPORTIONATE_SHARE,
813 ALLOCATED_AREA_PCT = X_ALLOCATED_AREA_PCT,
814 ALLOCATED_AREA = X_ALLOCATED_AREA,
815 STATUS = X_STATUS,
816 ATTRIBUTE_CATEGORY = X_ATTRIBUTE_CATEGORY,
817 ATTRIBUTE1 = X_ATTRIBUTE1,
818 ATTRIBUTE2 = X_ATTRIBUTE2,
819 ATTRIBUTE3 = X_ATTRIBUTE3,
820 ATTRIBUTE4 = X_ATTRIBUTE4,
821 ATTRIBUTE5 = X_ATTRIBUTE5,
822 ATTRIBUTE6 = X_ATTRIBUTE6,
823 ATTRIBUTE7 = X_ATTRIBUTE7,
824 ATTRIBUTE8 = X_ATTRIBUTE8,
825 ATTRIBUTE9 = X_ATTRIBUTE9,
826 ATTRIBUTE10 = X_ATTRIBUTE10,
827 ATTRIBUTE11 = X_ATTRIBUTE11,
828 ATTRIBUTE12 = X_ATTRIBUTE12,
829 ATTRIBUTE13 = X_ATTRIBUTE13,
830 ATTRIBUTE14 = X_ATTRIBUTE14,
831 ATTRIBUTE15 = X_ATTRIBUTE15,
832 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
833 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
834 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
835 RECOVERY_TYPE_CODE = X_RECOVERY_TYPE_CODE,
836 RECOVERY_SPACE_STD_CODE = X_RECOVERY_SPACE_STD_CODE,
837 FIN_OBLIG_END_DATE = X_FIN_OBLIG_END_DATE,
841 LEASE_USABLE_AREA = X_LEASE_USABLE_AREA,
838 CUSTOMER_ID = X_CUSTOMER_ID,
839 CUSTOMER_SITE_USE_ID = X_CUSTOMER_SITE_USE_ID,
840 LEASE_RENTABLE_AREA = X_LEASE_RENTABLE_AREA,
842 LEASE_ASSIGNABLE_AREA = X_LEASE_ASSIGNABLE_AREA,
843 LEASE_LOAD_FACTOR = X_LEASE_LOAD_FACTOR,
844 LOCATION_RENTABLE_AREA = X_LOCATION_RENTABLE_AREA,
845 LOCATION_USABLE_AREA = X_LOCATION_USABLE_AREA,
846 LOCATION_ASSIGNABLE_AREA = X_LOCATION_ASSIGNABLE_AREA,
847 LOCATION_LOAD_FACTOR = X_LOCATION_LOAD_FACTOR
848 WHERE TENANCY_ID = X_TENANCY_ID ;
849
850 IF (SQL%NOTFOUND) THEN
851 RAISE NO_DATA_FOUND;
852 END IF;
853
854 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_ROW (-)');
855 END Update_Row;
856
857 -------------------------------------------------------------------------------
858 -- PROCDURE : Delete_Row
859 -- INVOKED FROM : Delete_Row procedure
860 -- PURPOSE : deletes the row
861 -- HISTORY :
862 -------------------------------------------------------------------------------
863 PROCEDURE Delete_Row
864 (
865 X_TENANCY_ID IN NUMBER
866 )
867 IS
868 BEGIN
869 pnp_debug_pkg.debug('PN_TENANCIES_PKG.DELETE_ROW (+)');
870
871 DELETE FROM pn_tenancies_all
872 WHERE tenancy_id = x_tenancy_id;
873
874 IF (SQL%NOTFOUND) THEN
875 RAISE NO_DATA_FOUND;
876 END IF;
877
878 pnp_debug_pkg.debug('PN_TENANCIES_PKG.DELETE_ROW (-)');
879 END Delete_Row;
880
881
882 -------------------------------------------------------------------------------
883 -- PROCDURE : CHECK_UNIQUE_PRIMARY_LOCATION
884 -- INVOKED FROM :
885 -- PURPOSE : checks unique primary location
886 -- HISTORY :
887 -------------------------------------------------------------------------------
888 PROCEDURE CHECK_UNIQUE_PRIMARY_LOCATION (
889 X_RETURN_STATUS IN OUT NOCOPY VARCHAR2
890 ,X_LEASE_ID IN NUMBER
891 ,X_TENANCY_ID IN NUMBER
892 )
893 IS
894 l_dummy NUMBER;
895 BEGIN
896 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_UNIQUE_PRIMARY_LOCATION (+)');
897 BEGIN
898 SELECT 1
899 INTO l_dummy
900 FROM DUAL
901 WHERE NOT EXISTS
902 (SELECT 1
903 FROM pn_tenancies_all pnt
904 WHERE pnt.lease_id = x_lease_id
905 AND pnt.status = 'A'
906 AND pnt.primary_flag = 'Y'
907 AND ((x_tenancy_id IS NULL) or (pnt.tenancy_id <> x_tenancy_id))
908 );
909
910 EXCEPTION
911 WHEN NO_DATA_FOUND THEN
912 fnd_message.set_name ('PN', 'PN_DUPLEASE_PRIMARY_TENANCY');
913 x_return_status := 'E';
914 END;
915
916 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_UNIQUE_PRIMARY_LOCATION (-)');
917 END CHECK_UNIQUE_PRIMARY_LOCATION;
918
919 -------------------------------------------------------------------------------
920 -- PROCDURE : CHECK_FOR_OVELAP_OF_TENANCY
921 -- INVOKED FROM :
922 -- PURPOSE : checks for overlap of tenancy
923 -- HISTORY :
924 -- 11-SEP-02 STripathi o If profile option PN_MULTIPLE_LEASE_FOR_LOCATION
925 -- is true, return_status should be W (warn) else
926 -- return_status is E (error) in Overlap exception
927 -- for Multi-Tenancy-Lease changes.
928 -- 30 OCT-02 graghuna o added group by to location code select.
929 -- 08-JUL-03 AKumar o Replaced calls to fnd_profile.get_value with
930 -- pn_mo_cache_utils.get_profile_value
931 -- 28-nov-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
932 -------------------------------------------------------------------------------
933 PROCEDURE CHECK_FOR_OVELAP_OF_TENANCY
934 (
935 X_RETURN_STATUS IN OUT NOCOPY VARCHAR2
936 ,X_TENANCY_ID IN NUMBER
937 ,X_LOCATION_ID IN NUMBER
938 ,X_LEASE_ID IN NUMBER
939 ,X_ESTIMATED_OCCUPANCY_DATE IN DATE
940 ,X_OCCUPANCY_DATE IN DATE
941 ,X_EXPIRATION_DATE IN DATE
942 )
943 IS
944
945 l_dummy NUMBER;
946 l_locationCode VARCHAR2(255) := NULL;
947 l_leaseNumber VARCHAR2(30) := NULL;
948 l_parentLeaseId NUMBER := NULL;
949 l_LeaseId NUMBER := NULL;
950
951 CURSOR org_cur IS
952 SELECT org_id
953 FROM pn_leases_all pnl
954 WHERE pnl.lease_id = x_lease_id;
955
956 l_org_id NUMBER;
957
958 BEGIN
959 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_FOR_OVELAP_OF_TENANCY (+)');
960
961 FOR rec IN org_cur LOOP
962 l_org_id := rec.org_id;
963 END LOOP;
964
965 -- we are selecting the location code for err condition
966 SELECT location_code
967 INTO l_locationCode
968 FROM pn_locations_all
969 WHERE location_id = x_location_id
970 AND ROWNUM < 2;
971
972 -- we need to find IF the lease has a master lease defined
976 WHERE pnl.lease_id = x_lease_id;
973 SELECT pnl.parent_lease_id
974 INTO l_parentLeaseId
975 FROM pn_leases_all pnl
977
978 ----------------------------------------------------------------
979 -- i.e. no master lease has been defined THEN it's a vanilla lease
980 ----------------------------------------------------------------
981
982 IF (l_parentLeaseId IS NULL) THEN
983
984 --------------------------------------------------------------
985 -- Check IF a parent location IS already tied to the lease IN
986 -- question AND the user tries to hookup a child location to the
987 -- same lease for the same time period. Issue an error. Bug: 920404
988 ---------------------------------------------------------------
989 BEGIN
990
991 SELECT pnt.lease_id
992 INTO l_LeaseId
993 FROM pn_tenancies_all pnt
994 WHERE pnt.status = 'A'
995 AND pnt.lease_id = x_lease_id
996 AND pnt.location_id IN
997 (SELECT b.parent_location_id
998 FROM pn_locations_all b
999 CONNECT BY b.location_id = PRIOR parent_location_id
1000 START WITH b.location_id = x_location_id
1001 )
1002 AND (TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1003 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1004 AND TRUNC (x_expiration_date)
1005 OR TRUNC(pnt.expiration_date)
1006 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1007 AND TRUNC (x_expiration_date)
1008 )
1009 AND ((x_tenancy_id IS NULL) OR (pnt.tenancy_id <> x_tenancy_id)
1010 )
1011 AND ROWNUM < 2;
1012
1013 fnd_message.set_name ('PN', 'PN_PARENT_LOC_IN_LEASE');
1014 x_return_status := 'E';
1015
1016 EXCEPTION
1017 WHEN NO_DATA_FOUND THEN -- IF no data was found THEN we don't worry
1018 NULL;
1019
1020 END;
1021
1022 ------------------------------------------------------------
1023 -- now check IF the dates clash for the location under any
1024 -- other lease other than this lease's sub-leases
1025 ------------------------------------------------------------
1026 BEGIN
1027
1028 SELECT lease_num
1029 INTO l_leaseNumber
1030 FROM pn_leases_all
1031 WHERE lease_id <> x_lease_id
1032 AND parent_lease_id IS NULL
1033 AND lease_id =
1034 (SELECT lease_id
1035 FROM pn_tenancies_all pnt
1036 WHERE pnt.status = 'A'
1037 AND pnt.location_id IN
1038 (SELECT a.location_id
1039 FROM pn_locations_all a
1040 CONNECT BY PRIOR a.parent_location_id = a.location_id
1041 START WITH a.location_id = x_location_id
1042 UNION ALL
1043 SELECT b.location_id
1044 FROM pn_locations_all b
1045 CONNECT BY PRIOR b.location_id = b.parent_location_id
1046 START WITH b.location_id = x_location_id
1047 )
1048 AND (TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1049 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1050 AND TRUNC (x_expiration_date)
1051 OR TRUNC(pnt.expiration_date)
1052 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1053 AND TRUNC (x_expiration_date)
1054 )
1055 AND ((x_tenancy_id IS NULL) OR (pnt.tenancy_id <> x_tenancy_id))
1056 AND ROWNUM < 2
1057 );
1058
1059
1060 IF nvl(pn_mo_cache_utils.get_profile_value('PN_MULTIPLE_LEASE_FOR_LOCATION',l_org_id),'N') <> 'Y' THEN
1061 fnd_message.set_name ('PN', 'PN_LEASE_TENANCY_OVERLAP');
1062 fnd_message.set_token ('LOCATION_CODE', l_locationCode);
1063 fnd_message.set_token ('LEASE_NUMBER', l_leaseNumber);
1064 x_return_status := 'E';
1065 ELSE
1066 x_return_status := 'W';
1067 END IF;
1068
1069 EXCEPTION
1070 WHEN NO_DATA_FOUND THEN
1071 -- IF no data was found THEN we don't worry
1072 NULL;
1073 END;
1074
1075 IF (x_return_status IS NULL) THEN
1076 BEGIN
1077 -- now check IF the new dates will create problem
1078 -- with dates IN su-leases for this lease
1079
1080 SELECT lease_num
1081 INTO l_leaseNumber
1082 FROM pn_leases_all
1083 WHERE parent_lease_id = x_lease_id
1084 AND lease_id =
1085 (SELECT lease_id
1086 FROM pn_tenancies_all pnt
1087 WHERE pnt.status = 'A'
1088 AND pnt.location_id IN
1089 (SELECT b.location_id
1090 FROM pn_locations_all b
1091 CONNECT BY PRIOR b.location_id = b.parent_location_id
1095 < TRUNC(NVL(x_occupancy_date, x_estimated_occupancy_date))
1092 START WITH b.location_id = x_location_id
1093 )
1094 AND (TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1096 OR TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1097 > TRUNC (x_expiration_date)
1098 OR TRUNC(pnt.expiration_date)
1099 < TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1100 OR TRUNC(pnt.expiration_date)
1101 > TRUNC (x_expiration_date)
1102 )
1103 AND ((x_tenancy_id IS NULL) OR (pnt.tenancy_id <> x_tenancy_id)
1104 )
1105 AND ROWNUM < 2
1106 );
1107
1108
1109 fnd_message.set_name ('PN', 'PN_LEASE_TENANCY_SUBLEASE_DT');
1110 fnd_message.set_token ('LOCATION_CODE', l_locationCode);
1111 fnd_message.set_token ('LEASE_NUMBER', l_leaseNumber);
1112 x_return_status := 'E';
1113
1114 EXCEPTION
1115 WHEN NO_DATA_FOUND THEN
1116 -- IF no data was found THEN we don't worry
1117 NULL;
1118 END;
1119 END IF;
1120
1121 -- i.e. master lease IS defined
1122 ELSE
1123 -- this SELECT will verify that the location EXISTS IN the
1124 -- parent lease AND the dates are within range
1125 BEGIN
1126 SELECT location_id
1127 INTO l_leaseNumber
1128 FROM pn_locations_all
1129 WHERE location_id = x_location_id
1130 AND location_id IN
1131 (SELECT b.location_id
1132 FROM pn_locations_all b
1133 CONNECT BY PRIOR b.location_id = b.parent_location_id
1134 START WITH b.location_id IN
1135 (SELECT pnt.location_id
1136 FROM pn_tenancies_all pnt
1137 WHERE pnt.status = 'A'
1138 AND pnt.lease_id = l_parentLeaseId
1139 AND (TRUNC(NVL(x_occupancy_date, x_estimated_occupancy_date))
1140 BETWEEN TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1141 AND TRUNC(pnt.expiration_date)
1142 AND TRUNC (x_expiration_date)
1143 BETWEEN TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1144 AND TRUNC(pnt.expiration_date)
1145 )
1146 )
1147 )
1148 AND ROWNUM < 2;
1149
1150 -- IF data was found THEN we don't worry
1151
1152 EXCEPTION
1153 WHEN NO_DATA_FOUND THEN
1154 fnd_message.set_name('PN', 'PN_LEASE_TENANCY_MASTER_NEXIST');
1155 fnd_message.set_token('LOCATION_CODE', l_locationCode);
1156 x_return_status := 'E';
1157 END;
1158
1159 -- only IF the location EXISTS IN the master and dates are
1160 -- perfect, now we need to check that it shouldn't overlap
1161 -- with any other lease or sublease
1162 IF (x_return_status IS NULL) THEN
1163
1164 BEGIN
1165 SELECT lease_num
1166 INTO l_leaseNumber
1167 FROM pn_leases_all
1168 WHERE lease_id =
1169 (SELECT lease_id
1170 FROM pn_tenancies_all pnt
1171 WHERE pnt.status = 'A'
1172 AND pnt.lease_id <> l_parentLeaseId
1173 AND pnt.location_id IN
1174 (SELECT a.location_id
1175 FROM pn_locations_all a
1176 CONNECT BY PRIOR a.parent_location_id = a.location_id
1177 START WITH a.location_id = x_location_id
1178 UNION ALL
1179 SELECT b.location_id
1180 FROM pn_locations_all b
1181 CONNECT BY PRIOR b.location_id = b.parent_location_id
1182 START WITH b.location_id = x_location_id
1183 )
1184 AND (TRUNC(NVL(pnt.occupancy_date, pnt.estimated_occupancy_date))
1185 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1186 AND TRUNC (x_expiration_date)
1187 OR TRUNC(pnt.expiration_date)
1188 BETWEEN TRUNC (NVL(x_occupancy_date, x_estimated_occupancy_date))
1189 AND TRUNC (x_expiration_date)
1190 )
1191 AND ((x_tenancy_id IS NULL) OR (pnt.tenancy_id <> x_tenancy_id))
1192 AND ROWNUM < 2
1193 );
1194
1195
1196 IF nvl(pn_mo_cache_utils.get_profile_value('PN_MULTIPLE_LEASE_FOR_LOCATION',l_org_id),'N') <> 'Y' THEN
1197 fnd_message.set_name ('PN', 'PN_LEASE_TENANCY_OVERLAP');
1198 fnd_message.set_token ('LOCATION_CODE', l_locationCode);
1199 fnd_message.set_token ('LEASE_NUMBER', l_leaseNumber);
1200 x_return_status := 'E';
1204
1201 ELSE
1202 x_return_status := 'W';
1203 END IF;
1205 EXCEPTION
1206 WHEN NO_DATA_FOUND THEN
1207 -- IF no data was found THEN we don't worry
1208 NULL;
1209 END;
1210 END IF;
1211
1212 END IF;
1213
1214 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_FOR_OVELAP_OF_TENANCY (-) X_RETURN_STATUS: '||X_RETURN_STATUS);
1215
1216 END check_for_ovelap_of_tenancy;
1217
1218 -------------------------------------------------------------------------------
1219 -- PROCDURE : check_tenancy_dates
1220 -- INVOKED FROM :
1221 -- PURPOSE : checks the tenancy dates
1222 -- HISTORY :
1223 -------------------------------------------------------------------------------
1224 PROCEDURE check_tenancy_dates
1225 (
1226 X_RETURN_STATUS IN OUT NOCOPY VARCHAR2
1227 ,X_ESTIMATED_OCCUPANCY_DATE IN DATE
1228 ,X_OCCUPANCY_DATE IN DATE
1229 ,X_EXPIRATION_DATE IN DATE
1230 )
1231 IS
1232 BEGIN
1233 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_TENANCY_DATES (+)');
1234
1235 IF (X_ESTIMATED_OCCUPANCY_DATE IS NULL) THEN
1236 fnd_message.set_name('PN', 'PN_LEASE_TENANCY_EST_DT_NULL');
1237 x_return_status := 'E';
1238
1239 ELSIF (X_EXPIRATION_DATE IS NULL) THEN
1240 fnd_message.set_name ('PN', 'PN_LEASE_TENANCY_EXP_DT_NULL');
1241 x_return_status := 'E';
1242
1243 ELSIF (TRUNC(NVL(x_occupancy_date, x_expiration_date)) > TRUNC(x_expiration_date)) THEN
1244
1245 fnd_message.set_name ('PN', 'PN_LEASE_TENANCY_EXP_GT_OCP_DT');
1246 x_return_status := 'E';
1247 END IF;
1248
1249
1250 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHECK_TENANCY_DATES (-)');
1251 END check_tenancy_dates;
1252
1253 -------------------------------------------------------------------------------
1254 -- FUNCTION : get_loc_type_code
1255 -- INVOKED FROM :
1256 -- PURPOSE : Retrieves location code type
1257 -- HISTORY :
1258 -- 05-DEC-2003 Satish Tripathi o Created for BUG# 3300697.
1259 -------------------------------------------------------------------
1260 FUNCTION get_loc_type_code
1261 (
1262 p_location_id IN NUMBER
1263 ,p_start_date IN DATE
1264 )
1265 RETURN VARCHAR2
1266 IS
1267 CURSOR get_location_type_csr IS
1268 SELECT location_code,
1269 location_type_lookup_code
1270 FROM pn_locations_all pnl
1271 WHERE pnl.location_id = p_location_id
1272 AND p_start_date BETWEEN pnl.active_start_date AND pnl.active_end_date;
1273
1274 l_location_code pn_locations_all.location_code%TYPE;
1275 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
1276
1277 BEGIN
1278 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_LOC_TYPE_CODE (+)');
1279
1280 OPEN get_location_type_csr;
1281 FETCH get_location_type_csr INTO l_location_code, l_loc_type_code;
1282 CLOSE get_location_type_csr;
1283
1284 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_LOC_TYPE_CODE (-) Loc_Type_Code: '||l_loc_type_code);
1285
1286 RETURN l_loc_type_code;
1287
1288 END get_loc_type_code;
1289
1290 -------------------------------------------------------------------
1291 -- FUNCTION: cust_assign_assoc_exp_area_dt
1292 -- 08-APR-2004 Satish Tripathi o Fixed for BUG# 3284799, Modified CURSOR chk_locked_area_exp_det
1293 -- where clause of pn_space_assign_cust_all to select all space
1294 -- assignments between the p_start/end date to check if its locked.
1295 -------------------------------------------------------------------
1296 FUNCTION cust_assign_assoc_exp_area_dt(
1297 p_tenancy_id IN NUMBER
1298 ,p_chk_locked IN BOOLEAN
1299 ,p_cust_assign_start_dt IN DATE DEFAULT NULL
1300 ,p_cust_assign_end_dt IN DATE DEFAULT NULL
1301 )
1302 RETURN BOOLEAN
1303 IS
1304 CURSOR chk_assoc_exp_area_dtl IS
1305 SELECT 'Y'
1306 FROM DUAL
1307 WHERE EXISTS (SELECT NULL
1308 FROM pn_space_assign_cust_all spc
1309 WHERE spc.tenancy_id = p_tenancy_id
1310 AND (EXISTS (SELECT NULL
1311 FROM pn_rec_arcl_dtl_all mst,
1312 pn_rec_arcl_dtlln_all dtl
1313 WHERE mst.area_class_dtl_id = dtl.area_class_dtl_id
1314 AND dtl.cust_space_assign_id = spc.cust_space_assign_id) OR
1315 EXISTS (SELECT NULL
1316 FROM pn_rec_expcl_dtl_all mst,
1317 pn_rec_expcl_dtlln_all dtl
1318 WHERE mst.expense_class_dtl_id = dtl.expense_class_dtl_id
1319 AND dtl.cust_space_assign_id = spc.cust_space_assign_id))
1320 );
1321
1322 CURSOR chk_locked_area_exp_det IS
1323 SELECT 'Y'
1324 FROM DUAL
1325 WHERE EXISTS (SELECT NULL
1326 FROM pn_space_assign_cust_all spc
1327 WHERE spc.tenancy_id = p_tenancy_id
1331 FROM pn_rec_arcl_dtl_all mst,
1328 AND (NVL(spc.cust_assign_end_date,p_cust_assign_end_dt) >= p_cust_assign_start_dt OR
1329 spc.cust_assign_start_date <= p_cust_assign_end_dt)
1330 AND (EXISTS (SELECT NULL
1332 pn_rec_arcl_dtlln_all dtl
1333 WHERE mst.area_class_dtl_id = dtl.area_class_dtl_id
1334 AND mst.status = 'LOCKED'
1335 AND dtl.cust_space_assign_id = spc.cust_space_assign_id) OR
1336 EXISTS (SELECT NULL
1337 FROM pn_rec_expcl_dtl_all mst,
1338 pn_rec_expcl_dtlln_all dtl
1339 WHERE mst.expense_class_dtl_id = dtl.expense_class_dtl_id
1340 AND mst.status = 'LOCKED'
1341 AND dtl.cust_space_assign_id = spc.cust_space_assign_id))
1342 );
1343
1344 l_exists VARCHAR2(1) :='N';
1345 l_return BOOLEAN := FALSE;
1346
1347 BEGIN
1348 IF p_chk_locked THEN
1349 OPEN chk_locked_area_exp_det;
1350 FETCH chk_locked_area_exp_det INTO l_exists;
1351 CLOSE chk_locked_area_exp_det;
1352 ELSE
1353 OPEN chk_assoc_exp_area_dtl;
1354 FETCH chk_assoc_exp_area_dtl INTO l_exists;
1355 CLOSE chk_assoc_exp_area_dtl;
1356 END IF;
1357
1358 IF l_exists = 'Y' THEN
1359 l_return := TRUE;
1360 END IF;
1361 RETURN l_return;
1362
1363 END cust_assign_assoc_exp_area_dt;
1364
1365 -------------------------------------------------------------------
1366 -- PROCEDURE : GET_LOC_INFO
1367 -- DESCRIPTION: o populate loc_info_tbl with rows from pn_locations_all for a given location
1368 -- o if the assignable area for a location has not changed but the location
1369 -- was split the location records would be treated as a single record.
1370 -- Example:
1371 -- Rows in pn_locations_all
1372 -- active_st_dt active_end_dt assignable_area
1373 -- 01-JAN-00 31-DEC-00 1000
1374 -- 01-JAN-01 30-JUN-01 1000
1375 -- 01-JUL-00 31-DEC-01 2000
1376 --
1377 -- The following rows will be inserted in loc_info_tbl
1378 -- active_st_dt active_end_dt assignable_area
1379 -- 01-JAN-00 30-JUN-01 1000
1380 -- 01-JUL-00 31-DEC-01 2000
1381 --
1382 -- 10-JUN-2003 Pooja Sidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
1383 -- 26-AUG-2003 Satish Tripathi o Fixed for BUG# 3085758, Modified Where clause of CURSOR csr_loc_info
1384 -- with <= and >= instead of < and > to pick all locations within
1385 -- p_from_date and p_to_date.
1386 -------------------------------------------------------------------
1387
1388 PROCEDURE get_loc_info(
1389 p_location_id IN NUMBER
1390 ,p_from_date IN DATE
1391 ,p_to_date IN DATE
1392 ,p_loc_type_code OUT NOCOPY VARCHAR2
1393 )
1394 IS
1395 CURSOR csr_loc_info IS
1396 SELECT active_start_date,
1397 NVL(active_end_date, p_to_date) active_end_date,
1398 assignable_area,
1399 location_type_lookup_code
1400 FROM pn_locations_all
1401 WHERE location_id = p_location_id
1402 AND active_start_date <= p_to_date
1403 AND NVL(active_end_date, p_to_date) >= p_from_date
1404 ORDER BY active_start_date;
1405
1406 l_prior_assignable_area pn_locations_all.assignable_area%TYPE:=0;
1407 i NUMBER := 0;
1408
1409 BEGIN
1410 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_LOC_INFO (+)');
1411
1412 loc_info_tbl.delete;
1413
1414 FOR rec_loc_info IN csr_loc_info
1415 LOOP
1416 p_loc_type_code := rec_loc_info.location_type_lookup_code;
1417
1418 IF csr_loc_info%ROWCOUNT = 1 THEN
1419 loc_info_tbl(i).active_start_date := rec_loc_info.active_start_date;
1420 loc_info_tbl(i).active_end_date := rec_loc_info.active_end_date;
1421 loc_info_tbl(i).assignable_area := rec_loc_info.assignable_area;
1422 ELSE
1423 IF rec_loc_info.assignable_area = l_prior_assignable_area THEN
1424 loc_info_tbl(i).active_end_date := rec_loc_info.active_end_date;
1425 ELSE
1426 i := i + 1;
1427 loc_info_tbl(i).active_start_date := rec_loc_info.active_start_date;
1428 loc_info_tbl(i).active_end_date := rec_loc_info.active_end_date;
1429 loc_info_tbl(i).assignable_area := rec_loc_info.assignable_area;
1430 END IF;
1431 END IF;
1432 l_prior_assignable_area := rec_loc_info.assignable_area;
1433
1434 END LOOP;
1435 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_LOC_INFO (-)');
1436
1437 EXCEPTION
1438 WHEN OTHERS THEN
1439 pnp_debug_pkg.log('Get_loc_info - Errmsg: ' || sqlerrm);
1440 RAISE;
1441
1442 END get_loc_info;
1443
1444 -------------------------------------------------------------------
1448 -- 10-JUN-2003 Pooja Sidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
1445 -- PROCEDURE : GET_ALLOCATED_AREA_PCT
1446 -- DESCRIPTION:
1447 --
1449 -------------------------------------------------------------------
1450 PROCEDURE get_allocated_area_pct(
1451 p_cust_assign_start_date IN DATE
1452 ,p_cust_assign_end_date IN DATE
1453 ,p_allocated_area IN NUMBER
1454 ,p_alloc_area_pct OUT NOCOPY NUMBER
1455 )
1456 IS
1457 i NUMBER := 0;
1458 l_min_area NUMBER := -1;
1459 BEGIN
1460 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_ALLOCATED_AREA_PCT (+)');
1461
1462 p_alloc_area_pct := -1;
1463 FOR i IN 0 .. loc_info_tbl.count-1
1464 LOOP
1465 IF (p_cust_assign_start_date >= loc_info_tbl(i).active_start_date AND
1466 p_cust_assign_end_date <= loc_info_tbl(i).active_end_date)
1467 OR
1468 (p_cust_assign_start_date <= loc_info_tbl(i).active_end_date AND
1469 p_cust_assign_end_date >= loc_info_tbl(i).active_start_date)
1470 THEN
1471 IF p_allocated_area = 0 and loc_info_tbl(i).assignable_area = 0 THEN
1472 p_alloc_area_pct:= 100;
1473 ELSE
1474
1475 IF i = 0 OR loc_info_tbl(i).assignable_area < l_min_area THEN
1476 l_min_area := loc_info_tbl(i).assignable_area;
1477 END IF;
1478 END IF;
1479 END IF;
1480 END LOOP;
1481
1482 IF p_alloc_area_pct < 0 THEN
1483 p_alloc_area_pct := ROUND(((p_allocated_area * 100 )/l_min_area),2);
1484 END IF;
1485
1486 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_ALLOCATED_AREA_PCT (-)');
1487 END get_allocated_area_pct;
1488
1489 -------------------------------------------------------------------
1490 -- PROCEDURE : POPULATE_SPACE_ASSIGN_INFO
1491 -- DESCRIPTION: o Calls procedure pn_recovery_extract_pkg.process_vacancy to
1492 -- get available allocable area. The assignment record could be split
1493 -- based on the number of space and emp assignments existing for
1494 -- the location and if the assignable area has changed.
1495 -- o Populates space_assign_info_tbl with the start date, end date and
1496 -- allocated area that will be used to create space assignment record.
1497 --
1498 -- 10-JUN-2003 Pooja Sidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
1499 -- 05-AUG-2003 Satish Tripathi o Fixed for BUG# 3082056. Populate
1500 -- populate_space_assign_info for SECTION also.
1501 -- 22-AUG-2003 Satish Tripathi o Fixed for BUG# 3085758, Added parameter p_fin_oblig_end_date.
1502 -- For last space assignment record fin_oblig_end_date is
1503 -- p_fin_oblig_end_date, for others it will be cust_assign_end_date.
1504 -- 07-NOV-2003 Daniel Thota o Fix for bug # 3242535
1505 -- assigned l_loc_type_code to p_loc_type_code
1506 -------------------------------------------------------------------
1507 PROCEDURE populate_space_assign_info(
1508 p_location_id IN NUMBER
1509 ,p_from_date IN DATE
1510 ,p_to_date IN DATE
1511 ,p_fin_oblig_end_date IN DATE
1512 ,p_loc_type_code OUT NOCOPY VARCHAR2
1513 )
1514 IS
1515 CURSOR csr_cust_info IS
1516 SELECT cust_assign_start_date,
1517 NVL(cust_assign_end_date, p_to_date) cust_assign_end_date,
1518 allocated_area
1519 FROM pn_space_assign_cust_all
1520 WHERE location_id = p_location_id
1521 AND cust_assign_start_date <= p_to_date
1522 AND NVL(cust_assign_end_date, p_to_date) >= p_from_date;
1523
1524 CURSOR csr_emp_info IS
1525 SELECT emp_assign_start_date,
1526 NVL(emp_assign_end_date, p_to_date) emp_assign_end_date,
1527 allocated_area
1528 FROM pn_space_assign_emp_all
1529 WHERE location_id = p_location_id
1530 AND emp_assign_start_date <= p_to_date
1531 AND NVL(emp_assign_end_date, p_to_date) >= p_from_date;
1532
1533 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
1534 l_num_table pn_recovery_extract_pkg.number_table_TYPE;
1535 l_date_table pn_recovery_extract_pkg.date_table_TYPE;
1536 l_start_date DATE := NULL;
1537 l_end_date DATE := NULL;
1538 i NUMBER := 0;
1539 j NUMBER := 0;
1540
1541 BEGIN
1542 pnp_debug_pkg.debug('PN_TENANCIES_PKG.POPULATE_SPACE_ASSIGN_INFO (+)');
1543
1544 get_loc_info(p_location_id => p_location_id,
1545 p_from_date => p_from_date,
1546 p_to_date => p_to_date,
1547 p_loc_type_code => l_loc_type_code);
1548
1549 IF l_loc_type_code IN ('OFFICE', 'SECTION') THEN
1550
1551 FOR i IN 0 .. loc_info_tbl.count-1
1552 LOOP
1553 pn_recovery_extract_pkg.process_vacancy(
1554 p_start_date => loc_info_tbl(i).active_start_date,
1555 p_end_date => loc_info_tbl(i).active_end_date,
1556 p_area => loc_info_tbl(i).assignable_area,
1557 p_date_table => l_date_table,
1558 p_number_table => l_num_table,
1559 p_add => TRUE);
1560 END LOOP;
1564 pn_recovery_extract_pkg.process_vacancy(
1561
1562 FOR rec_cust_info IN csr_cust_info
1563 LOOP
1565 p_start_date => rec_cust_info.cust_assign_start_date,
1566 p_end_date => rec_cust_info.cust_assign_end_date,
1567 p_area => rec_cust_info.allocated_area,
1568 p_date_table => l_date_table,
1569 p_number_table => l_num_table,
1570 p_add => FALSE);
1571 END LOOP;
1572
1573 FOR rec_emp_info IN csr_emp_info
1574 LOOP
1575 pn_recovery_extract_pkg.process_vacancy(
1576 p_start_date => rec_emp_info.emp_assign_start_date,
1577 p_end_date => rec_emp_info.emp_assign_end_date,
1578 p_area => rec_emp_info.allocated_area,
1579 p_date_table => l_date_table,
1580 p_number_table => l_num_table,
1581 p_add => FALSE);
1582 END LOOP;
1583
1584 i := 0;
1585 space_assign_info_tbl.delete;
1586
1587 FOR i IN 0 .. l_date_table.count-1
1588 LOOP
1589 IF i = 0 THEN
1590 l_start_date := l_date_table(i);
1591 ELSE
1592 l_end_date := l_date_table(i)-1;
1593 IF l_end_date >= p_from_date and l_start_date <= p_to_date THEN
1594 space_assign_info_tbl(j).cust_assign_start_date := GREATEST(p_from_date, l_start_date);
1595 space_assign_info_tbl(j).cust_assign_end_date := LEAST(p_to_date, l_end_date);
1596
1597 IF i = l_date_table.count-1 THEN
1598 space_assign_info_tbl(j).fin_oblig_end_date := p_fin_oblig_end_date;
1599 ELSE
1600 space_assign_info_tbl(j).fin_oblig_end_date := LEAST(p_to_date, l_end_date);
1601 END IF;
1602
1603 space_assign_info_tbl(j).allocated_area := l_num_table(i-1);
1604 get_allocated_area_pct(
1605 p_cust_assign_start_date => space_assign_info_tbl(j).cust_assign_start_date,
1606 p_cust_assign_end_date => space_assign_info_tbl(j).cust_assign_end_date,
1607 p_allocated_area => space_assign_info_tbl(j).allocated_area,
1608 p_alloc_area_pct => space_assign_info_tbl(j).allocated_area_pct);
1609 l_start_date := l_date_table(i);
1610 j := j + 1;
1611 END IF;
1612 END IF;
1613 END LOOP;
1614
1615 ELSE
1616 space_assign_info_tbl(j).cust_assign_start_date := p_from_date;
1617 space_assign_info_tbl(j).cust_assign_end_date := p_to_date;
1618 space_assign_info_tbl(j).fin_oblig_end_date := p_fin_oblig_end_date;
1619 space_assign_info_tbl(j).allocated_area := NULL;
1620 space_assign_info_tbl(j).allocated_area_pct := NULL;
1621 END IF;
1622 p_loc_type_code := l_loc_type_code; -- 3242535
1623
1624 pnp_debug_pkg.debug('PN_TENANCIES_PKG.POPULATE_SPACE_ASSIGN_INFO (-)');
1625 EXCEPTION
1626 WHEN OTHERS THEN
1627 pnp_debug_pkg.log('Populate_space_assign_info - Errmsg: ' || sqlerrm);
1628 RAISE;
1629
1630 END populate_space_assign_info;
1631
1632 --------------------------------------------------------------------------------
1633 -- PROCEDURE : INSERT_SPACE_ASSIGN_ROW
1634 -- DESCRIPTION:
1635 --
1636 -- 10-JUN-03 PSidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
1637 -- 18-AUG-03 STripathi o Fixed for BUG# 3083849. Populate X_UTILIZED_AREA
1638 -- with default value 1.
1639 -- 22-AUG-03 STripathi o Fixed for BUG# 3085758, pass fin_oblig_end_date of PL/SQL
1640 -- table to x_fin_oblig_end_date.
1641 -- 08-NOV-03 STripathi o Fixed for BUG# 3242651. Call chk_dup_cust_assign to check
1642 -- duplicate assignment before insert_row pass DUP_ASSIGN in p_action.
1643 -- 05-MAR-04 ftanudja o Replaced call to chk_dup_cust_assign w/ exception handling.
1644 -- 28-Apr-04 vmmehta o BUG#3197182. Changed call to pn_space_assign_cust_pkg.insert_row
1645 -- Added parameter x_return_status and checking
1646 -- return_status rather than duplicate_exception.
1647 -------------------------------------------------------------------------------
1648 PROCEDURE insert_space_assign_row(
1649 p_location_id IN NUMBER
1650 ,p_lease_id IN NUMBER
1651 ,p_customer_id IN NUMBER
1652 ,p_cust_site_use_id IN NUMBER
1653 ,p_recovery_space_std_code IN VARCHAR2
1654 ,p_recovery_type_code IN VARCHAR2
1655 ,p_fin_oblig_end_date IN DATE
1656 ,p_tenancy_id IN NUMBER
1657 ,p_org_id IN NUMBER
1658 ,p_space_assign_info_tbl IN space_assign_info_type
1659 ,p_return_status OUT NOCOPY VARCHAR2
1660 )
1661 IS
1662 l_rowid ROWID := NULL;
1663 l_cust_space_assign_id NUMBER := NULL;
1664 i NUMBER := 0;
1665 BEGIN
1666 pnp_debug_pkg.debug('PN_TENANCIES_PKG.INSERT_SPACE_ASSIGN_ROW (+)');
1667
1668 i := 0;
1669 FOR i IN 0 .. p_space_assign_info_tbl.count-1
1670 LOOP
1671
1672 pn_space_assign_cust_pkg.insert_row(
1676 x_cust_account_id => p_customer_id,
1673 x_rowid => l_rowId,
1674 x_cust_space_assign_id => l_cust_space_assign_id,
1675 x_location_id => p_location_id,
1677 x_site_use_id => p_cust_site_use_id,
1678 x_expense_account_id => NULL,
1679 x_project_id => NULL,
1680 x_task_id => NULL,
1681 x_cust_assign_start_date => p_space_assign_info_tbl(i).cust_assign_start_date,
1682 x_cust_assign_end_date => p_space_assign_info_tbl(i).cust_assign_end_date,
1683 x_allocated_area_pct => p_space_assign_info_tbl(i).allocated_area_pct,
1684 x_allocated_area => p_space_assign_info_tbl(i).allocated_area,
1685 x_utilized_area => 1,
1686 x_fin_oblig_end_date => p_space_assign_info_tbl(i).fin_oblig_end_date,
1687 x_cust_space_comments => NULL,
1688 x_attribute_category => NULL,
1689 x_attribute1 => NULL,
1690 x_attribute2 => NULL,
1691 x_attribute3 => NULL,
1692 x_attribute4 => NULL,
1693 x_attribute5 => NULL,
1694 x_attribute6 => NULL,
1695 x_attribute7 => NULL,
1696 x_attribute8 => NULL,
1697 x_attribute9 => NULL,
1698 x_attribute10 => NULL,
1699 x_attribute11 => NULL,
1700 x_attribute12 => NULL,
1701 x_attribute13 => NULL,
1702 x_attribute14 => NULL,
1703 x_attribute15 => NULL,
1704 x_creation_date => SYSDATE,
1705 x_created_by => NVL(fnd_profile.value('USER_ID'),-1),
1706 x_last_update_date => SYSDATE,
1707 x_last_updated_by => NVL(fnd_profile.value('USER_ID'),-1),
1708 x_last_update_login => NVL(fnd_profile.value('USER_ID'),-1),
1709 x_org_id => p_org_id,
1710 x_lease_id => p_lease_id,
1711 x_recovery_space_std_code => p_recovery_space_std_code,
1712 x_recovery_type_code => p_recovery_type_code,
1713 x_tenancy_id => p_tenancy_id,
1714 x_return_status => p_return_status);
1715
1716 IF p_return_status = 'DUP_ASSIGN' THEN
1717 EXIT;
1718 END IF;
1719
1720 l_rowid := NULL;
1721 l_cust_space_assign_id := NULL;
1722 END LOOP;
1723
1724 pnp_debug_pkg.debug('PN_TENANCIES_PKG.INSERT_SPACE_ASSIGN_ROW (-)');
1725 END insert_space_assign_row;
1726
1727 -------------------------------------------------------------------
1728 -- PROCEDURE : GET_ALLOCATED_AREA
1729 -- DESCRIPTION:
1730 --
1731 -- 12-DEC-2006 Ram kumar o Created
1732 -------------------------------------------------------------------
1733 PROCEDURE get_allocated_area(
1734 p_cust_assign_start_date IN DATE
1735 ,p_cust_assign_end_date IN DATE
1736 ,p_allocated_area_pct IN NUMBER
1737 ,p_allocated_area OUT NOCOPY NUMBER
1738 )
1739 IS
1740 i NUMBER := 0;
1741 l_min_area NUMBER := -1;
1742 BEGIN
1743 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_ALLOCATED_AREA (+)');
1744
1745 p_allocated_area := -1;
1746 FOR i IN 0 .. loc_info_tbl.count-1
1747 LOOP
1748 IF p_cust_assign_start_date >= loc_info_tbl(i).active_start_date AND
1749 p_cust_assign_end_date <= loc_info_tbl(i).active_end_date
1750 THEN
1751 p_allocated_area:= ROUND(((p_allocated_area_pct * loc_info_tbl(i).assignable_area)/100),2);
1752 ELSIF (p_cust_assign_start_date <= loc_info_tbl(i).active_end_date AND
1753 p_cust_assign_end_date >= loc_info_tbl(i).active_start_date) THEN
1754
1755 IF i = 0 OR loc_info_tbl(i).assignable_area < l_min_area THEN
1756 l_min_area := loc_info_tbl(i).assignable_area;
1757 END IF;
1758 END IF;
1759 END LOOP;
1760 IF p_allocated_area < 0 THEN
1761 p_allocated_area := ROUND(((p_allocated_area_pct * l_min_area)/100),2);
1762 END IF;
1763 pnp_debug_pkg.debug('PN_TENANCIES_PKG.GET_ALLOCATED_AREA (-)');
1764 END get_allocated_area;
1765
1766 -------------------------------------------------------------------
1767 -- PROCEDURE : Manual_space_assign
1768 -- DESCRIPTION:
1769 --
1770 -- 12-DEC-03 Ram kumar o Created
1771 -------------------------------------------------------------------
1772
1773 PROCEDURE manual_space_assign(
1774 p_location_id IN NUMBER
1775 ,p_from_date IN DATE
1776 ,p_to_date IN DATE
1777 ,p_fin_oblig_end_date IN DATE
1778 ,p_allocated_pct IN NUMBER
1779 ,p_loc_type_code OUT NOCOPY VARCHAR2
1780 )
1781 IS
1782
1783 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
1784 l_num_table pn_recovery_extract_pkg.number_table_TYPE;
1788 i NUMBER := 0;
1785 l_date_table pn_recovery_extract_pkg.date_table_TYPE;
1786 l_start_date DATE := NULL;
1787 l_end_date DATE := NULL;
1789 j NUMBER := 0;
1790
1791 BEGIN
1792 pnp_debug_pkg.debug('PN_TENANCIES_PKG.MANUAL_SPACE_ASSIGN (+)');
1793
1794 get_loc_info(p_location_id => p_location_id,
1795 p_from_date => p_from_date,
1796 p_to_date => p_to_date,
1797 p_loc_type_code => l_loc_type_code);
1798
1799 IF l_loc_type_code IN ('OFFICE', 'SECTION') THEN
1800
1801 FOR i IN 0 .. loc_info_tbl.count-1
1802 LOOP
1803 pn_recovery_extract_pkg.process_vacancy(
1804 p_start_date => loc_info_tbl(i).active_start_date,
1805 p_end_date => loc_info_tbl(i).active_end_date,
1806 p_area => loc_info_tbl(i).assignable_area,
1807 p_date_table => l_date_table,
1808 p_number_table => l_num_table,
1809 p_add => TRUE);
1810 END LOOP;
1811
1812 i := 0;
1813 space_assign_info_tbl.delete;
1814
1815 FOR i IN 0 .. l_date_table.count-1
1816 LOOP
1817 IF i = 0 THEN
1818 l_start_date := l_date_table(i);
1819
1820 ELSE
1821 l_end_date := l_date_table(i)-1;
1822 IF l_end_date >= p_from_date and l_start_date <= p_to_date THEN
1823 space_assign_info_tbl(j).cust_assign_start_date := GREATEST(p_from_date, l_start_date);
1824 space_assign_info_tbl(j).cust_assign_end_date := LEAST(p_to_date, l_end_date);
1825
1826 IF i = l_date_table.count-1 THEN
1827 space_assign_info_tbl(j).fin_oblig_end_date := p_fin_oblig_end_date;
1828 ELSE
1829 space_assign_info_tbl(j).fin_oblig_end_date := LEAST(p_to_date, l_end_date);
1830 END IF;
1831 space_assign_info_tbl(j).allocated_area_pct := p_allocated_pct;
1832 get_allocated_area(
1833 p_cust_assign_start_date => space_assign_info_tbl(j).cust_assign_start_date,
1834 p_cust_assign_end_date => space_assign_info_tbl(j).cust_assign_end_date,
1835 p_allocated_area_pct => space_assign_info_tbl(j).allocated_area_pct,
1836 p_allocated_area => space_assign_info_tbl(j).allocated_area);
1837 j := j + 1;
1838 l_start_date := l_date_table(i);
1839 END IF;
1840 END IF;
1841 END LOOP;
1842
1843 ELSE
1844 space_assign_info_tbl(j).cust_assign_start_date := p_from_date;
1845 space_assign_info_tbl(j).cust_assign_end_date := p_to_date;
1846 space_assign_info_tbl(j).fin_oblig_end_date := p_fin_oblig_end_date;
1847 space_assign_info_tbl(j).allocated_area := NULL;
1848 space_assign_info_tbl(j).allocated_area_pct := NULL;
1849 END IF;
1850 p_loc_type_code := l_loc_type_code;
1851
1852 pnp_debug_pkg.debug('PN_TENANCIES_PKG.MANUAL_SPACE_ASSIGN (-)');
1853 EXCEPTION
1854 WHEN OTHERS THEN
1855 pnp_debug_pkg.log('Manual_space_assign - Errmsg: ' || sqlerrm);
1856 RAISE;
1857
1858 END manual_space_assign;
1859
1860 -------------------------------------------------------------------
1861 -- PROCEDURE : CHK_MULTI_TENANCY_PROFILE
1862 -- DESCRIPTION:
1863 --
1864 -- 10-JUN-03 PSidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
1865 -- 05-AUG-03 STripathi o Fixed for BUG# 3082056. Populate
1866 -- populate_space_assign_info for SECTION also.
1867 -- 22-AUG-03 STripathi o Fixed for BUG# 3085758, Added parameter p_fin_oblig_end_date.
1868 -- 04-NOV-03 DThota o Checking for profile option PN_AUTOMATIC_SPACE_DISTRIBUTION
1869 -- for split and redistribute of assignment records
1870 -- 05-NOV-03 STripathi o Modified CURSOR csr_assign_exists to check for any
1871 -- tenancy for the same location in other non-Direct lease
1872 -- 07-NOV-03 DThota o Fix for bug # 3242535
1873 -- assigned l_loc_type_code to p_loc_type_code
1874 -- 10-NOV-03 DThota o Fix for bug # 3194380
1875 -- New cusrsor csr_space_exists checks to see if assignable area
1876 -- in pn_locations_all is non-zero for a given assignment time period
1877 -- Returning if there is no vacancy, overlap or assignable_area in locations is
1878 -- non-zero regardless of PN_AUTOMATIC_SPACE_DISTRIBUTION setting.
1879 -- 21-NOV-03 STripathi o Fixed BUG# 3263503, Removed return; CLOSE csr_space_exists; in
1880 -- csr_space_exists and EXIT; in space_assign_info_tbl for NOVACANT.
1881 -- 14-JAN-04 STripathi o Fixed BUG# 3359371, Call pnp_util_func.Get_Location_Type_Lookup_Code
1882 -- with p_cust_assign_start_dt as as_of_date.
1883 -- 08-APR-04 STripathi o Fixed for BUG# 3533405, Modified CURSOR csr_assign_exists
1884 -- added ten.str_dt <= p_assgn_end_dt and ten.end_dt >= p_assgn_str_dt
1885 -- to check tenancy other exist betn assgn str and end dt.
1886 -- 28-NOV-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
1887 -------------------------------------------------------------------
1888 PROCEDURE chk_multi_tenancy_profile(
1889 p_location_id IN NUMBER
1890 ,p_lease_id IN NUMBER
1891 ,p_cust_assign_start_dt IN DATE
1895 ,p_fin_oblig_end_date IN DATE
1892 ,p_cust_assign_end_dt IN DATE
1893 ,p_old_cust_assign_start_dt IN DATE
1894 ,p_old_cust_assign_end_dt IN DATE
1896 ,p_chk_vacancy IN BOOLEAN
1897 ,p_count IN NUMBER
1898 ,p_action OUT NOCOPY VARCHAR2
1899 ,p_loc_type_code OUT NOCOPY VARCHAR2
1900 )
1901 IS
1902 CURSOR csr_assign_exists IS
1903 SELECT 'Y'
1904 FROM DUAl
1905 WHERE EXISTS (SELECT NULL
1906 FROM pn_leases_all pnl,
1907 pn_tenancies_all ten
1908 WHERE pnl.lease_id <> p_lease_id
1909 AND pnl.lease_class_code <> 'DIRECT'
1910 AND pnl.lease_id = ten.lease_id
1911 AND ten.location_id = p_location_id
1912 AND NVL(ten.estimated_occupancy_date, ten.occupancy_date)
1913 <= p_cust_assign_end_dt
1914 AND ten.expiration_date >= p_cust_assign_start_dt
1915 );
1916
1917 CURSOR csr_space_exists IS
1918 SELECT 'Y'
1919 FROM DUAl
1920 WHERE EXISTS (SELECT NULL
1921 from pn_locations_all pl
1922 where pl.location_id = p_location_id
1923 and pl.assignable_area = 0
1924 and pl.active_start_date <= nvl(p_cust_assign_end_dt,to_date('12/31/4712','MM/DD/YYYY'))
1925 and pl.active_end_date >= p_cust_assign_start_dt);
1926
1927 l_multi_tenancy_profile VARCHAR2(100);
1928 l_exists VARCHAR2(1) := 'N';
1929 l_loc_type_lookup_code VARCHAR2(30) := pnp_util_func.Get_Location_Type_Lookup_Code(p_location_id, p_cust_assign_start_dt);
1930 i NUMBER := 0;
1931 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
1932 l_auto_space_assign VARCHAR2(30);
1933
1934 CURSOR org_cur IS
1935 SELECT org_id
1936 FROM pn_leases_all pnl
1937 WHERE pnl.lease_id = p_lease_id;
1938
1939 l_org_id NUMBER;
1940
1941
1942 BEGIN
1943 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHK_MULTI_TENANCY_PROFILE (+)');
1944
1945 FOR rec IN org_cur LOOP
1946 l_org_id := rec.org_id;
1947 END LOOP;
1948
1949 l_multi_tenancy_profile := NVL( pn_mo_cache_utils.get_profile_value('PN_MULTIPLE_LEASE_FOR_LOCATION',l_org_id),'N');
1950 l_auto_space_assign := NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N');
1951
1952 p_action := NULL;
1953 space_assign_info_tbl.delete;
1954
1955 IF l_multi_tenancy_profile = 'N' THEN
1956 OPEN csr_assign_exists;
1957 FETCH csr_assign_exists INTO l_exists;
1958 CLOSE csr_assign_exists;
1959 IF l_exists = 'Y' THEN
1960 p_action := 'OVERLAP';
1961 return;
1962 END IF;
1963 END IF;
1964
1965 /* Check to see whether location assignable area is zero for the duration of the space assignment */
1966
1967 OPEN csr_space_exists;
1968 FETCH csr_space_exists INTO l_exists;
1969 IF csr_space_exists%FOUND THEN
1970 p_action := 'NOVACANT';
1971 END IF;
1972 CLOSE csr_space_exists;
1973
1974 IF l_auto_space_assign = 'N' AND p_chk_vacancy AND
1975 l_loc_type_lookup_code IN ('OFFICE', 'SECTION')
1976 THEN
1977 populate_space_assign_info(
1978 p_location_id => p_location_id
1979 ,p_from_date => p_cust_assign_start_dt
1980 ,p_to_date => p_cust_assign_end_dt
1981 ,p_fin_oblig_end_date => p_fin_oblig_end_date
1982 ,p_loc_type_code => l_loc_type_code
1983 );
1984
1985 FOR i IN 0..space_assign_info_tbl.count-1
1986 LOOP
1987 IF space_assign_info_tbl(i).allocated_area = 0 THEN
1988 IF p_count = 0 THEN
1989 p_action := 'NOVACANT';
1990 ELSIF (p_old_cust_assign_start_dt > space_assign_info_tbl(i).cust_assign_start_date AND
1991 p_old_cust_assign_end_dt > space_assign_info_tbl(i).cust_assign_end_date) OR
1992 (p_old_cust_assign_end_dt < space_assign_info_tbl(i).cust_assign_end_date AND
1993 p_old_cust_assign_start_dt < space_assign_info_tbl(i).cust_assign_start_date) THEN --???
1994 p_action := 'NOVACANT';
1995 END IF;
1996 END IF;
1997 END LOOP;
1998
1999 END IF;
2000 p_loc_type_code := l_loc_type_code; -- 3242535
2001
2002 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CHK_MULTI_TENANCY_PROFILE (-)');
2003 END chk_multi_tenancy_profile;
2004
2005 -------------------------------------------------------------------------------
2006 -- PROCEDURE : CREATE_AUTO_SPACE_ASSIGN
2007 -- DESCRIPTION:
2008 --
2009 -- 10-JUN-03 PSidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
2010 -- 22-AUG-03 STripathi o Fixed for BUG# 3085758, Added parameter p_fin_oblig_end_date
2011 -- when calling chk_multi_tenancy_profile and populate_space_assign_info.
2012 -- 04-NOV-03 DThota o Checking for profile option PN_AUTOMATIC_SPACE_DISTRIBUTION
2016 -- 21-NOV-03 STripathi o Fixed BUG# 3263503, IN IF clause, Removed NOVACANT to return;
2013 -- for split and redistribute of assignment records
2014 -- 06-NOV-03 STripathi o Call assignment_split only for OFFICE and SECTION.
2015 -- 08-NOV-03 STripathi o Fixed for BUG# 3242651. Pass DUP_ASSIGN for dup assign in p_action.
2017 -- Now return only for OVERLAP instead of OVERLAP and NOVACANT.
2018 -- 09-MAR-05 ftanudja o Added start and end date for assignment_split. #4199297
2019 -- 28-NOV-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
2020 -------------------------------------------------------------------------------
2021 PROCEDURE create_auto_space_assign(
2022 p_location_id IN NUMBER
2023 ,p_lease_id IN NUMBER
2024 ,p_customer_id IN NUMBER
2025 ,p_cust_site_use_id IN NUMBER
2026 ,p_cust_assign_start_dt IN DATE
2027 ,p_cust_assign_end_dt IN DATE
2028 ,p_recovery_space_std_code IN VARCHAR2
2029 ,p_recovery_type_code IN VARCHAR2
2030 ,p_fin_oblig_end_date IN DATE
2031 ,p_allocated_pct IN NUMBER
2032 ,p_tenancy_id IN NUMBER
2033 ,p_org_id IN NUMBER
2034 ,p_action OUT NOCOPY VARCHAR2
2035 ,p_msg OUT NOCOPY VARCHAR2
2036 )
2037 IS
2038
2039 i NUMBER :=0;
2040 l_rowid ROWID := NULL;
2041 l_cust_space_assign_id NUMBER := NULL;
2042 space_assign_tbl space_assign_info_type;
2043 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
2044 l_return_status VARCHAR2(20) := NULL;
2045 l_auto_space_dist VARCHAR2(20) := NULL;
2046
2047 CURSOR org_cur IS
2048 SELECT org_id
2049 FROM pn_leases_all pnl
2050 WHERE pnl.lease_id = p_lease_id;
2051
2052 l_org_id NUMBER;
2053
2054 BEGIN
2055
2056 FOR rec IN org_cur LOOP
2057 l_org_id := rec.org_id;
2058 END LOOP;
2059
2060 l_auto_space_dist := NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N');
2061 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CREATE_AUTO_SPACE_ASSIGN (+) Auto_Space_Dist: '
2062 ||l_auto_space_dist);
2063
2064 IF p_customer_id IS NULL THEN
2065 RETURN;
2066 END IF;
2067
2068 chk_multi_tenancy_profile(
2069 p_location_id => p_location_id
2070 ,p_lease_id => p_lease_id
2071 ,p_cust_assign_start_dt => p_cust_assign_start_dt
2072 ,p_cust_assign_end_dt => p_cust_assign_end_dt
2073 ,p_old_cust_assign_start_dt => p_cust_assign_start_dt
2074 ,p_old_cust_assign_end_dt => p_cust_assign_end_dt
2075 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2076 ,p_chk_vacancy => TRUE
2077 ,p_count => 0
2078 ,p_action => p_action
2079 ,p_loc_type_code => l_loc_type_code
2080 );
2081
2082 IF p_action IN ('OVERLAP') THEN
2083 RETURN;
2084 END IF;
2085
2086 IF space_assign_info_tbl.count = 0 THEN
2087 populate_space_assign_info(
2088 p_location_id => p_location_id
2089 ,p_from_date => p_cust_assign_start_dt
2090 ,p_to_date => p_cust_assign_end_dt
2091 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2092 ,p_loc_type_code => l_loc_type_code
2093 );
2094 END IF;
2095
2096 space_assign_tbl := space_assign_info_tbl;
2097
2098 IF NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N') = 'N' THEN
2099
2100 manual_space_assign (
2101 p_location_id => p_location_id
2102 ,p_from_date => p_cust_assign_start_dt
2103 ,p_to_date => p_cust_assign_end_dt
2104 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2105 ,p_allocated_pct => p_allocated_pct
2106 ,p_loc_type_code => l_loc_type_code
2107 );
2108 space_assign_tbl := space_assign_info_tbl;
2109
2110 END IF;
2111
2112 insert_space_assign_row (
2113 p_location_id => p_location_id
2114 ,p_lease_id => p_lease_id
2115 ,p_customer_id => p_customer_id
2116 ,p_cust_site_use_id => p_cust_site_use_id
2117 ,p_recovery_space_std_code => p_recovery_space_std_code
2118 ,p_recovery_type_code => p_recovery_type_code
2119 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2120 ,p_tenancy_id => p_tenancy_id
2124 );
2121 ,p_org_id => p_org_id
2122 ,p_space_assign_info_tbl => space_assign_info_tbl
2123 ,p_return_status => l_return_status
2125
2126 IF l_return_status IS NOT NULL THEN
2127 p_action := l_return_status;
2128 RETURN;
2129 END IF;
2130
2131 -- 110403
2132 IF NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N') = 'Y' AND
2133 l_loc_type_code IN ('OFFICE', 'SECTION')
2134 THEN
2135
2136 PN_SPACE_ASSIGN_CUST_PKG.assignment_split(
2137 p_location_id => p_location_id,
2138 p_start_date => p_cust_assign_start_dt,
2139 p_end_date => p_cust_assign_end_dt);
2140
2141 END IF;
2142
2143 pnp_debug_pkg.debug('PN_TENANCIES_PKG.CREATE_AUTO_SPACE_ASSIGN (-)');
2144 EXCEPTION
2145 WHEN OTHERS THEN
2146 p_msg := sqlerrm;
2147 pnp_debug_pkg.log('Create_auto_space_assign - Errmsg: ' || p_msg);
2148 RAISE;
2149
2150 END create_auto_space_assign;
2151
2152 -------------------------------------------------------------------------------
2153 -- PROCEDURE : DELETE_AUTO_SPACE_ASSIGN
2154 -- DESCRIPTION:
2155 --
2156 -- 10-JUN-03 PSidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
2157 -- 25-Nov-03 DThota o Added 2 parameters p_location_id and p_loc_type_code to
2158 -- delete_auto_space_assign. Added call to
2159 -- PN_SPACE_ASSIGN_CUST_PKG.assignment_split
2160 -- Fix for bug # 3282064
2161 -- 23-FEB-04 STripathi o Fixed for BUG# 3425167. Removed code for IF p_cust_assign_start_date
2162 -- IS NOT NULL AND p_cust_assign_end_date IS NOT NULL THEN.
2163 -- For a tenancy id, delete all space assgn records.
2164 -- 09-MAR-05 ftanudja o Added start and end date for assignment_split.#4199297
2165 -- 28-NOV-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
2166 -------------------------------------------------------------------------------
2167 PROCEDURE delete_auto_space_assign (
2168 p_tenancy_id IN NUMBER
2169 ,p_cust_assign_start_date IN DATE
2170 ,p_cust_assign_end_date IN DATE
2171 ,p_action OUT NOCOPY VARCHAR2
2172 ,p_location_id IN pn_locations_all.location_id%TYPE DEFAULT NULL
2173 ,p_loc_type_code IN pn_locations_all.location_type_lookup_code%TYPE DEFAULT NULL
2174 )
2175 IS
2176 l_count NUMBER := 0;
2177 l_del_count NUMBER := 0;
2178 l_auto_space_dist VARCHAR2(20) := NULL;
2179
2180 CURSOR org_cur IS
2181 SELECT org_id
2182 FROM pn_tenancies_all
2183 WHERE tenancy_id = p_tenancy_id;
2184
2185 l_org_id NUMBER;
2186
2187 BEGIN
2188
2189 FOR rec IN org_cur LOOP
2190 l_org_id := rec.org_id;
2191 END LOOP;
2192
2193 l_auto_space_dist := NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N');
2194 pnp_debug_pkg.debug('PN_TENANCIES_PKG.DELETE_AUTO_SPACE_ASSIGN (+) Auto_Space_Dist: '
2195 ||l_auto_space_dist||', TenancyId: '||p_tenancy_id);
2196
2197 DELETE FROM pn_rec_expcl_dtlln_all
2198 WHERE cust_space_assign_id IN (SELECT cust_space_assign_id
2199 FROM pn_space_assign_cust_all
2200 WHERE tenancy_id = p_tenancy_id);
2201 l_count := SQL%ROWCOUNT;
2202
2203 DELETE FROM pn_rec_arcl_dtlln_all
2204 WHERE cust_space_assign_id IN (SELECT cust_space_assign_id
2205 FROM pn_space_assign_cust_all
2206 WHERE tenancy_id = p_tenancy_id);
2207 l_count := SQL%ROWCOUNT + l_count;
2208
2209 DELETE FROM pn_space_assign_cust_all
2210 WHERE tenancy_id = p_tenancy_id;
2211 l_del_count := SQL%ROWCOUNT;
2212
2213 -- 3282064
2214 IF NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N') = 'Y' AND
2215 p_loc_type_code IN ('OFFICE', 'SECTION')
2216 THEN
2217
2218 PN_SPACE_ASSIGN_CUST_PKG.assignment_split(
2219 p_location_id => p_location_id,
2220 p_start_date => p_cust_assign_start_date,
2221 p_end_date => p_cust_assign_end_date);
2222
2223 END IF;
2224
2225 IF l_count > 0 THEN
2226 p_action := 'R';
2227 END IF;
2228
2229 pnp_debug_pkg.debug('PN_TENANCIES_PKG.DELETE_AUTO_SPACE_ASSIGN (-) Deleted '||l_del_count||
2230 ' Space Assgn Rows');
2231 EXCEPTION
2232 WHEN OTHERS THEN
2233 pnp_debug_pkg.log('Delete_auto_space_assign - Errmsg: ' || sqlerrm);
2234 RAISE;
2235 END delete_auto_space_assign;
2236
2237 --------------------------------------------------------------------------------
2238 -- PROCEDURE : UPDATE_AUTO_SPACE_ASSIGN
2239 -- DESCRIPTION:
2240 --
2241 -- 10-JUN-03 PSidhu o Created for Recovery (CAM) impact on Leases and Space Assignments.
2242 -- 22-AUG-03 STripathi o Rewritten procedure to fix BUG# 3085758. Added 5 parameters.
2243 -- 04-NOV-03 DThota o Checking for profile option PN_AUTOMATIC_SPACE_DISTRIBUTION
2244 -- for split and redistribute of assignment records
2245 -- 05-NOV-03 STripathi o Added check# 0, if no space assignment exists for the
2249 -- in Check# 3,4. Fix for BUG# 3242651, added return_status
2246 -- tenancy then Create new Space Assignment for that tenancy.
2247 -- 06-NOV-03 STripathi o Call assignment_split only for OFFICE and SECTION.
2248 -- 08-NOV-03 STripathi o Fixed for BUG# 3242617. Use NVL for the _old items
2250 -- for passing back DUP_ASSIGN for dup assign in p_action.
2251 -- 21-NOV-03 STripathi o Fixed BUG# 3263503, IN IF clause, Removed NOVACANT to return;
2252 -- Now return only for OVERLAP instead of OVERLAP and NOVACANT.
2253 -- 25-NOV-03 STripathi o Fix BUG# 3282064, Check chk_dup_cust_assign if customer is
2254 -- changed when updating space_assign (Check# 4).
2255 -- 25-NOV-03 STripathi o Fix BUG# 3300697, if loc_type_code is null, call get_loc_type_code.
2256 -- 09-MAR-05 ftanudja o Added start and end date for assignment_split. #4199297
2257 -- 28-NOV-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
2258 --------------------------------------------------------------------------------
2259 PROCEDURE update_auto_space_assign(
2260 p_location_id IN NUMBER
2261 ,p_lease_id IN NUMBER
2262 ,p_customer_id IN NUMBER
2263 ,p_cust_site_use_id IN NUMBER
2264 ,p_cust_assign_start_dt IN DATE
2265 ,p_cust_assign_end_dt IN DATE
2266 ,p_recovery_space_std_code IN VARCHAR2
2267 ,p_recovery_type_code IN VARCHAR2
2268 ,p_fin_oblig_end_date IN DATE
2269 ,p_allocated_pct IN NUMBER
2270 ,p_tenancy_id IN NUMBER
2271 ,p_org_id IN NUMBER
2272 ,p_location_id_old IN NUMBER
2273 ,p_customer_id_old IN NUMBER
2274 ,p_cust_site_use_id_old IN NUMBER
2275 ,p_cust_assign_start_dt_old IN DATE
2276 ,p_cust_assign_end_dt_old IN DATE
2277 ,p_recovery_space_std_code_old IN VARCHAR2
2278 ,p_recovery_type_code_old IN VARCHAR2
2279 ,p_fin_oblig_end_date_old IN DATE
2280 ,p_allocated_pct_old IN NUMBER
2281 ,p_action OUT NOCOPY VARCHAR2
2282 ,p_msg OUT NOCOPY VARCHAR2
2283 )
2284 IS
2285 CURSOR csr_min_cust_assign IS
2286 SELECT cust_space_assign_id,
2287 cust_assign_start_date,
2288 cust_assign_end_date,
2289 allocated_area
2290 FROM pn_space_assign_cust_all
2291 WHERE tenancy_id = p_tenancy_id
2292 AND cust_assign_start_date = (SELECT MIN(cust_assign_start_date)
2293 FROM pn_space_assign_cust_all
2294 WHERE tenancy_id = p_tenancy_id);
2295
2296 CURSOR csr_max_cust_assign IS
2297 SELECT cust_space_assign_id,
2298 cust_assign_start_date,
2299 cust_assign_end_date,
2300 allocated_area
2301 FROM pn_space_assign_cust_all
2302 WHERE tenancy_id = p_tenancy_id
2303 AND cust_assign_end_date = (SELECT MAX(cust_assign_end_date)
2304 FROM pn_space_assign_cust_all
2305 WHERE tenancy_id = p_tenancy_id);
2306
2307 CURSOR csr_spc_assign_exists IS
2308 SELECT 'Y'
2309 FROM DUAL
2310 WHERE EXISTS (SELECT NULL
2311 FROM pn_space_assign_cust_all
2312 WHERE tenancy_id = p_tenancy_id);
2313
2314 i NUMBER := 0;
2315 j NUMBER := 0;
2316 l_count NUMBER := 0;
2317 l_extend_assgn BOOLEAN := FALSE;
2318 l_allocated_area NUMBER := NULL;
2319 l_fin_oblig_end_date DATE := NULL;
2320 l_min_cust_start_date DATE := NULL;
2321 l_min_cust_end_date DATE := NULL;
2322 l_min_cust_assign_id NUMBER := NULL;
2323 l_max_cust_start_date DATE := NULL;
2324 l_max_cust_end_date DATE := NULL;
2325 l_max_cust_assign_id NUMBER := NULL;
2326 space_assign_tbl space_assign_info_type;
2327 l_exists VARCHAR2(1) := 'N';
2328 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
2329 l_StartOfTime DATE := TO_DATE('01010001','MMDDYYYY');
2330 l_return_status VARCHAR2(20) := NULL;
2331 l_auto_space_dist VARCHAR2(20) := NULL;
2332 l_cust_assign_start_date DATE := NULL;
2333 l_cust_assign_end_date DATE := NULL;
2334
2335
2336 CURSOR org_cur IS
2337 SELECT org_id
2338 FROM pn_tenancies_all
2339 WHERE tenancy_id = p_tenancy_id;
2340
2341 CURSOR cur_alloc_area IS
2345 WHERE tenancy_id = p_tenancy_id;
2342 SELECT cust_assign_start_date,
2343 cust_assign_end_date
2344 FROM pn_space_assign_cust_all
2346
2347 l_org_id NUMBER;
2348
2349 BEGIN
2350
2351 FOR rec IN org_cur LOOP
2352 l_org_id := rec.org_id;
2353 END LOOP;
2354
2355 l_auto_space_dist := NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N');
2356 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_AUTO_SPACE_ASSIGN (+) Auto_Space_Dist: '
2357 ||l_auto_space_dist);
2358 p_action := NULL;
2359
2360 OPEN csr_spc_assign_exists;
2361 FETCH csr_spc_assign_exists INTO l_exists;
2362 CLOSE csr_spc_assign_exists;
2363
2364 ----------------------------------------------------------------------------------------
2365 -- Check# 0. If Space Assignment for the tenancy do not exists,
2366 -- Create new Space Assignment for that tenancy.
2367 ----------------------------------------------------------------------------------------
2368 IF NVL(l_exists, 'N') = 'N' THEN
2369 create_auto_space_assign(
2370 p_location_id => p_location_id
2371 ,p_lease_id => p_lease_id
2372 ,p_customer_id => p_customer_id
2373 ,p_cust_site_use_id => p_cust_site_use_id
2374 ,p_cust_assign_start_dt => p_cust_assign_start_dt
2375 ,p_cust_assign_end_dt => p_cust_assign_end_dt
2376 ,p_recovery_space_std_code => p_recovery_space_std_code
2377 ,p_recovery_type_code => p_recovery_type_code
2378 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2379 ,p_allocated_pct => p_allocated_pct
2380 ,p_tenancy_id => p_tenancy_id
2381 ,p_org_id => p_org_id
2382 ,p_action => p_action
2383 ,p_msg => p_msg
2384 );
2385
2386 ----------------------------------------------------------------------------------------
2387 -- Check# 1. If Location is changed, check if assignment is associated with a locked
2388 -- Area or Expense Class in Recoveries. If yes then Stop.
2389 -- If not delete the assignment with old location and create a new assignment
2390 -- with the new location.
2391 ----------------------------------------------------------------------------------------
2392 ELSIF (p_location_id <> p_location_id_old) THEN
2393
2394 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 1: Location is changed.');
2395 ---------------------------------------------------------------------------------
2396 -- Check if the assignment is associated with a locked Area or Expense Class in
2397 -- Recoveries. If yes then Stop.
2398 ---------------------------------------------------------------------------------
2399 IF cust_assign_assoc_exp_area_dt(
2400 p_tenancy_id => p_tenancy_id
2401 ,p_chk_locked => TRUE
2402 ,p_cust_assign_start_dt => p_cust_assign_start_dt_old
2403 ,p_cust_assign_end_dt => p_cust_assign_end_dt_old
2404 )
2405 THEN
2406 p_action := 'S';
2407 RETURN;
2408 ELSE
2409
2410 ---------------------------------------------------------------------------------
2411 -- Check if the assignment is associated with a any Area or Expense Class in
2412 -- Recoveries. If yes then need to show message to regenerate Area/Expense class.
2413 ---------------------------------------------------------------------------------
2414 IF cust_assign_assoc_exp_area_dt(
2415 p_tenancy_id => p_tenancy_id
2416 ,p_chk_locked => FALSE
2417 )
2418 THEN
2419 p_action :='R';
2420 END IF;
2421
2422 ------------------------------------------------------------------------
2423 -- Delete the assignment with old location and create a new assignment.
2424 ------------------------------------------------------------------------
2425 delete_auto_space_assign(
2426 p_tenancy_id => p_tenancy_id
2427 ,p_cust_assign_start_date => p_cust_assign_start_dt_old
2428 ,p_cust_assign_end_date => p_cust_assign_end_dt_old
2429 ,p_action => p_action
2430 );
2431
2432 ------------------------------------------------------------------------
2433 -- Create a new assignment with the new location.
2434 ------------------------------------------------------------------------
2435 create_auto_space_assign(
2436 p_location_id => p_location_id
2437 ,p_lease_id => p_lease_id
2441 ,p_cust_assign_end_dt => p_cust_assign_end_dt
2438 ,p_customer_id => p_customer_id
2439 ,p_cust_site_use_id => p_cust_site_use_id
2440 ,p_cust_assign_start_dt => p_cust_assign_start_dt
2442 ,p_recovery_space_std_code => p_recovery_space_std_code
2443 ,p_recovery_type_code => p_recovery_type_code
2444 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2445 ,p_allocated_pct => p_allocated_pct
2446 ,p_tenancy_id => p_tenancy_id
2447 ,p_org_id => p_org_id
2448 ,p_action => p_action
2449 ,p_msg => p_msg
2450 );
2451 END IF;
2452
2453 ELSE
2454 ----------------------------------------------------------------------------------------
2455 -- Location is not changed.
2456 -- Check# 2. Are the tenancy start and end dates are changed. Following 4 case apply:
2457 -- 1. Tenancy Start date brought in.
2458 -- 2. Tenancy Start date expanded out.
2459 -- 3. Tenancy End date brought in.
2460 -- 4. Tenancy End date expanded out.
2461 ----------------------------------------------------------------------------------------
2462 IF (p_cust_assign_start_dt <> p_cust_assign_start_dt_old) OR
2463 (p_cust_assign_end_dt <> p_cust_assign_end_dt_old)
2464 THEN
2465
2466 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: Tenancy start/end dates are changed.');
2467 ---------------------------------------------------------------------------------
2468 -- Check if the assignment is associated with a any Area or Expense Class in
2469 -- Recoveries. If yes then need to show message to regenerate Area/Expense class.
2470 ---------------------------------------------------------------------------------
2471 IF cust_assign_assoc_exp_area_dt(
2472 p_tenancy_id => p_tenancy_id
2473 ,p_chk_locked => FALSE
2474 )
2475 THEN
2476 p_action :='R';
2477 END IF;
2478
2479 ---------------------------------------------------------------------------------
2480 -- 1. Tenancy Start date brought in.
2481 -- If the assignment is NOT associated with a any Area or Expense Class in
2482 -- Recoveries, remove all the assignments prior to new tenancy start date.
2483 ---------------------------------------------------------------------------------
2484 IF p_cust_assign_start_dt > p_cust_assign_start_dt_old THEN
2485
2486 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 1. Tenancy Start date brought in.');
2487
2488 IF cust_assign_assoc_exp_area_dt(
2489 p_tenancy_id => p_tenancy_id
2490 ,p_chk_locked => TRUE
2491 ,p_cust_assign_start_dt => p_cust_assign_start_dt_old
2492 ,p_cust_assign_end_dt => p_cust_assign_end_dt_old
2493 )
2494 THEN
2495 p_action := 'S';
2496 RETURN;
2497 ELSE
2498
2499 DELETE FROM pn_space_assign_cust_all
2500 WHERE tenancy_id = p_tenancy_id
2501 AND cust_assign_end_date < p_cust_assign_start_dt;
2502 l_count := 0;
2503 l_count := SQL%ROWCOUNT;
2504 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 1. Rows Deleted: '||l_count);
2505
2506 UPDATE pn_space_assign_cust_all
2507 SET cust_assign_start_date = p_cust_assign_start_dt
2508 ,last_update_date = SYSDATE
2509 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
2510 WHERE tenancy_id = p_tenancy_id
2511 AND cust_assign_start_date < p_cust_assign_start_dt
2512 AND cust_assign_end_date >= p_cust_assign_start_dt;
2513 l_count := 0;
2514 l_count := SQL%ROWCOUNT;
2515 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 1. Rows Updated: '||l_count);
2516
2517 END IF;
2518
2519 ---------------------------------------------------------------------------------
2520 -- 2. Tenancy Start date expanded out.
2521 -- Need to extend the 1st assignment.
2522 ---------------------------------------------------------------------------------
2523 ELSIF p_cust_assign_start_dt < p_cust_assign_start_dt_old THEN
2524 l_extend_assgn := TRUE;
2525 END IF;
2526
2527 ---------------------------------------------------------------------------------
2528 -- 3. Tenancy End date brought in.
2529 -- If the assignment is NOT associated with a any Area or Expense Class in
2530 -- Recoveries, remove all the assignments after the new tenancy end date.
2531 -- Note: Update the fin_oblig_end_date for the last assignment.
2535 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 3. Tenancy End date brought in.');
2532 ---------------------------------------------------------------------------------
2533 IF p_cust_assign_end_dt < p_cust_assign_end_dt_old THEN
2534
2536
2537 IF cust_assign_assoc_exp_area_dt(
2538 p_tenancy_id => p_tenancy_id
2539 ,p_chk_locked => TRUE
2540 ,p_cust_assign_start_dt => p_cust_assign_start_dt_old
2541 ,p_cust_assign_end_dt => p_cust_assign_end_dt_old
2542 )
2543 THEN
2544 p_action := 'S';
2545 RETURN;
2546 ELSE
2547
2548 DELETE FROM pn_space_assign_cust_all
2549 WHERE tenancy_id = p_tenancy_id
2550 AND cust_assign_start_date > p_cust_assign_end_dt;
2551 l_count := 0;
2552 l_count := SQL%ROWCOUNT;
2553 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 3. Rows Deleted: '||l_count);
2554
2555 UPDATE pn_space_assign_cust_all
2556 SET cust_assign_end_date = p_cust_assign_end_dt
2557 ,fin_oblig_end_date = p_fin_oblig_end_date
2558 ,last_update_date = SYSDATE
2559 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
2560 WHERE tenancy_id = p_tenancy_id
2561 AND cust_assign_start_date <= p_cust_assign_end_dt
2562 AND cust_assign_end_date > p_cust_assign_end_dt;
2563 l_count := 0;
2564 l_count := SQL%ROWCOUNT;
2565 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 3. Rows Updated: '||l_count);
2566
2567 END IF;
2568
2569 ---------------------------------------------------------------------------------
2570 -- 4. Tenancy End date expanded out.
2571 -- Need to extend the last assignment.
2572 ---------------------------------------------------------------------------------
2573 ELSIF p_cust_assign_end_dt > p_cust_assign_end_dt_old THEN
2574 l_extend_assgn := TRUE;
2575 END IF;
2576
2577 ---------------------------------------------------------------------------------
2578 -- 2. Tenancy Start date expanded out: Need to extend the 1st assignment.
2579 -- 4. Tenancy End date expanded out: Need to extend the last assignment.
2580 ---------------------------------------------------------------------------------
2581 IF l_extend_assgn THEN
2582
2583 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 2: 2/4. Tenancy Start/End'
2584 ||' expanded out.');
2585 ---------------------------------------------------------------------------------
2586 -- Initialize the PL/SQL table space_assign_tbl.
2587 ---------------------------------------------------------------------------------
2588 space_assign_tbl.delete;
2589
2590 ---------------------------------------------------------------------------------
2591 -- Check the Multi-Tenancy-Profile, and space the available.
2592 ---------------------------------------------------------------------------------
2593 chk_multi_tenancy_profile(
2594 p_location_id => p_location_id
2595 ,p_lease_id => p_lease_id
2596 ,p_cust_assign_start_dt => p_cust_assign_start_dt
2597 ,p_cust_assign_end_dt => p_cust_assign_end_dt
2598 ,p_old_cust_assign_start_dt => p_cust_assign_start_dt_old
2599 ,p_old_cust_assign_end_dt => p_cust_assign_end_dt_old
2600 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2601 ,p_chk_vacancy => TRUE
2602 ,p_count => 1
2603 ,p_action => p_action
2604 ,p_loc_type_code => l_loc_type_code
2605 );
2606
2607 IF p_action IN ('OVERLAP') THEN
2608 RETURN;
2609 ELSE
2610
2611 ---------------------------------------------------------------------------------
2612 -- If PL/SQL table space_assign_info_tbl is not populated, populate it.
2613 ---------------------------------------------------------------------------------
2614 IF space_assign_info_tbl.count = 0 THEN
2615 populate_space_assign_info(
2616 p_location_id => p_location_id
2617 ,p_from_date => p_cust_assign_start_dt
2618 ,p_to_date => p_cust_assign_end_dt
2619 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2620 ,p_loc_type_code => l_loc_type_code
2621 );
2622 END IF;
2623
2627 IF p_cust_assign_start_dt < p_cust_assign_start_dt_old THEN
2624 ---------------------------------------------------------------------------------
2625 -- 2. Tenancy Start date expanded out: Need to extend the 1st assignment.
2626 ---------------------------------------------------------------------------------
2628
2629 OPEN csr_min_cust_assign;
2630 FETCH csr_min_cust_assign
2631 INTO l_min_cust_assign_id,
2632 l_min_cust_start_date,
2633 l_min_cust_end_date,
2634 l_allocated_area;
2635 CLOSE csr_min_cust_assign;
2636
2637 FOR i IN 0..space_assign_info_tbl.count-1
2638 LOOP
2639 IF l_min_cust_start_date > space_assign_info_tbl(i).cust_assign_start_date THEN
2640
2641 IF l_min_cust_start_date = space_assign_info_tbl(i).cust_assign_end_date+1 AND
2642 l_allocated_area = space_assign_info_tbl(i).allocated_area
2643 THEN
2644
2645 pnp_debug_pkg.debug(' Case: 2. Update Space Assgn... i: '||i
2646 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2647 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2648 ||', area: '||space_assign_info_tbl(i).allocated_area
2649 ||',');
2650
2651 UPDATE pn_space_assign_cust_all
2652 SET cust_assign_start_date = space_assign_info_tbl(i).cust_assign_start_date
2653 WHERE cust_space_assign_id = l_min_cust_assign_id;
2654 ELSE
2655
2656 pnp_debug_pkg.debug(' Case: 2. Create Space Assgn... i: '||i
2657 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2658 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2659 ||', area: '||space_assign_info_tbl(i).allocated_area
2660 ||',');
2661
2662 space_assign_tbl(j).cust_assign_start_date :=
2663 space_assign_info_tbl(i).cust_assign_start_date;
2664 space_assign_tbl(j).cust_assign_end_date :=
2665 space_assign_info_tbl(i).cust_assign_end_date;
2666 space_assign_tbl(j).fin_oblig_end_date :=
2667 space_assign_info_tbl(i).fin_oblig_end_date;
2668 space_assign_tbl(j).allocated_area :=
2669 space_assign_info_tbl(i).allocated_area;
2670 space_assign_tbl(j).allocated_area_pct :=
2671 space_assign_info_tbl(i).allocated_area_pct;
2672 j := j + 1;
2673 END IF;
2674
2675 ELSE
2676 pnp_debug_pkg.debug(' Case: 2. no space assgn... i: '||i
2677 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2678 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2679 ||', area: '||space_assign_info_tbl(i).allocated_area
2680 ||',');
2681
2682 END IF;
2683 END LOOP;
2684 END IF;
2685
2686 ---------------------------------------------------------------------------------
2687 -- 4. Tenancy End date expanded out: Need to extend the last assignment.
2688 -- Note: Update the fin_oblig_end_date for the last assignment.
2689 ---------------------------------------------------------------------------------
2690 IF p_cust_assign_end_dt > p_cust_assign_end_dt_old THEN
2691 OPEN csr_max_cust_assign;
2692 FETCH csr_max_cust_assign
2693 INTO l_max_cust_assign_id,
2694 l_max_cust_start_date,
2695 l_max_cust_end_date,
2696 l_allocated_area;
2697 CLOSE csr_max_cust_assign;
2698
2699 pnp_debug_pkg.debug('Case: 4. Tenancy End expanded out. '
2700 ||', l_max_assign_id: '||l_max_cust_assign_id
2701 ||', l_max_start_date: '||l_max_cust_start_date
2702 ||', l_max_end_date: '||l_max_cust_end_date
2703 ||', l_area: '||l_allocated_area
2704 ||',');
2705
2706 FOR i IN 0 .. space_assign_info_tbl.count-1
2707 LOOP
2708
2709 IF NVL(l_max_cust_end_date, space_assign_info_tbl(i).cust_assign_end_date) <
2710 space_assign_info_tbl(i).cust_assign_end_date
2711 THEN
2712
2713 IF NVL(l_max_cust_end_date+1, space_assign_info_tbl(i).cust_assign_start_date) =
2714 space_assign_info_tbl(i).cust_assign_start_date AND
2715 l_allocated_area = space_assign_info_tbl(i).allocated_area
2716 THEN
2717
2718 pnp_debug_pkg.debug(' Case: 4. Update Space Assgn... i: '||i
2719 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2723
2720 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2721 ||', area: '||space_assign_info_tbl(i).allocated_area
2722 ||',');
2724 -----------------------------------------------------------------------
2725 -- Determine the correct fin_oblig_end_date.
2726 -----------------------------------------------------------------------
2727 IF i = space_assign_info_tbl.count-1 THEN
2728 l_fin_oblig_end_date := p_fin_oblig_end_date;
2729 ELSE
2730 l_fin_oblig_end_date := space_assign_info_tbl(i).cust_assign_end_date;
2731 END IF;
2732
2733 UPDATE pn_space_assign_cust_all
2734 SET cust_assign_end_date = space_assign_info_tbl(i).cust_assign_end_date
2735 ,fin_oblig_end_date = l_fin_oblig_end_date
2736 WHERE cust_space_assign_id = l_max_cust_assign_id;
2737
2738 ELSE
2739
2740 pnp_debug_pkg.debug(' Case: 4. Create Space Assgn... i: '||i
2741 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2742 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2743 ||', area: '||space_assign_info_tbl(i).allocated_area
2744 ||',');
2745
2746 -----------------------------------------------------------------------
2747 -- Determine and update the correct fin_oblig_end_date.
2748 -----------------------------------------------------------------------
2749 IF NVL(l_max_cust_end_date+1, space_assign_info_tbl(i).cust_assign_start_date) =
2750 space_assign_info_tbl(i).cust_assign_start_date
2751 THEN
2752 UPDATE pn_space_assign_cust_all
2753 SET fin_oblig_end_date = cust_assign_end_date
2754 WHERE cust_space_assign_id = l_max_cust_assign_id;
2755 END IF;
2756
2757 space_assign_tbl(j).cust_assign_start_date :=
2758 space_assign_info_tbl(i).cust_assign_start_date;
2759 space_assign_tbl(j).cust_assign_end_date :=
2760 space_assign_info_tbl(i).cust_assign_end_date;
2761 space_assign_tbl(j).fin_oblig_end_date :=
2762 space_assign_info_tbl(i).fin_oblig_end_date;
2763 space_assign_tbl(j).allocated_area :=
2764 space_assign_info_tbl(i).allocated_area;
2765 space_assign_tbl(j).allocated_area_pct :=
2766 space_assign_info_tbl(i).allocated_area_pct;
2767 j := j + 1;
2768
2769 END IF;
2770
2771 ELSE
2772 pnp_debug_pkg.debug(' Case: 4. no space assgn... i: '||i
2773 ||', start_date: '||space_assign_info_tbl(i).cust_assign_start_date
2774 ||', end_date: '||space_assign_info_tbl(i).cust_assign_end_date
2775 ||', area: '||space_assign_info_tbl(i).allocated_area
2776 ||',');
2777
2778 END IF;
2779 END LOOP;
2780 END IF;
2781
2782 ---------------------------------------------------------------------------------
2783 -- If required insert new space assignment rows to Expand Out tenancy dates.
2784 ---------------------------------------------------------------------------------
2785 IF space_assign_tbl.count > 0 THEN
2786 insert_space_assign_row(
2787 p_location_id => p_location_id
2788 ,p_lease_id => p_lease_id
2789 ,p_customer_id => p_customer_id
2790 ,p_cust_site_use_id => p_cust_site_use_id
2791 ,p_recovery_space_std_code => p_recovery_space_std_code
2792 ,p_recovery_type_code => p_recovery_type_code
2793 ,p_fin_oblig_end_date => p_fin_oblig_end_date
2794 ,p_tenancy_id => p_tenancy_id
2795 ,p_org_id => p_org_id
2796 ,p_space_assign_info_tbl => space_assign_tbl
2797 ,p_return_status => l_return_status
2798 );
2799
2800 END IF;
2801
2802 IF l_return_status IS NOT NULL THEN
2803 p_action := l_return_status;
2804 RETURN;
2805 END IF;
2806
2807 END IF;
2808
2809 ---------------------------------------------------------------------------------
2810 -- End expanding out Tenancy Dates.
2811 ---------------------------------------------------------------------------------
2812 END IF;
2813 END IF;
2814
2818 -- Update the fin_oblig_end_date for the last assignment.
2815 ----------------------------------------------------------------------------------------
2816 -- Location is not changed.
2817 -- Check# 3. Is the fin_oblig_end_date changed.
2819 ----------------------------------------------------------------------------------------
2820 IF (NVL(p_fin_oblig_end_date, l_StartOfTime) <>
2821 NVL(p_fin_oblig_end_date_old, l_StartOfTime)) THEN
2822
2823 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 3: fin_oblig_end_date is changed.');
2824
2825 IF p_fin_oblig_end_date_old IS NOT NULL THEN
2826 UPDATE pn_space_assign_cust_all
2827 SET fin_oblig_end_date = p_fin_oblig_end_date
2828 ,last_update_date = SYSDATE
2829 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
2830 WHERE tenancy_id = p_tenancy_id
2831 AND fin_oblig_end_date = p_fin_oblig_end_date_old;
2832 ELSE
2833 UPDATE pn_space_assign_cust_all
2834 SET fin_oblig_end_date = p_fin_oblig_end_date
2835 ,last_update_date = SYSDATE
2836 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
2837 WHERE tenancy_id = p_tenancy_id
2838 AND cust_assign_end_date = p_cust_assign_end_dt;
2839 END IF;
2840
2841 END IF;
2842
2843 ----------------------------------------------------------------------------------------
2844 -- Location is not changed.
2845 -- Check# 4. Is any of customer_id, cust_site_use_id, recovery_space_std_code OR
2846 -- recovery_type_code changed:
2847 -- Update all space assignment records with new values.
2848 ----------------------------------------------------------------------------------------
2849 IF (NVL(p_customer_id, -99) <>
2850 NVL(p_customer_id_old, -99)) OR
2851 (NVL(p_cust_site_use_id, -99) <>
2852 NVL(p_cust_site_use_id_old, -99)) OR
2853 (NVL(p_recovery_space_std_code, ' ') <>
2854 NVL(p_recovery_space_std_code_old, ' ')) OR
2855 (NVL(p_recovery_type_code, ' ') <>
2856 NVL(p_recovery_type_code_old, ' '))
2857 THEN
2858
2859 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 4: customer_id/cust_site_use_id/'
2860 ||'space_std/recovery_type is changed.');
2861
2862 /*IF (NVL(p_customer_id, -99) <> NVL(p_customer_id_old, -99)) THEN
2863
2864 pn_space_assign_cust_pkg.chk_dup_cust_assign(
2865 p_cust_acnt_id => p_customer_id
2866 ,p_loc_id => p_location_id
2867 ,p_assgn_str_dt => p_cust_assign_start_dt
2868 ,p_assgn_end_dt => p_cust_assign_end_dt
2869 ,p_return_status => l_return_status
2870 );
2871
2872 IF l_return_status IS NOT NULL THEN
2873 p_action := l_return_status;
2874 RETURN;
2875 END IF;
2876 END IF;*/
2877
2878 UPDATE pn_space_assign_cust_all
2879 SET cust_account_id = p_customer_id
2880 ,site_use_id = p_cust_site_use_id
2881 ,recovery_space_std_code = p_recovery_space_std_code
2882 ,recovery_type_code = p_recovery_type_code
2883 ,last_update_date = SYSDATE
2884 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
2885 WHERE tenancy_id = p_tenancy_id;
2886
2887 END IF;
2888
2889 ----------------------------------------------------------------------------------------
2890 -- Location is not changed.
2891 -- Check# 5. Is Allocated_area_pct is changed
2892 -- Update all space assignment records with new value for that tenanct_id.
2893 ----------------------------------------------------------------------------------------
2894 IF (nvl(p_allocated_pct,-1) <> nvl(p_allocated_pct_old,-1)) THEN
2895
2896 pnp_debug_pkg.debug('Update_Auto_Space_Assign : Check# 5: allocated_area_pct is changed.');
2897
2898 IF p_allocated_pct IS NOT NULL THEN
2899 FOR rec_alloc_area IN cur_alloc_area LOOP
2900 l_cust_assign_start_date := rec_alloc_area.cust_assign_start_date;
2901 l_cust_assign_end_date := rec_alloc_area.cust_assign_end_date;
2902
2903 get_allocated_area(
2904 p_cust_assign_start_date => l_cust_assign_start_date,
2905 p_cust_assign_end_date => l_cust_assign_end_date,
2906 p_allocated_area_pct => p_allocated_pct,
2907 p_allocated_area => l_allocated_area);
2908
2909 UPDATE pn_space_assign_cust_all
2910 SET allocated_area_pct = p_allocated_pct
2911 ,allocated_area = l_allocated_area
2912 WHERE tenancy_id = p_tenancy_id
2913 AND cust_assign_start_date = l_cust_assign_start_date;
2914
2915 END LOOP;
2916 END IF;
2917
2918 END IF;
2919
2920 END IF;
2921
2922 pnp_debug_pkg.debug('l_auto_space_dist: '||l_auto_space_dist||', l_loc_type_code: '||l_loc_type_code);
2923 IF l_loc_type_code IS NULL THEN
2927 -- 110403
2924 l_loc_type_code := get_loc_type_code(p_location_id, p_cust_assign_start_dt);
2925 END IF;
2926
2928 IF NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N') = 'Y' AND
2929 l_loc_type_code IN ('OFFICE', 'SECTION')
2930 THEN
2931
2932 PN_SPACE_ASSIGN_CUST_PKG.assignment_split(
2933 p_location_id => p_location_id,
2934 p_start_date => p_cust_assign_start_dt,
2935 p_end_date => p_cust_assign_end_dt);
2936
2937 END IF;
2938
2939 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_AUTO_SPACE_ASSIGN (-)');
2940 EXCEPTION
2941 WHEN OTHERS THEN
2942 pnp_debug_pkg.log('Update_auto_space_assign - Errmsg: ' || sqlerrm);
2943 RAISE;
2944 END update_auto_space_assign;
2945
2946
2947 --------------------------------------------------------------------------------
2948 -- PROCEDURE : UPDATE_DUP_SPACE_ASSIGN
2949 -- DESCRIPTION:
2950 --
2951 -- 05-MAR-04 STripathi o Created for ENH# 3485730. If Only one duplicate
2952 -- assign exist, update that assign with lease and
2953 -- tenancy details.
2954 -- 08-MAR-04 STripathi o Do not update start and end date while updating
2955 -- the assign. Call update_auto_space_assign to
2956 -- update start date, end date and fin_oblog_end_dt.
2957 -- 10-MAR-04 STripathi o Added NVL to cust_assign_end_date and start date
2958 -- since it can have null value from PNTSPACE.
2959 -- 28-NOV-05 pikhar o passed org_id in pn_mo_cache_utils.get_profile_value
2960 --------------------------------------------------------------------------------
2961 PROCEDURE Update_Dup_Space_Assign(
2962 p_location_id IN NUMBER
2963 ,p_customer_id IN NUMBER
2964 ,p_lease_id IN NUMBER
2965 ,p_tenancy_id IN NUMBER
2966 ,p_cust_site_use_id IN NUMBER
2967 ,p_cust_assign_start_dt IN DATE
2968 ,p_cust_assign_end_dt IN DATE
2969 ,p_recovery_space_std_code IN VARCHAR2
2970 ,p_recovery_type_code IN VARCHAR2
2971 ,p_fin_oblig_end_date IN DATE
2972 ,p_allocated_pct IN NUMBER
2973 ,p_org_id IN NUMBER
2974 ,p_action OUT NOCOPY VARCHAR2
2975 ,p_msg OUT NOCOPY VARCHAR2
2976 )
2977 IS
2978 CURSOR get_cust_space_assign_id IS
2979 SELECT cust_space_assign_id,
2980 NVL(cust_assign_start_date, pnt_locations_pkg.g_start_of_time) cust_assign_start_date,
2981 NVL(cust_assign_end_date, pnt_locations_pkg.g_end_of_time) cust_assign_end_date
2982 FROM pn_space_assign_cust_all
2983 WHERE cust_account_id = p_customer_id
2984 AND location_id = p_location_id
2985 AND cust_assign_start_date <= p_cust_assign_end_dt
2986 AND NVL(cust_assign_end_date, TO_DATE('12/31/4712', 'MM/DD/YYYY'))
2987 >= p_cust_assign_start_dt;
2988
2989
2990 l_cust_space_assign_id NUMBER;
2991 l_cust_assign_start_date DATE;
2992 l_cust_assign_end_date DATE;
2993 l_auto_space_dist VARCHAR2(20) := NULL;
2994
2995 CURSOR org_cur IS
2996 SELECT org_id
2997 FROM pn_locations_all pnl
2998 WHERE pnl.location_id = p_location_id
2999 AND ROWNUM < 2;
3000
3001 l_org_id NUMBER;
3002
3003
3004 BEGIN
3005
3006 FOR rec IN org_cur LOOP
3007 l_org_id := rec.org_id;
3008 END LOOP;
3009
3010 l_auto_space_dist := NVL(pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id),'N');
3011 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_DUP_SPACE_ASSIGN (+) Auto_Space_Dist: '
3012 ||l_auto_space_dist);
3013 p_action := NULL;
3014
3015 OPEN get_cust_space_assign_id;
3016 FETCH get_cust_space_assign_id
3017 INTO l_cust_space_assign_id,
3018 l_cust_assign_start_date,
3019 l_cust_assign_end_date;
3020 CLOSE get_cust_space_assign_id;
3021
3022 IF l_cust_space_assign_id IS NOT NULL THEN
3023
3024 UPDATE pn_space_assign_cust_all
3025 SET lease_id = p_lease_id
3026 ,tenancy_id = p_tenancy_id
3027 ,cust_assign_start_date = NVL(cust_assign_start_date, pnt_locations_pkg.g_start_of_time)
3028 ,cust_assign_end_date = NVL(cust_assign_end_date, pnt_locations_pkg.g_end_of_time)
3029 ,site_use_id = p_cust_site_use_id
3030 ,recovery_space_std_code = p_recovery_space_std_code
3031 ,recovery_type_code = p_recovery_type_code
3032 ,fin_oblig_end_date = NVL(cust_assign_end_date, pnt_locations_pkg.g_end_of_time)
3033 ,last_update_date = SYSDATE
3034 ,last_updated_by = NVL(FND_PROFILE.VALUE('USER_ID'),-1)
3035 WHERE cust_space_assign_id = l_cust_space_assign_id;
3036
3037
3041 ,p_lease_id => p_lease_id
3038 pn_tenancies_pkg.update_auto_space_assign
3039 (
3040 p_location_id => p_location_id
3042 ,p_customer_id => p_customer_id
3043 ,p_cust_site_use_id => p_cust_site_use_id
3044 ,p_cust_assign_start_dt => p_cust_assign_start_dt
3045 ,p_cust_assign_end_dt => p_cust_assign_end_dt
3046 ,p_recovery_space_std_code => p_recovery_space_std_code
3047 ,p_recovery_type_code => p_recovery_type_code
3048 ,p_fin_oblig_end_date => p_fin_oblig_end_date
3049 ,p_allocated_pct => p_allocated_pct
3050 ,p_tenancy_id => p_tenancy_id
3051 ,p_org_id => p_org_id
3052 ,p_location_id_old => p_location_id
3053 ,p_customer_id_old => p_customer_id
3054 ,p_cust_site_use_id_old => p_cust_site_use_id
3055 ,p_cust_assign_start_dt_old => l_cust_assign_start_date
3056 ,p_cust_assign_end_dt_old => l_cust_assign_end_date
3057 ,p_recovery_space_std_code_old => p_recovery_space_std_code
3058 ,p_recovery_type_code_old => p_recovery_type_code
3059 ,p_fin_oblig_end_date_old => p_fin_oblig_end_date
3060 ,p_allocated_pct_old => p_allocated_pct
3061 ,p_action => p_action
3062 ,p_msg => p_msg
3063 );
3064
3065
3066 END IF;
3067
3068 pnp_debug_pkg.debug('PN_TENANCIES_PKG.UPDATE_DUP_SPACE_ASSIGN (-)');
3069
3070 END Update_Dup_Space_Assign;
3071
3072 -------------------------------------------------------------------------------
3073 -- FUNCTION : Auto_Allocated_Area_Pct
3074 -- INVOKED FROM :
3075 -- PURPOSE : Retrieves allocated area % for the particular Tenancy_id
3076 -- HISTORY :
3077 -- 07-DEC-2006 Ram Kumar o created
3078 -------------------------------------------------------------------
3079 FUNCTION Auto_Allocated_Area_Pct
3080 (
3081 p_tenancy_id IN NUMBER
3082 )
3083 RETURN NUMBER
3084 IS
3085 l_allocated_area_pct NUMBER;
3086 l_lease_class_code VARCHAR2(30);
3087
3088 CURSOR cur_allocated_area_pct IS
3089 SELECT min(allocated_area_pct) min_area_pct
3090 FROM pn_space_assign_cust_all
3091 WHERE tenancy_id = p_tenancy_id;
3092
3093 CURSOR cur_lease_code IS
3094 SELECT leases.lease_class_code lease_code,
3095 allocated_area_pct
3096 FROM pn_leases_all leases,
3097 pn_tenancies_all tenant
3098 WHERE leases.lease_id = tenant.lease_id
3099 AND tenant.tenancy_id = p_tenancy_id;
3100
3101 BEGIN
3102 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Auto_Allocated_Area_Pct (+)');
3103
3104 --
3105 FOR rec_allocated_area_pct IN cur_allocated_area_pct LOOP
3106 l_allocated_area_pct := rec_allocated_area_pct.min_area_pct;
3107 END LOOP;
3108
3109 FOR rec_lease_code IN cur_lease_code LOOP
3110 l_lease_class_code := rec_lease_code.lease_code;
3111 l_allocated_area_pct := nvl(l_allocated_area_pct,rec_lease_code.allocated_area_pct);
3112 END LOOP;
3113
3114 IF l_lease_class_code = 'DIRECT' THEN
3115 l_allocated_area_pct := NULL;
3116 END IF;
3117
3118 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Auto_Allocated_Area_Pct (-)');
3119
3120 RETURN l_allocated_area_pct;
3121
3122 END Auto_Allocated_Area_Pct;
3123
3124 -------------------------------------------------------------------------------
3125 -- FUNCTION : Auto_Allocated_Area
3126 -- INVOKED FROM :
3127 -- PURPOSE : Retrieves allocated area for the particular Tenancy_id
3128 -- HISTORY :
3129 -- 07-DEC-2006 Ram Kumar o created
3130 -------------------------------------------------------------------
3131 FUNCTION Auto_Allocated_Area
3132 (
3133 p_tenancy_id IN NUMBER
3134 )
3135 RETURN NUMBER
3136 IS
3137 l_allocated_area NUMBER := NULL;
3138 l_lease_class_code VARCHAR2(30);
3139
3140 CURSOR cur_allocated_area IS
3141 SELECT min(allocated_area) min_area
3142 FROM pn_space_assign_cust_all
3143 WHERE tenancy_id = p_tenancy_id;
3144
3145 CURSOR get_lease_class IS
3146 SELECT leases.lease_class_code lease_code,
3147 allocated_area
3148 FROM pn_leases_all leases,
3149 pn_tenancies_all tenant
3150 WHERE leases.lease_id = tenant.lease_id
3151 AND tenant.tenancy_id = p_tenancy_id;
3152
3153
3154 BEGIN
3155 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Auto_Allocated_Area (+)');
3156
3157 --
3158 FOR rec_allocated_area IN cur_allocated_area LOOP
3159 l_allocated_area := rec_allocated_area.min_area;
3160 END LOOP;
3161
3162 FOR rec_lease_code IN get_lease_class LOOP
3163 l_lease_class_code := rec_lease_code.lease_code;
3164 l_allocated_area := nvl(l_allocated_area,rec_lease_code.allocated_area);
3165 END LOOP;
3166
3167 IF l_lease_class_code = 'DIRECT' THEN
3168 l_allocated_area := NULL;
3169 END IF;
3170
3171 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Auto_Allocated_Area (-)');
3172
3173 RETURN l_allocated_area;
3174
3175 END Auto_Allocated_Area;
3176
3177 -------------------------------------------------------------------------------
3178 -- FUNCTION : Availaible_Space
3179 -- INVOKED FROM :
3180 -- PURPOSE : Retrieves minimum allowable area % for the particular Tenancy_id
3181 -- HISTORY :
3182 -- 07-DEC-2006 Ram Kumar o created
3183 -------------------------------------------------------------------
3184 PROCEDURE Availaible_Space(
3188 ,p_min_pct OUT NOCOPY NUMBER
3185 p_location_id IN NUMBER
3186 ,p_from_date IN DATE
3187 ,p_to_date IN DATE
3189 )
3190 IS
3191 p_min_area NUMBER;
3192 CURSOR csr_cust_info IS
3193 SELECT cust_assign_start_date,
3194 NVL(cust_assign_end_date, p_to_date) cust_assign_end_date,
3195 nvl(allocated_area,0) allocated_area
3196 FROM pn_space_assign_cust_all
3197 WHERE location_id = p_location_id
3198 AND cust_assign_start_date <= p_to_date
3199 AND NVL(cust_assign_end_date, p_to_date) >= p_from_date;
3200
3201 CURSOR csr_emp_info IS
3202 SELECT emp_assign_start_date,
3203 NVL(emp_assign_end_date, p_to_date) emp_assign_end_date,
3204 nvl(allocated_area,0) allocated_area
3205 FROM pn_space_assign_emp_all
3206 WHERE location_id = p_location_id
3207 AND emp_assign_start_date <= p_to_date
3208 AND NVL(emp_assign_end_date, p_to_date) >= p_from_date;
3209
3210 l_loc_type_code pn_locations_all.location_type_lookup_code%TYPE;
3211 l_num_table pn_recovery_extract_pkg.number_table_TYPE;
3212 l_date_table pn_recovery_extract_pkg.date_table_TYPE;
3213 i NUMBER := 0;
3214 j NUMBER := 0;
3215
3216 BEGIN
3217 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Availaible_Space (+)');
3218
3219 get_loc_info(p_location_id => p_location_id,
3220 p_from_date => p_from_date,
3221 p_to_date => p_to_date,
3222 p_loc_type_code => l_loc_type_code);
3223
3224 IF l_loc_type_code IN ('OFFICE', 'SECTION') THEN
3225
3226 FOR i IN 0 .. loc_info_tbl.count-1
3227 LOOP
3228 pn_recovery_extract_pkg.process_vacancy(
3229 p_start_date => loc_info_tbl(i).active_start_date,
3230 p_end_date => loc_info_tbl(i).active_end_date,
3231 p_area => loc_info_tbl(i).assignable_area,
3232 p_date_table => l_date_table,
3233 p_number_table => l_num_table,
3234 p_add => TRUE);
3235 END LOOP;
3236
3237 FOR rec_cust_info IN csr_cust_info
3238 LOOP
3239 pn_recovery_extract_pkg.process_vacancy(
3240 p_start_date => rec_cust_info.cust_assign_start_date,
3241 p_end_date => rec_cust_info.cust_assign_end_date,
3242 p_area => rec_cust_info.allocated_area,
3243 p_date_table => l_date_table,
3244 p_number_table => l_num_table,
3245 p_add => FALSE);
3246 END LOOP;
3247
3248 FOR rec_emp_info IN csr_emp_info
3249 LOOP
3250 pn_recovery_extract_pkg.process_vacancy(
3251 p_start_date => rec_emp_info.emp_assign_start_date,
3252 p_end_date => rec_emp_info.emp_assign_end_date,
3253 p_area => rec_emp_info.allocated_area,
3254 p_date_table => l_date_table,
3255 p_number_table => l_num_table,
3256 p_add => FALSE);
3257 END LOOP;
3258
3259 p_min_area := l_num_table(0);
3260 FOR i IN 0 .. l_num_table.count-1
3261 LOOP
3262 IF(p_min_area > l_num_table(i)) THEN
3263 p_min_area := l_num_table(i);
3264 END IF;
3265 END LOOP;
3266
3267 get_allocated_area_pct(
3268 p_cust_assign_start_date => p_from_date,
3269 p_cust_assign_end_date => p_to_date,
3270 p_allocated_area => p_min_area,
3271 p_alloc_area_pct => p_min_pct);
3272
3273 END IF;
3274
3275 pnp_debug_pkg.debug('PN_TENANCIES_PKG.Availaible_Space (-)');
3276 EXCEPTION
3277 WHEN OTHERS THEN
3278 pnp_debug_pkg.log('Availaible_Space - Errmsg: ' || sqlerrm);
3279 RAISE;
3280
3281 END Availaible_Space;
3282
3283 END pn_tenancies_pkg;