1 PACKAGE BODY PNT_LOCATIONS_PKG AS
2 -- $Header: PNTLOCNB.pls 120.8.12010000.3 2008/11/27 04:42:30 rthumma ship $
3
4 TYPE loc_info_rec IS
5 RECORD (active_start_date pn_locations.active_start_date%TYPE,
6 active_end_date pn_locations.active_end_date%TYPE,
7 area pn_locations.assignable_area%TYPE);
8
9 TYPE loc_info_type IS
10 TABLE OF loc_info_rec
11 INDEX BY BINARY_INTEGER;
12
13 loc_info_tbl loc_info_type;
14
15 ---------------------------------------------------------------------------------------------
16 -- CURSOR : For_Insert_Cur, For_Update_St_Cur, For_Update_End_Cur
17 -- DESCRIPTION: Moved similar cursors from procedures check_location_overlap and
18 -- check_location_gaps.
19 -- 15-NOV-2004 Satish Tripathi o Moved from check_location_overlap and check_location_gaps.
20 ---------------------------------------------------------------------------------------------
21
22 CURSOR For_Insert_Cur (p_loc_cd VARCHAR2, p_loc_type_cd VARCHAR2, p_org_id NUMBER)
23 IS
24 SELECT MIN(active_start_date), MAX(active_end_date)
25 FROM pn_locations_all
26 WHERE location_code = p_loc_cd
27 AND location_type_lookup_code = p_loc_type_cd
28 AND org_id = p_org_id;
29
30 CURSOR For_Update_St_Cur (p_loc_id NUMBER, p_str_dt DATE, p_str_dt_old DATE)
31 IS
32 SELECT TO_NUMBER(MIN(p_str_dt - active_end_date)) start_date_diff
33 FROM pn_locations_all
34 WHERE location_id = p_loc_id
35 AND ROWID <> g_pn_locations_rowid
36 AND active_end_date < p_str_dt_old;
37
38 CURSOR For_Update_End_Cur (p_loc_id NUMBER, p_end_dt DATE, p_end_dt_old DATE)
39 IS
40 SELECT TO_NUMBER(MAX(p_end_dt - active_start_date)) end_date_diff
41 FROM pn_locations_all
42 WHERE location_id = p_loc_id
43 AND ROWID <> g_pn_locations_rowid
44 AND active_start_date > p_end_dt_old;
45
46
47 PROCEDURE Put_Log(p_String VarChar2) IS
48
49 BEGIN
50
51 Fnd_File.Put_Line(Fnd_File.Log, p_String);
52
53 EXCEPTION
54
55 When Others Then Raise;
56
57 END Put_Log;
58
59 --------------------------------------------------------------------
60 -- FUNCTION get_max_rent_area
61 --------------------------------------------------------------------
62 FUNCTION Get_Max_Rent_Area(
63 p_loc_id IN NUMBER
64 ,p_lkp_code IN VARCHAR2
65 ,p_act_str_dt IN DATE
66 ,p_act_end_dt IN DATE
67 )
68 RETURN NUMBER
69 IS
70
71 CURSOR csr_loc_info(p_loc_id IN NUMBER,
72 p_lkp_code IN VARCHAR2,
73 p_act_str_dt IN DATE,
74 p_act_end_dt IN DATE) IS
75 SELECT location_id, active_start_date, active_end_date, NVL(rentable_area,0) rentable_area
76 FROM pn_locations_all
77 WHERE location_type_lookup_code = p_lkp_code
78 AND active_start_date <= NVL(p_act_end_dt, TO_DATE('12/31/4712','MM/DD/YYYY'))
79 AND active_end_date >= p_act_str_dt
80 START WITH location_id = p_loc_id
81 CONNECT BY PRIOR location_id = parent_location_id
82 AND p_act_str_dt between prior active_start_date and
83 NVL(prior active_end_date,TO_DATE('12/31/4712','MM/DD/YYYY'));
84
85 i NUMBER := 0;
86 l_num_table pn_recovery_extract_pkg.number_table_TYPE;
87 l_date_table pn_recovery_extract_pkg.date_table_TYPE;
88 l_max_area NUMBER := 0;
89
90 BEGIN
91 loc_info_tbl.delete;
92 FOR rec_loc_info IN csr_loc_info(p_loc_id, p_lkp_code, p_act_str_dt, p_act_end_dt)
93 LOOP
94
95 loc_info_tbl(i).active_start_date := rec_loc_info.active_start_date;
96 loc_info_tbl(i).active_end_date := rec_loc_info.active_end_date;
97 loc_info_tbl(i).area := rec_loc_info.rentable_area;
98 i := i + 1;
99 END LOOP;
100
101 FOR i IN 0 .. loc_info_tbl.count-1
102 LOOP
103 pn_recovery_extract_pkg.process_vacancy(
104 p_start_date => loc_info_tbl(i).active_start_date,
105 p_end_date => loc_info_tbl(i).active_end_date,
106 p_area => loc_info_tbl(i).area,
107 p_date_table => l_date_table,
108 p_number_table => l_num_table,
109 p_add => TRUE);
110 END LOOP;
111
112 FOR i IN 0 .. l_num_table.count-1
113 LOOP
114 IF l_num_table(i) > l_max_area THEN
115 l_max_area := l_num_table(i);
116 END IF;
117 END LOOP;
118
119 RETURN l_max_area;
120
121 END Get_Max_Rent_Area;
122
123 -------------------------------------------------------
124 -- Validates that the same location does not lie between
125 -- overlapping time periods
126 -------------------------------------------------------
127 PROCEDURE check_location_overlap (
128 p_org_id IN NUMBER,
129 p_location_id IN NUMBER ,
130 p_location_code IN VARCHAR2,
131 p_location_type_lookup_code IN VARCHAR2,
132 p_active_start_date IN DATE,
133 p_active_end_date IN DATE,
134 p_active_start_date_old IN DATE,
135 p_active_end_date_old IN DATE,
136 x_return_status OUT NOCOPY VARCHAR2,
137 x_return_message OUT NOCOPY VARCHAR2)
138 IS
139
140 l_min_start_date DATE;
141 l_max_end_date DATE;
142
143 BEGIN
144
145 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_location_overlap(+)');
146 pnp_debug_pkg.debug(' ChkLocOlap=> In Parameters :: p_location_id: '||p_location_id||', LocCd: '||p_location_code
147 ||', Type: '||p_location_type_lookup_code||' OrgId: '||p_org_id);
148 pnp_debug_pkg.debug(' ChkLocOlap=> p_active_start_date : '||TO_CHAR(p_active_start_date, 'MM/DD/YYYY')
149 ||', p_active_end_date : '||TO_CHAR(p_active_end_date, 'MM/DD/YYYY'));
150 pnp_debug_pkg.debug(' ChkLocOlap=> p_active_start_date_old: '||TO_CHAR(p_active_start_date_old, 'MM/DD/YYYY')
151 ||', p_active_end_date_old: '||TO_CHAR(p_active_end_date_old, 'MM/DD/YYYY'));
152
153 IF p_location_id IS NULL THEN
154
155 -- Check for overlaps during create record
156 OPEN for_insert_cur(p_loc_cd => p_location_code, p_loc_type_cd => p_location_type_lookup_code, p_org_id => p_org_id);
157 FETCH for_insert_cur
158 INTO l_min_start_date,
159 l_max_end_date;
160 CLOSE for_insert_cur;
161
162 pnp_debug_pkg.debug(' ChkLocOlap> MinStrDt: '||TO_CHAR(l_min_start_date, 'MM/DD/YYYY')
163 ||', MaxEndDt: '||TO_CHAR(l_max_end_date, 'MM/DD/YYYY'));
164 -- Validate for start date
165 IF p_active_start_date IS NOT NULL THEN
166 IF p_active_start_date BETWEEN l_min_start_date AND l_max_end_date THEN
167 x_return_status := FND_API.G_RET_STS_ERROR;
168 fnd_message.set_name('PN','PN_INVALID_EFFECTIVE_DATES');
169 return;
170 END IF;
171 END IF;
172
173 -- Validate for start date
174 IF p_active_end_date IS NULL THEN
175 IF p_active_start_date BETWEEN l_min_start_date AND l_max_end_date THEN
176 x_return_status := FND_API.G_RET_STS_ERROR;
177 fnd_message.set_name('PN','PN_INVALID_EFFECTIVE_DATES');
178 return;
179 END IF;
180
181 -- Validate for end date
182 ELSE
183 IF (p_active_end_date BETWEEN l_min_start_date AND l_max_end_date)
184 OR (p_active_end_date = g_end_of_time and p_active_start_date < l_min_start_date) THEN
185 x_return_status := FND_API.G_RET_STS_ERROR;
186 fnd_message.set_name('PN','PN_INVALID_EFFECTIVE_DATES');
187 return;
188 END IF;
189 END IF;
190
191 ELSE
192
193 IF p_active_start_date IS NOT NULL THEN
194 FOR update_rec in for_update_st_cur(p_loc_id => p_location_id, p_str_dt => p_active_start_date, p_str_dt_old => p_active_start_date_old)
195 LOOP
196 pnp_debug_pkg.debug(' ChkLocOlap> Start date diff = '|| update_rec.start_date_diff);
197 IF update_rec.start_date_diff < 1 then
198 x_return_status := FND_API.G_RET_STS_ERROR;
199 fnd_message.set_name('PN','PN_INVALID_EFFECTIVE_DATES');
200 return;
201 END IF;
202 END LOOP;
203 END IF;
204
205 IF p_active_end_date IS NOT NULL THEN
206 FOR update_rec in for_update_end_cur(p_loc_id => p_location_id, p_end_dt => p_active_end_date, p_end_dt_old => p_active_end_date_old)
207 LOOP
208 pnp_debug_pkg.debug(' ChkLocOlap> End date diff = '|| update_rec.end_date_diff);
209 IF update_rec.end_date_diff > -1 then
210 x_return_status := FND_API.G_RET_STS_ERROR;
211 fnd_message.set_name('PN','PN_INVALID_EFFECTIVE_DATES');
212 return;
213 END IF;
214 END LOOP;
215 END IF;
216 END IF;
217
218 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_location_overlap(-) ReturnStatus: '||x_return_status);
219 EXCEPTION
220
221 WHEN OTHERS THEN
222 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
223 fnd_message.set_token('ERR_MSG',sqlerrm);
224
225 END check_location_overlap;
226
227 ------------------------------------------------------
228 -- Procedure to validate that there cannot be any gaps
229 -- at building and floor level
230 -- 13-JAN-2005 Satish Tripathi o Fixed for BUG# 4104674. Sub/Add 1 from l_min/max_start_date.
231 ----------------------------------------------------
232 PROCEDURE check_location_gaps (
233 p_org_id IN NUMBER
234 ,p_location_id IN NUMBER
235 ,p_location_code IN VARCHAR2
236 ,p_location_type_lookup_code IN VARCHAR2
237 ,p_active_start_date IN DATE
238 ,p_active_end_date IN DATE
239 ,p_active_start_date_old IN DATE
240 ,p_active_end_date_old IN DATE
241 ,x_return_status OUT NOCOPY VARCHAR2
242 ,x_return_message OUT NOCOPY VARCHAR2
243 )
244 IS
245
246 l_min_start_date DATE;
247 l_max_end_date DATE;
248
249 BEGIN
250
251 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_location_gaps(+)');
252 pnp_debug_pkg.debug(' ChkLocGap=> In Parameters :: p_location_id: '||p_location_id
253 ||', LocCd: '||p_location_code||', OrgId: '||p_org_id);
254 pnp_debug_pkg.debug(' ChkLocGap=> p_active_start_date : '||TO_CHAR(p_active_start_date, 'MM/DD/YYYY')
255 ||', p_active_end_date : '||TO_CHAR(p_active_end_date, 'MM/DD/YYYY'));
256 pnp_debug_pkg.debug(' ChkLocGap=> p_active_start_date_old: '||TO_CHAR(p_active_start_date_old, 'MM/DD/YYYY')
257 ||', p_active_end_date_old: '||TO_CHAR(p_active_end_date_old, 'MM/DD/YYYY'));
258
259 IF p_location_id IS NULL THEN
260 -- Check for gaps during create record
261
262 OPEN for_insert_cur(p_loc_cd => p_location_code, p_loc_type_cd => p_location_type_lookup_code, p_org_id => p_org_id);
263 FETCH for_insert_cur
264 INTO l_min_start_date,
265 l_max_end_date;
266 CLOSE for_insert_cur;
267
268 l_min_start_date := l_min_start_date - 1;
269 l_max_end_date := l_max_end_date + 1;
270
271 pnp_debug_pkg.debug(' ChkLocGap> MinStrDt: '||TO_CHAR(l_min_start_date, 'MM/DD/YYYY')
272 ||', MaxEndDt: '||TO_CHAR(l_max_end_date, 'MM/DD/YYYY'));
273 IF p_active_start_date IS NOT NULL THEN
274 IF NOT ((p_active_start_date <= l_min_start_date AND
275 NVL(p_active_end_date, TO_DATE('12/31/4712','MM/DD/YYYY')) = l_min_start_date) OR
276 (p_active_start_date >= l_max_end_date and p_active_start_date = l_max_end_date))
277 THEN
278 pnp_debug_pkg.debug(' ChkLocGap> StrDt<MinStrDt OR StrDt>MaxEndDt');
279 x_return_status := FND_API.G_RET_STS_ERROR;
280 fnd_message.set_name('PN','PN_LOC_GAPS_MSG');
281 fnd_message.set_token('GAP_START_DATE',l_max_end_date);
282 fnd_message.set_token('GAP_END_DATE',p_active_start_date - 1);
283 RETURN;
284 END IF;
285 ELSIF p_active_end_date IS NOT NULL THEN
286 IF p_active_end_date < l_min_start_date THEN
287 pnp_debug_pkg.debug(' ChkLocGap> EndDt<MinStrDt');
288 x_return_status := FND_API.G_RET_STS_ERROR;
289 fnd_message.set_name('PN','PN_LOC_GAPS_MSG');
290 fnd_message.set_token('GAP_START_DATE',p_active_end_date + 1);
291 fnd_message.set_token('GAP_END_DATE',l_min_start_date);
292 RETURN;
293 END IF;
294 END IF;
295
296 ELSE
297
298 -- Check for gaps during update record
299
300 IF p_active_start_date IS NOT NULL THEN
301 FOR update_rec in for_update_st_cur(p_loc_id => p_location_id, p_str_dt => p_active_start_date, p_str_dt_old => p_active_start_date_old)
302 LOOP
303 pnp_debug_pkg.debug(' ChkLocGap> Start date diff = '|| update_rec.start_date_diff);
304 IF update_rec.start_date_diff <> 1 THEN
305 pnp_debug_pkg.debug(' ChkLocGap> StrDt not Null, Diff <> 1');
306 x_return_status := FND_API.G_RET_STS_ERROR;
307 fnd_message.set_name('PN','PN_LOC_GAPS_MSG');
308 fnd_message.set_token('GAP_START_DATE',p_active_start_date_old);
309 fnd_message.set_token('GAP_END_DATE',p_active_start_date - 1);
310 RETURN;
311 END IF;
312 END LOOP;
313 END IF;
314
315 IF p_active_end_date IS NOT NULL THEN
316 FOR update_rec in for_update_end_cur(p_loc_id => p_location_id, p_end_dt => p_active_end_date, p_end_dt_old => p_active_end_date_old)
317 LOOP
318 pnp_debug_pkg.debug(' ChkLocGap> End date diff = '|| update_rec.end_date_diff);
319 IF update_rec.end_date_diff <> -1 then
320 pnp_debug_pkg.debug(' ChkLocGap> EndDt not Null, Diff <> 1');
321 x_return_status := FND_API.G_RET_STS_ERROR;
322 fnd_message.set_name('PN','PN_LOC_GAPS_MSG');
323 fnd_message.set_token('GAP_START_DATE',p_active_end_date + 1);
324 fnd_message.set_token('GAP_END_DATE',p_active_end_date_old);
325 RETURN;
326 END IF;
327 END LOOP;
328 END IF;
329 END IF;
330
331 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_location_gaps(-) ReturnStatus: '||x_return_status);
332 EXCEPTION
333
334 WHEN OTHERS THEN
335 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
336 fnd_message.set_token('ERR_MSG',sqlerrm);
337
338 END check_location_gaps;
339
340 ----------------------------------------------------------------------
341 -- PROCEDURE SET_ROWID
342 ----------------------------------------------------------------------
343 PROCEDURE SET_ROWID
344 ( p_location_id IN NUMBER,
345 p_active_start_date IN DATE,
346 p_active_end_date IN DATE,
347 x_return_status OUT NOCOPY VARCHAR2,
348 x_return_message OUT NOCOPY VARCHAR2)
349
350 IS
351
352 l_rowid ROWID;
353
354 BEGIN
355
356 pnp_debug_pkg.debug(' PntLocnPkg.SetRowid (+) LocId: '||p_location_id
357 ||', ActStrDt: '||TO_CHAR(p_active_start_date, 'MM/DD/YYYY')
358 ||', ActEndDt: '||TO_CHAR(p_active_end_date, 'MM/DD/YYYY'));
359
360 -- Location ID, Active Start Date, Active End Date are the old values retrived by the query
361
362 SELECT ROWID
363 INTO l_rowid
364 FROM pn_locations_all
365 WHERE location_id = p_location_id
366 AND active_start_date = p_active_start_date
367 AND active_end_date = NVL(p_active_end_date,g_end_of_time);
368
369 g_pn_locations_rowid := l_rowid;
370
371 x_return_status := FND_API.G_RET_STS_SUCCESS;
372
373 pnp_debug_pkg.debug(' PntLocnPkg.SetRowid (-) ReturnStatus: '||x_return_status);
374
375 EXCEPTION
376 WHEN NO_DATA_FOUND THEN
377 x_return_status := FND_API.G_RET_STS_ERROR;
378
379 WHEN TOO_MANY_ROWS THEN
380 x_return_status := FND_API.G_RET_STS_ERROR;
381
382 WHEN OTHERS THEN
383 x_return_status := FND_API.G_RET_STS_ERROR;
384
385 END SET_ROWID;
386
387 -------------------------------------------------------------------------------
388 -- PROCEDURE : Set_Cascade
389 -- PURPOSE : This procedure sets the occupancy_status_code and
390 -- assignable_emp/cc/cust
391 -- of g_loc_recinfo_tmp depending on the value of p_cascade.
392 -- IN PARAM :
393 -- History :
394 -- 01-DEC-04 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
395 -- 22-DEC-04 Satish Tripathi o Added cursor parent_location_cursor to retain
396 -- not assignable of parent.
397 -- 21-FEB-06 Hareesha o Bug # 4918666 Copy values into g_loc_recinfo_tmp
398 -- only when l_cascade_emp AND l_cascade_cc AND
399 -- l_cascade_cust are not null.
400 -- 30-MAY-06 Hareesha o Bug #5222847 Cascade the value of occupancy status
401 -- to the child locations if made non-occupiable.
402 -------------------------------------------------------------------------------
403 PROCEDURE Set_Cascade (
404 p_cascade IN VARCHAR2
405 )
406 IS
407 l_cascade_occ VARCHAR2(30) := SUBSTR(p_cascade, 1, 1);
408 l_cascade_emp VARCHAR2(30) := SUBSTR(p_cascade, 2, 1);
409 l_cascade_cc VARCHAR2(30) := SUBSTR(p_cascade, 3, 1);
410 l_cascade_cust VARCHAR2(30) := SUBSTR(p_cascade, 4, 1);
411
412 CURSOR parent_location_cursor IS
413 SELECT *
414 FROM pn_locations_all
415 WHERE location_id = g_loc_recinfo_tmp.parent_location_id
416 AND active_start_date <= g_loc_recinfo_tmp.active_end_date
417 AND active_end_date >= g_loc_recinfo_tmp.active_start_date;
418
419 BEGIN
420
421 pnp_debug_pkg.debug(' Set_Cascade (+) '||p_cascade
422 ||', Occ/Asgn:|'||g_loc_recinfo_tmp.Occupancy_status_code
423 ||'|'||g_loc_recinfo_tmp.Assignable_emp
424 ||'|'||g_loc_recinfo_tmp.Assignable_cc
425 ||'|'||g_loc_recinfo_tmp.Assignable_cust
426 ||'|'
427 ||', LocId: '||g_loc_recinfo_tmp.location_id
428 ||', LocCd: '||g_loc_recinfo_tmp.location_code
429 ||', Type: '||g_loc_recinfo_tmp.location_type_lookup_code
430 ||', StrDt: '||TO_CHAR(g_loc_recinfo_tmp.active_start_date, 'MM/DD/YYYY')
431 ||', EndDt: '||TO_CHAR(g_loc_recinfo_tmp.active_end_date, 'MM/DD/YYYY'));
432
433 IF l_cascade_occ IN ('Y', 'N') THEN
434 FOR parent_locn IN parent_location_cursor
435 LOOP
436 IF l_cascade_occ = 'N' THEN
437 g_loc_recinfo_tmp.occupancy_status_code := 'N';
438 END IF;
439 IF l_cascade_emp IN ('Y','N') THEN
440 IF NVL(parent_locn.assignable_emp, 'Y') = 'N' THEN
441 g_loc_recinfo_tmp.assignable_emp := 'N';
442 END IF;
443 END IF;
444 IF l_cascade_cc IN ('Y','N') THEN
445 IF NVL(parent_locn.assignable_cc, 'Y') = 'N' THEN
446 g_loc_recinfo_tmp.assignable_cc := 'N';
447 END IF;
448 END IF;
449 IF l_cascade_cust IN ('Y','N') THEN
450 IF NVL(parent_locn.assignable_cust, 'Y') = 'N' THEN
451 g_loc_recinfo_tmp.assignable_cust := 'N';
452 END IF;
453 END IF;
454 END LOOP;
455
456 ELSE
457 IF l_cascade_emp IN ('Y', 'N') THEN
458 g_loc_recinfo_tmp.assignable_emp := l_cascade_emp;
459 END IF;
460
461 IF l_cascade_cc IN ('Y', 'N') THEN
462 g_loc_recinfo_tmp.assignable_cc := l_cascade_cc;
463 END IF;
464
465 IF l_cascade_cust IN ('Y', 'N') THEN
466 g_loc_recinfo_tmp.assignable_cust := l_cascade_cust;
467 END IF;
468 END IF;
469
470 pnp_debug_pkg.debug(' Set_Cascade (-) '||p_cascade
471 ||', Occ/Asgn:|'||g_loc_recinfo_tmp.Occupancy_status_code
472 ||'|'||g_loc_recinfo_tmp.Assignable_emp
473 ||'|'||g_loc_recinfo_tmp.Assignable_cc
474 ||'|'||g_loc_recinfo_tmp.Assignable_cust
475 ||'|');
476
477 END Set_Cascade;
478
479
480 -----------------------------------------------------------------------
481 -- PROCEDURE : Set_Null_Request_Program_Id
482 -- PURPOSE : This procedure sets request_id, program_id, program_update_date
483 -- and program_application_id to NULL of g_loc_recinfo_tmp.
484 -- IN PARAM :
485 -- History :
486 -- 01-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
487 -----------------------------------------------------------------------
488 PROCEDURE Set_Null_Request_Program_Id
489 IS
490 BEGIN
491 g_loc_recinfo_tmp.request_id := NULL;
492 g_loc_recinfo_tmp.program_id := NULL;
493 g_loc_recinfo_tmp.program_update_date := NULL;
494 g_loc_recinfo_tmp.program_application_id := NULL;
495 END Set_Null_Request_Program_Id;
496
497
498 -------------------------------------------------------------------------------
499 -- PROCEDURE CORRECT_UPDATE_ROW
500 -- HISTORY:
501 -- 14-JAN-2002 Mrinal Misra o Did conditional assignment of dates to
502 -- Validate_date_assignable_area for
503 -- CORRECT/UPDATE.
504 -- 14-OCT-2003 Anand Tuppad o Added code to consider the new column
505 -- bookable_flag.
506 -- 06-FEB-2004 Kiran Hegde o indented code
507 -- o changed the way l_end_date is populated
508 -- o changed the condition for populating
509 -- G_LOC_RECINFO
510 -- 01-DEC-2004 Satish Tripathi o Modified for Portfolio Status Enh BUG# 4030816.
511 -- Added parameter p_cascade to cascade the changes in
512 -- occupancy_status_code, assignable_emp/cc/cust to
513 -- Child locations by calling Cascade_Child_Locn.
514 -- Populate g_loc_recinfo_tmp to call Insert/Update_Locn_Row.
515 -- 21-JAN-2008 acprakas o Bug#6755579: Commented code which sets g_loc_recinfo_tmp.common_area_flag
516 -- to NULL.
517 -------------------------------------------------------------------------------
518 PROCEDURE Correct_Update_Row(
519 p_pn_locations_rec IN pn_locations_all%ROWTYPE
520 ,p_pn_addresses_rec IN pn_addresses_all%ROWTYPE
521 ,p_change_mode IN VARCHAR2
522 ,p_as_of_date IN DATE
523 ,p_active_start_date_old IN DATE
524 ,p_active_end_date_old IN DATE
525 ,p_assgn_area_chgd_flag IN VARCHAR2
526 ,p_validate IN BOOLEAN
527 ,p_cascade IN VARCHAR2
528 ,x_return_status OUT NOCOPY VARCHAR2
529 ,x_return_message OUT NOCOPY VARCHAR2
530 )
531 IS
532
533 l_rowid rowid;
534 l_location_id NUMBER := NULL;
535 l_str_dt DATE := NULL;
536 l_str_dt_old DATE := NULL;
537 l_end_dt DATE := NULL;
538 l_active_start_date_new DATE := NULL;
539 l_active_end_date_new DATE := NULL;
540 l_as_of_date DATE := NULL;
541
542 CURSOR location_cursor_old is
543 SELECT *
544 FROM pn_locations_all
545 WHERE location_id = p_pn_locations_rec.location_id
546 AND active_start_date = NVL(p_active_start_date_old, g_start_of_time)
547 AND active_end_date = NVL(p_active_end_date_old, g_end_of_time);
548
549 BEGIN
550
551
552 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Correct_Update_Row (+) Mode: '||p_change_mode||', Cascade: '||p_cascade
553 ||', AsofDt: '||p_as_of_date);
554 pnp_debug_pkg.debug(' CorUpdRow=> LocId: '||p_pn_locations_rec.location_id||', LocCd: '||p_pn_locations_rec.location_code
555 ||', Type: '||p_pn_locations_rec.location_type_lookup_code
556 ||', StrDt: '||TO_CHAR(p_pn_locations_rec.active_start_date, 'MM/DD/YYYY')
557 ||', EndDt: '||TO_CHAR(p_pn_locations_rec.active_end_date, 'MM/DD/YYYY'));
558
559 x_return_status := FND_API.G_RET_STS_SUCCESS;
560
561 PNT_LOCATIONS_PKG.SET_ROWID(
562 p_location_id => p_pn_locations_rec.location_id,
563 p_active_start_date => p_active_start_date_old,
564 p_active_end_date => p_active_end_date_old,
565 x_return_status => x_return_status,
566 x_return_message => x_return_message);
567
568 IF ( p_validate) THEN
569 pnp_debug_pkg.put_log_msg('Calling validate_assignable_area');
570
571 IF p_change_mode = 'CORRECT' THEN
572 l_str_dt := p_pn_locations_rec.active_start_date;
573 l_end_dt := p_pn_locations_rec.active_end_date;
574 ELSIF p_change_mode = 'UPDATE' THEN
575 l_str_dt := p_as_of_date;
576 l_end_dt := p_pn_locations_rec.active_end_date;
577 END IF;
578
579 PNP_UTIL_FUNC.Validate_date_assignable_area
580 (p_location_id => p_pn_locations_rec.location_id,
581 p_location_type => p_pn_locations_rec.location_type_lookup_code,
582 p_start_date => l_str_dt,
583 p_end_date => l_end_dt,
584 p_active_start_date_old => p_active_start_date_old,
585 p_active_end_date_old => p_active_end_date_old,
586 p_change_mode => p_change_mode,
587 p_assignable_area => p_pn_locations_rec.assignable_area,
588 x_return_status => x_return_status,
589 x_return_message => x_return_message
590 );
591
592 IF not(x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
593 x_return_status := FND_API.G_RET_STS_ERROR;
594 APP_EXCEPTION.Raise_Exception;
595 END IF;
596
597 -- Added redwin Fix for Bug 2722698
598
599 PNT_LOCATIONS_PKG.update_assignments (
600 p_location_id => p_pn_locations_rec.location_id,
601 p_active_start_date => p_pn_locations_Rec.active_start_date,
602 p_active_end_date => p_pn_locations_rec.active_end_date,
603 p_active_start_date_old => p_active_start_date_old,
604 p_active_end_date_old => p_active_end_date_old,
605 x_return_status => x_return_status,
606 x_return_message => x_return_message);
607
608 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
609 x_return_status := FND_API.G_RET_STS_ERROR;
610 APP_EXCEPTION.Raise_Exception;
611 END IF;
612
613 END IF; -- if p_validate
614
615 IF G_LOC_RECINFO.location_id IS NULL OR
616 G_LOC_RECINFO.location_id <> p_pn_locations_rec.location_id OR
617 NVL(G_LOC_RECINFO.active_start_date, G_START_OF_TIME)
618 <> NVL(p_active_start_date_old, G_START_OF_TIME) OR
619 NVL(G_LOC_RECINFO.active_end_date, G_END_OF_TIME)
620 <> NVL(p_active_end_date_old, G_END_OF_TIME) THEN
621
622 OPEN LOCATION_CURSOR_OLD;
623 FETCH location_cursor_old INTO G_LOC_RECINFO;
624 IF (location_cursor_old%NOTFOUND) THEN
625 CLOSE location_cursor_old;
626 APP_EXCEPTION.Raise_Exception;
627 END IF;
628 CLOSE LOCATION_CURSOR_OLD;
629
630 END IF;
631
632 -- The following is called if dates are brought in, then we need to update the children
633
634 IF G_LOC_RECINFO.active_end_date >
635 nvl(p_pn_locations_rec.active_end_date,G_END_OF_TIME) OR
636 G_LOC_RECINFO.active_start_date
637 < nvl(p_pn_locations_rec.active_start_date,G_START_OF_TIME) THEN
638
639 PNT_LOCATIONS_PKG.Update_child_for_dates (
640 p_location_id => p_pn_locations_rec.location_id,
641 p_active_start_date => p_pn_locations_Rec.active_start_date,
642 p_active_end_date => p_pn_locations_rec.active_end_date,
643 p_active_start_date_old => p_active_start_date_old,
644 p_active_end_date_old => p_active_end_date_old,
645 p_location_type_lookup_code => p_pn_locations_rec.location_type_lookup_code,
646 x_return_status => x_return_status,
647 x_return_message => x_return_message);
648
649 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
650 x_return_status := FND_API.G_RET_STS_ERROR;
651 APP_EXCEPTION.Raise_Exception;
652 END IF;
653
654 END IF;
655
656 IF p_change_mode = 'CORRECT' THEN
657
658 -- The following is to check if gaps are there in location records
659 IF ( p_validate) then
660
661 ----------------------------------------------
662 -- Call check_location_overlap
663 -- This procedure checks that there is no overlap
664 -- of dates for the same location
665 ------------------------------------------------
666 pnp_debug_pkg.put_log_msg('Calling check_location_overlap');
667 PNT_LOCATIONS_PKG.check_location_overlap (
668 p_org_id => p_pn_locations_rec.org_id,
669 p_location_id => p_pn_locations_rec.location_id,
670 p_location_code => p_pn_locations_rec.location_code,
671 p_location_type_lookup_code => p_pn_locations_rec.location_type_lookup_code,
672 p_active_start_date => p_pn_locations_rec.active_start_date,
673 p_active_end_date => p_pn_locations_rec.active_end_date,
674 p_active_start_date_old => p_active_start_date_old,
675 p_active_end_date_old => p_active_end_date_old,
676 x_return_status => x_return_status,
677 x_return_message => x_return_message);
678
679 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
680 pnp_debug_pkg.debug(' CorUpdRow> Error in check_location_overlap');
681 pnp_debug_pkg.put_log_msg(' CorUpdRow> Error :Calling check_location_overlap');
682 x_return_status := FND_API.G_RET_STS_ERROR;
683 APP_EXCEPTION.Raise_Exception;
684 END IF;
685
686 IF p_pn_locations_rec.location_type_lookup_code NOT IN ('OFFICE', 'SECTION') THEN
687 pnp_debug_pkg.put_log_msg('Calling check_location_gaps');
688 PNT_LOCATIONS_PKG.check_location_gaps (
689 p_org_id => p_pn_locations_rec.org_id,
690 p_location_id => p_pn_locations_rec.location_id,
691 p_location_code => p_pn_locations_rec.location_code,
692 p_location_type_lookup_code => p_pn_locations_rec.location_type_lookup_code,
693 p_active_start_date => p_pn_locations_rec.active_start_date,
694 p_active_end_date => p_pn_locations_rec.active_end_date,
695 p_active_start_date_old => p_active_start_date_old,
696 p_active_end_date_old => p_active_end_date_old,
697 x_return_status => x_return_status,
698 x_return_message => x_return_message);
699
700 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
701 pnp_debug_pkg.put_log_msg('Error Calling check_location_gaps');
702 x_return_status := FND_API.G_RET_STS_ERROR;
703 APP_EXCEPTION.Raise_Exception;
704 END IF;
705
706 END IF;
707
708 END IF; -- endif for p_validate
709
710 PNP_DEBUG_PKG.put_log_msg('call update row ');
711
712 g_loc_recinfo_tmp := p_pn_locations_rec;
713 g_loc_adrinfo_tmp := p_pn_addresses_rec;
714 pnt_locations_pkg.Set_Cascade(p_cascade);
715 pnt_locations_pkg.Update_Locn_Row(
716 p_loc_recinfo => g_loc_recinfo_tmp
717 ,p_adr_recinfo => g_loc_adrinfo_tmp
718 ,p_assgn_area_chgd_flag => p_change_mode
719 ,x_return_status => x_return_status
720 ,x_return_message => x_return_message
721 );
722
723 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
724 x_return_status := FND_API.G_RET_STS_ERROR;
725 APP_EXCEPTION.Raise_Exception;
726 END IF;
727
728 IF p_pn_locations_rec.location_type_lookup_code NOT IN ('OFFICE', 'SECTION') AND
729 LTRIM(RTRIM(p_cascade)) IS NOT NULL THEN
730 pnt_locations_pkg.cascade_child_locn(
731 p_location_id => p_pn_locations_rec.location_id
732 ,p_start_date => p_pn_locations_rec.active_start_date
733 ,p_end_date => p_pn_locations_rec.active_end_date
734 ,p_cascade => p_cascade
735 ,p_change_mode => p_change_mode
736 ,x_return_status => x_return_status
737 ,x_return_message => x_return_message
738 );
739
740 END IF;
741
742 -- 'CORRECT' MODE ENDS
743
744 ELSIF p_change_mode = 'UPDATE' THEN
745
746 l_active_start_date_new := G_LOC_RECINFO.active_start_date;
747 l_active_end_date_new := G_LOC_RECINFO.active_end_date;
748
749 IF p_pn_locations_rec.active_start_date <> G_LOC_RECINFO.active_start_date THEN
750 -- this means user had changed the start date with update option.
751 l_active_start_date_new := p_pn_locations_rec.active_start_date;
752 END IF;
753 IF p_pn_locations_rec.active_end_date <> G_LOC_RECINFO.active_end_date THEN
754 -- this means user had changed the start date with update option.
755 l_active_end_date_new := p_pn_locations_rec.active_end_date;
756 END IF;
757
758 g_loc_recinfo_tmp := p_pn_locations_rec;
759 g_loc_adrinfo_tmp := p_pn_addresses_rec;
760 g_loc_recinfo_tmp.active_start_date := p_as_of_date;
761 g_loc_recinfo_tmp.active_end_date := l_active_end_date_new;
762 pnt_locations_pkg.Set_Cascade(p_cascade);
763 pnt_locations_pkg.Update_Locn_Row(
764 p_loc_recinfo => g_loc_recinfo_tmp
765 ,p_adr_recinfo => g_loc_adrinfo_tmp
766 ,p_assgn_area_chgd_flag => p_change_mode
767 ,x_return_status => x_return_status
768 ,x_return_message => x_return_message
769 );
770
771 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
772 x_return_status := FND_API.G_RET_STS_ERROR;
773 APP_EXCEPTION.Raise_Exception;
774 END IF;
775
776 pnp_debug_pkg.put_log_msg('Calling UPDATE ROW.');
777
778 pnp_debug_pkg.put_log_msg('Calling INSERT ROW address = ' || G_LOC_RECINFO.ADDRESS_ID);
779
780 g_loc_recinfo_tmp := g_loc_recinfo;
781 g_loc_adrinfo_tmp := p_pn_addresses_rec;
782 --Bug#6755579 g_loc_recinfo_tmp.common_area_flag := NULL;
783 g_loc_recinfo_tmp.active_start_date := l_active_start_date_new;
784 g_loc_recinfo_tmp.active_end_date := p_as_of_date - 1;
785 pnt_locations_pkg.Set_Null_Request_Program_Id;
786 pnt_locations_pkg.Insert_Locn_Row(
787 p_loc_recinfo => g_loc_recinfo_tmp
788 ,p_adr_recinfo => g_loc_adrinfo_tmp
789 ,p_change_mode => p_change_mode
790 ,x_return_status => x_return_status
791 ,x_return_message => x_return_message
792 );
793
794 IF NOT ( x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
795 x_return_status := FND_API.G_RET_STS_ERROR;
796 APP_EXCEPTION.Raise_Exception;
797 END IF;
798
799 IF p_pn_locations_rec.location_type_lookup_code NOT IN ('OFFICE', 'SECTION') AND
800 LTRIM(RTRIM(p_cascade)) IS NOT NULL THEN
801 pnt_locations_pkg.cascade_child_locn(
802 p_location_id => p_pn_locations_rec.location_id
803 ,p_start_date => p_as_of_date
804 ,p_end_date => l_active_end_date_new
805 ,p_cascade => p_cascade
806 ,p_change_mode => p_change_mode
807 ,x_return_status => x_return_status
808 ,x_return_message => x_return_message
809 );
810 END IF;
811
812 END IF;
813 -- End if of correct or update
814
815 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Correct_Update_Row (-) ReturnStatus: '||x_return_status);
816
817 EXCEPTION
818 WHEN OTHERS THEN
819 x_return_status := FND_API.G_RET_STS_ERROR;
820
821 END Correct_Update_Row;
822
823
824 -------------------------------------------------------------------------------
825 -- PROCEDURE : Cascade_Child_Locn
826 -- PURPOSE : This procedure cascades changes of occupancy_status_code
827 -- and assignable_emp/cc/cust to the child location depending
828 -- on the value of p_cascade. Called from Correct_Update_Row.
829 -- IN PARAM :
830 -- History :
831 -- 01-DEC-04 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
832 -- 18-JAN-05 Satish Tripathi o For splitting a loc, 1st call Set_RowId. Check for
833 -- x_return_status = 'S' before calling
834 -- Insert/Update_Locn_Row.
835 -- 11-JUL-06 Hareesha o Bug #5351698 Modified location_cursor
836 -- to remove duplicate records.
837 -------------------------------------------------------------------------------
838 PROCEDURE Cascade_Child_Locn (
839 p_location_id IN NUMBER
840 ,p_start_date IN DATE
841 ,p_end_date IN DATE
842 ,p_cascade IN VARCHAR2
843 ,p_change_mode IN VARCHAR2
844 ,x_return_status OUT NOCOPY VARCHAR2
845 ,x_return_message OUT NOCOPY VARCHAR2
846 )
847 IS
848 l_loc_type VARCHAR2(30) := 'BUILDING';
849 l_split VARCHAR2(30) := 'N';
850 l_cascade_occ VARCHAR2(30) := SUBSTR(p_cascade, 1, 1);
851 l_cascade_emp VARCHAR2(30) := SUBSTR(p_cascade, 2, 1);
852 l_cascade_cc VARCHAR2(30) := SUBSTR(p_cascade, 3, 1);
853 l_cascade_cust VARCHAR2(30) := SUBSTR(p_cascade, 4, 1);
854
855 CURSOR location_cursor IS
856 SELECT *
857 FROM pn_locations_all
858 START WITH ( parent_location_id = p_location_id
859 AND active_start_date <= NVL(p_end_date, TO_DATE('12/31/4712','MM/DD/YYYY'))
860 AND active_end_date >= p_start_date
861 )
862 CONNECT BY ( PRIOR location_id = parent_location_id
863 AND active_end_date >= prior active_start_date
864 AND active_start_date <= prior active_end_date
865 )
866 ORDER BY location_type_lookup_code, active_start_date;
867
868 BEGIN
869
870 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Cascade_Child_Locn (+)');
871 pnp_debug_pkg.debug(' CacCldLoc=> In Parameters :: p_location_id: '||p_location_id||', Cascade: '||p_cascade
872 ||', Mode: '||p_change_mode);
873 pnp_debug_pkg.debug(' CacCldLoc=> StrDt: '||TO_CHAR(p_start_date, 'MM/DD/YYYY')
874 ||', EndDt: '||TO_CHAR(p_end_date, 'MM/DD/YYYY'));
875
876 FOR locn_rec IN location_cursor
877 LOOP
878 g_loc_recinfo_tmp := NULL;
879 g_pn_locations_rowid := NULL;
880 l_split := 'N';
881 IF l_cascade_occ IN ('Y', 'N') THEN
882 IF locn_rec.occupancy_status_code <> l_cascade_occ OR
883 locn_rec.assignable_emp <> l_cascade_occ OR
884 locn_rec.assignable_cc <> l_cascade_occ OR
885 locn_rec.assignable_cust <> l_cascade_occ
886 THEN
887 l_split := 'Y';
888 END IF;
889 ELSE
890 IF l_cascade_emp IN ('Y', 'N') AND
891 locn_rec.assignable_emp <> l_cascade_emp
892 THEN
893 l_split := 'Y';
894 END IF;
895
896 IF l_cascade_cc IN ('Y', 'N') AND
897 locn_rec.assignable_cc <> l_cascade_cc
898 THEN
899 l_split := 'Y';
900 END IF;
901
902 IF l_cascade_cust IN ('Y', 'N') AND
903 locn_rec.assignable_cust <> l_cascade_cust
904 THEN
905 l_split := 'Y';
906 END IF;
907 END IF;
908
909 pnp_debug_pkg.debug(' CacCldLoc> Row#: '||location_cursor%ROWCOUNT||', LocId: '||locn_rec.location_id
910 ||', LocCd: '||locn_rec.location_code
911 ||', Type: '||locn_rec.location_type_lookup_code
912 ||', Split: '||l_split);
913 pnp_debug_pkg.debug(' CacCldLoc> ActStrDate : '||TO_CHAR(locn_rec.active_start_date, 'MM/DD/YYYY')
914 ||', ActEndDate : '||TO_CHAR(locn_rec.active_end_date, 'MM/DD/YYYY'));
915
916 IF l_split = 'Y' THEN
917 pnt_locations_pkg.Set_RowId(locn_rec.location_id, locn_rec.active_start_date, locn_rec.active_end_date,
918 x_return_status, x_return_message);
919
920 IF locn_rec.active_start_date < p_start_date AND
921 locn_rec.active_end_date > p_end_date THEN
922
923 pnp_debug_pkg.debug(' CacCldLoc> ... Case# 1: ActStrDt < pStrDt AND ActEndDt > pEndDt');
924 IF x_return_status = 'S' THEN
925 g_loc_recinfo_tmp := locn_rec;
926 g_loc_recinfo_tmp.active_end_date := p_start_date-1;
927 pnt_locations_pkg.Update_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
928 END IF;
929
930 IF x_return_status = 'S' THEN
931 g_loc_recinfo_tmp := locn_rec;
932 g_loc_recinfo_tmp.active_start_date := p_start_date;
933 g_loc_recinfo_tmp.active_end_date := p_end_date;
934 pnt_locations_pkg.Set_Null_Request_Program_Id;
935 pnt_locations_pkg.Set_Cascade(p_cascade);
936 pnt_locations_pkg.Insert_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
937 END IF;
938
939 IF x_return_status = 'S' THEN
940 g_loc_recinfo_tmp := locn_rec;
941 g_loc_recinfo_tmp.active_start_date := p_end_date+1;
942 pnt_locations_pkg.Set_Null_Request_Program_Id;
943 pnt_locations_pkg.Insert_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
944 END IF;
945
946 ELSIF locn_rec.active_start_date < p_start_date THEN
947
948 pnp_debug_pkg.debug(' CacCldLoc> ... Case# 2: ActStrDt < pStrDt');
949 IF x_return_status = 'S' THEN
950 g_loc_recinfo_tmp := locn_rec;
951 g_loc_recinfo_tmp.active_end_date := p_start_date-1;
952 pnt_locations_pkg.Update_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
953 END IF;
954
955 IF x_return_status = 'S' THEN
956 g_loc_recinfo_tmp := locn_rec;
957 g_loc_recinfo_tmp.active_start_date := p_start_date;
958 pnt_locations_pkg.Set_Null_Request_Program_Id;
959 pnt_locations_pkg.Set_Cascade(p_cascade);
960 pnt_locations_pkg.Insert_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
961 END IF;
962
963 ELSIF locn_rec.active_end_date > p_end_date THEN
964
965 pnp_debug_pkg.debug(' CacCldLoc> ... Case# 3: ActEndDt > pEndDt');
966 IF x_return_status = 'S' THEN
967 g_loc_recinfo_tmp := locn_rec;
968 g_loc_recinfo_tmp.active_end_date := p_end_date;
969 pnt_locations_pkg.Set_Cascade(p_cascade);
970 pnt_locations_pkg.Update_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
971 END IF;
972
973 IF x_return_status = 'S' THEN
974 g_loc_recinfo_tmp := locn_rec;
975 g_loc_recinfo_tmp.active_start_date := p_end_date+1;
976 pnt_locations_pkg.Set_Null_Request_Program_Id;
977 pnt_locations_pkg.Insert_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
978 END IF;
979
980 ELSE
981
982 pnp_debug_pkg.debug(' CacCldLoc> ... Case# 4: ActStrDt >= pStrDt AND ActEndDt <= pEndDt');
983 IF x_return_status = 'S' THEN
984 g_loc_recinfo_tmp := locn_rec;
985 pnt_locations_pkg.Set_Cascade(p_cascade);
986 pnt_locations_pkg.Update_Locn_Row(g_loc_recinfo_tmp, NULL, p_change_mode, x_return_status, x_return_message);
987 END IF;
988
989 END IF;
990 END IF;
991
992 END LOOP;
993
994 IF x_return_status IS NULL THEN
995 x_return_status := fnd_api.g_ret_sts_success;
996 END IF;
997
998 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Cascade_Child_Locn (-) ReturnStatus: '||x_return_status);
999
1000 END Cascade_Child_Locn;
1001
1002
1003 -----------------------------------------------------------------------
1004 -- PROCEDURE : Check_Locn_Assgn
1005 -- PURPOSE : This Function returns TRUE when there exists either of any
1006 -- of employee, cost center, customer assignments of location
1007 -- depending on the parameter Assignable Mode (p_asgn_mode).
1008 -- IN PARAM :
1009 -- History :
1010 -- 01-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
1011 -----------------------------------------------------------------------
1012 FUNCTION Check_Locn_Assgn (
1013 p_location_id IN NUMBER
1014 ,p_location_type IN VARCHAR2
1015 ,p_str_date IN DATE
1016 ,p_end_date IN DATE
1017 ,p_asgn_mode IN VARCHAR2
1018 )
1019 RETURN BOOLEAN
1020 IS
1021 l_exists BOOLEAN;
1022 l_asgn_exists VARCHAR2(30) := 'FALSE';
1023 l_str_date DATE;
1024 l_end_date DATE;
1025
1026 --Modified the cursor for Bug 6827603
1027 CURSOR check_assign_csr IS
1028 SELECT 'TRUE'
1029 FROM DUAL
1030 WHERE EXISTS (SELECT NULL
1031 FROM pn_space_assign_cust_all, (SELECT location_id loc_id
1032 FROM pn_locations_all
1033 WHERE active_start_date <= l_end_date
1034 AND active_end_date >= l_str_date
1035 START WITH location_id = p_location_id
1036 CONNECT BY PRIOR location_id = parent_location_id
1037 UNION
1038 SELECT -1 loc_id
1039 FROM DUAL) loc
1040 WHERE p_asgn_mode IN ('ALL', 'CUST')
1041 AND ((p_location_type IN ('OFFICE', 'SECTION') AND
1042 location_id = p_location_id AND
1043 loc.loc_id=-1) OR
1044 (p_location_type NOT IN ('OFFICE', 'SECTION') AND
1045 location_id =loc.loc_id))
1046 AND cust_assign_start_date <= l_end_date
1047 AND NVL(cust_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY')) >= l_str_date)
1048 OR EXISTS (SELECT NULL
1049 FROM pn_space_assign_emp_all, (SELECT location_id loc_id
1050 FROM pn_locations_all
1051 WHERE active_start_date <= l_end_date
1052 AND active_end_date >= l_str_date
1053 START WITH location_id = p_location_id
1054 CONNECT BY PRIOR location_id = parent_location_id
1055 UNION
1056 SELECT -1 loc_id
1057 FROM DUAL) loc
1058 WHERE p_asgn_mode IN ('ALL', 'EMP', 'CC')
1059 AND ((p_location_type IN ('OFFICE', 'SECTION') AND
1060 location_id = p_location_id AND
1061 loc.loc_id=-1) OR
1062 (p_location_type NOT IN ('OFFICE', 'SECTION') AND
1063 location_id =loc.loc_id))
1064 AND ((p_asgn_mode = 'ALL') OR
1065 (p_asgn_mode = 'EMP' AND person_id IS NOT NULL) OR
1066 (p_asgn_mode = 'CC' AND cost_center_code IS NOT NULL))
1067 AND emp_assign_start_date <= l_end_date
1068 AND NVL(emp_assign_end_date, TO_DATE('12/31/4712','MM/DD/YYYY')) >= l_str_date);
1069
1070 BEGIN
1071
1072 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Check_Locn_Assgn (+)');
1073 l_str_date := p_str_date;
1074 l_end_date := NVL(p_end_date, TO_DATE('12/31/4712','MM/DD/YYYY'));
1075
1076 OPEN check_assign_csr;
1077 FETCH check_assign_csr INTO l_asgn_exists;
1078 CLOSE check_assign_csr;
1079
1080 IF l_asgn_exists = 'TRUE' THEN
1081 l_exists := TRUE;
1082 ELSE
1083 l_exists := FALSE;
1084 END IF;
1085
1086 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Check_Locn_Assgn (-) l_exists: '||l_asgn_exists);
1087
1088 RETURN l_exists;
1089
1090 END Check_Locn_Assgn;
1091
1092 -----------------------------------------------------------------------
1093 -- PROCEDURE : Parent_Not_Occpble_Asgnble
1094 -- PURPOSE : This Function returns TRUE when Parent location is
1095 -- not Occupiable or Emp/CC/Cust assignable depending on the
1096 -- parameter Status Mode (p_status_mode).
1097 -- IN PARAM :
1098 -- History :
1099 -- 22-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
1100 -----------------------------------------------------------------------
1101 FUNCTION Parent_Not_Occpble_Asgnble (
1102 p_parent_location_id IN NUMBER
1103 ,p_str_date IN DATE
1104 ,p_end_date IN DATE
1105 ,p_status_mode IN VARCHAR2
1106 )
1107 RETURN BOOLEAN
1108 IS
1109 l_exists BOOLEAN;
1110 l_loc_status VARCHAR2(30) := 'FALSE';
1111 l_str_date DATE;
1112 l_end_date DATE;
1113
1114 CURSOR check_loc_status_csr IS
1115 SELECT 'TRUE'
1116 FROM DUAL
1117 WHERE EXISTS (SELECT NULL
1118 FROM pn_locations_all
1119 WHERE location_id = p_parent_location_id
1120 AND active_start_date <= l_end_date
1121 AND active_end_date >= l_str_date
1122 AND ((p_status_mode IN ('OCC') AND NVL(occupancy_status_code, 'Y') = 'N')
1123 OR (p_status_mode IN ('EMP') AND NVL(assignable_emp, 'Y') = 'N')
1124 OR (p_status_mode IN ('CC') AND NVL(assignable_cc, 'Y') = 'N')
1125 OR (p_status_mode IN ('CUST') AND NVL(assignable_cust, 'Y') = 'N')));
1126
1127 BEGIN
1128
1129 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Parent_Not_Occpble_Asgnble (+) LocId:'||p_parent_location_id
1130 ||', Mode: '||p_status_mode
1131 ||', StrDt: '||TO_CHAR(p_str_date, 'MM/DD/YYYY')
1132 ||', EndDt: '||TO_CHAR(p_end_date, 'MM/DD/YYYY'));
1133 l_str_date := p_str_date;
1134 l_end_date := NVL(p_end_date, TO_DATE('12/31/4712','MM/DD/YYYY'));
1135
1136 IF p_status_mode IN ('OCC', 'EMP', 'CC', 'CUST') THEN
1137 OPEN check_loc_status_csr;
1138 FETCH check_loc_status_csr INTO l_loc_status;
1139 CLOSE check_loc_status_csr;
1140
1141 IF l_loc_status = 'TRUE' THEN
1142 l_exists := TRUE;
1143 ELSE
1144 l_exists := FALSE;
1145 END IF;
1146 END IF;
1147
1148 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Parent_Not_Occpble_Asgnble (-) l_exists: '||l_loc_status);
1149
1150 RETURN l_exists;
1151
1152 END Parent_Not_Occpble_Asgnble;
1153
1154
1155 -------------------------------------------------------------------------------
1156 -- PROCEDURE insert_row
1157 -- DESCRIPTION : inserts a row in pn_addresses_all
1158 -- SCOPE : PUBLIC
1159 -- INVOKED FROM :
1160 -- RETURNS : NONE
1161 -- HISTORY :
1162 -- 14-Feb-04 Kiran o validate_gross_area will now be called for both
1163 -- Offices and Sections
1164 -- 01-DEC-04 STripathi o Modified for Portfolio Status Enh BUG# 4030816.
1165 -- Added parameters occupancy_status_code,
1166 -- assignable_emp, assignable_cc, assignable_cust,
1167 -- disposition, acc_treatment.
1168 -- 28-APR-05 piagrawa o Modified the select statements to retrieve values
1169 -- from pn_locations_all instead of pn_locations
1170 -- Also passed org_id as parameter to
1171 -- PNT_ADDR_PKG.insert_row
1172 -- 19-JUL-05 SatyaDeep o Added argument x_source to insert the source
1173 -- product from pn_locations_itf for bug#4468893
1174 -- 28-NOV-05 pikhar o fetched org_id using cursor
1175 -- 21-AUG-08 rthumma o Bug 7273859 : Modified call to pnt_addr_pkg.insert_row
1176 -- to pass NULL for ATTRIBUTE_CATEGORY,attribute1..15
1177 -------------------------------------------------------------------------------
1178 PROCEDURE insert_row (
1179 x_rowid IN OUT NOCOPY rowid
1180 ,x_org_id IN NUMBER
1181 ,x_LOCATION_ID IN OUT NOCOPY NUMBER
1182 ,x_LAST_UPDATE_DATE DATE
1183 ,x_LAST_UPDATED_BY NUMBER
1184 ,x_CREATION_DATE DATE
1185 ,x_CREATED_BY NUMBER
1186 ,x_LAST_UPDATE_LOGIN NUMBER
1187 ,x_LOCATION_PARK_ID NUMBER
1188 ,x_LOCATION_TYPE_LOOKUP_CODE VARCHAR2
1189 ,x_SPACE_TYPE_LOOKUP_CODE VARCHAR2
1190 ,x_FUNCTION_TYPE_LOOKUP_CODE VARCHAR2
1191 ,x_STANDARD_TYPE_LOOKUP_CODE VARCHAR2
1192 ,x_LOCATION_ALIAS VARCHAR2
1193 ,x_LOCATION_CODE VARCHAR2
1194 ,x_BUILDING VARCHAR2
1195 ,x_LEASE_OR_OWNED VARCHAR2
1196 ,x_CLASS VARCHAR2
1197 ,x_STATUS_TYPE VARCHAR2
1198 ,x_FLOOR VARCHAR2
1199 ,x_OFFICE VARCHAR2
1200 ,x_ADDRESS_ID IN OUT NOCOPY NUMBER
1201 ,x_MAX_CAPACITY NUMBER
1202 ,x_OPTIMUM_CAPACITY NUMBER
1203 ,x_GROSS_AREA NUMBER
1204 ,x_RENTABLE_AREA NUMBER
1205 ,x_USABLE_AREA NUMBER
1206 ,x_ASSIGNABLE_AREA NUMBER
1207 ,x_COMMON_AREA NUMBER
1208 ,x_SUITE VARCHAR2
1209 ,x_ALLOCATE_COST_CENTER_CODE VARCHAR2
1210 ,x_UOM_CODE VARCHAR2
1211 ,x_DESCRIPTION VARCHAR2
1212 ,x_PARENT_LOCATION_ID NUMBER
1213 ,x_INTERFACE_FLAG VARCHAR2
1214 ,x_REQUEST_ID NUMBER
1215 ,x_PROGRAM_APPLICATION_ID NUMBER
1216 ,x_PROGRAM_ID NUMBER
1217 ,x_PROGRAM_UPDATE_DATE DATE
1218 ,x_STATUS VARCHAR2
1219 ,x_PROPERTY_ID NUMBER
1220 ,x_ATTRIBUTE_CATEGORY VARCHAR2
1221 ,x_ATTRIBUTE1 VARCHAR2
1222 ,x_ATTRIBUTE2 VARCHAR2
1223 ,x_ATTRIBUTE3 VARCHAR2
1224 ,x_ATTRIBUTE4 VARCHAR2
1225 ,x_ATTRIBUTE5 VARCHAR2
1226 ,x_ATTRIBUTE6 VARCHAR2
1227 ,x_ATTRIBUTE7 VARCHAR2
1228 ,x_ATTRIBUTE8 VARCHAR2
1229 ,x_ATTRIBUTE9 VARCHAR2
1230 ,x_ATTRIBUTE10 VARCHAR2
1231 ,x_ATTRIBUTE11 VARCHAR2
1232 ,x_ATTRIBUTE12 VARCHAR2
1233 ,x_ATTRIBUTE13 VARCHAR2
1234 ,x_ATTRIBUTE14 VARCHAR2
1235 ,x_ATTRIBUTE15 VARCHAR2
1236 ,x_address_line1 VARCHAR2
1237 ,x_address_line2 VARCHAR2
1238 ,x_address_line3 VARCHAR2
1239 ,x_address_line4 VARCHAR2
1240 ,x_county VARCHAR2
1241 ,x_city VARCHAR2
1242 ,x_state VARCHAR2
1243 ,x_province VARCHAR2
1244 ,x_zip_code VARCHAR2
1245 ,x_country VARCHAR2
1246 ,x_territory_id NUMBER
1247 ,x_addr_last_update_date DATE
1248 ,x_addr_last_updated_by NUMBER
1249 ,x_addr_creation_date DATE
1250 ,x_addr_created_by NUMBER
1251 ,x_addr_last_update_login NUMBER
1252 ,x_addr_attribute_category VARCHAR2
1253 ,x_addr_attribute1 VARCHAR2
1254 ,x_addr_attribute2 VARCHAR2
1255 ,x_addr_attribute3 VARCHAR2
1256 ,x_addr_attribute4 VARCHAR2
1257 ,x_addr_attribute5 VARCHAR2
1258 ,x_addr_attribute6 VARCHAR2
1259 ,x_addr_attribute7 VARCHAR2
1260 ,x_addr_attribute8 VARCHAR2
1261 ,x_addr_attribute9 VARCHAR2
1262 ,x_addr_attribute10 VARCHAR2
1263 ,x_addr_attribute11 VARCHAR2
1264 ,x_addr_attribute12 VARCHAR2
1265 ,x_addr_attribute13 VARCHAR2
1266 ,x_addr_attribute14 VARCHAR2
1267 ,x_addr_attribute15 VARCHAR2
1268 ,x_common_area_flag VARCHAR2
1269 ,x_active_start_date DATE
1270 ,x_active_end_date DATE
1271 ,x_return_status OUT NOCOPY VARCHAR2
1272 ,x_return_message OUT NOCOPY VARCHAR2
1273 ,x_bookable_flag VARCHAR2
1274 ,x_change_mode VARCHAR2
1275 ,x_occupancy_status_code VARCHAR2
1276 ,x_assignable_emp VARCHAR2
1277 ,x_assignable_cc VARCHAR2
1278 ,x_assignable_cust VARCHAR2
1279 ,x_disposition_code VARCHAR2
1280 ,x_acc_treatment_code VARCHAR2
1281 ,x_source VARCHAR2
1282 )
1283 IS
1284
1285 CURSOR c IS
1286 SELECT ROWID
1287 FROM pn_locations_all
1288 WHERE location_id = x_location_id
1289 AND active_start_date = NVL(x_active_start_date, g_start_of_time)
1290 AND active_end_date = NVL(x_active_end_date, g_end_of_time);
1291
1292 l_return_status VARCHAR2(2000) := NULL;
1293 l_return_message VARCHAR2(32767) := NULL;
1294 l_sqlerrm VARCHAR2(2000);
1295
1296 BEGIN
1297 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.insert_row (+) LocId: '||x_location_id||', LocCd: '||x_location_code
1298 ||', Type: '||x_location_type_lookup_code
1299 ||', ActStrDt: '||TO_CHAR(x_active_start_date, 'MM/DD/YYYY')
1300 ||', ActEndDt: '||TO_CHAR(x_active_end_date, 'MM/DD/YYYY'));
1301 x_return_status := fnd_api.g_ret_sts_success;
1302
1303 -----------------------------------------------------------------
1304 -- Call CHECK_UNIQUE_LOCATION_ALIAS to check if the location alias
1305 -- is unique.
1306 -----------------------------------------------------------------
1307 l_return_status := NULL;
1308 PNT_LOCATIONS_PKG.check_unique_location_alias ( l_return_status,
1309 x_location_id,
1310 x_parent_location_id,
1311 x_location_type_lookup_code,
1312 x_location_alias,
1313 x_active_start_date,
1314 x_active_end_date,
1315 x_org_id);
1316 IF (l_return_status IS NOT NULL) THEN
1317 pnp_debug_pkg.put_log_msg('Error in unique_location_alias');
1318 APP_EXCEPTION.Raise_Exception;
1319 END IF;
1320
1321 -----------------------------------------------------------------
1322 -- Call CHECK_UNIQUE_LOCATION_CODE to check if the location code
1323 -- is unique.
1324 -----------------------------------------------------------------
1325 l_return_status := NULL;
1326 check_unique_location_code (
1327 l_return_status
1328 ,x_location_id
1329 ,x_location_code
1330 ,x_active_start_date
1331 ,x_active_end_date
1332 ,x_org_id);
1333 IF (l_return_status IS NOT NULL) THEN
1334 pnp_debug_pkg.put_log_msg('Error in unique_location_code');
1335 APP_EXCEPTION.Raise_Exception;
1336 END IF;
1337
1338 IF x_location_type_lookup_code IN ('OFFICE', 'SECTION') AND
1339 x_rentable_area IS NOT NULL THEN
1340
1341 IF NOT pnt_locations_pkg.validate_gross_area(x_parent_location_id,
1342 x_rentable_area,
1343 x_location_type_lookup_code,
1344 x_active_start_date,
1345 x_active_end_date) THEN
1346
1347 fnd_message.set_name('PN', 'PN_GROSS_RENTABLE');
1348 app_exception.raise_Exception;
1349 END IF;
1350 END IF;
1351
1352 -- Check for location overlap in insert row
1353
1354 l_return_status := NULL;
1355
1356 IF NVL(x_change_mode,'X') not in ('UPDATE') THEN
1357 PNT_LOCATIONS_PKG.check_location_overlap (
1358 p_org_id => x_org_id,
1359 p_location_id => NULL,
1360 p_location_code => x_location_code,
1361 p_location_type_lookup_code => x_location_type_lookup_code,
1362 p_active_start_date => x_active_start_date,
1363 p_active_end_date => NVL(x_active_end_date,G_END_OF_TIME),
1364 p_active_start_date_old => null,
1365 p_active_end_date_old => null,
1366 x_return_status => l_return_status,
1367 x_return_message => l_return_message);
1368
1369 IF NOT ( l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1370 pnp_debug_pkg.debug(' InsRow> Error in check_location_overlap ');
1371 APP_EXCEPTION.Raise_Exception;
1372 END IF;
1373
1374 END IF; -- x_change_mode
1375
1376 l_return_status := NULL;
1377
1378 IF NOT (NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('OFFICE', 'SECTION'))
1379 and NVL(x_change_mode,'X') not in ('UPDATE') THEN
1380
1381 PNT_LOCATIONS_PKG.check_location_gaps (
1382 p_org_id => x_org_id,
1383 p_location_id => null,
1384 p_location_code => x_location_code,
1385 p_location_type_lookup_code => x_location_type_lookup_code,
1386 p_active_start_date => x_active_start_date,
1387 p_active_end_date => x_active_end_date,
1388 p_active_start_date_old => null,
1389 p_active_end_date_old => null,
1390 x_return_status => l_return_status,
1391 x_return_message => l_return_message);
1392
1393 IF NOT ( l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1394 APP_EXCEPTION.Raise_Exception;
1395 END IF;
1396
1397 END IF; -- x_LOCATION_TYPE_LOOKUP_CODE
1398
1399 -----------------------------------------------------------------
1400 -- Call the PN_ADDRESSES insert table handler to create an address
1401 -- row and also return the address_id (OUT parameter) for
1402 -- PN_LOCATIONS table. This will only be called when we insert the
1403 -- building record.
1404 -----------------------------------------------------------------
1405
1406 pnp_debug_pkg.put_log_msg('Calling address insert address =' || x_address_id);
1407 IF (NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('BUILDING','LAND'))
1408 AND x_address_id is null THEN
1409 PNT_ADDR_PKG.insert_row (
1410 x_address_id,
1411 x_address_line1,
1412 x_address_line2,
1413 x_address_line3,
1414 x_address_line4,
1415 x_county,
1416 x_city,
1417 x_state,
1418 x_province,
1419 x_zip_code,
1420 x_country,
1421 x_territory_id,
1422 x_last_update_date,
1423 x_last_updated_by,
1424 x_creation_date,
1425 x_created_by,
1426 x_last_update_login,
1427 null,
1428 null,
1429 null,
1430 null,
1431 null,
1432 null,
1433 null,
1434 null,
1435 null,
1436 null,
1437 null,
1438 null,
1439 null,
1440 null,
1441 null,
1442 null,
1443 x_addr_attribute_category,
1444 x_addr_attribute1,
1445 x_addr_attribute2,
1446 x_addr_attribute3,
1447 x_addr_attribute4,
1448 x_addr_attribute5,
1449 x_addr_attribute6,
1450 x_addr_attribute7,
1451 x_addr_attribute8,
1452 x_addr_attribute9,
1453 x_addr_attribute10,
1454 x_addr_attribute11,
1455 x_addr_attribute12,
1456 x_addr_attribute13,
1457 x_addr_attribute14,
1458 x_addr_attribute15,
1459 x_org_id
1460 );
1461 END IF;
1462
1463 -----------------------------------------------------------------
1464 -- Allocate the sequence to the primary key loction_id
1465 -- Do not get a new location_id in case of UPDATE
1466 -----------------------------------------------------------------
1467 IF x_change_mode IS NULL and x_location_id is null THEN
1468 SELECT pn_locations_s.NEXTVAL
1469 INTO x_location_id
1470 FROM DUAL;
1471 END IF;
1472
1473 pnp_debug_pkg.debug(' InsRow> before insert' || x_change_mode);
1474 BEGIN
1475 INSERT INTO pn_locations_all (
1476 LOCATION_ID
1477 ,LAST_UPDATE_DATE
1478 ,LAST_UPDATED_BY
1479 ,CREATION_DATE
1480 ,CREATED_BY
1481 ,LAST_UPDATE_LOGIN
1482 ,LOCATION_PARK_ID
1483 ,LOCATION_TYPE_LOOKUP_CODE
1484 ,SPACE_TYPE_LOOKUP_CODE
1485 ,FUNCTION_TYPE_LOOKUP_CODE
1486 ,STANDARD_TYPE_LOOKUP_CODE
1487 ,LOCATION_ALIAS
1488 ,LOCATION_CODE
1489 ,BUILDING
1490 ,LEASE_OR_OWNED
1491 ,CLASS
1492 ,STATUS_TYPE
1493 ,FLOOR
1494 ,OFFICE
1495 ,ADDRESS_ID
1496 ,MAX_CAPACITY
1497 ,OPTIMUM_CAPACITY
1498 ,GROSS_AREA
1499 ,RENTABLE_AREA
1500 ,USABLE_AREA
1501 ,ASSIGNABLE_AREA
1502 ,COMMON_AREA
1503 ,SUITE
1504 ,ALLOCATE_COST_CENTER_CODE
1505 ,UOM_CODE
1506 ,DESCRIPTION
1507 ,PARENT_LOCATION_ID
1508 ,INTERFACE_FLAG
1509 ,REQUEST_ID
1510 ,PROGRAM_APPLICATION_ID
1511 ,PROGRAM_ID
1512 ,PROGRAM_UPDATE_DATE
1513 ,STATUS
1514 ,PROPERTY_ID
1515 ,ATTRIBUTE_CATEGORY
1516 ,ATTRIBUTE1
1517 ,ATTRIBUTE2
1518 ,ATTRIBUTE3
1519 ,ATTRIBUTE4
1520 ,ATTRIBUTE5
1521 ,ATTRIBUTE6
1522 ,ATTRIBUTE7
1523 ,ATTRIBUTE8
1524 ,ATTRIBUTE9
1525 ,ATTRIBUTE10
1526 ,ATTRIBUTE11
1527 ,ATTRIBUTE12
1528 ,ATTRIBUTE13
1529 ,ATTRIBUTE14
1530 ,ATTRIBUTE15
1531 ,COMMON_AREA_FLAG
1532 ,ORG_ID
1533 ,ACTIVE_START_DATE
1534 ,ACTIVE_END_DATE
1535 ,BOOKABLE_FLAG
1536 ,occupancy_status_code
1537 ,assignable_emp
1538 ,assignable_cc
1539 ,assignable_cust
1540 ,disposition_code
1541 ,acc_treatment_code
1542 ,source
1543 )
1544 VALUES
1545 (
1546 x_LOCATION_ID
1547 ,x_LAST_UPDATE_DATE
1548 ,x_LAST_UPDATED_BY
1549 ,x_CREATION_DATE
1550 ,x_CREATED_BY
1551 ,x_LAST_UPDATE_LOGIN
1552 ,x_LOCATION_PARK_ID
1553 ,x_LOCATION_TYPE_LOOKUP_CODE
1554 ,x_SPACE_TYPE_LOOKUP_CODE
1555 ,x_FUNCTION_TYPE_LOOKUP_CODE
1556 ,x_STANDARD_TYPE_LOOKUP_CODE
1557 ,x_LOCATION_ALIAS
1558 ,x_LOCATION_CODE
1559 ,x_BUILDING
1560 ,x_LEASE_OR_OWNED
1561 ,x_CLASS
1562 ,x_STATUS_TYPE
1563 ,x_FLOOR
1564 ,x_OFFICE
1565 ,x_ADDRESS_ID
1566 ,x_MAX_CAPACITY
1567 ,x_OPTIMUM_CAPACITY
1568 ,x_GROSS_AREA
1569 ,x_RENTABLE_AREA
1570 ,x_USABLE_AREA
1571 ,x_ASSIGNABLE_AREA
1572 ,x_COMMON_AREA
1573 ,x_SUITE
1574 ,x_ALLOCATE_COST_CENTER_CODE
1575 ,x_UOM_CODE
1576 ,x_DESCRIPTION
1577 ,x_PARENT_LOCATION_ID
1578 ,x_INTERFACE_FLAG
1579 ,x_REQUEST_ID
1580 ,x_PROGRAM_APPLICATION_ID
1581 ,x_PROGRAM_ID
1582 ,x_PROGRAM_UPDATE_DATE
1583 ,x_STATUS
1584 ,x_PROPERTY_ID
1585 ,x_ATTRIBUTE_CATEGORY
1586 ,x_ATTRIBUTE1
1587 ,x_ATTRIBUTE2
1588 ,x_ATTRIBUTE3
1589 ,x_ATTRIBUTE4
1590 ,x_ATTRIBUTE5
1591 ,x_ATTRIBUTE6
1592 ,x_ATTRIBUTE7
1593 ,x_ATTRIBUTE8
1594 ,x_ATTRIBUTE9
1595 ,x_ATTRIBUTE10
1596 ,x_ATTRIBUTE11
1597 ,x_ATTRIBUTE12
1598 ,x_ATTRIBUTE13
1599 ,x_ATTRIBUTE14
1600 ,x_ATTRIBUTE15
1601 ,x_COMMON_AREA_FLAG
1602 ,x_org_id
1603 ,x_ACTIVE_START_DATE
1604 ,NVL(x_ACTIVE_END_DATE,G_END_OF_TIME)
1605 ,x_bookable_flag
1606 ,x_occupancy_status_code
1607 ,x_assignable_emp
1608 ,x_assignable_cc
1609 ,x_assignable_cust
1610 ,x_disposition_code
1611 ,x_acc_treatment_code
1612 ,x_source
1613 );
1614
1615 OPEN C;
1616 FETCH C INTO x_rowid;
1617 IF (C%NOTFOUND) THEN
1618 CLOSE C;
1619 pnp_debug_pkg.debug(' InsRow> Error in insert');
1620 RAISE NO_DATA_FOUND;
1621 END IF;
1622 CLOSE C;
1623
1624 EXCEPTION
1625 WHEN OTHERS THEN
1626 x_return_status := FND_API.G_RET_STS_ERROR;
1627 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
1628 fnd_message.set_token('ERR_MSG',sqlerrm);
1629 pnp_debug_pkg.debug(' InsRow> Other errors');
1630 pnp_debug_pkg.debug(sqlerrm);
1631 END;
1632
1633 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.insert_row (-) ReturnStatus: '||x_return_status);
1634
1635 END insert_row;
1636
1637 -------------------------------------------------------------------------------
1638 -- PROCEDURE update_row
1639 --
1640 -- 14-Feb-04 Kiran o validate_gross_area will now be called for both
1641 -- Offices and Sections
1642 -- 01-DEC-04 STripathi o Modified for Portfolio Status Enh BUG# 4030816.
1643 -- Added parameters occupancy_status_code,
1644 -- assignable_emp,assignable_cc, assignable_cust,
1645 -- disposition, acc_treatment.
1646 -- 19-JUL-05 SatyaDeep o Added argument x_source to update the source
1647 -- product from pn_locations_itf for bug#4468893
1648 -- 12-SEP-05 Hareesha o Modified update statement to include row_id
1649 -- in Where clause.
1650 -- 27-feb-06 piagrawa o Bug#5015429 - Modified to make a call to
1651 -- loctn_assgn_area_update when x_assgn_area_chgd_flag
1652 -- is equal to 'CORRECT' or 'UPDATE'
1653 -- 21-AUG-08 rthumma o Bug 7273859 : Modified call to pnt_addr_pkg.update_row
1654 -- to pass NULL for ATTRIBUTE_CATEGORY,attribute1..15
1655 -------------------------------------------------------------------------------
1656 PROCEDURE UPDATE_ROW (
1657 x_LOCATION_ID NUMBER
1658 ,x_LAST_UPDATE_DATE DATE
1659 ,x_LAST_UPDATED_BY NUMBER
1660 ,x_LAST_UPDATE_LOGIN NUMBER
1661 ,x_LOCATION_PARK_ID NUMBER
1662 ,x_LOCATION_TYPE_LOOKUP_CODE VARCHAR2
1663 ,x_SPACE_TYPE_LOOKUP_CODE VARCHAR2
1664 ,x_FUNCTION_TYPE_LOOKUP_CODE VARCHAR2
1665 ,x_STANDARD_TYPE_LOOKUP_CODE VARCHAR2
1666 ,x_BUILDING VARCHAR2
1667 ,x_LEASE_OR_OWNED VARCHAR2
1668 ,x_CLASS VARCHAR2
1669 ,x_STATUS_TYPE VARCHAR2
1670 ,x_FLOOR VARCHAR2
1671 ,x_OFFICE VARCHAR2
1672 ,x_ADDRESS_ID NUMBER
1673 ,x_MAX_CAPACITY NUMBER
1674 ,x_OPTIMUM_CAPACITY NUMBER
1675 ,x_GROSS_AREA NUMBER
1676 ,x_RENTABLE_AREA NUMBER
1677 ,x_USABLE_AREA NUMBER
1678 ,x_ASSIGNABLE_AREA NUMBER
1679 ,x_COMMON_AREA NUMBER
1680 ,x_SUITE VARCHAR2
1681 ,x_ALLOCATE_COST_CENTER_CODE VARCHAR2
1682 ,x_UOM_CODE VARCHAR2
1683 ,x_DESCRIPTION VARCHAR2
1684 ,x_PARENT_LOCATION_ID NUMBER
1685 ,x_INTERFACE_FLAG VARCHAR2
1686 ,x_STATUS VARCHAR2
1687 ,x_PROPERTY_ID NUMBER
1688 ,x_ATTRIBUTE_CATEGORY VARCHAR2
1689 ,x_ATTRIBUTE1 VARCHAR2
1690 ,x_ATTRIBUTE2 VARCHAR2
1691 ,x_ATTRIBUTE3 VARCHAR2
1692 ,x_ATTRIBUTE4 VARCHAR2
1693 ,x_ATTRIBUTE5 VARCHAR2
1694 ,x_ATTRIBUTE6 VARCHAR2
1695 ,x_ATTRIBUTE7 VARCHAR2
1696 ,x_ATTRIBUTE8 VARCHAR2
1697 ,x_ATTRIBUTE9 VARCHAR2
1698 ,x_ATTRIBUTE10 VARCHAR2
1699 ,x_ATTRIBUTE11 VARCHAR2
1700 ,x_ATTRIBUTE12 VARCHAR2
1701 ,x_ATTRIBUTE13 VARCHAR2
1702 ,x_ATTRIBUTE14 VARCHAR2
1703 ,x_ATTRIBUTE15 VARCHAR2
1704 ,x_address_line1 VARCHAR2
1705 ,x_address_line2 VARCHAR2
1706 ,x_address_line3 VARCHAR2
1707 ,x_address_line4 VARCHAR2
1708 ,x_county VARCHAR2
1709 ,x_city VARCHAR2
1710 ,x_state VARCHAR2
1711 ,x_province VARCHAR2
1712 ,x_zip_code VARCHAR2
1713 ,x_country VARCHAR2
1714 ,x_territory_id NUMBER
1715 ,x_addr_last_update_date DATE
1716 ,x_addr_last_updated_by NUMBER
1717 ,x_addr_last_update_login NUMBER
1718 ,x_addr_attribute_category VARCHAR2
1719 ,x_addr_attribute1 VARCHAR2
1720 ,x_addr_attribute2 VARCHAR2
1721 ,x_addr_attribute3 VARCHAR2
1722 ,x_addr_attribute4 VARCHAR2
1723 ,x_addr_attribute5 VARCHAR2
1724 ,x_addr_attribute6 VARCHAR2
1725 ,x_addr_attribute7 VARCHAR2
1726 ,x_addr_attribute8 VARCHAR2
1727 ,x_addr_attribute9 VARCHAR2
1728 ,x_addr_attribute10 VARCHAR2
1729 ,x_addr_attribute11 VARCHAR2
1730 ,x_addr_attribute12 VARCHAR2
1731 ,x_addr_attribute13 VARCHAR2
1732 ,x_addr_attribute14 VARCHAR2
1733 ,x_addr_attribute15 VARCHAR2
1734 ,x_common_area_flag VARCHAR2
1735 ,x_assgn_area_chgd_flag VARCHAR2
1736 ,x_active_start_date DATE
1737 ,x_active_end_date DATE
1738 ,x_return_status OUT NOCOPY varchar2
1739 ,x_return_message OUT NOCOPY varchar2
1740 ,x_bookable_flag VARCHAR2
1741 ,x_occupancy_status_code VARCHAR2
1742 ,x_assignable_emp VARCHAR2
1743 ,x_assignable_cc VARCHAR2
1744 ,x_assignable_cust VARCHAR2
1745 ,x_disposition_code VARCHAR2
1746 ,x_acc_treatment_code VARCHAR2
1747 ,x_source VARCHAR2
1748 )
1749 IS
1750
1751 l_return_status VARCHAR2(2000) := NULL;
1752
1753 BEGIN
1754
1755 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_row (+) LocId: '||x_location_id||', Type: '||x_location_type_lookup_code
1756 ||', ActStrDt: '||TO_CHAR(x_active_start_date, 'MM/DD/YYYY')
1757 ||', ActEndDt: '||TO_CHAR(x_active_end_date, 'MM/DD/YYYY'));
1758 x_return_status := FND_API.G_RET_STS_SUCCESS;
1759
1760 IF x_location_type_lookup_code IN ('OFFICE', 'SECTION') AND
1761 x_rentable_area IS NOT NULL THEN
1762 IF NOT pnt_locations_pkg.validate_gross_area(x_location_id,
1763 x_rentable_area,
1764 x_location_type_lookup_code,
1765 x_active_start_date,
1766 x_active_end_date,
1767 'UPDATE') THEN
1768
1769 fnd_message.set_name('PN', 'PN_GROSS_RENTABLE');
1770 app_exception.raise_Exception;
1771 END IF;
1772 END IF;
1773
1774 IF x_assgn_area_chgd_flag IN ('CORRECT', 'UPDATE') THEN
1775
1776 pnp_util_func.loctn_assgn_area_update(p_loc_id => x_location_id
1777 ,p_assgn_area => x_assignable_area
1778 ,p_str_dt => x_active_start_date
1779 ,p_end_dt => x_active_end_date
1780 );
1781 END IF;
1782
1783 pnp_debug_pkg.put_log_msg('update locations');
1784
1785 UPDATE PN_LOCATIONS_ALL
1786 SET
1787 LAST_UPDATE_DATE = x_LAST_UPDATE_DATE
1788 ,LAST_UPDATED_BY = x_LAST_UPDATED_BY
1789 ,LAST_UPDATE_LOGIN = x_LAST_UPDATE_LOGIN
1790 ,LOCATION_PARK_ID = x_LOCATION_PARK_ID
1791 ,LOCATION_TYPE_LOOKUP_CODE = x_LOCATION_TYPE_LOOKUP_CODE
1792 ,SPACE_TYPE_LOOKUP_CODE = x_SPACE_TYPE_LOOKUP_CODE
1793 ,FUNCTION_TYPE_LOOKUP_CODE = x_FUNCTION_TYPE_LOOKUP_CODE
1794 ,STANDARD_TYPE_LOOKUP_CODE = x_STANDARD_TYPE_LOOKUP_CODE
1795 ,BUILDING = x_BUILDING
1796 ,LEASE_OR_OWNED = x_LEASE_OR_OWNED
1797 ,CLASS = x_CLASS -- Added redwin
1798 ,STATUS_TYPE = x_STATUS_TYPE
1799 ,FLOOR = x_FLOOR
1800 ,OFFICE = x_OFFICE
1801 ,ADDRESS_ID = x_ADDRESS_ID
1802 ,MAX_CAPACITY = x_MAX_CAPACITY
1803 ,OPTIMUM_CAPACITY = x_OPTIMUM_CAPACITY
1804 ,GROSS_AREA = x_GROSS_AREA
1805 ,RENTABLE_AREA = x_RENTABLE_AREA
1806 ,USABLE_AREA = x_USABLE_AREA
1807 ,ASSIGNABLE_AREA = x_ASSIGNABLE_AREA
1808 ,COMMON_AREA = x_COMMON_AREA
1809 ,SUITE = x_SUITE
1810 ,ALLOCATE_COST_CENTER_CODE = x_ALLOCATE_COST_CENTER_CODE
1811 ,UOM_CODE = x_UOM_CODE
1812 ,DESCRIPTION = x_DESCRIPTION
1813 ,PARENT_LOCATION_ID = x_PARENT_LOCATION_ID
1814 ,INTERFACE_FLAG = x_INTERFACE_FLAG
1815 ,STATUS = x_STATUS
1816 ,PROPERTY_ID = x_PROPERTY_ID
1817 ,ATTRIBUTE_CATEGORY = x_ATTRIBUTE_CATEGORY
1818 ,ATTRIBUTE1 = x_ATTRIBUTE1
1819 ,ATTRIBUTE2 = x_ATTRIBUTE2
1820 ,ATTRIBUTE3 = x_ATTRIBUTE3
1821 ,ATTRIBUTE4 = x_ATTRIBUTE4
1822 ,ATTRIBUTE5 = x_ATTRIBUTE5
1823 ,ATTRIBUTE6 = x_ATTRIBUTE6
1824 ,ATTRIBUTE7 = x_ATTRIBUTE7
1825 ,ATTRIBUTE8 = x_ATTRIBUTE8
1826 ,ATTRIBUTE9 = x_ATTRIBUTE9
1827 ,ATTRIBUTE10 = x_ATTRIBUTE10
1828 ,ATTRIBUTE11 = x_ATTRIBUTE11
1829 ,ATTRIBUTE12 = x_ATTRIBUTE12
1830 ,ATTRIBUTE13 = x_ATTRIBUTE13
1831 ,ATTRIBUTE14 = x_ATTRIBUTE14
1832 ,ATTRIBUTE15 = x_ATTRIBUTE15
1833 ,COMMON_AREA_FLAG = x_COMMON_AREA_FLAG
1834 ,ACTIVE_START_DATE = x_active_start_date
1835 ,ACTIVE_END_DATE = NVL(x_active_end_date,g_end_of_time)
1836 ,BOOKABLE_FLAG = x_bookable_flag
1837 ,occupancy_status_code = x_occupancy_status_code
1838 ,assignable_emp = x_assignable_emp
1839 ,assignable_cc = x_assignable_cc
1840 ,assignable_cust = x_assignable_cust
1841 ,disposition_code = x_disposition_code
1842 ,acc_treatment_code = x_acc_treatment_code
1843 ,source = x_source
1844 WHERE ROWID = g_pn_locations_rowid;
1845
1846 IF (SQL%NOTFOUND) THEN
1847 RAISE NO_DATA_FOUND;
1848 END IF;
1849
1850 -----------------------------------------------------------------
1851 -- Call the PN_ADDRESSES update table handler to update address
1852 -- elements. This will only be called when we update the
1853 -- building record.
1854 -----------------------------------------------------------------
1855 IF NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('BUILDING','LAND') THEN
1856 PNT_ADDR_PKG.update_row (
1857 x_address_id,
1858 x_address_line1,
1859 x_address_line2,
1860 x_address_line3,
1861 x_address_line4,
1862 x_county,
1863 x_city,
1864 x_state,
1865 x_province,
1866 x_zip_code,
1867 x_country,
1868 x_territory_id,
1869 x_last_update_date,
1870 x_last_updated_by,
1871 x_last_update_login,
1872 null,
1873 null,
1874 null,
1875 null,
1876 null,
1877 null,
1878 null,
1879 null,
1880 null,
1881 null,
1882 null,
1883 null,
1884 null,
1885 null,
1886 null,
1887 null,
1888 x_addr_attribute_category,
1889 x_addr_attribute1,
1890 x_addr_attribute2,
1891 x_addr_attribute3,
1892 x_addr_attribute4,
1893 x_addr_attribute5,
1894 x_addr_attribute6,
1895 x_addr_attribute7,
1896 x_addr_attribute8,
1897 x_addr_attribute9,
1898 x_addr_attribute10,
1899 x_addr_attribute11,
1900 x_addr_attribute12,
1901 x_addr_attribute13,
1902 x_addr_attribute14,
1903 x_addr_attribute15
1904 );
1905 END IF;
1906
1907 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_row (-) ReturnStatus: '||x_return_status);
1908
1909 EXCEPTION
1910 WHEN OTHERS THEN
1911 x_return_status := FND_API.G_RET_STS_ERROR;
1912 fnd_message.set_name('PN','PN_OTHERS_EXCEPTION');
1913 fnd_message.set_token('ERR_MSG',sqlerrm);
1914 pnp_debug_pkg.put_log_msg('OTHER ERRORS'|| sqlerrm);
1915 END UPDATE_ROW;
1916
1917 ------------------------------------------------------------------------
1918 -- PROCEDURE : lock_row
1919 -- 01-DEC-2004 Satish Tripathi o Modified for Portfolio Status Enh BUG# 4030816.
1920 -- Added parameters occupancy_status_code, assignable_emp,
1921 -- assignable_cc, assignable_cust, disposition, acc_treatment.
1922 -- 21-AUG-2008 rthumma o Bug 7273859 : Modified call to pnt_addr_pkg.lock_row
1923 -- to pass NULL for ATTRIBUTE_CATEGORY,attribute1..15
1924 ------------------------------------------------------------------------
1925 PROCEDURE lock_row (
1926 x_LOCATION_ID NUMBER
1927 ,x_LOCATION_PARK_ID NUMBER
1928 ,x_LOCATION_TYPE_LOOKUP_CODE VARCHAR2
1929 ,x_SPACE_TYPE_LOOKUP_CODE VARCHAR2
1930 ,x_FUNCTION_TYPE_LOOKUP_CODE VARCHAR2
1931 ,x_STANDARD_TYPE_LOOKUP_CODE VARCHAR2
1932 ,x_LOCATION_ALIAS VARCHAR2
1933 ,x_LOCATION_CODE VARCHAR2
1934 ,x_BUILDING VARCHAR2
1935 ,x_LEASE_OR_OWNED VARCHAR2
1936 ,x_CLASS VARCHAR2
1937 ,x_STATUS_TYPE VARCHAR2
1938 ,x_FLOOR VARCHAR2
1939 ,x_OFFICE VARCHAR2
1940 ,x_ADDRESS_ID NUMBER
1941 ,x_MAX_CAPACITY NUMBER
1942 ,x_OPTIMUM_CAPACITY NUMBER
1943 ,x_GROSS_AREA NUMBER
1944 ,x_RENTABLE_AREA NUMBER
1945 ,x_USABLE_AREA NUMBER
1946 ,x_ASSIGNABLE_AREA NUMBER
1947 ,x_COMMON_AREA NUMBER
1948 ,x_SUITE VARCHAR2
1949 ,x_ALLOCATE_COST_CENTER_CODE VARCHAR2
1950 ,x_UOM_CODE VARCHAR2
1951 ,x_DESCRIPTION VARCHAR2
1952 ,x_PARENT_LOCATION_ID NUMBER
1953 ,x_INTERFACE_FLAG VARCHAR2
1954 ,x_STATUS VARCHAR2
1955 ,x_PROPERTY_ID NUMBER
1956 ,x_ATTRIBUTE_CATEGORY VARCHAR2
1957 ,x_ATTRIBUTE1 VARCHAR2
1958 ,x_ATTRIBUTE2 VARCHAR2
1959 ,x_ATTRIBUTE3 VARCHAR2
1960 ,x_ATTRIBUTE4 VARCHAR2
1961 ,x_ATTRIBUTE5 VARCHAR2
1962 ,x_ATTRIBUTE6 VARCHAR2
1963 ,x_ATTRIBUTE7 VARCHAR2
1964 ,x_ATTRIBUTE8 VARCHAR2
1965 ,x_ATTRIBUTE9 VARCHAR2
1966 ,x_ATTRIBUTE10 VARCHAR2
1967 ,x_ATTRIBUTE11 VARCHAR2
1968 ,x_ATTRIBUTE12 VARCHAR2
1969 ,x_ATTRIBUTE13 VARCHAR2
1970 ,x_ATTRIBUTE14 VARCHAR2
1971 ,x_ATTRIBUTE15 VARCHAR2
1972 ,x_address_line1 VARCHAR2
1973 ,x_address_line2 VARCHAR2
1974 ,x_address_line3 VARCHAR2
1975 ,x_address_line4 VARCHAR2
1976 ,x_county VARCHAR2
1977 ,x_city VARCHAR2
1978 ,x_state VARCHAR2
1979 ,x_province VARCHAR2
1980 ,x_zip_code VARCHAR2
1981 ,x_country VARCHAR2
1982 ,x_territory_id NUMBER
1983 ,x_addr_attribute_category VARCHAR2
1984 ,x_addr_attribute1 VARCHAR2
1985 ,x_addr_attribute2 VARCHAR2
1986 ,x_addr_attribute3 VARCHAR2
1987 ,x_addr_attribute4 VARCHAR2
1988 ,x_addr_attribute5 VARCHAR2
1989 ,x_addr_attribute6 VARCHAR2
1990 ,x_addr_attribute7 VARCHAR2
1991 ,x_addr_attribute8 VARCHAR2
1992 ,x_addr_attribute9 VARCHAR2
1993 ,x_addr_attribute10 VARCHAR2
1994 ,x_addr_attribute11 VARCHAR2
1995 ,x_addr_attribute12 VARCHAR2
1996 ,x_addr_attribute13 VARCHAR2
1997 ,x_addr_attribute14 VARCHAR2
1998 ,x_addr_attribute15 VARCHAR2
1999 ,x_common_area_flag VARCHAR2
2000 ,x_active_start_date DATE
2001 ,x_active_end_date DATE
2002 ,x_active_start_date_old DATE
2003 ,x_active_end_date_old DATE
2004 ,x_bookable_flag VARCHAR2
2005 ,x_occupancy_status_code VARCHAR2
2006 ,x_assignable_emp VARCHAR2
2007 ,x_assignable_cc VARCHAR2
2008 ,x_assignable_cust VARCHAR2
2009 ,x_disposition_code VARCHAR2
2010 ,x_acc_treatment_code VARCHAR2
2011 )
2012 IS
2013
2014 l_return_status varchar2(30);
2015 l_return_message varchar2(2000);
2016
2017
2018 CURSOR c IS
2019 SELECT *
2020 FROM pn_locations_all
2021 WHERE location_id = x_location_id
2022 AND active_start_date = NVL(x_active_start_date_old, g_start_of_time)
2023 AND active_end_date = NVL(x_active_end_date_old, g_end_of_time)
2024 FOR UPDATE OF location_id NOWAIT;
2025
2026 BEGIN
2027 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.lock_row (+)');
2028
2029 pnp_debug_pkg.debug(' LockRow=> In Parameters :: LocId: '||x_location_id
2030 ||', Type: '||x_location_type_lookup_code);
2031 pnp_debug_pkg.debug(' LockRow=> ActStrDate : '||TO_CHAR(x_active_start_date, 'MM/DD/YYYY')
2032 ||', ActEndDate : '||TO_CHAR(x_active_end_date, 'MM/DD/YYYY'));
2033 pnp_debug_pkg.debug(' LockRow=> ActStrDateOld: '||TO_CHAR(x_active_start_date_old, 'MM/DD/YYYY')
2034 ||', ActEndDateOld: '||TO_CHAR(x_active_end_date_old, 'MM/DD/YYYY'));
2035
2036 OPEN C;
2037 FETCH C INTO G_LOC_RECINFO;
2038 IF (C%NOTFOUND) THEN
2039 CLOSE C;
2040 FND_MESSAGE.Set_Name('FND', 'FORM_RECORD_DELETED');
2041 APP_EXCEPTION.Raise_Exception;
2042 ELSE
2043 PNT_LOCATIONS_PKG.SET_ROWID(
2044 p_location_id => x_location_id,
2045 p_active_start_date => x_active_start_date_old,
2046 p_active_end_date => x_active_end_date_old,
2047 x_return_status => l_return_status,
2048 x_return_message => l_return_message);
2049 END IF;
2050 CLOSE C;
2051
2052 IF NOT ((G_LOC_RECINFO.ATTRIBUTE_CATEGORY = X_ATTRIBUTE_CATEGORY)
2053 OR ((G_LOC_RECINFO.ATTRIBUTE_CATEGORY is null) AND (X_ATTRIBUTE_CATEGORY is null))) THEN
2054 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE_CATEGORY',G_LOC_RECINFO.ATTRIBUTE_CATEGORY);
2055 END IF;
2056
2057 IF NOT ((G_LOC_RECINFO.ATTRIBUTE1 = X_ATTRIBUTE1)
2058 OR ((G_LOC_RECINFO.ATTRIBUTE1 is null) AND (X_ATTRIBUTE1 is null))) THEN
2059 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE1', G_LOC_RECINFO.attribute1);
2060 END IF;
2061
2062 IF NOT ((G_LOC_RECINFO.ATTRIBUTE2 = X_ATTRIBUTE2)
2063 OR ((G_LOC_RECINFO.ATTRIBUTE2 is null) AND (X_ATTRIBUTE2 is null))) THEN
2064 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE2', G_LOC_RECINFO.attribute2);
2065 END IF;
2066
2067 IF NOT ((G_LOC_RECINFO.ATTRIBUTE3 = X_ATTRIBUTE3)
2068 OR ((G_LOC_RECINFO.ATTRIBUTE3 is null) AND (X_ATTRIBUTE3 is null))) THEN
2069 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE3', G_LOC_RECINFO.attribute3);
2070 END IF;
2071
2072 IF NOT ((G_LOC_RECINFO.ATTRIBUTE4 = X_ATTRIBUTE4)
2073 OR ((G_LOC_RECINFO.ATTRIBUTE4 is null) AND (X_ATTRIBUTE4 is null))) THEN
2074 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE4', G_LOC_RECINFO.attribute4);
2075 END IF;
2076
2077 IF NOT ((G_LOC_RECINFO.ATTRIBUTE5 = X_ATTRIBUTE5)
2078 OR ((G_LOC_RECINFO.ATTRIBUTE5 is null) AND (X_ATTRIBUTE5 is null))) THEN
2079 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE5', G_LOC_RECINFO.attribute5);
2080 END IF;
2081
2082 IF NOT ((G_LOC_RECINFO.ATTRIBUTE6 = X_ATTRIBUTE6)
2083 OR ((G_LOC_RECINFO.ATTRIBUTE6 is null) AND (X_ATTRIBUTE6 is null))) THEN
2084 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE6', G_LOC_RECINFO.attribute6);
2085 END IF;
2086
2087 IF NOT ((G_LOC_RECINFO.ATTRIBUTE7 = X_ATTRIBUTE7)
2088 OR ((G_LOC_RECINFO.ATTRIBUTE7 is null) AND (X_ATTRIBUTE7 is null))) THEN
2089 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE7', G_LOC_RECINFO.attribute7);
2090 END IF;
2091
2092 IF NOT ((G_LOC_RECINFO.ATTRIBUTE8 = X_ATTRIBUTE8)
2093 OR ((G_LOC_RECINFO.ATTRIBUTE8 is null) AND (X_ATTRIBUTE8 is null))) THEN
2094 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE8', G_LOC_RECINFO.attribute8);
2095 END IF;
2096
2097 IF NOT ((G_LOC_RECINFO.ATTRIBUTE9 = X_ATTRIBUTE9)
2098 OR ((G_LOC_RECINFO.ATTRIBUTE9 is null) AND (X_ATTRIBUTE9 is null))) THEN
2099 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE9', G_LOC_RECINFO.attribute9);
2100 END IF;
2101
2102 IF NOT ((G_LOC_RECINFO.ATTRIBUTE10 = X_ATTRIBUTE10)
2103 OR ((G_LOC_RECINFO.ATTRIBUTE10 is null) AND (X_ATTRIBUTE10 is null))) THEN
2104 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE10', G_LOC_RECINFO.attribute10);
2105 END IF;
2106
2107 IF NOT ((G_LOC_RECINFO.ATTRIBUTE11 = X_ATTRIBUTE11)
2108 OR ((G_LOC_RECINFO.ATTRIBUTE11 is null) AND (X_ATTRIBUTE11 is null))) THEN
2109 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE11', G_LOC_RECINFO.attribute11);
2110 END IF;
2111
2112 IF NOT ((G_LOC_RECINFO.ATTRIBUTE12 = X_ATTRIBUTE12)
2113 OR ((G_LOC_RECINFO.ATTRIBUTE12 is null) AND (X_ATTRIBUTE12 is null))) THEN
2114 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE12', G_LOC_RECINFO.attribute12);
2115 END IF;
2116
2117 IF NOT ((G_LOC_RECINFO.ATTRIBUTE13 = X_ATTRIBUTE13)
2118 OR ((G_LOC_RECINFO.ATTRIBUTE13 is null) AND (X_ATTRIBUTE13 is null))) THEN
2119 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE13', G_LOC_RECINFO.attribute13);
2120 END IF;
2121
2122 IF NOT ((G_LOC_RECINFO.ATTRIBUTE14 = X_ATTRIBUTE14)
2123 OR ((G_LOC_RECINFO.ATTRIBUTE14 is null) AND (X_ATTRIBUTE14 is null))) THEN
2124 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE14', G_LOC_RECINFO.attribute14);
2125 END IF;
2126
2127 IF NOT ((G_LOC_RECINFO.ATTRIBUTE15 = X_ATTRIBUTE15)
2128 OR ((G_LOC_RECINFO.ATTRIBUTE15 is null) AND (X_ATTRIBUTE15 is null))) THEN
2129 pn_var_rent_pkg.lock_row_exception('ATTRIBUTE15', G_LOC_RECINFO.attribute15);
2130 END IF;
2131
2132 IF NOT ((G_LOC_RECINFO.COMMON_AREA_FLAG = X_COMMON_AREA_FLAG)
2133 OR ((G_LOC_RECINFO.COMMON_AREA_FLAG is null) AND (X_COMMON_AREA_FLAG is null))) THEN
2134 pn_var_rent_pkg.lock_row_exception('COMMON_AREA_FLAG',G_LOC_RECINFO.COMMON_AREA_FLAG);
2135 END IF;
2136
2137 IF NOT (G_LOC_RECINFO.LOCATION_TYPE_LOOKUP_CODE = X_LOCATION_TYPE_LOOKUP_CODE) THEN
2138 pn_var_rent_pkg.lock_row_exception('LOCATION_TYPE_LOOKUP_CODE',G_LOC_RECINFO.LOCATION_TYPE_LOOKUP_CODE);
2139 END IF;
2140
2141 IF NOT ((G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE = X_FUNCTION_TYPE_LOOKUP_CODE)
2142 OR ((G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE is null) AND (X_FUNCTION_TYPE_LOOKUP_CODE is null))) THEN
2143 pn_var_rent_pkg.lock_row_exception('FUNCTION_TYPE_LOOKUP_CODE',G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE);
2144 END IF;
2145
2146
2147 IF NOT ((G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE = X_SPACE_TYPE_LOOKUP_CODE)
2148 OR ((G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE is null) AND (X_SPACE_TYPE_LOOKUP_CODE is null))) THEN
2149 pn_var_rent_pkg.lock_row_exception('SPACE_TYPE_LOOKUP_CODE',G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE);
2150 END IF;
2151
2152
2153 IF NOT ((G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE = X_STANDARD_TYPE_LOOKUP_CODE)
2154 OR ((G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE is null) AND (X_STANDARD_TYPE_LOOKUP_CODE is null))) THEN
2155 pn_var_rent_pkg.lock_row_exception('STANDARD_TYPE_LOOKUP_CODE',G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE);
2156 END IF;
2157
2158 IF NOT (G_LOC_RECINFO.LOCATION_CODE = X_LOCATION_CODE) THEN
2159 pn_var_rent_pkg.lock_row_exception('LOCATION_CODE',G_LOC_RECINFO.LOCATION_CODE);
2160 END IF;
2161
2162 IF NOT ((G_LOC_RECINFO.BUILDING = X_BUILDING)
2163 OR ((G_LOC_RECINFO.BUILDING is null) AND (X_BUILDING is null))) THEN
2164 pn_var_rent_pkg.lock_row_exception('BUILDING',G_LOC_RECINFO.BUILDING);
2165 END IF;
2166
2167 IF NOT ((G_LOC_RECINFO.FLOOR = X_FLOOR)
2168 OR ((G_LOC_RECINFO.FLOOR is null) AND (X_FLOOR is null))) THEN
2169 pn_var_rent_pkg.lock_row_exception('FLOOR',G_LOC_RECINFO.FLOOR);
2170 END IF;
2171
2172 IF NOT ((G_LOC_RECINFO.LOCATION_ALIAS = X_LOCATION_ALIAS)
2173 OR ((G_LOC_RECINFO.LOCATION_ALIAS is null) AND (X_LOCATION_ALIAS is null))) THEN
2174 pn_var_rent_pkg.lock_row_exception('LOCATION_ALIAS',G_LOC_RECINFO.LOCATION_ALIAS);
2175 END IF;
2176
2177 IF NOT ((G_LOC_RECINFO.PROPERTY_ID = X_PROPERTY_ID)
2178 OR ((G_LOC_RECINFO.PROPERTY_ID is null) AND (X_PROPERTY_ID is null))) THEN
2179 pn_var_rent_pkg.lock_row_exception('PROPERTY_ID',G_LOC_RECINFO.PROPERTY_ID);
2180 END IF;
2181
2182 IF NOT ((G_LOC_RECINFO.PARENT_LOCATION_ID = X_PARENT_LOCATION_ID)
2183 OR ((G_LOC_RECINFO.PARENT_LOCATION_ID is null) AND (X_PARENT_LOCATION_ID is null))) THEN
2184 pn_var_rent_pkg.lock_row_exception('PARENT_LOCATION_ID',G_LOC_RECINFO.PARENT_LOCATION_ID);
2185 END IF;
2186
2187 IF NOT ((G_LOC_RECINFO.INTERFACE_FLAG = X_INTERFACE_FLAG)
2188 OR ((G_LOC_RECINFO.INTERFACE_FLAG is null) AND (X_INTERFACE_FLAG is null))) THEN
2189 pn_var_rent_pkg.lock_row_exception('INTERFACE_FLAG',G_LOC_RECINFO.INTERFACE_FLAG);
2190 END IF;
2191
2192 IF NOT ((G_LOC_RECINFO.STATUS = X_STATUS)
2193 OR ((G_LOC_RECINFO.STATUS is null) AND (X_STATUS is null))) THEN
2194 pn_var_rent_pkg.lock_row_exception('STATUS',G_LOC_RECINFO.STATUS);
2195 END IF;
2196
2197
2198 IF NOT ((G_LOC_RECINFO.ACTIVE_START_DATE = x_ACTIVE_START_DATE)
2199 OR ((G_LOC_RECINFO.ACTIVE_START_DATE is null) AND (x_ACTIVE_START_DATE is null))) THEN
2200 pn_var_rent_pkg.lock_row_exception('ACTIVE_START_DATE',G_LOC_RECINFO.ACTIVE_START_DATE);
2201 END IF;
2202
2203 IF NOT ((G_LOC_RECINFO.ACTIVE_END_DATE = x_ACTIVE_END_DATE)
2204 OR ((G_LOC_RECINFO.ACTIVE_END_DATE is null) AND (x_ACTIVE_END_DATE is null))) THEN
2205 pn_var_rent_pkg.lock_row_exception('ACTIVE_END_DATE',G_LOC_RECINFO.ACTIVE_END_DATE);
2206 END IF;
2207
2208 -- DO SPECIAL CHECKS FOR PARTICULAR KINDS
2209
2210 IF (NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('BUILDING','LAND')) THEN
2211 IF NOT ((G_LOC_RECINFO.LOCATION_PARK_ID = X_LOCATION_PARK_ID)
2212 OR ((G_LOC_RECINFO.LOCATION_PARK_ID is null) AND (X_LOCATION_PARK_ID is null))) THEN
2213 pn_var_rent_pkg.lock_row_exception('LOCATION_PARK_ID',G_LOC_RECINFO.LOCATION_PARK_ID);
2214 END IF;
2215
2216 IF NOT ((G_LOC_RECINFO.LEASE_OR_OWNED = X_LEASE_OR_OWNED)
2217 OR ((G_LOC_RECINFO.LEASE_OR_OWNED is null) AND (X_LEASE_OR_OWNED is null))) THEN
2218 pn_var_rent_pkg.lock_row_exception('LEASE_OR_OWNED',G_LOC_RECINFO.LEASE_OR_OWNED);
2219 END IF;
2220
2221 IF NOT ((G_LOC_RECINFO.CLASS = X_CLASS)
2222 OR ((G_LOC_RECINFO.CLASS is null) AND (X_CLASS is null))) THEN
2223 pn_var_rent_pkg.lock_row_exception('CLASS',G_LOC_RECINFO.CLASS);
2224 END IF;
2225
2226 IF NOT ((G_LOC_RECINFO.STATUS_TYPE = X_STATUS_TYPE)
2227 OR ((G_LOC_RECINFO.STATUS_TYPE is null) AND (X_STATUS_TYPE is null))) THEN
2228 pn_var_rent_pkg.lock_row_exception('STATUS_TYPE',G_LOC_RECINFO.STATUS_TYPE);
2229 END IF;
2230
2231 IF NOT ((G_LOC_RECINFO.OFFICE = X_OFFICE)
2232 OR ((G_LOC_RECINFO.OFFICE is null) AND (X_OFFICE is null))) THEN
2233 pn_var_rent_pkg.lock_row_exception('OFFICE',G_LOC_RECINFO.OFFICE);
2234 END IF;
2235
2236 IF NOT ((G_LOC_RECINFO.ADDRESS_ID = X_ADDRESS_ID)
2237 OR ((G_LOC_RECINFO.ADDRESS_ID is null) AND (X_ADDRESS_ID is null))) THEN
2238 pn_var_rent_pkg.lock_row_exception('ADDRESS_ID',G_LOC_RECINFO.ADDRESS_ID);
2239 END IF;
2240
2241 IF NOT ((G_LOC_RECINFO.GROSS_AREA = X_GROSS_AREA)
2242 OR ((G_LOC_RECINFO.GROSS_AREA is null) AND (X_GROSS_AREA is null))) THEN
2243 pn_var_rent_pkg.lock_row_exception('GROSS_AREA',G_LOC_RECINFO.GROSS_AREA);
2244 END IF;
2245
2246 IF NOT ((G_LOC_RECINFO.SUITE = X_SUITE)
2247 OR ((G_LOC_RECINFO.SUITE is null) AND (X_SUITE is null))) THEN
2248 pn_var_rent_pkg.lock_row_exception('SUITE',G_LOC_RECINFO.SUITE);
2249 END IF;
2250
2251 IF NOT ((G_LOC_RECINFO.ALLOCATE_COST_CENTER_CODE = X_ALLOCATE_COST_CENTER_CODE)
2252 OR ((G_LOC_RECINFO.ALLOCATE_COST_CENTER_CODE is null) AND (X_ALLOCATE_COST_CENTER_CODE is null))) THEN
2253 pn_var_rent_pkg.lock_row_exception('ALLOCATE_COST_CENTER_CODE',G_LOC_RECINFO.ALLOCATE_COST_CENTER_CODE);
2254 END IF;
2255
2256 IF NOT ((G_LOC_RECINFO.UOM_CODE = X_UOM_CODE)
2257 OR ((G_LOC_RECINFO.UOM_CODE is null) AND (X_UOM_CODE is null))) THEN
2258 pn_var_rent_pkg.lock_row_exception('UOM_CODE',G_LOC_RECINFO.UOM_CODE);
2259 END IF;
2260
2261 IF NOT ((G_LOC_RECINFO.DESCRIPTION = X_DESCRIPTION)
2262 OR ((G_LOC_RECINFO.DESCRIPTION is null) AND (X_DESCRIPTION is null))) THEN
2263 pn_var_rent_pkg.lock_row_exception('DESCRIPTION',G_LOC_RECINFO.DESCRIPTION);
2264 END IF;
2265
2266 ELSIF (NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('OFFICE','SECTION')) THEN
2267
2268 IF NOT ((G_LOC_RECINFO.OFFICE = X_OFFICE)
2269 OR ((G_LOC_RECINFO.OFFICE is null) AND (X_OFFICE is null))) THEN
2270 pn_var_rent_pkg.lock_row_exception('OFFICE',G_LOC_RECINFO.OFFICE);
2271 END IF;
2272
2273 IF NOT ((G_LOC_RECINFO.MAX_CAPACITY = X_MAX_CAPACITY)
2274 OR ((G_LOC_RECINFO.MAX_CAPACITY is null) AND (X_MAX_CAPACITY is null))) THEN
2275 pn_var_rent_pkg.lock_row_exception('MAX_CAPACITY',G_LOC_RECINFO.MAX_CAPACITY);
2276 END IF;
2277
2278 IF NOT ((G_LOC_RECINFO.OPTIMUM_CAPACITY = X_OPTIMUM_CAPACITY)
2279 OR ((G_LOC_RECINFO.OPTIMUM_CAPACITY is null) AND (X_OPTIMUM_CAPACITY is null))) THEN
2280 pn_var_rent_pkg.lock_row_exception('OPTIMUM_CAPACITY',G_LOC_RECINFO.OPTIMUM_CAPACITY);
2281 END IF;
2282
2283 IF NOT ((G_LOC_RECINFO.RENTABLE_AREA = X_RENTABLE_AREA)
2284 OR ((G_LOC_RECINFO.RENTABLE_AREA is null) AND (X_RENTABLE_AREA is null))) THEN
2285 pn_var_rent_pkg.lock_row_exception('RENTABLE_AREA',G_LOC_RECINFO.RENTABLE_AREA);
2286 END IF;
2287
2288 IF NOT ((G_LOC_RECINFO.USABLE_AREA = X_USABLE_AREA)
2289 OR ((G_LOC_RECINFO.USABLE_AREA is null) AND (X_USABLE_AREA is null))) THEN
2290 pn_var_rent_pkg.lock_row_exception('USABLE_AREA',G_LOC_RECINFO.USABLE_AREA);
2291 END IF;
2292
2293 IF NOT ((G_LOC_RECINFO.ASSIGNABLE_AREA = X_ASSIGNABLE_AREA)
2294 OR ((G_LOC_RECINFO.ASSIGNABLE_AREA is null) AND (X_ASSIGNABLE_AREA is null))) THEN
2295 pn_var_rent_pkg.lock_row_exception('ASSIGNABLE_AREA',G_LOC_RECINFO.ASSIGNABLE_AREA);
2296 END IF;
2297
2298 IF NOT ((G_LOC_RECINFO.COMMON_AREA = X_COMMON_AREA)
2299 OR ((G_LOC_RECINFO.COMMON_AREA is null) AND (X_COMMON_AREA is null))) THEN
2300 pn_var_rent_pkg.lock_row_exception('COMMON_AREA',G_LOC_RECINFO.COMMON_AREA);
2301 END IF;
2302
2303 IF NOT ((G_LOC_RECINFO.SUITE = X_SUITE)
2304 OR ((G_LOC_RECINFO.SUITE is null) AND (X_SUITE is null))) THEN
2305 pn_var_rent_pkg.lock_row_exception('SUITE',G_LOC_RECINFO.SUITE);
2306 END IF;
2307
2308 IF NOT ((G_LOC_RECINFO.BOOKABLE_FLAG = X_BOOKABLE_FLAG)
2309 OR ((G_LOC_RECINFO.BOOKABLE_FLAG is null) AND (X_BOOKABLE_FLAG is null))) THEN
2310 pn_var_rent_pkg.lock_row_exception('BOOKABLE_FLAG', G_LOC_RECINFO.BOOKABLE_FLAG);
2311 END IF;
2312
2313 IF NOT ((g_loc_recinfo.occupancy_status_code = x_occupancy_status_code)
2314 OR ((g_loc_recinfo.occupancy_status_code IS NULL) AND (x_occupancy_status_code IS NULL))) THEN
2315 pn_var_rent_pkg.lock_row_exception('OCCUPANCY_STATUS_CODE', g_loc_recinfo.occupancy_status_code);
2316 END IF;
2317
2318 IF NOT ((g_loc_recinfo.assignable_emp = x_assignable_emp)
2319 OR ((g_loc_recinfo.assignable_emp IS NULL) AND (x_assignable_emp IS NULL))) THEN
2320 pn_var_rent_pkg.lock_row_exception('ASSIGNABLE_EMP', g_loc_recinfo.assignable_emp);
2321 END IF;
2322
2323 IF NOT ((g_loc_recinfo.assignable_cc = x_assignable_cc)
2324 OR ((g_loc_recinfo.assignable_cc IS NULL) AND (x_assignable_cc IS NULL))) THEN
2325 pn_var_rent_pkg.lock_row_exception('ASSIGNABLE_CC', g_loc_recinfo.assignable_cc);
2326 END IF;
2327
2328 IF NOT ((g_loc_recinfo.assignable_cust = x_assignable_cust)
2329 OR ((g_loc_recinfo.assignable_cust IS NULL) AND (x_assignable_cust IS NULL))) THEN
2330 pn_var_rent_pkg.lock_row_exception('ASSIGNABLE_CUST', g_loc_recinfo.assignable_cust);
2331 END IF;
2332
2333 IF NOT ((g_loc_recinfo.disposition_code = x_disposition_code)
2334 OR ((g_loc_recinfo.disposition_code IS NULL) AND (x_disposition_code IS NULL))) THEN
2335 pn_var_rent_pkg.lock_row_exception('DISPOSITION_CODE', g_loc_recinfo.disposition_code);
2336 END IF;
2337
2338 IF NOT ((g_loc_recinfo.acc_treatment_code = x_acc_treatment_code)
2339 OR ((g_loc_recinfo.acc_treatment_code IS NULL) AND (x_acc_treatment_code IS NULL))) THEN
2340 pn_var_rent_pkg.lock_row_exception('ACC_TREATMENT_CODE', g_loc_recinfo.acc_treatment_code);
2341 END IF;
2342
2343 END IF;
2344
2345 -- NO SPECIAL CHECKS FOR TYPE 'LAND' AND 'PARCEL'
2346
2347 -----------------------------------------------------------------
2348 -- Call the PN_ADDRESSES lock table handler to lock the address
2349 -- row for update. This will only be called when we lock the
2350 -- building record.
2351 -----------------------------------------------------------------
2352 IF (NVL(x_LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('BUILDING','LAND')) THEN
2353 PNT_ADDR_PKG.LOCK_ROW(
2354 x_address_id,
2355 x_address_line1,
2356 x_address_line2,
2357 x_address_line3,
2358 x_address_line4,
2359 x_county,
2360 x_city,
2361 x_state,
2362 x_province,
2363 x_zip_code,
2364 x_country,
2365 x_territory_id,
2366 null,
2367 null,
2368 null,
2369 null,
2370 null,
2371 null,
2372 null,
2373 null,
2374 null,
2375 null,
2376 null,
2377 null,
2378 null,
2379 null,
2380 null,
2381 null,
2382 x_addr_attribute_category,
2383 x_addr_attribute1,
2384 x_addr_attribute2,
2385 x_addr_attribute3,
2386 x_addr_attribute4,
2387 x_addr_attribute5,
2388 x_addr_attribute6,
2389 x_addr_attribute7,
2390 x_addr_attribute8,
2391 x_addr_attribute9,
2392 x_addr_attribute10,
2393 x_addr_attribute11,
2394 x_addr_attribute12,
2395 x_addr_attribute13,
2396 x_addr_attribute14,
2397 x_addr_attribute15
2398 );
2399
2400 END IF;
2401
2402 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.lock_row (-)');
2403
2404 END lock_row;
2405
2406 -------------------------------------------------------------------------------
2407 -- PROCEDURE : update_child_for_dates
2408 -- PURPOSE : This procedure updates or deletes children locations during
2409 -- bring in process.
2410 -- IN PARAMS : Location Id, Active Start Date, Active End Date,
2411 -- Active Start Date Old, Active End Date Old, Location Type
2412 -- Lookup Code.
2413 -- HISTORY :
2414 --
2415 -- 11-NOV-02 Ganesh o Created.
2416 -- 18-FEB-03 MMisra o Added p_location_type_lookup_code new IN parameter.
2417 -- Changed the procedure to check for tenancy defined
2418 -- at lease.
2419 -- 13-JUL-05 hrodda o Bug 4284035 - Replaced pn_space_assign_emp,
2420 -- pn_space_assign_cust with _ALL table.
2421 -------------------------------------------------------------------------------
2422 PROCEDURE Update_Child_for_Dates (
2423 p_location_id IN NUMBER
2424 ,p_active_start_date IN DATE
2425 ,p_active_end_date IN DATE
2426 ,p_active_start_date_old IN DATE
2427 ,p_active_end_date_old IN DATE
2428 ,p_location_type_lookup_code IN VARCHAR2
2429 ,x_return_status OUT NOCOPY VARCHAR2
2430 ,x_return_message OUT NOCOPY VARCHAR2
2431 )
2432 IS
2433
2434 CURSOR check_tenancy IS
2435 SELECT 'Y'
2436 FROM pn_tenancies_all pt
2437 WHERE location_id IN (SELECT location_id
2438 FROM pn_locations_all
2439 WHERE active_start_date > p_active_end_date
2440 START WITH location_id = p_location_id
2441 CONNECT BY PRIOR location_id = parent_location_id)
2442 AND NOT EXISTS (SELECT '1'
2443 FROM pn_locations_all pl1
2444 where pl1.location_id = pt.location_id
2445 AND active_start_date <= p_active_end_date)
2446 AND ROWNUM < 2;
2447
2448 CURSOR check_start_tenancy IS
2449 SELECT 'Y'
2450 FROM pn_tenancies_all pt
2451 WHERE location_id IN (SELECT location_id
2452 FROM pn_locations_all
2453 WHERE active_end_date < p_active_start_date
2454 START WITH location_id = p_location_id
2455 CONNECT BY PRIOR location_id = parent_location_id)
2456 AND NOT EXISTS (SELECT '1'
2457 FROM pn_locations_all pl1
2458 WHERE pl1.location_id = pt.location_id
2459 AND active_end_date >= p_active_start_date)
2460 AND ROWNUM < 2;
2461
2462 l_exists VARCHAR2(1) := 'N';
2463
2464 BEGIN
2465
2466 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_child_for_dates (+)');
2467 pnp_debug_pkg.debug(' UpdChiDt=> In Parameters :: p_location_id: '||p_location_id);
2468 pnp_debug_pkg.debug(' UpdChiDt=> p_active_start_date : '||TO_CHAR(p_active_start_date, 'MM/DD/YYYY')
2469 ||', p_active_end_date : '||TO_CHAR(p_active_end_date, 'MM/DD/YYYY'));
2470 pnp_debug_pkg.debug(' UpdChiDt=> p_active_start_date_old: '||TO_CHAR(p_active_start_date_old, 'MM/DD/YYYY')
2471 ||', p_active_end_date_old: '||TO_CHAR(p_active_end_date_old, 'MM/DD/YYYY'));
2472
2473 IF p_active_end_date < p_active_end_date_old AND
2474 p_location_type_lookup_code NOT IN ('OFFICE','SECTION')THEN
2475
2476 l_exists := 'N';
2477
2478 OPEN check_tenancy;
2479 FETCH check_tenancy into l_exists;
2480 CLOSE check_tenancy;
2481
2482 IF l_exists = 'Y' THEN
2483 fnd_message.set_name ('PN','PN_LOCTN_TENANCY_CHK_MSG');
2484 x_return_status := 'E';
2485 RETURN;
2486 END IF;
2487
2488 DELETE FROM pn_locations_all
2489 WHERE (location_id, active_start_date,active_end_date) IN
2490 (SELECT location_id, active_start_date,active_end_date
2491 FROM pn_locations_all pl
2492 WHERE active_start_date > p_active_end_date
2493 AND NOT EXISTS (SELECT '1'
2494 FROM pn_space_assign_emp_all
2495 WHERE location_id = pl.location_id
2496 AND p_active_end_date BETWEEN emp_assign_start_date
2497 AND emp_assign_end_date)
2498 AND NOT EXISTS (SELECT '1'
2499 FROM pn_space_assign_cust_all
2500 WHERE location_id = pl.location_id
2501 AND p_active_end_date BETWEEN cust_assign_start_date
2502 AND cust_assign_end_date)
2503 START WITH location_id = p_location_id
2504 CONNECT BY PRIOR location_id = parent_location_id);
2505
2506
2507 UPDATE pn_locations_all
2508 SET active_end_date = p_active_end_date
2509 WHERE active_start_date <= p_active_end_date
2510 AND active_end_date > p_active_end_date
2511 AND location_id IN (SELECT location_id
2512 FROM pn_locations_all
2513 START WITH location_id = p_location_id
2514 CONNECT BY PRIOR location_id = parent_location_id);
2515
2516 END IF;
2517
2518 IF p_active_start_date > p_active_start_date_old AND
2519 p_location_type_lookup_code NOT IN ('OFFICE','SECTION')THEN
2520
2521 l_exists := 'N';
2522
2523 OPEN check_start_tenancy;
2524 FETCH check_start_tenancy into l_exists;
2525 CLOSE check_start_tenancy;
2526
2527 IF l_exists = 'Y' THEN
2528 fnd_message.set_name ('PN','PN_LOCTN_TENANCY_CHK_MSG');
2529 x_return_status := 'E';
2530 RETURN;
2531 END IF;
2532
2533 DELETE FROM pn_locations_all
2534 WHERE (location_id, active_start_date,active_end_date) IN
2535 (SELECT location_id, active_start_date,active_end_date
2536 FROM pn_locations_all pl
2537 WHERE active_end_date < p_active_start_date
2538 AND NOT EXISTS (SELECT '1'
2539 FROM pn_space_assign_emp_all
2540 WHERE location_id = pl.location_id
2541 AND p_active_start_date BETWEEN emp_assign_start_date
2542 AND emp_assign_end_date)
2543 AND NOT EXISTS (SELECT '1'
2544 FROM pn_space_assign_cust_all
2545 WHERE location_id = pl.location_id
2546 AND p_active_start_date BETWEEN cust_assign_start_date
2547 AND cust_assign_end_date)
2548 START WITH location_id = p_location_id
2549 CONNECT BY PRIOR location_id = parent_location_id);
2550
2551 UPDATE pn_locations_all
2552 SET active_start_date = p_active_start_date
2553 WHERE active_start_date < p_active_start_date
2554 AND active_end_date >= p_active_start_date
2555 AND location_id IN (SELECT location_id
2556 FROM pn_locations_all
2557 START WITH location_id = p_location_id
2558 CONNECT BY PRIOR location_id = parent_location_id);
2559
2560 END IF;
2561
2562 x_return_status := FND_API.G_RET_STS_SUCCESS;
2563 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_child_for_dates (-) ReturnStatus: '||x_return_status);
2564
2565 EXCEPTION
2566 WHEN OTHERS THEN
2567 x_return_status := FND_API.G_RET_STS_ERROR;
2568 fnd_message.set_name ('PN','PN_OTHERS_EXCEPTION');
2569 fnd_message.set_token('ERR_MSG',sqlerrm);
2570
2571 END update_child_for_dates;
2572
2573 -------------------------------------------------------------------------------
2574 -- check_for_popup : This procedure compares the form field values
2575 -- with the locked row and returns 'Y', if the value has changed
2576 -- HISTORY:
2577 -- 14-OCT-03 Anand o Added code to consider the new column bookable_flag.
2578 -- 01-DEC-2004 Satish Tripathi o Modified for Portfolio Status Enh BUG# 4030816.
2579 -- Added code to condider columns occupancy_status_code, assignable_emp,
2580 -- assignable_cc, assignable_cust.
2581 -------------------------------------------------------------------------------
2582 PROCEDURE check_for_popup (p_pn_locations_rec pn_locations_all%rowtype,
2583 p_start_date_old IN DATE,
2584 p_end_date_old IN DATE,
2585 x_flag OUT NOCOPY VARCHAR2,
2586 x_return_status OUT NOCOPY VARCHAR2,
2587 x_return_message OUT NOCOPY VARCHAR2) IS
2588
2589 BEGIN
2590
2591 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_for_popup (+) LocId: '||p_pn_locations_rec.location_id
2592 ||', LocCd: '||p_pn_locations_rec.location_code
2593 ||', Type: '||p_pn_locations_rec.location_type_lookup_code);
2594 x_flag := 'N';
2595
2596 -- Compare the form field values in p_pn_locations_rec with
2597 -- the row locked by the lock_row procedure
2598 -- and return 'Y' if the values are different
2599
2600 IF ((G_LOC_RECINFO.ATTRIBUTE_CATEGORY <> p_pn_locations_rec.attribute_category)
2601 OR ((G_LOC_RECINFO.ATTRIBUTE_CATEGORY is NULL) AND (p_pn_locations_rec.attribute_category is NOT NULL))
2602 OR ((G_LOC_RECINFO.ATTRIBUTE_CATEGORY is NOT NULL) AND (p_pn_locations_rec.attribute_category is NULL))) THEN
2603 x_flag := 'Y';
2604 return;
2605 END IF;
2606
2607 IF ((G_LOC_RECINFO.ATTRIBUTE1 <> p_pn_locations_rec.attribute1)
2608 OR ((G_LOC_RECINFO.ATTRIBUTE1 is NULL) AND (p_pn_locations_rec.attribute1 is NOT NULL))
2609 OR ((G_LOC_RECINFO.ATTRIBUTE1 is NOT NULL) AND (p_pn_locations_rec.attribute1 is NULL))) THEN
2610 x_flag := 'Y';
2611 return;
2612 END IF;
2613
2614 IF ((G_LOC_RECINFO.ATTRIBUTE2 <> p_pn_locations_rec.attribute2)
2615 OR ((G_LOC_RECINFO.ATTRIBUTE2 is NULL) AND (p_pn_locations_rec.attribute2 is NOT NULL))
2616 OR ((G_LOC_RECINFO.ATTRIBUTE2 is NOT NULL) AND (p_pn_locations_rec.attribute2 is NULL))) THEN
2617 x_flag := 'Y';
2618 return;
2619 END IF;
2620
2621 IF ((G_LOC_RECINFO.ATTRIBUTE3 <> p_pn_locations_rec.attribute3)
2622 OR ((G_LOC_RECINFO.ATTRIBUTE3 is NULL) AND (p_pn_locations_rec.attribute3 is NOT NULL))
2623 OR ((G_LOC_RECINFO.ATTRIBUTE3 is NOT NULL) AND (p_pn_locations_rec.attribute3 is NULL))) THEN
2624 x_flag := 'Y';
2625 return;
2626 END IF;
2627 IF ((G_LOC_RECINFO.ATTRIBUTE4 <> p_pn_locations_rec.attribute4)
2628 OR ((G_LOC_RECINFO.ATTRIBUTE4 is NULL) AND (p_pn_locations_rec.attribute4 is NOT NULL))
2629 OR ((G_LOC_RECINFO.ATTRIBUTE4 is NOT NULL) AND (p_pn_locations_rec.attribute4 is NULL))) THEN
2630 x_flag := 'Y';
2631 return;
2632 END IF;
2633 IF ((G_LOC_RECINFO.ATTRIBUTE5 <> p_pn_locations_rec.attribute5)
2634 OR ((G_LOC_RECINFO.ATTRIBUTE5 is NULL) AND (p_pn_locations_rec.attribute5 is NOT NULL))
2635 OR ((G_LOC_RECINFO.ATTRIBUTE5 is NOT NULL) AND (p_pn_locations_rec.attribute5 is NULL))) THEN
2636 x_flag := 'Y';
2637 return;
2638 END IF;
2639 IF ((G_LOC_RECINFO.ATTRIBUTE6 <> p_pn_locations_rec.attribute6)
2640 OR ((G_LOC_RECINFO.ATTRIBUTE6 is NULL) AND (p_pn_locations_rec.attribute6 is NOT NULL))
2641 OR ((G_LOC_RECINFO.ATTRIBUTE6 is NOT NULL) AND (p_pn_locations_rec.attribute6 is NULL))) THEN
2642 x_flag := 'Y';
2643 return;
2644 END IF;
2645 IF ((G_LOC_RECINFO.ATTRIBUTE7 <> p_pn_locations_rec.attribute7)
2646 OR ((G_LOC_RECINFO.ATTRIBUTE7 is NULL) AND (p_pn_locations_rec.attribute7 is NOT NULL))
2647 OR ((G_LOC_RECINFO.ATTRIBUTE7 is NOT NULL) AND (p_pn_locations_rec.attribute7 is NULL))) THEN
2648 x_flag := 'Y';
2649 return;
2650 END IF;
2651 IF ((G_LOC_RECINFO.ATTRIBUTE8 <> p_pn_locations_rec.attribute8)
2652 OR ((G_LOC_RECINFO.ATTRIBUTE8 is NULL) AND (p_pn_locations_rec.attribute8 is NOT NULL))
2653 OR ((G_LOC_RECINFO.ATTRIBUTE8 is NOT NULL) AND (p_pn_locations_rec.attribute8 is NULL))) THEN
2654 x_flag := 'Y';
2655 return;
2656 END IF;
2657 IF ((G_LOC_RECINFO.ATTRIBUTE9 <> p_pn_locations_rec.attribute9)
2658 OR ((G_LOC_RECINFO.ATTRIBUTE9 is NULL) AND (p_pn_locations_rec.attribute9 is NOT NULL))
2659 OR ((G_LOC_RECINFO.ATTRIBUTE9 is NOT NULL) AND (p_pn_locations_rec.attribute9 is NULL))) THEN
2660 x_flag := 'Y';
2661 return;
2662 END IF;
2663 IF ((G_LOC_RECINFO.ATTRIBUTE10 <> p_pn_locations_rec.attribute10)
2664 OR ((G_LOC_RECINFO.ATTRIBUTE10 is NULL) AND (p_pn_locations_rec.attribute10 is NOT NULL))
2665 OR ((G_LOC_RECINFO.ATTRIBUTE10 is NOT NULL) AND (p_pn_locations_rec.attribute10 is NULL))) THEN
2666 x_flag := 'Y';
2667 return;
2668 END IF;
2669 IF ((G_LOC_RECINFO.ATTRIBUTE11 <> p_pn_locations_rec.attribute11)
2670 OR ((G_LOC_RECINFO.ATTRIBUTE11 is NULL) AND (p_pn_locations_rec.attribute11 is NOT NULL))
2671 OR ((G_LOC_RECINFO.ATTRIBUTE11 is NOT NULL) AND (p_pn_locations_rec.attribute11 is NULL))) THEN
2672 x_flag := 'Y';
2673 return;
2674 END IF;
2675 IF ((G_LOC_RECINFO.ATTRIBUTE12 <> p_pn_locations_rec.attribute12)
2676 OR ((G_LOC_RECINFO.ATTRIBUTE12 is NULL) AND (p_pn_locations_rec.attribute12 is NOT NULL))
2677 OR ((G_LOC_RECINFO.ATTRIBUTE12 is NOT NULL) AND (p_pn_locations_rec.attribute12 is NULL))) THEN
2678 x_flag := 'Y';
2679 return;
2680 END IF;
2681 IF ((G_LOC_RECINFO.ATTRIBUTE13 <> p_pn_locations_rec.attribute13)
2682 OR ((G_LOC_RECINFO.ATTRIBUTE13 is NULL) AND (p_pn_locations_rec.attribute13 is NOT NULL))
2683 OR ((G_LOC_RECINFO.ATTRIBUTE13 is NOT NULL) AND (p_pn_locations_rec.attribute13 is NULL))) THEN
2684 x_flag := 'Y';
2685 return;
2686 END IF;
2687 IF ((G_LOC_RECINFO.ATTRIBUTE14 <> p_pn_locations_rec.attribute14)
2688 OR ((G_LOC_RECINFO.ATTRIBUTE14 is NULL) AND (p_pn_locations_rec.attribute14 is NOT NULL))
2689 OR ((G_LOC_RECINFO.ATTRIBUTE14 is NOT NULL) AND (p_pn_locations_rec.attribute14 is NULL))) THEN
2690 x_flag := 'Y';
2691 return;
2692 END IF;
2693 IF ((G_LOC_RECINFO.ATTRIBUTE15 <> p_pn_locations_rec.attribute15)
2694 OR ((G_LOC_RECINFO.ATTRIBUTE15 is NULL) AND (p_pn_locations_rec.attribute15 is NOT NULL))
2695 OR ((G_LOC_RECINFO.ATTRIBUTE15 is NOT NULL) AND (p_pn_locations_rec.attribute15 is NULL))) THEN
2696 x_flag := 'Y';
2697 return;
2698 END IF;
2699
2700 IF NOT ((nvl(G_LOC_RECINFO.COMMON_AREA_FLAG,'x') = p_pn_locations_rec.COMMON_AREA_FLAG)
2701 OR ((G_LOC_RECINFO.COMMON_AREA_FLAG is null) AND (p_pn_locations_rec.COMMON_AREA_FLAG is null))) THEN
2702 x_flag := 'Y';
2703 return;
2704 END IF;
2705
2706 IF NOT (nvl(G_LOC_RECINFO.LOCATION_TYPE_LOOKUP_CODE,'x') = p_pn_locations_rec.LOCATION_TYPE_LOOKUP_CODE) THEN
2707 x_flag := 'Y';
2708 return;
2709 END IF;
2710
2711 IF ((G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE <> p_pn_locations_rec.FUNCTION_TYPE_LOOKUP_CODE)
2712 OR ((G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE is NULL) AND (p_pn_locations_rec.FUNCTION_TYPE_LOOKUP_CODE is NOT NULL))
2713 OR ((G_LOC_RECINFO.FUNCTION_TYPE_LOOKUP_CODE is NOT NULL) AND (p_pn_locations_rec.FUNCTION_TYPE_LOOKUP_CODE is NULL))) THEN
2714 x_flag := 'Y';
2715 return;
2716 END IF;
2717
2718 IF ((G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE <> p_pn_locations_rec.STANDARD_TYPE_LOOKUP_CODE)
2719 OR ((G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE is NULL) AND (p_pn_locations_rec.STANDARD_TYPE_LOOKUP_CODE is NOT NULL))
2720 OR ((G_LOC_RECINFO.STANDARD_TYPE_LOOKUP_CODE is NOT NULL) AND (p_pn_locations_rec.STANDARD_TYPE_LOOKUP_CODE is NULL))) THEN
2721 x_flag := 'Y';
2722 return;
2723 END IF;
2724
2725 IF ((G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE <> p_pn_locations_rec.SPACE_TYPE_LOOKUP_CODE)
2726 OR ((G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE is NULL) AND (p_pn_locations_rec.SPACE_TYPE_LOOKUP_CODE is NOT NULL))
2727 OR ((G_LOC_RECINFO.SPACE_TYPE_LOOKUP_CODE is NOT NULL) AND (p_pn_locations_rec.SPACE_TYPE_LOOKUP_CODE is NULL))) THEN
2728 x_flag := 'Y';
2729 return;
2730 END IF;
2731
2732 IF NOT (nvl(G_LOC_RECINFO.LOCATION_CODE,'x') = p_pn_locations_rec.LOCATION_CODE) THEN
2733 x_flag := 'Y';
2734 return;
2735 END IF;
2736
2737 IF NOT ((nvl(G_LOC_RECINFO.BUILDING,'x') = p_pn_locations_rec.BUILDING)
2738 OR ((G_LOC_RECINFO.BUILDING is null) AND (p_pn_locations_rec.BUILDING is null))) THEN
2739 x_flag := 'Y';
2740 return;
2741 END IF;
2742
2743 IF NOT ((nvl(G_LOC_RECINFO.FLOOR,'x') = p_pn_locations_rec.FLOOR)
2744 OR ((G_LOC_RECINFO.FLOOR is null) AND (p_pn_locations_rec.FLOOR is null))) THEN
2745 x_flag := 'Y';
2746 return;
2747 END IF;
2748
2749 IF NOT ((nvl(G_LOC_RECINFO.LOCATION_ALIAS,'x') = p_pn_locations_rec.LOCATION_ALIAS)
2750 OR ((G_LOC_RECINFO.LOCATION_ALIAS is null) AND (p_pn_locations_rec.LOCATION_ALIAS is null))) THEN
2751 x_flag := 'Y';
2752 return;
2753 END IF;
2754
2755 IF NOT ((nvl(G_LOC_RECINFO.PROPERTY_ID,-9.99) = nvl(p_pn_locations_rec.PROPERTY_ID,-9.99))) THEN
2756 x_flag := 'Y';
2757 return;
2758 END IF;
2759
2760 IF NOT ((nvl(G_LOC_RECINFO.PARENT_LOCATION_ID,9.99) = p_pn_locations_rec.PARENT_LOCATION_ID)
2761 OR ((G_LOC_RECINFO.PARENT_LOCATION_ID is null) AND (p_pn_locations_rec.PARENT_LOCATION_ID is null))) THEN
2762 x_flag := 'Y';
2763 return;
2764 END IF;
2765
2766 IF NOT ((nvl(G_LOC_RECINFO.INTERFACE_FLAG,'x') = p_pn_locations_rec.INTERFACE_FLAG)
2767 OR ((G_LOC_RECINFO.INTERFACE_FLAG is null) AND (p_pn_locations_rec.INTERFACE_FLAG is null))) THEN
2768 x_flag := 'Y';
2769 return;
2770 END IF;
2771
2772 IF NOT ((nvl(G_LOC_RECINFO.STATUS,'x') = p_pn_locations_rec.STATUS)
2773 OR ((G_LOC_RECINFO.STATUS is null) AND (p_pn_locations_rec.STATUS is null))) THEN
2774 x_flag := 'Y';
2775 return;
2776 END IF;
2777
2778 IF ((g_loc_recinfo.occupancy_status_code <> p_pn_locations_rec.occupancy_status_code) OR
2779 ((g_loc_recinfo.occupancy_status_code IS NULL) AND (p_pn_locations_rec.occupancy_status_code IS NOT NULL)) OR
2780 ((g_loc_recinfo.occupancy_status_code IS NOT NULL) AND (p_pn_locations_rec.occupancy_status_code IS NULL)))
2781 THEN
2782 x_flag := 'Y';
2783 RETURN;
2784 END IF;
2785
2786 IF ((g_loc_recinfo.assignable_emp <> p_pn_locations_rec.assignable_emp) OR
2787 ((g_loc_recinfo.assignable_emp IS NULL) AND (p_pn_locations_rec.assignable_emp IS NOT NULL)) OR
2788 ((g_loc_recinfo.assignable_emp IS NOT NULL) AND (p_pn_locations_rec.assignable_emp IS NULL)))
2789 THEN
2790 x_flag := 'Y';
2791 RETURN;
2792 END IF;
2793
2794 IF ((g_loc_recinfo.assignable_cc <> p_pn_locations_rec.assignable_cc) OR
2795 ((g_loc_recinfo.assignable_cc IS NULL) AND (p_pn_locations_rec.assignable_cc IS NOT NULL)) OR
2796 ((g_loc_recinfo.assignable_cc IS NOT NULL) AND (p_pn_locations_rec.assignable_cc IS NULL)))
2797 THEN
2798 x_flag := 'Y';
2799 RETURN;
2800 END IF;
2801
2802 IF ((g_loc_recinfo.assignable_cust <> p_pn_locations_rec.assignable_cust) OR
2803 ((g_loc_recinfo.assignable_cust IS NULL) AND (p_pn_locations_rec.assignable_cust IS NOT NULL)) OR
2804 ((g_loc_recinfo.assignable_cust IS NOT NULL) AND (p_pn_locations_rec.assignable_cust IS NULL)))
2805 THEN
2806 x_flag := 'Y';
2807 RETURN;
2808 END IF;
2809
2810
2811 -- DO SPECIAL CHECKS FOR PARTICULAR KINDS
2812
2813 IF (NVL(G_LOC_RECINFO.LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('BUILDING','LAND')) THEN
2814 IF NOT ((nvl(G_LOC_RECINFO.LOCATION_PARK_ID,9.99) = p_pn_locations_rec.LOCATION_PARK_ID)
2815 OR ((G_LOC_RECINFO.LOCATION_PARK_ID is null) AND (p_pn_locations_rec.LOCATION_PARK_ID is null))) THEN
2816 x_flag := 'Y';
2817 return;
2818 END IF;
2819
2820 IF NOT ((nvl(G_LOC_RECINFO.LEASE_OR_OWNED,'x') = p_pn_locations_rec.LEASE_OR_OWNED)
2821 OR ((G_LOC_RECINFO.LEASE_OR_OWNED is null) AND (p_pn_locations_rec.LEASE_OR_OWNED is null))) THEN
2822 x_flag := 'Y';
2823 return;
2824 END IF;
2825
2826 IF ((G_LOC_RECINFO.CLASS <> p_pn_locations_rec.CLASS)
2827 OR ((G_LOC_RECINFO.CLASS is NULL) AND (p_pn_locations_rec.CLASS is NOT NULL))
2828 OR ((G_LOC_RECINFO.CLASS is NOT NULL) AND (p_pn_locations_rec.CLASS is NULL))) THEN
2829 x_flag := 'Y';
2830 return;
2831 END IF;
2832
2833 IF NOT ((nvl(G_LOC_RECINFO.STATUS_TYPE,'x') = p_pn_locations_rec.STATUS_TYPE)
2834 OR ((G_LOC_RECINFO.STATUS_TYPE is null) AND (p_pn_locations_rec.STATUS_TYPE is null))) THEN
2835 x_flag := 'Y';
2836 return;
2837 END IF;
2838
2839 IF NOT ((nvl(G_LOC_RECINFO.OFFICE,'x') = p_pn_locations_rec.OFFICE)
2840 OR ((G_LOC_RECINFO.OFFICE is null) AND (p_pn_locations_rec.OFFICE is null))) THEN
2841 x_flag := 'Y';
2842 return;
2843 END IF;
2844
2845 IF NOT ((nvl(G_LOC_RECINFO.ADDRESS_ID,9.99) = p_pn_locations_rec.ADDRESS_ID)
2846 OR ((G_LOC_RECINFO.ADDRESS_ID is null) AND (p_pn_locations_rec.ADDRESS_ID is null))) THEN
2847 x_flag := 'Y';
2848 return;
2849 END IF;
2850
2851 IF NOT ((nvl(G_LOC_RECINFO.GROSS_AREA,-9.99) = nvl(p_pn_locations_rec.GROSS_AREA,-9.99))) THEN
2852 x_flag := 'Y';
2853 return;
2854 END IF;
2855
2856 IF NOT ((nvl(G_LOC_RECINFO.SUITE,'x') = p_pn_locations_rec.SUITE)
2857 OR ((G_LOC_RECINFO.SUITE is null) AND (p_pn_locations_rec.SUITE is null))) THEN
2858 x_flag := 'Y';
2859 return;
2860 END IF;
2861
2862 IF NOT ((nvl(G_LOC_RECINFO.ALLOCATE_COST_CENTER_CODE,'x') = p_pn_locations_rec.ALLOCATE_COST_CENTER_CODE)
2863 OR ((G_LOC_RECINFO.ALLOCATE_COST_CENTER_CODE is null) AND (p_pn_locations_rec.ALLOCATE_COST_CENTER_CODE is null))) THEN
2864 x_flag := 'Y';
2865 return;
2866 END IF;
2867
2868 IF NOT ((G_LOC_RECINFO.UOM_CODE = p_pn_locations_rec.UOM_CODE)
2869 OR ((G_LOC_RECINFO.UOM_CODE is null) AND (p_pn_locations_rec.UOM_CODE is null))) THEN
2870 x_flag := 'Y';
2871 return;
2872 END IF;
2873
2874 IF NOT ((nvl(G_LOC_RECINFO.DESCRIPTION,'x') = p_pn_locations_rec.DESCRIPTION)
2875 OR ((G_LOC_RECINFO.DESCRIPTION is null) AND (p_pn_locations_rec.DESCRIPTION is null))) THEN
2876 x_flag := 'Y';
2877 return;
2878 END IF;
2879
2880 ELSIF (NVL(G_LOC_RECINFO.LOCATION_TYPE_LOOKUP_CODE, ' ') IN ('OFFICE','SECTION')) THEN
2881
2882 IF NOT ((nvl(G_LOC_RECINFO.OFFICE,'x') = p_pn_locations_rec.OFFICE)
2883 OR ((G_LOC_RECINFO.OFFICE is null) AND (p_pn_locations_rec.OFFICE is null))) THEN
2884 x_flag := 'Y';
2885 return;
2886 END IF;
2887
2888 IF NOT ((nvl(G_LOC_RECINFO.MAX_CAPACITY,-9.99) = nvl(p_pn_locations_rec.MAX_CAPACITY,-9.99))) THEN
2889 x_flag := 'Y';
2890 return;
2891 END IF;
2892
2893 IF NOT ((nvl(G_LOC_RECINFO.OPTIMUM_CAPACITY,-9.99) = nvl(p_pn_locations_rec.OPTIMUM_CAPACITY,-9.99))) THEN
2894 x_flag := 'Y';
2895 return;
2896 END IF;
2897
2898 IF NOT ((nvl(G_LOC_RECINFO.RENTABLE_AREA,-9.99) = nvl(p_pn_locations_rec.RENTABLE_AREA,-9.99))) THEN
2899 x_flag := 'Y';
2900 return;
2901 END IF;
2902
2903 IF NOT ((nvl(G_LOC_RECINFO.USABLE_AREA,-9.99) = nvl(p_pn_locations_rec.USABLE_AREA,-9.99))) THEN
2904 x_flag := 'Y';
2905 return;
2906 END IF;
2907
2908 IF NOT ((nvl(G_LOC_RECINFO.ASSIGNABLE_AREA,9.99) = p_pn_locations_rec.ASSIGNABLE_AREA)
2909 OR ((G_LOC_RECINFO.ASSIGNABLE_AREA is null) AND (p_pn_locations_rec.ASSIGNABLE_AREA is null))) THEN
2910 x_flag := 'Y';
2911 return;
2912 END IF;
2913
2914 IF NOT ((nvl(G_LOC_RECINFO.COMMON_AREA,9.99) = p_pn_locations_rec.COMMON_AREA)
2915 OR ((G_LOC_RECINFO.COMMON_AREA is null) AND (p_pn_locations_rec.COMMON_AREA is null))) THEN
2916 x_flag := 'Y';
2917 return;
2918 END IF;
2919
2920 IF ((G_LOC_RECINFO.SUITE <> p_pn_locations_rec.SUITE)
2921 OR ((G_LOC_RECINFO.SUITE is NULL) AND (p_pn_locations_rec.SUITE is NOT NULL))
2922 OR ((G_LOC_RECINFO.SUITE is NOT NULL) AND (p_pn_locations_rec.SUITE is NULL))) THEN
2923 x_flag := 'Y';
2924 return;
2925 END IF;
2926
2927 IF NOT ((nvl(G_LOC_RECINFO.BOOKABLE_FLAG,'x') = p_pn_locations_rec.BOOKABLE_FLAG)
2928 OR ((G_LOC_RECINFO.BOOKABLE_FLAG is null) AND (p_pn_locations_rec.BOOKABLE_FLAG is null))) THEN
2929 x_flag := 'Y';
2930 return;
2931 END IF;
2932
2933 END IF;
2934
2935 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_for_popup (-) Flag: '||x_flag||', ReturnStatus: '||x_return_status);
2936
2937 END check_for_popup;
2938
2939 -------------------------------------------------------------------------------
2940 -- PROCDURE : Update_Status
2941 -- INVOKED FROM :
2942 -- PURPOSE : Updates the status.
2943 -- HISTORY :
2944 -- xx-xxx-xx o Fix for bug 707274
2945 -- 13-JUL-05 hrodda o Bug 4284035 - Replaced PN_LOCATION_ with _ALL table.
2946 -------------------------------------------------------------------------------
2947 PROCEDURE Update_Status (p_Location_Id Number) IS
2948
2949 BEGIN
2950
2951 UPDATE pn_locations_all
2952 SET Status = 'I'
2953 WHERE Location_Id IN (SELECT Location_Id
2954 FROM pn_locations_all
2955 START WITH Location_Id = p_Location_Id
2956 CONNECT BY PRIOR Location_Id = Parent_Location_id);
2957
2958 End Update_Status ;
2959
2960 ---------------------------------------------------------------------------------------
2961 -- Procedure update_assignments ( Fix for bug 2722698 )
2962 ---------------------------------------------------------------------------------------
2963 PROCEDURE update_assignments (
2964 p_location_id IN NUMBER
2965 ,p_active_start_date IN DATE
2966 ,p_active_end_date IN DATE
2967 ,p_active_start_date_old IN DATE
2968 ,p_active_end_date_old IN DATE
2969 ,x_return_status OUT NOCOPY VARCHAR2
2970 ,x_return_message OUT NOCOPY VARCHAR2
2971 )
2972 IS
2973
2974 CURSOR location_cursor IS
2975 SELECT *
2976 FROM pn_locations_all
2977 START WITH location_id = p_location_id
2978 CONNECT BY PRIOR location_id = parent_location_id;
2979
2980 BEGIN
2981
2982 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_assignments (+)');
2983 pnp_debug_pkg.debug(' UpdAsgn=> In Parameters :: p_location_id: '||p_location_id);
2984 pnp_debug_pkg.debug(' UpdAsgn=> p_active_start_date : '||TO_CHAR(p_active_start_date, 'MM/DD/YYYY')
2985 ||', p_active_end_date : '||TO_CHAR(p_active_end_date, 'MM/DD/YYYY'));
2986 pnp_debug_pkg.debug(' UpdAsgn=> p_active_start_date_old: '||TO_CHAR(p_active_start_date_old, 'MM/DD/YYYY')
2987 ||', p_active_end_date_old: '||TO_CHAR(p_active_end_date_old, 'MM/DD/YYYY'));
2988
2989 FOR l_location_rec in location_cursor LOOP
2990
2991 pnp_debug_pkg.debug(' UpdAsgn> Row#: '||location_cursor%ROWCOUNT||', Inside FOR loop LocId: '||l_location_rec.location_id||', LocCd: '||l_location_rec.location_code);
2992
2993 IF l_location_rec.active_end_date > p_active_end_date
2994 and p_active_end_date <> p_active_end_date_old THEN
2995
2996 pnp_debug_pkg.debug(' UpdAsgn> Inside end date updation');
2997
2998 DELETE FROM pn_space_assign_emp_all
2999 WHERE location_id = l_location_rec.location_id
3000 AND emp_assign_start_date > p_active_end_date
3001 AND allocated_area = 0;
3002
3003 UPDATE pn_space_assign_emp_all
3004 SET emp_assign_end_date = p_active_end_date
3005 WHERE location_id = l_location_rec.location_id
3006 AND emp_assign_end_date > p_active_end_date;
3007
3008 DELETE FROM pn_space_assign_cust_all
3009 WHERE location_id = l_location_rec.location_id
3010 AND cust_assign_start_date > p_active_end_date
3011 AND allocated_area = 0;
3012
3013 UPDATE pn_space_assign_cust_all
3014 SET cust_assign_end_date = p_active_end_date
3015 WHERE location_id = l_location_rec.location_id
3016 AND cust_assign_end_date > p_active_end_date;
3017
3018 END IF;
3019
3020 IF l_location_rec.active_start_date < p_active_start_date
3021 and p_active_start_date <> p_active_start_date_old THEN
3022
3023 pnp_debug_pkg.debug(' UpdAsgn> Inside start date updation');
3024
3025 DELETE FROM pn_space_assign_emp_all
3026 WHERE location_id = l_location_rec.location_id
3027 AND emp_assign_end_date < p_active_start_date
3028 AND allocated_area = 0;
3029
3030 UPDATE pn_space_assign_emp_all
3031 SET emp_assign_start_date = p_active_start_date
3032 WHERE location_id = l_location_rec.location_id
3033 AND emp_assign_start_date < p_active_start_date;
3034
3035 DELETE FROM pn_space_assign_cust_all
3036 WHERE location_id = l_location_rec.location_id
3037 AND cust_assign_end_date < p_active_start_date
3038 AND allocated_area = 0;
3039
3040 UPDATE pn_space_assign_cust_all
3041 SET cust_assign_start_date = p_active_start_date
3042 WHERE location_id = l_location_rec.location_id
3043 AND cust_assign_start_date < p_active_start_date;
3044
3045 END IF;
3046
3047 END LOOP;
3048
3049 x_return_status := FND_API.G_RET_STS_SUCCESS;
3050 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.update_assignments (-) ReturnStatus: '||x_return_status);
3051
3052 EXCEPTION
3053 WHEN OTHERS THEN
3054 x_return_status := FND_API.G_RET_STS_ERROR;
3055 fnd_message.set_name ('PN','PN_OTHERS_EXCEPTION');
3056 fnd_message.set_token('ERR_MSG',sqlerrm);
3057 pnp_debug_pkg.log('Other error update_assignments' || sqlerrm);
3058
3059 END update_assignments;
3060
3061 -----------------------------------------------------------------------
3062 -- FUNCTION : validate_gross_area
3063 -- PURPOSE : The function validates that sum off rentable area for all
3064 -- offices/sections under building/land must be less than the
3065 -- gross area of building/land.
3066 -- IN PARAM : Location Id, Rentable Area, Location Type Lookup Code,
3067 -- Active Start Date, Active End Date.
3068 -- History :
3069 -- 22-JAN-2003 Mrinal Misra o Created.
3070 -- 28-JAN-2003 Kiran o Modified
3071 -- o Changed i/p param p_rent_area to p_area
3072 -- o Changed the function to validate for both
3073 -- 'OFFICE' and 'BUILDING'.
3074 -- 28-JAN-2003 Mrinal Misra o Added p_change_mode parameter and related
3075 -- logic in function.
3076 -- 14-DEC-2004 Vikas Mehta o Changes to call function Get_Max_Rent_Area
3077 -- 18-JAN-2005 Satish Tripathi o Modified for debug messages. Set l_return appropriately
3078 -- and log it in debug before RETURN.
3079 -----------------------------------------------------------------------
3080 FUNCTION validate_gross_area(p_loc_id IN NUMBER,
3081 p_area IN NUMBER,
3082 p_lkp_code IN VARCHAR2,
3083 p_act_str_dt IN DATE,
3084 p_act_end_dt IN DATE,
3085 p_change_mode IN VARCHAR2
3086 )
3087 RETURN BOOLEAN IS
3088
3089 l_min_gross_area NUMBER;
3090 l_loc_id NUMBER;
3091 l_sum_rent_area NUMBER;
3092 l_old_rent_area NUMBER;
3093 l_act_end_dt DATE := NVL(p_act_end_dt, pnt_locations_pkg.g_end_of_time);
3094 l_off_lkp_code VARCHAR2(30);
3095 l_return VARCHAR2(30);
3096
3097 CURSOR get_min_gross_area IS
3098 SELECT MIN(gross_area) min_gross_area,
3099 location_id location_id
3100 FROM pn_locations_all
3101 WHERE parent_location_id IS NULL
3102 AND active_start_date <= l_act_end_dt
3103 AND active_end_date >= p_act_str_dt
3104 START WITH location_id = p_loc_id
3105 CONNECT BY PRIOR parent_location_id = location_id
3106 GROUP BY location_id;
3107
3108 CURSOR get_old_rent_area IS
3109 SELECT rentable_area
3110 FROM pn_locations_all
3111 WHERE location_id = p_loc_id
3112 AND location_type_lookup_code = p_lkp_code
3113 AND active_start_date <= NVL(p_act_end_dt, TO_DATE('12/31/4712','MM/DD/YYYY'))
3114 AND active_end_date >= p_act_str_dt;
3115 BEGIN
3116
3117 pnp_debug_pkg.debug(' PntLocnPkg.Validate_Gross_Area (+) LocId: '||p_loc_id||', Area: '||p_area
3118 ||', ActStrDt: '||TO_CHAR(p_act_str_dt, 'MM/DD/YYYY')
3119 ||', ActEndDt: '||TO_CHAR(p_act_end_dt, 'MM/DD/YYYY'));
3120 IF p_lkp_code in ('OFFICE', 'SECTION') THEN
3121
3122 OPEN get_min_gross_area;
3123 FETCH get_min_gross_area INTO l_min_gross_area, l_loc_id;
3124 CLOSE get_min_gross_area;
3125
3126 IF l_min_gross_area is null THEN
3127 l_return := 'Y';
3128 ELSE
3129 l_sum_rent_area := Get_Max_Rent_Area(l_loc_id, p_lkp_code, p_act_str_dt, l_act_end_dt);
3130
3131 IF p_change_mode = 'UPDATE' THEN
3132 OPEN get_old_rent_area;
3133 FETCH get_old_rent_area INTO l_old_rent_area;
3134 CLOSE get_old_rent_area;
3135
3136 l_sum_rent_area := l_sum_rent_area - l_old_rent_area;
3137 END IF;
3138
3139 IF NVL(l_min_gross_area,0) < NVL(l_sum_rent_area, 0) + NVL(p_area,0) THEN
3140 l_return := 'N';
3141 ELSE
3142 l_return := 'Y';
3143 END IF;
3144 END IF;
3145
3146 ELSIF p_lkp_code in ('BUILDING', 'LAND') THEN
3147
3148 IF p_lkp_code = 'BUILDING' THEN
3149 l_off_lkp_code := 'OFFICE';
3150 ELSIF p_lkp_code = 'LAND' THEN
3151 l_off_lkp_code := 'SECTION';
3152 END IF;
3153
3154 IF p_area IS NULL THEN
3155 l_return := 'Y';
3156 ELSE
3157
3158 l_sum_rent_area := Get_Max_Rent_Area(l_loc_id, l_off_lkp_code, p_act_str_dt, l_act_end_dt);
3159
3160 IF NVL(p_area,0) < NVL(l_sum_rent_area, 0) THEN
3161 l_return := 'N';
3162 ELSE
3163 l_return := 'Y';
3164 END IF;
3165 END IF;
3166
3167 END IF;
3168
3169 pnp_debug_pkg.debug(' PntLocnPkg.Validate_Gross_Area (+) LocId: '||p_loc_id||', Return: '||l_return);
3170
3171 IF l_return = 'Y' THEN
3172 RETURN TRUE;
3173 ELSE
3174 RETURN FALSE;
3175 END IF;
3176
3177 END validate_gross_area;
3178
3179 -------------------------------------------------------------------------------
3180 -- PROCEDURE : check_location_gaps
3181 -- PURPOSE : This procedure is being called from INSERT_ROW, UPDATE_ROW
3182 -- of employee_fdr_blk, customer_fdr_blk of PNTSPACE form.
3183 -- It checks for the gaps between office definition and stops
3184 -- the user from assinging an office during that gap interval.
3185 -- IN PARAM : Location Id, Actice_start_date, Active_end_date.
3186 -- History :
3187 -- 27-DEC-02 MMisra o Mrinal Misra
3188 -- 10-JAN-03 MMisra o Modified to run FOR LOOP one lesser
3189 -- count by 1..loctn_tab.count-1.
3190 -- 05-JUN-03 STripathi o Added parameter p_err_msg for Recovery (CAM)
3191 -- impact on Leases.
3192 -- 01-DEC-04 STripathi o Modified for Portfolio Status Enh BUG# 4030816.
3193 -- Take occupancy status, assignable_emp, assignable_cc and
3194 -- assignable_cust into account depending on new parameter
3195 -- Assignmane Mode (p_asgn_mode).
3196 -- 13-JUL-05 hrodda o Bug 4284035 - Replaced PN_LOCATION with _ALL table.
3197 -------------------------------------------------------------------------------
3198 PROCEDURE Check_Location_Gaps (
3199 p_loc_id IN NUMBER
3200 ,p_str_dt IN DATE
3201 ,p_end_dt IN DATE
3202 ,p_asgn_mode IN VARCHAR2
3203 ,p_err_msg OUT NOCOPY VARCHAR2
3204 )
3205 IS
3206
3207 TYPE loctn_rec IS RECORD(
3208 location_id pn_locations.location_id%TYPE,
3209 active_start_date DATE,
3210 active_end_date DATE);
3211
3212 TYPE loc_type IS
3213 TABLE OF loctn_rec
3214 INDEX BY BINARY_INTEGER;
3215
3216 loctn_tab loc_type;
3217 l_rec_num NUMBER;
3218 l_diff NUMBER;
3219 l_date DATE;
3220 l_err_flag VARCHAR2(1);
3221 l_err_msg VARCHAR2(1) := NULL;
3222
3223 CURSOR get_loctn_dates IS
3224 SELECT location_id,
3225 active_start_date,
3226 active_end_date
3227 FROM pn_locations_all
3228 WHERE active_end_date >= p_str_dt
3229 AND active_start_date <= p_end_dt
3230 AND location_id = p_loc_id
3231 AND ((p_asgn_mode = 'NONE') OR
3232 (p_asgn_mode = 'EMP' AND NVL(assignable_emp, 'Y') = 'Y' AND NVL(assignable_cc, 'Y') = 'Y') OR
3233 (p_asgn_mode = 'CC' AND NVL(assignable_cc, 'Y') = 'Y') OR
3234 (p_asgn_mode = 'CUST' AND NVL(assignable_cust, 'Y') = 'Y')
3235 )
3236 ORDER BY active_start_date;
3237
3238 CURSOR check_loctn_gap(l_date IN DATE) IS
3239 SELECT 'Y'
3240 FROM DUAL
3241 WHERE NOT EXISTS (SELECT NULL
3242 FROM pn_locations_all
3243 WHERE l_date BETWEEN active_start_date AND active_end_date
3244 AND location_id = p_loc_id
3245 AND ((p_asgn_mode = 'NONE') OR
3246 (p_asgn_mode = 'EMP' AND NVL(assignable_emp, 'Y') = 'Y' AND NVL(assignable_cc, 'Y') = 'Y') OR
3247 (p_asgn_mode = 'CC' AND NVL(assignable_cc, 'Y') = 'Y') OR
3248 (p_asgn_mode = 'CUST' AND NVL(assignable_cust, 'Y') = 'Y')
3249 ));
3250
3251 BEGIN
3252
3253 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Check_Location_Gaps(+) LocId: '||p_loc_id||', Mode: '||p_asgn_mode
3254 ||', StrDt: '||TO_CHAR(p_str_dt, 'MM/DD/YYYY')||', EndDt: '||TO_CHAR(p_end_dt, 'MM/DD/YYYY'));
3255
3256 loctn_tab.delete;
3257 l_rec_num := 0;
3258 l_err_flag := 'N';
3259
3260 IF p_str_dt IS NOT NULL THEN
3261 OPEN check_loctn_gap(p_str_dt);
3262 FETCH check_loctn_gap INTO l_err_flag;
3263 CLOSE check_loctn_gap;
3264
3265 IF l_err_flag = 'Y' THEN --Invalid Locn
3266 l_err_msg := 'I';
3267 END IF;
3268 END IF;
3269
3270 IF p_end_dt IS NOT NULL AND
3271 l_err_flag = 'N'
3272 THEN
3273 OPEN check_loctn_gap(p_end_dt);
3274 FETCH check_loctn_gap INTO l_err_flag;
3275 CLOSE check_loctn_gap;
3276
3277 IF l_err_flag = 'Y' THEN --Invalid Locn
3278 l_err_msg := 'I';
3279 END IF;
3280 END IF;
3281
3282 IF p_end_dt IS NOT NULL AND p_str_dt IS NOT NULL AND
3283 l_err_flag = 'N'
3284 THEN
3285 FOR loc_rec IN get_loctn_dates LOOP
3286 l_rec_num := NVL(loctn_tab.count,0) + 1;
3287 loctn_tab(l_rec_num) := loc_rec;
3288 END LOOP;
3289
3290 IF NVL(l_rec_num,0) > 1 THEN
3291 FOR i in 1..loctn_tab.count-1 LOOP
3292
3293 l_diff := loctn_tab(i+1).active_start_date - loctn_tab(i).active_end_date;
3294
3295 IF l_diff > 1 THEN
3296 l_err_flag := 'Y';
3297 EXIT;
3298 END IF;
3299 END LOOP;
3300
3301 ELSIF NVL(l_rec_num,0) = 0 THEN
3302 l_err_flag := 'Y';
3303 END IF;
3304
3305 IF l_err_flag = 'Y' THEN --Gap Exists
3306 l_err_msg := 'G';
3307 END IF;
3308 END IF;
3309
3310 p_err_msg := l_err_msg;
3311
3312 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Check_Location_Gaps(-) ErrMsg: '||p_err_msg);
3313
3314 END Check_Location_Gaps;
3315
3316
3317 -----------------------------------------------------------------------
3318 -- PROCEDURE : Get_Location_Span
3319 -- PURPOSE : This procedure returns Min start date and Max end date
3320 -- of a location taking occupancy status and assignable group
3321 -- into account depending on Assignmane Mode (p_asgn_mode).
3322 -- IN PARAM :
3323 -- History :
3324 -- 01-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
3325 -----------------------------------------------------------------------
3326 PROCEDURE Get_Location_Span (
3327 p_loc_id IN NUMBER
3328 ,p_asgn_mode IN VARCHAR2
3329 ,p_min_str_dt OUT NOCOPY DATE
3330 ,p_max_end_dt OUT NOCOPY DATE
3331 )
3332 IS
3333
3334 CURSOR get_loctn_span IS
3335 SELECT MIN(active_start_date)
3336 ,MAX(active_end_date)
3337 FROM pn_locations_all
3338 WHERE location_id = p_loc_id
3339 AND ((p_asgn_mode = 'NONE') OR
3340 (p_asgn_mode = 'EMP' AND NVL(assignable_emp, 'Y') = 'Y' AND NVL(assignable_cc, 'Y') = 'Y') OR
3341 (p_asgn_mode = 'CC' AND NVL(assignable_cc, 'Y') = 'Y') OR
3342 (p_asgn_mode = 'CUST' AND NVL(assignable_cust, 'Y') = 'Y'));
3343
3344 BEGIN
3345
3346 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Get_Location_Span(+) LocId: '||p_loc_id||', Mode: '||p_asgn_mode);
3347
3348 OPEN get_loctn_span;
3349 FETCH get_loctn_span INTO p_min_str_dt, p_max_end_dt;
3350 CLOSE get_loctn_span;
3351
3352 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Get_Location_Span(-) MinStrDt: '
3353 ||TO_CHAR(p_min_str_dt, 'MM/DD/YYYY')||', MaxEndDt: '||TO_CHAR(p_max_end_dt, 'MM/DD/YYYY'));
3354
3355 END Get_Location_Span;
3356
3357
3358 -----------------------------------------------------------------------
3359 -- PROCEDURE : Update_Locn_Row
3360 -- PURPOSE : This procedure calls pnt_locations_pkg.Update_Row for the
3361 -- pn_locations_all%ROWTYPE passed to it. Called from
3362 -- Correct_Update_Row and Cascade_Child_Locn
3363 -- IN PARAM :
3364 -- History :
3365 -- 01-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
3366 -- 02-AUG-2005 Satya Deep o Added X_SOURCE in the call to
3367 -- pnt_locations_pkg.Update_Row
3368 -----------------------------------------------------------------------
3369 PROCEDURE Update_Locn_Row (
3370 p_loc_recinfo IN pn_locations_all%ROWTYPE
3371 ,p_adr_recinfo IN pn_addresses_all%ROWTYPE
3372 ,p_assgn_area_chgd_flag IN VARCHAR2
3373 ,x_return_status IN OUT NOCOPY VARCHAR2
3374 ,x_return_message IN OUT NOCOPY VARCHAR2
3375 )
3376 IS
3377 l_rowid ROWID;
3378 l_location_id pn_locations_all.location_id%TYPE;
3379 l_address_id pn_locations_all.address_id%TYPE;
3380 BEGIN
3381
3382 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Update_Locn_Row (+) LocId: '||p_loc_recinfo.location_id
3383 ||', LocCd: '||p_loc_recinfo.location_code
3384 ||', Type: '||p_loc_recinfo.location_type_lookup_code);
3385 l_location_id := p_loc_recinfo.location_id;
3386 l_address_id := p_loc_recinfo.address_id;
3387
3388 IF g_pn_locations_rowid IS NULL THEN
3389 pnt_locations_pkg.Set_ROWID(
3390 p_location_id => p_loc_recinfo.location_id
3391 ,p_active_start_date => p_loc_recinfo.active_start_date
3392 ,p_active_end_date => p_loc_recinfo.active_end_date
3393 ,x_return_status => x_return_status
3394 ,x_return_message => x_return_message
3395 );
3396 END IF;
3397
3398 IF NVL(x_return_status, 'S') = 'S' THEN
3399
3400 pnt_locations_pkg.Update_Row
3401 (
3402 x_location_id => l_location_id
3403 ,x_last_update_date => SYSDATE
3404 ,x_last_updated_by => fnd_global.user_id
3405 ,x_last_update_login => fnd_global.login_id
3406 ,x_location_park_id => p_loc_recinfo.location_park_id
3407 ,x_location_type_lookup_code => p_loc_recinfo.location_type_lookup_code
3408 ,x_space_type_lookup_code => p_loc_recinfo.space_type_lookup_code
3409 ,x_function_type_lookup_code => p_loc_recinfo.function_type_lookup_code
3410 ,x_standard_type_lookup_code => p_loc_recinfo.standard_type_lookup_code
3411 ,x_building => p_loc_recinfo.building
3412 ,x_lease_or_owned => p_loc_recinfo.lease_or_owned
3413 ,x_class => p_loc_recinfo.class
3414 ,x_status_type => p_loc_recinfo.status_type
3415 ,x_floor => p_loc_recinfo.floor
3416 ,x_office => p_loc_recinfo.office
3417 ,x_max_capacity => p_loc_recinfo.max_capacity
3418 ,x_optimum_capacity => p_loc_recinfo.optimum_capacity
3419 ,x_gross_area => p_loc_recinfo.gross_area
3420 ,x_rentable_area => p_loc_recinfo.rentable_area
3421 ,x_usable_area => p_loc_recinfo.usable_area
3422 ,x_assignable_area => p_loc_recinfo.assignable_area
3423 ,x_common_area => p_loc_recinfo.common_area
3424 ,x_suite => p_loc_recinfo.suite
3425 ,x_allocate_cost_center_code => p_loc_recinfo.allocate_cost_center_code
3426 ,x_uom_code => p_loc_recinfo.uom_code
3427 ,x_description => p_loc_recinfo.description
3428 ,x_parent_location_id => p_loc_recinfo.parent_location_id
3429 ,x_interface_flag => p_loc_recinfo.interface_flag
3430 ,x_status => p_loc_recinfo.status
3431 ,x_property_id => p_loc_recinfo.property_id
3432 ,x_common_area_flag => p_loc_recinfo.common_area_flag
3433 ,x_active_start_date => p_loc_recinfo.active_start_date
3434 ,x_active_end_date => p_loc_recinfo.active_end_date
3435 ,x_bookable_flag => p_loc_recinfo.bookable_flag
3436 ,x_occupancy_status_code => p_loc_recinfo.occupancy_status_code
3437 ,x_assignable_emp => p_loc_recinfo.assignable_emp
3438 ,x_assignable_cc => p_loc_recinfo.assignable_cc
3439 ,x_assignable_cust => p_loc_recinfo.assignable_cust
3440 ,x_disposition_code => p_loc_recinfo.disposition_code
3441 ,x_acc_treatment_code => p_loc_recinfo.acc_treatment_code
3442 ,x_attribute_category => p_loc_recinfo.attribute_category
3443 ,x_attribute1 => p_loc_recinfo.attribute1
3444 ,x_attribute2 => p_loc_recinfo.attribute2
3445 ,x_attribute3 => p_loc_recinfo.attribute3
3446 ,x_attribute4 => p_loc_recinfo.attribute4
3447 ,x_attribute5 => p_loc_recinfo.attribute5
3448 ,x_attribute6 => p_loc_recinfo.attribute6
3449 ,x_attribute7 => p_loc_recinfo.attribute7
3450 ,x_attribute8 => p_loc_recinfo.attribute8
3451 ,x_attribute9 => p_loc_recinfo.attribute9
3452 ,x_attribute10 => p_loc_recinfo.attribute10
3453 ,x_attribute11 => p_loc_recinfo.attribute11
3454 ,x_attribute12 => p_loc_recinfo.attribute12
3455 ,x_attribute13 => p_loc_recinfo.attribute13
3456 ,x_attribute14 => p_loc_recinfo.attribute14
3457 ,x_attribute15 => p_loc_recinfo.attribute15
3458 ,x_address_id => l_address_id
3459 ,x_addr_last_update_date => SYSDATE
3460 ,x_addr_last_updated_by => fnd_globaL.user_id
3461 ,x_addr_last_update_login => fnd_global.login_id
3462 ,x_address_line1 => p_adr_recinfo.address_line1
3463 ,x_address_line2 => p_adr_recinfo.address_line2
3464 ,x_address_line3 => p_adr_recinfo.address_line3
3465 ,x_address_line4 => p_adr_recinfo.address_line4
3466 ,x_county => p_adr_recinfo.county
3467 ,x_city => p_adr_recinfo.city
3468 ,x_state => p_adr_recinfo.state
3469 ,x_province => p_adr_recinfo.province
3470 ,x_zip_code => p_adr_recinfo.zip_code
3471 ,x_country => p_adr_recinfo.country
3472 ,x_territory_id => p_adr_recinfo.territory_id
3473 ,x_addr_attribute_category => p_adr_recinfo.addr_attribute_category
3474 ,x_addr_attribute1 => p_adr_recinfo.addr_attribute1
3475 ,x_addr_attribute2 => p_adr_recinfo.addr_attribute2
3476 ,x_addr_attribute3 => p_adr_recinfo.addr_attribute3
3477 ,x_addr_attribute4 => p_adr_recinfo.addr_attribute4
3478 ,x_addr_attribute5 => p_adr_recinfo.addr_attribute5
3479 ,x_addr_attribute6 => p_adr_recinfo.addr_attribute6
3480 ,x_addr_attribute7 => p_adr_recinfo.addr_attribute7
3481 ,x_addr_attribute8 => p_adr_recinfo.addr_attribute8
3482 ,x_addr_attribute9 => p_adr_recinfo.addr_attribute9
3483 ,x_addr_attribute10 => p_adr_recinfo.addr_attribute10
3484 ,x_addr_attribute11 => p_adr_recinfo.addr_attribute11
3485 ,x_addr_attribute12 => p_adr_recinfo.addr_attribute12
3486 ,x_addr_attribute13 => p_adr_recinfo.addr_attribute13
3487 ,x_addr_attribute14 => p_adr_recinfo.addr_attribute14
3488 ,x_addr_attribute15 => p_adr_recinfo.addr_attribute15
3489 ,x_assgn_area_chgd_flag => p_assgn_area_chgd_flag
3490 ,x_return_status => x_return_status
3491 ,x_return_message => x_return_message
3492 ,x_source => p_loc_recinfo.source
3493 );
3494
3495 END IF;
3496
3497 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Update_Locn_Row (-) ReturnStatus: '||x_return_status);
3498 END Update_Locn_Row;
3499
3500
3501 -----------------------------------------------------------------------
3502 -- PROCEDURE : Insert_Locn_Row
3503 -- PURPOSE : This procedure calls pnt_locations_pkg.Insert_Row for the
3504 -- pn_locations_all%ROWTYPE passed to it. Called from
3505 -- Correct_Update_Row and Cascade_Child_Locn
3506 -- IN PARAM :
3507 -- History :
3508 -- 01-DEC-2004 Satish Tripathi o Created for Portfolio Status Enh BUG# 4030816.
3509 -- 02-AUG-2005 Satya Deep o Added X_SOURCE in the call to
3510 -- pnt_locations_pkg.Insert_Row
3511 -----------------------------------------------------------------------
3512 PROCEDURE Insert_Locn_Row (
3513 p_loc_recinfo IN pn_locations_all%ROWTYPE
3514 ,p_adr_recinfo IN pn_addresses_all%ROWTYPE
3515 ,p_change_mode IN VARCHAR2
3516 ,x_return_status IN OUT NOCOPY VARCHAR2
3517 ,x_return_message IN OUT NOCOPY VARCHAR2
3518 )
3519 IS
3520 l_rowid ROWID;
3521 l_location_id pn_locations_all.location_id%TYPE;
3522 l_address_id pn_locations_all.address_id%TYPE;
3523 BEGIN
3524 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Insert_Locn_Row (+) LocId: '||p_loc_recinfo.location_id
3525 ||', LocCd: '||p_loc_recinfo.location_code
3526 ||', Type: '||p_loc_recinfo.location_type_lookup_code);
3527
3528 l_location_id := p_loc_recinfo.location_id;
3529 l_address_id := p_loc_recinfo.address_id;
3530
3531 pnt_locations_pkg.Insert_Row
3532 (
3533 x_rowid => l_rowid
3534 ,x_last_update_date => SYSDATE
3535 ,x_last_updated_by => fnd_global.user_id
3536 ,x_creation_date => SYSDATE
3537 ,x_created_by => fnd_global.user_id
3538 ,x_last_update_login => fnd_global.login_id
3539 ,x_location_id => l_location_id
3540 ,x_org_id => p_loc_recinfo.org_id
3541 ,x_location_park_id => p_loc_recinfo.location_park_id
3542 ,x_location_type_lookup_code => p_loc_recinfo.location_type_lookup_code
3543 ,x_space_type_lookup_code => p_loc_recinfo.space_type_lookup_code
3544 ,x_function_type_lookup_code => p_loc_recinfo.function_type_lookup_code
3545 ,x_standard_type_lookup_code => p_loc_recinfo.standard_type_lookup_code
3546 ,x_location_alias => p_loc_recinfo.location_alias
3547 ,x_location_code => p_loc_recinfo.location_code
3548 ,x_building => p_loc_recinfo.building
3549 ,x_lease_or_owned => p_loc_recinfo.lease_or_owned
3550 ,x_class => p_loc_recinfo.class
3551 ,x_status_type => p_loc_recinfo.status_type
3552 ,x_floor => p_loc_recinfo.floor
3553 ,x_office => p_loc_recinfo.office
3554 ,x_max_capacity => p_loc_recinfo.max_capacity
3555 ,x_optimum_capacity => p_loc_recinfo.optimum_capacity
3556 ,x_gross_area => p_loc_recinfo.gross_area
3557 ,x_rentable_area => p_loc_recinfo.rentable_area
3558 ,x_usable_area => p_loc_recinfo.usable_area
3559 ,x_assignable_area => p_loc_recinfo.assignable_area
3560 ,x_common_area => p_loc_recinfo.common_area
3561 ,x_suite => p_loc_recinfo.suite
3562 ,x_allocate_cost_center_code => p_loc_recinfo.allocate_cost_center_code
3563 ,x_uom_code => p_loc_recinfo.uom_code
3564 ,x_description => p_loc_recinfo.description
3565 ,x_parent_location_id => p_loc_recinfo.parent_location_id
3566 ,x_interface_flag => p_loc_recinfo.interface_flag
3567 ,x_request_id => p_loc_recinfo.request_id
3568 ,x_program_id => p_loc_recinfo.program_id
3569 ,x_program_application_id => p_loc_recinfo.program_application_id
3570 ,x_program_update_date => p_loc_recinfo.program_update_date
3571 ,x_status => p_loc_recinfo.status
3572 ,x_property_id => p_loc_recinfo.property_id
3573 ,x_common_area_flag => p_loc_recinfo.common_area_flag
3574 ,x_active_start_date => p_loc_recinfo.active_start_date
3575 ,x_active_end_date => p_loc_recinfo.active_end_date
3576 ,x_bookable_flag => p_loc_recinfo.bookable_flag
3577 ,x_occupancy_status_code => p_loc_recinfo.occupancy_status_code
3578 ,x_assignable_emp => p_loc_recinfo.assignable_emp
3579 ,x_assignable_cc => p_loc_recinfo.assignable_cc
3580 ,x_assignable_cust => p_loc_recinfo.assignable_cust
3581 ,x_disposition_code => p_loc_recinfo.disposition_code
3582 ,x_acc_treatment_code => p_loc_recinfo.acc_treatment_code
3583 ,x_attribute_category => p_loc_recinfo.attribute_category
3584 ,x_attribute1 => p_loc_recinfo.attribute1
3585 ,x_attribute2 => p_loc_recinfo.attribute2
3586 ,x_attribute3 => p_loc_recinfo.attribute3
3587 ,x_attribute4 => p_loc_recinfo.attribute4
3588 ,x_attribute5 => p_loc_recinfo.attribute5
3589 ,x_attribute6 => p_loc_recinfo.attribute6
3590 ,x_attribute7 => p_loc_recinfo.attribute7
3591 ,x_attribute8 => p_loc_recinfo.attribute8
3592 ,x_attribute9 => p_loc_recinfo.attribute9
3593 ,x_attribute10 => p_loc_recinfo.attribute10
3594 ,x_attribute11 => p_loc_recinfo.attribute11
3595 ,x_attribute12 => p_loc_recinfo.attribute12
3596 ,x_attribute13 => p_loc_recinfo.attribute13
3597 ,x_attribute14 => p_loc_recinfo.attribute14
3598 ,x_attribute15 => p_loc_recinfo.attribute15
3599 ,x_address_id => l_address_id
3600 ,x_address_line1 => p_adr_recinfo.address_line1
3601 ,x_address_line2 => p_adr_recinfo.address_line2
3602 ,x_address_line3 => p_adr_recinfo.address_line3
3603 ,x_address_line4 => p_adr_recinfo.address_line4
3604 ,x_county => p_adr_recinfo.county
3605 ,x_city => p_adr_recinfo.city
3606 ,x_state => p_adr_recinfo.state
3607 ,x_province => p_adr_recinfo.province
3608 ,x_zip_code => p_adr_recinfo.zip_code
3609 ,x_country => p_adr_recinfo.country
3610 ,x_territory_id => p_adr_recinfo.territory_id
3611 ,x_addr_last_update_date => SYSDATE
3612 ,x_addr_last_updated_by => fnd_globaL.user_id
3613 ,x_addr_creation_date => SYSDATE
3614 ,x_addr_created_by => fnd_global.user_id
3615 ,x_addr_last_update_login => fnd_global.login_id
3616 ,x_addr_attribute_category => p_adr_recinfo.addr_attribute_category
3617 ,x_addr_attribute1 => p_adr_recinfo.addr_attribute1
3618 ,x_addr_attribute2 => p_adr_recinfo.addr_attribute2
3619 ,x_addr_attribute3 => p_adr_recinfo.addr_attribute3
3620 ,x_addr_attribute4 => p_adr_recinfo.addr_attribute4
3621 ,x_addr_attribute5 => p_adr_recinfo.addr_attribute5
3622 ,x_addr_attribute6 => p_adr_recinfo.addr_attribute6
3623 ,x_addr_attribute7 => p_adr_recinfo.addr_attribute7
3624 ,x_addr_attribute8 => p_adr_recinfo.addr_attribute8
3625 ,x_addr_attribute9 => p_adr_recinfo.addr_attribute9
3626 ,x_addr_attribute10 => p_adr_recinfo.addr_attribute10
3627 ,x_addr_attribute11 => p_adr_recinfo.addr_attribute11
3628 ,x_addr_attribute12 => p_adr_recinfo.addr_attribute12
3629 ,x_addr_attribute13 => p_adr_recinfo.addr_attribute13
3630 ,x_addr_attribute14 => p_adr_recinfo.addr_attribute14
3631 ,x_addr_attribute15 => p_adr_recinfo.addr_attribute15
3632 ,x_change_mode => p_change_mode
3633 ,x_return_status => x_return_status
3634 ,x_return_message => x_return_message
3635 ,x_source => p_loc_recinfo.source
3636 );
3637
3638 IF NOT (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
3639 x_return_status := FND_API.G_RET_STS_ERROR;
3640 APP_EXCEPTION.Raise_Exception;
3641 END IF;
3642
3643 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.Insert_Locn_Row (-) ReturnStatus: '||x_return_status);
3644 END Insert_Locn_Row;
3645
3646 /* --- CHANGED functions and procedures for MOAC START --- */
3647 /*============================================================================+
3648 -- NAME : get_location_id
3649 -- DESCRIPTION : This FUNCTION RETURNs Location id for given location code
3650 -- and location type look up code.
3651 -- SCOPE : PUBLIC
3652 -- INVOKED FROM : forms libraries
3653 -- ARGUMENTS : IN : p_location_code, p_loctn_type_lookup_code
3654 -- RETURNS : Location id
3655 -- HISTORY :
3656 -- 24-Jun-05 piagrawa o Created
3657 -- IMPORTANT - Use this function once MOAC is enabled. All form libraries
3658 -- must call this.
3659 +============================================================================*/
3660 FUNCTION get_location_id (
3661 p_location_code IN VARCHAR2,
3662 p_loctn_type_lookup_code IN VARCHAR2,
3663 p_org_id IN NUMBER
3664 ) RETURN number
3665 IS
3666
3667 l_location_id NUMBER := NULL;
3668
3669 BEGIN
3670
3671
3672 SELECT location_id
3673 INTO l_location_id
3674 FROM pn_locations_all
3675 WHERE location_code = p_location_code
3676 AND location_type_lookup_code = p_loctn_type_lookup_code
3677 AND org_id = p_org_id
3678 AND ROWNUM = 1;
3679
3680 RETURN l_location_id;
3681
3682 EXCEPTION
3683 when no_data_found then
3684 return l_location_id;
3685 when others then
3686 return l_location_id;
3687
3688 END get_location_id ;
3689
3690
3691 /*============================================================================+
3692 -- NAME : check_unique_location_code
3693 -- DESCRIPTION : This procedure checks if location code is unique.
3694 -- INVOKED FROM : forms libraries
3695 -- ARGUMENTS : IN : x_return_status, x_location_id, x_location_code,
3696 -- x_active_start_date, x_active_end_date
3697 -- RETURNS : NONE
3698 -- HISTORY :
3699 -- 24-Jun-05 piagrawa o Created
3700 -- IMPORTANT - Use this function once MOAC is enabled. All form libraries
3701 -- must call this.
3702 +============================================================================*/
3703 PROCEDURE check_unique_location_code (
3704 x_return_status IN OUT NOCOPY VARCHAR2,
3705 x_location_id NUMBER,
3706 x_location_code VARCHAR2,
3707 x_active_start_date DATE,
3708 x_active_end_date DATE,
3709 x_org_id NUMBER
3710 ) IS
3711 l_dummy NUMBER;
3712
3713 CURSOR loc_code_cur IS
3714 SELECT 1
3715 FROM DUAL
3716 WHERE EXISTS (SELECT 1
3717 FROM pn_locations_all pnl
3718 WHERE pnl.location_code = x_location_code
3719 AND pnl.active_start_date = x_active_start_date
3720 AND pnl.active_end_date = NVL(x_active_end_date,g_end_of_time)
3721 AND ((x_location_id IS NULL) OR (pnl.location_id <> x_location_id))
3722 AND pnl.org_id = x_org_id
3723 );
3724
3725 BEGIN
3726
3727 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_location_code (+)');
3728
3729 OPEN loc_code_cur;
3730 FETCH loc_code_cur INTO l_dummy;
3731 CLOSE loc_code_cur;
3732
3733 IF l_dummy = 1 THEN
3734 fnd_message.set_name ('PN','PN_DUP_LOCATION_CODE');
3735 fnd_message.set_token('LOCATION_CODE', x_location_code);
3736 x_return_status := 'E';
3737 END IF;
3738
3739 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_location_code (-) ReturnStatus: '||x_return_status);
3740 END check_unique_location_code;
3741
3742
3743 /*============================================================================+
3744 -- NAME : check_unique_building
3745 -- DESCRIPTION : This procedure checks if building is unique.
3746 -- INVOKED FROM : forms libraries
3747 -- ARGUMENTS : IN : x_return_status, x_location_id, x_building,
3748 -- x_active_start_date, x_active_end_date
3749 -- RETURNS : NONE
3750 -- HISTORY :
3751 -- 24-Jun-05 piagrawa o Created
3752 -- IMPORTANT - Use this function once MOAC is enabled. All form libraries
3753 -- must call this.
3754 +============================================================================*/
3755 PROCEDURE check_unique_building (
3756 x_return_status IN OUT NOCOPY VARCHAR2,
3757 x_location_id NUMBER,
3758 x_building VARCHAR2,
3759 x_active_start_date DATE,
3760 x_active_end_date DATE,
3761 x_org_id NUMBER
3762 ) IS
3763 l_dummy NUMBER;
3764 CURSOR building_cur IS
3765 SELECT 1
3766 FROM DUAL
3767 WHERE EXISTS (SELECT 1
3768 FROM pn_locations_all pnl
3769 WHERE UPPER(pnl.building) = UPPER(x_building)
3770 AND ((x_location_id IS NULL) OR (pnl.location_id <> x_location_id))
3771 AND pnl.active_start_date <= x_active_start_date
3772 AND pnl.active_end_date >= x_active_end_date
3773 AND pnl.org_id = x_org_id
3774 );
3775
3776 BEGIN
3777
3778 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_building (+)');
3779
3780 OPEN building_cur;
3781 FETCH building_cur INTO l_dummy;
3782 CLOSE building_cur;
3783
3784 IF l_dummy = 1 THEN
3785 fnd_message.set_name ('PN','PN_DUP_BUILDING');
3786 fnd_message.set_token('BUILDING', x_building);
3787 x_return_status := 'E';
3788 END IF;
3789
3790 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_building (-) ReturnStatus: '||x_return_status);
3791 END check_unique_building;
3792
3793
3794 -------------------------------------------------------------------------------
3795 -- PROCEDURE : check_unique_building_alias
3796 -- PURPOSE : The function validates that the alias and hence the code
3797 -- of a building/land is unique.
3798 -- IN PARAM : Location alias, Location Type Lookup Code, Location ID
3799 -- History :
3800 -- 24-Jun-05 piagrawa o Created
3801 -- IMPORTANT - Use this function once MOAC is enabled. All form libraries
3802 -- must call this.
3803 -------------------------------------------------------------------------------
3804 FUNCTION check_unique_building_alias
3805 ( p_location_id NUMBER,
3806 p_location_alias VARCHAR2,
3807 p_location_type_lookup_code VARCHAR2,
3808 p_org_id NUMBER)
3809 RETURN BOOLEAN IS
3810
3811 l_dup_alias NUMBER;
3812 l_msg_name VARCHAR2(30);
3813 l_token VARCHAR2(30);
3814
3815 CURSOR dupAlias IS
3816 SELECT loc.location_id AS location_id
3817 FROM pn_locations_all loc
3818 WHERE loc.LOCATION_TYPE_LOOKUP_CODE = p_location_type_lookup_code
3819 AND loc.location_alias = p_location_alias
3820 AND loc.location_id <> NVL(p_location_id,-1)
3821 AND loc.org_id = p_org_id;
3822
3823 BEGIN
3824
3825 IF p_location_type_lookup_code IN ('BUILDING', 'LAND') THEN
3826 FOR i IN dupAlias LOOP
3827 l_dup_alias := i.location_id;
3828 END LOOP;
3829 END IF;
3830
3831 IF l_dup_alias IS NOT NULL THEN
3832 l_msg_name := 'PN_DUP_'||p_location_type_lookup_code||'_ALIAS';
3833 l_token := p_location_type_lookup_code||'_ALIAS';
3834 fnd_message.set_name('PN', l_msg_name);
3835 fnd_message.set_token(l_token, p_location_alias);
3836 RETURN FALSE;
3837 ELSE
3838 RETURN TRUE;
3839 END IF;
3840
3841 END check_unique_building_alias;
3842
3843 -------------------------------------------------------------------------------
3844 -- PROCDURE : check_unique_location_alias
3845 -- INVOKED FROM :
3846 -- PURPOSE : checks unique location alias
3847 -- HISTORY :
3848 -- 13-JUL-05 hrodda o Bug 4284035 - Replaced PN_LOCATION with _ALL table.
3849 -------------------------------------------------------------------------------
3850 PROCEDURE check_unique_location_alias (
3851 x_return_status IN OUT NOCOPY VARCHAR2,
3852 x_location_id NUMBER,
3853 x_parent_location_id NUMBER,
3854 x_location_type_lookup_code VARCHAR2,
3855 x_location_alias VARCHAR2,
3856 x_active_start_date DATE,
3857 x_active_end_date DATE,
3858 x_org_id NUMBER
3859 )
3860 IS
3861
3862 l_dummy NUMBER;
3863 l_set_name VARCHAR2(30);
3864 l_set_token VARCHAR2(30);
3865
3866 CURSOR loc_alias_cur IS
3867 SELECT 1
3868 FROM DUAL
3869 WHERE EXISTS (SELECT 1
3870 FROM pn_locations_all pnl
3871 WHERE pnl.location_alias = x_location_alias
3872 AND location_type_lookup_code = x_location_type_lookup_code
3873 AND ((x_location_id IS NULL) OR (pnl.location_id <> x_location_id))
3874 AND pnl.parent_location_id = x_parent_location_id
3875 AND pnl.active_start_date = x_active_start_date
3876 AND pnl.active_end_date = NVL(x_active_end_date,g_end_of_time)
3877 AND pnl.org_id = x_org_id
3878 );
3879
3880 BEGIN
3881
3882 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_location_alias (+)');
3883 pnp_debug_pkg.debug(' ChkUniAlis=> In Parameters :: LocAlias: '||x_location_alias||', LocId: '||x_location_id
3884 ||', Type: '||x_location_type_lookup_code);
3885 pnp_debug_pkg.debug(' ChkUniAlis=> ActStrDate : '||TO_CHAR(x_active_start_date, 'MM/DD/YYYY')
3886 ||', ActEndDate : '||TO_CHAR(x_active_end_date, 'MM/DD/YYYY'));
3887
3888 -- If the location alias is null then we don't need to check
3889 -- This will happen only for data created by the external system.
3890
3891 IF (x_location_alias IS NULL) THEN
3892 RETURN;
3893 END IF;
3894
3895 IF x_location_type_lookup_code IN ('BUILDING', 'LAND', 'FLOOR', 'PARCEL', 'OFFICE', 'SECTION') THEN
3896 l_set_name := 'PN_DUP_'||x_location_type_lookup_code||'_ALIAS';
3897 l_set_token := x_location_type_lookup_code||'_ALIAS';
3898 pnp_debug_pkg.debug(' ChkUniAlis> Duplicate');
3899 ELSE
3900 -- we should never reach this place
3901 x_return_status := 'E';
3902 END IF;
3903
3904 OPEN loc_alias_cur;
3905 FETCH loc_alias_cur INTO l_dummy;
3906 CLOSE loc_alias_cur;
3907
3908 IF l_dummy = 1 THEN
3909 fnd_message.set_name ('PN',l_set_name);
3910 fnd_message.set_token(l_set_token, x_location_alias);
3911 x_return_status := 'E';
3912 pnp_debug_pkg.debug(' ChkUniAlis> Error');
3913 END IF;
3914
3915 pnp_debug_pkg.debug('PNT_LOCATIONS_PKG.check_unique_location_alias (-) ReturnStatus: '||x_return_status);
3916
3917 END check_unique_location_alias;
3918
3919 /* --- CHANGED functions and procedures for MOAC END --- */
3920
3921 ---------------------------------------------------------------------------------------
3922 -- End of Pkg
3923 ---------------------------------------------------------------------------------------
3924 END PNT_LOCATIONS_PKG ;