DBA Data[Home] [Help]

PACKAGE BODY: APPS.PN_SPACE_ASSIGN_CUST_PKG

Source


1 PACKAGE BODY pn_space_assign_cust_pkg AS
2 /* $Header: PNSPCUSB.pls 120.12 2007/02/14 12:31:55 rdonthul ship $ */
3 
4 -------------------------------------------------------------------------------
5 -- PROCEDURE    : Insert_Row
6 -- INVOKED FROM : insert_row procedure
7 -- PURPOSE      : inserts the row
8 -- HISTORY      :
9 -- 05-MAR-04 ftanudja  o Replaced check_dupcust.. w/ chk_dup_cust..
10 -- 14-DEC-04 STripath  o Modified for Portfolio Status Enh BUG# 4030816. Added
11 --                       code to check loc is contigious assignable betn assign
12 --                       start and end dates.
13 -- 30-JUN-05  hrodda   o Bug 4284035 - Replaced pn_space_assign_cust
14 --                       with _ALL table.
15 -- 08-SEP-o5  hrodda   o Modified insert statement to include org_id.
16 -- 28-NOV-05  pikhar   o fetched org_id using cursor.
17 -- 08-Feb-07  rdonthul o Removed the check fro duplicate space assignments
18 --                       for bug fix 5864468
19 -------------------------------------------------------------------------------
20 
21 PROCEDURE Insert_Row (
22   X_ROWID                         IN OUT NOCOPY VARCHAR2,
23   X_CUST_SPACE_ASSIGN_ID          IN OUT NOCOPY NUMBER,
24   X_LOCATION_ID                   IN     NUMBER,
25   X_CUST_ACCOUNT_ID               IN     NUMBER,
26   X_SITE_USE_ID                   IN     NUMBER,
27   X_EXPENSE_ACCOUNT_ID            IN     NUMBER,
28   X_PROJECT_ID                    IN     NUMBER,
29   X_TASK_ID                       IN     NUMBER,
30   X_CUST_ASSIGN_START_DATE        IN     DATE,
31   X_CUST_ASSIGN_END_DATE          IN     DATE,
32   X_ALLOCATED_AREA_PCT            IN     NUMBER,
33   X_ALLOCATED_AREA                IN     NUMBER,
34   X_UTILIZED_AREA                 IN     NUMBER,
35   X_CUST_SPACE_COMMENTS           IN     VARCHAR2,
36   X_ATTRIBUTE_CATEGORY            IN     VARCHAR2,
37   X_ATTRIBUTE1                    IN     VARCHAR2,
38   X_ATTRIBUTE2                    IN     VARCHAR2,
39   X_ATTRIBUTE3                    IN     VARCHAR2,
40   X_ATTRIBUTE4                    IN     VARCHAR2,
41   X_ATTRIBUTE5                    IN     VARCHAR2,
42   X_ATTRIBUTE6                    IN     VARCHAR2,
43   X_ATTRIBUTE7                    IN     VARCHAR2,
44   X_ATTRIBUTE8                    IN     VARCHAR2,
45   X_ATTRIBUTE9                    IN     VARCHAR2,
46   X_ATTRIBUTE10                   IN     VARCHAR2,
47   X_ATTRIBUTE11                   IN     VARCHAR2,
48   X_ATTRIBUTE12                   IN     VARCHAR2,
49   X_ATTRIBUTE13                   IN     VARCHAR2,
50   X_ATTRIBUTE14                   IN     VARCHAR2,
51   X_ATTRIBUTE15                   IN     VARCHAR2,
52   X_CREATION_DATE                 IN     DATE,
53   X_CREATED_BY                    IN     NUMBER,
54   X_LAST_UPDATE_DATE              IN     DATE,
55   X_LAST_UPDATED_BY               IN     NUMBER,
56   X_LAST_UPDATE_LOGIN             IN     NUMBER,
57   X_ORG_ID                        IN     NUMBER,
58   X_LEASE_ID                      IN     NUMBER,
59   X_RECOVERY_SPACE_STD_CODE       IN     VARCHAR2,
60   X_RECOVERY_TYPE_CODE            IN     VARCHAR2,
61   X_FIN_OBLIG_END_DATE            IN     DATE,
62   X_TENANCY_ID                    IN     NUMBER,
63   X_RETURN_STATUS                 OUT NOCOPY VARCHAR2
64   )
65 IS
66    CURSOR c IS
67       SELECT ROWID
68       FROM pn_space_assign_cust_all
69       WHERE cust_space_assign_id = x_cust_space_assign_id;
70 
71    l_status                        VARCHAR2(100);
72    l_err_msg                       VARCHAR2(30);
73 
74    CURSOR org_cur IS
75     SELECT org_id
76     FROM   pn_locations_all
77     WHERE  location_id = x_location_id;
78 
79    l_org_id NUMBER;
80 
81 BEGIN
82 
83    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.INSERT_ROW (+) SpcAsgnId: '
84                         ||x_cust_space_assign_id||', LocId: '||x_location_id
85                         ||', StrDt: '||TO_CHAR(x_cust_assign_start_date,'MM/DD/YYYY')
86                         ||', EndDt: '||TO_CHAR(x_cust_assign_end_date, 'MM/DD/YYYY')
87                         ||', CustId: '||x_cust_account_id);
88 
89    -- Check if location is contigious Customer Assignable betn assign start and end dates.
90    pnt_locations_pkg.Check_Location_Gaps(
91                           p_loc_id     => x_location_id
92                          ,p_str_dt     => x_cust_assign_start_date
93                          ,p_end_dt     => NVL(x_cust_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY'))
94                          ,p_asgn_mode  => 'CUST'
95                          ,p_err_msg    => l_err_msg
96                           );
97 
98    IF l_err_msg IS NOT NULL THEN
99       fnd_message.set_name('PN', 'PN_INVALID_SPACE_ASSGN_DATE');
100       x_return_status := 'INVALID_LOC_DATE';
101       return;
102    END IF;
103 
104    /* pn_space_assign_cust_pkg.chk_dup_cust_assign(
105                  p_cust_acnt_id  => x_cust_account_id
106                 ,p_loc_id        => x_location_id
107                 ,p_assgn_str_dt  => x_cust_assign_start_date
108                 ,p_assgn_end_dt  => x_cust_assign_end_date
109                 ,p_return_status => l_status);
110 
111    IF l_status = 'DUP_ASSIGN' THEN
112       fnd_message.set_name('PN', 'PN_SPASGN_CUSTOMER_OVRLAP_MSG');
113       x_return_status := 'DUP_ASSIGN';
114       return;
115    END IF; */
116 
117    -------------------------------------------------------
118    -- Select the nextval for cust space assign id
119    -------------------------------------------------------
120    IF x_org_id IS NULL THEN
121     FOR rec IN org_cur LOOP
122       l_org_id := rec.org_id;
123     END LOOP;
124    ELSE
125     l_org_id := x_org_id;
126    END IF;
127 
128    IF ( X_CUST_SPACE_ASSIGN_ID IS NULL) THEN
129       SELECT  pn_space_assign_cust_s.NEXTVAL
130       INTO    x_cust_space_assign_id
131       FROM    DUAL;
132    END IF;
133 
134   INSERT INTO pn_space_assign_cust_all
135   (         CUST_SPACE_ASSIGN_ID,
136             LOCATION_ID,
137             CUST_ACCOUNT_ID,
138             SITE_USE_ID,
139             EXPENSE_ACCOUNT_ID,
140             PROJECT_ID,
141             TASK_ID,
142             CUST_ASSIGN_START_DATE,
143             CUST_ASSIGN_END_DATE,
144             ALLOCATED_AREA_PCT,
145             ALLOCATED_AREA,
146             UTILIZED_AREA,
147             CUST_SPACE_COMMENTS,
148             LAST_UPDATE_DATE,
149             LAST_UPDATED_BY,
150             CREATION_DATE,
151             CREATED_BY,
152             LAST_UPDATE_LOGIN,
153             ATTRIBUTE_CATEGORY,
154             ATTRIBUTE1,
155             ATTRIBUTE2,
156             ATTRIBUTE3,
157             ATTRIBUTE4,
158             ATTRIBUTE5,
159             ATTRIBUTE6,
160             ATTRIBUTE7,
161             ATTRIBUTE8,
162             ATTRIBUTE9,
163             ATTRIBUTE10,
164             ATTRIBUTE11,
165             ATTRIBUTE12,
166             ATTRIBUTE13,
167             ATTRIBUTE14,
168             ATTRIBUTE15,
169             LEASE_ID,
170             RECOVERY_SPACE_STD_CODE,
171             RECOVERY_TYPE_CODE,
172             FIN_OBLIG_END_DATE,
173             TENANCY_ID,
174             ORG_ID
175           )
176    VALUES
177           (
178             X_CUST_SPACE_ASSIGN_ID,
179             X_LOCATION_ID,
180             X_CUST_ACCOUNT_ID,
181             X_SITE_USE_ID,
182             X_EXPENSE_ACCOUNT_ID,
183             X_PROJECT_ID,
184             X_TASK_ID,
185             X_CUST_ASSIGN_START_DATE,
186             X_CUST_ASSIGN_END_DATE,
187             X_ALLOCATED_AREA_PCT,
188             X_ALLOCATED_AREA,
189             X_UTILIZED_AREA,
190             X_CUST_SPACE_COMMENTS,
191             X_LAST_UPDATE_DATE,
192             X_LAST_UPDATED_BY,
193             X_CREATION_DATE,
194             X_CREATED_BY,
195             X_LAST_UPDATE_LOGIN,
196             X_ATTRIBUTE_CATEGORY,
197             X_ATTRIBUTE1,
198             X_ATTRIBUTE2,
199             X_ATTRIBUTE3,
200             X_ATTRIBUTE4,
201             X_ATTRIBUTE5,
202             X_ATTRIBUTE6,
203             X_ATTRIBUTE7,
204             X_ATTRIBUTE8,
205             X_ATTRIBUTE9,
206             X_ATTRIBUTE10,
207             X_ATTRIBUTE11,
208             X_ATTRIBUTE12,
209             X_ATTRIBUTE13,
210             X_ATTRIBUTE14,
211             X_ATTRIBUTE15,
212             X_LEASE_ID,
213             X_RECOVERY_SPACE_STD_CODE,
214             X_RECOVERY_TYPE_CODE,
215             X_FIN_OBLIG_END_DATE,
216             X_TENANCY_ID,
217             l_org_id
218    );
219 
220    OPEN c;
221       FETCH c INTO x_rowid;
222       IF (c%NOTFOUND) THEN
223          CLOSE c;
224          RAISE NO_DATA_FOUND;
225       END IF;
226    CLOSE c;
227 
228    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.INSERT_ROW (-) SpcAsgnId: '
229                         ||x_cust_space_assign_id||', LocId: '||x_location_id
230                         ||', StrDt: '||TO_CHAR(x_cust_assign_start_date,'MM/DD/YYYY')
231                         ||', EndDt: '||TO_CHAR(x_cust_assign_end_date, 'MM/DD/YYYY')
232                         ||', CustId: '||x_cust_account_id);
233 
234 END Insert_Row;
235 
236 -----------------------------------------------------------------------
237 -- PROCDURE : LOCK_ROW
238 -----------------------------------------------------------------------
239 PROCEDURE Lock_Row (
240   X_CUST_SPACE_ASSIGN_ID          IN     NUMBER,
241   X_LOCATION_ID                   IN     NUMBER,
242   X_CUST_ACCOUNT_ID               IN     NUMBER,
243   X_SITE_USE_ID                   IN     NUMBER,
244   X_EXPENSE_ACCOUNT_ID            IN     NUMBER,
245   X_PROJECT_ID                    IN     NUMBER,
246   X_TASK_ID                       IN     NUMBER,
247   X_CUST_ASSIGN_START_DATE        IN     DATE,
248   X_CUST_ASSIGN_END_DATE          IN     DATE,
249   X_ALLOCATED_AREA_PCT            IN     NUMBER,
250   X_ALLOCATED_AREA                IN     NUMBER,
251   X_UTILIZED_AREA                 IN     NUMBER,
252   X_CUST_SPACE_COMMENTS           IN     VARCHAR2,
253   X_ATTRIBUTE_CATEGORY            IN     VARCHAR2,
254   X_ATTRIBUTE1                    IN     VARCHAR2,
255   X_ATTRIBUTE2                    IN     VARCHAR2,
256   X_ATTRIBUTE3                    IN     VARCHAR2,
257   X_ATTRIBUTE4                    IN     VARCHAR2,
258   X_ATTRIBUTE5                    IN     VARCHAR2,
259   X_ATTRIBUTE6                    IN     VARCHAR2,
260   X_ATTRIBUTE7                    IN     VARCHAR2,
261   X_ATTRIBUTE8                    IN     VARCHAR2,
262   X_ATTRIBUTE9                    IN     VARCHAR2,
263   X_ATTRIBUTE10                   IN     VARCHAR2,
264   X_ATTRIBUTE11                   IN     VARCHAR2,
265   X_ATTRIBUTE12                   IN     VARCHAR2,
266   X_ATTRIBUTE13                   IN     VARCHAR2,
267   X_ATTRIBUTE14                   IN     VARCHAR2,
268   X_ATTRIBUTE15                   IN     VARCHAR2,
269   X_LEASE_ID                      IN     NUMBER,
270   X_RECOVERY_SPACE_STD_CODE       IN     VARCHAR2,
271   X_RECOVERY_TYPE_CODE            IN     VARCHAR2,
272   X_FIN_OBLIG_END_DATE            IN     DATE,
273   X_TENANCY_ID                    IN     NUMBER
274   )
275 IS
276    CURSOR c1 IS
277       SELECT *
278       FROM pn_space_assign_cust_all
279       WHERE cust_space_assign_id = x_cust_space_assign_id
280       FOR UPDATE OF cust_space_assign_id NOWAIT;
281 
282 BEGIN
283 
284     pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.LOCK_ROW (+) SpcAsgnId: '
285                         ||x_cust_space_assign_id);
286 
287     OPEN c1;
288         FETCH c1 INTO tlcustinfo;
289         IF (c1%NOTFOUND) THEN
290                 CLOSE c1;
291                 RETURN;
292         END IF;
293     CLOSE c1;
294 
295    IF NOT (tlcustinfo.CUST_SPACE_ASSIGN_ID = X_CUST_SPACE_ASSIGN_ID) THEN
296       pn_var_rent_pkg.lock_row_exception('CUST_SPACE_ASSIGN_ID',tlcustinfo.CUST_SPACE_ASSIGN_ID);
297    END IF;
298 
299    IF NOT ((tlcustinfo.LOCATION_ID = X_LOCATION_ID)
300                OR ((tlcustinfo.LOCATION_ID is null) AND (X_LOCATION_ID is null))) THEN
301       pn_var_rent_pkg.lock_row_exception('LOCATION_ID',tlcustinfo.LOCATION_ID);
302    END IF;
303 
304    IF NOT (tlcustinfo.CUST_ACCOUNT_ID = X_CUST_ACCOUNT_ID) THEN
305       pn_var_rent_pkg.lock_row_exception('CUST_ACCOUNT_ID',tlcustinfo.CUST_ACCOUNT_ID);
306    END IF;
307 
308    IF NOT ((tlcustinfo.SITE_USE_ID = X_SITE_USE_ID)
309                OR ((tlcustinfo.SITE_USE_ID is null) AND (X_SITE_USE_ID is null))) THEN
310       pn_var_rent_pkg.lock_row_exception('SITE_USE_ID',tlcustinfo.SITE_USE_ID);
311    END IF;
312 
313    IF NOT ((tlcustinfo.EXPENSE_ACCOUNT_ID = X_EXPENSE_ACCOUNT_ID)
314                OR ((tlcustinfo.EXPENSE_ACCOUNT_ID is null) AND (X_EXPENSE_ACCOUNT_ID is null))) THEN
315       pn_var_rent_pkg.lock_row_exception('EXPENSE_ACCOUNT_ID',tlcustinfo.EXPENSE_ACCOUNT_ID);
316    END IF;
317 
318    IF NOT ((tlcustinfo.PROJECT_ID = X_PROJECT_ID)
319                OR ((tlcustinfo.PROJECT_ID is null) AND (X_PROJECT_ID is null))) THEN
320       pn_var_rent_pkg.lock_row_exception('PROJECT_ID',tlcustinfo.PROJECT_ID);
321    END IF;
322 
323    IF NOT ((tlcustinfo.TASK_ID = X_TASK_ID)
324                OR ((tlcustinfo.TASK_ID is null) AND (X_TASK_ID is null))) THEN
325       pn_var_rent_pkg.lock_row_exception('TASK_ID',tlcustinfo.TASK_ID);
326    END IF;
327 
328    IF NOT ((tlcustinfo.CUST_ASSIGN_START_DATE = X_CUST_ASSIGN_START_DATE)
329                OR ((tlcustinfo.CUST_ASSIGN_START_DATE is null) AND (X_CUST_ASSIGN_START_DATE is null))) THEN
330       pn_var_rent_pkg.lock_row_exception('CUST_ASSIGN_START_DATE',tlcustinfo.CUST_ASSIGN_START_DATE);
331    END IF;
332 
333    IF NOT ((tlcustinfo.CUST_ASSIGN_END_DATE = X_CUST_ASSIGN_END_DATE)
334                OR ((tlcustinfo.CUST_ASSIGN_END_DATE is null) AND (X_CUST_ASSIGN_END_DATE is null))) THEN
335       pn_var_rent_pkg.lock_row_exception('CUST_ASSIGN_END_DATE',tlcustinfo.CUST_ASSIGN_END_DATE);
336    END IF;
337 
338    IF NOT ((tlcustinfo.ALLOCATED_AREA_PCT = X_ALLOCATED_AREA_PCT)
339                OR ((tlcustinfo.ALLOCATED_AREA_PCT is null) AND (X_ALLOCATED_AREA_PCT is null))) THEN
340       pn_var_rent_pkg.lock_row_exception('ALLOCATED_AREA_PCT',tlcustinfo.ALLOCATED_AREA_PCT);
341    END IF;
342 
343    IF NOT ((tlcustinfo.ALLOCATED_AREA = X_ALLOCATED_AREA)
344                OR ((tlcustinfo.ALLOCATED_AREA is null) AND (X_ALLOCATED_AREA is null))) THEN
345       pn_var_rent_pkg.lock_row_exception('ALLOCATED_AREA',tlcustinfo.ALLOCATED_AREA);
346    END IF;
347 
348    IF NOT ((tlcustinfo.UTILIZED_AREA = X_UTILIZED_AREA)
349                OR ((tlcustinfo.UTILIZED_AREA is null) AND (X_UTILIZED_AREA is null))) THEN
350       pn_var_rent_pkg.lock_row_exception('UTILIZED_AREA',tlcustinfo.UTILIZED_AREA);
351    END IF;
352 
353    IF NOT ((tlcustinfo.CUST_SPACE_COMMENTS = X_CUST_SPACE_COMMENTS)
354                OR ((tlcustinfo.CUST_SPACE_COMMENTS is null) AND (X_CUST_SPACE_COMMENTS is null))) THEN
355       pn_var_rent_pkg.lock_row_exception('CUST_SPACE_COMMENTS',tlcustinfo.CUST_SPACE_COMMENTS);
356    END IF;
357 
358    IF NOT ((tlcustinfo.ATTRIBUTE_CATEGORY = X_ATTRIBUTE_CATEGORY)
359                OR ((tlcustinfo.ATTRIBUTE_CATEGORY is null) AND (X_ATTRIBUTE_CATEGORY is null))) THEN
360       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE_CATEGORY',tlcustinfo.ATTRIBUTE_CATEGORY);
361    END IF;
362 
363    IF NOT ((tlcustinfo.ATTRIBUTE1 = X_ATTRIBUTE1)
364                OR ((tlcustinfo.ATTRIBUTE1 is null) AND (X_ATTRIBUTE1 is null))) THEN
365       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE1',tlcustinfo.ATTRIBUTE1);
366    END IF;
367 
368    IF NOT ((tlcustinfo.ATTRIBUTE2 = X_ATTRIBUTE2)
369                OR ((tlcustinfo.ATTRIBUTE2 is null) AND (X_ATTRIBUTE2 is null))) THEN
370       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE2',tlcustinfo.ATTRIBUTE2);
371    END IF;
372 
373    IF NOT ((tlcustinfo.ATTRIBUTE3 = X_ATTRIBUTE3)
374                OR ((tlcustinfo.ATTRIBUTE3 is null) AND (X_ATTRIBUTE3 is null))) THEN
375       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE3',tlcustinfo.ATTRIBUTE3);
376    END IF;
377 
378    IF NOT ((tlcustinfo.ATTRIBUTE4 = X_ATTRIBUTE4)
379                OR ((tlcustinfo.ATTRIBUTE4 is null) AND (X_ATTRIBUTE4 is null))) THEN
380       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE4',tlcustinfo.ATTRIBUTE4);
381    END IF;
382 
383    IF NOT ((tlcustinfo.ATTRIBUTE5 = X_ATTRIBUTE5)
384                OR ((tlcustinfo.ATTRIBUTE5 is null) AND (X_ATTRIBUTE5 is null))) THEN
385       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE5',tlcustinfo.ATTRIBUTE5);
386    END IF;
387 
388    IF NOT ((tlcustinfo.ATTRIBUTE6 = X_ATTRIBUTE6)
389                OR ((tlcustinfo.ATTRIBUTE6 is null) AND (X_ATTRIBUTE6 is null))) THEN
390       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE6',tlcustinfo.ATTRIBUTE6);
391    END IF;
392 
393    IF NOT ((tlcustinfo.ATTRIBUTE7 = X_ATTRIBUTE7)
394                OR ((tlcustinfo.ATTRIBUTE7 is null) AND (X_ATTRIBUTE7 is null))) THEN
395       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE7',tlcustinfo.ATTRIBUTE7);
396    END IF;
397 
398    IF NOT ((tlcustinfo.ATTRIBUTE8 = X_ATTRIBUTE8)
399                OR ((tlcustinfo.ATTRIBUTE8 is null) AND (X_ATTRIBUTE8 is null))) THEN
400       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE8',tlcustinfo.ATTRIBUTE8);
401    END IF;
402 
403    IF NOT ((tlcustinfo.ATTRIBUTE9 = X_ATTRIBUTE9)
404                OR ((tlcustinfo.ATTRIBUTE9 is null) AND (X_ATTRIBUTE9 is null))) THEN
405       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE9',tlcustinfo.ATTRIBUTE9);
406    END IF;
407 
408    IF NOT ((tlcustinfo.ATTRIBUTE10 = X_ATTRIBUTE10)
409                OR ((tlcustinfo.ATTRIBUTE10 is null) AND (X_ATTRIBUTE10 is null))) THEN
410       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE10',tlcustinfo.ATTRIBUTE10);
411    END IF;
412 
413    IF NOT ((tlcustinfo.ATTRIBUTE11 = X_ATTRIBUTE11)
414                OR ((tlcustinfo.ATTRIBUTE11 is null) AND (X_ATTRIBUTE11 is null))) THEN
415       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE11',tlcustinfo.ATTRIBUTE11);
416    END IF;
417 
418    IF NOT ((tlcustinfo.ATTRIBUTE12 = X_ATTRIBUTE12)
419                OR ((tlcustinfo.ATTRIBUTE12 is null) AND (X_ATTRIBUTE12 is null))) THEN
420       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE12',tlcustinfo.ATTRIBUTE12);
421    END IF;
422 
423    IF NOT ((tlcustinfo.ATTRIBUTE13 = X_ATTRIBUTE13)
424                OR ((tlcustinfo.ATTRIBUTE13 is null) AND (X_ATTRIBUTE13 is null))) THEN
425       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE13',tlcustinfo.ATTRIBUTE13);
426    END IF;
427 
428    IF NOT ((tlcustinfo.ATTRIBUTE14 = X_ATTRIBUTE14)
429                OR ((tlcustinfo.ATTRIBUTE14 is null) AND (X_ATTRIBUTE14 is null))) THEN
430       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE14',tlcustinfo.ATTRIBUTE14);
431    END IF;
432 
433    IF NOT ((tlcustinfo.ATTRIBUTE15 = X_ATTRIBUTE15)
434                OR ((tlcustinfo.ATTRIBUTE15 is null) AND (X_ATTRIBUTE15 is null))) THEN
435       pn_var_rent_pkg.lock_row_exception('ATTRIBUTE15',tlcustinfo.ATTRIBUTE15);
436    END IF;
437 
438    IF NOT ((tlcustinfo.LEASE_ID = X_LEASE_ID)
439                OR ((tlcustinfo.LEASE_ID is null) AND (X_LEASE_ID is null))) THEN
440       pn_var_rent_pkg.lock_row_exception('LEASE_ID',tlcustinfo.LEASE_ID);
441    END IF;
442 
443    IF NOT ((tlcustinfo.RECOVERY_SPACE_STD_CODE = X_RECOVERY_SPACE_STD_CODE)
444                OR ((tlcustinfo.RECOVERY_SPACE_STD_CODE is null) AND (X_RECOVERY_SPACE_STD_CODE is null))) THEN
445       pn_var_rent_pkg.lock_row_exception('RECOVERY_SPACE_STD_CODE',tlcustinfo.RECOVERY_SPACE_STD_CODE);
446    END IF;
447 
448    IF NOT ((tlcustinfo.RECOVERY_TYPE_CODE = X_RECOVERY_TYPE_CODE)
449                OR ((tlcustinfo.RECOVERY_TYPE_CODE is null) AND (X_RECOVERY_TYPE_CODE is null))) THEN
450       pn_var_rent_pkg.lock_row_exception('RECOVERY_TYPE_CODE',tlcustinfo.RECOVERY_TYPE_CODE);
451    END IF;
452 
453    IF NOT ((tlcustinfo.FIN_OBLIG_END_DATE = X_FIN_OBLIG_END_DATE)
454                OR ((tlcustinfo.FIN_OBLIG_END_DATE is null) AND (X_FIN_OBLIG_END_DATE is null))) THEN
455       pn_var_rent_pkg.lock_row_exception('FIN_OBLIG_END_DATE',tlcustinfo.FIN_OBLIG_END_DATE);
456    END IF;
457 
458    IF NOT ((tlcustinfo.TENANCY_ID = X_TENANCY_ID)
459               OR ((tlcustinfo.TENANCY_ID is null) AND (X_TENANCY_ID is null))) THEN
460       pn_var_rent_pkg.lock_row_exception('TENANCY_ID',tlcustinfo.TENANCY_ID);
461    END IF;
462 
463    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.LOCK_ROW (-) SpcAsgnId: '
464                         ||x_cust_space_assign_id);
465 
466 END Lock_Row;
467 
468 -------------------------------------------------------------------------------
469 -- PROCEDURE    : UPDATE_ROW
470 -- INVOKED FROM : UPDATE_ROW procedure
471 -- PURPOSE      : updates the row
472 -- HISTORY      :
473 -- 05-MAR-04 ftanudja o Replaced check_dupcust.. w/ chk_dup_cust..
474 -- 14-DEC-04 STripath o Modified for Portfolio Status Enh BUG# 4030816. Added
475 --                      code to check loc is contigious assignable betn assign
476 --                      start and end dates.
477 -- 21-JUN-05  hrodda  o Bug 4284035 - Replaced pn_space_assign_cust
478 --                      with _ALL table.
479 -- 08-SEP-05 Hareesha o Modified insert statement to include org_id.
480 -- 08-Feb-07 Ram kumar o Removed the check for duplicate Space assignments
481 --                       for bug fix 5864468
482 -------------------------------------------------------------------------------
483 
484 PROCEDURE Update_Row (
485   X_CUST_SPACE_ASSIGN_ID          IN     NUMBER,
486   X_LOCATION_ID                   IN     NUMBER,
487   X_CUST_ACCOUNT_ID               IN     NUMBER,
488   X_SITE_USE_ID                   IN     NUMBER,
489   X_EXPENSE_ACCOUNT_ID            IN     NUMBER,
490   X_PROJECT_ID                    IN     NUMBER,
491   X_TASK_ID                       IN     NUMBER,
492   X_CUST_ASSIGN_START_DATE        IN     DATE,
493   X_CUST_ASSIGN_END_DATE          IN     DATE,
494   X_ALLOCATED_AREA_PCT            IN     NUMBER,
495   X_ALLOCATED_AREA                IN     NUMBER,
496   X_UTILIZED_AREA                 IN     NUMBER,
497   X_CUST_SPACE_COMMENTS           IN     VARCHAR2,
498   X_ATTRIBUTE_CATEGORY            IN     VARCHAR2,
499   X_ATTRIBUTE1                    IN     VARCHAR2,
500   X_ATTRIBUTE2                    IN     VARCHAR2,
501   X_ATTRIBUTE3                    IN     VARCHAR2,
502   X_ATTRIBUTE4                    IN     VARCHAR2,
503   X_ATTRIBUTE5                    IN     VARCHAR2,
504   X_ATTRIBUTE6                    IN     VARCHAR2,
505   X_ATTRIBUTE7                    IN     VARCHAR2,
506   X_ATTRIBUTE8                    IN     VARCHAR2,
507   X_ATTRIBUTE9                    IN     VARCHAR2,
508   X_ATTRIBUTE10                   IN     VARCHAR2,
509   X_ATTRIBUTE11                   IN     VARCHAR2,
510   X_ATTRIBUTE12                   IN     VARCHAR2,
511   X_ATTRIBUTE13                   IN     VARCHAR2,
512   X_ATTRIBUTE14                   IN     VARCHAR2,
513   X_ATTRIBUTE15                   IN     VARCHAR2,
514   X_LAST_UPDATE_DATE              IN     DATE,
515   X_LAST_UPDATED_BY               IN     NUMBER,
516   X_LAST_UPDATE_LOGIN             IN     NUMBER,
517   X_UPDATE_CORRECT_OPTION         IN     VARCHAR2,
518   X_CHANGED_START_DATE            OUT    NOCOPY DATE,
519   X_LEASE_ID                      IN     NUMBER,
520   X_RECOVERY_SPACE_STD_CODE       IN     VARCHAR2,
521   X_RECOVERY_TYPE_CODE            IN     VARCHAR2,
522   X_FIN_OBLIG_END_DATE            IN     DATE,
523   X_TENANCY_ID                    IN     NUMBER,
524   X_RETURN_STATUS                 OUT NOCOPY VARCHAR2
525   )
526 IS
527 
528    l_cust_space_assign_id          NUMBER;
529    l_fin_oblig_end_date            DATE;
530    l_status                        VARCHAR2(100);
531    l_err_msg                       VARCHAR2(30);
532 
533 BEGIN
534         pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.UPDATE_ROW (+) SpcAsgnId: '
535                         ||x_cust_space_assign_id||', Mode: '||x_update_correct_option||', LocId: '||x_location_id
536                         ||', StrDt: '||TO_CHAR(x_cust_assign_start_date,'MM/DD/YYYY')
537                         ||', EndDt: '||TO_CHAR(x_cust_assign_end_date, 'MM/DD/YYYY')
538                         ||', CustId: '||x_cust_account_id);
539 
540    -- Check if location is contigious Customer Assignable betn assign start and end dates.
541    IF (x_location_id <> tlcustinfo.location_id) OR
542       (x_cust_assign_start_date <> tlcustinfo.cust_assign_start_date) OR
543       (NVL(x_cust_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY')) <>
544        NVL(tlcustinfo.cust_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY')))
545    THEN
546       pnt_locations_pkg.Check_Location_Gaps(
547                           p_loc_id     => x_location_id
548                          ,p_str_dt     => x_cust_assign_start_date
549                          ,p_end_dt     => NVL(x_cust_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY'))
550                          ,p_asgn_mode  => 'CUST'
551                          ,p_err_msg    => l_err_msg
552                           );
553 
554       IF l_err_msg IS NOT NULL THEN
555          fnd_message.set_name('PN', 'PN_INVALID_SPACE_ASSGN_DATE');
556          x_return_status := 'INVALID_LOC_DATE';
557          return;
558       END IF;
559    END IF;
560 
561    /*IF  x_cust_account_id <> tlcustinfo.cust_account_id THEN
562 
563        pn_space_assign_cust_pkg.chk_dup_cust_assign(
564                      p_cust_acnt_id  => x_cust_account_id
565                     ,p_loc_id        => x_location_id
566                     ,p_assgn_str_dt  => x_cust_assign_start_date
567                     ,p_assgn_end_dt  => x_cust_assign_end_date
568                     ,p_return_status => l_status);
569 
570        IF l_status = 'DUP_ASSIGN' THEN
571           fnd_message.set_name('PN', 'PN_SPASGN_CUSTOMER_OVRLAP_MSG');
572           x_return_status := 'DUP_ASSIGN';
573           return;
574        END IF;
575 
576    END IF; */
577 
578    IF X_UPDATE_CORRECT_OPTION = 'UPDATE' THEN
579 
580       SELECT  pn_space_assign_cust_s.NEXTVAL
581       INTO    l_cust_space_assign_id
582       FROM    DUAL;
583 
584       IF X_FIN_OBLIG_END_DATE IS NOT NULL THEN
585          l_fin_oblig_end_date := X_CUST_ASSIGN_START_DATE - 1;
586       ELSE
587          l_fin_oblig_end_date := NULL;
588       END IF;
589 
590 
591       INSERT INTO pn_space_assign_cust_all
592            (CUST_SPACE_ASSIGN_ID,
593             LOCATION_ID,
594             CUST_ACCOUNT_ID,
595             SITE_USE_ID,
596             EXPENSE_ACCOUNT_ID,
597             PROJECT_ID,
598             TASK_ID,
599             CUST_ASSIGN_START_DATE,
600             CUST_ASSIGN_END_DATE,
601             ALLOCATED_AREA_PCT,
602             ALLOCATED_AREA,
603             UTILIZED_AREA,
604             CUST_SPACE_COMMENTS,
605             LAST_UPDATE_DATE,
606             LAST_UPDATED_BY,
607             CREATION_DATE,
608             CREATED_BY,
609             LAST_UPDATE_LOGIN,
610             ATTRIBUTE_CATEGORY,
611             ATTRIBUTE1,
612             ATTRIBUTE2,
613             ATTRIBUTE3,
614             ATTRIBUTE4,
615             ATTRIBUTE5,
616             ATTRIBUTE6,
617             ATTRIBUTE7,
618             ATTRIBUTE8,
619             ATTRIBUTE9,
620             ATTRIBUTE10,
621             ATTRIBUTE11,
622             ATTRIBUTE12,
623             ATTRIBUTE13,
624             ATTRIBUTE14,
625             ATTRIBUTE15,
626             LEASE_ID,
627             RECOVERY_SPACE_STD_CODE,
628             RECOVERY_TYPE_CODE,
629             FIN_OBLIG_END_DATE,
630             TENANCY_ID,
631             ORG_ID)
632       VALUES
633            (l_cust_space_assign_id,
634             tlcustinfo.LOCATION_ID,
635             tlcustinfo.CUST_ACCOUNT_ID,
636             tlcustinfo.SITE_USE_ID,
637             tlcustinfo.EXPENSE_ACCOUNT_ID,
638             tlcustinfo.PROJECT_ID,
639             tlcustinfo.TASK_ID,
640             tlcustinfo.CUST_ASSIGN_START_DATE,
641             X_CUST_ASSIGN_START_DATE - 1,
642             tlcustinfo.ALLOCATED_AREA_PCT,
643             tlcustinfo.ALLOCATED_AREA,
644             tlcustinfo.UTILIZED_AREA,
645             tlcustinfo.CUST_SPACE_COMMENTS,
646             tlcustinfo.LAST_UPDATE_DATE,
647             tlcustinfo.LAST_UPDATED_BY,
648             tlcustinfo.CREATION_DATE,
649             tlcustinfo.CREATED_BY,
650             tlcustinfo.LAST_UPDATE_LOGIN,
651             tlcustinfo.ATTRIBUTE_CATEGORY,
652             tlcustinfo.ATTRIBUTE1,
653             tlcustinfo.ATTRIBUTE2,
654             tlcustinfo.ATTRIBUTE3,
655             tlcustinfo.ATTRIBUTE4,
656             tlcustinfo.ATTRIBUTE5,
657             tlcustinfo.ATTRIBUTE6,
658             tlcustinfo.ATTRIBUTE7,
659             tlcustinfo.ATTRIBUTE8,
660             tlcustinfo.ATTRIBUTE9,
661             tlcustinfo.ATTRIBUTE10,
662             tlcustinfo.ATTRIBUTE11,
663             tlcustinfo.ATTRIBUTE12,
664             tlcustinfo.ATTRIBUTE13,
665             tlcustinfo.ATTRIBUTE14,
666             tlcustinfo.ATTRIBUTE15,
667             tlcustinfo.LEASE_ID,
668             tlcustinfo.RECOVERY_SPACE_STD_CODE,
669             tlcustinfo.RECOVERY_TYPE_CODE,
670             l_fin_oblig_end_date,
671             tlcustinfo.TENANCY_ID,
672             tlcustinfo.org_id
673       );
674 
675    END IF;
676 
677 
678    UPDATE PN_SPACE_ASSIGN_CUST_ALL SET
679       LOCATION_ID                     = X_LOCATION_ID,
680       CUST_ACCOUNT_ID                 = X_CUST_ACCOUNT_ID,
681       SITE_USE_ID                     = X_SITE_USE_ID,
682       EXPENSE_ACCOUNT_ID              = X_EXPENSE_ACCOUNT_ID,
683       PROJECT_ID                      = X_PROJECT_ID,
684       TASK_ID                         = X_TASK_ID,
685       CUST_ASSIGN_START_DATE          = X_CUST_ASSIGN_START_DATE,
686       CUST_ASSIGN_END_DATE            = X_CUST_ASSIGN_END_DATE,
687       ALLOCATED_AREA_PCT              = X_ALLOCATED_AREA_PCT,
688       ALLOCATED_AREA                  = X_ALLOCATED_AREA,
689       UTILIZED_AREA                   = X_UTILIZED_AREA,
690       CUST_SPACE_COMMENTS             = X_CUST_SPACE_COMMENTS,
691       ATTRIBUTE_CATEGORY              = X_ATTRIBUTE_CATEGORY,
692       ATTRIBUTE1                      = X_ATTRIBUTE1,
693       ATTRIBUTE2                      = X_ATTRIBUTE2,
694       ATTRIBUTE3                      = X_ATTRIBUTE3,
695       ATTRIBUTE4                      = X_ATTRIBUTE4,
696       ATTRIBUTE5                      = X_ATTRIBUTE5,
697       ATTRIBUTE6                      = X_ATTRIBUTE6,
698       ATTRIBUTE7                      = X_ATTRIBUTE7,
699       ATTRIBUTE8                      = X_ATTRIBUTE8,
700       ATTRIBUTE9                      = X_ATTRIBUTE9,
701       ATTRIBUTE10                     = X_ATTRIBUTE10,
702       ATTRIBUTE11                     = X_ATTRIBUTE11,
703       ATTRIBUTE12                     = X_ATTRIBUTE12,
704       ATTRIBUTE13                     = X_ATTRIBUTE13,
705       ATTRIBUTE14                     = X_ATTRIBUTE14,
706       ATTRIBUTE15                     = X_ATTRIBUTE15,
707       CUST_SPACE_ASSIGN_ID            = X_CUST_SPACE_ASSIGN_ID,
708       LAST_UPDATE_DATE                = X_LAST_UPDATE_DATE,
709       LAST_UPDATED_BY                 = X_LAST_UPDATED_BY,
710       LAST_UPDATE_LOGIN               = X_LAST_UPDATE_LOGIN,
711       LEASE_ID                        = X_LEASE_ID,
712       RECOVERY_SPACE_STD_CODE         = X_RECOVERY_SPACE_STD_CODE,
713       RECOVERY_TYPE_CODE              = X_RECOVERY_TYPE_CODE,
714       FIN_OBLIG_END_DATE              = X_FIN_OBLIG_END_DATE,
715       TENANCY_ID                      = X_TENANCY_ID
716    WHERE CUST_SPACE_ASSIGN_ID         = X_CUST_SPACE_ASSIGN_ID;
717 
718    X_CHANGED_START_DATE := X_CUST_ASSIGN_START_DATE;
719 
720    IF (SQL%NOTFOUND) THEN
721       RAISE NO_DATA_FOUND;
722    END IF;
723 
724    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.UPDATE_ROW (-) SpcAsgnId: '
725                         ||x_cust_space_assign_id||', Mode: '||x_update_correct_option||', LocId: '||x_location_id
726                         ||', StrDt: '||TO_CHAR(x_cust_assign_start_date,'MM/DD/YYYY')
727                         ||', EndDt: '||TO_CHAR(x_cust_assign_end_date, 'MM/DD/YYYY')
728                         ||', CustId: '||x_cust_account_id);
729 
730 END Update_Row;
731 
732 -------------------------------------------------------------------------------
733 -- PROCEDURE    : Delete_Row
734 -- INVOKED FROM : Delete_Row procedure
735 -- PURPOSE      : deletes the row
736 -- HISTORY      :
737 -- 21-JUN-05  hrodda  o Bug 4284035 - Replaced pn_space_assign_cust
738 --                      with _ALL table.
739 -------------------------------------------------------------------------------
740 PROCEDURE Delete_Row (
741   X_CUST_SPACE_ASSIGN_ID          IN     NUMBER
742 )
743 IS
744 
745 BEGIN
746 
747    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.DELETE_ROW (+) SpcAsgnId: '
748                         ||x_cust_space_assign_id);
749 
750 
751    DELETE FROM pn_space_assign_cust_all
752    WHERE cust_space_assign_id = x_cust_space_assign_id;
753 
754    IF (SQL%NOTFOUND) THEN
755       RAISE NO_DATA_FOUND;
756    END IF;
757 
758    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.DELETE_ROW (-) SpcAsgnId: '
759                         ||x_cust_space_assign_id);
760 
761 END Delete_Row;
762 
763 -------------------------------------------------------------------------------
764 -- PROCEDURE    : CHK_DUP_CUST_ASSIGN
765 -- PURPOSE      : The procedure checks to see if there exists another assignment
766 --                record for the same customer, for the same date range.
767 --                If there exists one then it stops user from doing the assignment.
768 -- HISTORY      :
769 -- 05-MAR-04  ftanudja o Copied from pn_tenancies_pkg v115.50
770 -- 21-JUN-05  hrodda   o Bug 4284035 - Replaced pn_space_assign_cust
771 --                       with _ALL table.
772 -------------------------------------------------------------------------------
773 
774 PROCEDURE chk_dup_cust_assign(
775                  p_cust_acnt_id                     IN     NUMBER
776                 ,p_loc_id                           IN     NUMBER
777                 ,p_assgn_str_dt                     IN     DATE
778                 ,p_assgn_end_dt                     IN     DATE
779                 ,p_return_status                    OUT NOCOPY VARCHAR2
780                 )
781 IS
782   l_err_flag       VARCHAR2(1) := 'N';
783 
784   CURSOR check_cust_assignment IS
785      SELECT 'Y'
786      FROM   DUAL
787      WHERE  EXISTS (SELECT NULL
788                     FROM   pn_space_assign_cust_all
789                     WHERE  cust_account_id = p_cust_acnt_id
790                     AND    location_id = p_loc_id
791                     AND    cust_assign_start_date <= p_assgn_end_dt
792                     AND    NVL(cust_assign_end_date, TO_DATE('12/31/4712', 'MM/DD/YYYY'))
793                            >= p_assgn_str_dt);
794 BEGIN
795    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.CHK_DUP_CUST_ASSIGN (+)');
796 
797    OPEN check_cust_assignment;
798    FETCH check_cust_assignment INTO l_err_flag;
799    CLOSE check_cust_assignment;
800 
801    IF NVL(l_err_flag,'N') = 'Y' THEN
802       p_return_status := 'DUP_ASSIGN';
803    END IF;
804 
805    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.CHK_DUP_CUST_ASSIGN (-) '||p_return_status);
806 END chk_dup_cust_assign;
807 
808 -------------------------------------------------------------------
809 -- PROCEDURE  : GET_DUP_CUST_ASSIGN_COUNT
810 -- DESCRIPTION: Counts number of assignments for a given parameter
811 --    05-MAR-2004   Satish Tripathi o Created.
812 --    08-MAR-2004   Satish Tripathi o Added parameter p_dup_assign_count.
813 -------------------------------------------------------------------
814 PROCEDURE get_dup_cust_assign_count(
815                  p_cust_acnt_id                     IN     NUMBER
816                 ,p_loc_id                           IN     NUMBER
817                 ,p_assgn_str_dt                     IN     DATE
818                 ,p_assgn_end_dt                     IN     DATE
819                 ,p_assign_count                     OUT NOCOPY NUMBER
820                 ,p_dup_assign_count                 OUT NOCOPY NUMBER
821                 )
822 IS
823    l_assign_count       NUMBER := 0;
824    l_dup_assign_count   NUMBER := 0;
825 
826    CURSOR get_cust_assignment IS
827       SELECT cust_space_assign_id, cust_account_id
828       FROM   pn_space_assign_cust_all
829       WHERE  location_id = p_loc_id
830       AND    cust_assign_start_date <= p_assgn_end_dt
831       AND    NVL(cust_assign_end_date, TO_DATE('12/31/4712', 'MM/DD/YYYY'))
832              >= p_assgn_str_dt;
833 BEGIN
834    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.GET_DUP_CUST_ASSIGN_COUNT (+)');
835 
836    FOR cust_assign IN get_cust_assignment
837    LOOP
838       l_assign_count := l_assign_count + 1;
839       IF cust_assign.cust_account_id = p_cust_acnt_id THEN
840          l_dup_assign_count := l_dup_assign_count + 1;
841       END IF;
842    END LOOP;
843 
844    p_assign_count := l_assign_count;
845    p_dup_assign_count := l_dup_assign_count;
846 
847    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.GET_DUP_CUST_ASSIGN_COUNT (-) '||p_assign_count);
848 END get_dup_cust_assign_count;
849 
850 -----------------------------------------------------------------------
851 -- FUNCTION  : check_assign_arcl_line
852 -- PURPOSE   : This function checks to see if there exists an area class
853 --             detail line having customer space assignment id in question.
854 --
855 -- IN PARAM  : Customer Space Assignment Id.
856 -- History   :
857 --    26-JUN-2003   Mrinal Misra   o Created.
858 -----------------------------------------------------------------------
859 FUNCTION check_assign_arcl_line(p_cust_space_assign_id IN NUMBER)
860 RETURN BOOLEAN IS
861 
862   l_exists       VARCHAR2(1);
863 
864   CURSOR cust_arcl_cur IS
865      SELECT 'Y'
866      FROM   DUAL
867      WHERE  EXISTS (SELECT NULL
868                     FROM   pn_rec_arcl_dtlln_all
869                     WHERE  cust_space_assign_id = p_cust_space_assign_id);
870 BEGIN
871 
872    l_exists := 'N';
873 
874    OPEN cust_arcl_cur;
875    FETCH cust_arcl_cur INTO l_exists;
876    CLOSE cust_arcl_cur;
877 
878    IF l_exists = 'Y' THEN
879       RETURN TRUE;
880    ELSE
881       RETURN FALSE;
882    END IF;
883 
884 END check_assign_arcl_line;
885 
886 -------------------------------------------------------------------------------
887 -- FUNCTION  : assignment_split
888 -- PURPOSE   : This function splits assignment records based on dates
889 --             of existing assignments for re-distribution when profile
890 --             PN_AUTO_SPACE_ASSIGN is set to YES.
891 --             IF location L1 exists as below with an assignable space of 1200
892 --             from 1/1/01 to end of time(eot)
893 --             If space assignment for S1 for customer C1 for location L1 is
894 --             assigned from 1/1/01 to eot as below
895 --
896 --            1200                                   1200.. 100%
897 --     L1 |--------------------eot     L1,S1,C1 |------------------------eot
898 --       1/1                                     1/1
899 --
900 --             and then another assignment S2 for customer C2 for the same
901 --             location is made from 2/1/01 to 3/31/01 then the following
902 --             assignments will be created and area re-distributed
903 --
904 --            1200                     1200.. 100%
905 --     L1 |--------------------eot    L1,S1,C1 |----|
906 --       1/1                               1/1   1/31
907 --                                              600..50%
908 --                                    L1,S2,C2      |------|
909 --                                                 2/1   3/31
910 --                                              600..50%
911 --                                    L1,S2,C1      |------|
912 --                                                 2/1   3/31
913 --                                                         1200..100%
914 --                                    L1,S2,C1             |---------------------eot
915 --                                                        4/1
916 --             Now if the location area is changed from 1200 to 1201 as of
917 --             2/15/01 then the following assignments will be created and area
918 --             re-distributed
919 --
920 --             1200      1201          1200.. 100%
921 --      L1 |-------|------------eot   L1,S1,C1 |----|
922 --        1/1     2/15                        1/1   1/31
923 --                                              600..50%
924 --                                    L1,S2,C2      |----|
925 --                                                 2/1   2/14
926 --                                                   601.5---50%
927 --                                    L1,S2,C2           |----|
928 --                                                      2/15  3/31
929 --                                                   601.5---50%
930 --                                    L1,S2,C1           |----|
931 --                                                      2/15  3/31
932 --                                              600..50%
933 --                                    L1,S2,C1      |----|
934 --                                                 2/1   2/14
935 --                                                               1201..100%
936 --                                    L1,S2,C1                |---------------------eot
937 --                                                           4/1
938 --
939 --
940 -- IN PARAM  : Location Id.
941 -- History   :
942 -- 20-OCT-03 DThota     o Created. Fix for bug # 3234403
943 -- 05-NOV-03 DThota     o Initialized  pn_space_assign_emp_pkg.tlempinfo
944 --                        := emp_split_rec
945 -- 06-NOV-03 DThota     o Aliased assignable_area to allocated_area
946 --                        in csr_main.
947 -- 07-NOV-03 DThota     o Used min on active_start_date and max on
948 --                        active_end_date and used grouping logic in
949 --                        cursor csr_main in the last UNION ALL so that
950 --                        in the event that a location is split without
951 --                        change in the assignable_area only those start
952 --                        and end dates will be picked up where the
953 --                        assignable_area has changed. bug # 3243309.
954 --                        Changed the WHERE clause of cursor
955 --                        csr_location_area
956 -- 02-JUN-04 STripathi  o Call Defrag_Contig_Assign at end.
957 -- 30-SEP-04 STripathi  o Distribute area_pct_and_area only when Auto
958 --                        Space Dist= Y.
959 -- 08-OCT-04 STripathi  o For Auto Space Dist= Y, update area of split records.
960 -- 22-FEB-05 MMisra     o Fixed Bug # 4194998. Added ORDER BY clause in
961 --                        csr_main cursor query.
962 -- 07-MAR-05 ftanudja   o #4199297 - Added start and end date to
963 --                        assignment_split().
964 -- 19-MAY-05 ftanudja   o #4349490 - Changed csr_emp and csr_cust to increase
965 --                        range by +/- 1 day so that split assignments are
966 --                        included.
967 -- 21-JUN-05 hareesha   o Bug 4284035 - Replaced pn_space_assign_cust,
968 --                        pn_space_assign_emp and pn_loactions with _ALL
969 --                        table.
970 -- 25-Aug-05 hareesha   o Bug 4551557 - Modified csr_main cursor query to
971 --                        include space assignments starting after the specified
972 --                        end_date.
973 -- 28-NOV-05 pikhar     o passed org_id in pn_mo_cache_utils.get_profile_value
974 -- 04-APR-06 Hareesha   o Bug #5202023 Fetched org_id from pn_locations_all
975 --                        instead of pn_space_assign_cust_all because
976 --                        assignment_split could be called for
977 --                        employee space assignment too.
978 -------------------------------------------------------------------------------
979 
980 -- 102403 -- date track space assignment
981 
982 PROCEDURE assignment_split(p_location_id IN PN_LOCATIONS_ALL.location_id%TYPE,
983                            p_start_date  IN pn_locations_all.active_start_date%TYPE,
984                            p_end_date    IN pn_locations_all.active_end_date%TYPE
985                            ) IS
986 
987    -------------------------------------------------------------------------------------
988    -- This cursor is used to get customers and employees assigned to a location and their date info
989    -- to get dates for which the assignment records need to be split using the procedure
990    -- process vacancy
991    -------------------------------------------------------------------------------------
992    CURSOR csr_main IS
993       SELECT cust_assign_start_date start_date
994              ,NVL(cust_assign_end_date , to_date('12/31/4712','MM/DD/YYYY')) end_date
995              ,allocated_area
996              ,location_id
997              ,'CUST: '||cust_space_assign_id assign_type_id
998       FROM   pn_space_assign_cust_all
999       WHERE  location_id = p_location_id
1000         AND  cust_assign_start_date <= p_end_date
1001         AND  NVL(cust_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= p_start_date
1002      UNION ALL
1003      SELECT cust_assign_start_date start_date
1004             ,NVL(cust_assign_end_date, to_date('12/31/4712','MM/DD/YYYY')) end_date
1005             ,allocated_area
1006             ,location_id
1007             ,'CUST: '||cust_space_assign_id assign_type_id
1008       FROM   pn_space_assign_cust_all
1009       WHERE  location_id = p_location_id
1010         AND  cust_assign_start_date > p_end_date
1011       UNION ALL
1012       SELECT emp_assign_start_date start_date
1013             ,NVL(emp_assign_end_date, to_date('12/31/4712','MM/DD/YYYY')) end_date
1014             ,allocated_area
1015             ,location_id
1016             ,'EMP: '||emp_space_assign_id assign_type_id
1017       FROM   pn_space_assign_emp_all
1018       WHERE  location_id = p_location_id
1019         AND  emp_assign_start_date <= p_end_date
1020         AND  NVL(emp_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= p_start_date
1021       UNION ALL
1022       SELECT emp_assign_start_date start_date
1023             ,NVL(emp_assign_end_date, to_date('12/31/4712','MM/DD/YYYY')) end_date
1024             ,allocated_area
1025             ,location_id
1026             ,'EMP: '||emp_space_assign_id assign_type_id
1027       FROM   pn_space_assign_emp_all
1028       WHERE  location_id = p_location_id
1029         AND  emp_assign_start_date > p_end_date
1030       UNION ALL
1031       SELECT min(active_start_date) start_date
1032             ,max(NVL(active_end_date, to_date('12/31/4712','MM/DD/YYYY'))) end_date
1033             ,assignable_area allocated_area
1034             ,location_id
1035             ,'LOCN.' assign_type_id
1036       FROM   pn_locations_all
1037       WHERE  location_id = p_location_id
1038         AND  active_start_date <= p_end_date
1039         AND  active_end_date >= p_start_date
1040       GROUP BY assignable_area,location_id
1041       ORDER BY start_date;
1042 
1043    -------------------------------------------------------------------------------------
1044    -- This cursor is used to get customers assigned to a location and their date info
1045    -- to get dates for which the assignment records need to be redistributed
1046    -------------------------------------------------------------------------------------
1047    CURSOR csr_cust IS
1048       SELECT cust_assign_start_date
1049              ,NVL(cust_assign_end_date, to_date('12/31/4712','MM/DD/YYYY')) cust_assign_end_date
1050              ,allocated_area
1051              ,allocated_area_pct
1052              ,location_id
1053              ,ROWID
1054       FROM   pn_space_assign_cust_all
1055       WHERE  location_id = p_location_id
1056         AND  cust_assign_start_date <= (p_end_date + 1)
1057         AND  NVL(cust_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= (p_start_date - 1)
1058         ;
1059 
1060    -------------------------------------------------------------------------------------
1061    -- This cursor is used to get employees assigned to a location and their date info
1062    -- to get dates for which the assignment records need to be redistributed
1063    -------------------------------------------------------------------------------------
1064    CURSOR csr_emp IS
1065       SELECT emp_assign_start_date
1066              ,NVL(emp_assign_end_date, to_date('12/31/4712','MM/DD/YYYY')) emp_assign_end_date
1067              ,allocated_area
1068              ,allocated_area_pct
1069              ,location_id
1070              ,ROWID
1071       FROM   pn_space_assign_emp_all
1072       WHERE  location_id = p_location_id
1073         AND  emp_assign_start_date <= (p_end_date + 1)
1074         AND  NVL(emp_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= (p_start_date - 1);
1075 
1076    -------------------------------------------------------------------------------------
1077    -- This cursor is used to get all customer assignment records whose start date is less than
1078    -- and end date greater than the split date returned by 'process vacancy'.
1079    -------------------------------------------------------------------------------------
1080    CURSOR csr_cust_split(p_as_of_date PN_SPACE_ASSIGN_CUST_ALL.cust_assign_start_date%TYPE) IS
1081       SELECT *
1082       FROM   pn_space_assign_cust_all
1083       WHERE  location_id = p_location_id
1084       AND    cust_assign_start_date < p_as_of_date
1085       AND    NVL(cust_assign_end_date,to_date('12/31/4712','MM/DD/YYYY')) >= p_as_of_date
1086       ORDER BY cust_assign_start_date,cust_assign_end_date;
1087 
1088 
1089    -------------------------------------------------------------------------------------
1090    -- This cursor is used to get all employee assignment records whose start date is less than
1091    -- and end date greater than the split date returned by 'process vacancy'.
1092    -------------------------------------------------------------------------------------
1093    CURSOR csr_emp_split(p_as_of_date PN_SPACE_ASSIGN_EMP_ALL.emp_assign_start_date%TYPE) IS
1094       SELECT *
1095       FROM   pn_space_assign_emp_all
1096       WHERE  location_id = p_location_id
1097       AND    emp_assign_start_date < p_as_of_date
1098       AND    NVL(emp_assign_end_date,to_date('12/31/4712','MM/DD/YYYY')) >= p_as_of_date
1099       ORDER BY emp_assign_start_date, emp_assign_end_date;
1100 
1101    -------------------------------------------------------------------------------------
1102    -- This cursor is used to get the latest area for a location based on the assignment dates
1103    -- after the split to update the assignments with the right area
1104    -------------------------------------------------------------------------------------
1105    CURSOR csr_location_area(p_location_id PN_LOCATIONS_ALL.location_id%TYPE
1106                             ,p_start_date PN_LOCATIONS_ALL.active_start_date%TYPE
1107                             ,p_end_date   PN_LOCATIONS_ALL.active_end_date%TYPE) IS
1108       SELECT assignable_area
1109       FROM   pn_locations_all
1110       WHERE  location_id = p_location_id
1111       AND    p_start_date between active_start_date
1112       AND    NVL(active_end_date,to_date('12/31/4712','MM/DD/YYYY'))
1113       ;
1114 
1115    l_num_table       pn_recovery_extract_pkg.number_table_TYPE;
1116    l_date_table      pn_recovery_extract_pkg.date_table_TYPE;
1117    l_date            DATE := NULL;
1118    p_date1           DATE := NULL;
1119    l_start_date      DATE := NULL;
1120    l_end_date        DATE := NULL;
1121    i                 NUMBER := 0;
1122    l_assignable_area PN_LOCATIONS_ALL.assignable_area%TYPE := 0;
1123    l_allocated_area  NUMBER;
1124    l_return_status   VARCHAR2(100) := NULL;
1125    l_profile         VARCHAR2(1);
1126 
1127    CURSOR org_cur IS
1128     SELECT org_id
1129     FROM   pn_locations_all
1130     WHERE  location_id = p_location_id;
1131 
1132 /* S.N. Bug 456550 */
1133    CURSOR office_sec_cur(b_location_id number) IS
1134      SELECT 1 FROM DUAL
1135      WHERE  EXISTS
1136             (SELECT '1'
1137              FROM   pn_locations_all loc
1138              WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1139              AND    loc.location_id = b_location_id
1140             );
1141 /* E.N. Bug 456550 */
1142 
1143    l_org_id NUMBER;
1144 
1145 
1146 BEGIN
1147 
1148    FOR rec IN org_cur LOOP
1149      l_org_id := rec.org_id;
1150      EXIT;
1151    END LOOP;
1152 
1153    l_profile := pn_mo_cache_utils.get_profile_value('PN_AUTOMATIC_SPACE_DISTRIBUTION',l_org_id);
1154 
1155    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.Assignment_Split (+)  Loc Id: '||p_location_id
1156                        ||', l_profile: '||l_profile);
1157 
1158       i := 1;
1159       FOR main_rec IN csr_main
1160 
1161       LOOP
1162 
1163          pnp_debug_pkg.debug('Csr_Main i: '||i
1164                              ||', Assign Start Dt: '||main_rec.start_date
1165                              ||', End Dt: '||main_rec.end_date
1166                              ||', Area: '||main_rec.allocated_area
1167                              ||', Type/Id: '||main_rec.assign_type_id
1168                             );
1169 
1170          -- Populates the date table with the dates needed to spilt the employee assignments
1171          pn_recovery_extract_pkg.process_vacancy(
1172                  p_start_date   => main_rec.start_date,
1173                  p_end_date     => main_rec.end_date,
1174                  p_area         => NVL(main_rec.allocated_area, 0),
1175                  p_date_table   => l_date_table,
1176                  p_number_table => l_num_table,
1177                  p_add          => TRUE);
1178          i := i + 1;
1179       END LOOP;
1180 
1181       i := 1;
1182 
1183       -- do not want any record to be split/created with the 0th date or with
1184       -- the last date
1185 
1186       FOR i IN 1 .. l_date_table.count-1
1187       LOOP
1188 
1189          pnp_debug_pkg.debug('counter i= '||i||', date table= '||l_date_table(i));
1190          IF l_date_table(i) > to_date('12/31/4712','MM/DD/YYYY') THEN
1191            pnp_debug_pkg.debug('date table.......exit '|| l_date_table(i));
1192            EXIT;
1193          END IF;
1194 
1195          p_date1:= l_date_table(i);
1196 
1197          FOR cust_split_rec IN csr_cust_split(l_date_table(i))
1198          LOOP
1199 
1200             pnp_debug_pkg.debug('Update Cust Row Assign_Id: '|| cust_split_rec.cust_space_assign_id
1201                                 ||', Loc_Id: '|| cust_split_rec.location_id
1202                                 ||', Cust_Id: '|| cust_split_rec.cust_account_id);
1203 
1204             tlcustinfo := NULL;
1205             tlcustinfo := cust_split_rec;
1206             ---------------------------------------------------------------------------------------
1207             -- Splits the existing assignment with the (date-1) passed from the date table returned
1208             -- by process vacancy and creates a new assignment with the split date
1209             ---------------------------------------------------------------------------------------
1210             PN_SPACE_ASSIGN_CUST_PKG.UPDATE_ROW(
1211               X_CUST_SPACE_ASSIGN_ID     => cust_split_rec.CUST_SPACE_ASSIGN_ID
1212               ,X_LOCATION_ID             => cust_split_rec.LOCATION_ID
1213               ,X_CUST_ACCOUNT_ID         => cust_split_rec.CUST_ACCOUNT_ID
1214               ,X_SITE_USE_ID             => NULL
1215               ,X_EXPENSE_ACCOUNT_ID      => cust_split_rec.EXPENSE_ACCOUNT_ID
1216               ,X_PROJECT_ID              => cust_split_rec.PROJECT_ID
1217               ,X_TASK_ID                 => cust_split_rec.TASK_ID
1218               ,X_CUST_ASSIGN_START_DATE  => l_date_table(i)
1219               ,X_CUST_ASSIGN_END_DATE    => cust_split_rec.CUST_ASSIGN_END_DATE
1220               ,X_ALLOCATED_AREA_PCT      => cust_split_rec.ALLOCATED_AREA_PCT
1221               ,X_ALLOCATED_AREA          => cust_split_rec.ALLOCATED_AREA
1222               ,X_UTILIZED_AREA           => cust_split_rec.UTILIZED_AREA
1223               ,X_CUST_SPACE_COMMENTS     => cust_split_rec.CUST_SPACE_COMMENTS
1224               ,X_ATTRIBUTE_CATEGORY      => cust_split_rec.ATTRIBUTE_CATEGORY
1225               ,X_ATTRIBUTE1              => cust_split_rec.ATTRIBUTE1
1226               ,X_ATTRIBUTE2              => cust_split_rec.ATTRIBUTE2
1227               ,X_ATTRIBUTE3              => cust_split_rec.ATTRIBUTE3
1228               ,X_ATTRIBUTE4              => cust_split_rec.ATTRIBUTE4
1229               ,X_ATTRIBUTE5              => cust_split_rec.ATTRIBUTE5
1230               ,X_ATTRIBUTE6              => cust_split_rec.ATTRIBUTE6
1231               ,X_ATTRIBUTE7              => cust_split_rec.ATTRIBUTE7
1232               ,X_ATTRIBUTE8              => cust_split_rec.ATTRIBUTE8
1233               ,X_ATTRIBUTE9              => cust_split_rec.ATTRIBUTE9
1234               ,X_ATTRIBUTE10             => cust_split_rec.ATTRIBUTE10
1235               ,X_ATTRIBUTE11             => cust_split_rec.ATTRIBUTE11
1236               ,X_ATTRIBUTE12             => cust_split_rec.ATTRIBUTE12
1237               ,X_ATTRIBUTE13             => cust_split_rec.ATTRIBUTE13
1238               ,X_ATTRIBUTE14             => cust_split_rec.ATTRIBUTE14
1239               ,X_ATTRIBUTE15             => cust_split_rec.ATTRIBUTE15
1240               ,X_LEASE_ID                => cust_split_rec.LEASE_ID
1241               ,X_TENANCY_ID              => cust_split_rec.TENANCY_ID
1242               ,X_RECOVERY_SPACE_STD_CODE => cust_split_rec.RECOVERY_SPACE_STD_CODE
1243               ,X_RECOVERY_TYPE_CODE      => cust_split_rec.RECOVERY_TYPE_CODE
1244               ,X_FIN_OBLIG_END_DATE      => cust_split_rec.FIN_OBLIG_END_DATE
1245               ,X_LAST_UPDATE_DATE        => SYSDATE
1246               ,X_LAST_UPDATED_BY         => 1
1247               ,X_LAST_UPDATE_LOGIN       => 1
1248               ,X_UPDATE_CORRECT_OPTION   => 'UPDATE'
1249               ,X_CHANGED_START_DATE      => l_date
1250               ,X_RETURN_STATUS           => l_return_status
1251               );
1252 
1253          END LOOP;
1254 
1255          FOR emp_split_rec IN csr_emp_split(l_date_table(i))
1256          LOOP
1257 
1258             pnp_debug_pkg.debug('Update Emp Row Assign_Id: '|| emp_split_rec.emp_space_assign_id
1259                                 ||', Loc_Id: '|| emp_split_rec.location_id
1260                                 ||', Emp_Id: '|| emp_split_rec.person_id);
1261 
1262             pn_space_assign_emp_pkg.tlempinfo := emp_split_rec;
1263             ---------------------------------------------------------------------------------------
1264             -- Splits the existing assignment with the (date-1) passed from the date table returned
1265             -- by process vacancy and creates a new assignment with the split date
1266             ---------------------------------------------------------------------------------------
1267             PN_SPACE_ASSIGN_EMP_PKG.UPDATE_ROW(
1268                X_EMP_SPACE_ASSIGN_ID    => emp_split_rec.EMP_SPACE_ASSIGN_ID
1269                ,X_ATTRIBUTE1            => emp_split_rec.ATTRIBUTE1
1270                ,X_ATTRIBUTE2            => emp_split_rec.ATTRIBUTE2
1271                ,X_ATTRIBUTE3            => emp_split_rec.ATTRIBUTE3
1272                ,X_ATTRIBUTE4            => emp_split_rec.ATTRIBUTE4
1273                ,X_ATTRIBUTE5            => emp_split_rec.ATTRIBUTE5
1274                ,X_ATTRIBUTE6            => emp_split_rec.ATTRIBUTE6
1275                ,X_ATTRIBUTE7            => emp_split_rec.ATTRIBUTE7
1276                ,X_ATTRIBUTE8            => emp_split_rec.ATTRIBUTE8
1277                ,X_ATTRIBUTE9            => emp_split_rec.ATTRIBUTE9
1278                ,X_ATTRIBUTE10           => emp_split_rec.ATTRIBUTE10
1279                ,X_ATTRIBUTE11           => emp_split_rec.ATTRIBUTE11
1280                ,X_ATTRIBUTE12           => emp_split_rec.ATTRIBUTE12
1281                ,X_ATTRIBUTE13           => emp_split_rec.ATTRIBUTE13
1282                ,X_ATTRIBUTE14           => emp_split_rec.ATTRIBUTE14
1283                ,X_ATTRIBUTE15           => emp_split_rec.ATTRIBUTE15
1284                ,X_LOCATION_ID           => emp_split_rec.LOCATION_ID
1285                ,X_PERSON_ID             => emp_split_rec.PERSON_ID
1286                ,X_PROJECT_ID            => emp_split_rec.PROJECT_ID
1287                ,X_TASK_ID               => emp_split_rec.TASK_ID
1288                ,X_EMP_ASSIGN_START_DATE => l_date_table(i)
1289                ,X_EMP_ASSIGN_END_DATE   => emp_split_rec.EMP_ASSIGN_END_DATE
1290                ,X_COST_CENTER_CODE      => emp_split_rec.COST_CENTER_CODE
1291                ,X_ALLOCATED_AREA_PCT    => emp_split_rec.ALLOCATED_AREA_PCT
1292                ,X_ALLOCATED_AREA        => emp_split_rec.ALLOCATED_AREA
1293                ,X_UTILIZED_AREA         => emp_split_rec.UTILIZED_AREA
1294                ,X_EMP_SPACE_COMMENTS    => emp_split_rec.EMP_SPACE_COMMENTS
1295                ,X_ATTRIBUTE_CATEGORY    => emp_split_rec.ATTRIBUTE_CATEGORY
1296                ,X_LAST_UPDATE_DATE      => SYSDATE
1297                ,X_LAST_UPDATED_BY       => 1
1298                ,X_LAST_UPDATE_LOGIN     => 1
1299                ,X_UPDATE_CORRECT_OPTION => 'UPDATE'
1300                ,X_CHANGED_START_DATE    => l_date
1301                );
1302 
1303          END LOOP;
1304 
1305       END LOOP;
1306 
1307       pnp_debug_pkg.debug('To distribute Area_Pct and Area... (+)');
1308       FOR cust_rec IN csr_cust
1309 
1310       LOOP
1311 
1312          OPEN csr_location_area(p_location_id => cust_rec.location_id
1313                                 ,p_start_date => cust_rec.cust_assign_start_date
1314                                 ,p_end_date   => cust_rec.cust_assign_end_date);
1315          FETCH csr_location_area INTO l_assignable_area;
1316          CLOSE csr_location_area;
1317          IF l_profile = 'Y' THEN
1318             -- Call to re-distribute area among all customers for the location
1319            FOR  office_sec_rec IN office_sec_cur(cust_rec.location_id) /*Bug4565550*/
1320            LOOP
1321 
1322             pn_space_assign_cust_pkg.area_pct_and_area(
1323                 x_usable_area  => l_assignable_area
1324                ,x_location_id => cust_rec.location_id
1325                ,x_start_date  => cust_rec.cust_assign_start_date
1326                ,x_end_date    => cust_rec.cust_assign_end_date
1327               );
1328 
1329            END LOOP;   /*Bug4565550*/
1330 
1331          ELSE
1332             l_allocated_area := TRUNC((l_assignable_area * cust_rec.allocated_area_pct)/100, 2); /*4533091*/
1333             IF l_allocated_area <> cust_rec.allocated_area THEN
1334                UPDATE pn_space_assign_cust_all
1335                SET    allocated_area = l_allocated_area
1336                WHERE  ROWID = cust_rec.ROWID;
1337             END IF;
1338          END IF;
1339       END LOOP;
1340 
1341       FOR emp_rec IN csr_emp
1342 
1343       LOOP
1344 
1345          OPEN csr_location_area(p_location_id => emp_rec.location_id
1346                                 ,p_start_date => emp_rec.emp_assign_start_date
1347                                 ,p_end_date   => emp_rec.emp_assign_end_date);
1348          FETCH csr_location_area INTO l_assignable_area;
1349          CLOSE csr_location_area;
1350 
1351          IF l_profile = 'Y' THEN
1352             -- Call to re-distribute area among all employees for the location
1353            FOR  office_sec_rec IN office_sec_cur(emp_rec.location_id) /*Bug4565550*/
1354            LOOP
1355 
1356             PN_SPACE_ASSIGN_CUST_PKG.area_pct_and_area(
1357                 x_usable_area  => l_assignable_area
1358                ,x_location_id => emp_rec.location_id
1359                ,x_start_date  => emp_rec.emp_assign_start_date
1360                ,x_end_date    => emp_rec.emp_assign_end_date
1361               );
1362 
1363            END LOOP;   /*Bug4565550*/
1364 
1365          ELSE
1366             l_allocated_area := TRUNC((l_assignable_area * emp_rec.allocated_area_pct)/100, 2); /*4533091*/
1367             IF l_allocated_area <> emp_rec.allocated_area THEN
1368                UPDATE pn_space_assign_emp_all
1369                SET    allocated_area = l_allocated_area
1370                WHERE  ROWID = emp_rec.ROWID;
1371             END IF;
1372          END IF;
1373       END LOOP;
1374       pnp_debug_pkg.debug('Done distributing Area_Pct and Area... (-)');
1375 
1376    pn_space_assign_cust_pkg.Defrag_Contig_Assign(p_location_id);
1377 
1378    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.Assignment_Split (-)  Loc Id: '||p_location_id);
1379 
1380  END assignment_split;
1381 
1382 -------------------------------------------------------------------------------
1383 -- PROCEDURE    : AREA_PCT_AND_AREA
1384 -- INVOKED FROM :
1385 -- PURPOSE      : Added condition to select/update only locations of type
1386 --                office/section.
1387 -- HISTORY
1388 -- 02-JUN-01 dthota   o Fix for bug # 1609377
1389 -- 08-FEB-02 kkhegde  o Bug#2168629 - changed the procedure definition
1390 --                      replaced x_as_of_date_emp and x_as_of_date_cust
1391 --                      with x_start_date and x_end_date
1392 -- 07-NOV-02 dthota   o bug # 2434352 - Modified the procedure to
1393 --                      add/subtract the fractional remainder after space
1394 --                      redistribution to one record.
1395 -- 20-OCT-03 dthota   o bug # 3234403 - Copied this procedure from PNTSPACE.pld
1396 -- 14-DEC-04 STripath o Fixed for bug# 4092157. If l_total_pct <> 100, update
1397 --                      either pn_space_assign_emp or pn_space_assign_cust.
1398 -- 22-FEB-05 MMisra   o Bug # 4198937. Merged IF conditions where area and
1399 --                      percentage differnce was being checked.
1400 -- 21-JUN-05 hrodda   o Bug 4284035 - Replaced pn_space_assign_emp,pn_locations
1401 --                      pn_space_assign_cust with _ALL table.
1402 -------------------------------------------------------------------------------
1403 PROCEDURE area_pct_and_area(x_usable_area     NUMBER,
1404                             x_location_id     NUMBER,
1405                             x_start_date      DATE,
1406                             x_end_date        DATE
1407                             ) IS
1408 
1409    l_utilized       NUMBER;
1410    l_total_pct      NUMBER;
1411    l_total_area     NUMBER;
1412    l_diff_pct       NUMBER;
1413    l_diff_area      NUMBER;
1414    l_emp_updated    NUMBER := 0;
1415    l_cust_updated   NUMBER := 0;
1416    l_alloc_area_pct pn_space_assign_emp_all.allocated_area_pct%TYPE;
1417    l_alloc_area     pn_space_assign_emp_all.allocated_area%TYPE;
1418 
1419 BEGIN
1420 
1421    l_utilized       := PN_SPACE_ASSIGN_CUST_PKG.assignment_count(x_location_id,x_start_date,x_end_date);
1422    l_alloc_area_pct := TRUNC(100 / l_utilized, 2); /*4533091*/
1423    l_alloc_area     := TRUNC(x_usable_area / l_utilized, 2); /*4533091*/
1424 
1425    pnp_debug_pkg.debug('Area_Pct_And_Area (+)  Loc Id: '||x_location_id
1426                         ||', Area: '||x_usable_area
1427                         ||', StrDt: '||TO_CHAR(x_start_date,'MM/DD/YYYY')
1428                         ||', EndDt: '||TO_CHAR(x_end_date, 'MM/DD/YYYY')
1429                         ||', lUtil: '||l_utilized
1430                         ||', lArea: '||l_alloc_area
1431                         ||', lPct: '||l_alloc_area_pct);
1432 
1433    IF l_utilized <> 0 THEN
1434 
1435 
1436       UPDATE pn_space_assign_emp_all emp
1437       SET    emp.allocated_area_pct = l_alloc_area_pct,
1438              emp.allocated_area     = l_alloc_area
1439       WHERE  emp.location_id        = x_location_id
1440       AND   (emp.emp_assign_start_date                                       <= x_end_date AND
1441              NVL(emp.emp_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1442       AND EXISTS (SELECT '1'
1443                   FROM   pn_locations_all loc
1444                   WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1445                   AND    loc.location_id = emp.location_id);
1446 
1447       l_emp_updated := SQL%ROWCOUNT;
1448 
1449 
1450       UPDATE pn_space_assign_cust_all cust
1451       SET    cust.allocated_area_pct = l_alloc_area_pct,
1452              cust.allocated_area     = l_alloc_area
1453       WHERE  cust.location_id        = x_location_id
1454       AND   (cust.cust_assign_start_date                                       <= x_end_date AND
1455              NVL(cust.cust_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1456       AND EXISTS (SELECT '1'
1457                   FROM   pn_locations_all loc
1458                   WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1459                   AND    loc.location_id = cust.location_id);
1460 
1461       l_cust_updated := SQL%ROWCOUNT;
1462 
1463       l_total_pct  := l_alloc_area_pct * l_utilized;
1464       l_total_area := l_alloc_area * l_utilized;
1465 
1466       IF l_total_pct <> 100 OR l_total_area <> x_usable_area THEN
1467 
1468          l_diff_pct := 100 - l_total_pct;
1469          l_diff_area := x_usable_area - l_total_area;
1470 
1471 
1472          IF NVL(l_emp_updated, 0) > 0 THEN
1473             UPDATE pn_space_assign_emp_all emp
1474             SET    emp.allocated_area_pct = (emp.allocated_area_pct + l_diff_pct),
1475                    emp.allocated_area     = (emp.allocated_area + l_diff_area)
1476             WHERE  emp.location_id        = x_location_id
1477             AND   (emp.emp_assign_start_date                                       <= x_end_date AND
1478                    NVL(emp.emp_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1479             AND EXISTS (SELECT '1'
1480                         FROM   pn_locations_all loc
1481                         WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1482                         AND    loc.location_id = emp.location_id)
1483             AND ROWNUM < 2;
1484 
1485 
1486          ELSIF NVL(l_cust_updated, 0) > 0 THEN
1487             UPDATE pn_space_assign_cust_all cust
1488             SET    cust.allocated_area_pct = (cust.allocated_area_pct + l_diff_pct),
1489                    cust.allocated_area     = (cust.allocated_area + l_diff_area)
1490             WHERE  cust.location_id        = x_location_id
1491             AND   (cust.cust_assign_start_date                                       <= x_end_date AND
1492                    NVL(cust.cust_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1493             AND EXISTS (SELECT '1'
1494                         FROM   pn_locations_all loc
1495                         WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1496                         AND    loc.location_id = cust.location_id)
1497             AND ROWNUM < 2;
1498 
1499          END IF;
1500       END IF;
1501    END IF;
1502 
1503    pnp_debug_pkg.debug('Area_Pct_And_Area (-)  Loc Id: '||x_location_id);
1504 END area_pct_and_area;
1505 
1506 /*===========================================================================+
1507 --  NAME         : assignment_count
1508 --  DESCRIPTION  : This function returns the number of assignments for a given
1509 --                 location within the given start date and end date. Earlier
1510 --                 this code was a part of procedure area_pct_and_area, made a
1511 --                 separate function so that it can be called from
1512 --                 INSERT_ROW to get the count of assignments.
1513 --  SCOPE        : PRIVATE
1514 --  INVOKED FROM :
1515 --  ARGUMENTS    : IN : x_location_id,x_start_date,x_end_date.
1516 --                 OUT: l_utilized
1517 --  REFERENCE    : PN_COMMON.debug()
1518 --  RETURNS      : No. of assignments for the location with in start date and
1519 --                 end date.
1520 --  HISTORY      :
1521 --  16-ARP-02  MMisra   o Created
1522 --  20-OCT-03  DThota   o bug 3234403 - Copied this procedure from PNTSPACE.pld
1523 --  07-MAR-05  ftanudja o Used subquery referencing for performance. #4199297.
1524 --  21-JUN-05  hrodda   o Bug 4284035 - Replaced pn_space_assign_emp,
1525 --                        pn_space_assign_cust, pn_locations with _ALL table.
1526 +============================================================================*/
1527 
1528 FUNCTION assignment_count(x_location_id IN   NUMBER,
1529                           x_start_date  IN   DATE,
1530                           x_end_date    IN   DATE)
1531 RETURN NUMBER IS
1532 
1533    l_utilized       NUMBER;
1534    l_utilized_emp   NUMBER;
1535    l_utilized_cust  NUMBER;
1536 
1537 BEGIN
1538 
1539    l_utilized_emp   := 0;
1540    l_utilized_cust  := 0;
1541 
1542    SELECT COUNT(*)
1543    INTO   l_utilized_emp
1544    FROM   pn_space_assign_emp_all emp
1545    WHERE  emp.location_id        = x_location_id
1546    AND    (emp.emp_assign_start_date <= NVL(x_end_date,to_date('12/31/4712','mm/dd/yyyy')) AND
1547            NVL(emp.emp_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1548    AND EXISTS (SELECT '1'
1549                FROM   pn_locations_all loc
1550                WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1551                AND    loc.location_id = emp.location_id);
1552 
1553    SELECT COUNT(*)
1554    INTO   l_utilized_cust
1555    FROM   pn_space_assign_cust_all cust
1556    WHERE  cust.location_id        = x_location_id
1557    AND    (cust.cust_assign_start_date <= NVL(x_end_date,to_date('12/31/4712','mm/dd/yyyy')) AND
1558            NVL(cust.cust_assign_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1559    AND EXISTS (SELECT '1'
1560                FROM   pn_locations_all loc
1561                WHERE  loc.location_type_lookup_code in ('OFFICE','SECTION')
1562                AND    loc.location_id = cust.location_id);
1563 
1564    l_utilized := NVL(l_utilized_emp,0) + NVL(l_utilized_cust,0);
1565 
1566    RETURN l_utilized;
1567 
1568 END assignment_count;
1569 
1570 /*===========================================================================+
1571  | FUNCTION
1572  |   location_count
1573  |
1574  | DESCRIPTION
1575  |   This function returns the number of location splits for a given location within
1576  |   the given start date and end date.
1577  |
1578  | SCOPE - PRIVATE
1579  |
1580  | ARGUMENTS:
1581  |   IN:  x_location_id,x_start_date,x_end_date.
1582  |   OUT: l_location_count
1583  |
1584  | RETURNS: No. of location splits for the location with in start date and end date.
1585  |
1586  | MODIFICATION HISTORY
1587  |   06-Nov-2003  Daniel Thota   o Created Fix for bug # 3240216.
1588  |                                 Gets a count of split locations for a date range if they exist
1589  |                                to be used in the event that a location has undergone
1590  |                                splits as result of location attribute changes before
1591  |                                an assignment is made for that location
1592  +===========================================================================*/
1593 
1594 FUNCTION location_count(x_location_id IN   NUMBER,
1595                         x_start_date  IN   DATE,
1596                         x_end_date    IN   DATE)
1597 RETURN NUMBER IS
1598 
1599    l_location_count NUMBER := 0;
1600 
1601 BEGIN
1602 
1603    SELECT COUNT(*)
1604    INTO   l_location_count
1605    FROM   pn_locations_all
1606    WHERE  location_id        = x_location_id
1607    AND    (active_start_date <= NVL(x_end_date,to_date('12/31/4712','mm/dd/yyyy')) AND
1608            NVL(active_end_date,to_date('12/31/4712','mm/dd/yyyy')) >= x_start_date)
1609    ;
1610    RETURN l_location_count;
1611 
1612 END location_count;
1613 
1614 -- 102403 -- date track space assignment
1615 
1616 
1617 -------------------------------------------------------------------------------
1618 -- PROCEDURE : DEFRAG_CONTIG_ASSIGN
1619 -- PURPOSE   : This procedure removes fragments of the similar contiguous assignment
1620 --             record after assignments are split and re-distributed.
1621 --             Consider lease 1803, Tenancy 1985 for location 3045 assigned to Customer 5225
1622 --             from 1/1/00 to 12/31/06....the foll. assignment will be created
1623 --
1624 --             LOC_ID START_DT  END_DATE  ALLOC_PCT ALLOC_AREA   LEASE_ID TENANCY_ID CUST_ID
1625 --             ------ --------- --------- --------- ----------   -------- ---------- -------
1626 --             3045   01-JAN-00 31-DEC-06      100      750       1803       1985     5225
1627 --
1628 --             Consider lease 1804, Tenancy 1986 for location 3045 assigned to Customer 4780
1629 --             from 1/1/02 to 12/31/04....the foll. assignment will be created/redistributed
1630 --
1631 --             LOC_ID START_DT  END_DATE  ALLOC_PCT ALLOC_AREA   LEASE_ID TENANCY_ID CUST_ID
1632 --             ------ --------- --------- --------- ----------   -------- ---------- -------
1633 --             3045   01-JAN-00 31-DEC-01      100      750       1803       1985     5225
1634 --             3045   01-JAN-02 31-DEC-04      50       375       1804       1986     4780
1635 --             3045   01-JAN-02 31-DEC-04      50       375       1803       1985     5225
1636 --             3045   01-JAN-05 31-DEC-06      100      750       1803       1985     5225
1637 --
1638 --             If tenancy is updated to start on 1/1/03 and end on 12/31/03 w/o changing
1639 --             location/customer info the foll assignment was being created/redistributed
1640 --
1641 --             LOC_ID START_DT  END_DATE  ALLOC_PCT ALLOC_AREA   LEASE_ID TENANCY_ID CUST_ID
1642 --             ------ --------- --------- --------- ----------   -------- ---------- -------
1643 --             3045   01-JAN-00 31-DEC-01      100      750       1803       1985     5225
1644 --             3045   01-JAN-02 31-DEC-03      100      750       1803       1985     5225
1645 --             3045   01-JAN-03 31-DEC-03      50       375       1804       1986     4780
1646 --             3045   01-JAN-03 31-DEC-03      50       375       1803       1985     5225
1647 --             3045   01-JAN-04 31-DEC-05      100      750       1803       1985     5225
1648 --             3045   01-JAN-05 31-DEC-06      100      750       1803       1985     5225
1649 --
1650 --             This procedure now merges the similar contiguous assignments as the following
1651 --
1652 --             LOC_ID START_DT  END_DATE  ALLOC_PCT ALLOC_AREA   LEASE_ID TENANCY_ID CUST_ID
1653 --             ------ --------- --------- --------- ----------   -------- ---------- -------
1654 --             3045   01-JAN-00 31-DEC-03      100      750       1803       1985     5225
1655 --             3045   01-JAN-03 31-DEC-03      50       375       1804       1986     4780
1656 --             3045   01-JAN-03 31-DEC-03      50       375       1803       1985     5225
1657 --             3045   01-JAN-04 31-DEC-06      100      750       1803       1985     5225
1658 --             This is done only for those records which have all other attributes of the
1659 --             record to be similar except having contiguity in the end date and start date
1660 --             as in the first and the last 2 records in the example shown above
1661 --
1662 -- IN PARAM  : Location Id.
1663 -- History   :
1664 -- 09-DEC-03 DThota    o Created for BUG# 3308225.
1665 -- 02-JUN-04 STripathi o Changed name from clean_up to Defrag_Contig_Assign.
1666 --                       Changed logic; added comparing attribute1 - 15 of
1667 --                       cintiguous assignments also to check if they are similar
1668 --                       assignments, update the assignment instead of calling
1669 --                       Update_Row in Correct mode, and other changes.
1670 -- 30-SEP-04 STripathi o Modified for Update and Delete for Emp_Tab.
1671 --                       Update i+1 row BUT DELETE i th row.
1672 -- 21-JUN-05 hrodda    o Bug 4284035 - Replaced pn_space_assign_emp,
1673 --                       pn_space_assign_cust with _ALL table.
1674 -------------------------------------------------------------------------------
1675 
1676 PROCEDURE Defrag_Contig_Assign (
1677                  p_location_id            IN     pn_locations_all.location_id%TYPE                )
1678 IS
1679    -------------------------------------------------------------------------------------
1680    -- The foll. cursors are used to get customers and employees assigned to a location
1681    -- after split and redistribution ordered in such a way that records with contiguous
1682    -- dates are consecutively ordered.
1683    -------------------------------------------------------------------------------------
1684 
1685    CURSOR csr_cust IS
1686       SELECT CUST_SPACE_ASSIGN_ID
1687             ,LOCATION_ID
1688             ,CUST_ACCOUNT_ID
1689             ,SITE_USE_ID
1690             ,EXPENSE_ACCOUNT_ID
1691             ,PROJECT_ID
1692             ,TASK_ID
1693             ,CUST_ASSIGN_START_DATE
1694             ,CUST_ASSIGN_END_DATE
1695             ,ALLOCATED_AREA_PCT
1696             ,ALLOCATED_AREA
1697             ,UTILIZED_AREA
1698             ,CUST_SPACE_COMMENTS
1699             ,LAST_UPDATE_DATE
1700             ,LAST_UPDATED_BY
1701             ,CREATION_DATE
1702             ,CREATED_BY
1703             ,LAST_UPDATE_LOGIN
1704             ,ATTRIBUTE_CATEGORY
1705             ,ATTRIBUTE1
1706             ,ATTRIBUTE2
1707             ,ATTRIBUTE3
1708             ,ATTRIBUTE4
1709             ,ATTRIBUTE5
1710             ,ATTRIBUTE6
1711             ,ATTRIBUTE7
1712             ,ATTRIBUTE8
1713             ,ATTRIBUTE9
1714             ,ATTRIBUTE10
1715             ,ATTRIBUTE11
1716             ,ATTRIBUTE12
1717             ,ATTRIBUTE13
1718             ,ATTRIBUTE14
1719             ,ATTRIBUTE15
1720             ,ORG_ID
1721             ,LEASE_ID
1722             ,RECOVERY_SPACE_STD_CODE
1723             ,RECOVERY_TYPE_CODE
1724             ,FIN_OBLIG_END_DATE
1725             ,TENANCY_ID
1726       FROM   pn_space_assign_cust_all
1727       WHERE  location_id = p_location_id
1728       ORDER BY cust_account_id,tenancy_id,lease_id,cust_assign_start_date,cust_assign_end_date
1729       ;
1730 
1731    CURSOR csr_emp IS
1732       SELECT EMP_SPACE_ASSIGN_ID
1733             ,LOCATION_ID
1734             ,PERSON_ID
1735             ,PROJECT_ID
1736             ,TASK_ID
1737             ,EMP_ASSIGN_START_DATE
1738             ,EMP_ASSIGN_END_DATE
1739             ,COST_CENTER_CODE
1740             ,ALLOCATED_AREA_PCT
1741             ,ALLOCATED_AREA
1742             ,UTILIZED_AREA
1743             ,EMP_SPACE_COMMENTS
1744             ,LAST_UPDATE_DATE
1745             ,LAST_UPDATED_BY
1746             ,CREATION_DATE
1747             ,CREATED_BY
1748             ,LAST_UPDATE_LOGIN
1749             ,ATTRIBUTE_CATEGORY
1750             ,ATTRIBUTE1
1751             ,ATTRIBUTE2
1752             ,ATTRIBUTE3
1753             ,ATTRIBUTE4
1754             ,ATTRIBUTE5
1755             ,ATTRIBUTE6
1756             ,ATTRIBUTE7
1757             ,ATTRIBUTE8
1758             ,ATTRIBUTE9
1759             ,ATTRIBUTE10
1760             ,ATTRIBUTE11
1761             ,ATTRIBUTE12
1762             ,ATTRIBUTE13
1763             ,ATTRIBUTE14
1764             ,ATTRIBUTE15
1765             ,ORG_ID
1766             ,SOURCE
1767       FROM   pn_space_assign_emp_all
1768       WHERE  location_id = p_location_id
1769       ORDER BY person_id,emp_assign_start_date,emp_assign_end_date
1770       ;
1771 
1772    --------------------------------------------------------------------------
1773    -- Define a record of PN_SPACE_CUST_ASSIGN_ALL and PN_SPACE_ASSIGN_EMP_ALL
1774    --------------------------------------------------------------------------
1775 
1776    TYPE cust_rec_type IS RECORD(
1777       CUST_SPACE_ASSIGN_ID     pn_space_assign_cust_all.CUST_SPACE_ASSIGN_ID%TYPE
1778       ,LOCATION_ID             pn_space_assign_cust_all.LOCATION_ID%TYPE
1779       ,CUST_ACCOUNT_ID         pn_space_assign_cust_all.CUST_ACCOUNT_ID%TYPE
1780       ,SITE_USE_ID             pn_space_assign_cust_all.SITE_USE_ID%TYPE
1781       ,EXPENSE_ACCOUNT_ID      pn_space_assign_cust_all.EXPENSE_ACCOUNT_ID%TYPE
1782       ,PROJECT_ID              pn_space_assign_cust_all.PROJECT_ID%TYPE
1783       ,TASK_ID                 pn_space_assign_cust_all.TASK_ID%TYPE
1784       ,CUST_ASSIGN_START_DATE  pn_space_assign_cust_all.CUST_ASSIGN_START_DATE%TYPE
1785       ,CUST_ASSIGN_END_DATE    pn_space_assign_cust_all.CUST_ASSIGN_END_DATE%TYPE
1786       ,ALLOCATED_AREA_PCT      pn_space_assign_cust_all.ALLOCATED_AREA_PCT%TYPE
1787       ,ALLOCATED_AREA          pn_space_assign_cust_all.ALLOCATED_AREA%TYPE
1788       ,UTILIZED_AREA           pn_space_assign_cust_all.UTILIZED_AREA%TYPE
1789       ,CUST_SPACE_COMMENTS     pn_space_assign_cust_all.CUST_SPACE_COMMENTS%TYPE
1790       ,LAST_UPDATE_DATE        pn_space_assign_cust_all.LAST_UPDATE_DATE%TYPE
1791       ,LAST_UPDATED_BY         pn_space_assign_cust_all.LAST_UPDATED_BY%TYPE
1792       ,CREATION_DATE           pn_space_assign_cust_all.CREATION_DATE%TYPE
1793       ,CREATED_BY              pn_space_assign_cust_all.CREATED_BY%TYPE
1794       ,LAST_UPDATE_LOGIN       pn_space_assign_cust_all.LAST_UPDATE_LOGIN%TYPE
1795       ,ATTRIBUTE_CATEGORY      pn_space_assign_cust_all.ATTRIBUTE_CATEGORY%TYPE
1796       ,ATTRIBUTE1              pn_space_assign_cust_all.ATTRIBUTE1%TYPE
1797       ,ATTRIBUTE2              pn_space_assign_cust_all.ATTRIBUTE2%TYPE
1798       ,ATTRIBUTE3              pn_space_assign_cust_all.ATTRIBUTE3%TYPE
1799       ,ATTRIBUTE4              pn_space_assign_cust_all.ATTRIBUTE4%TYPE
1800       ,ATTRIBUTE5              pn_space_assign_cust_all.ATTRIBUTE5%TYPE
1801       ,ATTRIBUTE6              pn_space_assign_cust_all.ATTRIBUTE6%TYPE
1802       ,ATTRIBUTE7              pn_space_assign_cust_all.ATTRIBUTE7%TYPE
1803       ,ATTRIBUTE8              pn_space_assign_cust_all.ATTRIBUTE8%TYPE
1804       ,ATTRIBUTE9              pn_space_assign_cust_all.ATTRIBUTE9%TYPE
1805       ,ATTRIBUTE10             pn_space_assign_cust_all.ATTRIBUTE10%TYPE
1806       ,ATTRIBUTE11             pn_space_assign_cust_all.ATTRIBUTE11%TYPE
1807       ,ATTRIBUTE12             pn_space_assign_cust_all.ATTRIBUTE12%TYPE
1808       ,ATTRIBUTE13             pn_space_assign_cust_all.ATTRIBUTE13%TYPE
1809       ,ATTRIBUTE14             pn_space_assign_cust_all.ATTRIBUTE14%TYPE
1810       ,ATTRIBUTE15             pn_space_assign_cust_all.ATTRIBUTE15%TYPE
1811       ,ORG_ID                  pn_space_assign_cust_all.ORG_ID%TYPE
1812       ,LEASE_ID                pn_space_assign_cust_all.LEASE_ID%TYPE
1813       ,RECOVERY_SPACE_STD_CODE pn_space_assign_cust_all.RECOVERY_SPACE_STD_CODE%TYPE
1814       ,RECOVERY_TYPE_CODE      pn_space_assign_cust_all.RECOVERY_TYPE_CODE%TYPE
1815       ,FIN_OBLIG_END_DATE      pn_space_assign_cust_all.FIN_OBLIG_END_DATE%TYPE
1816       ,TENANCY_ID              pn_space_assign_cust_all.TENANCY_ID%TYPE
1817       );
1818 
1819    TYPE emp_rec_type IS RECORD(
1820        EMP_SPACE_ASSIGN_ID    pn_space_assign_emp_all.EMP_SPACE_ASSIGN_ID%TYPE
1821        ,LOCATION_ID           pn_space_assign_emp_all.LOCATION_ID%TYPE
1822        ,PERSON_ID             pn_space_assign_emp_all.PERSON_ID%TYPE
1823        ,PROJECT_ID            pn_space_assign_emp_all.PROJECT_ID%TYPE
1824        ,TASK_ID               pn_space_assign_emp_all.TASK_ID%TYPE
1825        ,EMP_ASSIGN_START_DATE pn_space_assign_emp_all.EMP_ASSIGN_START_DATE%TYPE
1826        ,EMP_ASSIGN_END_DATE   pn_space_assign_emp_all.EMP_ASSIGN_END_DATE%TYPE
1827        ,COST_CENTER_CODE      pn_space_assign_emp_all.COST_CENTER_CODE%TYPE
1828        ,ALLOCATED_AREA_PCT    pn_space_assign_emp_all.ALLOCATED_AREA_PCT%TYPE
1829        ,ALLOCATED_AREA        pn_space_assign_emp_all.ALLOCATED_AREA%TYPE
1830        ,UTILIZED_AREA         pn_space_assign_emp_all.UTILIZED_AREA%TYPE
1831        ,EMP_SPACE_COMMENTS    pn_space_assign_emp_all.EMP_SPACE_COMMENTS%TYPE
1832        ,LAST_UPDATE_DATE      pn_space_assign_emp_all.LAST_UPDATE_DATE%TYPE
1833        ,LAST_UPDATED_BY       pn_space_assign_emp_all.LAST_UPDATED_BY%TYPE
1834        ,CREATION_DATE         pn_space_assign_emp_all.CREATION_DATE%TYPE
1835        ,CREATED_BY            pn_space_assign_emp_all.CREATED_BY%TYPE
1836        ,LAST_UPDATE_LOGIN     pn_space_assign_emp_all.LAST_UPDATE_LOGIN%TYPE
1837        ,ATTRIBUTE_CATEGORY    pn_space_assign_emp_all.ATTRIBUTE_CATEGORY%TYPE
1838        ,ATTRIBUTE1            pn_space_assign_emp_all.ATTRIBUTE1%TYPE
1839        ,ATTRIBUTE2            pn_space_assign_emp_all.ATTRIBUTE2%TYPE
1840        ,ATTRIBUTE3            pn_space_assign_emp_all.ATTRIBUTE3%TYPE
1841        ,ATTRIBUTE4            pn_space_assign_emp_all.ATTRIBUTE4%TYPE
1842        ,ATTRIBUTE5            pn_space_assign_emp_all.ATTRIBUTE5%TYPE
1843        ,ATTRIBUTE6            pn_space_assign_emp_all.ATTRIBUTE6%TYPE
1844        ,ATTRIBUTE7            pn_space_assign_emp_all.ATTRIBUTE7%TYPE
1845        ,ATTRIBUTE8            pn_space_assign_emp_all.ATTRIBUTE8%TYPE
1846        ,ATTRIBUTE9            pn_space_assign_emp_all.ATTRIBUTE9%TYPE
1847        ,ATTRIBUTE10           pn_space_assign_emp_all.ATTRIBUTE10%TYPE
1848        ,ATTRIBUTE11           pn_space_assign_emp_all.ATTRIBUTE11%TYPE
1849        ,ATTRIBUTE12           pn_space_assign_emp_all.ATTRIBUTE12%TYPE
1850        ,ATTRIBUTE13           pn_space_assign_emp_all.ATTRIBUTE13%TYPE
1851        ,ATTRIBUTE14           pn_space_assign_emp_all.ATTRIBUTE14%TYPE
1852        ,ATTRIBUTE15           pn_space_assign_emp_all.ATTRIBUTE15%TYPE
1853        ,ORG_ID                pn_space_assign_emp_all.ORG_ID%TYPE
1854        ,SOURCE                pn_space_assign_emp_all.SOURCE%TYPE
1855        );
1856 
1857    ----------------------------------------------------------
1858    -- Define a PL/SQL table for employee and customer records
1859    ----------------------------------------------------------
1860    TYPE emp IS
1861       TABLE OF emp_rec_type
1862       INDEX BY BINARY_INTEGER;
1863 
1864    TYPE cust IS
1865       TABLE OF cust_rec_type
1866       INDEX BY BINARY_INTEGER;
1867 
1868    emp_tab                   emp;
1869    cust_tab                  cust;
1870    l_rec_num                 NUMBER;
1871    l_diff                    NUMBER;
1872    l_date                    DATE := NULL;
1873    l_err_flag                VARCHAR2(1);
1874    l_err_msg                 VARCHAR2(1) := NULL;
1875    l_return_status           VARCHAR2(100) := NULL;
1876 
1877 
1878 BEGIN
1879 
1880    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.Defrag_Contig_Assign (+)  Loc Id: '||p_location_id);
1881 
1882       cust_tab.delete;
1883       l_rec_num := 0;
1884 
1885       --------------------------------------
1886       -- Populate the customer PL/SQL table
1887       --------------------------------------
1888       FOR cust_rec IN csr_cust LOOP
1889          l_rec_num :=  NVL(cust_tab.count,0) + 1;
1890          cust_tab(l_rec_num) := cust_rec;
1891 
1892          pnp_debug_pkg.debug('Cust_Tab i= '||l_rec_num
1893                              ||', cust: '||cust_rec.cust_account_id
1894                              ||', str: '||cust_rec.cust_assign_start_date
1895                              ||', end: '||cust_rec.cust_assign_end_date
1896                              ||', Id: '||cust_rec.cust_space_assign_id
1897                              ||', area= '||cust_rec.allocated_area);
1898       END LOOP;
1899 
1900       pnp_debug_pkg.debug('Defrag_Contig_Assign Cust_Tab... l_rec_num: '||l_rec_num);
1901 
1902       IF NVL(l_rec_num,0) > 1 THEN
1903          FOR i in 1..CUST_TAB.count-1 LOOP
1904 
1905             pnp_debug_pkg.debug('Defrag_Contig_Assign Cust_Tab... l_rec_num>1  Start_LOOP  i= '||i
1906             ||', cust_asgn_id= '||NVL(cust_tab(i).cust_space_assign_id,0));
1907 
1908             IF cust_tab(i+1).location_id                          = cust_tab(i).location_id
1909                AND cust_tab(i+1).cust_account_id                  = cust_tab(i).cust_account_id
1910                AND NVL(cust_tab(i+1).site_use_id,0)               = NVL(cust_tab(i).site_use_id,0)
1911                AND NVL(cust_tab(i+1).expense_account_id,0)        = NVL(cust_tab(i).expense_account_id,0)
1912                AND NVL(cust_tab(i+1).project_id,0)                = NVL(cust_tab(i).project_id,0)
1913                AND NVL(cust_tab(i+1).task_id,0)                   = NVL(cust_tab(i).task_id,0)
1914                AND NVL(cust_tab(i+1).utilized_area,0)             = NVL(cust_tab(i).utilized_area,0)
1915                AND NVL(cust_tab(i+1).allocated_area,0)            = NVL(cust_tab(i).allocated_area,0)
1916                AND NVL(cust_tab(i+1).allocated_area_pct,0)        = NVL(cust_tab(i).allocated_area_pct,0)
1917                AND NVL(cust_tab(i+1).cust_space_comments,'X')      = NVL(cust_tab(i).cust_space_comments,'X')
1918                AND NVL(cust_tab(i+1).lease_id,0)                  = NVL(cust_tab(i).lease_id,0)
1919                AND NVL(cust_tab(i+1).tenancy_id,0)                = NVL(cust_tab(i).tenancy_id,0)
1920                AND NVL(cust_tab(i+1).recovery_space_std_code,'X') = NVL(cust_tab(i).recovery_space_std_code,'X')
1921                AND NVL(cust_tab(i+1).recovery_type_code,'X')      = NVL(cust_tab(i).recovery_type_code,'X')
1922                AND NVL(cust_tab(i+1).attribute_category,'X')      = NVL(cust_tab(i).attribute_category,'X')
1923                AND NVL(cust_tab(i+1).attribute1,'X')              = NVL(cust_tab(i).attribute1,'X')
1924                AND NVL(cust_tab(i+1).attribute2,'X')              = NVL(cust_tab(i).attribute2,'X')
1925                AND NVL(cust_tab(i+1).attribute3,'X')              = NVL(cust_tab(i).attribute3,'X')
1926                AND NVL(cust_tab(i+1).attribute4,'X')              = NVL(cust_tab(i).attribute4,'X')
1927                AND NVL(cust_tab(i+1).attribute5,'X')              = NVL(cust_tab(i).attribute5,'X')
1928                AND NVL(cust_tab(i+1).attribute6,'X')              = NVL(cust_tab(i).attribute6,'X')
1929                AND NVL(cust_tab(i+1).attribute7,'X')              = NVL(cust_tab(i).attribute7,'X')
1930                AND NVL(cust_tab(i+1).attribute8,'X')              = NVL(cust_tab(i).attribute8,'X')
1931                AND NVL(cust_tab(i+1).attribute9,'X')              = NVL(cust_tab(i).attribute9,'X')
1932                AND NVL(cust_tab(i+1).attribute10,'X')             = NVL(cust_tab(i).attribute10,'X')
1933                AND NVL(cust_tab(i+1).attribute11,'X')             = NVL(cust_tab(i).attribute11,'X')
1934                AND NVL(cust_tab(i+1).attribute12,'X')             = NVL(cust_tab(i).attribute12,'X')
1935                AND NVL(cust_tab(i+1).attribute13,'X')             = NVL(cust_tab(i).attribute13,'X')
1936                AND NVL(cust_tab(i+1).attribute14,'X')             = NVL(cust_tab(i).attribute14,'X')
1937                AND NVL(cust_tab(i+1).attribute15,'X')             = NVL(cust_tab(i).attribute15,'X')
1938             THEN
1939 
1940                l_diff := cust_tab(i+1).cust_assign_start_date -
1941                          cust_tab(i).cust_assign_end_date;
1942 
1943                pnp_debug_pkg.debug('Defrag_Contig_Assign Cust_Tab... l_diff: '||l_diff);
1944 
1945                IF l_diff = 1 THEN
1946 
1947                   ---------------------------------------------------------------------------
1948                   -- If stepping thru cust PL/SQL table records finds contigous records with
1949                   -- consecutive dates update the (i+1) record with the start date of the ith
1950                   -- record and .......
1951                   ---------------------------------------------------------------------------
1952                  UPDATE pn_space_assign_cust_all
1953                      SET cust_assign_start_date  = cust_tab(i).cust_assign_start_date
1954                         ,last_update_date        = SYSDATE
1955                         ,last_updated_by         = NVL(FND_GLOBAL.USER_ID,'-1')
1956                         ,last_update_login       = NVL(FND_GLOBAL.LOGIN_ID,'-1')
1957                   WHERE  cust_space_assign_id = cust_tab(i+1).cust_space_assign_id;
1958 
1959                   ---------------------------------------------------------------------------
1960                   -- ....... update the (i+1) record with the start date of the ith record
1961                   -- in the PL/SQL table as well and delete the ith record from the DB
1962                   ---------------------------------------------------------------------------
1963                   cust_tab(i+1).cust_assign_start_date := cust_tab(i).cust_assign_start_date;
1964                   pn_space_assign_cust_pkg.delete_row(cust_tab(i).cust_space_assign_id);
1965 
1966                END IF;
1967             END IF;
1968             pnp_debug_pkg.debug('Defrag_Contig_Assign Cust_Tab... l_rec_num>1  End_LOOP  i= '||i);
1969          END LOOP;
1970       END IF;
1971 
1972       emp_tab.delete;
1973       l_rec_num := 0;
1974 
1975       --------------------------------------
1976       -- Populate the customer PL/SQL table
1977       --------------------------------------
1978 
1979       FOR emp_rec IN csr_emp LOOP
1980          l_rec_num :=  NVL(emp_tab.count,0) + 1;
1981          emp_tab(l_rec_num) := emp_rec;
1982 
1983          pnp_debug_pkg.debug('Emp_Tab i= '||l_rec_num
1984                              ||', Emp: '||emp_rec.person_id
1985                              ||', str: '||emp_rec.emp_assign_start_date
1986                              ||', end: '||emp_rec.emp_assign_end_date
1987                              ||', Id: '||emp_rec.emp_space_assign_id
1988                              ||', area= '||emp_rec.allocated_area);
1989       END LOOP;
1990 
1991       pnp_debug_pkg.debug('Defrag_Contig_Assign Emp_Tab... l_rec_num: '||l_rec_num);
1992 
1993       IF NVL(l_rec_num,0) > 1 THEN
1994          FOR i in 1..EMP_TAB.count-1 LOOP
1995 
1996             pnp_debug_pkg.debug('Defrag_Contig_Assign Emp_Tab... l_rec_num>1  Start_LOOP  i= '||i);
1997 
1998             IF emp_tab(i+1).location_id                          = emp_tab(i).location_id
1999                AND emp_tab(i+1).person_id                        = emp_tab(i).person_id
2000                AND NVL(emp_tab(i+1).cost_center_code,0)          = NVL(emp_tab(i).cost_center_code,0)
2001                AND NVL(emp_tab(i+1).project_id,0)                = NVL(emp_tab(i).project_id,0)
2002                AND NVL(emp_tab(i+1).task_id,0)                   = NVL(emp_tab(i).task_id,0)
2003                AND NVL(emp_tab(i+1).utilized_area,0)             = NVL(emp_tab(i).utilized_area,0)
2004                AND NVL(emp_tab(i+1).allocated_area,0)            = NVL(emp_tab(i).allocated_area,0)
2005                AND NVL(emp_tab(i+1).allocated_area_pct,0)        = NVL(emp_tab(i).allocated_area_pct,0)
2006                AND NVL(emp_tab(i+1).emp_space_comments,'X')      = NVL(emp_tab(i).emp_space_comments,'X')
2007                AND NVL(emp_tab(i+1).attribute_category,'X')      = NVL(emp_tab(i).attribute_category,'X')
2008                AND NVL(emp_tab(i+1).attribute1,'X')              = NVL(emp_tab(i).attribute1,'X')
2009                AND NVL(emp_tab(i+1).attribute2,'X')              = NVL(emp_tab(i).attribute2,'X')
2010                AND NVL(emp_tab(i+1).attribute3,'X')              = NVL(emp_tab(i).attribute3,'X')
2011                AND NVL(emp_tab(i+1).attribute4,'X')              = NVL(emp_tab(i).attribute4,'X')
2012                AND NVL(emp_tab(i+1).attribute5,'X')              = NVL(emp_tab(i).attribute5,'X')
2013                AND NVL(emp_tab(i+1).attribute6,'X')              = NVL(emp_tab(i).attribute6,'X')
2014                AND NVL(emp_tab(i+1).attribute7,'X')              = NVL(emp_tab(i).attribute7,'X')
2015                AND NVL(emp_tab(i+1).attribute8,'X')              = NVL(emp_tab(i).attribute8,'X')
2016                AND NVL(emp_tab(i+1).attribute9,'X')              = NVL(emp_tab(i).attribute9,'X')
2017                AND NVL(emp_tab(i+1).attribute10,'X')             = NVL(emp_tab(i).attribute10,'X')
2018                AND NVL(emp_tab(i+1).attribute11,'X')             = NVL(emp_tab(i).attribute11,'X')
2019                AND NVL(emp_tab(i+1).attribute12,'X')             = NVL(emp_tab(i).attribute12,'X')
2020                AND NVL(emp_tab(i+1).attribute13,'X')             = NVL(emp_tab(i).attribute13,'X')
2021                AND NVL(emp_tab(i+1).attribute14,'X')             = NVL(emp_tab(i).attribute14,'X')
2022                AND NVL(emp_tab(i+1).attribute15,'X')             = NVL(emp_tab(i).attribute15,'X')
2023             THEN
2024 
2025                l_diff := emp_tab(i+1).emp_assign_start_date -
2026                          emp_tab(i).emp_assign_end_date;
2027 
2028                pnp_debug_pkg.debug('Defrag_Contig_Assign Emp_Tab... l_diff: '||l_diff);
2029 
2030                IF l_diff = 1 THEN
2031                   ---------------------------------------------------------------------------
2032                   -- If stepping thru emp PL/SQL table records finds contigous records with
2033                   -- consecutive dates update the (i+1) record with the start date of the ith
2034                   -- record and .......
2035                   ---------------------------------------------------------------------------
2036                   UPDATE pn_space_assign_emp_all
2037                      SET emp_assign_start_date   = emp_tab(i).emp_assign_start_date
2038                         ,last_update_date        = SYSDATE
2039                         ,last_updated_by         = NVL(FND_GLOBAL.USER_ID,'-1')
2040                         ,last_update_login       = NVL(FND_GLOBAL.LOGIN_ID,'-1')
2041                   WHERE  emp_space_assign_id = emp_tab(i+1).emp_space_assign_id;
2042 
2043                   ---------------------------------------------------------------------------
2044                   -- ....... update the (i+1) record with the start date of the ith record
2045                   -- in the PL/SQL table as well and delete the ith record from the DB
2046                   ---------------------------------------------------------------------------
2047                   emp_tab(i+1).emp_assign_start_date := emp_tab(i).emp_assign_start_date;
2048                   pn_space_assign_emp_pkg.delete_row(emp_tab(i).emp_space_assign_id);
2049 
2050                END IF;
2051             END IF;
2052             pnp_debug_pkg.debug('Defrag_Contig_Assign Emp_Tab... l_rec_num>1  End_LOOP  i= '||i);
2053          END LOOP;
2054       END IF;
2055 
2056    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.Defrag_Contig_Assign (-)  Loc Id: '||p_location_id);
2057 
2058  END Defrag_Contig_Assign;
2059 
2060 -------------------------------------------------------------------------------
2061 -- PROCEDURE   : merge_tables
2062 -- DESCRIPTION : Merges base table with a new table. Extract only new location
2063 --               not already in the base table
2064 -- NOTE        : counting starts from 1, not 0 !
2065 -- HISTORY     :
2066 -- 04-APR-05 ftanudja o Created. #4270051.
2067 -------------------------------------------------------------------------------
2068 
2069 PROCEDURE merge_tables(
2070              p_base_table IN OUT NOCOPY loc_id_tbl,
2071              p_new_table IN loc_id_tbl
2072 ) IS
2073   l_exists          BOOLEAN;
2074 
2075 BEGIN
2076 
2077    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.merge_tables (+)');
2078 
2079    -- do simple bubble search to identify new tables.
2080    FOR i IN 1..p_new_table.COUNT LOOP
2081 
2082       l_exists := FALSE;
2083 
2084       FOR j IN 1..p_base_table.COUNT LOOP
2085          IF p_base_table(j) = p_new_table(i) THEN l_exists := TRUE; exit; END IF;
2086       END LOOP;
2087 
2088       IF NOT l_exists THEN
2089          p_base_table(p_base_table.COUNT + 1) := p_new_table(i);
2090       END IF;
2091 
2092    END LOOP;
2093 
2094    pnp_debug_pkg.debug('PN_SPACE_ASSIGN_CUST_PKG.merge_tables (-)');
2095 
2096 END;
2097 
2098 -------------------------------------------------------------------------------
2099 --  NAME         : DELETE_OTHER_ASSIGNMENTS_EMP
2100 --  DESCRIPTION  :
2101 --  INVOKED FROM :
2102 --  ARGUMENTS    : IN : x_person_id, x_cost_center_code, x_emp_assign_start_date
2103 --                      x_emp_space_assign_id, x_loc_id_tbl
2104 --  REFERENCE    : PN_COMMON.debug()
2105 --  HISTORY      :
2106 --  06-FEB-01 dthota  o bug # 1609377 - Added code to update PN_SPACE_ASSIGN_EMP.
2107 --                      emp_assign_end_date of all employee assignments whose
2108 --                      start date is less than the start date of the assignmemnt
2109 --                      record being entered with (emp_assign_start_date -1) and
2110 --                      all employee assignments whose start date is equal to the
2111 --                      start date of the assignmemnt record being entered with
2112 --                      (emp_assign_start_date)
2113 -- 09-MAR-04 ftanudj  o added parameter x_emp_space_assign_id.
2114 -- 06-APR-05 ftanudja o Moved from PNTSPACE library. #4270051.
2115 --                    o Added parameter x_loc_id_tbl, x_cost_center_code.
2116 -- 21-JUN-05  hrodda  o Bug 4284035 - Replaced pn_space_assign_emp
2117 --                      with _ALL table.
2118 -- 30-JUN-05  MMisra  o Removed UPDATE for cost center assignments.
2119 --                    o Removed input param. x_cost_center_code.
2120 -------------------------------------------------------------------------------
2121 PROCEDURE delete_other_assignments_emp(
2122              x_person_id             IN pn_space_assign_emp.person_id%TYPE,
2123              x_emp_assign_start_date IN pn_space_assign_emp.emp_assign_start_date%TYPE,
2124              x_emp_space_assign_id   IN pn_space_assign_emp.emp_space_assign_id%TYPE,
2125              x_loc_id_tbl            OUT NOCOPY LOC_ID_TBL
2126 ) IS
2127   -- one set of tables for cost center, the other for person
2128 
2129   l_loc_tbl_past_cc loc_id_tbl;
2130   l_loc_tbl_conc_cc loc_id_tbl;
2131   l_loc_tbl_past_ps loc_id_tbl;
2132   l_loc_tbl_conc_ps loc_id_tbl;
2133 
2134   l_result_tbl      loc_id_tbl;
2135 
2136 BEGIN
2137 
2138    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.delete_other_assignments_emp (+)');
2139 
2140    IF x_emp_space_assign_id IS NULL THEN
2141 
2142      UPDATE pn_space_assign_emp_all
2143      SET    emp_assign_end_date = (TRUNC(x_emp_assign_start_date) - 1)
2144      WHERE  person_id = x_person_id
2145      AND    TRUNC(emp_assign_start_date) < TRUNC(x_emp_assign_start_date)
2146      AND    NVL(emp_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= TRUNC(x_emp_assign_start_date)
2147      RETURNING location_id BULK COLLECT INTO l_loc_tbl_past_ps;
2148 
2149      UPDATE pn_space_assign_emp_all
2150      SET    emp_assign_end_date = TRUNC(x_emp_assign_start_date)
2151      WHERE  person_id = x_person_id
2152      AND    TRUNC(emp_assign_start_date) = TRUNC(x_emp_assign_start_date)
2153      RETURNING location_id BULK COLLECT INTO l_loc_tbl_conc_ps;
2154 
2155    ELSE
2156 
2157      UPDATE pn_space_assign_emp_all
2158      SET    emp_assign_end_date = (TRUNC(x_emp_assign_start_date) - 1)
2159      WHERE  person_id = x_person_id
2160      AND    emp_space_assign_id <> x_emp_space_assign_id
2161      AND    TRUNC(emp_assign_start_date) < TRUNC(x_emp_assign_start_date)
2162      AND    NVL(emp_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= TRUNC(x_emp_assign_start_date)
2163      RETURNING location_id BULK COLLECT INTO l_loc_tbl_past_ps;
2164 
2165      UPDATE pn_space_assign_emp_all
2166      SET    emp_assign_end_date = TRUNC(x_emp_assign_start_date)
2167      WHERE  person_id = x_person_id
2168      AND    emp_space_assign_id <> x_emp_space_assign_id
2169      AND    TRUNC(emp_assign_start_date) = TRUNC(x_emp_assign_start_date)
2170      RETURNING location_id BULK COLLECT INTO l_loc_tbl_conc_ps;
2171 
2172    END IF;
2173 
2174    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_past_ps);
2175    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_conc_ps);
2176    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_past_cc);
2177    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_conc_cc);
2178 
2179    x_loc_id_tbl := l_result_tbl;
2180 
2181    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.delete_other_assignments_emp (-)');
2182 
2183 END delete_other_assignments_emp;
2184 
2185 
2186 -------------------------------------------------------------------------------
2187 --  NAME         : DELETE_OTHER_ASSIGNMENTS_CUST
2188 --  DESCRIPTION  :
2189 --  INVOKED FROM :
2190 --  ARGUMENTS    : IN : x_cust_account_id, x_cust_assign_start_date,
2191 --                      x_cust_space_assign_id, x_loc_id_tbl
2192 --  REFERENCE    : PN_COMMON.debug()
2193 --  HISTORY      :
2194 --  06-FEB-01 dthota  o bug # 1609377 - Added code to update PN_SPACE_ASSIGN_CUST.
2195 --                      cust_assign_end_date of all customer assignments whose
2196 --                      start date is less than the start date of the assignmemnt
2197 --                      record being entered with (cust_assign_start_date -1) and
2198 --                      all customer assignments whose start date is equal to the
2199 --                      start date of the assignmemnt record being entered with
2200 --                      (cust_assign_start_date)
2201 -- 09-MAR-04 ftanudj  o added parameter x_cust_space_assign_id.
2202 -- 06-APR-05 ftanudja o Moved from PNTSPACE library. #4270051.
2203 --                    o Added parameter x_loc_id_tbl
2204 -- 21-JUN-05  hrodda  o Bug 4284035 - Replaced pn_space_assign_cust
2205 --                      with _ALL table.
2206 -------------------------------------------------------------------------------
2207 
2208 PROCEDURE delete_other_assignments_cust(
2209              x_cust_account_id        IN pn_space_assign_cust.cust_account_id%TYPE,
2210              x_cust_assign_start_date IN pn_space_assign_cust.cust_assign_start_date%TYPE,
2211              x_cust_space_assign_id   IN pn_space_assign_cust.cust_space_assign_id%TYPE,
2212              x_loc_id_tbl             OUT NOCOPY LOC_ID_TBL
2213 ) IS
2214 
2215   l_loc_tbl_past loc_id_tbl;
2216   l_loc_tbl_conc loc_id_tbl;
2217 
2218   l_result_tbl   loc_id_tbl;
2219 
2220 BEGIN
2221 
2222    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.delete_other_assignments_cust (+)');
2223 
2224    IF x_cust_space_assign_id IS NULL THEN
2225 
2226      UPDATE pn_space_assign_cust_all
2227      SET    cust_assign_end_date   = (TRUNC(x_cust_assign_start_date) - 1)
2228      WHERE  cust_account_id        = x_cust_account_id
2229      AND    cust_assign_start_date < TRUNC(x_cust_assign_start_date)
2230      AND    NVL(cust_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= TRUNC(x_cust_assign_start_date)
2231      RETURNING location_id BULK COLLECT INTO l_loc_tbl_past;
2232 
2233      UPDATE pn_space_assign_cust_all
2234      SET    cust_assign_end_date   = TRUNC(x_cust_assign_start_date)
2235      WHERE  cust_account_id        = x_cust_account_id
2236      AND    cust_assign_start_date = TRUNC(x_cust_assign_start_date)
2237      RETURNING location_id BULK COLLECT INTO l_loc_tbl_conc;
2238 
2239    ELSE
2240 
2241      UPDATE pn_space_assign_cust_all
2242      SET    cust_assign_end_date   = (TRUNC(x_cust_assign_start_date) - 1)
2243      WHERE  cust_account_id        = x_cust_account_id
2244      AND    cust_space_assign_id <> x_cust_space_assign_id
2245      AND    cust_assign_start_date < TRUNC(x_cust_assign_start_date)
2246      AND    NVL(cust_assign_end_date,TO_DATE('12/31/4712','MM/DD/YYYY')) >= TRUNC(x_cust_assign_start_date)
2247      RETURNING location_id BULK COLLECT INTO l_loc_tbl_past;
2248 
2249      UPDATE pn_space_assign_cust_all
2250      SET    cust_assign_end_date   = TRUNC(x_cust_assign_start_date)
2251      WHERE  cust_account_id        = x_cust_account_id
2252      AND    cust_space_assign_id <> x_cust_space_assign_id
2253      AND    cust_assign_start_date = TRUNC(x_cust_assign_start_date)
2254      RETURNING location_id BULK COLLECT INTO l_loc_tbl_conc;
2255 
2256    END IF;
2257 
2258    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_past);
2259    merge_tables(p_base_table => l_result_tbl, p_new_table => l_loc_tbl_conc);
2260 
2261    x_loc_id_tbl := l_result_tbl;
2262 
2263    pnp_debug_pkg.debug ('PN_SPACE_ASSIGN_CUST_PKG.delete_other_assignments_cust (+)');
2264 
2265 END delete_other_assignments_cust;
2266 
2267 
2268 END PN_SPACE_ASSIGN_CUST_PKG;