[Home] [Help]
PACKAGE BODY: APPS.AHL_PRD_WORKORDER_PVT
Source
1 PACKAGE BODY AHL_PRD_WORKORDER_PVT AS
2 /* $Header: AHLVPRJB.pls 120.74.12020000.3 2012/12/17 07:33:07 jkjain ship $ */
3
4
5 G_PKG_NAME VARCHAR2(30) := 'AHL_PRD_WORKORDER_PVT';
6 G_DEBUG VARCHAR2(1) := AHL_DEBUG_PUB.is_log_enabled;
7
8 -- Operation Statuses
9 G_OP_STATUS_UNCOMPLETE VARCHAR2(2) := '2'; --Uncomplete
10 G_OP_STATUS_COMPLETE VARCHAR2(2) := '1'; --Complete
11
12 -- Job Statuses
13 G_JOB_STATUS_UNRELEASED VARCHAR2(2) := '1'; --Unreleased
14 G_JOB_STATUS_RELEASED VARCHAR2(2) := '3'; --Released
15 G_JOB_STATUS_COMPLETE VARCHAR2(2) := '4'; --Complete
16 G_JOB_STATUS_COMPLETE_NC VARCHAR2(2) := '5'; --Complete No Charges
17 G_JOB_STATUS_ON_HOLD VARCHAR2(2) := '6'; --On Hold
18 G_JOB_STATUS_CANCELLED VARCHAR2(2) := '7'; --Cancelled
19 G_JOB_STATUS_CLOSED VARCHAR2(2) := '12'; --Closed
20 G_JOB_STATUS_DRAFT VARCHAR2(2) := '17'; --Draft
21 G_JOB_STATUS_PARTS_HOLD VARCHAR2(2) := '19'; --Parts Hold
22 G_JOB_STATUS_QA_PENDING VARCHAR2(2) := '20'; --Pending QA Approval
23 G_JOB_STATUS_DEFERRAL_PENDING VARCHAR2(2) := '21'; --Pending Deferr
24 G_JOB_STATUS_DELETED VARCHAR2(2) := '22'; --Deleted
25
26 -- MR Statuses
27 G_MR_STATUS_SIGNED_OFF VARCHAR2(30) := 'ACCOMPLISHED'; --Signed Off
28 G_MR_STATUS_DEFERRED VARCHAR2(30) := 'DEFERRED'; --Deferred
29 G_MR_STATUS_DEFERRAL_PENDING VARCHAR2(30) := 'DEFERRAL_PENDING'; --Deferral Pending
30 G_MR_STATUS_TERMINATED VARCHAR2(30) := 'TERMINATED'; --Terminated
31 G_MR_STATUS_CANCELLED VARCHAR2(30) := 'CANCELLED'; --Cancelled
32 G_MR_STATUS_JOBS_CANCELLED VARCHAR2(30) := 'ALL_JOBS_CANCELLED'; --All Jobs Cancelled
33 G_CALLED_FROM VARCHAR2(30) := NULL; --When Called from VWP For Department Change
34
35 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- start
36 -- Constants added for performance improvement
37 G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
38 G_CURRENT_LOG_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
39 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- end
40 G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
41
42 -- MANESING::NR Analysis, 03-Jun-2011, added following type to be used within this Package Body
43 TYPE NUMBER_TBL_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
44
45 -- JKJain, NR Analysis and Forecasting
46 FUNCTION is_workorder_released
47 (
48 p_workorder_id IN NUMBER
49 ) RETURN BOOLEAN;
50
51 PROCEDURE get_uc_fleet_mntnc(
52 p_prd_workorder_rec IN prd_workorder_rec,
53 x_fleet_header_id OUT NOCOPY NUMBER,
54 x_uc_header_id OUT NOCOPY NUMBER,
55 x_nha_uc_header_id OUT NOCOPY NUMBER,
56 X_MAINTENANCE_TYPE_CODE OUT NOCOPY varchar2
57 );
58
59 FUNCTION get_date_and_time(p_date IN DATE,
60 p_date_hh24 IN VARCHAR2,
61 p_date_mi IN VARCHAR2,
62 p_date_ss IN VARCHAR2) RETURN DATE;
63
64 -- added to fix bug# 9130108/9075539
65 PROCEDURE cancel_visit_validate
66 (
67 p_visit_id IN NUMBER,
68 p_visit_number IN NUMBER,
69 x_cancel_flag OUT NOCOPY VARCHAR2
70 );
71
72 -- added for ER #9368251
73 PROCEDURE expand_mwo_dates(p_workorder_id IN NUMBER,
74 p_visit_id IN NUMBER);
75
76 PROCEDURE log_path(
77 x_output_dir OUT NOCOPY VARCHAR2
78
79 )
80 IS
81 l_full_path VARCHAR2(512);
82 l_new_full_path VARCHAR2(512);
83 l_file_dir VARCHAR2(512);
84
85 fileHandler UTL_FILE.FILE_TYPE;
86 fileName VARCHAR2(50);
87
88 l_flag NUMBER;
89 BEGIN
90 fileName:='test.log';--this is only a dummy filename to check if directory is valid or not
91
92
93 /* get output directory path from database */
94 SELECT value
95 INTO l_full_path
96 FROM v$parameter
97 WHERE name = 'utl_file_dir';
98
99 l_flag := 0;
100 --l_full_path contains a list of comma-separated directories
101 WHILE(TRUE)
102 LOOP
103 --get the first dir in the list
104 SELECT trim(substr(l_full_path, 1, decode(instr(l_full_path,',')-1,
105 -1, length(l_full_path),
106 instr(l_full_path, ',')-1
107 )
108 )
109 )
110 INTO l_file_dir
111 FROM dual;
112
113 -- check if the dir is valid
114 BEGIN
115 fileHandler := UTL_FILE.FOPEN(l_file_dir , filename, 'w');
116 l_flag := 1;
117 EXCEPTION
118 WHEN utl_file.invalid_path THEN
119 l_flag := 0;
120 WHEN utl_file.invalid_operation THEN
121 l_flag := 0;
122 END;
123
124 IF l_flag = 1 THEN --got a valid directory
125 utl_file.fclose(fileHandler);
126 EXIT;
127 END IF;
128
129 --earlier found dir was not a valid dir,
130 --so remove that from the list, and get the new list
131 l_new_full_path := trim(substr(l_full_path, instr(l_full_path, ',')+1, length(l_full_path)));
132
133 --if the new list has not changed, there are no more valid dirs left
134 IF l_full_path = l_new_full_path THEN
135 l_flag:=0;
136 EXIT;
137 END IF;
138 l_full_path := l_new_full_path;
139 END LOOP;
140
141
142 IF(l_flag=1) THEN --found a valid directory
143 x_output_dir := l_file_dir;
144
145 ELSE
146 x_output_dir:= null;
147
148 END IF;
149 EXCEPTION
150 WHEN OTHERS THEN
151 x_output_dir := null;
152
153 END log_path;
154 PROCEDURE set_eam_debug_params
155 (
156 x_debug OUT NOCOPY VARCHAR2,
157 x_output_dir OUT NOCOPY VARCHAR2,
158 x_debug_file_name OUT NOCOPY VARCHAR2,
159 x_debug_file_mode OUT NOCOPY VARCHAR2
160 )
161 AS
162 l_output_dir VARCHAR2(512);
163
164 BEGIN
165 x_debug := 'Y';
166
167 -- SELECT trim(substr(VALUE, 1, DECODE( instr( VALUE, ','), 0, length( VALUE), instr( VALUE, ',') -1 ) ) )
168 -- INTO x_output_dir
169 -- FROM V$PARAMETER
170 -- WHERE NAME = 'utl_file_dir';
171 --Call log path
172 log_path( x_output_dir => l_output_dir);
173 --
174 x_output_dir := l_output_dir;
175 x_debug_file_name := 'EAMDEBUG.log';
176 x_debug_file_mode := 'a';
177
178 IF ( G_DEBUG = 'Y' ) THEN
179 AHL_DEBUG_PUB.debug( 'Debug Log Directory Path:'||x_output_dir );
180 AHL_DEBUG_PUB.debug( 'Debug Log File Name:'||x_debug_file_name );
181 END IF;
182
183 END set_eam_debug_params;
184 -- End of Modification
185 PROCEDURE default_missing_attributes
186 (
187 p_x_prd_workorder_rec IN OUT NOCOPY prd_workorder_rec
188 )
189 As
190
191 CURSOR get_workorder_rec(c_workorder_id NUMBER)
192 is
193 SELECT *
194 FROM AHL_ALL_WORKORDERS_V
195 WHERE workorder_id=c_workorder_id;
196
197 l_prd_workorder_rec AHL_ALL_WORKORDERS_V%ROWTYPE;
198
199 -- MANESING::Bug 13998940, 26-Apr-2012, added following cursor
200 -- Cursor to fetch instance id for the given work order
201 CURSOR get_instance_id_csr (c_wip_entity_id NUMBER) IS
202 SELECT maintenance_object_id
203 FROM WIP_DISCRETE_JOBS
204 WHERE wip_entity_id = c_wip_entity_id;
205
206 -- added for bug# 8311856
207 -- In the case the Visit does not have a unit, it is always not guaranteed that the
208 -- inventory item id and instance id will be derived from the same task id.
209 -- So adding the inventory item Id derivation here based on instance id.
210 CURSOR get_inv_item_id (p_instance_id IN NUMBER) IS
211 SELECT inventory_item_id, serial_number
212 FROM csi_item_instances csi
213 WHERE csi.instance_id = p_instance_id;
214
215 BEGIN
216
217 p_x_prd_workorder_rec.DML_OPERATION := 'U';
218
219 OPEN get_workorder_rec(p_x_prd_workorder_rec.workorder_id);
220 FETCH get_workorder_rec INTO l_prd_workorder_rec;
221 IF get_workorder_rec%NOTFOUND THEN
222 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_WO_NOT_FOUND');
223 FND_MSG_PUB.ADD;
224 CLOSE get_workorder_rec;
225 RETURN;
226 END IF;
227 CLOSE get_workorder_rec;
228
229 -- added to fix bug# 8311856
230 -- for Visit MWO, derive inventory item and serial number from instance_id.
231 IF (l_prd_workorder_rec.VISIT_TASK_ID IS NULL AND l_prd_workorder_rec.inventory_item_id IS NULL) THEN
232
233 /* MANESING::Bug 13998940, 26-Apr-2012, For Component Visits,
234 * pick already existing item instance id from Visit Master WO record instead of View AHL_ALL_WORKORDERS_V
235 * which is used above for populating record l_prd_workorder_rec.
236 * The reason behind this is View AHL_ALL_WORKORDERS_V picks Visit's instance id first (null in case no Unit is
237 * associated) and if that is null, then picks instance id of 1st Visit task which could be non-serialized.
238 * Non-serialized instance cannot be used for Component Visit MWO as this causes issues while Returning the
239 * non-serialized instance due to an Open work order (Visit MWO).
240 * We have explicitly added a workaround to avoid having non-serialized instance in Visit MWO while its creation,
241 * hence the same instance should be used while updation as well.
242 */
243 IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (l_prd_workorder_rec.visit_id) = 'Y') THEN
244
245 OPEN get_instance_id_csr (l_prd_workorder_rec.wip_entity_id);
246 FETCH get_instance_id_csr INTO l_prd_workorder_rec.item_instance_id;
247 CLOSE get_instance_id_csr;
248
249 END IF;
250
251 OPEN get_inv_item_id(l_prd_workorder_rec.ITEM_INSTANCE_ID);
252 FETCH get_inv_item_id INTO l_prd_workorder_rec.inventory_item_id, l_prd_workorder_rec.serial_number;
253 CLOSE get_inv_item_id;
254
255 IF (G_DEBUG = 'Y') THEN
256 AHL_DEBUG_PUB.debug('Update Workorder: Defaulting Inv Item ID for Visit MWO:' || l_prd_workorder_rec.inventory_item_id);
257 AHL_DEBUG_PUB.debug('Update Workorder: Defaulting Serial Num for Visit MWO:' || l_prd_workorder_rec.serial_number);
258 END IF;
259 END IF;
260
261 IF G_CALLED_FROM = 'API' THEN
262 p_x_prd_workorder_rec.WIP_ENTITY_ID:=l_prd_workorder_rec.WIP_ENTITY_ID;
263 p_x_prd_workorder_rec.JOB_NUMBER:=l_prd_workorder_rec.JOB_NUMBER;
264 p_x_prd_workorder_rec.JOB_DESCRIPTION:=l_prd_workorder_rec.JOB_DESCRIPTION;
265
266 ELSE
267
268 IF p_x_prd_workorder_rec.WIP_ENTITY_ID= FND_API.G_MISS_NUM THEN
269 p_x_prd_workorder_rec.WIP_ENTITY_ID:=NULL;
270 ELSIF p_x_prd_workorder_rec.WIP_ENTITY_ID IS NULL THEN
271 p_x_prd_workorder_rec.WIP_ENTITY_ID:=l_prd_workorder_rec.WIP_ENTITY_ID;
272 END IF;
273
274 IF p_x_prd_workorder_rec.JOB_NUMBER= FND_API.G_MISS_CHAR THEN
275 p_x_prd_workorder_rec.JOB_NUMBER:=NULL;
276 ELSIF p_x_prd_workorder_rec.JOB_NUMBER IS NULL THEN
277 p_x_prd_workorder_rec.JOB_NUMBER:=l_prd_workorder_rec.JOB_NUMBER;
278 END IF;
279
280 IF p_x_prd_workorder_rec.JOB_DESCRIPTION= FND_API.G_MISS_CHAR THEN
281 p_x_prd_workorder_rec.JOB_DESCRIPTION:=NULL;
282 ELSIF p_x_prd_workorder_rec.JOB_DESCRIPTION IS NULL THEN
283 p_x_prd_workorder_rec.JOB_DESCRIPTION:=l_prd_workorder_rec.JOB_DESCRIPTION;
284 END IF;
285 END IF; --G_Called_from
286
287
288 IF p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER= FND_API.G_MISS_NUM THEN
289 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER:=NULL;
290 ELSIF p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER IS NULL THEN
291 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER:=l_prd_workorder_rec.OBJECT_VERSION_NUMBER;
292 END IF;
293
294
295 IF p_x_prd_workorder_rec.ORGANIZATION_ID= FND_API.G_MISS_NUM THEN
296 p_x_prd_workorder_rec.ORGANIZATION_ID:=NULL;
297 ELSIF p_x_prd_workorder_rec.ORGANIZATION_ID IS NULL THEN
298 p_x_prd_workorder_rec.ORGANIZATION_ID:=l_prd_workorder_rec.ORGANIZATION_ID;
299 END IF;
300
301
302
303 IF p_x_prd_workorder_rec.ORGANIZATION_NAME= FND_API.G_MISS_CHAR THEN
304 p_x_prd_workorder_rec.ORGANIZATION_NAME:=NULL;
305 ELSIF p_x_prd_workorder_rec.ORGANIZATION_NAME IS NULL THEN
306 p_x_prd_workorder_rec.ORGANIZATION_NAME:=l_prd_workorder_rec.ORGANIZATION_NAME;
307 END IF;
308
309 IF p_x_prd_workorder_rec.FIRM_PLANNED_FLAG= FND_API.G_MISS_NUM THEN
310 p_x_prd_workorder_rec.FIRM_PLANNED_FLAG:=NULL;
311 ELSIF p_x_prd_workorder_rec.FIRM_PLANNED_FLAG IS NULL THEN
312 p_x_prd_workorder_rec.FIRM_PLANNED_FLAG:=l_prd_workorder_rec.FIRM_PLANNED_FLAG;
313 END IF;
314
315 IF p_x_prd_workorder_rec.CLASS_CODE= FND_API.G_MISS_CHAR THEN
316 p_x_prd_workorder_rec.CLASS_CODE:=NULL;
317 ELSIF p_x_prd_workorder_rec.CLASS_CODE IS NULL THEN
318 p_x_prd_workorder_rec.CLASS_CODE:=l_prd_workorder_rec.CLASS_CODE;
319 END IF;
320
321 IF G_CALLED_FROM = 'API' THEN
322
323 IF p_x_prd_workorder_rec.DEPARTMENT_ID= FND_API.G_MISS_NUM THEN
324 p_x_prd_workorder_rec.DEPARTMENT_ID:=NULL;
325 ELSIF p_x_prd_workorder_rec.DEPARTMENT_ID IS NULL THEN
326 p_x_prd_workorder_rec.DEPARTMENT_ID:=l_prd_workorder_rec.DEPARTMENT_ID;
327 END IF;
328
329 ELSE
330
331 IF p_x_prd_workorder_rec.DEPARTMENT_NAME= FND_API.G_MISS_CHAR THEN
332 p_x_prd_workorder_rec.DEPARTMENT_NAME:=NULL;
333 ELSIF p_x_prd_workorder_rec.DEPARTMENT_NAME IS NULL THEN
334 p_x_prd_workorder_rec.DEPARTMENT_NAME:=l_prd_workorder_rec.DEPARTMENT_NAME;
335 END IF;
336
337 IF p_x_prd_workorder_rec.DEPARTMENT_ID= FND_API.G_MISS_NUM THEN
338 p_x_prd_workorder_rec.DEPARTMENT_ID:=NULL;
339 ELSIF p_x_prd_workorder_rec.DEPARTMENT_ID IS NULL THEN
340 p_x_prd_workorder_rec.DEPARTMENT_ID:=l_prd_workorder_rec.DEPARTMENT_ID;
341 END IF;
342
343 END IF;
344
345 IF p_x_prd_workorder_rec.STATUS_CODE= FND_API.G_MISS_CHAR THEN
346 p_x_prd_workorder_rec.STATUS_CODE:=NULL;
347 ELSIF p_x_prd_workorder_rec.STATUS_CODE IS NULL THEN
348 p_x_prd_workorder_rec.STATUS_CODE:=l_prd_workorder_rec.job_STATUS_CODE;
349 END IF;
350
351 IF p_x_prd_workorder_rec.STATUS_MEANING= FND_API.G_MISS_CHAR THEN
352 p_x_prd_workorder_rec.STATUS_MEANING:=NULL;
353 ELSIF p_x_prd_workorder_rec.STATUS_MEANING IS NULL THEN
354 p_x_prd_workorder_rec.STATUS_MEANING:=l_prd_workorder_rec.JOB_STATUS_MEANING;
355 END IF;
356
357 IF p_x_prd_workorder_rec.SCHEDULED_START_DATE=FND_API.G_MISS_DATE THEN
358 p_x_prd_workorder_rec.SCHEDULED_START_DATE:=NULL;
359 ELSIF p_x_prd_workorder_rec.SCHEDULED_START_DATE IS NULL THEN
360 p_x_prd_workorder_rec.SCHEDULED_START_DATE:=l_prd_workorder_rec.SCHEDULED_START_DATE;
361 END IF;
362
363 IF p_x_prd_workorder_rec.SCHEDULED_START_HR=FND_API.G_MISS_NUM THEN
364 p_x_prd_workorder_rec.SCHEDULED_START_HR:=NULL;
365 ELSIF p_x_prd_workorder_rec.SCHEDULED_START_HR IS NULL THEN
366 p_x_prd_workorder_rec.SCHEDULED_START_HR:=l_prd_workorder_rec.SCHEDULED_START_HR;
367 END IF;
368
369 IF p_x_prd_workorder_rec.SCHEDULED_START_MI=FND_API.G_MISS_NUM THEN
370 p_x_prd_workorder_rec.SCHEDULED_START_MI:=NULL;
371 ELSIF p_x_prd_workorder_rec.SCHEDULED_START_MI IS NULL THEN
372 p_x_prd_workorder_rec.SCHEDULED_START_MI:=l_prd_workorder_rec.SCHEDULED_START_MI;
373 END IF;
374
375 IF p_x_prd_workorder_rec.SCHEDULED_END_DATE=FND_API.G_MISS_DATE THEN
376 p_x_prd_workorder_rec.SCHEDULED_END_DATE:=NULL;
377 ELSIF p_x_prd_workorder_rec.SCHEDULED_END_DATE IS NULL THEN
378 p_x_prd_workorder_rec.SCHEDULED_END_DATE:=l_prd_workorder_rec.SCHEDULED_END_DATE;
379 END IF;
380
381 IF p_x_prd_workorder_rec.SCHEDULED_END_HR=FND_API.G_MISS_NUM THEN
382 p_x_prd_workorder_rec.SCHEDULED_END_HR:=NULL;
383 ELSIF p_x_prd_workorder_rec.SCHEDULED_END_HR IS NULL THEN
384 p_x_prd_workorder_rec.SCHEDULED_END_HR:=l_prd_workorder_rec.SCHEDULED_END_HR;
385 END IF;
386
387 IF p_x_prd_workorder_rec.SCHEDULED_END_MI=FND_API.G_MISS_NUM THEN
388 p_x_prd_workorder_rec.SCHEDULED_END_MI:=NULL;
389 ELSIF p_x_prd_workorder_rec.SCHEDULED_END_MI IS NULL THEN
390 p_x_prd_workorder_rec.SCHEDULED_END_MI:=l_prd_workorder_rec.SCHEDULED_END_MI;
391 END IF;
392
393 IF p_x_prd_workorder_rec.ACTUAL_START_DATE=FND_API.G_MISS_DATE THEN
394 p_x_prd_workorder_rec.ACTUAL_START_DATE:=NULL;
395 ELSIF p_x_prd_workorder_rec.ACTUAL_START_DATE IS NULL THEN
396 p_x_prd_workorder_rec.ACTUAL_START_DATE:=l_prd_workorder_rec.ACTUAL_START_DATE;
397 END IF;
398
399 IF p_x_prd_workorder_rec.ACTUAL_START_HR=FND_API.G_MISS_NUM THEN
400 p_x_prd_workorder_rec.ACTUAL_START_HR:=NULL;
401 ELSIF p_x_prd_workorder_rec.ACTUAL_START_HR IS NULL THEN
402 p_x_prd_workorder_rec.ACTUAL_START_HR:=l_prd_workorder_rec.ACTUAL_START_HR;
403 END IF;
404
405 IF p_x_prd_workorder_rec.ACTUAL_START_MI=FND_API.G_MISS_NUM THEN
406 p_x_prd_workorder_rec.ACTUAL_START_MI:=NULL;
407 ELSIF p_x_prd_workorder_rec.ACTUAL_START_MI IS NULL THEN
408 p_x_prd_workorder_rec.ACTUAL_START_MI:=l_prd_workorder_rec.ACTUAL_START_MI;
409 END IF;
410
411 IF p_x_prd_workorder_rec.ACTUAL_END_DATE=FND_API.G_MISS_DATE THEN
412 p_x_prd_workorder_rec.ACTUAL_END_DATE:=NULL;
413 ELSIF p_x_prd_workorder_rec.ACTUAL_END_DATE IS NULL THEN
414 p_x_prd_workorder_rec.ACTUAL_END_DATE:=l_prd_workorder_rec.ACTUAL_END_DATE;
415 END IF;
416
417 IF p_x_prd_workorder_rec.ACTUAL_END_HR=FND_API.G_MISS_NUM THEN
418 p_x_prd_workorder_rec.ACTUAL_END_HR:=NULL;
419 ELSIF p_x_prd_workorder_rec.ACTUAL_END_HR IS NULL THEN
420 p_x_prd_workorder_rec.ACTUAL_END_HR:=l_prd_workorder_rec.ACTUAL_END_HR;
421 END IF;
422
423 IF p_x_prd_workorder_rec.ACTUAL_END_MI=FND_API.G_MISS_NUM THEN
424 p_x_prd_workorder_rec.ACTUAL_END_MI:=NULL;
425 ELSIF p_x_prd_workorder_rec.ACTUAL_END_MI IS NULL THEN
426 p_x_prd_workorder_rec.ACTUAL_END_MI:=l_prd_workorder_rec.ACTUAL_END_MI;
427 END IF;
428
429 IF p_x_prd_workorder_rec.INVENTORY_ITEM_ID= FND_API.G_MISS_NUM THEN
430 p_x_prd_workorder_rec.INVENTORY_ITEM_ID:=NULL;
431 ELSIF p_x_prd_workorder_rec.INVENTORY_ITEM_ID IS NULL THEN
432 p_x_prd_workorder_rec.INVENTORY_ITEM_ID:=l_prd_workorder_rec.INVENTORY_ITEM_ID;
433 END IF;
434
435 IF p_x_prd_workorder_rec.ITEM_INSTANCE_ID= FND_API.G_MISS_NUM THEN
436 p_x_prd_workorder_rec.ITEM_INSTANCE_ID:=NULL;
437 ELSIF p_x_prd_workorder_rec.ITEM_INSTANCE_ID IS NULL THEN
438 p_x_prd_workorder_rec.ITEM_INSTANCE_ID:=l_prd_workorder_rec.ITEM_INSTANCE_ID;
439 END IF;
440
441 IF p_x_prd_workorder_rec.UNIT_NAME= FND_API.G_MISS_CHAR THEN
442 p_x_prd_workorder_rec.UNIT_NAME:=NULL;
443 ELSIF p_x_prd_workorder_rec.UNIT_NAME IS NULL THEN
444 p_x_prd_workorder_rec.UNIT_NAME:=l_prd_workorder_rec.UNIT_NAME;
445 END IF;
446
447 IF p_x_prd_workorder_rec.ITEM_INSTANCE_NUMBER= FND_API.G_MISS_CHAR THEN
448 p_x_prd_workorder_rec.ITEM_INSTANCE_NUMBER:=NULL;
449 ELSIF p_x_prd_workorder_rec.ITEM_INSTANCE_NUMBER IS NULL THEN
450 p_x_prd_workorder_rec.ITEM_INSTANCE_NUMBER:=l_prd_workorder_rec.ITEM_INSTANCE_NUMBER;
451 END IF;
452
453 IF p_x_prd_workorder_rec.QUANTITY= FND_API.G_MISS_NUM THEN
454 p_x_prd_workorder_rec.QUANTITY:=NULL;
455 ELSIF p_x_prd_workorder_rec.QUANTITY IS NULL THEN
456 p_x_prd_workorder_rec.QUANTITY:=l_prd_workorder_rec.QUANTITY;
457 END IF;
458
459 IF p_x_prd_workorder_rec.WO_PART_NUMBER= FND_API.G_MISS_CHAR THEN
460 p_x_prd_workorder_rec.WO_PART_NUMBER:=NULL;
461 ELSIF p_x_prd_workorder_rec.WO_PART_NUMBER IS NULL THEN
462 p_x_prd_workorder_rec.WO_PART_NUMBER:=l_prd_workorder_rec.WO_PART_NUMBER;
463 END IF;
464
465 IF p_x_prd_workorder_rec.ITEM_DESCRIPTION= FND_API.G_MISS_CHAR THEN
466 p_x_prd_workorder_rec.ITEM_DESCRIPTION:=NULL;
467 ELSIF p_x_prd_workorder_rec.ITEM_DESCRIPTION IS NULL THEN
468 p_x_prd_workorder_rec.ITEM_DESCRIPTION:=l_prd_workorder_rec.ITEM_DESCRIPTION;
469 END IF;
470
471 IF p_x_prd_workorder_rec.SERIAL_NUMBER= FND_API.G_MISS_CHAR THEN
472 p_x_prd_workorder_rec.SERIAL_NUMBER:=NULL;
473 ELSIF p_x_prd_workorder_rec.SERIAL_NUMBER IS NULL THEN
474 p_x_prd_workorder_rec.SERIAL_NUMBER:=l_prd_workorder_rec.SERIAL_NUMBER;
475 END IF;
476
477 IF p_x_prd_workorder_rec.ITEM_INSTANCE_UOM= FND_API.G_MISS_CHAR THEN
478 p_x_prd_workorder_rec.ITEM_INSTANCE_UOM:=NULL;
479 ELSIF p_x_prd_workorder_rec.ITEM_INSTANCE_UOM IS NULL THEN
480 p_x_prd_workorder_rec.ITEM_INSTANCE_UOM:=l_prd_workorder_rec.ITEM_INSTANCE_UOM;
481 END IF;
482
483 IF p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY= FND_API.G_MISS_CHAR THEN
484 p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY:=NULL;
485 ELSIF p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY IS NULL THEN
486 p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY:=l_prd_workorder_rec.COMPLETION_SUBINVENTORY;
487 END IF;
488
489 IF p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID= FND_API.G_MISS_NUM THEN
490 p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID:=NULL;
491 ELSIF p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID IS NULL THEN
492 p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID:=l_prd_workorder_rec.COMPLETION_LOCATOR_ID;
493 END IF;
494
495 IF p_x_prd_workorder_rec.VISIT_ID= FND_API.G_MISS_NUM THEN
496 p_x_prd_workorder_rec.VISIT_ID:=NULL;
497 ELSIF p_x_prd_workorder_rec.VISIT_ID IS NULL THEN
498 p_x_prd_workorder_rec.VISIT_ID:=l_prd_workorder_rec.VISIT_ID;
499 END IF;
500
501 IF p_x_prd_workorder_rec.VISIT_NUMBER= FND_API.G_MISS_NUM THEN
502 p_x_prd_workorder_rec.VISIT_NUMBER:=NULL;
503 ELSIF p_x_prd_workorder_rec.VISIT_NUMBER IS NULL THEN
504 p_x_prd_workorder_rec.VISIT_NUMBER:=l_prd_workorder_rec.VISIT_NUMBER;
505 END IF;
506
507 IF p_x_prd_workorder_rec.VISIT_NAME= FND_API.G_MISS_CHAR THEN
508 p_x_prd_workorder_rec.VISIT_NAME:=NULL;
509 ELSIF p_x_prd_workorder_rec.VISIT_NAME IS NULL THEN
510 p_x_prd_workorder_rec.VISIT_NAME:=l_prd_workorder_rec.VISIT_NAME;
511 END IF;
512
513 IF p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG= FND_API.G_MISS_CHAR THEN
514 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG:=NULL;
515 ELSIF p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG IS NULL THEN
516 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG:=l_prd_workorder_rec.MASTER_WORKORDER_FLAG;
517 END IF;
518
519 IF p_x_prd_workorder_rec.VISIT_TASK_ID= FND_API.G_MISS_NUM THEN
520 p_x_prd_workorder_rec.VISIT_TASK_ID:=NULL;
521 ELSIF p_x_prd_workorder_rec.VISIT_TASK_ID IS NULL THEN
522 p_x_prd_workorder_rec.VISIT_TASK_ID:=l_prd_workorder_rec.VISIT_TASK_ID;
523 END IF;
524
525 IF p_x_prd_workorder_rec.MR_HEADER_ID= FND_API.G_MISS_NUM THEN
526 p_x_prd_workorder_rec.MR_HEADER_ID:=NULL;
527 ELSIF p_x_prd_workorder_rec.MR_HEADER_ID IS NULL THEN
528 p_x_prd_workorder_rec.MR_HEADER_ID:=l_prd_workorder_rec.MR_HEADER_ID;
529 END IF;
530
531 IF p_x_prd_workorder_rec.VISIT_TASK_NUMBER= FND_API.G_MISS_NUM THEN
532 p_x_prd_workorder_rec.VISIT_TASK_NUMBER:=NULL;
533 ELSIF p_x_prd_workorder_rec.VISIT_TASK_NUMBER IS NULL THEN
534 p_x_prd_workorder_rec.VISIT_TASK_NUMBER:=l_prd_workorder_rec.VISIT_TASK_NUMBER;
535 END IF;
536
537 IF p_x_prd_workorder_rec.MR_TITLE= FND_API.G_MISS_CHAR THEN
538 p_x_prd_workorder_rec.MR_TITLE:=NULL;
539 ELSIF p_x_prd_workorder_rec.MR_TITLE IS NULL THEN
540 p_x_prd_workorder_rec.MR_TITLE:=l_prd_workorder_rec.MR_TITLE;
541 END IF;
542
543 IF p_x_prd_workorder_rec.SERVICE_ITEM_ID= FND_API.G_MISS_NUM THEN
544 p_x_prd_workorder_rec.SERVICE_ITEM_ID:=NULL;
545 ELSIF p_x_prd_workorder_rec.SERVICE_ITEM_ID IS NULL THEN
546 p_x_prd_workorder_rec.SERVICE_ITEM_ID:=l_prd_workorder_rec.SERVICE_ITEM_ID;
547 END IF;
548
549 IF p_x_prd_workorder_rec.SERVICE_ITEM_ORG_ID= FND_API.G_MISS_NUM THEN
550 p_x_prd_workorder_rec.SERVICE_ITEM_ORG_ID:=NULL;
551 ELSIF p_x_prd_workorder_rec.SERVICE_ITEM_ORG_ID IS NULL THEN
552 p_x_prd_workorder_rec.SERVICE_ITEM_ORG_ID:=l_prd_workorder_rec.SERVICE_ITEM_ORG_ID;
553 END IF;
554
555 IF p_x_prd_workorder_rec.SERVICE_ITEM_DESCRIPTION= FND_API.G_MISS_CHAR THEN
556 p_x_prd_workorder_rec.SERVICE_ITEM_DESCRIPTION:=NULL;
557 ELSIF p_x_prd_workorder_rec.SERVICE_ITEM_DESCRIPTION IS NULL THEN
558 p_x_prd_workorder_rec.SERVICE_ITEM_DESCRIPTION:=l_prd_workorder_rec.SERVICE_ITEM_DESCRIPTION;
559 END IF;
560
561 IF p_x_prd_workorder_rec.SERVICE_ITEM_NUMBER= FND_API.G_MISS_CHAR THEN
562 p_x_prd_workorder_rec.SERVICE_ITEM_NUMBER:=NULL;
563 ELSIF p_x_prd_workorder_rec.SERVICE_ITEM_NUMBER IS NULL THEN
564 p_x_prd_workorder_rec.SERVICE_ITEM_NUMBER:=l_prd_workorder_rec.SERVICE_ITEM_NUMBER;
565 END IF;
566
567 IF p_x_prd_workorder_rec.SERVICE_ITEM_UOM= FND_API.G_MISS_CHAR THEN
568 p_x_prd_workorder_rec.SERVICE_ITEM_UOM:=NULL;
569 ELSIF p_x_prd_workorder_rec.SERVICE_ITEM_UOM IS NULL THEN
570 p_x_prd_workorder_rec.SERVICE_ITEM_UOM:=l_prd_workorder_rec.SERVICE_ITEM_UOM;
571 END IF;
572
573 IF p_x_prd_workorder_rec.PROJECT_ID= FND_API.G_MISS_NUM THEN
574 p_x_prd_workorder_rec.PROJECT_ID:=NULL;
575 ELSIF p_x_prd_workorder_rec.PROJECT_ID IS NULL THEN
576 p_x_prd_workorder_rec.PROJECT_ID:=l_prd_workorder_rec.PROJECT_ID;
577 END IF;
578
579 IF p_x_prd_workorder_rec.PROJECT_TASK_ID= FND_API.G_MISS_NUM THEN
580 p_x_prd_workorder_rec.PROJECT_TASK_ID:=NULL;
581 ELSIF p_x_prd_workorder_rec.PROJECT_TASK_ID IS NULL THEN
582 p_x_prd_workorder_rec.PROJECT_TASK_ID:=l_prd_workorder_rec.PROJECT_TASK_ID;
583 END IF;
584
585 IF p_x_prd_workorder_rec.INCIDENT_ID= FND_API.G_MISS_NUM THEN
586 p_x_prd_workorder_rec.INCIDENT_ID:=NULL;
587 ELSIF p_x_prd_workorder_rec.INCIDENT_ID IS NULL THEN
588 p_x_prd_workorder_rec.INCIDENT_ID:=l_prd_workorder_rec.INCIDENT_ID;
589 END IF;
590
591 IF p_x_prd_workorder_rec.UNIT_EFFECTIVITY_ID= FND_API.G_MISS_NUM THEN
592 p_x_prd_workorder_rec.UNIT_EFFECTIVITY_ID:=NULL;
593 ELSIF p_x_prd_workorder_rec.UNIT_EFFECTIVITY_ID IS NULL THEN
594 p_x_prd_workorder_rec.UNIT_EFFECTIVITY_ID:=l_prd_workorder_rec.UNIT_EFFECTIVITY_ID;
595 END IF;
596
597 IF p_x_prd_workorder_rec.PLAN_ID= FND_API.G_MISS_NUM THEN
598 p_x_prd_workorder_rec.PLAN_ID:=NULL;
599 ELSIF p_x_prd_workorder_rec.PLAN_ID IS NULL THEN
600 p_x_prd_workorder_rec.PLAN_ID:=l_prd_workorder_rec.PLAN_ID;
601 END IF;
602
603 IF p_x_prd_workorder_rec.COLLECTION_ID= FND_API.G_MISS_NUM THEN
604 p_x_prd_workorder_rec.COLLECTION_ID:=NULL;
605 ELSIF p_x_prd_workorder_rec.COLLECTION_ID IS NULL THEN
606 p_x_prd_workorder_rec.COLLECTION_ID:=l_prd_workorder_rec.COLLECTION_ID;
607 END IF;
608
609 IF p_x_prd_workorder_rec.JOB_PRIORITY= FND_API.G_MISS_NUM THEN
610 p_x_prd_workorder_rec.JOB_PRIORITY:=NULL;
611 ELSIF p_x_prd_workorder_rec.JOB_PRIORITY IS NULL THEN
612 p_x_prd_workorder_rec.JOB_PRIORITY:=l_prd_workorder_rec.PRIORITY;
613 END IF;
614
615 IF p_x_prd_workorder_rec.JOB_PRIORITY_MEANING= FND_API.G_MISS_CHAR THEN
616 p_x_prd_workorder_rec.JOB_PRIORITY_MEANING:=NULL;
617 ELSIF p_x_prd_workorder_rec.JOB_PRIORITY_MEANING IS NULL THEN
618 p_x_prd_workorder_rec.JOB_PRIORITY_MEANING:=l_prd_workorder_rec.PRIORITY_MEANING;
619 END IF;
620
621 IF p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG = FND_API.G_MISS_CHAR THEN
622 p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG :=NULL;
623 ELSIF p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG IS NULL THEN
624 p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG :=l_prd_workorder_rec.CONFIRM_FAILURE_FLAG;
625 END IF;
626 IF p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY= FND_API.G_MISS_CHAR THEN
627 p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY:=NULL;
628 ELSIF p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY IS NULL THEN
629 p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY:=l_prd_workorder_rec.ATTRIBUTE_CATEGORY;
630 END IF;
631
632 IF p_x_prd_workorder_rec.ATTRIBUTE1= FND_API.G_MISS_CHAR THEN
633 p_x_prd_workorder_rec.ATTRIBUTE1:=NULL;
634 ELSIF p_x_prd_workorder_rec.ATTRIBUTE1 IS NULL THEN
635 p_x_prd_workorder_rec.ATTRIBUTE1:=l_prd_workorder_rec.ATTRIBUTE1;
636 END IF;
637
638 IF p_x_prd_workorder_rec.ATTRIBUTE2= FND_API.G_MISS_CHAR THEN
639 p_x_prd_workorder_rec.ATTRIBUTE2:=NULL;
640 ELSIF p_x_prd_workorder_rec.ATTRIBUTE2 IS NULL THEN
641 p_x_prd_workorder_rec.ATTRIBUTE2:=l_prd_workorder_rec.ATTRIBUTE2;
642 END IF;
643
644 IF p_x_prd_workorder_rec.ATTRIBUTE3= FND_API.G_MISS_CHAR THEN
645 p_x_prd_workorder_rec.ATTRIBUTE3:=NULL;
646 ELSIF p_x_prd_workorder_rec.ATTRIBUTE3 IS NULL THEN
647 p_x_prd_workorder_rec.ATTRIBUTE3:=l_prd_workorder_rec.ATTRIBUTE3;
648 END IF;
649
650 IF p_x_prd_workorder_rec.ATTRIBUTE4= FND_API.G_MISS_CHAR THEN
651 p_x_prd_workorder_rec.ATTRIBUTE4:=NULL;
652 ELSIF p_x_prd_workorder_rec.ATTRIBUTE4 IS NULL THEN
653 p_x_prd_workorder_rec.ATTRIBUTE4:=l_prd_workorder_rec.ATTRIBUTE4;
654 END IF;
655
656 IF p_x_prd_workorder_rec.ATTRIBUTE5= FND_API.G_MISS_CHAR THEN
657 p_x_prd_workorder_rec.ATTRIBUTE5:=NULL;
658 ELSIF p_x_prd_workorder_rec.ATTRIBUTE5 IS NULL THEN
659 p_x_prd_workorder_rec.ATTRIBUTE5:=l_prd_workorder_rec.ATTRIBUTE5;
660 END IF;
661
662 IF p_x_prd_workorder_rec.ATTRIBUTE6= FND_API.G_MISS_CHAR THEN
663 p_x_prd_workorder_rec.ATTRIBUTE6:=NULL;
664 ELSIF p_x_prd_workorder_rec.ATTRIBUTE6 IS NULL THEN
665 p_x_prd_workorder_rec.ATTRIBUTE6:=l_prd_workorder_rec.ATTRIBUTE6;
666 END IF;
667
668 IF p_x_prd_workorder_rec.ATTRIBUTE7= FND_API.G_MISS_CHAR THEN
669 p_x_prd_workorder_rec.ATTRIBUTE7:=NULL;
670 ELSIF p_x_prd_workorder_rec.ATTRIBUTE7 IS NULL THEN
671 p_x_prd_workorder_rec.ATTRIBUTE7:=l_prd_workorder_rec.ATTRIBUTE7;
672 END IF;
673
674 IF p_x_prd_workorder_rec.ATTRIBUTE8= FND_API.G_MISS_CHAR THEN
675 p_x_prd_workorder_rec.ATTRIBUTE8:=NULL;
676 ELSIF p_x_prd_workorder_rec.ATTRIBUTE8 IS NULL THEN
677 p_x_prd_workorder_rec.ATTRIBUTE8:=l_prd_workorder_rec.ATTRIBUTE8;
678 END IF;
679
680 IF p_x_prd_workorder_rec.ATTRIBUTE9= FND_API.G_MISS_CHAR THEN
681 p_x_prd_workorder_rec.ATTRIBUTE9:=NULL;
682 ELSIF p_x_prd_workorder_rec.ATTRIBUTE9 IS NULL THEN
683 p_x_prd_workorder_rec.ATTRIBUTE9:=l_prd_workorder_rec.ATTRIBUTE9;
684 END IF;
685
686 IF p_x_prd_workorder_rec.ATTRIBUTE10= FND_API.G_MISS_CHAR THEN
687 p_x_prd_workorder_rec.ATTRIBUTE10:=NULL;
688 ELSIF p_x_prd_workorder_rec.ATTRIBUTE10 IS NULL THEN
689 p_x_prd_workorder_rec.ATTRIBUTE10:=l_prd_workorder_rec.ATTRIBUTE10;
690 END IF;
691
692 IF p_x_prd_workorder_rec.ATTRIBUTE11= FND_API.G_MISS_CHAR THEN
693 p_x_prd_workorder_rec.ATTRIBUTE11:=NULL;
694 ELSIF p_x_prd_workorder_rec.ATTRIBUTE11 IS NULL THEN
695 p_x_prd_workorder_rec.ATTRIBUTE11:=l_prd_workorder_rec.ATTRIBUTE11;
696 END IF;
697
698 IF p_x_prd_workorder_rec.ATTRIBUTE12= FND_API.G_MISS_CHAR THEN
699 p_x_prd_workorder_rec.ATTRIBUTE12:=NULL;
700 ELSIF p_x_prd_workorder_rec.ATTRIBUTE12 IS NULL THEN
701 p_x_prd_workorder_rec.ATTRIBUTE12:=l_prd_workorder_rec.ATTRIBUTE12;
702 END IF;
703
704 IF p_x_prd_workorder_rec.ATTRIBUTE13= FND_API.G_MISS_CHAR THEN
705 p_x_prd_workorder_rec.ATTRIBUTE13:=NULL;
706 ELSIF p_x_prd_workorder_rec.ATTRIBUTE13 IS NULL THEN
707 p_x_prd_workorder_rec.ATTRIBUTE13:=l_prd_workorder_rec.ATTRIBUTE13;
708 END IF;
709
710 IF p_x_prd_workorder_rec.ATTRIBUTE14= FND_API.G_MISS_CHAR THEN
711 p_x_prd_workorder_rec.ATTRIBUTE14:=NULL;
712 ELSIF p_x_prd_workorder_rec.ATTRIBUTE14 IS NULL THEN
713 p_x_prd_workorder_rec.ATTRIBUTE14:=l_prd_workorder_rec.ATTRIBUTE14;
714 END IF;
715
716 IF p_x_prd_workorder_rec.ATTRIBUTE15= FND_API.G_MISS_CHAR THEN
717 p_x_prd_workorder_rec.ATTRIBUTE15:=NULL;
718 ELSIF p_x_prd_workorder_rec.ATTRIBUTE15 IS NULL THEN
719 p_x_prd_workorder_rec.ATTRIBUTE15:=l_prd_workorder_rec.ATTRIBUTE15;
720 END IF;
721
722 IF p_x_prd_workorder_rec.HOLD_REASON_CODE = FND_API.G_MISS_CHAR THEN
723 p_x_prd_workorder_rec.HOLD_REASON_CODE:=NULL;
724 ELSIF p_x_prd_workorder_rec.HOLD_REASON_CODE IS NULL THEN
725 p_x_prd_workorder_rec.HOLD_REASON_CODE:=l_prd_workorder_rec.HOLD_REASON_CODE;
726 END IF;
727
728 -- sansatpa - updating WO AOG flag for marshalling
729 IF p_x_prd_workorder_rec.AOG_FLAG = FND_API.G_MISS_CHAR THEN
730 p_x_prd_workorder_rec.AOG_FLAG:=NULL;
731 ELSIF p_x_prd_workorder_rec.AOG_FLAG IS NULL THEN
732 p_x_prd_workorder_rec.AOG_FLAG:=l_prd_workorder_rec.AOG_FLAG;
733 END IF;
734
735 /* IF p_x_prd_workorder_rec.SET_MR_PRIORITY = FND_API.G_MISS_CHAR THEN
736 p_x_prd_workorder_rec.SET_MR_PRIORITY:=NULL;
737 ELSIF p_x_prd_workorder_rec.SET_MR_PRIORITY IS NULL THEN
738 P_X_PRD_WORKORDER_REC.SET_MR_PRIORITY:=L_PRD_WORKORDER_REC.SET_MR_PRIORITY;
739 END IF;
740 -- sansatpa - updating WO AOG flag for marshalling
741 */
742 END default_missing_attributes;
743
744 PROCEDURE convert_values_to_ids
745 (
746 p_x_prd_workorder_rec IN OUT NOCOPY PRD_WORKORDER_REC
747 )
748 AS
749
750 CURSOR get_quantity(c_instance_id NUMBER)
751 IS
752 SELECT quantity
753 FROM CSI_ITEM_INSTANCES
754 WHERE instance_id=c_instance_id
755 AND TRUNC(SYSDATE) BETWEEN TRUNC(NVL(ACTIVE_START_DATE,SYSDATE))
756 AND TRUNC(NVL(ACTIVE_END_DATE,SYSDATE));
757
758 CURSOR get_department(c_dept VARCHAR2,c_org_id NUMBER)
759 IS
760 SELECT department_id
761 FROM BOM_DEPARTMENTS
762 WHERE UPPER(description) LIKE UPPER(c_dept)
763 AND ORganization_id=c_org_id
764 AND TRUNC(NVL(DISABLE_DATE,SYSDATE+1)) > TRUNC(SYSDATE);
765
766 -- bug 4143943
767 CURSOR get_wo_status(c_workorder_id NUMBER)
768 IS
769 SELECT STATUS_CODE
770 FROM AHL_WORKORDERS
771 WHERE workorder_id = c_workorder_id;
772
773 -- Balaji added for Release NR error
774 CURSOR get_wo_sch_sec(c_wip_entity_id IN NUMBER)
775 IS
776 SELECT
777 TO_CHAR(scheduled_start_date, 'ss') schedule_start_sec,
778 TO_CHAR(scheduled_completion_date, 'ss') schedule_end_sec
779 FROM
780 WIP_DISCRETE_JOBS
781 WHERE
782 WIP_ENTITY_ID = c_wip_entity_id;
783
784 -- Balaji added for Release NR error
785 CURSOR get_wo_act_sec(c_workorder_id IN NUMBER)
786 IS
787 SELECT
788 TO_CHAR(actual_start_date, 'ss') actual_start_sec,
789 TO_CHAR(actual_end_date, 'ss') actual_end_sec
790 FROM
791 AHL_WORKORDERS
792 WHERE
793 WORKORDER_ID = c_workorder_id;
794
795 -- FP bug# 7631453
796 CURSOR get_hold_reason_code_csr(c_hold_reason VARCHAR2)
797 IS
798 SELECT Lookup_code
799 FROM FND_LOOKUPS
800 WHERE lookup_type = 'AHL_PRD_WO_HOLD_REASON'
801 AND MEANING = c_hold_reason
802 AND NVL(start_date_active, SYSDATE - 1) <= SYSDATE
803 AND NVL(end_date_active, SYSDATE + 1) > SYSDATE
804 AND NVL(enabled_flag, 'Y') = 'Y';
805
806 -- End FP bug# 7631453
807
808 l_ctr NUMBER:=0;
809 --l_hour VARCHAR2(30);
810 --l_minutes VARCHAR2(30);
811 l_sec VARCHAR2(30);
812 --l_date_time VARCHAR2(30);
813 l_wo_status VARCHAR2(30);
814 l_sch_start_sec VARCHAR2(30);
815 l_sch_end_sec VARCHAR2(30);
816 l_act_start_sec VARCHAR2(30);
817 l_act_end_sec VARCHAR2(30);
818
819
820 BEGIN
821 IF p_x_prd_workorder_rec.dml_operation='C' THEN
822
823 IF p_x_prd_workorder_rec.QUANTITY IS NULL OR
824 p_x_prd_workorder_rec.QUANTITY=FND_API.G_MISS_CHAR THEN
825 OPEN get_quantity(p_x_prd_workorder_rec.ITEM_INSTANCE_ID);
826 FETCH get_quantity INTO p_x_prd_workorder_rec.QUANTITY;
827 CLOSE get_quantity;
828 END IF;
829
830 IF p_x_prd_workorder_rec.STATUS_CODE IS NULL OR
831 p_x_prd_workorder_rec.STATUS_CODE=FND_API.G_MISS_CHAR THEN
832 p_x_prd_workorder_rec.STATUS_CODE:=G_JOB_STATUS_UNRELEASED; -- Job_Status_Code '1' UnReleseed
833 END IF;
834
835 IF p_x_prd_workorder_rec.job_priority IS NULL OR
836 p_x_prd_workorder_rec.job_priority=FND_API.G_MISS_NUM THEN
837 p_x_prd_workorder_rec.job_priority:=NULL;
838 ELSIF p_x_prd_workorder_rec.job_priority IS not NULL AND
839 p_x_prd_workorder_rec.job_priority<>FND_API.G_MISS_NUM THEN
840
841 SELECT COUNT(*) INTO l_ctr
842 FROM MFG_LOOKUPS
843 WHERE lookup_type='WIP_EAM_ACTIVITY_PRIORITY'
844 AND lookup_code=p_x_prd_workorder_rec.job_priority;
845
846 IF l_ctr=0 THEN
847 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_PRIORITY_INVALID');
848 FND_MSG_PUB.ADD;
849 END IF;
850 END IF;
851
852 ELSIF p_x_prd_workorder_rec.dml_operation='U' THEN
853 IF p_x_prd_workorder_rec.job_priority IS NULL OR
854 p_x_prd_workorder_rec.job_priority=FND_API.G_MISS_NUM THEN
855 p_x_prd_workorder_rec.job_priority:=NULL;
856 END IF;
857
858 IF p_x_prd_workorder_rec.Department_Name IS not NULL AND
859 p_x_prd_workorder_rec.Department_Name<>FND_API.G_MISS_CHAR THEN
860
861 OPEN get_department(p_x_prd_workorder_rec.Department_Name,p_x_prd_workorder_rec.Organization_id);
862 FETCH get_department INTO p_x_prd_workorder_rec.department_id;
863
864 IF get_department%NOTFOUND THEN
865 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_INVALID');
866 FND_MSG_PUB.ADD;
867 END IF;
868 CLOSE get_department;
869 END IF;
870
871 END IF;
872 -- bug 4143943
873 -- if the existing workorder status is 17
874 -- that is the workorder is not being updated from the prod UI
875 -- but is coming from VWP Push to Prod,
876 -- then the scheduled start hr and min fields are not populated
877 -- and are already part of the start and end dates
878 -- so these should not be converted to 00:00
879
880 OPEN get_wo_status(p_x_prd_workorder_rec.workorder_id);
881 FETCH get_wo_status INTO l_wo_status;
882 CLOSE get_wo_status;
883
884 IF l_wo_status <> '17' THEN
885
886 -- portion of the code to get workorder seconds from the DB.
887 -- These values will be used in case if its not passed from the UI
888 OPEN get_wo_sch_sec(p_x_prd_workorder_rec.wip_entity_id);
889 FETCH get_wo_sch_sec INTO l_sch_start_sec, l_sch_end_sec;
890 CLOSE get_wo_sch_sec;
891
892 IF p_x_prd_workorder_rec.SCHEDULED_START_DATE IS NOT NULL AND
893 p_x_prd_workorder_rec.SCHEDULED_START_DATE <> FND_API.G_MISS_DATE
894 AND G_CALLED_FROM <> 'OAF' THEN
895
896 -- Fix for error while releasing unreleased workorders
897 -- the seconds value needs to be taken into account for workorders, otherwise
898 -- this might lead to a discrepancy with the operation dates
899 l_sec := TO_CHAR(p_x_prd_workorder_rec.SCHEDULED_START_DATE, 'ss');
900 IF(l_sec = '00') THEN
901 l_sec := l_sch_start_sec;
902 END IF;
903 p_x_prd_workorder_rec.SCHEDULED_START_DATE :=
904 get_date_and_time
905 (p_date => p_x_prd_workorder_rec.SCHEDULED_START_DATE,
906 p_date_hh24 => p_x_prd_workorder_rec.SCHEDULED_START_HR,
907 p_date_mi => p_x_prd_workorder_rec.SCHEDULED_START_MI,
908 p_date_ss => l_sec);
909
910 END IF;
911 IF ( G_DEBUG = 'Y' ) THEN
912 AHL_DEBUG_PUB.debug( 'p_x_prd_workorder_rec.SCHEDULED_START_DATE : ' || to_char(p_x_prd_workorder_rec.SCHEDULED_START_DATE,'DD-MON-YY hh24:mi:ss') );
913 END IF;
914
915 IF p_x_prd_workorder_rec.SCHEDULED_END_DATE IS NOT NULL AND
916 p_x_prd_workorder_rec.SCHEDULED_END_DATE <> FND_API.G_MISS_DATE
917 AND G_CALLED_FROM <> 'OAF' THEN
918
919 -- Fix for error while releasing unreleased workorders
920 -- the seconds value needs to be taken into account for workorders, otherwise
921 -- this might lead to a discrepancy with the operation dates
922 l_sec := TO_CHAR(p_x_prd_workorder_rec.SCHEDULED_END_DATE, 'ss');
923
924 IF(l_sec = '00') THEN
925 l_sec := l_sch_end_sec;
926 END IF;
927
928 p_x_prd_workorder_rec.SCHEDULED_END_DATE :=
929 get_date_and_time
930 (p_date => p_x_prd_workorder_rec.SCHEDULED_END_DATE,
931 p_date_hh24 => p_x_prd_workorder_rec.SCHEDULED_END_HR,
932 p_date_mi => p_x_prd_workorder_rec.SCHEDULED_END_MI,
933 p_date_ss => l_sec);
934
935
936
937 END IF;
938 IF ( G_DEBUG = 'Y' ) THEN
939 AHL_DEBUG_PUB.debug( 'p_x_prd_workorder_rec.SCHEDULED_END_DATE : ' || to_char(p_x_prd_workorder_rec.SCHEDULED_END_DATE,'DD-MON-YY hh24:mi:ss') );
940 END IF;
941 END IF; -- l_wo_status <> '17'
942
943 -- portion of the code to get workorder seconds from the DB.
944 -- These values will be used in case if its not passed from the UI
945 -- Balaji added for Release NR error
946 OPEN get_wo_act_sec(p_x_prd_workorder_rec.workorder_id);
947 FETCH get_wo_act_sec INTO l_act_start_sec, l_act_end_sec;
948 CLOSE get_wo_act_sec;
949
950 IF p_x_prd_workorder_rec.ACTUAL_START_DATE IS NOT NULL AND
951 p_x_prd_workorder_rec.ACTUAL_START_DATE <> FND_API.G_MISS_DATE
952 AND G_CALLED_FROM <> 'OAF' THEN
953
954 l_sec := TO_CHAR(p_x_prd_workorder_rec.ACTUAL_START_DATE, 'ss');
955
956 -- Balaji added for Release NR error
957 IF(l_sec = '00') THEN
958 l_sec := l_act_start_sec;
959 END IF;
960 p_x_prd_workorder_rec.ACTUAL_START_DATE :=
961 get_date_and_time
962 (p_date => p_x_prd_workorder_rec.ACTUAL_START_DATE,
963 p_date_hh24 => p_x_prd_workorder_rec.ACTUAL_START_HR,
964 p_date_mi => p_x_prd_workorder_rec.ACTUAL_START_MI,
965 p_date_ss => l_sec);
966 IF ( G_DEBUG = 'Y' ) THEN
967 AHL_DEBUG_PUB.debug( 'p_x_prd_workorder_rec.ACTUAL_START_DATE : ' || to_char(p_x_prd_workorder_rec.ACTUAL_START_DATE,'DD-MON-YY hh24:mi:ss') );
968 END IF;
969
970 END IF;
971
972 IF p_x_prd_workorder_rec.ACTUAL_END_DATE IS NOT NULL AND
973 p_x_prd_workorder_rec.ACTUAL_END_DATE <> FND_API.G_MISS_DATE
974 AND G_CALLED_FROM <> 'OAF' THEN
975
976 l_sec := TO_CHAR(p_x_prd_workorder_rec.ACTUAL_END_DATE, 'ss');
977
978 -- Balaji added for Release NR error
979 IF(l_sec = '00') THEN
980 l_sec := l_act_end_sec;
981 END IF;
982 p_x_prd_workorder_rec.ACTUAL_END_DATE :=
983 get_date_and_time
984 (p_date => p_x_prd_workorder_rec.ACTUAL_END_DATE,
985 p_date_hh24 => p_x_prd_workorder_rec.ACTUAL_END_HR,
986 p_date_mi => p_x_prd_workorder_rec.ACTUAL_END_MI,
987 p_date_ss => l_sec);
988 IF ( G_DEBUG = 'Y' ) THEN
989 AHL_DEBUG_PUB.debug( 'p_x_prd_workorder_rec.ACTUAL_START_DATE : ' || to_char(p_x_prd_workorder_rec.ACTUAL_END_DATE,'DD-MON-YY hh24:mi:ss') );
990 END IF;
991
992 END IF;
993
994 -- FP bug# 7631453
995 IF (p_x_prd_workorder_rec.HOLD_REASON_CODE IS NULL OR G_CALLED_FROM <> 'API' OR G_CALLED_FROM IS NULL) THEN
996 IF p_x_prd_workorder_rec.HOLD_REASON IS NOT NULL AND p_x_prd_workorder_rec.HOLD_REASON <> FND_API.G_MISS_CHAR THEN
997 OPEN get_hold_reason_code_csr(p_x_prd_workorder_rec.HOLD_REASON);
998 FETCH get_hold_reason_code_csr INTO p_x_prd_workorder_rec.HOLD_REASON_CODE;
999 IF get_hold_reason_code_csr%NOTFOUND THEN
1000 FND_MESSAGE.SET_NAME('AHL','AHL_PP_REASON_INVALID');
1001 FND_MSG_PUB.ADD;
1002 END IF;
1003 CLOSE get_hold_reason_code_csr;
1004 END IF;
1005 END IF;
1006
1007 END convert_values_to_ids;
1008
1009 FUNCTION is_wo_updated(p_prd_workorder_rec IN PRD_WORKORDER_REC)
1010 RETURN BOOLEAN
1011 AS
1012
1013 CURSOR get_old_wo_values(c_workorder_id NUMBER)
1014 IS
1015 SELECT AWOS.CONFIRM_FAILURE_FLAG,
1016 AWOS.ACTUAL_START_DATE,
1017 AWOS.ACTUAL_END_DATE,
1018 WIP.SCHEDULED_START_DATE,
1019 WIP.SCHEDULED_COMPLETION_DATE,
1020 WIP.OWNING_DEPARTMENT
1021 FROM AHL_WORKORDERS AWOS,
1022 WIP_DISCRETE_JOBS WIP
1023 WHERE AWOS.WIP_ENTITY_ID = WIP.WIP_ENTITY_ID
1024 AND AWOS.workorder_id = c_workorder_id;
1025
1026 l_old_workorder_rec get_old_wo_values%ROWTYPE;
1027
1028 BEGIN
1029
1030 OPEN get_old_wo_values(p_prd_workorder_rec.workorder_id);
1031 FETCH get_old_wo_values INTO l_old_workorder_rec;
1032 CLOSE get_old_wo_values;
1033
1034 IF p_prd_workorder_rec.confirm_failure_flag <> l_old_workorder_rec.confirm_failure_flag THEN
1035 RETURN TRUE;
1036 ELSIF p_prd_workorder_rec.actual_start_date <> l_old_workorder_rec.actual_start_date THEN
1037 RETURN TRUE;
1038 ELSIF p_prd_workorder_rec.actual_end_date <> l_old_workorder_rec.actual_end_date THEN
1039 RETURN TRUE;
1040 ELSIF p_prd_workorder_rec.scheduled_start_date <> l_old_workorder_rec.scheduled_start_date THEN
1041 RETURN TRUE;
1042 ELSIF p_prd_workorder_rec.scheduled_end_date <> l_old_workorder_rec.scheduled_completion_date THEN
1043 RETURN TRUE;
1044 ELSIF p_prd_workorder_rec.department_id <> l_old_workorder_rec.owning_department THEN
1045 RETURN TRUE;
1046 END IF;
1047
1048 RETURN FALSE;
1049
1050
1051 END is_wo_updated;
1052
1053 PROCEDURE validate_workorder
1054 (
1055 p_prd_workorder_rec IN PRD_WORKORDER_REC,
1056 p_wip_load_flag IN VARCHAR2
1057 )
1058 as
1059
1060 CURSOR get_lookup_type_code(c_lookup_code VARCHAR2,c_lookup_type VARCHAR2)
1061 IS
1062 SELECT lookup_code
1063 FROM FND_LOOKUP_VALUES_VL
1064 WHERE lookup_code = c_lookup_code
1065 AND lookup_type = c_lookup_type
1066 AND SYSDATE BETWEEN NVL(start_date_active,SYSDATE)
1067 AND NVL(end_date_active,SYSDATE)
1068 AND nvl(ENABLED_FLAG,'Y') = 'Y';
1069
1070 CURSOR validate_org(c_org_id NUMBER)
1071 IS
1072
1073 /* Perf. fix for bug# 4949394. Replace ORG_ORGANIZATION_DEFINITIONS
1074 with INV_ORGANIZATION_NAME_V.
1075 SELECT a.organization_id,
1076 b.eam_enabled_flag
1077 FROM ORG_ORGANIZATION_DEFINITIONS a,MTL_PARAMETERS b
1078 WHERE a.organization_id=b.organization_id
1079 AND a.organization_id=c_org_id;
1080 */
1081
1082 SELECT a.organization_id,
1083 b.eam_enabled_flag
1084 FROM INV_ORGANIZATION_NAME_V a,MTL_PARAMETERS b
1085 WHERE a.organization_id=b.organization_id
1086 AND a.organization_id=c_org_id;
1087
1088 l_org_rec validate_org%ROWTYPE;
1089
1090 CURSOR validate_dept(c_dept_id NUMBER,c_org_id NUMBER)
1091 IS
1092 SELECT a.department_id
1093 FROM BOM_DEPARTMENTS a
1094 WHERE a.department_id=c_dept_id
1095 AND a.organization_id=c_org_id
1096 AND TRUNC(NVL(DISABLE_DATE,SYSDATE+1)) > TRUNC(SYSDATE);
1097
1098 CURSOR validate_item_instance(c_inv_item_id NUMBER,c_inst_id NUMBER)
1099 IS
1100 SELECT a.instance_id
1101 FROM CSI_ITEM_INSTANCES a
1102 WHERE a.inventory_item_id=c_inv_item_id
1103 AND a.instance_id=c_inst_id;
1104
1105 l_instance_rec validate_item_instance%ROWTYPE;
1106
1107 CURSOR validate_subinventory(c_org_id NUMBER,c_sub_inv VARCHAR2)
1108 IS
1109 SELECT a.organization_id,
1110 a.secondary_inventory,
1111 b.eam_enabled_flag
1112 FROM MTL_ITEM_SUB_INVENTORIES a,
1113 MTL_PARAMETERS b
1114 WHERE a.organization_id=b.organization_id
1115 AND a.organization_id=c_org_id
1116 AND a.secondary_inventory=c_sub_inv;
1117
1118 l_subinv_rec validate_subinventory%ROWTYPE;
1119
1120 CURSOR get_visit_task_name(c_visit_task_id NUMBER)
1121 IS
1122 SELECT visit_task_name
1123 FROM AHL_VISIT_TASKS_VL
1124 WHERE visit_task_id=c_visit_task_id;
1125
1126 CURSOR validate_project(C_org_id NUMBER)
1127 IS
1128 SELECT 1
1129 FROM MTL_PARAMETERS mpr
1130 WHERE mpr.organization_id=c_org_id
1131 AND NVL(mpr.project_reference_enabled,2)=1;
1132
1133 CURSOR get_visit_wo_dates(c_visit_id NUMBER)
1134 IS
1135 SELECT WDJ.scheduled_start_date,
1136 WDJ.scheduled_completion_date
1137 FROM WIP_DISCRETE_JOBS WDJ,
1138 AHL_WORKORDERS WO
1139 WHERE WDJ.wip_entity_id = WO.wip_entity_id
1140 AND WO.visit_task_id IS NULL
1141 AND WO.master_workorder_flag = 'Y'
1142 AND WO.visit_id = c_visit_id;
1143
1144 -- bug4393092
1145 CURSOR get_wo_status(c_workorder_id VARCHAR2)
1146 IS
1147 SELECT AWOS.status_code,
1148 FNDL.meaning
1149 FROM AHL_WORKORDERS AWOS,
1150 FND_LOOKUP_VALUES_VL FNDL
1151 WHERE AWOS.WORKORDER_ID = c_workorder_id
1152 AND FNDL.lookup_type = 'AHL_JOB_STATUS'
1153 AND FNDL.lookup_code(+) = AWOS.status_code;
1154 -- cursor to retrieve minimum actual start date and maximum actual
1155 -- end date from all the operations within this workorder
1156 -- Balaji added for the bug where actual operation dates fall outside
1157 -- workorder dates
1158 CURSOR c_get_op_actual_dates(c_workorder_id NUMBER)
1159 IS
1160 SELECT MIN(ACTUAL_START_DATE),
1161 MAX(ACTUAL_END_DATE)
1162 FROM AHL_WORKORDER_OPERATIONS
1163 WHERE WORKORDER_ID = c_workorder_id;
1164
1165
1166
1167 l_dummy_ctr NUMBER:=0;
1168 l_lookup_code VARCHAR2(30);
1169 l_record_str VARCHAR2(80);
1170 l_visit_start_date DATE;
1171 l_visit_end_date DATE;
1172
1173 l_return_status VARCHAR2(1);
1174 l_wo_status VARCHAR2(80);
1175 l_wo_status_code VARCHAR2(30);
1176 l_op_min_act_start_date DATE;
1177 l_op_max_act_end_date DATE;
1178 l_dummy VARCHAR2(1);
1179
1180 --JKJain, Bug 12593041
1181 CURSOR validate_acc_class_code( c_wip_acc_class_code VARCHAR2, c_organization_id NUMBER)
1182 IS
1183 select 'x'
1184 from WIP_ACCOUNTING_CLASSES
1185 where class_code = c_wip_acc_class_code
1186 and organization_id = c_organization_id
1187 and class_type = 6
1188 AND TRUNC(NVL(DISABLE_DATE,SYSDATE+1)) > TRUNC(SYSDATE);
1189
1190 BEGIN
1191
1192 IF p_prd_workorder_rec.DML_OPERATION='C' THEN
1193 IF p_prd_workorder_rec.VISIT_TASK_ID IS NOT NULL THEN
1194 OPEN get_visit_task_name(p_prd_workorder_rec.VISIT_TASK_ID);
1195 FETCH get_visit_task_name INTO l_record_str;
1196 CLOSE get_visit_task_name;
1197 ELSE
1198 l_record_str := p_prd_workorder_rec.VISIT_NAME;
1199 END IF;
1200 ELSE
1201 l_record_str:=p_prd_workorder_rec.JOB_NUMBER;
1202 END IF;
1203
1204 IF p_prd_workorder_rec.DML_OPERATION = 'U' THEN
1205 -- bug 4393092
1206 IF is_wo_updated(p_prd_workorder_rec) = TRUE THEN
1207 OPEN get_wo_status(p_prd_workorder_rec.workorder_id);
1208 FETCH get_wo_status INTO l_wo_status_code, l_wo_status;
1209 CLOSE get_wo_status;
1210 IF l_wo_status_code IN ('22','7','12','4','5') THEN
1211 FND_MESSAGE.set_name('AHL','AHL_PRD_UPD_WO_STS');
1212 FND_MESSAGE.set_token('WO_STATUS', l_wo_status);
1213 FND_MSG_PUB.add;
1214 RAISE FND_API.G_EXC_ERROR;
1215 END IF; -- IF l_wo_status_code IN ('22','7','12','4','5') THEN
1216 END IF; -- IF is_wo_updated = TRUE THEN
1217 END IF; -- IF p_prd_workorder_rec.DML_OPERATION = 'U' THEN
1218
1219
1220 -- rroy
1221 -- ACL Changes
1222 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => NULL,
1223 p_ue_id => NULL,
1224 p_visit_id => NULL,
1225 p_item_instance_id => p_prd_workorder_rec.item_instance_id);
1226 IF l_return_status = FND_API.G_TRUE THEN
1227 IF p_prd_workorder_rec.DML_OPERATION='C' THEN
1228 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_CRT_WO_UNTLCKD');
1229 ELSE
1230 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_UPD_WO_UNTLCKD');
1231 END IF;
1232 FND_MSG_PUB.ADD;
1233 RAISE FND_API.G_EXC_ERROR;
1234 END IF;
1235 -- rroy
1236 -- ACL Changes
1237
1238
1239 SELECT COUNT(*)
1240 INTO l_dummy_ctr
1241 FROM WIP_EAM_PARAMETERS
1242 WHERE organization_id=p_prd_workorder_rec.ORGANIZATION_ID;
1243
1244 IF l_dummy_ctr=0 THEN
1245 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_EAM_PREFIX_NOTSETUP');
1246 FND_MESSAGE.SET_TOKEN('ORG',p_prd_workorder_rec.ORGANIZATION_ID,false);
1247 FND_MSG_PUB.ADD;
1248 RETURN;
1249 END IF;
1250
1251 IF p_prd_workorder_rec.SCHEDULED_START_DATE IS NULL OR
1252 p_prd_workorder_rec.SCHEDULED_START_DATE=FND_API.G_MISS_DATE THEN
1253 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHED_ST_DT_NULL');
1254 FND_MSG_PUB.ADD;
1255 END IF;
1256
1257 IF p_prd_workorder_rec.SCHEDULED_END_DATE IS NULL OR
1258 p_prd_workorder_rec.SCHEDULED_END_DATE=FND_API.G_MISS_DATE THEN
1259 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHED_END_DT_NULL');
1260 FND_MSG_PUB.ADD;
1261 END IF;
1262
1263 IF p_prd_workorder_rec.SCHEDULED_START_DATE IS NOT NULL AND
1264 p_prd_workorder_rec.SCHEDULED_START_DATE<>FND_API.G_MISS_DATE AND
1265 p_prd_workorder_rec.SCHEDULED_END_DATE IS NOT NULL AND
1266 p_prd_workorder_rec.SCHEDULED_END_DATE<>FND_API.G_MISS_DATE THEN
1267
1268 IF p_prd_workorder_rec.SCHEDULED_START_DATE > p_prd_workorder_rec.SCHEDULED_END_DATE THEN
1269 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHD_STDT_GT_SCHD_DATE');
1270 FND_MSG_PUB.ADD;
1271 END IF;
1272
1273 /*Jun 3rd 2011: commented out validation as this is not required with PS integration
1274 IF p_prd_workorder_rec.VISIT_TASK_ID IS NOT NULL AND
1275 p_wip_load_flag = 'Y' THEN
1276 OPEN get_visit_wo_dates( p_prd_workorder_rec.visit_id );
1277 FETCH get_visit_wo_dates
1278 INTO l_visit_start_date,
1279 l_visit_end_date;
1280 CLOSE get_visit_wo_dates;
1281
1282 -- as per mail from shailaja dtd tue,21 sep 2004,
1283 -- Re: [Fwd: Re: Reschedule Visit Jobs after Visit Planned Start/End time change]
1284 -- the workorder dates on the production ui's should be compared only with the visit master
1285 -- workorder dates
1286 IF ( p_prd_workorder_rec.SCHEDULED_START_DATE < l_visit_start_date OR
1287 p_prd_workorder_rec.SCHEDULED_END_DATE > l_visit_end_date ) THEN
1288 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHD_DT_EXCEEDS_VISIT');
1289 FND_MESSAGE.SET_TOKEN('START_DT', TO_CHAR( l_visit_start_date, 'DD-MON-YYYY HH24:MI' ),false);
1290 FND_MESSAGE.SET_TOKEN('END_DT', TO_CHAR( l_visit_end_date, 'DD-MON-YYYY HH24:MI' ),false);
1291 FND_MSG_PUB.ADD;
1292 END IF;
1293 END IF;*/
1294
1295 END IF;
1296
1297 IF p_prd_workorder_rec.ORGANIZATION_ID IS NULL OR
1298 p_prd_workorder_rec.ORGANIZATION_ID=FND_API.G_MISS_NUM THEN
1299 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ORGID_NULL');
1300 FND_MSG_PUB.ADD;
1301 ELSE
1302 OPEN validate_org(p_prd_workorder_rec.ORGANIZATION_ID);
1303 FETCH validate_org INTO l_org_rec;
1304 IF validate_org%NOTFOUND THEN
1305 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ORG_ID_INVALID');
1306 FND_MSG_PUB.ADD;
1307 ELSIF validate_org%FOUND AND l_org_rec.eam_enabled_flag='N' THEN
1308 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ORG_ID_not_eam_enabled');
1309 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1310 FND_MSG_PUB.ADD;
1311 END IF;
1312 CLOSE validate_org;
1313 END IF;
1314
1315 IF p_prd_workorder_rec.DEPARTMENT_ID IS NULL OR
1316 p_prd_workorder_rec.DEPARTMENT_ID=FND_API.G_MISS_NUM THEN
1317 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_ID_NULL');
1318 FND_MSG_PUB.ADD;
1319 ELSE
1320 OPEN validate_dept(p_prd_workorder_rec.Department_id, p_prd_workorder_rec.Organization_id);
1321 FETCH validate_dept INTO l_dummy_ctr;
1322 IF validate_dept%NOTFOUND THEN
1323 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPTID_INVALID');
1324 FND_MESSAGE.SET_TOKEN('TASK_JOB',l_record_str,false);
1325 FND_MESSAGE.SET_TOKEN('ORG',p_prd_workorder_rec.Organization_id,false);
1326 FND_MSG_PUB.ADD;
1327 END IF;
1328 CLOSE validate_dept;
1329 END IF;
1330
1331 IF p_prd_workorder_rec.ITEM_INSTANCE_ID IS NULL OR
1332 p_prd_workorder_rec.ITEM_INSTANCE_ID=FND_API.G_MISS_NUM THEN
1333 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ITMINSTID_NULL');
1334 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1335 FND_MSG_PUB.ADD;
1336 ELSE
1337 OPEN validate_item_instance(p_prd_workorder_rec.inventory_item_id, p_prd_workorder_rec.item_instance_id);
1338 FETCH validate_item_instance INTO l_instance_rec;
1339 IF validate_item_instance%NOTFOUND THEN
1340 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ITMINSTID_INVALID');
1341 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1342 FND_MSG_PUB.ADD;
1343 END IF;
1344 CLOSE validate_item_instance;
1345 END IF;
1346
1347 IF p_prd_workorder_rec.STATUS_CODE IS NULL OR
1348 p_prd_workorder_rec.STATUS_CODE=FND_API.G_MISS_CHAR THEN
1349 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_STATUS_CODE_INVALID');
1350 FND_MSG_PUB.ADD;
1351 ELSE
1352 OPEN get_lookup_type_code(p_prd_workorder_rec.STATUS_CODE,'AHL_JOB_STATUS');
1353 FETCH get_lookup_type_code INTO L_LOOKUP_CODE;
1354 IF get_lookup_type_code%NOTFOUND THEN
1355 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_STATUS_CODE_INVALID');
1356 FND_MSG_PUB.ADD;
1357 END IF;
1358 CLOSE get_lookup_type_code;
1359 END IF;
1360
1361 IF p_prd_workorder_rec.DML_OPERATION='U' THEN
1362
1363 IF (p_prd_workorder_rec.actual_start_date IS NULL OR
1364 p_prd_workorder_rec.actual_start_date=FND_API.G_MISS_DATE) AND
1365 (p_prd_workorder_rec.actual_end_date<>FND_API.G_MISS_DATE AND
1366 p_prd_workorder_rec.actual_end_date IS NOT NULL) THEN
1367 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ACTUAL_START_DT_NULL');
1368 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1369 FND_MSG_PUB.ADD;
1370 END IF;
1371
1372 IF p_prd_workorder_rec.actual_start_date IS NOT NULL AND
1373 p_prd_workorder_rec.actual_start_date<>FND_API.G_MISS_DATE AND
1374 p_prd_workorder_rec.actual_end_date<>FND_API.G_MISS_DATE AND
1375 p_prd_workorder_rec.actual_end_date IS NOT NULL AND
1376 p_prd_workorder_rec.actual_start_date > p_prd_workorder_rec.actual_end_date THEN
1377 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ACTUAL_ST_GT_SCHD_DATE');
1378 FND_MSG_PUB.ADD;
1379 END IF;
1380
1381 IF p_prd_workorder_rec.actual_end_date<>FND_API.G_MISS_DATE AND
1382 p_prd_workorder_rec.actual_end_date IS NOT NULL AND
1383 TRUNC(p_prd_workorder_rec.actual_end_date) > TRUNC( SYSDATE ) THEN
1384 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_ACTUAL_END_GT_SYSDATE');
1385 FND_MSG_PUB.ADD;
1386 END IF;
1387
1388 OPEN c_get_op_actual_dates(p_prd_workorder_rec.workorder_id);
1389 FETCH c_get_op_actual_dates INTO l_op_min_act_start_date, l_op_max_act_end_date;
1390 CLOSE c_get_op_actual_dates;
1391
1392 IF ( p_prd_workorder_rec.actual_start_date IS NOT NULL AND
1393 p_prd_workorder_rec.actual_start_date <> FND_API.G_MISS_DATE AND
1394 l_op_min_act_start_date IS NOT NULL AND
1395 p_prd_workorder_rec.actual_start_date > l_op_min_act_start_date ) THEN
1396 FND_MESSAGE.set_name( 'AHL', 'AHL_PRD_WO_OP_ST_DT' );
1397 FND_MSG_PUB.add;
1398 END IF;
1399
1400 IF ( p_prd_workorder_rec.actual_end_date IS NOT NULL AND
1401 p_prd_workorder_rec.actual_end_date <> FND_API.G_MISS_DATE AND
1402 l_op_max_act_end_date IS NOT NULL AND
1403 p_prd_workorder_rec.actual_end_date < l_op_max_act_end_date ) THEN
1404 FND_MESSAGE.set_name( 'AHL', 'AHL_PRD_WO_OP_END_DT' );
1405 FND_MSG_PUB.add;
1406 END IF;
1407 IF p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_RELEASED AND
1408 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_UNRELEASED AND
1409 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_COMPLETE AND
1410 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_ON_HOLD AND
1411 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_COMPLETE_NC AND
1412 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_CLOSED AND
1413 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_DRAFT AND
1414 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_PARTS_HOLD AND
1415 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_QA_PENDING AND
1416 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_DEFERRAL_PENDING AND
1417 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_DELETED AND
1418 p_prd_workorder_rec.STATUS_CODE<> G_JOB_STATUS_CANCELLED THEN
1419 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_STATUS_NOT_VALIDINMOD');
1420 FND_MSG_PUB.ADD;
1421 END IF;
1422
1423 IF p_prd_workorder_rec.WORKORDER_ID IS NULL OR
1424 p_prd_workorder_rec.WORKORDER_ID=FND_API.G_MISS_NUM THEN
1425 FND_MESSAGE.SET_NAME('AHL','AHL_WORKORDER_ID_NULL');
1426 FND_MSG_PUB.ADD;
1427 END IF;
1428
1429 IF p_prd_workorder_rec.OBJECT_VERSION_NUMBER IS NULL OR
1430 p_prd_workorder_rec.OBJECT_VERSION_NUMBER=FND_API.G_MISS_NUM THEN
1431 FND_MESSAGE.SET_NAME('AHL','OBJ_CANNOT_B_NULL');
1432 FND_MSG_PUB.ADD;
1433 END IF;
1434 -- apattark Commented to fix fp bug 8945432 . Validation not required for scheduled
1435 -- start date. Defer validation to EAM/WIP apis.
1436 /*
1437 SELECT COUNT(*)
1438 INTO l_dummy_ctr
1439 FROM ORG_ACCT_PERIODS
1440 WHERE organization_id=p_prd_workorder_rec.organization_id
1441 AND TRUNC(p_prd_workorder_rec.scheduled_start_date) BETWEEN
1442 TRUNC(period_start_date) AND TRUNC(NVL(schedule_CLOSE_date,SYSDATE+1));
1443
1444 IF l_dummy_ctr=0 THEN
1445 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHEDSDTACCTPERIODINV');
1446 FND_MSG_PUB.ADD;
1447 END IF;
1448 */
1449 --JKJain, Bug 12593041
1450 IF (p_prd_workorder_rec.CLASS_CODE IS NOT NULL) THEN
1451 OPEN validate_acc_class_code(p_prd_workorder_rec.CLASS_CODE, p_prd_workorder_rec.ORGANIZATION_ID);
1452 FETCH validate_acc_class_code INTO l_dummy;
1453 IF validate_acc_class_code%NOTFOUND THEN
1454 FND_MESSAGE.SET_NAME('AHL','AHL_RM_INVALID_ACC_CLASS');
1455 FND_MESSAGE.SET_TOKEN('FIELD',p_prd_workorder_rec.CLASS_CODE,false);
1456 FND_MSG_PUB.ADD;
1457 END IF;
1458 CLOSE validate_acc_class_code;
1459 END IF;
1460
1461 ELSIF p_prd_workorder_rec.DML_OPERATION='C' THEN
1462
1463 IF p_prd_workorder_rec.organization_id IS not NULL AND
1464 p_prd_workorder_rec.organization_id<>FND_API.G_MISS_NUM THEN
1465 OPEN validate_project(p_prd_workorder_rec.organization_id);
1466 FETCH validate_project INTO l_dummy_ctr;
1467 IF validate_project%NOTFOUND THEN
1468 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_PROJECT_INVALID');
1469 FND_MESSAGE.SET_TOKEN('ORGID',l_record_str,false);
1470 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1471 FND_MSG_PUB.ADD;
1472 ELSIF p_prd_workorder_rec.Project_id IS not NULL AND
1473 p_prd_workorder_rec.Project_id<>FND_API.G_MISS_NUM THEN
1474
1475 -- replace MTL_PROJECT_V with PJM_PROJECTS_ORG_OU_SECURE_V for R12
1476 -- required for PJM MOAC changes.
1477 SELECT COUNT(*) INTO l_dummy_ctr
1478 --SELECT 1 INTO l_dummy_ctr
1479 -- FROM MTL_PROJECT_V
1480 FROM PJM_PROJECTS_ORG_OU_SECURE_V
1481 WHERE project_id=p_prd_workorder_rec.PROJECT_ID
1482 AND org_id = mo_global.get_current_org_id()
1483 -- added following filter to fix bug# 8662561 (FP for 8630840)
1484 AND inventory_organization_id = p_prd_workorder_rec.organization_id;
1485
1486 IF l_dummy_ctr=0 THEN
1487 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_project_id_invalid');
1488 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1489 FND_MSG_PUB.ADD;
1490 ELSIF l_dummy_ctr>0 THEN
1491 IF p_prd_workorder_rec.Project_task_id IS not NULL AND
1492 p_prd_workorder_rec.Project_task_id<>FND_API.G_MISS_NUM THEN
1493 SELECT COUNT(*) INTO l_dummy_ctr
1494 --SELECT 1 INTO l_dummy_ctr
1495 FROM pa_tasks
1496 WHERE project_id=p_prd_workorder_rec.project_id
1497 AND task_id=p_prd_workorder_rec.project_task_id;
1498
1499 IF l_dummy_ctr=0 THEN
1500 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_PROJECT_TASKID_INVALID');
1501 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1502 FND_MSG_PUB.ADD;
1503 END IF;
1504 END IF;
1505 END IF;
1506 END IF;
1507 CLOSE validate_project;
1508 END IF;
1509
1510 IF ( p_prd_workorder_rec.Visit_id IS NULL OR
1511 p_prd_workorder_rec.Visit_id=FND_API.G_MISS_NUM ) THEN
1512 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_VISITID_NULL');
1513 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1514 END IF;
1515
1516 IF ( p_prd_workorder_rec.Master_workorder_flag IS NULL OR
1517 p_prd_workorder_rec.Master_workorder_flag=FND_API.G_MISS_CHAR OR
1518 p_prd_workorder_rec.Master_workorder_flag NOT IN ( 'Y' , 'N' ) ) THEN
1519 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MWOFLAG_INVALID');
1520 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1521 ELSIF ( ( p_prd_workorder_rec.Visit_task_id IS NULL OR
1522 p_prd_workorder_rec.Visit_task_id=FND_API.G_MISS_NUM ) AND
1523 p_prd_workorder_rec.Master_workorder_flag = 'N' ) THEN
1524 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_VISITASKID_NULL');
1525 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1526 FND_MSG_PUB.ADD;
1527 END IF;
1528
1529 IF ( p_prd_workorder_rec.Visit_task_id IS NOT NULL AND
1530 p_prd_workorder_rec.Visit_task_id<>FND_API.G_MISS_NUM ) THEN
1531
1532 SELECT COUNT(*)
1533 INTO l_dummy_ctr
1534 FROM AHL_WORKORDERS
1535 WHERE visit_task_id=NVL(p_prd_workorder_rec.visit_task_id,0)
1536 AND LTRIM(RTRIM(status_code)) NOT IN ( G_JOB_STATUS_CANCELLED, G_JOB_STATUS_DELETED );
1537
1538 IF l_dummy_ctr >0 THEN
1539 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_INVAL_CREATE_WORKORDER');
1540 FND_MESSAGE.SET_TOKEN('RECORD',l_record_str,false);
1541 FND_MSG_PUB.ADD;
1542 RETURN;
1543 END IF;
1544
1545 SELECT COUNT(*)
1546 INTO l_dummy_ctr
1547 FROM AHL_VISIT_TASKS_B
1548 WHERE visit_task_id=p_prd_workorder_rec.visit_task_id;
1549
1550 IF l_dummy_ctr=0 THEN
1551 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_visit_task_invalid');
1552 FND_MSG_PUB.ADD;
1553 END IF;
1554
1555 END IF;
1556
1557 IF p_prd_workorder_rec.completion_subinventory IS NOT NULL AND
1558 p_prd_workorder_rec.COMPLETION_SUBINVENTORY<>FND_API.G_MISS_CHAR THEN
1559 OPEN validate_subinventory(p_prd_workorder_rec.organization_id, p_prd_workorder_rec.Completion_subinventory);
1560 FETCH validate_subinventory INTO l_subinv_rec;
1561 IF validate_subinventory%FOUND AND
1562 NVL(l_subinv_rec.eam_enabled_flag,'x')='N' THEN
1563 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_COMPLSUBINV_INVALID');
1564 FND_MSG_PUB.ADD;
1565 ELSIF validate_subinventory%NOTFOUND THEN
1566 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_COMPLSUBINV_INVALID');
1567 FND_MSG_PUB.ADD;
1568 END IF;
1569 CLOSE validate_subinventory;
1570 END IF;
1571
1572 IF p_prd_workorder_rec.Completion_locator_id IS not NULL AND
1573 p_prd_workorder_rec.Completion_locator_id<>FND_API.G_MISS_CHAR THEN
1574 SELECT COUNT(*)
1575 INTO l_dummy_ctr
1576 FROM MTL_ITEM_LOCATIONS
1577 WHERE inventory_location_id=p_prd_workorder_rec.completion_locator_id;
1578 IF l_dummy_ctr =0 THEN
1579 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_COMPLSUBINV_INVALID');
1580 FND_MSG_PUB.ADD;
1581 END IF;
1582 END IF;
1583
1584 IF p_prd_workorder_rec.Firm_planned_flag IS NULL OR
1585 p_prd_workorder_rec.Firm_planned_flag=FND_API.G_MISS_NUM THEN
1586 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_FIRM_PLANNED_FLAG_NULL');
1587 FND_MSG_PUB.ADD;
1588 ELSIF p_prd_workorder_rec.Firm_planned_flag <1 AND
1589 p_prd_workorder_rec.Firm_planned_flag >2 THEN
1590 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_FIRM_PLANNED_FLAG_INV');
1591 FND_MSG_PUB.ADD;
1592 END IF;
1593
1594 IF p_prd_workorder_rec.mr_route_id IS not NULL OR
1595 p_prd_workorder_rec.mr_route_id<>FND_API.G_MISS_NUM THEN
1596 SELECT COUNT(*)
1597 INTO l_dummy_ctr
1598 FROM AHL_MR_ROUTES_V -- Chnaged from AHL_MR_ROUTES to be Application Usage complaint.
1599 WHERE mr_route_id=p_prd_workorder_rec.mr_route_id;
1600
1601 IF NVL(l_dummy_ctr,0)>1 OR NVL(l_dummy_ctr,0)=0 THEN
1602 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_MR_ROUTE_ID_INVLD');
1603 FND_MSG_PUB.ADD;
1604 END IF;
1605 END IF;
1606
1607 IF p_prd_workorder_rec.ITEM_INSTANCE_ID IS NULL OR
1608 p_prd_workorder_rec.ITEM_INSTANCE_ID=FND_API.G_MISS_NUM THEN
1609 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_INSTANCE_ID_NULL');
1610 FND_MSG_PUB.ADD;
1611 ELSE
1612 SELECT COUNT(a.instance_id)
1613 INTO l_dummy_ctr
1614 FROM CSI_ITEM_INSTANCES a,
1615 MTL_SYSTEM_ITEMS b
1616 WHERE a.instance_id=p_prd_workorder_rec.item_instance_id
1617 AND TRUNC(SYSDATE) BETWEEN TRUNC(NVL(a.active_start_date,SYSDATE))
1618 AND TRUNC(NVL(a.active_end_date,SYSDATE+1))
1619 AND a.inventory_item_id=b.inventory_item_id;
1620
1621 IF NVL(l_dummy_ctr,0)=0 THEN
1622 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_INVITEM_NOTACTIVE');
1623 FND_MSG_PUB.ADD;
1624 END IF;
1625 END IF;
1626
1627 IF p_prd_workorder_rec.INVENTORY_ITEM_ID IS NULL OR
1628 p_prd_workorder_rec.INVENTORY_ITEM_ID=FND_API.G_MISS_NUM THEN
1629 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_INV_ITEM_ID_NULL');
1630 FND_MSG_PUB.ADD;
1631 END IF;
1632
1633 END IF;
1634
1635 -- nsikka: ER 5846702
1636 IF p_prd_workorder_rec.hold_reason_code IS NOT NULL AND
1637 p_prd_workorder_rec.hold_reason_code<>FND_API.G_MISS_CHAR THEN
1638 OPEN get_lookup_type_code(p_prd_workorder_rec.hold_reason_code,'AHL_PRD_WO_HOLD_REASON');
1639 FETCH get_lookup_type_code INTO L_LOOKUP_CODE;
1640 IF get_lookup_type_code%NOTFOUND THEN
1641 FND_MESSAGE.SET_NAME('AHL','AHL_PP_REASON_INVALID');
1642 FND_MSG_PUB.ADD;
1643 END IF;
1644 CLOSE get_lookup_type_code;
1645 END IF;
1646
1647 IF (p_prd_workorder_rec.status_code = '6' OR p_prd_workorder_rec.status_code = '19' )
1648 AND p_prd_workorder_rec.hold_reason_code IS NULL THEN
1649 FND_MESSAGE.SET_NAME('AHL','AHL_PP_REASON_NULL');
1650 FND_MSG_PUB.ADD;
1651 END IF;
1652
1653 END validate_workorder;
1654
1655 -- Added for FP bug# 7238868.
1656 PROCEDURE get_Resource_Dept(p_aso_resource_id IN NUMBER,
1657 p_organization_id IN NUMBER,
1658 p_aso_resc_name IN VARCHAR2,
1659 x_department_id OUT NOCOPY NUMBER,
1660 x_department_name OUT NOCOPY VARCHAR2,
1661 x_return_status OUT NOCOPY VARCHAR2)
1662 IS
1663
1664 -- find out dept. level resource if exists.
1665 CURSOR get_res_dept_csr (p_aso_resource_id IN NUMBER,
1666 p_org_id IN NUMBER)
1667 IS
1668 SELECT DISTINCT MAP.department_id, DEPT.description
1669 FROM BOM_DEPARTMENT_RESOURCES BD, AHL_RESOURCE_MAPPINGS MAP,
1670 BOM_RESOURCES BR, BOM_DEPARTMENTS DEPT
1671 WHERE BD.resource_id = MAP.bom_resource_id
1672 AND BR.resource_id = BD.resource_id
1673 AND BR.organization_id = p_org_id
1674 AND MAP.aso_resource_id = p_aso_resource_id
1675 AND MAP.BOM_org_id = p_org_id
1676 AND MAP.department_id = BD.department_id
1677 AND BD.department_id = dept.department_id;
1678
1679 --pekambar ER # 9014609 -- Start
1680 CURSOR get_one_bomres_org_value(c_aso_resource_id number)
1681 IS
1682 select ONE_BOMRES_ORG
1683 from ahl_resources
1684 where RESOURCE_ID = c_aso_resource_id;
1685
1686 l_one_bomres_org varchar2(1) := 'Y';
1687 --pekambar ER # 9014609 -- End
1688
1689 l_department_id NUMBER;
1690 l_department_name bom_departments.description%TYPE;
1691
1692
1693 BEGIN
1694
1695 x_return_status := FND_API.G_RET_STS_SUCCESS;
1696 x_department_id := NULL;
1697
1698 OPEN get_res_dept_csr (p_aso_resource_id, p_organization_id);
1699 FETCH get_res_dept_csr INTO l_department_id, l_department_name;
1700 IF (get_res_dept_csr%FOUND) THEN
1701 x_department_id := l_department_id;
1702 --x_department_name:= l_department_name;
1703 END IF;
1704
1705 --pekambar ER # 9014609 -- Start
1706 -- Get Flag Value for resource for weather it has one BOM resouce per organization or not
1707 -- if it has flag value has multiple BOM resouces per organization
1708 -- Knock of the Validation for duplicate records
1709 -- pass the departementid as null
1710
1711 /*
1712 -- check if another record exists.
1713 FETCH get_res_dept_csr INTO l_department_id, l_department_name;
1714 IF (get_res_dept_csr%FOUND) THEN
1715 -- raise error
1716 FND_MESSAGE.set_name('AHL','AHL_DUPLICATE_DEPT_FOUND');
1717 FND_MESSAGE.set_token('DESC',p_aso_resc_name);
1718 FND_MSG_PUB.add;
1719 x_return_status := FND_API.G_RET_STS_ERROR;
1720 END IF;
1721 */
1722
1723 OPEN get_one_bomres_org_value(p_aso_resource_id);
1724 FETCH get_one_bomres_org_value INTO l_one_bomres_org;
1725 CLOSE get_one_bomres_org_value;
1726
1727 IF(NVL(l_one_bomres_org,'Y') <> 'N')
1728 THEN
1729 -- check if another record exists.
1730 FETCH get_res_dept_csr INTO l_department_id, l_department_name;
1731 IF (get_res_dept_csr%FOUND) THEN
1732 -- raise error
1733 FND_MESSAGE.set_name('AHL','AHL_DUPLICATE_DEPT_FOUND');
1734 FND_MESSAGE.set_token('DESC',p_aso_resc_name);
1735 FND_MSG_PUB.add;
1736 x_return_status := FND_API.G_RET_STS_ERROR;
1737 END IF;
1738 ELSE
1739 x_department_id := null;
1740 END IF;
1741 --pekambar ER # 9014609 -- End
1742
1743 CLOSE get_res_dept_csr;
1744
1745 END get_Resource_Dept;
1746
1747
1748 -- Added for FP bug# 7238868.
1749 PROCEDURE Get_Default_Rt_Op_dept(p_object_id in number,
1750 p_association_type in varchar2,
1751 p_organization_id in number,
1752 x_return_status out nocopy varchar2,
1753 x_department_id out nocopy number,
1754 x_department_name out nocopy varchar2,
1755 x_object_resource_found out nocopy varchar2)
1756 IS
1757
1758 -- For Getting Resource Requirements defined for Route or Operation
1759 CURSOR get_rt_oper_resources(c_object_id NUMBER,
1760 c_association_type VARCHAR2)
1761 IS
1762 SELECT AR.rt_oper_resource_id,
1763 AR.aso_resource_id,
1764 ART.name
1765 FROM AHL_RT_OPER_RESOURCES AR, AHL_RESOURCES ART
1766 WHERE AR.aso_resource_id = ART.resource_id
1767 AND AR.association_type_code=p_association_type
1768 AND AR.object_id=p_object_id;
1769
1770
1771 l_rt_oper_resource_rec get_rt_oper_resources%ROWTYPE;
1772 l_return_status varchar2(1);
1773 l_final_department_id NUMBER;
1774 l_final_department_name bom_departments.description%TYPE;
1775 l_department_id NUMBER;
1776 l_department_name bom_departments.description%TYPE;
1777
1778
1779 BEGIN
1780
1781 IF ( G_DEBUG = 'Y' ) THEN
1782 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'p_object_id:' || p_object_id );
1783 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'p_association_type:' || p_association_type);
1784 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'p_organization_id:' || p_organization_id);
1785 END IF;
1786
1787 l_final_department_id := NULL;
1788 x_object_resource_found := 'N';
1789
1790 OPEN get_rt_oper_resources( p_object_id, p_association_type);
1791 LOOP
1792 FETCH get_rt_oper_resources INTO l_rt_oper_resource_rec;
1793 EXIT WHEN get_rt_oper_resources%NOTFOUND;
1794
1795 IF ( G_DEBUG = 'Y' ) THEN
1796 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'Found Route/Oper Res:' || l_rt_oper_resource_rec.aso_resource_id );
1797 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'Resource Name:' || l_rt_oper_resource_rec.name);
1798 END IF;
1799
1800 -- Atleast one Resource Requirement Found for the Route
1801 x_object_resource_found := 'Y';
1802
1803 -- Derive Dept from ASO Resource setup.
1804 get_Resource_Dept(l_rt_oper_resource_rec.aso_resource_id,
1805 p_organization_id,
1806 l_rt_oper_resource_rec.name,
1807 l_department_id,
1808 l_department_name,
1809 l_return_status);
1810 IF ( G_DEBUG = 'Y' ) THEN
1811 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'l_return_status:' || l_return_status );
1812 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'l_department_id:' || l_department_id);
1813 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'l_department_name:' || l_department_name);
1814 AHL_DEBUG_PUB.debug( 'Get_Default_Rt_Op_dept-'|| 'l_final_department_id:' || l_final_department_id);
1815 END IF;
1816
1817 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1818 RAISE FND_API.G_EXC_ERROR;
1819 END IF;
1820
1821 IF (l_department_id IS NOT NULL) THEN
1822 IF (l_final_department_id IS NULL) THEN
1823 l_final_department_id := l_department_id;
1824 l_final_department_name := l_department_name;
1825 ELSIF (l_department_id <> l_final_department_id) THEN
1826 -- raise error.
1827 x_return_status := FND_API.G_RET_STS_ERROR;
1828 EXIT;
1829 END IF;
1830 l_department_id := NULL;
1831 l_department_name := NULL;
1832 END IF;
1833
1834 END LOOP;
1835
1836 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1837 RAISE FND_API.G_EXC_ERROR;
1838 END IF;
1839
1840 -- only one unique dept. may be found.
1841 -- or no dept level resource found.
1842
1843 IF (l_final_department_id IS NOT NULL) THEN
1844 x_department_id := l_final_department_id;
1845 x_department_name := l_final_department_name;
1846 ELSE
1847 x_department_id := NULL;
1848 x_department_name := NULL;
1849 END IF;
1850
1851 END Get_Default_Rt_Op_dept;
1852
1853
1854 PROCEDURE get_op_resource_req
1855 (
1856 p_workorder_rec IN prd_workorder_rec,
1857 p_operation_tbl IN AHL_PRD_OPERATIONS_PVT.prd_operation_tbl,
1858 p_x_resource_tbl IN OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type
1859 )
1860 AS
1861
1862 -- For Getting Resource Requirements defined for Operation
1863 -- For Getting Resource Requirements defined for Route or Operation
1864 -- JKJAIN US space FP 7644260 for ER # 6998882 -- start
1865 -- added schedule_seq_num to the query.
1866 CURSOR get_oper_resources(c_operation_id NUMBER)
1867 IS
1868 SELECT AR.rt_oper_resource_id,
1869 AR.aso_resource_id,
1870 (AR.duration * AR.quantity ) duration, --Modified by Srini for Costing ER
1871 AR.quantity,
1872 AR.activity_id,
1873 AR.cost_basis_id,
1874 AR.scheduled_type_id,
1875 AR.autocharge_type_id,
1876 AR.standard_rate_flag,
1877 AR.schedule_seq
1878 FROM AHL_RT_OPER_RESOURCES AR
1879 WHERE AR.association_type_code='OPERATION'
1880 AND AR.object_id=c_operation_id;
1881 -- JKJAIN US space FP 7644260 for ER # 6998882 -- end
1882 l_oper_resource_rec get_oper_resources%ROWTYPE;
1883
1884 -- For Getting Alternate Resources for a Resource Requirement
1885 CURSOR get_alternate_aso_resources(c_rt_oper_resource_id NUMBER)
1886 IS
1887 SELECT aso_resource_id
1888 FROM AHL_ALTERNATE_RESOURCES
1889 WHERE rt_oper_resource_id=c_rt_oper_resource_id
1890 ORDER BY priority;
1891
1892 -- For Getting the BOM Resource for the ASO Resource and the
1893 -- Visit's Organization plus Visit Task's Department
1894 /*CURSOR get_bom_resource(c_aso_resource_id NUMBER,
1895 c_org_id NUMBER,
1896 c_dept_id NUMBER)
1897 IS
1898 SELECT BR.resource_id,
1899 BR.resource_code,
1900 BR.resource_type,
1901 BR.description,
1902 BR.unit_of_measure
1903 FROM BOM_DEPARTMENT_RESOURCES BDR,
1904 BOM_RESOURCES BR,
1905 AHL_RESOURCE_MAPPINGS MAP
1906 WHERE BDR.department_id=c_dept_id
1907 AND BDR.resource_id=BR.resource_id
1908 AND BR.organization_id=c_org_id
1909 AND BR.resource_id=MAP.bom_resource_id
1910 AND MAP.aso_resource_id=c_aso_resource_id;*/
1911
1912 --Pekambar Changed the Query for ER # 9014609
1913 --For Reopened issue to add all BOM resources (statement no longer applicable)
1914 /* MANESING::ER 11062672, 03-Jan-2011, in case there is more than 1 BOM resource i.e.
1915 * 1) BOM resource with department same as that of visit task and
1916 * 2) BOM resource with department as null,
1917 * then preference is given to 1st BOM resource
1918 */
1919 CURSOR get_bom_resource(c_aso_resource_id NUMBER,
1920 c_org_id NUMBER,
1921 c_dept_id NUMBER)
1922 IS
1923 SELECT BR.resource_id,
1924 BR.resource_code,
1925 BR.resource_type,
1926 BR.description,
1927 BR.unit_of_measure
1928 FROM BOM_DEPARTMENT_RESOURCES BDR,
1929 BOM_RESOURCES BR,
1930 AHL_RESOURCE_MAPPINGS MAP
1931 WHERE BDR.resource_id = BR.resource_id
1932 AND BR.resource_id = MAP.bom_resource_id
1933 AND MAP.aso_resource_id= c_aso_resource_id
1934 AND BDR.department_id = c_dept_id
1935 AND (MAP.department_id = c_dept_id or MAP.department_id is NULL)
1936 AND MAP.bom_org_id = c_org_id
1937 ORDER BY MAP.department_id nulls last;
1938
1939 l_bom_resource_rec get_bom_resource%ROWTYPE;
1940
1941 l_res_ctr NUMBER := 0;
1942 l_res_seq_num NUMBER := 0;
1943 l_bom_resource_found BOOLEAN := FALSE;
1944
1945 -- cursor for getting task quantity for a given workorder
1946 -- Begin OGMA Issue # 105 - Balaji
1947 CURSOR c_get_task_quantity(p_workorder_id NUMBER)
1948 IS
1949 SELECT
1950 nvl(vtsk.quantity, 1)
1951 FROM
1952 ahl_visit_tasks_b vtsk,
1953 ahl_workorders awo
1954 WHERE
1955 vtsk.visit_task_id = awo.visit_task_id AND
1956 awo.workorder_id = p_workorder_id;
1957
1958 l_task_quantity NUMBER;
1959 -- End OGMA Issue # 105 - Balaji
1960
1961 BEGIN
1962
1963 -- Process the the Resource Requirements defined for the Operations
1964 FOR i in p_operation_tbl.FIRST..p_operation_tbl.LAST LOOP
1965
1966 IF ( p_operation_tbl(i).dml_operation = 'C' AND
1967 p_operation_tbl(i).operation_id IS NOT NULL AND
1968 p_operation_tbl(i).operation_id <> FND_API.G_MISS_NUM ) THEN
1969
1970 -- Get the Resource Requirements defined for the Operation
1971 OPEN get_oper_resources( p_operation_tbl(i).operation_id );
1972 LOOP
1973 FETCH get_oper_resources INTO l_oper_resource_rec;
1974 EXIT WHEN get_oper_resources%NOTFOUND;
1975
1976 -- Get the BOM Resource for the ASO Resource and the
1977 -- Visit's Organization plus Visit Task's Department
1978 OPEN get_bom_resource( l_oper_resource_rec.aso_resource_id, p_operation_tbl(i).organization_id, p_operation_tbl(i).department_id );
1979 FETCH get_bom_resource INTO l_bom_resource_rec;
1980 IF ( get_bom_resource%FOUND ) THEN
1981 CLOSE get_bom_resource;
1982
1983 -- BOM Resource Found
1984 l_bom_resource_found := TRUE;
1985
1986 ELSE
1987 CLOSE get_bom_resource;
1988
1989 -- Since Primary Resource is not Found, Get the Alternate Resources
1990 -- defined for the Resource Requirement
1991 FOR alt_res_cursor IN get_alternate_aso_resources( l_oper_resource_rec.rt_oper_resource_id )
1992 LOOP
1993 -- Get the BOM Resource for the Alternate ASO Resource and the
1994 -- Visit's Organization plus Visit Task's Department
1995 OPEN get_bom_resource( alt_res_cursor.aso_resource_id, p_operation_tbl(i).organization_id, p_operation_tbl(i).department_id );
1996 FETCH get_bom_resource INTO l_bom_resource_rec;
1997 IF ( get_bom_resource%FOUND ) THEN
1998 CLOSE get_bom_resource;
1999
2000 -- BOM Resource Found
2001 l_bom_resource_found := TRUE;
2002 EXIT;
2003 END IF;
2004 CLOSE get_bom_resource;
2005 END LOOP;
2006 END IF;
2007
2008 -- If a BOM Resource is Found for the Resource Requirement, then,
2009 -- Add the Resource Requirement to the Corresponding Operation
2010 IF ( l_bom_resource_found = TRUE ) THEN
2011 l_res_seq_num := l_res_seq_num + 10;
2012 l_res_ctr := l_res_ctr + 1;
2013 l_bom_resource_found := FALSE;
2014
2015 p_x_resource_tbl(l_res_ctr).operation_resource_id :=NULL;
2016 p_x_resource_tbl(l_res_ctr).resource_seq_number :=l_res_seq_num;
2017 p_x_resource_tbl(l_res_ctr).operation_seq_number :=p_operation_tbl(i).operation_sequence_num;
2018 p_x_resource_tbl(l_res_ctr).workorder_operation_id :=p_operation_tbl(i).workorder_operation_id;
2019 p_x_resource_tbl(l_res_ctr).workorder_id :=p_workorder_rec.workorder_id;
2020 p_x_resource_tbl(l_res_ctr).wip_entity_id :=p_workorder_rec.wip_entity_id;
2021 p_x_resource_tbl(l_res_ctr).organization_id :=p_workorder_rec.organization_id;
2022 p_x_resource_tbl(l_res_ctr).department_id :=p_operation_tbl(i).department_id;
2023 p_x_resource_tbl(l_res_ctr).department_name :=p_operation_tbl(i).department_name;
2024 p_x_resource_tbl(l_res_ctr).oper_start_date :=p_operation_tbl(i).scheduled_start_date;
2025 p_x_resource_tbl(l_res_ctr).oper_end_date :=p_operation_tbl(i).scheduled_end_date;
2026 p_x_resource_tbl(l_res_ctr).req_start_date :=p_operation_tbl(i).scheduled_start_date;
2027 p_x_resource_tbl(l_res_ctr).req_end_date :=p_operation_tbl(i).scheduled_end_date;
2028 p_x_resource_tbl(l_res_ctr).resource_type_code :=l_bom_resource_rec.resource_type;
2029 p_x_resource_tbl(l_res_ctr).resource_id :=l_bom_resource_rec.resource_id;
2030 p_x_resource_tbl(l_res_ctr).uom_code :=l_bom_resource_rec.unit_of_measure;
2031 -- Begin OGMA Issue # 105 - Balaji
2032 p_x_resource_tbl(l_res_ctr).duration := l_oper_resource_rec.duration;
2033 IF l_oper_resource_rec.cost_basis_id IS NOT NULL AND
2034 l_oper_resource_rec.cost_basis_id = 1
2035 THEN
2036
2037 OPEN c_get_task_quantity(p_workorder_rec.workorder_id);
2038 FETCH c_get_task_quantity INTO l_task_quantity;
2039 CLOSE c_get_task_quantity;
2040
2041 p_x_resource_tbl(l_res_ctr).duration := p_x_resource_tbl(l_res_ctr).duration * l_task_quantity;
2042
2043 END IF;
2044 -- End OGMA Issue # 105 - Balaji
2045 --p_x_resource_tbl(l_res_ctr).duration :=l_oper_resource_rec.duration;
2046 p_x_resource_tbl(l_res_ctr).quantity :=l_oper_resource_rec.quantity;
2047 p_x_resource_tbl(l_res_ctr).cost_basis_code :=l_oper_resource_rec.cost_basis_id;
2048 p_x_resource_tbl(l_res_ctr).charge_type_code :=l_oper_resource_rec.autocharge_type_id;
2049 p_x_resource_tbl(l_res_ctr).std_rate_flag_code :=l_oper_resource_rec.standard_rate_flag;
2050 p_x_resource_tbl(l_res_ctr).scheduled_type_code :=l_oper_resource_rec.scheduled_type_id;
2051 --JKJAIN US space FP for ER # 6998882 -- start
2052 p_x_resource_tbl(l_res_ctr).schedule_seq_num :=l_oper_resource_rec.schedule_seq;
2053 --JKJAIN US space FP for ER # 6998882 -- end
2054 --p_x_resource_tbl(l_res_ctr).activity_code :=l_oper_resource_rec.activity_id;
2055 p_x_resource_tbl(l_res_ctr).operation_flag :='C';
2056 -- SUKHWSIN ER # 9014609 -- start
2057 p_x_resource_tbl(l_res_ctr).rt_oper_resource_id :=l_oper_resource_rec.rt_oper_resource_id;
2058 -- SUKHWSIN ER # 9014609 -- end
2059 END IF;
2060 END LOOP;
2061 CLOSE get_oper_resources;
2062 END IF;
2063 END LOOP;
2064
2065 END get_op_resource_req;
2066
2067 PROCEDURE get_rt_resource_req
2068 (
2069 p_workorder_rec IN prd_workorder_rec,
2070 p_operation_tbl IN AHL_PRD_OPERATIONS_PVT.prd_operation_tbl,
2071 p_x_resource_tbl IN OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type
2072 )
2073 AS
2074
2075 -- For Getting Resource Requirements defined for Route or Operation
2076 -- JKJAIN US space FP 7644260 for ER # 6998882-- start
2077 -- added schedule_seq_num to the query.
2078 CURSOR get_rt_oper_resources(c_object_id NUMBER,
2079 c_association_type VARCHAR2)
2080 IS
2081 SELECT AR.rt_oper_resource_id,
2082 AR.aso_resource_id,
2083 (AR.duration * AR.quantity ) duration,
2084 AR.quantity,
2085 AR.activity_id,
2086 AR.cost_basis_id,
2087 AR.scheduled_type_id,
2088 AR.autocharge_type_id,
2089 AR.standard_rate_flag,
2090 AR.schedule_seq
2091 FROM AHL_RT_OPER_RESOURCES AR
2092 WHERE AR.association_type_code=c_association_type
2093 AND AR.object_id=c_object_id;
2094 -- JKJAIN US space FP 7644260 for ER # 6998882 -- end
2095 l_rt_oper_resource_rec get_rt_oper_resources%ROWTYPE;
2096
2097 -- For Getting Alternate Resources for a Resource Requirement
2098 CURSOR get_alternate_aso_resources(c_rt_oper_resource_id NUMBER)
2099 IS
2100 SELECT aso_resource_id
2101 FROM AHL_ALTERNATE_RESOURCES
2102 WHERE rt_oper_resource_id=c_rt_oper_resource_id
2103 ORDER BY priority;
2104
2105 -- For Getting the BOM Resource for the ASO Resource and the
2106 -- Visit's Organization plus Visit Task's Department
2107 /*CURSOR get_bom_resource(c_aso_resource_id NUMBER,
2108 c_org_id NUMBER,
2109 c_dept_id NUMBER)
2110 IS
2111 SELECT BR.resource_id,
2112 BR.resource_code,
2113 BR.resource_type,
2114 BR.description,
2115 BR.unit_of_measure
2116 FROM BOM_DEPARTMENT_RESOURCES BDR,
2117 BOM_RESOURCES BR,
2118 AHL_RESOURCE_MAPPINGS MAP
2119 WHERE BDR.department_id=c_dept_id
2120 AND BDR.resource_id=BR.resource_id
2121 AND BR.organization_id=c_org_id
2122 AND BR.resource_id=MAP.bom_resource_id
2123 AND MAP.aso_resource_id=c_aso_resource_id;*/
2124
2125 --Pekambar Changed the Query for ER # 9014609
2126 --For Reopened issue to add all BOM resources (statement no longer applicable)
2127 /* MANESING::ER 11062672, 03-Jan-2011, in case there is more than 1 BOM resource i.e.
2128 * 1) BOM resource with department same as that of visit task and
2129 * 2) BOM resource with department as null,
2130 * then preference is given to 1st BOM resource
2131 */
2132 CURSOR get_bom_resource(c_aso_resource_id NUMBER,
2133 c_org_id NUMBER,
2134 c_dept_id NUMBER)
2135 IS
2136 SELECT BR.resource_id,
2137 BR.resource_code,
2138 BR.resource_type,
2139 BR.description,
2140 BR.unit_of_measure
2141 FROM BOM_DEPARTMENT_RESOURCES BDR,
2142 BOM_RESOURCES BR,
2143 AHL_RESOURCE_MAPPINGS MAP
2144 WHERE BDR.resource_id = BR.resource_id
2145 AND BR.resource_id = MAP.bom_resource_id
2146 AND MAP.aso_resource_id= c_aso_resource_id
2147 AND BDR.department_id = c_dept_id
2148 AND (MAP.department_id = c_dept_id or MAP.department_id is NULL)
2149 AND MAP.bom_org_id = c_org_id
2150 ORDER BY MAP.department_id nulls last;
2151
2152 l_bom_resource_rec get_bom_resource%ROWTYPE;
2153
2154 l_res_ctr NUMBER := 0;
2155 l_res_seq_num NUMBER := 0;
2156 l_bom_resource_found BOOLEAN := FALSE;
2157 l_route_resource_found BOOLEAN := FALSE;
2158
2159 -- cursor for getting task quantity for a given workorder
2160 -- Begin OGMA Issue # 105 - Balaji
2161 CURSOR c_get_task_quantity(p_workorder_id NUMBER)
2162 IS
2163 SELECT
2164 nvl(vtsk.quantity, 1)
2165 FROM
2166 ahl_visit_tasks_b vtsk,
2167 ahl_workorders awo
2168 WHERE
2169 vtsk.visit_task_id = awo.visit_task_id AND
2170 awo.workorder_id = p_workorder_id;
2171
2172 l_task_quantity NUMBER;
2173 -- End OGMA Issue # 105 - Balaji
2174
2175 BEGIN
2176
2177 -- Get the Resource Requirements defined for the Route
2178 OPEN get_rt_oper_resources( p_workorder_rec.route_id, 'ROUTE' );
2179 LOOP
2180 FETCH get_rt_oper_resources INTO l_rt_oper_resource_rec;
2181 EXIT WHEN get_rt_oper_resources%NOTFOUND;
2182
2183 -- Atleast one Resource Requirement Found for the Route
2184 l_route_resource_found := TRUE;
2185
2186 -- Get the BOM Resource for the ASO Resource and the
2187 -- Visit's Organization plus Visit Task's Department
2188 --OPEN get_bom_resource( l_rt_oper_resource_rec.aso_resource_id, p_workorder_rec.organization_id, p_workorder_rec.department_id );
2189 OPEN get_bom_resource( l_rt_oper_resource_rec.aso_resource_id, p_workorder_rec.organization_id, p_operation_tbl(p_operation_tbl.FIRST).department_id );
2190 FETCH get_bom_resource INTO l_bom_resource_rec;
2191 IF ( get_bom_resource%FOUND ) THEN
2192 CLOSE get_bom_resource;
2193
2194 -- BOM Resource Found
2195 l_bom_resource_found := TRUE;
2196
2197 ELSE
2198 CLOSE get_bom_resource;
2199
2200 -- Since Primary Resource is not Found, Get the Alternate Resources
2201 -- defined for the Resource Requirement
2202 FOR alt_res_cursor IN get_alternate_aso_resources( l_rt_oper_resource_rec.rt_oper_resource_id )
2203 LOOP
2204 -- Get the BOM Resource for the Alternate ASO Resource and the
2205 -- Visit's Organization plus Visit Task's Department
2206 -- OPEN get_bom_resource( alt_res_cursor.aso_resource_id, p_workorder_rec.organization_id, p_workorder_rec.department_id );
2207 OPEN get_bom_resource( alt_res_cursor.aso_resource_id, p_workorder_rec.organization_id, p_operation_tbl(p_operation_tbl.FIRST).department_id);
2208 FETCH get_bom_resource INTO l_bom_resource_rec;
2209 IF ( get_bom_resource%FOUND ) THEN
2210 CLOSE get_bom_resource;
2211
2212 -- BOM Resource Found
2213 l_bom_resource_found := TRUE;
2214 EXIT;
2215 END IF;
2216 CLOSE get_bom_resource;
2217 END LOOP;
2218 END IF;
2219
2220 -- If a BOM Resource is Found for the Resource Requirement, then,
2221 -- Add the Job Resource Requirement to the First Operation
2222 IF ( l_bom_resource_found = TRUE ) THEN
2223 l_res_seq_num := l_res_seq_num + 10;
2224 l_res_ctr := l_res_ctr + 1;
2225 l_bom_resource_found := FALSE;
2226
2227 p_x_resource_tbl(l_res_ctr).operation_resource_id :=NULL;
2228 p_x_resource_tbl(l_res_ctr).resource_seq_number :=l_res_seq_num;
2229 p_x_resource_tbl(l_res_ctr).operation_seq_number :=p_operation_tbl(p_operation_tbl.FIRST).operation_sequence_num;
2230 p_x_resource_tbl(l_res_ctr).workorder_operation_id :=p_operation_tbl(p_operation_tbl.FIRST).workorder_operation_id;
2231 p_x_resource_tbl(l_res_ctr).workorder_id :=p_workorder_rec.workorder_id;
2232 p_x_resource_tbl(l_res_ctr).organization_id :=p_workorder_rec.organization_id;
2233 -- Default from operation -- FP bug# 7238868
2234 --p_x_resource_tbl(l_res_ctr).department_id :=p_workorder_rec.department_id;
2235 --p_x_resource_tbl(l_res_ctr).department_name :=p_workorder_rec.department_name;
2236 p_x_resource_tbl(l_res_ctr).department_id :=p_operation_tbl(p_operation_tbl.FIRST).department_id;
2237 p_x_resource_tbl(l_res_ctr).department_name :=p_operation_tbl(p_operation_tbl.FIRST).department_name;
2238
2239 p_x_resource_tbl(l_res_ctr).oper_start_date :=p_workorder_rec.scheduled_start_date;
2240 p_x_resource_tbl(l_res_ctr).oper_end_date :=p_workorder_rec.scheduled_end_date;
2241 p_x_resource_tbl(l_res_ctr).req_start_date :=p_workorder_rec.scheduled_start_date;
2242 p_x_resource_tbl(l_res_ctr).req_end_date :=p_workorder_rec.scheduled_end_date;
2243 p_x_resource_tbl(l_res_ctr).resource_type_code :=l_bom_resource_rec.resource_type;
2244 p_x_resource_tbl(l_res_ctr).resource_id :=l_bom_resource_rec.resource_id;
2245 p_x_resource_tbl(l_res_ctr).uom_code :=l_bom_resource_rec.unit_of_measure;
2246 p_x_resource_tbl(l_res_ctr).duration :=l_rt_oper_resource_rec.duration;
2247 -- Begin OGMA Issue # 105 - Balaji
2248 IF l_rt_oper_resource_rec.cost_basis_id IS NOT NULL AND
2249 l_rt_oper_resource_rec.cost_basis_id = 1
2250 THEN
2251
2252 OPEN c_get_task_quantity(p_workorder_rec.workorder_id);
2253 FETCH c_get_task_quantity INTO l_task_quantity;
2254 CLOSE c_get_task_quantity;
2255
2256 p_x_resource_tbl(l_res_ctr).duration :=p_x_resource_tbl(l_res_ctr).duration * l_task_quantity;
2257
2258 END IF;
2259 -- End OGMA Issue # 105 - Balaji
2260 p_x_resource_tbl(l_res_ctr).quantity :=l_rt_oper_resource_rec.quantity;
2261 p_x_resource_tbl(l_res_ctr).cost_basis_code :=l_rt_oper_resource_rec.cost_basis_id;
2262 p_x_resource_tbl(l_res_ctr).charge_type_code :=l_rt_oper_resource_rec.autocharge_type_id;
2263 p_x_resource_tbl(l_res_ctr).std_rate_flag_code :=l_rt_oper_resource_rec.standard_rate_flag;
2264 p_x_resource_tbl(l_res_ctr).scheduled_type_code :=l_rt_oper_resource_rec.scheduled_type_id;
2265 -- JKJAIN US space FP for ER # 6998882 -- start
2266 p_x_resource_tbl(l_res_ctr).schedule_seq_num :=l_rt_oper_resource_rec.schedule_seq;
2267 -- JKJAIN US space FP for ER # 6998882 -- end
2268 --p_x_resource_tbl(l_res_ctr).activity_code :=l_rt_oper_resource_rec.activity_id;
2269 p_x_resource_tbl(l_res_ctr).operation_flag :='C';
2270 -- SUKHWSIN ER # 9014609 -- start
2271 p_x_resource_tbl(l_res_ctr).rt_oper_resource_id := l_rt_oper_resource_rec.rt_oper_resource_id;
2272 -- SUKHWSIN ER # 9014609 -- end
2273 END IF;
2274 END LOOP;
2275 CLOSE get_rt_oper_resources;
2276
2277 -- If the Route has no Resource Requirement defined, then, process the
2278 -- the Resource Requirements defined for the Associated Operations
2279 IF ( l_route_resource_found = FALSE ) THEN
2280
2281 FOR i in p_operation_tbl.FIRST..p_operation_tbl.LAST LOOP
2282 l_res_seq_num := 0;
2283
2284 -- Get the Resource Requirements defined for the Operation
2285 OPEN get_rt_oper_resources( p_operation_tbl(i).operation_id, 'OPERATION' );
2286 LOOP
2287 FETCH get_rt_oper_resources INTO l_rt_oper_resource_rec;
2288 EXIT WHEN get_rt_oper_resources%NOTFOUND;
2289
2290 -- Get the BOM Resource for the ASO Resource and the
2291 -- Visit's Organization plus Visit Task's Department
2292 --OPEN get_bom_resource( l_rt_oper_resource_rec.aso_resource_id, p_workorder_rec.organization_id, p_workorder_rec.department_id );
2293 OPEN get_bom_resource( l_rt_oper_resource_rec.aso_resource_id, p_workorder_rec.organization_id, p_operation_tbl(i).department_id );
2294 FETCH get_bom_resource INTO l_bom_resource_rec;
2295 IF ( get_bom_resource%FOUND ) THEN
2296 CLOSE get_bom_resource;
2297
2298 -- BOM Resource Found
2299 l_bom_resource_found := TRUE;
2300 ELSE
2301 CLOSE get_bom_resource;
2302
2303 -- Since Primary Resource is not Found, Get the Alternate Resources
2304 -- defined for the Resource Requirement
2305 FOR alt_res_cursor IN get_alternate_aso_resources( l_rt_oper_resource_rec.rt_oper_resource_id )
2306 LOOP
2307 -- Get the BOM Resource for the Alternate ASO Resource and the
2308 -- Visit's Organization plus Visit Task's Department
2309 -- OPEN get_bom_resource( alt_res_cursor.aso_resource_id, p_workorder_rec.organization_id, p_workorder_rec.department_id );
2310 OPEN get_bom_resource( alt_res_cursor.aso_resource_id, p_workorder_rec.organization_id, p_operation_tbl(i).department_id);
2311 FETCH get_bom_resource INTO l_bom_resource_rec;
2312 IF ( get_bom_resource%FOUND ) THEN
2313 CLOSE get_bom_resource;
2314
2315 -- BOM Resource Found
2316 l_bom_resource_found := TRUE;
2317 EXIT;
2318 END IF;
2319 CLOSE get_bom_resource;
2320 END LOOP;
2321 END IF;
2322
2323 -- If a BOM Resource is Found for the Resource Requirement, then,
2324 -- Add the Resource Requirement to the Corresponding Operation
2325 IF ( l_bom_resource_found = TRUE ) THEN
2326 l_res_seq_num := l_res_seq_num + 10;
2327 l_res_ctr := l_res_ctr + 1;
2328 l_bom_resource_found := FALSE;
2329
2330 p_x_resource_tbl(l_res_ctr).operation_resource_id :=NULL;
2331 p_x_resource_tbl(l_res_ctr).resource_seq_number :=l_res_seq_num;
2332 p_x_resource_tbl(l_res_ctr).operation_seq_number :=p_operation_tbl(i).operation_sequence_num;
2333 p_x_resource_tbl(l_res_ctr).workorder_operation_id :=p_operation_tbl(i).workorder_operation_id;
2334 p_x_resource_tbl(l_res_ctr).workorder_id :=p_workorder_rec.workorder_id;
2335 p_x_resource_tbl(l_res_ctr).organization_id :=p_workorder_rec.organization_id;
2336 -- Default from Operation - FP bug# 7238868
2337 --p_x_resource_tbl(l_res_ctr).department_id :=p_workorder_rec.department_id;
2338 --p_x_resource_tbl(l_res_ctr).department_name :=p_workorder_rec.department_name;
2339 p_x_resource_tbl(l_res_ctr).department_id :=p_operation_tbl(i).department_id;
2340 p_x_resource_tbl(l_res_ctr).department_name :=p_operation_tbl(i).department_name;
2341
2342 p_x_resource_tbl(l_res_ctr).oper_start_date :=p_operation_tbl(i).scheduled_start_date;
2343 p_x_resource_tbl(l_res_ctr).oper_end_date :=p_operation_tbl(i).scheduled_end_date;
2344 p_x_resource_tbl(l_res_ctr).req_start_date :=p_operation_tbl(i).scheduled_start_date;
2345 p_x_resource_tbl(l_res_ctr).req_end_date :=p_operation_tbl(i).scheduled_end_date;
2346 p_x_resource_tbl(l_res_ctr).resource_type_code :=l_bom_resource_rec.resource_type;
2347 p_x_resource_tbl(l_res_ctr).resource_id :=l_bom_resource_rec.resource_id;
2348 p_x_resource_tbl(l_res_ctr).uom_code :=l_bom_resource_rec.unit_of_measure;
2349 p_x_resource_tbl(l_res_ctr).duration :=l_rt_oper_resource_rec.duration;
2350 -- Begin OGMA Issue # 105 - Balaji
2351 IF l_rt_oper_resource_rec.cost_basis_id IS NOT NULL AND
2352 l_rt_oper_resource_rec.cost_basis_id = 1
2353 THEN
2354
2355 OPEN c_get_task_quantity(p_workorder_rec.workorder_id);
2356 FETCH c_get_task_quantity INTO l_task_quantity;
2357 CLOSE c_get_task_quantity;
2358
2359 p_x_resource_tbl(l_res_ctr).duration :=p_x_resource_tbl(l_res_ctr).duration * l_task_quantity;
2360
2361 END IF;
2362 -- End OGMA Issue # 105 - Balaji
2363 p_x_resource_tbl(l_res_ctr).quantity :=l_rt_oper_resource_rec.quantity;
2364 p_x_resource_tbl(l_res_ctr).cost_basis_code :=l_rt_oper_resource_rec.cost_basis_id;
2365 p_x_resource_tbl(l_res_ctr).charge_type_code :=l_rt_oper_resource_rec.autocharge_type_id;
2366 p_x_resource_tbl(l_res_ctr).std_rate_flag_code :=l_rt_oper_resource_rec.standard_rate_flag;
2367 p_x_resource_tbl(l_res_ctr).scheduled_type_code :=l_rt_oper_resource_rec.scheduled_type_id;
2368 -- JKJAIN US space FP for ER # 6998882 -- start
2369 p_x_resource_tbl(l_res_ctr).schedule_seq_num :=l_rt_oper_resource_rec.schedule_seq;
2370 -- JKJAIN US space FP for ER # 6998882 -- end
2371 --p_x_resource_tbl(l_res_ctr).activity_code :=l_rt_oper_resource_rec.activity_id;
2372 p_x_resource_tbl(l_res_ctr).operation_flag :='C';
2373 -- SUKHWSIN ER # 9014609 -- start
2374 p_x_resource_tbl(l_res_ctr).rt_oper_resource_id := l_rt_oper_resource_rec.rt_oper_resource_id;
2375 -- SUKHWSIN ER # 9014609 -- end
2376 END IF;
2377 END LOOP;
2378 CLOSE get_rt_oper_resources;
2379 END LOOP;
2380 END IF;
2381
2382 END get_rt_resource_req;
2383
2384 -- MANESING::NR Analysis, 03-Jun-2011, added following procedure
2385 -- Start of Comments
2386 -- Procedure name : aggregate_stg_resource_req
2387 -- Type : Private
2388 -- Description : This procedure gets the CMRO Resource Requirements for the Stage Workorder, find the corr.
2389 -- BOM resources, and then depending on whether it's the case of MR creation or deletion,
2390 -- aggregate the existing BOM resources for the Stage Workorder with the new requirements obtained.
2391 --
2392 -- Pre-reqs :
2393 -- Parameters : p_workorder_rec IN PRD_WORKORDER_REC Required
2394 -- p_nrp_res_req_tbl IN NUMBER_TBL_TYPE Required
2395 --
2396 -- End of Comments
2397 PROCEDURE aggregate_stg_resource_req
2398 (
2399 p_workorder_rec IN prd_workorder_rec,
2400 p_nrp_res_req_tbl IN number_tbl_type,
2401 x_create_res_tbl OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type,
2402 x_update_res_tbl OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type,
2403 x_delete_res_tbl OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type
2404 )
2405 IS
2406 --
2407 /* Cursor for getting the BOM Resource for the CMRO Resource, Visit's Organization and Department.
2408 * In case there is more than 1 BOM resource i.e.
2409 * 1) BOM resource with department same as that of visit task and
2410 * 2) BOM resource with department as null,
2411 * then preference is given to the 1st BOM resource.
2412 */
2413 CURSOR get_bom_resource (c_aso_resource_id NUMBER,
2414 c_aso_resource_dur NUMBER,
2415 c_org_id NUMBER,
2416 c_dept_id NUMBER)
2417 IS
2418 SELECT BR.resource_id,
2419 BR.resource_code,
2420 BR.resource_type,
2421 BR.unit_of_measure,
2422 RESTYPE.meaning resource_type_name,
2423 c_aso_resource_dur duration
2424
2425 FROM BOM_DEPARTMENT_RESOURCES BDR,
2426 BOM_RESOURCES BR,
2427 AHL_RESOURCE_MAPPINGS MAP,
2428 MFG_LOOKUPS RESTYPE
2429
2430 WHERE BDR.resource_id = BR.resource_id
2431 AND BR.resource_id = MAP.bom_resource_id
2432 AND MAP.aso_resource_id = c_aso_resource_id
2433 AND BDR.department_id = c_dept_id
2434 AND (MAP.department_id = c_dept_id OR MAP.department_id IS NULL)
2435 AND MAP.bom_org_id = c_org_id
2436 AND RESTYPE.lookup_type = 'BOM_RESOURCE_TYPE'
2437 AND RESTYPE.lookup_code(+) = BR.resource_type
2438 AND RESTYPE.enabled_flag = 'Y'
2439 AND TRUNC(nvl(RESTYPE.start_date_active, SYSDATE - 1)) <= TRUNC(SYSDATE)
2440 AND TRUNC(nvl(RESTYPE.end_date_active , SYSDATE + 1)) > TRUNC(SYSDATE)
2441
2442 ORDER BY MAP.department_id nulls last;
2443
2444 -- Cursor for getting details of default Stage workorder operation
2445 CURSOR get_wo_oper_csr (c_workorder_id NUMBER)
2446 IS
2447 SELECT AWO.workorder_operation_id,
2448 AWO.operation_sequence_num,
2449 WIPO.first_unit_start_date scheduled_start_date,
2450 WIPO.last_unit_completion_date scheduled_end_date
2451
2452 FROM AHL_WORKORDERS AHLW,
2453 WIP_OPERATIONS WIPO,
2454 AHL_WORKORDER_OPERATIONS AWO
2455
2456 WHERE AHLW.workorder_id = c_workorder_id
2457 AND AHLW.wip_entity_id = WIPO.wip_entity_id
2458 AND AHLW.workorder_id = AWO.workorder_id
2459 AND WIPO.operation_seq_num = AWO.operation_sequence_num
2460 -- clause added in order to use index AHL_WORKORDER_OPERATIONS_N1 (workorder_id, status_code)
2461 AND AWO.status_code = G_OP_STATUS_UNCOMPLETE;
2462
2463 -- Cursor for getting BOM resource details given workorder operation id and BOM resource id
2464 CURSOR get_oper_bom_res_csr (c_wo_oper_id NUMBER,
2465 c_bom_resource_id NUMBER)
2466 IS
2467 SELECT operation_resource_id,
2468 object_version_number,
2469 duration
2470
2471 FROM AHL_OPERATION_RESOURCES
2472
2473 WHERE workorder_operation_id = c_wo_oper_id
2474 AND resource_id = c_bom_resource_id;
2475
2476 -- Cursor for getting maximum resource sequence number associated with a workorder operation
2477 CURSOR get_max_res_seq_csr (c_wo_oper_id NUMBER)
2478 IS
2479 SELECT max(resource_sequence_num)
2480 FROM AHL_OPERATION_RESOURCES
2481 WHERE workorder_operation_id = c_wo_oper_id;
2482
2483 /* An Associative array for storing BOM resources corresponding to the CMRO resources.
2484 * Basic use is to aggregate the BOM resource durations in case more than 1 CMRO resource gives the same BOM resource.
2485 * Each record in this table contains a BOM resource given by the respective cursor indexed by BOM resource id.
2486 */
2487 TYPE BOM_RESOURCE_TBL_TYPE IS TABLE OF get_bom_resource%ROWTYPE INDEX BY BINARY_INTEGER;
2488 --
2489
2490 l_api_name CONSTANT VARCHAR2(30) := 'Aggregate_stg_resource_req';
2491 l_full_name CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || l_api_name;
2492
2493 l_cre_res_ctr NUMBER := 0;
2494 l_cre_res_seq_num NUMBER := 0;
2495 l_upd_res_ctr NUMBER := 0;
2496 l_del_res_ctr NUMBER := 0;
2497 l_wo_oper_rec get_wo_oper_csr%ROWTYPE;
2498 l_oper_bom_res_rec get_oper_bom_res_csr%ROWTYPE;
2499
2500 l_cmro_res_id_indx NUMBER;
2501 l_bom_res_id_indx NUMBER;
2502 l_bom_resource_rec get_bom_resource%ROWTYPE;
2503 l_bom_resource_tbl BOM_RESOURCE_TBL_TYPE;
2504 --
2505 BEGIN
2506
2507 IF ( G_DEBUG = 'Y' ) THEN
2508 AHL_DEBUG_PUB.debug( l_full_name || '.begin - At the start of API' );
2509 END IF;
2510
2511 -- Iterate the newly obtained CMRO Resource Requirements for the Stage workorder
2512 l_cmro_res_id_indx := p_nrp_res_req_tbl.FIRST;
2513 WHILE l_cmro_res_id_indx IS NOT NULL LOOP
2514
2515 -- Get the corresponding BOM Resource
2516 OPEN get_bom_resource (l_cmro_res_id_indx,
2517 p_nrp_res_req_tbl(l_cmro_res_id_indx),
2518 p_workorder_rec.organization_id,
2519 p_workorder_rec.department_id);
2520 FETCH get_bom_resource INTO l_bom_resource_rec;
2521
2522 /* If same BOM resources are obtained across different CMRO resources, then aggregate their durations.
2523 * This will ensure proper updation of BOM resources in case of MR(s) deletion.
2524 */
2525 IF ( get_bom_resource%FOUND ) THEN
2526
2527 l_bom_res_id_indx := l_bom_resource_rec.resource_id;
2528 IF ( l_bom_resource_tbl.EXISTS(l_bom_res_id_indx) ) THEN
2529 l_bom_resource_tbl(l_bom_res_id_indx).duration :=
2530 l_bom_resource_tbl(l_bom_res_id_indx).duration + l_bom_resource_rec.duration;
2531 ELSE
2532 l_bom_resource_tbl(l_bom_res_id_indx) := l_bom_resource_rec;
2533 END IF;
2534
2535 IF ( G_DEBUG = 'Y' ) THEN
2536 AHL_DEBUG_PUB.debug( l_full_name || ' - BOM resource id ' || l_bom_res_id_indx
2537 || ' found for CMRO resource id ' || l_cmro_res_id_indx );
2538 END IF;
2539
2540 END IF;
2541 CLOSE get_bom_resource;
2542
2543 l_cmro_res_id_indx := p_nrp_res_req_tbl.NEXT(l_cmro_res_id_indx);
2544 END LOOP;
2545
2546 IF ( l_bom_resource_tbl.COUNT > 0 ) THEN
2547
2548 -- Get default Stage workorder operation details
2549 OPEN get_wo_oper_csr (p_workorder_rec.workorder_id);
2550 FETCH get_wo_oper_csr INTO l_wo_oper_rec;
2551 CLOSE get_wo_oper_csr;
2552
2553 /* Following IF condition could have been placed inside FOR loop itself to make use of the common code,
2554 * but doing that would mean that IF condition have to be evaluated for every BOM resource rather than once.
2555 */
2556 IF ( p_workorder_rec.dml_operation = 'C' ) THEN -- means case of MR creation
2557
2558 /* Get maximum resource sequence number associated with this workorder operation.
2559 * This is required in case of Creating Resource Requirements as the resource sequence number
2560 * must be unique for a workorder operation.
2561 */
2562 OPEN get_max_res_seq_csr (l_wo_oper_rec.workorder_operation_id);
2563 FETCH get_max_res_seq_csr INTO l_cre_res_seq_num;
2564 IF (l_cre_res_seq_num IS NULL) THEN -- in case of no record, output of max function will be null
2565 l_cre_res_seq_num := 0;
2566 END IF;
2567 CLOSE get_max_res_seq_csr;
2568
2569 /* Iterate through the BOM Resource Requirements for the Stage workorder, find the corresponding BOM
2570 * resource in Stage Workorder. If found, then populate update resource table with durations added,
2571 * otherwise populate create resource table.
2572 */
2573 l_bom_res_id_indx := l_bom_resource_tbl.FIRST;
2574 WHILE l_bom_res_id_indx IS NOT NULL LOOP
2575
2576 OPEN get_oper_bom_res_csr (l_wo_oper_rec.workorder_operation_id,
2577 l_bom_res_id_indx);
2578 FETCH get_oper_bom_res_csr INTO l_oper_bom_res_rec;
2579
2580 IF ( get_oper_bom_res_csr%FOUND ) THEN
2581 l_bom_resource_tbl(l_bom_res_id_indx).duration := l_oper_bom_res_rec.duration +
2582 l_bom_resource_tbl(l_bom_res_id_indx).duration;
2583
2584 l_upd_res_ctr := l_upd_res_ctr + 1;
2585 x_update_res_tbl(l_upd_res_ctr).operation_resource_id := l_oper_bom_res_rec.operation_resource_id;
2586 x_update_res_tbl(l_upd_res_ctr).object_version_number := l_oper_bom_res_rec.object_version_number;
2587 x_update_res_tbl(l_upd_res_ctr).req_start_date := l_wo_oper_rec.scheduled_start_date;
2588 x_update_res_tbl(l_upd_res_ctr).req_end_date := l_wo_oper_rec.scheduled_end_date;
2589 x_update_res_tbl(l_upd_res_ctr).resource_type_name := l_bom_resource_tbl(l_bom_res_id_indx).resource_type_name;
2590 x_update_res_tbl(l_upd_res_ctr).resource_name := l_bom_resource_tbl(l_bom_res_id_indx).resource_code;
2591 x_update_res_tbl(l_upd_res_ctr).quantity := 1;
2592 x_update_res_tbl(l_upd_res_ctr).duration := l_bom_resource_tbl(l_bom_res_id_indx).duration;
2593 x_update_res_tbl(l_upd_res_ctr).operation_flag := 'U';
2594
2595 ELSE
2596 l_cre_res_seq_num := l_cre_res_seq_num + 10;
2597 l_cre_res_ctr := l_cre_res_ctr + 1;
2598 x_create_res_tbl(l_cre_res_ctr).operation_resource_id := NULL;
2599 x_create_res_tbl(l_cre_res_ctr).resource_seq_number := l_cre_res_seq_num;
2600 x_create_res_tbl(l_cre_res_ctr).operation_seq_number := l_wo_oper_rec.operation_sequence_num;
2601 x_create_res_tbl(l_cre_res_ctr).workorder_operation_id := l_wo_oper_rec.workorder_operation_id;
2602 x_create_res_tbl(l_cre_res_ctr).workorder_id := p_workorder_rec.workorder_id;
2603 x_create_res_tbl(l_cre_res_ctr).organization_id := p_workorder_rec.organization_id;
2604 x_create_res_tbl(l_cre_res_ctr).department_id := p_workorder_rec.department_id;
2605 x_create_res_tbl(l_cre_res_ctr).department_name := p_workorder_rec.department_name;
2606 x_create_res_tbl(l_cre_res_ctr).oper_start_date := l_wo_oper_rec.scheduled_start_date;
2607 x_create_res_tbl(l_cre_res_ctr).oper_end_date := l_wo_oper_rec.scheduled_end_date;
2608 x_create_res_tbl(l_cre_res_ctr).req_start_date := l_wo_oper_rec.scheduled_start_date;
2609 x_create_res_tbl(l_cre_res_ctr).req_end_date := l_wo_oper_rec.scheduled_end_date;
2610 x_create_res_tbl(l_cre_res_ctr).resource_type_code := l_bom_resource_tbl(l_bom_res_id_indx).resource_type;
2611 x_create_res_tbl(l_cre_res_ctr).resource_name := l_bom_resource_tbl(l_bom_res_id_indx).resource_code;
2612 x_create_res_tbl(l_cre_res_ctr).resource_id := l_bom_resource_tbl(l_bom_res_id_indx).resource_id;
2613 x_create_res_tbl(l_cre_res_ctr).uom_code := l_bom_resource_tbl(l_bom_res_id_indx).unit_of_measure;
2614 x_create_res_tbl(l_cre_res_ctr).quantity := 1;
2615 x_create_res_tbl(l_cre_res_ctr).duration := l_bom_resource_tbl(l_bom_res_id_indx).duration;
2616 x_create_res_tbl(l_cre_res_ctr).operation_flag := 'C';
2617 END IF;
2618 CLOSE get_oper_bom_res_csr;
2619
2620 l_bom_res_id_indx := l_bom_resource_tbl.NEXT(l_bom_res_id_indx);
2621 END LOOP;
2622
2623 ELSIF ( p_workorder_rec.dml_operation = 'U' ) THEN -- update means case of MR deletion
2624
2625 /* Similar to above case, iterate BOM Resource Requirements, and find the corresponding BOM resource in Stage Workorder.
2626 * If not found, then ignore it as it's the result of discrepancies that arise due to some unhandled cases,
2627 * otherwise subtract durations. If duration < 1, then populate delete resource table, else update resource table.
2628 */
2629 l_bom_res_id_indx := l_bom_resource_tbl.FIRST;
2630 WHILE l_bom_res_id_indx IS NOT NULL LOOP
2631
2632 OPEN get_oper_bom_res_csr (l_wo_oper_rec.workorder_operation_id,
2633 l_bom_res_id_indx);
2634 FETCH get_oper_bom_res_csr INTO l_oper_bom_res_rec;
2635
2636 IF ( get_oper_bom_res_csr%FOUND ) THEN
2637
2638 l_bom_resource_tbl(l_bom_res_id_indx).duration := l_oper_bom_res_rec.duration -
2639 l_bom_resource_tbl(l_bom_res_id_indx).duration;
2640
2641 IF ( l_bom_resource_tbl(l_bom_res_id_indx).duration < 1 ) THEN
2642 l_del_res_ctr := l_del_res_ctr + 1;
2643 x_delete_res_tbl(l_del_res_ctr).operation_resource_id := l_oper_bom_res_rec.operation_resource_id;
2644 x_delete_res_tbl(l_del_res_ctr).object_version_number := l_oper_bom_res_rec.object_version_number;
2645 x_delete_res_tbl(l_del_res_ctr).workorder_operation_id := l_wo_oper_rec.workorder_operation_id;
2646 x_delete_res_tbl(l_del_res_ctr).workorder_id := p_workorder_rec.workorder_id;
2647 x_delete_res_tbl(l_del_res_ctr).operation_flag := 'D';
2648
2649 ELSE
2650 l_upd_res_ctr := l_upd_res_ctr + 1;
2651 x_update_res_tbl(l_upd_res_ctr).operation_resource_id := l_oper_bom_res_rec.operation_resource_id;
2652 x_update_res_tbl(l_upd_res_ctr).object_version_number := l_oper_bom_res_rec.object_version_number;
2653 x_update_res_tbl(l_upd_res_ctr).req_start_date := l_wo_oper_rec.scheduled_start_date;
2654 x_update_res_tbl(l_upd_res_ctr).req_end_date := l_wo_oper_rec.scheduled_end_date;
2655 x_update_res_tbl(l_upd_res_ctr).resource_type_name := l_bom_resource_tbl(l_bom_res_id_indx).resource_type_name;
2656 x_update_res_tbl(l_upd_res_ctr).resource_name := l_bom_resource_tbl(l_bom_res_id_indx).resource_code;
2657 x_update_res_tbl(l_upd_res_ctr).quantity := 1;
2658 x_update_res_tbl(l_upd_res_ctr).duration := l_bom_resource_tbl(l_bom_res_id_indx).duration;
2659 x_update_res_tbl(l_upd_res_ctr).operation_flag := 'U';
2660
2661 END IF;
2662
2663 END IF;
2664 CLOSE get_oper_bom_res_csr;
2665
2666 l_bom_res_id_indx := l_bom_resource_tbl.NEXT(l_bom_res_id_indx);
2667 END LOOP;
2668
2669 END IF; -- p_workorder_rec.dml_operation = 'U'
2670 END IF; -- if l_bom_resource_tbl.COUNT > 0
2671
2672 IF ( G_DEBUG = 'Y' ) THEN
2673 AHL_DEBUG_PUB.debug( l_full_name || ' - Total Resource requirements to be Created: ' || x_create_res_tbl.COUNT );
2674 AHL_DEBUG_PUB.debug( l_full_name || ' - Total Resource requirements to be Updated: ' || x_update_res_tbl.COUNT );
2675 AHL_DEBUG_PUB.debug( l_full_name || ' - Total Resource requirements to be Deleted: ' || x_delete_res_tbl.COUNT );
2676 AHL_DEBUG_PUB.debug( l_full_name || '.end - At the end of API' );
2677 END IF;
2678
2679 END aggregate_stg_resource_req;
2680
2681 -- MANESING::NR Analysis, 03-Jun-2011, added following procedure
2682 -- Start of Comments
2683 -- Procedure name : remove_wo_resrc_reqs
2684 -- Type : Private
2685 -- Description : This procedure gets all the BOM Resource Requirements associated with workorder operations,
2686 -- populates them in Resource Requirement table, and finally calls an API to remove
2687 -- the same.
2688 --
2689 -- Pre-reqs :
2690 -- Parameters : p_workorder_tbl IN PRD_WORKORDER_TBL Required
2691 --
2692 -- End of Comments
2693 PROCEDURE remove_wo_resrc_reqs
2694 (
2695 p_workorder_tbl IN PRD_WORKORDER_TBL,
2696 x_return_status OUT NOCOPY VARCHAR2,
2697 x_msg_count OUT NOCOPY NUMBER,
2698 x_msg_data OUT NOCOPY VARCHAR2
2699 )
2700 IS
2701 --
2702 -- Cursor for getting details of default Stage workorder operation
2703 CURSOR get_wo_oper_csr (c_workorder_id NUMBER)
2704 IS
2705 SELECT workorder_operation_id
2706 FROM AHL_WORKORDER_OPERATIONS
2707 WHERE workorder_id = c_workorder_id
2708 -- clause added in order to use index AHL_WORKORDER_OPERATIONS_N1 (workorder_id, status_code)
2709 AND status_code = G_OP_STATUS_UNCOMPLETE;
2710
2711 -- Cursor for getting all the BOM resource requirements for a workorder operation
2712 CURSOR get_oper_bom_res_csr (c_wo_operation_id NUMBER)
2713 IS
2714 SELECT operation_resource_id,
2715 object_version_number
2716 FROM AHL_OPERATION_RESOURCES
2717 WHERE workorder_operation_id = c_wo_operation_id;
2718
2719 -- Cursor to check whether the workorder being processed is in allowable status
2720 CURSOR check_wo_status_cur (c_workorder_id IN NUMBER)
2721 IS
2722 SELECT 1
2723 FROM AHL_WORKORDERS
2724 WHERE workorder_id = c_workorder_id
2725 AND status_code = G_JOB_STATUS_DRAFT;
2726 --
2727
2728 l_api_name CONSTANT VARCHAR2(30) := 'Remove_wo_resrc_reqs';
2729 l_full_name CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || l_api_name;
2730
2731 l_msg_count NUMBER;
2732 l_msg_data VARCHAR2(2000);
2733 l_return_status VARCHAR2(1);
2734
2735 l_dummy NUMBER;
2736 l_wo_oper_id NUMBER;
2737 l_res_ctr NUMBER;
2738 l_resource_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
2739 --
2740 BEGIN
2741
2742 IF ( G_DEBUG = 'Y' ) THEN
2743 AHL_DEBUG_PUB.debug( l_full_name || '.begin - At the start of API' );
2744 END IF;
2745
2746 -- Initialize Procedure return status to success
2747 x_return_status := FND_API.G_RET_STS_SUCCESS;
2748
2749 IF ( p_workorder_tbl.COUNT > 0 ) THEN
2750 FOR i IN p_workorder_tbl.FIRST..p_workorder_tbl.LAST LOOP
2751
2752 -- Get default workorder operation details
2753 OPEN get_wo_oper_csr (p_workorder_tbl(i).workorder_id);
2754 FETCH get_wo_oper_csr INTO l_wo_oper_id;
2755 CLOSE get_wo_oper_csr;
2756
2757 -- Clear values of previous iteration
2758 l_res_ctr := 0;
2759 l_resource_tbl.DELETE;
2760
2761 -- Fetch and populate BOM resources in a table
2762 FOR bom_res_rec IN get_oper_bom_res_csr (l_wo_oper_id) LOOP
2763 l_res_ctr := l_res_ctr + 1;
2764 l_resource_tbl(l_res_ctr).operation_resource_id := bom_res_rec.operation_resource_id;
2765 l_resource_tbl(l_res_ctr).object_version_number := bom_res_rec.object_version_number;
2766 l_resource_tbl(l_res_ctr).workorder_operation_id := l_wo_oper_id;
2767 l_resource_tbl(l_res_ctr).workorder_id := p_workorder_tbl(i).workorder_id;
2768 l_resource_tbl(l_res_ctr).operation_flag := 'D';
2769 END LOOP;
2770
2771 -- Validate workorder status before deleting its resources
2772 OPEN check_wo_status_cur (p_workorder_tbl(i).workorder_id);
2773 FETCH check_wo_status_cur INTO l_dummy;
2774 IF ( check_wo_status_cur%NOTFOUND ) THEN
2775 FND_MESSAGE.set_name('AHL', 'AHL_PP_DEL_RESREQ_INV_WO_STA');
2776 FND_MSG_PUB.add;
2777 END IF;
2778 CLOSE check_wo_status_cur;
2779
2780 -- Delete the BOM resources obtained above
2781 IF ( l_resource_tbl.COUNT > 0 ) THEN
2782
2783 IF ( G_DEBUG = 'Y' ) THEN
2784 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Process_resrc_require API for Removing all the Resource Requirements for Workorder id: ' || p_workorder_tbl(i).workorder_id );
2785 END IF;
2786
2787 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
2788 (
2789 p_api_version => 1.0,
2790 p_init_msg_list => FND_API.G_FALSE,
2791 p_commit => FND_API.G_FALSE,
2792 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2793 p_module_type => null,
2794 p_interface_flag => null,
2795 p_operation_flag => 'D',
2796 p_x_resrc_require_tbl => l_resource_tbl,
2797 x_return_status => l_return_status,
2798 x_msg_count => l_msg_count,
2799 x_msg_data => l_msg_data
2800 );
2801
2802 IF ( G_DEBUG = 'Y' ) THEN
2803 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Process_resrc_require API. Return Status: ' || l_return_status );
2804 END IF;
2805
2806 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
2807 x_return_status := l_return_status;
2808 x_msg_count := l_msg_count;
2809 x_msg_data := l_msg_data;
2810 END IF;
2811
2812 END IF; -- if l_resource_tbl.COUNT > 0
2813 END LOOP;
2814 END IF; -- p_workorder_tbl.COUNT > 0
2815
2816 IF ( G_DEBUG = 'Y' ) THEN
2817 AHL_DEBUG_PUB.debug( l_full_name || '.end - At the end of API' );
2818 END IF;
2819
2820 END remove_wo_resrc_reqs;
2821
2822 PROCEDURE get_op_material_req
2823 (
2824 p_workorder_rec IN prd_workorder_rec,
2825 p_operation_tbl IN AHL_PRD_OPERATIONS_PVT.prd_operation_tbl,
2826 p_x_material_tbl IN OUT NOCOPY AHL_PP_MATERIALS_PVT.req_material_tbl_type,
2827 --sukhwsin::SB Effectivity - added return status paramter
2828 x_return_status OUT NOCOPY VARCHAR2
2829 )
2830 AS
2831
2832 -- For Getting the Material Requirements for an Operation
2833 CURSOR get_oper_materials (c_operation_id NUMBER)
2834 IS
2835 SELECT MAT.rt_oper_material_id,
2836 MAT.inventory_item_id,
2837 MAT.item_group_id,
2838 MAT.quantity,
2839 MAT.uom_code,
2840 -- Bug # 6377990 - start
2841 MAT.in_service,
2842 -- Bug # 6377990 - end
2843 --sukhwsin::Added position key for position based mat req.
2844 MAT.position_key
2845 FROM AHL_RT_OPER_MATERIALS MAT
2846 WHERE MAT.association_type_code='OPERATION'
2847 AND MAT.object_id=c_operation_id;
2848
2849 l_material_req_rec get_oper_materials%ROWTYPE;
2850
2851 -- For getting the Alternate Items for an Item Group
2852 CURSOR get_alternate_items (c_item_group_id NUMBER)
2853 IS
2854 SELECT inventory_item_id
2855 FROM AHL_ITEM_ASSOCIATIONS_B
2856 WHERE item_group_id=c_item_group_id
2857 ORDER BY priority;
2858
2859 -- For Checking whether an Item exisits in an Organization.
2860 -- ***Incorporate Master Org check***
2861 CURSOR check_org_item (c_inventory_item_id NUMBER,
2862 c_org_id NUMBER)
2863 IS
2864 SELECT 'X'
2865 FROM MTL_SYSTEM_ITEMS
2866 WHERE inventory_item_id=c_inventory_item_id
2867 AND organization_id=c_org_id;
2868
2869 l_mat_ctr NUMBER := 0;
2870 l_org_item_found BOOLEAN := FALSE;
2871 l_dummy VARCHAR2(1);
2872 l_alternate_item_id NUMBER;
2873 --sukhwsin::SB Effectivity Code changes - starts
2874 --Cursor to Get unit_config_header_id and its associated mc_header_id.
2875 --Note: This is root uc_header_id against the instance attached at task or visit level.
2876 CURSOR Get_Wo_Uc_Header_Id(c_workorder_id IN NUMBER)
2877 IS
2878 SELECT DISTINCT WO.uc_header_id, UCH.master_config_id, WO.visit_id
2879 FROM AHL_WORKORDER_TASKS_V WO, AHL_UNIT_CONFIG_HEADERS UCH
2880 WHERE WO.workorder_id = c_workorder_id AND
2881 UCH.unit_config_header_id = WO.uc_header_id;
2882
2883 --Local variable declaration added for SB related changes.
2884 l_uc_header_id NUMBER;
2885 l_mc_header_id NUMBER;
2886 l_visit_id NUMBER;
2887 --l_pos_mtl_req_rec AHL_LTP_MTL_REQ_PVT.Route_Mtl_Req_Rec_Type;
2888 l_msg_count NUMBER;
2889 l_msg_data VARCHAR2(2000);
2890 l_return_status VARCHAR2(1);
2891 --sukhwsin::SB - Control position changes - starts
2892 l_pos_mtl_req_tbl AHL_LTP_MTL_REQ_PVT.Route_Mtl_Req_Tbl_Type;
2893 l_dummy_index NUMBER := 0;
2894 --sukhwsin::SB - Control position changes - ends
2895 --sukhwsin::SB Effectivity Code changes - ends
2896
2897 BEGIN
2898 --sukhwsin::SB Effectivity - set return status to SUCCESS
2899 x_return_status := FND_API.G_RET_STS_SUCCESS;
2900 FOR i in p_operation_tbl.FIRST..p_operation_tbl.LAST LOOP
2901 IF ( p_operation_tbl(i).dml_operation = 'C' AND
2902 p_operation_tbl(i).operation_id IS NOT NULL AND
2903 p_operation_tbl(i).operation_id <> FND_API.G_MISS_NUM ) THEN
2904
2905 -- Get the Material Requirements defined for the Operation
2906 OPEN get_oper_materials( p_operation_tbl(i).operation_id );
2907 LOOP
2908 FETCH get_oper_materials INTO l_material_req_rec;
2909 EXIT WHEN get_oper_materials%NOTFOUND;
2910
2911 -- The Material Requirement is based on an Item
2912 IF ( l_material_req_rec.inventory_item_id IS NOT NULL ) THEN
2913
2914 -- Check if the Item is available in the Visit's Organization
2915 OPEN check_org_item( l_material_req_rec.inventory_item_id, p_operation_tbl(i).organization_id );
2916 FETCH check_org_item INTO l_dummy;
2917 IF ( check_org_item%FOUND ) THEN
2918
2919 -- Organization Item Found
2920 l_org_item_found := TRUE;
2921 END IF;
2922 CLOSE check_org_item;
2923 --sukhwsin::SB Effectivity code changes --starts
2924 ELSIF (l_material_req_rec.item_group_id IS NOT NULL) THEN
2925
2926 -- Since the Material Requirement is Based on a Item Group,
2927 -- Process all the Alternate Items for the Item Group
2928 -- based on Priority
2929 FOR alt_item_cursor IN get_alternate_items( l_material_req_rec.item_group_id ) LOOP
2930
2931 -- Check if the Alternate Item is available in the
2932 -- Visit's Organization
2933 OPEN check_org_item( alt_item_cursor.inventory_item_id, p_operation_tbl(i).organization_id );
2934 FETCH check_org_item INTO l_dummy;
2935 IF ( check_org_item%FOUND ) THEN
2936
2937 -- Organization Item Found
2938 l_org_item_found := TRUE;
2939 l_alternate_item_id := alt_item_cursor.inventory_item_id;
2940 CLOSE check_org_item;
2941 EXIT;
2942 END IF;
2943 CLOSE check_org_item;
2944
2945 END LOOP;
2946 ELSIF (l_material_req_rec.position_key IS NOT NULL) THEN
2947 --Handle position based material requirements.
2948 --Get UC and MC header id associated with visit task
2949 l_uc_header_id := NULL;
2950 l_mc_header_id := NULL;
2951 OPEN Get_Wo_Uc_Header_Id(p_workorder_rec.workorder_id);
2952 FETCH Get_Wo_Uc_Header_Id INTO l_uc_header_id, l_mc_header_id, l_visit_id;
2953 IF (Get_Wo_Uc_Header_Id%NOTFOUND ) THEN
2954 CLOSE Get_Wo_Uc_Header_Id;
2955 CONTINUE;
2956 END IF;
2957 CLOSE Get_Wo_Uc_Header_Id;
2958 /*
2959 In this procedure call l_uc_header_id is root uc attached at task/visit level.
2960 l_mc_header_id is mc_header_id associated with l_uc_header_id
2961 */
2962 --sukhwsin:: SB - control position changes - starts
2963 --First clears l_pos_mtl_req_tbl table
2964 l_pos_mtl_req_tbl.delete();
2965 l_dummy_index := 0;
2966 --Populate l_pos_mtl_req_tbl table with position detail.
2967 l_pos_mtl_req_tbl(0).inventory_item_id := null;
2968 l_pos_mtl_req_tbl(0).mc_header_id := l_mc_header_id;
2969 l_pos_mtl_req_tbl(0).position_key := l_material_req_rec.position_key;
2970 AHL_LTP_MTL_REQ_PVT.Get_Material_Req_For_Pos (
2971 p_api_version => 1.0,
2972 p_init_msg_list => FND_API.G_FALSE,
2973 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
2974 x_return_status => l_return_status,
2975 x_msg_count => l_msg_count,
2976 x_msg_data => l_msg_data,
2977 p_uc_header_id => l_uc_header_id,
2978 p_visit_id => l_visit_id,
2979 p_quantity => l_material_req_rec.quantity,
2980 p_uom_code => l_material_req_rec.uom_code,
2981 p_x_index => l_dummy_index,
2982 p_x_route_mtl_reqs => l_pos_mtl_req_tbl);
2983 --sukhwsin:: SB - control position changes - ends
2984 IF(l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2985 x_return_status := l_return_status;
2986 RETURN;
2987 END IF;
2988 IF (l_pos_mtl_req_tbl(0).inventory_item_id IS NOT NULL) THEN
2989 l_org_item_found := TRUE;
2990 END IF;
2991 --sukhwsin::SB Effectivity code changes --ends
2992 END IF;
2993
2994 -- If an Organization Item is Found for the Material Requirement, then,
2995 -- Add the Material Requirement to the Corresponding Operation
2996 IF ( l_org_item_found = TRUE ) THEN
2997 l_org_item_found := FALSE;
2998 --sukhwsin:: SB Effectivity code changes - starts
2999 --sukhwsin::SB Control position changes - starts
3000 IF (l_material_req_rec.position_key IS NOT NULL) THEN
3001 /* In case of position based requirement, loop through position requirement table returned
3002 by API because it may contain more than one requirements in case of control position.
3003 */
3004 FOR k in l_pos_mtl_req_tbl.FIRST..l_pos_mtl_req_tbl.LAST
3005 LOOP
3006 --Check if item is present in current table index record.
3007 IF (l_pos_mtl_req_tbl(k).inventory_item_id IS NOT NULL) THEN
3008 l_mat_ctr := l_mat_ctr + 1;
3009 p_x_material_tbl(l_mat_ctr).inventory_item_id := l_pos_mtl_req_tbl(k).inventory_item_id;
3010 p_x_material_tbl(l_mat_ctr).requested_quantity := l_pos_mtl_req_tbl(k).quantity;
3011 p_x_material_tbl(l_mat_ctr).uom_code := l_pos_mtl_req_tbl(k).uom_code;
3012 p_x_material_tbl(l_mat_ctr).mc_header_id := l_mc_header_id; --l_pos_mtl_req_rec.mc_header_id;
3013 p_x_material_tbl(l_mat_ctr).mc_position_key := l_pos_mtl_req_tbl(k).position_key; --l_pos_mtl_req_rec.position_key;
3014 p_x_material_tbl(l_mat_ctr).rt_oper_material_id :=l_material_req_rec.rt_oper_material_id;
3015 --sukhwsin:: SB Effectivity code changes - ends
3016 -- Bug # 6377990 - start
3017 p_x_material_tbl(l_mat_ctr).repair_item :=l_material_req_rec.in_service;
3018 -- Bug # 6377990 - end
3019 --sukhwsin::SB Effectivity - Code Changes for uom conversion starts
3020 p_x_material_tbl(l_mat_ctr).item_group_id :=l_material_req_rec.item_group_id;
3021 --sukhwsin::SB Effectivity - Code Changes for uom conversion ends
3022 p_x_material_tbl(l_mat_ctr).visit_id :=p_workorder_rec.visit_id;
3023 p_x_material_tbl(l_mat_ctr).visit_task_id :=p_workorder_rec.visit_task_id;
3024 p_x_material_tbl(l_mat_ctr).organization_id :=p_workorder_rec.organization_id;
3025 p_x_material_tbl(l_mat_ctr).requested_date :=p_operation_tbl(i).scheduled_start_date;
3026 p_x_material_tbl(l_mat_ctr).job_number :=p_workorder_rec.job_number;
3027 p_x_material_tbl(l_mat_ctr).workorder_id :=p_workorder_rec.workorder_id;
3028 p_x_material_tbl(l_mat_ctr).wip_entity_id :=p_workorder_rec.wip_entity_id;
3029 p_x_material_tbl(l_mat_ctr).workorder_operation_id :=p_operation_tbl(i).workorder_operation_id;
3030 p_x_material_tbl(l_mat_ctr).operation_sequence :=p_operation_tbl(i).operation_sequence_num;
3031 p_x_material_tbl(l_mat_ctr).operation_code :=p_operation_tbl(i).operation_code;
3032 p_x_material_tbl(l_mat_ctr).operation_flag :='C';
3033 END IF;
3034 END LOOP;
3035 ELSE
3036 l_mat_ctr := l_mat_ctr + 1;
3037 p_x_material_tbl(l_mat_ctr).inventory_item_id := NVL(l_material_req_rec.inventory_item_id, l_alternate_item_id);
3038 p_x_material_tbl(l_mat_ctr).requested_quantity := l_material_req_rec.quantity;
3039 p_x_material_tbl(l_mat_ctr).uom_code := l_material_req_rec.uom_code;
3040
3041 p_x_material_tbl(l_mat_ctr).rt_oper_material_id :=l_material_req_rec.rt_oper_material_id;
3042 --sukhwsin:: SB Effectivity code changes - ends
3043 -- Bug # 6377990 - start
3044 p_x_material_tbl(l_mat_ctr).repair_item :=l_material_req_rec.in_service;
3045 -- Bug # 6377990 - end
3046 --sukhwsin::SB Effectivity - Code Changes for uom conversion starts
3047 p_x_material_tbl(l_mat_ctr).item_group_id :=l_material_req_rec.item_group_id;
3048 --sukhwsin::SB Effectivity - Code Changes for uom conversion ends
3049 p_x_material_tbl(l_mat_ctr).visit_id :=p_workorder_rec.visit_id;
3050 p_x_material_tbl(l_mat_ctr).visit_task_id :=p_workorder_rec.visit_task_id;
3051 p_x_material_tbl(l_mat_ctr).organization_id :=p_workorder_rec.organization_id;
3052 p_x_material_tbl(l_mat_ctr).requested_date :=p_operation_tbl(i).scheduled_start_date;
3053 p_x_material_tbl(l_mat_ctr).job_number :=p_workorder_rec.job_number;
3054 p_x_material_tbl(l_mat_ctr).workorder_id :=p_workorder_rec.workorder_id;
3055 p_x_material_tbl(l_mat_ctr).wip_entity_id :=p_workorder_rec.wip_entity_id;
3056 p_x_material_tbl(l_mat_ctr).workorder_operation_id :=p_operation_tbl(i).workorder_operation_id;
3057 p_x_material_tbl(l_mat_ctr).operation_sequence :=p_operation_tbl(i).operation_sequence_num;
3058 p_x_material_tbl(l_mat_ctr).operation_code :=p_operation_tbl(i).operation_code;
3059 p_x_material_tbl(l_mat_ctr).operation_flag :='C';
3060 END IF;
3061 --sukhwsin::SB Control position changes - ends
3062 END IF;
3063
3064 END LOOP;
3065 CLOSE get_oper_materials;
3066 END IF;
3067 END LOOP;
3068
3069 END get_op_material_req;
3070
3071 PROCEDURE get_rt_material_req
3072 (
3073 p_workorder_rec IN prd_workorder_rec,
3074 p_operation_tbl IN AHL_PRD_OPERATIONS_PVT.prd_operation_tbl,
3075 p_x_material_tbl IN OUT NOCOPY AHL_PP_MATERIALS_PVT.req_material_tbl_type
3076 )
3077 AS
3078
3079 -- For Getting the Material Requirements for a Route or Operation
3080 CURSOR get_rt_oper_materials (c_object_id NUMBER,
3081 c_association_type VARCHAR2)
3082 IS
3083 SELECT MAT.rt_oper_material_id,
3084 MAT.inventory_item_id,
3085 MAT.item_group_id,
3086 MAT.quantity,
3087 MAT.uom_code
3088 FROM AHL_RT_OPER_MATERIALS MAT
3089 WHERE MAT.association_type_code=c_association_type
3090 AND MAT.object_id=c_object_id;
3091
3092 l_material_req_rec get_rt_oper_materials%ROWTYPE;
3093
3094 -- For getting the Alternate Items for an Item Group
3095 CURSOR get_alternate_items (c_item_group_id NUMBER)
3096 IS
3097 SELECT inventory_item_id
3098 FROM AHL_ITEM_ASSOCIATIONS_B
3099 WHERE item_group_id=c_item_group_id
3100 ORDER BY priority;
3101
3102 -- For Checking whether an Item exisits in an Organization.
3103 -- ***Incorporate Master Org check***
3104 CURSOR check_org_item (c_inventory_item_id NUMBER,
3105 c_org_id NUMBER)
3106 IS
3107 SELECT 'X'
3108 FROM MTL_SYSTEM_ITEMS
3109 WHERE inventory_item_id=c_inventory_item_id
3110 AND organization_id=c_org_id;
3111
3112 l_mat_ctr NUMBER := 0;
3113 l_route_mat_found BOOLEAN := FALSE;
3114 l_org_item_found BOOLEAN := FALSE;
3115 l_dummy VARCHAR2(1);
3116 l_alternate_item_id NUMBER;
3117
3118 BEGIN
3119
3120 -- Get the Material Requirements defined for the Route
3121 OPEN get_rt_oper_materials( p_workorder_rec.route_id, 'ROUTE' );
3122 LOOP
3123 FETCH get_rt_oper_materials INTO l_material_req_rec;
3124 EXIT WHEN get_rt_oper_materials%NOTFOUND;
3125
3126 -- Atleast One Material Requirement defined for the Route
3127 l_route_mat_found := TRUE;
3128
3129 -- The Material Requirement is based on an Item
3130 IF ( l_material_req_rec.inventory_item_id IS NOT NULL ) THEN
3131
3132 -- Check if the Item is available in the Visit's Organization
3133 OPEN check_org_item( l_material_req_rec.inventory_item_id, p_workorder_rec.organization_id );
3134 FETCH check_org_item INTO l_dummy;
3135 IF ( check_org_item%FOUND ) THEN
3136
3137 -- Organization Item Found
3138 l_org_item_found := TRUE;
3139 END IF;
3140 CLOSE check_org_item;
3141 ELSE
3142
3143 -- Since the Material Requirement is Based on a Item Group,
3144 -- Process all the Alternate Items for the Item Group based on Priority
3145 FOR alt_item_cursor IN get_alternate_items( l_material_req_rec.item_group_id ) LOOP
3146
3147 -- Check if the Alternate Item is available in the Visit's Organization
3148 OPEN check_org_item( alt_item_cursor.inventory_item_id, p_workorder_rec.organization_id );
3149 FETCH check_org_item INTO l_dummy;
3150 IF ( check_org_item%FOUND ) THEN
3151
3152 -- Organization Item Found
3153 l_org_item_found := TRUE;
3154 l_alternate_item_id := alt_item_cursor.inventory_item_id;
3155 CLOSE check_org_item;
3156 EXIT;
3157 END IF;
3158 CLOSE check_org_item;
3159
3160 END LOOP;
3161 END IF;
3162
3163 -- If an Organization Item is Found for the Material Requirement, then,
3164 -- Add the Job Material Requirement to the First Operation
3165 IF ( l_org_item_found = TRUE ) THEN
3166 l_org_item_found := FALSE;
3167 l_mat_ctr := l_mat_ctr + 1;
3168 p_x_material_tbl(l_mat_ctr).rt_oper_material_id :=l_material_req_rec.rt_oper_material_id;
3169 p_x_material_tbl(l_mat_ctr).inventory_item_id :=NVL(l_material_req_rec.inventory_item_id, l_alternate_item_id);
3170 p_x_material_tbl(l_mat_ctr).requested_quantity :=l_material_req_rec.quantity;
3171 p_x_material_tbl(l_mat_ctr).visit_id :=p_workorder_rec.visit_id;
3172 p_x_material_tbl(l_mat_ctr).visit_task_id :=p_workorder_rec.visit_task_id;
3173 p_x_material_tbl(l_mat_ctr).organization_id :=p_workorder_rec.organization_id;
3174 p_x_material_tbl(l_mat_ctr).requested_date :=p_workorder_rec.scheduled_start_date;
3175 p_x_material_tbl(l_mat_ctr).job_number :=p_workorder_rec.job_number;
3176 p_x_material_tbl(l_mat_ctr).workorder_id :=p_workorder_rec.workorder_id;
3177 p_x_material_tbl(l_mat_ctr).workorder_operation_id :=p_operation_tbl(p_operation_tbl.FIRST).workorder_operation_id;
3178 p_x_material_tbl(l_mat_ctr).operation_sequence :=p_operation_tbl(p_operation_tbl.FIRST).operation_sequence_num;
3179 p_x_material_tbl(l_mat_ctr).operation_code :=p_operation_tbl(p_operation_tbl.FIRST).operation_code;
3180 p_x_material_tbl(l_mat_ctr).operation_flag :='C';
3181 END IF;
3182
3183 END LOOP;
3184 CLOSE get_rt_oper_materials;
3185
3186 IF ( l_route_mat_found = FALSE ) THEN
3187 FOR i in p_operation_tbl.FIRST..p_operation_tbl.LAST LOOP
3188
3189 -- Get the Material Requirements defined for the Operation
3190 OPEN get_rt_oper_materials( p_operation_tbl(i).operation_id, 'OPERATION' );
3191 LOOP
3192 FETCH get_rt_oper_materials INTO l_material_req_rec;
3193 EXIT WHEN get_rt_oper_materials%NOTFOUND;
3194
3195 -- The Material Requirement is based on an Item
3196 IF ( l_material_req_rec.inventory_item_id IS NOT NULL ) THEN
3197
3198 -- Check if the Item is available in the Visit's Organization
3199 OPEN check_org_item( l_material_req_rec.inventory_item_id, p_workorder_rec.organization_id );
3200 FETCH check_org_item INTO l_dummy;
3201 IF ( check_org_item%FOUND ) THEN
3202
3203 -- Organization Item Found
3204 l_org_item_found := TRUE;
3205 END IF;
3206 CLOSE check_org_item;
3207 ELSE
3208
3209 -- Since the Material Requirement is Based on a Item Group,
3210 -- Process all the Alternate Items for the Item Group
3211 -- based on Priority
3212 FOR alt_item_cursor IN get_alternate_items( l_material_req_rec.item_group_id ) LOOP
3213
3214 -- Check if the Alternate Item is available in the
3215 -- Visit's Organization
3216 OPEN check_org_item( alt_item_cursor.inventory_item_id, p_workorder_rec.organization_id );
3217 FETCH check_org_item INTO l_dummy;
3218 IF ( check_org_item%FOUND ) THEN
3219
3220 -- Organization Item Found
3221 l_org_item_found := TRUE;
3222 l_alternate_item_id := alt_item_cursor.inventory_item_id;
3223 CLOSE check_org_item;
3224 EXIT;
3225 END IF;
3226 CLOSE check_org_item;
3227
3228 END LOOP;
3229 END IF;
3230
3231 -- If an Organization Item is Found for the Material Requirement, then,
3232 -- Add the Material Requirement to the Corresponding Operation
3233 IF ( l_org_item_found = TRUE ) THEN
3234 l_org_item_found := FALSE;
3235 l_mat_ctr := l_mat_ctr + 1;
3236 p_x_material_tbl(l_mat_ctr).rt_oper_material_id :=l_material_req_rec.rt_oper_material_id;
3237 p_x_material_tbl(l_mat_ctr).inventory_item_id :=NVL(l_material_req_rec.inventory_item_id, l_alternate_item_id);
3238 p_x_material_tbl(l_mat_ctr).requested_quantity :=l_material_req_rec.quantity;
3239 p_x_material_tbl(l_mat_ctr).visit_id :=p_workorder_rec.visit_id;
3240 p_x_material_tbl(l_mat_ctr).visit_task_id :=p_workorder_rec.visit_task_id;
3241 p_x_material_tbl(l_mat_ctr).organization_id :=p_workorder_rec.organization_id;
3242 p_x_material_tbl(l_mat_ctr).requested_date :=p_workorder_rec.scheduled_start_date;
3243 p_x_material_tbl(l_mat_ctr).job_number :=p_workorder_rec.job_number;
3244 p_x_material_tbl(l_mat_ctr).workorder_id :=p_workorder_rec.workorder_id;
3245 p_x_material_tbl(l_mat_ctr).workorder_operation_id :=p_operation_tbl(i).workorder_operation_id;
3246 p_x_material_tbl(l_mat_ctr).operation_sequence :=p_operation_tbl(i).operation_sequence_num;
3247 p_x_material_tbl(l_mat_ctr).operation_code :=p_operation_tbl(i).operation_code;
3248 p_x_material_tbl(l_mat_ctr).operation_flag :='C';
3249 END IF;
3250
3251 END LOOP;
3252 CLOSE get_rt_oper_materials;
3253 END LOOP;
3254 END IF;
3255
3256 END get_rt_material_req;
3257
3258 PROCEDURE default_attributes
3259 (
3260 p_x_prd_workorder_rec IN OUT NOCOPY prd_workorder_rec
3261 )
3262 AS
3263 CURSOR get_route_inspection_type(c_route_id NUMBER)
3264 IS
3265 SELECT qa_inspection_type
3266 --FROM AHL_ROUTES_V --Changed from AHL_ROUTES_B for Application Usage Complaince.
3267 FROM AHL_ROUTES_APP_V --Changed from AHL_ROUTES_V for perf bug# 4949394.
3268 WHERE route_id=c_route_id;
3269
3270 --Adithya added for bug# 6830028
3271 CURSOR get_route_acc_class_code(c_route_id NUMBER)
3272 IS
3273 SELECT ACCOUNTING_CLASS_CODE
3274 FROM AHL_ROUTES_APP_V
3275 WHERE route_id=c_route_id;
3276
3277 CURSOR validate_acc_class_code( c_wip_acc_class_code VARCHAR2, c_organization_id NUMBER)
3278 IS
3279 select 'x'
3280 from WIP_ACCOUNTING_CLASSES
3281 where class_code = c_wip_acc_class_code
3282 and organization_id = c_organization_id
3283 and class_type = 6
3284 AND TRUNC(NVL(DISABLE_DATE,SYSDATE+1)) > TRUNC(SYSDATE);
3285
3286 l_acc_class_code VARCHAR2(10);
3287 l_qa_inspection_type VARCHAR2(150);
3288 l_msg_count NUMBER;
3289 l_msg_data VARCHAR2(2000);
3290 l_return_status VARCHAR2(1);
3291 -- ER 4460913
3292 -- l_project_num VARCHAR2(25);-- AVIKUKUM ::Bug #9002741 :: 30-NOV-2010
3293 l_visit_name VARCHAR2(80);
3294 l_dummy VARCHAR2(1);
3295
3296 -- AVIKUKUM ::Bug #9002741 :: 30-NOV-2010
3297 -- Commented out the cursor get_project_num as project number is not needed now
3298 /*-- rroy
3299 -- replace MTL_PROJECT_V with PJM_PROJECTS_ORG_OU_SECURE_V for R12
3300 -- required for PJM MOAC changes.
3301 CURSOR get_project_num(c_project_id NUMBER)
3302 IS
3303 SELECT project_number
3304 --FROM MTL_PROJECT_V
3305 FROM PJM_PROJECTS_ORG_OU_SECURE_V
3306 WHERE project_id = c_project_id;*/
3307
3308 CURSOR get_visit_name(c_visit_id NUMBER)
3309 IS
3310 SELECT VISIT_NAME
3311 FROM AHL_VISITS_TL
3312 WHERE VISIT_ID = c_visit_id;
3313
3314 --Balaji added for BAE ER # 4462462.
3315 CURSOR c_get_SR_details(p_visit_task_id NUMBER)
3316 IS
3317 SELECT
3318 CSIA.summary, -- sr summary
3319 CSIT.name -- sr type attribute
3320 FROM
3321 AHL_VISIT_TASKS_B VTSK,
3322 AHL_UNIT_EFFECTIVITIES_B UE,
3323 CS_INCIDENTS_ALL CSIA,
3324 CS_INCIDENT_TYPES_VL CSIT
3325 WHERE
3326 VTSK.visit_task_id = p_visit_task_id AND
3327 UE.Unit_effectivity_id = VTSK.unit_effectivity_id AND
3328 UE.manually_planned_flag = 'Y' AND
3329 UE.cs_incident_id IS NOT NULL AND
3330 NOT EXISTS (SELECT
3331 'X'
3332 FROM
3333 AHL_UE_RELATIONSHIPS UER
3334 WHERE
3335 UER.related_ue_id = UE.Unit_effectivity_id OR
3336 UER.ue_id = UE.Unit_effectivity_id) AND
3337 CSIA.incident_id = UE.cs_incident_id AND
3338 CSIT.incident_type_id = CSIA.incident_type_id;
3339
3340 l_sr_summary VARCHAR2(240);
3341 l_sr_type VARCHAR2(90);
3342 BEGIN
3343
3344 SELECT AHL_WORKORDERS_S.NEXTVAL
3345 INTO p_x_prd_workorder_rec.WORKORDER_ID
3346 FROM DUAL;
3347
3348 IF p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG = 'Y' AND p_x_prd_workorder_rec.VISIT_TASK_ID IS NULL THEN
3349 -- As per ER 4460913
3350 -- AVIKUKUM ::Bug #9002741 :: 30-NOV-2010
3351 -- Project number not needed anymore
3352 /*-- Visit master workorder name will be <project number> - <visit name>
3353 OPEN get_project_num(p_x_prd_workorder_rec.PROJECT_ID);
3354 FETCH get_project_num INTO l_project_num;
3355 CLOSE get_project_num;*/
3356
3357 OPEN get_visit_name(p_x_prd_workorder_rec.VISIT_ID);
3358 FETCH get_visit_name INTO l_visit_name;
3359 CLOSE get_visit_name;
3360
3361 -- AVIKUKUM ::Bug #9002741 :: 30-NOV-2010
3362 -- Made changes so that Visit MWO number now has the visit number (BATCH_ID) instead of project number
3363 p_x_prd_workorder_rec.JOB_NUMBER := p_x_prd_workorder_rec.BATCH_ID || ' - ' || substrb(l_visit_name, 1, 77 - (length(p_x_prd_workorder_rec.BATCH_ID)));
3364 ELSE
3365 SELECT work_order_prefix,
3366 default_eam_class
3367 INTO p_x_prd_workorder_rec.JOB_NUMBER,
3368 l_acc_class_code
3369 FROM WIP_EAM_PARAMETERS
3370 WHERE ORGANIZATION_ID=p_x_prd_workorder_rec.ORGANIZATION_ID;
3371
3372 SELECT p_x_prd_workorder_rec.JOB_NUMBER||TO_CHAR(AHL_WORKORDER_JOB_S.NEXTVAL)
3373 INTO p_x_prd_workorder_rec.JOB_NUMBER
3374 FROM DUAL;
3375
3376 --Adithya added for Accounting class bug#
3377 IF p_x_prd_workorder_rec.CLASS_CODE is NULL and p_x_prd_workorder_rec.ROUTE_ID IS NOT NULL THEN
3378 OPEN get_route_acc_class_code(p_x_prd_workorder_rec.ROUTE_ID);
3379 FETCH get_route_acc_class_code INTO p_x_prd_workorder_rec.CLASS_CODE;
3380 CLOSE get_route_acc_class_code;
3381 IF p_x_prd_workorder_rec.CLASS_CODE IS NOT NULL THEN
3382 OPEN validate_acc_class_code(p_x_prd_workorder_rec.CLASS_CODE, p_x_prd_workorder_rec.ORGANIZATION_ID);
3383 FETCH validate_acc_class_code INTO l_dummy;
3384 CLOSE validate_acc_class_code;
3385 IF l_dummy IS NULL THEN
3386 p_x_prd_workorder_rec.CLASS_CODE := l_acc_class_code;
3387 END IF;
3388 END IF;
3389 END IF;
3390 END IF;
3391
3392 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3393 fnd_log.string(FND_LOG.LEVEL_STATEMENT,'ahl.plsql.AHL_PRD_WORKORDER_PVT.default_attributes',
3394 'Acc Class code: ' || p_x_prd_workorder_rec.CLASS_CODE);
3395
3396 END IF;
3397
3398 --Balaji added for BAE ER # 4462462 - Start.
3399 -- Default workorder description for NR Workorder in following cases
3400 -- 1. Non-Routines(NR) created on the shop floor.
3401 -- 2. Non-Routines with no MRs associated and planned from UMP into a Visit.
3402 OPEN c_get_SR_details(p_x_prd_workorder_rec.visit_task_id);
3403 FETCH c_get_SR_details INTO l_sr_summary, l_sr_type;
3404 CLOSE c_get_SR_details;
3405
3406 IF l_sr_summary IS NOT NULL AND l_sr_type IS NOT NULL
3407 THEN
3408 -- fix for bug# 8641679
3409 p_x_prd_workorder_rec.job_description := SUBSTRB(l_sr_type || ' - ' ||l_sr_summary, 1, 240);
3410 END IF;
3411 --Balaji added for BAE ER # 4462462 - End.
3412 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER :=1;
3413 p_x_prd_workorder_rec.LAST_UPDATE_DATE :=SYSDATE;
3414 p_x_prd_workorder_rec.LAST_UPDATED_BY :=FND_GLOBAL.user_id;
3415 p_x_prd_workorder_rec.CREATION_DATE :=SYSDATE;
3416 p_x_prd_workorder_rec.CREATED_BY :=FND_GLOBAL.user_id;
3417 p_x_prd_workorder_rec.LAST_UPDATE_LOGIN :=FND_GLOBAL.user_id;
3418 p_x_prd_workorder_rec.WIP_ENTITY_ID :=NULL;
3419 --p_x_prd_workorder_rec.STATUS_CODE :=G_JOB_STATUS_UNRELEASED; -- Unreleased
3420
3421 IF p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG IS NULL OR
3422 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG = FND_API.G_MISS_CHAR THEN
3423 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG := 'N';
3424 END IF;
3425
3426 IF p_x_prd_workorder_rec.VISIT_TASK_ID = FND_API.G_MISS_NUM THEN
3427 p_x_prd_workorder_rec.VISIT_TASK_ID := NULL;
3428 END IF;
3429
3430 IF p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG = 'Y' THEN
3431 l_qa_inspection_type:= NULL;
3432 ELSIF p_x_prd_workorder_rec.ROUTE_ID IS NULL THEN
3433 l_qa_inspection_type:= FND_PROFILE.value('AHL_NR_WO_PLAN_TYPE');
3434 ELSIF p_x_prd_workorder_rec.ROUTE_ID IS NOT NULL THEN
3435 OPEN get_route_inspection_type(p_x_prd_workorder_rec.ROUTE_ID);
3436 FETCH get_route_inspection_type INTO l_qa_inspection_type;
3437 CLOSE get_route_inspection_type;
3438 END IF;
3439
3440 IF l_qa_inspection_type is NOT NULL THEN
3441 AHL_QA_RESULTS_PVT.get_qa_plan
3442 (
3443 p_api_version => 1.0,
3444 p_init_msg_list => FND_API.G_FALSE,
3445 p_commit => FND_API.G_FALSE,
3446 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
3447 p_default => FND_API.G_FALSE,
3448 p_module_type => NULL,
3449 x_return_status => l_return_status,
3450 x_msg_count => l_msg_count,
3451 x_msg_data => l_msg_data,
3452 p_organization_id => p_x_prd_workorder_rec.organization_id,
3453 p_transaction_number => 2001,
3454 p_col_trigger_value => l_qa_inspection_type,
3455 x_plan_id => p_x_prd_workorder_rec.plan_id
3456 );
3457 END IF;
3458
3459 -- Default Job Description from Task Name ( if not passed )
3460
3461 END default_attributes;
3462
3463 PROCEDURE get_operations
3464 (
3465 p_workorder_rec IN prd_workorder_rec,
3466 p_x_operations_tbl IN OUT NOCOPY AHL_PRD_OPERATIONS_PVT.prd_operation_tbl
3467 )
3468 AS
3469 CURSOR get_route_operations(c_route_id NUMBER)
3470 IS
3471 SELECT RO.operation_id,
3472 RO.step,
3473 OP.concatenated_segments,
3474 OP.operation_type_code,
3475 OP.description
3476 FROM AHL_OPERATIONS_VL OP,
3477 AHL_ROUTE_OPERATIONS RO
3478 WHERE OP.operation_id=RO.operation_id
3479 -- AND OP.revision_status_code='COMPLETE'
3480 AND RO.route_id=c_route_id
3481 AND OP.revision_number IN
3482 ( SELECT MAX(OP1.revision_number)
3483 FROM AHL_OPERATIONS_B_KFV OP1
3484 WHERE OP1.concatenated_segments=OP.concatenated_segments
3485 AND OP1.revision_status_code='COMPLETE'
3486 AND TRUNC(SYSDATE) BETWEEN TRUNC(OP1.start_date_active) AND
3487 TRUNC(NVL(OP1.end_date_active,SYSDATE+1))
3488 )
3489 ORDER BY RO.step;
3490
3491 l_count NUMBER := 1;
3492 l_blank_operation_txt FND_NEW_MESSAGES.message_text%TYPE;
3493
3494 -- Added for FP bug# 7238868
3495 l_department_id NUMBER;
3496 l_department_name bom_departments.description%TYPE;
3497 l_route_found VARCHAR2(1);
3498 l_oper_found VARCHAR2(1);
3499 l_return_status VARCHAR2(1);
3500
3501 BEGIN
3502 IF ( p_workorder_rec.ROUTE_ID IS NOT NULL ) THEN
3503 FOR op_cursor IN get_route_operations( p_workorder_rec.ROUTE_ID ) LOOP
3504 p_x_operations_tbl( l_count ).operation_sequence_num := op_cursor.step;
3505 p_x_operations_tbl( l_count ).operation_id := op_cursor.operation_id;
3506 p_x_operations_tbl( l_count ).operation_code := op_cursor.concatenated_segments;
3507 p_x_operations_tbl( l_count ).operation_type_code := op_cursor.operation_type_code;
3508 p_x_operations_tbl( l_count ).operation_description := op_cursor.description;
3509 p_x_operations_tbl( l_count ).organization_id := p_workorder_rec.organization_id;
3510 p_x_operations_tbl( l_count ).workorder_id := p_workorder_rec.workorder_id;
3511 p_x_operations_tbl( l_count ).route_id := p_workorder_rec.route_id;
3512 p_x_operations_tbl( l_count ).department_id := p_workorder_rec.department_id;
3513 p_x_operations_tbl( l_count ).scheduled_start_date := p_workorder_rec.scheduled_start_date;
3514 p_x_operations_tbl( l_count ).scheduled_end_date := p_workorder_rec.scheduled_end_date;
3515 p_x_operations_tbl( l_count ).status_code := G_OP_STATUS_UNCOMPLETE;
3516 p_x_operations_tbl( l_count ).propagate_flag := 'N';
3517 p_x_operations_tbl( l_count ).dml_operation := 'C';
3518
3519 l_count := l_count + 1;
3520 END LOOP;
3521 END IF;
3522
3523 IF ( p_x_operations_tbl.COUNT = 0 ) THEN
3524 -- Blank Operation
3525 p_x_operations_tbl( l_count ).operation_sequence_num := 10;
3526
3527 p_x_operations_tbl( l_count ).organization_id := p_workorder_rec.organization_id;
3528 p_x_operations_tbl( l_count ).workorder_id := p_workorder_rec.workorder_id;
3529 p_x_operations_tbl( l_count ).route_id := p_workorder_rec.route_id;
3530 p_x_operations_tbl( l_count ).department_id := p_workorder_rec.department_id;
3531 p_x_operations_tbl( l_count ).scheduled_start_date := p_workorder_rec.scheduled_start_date;
3532 p_x_operations_tbl( l_count ).scheduled_end_date := p_workorder_rec.scheduled_end_date;
3533 p_x_operations_tbl( l_count ).status_code := G_OP_STATUS_UNCOMPLETE;
3534 p_x_operations_tbl( l_count ).propagate_flag := 'N';
3535
3536 FND_MESSAGE.set_name('AHL','AHL_PRD_BLANK_OPERATION');
3537 l_blank_operation_txt := FND_MESSAGE.get;
3538 p_x_operations_tbl( l_count ).operation_description := NVL(SUBSTRB(RTRIM(l_blank_operation_txt),1,80),'Blank Operation');
3539
3540 p_x_operations_tbl( l_count ).dml_operation := 'C';
3541
3542 END IF;
3543
3544 -- Added for FP bug# 7238868
3545 IF (p_workorder_rec.ROUTE_ID IS NOT NULL ) THEN
3546
3547 IF ( G_DEBUG = 'Y' ) THEN
3548 AHL_DEBUG_PUB.debug( 'Get_Operations'|| ' - Before Get_Default_Rt_Op_dept' );
3549 END IF;
3550
3551 -- Get default department from route/oper resources.
3552 Get_Default_Rt_Op_dept(p_object_id => p_workorder_rec.ROUTE_ID,
3553 p_association_type => 'ROUTE',
3554 p_organization_id => p_workorder_rec.organization_id,
3555 x_return_status => l_return_status,
3556 x_department_id => l_department_id,
3557 x_department_name => l_department_name,
3558 x_object_resource_found => l_route_found);
3559
3560 IF ( G_DEBUG = 'Y' ) THEN
3561 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_return_status:' || l_return_status );
3562 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_department_id:' || l_department_id);
3563 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_department_name:' || l_department_name);
3564 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_route_found:' || l_route_found);
3565 END IF;
3566
3567 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3568 RAISE FND_API.G_EXC_ERROR;
3569 END IF;
3570
3571 IF (l_route_found = 'Y') THEN
3572 IF (l_department_id IS NOT NULL) THEN
3573 -- replace only first operation dept with default dept.
3574 p_x_operations_tbl(p_x_operations_tbl.FIRST).department_id := l_department_id;
3575 p_x_operations_tbl(p_x_operations_tbl.FIRST).department_name := l_department_name;
3576 END IF;
3577
3578 ELSE
3579 -- loop each operation and default dept.
3580 FOR i IN p_x_operations_tbl.FIRST..p_x_operations_tbl.LAST
3581 LOOP
3582 -- Get default department from route/oper resources.
3583 Get_Default_Rt_Op_dept(p_object_id => p_x_operations_tbl(i).operation_id,
3584 p_association_type => 'OPERATION',
3585 p_organization_id => p_workorder_rec.organization_id,
3586 x_return_status => l_return_status,
3587 x_department_id => l_department_id,
3588 x_department_name => l_department_name,
3589 x_object_resource_found => l_oper_found);
3590
3591 IF ( G_DEBUG = 'Y' ) THEN
3592 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_return_status:' || l_return_status );
3593 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_department_id:' || l_department_id);
3594 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_department_name:' || l_department_name);
3595 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_oper_found:' || l_oper_found);
3596 END IF;
3597
3598 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3599 RAISE FND_API.G_EXC_ERROR;
3600 END IF;
3601
3602 IF (l_department_id IS NOT NULL) THEN
3603 p_x_operations_tbl(i).department_id := l_department_id;
3604 p_x_operations_tbl(i).department_name := l_department_name;
3605 END IF;
3606
3607 END LOOP;
3608 END IF; -- l_route_found = 'Y'
3609 END IF; -- p_workorder_rec.ROUTE_ID
3610
3611 END get_operations;
3612
3613 -- MANESING::Execution Enhancements, 09-Mar-2011, added following procedure
3614 -- Start of Comments
3615 -- Procedure name : process_wo_operations_reln
3616 -- Type : Private
3617 -- Description : This procedure retrieves the operations dependencies for a route (corresponding to workorder)
3618 -- defined in Engineering, and populates the workorder operations relationship table
3619 -- accordingly.
3620 -- Pre-reqs :
3621 -- Parameters : p_workorder_rec IN prd_workorder_rec Required
3622 --
3623 -- End of Comments
3624 PROCEDURE process_wo_operations_reln
3625 (
3626 p_workorder_rec IN prd_workorder_rec
3627 )
3628 IS
3629 --
3630 CURSOR get_oper_dependencies_csr (c_workorder_id NUMBER,
3631 c_route_id NUMBER)
3632 IS
3633 WITH VALID_RT_OPER_IDS
3634 AS
3635 (Select ARO.route_operation_id,
3636 AWO.operation_sequence_num
3637
3638 From AHL_WORKORDER_OPERATIONS AWO,
3639 AHL_ROUTE_OPERATIONS ARO
3640
3641 Where AWO.workorder_id = c_workorder_id
3642 AND AWO.operation_id = ARO.operation_id
3643 AND ARO.route_id = c_route_id
3644 )
3645 SELECT FROMOP.operation_sequence_num from_operation_seq,
3646 TOOP.operation_sequence_num to_operation_seq,
3647 AROD.dependency_code precedence_constraint,
3648 AROD.rt_op_dependency_id route_oper_reln_id
3649
3650 FROM AHL_RT_OPER_DEPENDENCIES AROD,
3651 VALID_RT_OPER_IDS FROMOP,
3652 VALID_RT_OPER_IDS TOOP
3653
3654 WHERE AROD.from_rt_op_id = FROMOP.route_operation_id
3655 AND AROD.to_rt_op_id = TOOP.route_operation_id;
3656 --
3657 l_api_name CONSTANT VARCHAR2(30) := 'PROCESS_WO_OPERATIONS_RELN';
3658 l_reln_count NUMBER := 0;
3659 --
3660 BEGIN
3661
3662 /* Get all operations dependencies defined in engineering for route corresponding to the workorder,
3663 * for which both the associated operations in a relationship are active on SYSDATE of P2P.
3664 * This condition is taken care of by deriving operations from workorder operations table.
3665 */
3666 FOR oper_dependency_rec in get_oper_dependencies_csr (p_workorder_rec.workorder_id,
3667 p_workorder_rec.route_id)
3668 LOOP
3669 -- populate workorder operations relationship table
3670 INSERT INTO AHL_WO_OPERATIONS_RELN
3671 (
3672 workorder_id,
3673 wip_entity_id,
3674 from_operation_seq,
3675 to_operation_seq,
3676 precedence_constraint,
3677 route_oper_reln_id,
3678 min_separation,
3679 min_separation_time_unit,
3680 max_separation,
3681 max_separation_time_unit,
3682 security_group_id,
3683 object_version_number,
3684 last_update_date,
3685 last_updated_by,
3686 creation_date,
3687 created_by,
3688 last_update_login
3689 )
3690 VALUES
3691 (
3692 p_workorder_rec.workorder_id,
3693 p_workorder_rec.wip_entity_id,
3694 oper_dependency_rec.from_operation_seq,
3695 oper_dependency_rec.to_operation_seq,
3696 oper_dependency_rec.precedence_constraint,
3697 oper_dependency_rec.route_oper_reln_id,
3698 null, -- since separation between the workorder operations is not taken into consideration
3699 null,
3700 null,
3701 null,
3702 p_workorder_rec.security_group_id,
3703 p_workorder_rec.object_version_number,
3704 p_workorder_rec.last_update_date,
3705 p_workorder_rec.last_updated_by,
3706 p_workorder_rec.creation_date,
3707 p_workorder_rec.created_by,
3708 p_workorder_rec.last_update_login
3709 );
3710
3711 l_reln_count := l_reln_count + 1;
3712 END LOOP;
3713
3714 IF ( G_DEBUG = 'Y' ) THEN
3715 AHL_DEBUG_PUB.debug( l_api_name || ' - Total Workorder operations relationships:' || l_reln_count );
3716 END IF;
3717
3718 END process_wo_operations_reln;
3719
3720 PROCEDURE create_job
3721 (
3722 p_api_version IN NUMBER := 1.0,
3723 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
3724 p_commit IN VARCHAR2 := FND_API.G_FALSE,
3725 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
3726 p_default IN VARCHAR2 := FND_API.G_FALSE,
3727 p_module_type IN VARCHAR2,
3728 x_return_status OUT NOCOPY VARCHAR2,
3729 x_msg_count OUT NOCOPY NUMBER,
3730 x_msg_data OUT NOCOPY VARCHAR2,
3731 p_wip_load_flag IN VARCHAR2 := 'Y', -- Change to N
3732 p_x_prd_workorder_rec IN OUT NOCOPY prd_workorder_rec,
3733 x_operation_tbl OUT NOCOPY AHL_PRD_OPERATIONS_PVT.prd_operation_tbl,
3734 x_resource_tbl OUT NOCOPY AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type,
3735 x_material_tbl OUT NOCOPY AHL_PP_MATERIALS_PVT.req_material_tbl_type
3736 )
3737 AS
3738 l_api_name CONSTANT VARCHAR2(30) := 'CREATE_JOB';
3739 l_api_version CONSTANT NUMBER := 1.0;
3740 l_msg_count NUMBER;
3741 l_msg_data VARCHAR2(2000);
3742 l_return_status VARCHAR2(1);
3743 l_job_return_status VARCHAR2(1);
3744
3745 -- Begin OGMA Issue # 105 - Balaji
3746 -- cursor for checking if given task is planned task created form forecasted UE.
3747 CURSOR c_can_update_quantity(p_task_id NUMBER)
3748 IS
3749 SELECT
3750 'X'
3751 FROM
3752 ahl_visit_tasks_b vtsk
3753 WHERE
3754 vtsk.quantity IS NULL AND
3755 vtsk.status_code <> 'DELETED' AND
3756 vtsk.visit_task_id = p_task_id
3757
3758 UNION
3759
3760 SELECT
3761 'X'
3762 FROM
3763 ahl_visit_tasks_b vtsk,
3764 ahl_unit_effectivities_b aue
3765 WHERE
3766 nvl(aue.manually_planned_flag, 'N') = 'N' AND
3767 vtsk.unit_effectivity_id = aue.unit_effectivity_id AND
3768 vtsk.status_code <> 'DELETED' AND
3769 vtsk.visit_task_id = p_task_id;
3770
3771 -- cursor for getting instance quantity for planned tasks.
3772 CURSOR c_get_instance_quantity(p_task_id NUMBER)
3773 IS
3774 SELECT
3775 csi.quantity
3776 FROM
3777 csi_item_instances csi,
3778 ahl_visit_tasks_b vtsk
3779 WHERE
3780 vtsk.instance_id = csi.instance_id AND
3781 vtsk.status_code <> 'DELETED' AND
3782 vtsk.visit_task_id = p_task_id;
3783
3784 -- MANESING::NR Analysis, 03-Jun-2011, added cursor to check whether the Workorder is a Stage Workorder
3785 CURSOR check_stg_workorder_csr (c_visit_task_id NUMBER)
3786 IS
3787 SELECT 'Y'
3788 FROM AHL_VISIT_TASKS_B
3789 WHERE visit_task_id = c_visit_task_id
3790 AND task_type_code = 'STAGE';
3791 --
3792
3793 l_instance_quantity NUMBER;
3794 l_can_update_quantity VARCHAR2(1);
3795 -- End OGMA Issue # 105 - Balaji
3796 l_is_stage_workorder VARCHAR2(1);
3797
3798 -- pdoki modified the query to check for position based material reqs along with item group based reqs
3799 --sukhwsin: VCP Integration Requirements - Added cursor to get material req count that contains item group
3800 CURSOR Get_Alt_Mat_Requirment_Count(c_visit_task_id IN NUMBER)
3801 IS
3802 SELECT COUNT(MAT.scheduled_material_id)
3803 FROM AHL_SCHEDULE_MATERIALS MAT
3804 WHERE MAT.VISIT_TASK_ID = c_visit_task_id
3805 AND NVL(MAT.STATUS,'NOTDEL') <> 'DELETED'
3806 AND
3807 (
3808 (
3809 MAT.ITEM_GROUP_ID IS NOT NULL
3810 AND MAT.INVENTORY_ITEM_ID IS NOT NULL
3811 )
3812 OR
3813 (
3814 MAT.MC_HEADER_ID IS NOT NULL
3815 AND MAT.POSITION_KEY IS NOT NULL
3816 )
3817 );
3818 --sukhwsin:: VCP Integration Requirements - Added variables - starts
3819 l_alt_mat_req_count NUMBER;
3820 l_alt_item_exist VARCHAR2(1);
3821 --sukhwsin:: VCP Integration Requirements - Added variables - ends
3822 -- JKJain, NR Analysis and Forecasting
3823 l_fleet_header_id NUMBER := NULL;
3824 l_maintenance_type_code VARCHAR2(30) := NULL;
3825 l_uc_header_id number := null;
3826 l_nha_uc_header_id NUMBER := NULL;
3827 --sukhwsin::Complex Assembly Enhancements changes - starts
3828 --Cursor to get instance routing attached to workorder instance.
3829 CURSOR Get_Wo_Inst_Rtng(p_workorder_id IN NUMBER) IS
3830 SELECT RTNG.INST_ROUTING_CODE INSTANCE_RTNG
3831 FROM
3832 AHL_WORKORDERS WO, AHL_VISIT_TASKS_B TSK, AHL_VISIT_INST_ROUTINGS RTNG
3833 WHERE
3834 WO.WORKORDER_ID = p_workorder_id
3835 AND WO.VISIT_TASK_ID = TSK.VISIT_TASK_ID
3836 AND TSK.INSTANCE_ID IS NOT NULL
3837 AND TSK.VISIT_ID = RTNG.VISIT_ID
3838 AND TSK.INSTANCE_ID = RTNG.INSTANCE_ID;
3839 --Local Variable declaration for Complex Assembly enhancement changes
3840 l_instance_rtng VARCHAR2(240);
3841 --sukhwsin::Complex Assembly Enhancements changes - ends
3842 BEGIN
3843 SAVEPOINT create_job_PVT;
3844
3845 IF NOT FND_API.compatible_api_call(l_api_version,
3846 p_api_version,
3847 l_api_name,G_PKG_NAME) THEN
3848 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3849 END IF;
3850
3851 IF FND_API.to_boolean(p_init_msg_list) THEN
3852 FND_MSG_PUB.initialize;
3853 END IF;
3854
3855 x_return_status:=FND_API.G_RET_STS_SUCCESS;
3856
3857 IF G_DEBUG='Y' THEN
3858 AHL_DEBUG_PUB.enable_debug;
3859 END IF;
3860
3861 -- User Hooks
3862 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'CREATE_JOB', 'B', 'C' )) then
3863 ahl_prd_workorder_CUHK.create_job_pre(
3864 p_prd_workorder_rec => p_x_prd_workorder_rec,
3865 x_msg_count => l_msg_count,
3866 x_msg_data => l_msg_data,
3867 x_return_status => l_return_status);
3868 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3869 RAISE FND_API.G_EXC_ERROR;
3870 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3871 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3872 END IF;
3873 END IF;
3874
3875 IF ( G_DEBUG = 'Y' ) THEN
3876 AHL_DEBUG_PUB.debug( l_api_name || ' - Before validate_workorder' );
3877 END IF;
3878
3879 IF (p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
3880 validate_workorder
3881 (
3882 p_prd_workorder_rec =>p_x_prd_workorder_rec,
3883 p_wip_load_flag =>p_wip_load_flag
3884 );
3885
3886 l_msg_count := FND_MSG_PUB.count_msg;
3887 IF l_msg_count > 0 THEN
3888 x_msg_count := l_msg_count;
3889 RAISE FND_API.G_EXC_ERROR;
3890 END IF;
3891 END IF;
3892
3893 IF ( G_DEBUG = 'Y' ) THEN
3894 AHL_DEBUG_PUB.debug( l_api_name || ' - Before default_attributes' );
3895 END IF;
3896
3897 default_attributes
3898 (
3899 p_x_prd_workorder_rec =>p_x_prd_workorder_rec
3900 );
3901
3902 IF ( G_DEBUG = 'Y' ) THEN
3903 AHL_DEBUG_PUB.debug( l_api_name || ' - Before Insert into AHL_WORKORDERS' );
3904 END IF;
3905
3906 -- Begin OGMA Issue # 105 - Balaji
3907 -- update VWP planned task quantity current instance quantity
3908 -- this logic need to be moved to VWP later as per discussion with Shailaja and Jay.
3909 IF p_x_prd_workorder_rec.visit_task_id IS NOT NULL AND p_x_prd_workorder_rec.STATUS_CODE <> '17'
3910 THEN
3911
3912 OPEN c_can_update_quantity(p_x_prd_workorder_rec.visit_task_id);
3913 FETCH c_can_update_quantity INTO l_can_update_quantity;
3914 CLOSE c_can_update_quantity;
3915
3916 IF l_can_update_quantity IS NOT NULL
3917 THEN
3918
3919 OPEN c_get_instance_quantity(p_x_prd_workorder_rec.visit_task_id);
3920 FETCH c_get_instance_quantity INTO l_instance_quantity;
3921 CLOSE c_get_instance_quantity;
3922
3923 UPDATE
3924 ahl_visit_tasks_b
3925 SET
3926 quantity = l_instance_quantity
3927 WHERE
3928 visit_task_id = p_x_prd_workorder_rec.visit_task_id;
3929 END IF;
3930 END IF;
3931 -- End OGMA Issue # 105 - Balaji
3932 --sukhwsin: VCP Integration Requirements - code changes - starts
3933 --Check if task contains any item group based requirement. If yes then populate ITEM_ALTERNATES_EXIST column
3934 --in ahl_workorders table to 'Y'
3935 l_alt_mat_req_count := 0;
3936 l_alt_item_exist := NULL;
3937 OPEN Get_Alt_Mat_Requirment_Count(p_x_prd_workorder_rec.VISIT_TASK_ID);
3938 FETCH Get_Alt_Mat_Requirment_Count INTO l_alt_mat_req_count;
3939 CLOSE Get_Alt_Mat_Requirment_Count;
3940 IF ( l_alt_mat_req_count > 0) THEN
3941 l_alt_item_exist := 'Y';
3942 END IF;
3943 --sukhwsin: VCP Integration Requirements - code changes - end
3944 -- JKJain, NR Analysis and Forecasting
3945 get_uc_fleet_mntnc(
3946 p_prd_workorder_rec => p_x_prd_workorder_rec,
3947 x_fleet_header_id => l_fleet_header_id,
3948 x_uc_header_id => l_uc_header_id,
3949 x_nha_uc_header_id => l_nha_uc_header_id,
3950 x_maintenance_type_code => l_maintenance_type_code
3951 );
3952 INSERT INTO AHL_WORKORDERS
3953 (
3954 WORKORDER_ID,
3955 OBJECT_VERSION_NUMBER,
3956 LAST_UPDATE_DATE,
3957 LAST_UPDATED_BY,
3958 CREATION_DATE,
3959 CREATED_BY,
3960 LAST_UPDATE_LOGIN,
3961 WORKORDER_NAME,
3962 WIP_ENTITY_ID,
3963 VISIT_ID,
3964 VISIT_TASK_ID,
3965 STATUS_CODE,
3966 PLAN_ID,
3967 COLLECTION_ID,
3968 ROUTE_ID,
3969 ACTUAL_START_DATE,
3970 ACTUAL_END_DATE,
3971 CONFIRM_FAILURE_FLAG,
3972 MASTER_WORKORDER_FLAG,
3973 ATTRIBUTE_CATEGORY,
3974 ATTRIBUTE1,
3975 ATTRIBUTE2,
3976 ATTRIBUTE3,
3977 ATTRIBUTE4,
3978 ATTRIBUTE5,
3979 ATTRIBUTE6,
3980 ATTRIBUTE7,
3981 ATTRIBUTE8,
3982 ATTRIBUTE9,
3983 ATTRIBUTE10,
3984 ATTRIBUTE11,
3985 ATTRIBUTE12,
3986 ATTRIBUTE13,
3987 ATTRIBUTE14,
3988 ATTRIBUTE15,
3989 --sukhwsin:: Added column for VCP integration requirement
3990 ITEM_ALTERNATES_EXIST,
3991 -- JKJain, NR Analysis and Forecasting
3992 UC_HEADER_ID,
3993 NHA_UC_HEADER_ID,
3994 FLEET_HEADER_ID,
3995 MAINTENANCE_TYPE_CODE,
3996 AOG_FLAG
3997 ) VALUES
3998 (
3999 p_x_prd_workorder_rec.WORKORDER_ID,
4000 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER,
4001 p_x_prd_workorder_rec.LAST_UPDATE_DATE,
4002 p_x_prd_workorder_rec.LAST_UPDATED_BY,
4003 p_x_prd_workorder_rec.CREATION_DATE,
4004 p_x_prd_workorder_rec.CREATED_BY,
4005 p_x_prd_workorder_rec.LAST_UPDATE_LOGIN,
4006 p_x_prd_workorder_rec.JOB_NUMBER,
4007 p_x_prd_workorder_rec.WIP_ENTITY_ID,
4008 p_x_prd_workorder_rec.VISIT_ID,
4009 p_x_prd_workorder_rec.VISIT_TASK_ID,
4010 p_x_prd_workorder_rec.STATUS_CODE,
4011 p_x_prd_workorder_rec.PLAN_ID,
4012 p_x_prd_workorder_rec.COLLECTION_ID,
4013 p_x_prd_workorder_rec.ROUTE_ID,
4014 p_x_prd_workorder_rec.ACTUAL_START_DATE,
4015 p_x_prd_workorder_rec.ACTUAL_END_DATE,
4016 p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG,
4017 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG,
4018 p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY,
4019 p_x_prd_workorder_rec.ATTRIBUTE1,
4020 p_x_prd_workorder_rec.ATTRIBUTE2,
4021 p_x_prd_workorder_rec.ATTRIBUTE3,
4022 p_x_prd_workorder_rec.ATTRIBUTE4,
4023 p_x_prd_workorder_rec.ATTRIBUTE5,
4024 p_x_prd_workorder_rec.ATTRIBUTE6,
4025 p_x_prd_workorder_rec.ATTRIBUTE7,
4026 p_x_prd_workorder_rec.ATTRIBUTE8,
4027 p_x_prd_workorder_rec.ATTRIBUTE9,
4028 p_x_prd_workorder_rec.ATTRIBUTE10,
4029 p_x_prd_workorder_rec.ATTRIBUTE11,
4030 p_x_prd_workorder_rec.ATTRIBUTE12,
4031 p_x_prd_workorder_rec.ATTRIBUTE13,
4032 p_x_prd_workorder_rec.ATTRIBUTE14,
4033 p_x_prd_workorder_rec.ATTRIBUTE15,
4034 --sukhwsin:: Added column for VCP integration requirement
4035 l_alt_item_exist,
4036 -- JKJain, NR Analysis and Forecasting
4037 l_uc_header_id,
4038 l_nha_uc_header_id,
4039 l_fleet_header_id,
4040 L_MAINTENANCE_TYPE_CODE,
4041 p_x_prd_workorder_rec.AOG_FLAG
4042 );
4043
4044 IF ( G_DEBUG = 'Y' ) THEN
4045 AHL_DEBUG_PUB.debug( l_api_name || ' - Before Insert into AHL_WORKORDER_TXNS' );
4046 END IF;
4047
4048 INSERT INTO AHL_WORKORDER_TXNS
4049 (
4050 WORKORDER_TXN_ID,
4051 OBJECT_VERSION_NUMBER,
4052 LAST_UPDATE_DATE,
4053 LAST_UPDATED_BY,
4054 CREATION_DATE,
4055 CREATED_BY,
4056 LAST_UPDATE_LOGIN,
4057 WORKORDER_ID,
4058 TRANSACTION_TYPE_CODE,
4059 STATUS_CODE,
4060 SCHEDULED_START_DATE,
4061 SCHEDULED_END_DATE,
4062 ACTUAL_START_DATE,
4063 ACTUAL_END_DATE,
4064 LOT_NUMBER,
4065 COMPLETION_SUBINVENTORY,
4066 COMPLETION_LOCATOR_ID,
4067 SECURITY_GROUP_ID,
4068 ATTRIBUTE_CATEGORY,
4069 ATTRIBUTE1,
4070 ATTRIBUTE2,
4071 ATTRIBUTE3,
4072 ATTRIBUTE4,
4073 ATTRIBUTE5,
4074 ATTRIBUTE6,
4075 ATTRIBUTE7,
4076 ATTRIBUTE8,
4077 ATTRIBUTE9,
4078 ATTRIBUTE10,
4079 ATTRIBUTE11,
4080 ATTRIBUTE12,
4081 ATTRIBUTE13,
4082 ATTRIBUTE14,
4083 ATTRIBUTE15,
4084 -- JKJain, NR Analysis and Forecasting
4085 UC_HEADER_ID,
4086 NHA_UC_HEADER_ID
4087 ) VALUES
4088 (
4089 AHL_WORKORDER_TXNS_S.NEXTVAL,
4090 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER,
4091 p_x_prd_workorder_rec.LAST_UPDATE_DATE,
4092 p_x_prd_workorder_rec.LAST_UPDATED_BY,
4093 p_x_prd_workorder_rec.CREATION_DATE,
4094 p_x_prd_workorder_rec.CREATED_BY,
4095 p_x_prd_workorder_rec.LAST_UPDATE_LOGIN,
4096 p_x_prd_workorder_rec.WORKORDER_ID,
4097 0, -- check this transaction type code
4098 p_x_prd_workorder_rec.STATUS_CODE,
4099 p_x_prd_workorder_rec.SCHEDULED_START_DATE,
4100 p_x_prd_workorder_rec.SCHEDULED_END_DATE,
4101 p_x_prd_workorder_rec.ACTUAL_START_DATE,
4102 p_x_prd_workorder_rec.ACTUAL_END_DATE,
4103 NULL,
4104 p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY,
4105 p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID,
4106 p_x_prd_workorder_rec.SECURITY_GROUP_ID,
4107 p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY,
4108 p_x_prd_workorder_rec.ATTRIBUTE1,
4109 p_x_prd_workorder_rec.ATTRIBUTE2,
4110 p_x_prd_workorder_rec.ATTRIBUTE3,
4111 p_x_prd_workorder_rec.ATTRIBUTE4,
4112 p_x_prd_workorder_rec.ATTRIBUTE5,
4113 p_x_prd_workorder_rec.ATTRIBUTE6,
4114 p_x_prd_workorder_rec.ATTRIBUTE7,
4115 p_x_prd_workorder_rec.ATTRIBUTE8,
4116 p_x_prd_workorder_rec.ATTRIBUTE9,
4117 p_x_prd_workorder_rec.ATTRIBUTE10,
4118 p_x_prd_workorder_rec.ATTRIBUTE11,
4119 p_x_prd_workorder_rec.ATTRIBUTE12,
4120 p_x_prd_workorder_rec.ATTRIBUTE13,
4121 p_x_prd_workorder_rec.ATTRIBUTE14,
4122 p_x_prd_workorder_rec.ATTRIBUTE15,
4123 -- JKJain, NR Analysis and Forecasting
4124 l_uc_header_id,
4125 l_nha_uc_header_id
4126 );
4127
4128 --sukhwsin::Complex Assembly Enhancements changes - starts
4129 /*
4130 Check if instance routing exist for instance associated to visit task
4131 then add WO turnover notes for instance routing.
4132 */
4133 l_instance_rtng := NULL;
4134 OPEN Get_Wo_Inst_Rtng(p_x_prd_workorder_rec.WORKORDER_ID );
4135 FETCH Get_Wo_Inst_Rtng INTO l_instance_rtng;
4136 CLOSE Get_Wo_Inst_Rtng;
4137 IF (l_instance_rtng IS NOT NULL) THEN
4138 Add_Inst_Rtng_Notes_To_WO(
4139 p_api_version => 1.0,
4140 p_init_msg_list => FND_API.G_FALSE,
4141 p_commit => FND_API.G_FALSE,
4142 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4143 x_return_status => l_return_status,
4144 x_msg_count => l_msg_count,
4145 x_msg_data => l_msg_data,
4146 p_workorder_id => p_x_prd_workorder_rec.WORKORDER_ID,
4147 p_new_inst_rtng => l_instance_rtng
4148 );
4149 l_msg_count := FND_MSG_PUB.count_msg;
4150 IF l_msg_count > 0 THEN
4151 RAISE FND_API.G_EXC_ERROR;
4152 END IF;
4153 END IF;
4154 --sukhwsin::Complex Assembly Enhancements changes - ends
4155
4156 IF ( p_x_prd_workorder_rec.master_workorder_flag = 'N' ) THEN
4157
4158 IF ( G_DEBUG = 'Y' ) THEN
4159 AHL_DEBUG_PUB.debug( l_api_name || ' - Before get_operations. Route ID: '|| p_x_prd_workorder_rec.route_id );
4160 END IF;
4161
4162 get_operations
4163 (
4164 p_workorder_rec => p_x_prd_workorder_rec,
4165 p_x_operations_tbl => x_operation_tbl
4166 );
4167
4168 IF ( G_DEBUG = 'Y' ) THEN
4169 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PRD_OPERATIONS_PVT.process_operations . Total Operations : '|| x_operation_tbl.COUNT );
4170 END IF;
4171
4172 AHL_PRD_OPERATIONS_PVT.process_operations
4173 (
4174 p_api_version => 1.0,
4175 p_init_msg_list => FND_API.G_TRUE,
4176 p_commit => FND_API.G_FALSE,
4177 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4178 p_default => FND_API.G_TRUE,
4179 p_module_type => NULL,
4180 p_wip_mass_load_flag => 'N',
4181 x_return_status => l_return_status,
4182 x_msg_count => l_msg_count,
4183 x_msg_data => l_msg_data,
4184 p_x_prd_operation_tbl => x_operation_tbl
4185 );
4186
4187 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
4188 RAISE FND_API.G_EXC_ERROR;
4189 END IF;
4190
4191 IF ( p_x_prd_workorder_rec.route_id IS NOT NULL ) THEN
4192
4193 IF ( G_DEBUG = 'Y' ) THEN
4194 AHL_DEBUG_PUB.debug( l_api_name || ' - Before get_rt_resource_req' );
4195 END IF;
4196
4197 get_rt_resource_req
4198 (
4199 p_workorder_rec => p_x_prd_workorder_rec,
4200 p_operation_tbl => x_operation_tbl,
4201 p_x_resource_tbl => x_resource_tbl
4202 );
4203
4204 IF ( x_resource_tbl.COUNT > 0 ) THEN
4205
4206 IF ( G_DEBUG = 'Y' ) THEN
4207 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require' );
4208 END IF;
4209
4210 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
4211 (
4212 p_api_version => 1.0,
4213 p_init_msg_list => FND_API.G_TRUE,
4214 p_commit => FND_API.G_FALSE,
4215 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4216 p_module_type => NULL,
4217 p_interface_flag => 'N',
4218 p_operation_flag => 'C',
4219 p_x_resrc_require_tbl => x_resource_tbl,
4220 x_return_status => l_return_status,
4221 x_msg_count => l_msg_count,
4222 x_msg_data => l_msg_data
4223 );
4224
4225 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
4226 RAISE FND_API.G_EXC_ERROR;
4227 END IF;
4228 END IF;
4229 END IF;
4230
4231 /* MANESING::NR Analysis, 03-Jun-2011, check whether the workorder being processed is a Stage workorder.
4232 * If it is, then allow processing of Material Requirements for it in following IF block.
4233 * This is to handle the case when a Visit is Planned i.e. Visit status changes from Draft to Planning.
4234 * All the other cases for Material Requirements of Stage workorders are taken care by VWP flows.
4235 */
4236 OPEN check_stg_workorder_csr (p_x_prd_workorder_rec.visit_task_id);
4237 FETCH check_stg_workorder_csr INTO l_is_stage_workorder;
4238 CLOSE check_stg_workorder_csr;
4239
4240 IF ( p_x_prd_workorder_rec.route_id IS NOT NULL OR
4241 NVL(l_is_stage_workorder, 'N') = 'Y' ) THEN
4242
4243 IF ( G_DEBUG = 'Y' ) THEN
4244 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PP_MATERIALS_PVT.Process_Wo_Op_Materials' );
4245 END IF;
4246 --Code changes made by Srini
4247
4248 AHL_PP_MATERIALS_PVT.Process_Wo_Op_Materials
4249 (
4250 p_api_version => 1.0,
4251 p_init_msg_list => Fnd_Api.G_TRUE,
4252 p_commit => Fnd_Api.G_FALSE,
4253 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
4254 p_operation_flag => 'C',
4255 p_prd_wooperation_tbl => x_operation_tbl,
4256 x_req_material_tbl => x_material_tbl,
4257 x_return_status => l_return_status,
4258 x_msg_count => l_msg_count,
4259 x_msg_data => l_msg_data
4260 );
4261
4262 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
4263 RAISE FND_API.G_EXC_ERROR;
4264 END IF;
4265
4266 IF ( G_DEBUG = 'Y' ) THEN
4267 AHL_DEBUG_PUB.debug( l_api_name || ' - After AHL_PP_MATERIALS_PVT.Process_Wo_Op_Materials' );
4268 END IF;
4269
4270 END IF;
4271
4272 END IF;
4273
4274 IF ( p_wip_load_flag = 'Y' ) THEN
4275
4276 IF ( G_DEBUG = 'Y' ) THEN
4277 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_EAM_JOB_PVT.create_eam_workorder' );
4278 END IF;
4279
4280 AHL_EAM_JOB_PVT.create_eam_workorder
4281 (
4282 p_api_version => 1.0,
4283 p_init_msg_list => FND_API.G_TRUE,
4284 p_commit => FND_API.G_FALSE,
4285 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4286 p_default => FND_API.G_FALSE,
4287 p_module_type => NULL,
4288 x_return_status => l_return_status,
4289 x_msg_count => l_msg_count,
4290 x_msg_data => l_msg_data,
4291 p_x_workorder_rec => p_x_prd_workorder_rec,
4292 p_operation_tbl => x_operation_tbl,
4293 p_material_req_tbl => x_material_tbl,
4294 p_resource_req_tbl => x_resource_tbl
4295 );
4296
4297 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
4298 RAISE FND_API.G_EXC_ERROR;
4299 ELSE
4300
4301 IF ( G_DEBUG = 'Y' ) THEN
4302 AHL_DEBUG_PUB.debug( l_api_name || ' - Before Update AHL_WORKORDERS with wip_entity_id' );
4303 END IF;
4304
4305 UPDATE AHL_WORKORDERS
4306 SET wip_entity_id = p_x_prd_workorder_rec.wip_entity_id
4307 WHERE workorder_id = p_x_prd_workorder_rec.workorder_id;
4308 END IF;
4309
4310 END IF;
4311
4312 IF FND_API.to_boolean(p_commit) THEN
4313 COMMIT;
4314 END IF;
4315
4316 -- User Hooks
4317 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'CREATE_JOB', 'A', 'C' )) then
4318 ahl_prd_workorder_CUHK.create_job_post(
4319 p_prd_workorder_rec => p_x_prd_workorder_rec,
4320 p_operation_tbl => x_operation_tbl ,
4321 p_resource_tbl => x_resource_tbl,
4322 p_material_tbl => x_material_tbl,
4323 x_msg_count => l_msg_count,
4324 x_msg_data => l_msg_data,
4325 x_return_status => l_return_status);
4326 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
4327 RAISE FND_API.G_EXC_ERROR;
4328 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4329 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4330 END IF;
4331 END IF;
4332
4333 IF ( G_DEBUG = 'Y' ) THEN
4334 AHL_DEBUG_PUB.debug( l_api_name || ' - Success' );
4335 END IF;
4336
4337 IF G_DEBUG='Y' THEN
4338 AHL_DEBUG_PUB.disable_debug;
4339 END IF;
4340
4341 EXCEPTION
4342 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4343 ROLLBACK TO create_job_PVT;
4344 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4345 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4346 p_count => x_msg_count,
4347 p_data => x_msg_data);
4348 WHEN FND_API.G_EXC_ERROR THEN
4349 ROLLBACK TO create_job_PVT;
4350 x_return_status := FND_API.G_RET_STS_ERROR;
4351 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4352 p_count => x_msg_count,
4353 p_data => x_msg_data);
4354
4355 WHEN OTHERS THEN
4356 ROLLBACK TO create_job_PVT;
4357 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4358 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4359 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
4360 p_procedure_name =>l_api_name,
4361 p_error_text => SUBSTRB(SQLERRM,1,240));
4362
4363 END IF;
4364 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
4365 p_count => x_msg_count,
4366 p_data => x_msg_data);
4367
4368 END create_job;
4369
4370 PROCEDURE update_job
4371 (
4372 p_api_version IN NUMBER := 1.0,
4373 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
4374 p_commit IN VARCHAR2 := FND_API.G_FALSE,
4375 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
4376 p_default IN VARCHAR2 := FND_API.G_FALSE,
4377 p_module_type IN VARCHAR2,
4378 x_return_status OUT NOCOPY VARCHAR2,
4379 x_msg_count OUT NOCOPY NUMBER,
4380 x_msg_data OUT NOCOPY VARCHAR2,
4381 p_wip_load_flag IN VARCHAR2 := 'Y',
4382 p_x_prd_workorder_rec IN OUT NOCOPY prd_workorder_rec,
4383 p_x_prd_workoper_tbl IN OUT NOCOPY prd_workoper_tbl
4384 )
4385 AS
4386 l_api_name CONSTANT VARCHAR2(30) := 'UPDATE_JOB'; -- adithya::Corrected the variable precision
4387 l_api_version CONSTANT NUMBER := 1.0;
4388 l_msg_count NUMBER;
4389 l_msg_data VARCHAR2(2000);
4390 l_return_status VARCHAR2(1);
4391 l_job_return_status VARCHAR2(1);
4392 l_prd_workoper_tbl AHL_PRD_OPERATIONS_PVT.prd_operation_tbl;
4393 l_resource_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
4394 l_material_tbl AHL_PP_MATERIALS_PVT.req_material_tbl_type;
4395 l_parent_workorder_rec prd_workorder_rec;
4396 l_parent_workoper_tbl prd_workoper_tbl;
4397 l_wo_status VARCHAR2(80);
4398 l_wo_status_code VARCHAR2(30);
4399 -- ER#10257011 Supplier Warranty manisaga
4400 l_entitlement_rec AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Rec_Type;
4401
4402 l_debug_module CONSTANT VARCHAR2(100) := 'ahl.plsql.AHL_PRD_WORKORDER_PVT.UPDATE_JOB';
4403 l_dummy VARCHAR2(1); -- Fix for Bug 9439418
4404 --sukhwsin::SB Effectivity - Variable Declaration for uom conversion- starts
4405 l_prim_quantity NUMBER;
4406 l_prim_uom_code VARCHAR2(3);
4407 --sukhwsin::SB Effectivity - Variable Declaration for uom conversion- ends
4408 -- Bug # 7643668 (FP for Bug # 6493302) -- start
4409 CURSOR get_parent_workorders( c_child_wip_entity_id NUMBER )
4410 IS
4411 SELECT WO.workorder_id,
4412 WO.object_version_number,
4413 WO.wip_entity_id,
4414 WO.visit_task_id,
4415 WO.status_code,
4416 WIPJ.scheduled_start_date,
4417 WIPJ.scheduled_completion_date scheduled_end_date,
4418 WO.actual_start_date,
4419 WO.actual_end_date
4420 FROM AHL_WORKORDERS WO,
4421 WIP_SCHED_RELATIONSHIPS WOR,
4422 WIP_DISCRETE_JOBS wipj
4423 WHERE
4424 WIPJ.wip_entity_id = WO.wip_entity_id
4425 AND WO.wip_entity_id = WOR.parent_object_id
4426 AND WO.master_workorder_flag = 'Y'
4427 AND WO.status_code <> G_JOB_STATUS_DELETED
4428 AND WOR.parent_object_type_id = 1
4429 AND WOR.relationship_type = 1
4430 AND WOR.child_object_type_id = 1
4431 AND WOR.child_object_id = c_child_wip_entity_id;
4432 -- Bug # 7643668 (FP for Bug # 6493302) -- end
4433
4434 CURSOR get_child_workorders( c_wip_entity_id NUMBER )
4435 IS
4436 SELECT WDJ.scheduled_start_date scheduled_start_date,
4437 WDJ.scheduled_completion_date scheduled_end_date,
4438 WO.actual_start_date actual_start_date,
4439 WO.actual_end_date actual_end_date,
4440 WO.status_code status_code
4441 FROM WIP_DISCRETE_JOBS WDJ,
4442 AHL_WORKORDERS WO
4443 WHERE WDJ.wip_entity_id = WO.wip_entity_id
4444 AND WO.status_code <> G_JOB_STATUS_DELETED
4445 AND WO.wip_entity_id in
4446 (
4447 SELECT child_object_id
4448 FROM WIP_SCHED_RELATIONSHIPS
4449 WHERE parent_object_type_id = 1
4450 AND child_object_type_id = 1
4451 START WITH parent_object_id = c_wip_entity_id
4452 AND relationship_type = 1
4453 CONNECT BY parent_object_id = PRIOR child_object_id
4454 AND relationship_type = 1
4455 );
4456 -- bug4393092
4457 -- Bug # 6680137 -- begin
4458 CURSOR get_wo_status(c_workorder_id VARCHAR2)
4459 IS
4460 SELECT AWOS.status_code,
4461 AWOS.workorder_name,
4462 FNDL.meaning
4463 FROM AHL_WORKORDERS AWOS,
4464 FND_LOOKUP_VALUES_VL FNDL
4465 WHERE AWOS.WORKORDER_ID = c_workorder_id
4466 AND FNDL.lookup_type = 'AHL_JOB_STATUS'
4467 AND FNDL.lookup_code(+) = AWOS.status_code;
4468 -- Bug # 6680137 -- end
4469
4470 -- Added for R12: Serial Reservation.
4471 CURSOR get_scheduled_mater_csr (p_workorder_id IN NUMBER) IS
4472 SELECT scheduled_material_id
4473 FROM ahl_job_oper_materials_v
4474 WHERE workorder_id = p_workorder_id
4475 AND reserved_quantity > 0;
4476
4477 -- Added for R12: Tech UI Login/Logout feature.
4478 -- Logout all employees logged in at all levels when cancelling a workorder.
4479 CURSOR c_get_login_recs(p_workorder_id NUMBER)
4480 IS
4481 SELECT employee_id, operation_seq_num, resource_seq_num
4482 FROM ahl_work_login_times
4483 WHERE workorder_id = p_workorder_id
4484 AND LOGOUT_DATE IS NULL;
4485
4486 -- Fix for bug# 5347560.
4487 CURSOR chk_inst_in_job (p_workorder_id IN NUMBER) IS
4488 SELECT 'x'
4489 FROM CSI_ITEM_INSTANCES CII, AHL_WORKORDERS AWO
4490 WHERE CII.WIP_JOB_ID = AWO.WIP_ENTITY_ID
4491 AND AWO.workorder_id = p_workorder_id
4492 AND ACTIVE_START_DATE <= SYSDATE
4493 AND ((ACTIVE_END_DATE IS NULL) OR (ACTIVE_END_DATE >= SYSDATE))
4494 AND LOCATION_TYPE_CODE = 'WIP'
4495 AND NOT EXISTS (SELECT 'X' FROM CSI_II_RELATIONSHIPS CIR
4496 WHERE CIR.SUBJECT_ID = CII.INSTANCE_ID
4497 AND CIR.RELATIONSHIP_TYPE_CODE = 'COMPONENT-OF'
4498 AND SYSDATE BETWEEN NVL(ACTIVE_START_DATE,SYSDATE) AND NVL(ACTIVE_END_DATE,SYSDATE));
4499
4500 -- Cursor added for bug # 6680137
4501 CURSOR c_wo_vtsk_id(p_wo_id NUMBER)
4502 IS
4503 SELECT
4504 visit_task_id
4505 FROM
4506 AHL_WORKORDERS
4507 WHERE
4508 workorder_id = p_wo_id;
4509
4510 -- Bug # 8433227 (FP for Bug # 7453393) -- start
4511 -- EAM does not validate the emcompassing rule for Unreleased planned work order.
4512 -- Hence after work order update, visit start and end dates needed to be validated against
4513 -- work order scheduled start and end dates.
4514
4515 CURSOR get_visit_wo_dates(c_visit_id NUMBER)
4516 IS
4517 SELECT WDJ.scheduled_start_date,
4518 WDJ.scheduled_completion_date
4519 FROM WIP_DISCRETE_JOBS WDJ,
4520 AHL_WORKORDERS WO
4521 WHERE WDJ.wip_entity_id = WO.wip_entity_id
4522 AND WO.visit_task_id IS NULL
4523 AND WO.master_workorder_flag = 'Y'
4524 AND WO.visit_id = c_visit_id;
4525
4526 CURSOR get_wo_sch_dates(p_wip_entity_id NUMBER)
4527 IS
4528 SELECT
4529 WDJ.scheduled_start_date,
4530 WDJ.scheduled_completion_date
4531 FROM
4532 WIP_DISCRETE_JOBS WDJ
4533 WHERE
4534 WDJ.wip_entity_id = p_wip_entity_id;
4535
4536 --pekambar Added new cursor to find master workorder flag :: ER # 9410221
4537
4538 CURSOR get_master_wo_flag(p_wip_entity_id NUMBER)
4539 IS
4540 SELECT
4541 WO.master_workorder_flag
4542 FROM
4543 AHL_WORKORDERS WO,
4544 WIP_DISCRETE_JOBS WDJ
4545 WHERE WDJ.wip_entity_id = WO.wip_entity_id
4546 AND WDJ.wip_entity_id = p_wip_entity_id;
4547
4548 -- End
4549
4550
4551 l_wo_sch_start_date DATE;
4552 l_wo_sch_end_date DATE;
4553 l_visit_start_date DATE;
4554 l_visit_end_date DATE;
4555
4556 --pekambar added for ER # 9410221
4557 l_mo_wip_entity_id NUMBER;
4558 l_mo_firm_planned_flag NUMBER;
4559 l_mo_scheduled_start_date DATE;
4560 l_mo_scheduled_end_date DATE;
4561 l_mo_offset_days NUMBER;
4562 l_mo_offset_direction NUMBER;
4563 l_mo_schedule_method NUMBER;
4564 l_mo_ignore_firm_flag VARCHAR2(1);
4565 l_mo_object_type_id NUMBER;
4566 l_start_date_offset NUMBER;
4567 l_end_date_offset NUMBER;
4568 l_wo_master_workorder_flag VARCHAR2(1);
4569 l_temp_scheduled_start_date DATE;
4570 l_temp_scheduled_end_date DATE;
4571
4572 -- Bug # 8433227 (FP for Bug # 7453393) -- end
4573
4574 l_scheduled_start_date DATE;
4575 l_scheduled_end_date DATE;
4576 l_actual_start_date DATE;
4577 l_actual_end_date DATE;
4578 l_status_code VARCHAR2(30);
4579 l_status_code_multi VARCHAR2(30) := 'MULTIPLE_STATUSES';
4580
4581 l_employee_id NUMBER;
4582 l_operation_seq_num NUMBER;
4583 l_resource_seq_num NUMBER;
4584 l_workorder_name ahl_workorders.workorder_name%TYPE;
4585
4586 L_X_PRD_WORKORDER_REC AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
4587 L_OPERATION_TBL AHL_PRD_OPERATIONS_PVT.PRD_OPERATION_TBL;
4588 L_MATERIAL_REQ_TBL AHL_PP_MATERIALS_PVT.REQ_MATERIAL_TBL_TYPE;
4589 L_RESOURCE_REQ_TBL AHL_PP_RESRC_REQUIRE_PVT.RESRC_REQUIRE_TBL_TYPE;
4590
4591 -- Begin OGMA Issue # 105 - Balaji
4592 -- cursor for checking if given task is planned task created form forecasted UE.
4593 CURSOR c_can_update_quantity(p_task_id NUMBER)
4594 IS
4595 SELECT
4596 'X'
4597 FROM
4598 ahl_visit_tasks_b vtsk
4599 WHERE
4600 vtsk.quantity IS NULL AND
4601 vtsk.status_code <> 'DELETED' AND
4602 vtsk.visit_task_id = p_task_id
4603
4604 UNION
4605
4606 SELECT
4607 'X'
4608 FROM
4609 ahl_visit_tasks_b vtsk,
4610 ahl_unit_effectivities_b aue
4611 WHERE
4612 nvl(aue.manually_planned_flag, 'N') = 'N' AND
4613 vtsk.unit_effectivity_id = aue.unit_effectivity_id AND
4614 vtsk.status_code <> 'DELETED' AND
4615 vtsk.visit_task_id = p_task_id;
4616
4617 -- cursor for getting instance quantity for planned tasks.
4618 CURSOR c_get_instance_quantity(p_task_id NUMBER)
4619 IS
4620 SELECT
4621 csi.quantity
4622 FROM
4623 csi_item_instances csi,
4624 ahl_visit_tasks_b vtsk
4625 WHERE
4626 vtsk.instance_id = csi.instance_id AND
4627 vtsk.status_code <> 'DELETED' AND
4628 vtsk.visit_task_id = p_task_id;
4629
4630 l_instance_quantity NUMBER;
4631 l_can_update_quantity VARCHAR2(1);
4632
4633 -- added firm_planned_flag for ER 9368251
4634 CURSOR c_get_current_WO_attr(p_workorder_id NUMBER)
4635 IS
4636 SELECT
4637 wo.status_code, wdj.firm_planned_flag
4638 FROM
4639 ahl_workorders wo, wip_discrete_jobs wdj
4640 WHERE
4641 wo.wip_entity_id = wdj.wip_entity_id
4642 and wo.workorder_id = p_workorder_id;
4643
4644 l_curr_firm_plan VARCHAR2(30);
4645 l_curr_wo_status VARCHAR2(30);
4646 -- End OGMA Issue # 105 - Balaji
4647
4648 -- Bug # 6680137 -- start
4649 l_status_meaning VARCHAR2(80);
4650 -- Bug # 6680137 -- end
4651
4652 -- Added for FP bug# 7238868
4653 l_department_id NUMBER;
4654 l_department_name bom_departments.description%TYPE;
4655 l_oper_found VARCHAR2(1);
4656
4657 CURSOR get_operation_details(p_operation_code VARCHAR2)
4658 IS
4659 SELECT OP.operation_id
4660 FROM AHL_OPERATIONS_VL OP
4661 WHERE OP.concatenated_segments=p_operation_code
4662 AND OP.revision_number IN
4663 ( SELECT MAX(OP1.revision_number)
4664 FROM AHL_OPERATIONS_B_KFV OP1
4665 WHERE OP1.concatenated_segments=OP.concatenated_segments
4666 AND TRUNC(SYSDATE) BETWEEN TRUNC(OP1.start_date_active) AND
4667 TRUNC(NVL(OP1.end_date_active,SYSDATE+1))
4668 AND OP1.revision_status_code='COMPLETE'
4669 );
4670 -- End FP bug# 7238868
4671
4672 -- apattark start changes for ER #9368251
4673 CURSOR c_check_planned_wo(c_workorder_id IN NUMBER)
4674 IS
4675 SELECT
4676 WDJ.firm_planned_flag
4677 FROM
4678 WIP_DISCRETE_JOBS WDJ,
4679 AHL_WORKORDERS AWO
4680 WHERE
4681 AWO.wip_entity_id = WDJ.wip_entity_id AND
4682 AWO.workorder_id = c_workorder_id;
4683
4684
4685 l_plan_flag NUMBER;
4686 -- apattark End changes for ER #9368251
4687
4688 -- Fix for Bug 9439418
4689 CURSOR chk_pending_txns (p_wip_entity_id NUMBER) IS
4690 SELECT 'x'
4691 FROM WIP_COST_TXN_INTERFACE wict
4692 WHERE wict.wip_entity_id = p_wip_entity_id
4693 AND process_status IN (1,2,3);
4694
4695 -- added for ER 9368251
4696 -- needed when changing firm_planned_flag from 'firm' to 'planned'.
4697 l_expand_mwo_flag BOOLEAN := FALSE;
4698
4699 -- ER#10257011 Supplier Warranty manisaga
4700 CURSOR get_entitlement_id(p_visit_task_id NUMBER) IS
4701 SELECT warranty_entitlement_id ,object_version_number
4702 from ahl_warranty_entitlements
4703 where visit_task_id = p_visit_task_id;
4704
4705 -- JKJain, NR Analysis and Forecasting
4706 CURSOR get_uc_fleet_mntnc_csr(p_wo_id NUMBER) IS
4707 SELECT uc_header_id ,nha_uc_header_id,fleet_header_id,maintenance_type_code
4708 from AHL_WORKORDERS
4709 where workorder_id = p_wo_id;
4710 l_fleet_header_id NUMBER := NULL;
4711 l_maintenance_type_code VARCHAR2(30) := NULL;
4712 l_uc_header_id NUMBER := NULL;
4713 l_nha_uc_header_id NUMBER := NULL;
4714
4715 -- sansatpa, adding for Marshalling, WO AOG and priority updation
4716
4717 L_JOB_PRIORITY number;
4718 L_CHILD_WO_ID number;
4719 L_CHILD_WO_WIP_ID NUMBER;
4720 L_AOG_FLAG varchar2(1);
4721
4722 CURSOR GET_CHILD_WORKORDER_DETAILS(P_MR_HEADER_ID NUMBER, P_VISIT_ID NUMBER)
4723 IS
4724 SELECT AW.workorder_id,
4725 AVT.VISIT_TASK_ID,
4726 AW.MASTER_WORKORDER_FLAG,
4727 WDJ.WIP_ENTITY_ID,
4728 WDJ.ORGANIZATION_ID,
4729 WDJ.PRIMARY_ITEM_ID,
4730 AW.WORKORDER_NAME,
4731 WDJ.DESCRIPTION,
4732 AVT.INSTANCE_ID,
4733 WDJ.CLASS_CODE,
4734 AW.STATUS_CODE,
4735 AV.PROJECT_ID,
4736 AVT.PROJECT_TASK_ID,
4737 AVT.DEPARTMENT_ID,
4738 WDJ.FIRM_PLANNED_FLAG,
4739 WDJ.SCHEDULED_START_DATE,
4740 WDJ.SCHEDULED_COMPLETION_DATE
4741 FROM AHL_MR_HEADERS_B AMH,
4742 AHL_WORKORDERS AW,
4743 AHL_VISITS_B AV,
4744 AHL_VISIT_TASKS_B AVT,
4745 wip_discrete_jobs wdj
4746 WHERE AW.VISIT_TASK_ID = AVT.VISIT_TASK_ID
4747 AND AV.VISIT_ID = AVT.VISIT_ID
4748 AND AVT.MR_ID = AMH.MR_HEADER_ID (+)
4749 AND AW.MASTER_WORKORDER_FLAG = 'N'
4750 AND WDJ.WIP_ENTITY_ID = AW.WIP_ENTITY_ID
4751 AND AW.STATUS_CODE NOT IN (4, 5, 7, 12, 15, 17, 22)
4752 AND AMH.MR_HEADER_ID = P_MR_HEADER_ID
4753 AND AW.VISIT_ID = P_VISIT_ID;
4754
4755
4756 CURSOR GET_WO_MATERIAL_REQ_DETAILS(P_WORKORDER_ID NUMBER)
4757 IS
4758 SELECT ASM.AOG_FLAG
4759 FROM AHL_SCHEDULE_MATERIALS ASM,
4760 AHL_VISIT_TASKS_B AVT,
4761 AHL_WORKORDERS AW
4762 WHERE ASM.VISIT_TASK_ID = AVT.VISIT_TASK_ID
4763 AND AW.VISIT_TASK_ID = AVT.VISIT_TASK_ID
4764 AND ASM.AOG_FLAG = 'Y'
4765 AND AW.WORKORDER_ID = P_WORKORDER_ID;
4766
4767 -- ARUNJK included cursor for cancel reservation for WO-WO supply WO Cancel Marshalling2
4768 CURSOR GET_SRC_RES_ID_CSR(P_WORKORDER_ID NUMBER)
4769 IS
4770 SELECT mtl.reservation_id RESERVATION_ID
4771 FROM mtl_reservations mtl ,
4772 ahl_workorders awo
4773 WHERE mtl.supply_source_header_id = awo.wip_entity_id
4774 AND awo.workorder_id = P_WORKORDER_ID;
4775 -- ARUNJK included cursor for cancel reservation for WO-WO supply WO Cancel Marshalling2 Ends
4776
4777 BEGIN
4778
4779
4780 SAVEPOINT update_job_PVT;
4781
4782 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
4783 p_api_version,
4784 l_api_name,G_PKG_NAME) THEN
4785 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4786 END IF;
4787
4788 IF FND_API.to_boolean(p_init_msg_list) THEN
4789 FND_MSG_PUB.initialize;
4790 END IF;
4791
4792 x_return_status:=FND_API.G_RET_STS_SUCCESS;
4793
4794 IF G_DEBUG='Y' THEN
4795 AHL_DEBUG_PUB.enable_debug;
4796 END IF;
4797
4798 IF ( G_DEBUG = 'Y' ) THEN
4799 AHL_DEBUG_PUB.debug( l_api_name || ' - At Start of Update Job API' );
4800 AHL_DEBUG_PUB.debug( l_api_name || ' - Before default_missing_attributes' );
4801 END IF;
4802 --Modified by Srini
4803 /*IF p_module_type = 'API'
4804 THEN
4805 G_CALLED_FROM := 'API';
4806 END IF;*/
4807 G_CALLED_FROM := p_module_type;
4808 AHL_DEBUG_PUB.debug( FND_MSG_PUB.count_msg || ' skp1 FND_MSG_PUB.count_msg= '||FND_MSG_PUB.count_msg );
4809 -- User Hooks
4810 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'UPDATE_JOB', 'B', 'C' )) THEN
4811 AHL_DEBUG_PUB.debug( FND_MSG_PUB.count_msg || ' skp2 FND_MSG_PUB.count_msg= '||FND_MSG_PUB.count_msg );
4812 ahl_prd_workorder_CUHK.update_job_pre(
4813 p_prd_workorder_rec => p_x_prd_workorder_rec,
4814 p_prd_workoper_tbl => p_x_prd_workoper_tbl,
4815 x_msg_count => l_msg_count,
4816 x_msg_data => l_msg_data,
4817 x_return_status => l_return_status);
4818 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
4819 RAISE FND_API.G_EXC_ERROR;
4820 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4821 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4822 END IF;
4823 END IF;
4824 AHL_DEBUG_PUB.debug( FND_MSG_PUB.count_msg || ' skp3 FND_MSG_PUB.count_msg= '||FND_MSG_PUB.count_msg );
4825 --IF FND_API.to_boolean(p_default) THEN
4826 default_missing_attributes
4827 (
4828 p_x_prd_workorder_rec
4829 );
4830 --END IF;
4831
4832 l_msg_count := FND_MSG_PUB.count_msg;
4833 IF l_msg_count > 0 THEN
4834 x_msg_count := l_msg_count;
4835 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4836 RAISE FND_API.G_EXC_ERROR;
4837 END IF;
4838
4839 IF (p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
4840
4841 IF ( G_DEBUG = 'Y' ) THEN
4842 AHL_DEBUG_PUB.debug( l_api_name || ' - Before convert_values_to_ids' );
4843 END IF;
4844
4845 convert_values_to_ids
4846 (
4847 p_x_prd_workorder_rec =>p_x_prd_workorder_rec
4848 );
4849 END IF;
4850
4851 l_msg_count := FND_MSG_PUB.count_msg;
4852 IF l_msg_count > 0 THEN
4853 x_msg_count := l_msg_count;
4854 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4855 RAISE FND_API.G_EXC_ERROR;
4856 END IF;
4857
4858 --pekambar added logic to calculate end date of work order for move workorder
4859 --ER # 9410221
4860 OPEN get_wo_sch_dates(p_x_prd_workorder_rec.wip_entity_id);
4861 FETCH get_wo_sch_dates INTO l_mo_scheduled_start_date,l_mo_scheduled_end_date;
4862 CLOSE get_wo_sch_dates;
4863 -- Get Master Workorder flag
4864 OPEN get_master_wo_flag(p_x_prd_workorder_rec.wip_entity_id);
4865 FETCH get_master_wo_flag INTO l_wo_master_workorder_flag;
4866 CLOSE get_master_wo_flag;
4867
4868 IF(l_mo_scheduled_start_date <> p_x_prd_workorder_rec.SCHEDULED_START_DATE AND p_x_prd_workorder_rec.firm_planned_flag = 1 AND l_wo_master_workorder_flag <> 'Y')
4869 THEN
4870 --if user changes startdate and end date , offsets will be calculated respectively and added to new end date
4871 l_start_date_offset := p_x_prd_workorder_rec.scheduled_start_date - l_mo_scheduled_start_date ;
4872 l_end_date_offset := p_x_prd_workorder_rec.scheduled_end_date - l_mo_scheduled_end_date ;
4873 -- User Passed End Date is saved to use same for update_job_operations
4874 l_temp_scheduled_end_date := p_x_prd_workorder_rec.scheduled_end_date;
4875 --Newly Calulated End date for validation and updating Master WO
4876 p_x_prd_workorder_rec.scheduled_end_date := l_mo_scheduled_end_date + l_start_date_offset + l_end_date_offset ;
4877
4878 IF ( G_DEBUG = 'Y' ) THEN
4879 AHL_DEBUG_PUB.debug( l_api_name || ' - Pekambar new End Date :' || p_x_prd_workorder_rec.scheduled_end_date );
4880 END IF;
4881
4882 END IF;
4883
4884 -- End ::ER # 9410221
4885
4886 IF (p_validation_level = FND_API.G_VALID_LEVEL_FULL ) THEN
4887
4888 IF ( G_DEBUG = 'Y' ) THEN
4889 AHL_DEBUG_PUB.debug( l_api_name || ' - Before validate_workorder' );
4890 END IF;
4891
4892 validate_workorder
4893 (
4894 p_prd_workorder_rec =>p_x_prd_workorder_rec,
4895 p_wip_load_flag =>p_wip_load_flag
4896 );
4897
4898 IF p_x_prd_workoper_tbl.COUNT > 0 THEN
4899 -- Bug # 6680137 -- begin
4900 OPEN get_wo_status(p_x_prd_workorder_rec.workorder_id);
4901 FETCH get_wo_status INTO l_wo_status_code, l_workorder_name, l_wo_status;
4902 CLOSE get_wo_status;
4903 -- Bug # 6680137 -- end
4904 IF l_wo_status_code IN ('22','7','12','4','5') THEN
4905 FND_MESSAGE.set_name('AHL','AHL_PRD_UPD_WO_STS');
4906 FND_MESSAGE.set_token('WO_STATUS', l_wo_status);
4907 FND_MSG_PUB.add;
4908 RAISE FND_API.G_EXC_ERROR;
4909 END IF;
4910 END IF;
4911
4912
4913 END IF;
4914
4915 l_msg_count := FND_MSG_PUB.count_msg;
4916 IF l_msg_count > 0 THEN
4917 x_msg_count := l_msg_count;
4918 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4919 RAISE FND_API.G_EXC_ERROR;
4920 END IF;
4921
4922 -- fix for bug# 5347560. In case of cancelling or closing a wo check if
4923 -- there are any trackable materials in the job.
4924 IF (p_x_prd_workorder_rec.status_code IN (G_JOB_STATUS_CANCELLED, G_JOB_STATUS_COMPLETE_NC,
4925 G_JOB_STATUS_CLOSED)) THEN
4926 OPEN chk_inst_in_job(p_x_prd_workorder_rec.workorder_id);
4927 FETCH chk_inst_in_job INTO l_workorder_name;
4928 IF (chk_inst_in_job%FOUND) THEN
4929 -- Bug # 6680137 -- begin
4930 -- show the right workorder name and status
4931 OPEN get_wo_status(p_x_prd_workorder_rec.workorder_id);
4932 FETCH get_wo_status INTO l_wo_status_code, l_workorder_name, l_wo_status;
4933 CLOSE get_wo_status;
4934
4935 --Get status meaning
4936 SELECT meaning INTO l_status_meaning
4937 FROM fnd_lookup_values_vl
4938 WHERE lookup_type = 'AHL_JOB_STATUS'
4939 AND LOOKUP_CODE = p_x_prd_workorder_rec.status_code;
4940 -- Bug # 6680137 -- end
4941 FND_MESSAGE.set_name('AHL','AHL_PRD_MAT_NOT_RETURN');
4942 FND_MESSAGE.set_token('WO_STATUS', l_status_meaning);
4943 FND_MESSAGE.set_token('WO_NAME', l_workorder_name);
4944 FND_MSG_PUB.add;
4945 RAISE FND_API.G_EXC_ERROR;
4946 END IF;
4947 CLOSE chk_inst_in_job;
4948
4949 IF (p_x_prd_workorder_rec.status_code = G_JOB_STATUS_CANCELLED) THEN
4950 --psalgia added for Bug::9439418 start
4951 OPEN chk_pending_txns(p_x_prd_workorder_rec.wip_entity_id);
4952 FETCH chk_pending_txns INTO l_dummy;
4953
4954 IF (chk_pending_txns%FOUND) THEN
4955 OPEN c_get_login_recs(p_x_prd_workorder_rec.workorder_id);
4956 FETCH c_get_login_recs INTO l_employee_id, l_operation_seq_num, l_resource_seq_num;
4957 IF(c_get_login_recs%FOUND) THEN
4958 -- show the workorder name and status
4959 OPEN get_wo_status(p_x_prd_workorder_rec.workorder_id);
4960 FETCH get_wo_status INTO l_wo_status_code, l_workorder_name, l_wo_status;
4961 CLOSE get_wo_status;
4962
4963 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_TECH_LOGGED_IN');
4964 FND_MESSAGE.set_token('WO_NAME', l_workorder_name);
4965 FND_MSG_PUB.add;
4966
4967 ELSE
4968 OPEN get_wo_status(p_x_prd_workorder_rec.workorder_id);
4969 FETCH get_wo_status INTO l_wo_status_code, l_workorder_name, l_wo_status;
4970 CLOSE get_wo_status;
4971
4972 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_PENDING_TXNS');
4973 FND_MESSAGE.set_token('WO_NAME', l_workorder_name);
4974 FND_MSG_PUB.add;
4975 END IF;
4976 CLOSE c_get_login_recs;
4977
4978 RAISE FND_API.G_EXC_ERROR;
4979 --psalgia added for Bug::9439418 end
4980
4981 END IF;
4982 CLOSE chk_pending_txns;
4983
4984 END IF;
4985 END IF;
4986
4987 -- R12 Tech UI enhancement project.
4988 -- Log all technicians out of the workorder being cancelled.
4989 IF (p_x_prd_workorder_rec.status_code IN (G_JOB_STATUS_COMPLETE_NC, G_JOB_STATUS_COMPLETE,
4990 G_JOB_STATUS_CANCELLED)) THEN
4991 IF ( G_DEBUG = 'Y' ) THEN
4992 AHL_DEBUG_PUB.debug( l_api_name || ' Before - AHL_PRD_WO_LOGIN_PVT.Workorder_Logout');
4993 AHL_DEBUG_PUB.debug( 'Workorder Status:' || p_x_prd_workorder_rec.status_code);
4994 END IF;
4995
4996 OPEN c_get_login_recs(p_x_prd_workorder_rec.workorder_id);
4997 LOOP
4998 FETCH c_get_login_recs INTO l_employee_id, l_operation_seq_num, l_resource_seq_num;
4999 EXIT WHEN c_get_login_recs%NOTFOUND;
5000 AHL_PRD_WO_LOGIN_PVT.Workorder_Logout(p_api_version => 1.0,
5001 p_init_msg_list => p_init_msg_list,
5002 p_commit => FND_API.G_FALSE,
5003 p_validation_level => p_validation_level,
5004 x_return_status => l_return_status,
5005 x_msg_count => l_msg_count,
5006 x_msg_data => l_msg_data,
5007 p_employee_id => l_employee_id,
5008 p_workorder_id => p_x_prd_workorder_rec.workorder_id,
5009 p_operation_seq_num => l_operation_seq_num,
5010 p_resource_seq_num => l_resource_seq_num
5011 );
5012 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5013 EXIT;
5014 END IF;
5015 END LOOP;
5016 CLOSE c_get_login_recs;
5017
5018 IF ( G_DEBUG = 'Y' ) THEN
5019 AHL_DEBUG_PUB.debug( l_api_name || ' Before - AHL_PRD_WO_LOGIN_PVT.Workorder_Logout');
5020 AHL_DEBUG_PUB.debug( 'Return Status:' || l_return_status);
5021 END IF;
5022
5023 END IF; -- p_x_prd_workorder_rec.STATUS_CODE
5024
5025 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5026 RAISE FND_API.G_EXC_ERROR;
5027 END IF;
5028
5029 -- hold reason is only for on-hold and parts-hold.
5030 -- FP Bug# 7631453
5031 IF p_x_prd_workorder_rec.STATUS_CODE NOT IN ('6', '19') THEN
5032 p_x_prd_workorder_rec.HOLD_REASON_CODE := NULL;
5033 END IF;
5034
5035 IF ( G_DEBUG = 'Y' ) THEN
5036 AHL_DEBUG_PUB.debug( l_api_name || ' - Before Updating AHL_WORKORDERS' );
5037 END IF;
5038
5039 -- Begin OGMA Issue # 105 - Balaji
5040 -- update VWP planned task quantity current instance quantity
5041 -- this logic need to be moved to VWP later as per discussion with Shailaja and Jay.
5042
5043 OPEN c_get_current_WO_attr(p_x_prd_workorder_rec.workorder_id);
5044 FETCH c_get_current_WO_attr INTO l_curr_wo_status, l_curr_firm_plan;
5045 CLOSE c_get_current_WO_attr;
5046
5047 -- check if firm_planned flag has changed. For ER #9368251
5048 -- expand mwo only when 'firm' is being changed to 'planned'
5049 IF (l_curr_firm_plan = '1') AND (p_x_prd_workorder_rec.firm_planned_flag = '2')
5050 AND (p_x_prd_workorder_rec.master_workorder_flag = 'N')
5051 THEN
5052 -- expand master workorders
5053 l_expand_mwo_flag := TRUE;
5054 END IF;
5055
5056 IF p_x_prd_workorder_rec.visit_task_id IS NOT NULL AND l_curr_wo_status = '17'
5057 THEN
5058
5059 OPEN c_can_update_quantity(p_x_prd_workorder_rec.visit_task_id);
5060 FETCH c_can_update_quantity INTO l_can_update_quantity;
5061 CLOSE c_can_update_quantity;
5062
5063 IF l_can_update_quantity IS NOT NULL
5064 THEN
5065
5066 OPEN c_get_instance_quantity(p_x_prd_workorder_rec.visit_task_id);
5067 FETCH c_get_instance_quantity INTO l_instance_quantity;
5068 CLOSE c_get_instance_quantity;
5069
5070 UPDATE
5071 ahl_visit_tasks_b
5072 SET
5073 quantity = l_instance_quantity
5074 WHERE
5075 visit_task_id = p_x_prd_workorder_rec.visit_task_id;
5076 END IF;
5077 END IF;
5078 -- End OGMA Issue # 105 - Balaji
5079
5080 --sukhwsin::VEE - enhancement for insertion of wo status change - starts
5081 ADD_WO_OPER_TURNOVER_NOTES
5082 (
5083 p_workorder_id => p_x_prd_workorder_rec.workorder_id,
5084 p_new_status_code => p_x_prd_workorder_rec.status_code,
5085 --sukhwsin::Bug 12915297. Passing hold reason.
5086 p_hold_reason_code => p_x_prd_workorder_rec.HOLD_REASON_CODE,
5087 p_validation_level => p_validation_level,
5088 p_default => p_default,
5089 p_module_type => p_module_type,
5090 x_return_status => l_return_status
5091 );
5092 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5093 RAISE FND_API.G_EXC_ERROR;
5094 END IF;
5095 --sukhwsin::VEE - enhancement for insertion of wo status change - ends
5096 -- JKJain, NR Analysis and Forecasting
5097 IF(is_workorder_released(p_x_prd_workorder_rec.workorder_id) OR l_curr_wo_status = '7' OR l_curr_wo_status = '12') THEN --7 Cancelled 12 Closed
5098 open GET_UC_FLEET_MNTNC_CSR(P_X_PRD_WORKORDER_REC.WORKORDER_ID);
5099 FETCH GET_UC_FLEET_MNTNC_CSR into L_UC_HEADER_ID,L_NHA_UC_HEADER_ID,L_FLEET_HEADER_ID,L_MAINTENANCE_TYPE_CODE;
5100 CLOSE get_uc_fleet_mntnc_csr;
5101 ELSE
5102 get_uc_fleet_mntnc(
5103 p_prd_workorder_rec => p_x_prd_workorder_rec,
5104 x_fleet_header_id => l_fleet_header_id,
5105 x_uc_header_id => l_uc_header_id,
5106 x_nha_uc_header_id => l_nha_uc_header_id,
5107 x_maintenance_type_code => l_maintenance_type_code
5108 );
5109 END IF;
5110
5111
5112 -- sansatpa - modified for marshalling
5113 -- begin check if any material requirement for WO is AOG, then WO cant me modified to non AOG
5114
5115 IF ( G_DEBUG = 'Y' ) THEN
5116 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' - Workorder AOG status to be updated to - ' || P_X_PRD_WORKORDER_REC.AOG_FLAG);
5117 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' - Check for Workorder material requiremengt AOG status - ');
5118 END IF;
5119
5120 IF(P_X_PRD_WORKORDER_REC.AOG_FLAG = 'N') THEN
5121
5122 OPEN GET_WO_MATERIAL_REQ_DETAILS(P_X_PRD_WORKORDER_REC.WORKORDER_ID);
5123 FETCH GET_WO_MATERIAL_REQ_DETAILS INTO L_AOG_FLAG;
5124
5125 IF(GET_WO_MATERIAL_REQ_DETAILS%FOUND) THEN
5126
5127 IF ( G_DEBUG = 'Y' ) THEN
5128 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' Atleast one material requirement is AOG for workorder - ' || P_X_PRD_WORKORDER_REC.WORKORDER_ID);
5129 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' Workorder AOG status can not be updated to NO');
5130 END IF;
5131
5132 FND_MESSAGE.SET_NAME('AHL','AHL_WO_AOG_UPD_NOT_ALD');
5133 FND_MSG_PUB.ADD;
5134 RAISE FND_API.G_EXC_ERROR;
5135
5136 END IF;
5137
5138 END IF;
5139
5140 -- end check if any material requirement for WO is AOG, then WO cant me modified to non AOG
5141
5142
5143 UPDATE AHL_WORKORDERS SET
5144 OBJECT_VERSION_NUMBER =p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER + 1,
5145 LAST_UPDATE_DATE =NVL(p_x_prd_workorder_rec.LAST_UPDATE_DATE,SYSDATE),
5146 LAST_UPDATED_BY =NVL(p_x_prd_workorder_rec.LAST_UPDATED_BY,FND_GLOBAL.user_id),
5147 LAST_UPDATE_LOGIN =NVL(p_x_prd_workorder_rec.LAST_UPDATE_LOGIN,FND_GLOBAL.user_id),
5148 STATUS_CODE =p_x_prd_workorder_rec.STATUS_CODE,
5149 ACTUAL_START_DATE =p_x_prd_workorder_rec.ACTUAL_START_DATE,
5150 ACTUAL_END_DATE =p_x_prd_workorder_rec.ACTUAL_END_DATE,
5151 CONFIRM_FAILURE_FLAG =p_x_prd_workorder_rec.CONFIRM_FAILURE_FLAG,
5152 SECURITY_GROUP_ID =p_x_prd_workorder_rec.SECURITY_GROUP_ID,
5153 ATTRIBUTE_CATEGORY =p_x_prd_workorder_rec.ATTRIBUTE_CATEGORY,
5154 ATTRIBUTE1 =p_x_prd_workorder_rec.ATTRIBUTE1,
5155 ATTRIBUTE2 =p_x_prd_workorder_rec.ATTRIBUTE2,
5156 ATTRIBUTE3 =p_x_prd_workorder_rec.ATTRIBUTE3,
5157 ATTRIBUTE4 =p_x_prd_workorder_rec.ATTRIBUTE4,
5158 ATTRIBUTE5 =p_x_prd_workorder_rec.ATTRIBUTE5,
5159 ATTRIBUTE6 =p_x_prd_workorder_rec.ATTRIBUTE6,
5160 ATTRIBUTE7 =p_x_prd_workorder_rec.ATTRIBUTE7,
5161 ATTRIBUTE8 =p_x_prd_workorder_rec.ATTRIBUTE8,
5162 ATTRIBUTE9 =p_x_prd_workorder_rec.ATTRIBUTE9,
5163 ATTRIBUTE10 =p_x_prd_workorder_rec.ATTRIBUTE10,
5164 ATTRIBUTE11 =p_x_prd_workorder_rec.ATTRIBUTE11,
5165 ATTRIBUTE12 =p_x_prd_workorder_rec.ATTRIBUTE12,
5166 ATTRIBUTE13 =p_x_prd_workorder_rec.ATTRIBUTE13,
5167 ATTRIBUTE14 =p_x_prd_workorder_rec.ATTRIBUTE14,
5168 ATTRIBUTE15 =p_x_prd_workorder_rec.ATTRIBUTE15,
5169 HOLD_REASON_CODE =p_x_prd_workorder_rec.HOLD_REASON_CODE,
5170 -- JKJain, NR Analysis and Forecasting
5171 UC_HEADER_ID =l_uc_header_id,
5172 NHA_UC_HEADER_ID =l_nha_uc_header_id,
5173 FLEET_HEADER_ID =l_fleet_header_id,
5174 MAINTENANCE_TYPE_CODE =L_MAINTENANCE_TYPE_CODE,
5175 -- sansatpa added for marshalling AOG updation
5176 AOG_FLAG = p_x_prd_workorder_rec.AOG_FLAG
5177 WHERE WORKORDER_ID=p_x_prd_workorder_rec.WORKORDER_ID
5178 AND OBJECT_VERSION_NUMBER=p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER;
5179
5180 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER := p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER + 1;
5181
5182
5183 IF SQL%NOTFOUND THEN
5184 FND_MESSAGE.SET_NAME('AHL','AHL_COM_RECORD_CHANGED');
5185 FND_MSG_PUB.ADD;
5186 RAISE FND_API.G_EXC_ERROR;
5187 END IF;
5188
5189
5190 IF ( G_DEBUG = 'Y' ) THEN
5191 AHL_DEBUG_PUB.debug( l_api_name || ' - Before Inserting into AHL_WORKORDER_TXNS' );
5192 END IF;
5193
5194 INSERT INTO AHL_WORKORDER_TXNS
5195 (
5196 WORKORDER_TXN_ID,
5197 OBJECT_VERSION_NUMBER,
5198 LAST_UPDATE_DATE,
5199 LAST_UPDATED_BY,
5200 CREATION_DATE,
5201 CREATED_BY,
5202 LAST_UPDATE_LOGIN,
5203 WORKORDER_ID,
5204 TRANSACTION_TYPE_CODE,
5205 STATUS_CODE,
5206 SCHEDULED_START_DATE,
5207 SCHEDULED_END_DATE,
5208 ACTUAL_START_DATE,
5209 ACTUAL_END_DATE,
5210 LOT_NUMBER,
5211 COMPLETION_SUBINVENTORY,
5212 COMPLETION_LOCATOR_ID,
5213 HOLD_REASON_CODE,
5214 -- JKJain, NR Analysis and Forecasting
5215 UC_HEADER_ID,
5216 NHA_UC_HEADER_ID,
5217 AOG_FLAG
5218 ) VALUES
5219 (
5220 AHL_WORKORDER_TXNS_S.NEXTVAL,
5221 NVL(p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER,1),
5222 NVL(p_x_prd_workorder_rec.LAST_UPDATE_DATE,SYSDATE),
5223 NVL(p_x_prd_workorder_rec.LAST_UPDATED_BY,FND_GLOBAL.USER_ID),
5224 NVL(p_x_prd_workorder_rec.CREATION_DATE,SYSDATE),
5225 NVL(p_x_prd_workorder_rec.CREATED_BY,FND_GLOBAL.USER_ID),
5226 NVL(p_x_prd_workorder_rec.LAST_UPDATE_LOGIN,FND_GLOBAL.USER_ID),
5227 p_x_prd_workorder_rec.WORKORDER_ID,
5228 0,
5229 p_x_prd_workorder_rec.STATUS_CODE,
5230 p_x_prd_workorder_rec.SCHEDULED_START_DATE,
5231 p_x_prd_workorder_rec.SCHEDULED_END_DATE,
5232 p_x_prd_workorder_rec.ACTUAL_START_DATE,
5233 p_x_prd_workorder_rec.ACTUAL_END_DATE,
5234 0,
5235 p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY,
5236 p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID,
5237 p_x_prd_workorder_rec.HOLD_REASON_CODE,
5238 -- JKJain, NR Analysis and Forecasting
5239 l_uc_header_id,
5240 l_nha_uc_header_id,
5241 p_x_prd_workorder_rec.AOG_FLAG
5242 );
5243
5244 IF p_x_prd_workoper_tbl.COUNT >0 THEN
5245 FOR i in p_x_prd_workoper_tbl.FIRST..p_x_prd_workoper_tbl.LAST
5246 LOOP
5247 l_prd_workoper_tbl(i).WORKORDER_OPERATION_ID :=p_x_prd_workoper_tbl(i).WORKORDER_OPERATION_ID;
5248 l_prd_workoper_tbl(i).ORGANIZATION_ID :=p_x_prd_workoper_tbl(i).ORGANIZATION_ID;
5249 l_prd_workoper_tbl(i).OPERATION_SEQUENCE_NUM :=p_x_prd_workoper_tbl(i).OPERATION_SEQUENCE_NUM;
5250 l_prd_workoper_tbl(i).OPERATION_DESCRIPTION :=p_x_prd_workoper_tbl(i).OPERATION_DESCRIPTION;
5251 l_prd_workoper_tbl(i).WORKORDER_ID :=p_x_prd_workoper_tbl(i).WORKORDER_ID;
5252 l_prd_workoper_tbl(i).WIP_ENTITY_ID :=p_x_prd_workoper_tbl(i).WIP_ENTITY_ID;
5253 l_prd_workoper_tbl(i).ROUTE_ID :=p_x_prd_workoper_tbl(i).ROUTE_ID;
5254 l_prd_workoper_tbl(i).OBJECT_VERSION_NUMBER :=p_x_prd_workoper_tbl(i).OBJECT_VERSION_NUMBER;
5255 l_prd_workoper_tbl(i).LAST_UPDATE_DATE :=p_x_prd_workoper_tbl(i).LAST_UPDATE_DATE;
5256 l_prd_workoper_tbl(i).LAST_UPDATED_BY :=p_x_prd_workoper_tbl(i).LAST_UPDATED_BY;
5257 l_prd_workoper_tbl(i).CREATION_DATE :=p_x_prd_workoper_tbl(i).CREATION_DATE;
5258 l_prd_workoper_tbl(i).CREATED_BY :=p_x_prd_workoper_tbl(i).CREATED_BY;
5259 l_prd_workoper_tbl(i).LAST_UPDATE_LOGIN :=p_x_prd_workoper_tbl(i).LAST_UPDATE_LOGIN;
5260 l_prd_workoper_tbl(i).DEPARTMENT_ID :=p_x_prd_workoper_tbl(i).DEPARTMENT_ID;
5261 l_prd_workoper_tbl(i).DEPARTMENT_NAME :=p_x_prd_workoper_tbl(i).DEPARTMENT_NAME;
5262
5263 -- For new operations, default operation department based on resources - FP Bug# 7238868
5264 IF (p_x_prd_workoper_tbl(i).OPERATION_CODE IS NOT NULL
5265 AND p_x_prd_workoper_tbl(i).DML_OPERATION = 'C' ) THEN -- route operation.
5266
5267
5268 -- first find the operation id.
5269 OPEN get_operation_details(p_x_prd_workoper_tbl(i).OPERATION_CODE);
5270 FETCH get_operation_details INTO p_x_prd_workoper_tbl(i).operation_id;
5271 CLOSE get_operation_details;
5272
5273 IF ( G_DEBUG = 'Y' ) THEN
5274 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'dept id:' || p_x_prd_workorder_rec.department_id);
5275 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'dept ID(Oper):' || p_x_prd_workoper_tbl(i).DEPARTMENT_ID);
5276 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'deptnameD(Oper):' || p_x_prd_workoper_tbl(i).DEPARTMENT_NAME);
5277
5278 END IF;
5279
5280 --IF (p_x_prd_workoper_tbl(i).DEPARTMENT_ID = p_x_prd_workorder_rec.department_id) THEN
5281 IF (p_x_prd_workoper_tbl(i).operation_id IS NOT NULL) THEN
5282 Get_Default_Rt_Op_dept(p_object_id => p_x_prd_workoper_tbl(i).operation_id,
5283 p_association_type => 'OPERATION',
5284 p_organization_id => p_x_prd_workorder_rec.organization_id,
5285 x_return_status => l_return_status,
5286 x_department_id => l_department_id,
5287 x_department_name => l_department_name,
5288 x_object_resource_found => l_oper_found);
5289
5290 IF ( G_DEBUG = 'Y' ) THEN
5291 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_return_status:' || l_return_status );
5292 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_department_id:' || l_department_id);
5293 AHL_DEBUG_PUB.debug( 'Get_Operations'|| 'l_oper_found:' || l_oper_found);
5294 END IF;
5295
5296 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5297 RAISE FND_API.G_EXC_ERROR;
5298 END IF;
5299
5300 IF (l_department_id IS NOT NULL) THEN
5301 l_prd_workoper_tbl(i).department_id := l_department_id;
5302 l_prd_workoper_tbl(i).DEPARTMENT_NAME := l_department_name;
5303 END IF;
5304 END IF; -- operation id.
5305
5306 END IF;
5307
5308 l_prd_workoper_tbl(i).OPERATION_ID :=p_x_prd_workoper_tbl(i).OPERATION_ID;
5309 l_prd_workoper_tbl(i).OPERATION_CODE :=p_x_prd_workoper_tbl(i).OPERATION_CODE;
5310 l_prd_workoper_tbl(i).OPERATION_TYPE_CODE :=p_x_prd_workoper_tbl(i).OPERATION_TYPE_CODE;
5311 l_prd_workoper_tbl(i).OPERATION_TYPE :=p_x_prd_workoper_tbl(i).OPERATION_TYPE;
5312 l_prd_workoper_tbl(i).STATUS_CODE :=p_x_prd_workoper_tbl(i).STATUS_CODE;
5313 l_prd_workoper_tbl(i).STATUS_MEANING :=p_x_prd_workoper_tbl(i).STATUS_MEANING;
5314 l_prd_workoper_tbl(i).PROPAGATE_FLAG :=p_x_prd_workoper_tbl(i).PROPAGATE_FLAG;
5315 l_prd_workoper_tbl(i).SCHEDULED_START_DATE :=p_x_prd_workoper_tbl(i).SCHEDULED_START_DATE;
5316 l_prd_workoper_tbl(i).SCHEDULED_START_HR :=p_x_prd_workoper_tbl(i).SCHEDULED_START_HR;
5317 l_prd_workoper_tbl(i).SCHEDULED_START_MI :=p_x_prd_workoper_tbl(i).SCHEDULED_START_MI;
5318 l_prd_workoper_tbl(i).SCHEDULED_END_DATE :=p_x_prd_workoper_tbl(i).SCHEDULED_END_DATE;
5319 l_prd_workoper_tbl(i).SCHEDULED_END_HR :=p_x_prd_workoper_tbl(i).SCHEDULED_END_HR;
5320 l_prd_workoper_tbl(i).SCHEDULED_END_MI :=p_x_prd_workoper_tbl(i).SCHEDULED_END_MI;
5321 l_prd_workoper_tbl(i).ACTUAL_START_DATE :=p_x_prd_workoper_tbl(i).ACTUAL_START_DATE;
5322 l_prd_workoper_tbl(i).ACTUAL_START_HR :=p_x_prd_workoper_tbl(i).ACTUAL_START_HR;
5323 l_prd_workoper_tbl(i).ACTUAL_START_MI :=p_x_prd_workoper_tbl(i).ACTUAL_START_MI;
5324 l_prd_workoper_tbl(i).ACTUAL_END_DATE :=p_x_prd_workoper_tbl(i).ACTUAL_END_DATE;
5325 l_prd_workoper_tbl(i).ACTUAL_END_HR :=p_x_prd_workoper_tbl(i).ACTUAL_END_HR;
5326 l_prd_workoper_tbl(i).ACTUAL_END_MI :=p_x_prd_workoper_tbl(i).ACTUAL_END_MI;
5327 l_prd_workoper_tbl(i).PLAN_ID :=p_x_prd_workoper_tbl(i).PLAN_ID;
5328 l_prd_workoper_tbl(i).COLLECTION_ID :=p_x_prd_workoper_tbl(i).COLLECTION_ID;
5329 l_prd_workoper_tbl(i).SECURITY_GROUP_ID :=p_x_prd_workoper_tbl(i).SECURITY_GROUP_ID;
5330 l_prd_workoper_tbl(i).ATTRIBUTE_CATEGORY :=p_x_prd_workoper_tbl(i).ATTRIBUTE_CATEGORY;
5331 l_prd_workoper_tbl(i).ATTRIBUTE1 :=p_x_prd_workoper_tbl(i).ATTRIBUTE1;
5332 l_prd_workoper_tbl(i).ATTRIBUTE2 :=p_x_prd_workoper_tbl(i).ATTRIBUTE2;
5333 l_prd_workoper_tbl(i).ATTRIBUTE3 :=p_x_prd_workoper_tbl(i).ATTRIBUTE3;
5334 l_prd_workoper_tbl(i).ATTRIBUTE4 :=p_x_prd_workoper_tbl(i).ATTRIBUTE4;
5335 l_prd_workoper_tbl(i).ATTRIBUTE5 :=p_x_prd_workoper_tbl(i).ATTRIBUTE5;
5336 l_prd_workoper_tbl(i).ATTRIBUTE6 :=p_x_prd_workoper_tbl(i).ATTRIBUTE6;
5337 l_prd_workoper_tbl(i).ATTRIBUTE7 :=p_x_prd_workoper_tbl(i).ATTRIBUTE7;
5338 l_prd_workoper_tbl(i).ATTRIBUTE8 :=p_x_prd_workoper_tbl(i).ATTRIBUTE8;
5339 l_prd_workoper_tbl(i).ATTRIBUTE9 :=p_x_prd_workoper_tbl(i).ATTRIBUTE9;
5340 l_prd_workoper_tbl(i).ATTRIBUTE10 :=p_x_prd_workoper_tbl(i).ATTRIBUTE10;
5341 l_prd_workoper_tbl(i).ATTRIBUTE11 :=p_x_prd_workoper_tbl(i).ATTRIBUTE11;
5342 l_prd_workoper_tbl(i).ATTRIBUTE12 :=p_x_prd_workoper_tbl(i).ATTRIBUTE12;
5343 l_prd_workoper_tbl(i).ATTRIBUTE13 :=p_x_prd_workoper_tbl(i).ATTRIBUTE13;
5344 l_prd_workoper_tbl(i).ATTRIBUTE14 :=p_x_prd_workoper_tbl(i).ATTRIBUTE14;
5345 l_prd_workoper_tbl(i).ATTRIBUTE15 :=p_x_prd_workoper_tbl(i).ATTRIBUTE15;
5346 l_prd_workoper_tbl(i).DML_OPERATION :=p_x_prd_workoper_tbl(i).DML_OPERATION;
5347
5348 END LOOP;
5349
5350 IF ( G_DEBUG = 'Y' ) THEN
5351 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PRD_OPERATIONS_PVT.process_operations' );
5352 END IF;
5353
5354 AHL_PRD_OPERATIONS_PVT.process_operations
5355 (
5356 p_api_version =>1.0,
5357 p_init_msg_list =>FND_API.G_TRUE,
5358 p_commit =>FND_API.G_FALSE,
5359 p_validation_level =>p_validation_level,
5360 p_default =>p_default,
5361 p_module_type =>p_module_type,
5362 p_wip_mass_load_flag =>'N',
5363 x_return_status =>l_return_status,
5364 x_msg_count =>l_msg_count ,
5365 x_msg_data =>l_msg_data,
5366 p_x_prd_operation_tbl =>l_prd_workoper_tbl
5367 );
5368
5369 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5370 RAISE FND_API.G_EXC_ERROR;
5371 END IF;
5372
5373 IF ( p_wip_load_flag = 'Y' ) THEN
5374
5375 IF ( G_DEBUG = 'Y' ) THEN
5376 AHL_DEBUG_PUB.debug( l_api_name || ' - Before get_op_resource_req' );
5377 END IF;
5378
5379 -- Get the Resource Requirements for New Operations
5380 get_op_resource_req
5381 (
5382 p_workorder_rec => p_x_prd_workorder_rec,
5383 p_operation_tbl => l_prd_workoper_tbl,
5384 p_x_resource_tbl => l_resource_tbl
5385 );
5386
5387 IF ( G_DEBUG = 'Y' ) THEN
5388 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require' );
5389 END IF;
5390
5391 IF ( l_resource_tbl.COUNT > 0 ) THEN
5392 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
5393 (
5394 p_api_version => 1.0,
5395 p_init_msg_list => FND_API.G_TRUE,
5396 p_commit => FND_API.G_FALSE,
5397 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5398 p_module_type => NULL,
5399 p_interface_flag => 'N',
5400 p_operation_flag => 'C',
5401 p_x_resrc_require_tbl => l_resource_tbl,
5402 x_return_status => l_return_status,
5403 x_msg_count => l_msg_count,
5404 x_msg_data => l_msg_data
5405 );
5406
5407 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5408 RAISE FND_API.G_EXC_ERROR;
5409 END IF;
5410 END IF;
5411
5412 IF ( G_DEBUG = 'Y' ) THEN
5413 AHL_DEBUG_PUB.debug( l_api_name || ' - Before get_op_material_req' );
5414 END IF;
5415
5416 -- Get the Material Requirements for New Operations
5417 get_op_material_req
5418 (
5419 p_workorder_rec => p_x_prd_workorder_rec,
5420 p_operation_tbl => l_prd_workoper_tbl,
5421 p_x_material_tbl => l_material_tbl,
5422 --sukhwsin::SB Effectivity code changes - starts
5423 x_return_status => l_return_status
5424 );
5425 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5426 RAISE FND_API.G_EXC_ERROR;
5427 END IF;
5428
5429 --sukhwsin::SB Effectivity - Code Changes for UOM Conversion -starts
5430 IF ( G_DEBUG = 'Y' ) THEN
5431 AHL_DEBUG_PUB.debug( l_api_name || ' - Before UOM - Quantity conversion' );
5432 END IF;
5433 IF ( l_material_tbl.COUNT > 0 ) THEN
5434 FOR k in l_material_tbl.FIRST..l_material_tbl.LAST LOOP
5435 IF (l_material_tbl(k).mc_header_id IS NULL AND l_material_tbl(k).mc_position_key IS NULL) THEN
5436 /* Call uom conversion procedure only for non-position based requirements.
5437 For position based requirements uom conversion is already done in Get_Material_Req_For_Pos procedure call.
5438 */
5439 l_prim_quantity := null;
5440 l_prim_uom_code := null;
5441 l_prim_uom_code := AHL_LTP_MTL_REQ_PVT.Get_Primary_UOM(l_material_tbl(k).inventory_item_id, l_material_tbl(k).organization_id);
5442 l_prim_quantity := AHL_LTP_MTL_REQ_PVT.Get_Primary_UOM_Qty(l_material_tbl(k).inventory_item_id, l_material_tbl(k).uom_code, l_material_tbl(k).requested_quantity);
5443 -- Required to check the UOM Conversion exists in mtl_units_of_measure
5444 IF l_prim_quantity IS NULL THEN
5445 FND_MESSAGE.Set_Name( 'AHL','AHL_LTP_UOM_CONV_NOT_EXIST' );
5446 FND_MESSAGE.Set_Token('FUOM', l_material_tbl(k).uom_code);
5447 FND_MESSAGE.Set_Token('TUOM', l_prim_uom_code);
5448 FND_MSG_PUB.add;
5449 RAISE FND_API.G_EXC_ERROR;
5450 ELSE
5451 l_material_tbl(k).requested_quantity := l_prim_quantity;
5452 END IF;
5453 END IF;
5454 END LOOP;
5455 END IF;
5456 --sukhwsin::SB Effectivity - Code Changes for UOM Conversion -ends
5457
5458 IF ( G_DEBUG = 'Y' ) THEN
5459 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_PP_MATERIALS_PVT.create_material_reqst' );
5460 END IF;
5461
5462 IF ( l_material_tbl.COUNT > 0 ) THEN
5463 AHL_PP_MATERIALS_PVT.create_material_reqst
5464 (
5465 p_api_version => 1.0,
5466 p_init_msg_list => FND_API.G_TRUE,
5467 p_commit => FND_API.G_FALSE,
5468 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5469 p_interface_flag => 'N',
5470 p_x_req_material_tbl => l_material_tbl,
5471 x_job_return_status => l_job_return_status,
5472 x_return_status => l_return_status,
5473 x_msg_count => l_msg_count,
5474 x_msg_data => l_msg_data
5475 );
5476
5477 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5478 RAISE FND_API.G_EXC_ERROR;
5479 END IF;
5480 END IF;
5481
5482 END IF; -- For WIP Load Flag
5483
5484 END IF; -- For Operations
5485
5486 IF ( p_wip_load_flag = 'Y' ) THEN
5487
5488 IF ( G_DEBUG = 'Y' ) THEN
5489 AHL_DEBUG_PUB.debug( l_api_name || ' - Getting parent_workorders' );
5490 END IF;
5491
5492 FOR parent_csr IN get_parent_workorders( p_x_prd_workorder_rec.wip_entity_id ) LOOP
5493 l_parent_workorder_rec.workorder_id := parent_csr.workorder_id;
5494 l_parent_workorder_rec.object_version_number := parent_csr.object_version_number;
5495
5496 IF ( G_DEBUG = 'Y' ) THEN
5497 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder_id :' || l_parent_workorder_rec.workorder_id );
5498 END IF;
5499
5500 FOR child_csr IN get_child_workorders( parent_csr.wip_entity_id ) LOOP
5501
5502 IF ( l_status_code IS NULL ) THEN
5503 l_status_code := child_csr.status_code;
5504 ELSIF ( l_status_code <> child_csr.status_code ) THEN
5505 l_status_code := l_status_code_multi;
5506 END IF;
5507
5508 IF ( l_scheduled_start_date IS NULL ) THEN
5509 l_scheduled_start_date := child_csr.scheduled_start_date;
5510 ELSIF ( NVL(child_csr.scheduled_start_date, l_scheduled_start_date) < l_scheduled_start_date ) THEN
5511 l_scheduled_start_date := child_csr.scheduled_start_date;
5512 END IF;
5513
5514 IF ( l_scheduled_end_date IS NULL ) THEN
5515 l_scheduled_end_date := child_csr.scheduled_end_date;
5516 ELSIF ( NVL(child_csr.scheduled_end_date, l_scheduled_end_date) > l_scheduled_end_date ) THEN
5517 l_scheduled_end_date := child_csr.scheduled_end_date;
5518 END IF;
5519
5520 IF ( l_actual_start_date IS NULL ) THEN
5521 l_actual_start_date := child_csr.actual_start_date;
5522 ELSIF ( NVL(child_csr.actual_start_date, l_actual_start_date) < l_actual_start_date ) THEN
5523 l_actual_start_date := child_csr.actual_start_date;
5524 END IF;
5525
5526 IF ( l_actual_end_date IS NULL ) THEN
5527 l_actual_end_date := child_csr.actual_end_date;
5528 ELSIF ( NVL(child_csr.actual_end_date, l_actual_end_date) > l_actual_end_date ) THEN
5529 l_actual_end_date := child_csr.actual_end_date;
5530 END IF;
5531
5532 END LOOP;
5533
5534 IF ( parent_csr.visit_task_id IS NOT NULL ) THEN
5535 IF ( l_scheduled_start_date IS NULL OR
5536 p_x_prd_workorder_rec.scheduled_start_date < l_scheduled_start_date ) THEN
5537 l_parent_workorder_rec.scheduled_start_date := p_x_prd_workorder_rec.scheduled_start_date;
5538 l_parent_workorder_rec.scheduled_start_hr := p_x_prd_workorder_rec.scheduled_start_hr;
5539 l_parent_workorder_rec.scheduled_start_mi := p_x_prd_workorder_rec.scheduled_start_mi;
5540 ELSE
5541 l_parent_workorder_rec.scheduled_start_date := l_scheduled_start_date;
5542 l_parent_workorder_rec.scheduled_start_hr := TO_NUMBER( TO_CHAR( l_scheduled_start_date, 'HH24' ) );
5543 l_parent_workorder_rec.scheduled_start_mi := TO_NUMBER( TO_CHAR( l_scheduled_start_date, 'MI' ) );
5544 END IF;
5545 END IF;
5546
5547 IF ( parent_csr.visit_task_id IS NOT NULL ) THEN
5548 IF ( l_scheduled_end_date IS NULL OR
5549 p_x_prd_workorder_rec.scheduled_end_date > l_scheduled_end_date ) THEN
5550 l_parent_workorder_rec.scheduled_end_date := p_x_prd_workorder_rec.scheduled_end_date;
5551 l_parent_workorder_rec.scheduled_end_hr := p_x_prd_workorder_rec.scheduled_end_hr;
5552 l_parent_workorder_rec.scheduled_end_mi := p_x_prd_workorder_rec.scheduled_end_mi;
5553 ELSE
5554 l_parent_workorder_rec.scheduled_end_date := l_scheduled_end_date;
5555 l_parent_workorder_rec.scheduled_end_hr := TO_NUMBER( TO_CHAR( l_scheduled_end_date, 'HH24' ) );
5556 l_parent_workorder_rec.scheduled_end_mi := TO_NUMBER( TO_CHAR( l_scheduled_end_date, 'MI' ) );
5557 END IF;
5558 END IF;
5559
5560 IF ( l_actual_start_date IS NOT NULL ) THEN
5561 l_parent_workorder_rec.actual_start_date := l_actual_start_date;
5562 l_parent_workorder_rec.actual_start_hr := TO_NUMBER( TO_CHAR( l_actual_start_date, 'HH24' ) );
5563 l_parent_workorder_rec.actual_start_mi := TO_NUMBER( TO_CHAR( l_actual_start_date, 'MI' ) );
5564 END IF;
5565
5566 IF ( l_actual_end_date IS NOT NULL ) THEN
5567 l_parent_workorder_rec.actual_end_date := l_actual_end_date;
5568 l_parent_workorder_rec.actual_end_hr := TO_NUMBER( TO_CHAR( l_actual_end_date, 'HH24' ) );
5569 l_parent_workorder_rec.actual_end_mi := TO_NUMBER( TO_CHAR( l_actual_end_date, 'MI' ) );
5570 END IF;
5571
5572 IF ( l_status_code = l_status_code_multi ) THEN
5573 IF ( ( p_x_prd_workorder_rec.status_code = G_JOB_STATUS_RELEASED OR
5574 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_ON_HOLD OR
5575 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_CANCELLED OR
5576 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_PARTS_HOLD OR
5577 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_DEFERRAL_PENDING OR
5578 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_DELETED ) AND
5579 ( parent_csr.status_code = G_JOB_STATUS_UNRELEASED OR
5580 parent_csr.status_code = G_JOB_STATUS_DRAFT ) ) THEN
5581 l_parent_workorder_rec.status_code := G_JOB_STATUS_RELEASED;
5582 END IF;
5583 ELSE
5584 IF ( parent_csr.visit_task_id IS NULL AND
5585 parent_csr.status_code = G_JOB_STATUS_DRAFT AND
5586 p_x_prd_workorder_rec.status_code = G_JOB_STATUS_DELETED ) THEN
5587 l_parent_workorder_rec.status_code := G_JOB_STATUS_RELEASED;
5588 -- auto close should not be allowed
5589 -- rroy
5590 -- bug 4626717 and Shailaja's Mail dated Mon, 26 Sep 2005
5591 -- Subj: [Fwd: proposed change to visit closure process]
5592 /*
5593 * Balaji commented out following portion of code for bug # 5138200
5594 * Since master workorder cannot be updated to cancelled status
5595 * when child workorder are not already cancelled. The recursive logic
5596 * in this API updates parent workorders first and then child workorders.
5597 * Cancelling parent workorders will be taken care by Cancel_Visit_Jobs API.
5598 *
5599 ELSIF l_status_code <> G_JOB_STATUS_CLOSED THEN
5600 l_parent_workorder_rec.status_code := l_status_code;
5601 */
5602 END IF;
5603 END IF;
5604 -- rroy
5605 -- validate the status change so that
5606 -- the sequence of status changes is valid
5607 -- and eam does not throw errors
5608 -- the validations are similar to those in
5609 -- eam_wo_validate_pvt
5610 IF(l_parent_workorder_Rec.status_code = G_JOB_STATUS_DRAFT AND parent_csr.status_code <> G_JOB_STATUS_DRAFT) THEN
5611 l_parent_workorder_rec.status_code := parent_csr.status_code;
5612 ELSIF(parent_csr.status_code = G_JOB_STATUS_COMPLETE_NC AND
5613 (l_parent_workorder_rec.status_code NOT IN (G_JOB_STATUS_COMPLETE_NC, G_JOB_STATUS_CLOSED,
5614 G_JOB_STATUS_COMPLETE))) THEN
5615 l_parent_workorder_rec.status_code := parent_csr.status_code;
5616 ELSIF (l_parent_workorder_rec.status_code = G_JOB_STATUS_COMPLETE_NC AND
5617 (parent_csr.status_code NOT IN (G_JOB_STATUS_COMPLETE_NC, G_JOB_STATUS_CLOSED, G_JOB_STATUS_COMPLETE))) THEN
5618 l_parent_workorder_rec.status_code := parent_csr.status_code;
5619 END IF;
5620
5621 IF ( G_DEBUG = 'Y' ) THEN
5622 AHL_DEBUG_PUB.debug( l_api_name || ' - Before update_job for parent workorder' );
5623 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder-status_code: '|| l_parent_workorder_rec.status_code );
5624 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder-scheduled_start_date: '|| TO_CHAR(l_parent_workorder_rec.scheduled_start_date , 'DD-MON-YYYY HH24:MI' ) );
5625 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder-scheduled_end_date: '|| TO_CHAR(l_parent_workorder_rec.scheduled_end_date , 'DD-MON-YYYY HH24:MI' ) );
5626 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder-actual_start_date: '|| TO_CHAR(l_parent_workorder_rec.actual_start_date , 'DD-MON-YYYY HH24:MI' ) );
5627 AHL_DEBUG_PUB.debug( l_api_name || ' - parent workorder-actual_end_date: '|| TO_CHAR(l_parent_workorder_rec.actual_end_date , 'DD-MON-YYYY HH24:MI' ) );
5628 END IF;
5629
5630 -- Bug # 7643668 (FP for Bug # 6493302) -- start
5631 -- Unless any of scheduled date, actual date or status changes for a
5632 -- parent work order dont call update_job for Master workorder.
5633 -- added check on l_expand_mwo_flag for ER# 9368251
5634 IF
5635 (
5636 parent_csr.status_code <> l_parent_workorder_rec.status_code OR
5637 (l_expand_mwo_flag = FALSE AND
5638 (parent_csr.scheduled_start_date <> l_parent_workorder_rec.scheduled_start_date OR
5639 parent_csr.scheduled_end_date <> l_parent_workorder_rec.scheduled_end_date OR
5640 TO_NUMBER( TO_CHAR( parent_csr.scheduled_start_date, 'HH24' ) ) <> l_parent_workorder_rec.scheduled_start_hr OR
5641 TO_NUMBER( TO_CHAR( parent_csr.scheduled_start_date, 'MI' ) ) <> l_parent_workorder_rec.scheduled_start_mi OR
5642 TO_NUMBER( TO_CHAR( parent_csr.scheduled_end_date, 'HH24' ) ) <> l_parent_workorder_rec.scheduled_end_hr OR
5643 TO_NUMBER( TO_CHAR( parent_csr.scheduled_end_date, 'MI' ) ) <> l_parent_workorder_rec.scheduled_end_mi )
5644 )
5645 OR
5646 (
5647 (
5648 parent_csr.actual_start_date IS NULL AND
5649 l_parent_workorder_rec.actual_start_date IS NOT NULL
5650 ) OR
5651 parent_csr.actual_start_date <> l_parent_workorder_rec.actual_start_date
5652 ) OR
5653 (
5654 (
5655 parent_csr.actual_end_date IS NULL AND
5656 l_parent_workorder_rec.actual_end_date IS NOT NULL
5657 ) OR
5658 parent_csr.actual_end_date <> l_parent_workorder_rec.actual_end_date
5659 ) OR
5660 (
5661 parent_csr.actual_start_date IS NOT NULL AND
5662 TO_NUMBER( TO_CHAR( parent_csr.actual_start_date, 'HH24' ) ) <> l_parent_workorder_rec.actual_start_hr
5663 ) OR
5664 (
5665 parent_csr.actual_start_date IS NOT NULL AND
5666 TO_NUMBER( TO_CHAR( parent_csr.actual_start_date, 'MI' ) ) <> l_parent_workorder_rec.actual_start_mi
5667 ) OR
5668 (
5669 parent_csr.actual_end_date IS NOT NULL AND
5670 TO_NUMBER( TO_CHAR( parent_csr.actual_end_date, 'HH24' ) ) <> l_parent_workorder_rec.actual_end_hr
5671 ) OR
5672 (
5673 parent_csr.actual_end_date IS NOT NULL AND
5674 TO_NUMBER( TO_CHAR( parent_csr.actual_end_date, 'MI' ) ) <> l_parent_workorder_rec.actual_end_mi
5675 )
5676
5677 )
5678 THEN
5679 update_job
5680 (
5681 p_api_version => 1.0 ,
5682 p_init_msg_list => FND_API.G_TRUE ,
5683 p_commit => FND_API.G_FALSE ,
5684 p_validation_level => FND_API.G_VALID_LEVEL_FULL ,
5685 p_default => FND_API.G_TRUE ,
5686 p_module_type => NULL ,
5687 x_return_status => l_return_status ,
5688 x_msg_count => l_msg_count ,
5689 x_msg_data => l_msg_data ,
5690 p_wip_load_flag => p_wip_load_flag ,
5691 p_x_prd_workorder_rec => l_parent_workorder_rec ,
5692 p_x_prd_workoper_tbl => l_parent_workoper_tbl
5693 );
5694
5695 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5696 RAISE FND_API.G_EXC_ERROR;
5697 END IF;
5698
5699 IF ( G_DEBUG = 'Y' ) THEN
5700 AHL_DEBUG_PUB.debug( l_api_name || ' - update_job for parent_workorder successful' );
5701 END IF;
5702
5703 END IF;
5704 -- Bug # 7643668 (FP for Bug # 6493302) -- end
5705 END LOOP;
5706
5707 IF ( G_DEBUG = 'Y' ) THEN
5708 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_EAM_JOB_PVT.update_job_operations' );
5709 END IF;
5710
5711 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- start
5712 -- Though resource requirements are added in call to AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
5713 -- above, EAM API is not called due to p_interface_flag being N.
5714 -- Hence the MWO dates are not updated correctly. They need expanded and contracted
5715 -- just before resource addition and after resource addition respectively.
5716 IF (l_resource_tbl.COUNT > 0 AND l_expand_mwo_flag = FALSE)
5717 THEN
5718 FOR l_res_count IN l_resource_tbl.FIRST .. l_resource_tbl.LAST
5719 LOOP
5720 AHL_PP_RESRC_REQUIRE_PVT.Expand_Master_Wo_Dates(l_resource_tbl(l_res_count));
5721 END LOOP;
5722 END IF;
5723 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- end
5724
5725 --pekambar for ER # 9410221 --start
5726
5727 OPEN get_wo_sch_dates(p_x_prd_workorder_rec.wip_entity_id);
5728 FETCH get_wo_sch_dates INTO l_mo_scheduled_start_date, l_mo_scheduled_end_date;
5729 CLOSE get_wo_sch_dates;
5730
5731 OPEN get_master_wo_flag(p_x_prd_workorder_rec.wip_entity_id);
5732 FETCH get_master_wo_flag INTO l_wo_master_workorder_flag;
5733 CLOSE get_master_wo_flag;-- Reverted the User Passed End date from temporary variabale If Startdate changed only
5734 -- Since changing End date only change the end date of workorder
5735 IF(l_mo_scheduled_start_date <> p_x_prd_workorder_rec.SCHEDULED_START_DATE AND p_x_prd_workorder_rec.firm_planned_flag = 1 AND l_wo_master_workorder_flag <> 'Y')
5736 THEN
5737 p_x_prd_workorder_rec.scheduled_end_date := l_temp_scheduled_end_date;
5738
5739 --MANESING::Bug 13946377, 11-Apr-2012, moved following swap statements inside above IF condition
5740 -- To address the customer reopen issue. Expand workorder and then move workorder
5741 -- we are calling AHL_EAM_JOB_PVT.update_job_operations first and then move_workorder(If Start_date is changed)
5742 -- so keeping old scheduled_start_date to call update_job_operations() API.
5743 -- save scheduled_start_date in temp and then pass to move_workorder
5744 l_temp_scheduled_start_date := p_x_prd_workorder_rec.scheduled_start_date;
5745
5746 -- Changing startdate will move the workorder, no need tp pass new start date to
5747 -- update_job_operations() API. so passsing cheduled_start_date as old start date to
5748 -- p_x_prd_workorder_rec.scheduled_start_date
5749 p_x_prd_workorder_rec.scheduled_start_date := l_mo_scheduled_start_date;
5750 END IF;
5751
5752 -- Expand MWO if firm flag is changed from firm to planned for ER# 9368251
5753 IF (l_expand_mwo_flag) THEN
5754 ahl_prd_workorder_pvt.expand_mwo_dates(p_x_prd_workorder_rec.workorder_id, p_x_prd_workorder_rec.visit_id);
5755 END IF;
5756
5757 IF ( G_DEBUG = 'Y' )
5758 THEN
5759 AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_EAM_JOB_PVT.update_job_operations ' );
5760 END IF;
5761
5762 AHL_EAM_JOB_PVT.update_job_operations
5763 (
5764 p_api_version => 1.0 ,
5765 p_init_msg_list => FND_API.G_TRUE ,
5766 p_commit => FND_API.G_FALSE ,
5767 p_validation_level => FND_API.G_VALID_LEVEL_FULL ,
5768 p_default => FND_API.G_TRUE ,
5769 p_module_type => NULL ,
5770 x_return_status => l_return_status ,
5771 x_msg_count => l_msg_count ,
5772 x_msg_data => l_msg_data ,
5773 p_workorder_rec => p_x_prd_workorder_rec ,
5774 p_operation_tbl => l_prd_workoper_tbl ,
5775 p_material_req_tbl => l_material_tbl ,
5776 p_resource_req_tbl => l_resource_tbl
5777 );
5778
5779 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5780 RAISE FND_API.G_EXC_ERROR;
5781 END IF;
5782
5783 --sansatpa adding for marshalling - for Set MR Priority feature
5784 IF ( G_DEBUG = 'Y' ) THEN
5785 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' - set MR priority value - ' || P_X_PRD_WORKORDER_REC.set_mr_priority);
5786 END IF;
5787
5788 -- Check if Set MR Priority check box is selected
5789 IF(P_X_PRD_WORKORDER_REC.SET_MR_PRIORITY = 'Y')
5790 THEN
5791
5792 IF ( G_DEBUG = 'Y' ) THEN
5793 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' - Before updating MR Priority, priority selected - ' || P_X_PRD_WORKORDER_REC.JOB_PRIORITY || ', MR header id - ' || P_X_PRD_WORKORDER_REC.MR_HEADER_ID);
5794 END IF;
5795
5796 -- Loop through each Work Order under the MR
5797 FOR CHILD_WO_REC IN GET_CHILD_WORKORDER_DETAILS(P_X_PRD_WORKORDER_REC.MR_HEADER_ID, P_X_PRD_WORKORDER_REC.VISIT_ID)
5798 LOOP
5799
5800 L_CHILD_WO_ID := CHILD_WO_REC.WORKORDER_ID;
5801 L_CHILD_WO_WIP_ID := CHILD_WO_REC.WIP_ENTITY_ID;
5802
5803 IF ( G_DEBUG = 'Y' ) THEN
5804 AHL_DEBUG_PUB.DEBUG( L_API_NAME || ' - child workorder id - ' || L_CHILD_WO_ID || ', child workorder wip id - ' || L_CHILD_WO_WIP_ID);
5805 END IF;
5806
5807 -- Update required paparms to L_X_PRD_WORKORDER_REC
5808 L_X_PRD_WORKORDER_REC.DML_OPERATION := 'U';
5809 L_X_PRD_WORKORDER_REC.WORKORDER_ID := CHILD_WO_REC.WORKORDER_ID;
5810 L_X_PRD_WORKORDER_REC.JOB_PRIORITY := P_X_PRD_WORKORDER_REC.JOB_PRIORITY;
5811 L_X_PRD_WORKORDER_REC.VISIT_TASK_ID := CHILD_WO_REC.VISIT_TASK_ID;
5812 L_X_PRD_WORKORDER_REC.MASTER_WORKORDER_FLAG := 'N';
5813 L_X_PRD_WORKORDER_REC.WIP_ENTITY_ID := CHILD_WO_REC.WIP_ENTITY_ID;
5814 L_X_PRD_WORKORDER_REC.ORGANIZATION_ID := CHILD_WO_REC.ORGANIZATION_ID;
5815 L_X_PRD_WORKORDER_REC.INVENTORY_ITEM_ID := CHILD_WO_REC.PRIMARY_ITEM_ID;
5816 L_X_PRD_WORKORDER_REC.JOB_NUMBER := CHILD_WO_REC.WORKORDER_NAME;
5817 L_X_PRD_WORKORDER_REC.JOB_DESCRIPTION := CHILD_WO_REC.DESCRIPTION;
5818 L_X_PRD_WORKORDER_REC.ITEM_INSTANCE_ID := CHILD_WO_REC.INSTANCE_ID;
5819 L_X_PRD_WORKORDER_REC.CLASS_CODE := CHILD_WO_REC.CLASS_CODE;
5820 L_X_PRD_WORKORDER_REC.STATUS_CODE := CHILD_WO_REC.STATUS_CODE;
5821 L_X_PRD_WORKORDER_REC.PROJECT_ID := CHILD_WO_REC.PROJECT_ID;
5822 L_X_PRD_WORKORDER_REC.PROJECT_TASK_ID := CHILD_WO_REC.PROJECT_TASK_ID;
5823 L_X_PRD_WORKORDER_REC.DEPARTMENT_ID := CHILD_WO_REC.DEPARTMENT_ID;
5824 L_X_PRD_WORKORDER_REC.FIRM_PLANNED_FLAG := CHILD_WO_REC.FIRM_PLANNED_FLAG;
5825 L_X_PRD_WORKORDER_REC.SCHEDULED_START_DATE := CHILD_WO_REC.SCHEDULED_START_DATE;
5826 L_X_PRD_WORKORDER_REC.SCHEDULED_END_DATE := CHILD_WO_REC.SCHEDULED_COMPLETION_DATE;
5827 L_X_PRD_WORKORDER_REC.ORGANIZATION_ID := CHILD_WO_REC.ORGANIZATION_ID;
5828
5829 AHL_EAM_JOB_PVT.UPDATE_JOB_OPERATIONS
5830 (
5831 P_API_VERSION => 1.0 ,
5832 P_INIT_MSG_LIST => FND_API.G_TRUE ,
5833 P_COMMIT => FND_API.G_FALSE ,
5834 P_VALIDATION_LEVEL => FND_API.G_VALID_LEVEL_FULL ,
5835 P_DEFAULT => FND_API.G_TRUE ,
5836 P_MODULE_TYPE => NULL ,
5837 X_RETURN_STATUS => L_RETURN_STATUS ,
5838 X_MSG_COUNT => L_MSG_COUNT ,
5839 X_MSG_DATA => L_MSG_DATA ,
5840 P_WORKORDER_REC => L_X_PRD_WORKORDER_REC ,
5841 P_OPERATION_TBL => L_OPERATION_TBL ,
5842 P_MATERIAL_REQ_TBL => L_MATERIAL_REQ_TBL ,
5843 P_RESOURCE_REQ_TBL => L_RESOURCE_REQ_TBL
5844 );
5845
5846 END LOOP; -- Loop through each Work Order under the MR ends
5847
5848 END IF; -- Check if Set MR Priority check box is selected ends
5849
5850
5851 IF( l_mo_scheduled_start_date <> p_x_prd_workorder_rec.scheduled_start_date AND p_x_prd_workorder_rec.firm_planned_flag = 1 AND l_wo_master_workorder_flag <> 'Y')
5852 THEN
5853
5854 --MANESING::Bug 13946377, 11-Apr-2012, moved following revert statement inside above IF condition
5855 --reverted the startdate.
5856 p_x_prd_workorder_rec.scheduled_start_date := l_temp_scheduled_start_date;
5857
5858 IF ( G_DEBUG = 'Y' ) THEN
5859 AHL_DEBUG_PUB.debug( l_api_name || ' - IN AHL_EAM_JOB_PVT.move_workorder ');
5860 END IF;
5861
5862 l_mo_wip_entity_id := p_x_prd_workorder_rec.wip_entity_id ;
5863 l_mo_scheduled_start_date := p_x_prd_workorder_rec.scheduled_start_date;
5864 --l_mo_scheduled_end_date := NULL;
5865 --l_mo_offset_days := NULL;
5866 --l_mo_offset_direction := NULL;
5867 --l_mo_schedule_method := NULL;
5868 l_mo_object_type_id := 1;
5869 l_mo_ignore_firm_flag := 'N' ;
5870
5871 AHL_EAM_JOB_PVT.move_workorder
5872 (
5873 p_api_version => 1.0,
5874 p_init_msg_list => FND_API.G_TRUE,
5875 p_commit => FND_API.G_FALSE,
5876 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5877 p_default => FND_API.G_FALSE,
5878 p_module_type => NULL,
5879 x_return_status => l_return_status,
5880 x_msg_count => l_msg_count,
5881 x_msg_data => l_msg_data,
5882 p_wip_entity_id => l_mo_wip_entity_id,
5883 p_work_object_type_id => l_mo_object_type_id,
5884 p_offset_days => l_mo_offset_days,
5885 p_offset_direction => l_mo_offset_direction,
5886 p_scheduled_start_date => l_mo_scheduled_start_date,
5887 p_scheduled_end_date => l_mo_scheduled_end_date,
5888 p_schedule_method => l_mo_schedule_method,
5889 p_ignore_firm_flag => l_mo_ignore_firm_flag
5890 );
5891
5892 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5893 RAISE FND_API.G_EXC_ERROR;
5894 END IF;
5895 END IF;
5896
5897 --Call to Master workorder to update Start date or End date, to tightly encompass the
5898 --Child wororders start date and End date
5899 Update_Master_Wo_Dates(p_x_prd_workorder_rec.workorder_id);
5900
5901 IF ( G_DEBUG = 'Y' ) THEN
5902 AHL_DEBUG_PUB.debug( l_api_name || ' - After AHL_EAM_JOB_PVT.update_job_operations or move ' );
5903 END IF;
5904
5905 --pekambar for ER # 9410221 --end
5906
5907 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- start
5908 IF l_resource_tbl.COUNT > 0
5909 THEN
5910 FOR l_res_count IN l_resource_tbl.FIRST .. l_resource_tbl.LAST
5911 LOOP
5912 --apattark start changes for ER #9368251
5913 IF(p_x_prd_workorder_rec.firm_planned_flag is null) THEN
5914 OPEN c_check_planned_wo(l_resource_tbl(l_res_count).workorder_id);
5915 FETCH c_check_planned_wo INTO l_plan_flag;
5916 CLOSE c_check_planned_wo;
5917 ELSE
5918 l_plan_flag := p_x_prd_workorder_rec.firm_planned_flag;
5919 END IF;
5920 --apattark end changes for ER #9368251
5921 IF l_plan_flag = 2 THEN
5922
5923 AHL_PRD_WORKORDER_PVT.Update_Master_Wo_Dates(l_resource_tbl(l_res_count).workorder_id);
5924
5925 END IF;
5926 END LOOP;
5927 -- added to fix ER #9368251
5928 ELSIF (l_expand_mwo_flag) THEN
5929 AHL_PRD_WORKORDER_PVT.Update_Master_Wo_Dates(p_x_prd_workorder_rec.workorder_id);
5930 END IF;
5931 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- end
5932
5933 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5934 RAISE FND_API.G_EXC_ERROR;
5935 END IF;
5936
5937 IF ( G_DEBUG = 'Y' ) THEN
5938 AHL_DEBUG_PUB.debug( l_api_name || ' - AHL_EAM_JOB_PVT.update_job_operations succesful' );
5939 END IF;
5940
5941 END IF; -- For WIP Load Flag
5942
5943 -- R12: Serial Reservation enhancements.
5944 -- Delete existing reservations if cancelling or completing a workorder.
5945 IF (p_x_prd_workorder_rec.status_code IN (G_JOB_STATUS_COMPLETE_NC, G_JOB_STATUS_COMPLETE,
5946 G_JOB_STATUS_CANCELLED, G_JOB_STATUS_DELETED)) THEN
5947 IF ( G_DEBUG = 'Y' ) THEN
5948 AHL_DEBUG_PUB.debug( l_api_name || ' Before - AHL_RSV_RESERVATIONS_PVT.Delete_Reservation');
5949 AHL_DEBUG_PUB.debug( 'Workorder Status:' || p_x_prd_workorder_rec.status_code);
5950 END IF;
5951
5952 FOR get_scheduled_mater_rec IN get_scheduled_mater_csr(p_x_prd_workorder_rec.workorder_id)
5953 LOOP
5954 -- Call delete reservation API.
5955 AHL_RSV_RESERVATIONS_PVT.Delete_Reservation (
5956 p_api_version => 1.0,
5957 p_init_msg_list => FND_API.G_TRUE ,
5958 p_commit => FND_API.G_FALSE ,
5959 p_validation_level => FND_API.G_VALID_LEVEL_FULL ,
5960 p_module_type => NULL,
5961 x_return_status => l_return_status ,
5962 x_msg_count => l_msg_count ,
5963 x_msg_data => l_msg_data ,
5964 p_scheduled_material_id => get_scheduled_mater_rec.scheduled_material_id);
5965
5966 -- Check return status.
5967 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
5968 IF ( G_DEBUG = 'Y' ) THEN
5969 AHL_DEBUG_PUB.debug('Delete_Reservation failed for schedule material ID: '
5970 || get_scheduled_mater_rec.scheduled_material_id);
5971 END IF; -- G_DEBUG.
5972
5973 EXIT;
5974 END IF; -- l_return_status
5975
5976 END LOOP;
5977
5978 IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
5979 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5980 ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
5981 RAISE FND_API.G_EXC_ERROR;
5982 END IF;
5983
5984 END IF; -- p_x_prd_workorder_rec.status_code
5985
5986 -- ARUNJK added for Marshalling WO to WO
5987 IF (p_x_prd_workorder_rec.status_code IN (G_JOB_STATUS_CANCELLED, G_JOB_STATUS_DELETED)) THEN
5988 FOR GET_SRC_RES_ID_REC IN GET_SRC_RES_ID_CSR(p_x_prd_workorder_rec.workorder_id)
5989 LOOP
5990 AHL_MM_RESERVATIONS_PVT.DELETE_RESERVATION (
5991 p_api_version => 1.0,
5992 p_init_msg_list => FND_API.G_TRUE ,
5993 p_commit => FND_API.G_FALSE ,
5994 p_validation_level => FND_API.G_VALID_LEVEL_FULL ,
5995 p_module_type => NULL,
5996 x_return_status => l_return_status ,
5997 x_msg_count => l_msg_count ,
5998 x_msg_data => l_msg_data ,
5999 p_reservation_id => GET_SRC_RES_ID_REC.RESERVATION_ID);
6000 -- Check return status.
6001 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6002 IF ( G_DEBUG = 'Y' ) THEN
6003 AHL_DEBUG_PUB.debug('Delete_Reservation failed for Reservation ID: '
6004 || GET_SRC_RES_ID_REC.RESERVATION_ID);
6005 END IF; -- G_DEBUG.
6006
6007 EXIT;
6008 END IF; -- l_return_status
6009 END LOOP;
6010 IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6011 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6012 ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6013 RAISE FND_API.G_EXC_ERROR;
6014 END IF;
6015 END IF; -- ARUNJK Changes End
6016
6017 -- Balaji added following code for bug # 6680137
6018 -- Material requirements will be updated to status History for work orders
6019 -- in status cancelled or closed. These requirements will not be moved to
6020 -- DP history and will not be available in active demand.
6021 IF (
6022 p_x_prd_workorder_rec.status_code IN (
6023 G_JOB_STATUS_CANCELLED,
6024 G_JOB_STATUS_CLOSED,
6025 G_JOB_STATUS_COMPLETE_NC
6026 )
6027 AND p_x_prd_workorder_rec.master_workorder_flag = 'N'
6028 )
6029 THEN
6030
6031 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6032 fnd_log.string
6033 (
6034 fnd_log.level_statement,
6035 l_debug_module,
6036 'Cancelling Material Requirement for WO # ->'||p_x_prd_workorder_rec.JOB_NUMBER
6037 );
6038 fnd_log.string
6039 (
6040 fnd_log.level_statement,
6041 l_debug_module,
6042 'Work Order status ->'||p_x_prd_workorder_rec.status_code
6043 );
6044 END IF;
6045
6046 -- Retrieve visit task id if its not already present.
6047 IF (
6048 p_x_prd_workorder_rec.VISIT_TASK_ID IS NULL
6049 )
6050 THEN
6051 OPEN c_wo_vtsk_id(p_x_prd_workorder_rec.WORKORDER_ID);
6052 FETCH c_wo_vtsk_id INTO p_x_prd_workorder_rec.VISIT_TASK_ID;
6053 CLOSE c_wo_vtsk_id;
6054 END IF;
6055
6056 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6057 fnd_log.string
6058 (
6059 fnd_log.level_statement,
6060 l_debug_module,
6061 'Visit Task Id # ->'||p_x_prd_workorder_rec.VISIT_TASK_ID
6062 );
6063 fnd_log.string
6064 (
6065 fnd_log.level_statement,
6066 l_debug_module,
6067 'Before calling AHL_LTP_REQST_MATRL_PVT.Update_Material_Reqrs_status'
6068 );
6069 END IF;
6070
6071 -- Call LTP API to update material requirement status to History.
6072 AHL_LTP_REQST_MATRL_PVT.Update_Material_Reqrs_status(
6073 p_api_version => 1.0,
6074 p_init_msg_list => FND_API.G_TRUE,
6075 p_commit => FND_API.G_FALSE,
6076 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6077 p_module_type => NULL,
6078 p_visit_task_id => p_x_prd_workorder_rec.VISIT_TASK_ID,
6079 x_return_status => x_return_status,
6080 x_msg_count => x_msg_count,
6081 x_msg_data => x_msg_data
6082 );
6083
6084 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6085 fnd_log.string
6086 (
6087 fnd_log.level_statement,
6088 l_debug_module,
6089 'return status after call to Update_Material_Reqrs_status -> '|| x_return_status
6090 );
6091 END IF;
6092
6093 IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6094 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6095 ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6096 RAISE FND_API.G_EXC_ERROR;
6097 END IF;
6098
6099 END IF;
6100
6101 -- Bug # 8433227 (FP for Bug # 7453393) -- start
6102 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6103 fnd_log.string
6104 (
6105 fnd_log.level_statement,
6106 l_api_name,
6107 'p_x_prd_workorder_rec.VISIT_TASK_ID -> '|| p_x_prd_workorder_rec.VISIT_TASK_ID
6108 );
6109 END IF;
6110
6111 IF p_x_prd_workorder_rec.VISIT_TASK_ID IS NOT NULL
6112 THEN
6113
6114 /* Jun 3 2011: Commented out visit date validation as this is not needed
6115 * for PS integration
6116 OPEN get_visit_wo_dates( p_x_prd_workorder_rec.visit_id );
6117 FETCH get_visit_wo_dates
6118 INTO l_visit_start_date,
6119 l_visit_end_date;
6120 CLOSE get_visit_wo_dates;
6121
6122 OPEN get_wo_sch_dates(p_x_prd_workorder_rec.wip_entity_id);
6123 FETCH get_wo_sch_dates INTO l_wo_sch_start_date, l_wo_sch_end_date;
6124 CLOSE get_wo_sch_dates; */
6125
6126 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
6127 fnd_log.string
6128 (
6129 fnd_log.level_statement,
6130 l_api_name,
6131 'p_x_prd_workorder_rec.visit_id -> '|| p_x_prd_workorder_rec.visit_id
6132 );
6133 fnd_log.string
6134 (
6135 fnd_log.level_statement,
6136 l_api_name,
6137 'l_visit_start_date -> '|| TO_DATE(l_visit_start_date , 'DD-MM-YYYY :HH24:MI:ss')
6138 );
6139 fnd_log.string
6140 (
6141 fnd_log.level_statement,
6142 l_api_name,
6143 'l_visit_end_date -> '||TO_DATE(l_visit_end_date , 'DD-MM-YYYY :HH24:MI:ss')
6144 );
6145 fnd_log.string
6146 (
6147 fnd_log.level_statement,
6148 l_api_name,
6149 'l_wo_sch_start_date -> '|| TO_DATE(l_wo_sch_start_date , 'DD-MM-YYYY :HH24:MI:ss')
6150 );
6151 fnd_log.string
6152 (
6153 fnd_log.level_statement,
6154 l_api_name,
6155 'l_wo_sch_end_date -> '|| TO_DATE(l_wo_sch_end_date , 'DD-MM-YYYY :HH24:MI:ss')
6156 );
6157 END IF;
6158
6159 /* Jun 3 2011: date validation commented out
6160 IF ( l_wo_sch_start_date < l_visit_start_date OR
6161 l_wo_sch_end_date > l_visit_end_date ) THEN
6162
6163 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_SCHD_DT_EXCEEDS_VISIT');
6164 FND_MESSAGE.SET_TOKEN('START_DT', TO_CHAR( l_visit_start_date, 'DD-MON-YYYY HH24:MI' ),false);
6165 FND_MESSAGE.SET_TOKEN('END_DT', TO_CHAR( l_visit_end_date, 'DD-MON-YYYY HH24:MI' ),false);
6166 FND_MSG_PUB.ADD;
6167 RAISE FND_API.G_EXC_ERROR;
6168 END IF; */
6169
6170 END IF;
6171 -- Bug # 8433227 (FP for Bug # 7453393)-- end
6172
6173 -- ER#10257011 Supplier Warranty manisaga -start
6174 IF p_x_prd_workorder_rec.warranty_status_code IS NOT NULL THEN
6175 IF p_x_prd_workorder_rec.warranty_status_code <> 'APPROVAL_PENDING' AND p_x_prd_workorder_rec.warranty_status_code <> 'REVIEW' THEN
6176 OPEN get_entitlement_id (p_x_prd_workorder_rec.visit_task_id);
6177 FETCH get_entitlement_id INTO l_entitlement_rec.warranty_entitlement_id, l_entitlement_rec.object_version_number;
6178 CLOSE get_entitlement_id;
6179 l_entitlement_rec.visit_task_id := p_x_prd_workorder_rec.visit_task_id;
6180 l_entitlement_rec.entitlement_status_code := p_x_prd_workorder_rec.warranty_status_code;
6181 l_entitlement_rec.workorder_id := p_x_prd_workorder_rec.workorder_id;
6182
6183 populate_entitlements(
6184 p_api_version => 1.0,
6185 p_init_msg_list => p_init_msg_list,
6186 p_commit => FND_API.G_FALSE,
6187 p_validation_level => p_validation_level,
6188 p_contract_number => p_x_prd_workorder_rec.contract_number,
6189 p_warranty_entl_rec => l_entitlement_rec,
6190 p_user_role => AHL_WARRANTY_ENTL_PVT.G_USER_PLANNER,
6191 x_return_status => l_return_status,
6192 x_msg_count => l_msg_count,
6193 x_msg_data => l_msg_data
6194 );
6195
6196 IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6197 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6198 ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6199 RAISE FND_API.G_EXC_ERROR;
6200 END IF;
6201 END IF;
6202 END IF;
6203 -- ER#10257011 Supplier Warranty manisaga -end
6204
6205 IF FND_API.to_boolean(p_commit) THEN
6206 COMMIT;
6207 END IF;
6208
6209 -- User Hooks
6210 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'UPDATE_JOB', 'A', 'C' )) THEN
6211
6212 ahl_prd_workorder_CUHK.update_job_post(
6213 p_prd_workorder_rec => p_x_prd_workorder_rec,
6214 p_prd_workoper_tbl => p_x_prd_workoper_tbl,
6215 x_msg_count => l_msg_count,
6216 x_msg_data => l_msg_data,
6217 x_return_status => l_return_status);
6218
6219 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
6220 RAISE FND_API.G_EXC_ERROR;
6221 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
6222 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6223 END IF;
6224 END IF;
6225
6226 IF ( G_DEBUG = 'Y' ) THEN
6227 AHL_DEBUG_PUB.debug( l_api_name || ' - Success' );
6228 END IF;
6229
6230 IF G_DEBUG='Y' THEN
6231 AHL_DEBUG_PUB.disable_debug;
6232 END IF;
6233
6234 EXCEPTION
6235 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6236 ROLLBACK TO update_job_PVT;
6237 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6238 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6239 p_count => x_msg_count,
6240 p_data => x_msg_data);
6241 WHEN FND_API.G_EXC_ERROR THEN
6242 ROLLBACK TO update_job_PVT;
6243 x_return_status := FND_API.G_RET_STS_ERROR;
6244 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6245 p_count => x_msg_count,
6246 p_data => x_msg_data);
6247
6248 WHEN OTHERS THEN
6249 ROLLBACK TO update_job_PVT;
6250 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6251 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6252 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
6253 p_procedure_name =>l_api_name,
6254 p_error_text =>SUBSTRB(SQLERRM,1,240));
6255 END IF;
6256
6257 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6258 p_count => x_msg_count,
6259 p_data => x_msg_data);
6260 END update_job;
6261
6262 PROCEDURE process_jobs
6263 (
6264 p_api_version IN NUMBER := 1.0,
6265 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
6266 p_commit IN VARCHAR2 := FND_API.G_FALSE,
6267 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6268 p_default IN VARCHAR2 := FND_API.G_FALSE,
6269 p_module_type IN VARCHAR2,
6270 x_return_status OUT NOCOPY VARCHAR2,
6271 x_msg_count OUT NOCOPY NUMBER,
6272 x_msg_data OUT NOCOPY VARCHAR2,
6273 p_x_prd_workorder_tbl IN OUT NOCOPY PRD_WORKORDER_TBL,
6274 p_prd_workorder_rel_tbl IN PRD_WORKORDER_REL_TBL
6275 )
6276 AS
6277 --MANESING::NR Analysis, 03-Jun-2011, added cursor for fetching visit task details
6278 CURSOR get_task_details_csr (c_visit_task_id NUMBER) IS
6279 SELECT mr_id, unit_effectivity_id
6280 FROM AHL_VISIT_TASKS_B
6281 WHERE visit_task_id = c_visit_task_id;
6282
6283 l_api_name CONSTANT VARCHAR2(30) := 'PROCESS_JOBS';
6284 l_api_version CONSTANT NUMBER := 1.0;
6285 l_msg_count NUMBER;
6286 l_msg_data VARCHAR2(2000);
6287 l_return_status VARCHAR2(1);
6288 l_mr_workorder_tbl prd_workorder_tbl;
6289 l_dummy_op_tbl prd_workoper_tbl;
6290 l_operation_tbl AHL_PRD_OPERATIONS_PVT.prd_operation_tbl;
6291 l_resource_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
6292 l_material_tbl AHL_PP_MATERIALS_PVT.req_material_tbl_type;
6293 l_eam_wo_tbl EAM_PROCESS_WO_PUB.eam_wo_tbl_type;
6294 l_eam_wo_relations_tbl EAM_PROCESS_WO_PUB.eam_wo_relations_tbl_type;
6295 l_eam_op_tbl EAM_PROCESS_WO_PUB.eam_op_tbl_type;
6296 l_eam_res_req_tbl EAM_PROCESS_WO_PUB.eam_res_tbl_type;
6297 l_eam_mat_req_tbl EAM_PROCESS_WO_PUB.eam_mat_req_tbl_type;
6298
6299 l_wo_rel_rec_found BOOLEAN := FALSE;
6300 total_mr_workorders NUMBER := 0;
6301 total_operations NUMBER := 0;
6302 total_resources NUMBER := 0;
6303 total_materials NUMBER := 0;
6304 l_is_comp_visit VARCHAR2(1);
6305
6306 BEGIN
6307 SAVEPOINT process_jobs_PVT;
6308
6309 IF NOT FND_API.compatible_api_call(l_api_version,
6310 p_api_version,
6311 l_api_name,G_PKG_NAME) THEN
6312 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6313 END IF;
6314
6315 IF FND_API.to_boolean(p_init_msg_list) THEN
6316 FND_MSG_PUB.initialize;
6317 END IF;
6318
6319 x_return_status:=FND_API.G_RET_STS_SUCCESS;
6320
6321 IF G_DEBUG='Y' THEN
6322 AHL_DEBUG_PUB.enable_debug;
6323 END IF;
6324
6325 FOR i IN p_x_prd_workorder_tbl.FIRST..p_x_prd_workorder_tbl.LAST LOOP
6326
6327 IF ( p_x_prd_workorder_tbl(i).batch_id IS NULL OR
6328 p_x_prd_workorder_tbl(i).batch_id = FND_API.G_MISS_NUM ) THEN
6329 FND_MESSAGE.set_name('AHL','AHL_PRD_BATCH_ID_NULL');
6330 FND_MSG_PUB.add;
6331 RAISE FND_API.G_EXC_ERROR;
6332 END IF;
6333
6334 IF ( p_x_prd_workorder_tbl(i).header_id IS NULL OR
6335 p_x_prd_workorder_tbl(i).header_id = FND_API.G_MISS_NUM ) THEN
6336 FND_MESSAGE.set_name('AHL','AHL_PRD_HEADER_ID_NULL');
6337 FND_MSG_PUB.add;
6338 RAISE FND_API.G_EXC_ERROR;
6339 END IF;
6340
6341 IF ( G_DEBUG = 'Y' ) THEN
6342 AHL_DEBUG_PUB.debug( 'Processing Batch : ' || p_x_prd_workorder_tbl(i).batch_id || ' Header : ' || p_x_prd_workorder_tbl(i).header_id );
6343 END IF;
6344
6345 IF ( p_x_prd_workorder_tbl(i).dml_operation = 'C' ) THEN
6346
6347 -- Check if atleast one relationship record exists
6348 IF p_prd_workorder_rel_tbl.COUNT > 0 THEN
6349 FOR j IN p_prd_workorder_rel_tbl.FIRST..p_prd_workorder_rel_tbl.LAST LOOP
6350 IF ( p_x_prd_workorder_tbl(i).header_id = p_prd_workorder_rel_tbl(j).parent_header_id OR
6351 p_x_prd_workorder_tbl(i).header_id = p_prd_workorder_rel_tbl(j).child_header_id ) THEN
6352 l_wo_rel_rec_found := TRUE;
6353 EXIT;
6354 END IF;
6355 END LOOP;
6356 END IF;
6357
6358 -- rroy - post 11.5.10
6359 -- visits without any tasks and therefore without any relations
6360 -- should be pushed to prod without errors
6361 /*IF ( l_wo_rel_rec_found = FALSE ) THEN
6362 FND_MESSAGE.set_name('AHL','AHL_PRD_WO_REL_NOT_FOUND');
6363 FND_MESSAGE.set_token('RECORD', p_x_prd_workorder_tbl(i).header_id);
6364 FND_MSG_PUB.add;
6365 RAISE FND_API.G_EXC_ERROR;
6366 ELSE
6367 l_wo_rel_rec_found := FALSE;
6368 END IF;
6369 */
6370 IF ( G_DEBUG = 'Y' ) THEN
6371 AHL_DEBUG_PUB.debug( 'Invoking create_job API for Workorder ' || i );
6372 END IF;
6373
6374 create_job
6375 (
6376 p_api_version => 1.0,
6377 p_init_msg_list => FND_API.G_TRUE,
6378 p_commit => FND_API.G_FALSE,
6379 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6380 p_default => FND_API.G_FALSE,
6381 p_module_type => NULL,
6382 x_return_status => l_return_status,
6383 x_msg_count => l_msg_count,
6384 x_msg_data => l_msg_data,
6385 p_wip_load_flag => 'N',
6386 p_x_prd_workorder_rec => p_x_prd_workorder_tbl(i),
6387 x_operation_tbl => l_operation_tbl,
6388 x_resource_tbl => l_resource_tbl,
6389 x_material_tbl => l_material_tbl
6390 );
6391
6392 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6393 RAISE FND_API.G_EXC_ERROR;
6394 END IF;
6395
6396 IF ( G_DEBUG = 'Y' ) THEN
6397 AHL_DEBUG_PUB.debug( 'create_job API Success' );
6398 END IF;
6399
6400 IF ( G_DEBUG = 'Y' ) THEN
6401 AHL_DEBUG_PUB.debug( 'Mapping Job Header Record Number : ' || i );
6402 END IF;
6403
6404 -- Map all input AHL Job Header record attributes to the
6405 -- corresponding EAM Job Header record attributes.
6406 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rec
6407 (
6408 p_workorder_rec => p_x_prd_workorder_tbl(i),
6409 x_eam_wo_rec => l_eam_wo_tbl(i)
6410 );
6411
6412 IF ( G_DEBUG = 'Y' ) THEN
6413 AHL_DEBUG_PUB.debug( 'Job Header Record Mapping Complete' );
6414 END IF;
6415
6416 -- Map all input AHL Operation record attributes to the
6417 -- corresponding EAM Operation record attributes.
6418 IF ( l_operation_tbl.COUNT > 0 ) THEN
6419 FOR j IN l_operation_tbl.FIRST..l_operation_tbl.LAST LOOP
6420
6421 IF ( G_DEBUG = 'Y' ) THEN
6422 AHL_DEBUG_PUB.debug( 'Mapping Operation Record Number : ' || j );
6423 END IF;
6424
6425 total_operations := total_operations + 1;
6426
6427 AHL_EAM_JOB_PVT.map_ahl_eam_op_rec
6428 (
6429 p_operation_rec => l_operation_tbl(j),
6430 x_eam_op_rec => l_eam_op_tbl(total_operations)
6431 );
6432
6433 l_eam_op_tbl(total_operations).batch_id := p_x_prd_workorder_tbl(i).batch_id;
6434 l_eam_op_tbl(total_operations).header_id := p_x_prd_workorder_tbl(i).header_id;
6435
6436 END LOOP;
6437
6438 IF ( G_DEBUG = 'Y' ) THEN
6439 AHL_DEBUG_PUB.debug( 'Operations Record Mapping Complete' );
6440 END IF;
6441 END IF;
6442
6443 -- Map all input AHL Material Requirement record attributes to the
6444 -- corresponding EAM Material Requirement record attributes.
6445 IF ( l_material_tbl.COUNT > 0 ) THEN
6446 FOR j IN l_material_tbl.FIRST..l_material_tbl.LAST LOOP
6447
6448 IF ( G_DEBUG = 'Y' ) THEN
6449 AHL_DEBUG_PUB.debug( 'Mapping Material Requirement Record Number : ' || j );
6450 END IF;
6451
6452 total_materials := total_materials + 1;
6453
6454 AHL_EAM_JOB_PVT.map_ahl_eam_mat_rec
6455 (
6456 p_material_req_rec => l_material_tbl(j),
6457 x_eam_mat_req_rec => l_eam_mat_req_tbl(total_materials)
6458 );
6459
6460 l_eam_mat_req_tbl(total_materials).batch_id := p_x_prd_workorder_tbl(i).batch_id;
6461 l_eam_mat_req_tbl(total_materials).header_id := p_x_prd_workorder_tbl(i).header_id;
6462
6463 END LOOP;
6464
6465 IF ( G_DEBUG = 'Y' ) THEN
6466 AHL_DEBUG_PUB.debug( 'Material Requirements Record Mapping Complete' );
6467 END IF;
6468
6469 END IF;
6470
6471 -- Map all input AHL Resource Requirement record attributes to the
6472 -- corresponding EAM Resource Requirement record attributes.
6473 IF ( l_resource_tbl.COUNT > 0 ) THEN
6474 FOR j IN l_resource_tbl.FIRST..l_resource_tbl.LAST LOOP
6475
6476 IF ( G_DEBUG = 'Y' ) THEN
6477 AHL_DEBUG_PUB.debug( 'Mapping Resource Requirement Record Number : ' || j );
6478 END IF;
6479
6480 total_resources := total_resources + 1;
6481
6482 AHL_EAM_JOB_PVT.map_ahl_eam_res_rec
6483 (
6484 p_resource_req_rec => l_resource_tbl(j),
6485 x_eam_res_rec => l_eam_res_req_tbl(total_resources)
6486 );
6487
6488 l_eam_res_req_tbl(total_resources).batch_id := p_x_prd_workorder_tbl(i).batch_id;
6489 l_eam_res_req_tbl(total_resources).header_id := p_x_prd_workorder_tbl(i).header_id;
6490
6491 END LOOP;
6492
6493 IF ( G_DEBUG = 'Y' ) THEN
6494 AHL_DEBUG_PUB.debug( 'Resource Requirement Record Mapping Complete' );
6495 END IF;
6496
6497 END IF;
6498
6499 IF ( l_operation_tbl.COUNT > 0 ) THEN
6500 l_operation_tbl.DELETE;
6501 END IF;
6502
6503 IF ( l_resource_tbl.COUNT > 0 ) THEN
6504 l_resource_tbl.DELETE;
6505 END IF;
6506
6507 IF ( l_material_tbl.COUNT > 0 ) THEN
6508 l_material_tbl.DELETE;
6509 END IF;
6510
6511 ELSIF ( p_x_prd_workorder_tbl(i).dml_operation = 'U' ) THEN
6512
6513 IF ( G_DEBUG = 'Y' ) THEN
6514 AHL_DEBUG_PUB.debug( 'Invoking update_job API for Workorder ' || i );
6515 END IF;
6516
6517 update_job
6518 (
6519 p_api_version => 1.0,
6520 p_init_msg_list => FND_API.G_TRUE,
6521 p_commit => FND_API.G_FALSE,
6522 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6523 p_default => FND_API.G_FALSE,
6524 p_module_type => NULL,
6525 x_return_status => l_return_status,
6526 x_msg_count => l_msg_count,
6527 x_msg_data => l_msg_data,
6528 p_wip_load_flag => 'N',
6529 p_x_prd_workorder_rec => p_x_prd_workorder_tbl(i),
6530 p_x_prd_workoper_tbl => l_dummy_op_tbl
6531 );
6532
6533 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6534 RAISE FND_API.G_EXC_ERROR;
6535 END IF;
6536
6537 IF ( G_DEBUG = 'Y' ) THEN
6538 AHL_DEBUG_PUB.debug( 'update_job API Success' );
6539 END IF;
6540
6541 IF ( G_DEBUG = 'Y' ) THEN
6542 AHL_DEBUG_PUB.debug( 'Mapping Job Header Record Number : ' || i );
6543 END IF;
6544
6545 -- Map all input AHL Job Header record attributes to the
6546 -- corresponding EAM Job Header record attributes.
6547 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rec
6548 (
6549 p_workorder_rec => p_x_prd_workorder_tbl(i),
6550 x_eam_wo_rec => l_eam_wo_tbl(i)
6551 );
6552
6553 IF ( G_DEBUG = 'Y' ) THEN
6554 AHL_DEBUG_PUB.debug( 'Job Header Record Mapping Complete' );
6555 END IF;
6556
6557 END IF;
6558
6559 -- MANESING::NR Analysis, 03-Jun-2011, get visit task details that are needed for further processing
6560 OPEN get_task_details_csr (p_x_prd_workorder_tbl(i).visit_task_id);
6561 FETCH get_task_details_csr INTO p_x_prd_workorder_tbl(i).mr_header_id, p_x_prd_workorder_tbl(i).unit_effectivity_id;
6562 CLOSE get_task_details_csr;
6563
6564 /* MANESING::NR Analysis, 03-Jun-2011, add new MR workorders which are in Draft status or
6565 * existing MR workorders which are in Deleted status to a local table for updating
6566 * NR profile resources corresponding to them in Stage workorders.
6567 */
6568 IF ( p_x_prd_workorder_tbl(i).master_workorder_flag = 'Y' AND
6569 p_x_prd_workorder_tbl(i).mr_header_id IS NOT NULL AND
6570 ( ( p_x_prd_workorder_tbl(i).dml_operation = 'C' AND
6571 p_x_prd_workorder_tbl(i).status_code = G_JOB_STATUS_DRAFT ) OR
6572 ( p_x_prd_workorder_tbl(i).dml_operation = 'U' AND
6573 p_x_prd_workorder_tbl(i).status_code = G_JOB_STATUS_DELETED )
6574 )
6575 ) THEN
6576 total_mr_workorders := total_mr_workorders + 1;
6577 l_mr_workorder_tbl(total_mr_workorders) := p_x_prd_workorder_tbl(i);
6578 END IF;
6579
6580 END LOOP;
6581
6582 IF ( p_prd_workorder_rel_tbl.COUNT > 0 ) THEN
6583 FOR i IN p_prd_workorder_rel_tbl.FIRST..p_prd_workorder_rel_tbl.LAST LOOP
6584
6585 IF ( G_DEBUG = 'Y' ) THEN
6586 AHL_DEBUG_PUB.debug( 'Mapping WO Relationship Record Number : ' || i );
6587 END IF;
6588
6589 -- Map all input AHL Workorder Relationship attributes to the
6590 -- corresponding EAM Workorder Relationship attributes.
6591 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rel_rec
6592 (
6593 p_workorder_rel_rec => p_prd_workorder_rel_tbl(i),
6594 x_eam_wo_relations_rec => l_eam_wo_relations_tbl(i)
6595 );
6596
6597 IF ( G_DEBUG = 'Y' ) THEN
6598 AHL_DEBUG_PUB.debug( 'WO Relationship Record Mapping Complete' );
6599 END IF;
6600 END LOOP;
6601 END IF;
6602
6603 IF ( G_DEBUG = 'Y' ) THEN
6604 AHL_DEBUG_PUB.debug( 'Invoking AHL_EAM_JOB_PVT.process_eam_workorders API');
6605 AHL_DEBUG_PUB.debug( 'Total Workorders : ' || l_eam_wo_tbl.COUNT);
6606 AHL_DEBUG_PUB.debug( 'Total Operations : ' || l_eam_op_tbl.COUNT);
6607 AHL_DEBUG_PUB.debug( 'Total Resources : ' || l_eam_res_req_tbl.COUNT);
6608 AHL_DEBUG_PUB.debug( 'Total Materials : ' || l_eam_mat_req_tbl.COUNT);
6609 AHL_DEBUG_PUB.debug( 'Total Relationships : ' || l_eam_wo_relations_tbl.COUNT);
6610 END IF;
6611
6612
6613 AHL_EAM_JOB_PVT.process_eam_workorders
6614 (
6615 p_api_version => 1.0,
6616 p_init_msg_list => FND_API.G_TRUE,
6617 p_commit => FND_API.G_FALSE,
6618 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6619 p_default => FND_API.G_FALSE,
6620 p_module_type => NULL,
6621 x_return_status => l_return_status,
6622 x_msg_count => l_msg_count,
6623 x_msg_data => l_msg_data,
6624 p_x_eam_wo_tbl => l_eam_wo_tbl,
6625 p_eam_wo_relations_tbl => l_eam_wo_relations_tbl,
6626 p_eam_op_tbl => l_eam_op_tbl,
6627 p_eam_res_req_tbl => l_eam_res_req_tbl,
6628 p_eam_mat_req_tbl => l_eam_mat_req_tbl
6629 );
6630 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6631 RAISE FND_API.G_EXC_ERROR;
6632 ELSE
6633 IF ( G_DEBUG = 'Y' ) THEN
6634 AHL_DEBUG_PUB.debug( 'AHL_EAM_JOB_PVT.process_eam_workorders API Success' );
6635 END IF;
6636
6637 FOR i IN p_x_prd_workorder_tbl.FIRST..p_x_prd_workorder_tbl.LAST LOOP
6638
6639 IF ( p_x_prd_workorder_tbl(i).dml_operation = 'C' ) THEN
6640 IF ( G_DEBUG = 'Y' ) THEN
6641 AHL_DEBUG_PUB.debug( l_api_name || 'Updating AHL_WORKORDERS with wip_entity_id for Workorder ' || i );
6642 END IF;
6643
6644 UPDATE AHL_WORKORDERS
6645 SET wip_entity_id = l_eam_wo_tbl(i).wip_entity_id,
6646 object_version_number = p_x_prd_workorder_tbl(i).object_version_number + 1,
6647 last_update_date = SYSDATE,
6648 last_updated_by = Fnd_Global.USER_ID,
6649 last_update_login = Fnd_Global.LOGIN_ID
6650
6651 WHERE workorder_id = p_x_prd_workorder_tbl(i).workorder_id;
6652
6653 /* MANESING::Execution Enhancements, 09-Mar-2011, process workorder operations relationships
6654 * This procedure should be called only after wip_entity_id is obtained since wip_entity_id is
6655 * a not null column in table AHL_WO_OPERATIONS_RELN.
6656 */
6657 IF ( p_x_prd_workorder_tbl(i).master_workorder_flag = 'N' AND
6658 p_x_prd_workorder_tbl(i).route_id IS NOT NULL ) THEN
6659
6660 IF ( G_DEBUG = 'Y' ) THEN
6661 AHL_DEBUG_PUB.debug( l_api_name || ' - Before calling process_wo_operations_reln' );
6662 END IF;
6663
6664 p_x_prd_workorder_tbl(i).wip_entity_id := l_eam_wo_tbl(i).wip_entity_id;
6665 process_wo_operations_reln
6666 (
6667 p_workorder_rec => p_x_prd_workorder_tbl(i)
6668 );
6669 END IF;
6670
6671 IF ( G_DEBUG = 'Y' ) THEN
6672 AHL_DEBUG_PUB.debug( l_api_name || 'Before calling Create Job Dispostions ' || i );
6673 AHL_DEBUG_PUB.debug( 'Workorder Id: ' || p_x_prd_workorder_tbl(i).workorder_id );
6674
6675 END IF;
6676
6677 --Call disposition API Post 11.5.10 Changes
6678 AHL_PRD_DISPOSITION_PVT.create_job_dispositions(
6679 p_api_version => 1.0,
6680 p_init_msg_list => FND_API.G_TRUE,
6681 p_commit => FND_API.G_FALSE,
6682 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6683 x_return_status => l_return_status,
6684 x_msg_count => l_msg_count,
6685 x_msg_data => l_msg_data,
6686 p_workorder_id => p_x_prd_workorder_tbl(i).workorder_id);
6687
6688 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6689 RAISE FND_API.G_EXC_ERROR;
6690 END IF;
6691
6692 ELSIF ( p_x_prd_workorder_tbl(i).dml_operation = 'U' ) THEN
6693 IF ( G_DEBUG = 'Y' ) THEN
6694 AHL_DEBUG_PUB.debug( l_api_name || 'Updating AHL_WORKORDERS with status code for Workorder ' || i );
6695 END IF;
6696 --
6697 --sukhwsin::VEE - enhancement for insertion of wo status change - starts
6698 ADD_WO_OPER_TURNOVER_NOTES
6699 (
6700 p_workorder_id => p_x_prd_workorder_tbl(i).workorder_id,
6701 p_new_status_code => l_eam_wo_tbl(i).status_type,
6702 p_validation_level => p_validation_level,
6703 p_default => p_default,
6704 p_module_type => p_module_type,
6705 x_return_status => l_return_status
6706 );
6707 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6708 RAISE FND_API.G_EXC_ERROR;
6709 END IF;
6710 --sukhwsin::VEE - enhancement for insertion of wo status change - ends
6711 UPDATE AHL_WORKORDERS
6712 SET status_code = l_eam_wo_tbl(i).status_type,
6713 object_version_number = p_x_prd_workorder_tbl(i).object_version_number + 1,
6714 last_update_date = SYSDATE,
6715 last_updated_by = Fnd_Global.USER_ID,
6716 last_update_login = Fnd_Global.LOGIN_ID
6717
6718 WHERE workorder_id = p_x_prd_workorder_tbl(i).workorder_id;
6719
6720 END IF;
6721
6722 END LOOP;
6723
6724 -- MANESING::NR Analysis, 03-Jun-2011, call API to update resources for Stage workorders
6725 -- if any new Draft MR workorders are added or existing Draft MR workorders are deleted.
6726 IF ( total_mr_workorders > 0 ) THEN
6727
6728 /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
6729 * There is no need to consider resource requirements for Stage workorders in case of
6730 * Component Visits as there won't be any Stage associated with them.
6731 */
6732 l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_x_prd_workorder_tbl(p_x_prd_workorder_tbl.FIRST).visit_id);
6733 IF (l_is_comp_visit = 'N') THEN
6734 IF ( G_DEBUG = 'Y' ) THEN
6735 AHL_DEBUG_PUB.debug( l_api_name || ' - Invoking Process_stage_jobs API. Total MR workorders: ' || total_mr_workorders );
6736 END IF;
6737
6738 process_stage_jobs
6739 (
6740 p_api_version => 1.0,
6741 p_init_msg_list => FND_API.G_FALSE, --message initialization is already done in current API
6742 p_commit => FND_API.G_FALSE,
6743 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6744 p_module_type => null,
6745 p_workorder_tbl => l_mr_workorder_tbl,
6746 x_return_status => l_return_status,
6747 x_msg_count => l_msg_count,
6748 x_msg_data => l_msg_data
6749 );
6750
6751 IF ( G_DEBUG = 'Y' ) THEN
6752 AHL_DEBUG_PUB.debug( l_api_name || ' - After call to Process_stage_jobs API. Return Status: ' || l_return_status );
6753 END IF;
6754
6755 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6756
6757 x_return_status := l_return_status;
6758 x_msg_count := l_msg_count;
6759 x_msg_data := l_msg_data;
6760
6761 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
6762 RAISE FND_API.G_EXC_ERROR;
6763 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
6764 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6765 END IF;
6766
6767 END IF;
6768
6769 END IF; -- if l_is_comp_visit = 'N'
6770
6771 END IF; --if total_mr_workorders > 0
6772
6773 IF FND_API.to_boolean(p_commit) THEN
6774 COMMIT;
6775 END IF;
6776
6777 END IF;
6778
6779 IF G_DEBUG='Y' THEN
6780 AHL_DEBUG_PUB.disable_debug;
6781 END IF;
6782
6783 EXCEPTION
6784 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6785 ROLLBACK TO process_jobs_PVT;
6786 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6787 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6788 p_count => x_msg_count,
6789 p_data => x_msg_data);
6790 WHEN FND_API.G_EXC_ERROR THEN
6791 ROLLBACK TO process_jobs_PVT;
6792 x_return_status := FND_API.G_RET_STS_ERROR;
6793 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6794 p_count => x_msg_count,
6795 p_data => x_msg_data);
6796
6797 WHEN OTHERS THEN
6798 ROLLBACK TO process_jobs_PVT;
6799 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6800 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6801 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
6802 p_procedure_name =>l_api_name,
6803 p_error_text => SUBSTRB(SQLERRM,1,240));
6804
6805 END IF;
6806 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
6807 p_count => x_msg_count,
6808 p_data => x_msg_data);
6809
6810 END process_jobs;
6811
6812 -- MANESING::NR Analysis, 03-Jun-2011, added following procedure
6813 -- Start of Comments
6814 -- Procedure name : process_stage_jobs
6815 -- Type : Public
6816 -- Description : This procedure updates the Resource Requirements for the Stage Workorders
6817 -- in the following cases:
6818 -- Case 1: When a Visit is Planned i.e. Visit status changes from Draft to Planning.
6819 -- Case 2: When a Visit is Pushed to Production i.e. Visit status changes from Planning to Implemented.
6820 -- Case 3: When MR(s) is added to a Visit (MR workorder(s) should be in Draft status).
6821 -- Case 4: When MR(s) is removed from a Visit (MR workorder(s) should be in Draft status).
6822 --
6823 -- Note: This procedure is useful only in above mentioned cases, otherwise the stage workorders
6824 -- will be created and updated using APIs create_job and update_job respectively.
6825 -- Pre-reqs :
6826 -- Parameters : p_workorder_tbl IN PRD_WORKORDER_TBL Required
6827 --
6828 -- End of Comments
6829 PROCEDURE process_stage_jobs
6830 (
6831 p_api_version IN NUMBER := 1.0,
6832 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
6833 p_commit IN VARCHAR2 := FND_API.G_FALSE,
6834 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
6835 p_module_type IN VARCHAR2,
6836 p_workorder_tbl IN PRD_WORKORDER_TBL,
6837 x_return_status OUT NOCOPY VARCHAR2,
6838 x_msg_count OUT NOCOPY NUMBER,
6839 x_msg_data OUT NOCOPY VARCHAR2
6840 )
6841 IS
6842 --
6843 /* Cursor for getting Stage id from Stage Type code and Visit id.
6844 * Also ensure that this Stage does belong to the Visit under consideration, and is not already P2P.
6845 */
6846 CURSOR get_stg_id_csr (c_stage_type_code VARCHAR2,
6847 c_visit_id NUMBER)
6848 IS
6849 SELECT STAGE.stage_id
6850
6851 FROM AHL_VISIT_STAGE_TYP_ASOC ASOC,
6852 AHL_VWP_STAGES_B STAGE,
6853 AHL_VISIT_TASKS_B AVTB
6854
6855 WHERE ASOC.stage_type_code = c_stage_type_code
6856 AND ASOC.stage_id = STAGE.stage_id
6857 AND STAGE.visit_id = c_visit_id
6858 -- to check that Stage task is not already P2P
6859 AND AVTB.visit_id = c_visit_id
6860 AND AVTB.stage_id = STAGE.stage_id
6861 AND AVTB.task_type_code = 'STAGE'
6862 AND AVTB.status_code = 'PLANNING';
6863
6864 /* Cursor for getting Stage Workorder details using Stage and Visit id.
6865 * OR condition is required to find out default Stage task and hence workorder in case c_stage_id is zero.
6866 */
6867 CURSOR get_stg_workorder_csr (c_stage_id NUMBER,
6868 c_visit_id NUMBER)
6869 IS
6870 SELECT AHLW.workorder_id,
6871 AHLW.wip_entity_id,
6872 AVB.organization_id,
6873 AVB.department_id,
6874 BOMD.description department_name
6875
6876 FROM AHL_VISIT_TASKS_B AVTB,
6877 AHL_WORKORDERS AHLW,
6878 AHL_VISITS_B AVB,
6879 BOM_DEPARTMENTS BOMD
6880
6881 WHERE ( AVTB.stage_id = c_stage_id OR
6882 (c_stage_id = 0 AND AVTB.visit_id = c_visit_id AND AVTB.stage_id IS NULL) )
6883 AND AVTB.task_type_code = 'STAGE'
6884 AND AVTB.visit_task_id = AHLW.visit_task_id
6885 AND AVTB.visit_id = AVB.visit_id
6886 AND AVB.department_id = BOMD.department_id;
6887 -- clauses added in order to use index AHL_WORKORDERS_N3 (visit_task_id, master_workorder_flag, status_code)
6888 -- MANESING::Bug 14137483, commented out the following 2 clauses so query can return the result even when Stage Workorder is in Deleted status
6889 -- AND AHLW.master_workorder_flag = 'N'
6890 -- AND AHLW.status_code = G_JOB_STATUS_DRAFT;
6891 --
6892
6893 /* An Associative array is needed for storing NR profile Resource Requirements
6894 * i.e. store resource duration indexed by cmro resource id. Though this can be achieved by a Table of Numbers,
6895 * still a record is defined with Number Table type so as to contain this
6896 * Table inside some other Associative arrays as done below.
6897 */
6898 TYPE NRP_RES_REQ_REC IS RECORD (nrp_res_req_tbl NUMBER_TBL_TYPE);
6899
6900 /* An Associative array for storing all the NR profile Resource Requirements corresponding to passed MRs
6901 * for a particular stage type i.e. store resource table indexed by stage type.
6902 */
6903 TYPE NRP_STG_TYP_RES_REQ_TBL_TYPE IS TABLE OF NRP_RES_REQ_REC INDEX BY VARCHAR2(30);
6904
6905 /* An Associative array for storing all the NR profile Resource Requirements corresponding to passed MRs
6906 * for a particular stage id i.e. store resource table indexed by stage id.
6907 */
6908 TYPE NRP_STG_RES_REQ_TBL_TYPE IS TABLE OF NRP_RES_REQ_REC INDEX BY BINARY_INTEGER;
6909 --
6910
6911 l_api_version CONSTANT NUMBER := 1.0;
6912 l_api_name CONSTANT VARCHAR2(30) := 'Process_stage_jobs';
6913 l_full_name CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || l_api_name;
6914 -- hardcoded value for default stage used for internal processing only
6915 l_default_stg CONSTANT VARCHAR2(30) := 'DEFAULT_STAGE_AAA';
6916
6917 l_msg_count NUMBER;
6918 l_msg_data VARCHAR2(2000);
6919 l_return_status VARCHAR2(1);
6920
6921 l_stg_typ_res_tbl NRP_STG_TYP_RES_REQ_TBL_TYPE;
6922 l_stg_id_res_tbl NRP_STG_RES_REQ_TBL_TYPE;
6923 l_prof_res_req_tbl AHL_RA_NR_PROFILE_PVT.NRP_RES_REQ_TBL_TYPE;
6924 l_stg_typ_index VARCHAR2(30);
6925 l_stg_id_index NUMBER;
6926 l_res_id_index NUMBER;
6927 l_stg_workorder_rec PRD_WORKORDER_REC;
6928 l_create_res_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
6929 l_update_res_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
6930 l_delete_res_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
6931 --
6932 BEGIN
6933
6934 IF ( G_DEBUG = 'Y' ) THEN
6935 AHL_DEBUG_PUB.enable_debug;
6936 AHL_DEBUG_PUB.debug( l_full_name || '.begin - At the start of API' );
6937 END IF;
6938
6939 -- Standard start of API savepoint
6940 SAVEPOINT process_stage_jobs_pvt;
6941
6942 -- Standard call to check for call compatibility
6943 IF NOT FND_API.compatible_api_call( l_api_version, p_api_version,
6944 l_api_name, G_PKG_NAME ) THEN
6945 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6946 END IF;
6947
6948 -- Initialize message list if p_init_msg_list is set to TRUE
6949 IF FND_API.to_boolean( p_init_msg_list ) THEN
6950 FND_MSG_PUB.initialize;
6951 END IF;
6952
6953 -- Initialize Procedure return status to success
6954 x_return_status := FND_API.G_RET_STS_SUCCESS;
6955
6956 /* p_module_type as 'VWP' signifies that this API is called directly from VWP flow when a visit is P2P.
6957 * In this case, this API's task is to remove all the BOM Resource Requirements associated with the passed Stage Workorders
6958 * i.e. default Stage Workorder. In all other cases, BOM Resource Requirements for Stage workorders would be
6959 * created, updated or deleted based on the passed MR workorders.
6960 */
6961 IF ( p_module_type = 'VWP' ) THEN
6962
6963 IF ( G_DEBUG = 'Y' ) THEN
6964 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Remove_wo_resrc_reqs API. Total Stage workorders: ' || p_workorder_tbl.COUNT );
6965 END IF;
6966
6967 remove_wo_resrc_reqs
6968 (
6969 p_workorder_tbl => p_workorder_tbl,
6970 x_return_status => l_return_status,
6971 x_msg_count => l_msg_count,
6972 x_msg_data => l_msg_data
6973 );
6974
6975 IF ( G_DEBUG = 'Y' ) THEN
6976 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Remove_wo_resrc_reqs API. Return Status: ' || l_return_status );
6977 END IF;
6978
6979 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
6980
6981 x_return_status := l_return_status;
6982 x_msg_count := l_msg_count;
6983 x_msg_data := l_msg_data;
6984
6985 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
6986 RAISE FND_API.G_EXC_ERROR;
6987 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
6988 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6989 END IF;
6990
6991 END IF;
6992
6993 ELSE
6994 -- Consolidate Resource Requirements for all MR workorders to Stage Type Associative array
6995 IF ( p_workorder_tbl.COUNT > 0 ) THEN
6996 FOR i IN p_workorder_tbl.FIRST..p_workorder_tbl.LAST LOOP
6997
6998 IF ( G_DEBUG = 'Y' ) THEN
6999 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Get_prof_res_req API for Mr_header_id: ' || p_workorder_tbl(i).mr_header_id
7000 || ' Item_instance_id: ' || p_workorder_tbl(i).item_instance_id
7001 || ' Unit_effectivity_id: ' || p_workorder_tbl(i).unit_effectivity_id );
7002 END IF;
7003
7004 -- Empty Resource Requirements table before calling NR profile API
7005 l_prof_res_req_tbl.DELETE;
7006
7007 /* Call NR profile API for this MR and get corresponding table containing
7008 * Resource Requirements for different Stage types.
7009 */
7010 AHL_RA_NR_PROFILE_PVT.populate_prof_res_req
7011 (
7012 p_mr_header_id => p_workorder_tbl(i).mr_header_id,
7013 p_instance_id => p_workorder_tbl(i).item_instance_id,
7014 p_ue_id => p_workorder_tbl(i).unit_effectivity_id,
7015 p_plan_id => p_workorder_tbl(i).plan_id,
7016 x_return_status => l_return_status,
7017 x_msg_count => l_msg_count,
7018 x_msg_data => l_msg_data,
7019 x_prof_res_req_tbl => l_prof_res_req_tbl
7020 );
7021
7022 IF ( G_DEBUG = 'Y' ) THEN
7023 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Get_prof_res_req API. Return Status: ' || l_return_status );
7024 AHL_DEBUG_PUB.debug( l_full_name || ' - Total Resource Requirements from NR profile API for this MR: ' || l_prof_res_req_tbl.COUNT );
7025 END IF;
7026
7027 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
7028
7029 x_return_status := l_return_status;
7030 x_msg_count := l_msg_count;
7031 x_msg_data := l_msg_data;
7032
7033 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
7034 RAISE FND_API.G_EXC_ERROR;
7035 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
7036 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7037 END IF;
7038
7039 END IF;
7040
7041 /* Consolidate Resource Requirements obtained by calling above API to Stage Type Associative array i.e.
7042 * each record of this array l_stg_typ_res_tbl contains entire Resource Requirements for a Stage Type.
7043 * Hence, every record is indexed by stage_type_code, and it contains a table of resources indexed by cmro_resource_id.
7044 * If Stage Type code for a resource is null, then that resource will be added to a Default stage task.
7045 */
7046 IF ( l_prof_res_req_tbl.COUNT > 0 ) THEN
7047 FOR j IN l_prof_res_req_tbl.FIRST..l_prof_res_req_tbl.LAST LOOP
7048
7049 l_res_id_index := l_prof_res_req_tbl(j).cmro_resource_id;
7050 l_stg_typ_index := NVL(l_prof_res_req_tbl(j).stage_type_code, l_default_stg);
7051
7052 IF ( G_DEBUG = 'Y' ) THEN
7053 AHL_DEBUG_PUB.debug( l_full_name || ' - CMRO Resource id: ' || l_res_id_index );
7054 AHL_DEBUG_PUB.debug( l_full_name || ' - Stage Type code: ' || l_stg_typ_index );
7055 AHL_DEBUG_PUB.debug( l_full_name || ' - Resource duration: ' || l_prof_res_req_tbl(j).duration );
7056 END IF;
7057
7058 -- If a resource already exists in the associative array, then aggregate the durations.
7059 IF ( l_stg_typ_res_tbl.EXISTS(l_stg_typ_index) AND
7060 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl.EXISTS(l_res_id_index) ) THEN
7061
7062 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl(l_res_id_index) :=
7063 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl(l_res_id_index) + l_prof_res_req_tbl(j).duration;
7064 ELSE
7065 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl(l_res_id_index) := l_prof_res_req_tbl(j).duration;
7066 END IF;
7067
7068 END LOOP;
7069 END IF;
7070
7071 END LOOP; -- p_workorder_tbl.FIRST..p_workorder_tbl.LAST
7072 END IF; -- if p_workorder_tbl.COUNT > 0
7073
7074 /* Consolidate Resource Requirements from Stage Type to Stage id Associative array.
7075 * This is achieved by first obtaining the Stage id corresponding to Stage Type, and
7076 * then transfering resources to this Stage id associative array.
7077 */
7078 IF ( l_stg_typ_res_tbl.COUNT > 0 ) THEN
7079
7080 l_stg_typ_index := l_stg_typ_res_tbl.FIRST;
7081 WHILE l_stg_typ_index IS NOT NULL LOOP
7082
7083 IF ( G_DEBUG = 'Y' ) THEN
7084 AHL_DEBUG_PUB.debug( l_full_name || ' - Total Resource Requirements for Stage_type_code ' || l_stg_typ_index
7085 || ' are: ' || l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl.COUNT );
7086 END IF;
7087
7088 -- Find Stage id corresponding to this Stage Type
7089 IF ( l_stg_typ_index = l_default_stg ) THEN
7090 l_stg_id_index := 0;
7091 ELSE
7092
7093 OPEN get_stg_id_csr (l_stg_typ_index,
7094 p_workorder_tbl(p_workorder_tbl.FIRST).visit_id);
7095 FETCH get_stg_id_csr INTO l_stg_id_index;
7096
7097 /* If Stage Type belongs to a Stage which either does not belong to this Visit or is already P2P,
7098 * then add the corresponding Resource Requirements to Default Stage.
7099 */
7100 IF get_stg_id_csr%NOTFOUND THEN
7101 l_stg_id_index := 0;
7102 END IF;
7103
7104 CLOSE get_stg_id_csr;
7105 END IF;
7106
7107 IF ( G_DEBUG = 'Y' ) THEN
7108 AHL_DEBUG_PUB.debug( l_full_name || ' This Stage Type maps to Stage id: ' || l_stg_id_index );
7109 END IF;
7110
7111 /* Transfer Resource Requirements for this Stage Type to Stage id Associative array by
7112 * iterating through the resource table (which itself is an Associative array ) inside Stage Type array.
7113 */
7114 l_res_id_index := l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl.FIRST;
7115 WHILE l_res_id_index IS NOT NULL LOOP
7116
7117 -- If a resource already exists in the associative array, then aggregate the durations.
7118 IF ( l_stg_id_res_tbl.EXISTS(l_stg_id_index) AND
7119 l_stg_id_res_tbl(l_stg_id_index).nrp_res_req_tbl.EXISTS(l_res_id_index) ) THEN
7120
7121 l_stg_id_res_tbl(l_stg_id_index).nrp_res_req_tbl(l_res_id_index) :=
7122 l_stg_id_res_tbl(l_stg_id_index).nrp_res_req_tbl(l_res_id_index) +
7123 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl(l_res_id_index);
7124 ELSE
7125 l_stg_id_res_tbl(l_stg_id_index).nrp_res_req_tbl(l_res_id_index) :=
7126 l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl(l_res_id_index);
7127 END IF;
7128
7129 l_res_id_index := l_stg_typ_res_tbl(l_stg_typ_index).nrp_res_req_tbl.NEXT(l_res_id_index);
7130 END LOOP;
7131
7132 l_stg_typ_index := l_stg_typ_res_tbl.NEXT(l_stg_typ_index);
7133 END LOOP;
7134 END IF; -- l_stg_typ_res_tbl.COUNT > 0
7135
7136
7137 /* Aggregate Stage workorders Resource requirements with the requirements obtained above from MR workorders.
7138 * This is done by iterating through Stage id Associative array, get corresponding stage workorder,
7139 * aggregate resources by calling an API, and finally process the aggregated resource requirements.
7140 */
7141 l_stg_id_index := l_stg_id_res_tbl.FIRST;
7142 WHILE l_stg_id_index IS NOT NULL LOOP
7143
7144 -- Get workorder corresponding to this Stage id
7145 OPEN get_stg_workorder_csr (l_stg_id_index,
7146 p_workorder_tbl(p_workorder_tbl.FIRST).visit_id);
7147 FETCH get_stg_workorder_csr INTO l_stg_workorder_rec.workorder_id,
7148 l_stg_workorder_rec.wip_entity_id,
7149 l_stg_workorder_rec.organization_id,
7150 l_stg_workorder_rec.department_id,
7151 l_stg_workorder_rec.department_name;
7152
7153 -- This error is thrown just for Developers, otherwise this case should never occur.
7154 IF get_stg_workorder_csr%NOTFOUND THEN
7155 FND_MESSAGE.set_name('AHL', 'AHL_PRD_WO_NOT_FOUND');
7156 FND_MSG_PUB.add;
7157 CLOSE get_stg_workorder_csr;
7158 RAISE FND_API.G_EXC_ERROR;
7159 END IF;
7160
7161 CLOSE get_stg_workorder_csr;
7162
7163 l_stg_workorder_rec.dml_operation := p_workorder_tbl(p_workorder_tbl.FIRST).dml_operation;
7164
7165 -- Aggregate the Resource Requirements obtained for this Stage id with the corresponding Stage workorder
7166 IF ( G_DEBUG = 'Y' ) THEN
7167 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Aggregate_stg_resource_req API for Stage Workorder id: ' || l_stg_workorder_rec.workorder_id );
7168 END IF;
7169
7170 -- Empty Resource Requirements tables before calling Aggregate_stg_resource_req API
7171 l_create_res_tbl.DELETE;
7172 l_update_res_tbl.DELETE;
7173 l_delete_res_tbl.DELETE;
7174
7175 aggregate_stg_resource_req
7176 (
7177 p_workorder_rec => l_stg_workorder_rec,
7178 p_nrp_res_req_tbl => l_stg_id_res_tbl(l_stg_id_index).nrp_res_req_tbl,
7179 x_create_res_tbl => l_create_res_tbl,
7180 x_update_res_tbl => l_update_res_tbl,
7181 x_delete_res_tbl => l_delete_res_tbl
7182 );
7183
7184 -- Process the aggregated Resource Requirements for the Stage Workorder
7185 IF ( l_create_res_tbl.COUNT > 0 ) THEN
7186
7187 IF ( G_DEBUG = 'Y' ) THEN
7188 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Process_resrc_require API for Creating Resource Requirements for Stage Workorder id: ' || l_stg_workorder_rec.workorder_id );
7189 END IF;
7190
7191 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
7192 (
7193 p_api_version => 1.0,
7194 p_init_msg_list => FND_API.G_FALSE, -- message initialization is already done in current API.
7195 p_commit => FND_API.G_FALSE,
7196 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7197 p_module_type => 'JSP', -- need to pass JSP otherwise EAM API is not called.
7198 p_interface_flag => 'Y',
7199 p_operation_flag => 'C',
7200 p_x_resrc_require_tbl => l_create_res_tbl,
7201 x_return_status => l_return_status,
7202 x_msg_count => l_msg_count,
7203 x_msg_data => l_msg_data
7204 );
7205
7206 IF ( G_DEBUG = 'Y' ) THEN
7207 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Process_resrc_require API. Return Status: ' || l_return_status );
7208 END IF;
7209
7210 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
7211
7212 x_return_status := l_return_status;
7213 x_msg_count := l_msg_count;
7214 x_msg_data := l_msg_data;
7215
7216 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
7217 RAISE FND_API.G_EXC_ERROR;
7218 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
7219 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7220 END IF;
7221
7222 END IF;
7223
7224 END IF; -- if l_create_res_tbl.COUNT > 0
7225
7226 IF ( l_update_res_tbl.COUNT > 0 ) THEN
7227
7228 IF ( G_DEBUG = 'Y' ) THEN
7229 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Process_resrc_require API for Updating Resource Requirements for Stage Workorder id: ' || l_stg_workorder_rec.workorder_id );
7230 END IF;
7231
7232 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
7233 (
7234 p_api_version => 1.0,
7235 p_init_msg_list => FND_API.G_FALSE,
7236 p_commit => FND_API.G_FALSE,
7237 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7238 p_module_type => null,
7239 p_interface_flag => null,
7240 p_operation_flag => 'U',
7241 p_x_resrc_require_tbl => l_update_res_tbl,
7242 x_return_status => l_return_status,
7243 x_msg_count => l_msg_count,
7244 x_msg_data => l_msg_data
7245 );
7246
7247 IF ( G_DEBUG = 'Y' ) THEN
7248 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Process_resrc_require API. Return Status: ' || l_return_status );
7249 END IF;
7250
7251 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
7252
7253 x_return_status := l_return_status;
7254 x_msg_count := l_msg_count;
7255 x_msg_data := l_msg_data;
7256
7257 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
7258 RAISE FND_API.G_EXC_ERROR;
7259 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
7260 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7261 END IF;
7262
7263 END IF;
7264
7265 END IF; -- if l_update_res_tbl.COUNT > 0
7266
7267 IF ( l_delete_res_tbl.COUNT > 0 ) THEN
7268
7269 IF ( G_DEBUG = 'Y' ) THEN
7270 AHL_DEBUG_PUB.debug( l_full_name || ' - Invoking Process_resrc_require API for Removing Resource Requirements for Stage Workorder id: ' || l_stg_workorder_rec.workorder_id );
7271 END IF;
7272
7273 AHL_PP_RESRC_REQUIRE_PVT.process_resrc_require
7274 (
7275 p_api_version => 1.0,
7276 p_init_msg_list => FND_API.G_FALSE,
7277 p_commit => FND_API.G_FALSE,
7278 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7279 p_module_type => null,
7280 p_interface_flag => null,
7281 p_operation_flag => 'D',
7282 p_x_resrc_require_tbl => l_delete_res_tbl,
7283 x_return_status => l_return_status,
7284 x_msg_count => l_msg_count,
7285 x_msg_data => l_msg_data
7286 );
7287
7288 IF ( G_DEBUG = 'Y' ) THEN
7289 AHL_DEBUG_PUB.debug( l_full_name || ' - After call to Process_resrc_require API. Return Status: ' || l_return_status );
7290 END IF;
7291
7292 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
7293
7294 x_return_status := l_return_status;
7295 x_msg_count := l_msg_count;
7296 x_msg_data := l_msg_data;
7297
7298 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
7299 RAISE FND_API.G_EXC_ERROR;
7300 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
7301 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7302 END IF;
7303
7304 END IF;
7305
7306 END IF; -- if l_delete_res_tbl.COUNT > 0
7307
7308 l_stg_id_index := l_stg_id_res_tbl.NEXT(l_stg_id_index);
7309 END LOOP;
7310
7311 END IF; -- p_module_type = 'VST'
7312
7313
7314 -- Standard check of p_commit
7315 IF FND_API.TO_BOOLEAN( p_commit ) THEN
7316 COMMIT WORK;
7317 END IF;
7318
7319 IF ( G_DEBUG = 'Y' ) THEN
7320 AHL_DEBUG_PUB.debug( l_full_name || '.end - At the end of API' );
7321 AHL_DEBUG_PUB.disable_debug;
7322 END IF;
7323
7324 EXCEPTION
7325 WHEN FND_API.G_EXC_ERROR THEN
7326 ROLLBACK TO process_stage_jobs_pvt;
7327 x_return_status := FND_API.G_RET_STS_ERROR;
7328 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7329 p_count => x_msg_count,
7330 p_data => x_msg_data );
7331 IF ( G_DEBUG = 'Y' ) THEN
7332 AHL_DEBUG_PUB.debug( l_full_name || ' - Expected Exception: ' || x_msg_data );
7333 AHL_DEBUG_PUB.disable_debug;
7334 END IF;
7335
7336 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7337 ROLLBACK TO process_stage_jobs_pvt;
7338 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7339 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7340 p_count => x_msg_count,
7341 p_data => x_msg_data );
7342 IF ( G_DEBUG = 'Y' ) THEN
7343 AHL_DEBUG_PUB.debug( l_full_name || ' - Unexpected Exception: ' || x_msg_data );
7344 AHL_DEBUG_PUB.disable_debug;
7345 END IF;
7346
7347 WHEN OTHERS THEN
7348 ROLLBACK TO process_stage_jobs_pvt;
7349 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7350
7351 IF FND_MSG_PUB.check_msg_level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
7352 FND_MSG_PUB.add_exc_msg( p_pkg_name => G_PKG_NAME,
7353 p_procedure_name => l_api_name,
7354 p_error_text => SUBSTRB(SQLERRM, 1, 240) );
7355 END IF;
7356 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7357 p_count => x_msg_count,
7358 p_data => x_msg_data );
7359 IF ( G_DEBUG = 'Y' ) THEN
7360 AHL_DEBUG_PUB.debug( l_full_name || ' - Other Exception: ' || x_msg_data );
7361 AHL_DEBUG_PUB.disable_debug;
7362 END IF;
7363
7364 END process_stage_jobs;
7365
7366 PROCEDURE release_visit_jobs
7367 (
7368 p_api_version IN NUMBER := 1.0,
7369 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
7370 p_commit IN VARCHAR2 := FND_API.G_FALSE,
7371 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
7372 p_default IN VARCHAR2 := FND_API.G_FALSE,
7373 p_module_type IN VARCHAR2 := NULL,
7374 x_return_status OUT NOCOPY VARCHAR2,
7375 x_msg_count OUT NOCOPY NUMBER,
7376 x_msg_data OUT NOCOPY VARCHAR2,
7377 p_visit_id IN NUMBER,
7378 p_unit_effectivity_id IN NUMBER,
7379 p_workorder_id IN NUMBER
7380 )
7381 AS
7382 l_api_name CONSTANT VARCHAR2(30) := 'release_visit_jobs';
7383 l_api_version CONSTANT NUMBER := 1.0;
7384
7385 l_msg_count NUMBER;
7386 l_msg_data VARCHAR2(2000);
7387 l_return_status VARCHAR2(1);
7388
7389 l_input_type VARCHAR2(3);
7390
7391 l_wo_count NUMBER := 0;
7392 l_workorder_tbl PRD_WORKORDER_TBL;
7393 l_workorder_rel_tbl PRD_WORKORDER_REL_TBL;
7394
7395 l_workorder_id NUMBER;
7396 l_object_version_number NUMBER;
7397 l_wip_entity_id NUMBER;
7398 l_status_code VARCHAR2(30);
7399
7400 l_wo_id NUMBER;
7401 l_ovn NUMBER;
7402 l_sts_code VARCHAR2(30);
7403 l_wip_id NUMBER;
7404 l_mwo_flag VARCHAR2(1);
7405 l_child_wo_name VARCHAR2(80);
7406 l_parent_wo_name VARCHAR2(80);
7407
7408 -- rroy
7409 -- ACL Changes
7410 l_wo_name VARCHAR2(80);
7411 l_master_wo_flag VARCHAR2(1);
7412 -- rroy
7413 -- ACL Changes
7414
7415 -- To get the Visit Master Workorder
7416 CURSOR get_visit_mwo( c_visit_id NUMBER ) IS
7417 SELECT workorder_id,
7418 object_version_number,
7419 status_code,
7420 wip_entity_id,
7421 workorder_name
7422 FROM AHL_WORKORDERS
7423 WHERE visit_id = c_visit_id
7424 AND status_code <> G_JOB_STATUS_DELETED
7425 AND visit_task_id IS NULL;
7426 -- To get a workorder from the wp_entity_id
7427 -- Fix for connect by issue
7428 CURSOR get_wip_wo( c_wip_entity_id NUMBER ) IS
7429 SELECT WO.workorder_id workorder_id,
7430 WO.object_version_number object_version_number,
7431 WO.wip_entity_id wip_entity_id,
7432 WO.status_code status_code,
7433 WO.master_workorder_flag,
7434 WO.workorder_name
7435 FROM AHL_WORKORDERS WO
7436 WHERE wip_entity_id = c_wip_entity_id
7437 AND STATUS_CODE <> G_JOB_STATUS_DELETED;
7438
7439 -- To get the Child Workorders
7440 -- Top Down for Release workorders
7441 CURSOR get_child_wos( c_wip_entity_id NUMBER ) IS
7442 SELECT REL.child_object_id
7443 FROM WIP_SCHED_RELATIONSHIPS REL
7444 WHERE REL.parent_object_type_id = 1
7445 AND REL.child_object_type_id = 1
7446 START WITH REL.parent_object_id = c_wip_entity_id
7447 AND REL.relationship_type = 1
7448 CONNECT BY REL.parent_object_id = PRIOR REL.child_object_id
7449 AND REL.relationship_type = 1
7450 ORDER BY level;
7451 -- Fix for connect by issue
7452
7453 -- To get the Parent Workorders
7454 -- Top Down for Release workorders
7455 CURSOR get_parent_wos( c_wip_entity_id NUMBER ) IS
7456 SELECT REL.parent_object_id
7457 FROM WIP_SCHED_RELATIONSHIPS REL
7458 WHERE REL.parent_object_type_id = 1
7459 AND REL.child_object_type_id = 1
7460 START WITH REL.child_object_id = c_wip_entity_id
7461 AND REL.relationship_type = 1
7462 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
7463 AND REL.relationship_type = 1
7464 ORDER BY level DESC;
7465
7466 -- To get the UE Master Workorder
7467 CURSOR get_ue_mwo( c_unit_effectivity_id NUMBER ) IS
7468 SELECT WO.workorder_id workorder_id,
7469 WO.object_version_number object_version_number,
7470 WO.status_code status_code,
7471 WO.wip_entity_id wip_entity_id,
7472 WO.workorder_name workorder_name,
7473 WO.master_workorder_flag master_workorder_flag
7474 FROM AHL_WORKORDERS WO,
7475 AHL_VISIT_TASKS_B VT
7476 WHERE WO.status_code <> G_JOB_STATUS_DELETED
7477 AND WO.visit_task_id = VT.visit_task_id
7478 AND VT.task_type_code IN ( 'SUMMARY', 'UNASSOCIATED' )
7479 AND VT.unit_effectivity_id = c_unit_effectivity_id;
7480
7481 -- To get the Workorder
7482 CURSOR get_wo( c_workorder_id NUMBER ) IS
7483 SELECT workorder_id,
7484 object_version_number,
7485 status_code,
7486 wip_entity_id,
7487 workorder_name
7488 FROM AHL_WORKORDERS
7489 WHERE workorder_id =p_workorder_id;
7490
7491 BEGIN
7492 SAVEPOINT release_visit_jobs_PVT;
7493
7494 IF NOT FND_API.compatible_api_call(l_api_version,
7495 p_api_version,
7496 l_api_name,G_PKG_NAME) THEN
7497 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7498 END IF;
7499
7500 IF FND_API.to_boolean(p_init_msg_list) THEN
7501 FND_MSG_PUB.initialize;
7502 END IF;
7503
7504 x_return_status:=FND_API.G_RET_STS_SUCCESS;
7505
7506 IF G_DEBUG='Y' THEN
7507 AHL_DEBUG_PUB.enable_debug;
7508 END IF;
7509 -- Validate Inputs
7510 IF ( ( p_workorder_id IS NULL OR
7511 p_workorder_id = FND_API.G_MISS_NUM ) AND
7512 ( p_unit_effectivity_id IS NULL OR
7513 p_unit_effectivity_id = FND_API.G_MISS_NUM ) AND
7514 ( p_visit_id IS NULL OR
7515 p_visit_id = FND_API.G_MISS_NUM ) ) THEN
7516 FND_MESSAGE.set_name('AHL','AHL_PRD_WRONG_ARGUMENTS');
7517 FND_MESSAGE.set_token('PROC_NAME', l_api_name);
7518 FND_MSG_PUB.add;
7519 RAISE FND_API.G_EXC_ERROR;
7520 END IF;
7521
7522 -- Determine the type of API call
7523 IF ( p_workorder_id IS NOT NULL AND
7524 p_workorder_id <> FND_API.G_MISS_NUM ) THEN
7525 l_input_type := 'WO';
7526 ELSIF ( p_unit_effectivity_id IS NOT NULL AND
7527 p_unit_effectivity_id <> FND_API.G_MISS_NUM ) THEN
7528 l_input_type := 'UE';
7529 ELSIF ( p_visit_id IS NOT NULL AND
7530 p_visit_id <> FND_API.G_MISS_NUM ) THEN
7531 l_input_type := 'VST';
7532 END IF;
7533
7534 -- Process Visit
7535 IF ( l_input_type = 'VST' ) THEN
7536
7537 -- Get the Visit Master Workorder
7538 OPEN get_visit_mwo( p_visit_id );
7539 FETCH get_visit_mwo
7540 INTO l_workorder_id,
7541 l_object_version_number,
7542 l_status_code,
7543 l_wip_entity_id,
7544 l_wo_name;
7545
7546 IF ( get_visit_mwo%NOTFOUND ) THEN
7547 FND_MESSAGE.set_name('AHL','AHL_PRD_VISIT_MWO_NOT_FOUND');
7548 FND_MSG_PUB.add;
7549 CLOSE get_visit_mwo;
7550 RAISE FND_API.G_EXC_ERROR;
7551 END IF;
7552
7553 CLOSE get_visit_mwo;
7554
7555 -- If the visit needs to be Released, Add the Visit WO in the WO Table
7556 IF ( l_status_code = G_JOB_STATUS_UNRELEASED OR
7557 l_status_code = G_JOB_STATUS_DRAFT ) THEN
7558 -- rroy
7559 -- ACL Changes
7560 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
7561 p_ue_id => NULL,
7562 p_visit_id => NULL,
7563 p_item_instance_id => NULL);
7564
7565
7566 IF l_return_status = FND_API.G_TRUE THEN
7567 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_MWO_RLS_UNTLCKD');
7568 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
7569 FND_MSG_PUB.ADD;
7570 RAISE FND_API.G_EXC_ERROR;
7571 END IF;
7572
7573 -- rroy
7574 -- ACL Changes
7575
7576 l_wo_count := l_wo_count + 1;
7577 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7578 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7579 l_workorder_tbl(l_wo_count).header_id := l_wip_entity_id;
7580 l_workorder_tbl(l_wo_count).workorder_id := l_workorder_id;
7581 l_workorder_tbl(l_wo_count).object_version_number := l_object_version_number;
7582 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7583 END IF;
7584
7585 -- Process all the Child Workorders of the Visit
7586 FOR child_csr IN get_child_wos( l_wip_entity_id ) LOOP
7587 OPEN get_wip_wo(child_csr.child_object_id);
7588 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_wip_id,l_sts_code, l_mwo_flag, l_child_wo_name;
7589 CLOSE get_wip_wo;
7590
7591 -- If a Child WO needs to be Released add it in the WO Table
7592 IF ( l_sts_code = G_JOB_STATUS_UNRELEASED OR
7593 l_sts_code = G_JOB_STATUS_DRAFT ) THEN
7594 -- rroy
7595 -- ACL Changes
7596 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
7597 p_ue_id => NULL,
7598 p_visit_id => NULL,
7599 p_item_instance_id => NULL);
7600
7601 IF l_return_status = FND_API.G_TRUE THEN
7602 IF l_mwo_flag <> 'Y' THEN
7603 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_WO_RLS_UNTLCKD');
7604 ELSE
7605 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_MWO_RLS_UNTLCKD');
7606 END IF;
7607 FND_MESSAGE.Set_Token('WO_NAME', l_child_wo_name);
7608 FND_MSG_PUB.ADD;
7609 RAISE FND_API.G_EXC_ERROR;
7610 END IF;
7611 -- rroy
7612 -- ACL Changes
7613
7614 l_wo_count := l_wo_count + 1;
7615 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7616 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7617 l_workorder_tbl(l_wo_count).header_id := child_csr.child_object_id;
7618 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
7619 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
7620 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7621
7622 END IF;
7623
7624 END LOOP;
7625
7626 -- Process UE
7627 ELSIF ( l_input_type = 'UE' ) THEN
7628
7629 -- Get the UE Master Workorder
7630 OPEN get_ue_mwo( p_unit_effectivity_id );
7631 FETCH get_ue_mwo
7632 INTO l_workorder_id,
7633 l_object_version_number,
7634 l_status_code,
7635 l_wip_entity_id,
7636 l_wo_name,
7637 l_master_wo_flag;
7638
7639 IF ( get_ue_mwo%NOTFOUND ) THEN
7640 FND_MESSAGE.set_name('AHL','AHL_PRD_MR_MWO_NOT_FOUND');
7641 FND_MSG_PUB.add;
7642 CLOSE get_ue_mwo;
7643 RAISE FND_API.G_EXC_ERROR;
7644 END IF;
7645
7646 CLOSE get_ue_mwo;
7647
7648 -- Process all the Parent Workorders of the UE
7649 FOR parent_csr IN get_parent_wos( l_wip_entity_id ) LOOP
7650 OPEN get_wip_wo(parent_csr.parent_object_id);
7651 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_wip_id,l_sts_code, l_mwo_flag, l_parent_wo_name;
7652 CLOSE get_wip_wo;
7653
7654 -- If a Parent WO needs to be Released add it in the WO Table
7655 IF ( l_sts_code = G_JOB_STATUS_UNRELEASED OR
7656 l_sts_code = G_JOB_STATUS_DRAFT ) THEN
7657 -- rroy
7658 -- ACL Changes
7659 -- skip the check for master workorders
7660 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
7661 p_ue_id => NULL,
7662 p_visit_id => NULL,
7663 p_item_instance_id => NULL);
7664
7665 IF l_return_status = FND_API.G_TRUE THEN
7666 IF l_mwo_flag <> 'Y' THEN
7667 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_RLS_UNTLCKD');
7668 ELSE
7669 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_RLS_UNTLCKD');
7670 END IF;
7671 FND_MESSAGE.Set_Token('WO_NAME', l_parent_wo_name);
7672 FND_MSG_PUB.ADD;
7673 RAISE FND_API.G_EXC_ERROR;
7674 END IF;
7675 -- rroy
7676 -- ACL Changes
7677
7678
7679 l_wo_count := l_wo_count + 1;
7680 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7681 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7682 l_workorder_tbl(l_wo_count).header_id := parent_csr.parent_object_id;
7683 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
7684 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
7685 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7686
7687 END IF;
7688
7689 END LOOP;
7690
7691 -- If the UE needs to be Released, Add the WO in the WO Table
7692 IF ( l_status_code = G_JOB_STATUS_UNRELEASED OR
7693 l_status_code = G_JOB_STATUS_DRAFT ) THEN
7694 -- rroy
7695 -- ACL Changes
7696 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
7697 p_ue_id => NULL,
7698 p_visit_id => NULL,
7699 p_item_instance_id => NULL);
7700
7701 IF l_return_status = FND_API.G_TRUE THEN
7702 IF l_master_wo_flag <> 'Y' THEN
7703 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_RLS_UNTLCKD');
7704 ELSE
7705 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_RLS_UNTLCKD');
7706 END IF;
7707 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
7708 FND_MSG_PUB.ADD;
7709 RAISE FND_API.G_EXC_ERROR;
7710 END IF;
7711 -- rroy
7712 -- ACL Changes
7713
7714 l_wo_count := l_wo_count + 1;
7715 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7716 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7717 l_workorder_tbl(l_wo_count).header_id := l_wip_entity_id;
7718 l_workorder_tbl(l_wo_count).workorder_id := l_workorder_id;
7719 l_workorder_tbl(l_wo_count).object_version_number := l_object_version_number;
7720 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7721 END IF;
7722
7723 -- Process all the Child Workorders of the UE
7724 FOR child_csr IN get_child_wos( l_wip_entity_id ) LOOP
7725 OPEN get_wip_wo(child_csr.child_object_id);
7726 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_wip_id,l_sts_code, l_mwo_flag, l_child_wo_name;
7727 CLOSE get_wip_wo;
7728
7729 -- If a Child WO needs to be Released add it in the WO Table
7730 IF ( l_sts_code = G_JOB_STATUS_UNRELEASED OR
7731 l_sts_code = G_JOB_STATUS_DRAFT ) THEN
7732 -- rroy
7733 -- ACL Changes
7734 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
7735 p_ue_id => NULL,
7736 p_visit_id => NULL,
7737 p_item_instance_id => NULL);
7738 IF l_return_status = FND_API.G_TRUE THEN
7739 IF l_mwo_flag <> 'Y' THEN
7740 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_RLS_UNTLCKD');
7741 ELSE
7742 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_RLS_UNTLCKD');
7743 END IF;
7744 FND_MESSAGE.Set_Token('WO_NAME', l_child_wo_name);
7745 FND_MSG_PUB.ADD;
7746 RAISE FND_API.G_EXC_ERROR;
7747 END IF;
7748 -- rroy
7749 -- ACL Changes
7750
7751 l_wo_count := l_wo_count + 1;
7752 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7753 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7754 l_workorder_tbl(l_wo_count).header_id := child_csr.child_object_id;
7755 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
7756 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
7757 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7758
7759 END IF;
7760
7761 END LOOP;
7762
7763 -- Process WO
7764 ELSIF ( l_input_type = 'WO' ) THEN
7765
7766 -- Get the Workorder
7767 OPEN get_wo( p_workorder_id );
7768 FETCH get_wo
7769 INTO l_workorder_id,
7770 l_object_version_number,
7771 l_status_code,
7772 l_wip_entity_id,
7773 l_wo_name;
7774
7775 IF ( get_wo%NOTFOUND ) THEN
7776 FND_MESSAGE.set_name('AHL','AHL_PRD_WO_NOT_FOUND');
7777 FND_MSG_PUB.add;
7778 CLOSE get_wo;
7779 RAISE FND_API.G_EXC_ERROR;
7780 END IF;
7781
7782 CLOSE get_wo;
7783
7784 -- Process all the Parent Workorders of the WO
7785 FOR parent_csr IN get_parent_wos( l_wip_entity_id ) LOOP
7786 OPEN get_wip_wo(parent_csr.parent_object_id);
7787 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_wip_id,l_sts_code, l_mwo_flag, l_parent_wo_name;
7788 CLOSE get_wip_wo;
7789
7790 -- If a Parent WO needs to be Released add it in the WO Table
7791 IF ( l_sts_code = G_JOB_STATUS_UNRELEASED OR
7792 l_sts_code = G_JOB_STATUS_DRAFT ) THEN
7793 -- rroy
7794 -- ACL Changes
7795 -- skip the check for master workorders
7796 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
7797 p_ue_id => NULL,
7798 p_visit_id => NULL,
7799 p_item_instance_id => NULL);
7800 IF l_return_status = FND_API.G_TRUE THEN
7801 IF l_mwo_flag <> 'Y' THEN
7802 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_WO_RLS_UNTLCKD');
7803 ELSE
7804 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MWO_RLS_UNTLCKD');
7805 END IF;
7806 FND_MESSAGE.Set_Token('WO_NAME', l_parent_wo_name);
7807 FND_MSG_PUB.ADD;
7808 RAISE FND_API.G_EXC_ERROR;
7809 END IF;
7810 -- rroy
7811 -- ACL Changes
7812
7813 l_wo_count := l_wo_count + 1;
7814 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7815 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7816 l_workorder_tbl(l_wo_count).header_id := parent_csr.parent_object_id;
7817 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
7818 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
7819 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7820
7821 END IF;
7822
7823 END LOOP;
7824
7825 -- If the WO needs to be Released, Add the WO in the WO Table
7826 IF ( l_status_code = G_JOB_STATUS_UNRELEASED OR
7827 l_status_code = G_JOB_STATUS_DRAFT ) THEN
7828 -- rroy
7829 -- ACL Changes
7830 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
7831 p_ue_id => NULL,
7832 p_visit_id => NULL,
7833 p_item_instance_id => NULL);
7834 IF l_return_status = FND_API.G_TRUE THEN
7835 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_WO_RLS_UNTLCKD');
7836 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
7837 FND_MSG_PUB.ADD;
7838 RAISE FND_API.G_EXC_ERROR;
7839 END IF;
7840 -- rroy
7841 -- ACL Changes
7842
7843 l_wo_count := l_wo_count + 1;
7844 l_workorder_tbl(l_wo_count).dml_operation := 'U';
7845 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
7846 l_workorder_tbl(l_wo_count).header_id := l_wip_entity_id;
7847 l_workorder_tbl(l_wo_count).workorder_id := l_workorder_id;
7848 l_workorder_tbl(l_wo_count).object_version_number := l_object_version_number;
7849 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_RELEASED;
7850 END IF;
7851
7852 END IF;
7853
7854 -- Invoke Process Jobs API to perform the Release
7855 IF ( l_wo_count > 0 ) THEN
7856 process_jobs
7857 (
7858 p_api_version => 1.0,
7859 p_init_msg_list => FND_API.G_TRUE,
7860 p_commit => FND_API.G_FALSE,
7861 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7862 p_default => FND_API.G_FALSE,
7863 p_module_type => NULL,
7864 x_return_status => l_return_status,
7865 x_msg_count => l_msg_count,
7866 x_msg_data => l_msg_data,
7867 p_x_prd_workorder_tbl => l_workorder_tbl,
7868 p_prd_workorder_rel_tbl => l_workorder_rel_tbl
7869 );
7870
7871 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
7872 RAISE FND_API.G_EXC_ERROR;
7873 END IF;
7874 ELSE
7875 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_VISIT_RELEASED');
7876 FND_MSG_PUB.ADD;
7877 RAISE FND_API.G_EXC_ERROR;
7878 END IF;
7879 IF FND_API.to_boolean(p_commit) THEN
7880 COMMIT;
7881 END IF;
7882
7883 IF G_DEBUG='Y' THEN
7884 AHL_DEBUG_PUB.disable_debug;
7885 END IF;
7886
7887 EXCEPTION
7888 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7889 ROLLBACK TO release_visit_jobs_PVT;
7890 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7891 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7892 p_count => x_msg_count,
7893 p_data => x_msg_data);
7894 WHEN FND_API.G_EXC_ERROR THEN
7895 ROLLBACK TO release_visit_jobs_PVT;
7896 x_return_status := FND_API.G_RET_STS_ERROR;
7897 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7898 p_count => x_msg_count,
7899 p_data => x_msg_data);
7900
7901 WHEN OTHERS THEN
7902 ROLLBACK TO release_visit_jobs_PVT;
7903 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7904 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7905 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
7906 p_procedure_name =>l_api_name,
7907 p_error_text => SUBSTRB(SQLERRM,1,240));
7908
7909 END IF;
7910 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
7911 p_count => x_msg_count,
7912 p_data => x_msg_data);
7913 END release_visit_jobs;
7914
7915 PROCEDURE validate_dependencies
7916 (
7917 p_api_version IN NUMBER := 1.0,
7918 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
7919 p_commit IN VARCHAR2 := FND_API.G_FALSE,
7920 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
7921 p_default IN VARCHAR2 := FND_API.G_FALSE,
7922 p_module_type IN VARCHAR2 := NULL,
7923 x_return_status OUT NOCOPY VARCHAR2,
7924 x_msg_count OUT NOCOPY NUMBER,
7925 x_msg_data OUT NOCOPY VARCHAR2,
7926 p_visit_id IN NUMBER,
7927 p_unit_effectivity_id IN NUMBER,
7928 p_workorder_id IN NUMBER
7929 )
7930 AS
7931 l_api_name CONSTANT VARCHAR2(30) := 'validate_dependencies';
7932 l_api_version CONSTANT NUMBER := 1.0;
7933
7934 l_input_type VARCHAR2(3);
7935 l_workorder_name VARCHAR2(80);
7936 l_wip_entity_id NUMBER;
7937 l_wo_count NUMBER := 0;
7938 l_match_found BOOLEAN := FALSE;
7939
7940 CURSOR get_visit_child_wos( c_visit_id NUMBER ) IS
7941 SELECT workorder_name,
7942 wip_entity_id
7943 FROM AHL_WORKORDERS
7944 WHERE visit_id = c_visit_id
7945 AND status_code NOT IN ( G_JOB_STATUS_COMPLETE,
7946 G_JOB_STATUS_COMPLETE_NC,
7947 G_JOB_STATUS_CANCELLED,
7948 G_JOB_STATUS_CLOSED,
7949 G_JOB_STATUS_DELETED );
7950
7951 CURSOR get_visit_dependencies( c_visit_id NUMBER, c_wip_entity_id NUMBER ) IS
7952 SELECT WO.workorder_name workorder_name
7953 FROM AHL_WORKORDERS WO,
7954 WIP_SCHED_RELATIONSHIPS REL
7955 WHERE WO.wip_entity_id = REL.parent_object_id
7956 AND WO.visit_id <> c_visit_id
7957 AND WO.status_code NOT IN ( G_JOB_STATUS_COMPLETE,
7958 G_JOB_STATUS_COMPLETE_NC,
7959 G_JOB_STATUS_CANCELLED,
7960 G_JOB_STATUS_CLOSED,
7961 G_JOB_STATUS_DELETED )
7962 AND REL.parent_object_type_id = 1
7963 AND REL.child_object_type_id = 1
7964 AND REL.child_object_id = c_wip_entity_id
7965 AND REL.relationship_type = 2;
7966
7967 CURSOR get_ue_mwo( c_unit_effectivity_id NUMBER ) IS
7968 SELECT WO.workorder_name workorder_name,
7969 WO.wip_entity_id wip_entity_id
7970 FROM AHL_WORKORDERS WO,
7971 AHL_VISIT_TASKS_B VT
7972 WHERE WO.visit_task_id = VT.visit_task_id
7973 AND WO.status_code NOT IN ( G_JOB_STATUS_COMPLETE,
7974 G_JOB_STATUS_COMPLETE_NC,
7975 G_JOB_STATUS_CANCELLED,
7976 G_JOB_STATUS_CLOSED,
7977 G_JOB_STATUS_DELETED )
7978 AND VT.task_type_code IN ( 'SUMMARY', 'UNASSOCIATED' )
7979 AND VT.unit_effectivity_id = c_unit_effectivity_id;
7980
7981 -- Fix for connect by issue
7982 CURSOR get_child_wos( c_wip_entity_id NUMBER ) IS
7983 SELECT WO.wip_entity_id wip_entity_id,
7984 WO.workorder_name workorder_name
7985 FROM AHL_WORKORDERS WO
7986 WHERE WO.status_code NOT IN ( G_JOB_STATUS_COMPLETE,
7987 G_JOB_STATUS_COMPLETE_NC,
7988 G_JOB_STATUS_CANCELLED,
7989 G_JOB_STATUS_CLOSED,
7990 G_JOB_STATUS_DELETED )
7991 AND WO.wip_entity_id IN (SELECT REL.child_object_id
7992 FROM WIP_SCHED_RELATIONSHIPS REL
7993 WHERE REL.parent_object_type_id = 1
7994 AND REL.child_object_type_id = 1
7995 START WITH REL.parent_object_id = c_wip_entity_id
7996 AND REL.relationship_type = 1
7997 CONNECT BY REL.parent_object_id = PRIOR REL.child_object_id
7998 AND REL.relationship_type = 1);
7999
8000 TYPE child_wo_rec IS RECORD
8001 (
8002 wip_entity_id NUMBER,
8003 workorder_name VARCHAR2(80)
8004 );
8005
8006 TYPE child_wo_tbl IS TABLE OF child_wo_rec INDEX BY BINARY_INTEGER;
8007
8008 l_child_wo_tbl child_wo_tbl;
8009
8010 CURSOR get_wo_dependencies( c_wip_entity_id NUMBER ) IS
8011 SELECT WO.workorder_name workorder_name,
8012 WO.wip_entity_id wip_entity_id
8013 FROM AHL_WORKORDERS WO,
8014 WIP_SCHED_RELATIONSHIPS REL
8015 WHERE WO.wip_entity_id = REL.parent_object_id
8016 AND WO.status_code NOT IN ( G_JOB_STATUS_COMPLETE,
8017 G_JOB_STATUS_COMPLETE_NC,
8018 G_JOB_STATUS_CANCELLED,
8019 G_JOB_STATUS_CLOSED,
8020 G_JOB_STATUS_DELETED )
8021 AND REL.parent_object_type_id = 1
8022 AND REL.child_object_type_id = 1
8023 AND REL.child_object_id = c_wip_entity_id
8024 AND REL.relationship_type = 2;
8025
8026 CURSOR get_wo( c_workorder_id NUMBER ) IS
8027 SELECT workorder_name,
8028 wip_entity_id
8029 FROM AHL_WORKORDERS
8030 WHERE workorder_id =p_workorder_id
8031 AND status_code NOT IN ( G_JOB_STATUS_COMPLETE,
8032 G_JOB_STATUS_COMPLETE_NC,
8033 G_JOB_STATUS_CANCELLED,
8034 G_JOB_STATUS_CLOSED,
8035 G_JOB_STATUS_DELETED );
8036
8037 BEGIN
8038 SAVEPOINT validate_dependencies_PVT;
8039
8040 IF NOT FND_API.compatible_api_call(l_api_version,
8041 p_api_version,
8042 l_api_name,G_PKG_NAME) THEN
8043 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8044 END IF;
8045
8046 IF FND_API.to_boolean(p_init_msg_list) THEN
8047 FND_MSG_PUB.initialize;
8048 END IF;
8049
8050 x_return_status:=FND_API.G_RET_STS_SUCCESS;
8051
8052 IF G_DEBUG='Y' THEN
8053 AHL_DEBUG_PUB.enable_debug;
8054 END IF;
8055
8056 -- Validate Inputs
8057 IF ( ( p_workorder_id IS NULL OR
8058 p_workorder_id = FND_API.G_MISS_NUM ) AND
8059 ( p_unit_effectivity_id IS NULL OR
8060 p_unit_effectivity_id = FND_API.G_MISS_NUM ) AND
8061 ( p_visit_id IS NULL OR
8062 p_visit_id = FND_API.G_MISS_NUM ) ) THEN
8063 FND_MESSAGE.set_name('AHL','AHL_PRD_WRONG_ARGUMENTS');
8064 FND_MESSAGE.set_token('PROC_NAME', l_api_name);
8065 FND_MSG_PUB.add;
8066 RAISE FND_API.G_EXC_ERROR;
8067 END IF;
8068
8069 -- Determine the type of API call
8070 IF ( p_workorder_id IS NOT NULL AND
8071 p_workorder_id <> FND_API.G_MISS_NUM ) THEN
8072 l_input_type := 'WO';
8073 ELSIF ( p_unit_effectivity_id IS NOT NULL AND
8074 p_unit_effectivity_id <> FND_API.G_MISS_NUM ) THEN
8075 l_input_type := 'UE';
8076 ELSIF ( p_visit_id IS NOT NULL AND
8077 p_visit_id <> FND_API.G_MISS_NUM ) THEN
8078 l_input_type := 'VST';
8079 END IF;
8080
8081 -- Validate Visit Dependencies
8082 IF ( l_input_type = 'VST' ) THEN
8083
8084 FOR visit_csr IN get_visit_child_wos( p_visit_id ) LOOP
8085
8086 FOR dep_csr IN get_visit_dependencies( p_visit_id, visit_csr.wip_entity_id ) LOOP
8087 FND_MESSAGE.set_name('AHL','AHL_PRD_DEP_WO_NOT_CMPL');
8088 FND_MESSAGE.set_token('WO', visit_csr.workorder_name);
8089 FND_MESSAGE.set_token('DEP_WO', dep_csr.workorder_name);
8090 FND_MSG_PUB.add;
8091 END LOOP;
8092
8093 END LOOP;
8094
8095 -- Validate UE Dependencies
8096 ELSIF ( l_input_type = 'UE' ) THEN
8097
8098 -- Get the UE Master Workorder
8099 OPEN get_ue_mwo( p_unit_effectivity_id );
8100 FETCH get_ue_mwo
8101 INTO l_workorder_name,
8102 l_wip_entity_id;
8103
8104 IF ( get_ue_mwo%NOTFOUND ) THEN
8105 CLOSE get_ue_mwo;
8106 RETURN;
8107 END IF;
8108 CLOSE get_ue_mwo;
8109
8110 OPEN get_child_wos( l_wip_entity_id );
8111 LOOP
8112 EXIT WHEN get_child_wos%NOTFOUND;
8113
8114 l_wo_count := l_wo_count + 1;
8115 FETCH get_child_wos
8116 INTO l_child_wo_tbl( l_wo_count ).wip_entity_id,
8117 l_child_wo_tbl( l_wo_count ).workorder_name;
8118 END LOOP;
8119 CLOSE get_child_wos;
8120 -- Removing the below check
8121 -- as part of fix for bug 4094884
8122 -- The below check is to see if there are any child workorders
8123 -- which are not complete
8124 -- but now all child dependencies are being auto-deleted
8125 -- Note: At present this API is being used by
8126 -- cancel_visit_jobs API alone
8127 -- If this API is called from any other API, then the below validations
8128 -- may need to be added accordingly
8129 /*
8130 FOR dep_csr IN get_wo_dependencies( l_wip_entity_id ) LOOP
8131 FOR j IN l_child_wo_tbl.FIRST..l_child_wo_tbl.LAST LOOP
8132 IF ( dep_csr.wip_entity_id = l_child_wo_tbl(j).wip_entity_id ) THEN
8133 l_match_found := TRUE;
8134 EXIT;
8135 END IF;
8136 END LOOP;
8137
8138 IF ( l_match_found = TRUE ) THEN
8139 l_match_found := FALSE;
8140 ELSE
8141 FND_MESSAGE.set_name('AHL','AHL_PRD_DEP_WO_NOT_CMPL');
8142 FND_MESSAGE.set_token('WO', l_workorder_name);
8143 FND_MESSAGE.set_token('DEP_WO', dep_csr.workorder_name);
8144 FND_MSG_PUB.add;
8145 END IF;
8146 END LOOP;
8147 */
8148 -- Removing the below check
8149 -- as part of fix for bug 4094884
8150 -- The below check is to see if there are any child workorders
8151 -- which are not complete
8152 -- but now all child dependencies are being auto-deleted
8153 -- Note: At present this API is being used by
8154 -- cancel_visit_jobs API alone
8155 -- If this API is called from any other API, then the below validations
8156 -- may need to be added accordingly
8157
8158 /*
8159 IF l_child_wo_tbl.COUNT > 0 THEN
8160 --
8161 FOR i IN l_child_wo_tbl.FIRST..l_child_wo_tbl.LAST LOOP
8162 FOR dep_csr IN get_wo_dependencies( l_child_wo_tbl(i).wip_entity_id ) LOOP
8163
8164 FOR j IN l_child_wo_tbl.FIRST..l_child_wo_tbl.LAST LOOP
8165 IF ( dep_csr.wip_entity_id = l_child_wo_tbl(j).wip_entity_id ) THEN
8166 l_match_found := TRUE;
8167 EXIT;
8168 END IF;
8169 END LOOP;
8170
8171 IF ( l_match_found = TRUE ) THEN
8172 l_match_found := FALSE;
8173 ELSE
8174 FND_MESSAGE.set_name('AHL','AHL_PRD_DEP_WO_NOT_CMPL');
8175 FND_MESSAGE.set_token('WO', l_child_wo_tbl(i).workorder_name);
8176 FND_MESSAGE.set_token('DEP_WO', dep_csr.workorder_name);
8177 FND_MSG_PUB.add;
8178 END IF;
8179 END LOOP;
8180 END LOOP;
8181
8182 END IF;
8183 */
8184 -- Validate WO Dependencies
8185 ELSIF ( l_input_type = 'WO' ) THEN
8186
8187 -- Get the Workorder
8188 OPEN get_wo( p_workorder_id );
8189 FETCH get_wo
8190 INTO l_workorder_name,
8191 l_wip_entity_id;
8192
8193 IF ( get_wo%NOTFOUND ) THEN
8194 CLOSE get_wo;
8195 RETURN;
8196 END IF;
8197 CLOSE get_wo;
8198 -- removing the below check
8199 -- since as part of bug fix for bug #4094884
8200 -- completion dependencies are deleted automatically.
8201 -- Note: At present this API is being used by
8202 -- cancel_visit_jobs API alone
8203 -- If this API is called from any other API, then the below validations
8204 -- may need to be added accordingly
8205
8206 /*
8207 FOR dep_csr IN get_wo_dependencies( l_wip_entity_id ) LOOP
8208 FND_MESSAGE.set_name('AHL','AHL_PRD_DEP_WO_NOT_CMPL');
8209 FND_MESSAGE.set_token('WO', l_workorder_name);
8210 FND_MESSAGE.set_token('DEP_WO', dep_csr.workorder_name);
8211 FND_MSG_PUB.add;
8212 END LOOP;
8213 */
8214 END IF;
8215
8216 x_msg_count := FND_MSG_PUB.count_msg;
8217 IF ( x_msg_count > 0 ) THEN
8218 RAISE FND_API.G_EXC_ERROR;
8219 END IF;
8220
8221 EXCEPTION
8222 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8223 ROLLBACK TO validate_dependencies_PVT;
8224 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8225 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
8226 p_count => x_msg_count,
8227 p_data => x_msg_data);
8228 WHEN FND_API.G_EXC_ERROR THEN
8229 ROLLBACK TO validate_dependencies_PVT;
8230 x_return_status := FND_API.G_RET_STS_ERROR;
8231 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
8232 p_count => x_msg_count,
8233 p_data => x_msg_data);
8234
8235 WHEN OTHERS THEN
8236 ROLLBACK TO validate_dependencies_PVT;
8237 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8238 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8239 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
8240 p_procedure_name =>l_api_name,
8241 p_error_text => SUBSTRB(SQLERRM,1,240));
8242
8243 END IF;
8244 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
8245 p_count => x_msg_count,
8246 p_data => x_msg_data);
8247 END validate_dependencies;
8248
8249 FUNCTION are_child_wos_cancelled
8250 (
8251 p_wip_entity_id IN NUMBER,
8252 p_workorder_tbl IN PRD_WORKORDER_TBL
8253 ) RETURN BOOLEAN
8254 IS
8255
8256 l_match_found BOOLEAN := FALSE;
8257
8258 -- Get Child WOs which are not cancelled
8259 CURSOR get_child_wos( c_wip_entity_id NUMBER ) IS
8260 SELECT WO.workorder_id workorder_id
8261 FROM AHL_WORKORDERS WO,
8262 WIP_SCHED_RELATIONSHIPS REL
8263 WHERE WO.status_code NOT IN ( G_JOB_STATUS_CANCELLED,
8264 G_JOB_STATUS_DELETED )
8265 AND WO.wip_entity_id = REL.child_object_id
8266 AND REL.parent_object_id = c_wip_entity_id
8267 AND REL.parent_object_type_id = 1
8268 AND REL.child_object_type_id = 1
8269 AND REL.relationship_type = 1;
8270
8271 BEGIN
8272 FOR child_csr IN get_child_wos( p_wip_entity_id ) LOOP
8273 FOR i IN p_workorder_tbl.FIRST..p_workorder_tbl.LAST LOOP
8274 IF ( p_workorder_tbl(i).workorder_id = child_csr.workorder_id ) THEN
8275 l_match_found := TRUE;
8276 EXIT;
8277 END IF;
8278 END LOOP;
8279
8280 IF ( l_match_found = FALSE ) THEN
8281 RETURN FALSE;
8282 ELSE
8283 l_match_found := FALSE;
8284 END IF;
8285 END LOOP;
8286 --Modified by srini not to cancel the master workorders, if all the child work orders were cancelled
8287 RETURN FALSE;
8288
8289 END are_child_wos_cancelled;
8290
8291 PROCEDURE cancel_visit_jobs
8292 (
8293 p_api_version IN NUMBER := 1.0,
8294 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
8295 p_commit IN VARCHAR2 := FND_API.G_FALSE,
8296 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
8297 p_default IN VARCHAR2 := FND_API.G_FALSE,
8298 p_module_type IN VARCHAR2 := NULL,
8299 x_return_status OUT NOCOPY VARCHAR2,
8300 x_msg_count OUT NOCOPY NUMBER,
8301 x_msg_data OUT NOCOPY VARCHAR2,
8302 p_visit_id IN NUMBER,
8303 p_unit_effectivity_id IN NUMBER,
8304 p_workorder_id IN NUMBER
8305 )
8306 AS
8307 l_api_name CONSTANT VARCHAR2(30) := 'cancel_visit_jobs';
8308 l_api_version CONSTANT NUMBER := 1.0;
8309 l_msg_count NUMBER;
8310 l_msg_data VARCHAR2(2000);
8311 l_return_status VARCHAR2(1);
8312
8313 l_input_type VARCHAR2(3);
8314
8315 l_wo_count NUMBER := 0;
8316 l_mwo_count NUMBER := 0;
8317 idx NUMBER := 0;
8318 l_count NUMBER := 0;
8319
8320 /* bug 5104519 - start */
8321 l_mwo_return_status VARCHAR2(1);
8322 --l_mwo_flag VARCHAR2(1);
8323 l_cannot_cancel_child NUMBER;
8324
8325 l_master_workorder_tbl PRD_WORKORDER_TBL;
8326 l_copy_mwo_tbl PRD_WORKORDER_TBL;
8327 /* bug 5104519 - end */
8328
8329 l_workorder_tbl PRD_WORKORDER_TBL;
8330 l_workorder_rel_tbl PRD_WORKORDER_REL_TBL;
8331 l_workorder_rel_cancel_tbl PRD_WORKORDER_REL_TBL;
8332
8333 l_ue_count NUMBER := 0;
8334 l_unit_effectivity_tbl AHL_UMP_UNITMAINT_PVT.unit_effectivity_tbl_type;
8335 l_unit_accomplish_tbl AHL_UMP_UNITMAINT_PVT.unit_accomplish_tbl_type;
8336 l_unit_threshold_tbl AHL_UMP_UNITMAINT_PVT.unit_threshold_tbl_type;
8337
8338 l_workorder_id NUMBER;
8339 l_unit_effectivity_id NUMBER;
8340 l_object_version_number NUMBER;
8341 l_wip_entity_id NUMBER;
8342 l_ue_wip_entity_id NUMBER;
8343 l_status_code VARCHAR2(30);
8344 l_status_meaning VARCHAR2(80);
8345 l_eam_wo_tbl EAM_PROCESS_WO_PUB.eam_wo_tbl_type;
8346 l_eam_wo_relations_tbl EAM_PROCESS_WO_PUB.eam_wo_relations_tbl_type;
8347 l_eam_op_tbl EAM_PROCESS_WO_PUB.eam_op_tbl_type;
8348 l_eam_res_req_tbl EAM_PROCESS_WO_PUB.eam_res_tbl_type;
8349 l_eam_mat_req_tbl EAM_PROCESS_WO_PUB.eam_mat_req_tbl_type;
8350 l_rel_found BOOLEAN := FALSE;
8351
8352 l_wo_id NUMBER;
8353 l_ovn NUMBER;
8354 l_sts_code VARCHAR2(30);
8355 l_wip_id NUMBER;
8356 l_mwo_flag VARCHAR2(1);
8357 l_child_wo_name VARCHAR2(80);
8358 l_parent_wo_name VARCHAR2(80);
8359 l_dummy VARCHAR2(3);
8360 -- rroy
8361 -- ACL Changes
8362 l_wo_name VARCHAR2(80);
8363 l_master_wo_flag VARCHAR2(1);
8364 -- rroy
8365 -- ACL Changes
8366
8367 -- To get the Visit Master Workorder
8368 CURSOR get_visit_mwo( c_visit_id NUMBER ) IS
8369 SELECT awo.workorder_id,
8370 awo.object_version_number,
8371 awo.status_code,
8372 awo.wip_entity_id,
8373 awo.workorder_name,
8374 vst.visit_number
8375 FROM AHL_WORKORDERS AWO, AHL_VISITS_B VST
8376 WHERE awo.visit_id = c_visit_id
8377 AND awo.visit_id = vst.visit_id
8378 AND awo.status_code NOT IN (G_JOB_STATUS_DELETED,G_JOB_STATUS_CANCELLED)
8379 AND awo.visit_task_id IS NULL;
8380
8381 -- To get the UE Master Workorder
8382 CURSOR get_ue_mwo( c_unit_effectivity_id NUMBER ) IS
8383 SELECT WO.workorder_id workorder_id,
8384 WO.object_version_number wo_object_version_number,
8385 WO.status_code status_code,
8386 WO.wip_entity_id wip_entity_id,
8387 WO.workorder_name workorder_name,
8388 WO.master_workorder_flag master_workorder_flag
8389 FROM AHL_WORKORDERS WO,
8390 AHL_VISIT_TASKS_B VT
8391 WHERE WO.status_code <> G_JOB_STATUS_DELETED
8392 AND WO.visit_task_id = VT.visit_task_id
8393 AND VT.task_type_code IN ( 'SUMMARY', 'UNASSOCIATED' )
8394 AND VT.unit_effectivity_id = c_unit_effectivity_id;
8395
8396 -- bug 4094884
8397 -- To get the UE Workorder
8398 CURSOR get_ue_wo( c_unit_effectivity_id NUMBER ) IS
8399 SELECT WO.wip_entity_id wip_entity_id
8400 FROM AHL_WORKORDERS WO,
8401 AHL_VISIT_TASKS_B VT
8402 WHERE WO.status_code <> G_JOB_STATUS_DELETED
8403 AND WO.visit_task_id = VT.visit_task_id
8404 AND VT.task_type_code NOT IN ('SUMMARY')
8405 AND VT.unit_effectivity_id = c_unit_effectivity_id;
8406
8407
8408 -- To get the Workorder
8409 CURSOR get_wo( c_workorder_id NUMBER ) IS
8410 SELECT workorder_id,
8411 object_version_number,
8412 status_code,
8413 wip_entity_id,
8414 workorder_name
8415 FROM AHL_WORKORDERS
8416 WHERE workorder_id =p_workorder_id;
8417
8418 -- To get the Child Workorders of a Master Workorder
8419 -- Fix for connect by issue
8420 -- Balaji added master workorder flag for bug # 5104519
8421 /* bug 5104519 - start */
8422 CURSOR get_wip_wo(c_wip_entity_id NUMBER ) IS
8423 SELECT WO.workorder_id workorder_id,
8424 WO.object_version_number object_version_number,
8425 WO.status_code status_code,
8426 WO.wip_entity_id wip_entity_id,
8427 WO.master_workorder_flag,
8428 WO.workorder_name
8429 FROM AHL_WORKORDERS WO
8430 WHERE WO.wip_entity_id = c_wip_entity_id;
8431 /* bug 5104519 - end */
8432 -- To get the Child Workorders of a Master Workorder
8433 CURSOR get_child_wos( c_wip_entity_id NUMBER ) IS
8434 SELECT REL.child_object_id
8435 FROM WIP_SCHED_RELATIONSHIPS REL
8436 WHERE REL.parent_object_type_id = 1
8437 AND REL.child_object_type_id = 1
8438 START WITH REL.parent_object_id = c_wip_entity_id
8439 AND REL.relationship_type = 1
8440 CONNECT BY REL.parent_object_id = PRIOR REL.child_object_id
8441 AND REL.relationship_type = 1
8442 ORDER BY level DESC;
8443
8444 -- To get the Parent Workorders of a Workorder
8445 CURSOR get_parent_wos( c_wip_entity_id NUMBER ) IS
8446 SELECT REL.parent_object_id
8447 FROM WIP_SCHED_RELATIONSHIPS REL
8448 WHERE REL.parent_object_type_id = 1
8449 AND REL.child_object_type_id = 1
8450 START WITH REL.child_object_id = c_wip_entity_id
8451 AND REL.relationship_type = 1
8452 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
8453 AND REL.relationship_type = 1
8454 ORDER BY level;
8455
8456 -- To Get the Top Unplanned UEs for a Visit
8457 /*
8458 * As per the mail from Shailaja dated 20-Apr-2005, Cancel Visit Jobs and Cancel MR Jobs will
8459 * not update the UE Status to 'CANCELLED'. Hence Balaji commented out these 4 cursors.
8460 * Reference bug #s 4095002 and 4094884.
8461 */
8462 /*
8463 CURSOR get_visit_mrs( c_visit_id NUMBER ) IS
8464 SELECT UE.unit_effectivity_id unit_effectivity_id,
8465 UE.object_version_number object_version_number
8466 FROM AHL_UNIT_EFFECTIVITIES_B UE,
8467 AHL_VISIT_TASKS_B VT
8468 WHERE UE.unit_effectivity_id = VT.unit_effectivity_id
8469 AND UE.manually_planned_flag = 'Y'
8470 -- Check added by balaji by balaji for bug # 4095002
8471 -- As per the update in the bug, for Manually planned UEs of type SR
8472 -- Status should not be updated to CANCELLED on workorder or MR or Visit
8473 -- Cancellation. Hence adding the check to filter out UEs based on SRs.
8474 AND UE.object_type <> 'SR'
8475 AND VT.task_type_code = 'SUMMARY'
8476 AND VT.originating_task_id IS NULL
8477 AND VT.unit_effectivity_id IS NOT NULL
8478 AND VT.visit_id = c_visit_id;
8479
8480 -- To Get the Unplanned UE Details
8481 CURSOR get_ue_details( c_unit_effectivity_id NUMBER ) IS
8482 SELECT UE.object_version_number object_version_number
8483 FROM AHL_UNIT_EFFECTIVITIES_B UE
8484 WHERE UE.unit_effectivity_id = c_unit_effectivity_id
8485 AND UE.manually_planned_flag = 'Y'
8486 -- Check added by balaji by balaji for bug # 4095002
8487 -- As per the update in the bug, for Manually planned UEs of type SR
8488 -- Status should not be updated to CANCELLED on workorder or MR or Visit
8489 -- Cancellation. Hence adding the check to filter out UEs based on SRs.
8490 AND UE.object_type <> 'SR';
8491
8492 -- To get the UnPlanned UE for a given WO
8493 CURSOR get_ue_details_for_wo( c_workorder_id NUMBER ) IS
8494 SELECT UE.unit_effectivity_id unit_effectivity_id,
8495 UE.object_version_number object_version_number
8496 FROM AHL_UNIT_EFFECTIVITIES_B UE,
8497 AHL_VISIT_TASKS_B VT,
8498 AHL_WORKORDERS WO
8499 WHERE UE.unit_effectivity_id = VT.unit_effectivity_id
8500 AND UE.manually_planned_flag = 'Y'
8501 -- Check added by balaji by balaji for bug # 4095002
8502 -- As per the update in the bug, for Manually planned UEs of type SR
8503 -- Status should not be updated to CANCELLED on workorder or MR or Visit
8504 -- Cancellation. Hence adding the check to filter out UEs based on SRs.
8505 AND UE.object_type <> 'SR'
8506 AND VT.visit_task_id = WO.visit_task_id
8507 AND WO.workorder_id = c_workorder_id;
8508
8509 -- To get all the Parent UnPlanned UEs for a given UE
8510 CURSOR get_parent_ues( c_unit_effectivity_id NUMBER ) IS
8511 SELECT UE.unit_effectivity_id unit_effectivity_id,
8512 UE.object_version_number object_version_number
8513 FROM AHL_UNIT_EFFECTIVITIES_B UE,
8514 AHL_UE_RELATIONSHIPS REL
8515 WHERE UE.unit_effectivity_id = REL.ue_id
8516 AND UE.manually_planned_flag = 'Y'
8517 -- Check added by balaji by balaji for bug # 4095002
8518 -- As per the update in the bug, for Manually planned UEs of type SR
8519 -- Status should not be updated to CANCELLED on workorder or MR or Visit
8520 -- Cancellation. Hence adding the check to filter out UEs based on SRs.
8521 AND UE.object_type <> 'SR'
8522 START WITH REL.related_ue_id = c_unit_effectivity_id
8523 AND REL.relationship_code = 'PARENT'
8524 CONNECT BY REL.related_ue_id = PRIOR REL.ue_id
8525 AND REL.relationship_code = 'PARENT'
8526 ORDER BY level;
8527 */
8528 -- To get all the workorders for a visit
8529 -- that are not master workorders
8530 CURSOR get_visit_wos(c_visit_id NUMBER)
8531 IS
8532 SELECT wip_entity_id
8533 FROM AHL_WORKORDERS
8534 WHERE visit_id = c_visit_id
8535 AND master_workorder_flag <> 'Y';
8536
8537 -- to see if a workorder is a top level workorder
8538 -- in the completion dependency hierarchy
8539 CURSOR get_parent_wos_count(c_wip_entity_id NUMBER)
8540 IS
8541 SELECT count(*)
8542 FROM WIP_SCHED_RELATIONSHIPS
8543 WHERE child_object_id = c_wip_entity_id
8544 AND child_object_type_id = 1
8545 AND relationship_type = 2;
8546
8547 -- to get all the child workorders
8548 -- for a given top level workorder
8549 -- completion dependencies
8550 CURSOR get_completion_dep_wo_all(c_wip_entity_id NUMBER)
8551 IS
8552 SELECT REL.sched_relationship_id,
8553 REL.parent_object_id,
8554 REL.child_object_id
8555 FROM --AHL_WORKORDERS WO,
8556 WIP_SCHED_RELATIONSHIPS REL
8557 WHERE --WO.wip_entity_id = REL.child_object_id
8558 REL.parent_object_type_id = 1
8559 AND REL.child_object_type_id = 1
8560 START WITH REL.parent_object_id = c_wip_entity_id
8561 AND REL.relationship_type = 2
8562 CONNECT BY REL.parent_object_id = PRIOR REL.child_object_id
8563 AND REL.relationship_type = 2
8564 ORDER BY level DESC;
8565
8566 -- to get all the parent wos of a ue mwo
8567 CURSOR get_ue_completion_parents(c_wip_entity_id NUMBER)
8568 IS
8569 SELECT REL.sched_relationship_id,
8570 REL.parent_object_id,
8571 REL.child_object_id
8572 FROM WIP_SCHED_RELATIONSHIPS REL
8573 WHERE REL.parent_object_type_id = 1
8574 AND REL.child_object_type_id = 1
8575 START WITH REL.child_object_id = c_wip_entity_id
8576 AND REL.relationship_type = 2
8577 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
8578 AND REL.relationship_type = 2
8579 ORDER BY level;
8580
8581 -- To get the immediate parent of a ue wo
8582 CURSOR get_immediate_ue_parent(c_wip_entity_id NUMBER)
8583 IS
8584 SELECT REL.sched_relationship_id,
8585 REL.parent_object_id
8586 FROM WIP_SCHED_RELATIONSHIPS REL
8587 WHERE REL.child_object_id = c_wip_entity_id
8588 AND REL.parent_object_type_id = 1
8589 AND REL.child_object_type_id = 1
8590 AND REL.relationship_type = 2;
8591
8592 get_immediate_ue_parent_rec get_immediate_ue_parent%ROWTYPE;
8593
8594 -- To get all the immediate child workorders of a
8595 -- particular workorder
8596 CURSOR get_completion_dep_wo(c_wip_entity_id NUMBER)
8597 IS
8598 SELECT REL.sched_relationship_id,
8599 REL.child_object_id
8600 FROM WIP_SCHED_RELATIONSHIPS REL
8601 WHERE REL.parent_object_id = c_wip_entity_id
8602 AND REL.parent_object_type_id = 1
8603 AND REL.child_object_type_id = 1
8604 AND REL.relationship_type = 2;
8605
8606 -- To get all the immediate parent workorders of a
8607 -- particular workorder
8608 CURSOR get_completion_dep_wo_child(c_wip_entity_id NUMBER)
8609 IS
8610 SELECT REL.sched_relationship_id,
8611 REL.parent_object_id
8612 FROM WIP_SCHED_RELATIONSHIPS REL
8613 WHERE REL.child_object_id = c_wip_entity_id
8614 AND REL.parent_object_type_id = 1
8615 AND REL.child_object_type_id = 1
8616 AND REL.relationship_type = 2;
8617
8618 /* bug 5104519 - start */
8619 -- cursor to check if all workorders in a visit are cancelled.
8620 CURSOR chk_cmplt_wo_exists(c_wip_entity_id NUMBER )
8621 IS
8622 SELECT 'x'
8623 FROM AHL_WORKORDERS AWO, WIP_DISCRETE_JOBS WDJ
8624 WHERE awo.wip_entity_id = wdj.wip_entity_id
8625 AND wdj.date_completed IS NOT NULL
8626 --AND master_workorder_flag = 'N'
8627 --AND status_code NOT IN ('7', '22', '12')
8628 AND VISIT_TASK_ID IS NOT NULL
8629 AND awo.wip_entity_id IN (SELECT rel.child_object_id
8630 FROM wip_sched_relationships rel
8631 START WITH REL.parent_object_id = c_wip_entity_id
8632 CONNECT BY REL.parent_object_id = PRIOR REL.child_object_id
8633 AND REL.parent_object_type_id = PRIOR REL.child_object_type_id
8634 AND REL.relationship_type = 1);
8635 l_exists VARCHAR2(1);
8636 /* bug 5104519 - end */
8637
8638 -- added for bug# 9130108
8639 l_cancel_flag VARCHAR2 (1);
8640 l_visit_number NUMBER;
8641 VISIT_VALIDATION_ERR EXCEPTION;
8642
8643 BEGIN
8644 SAVEPOINT cancel_visit_jobs_PVT;
8645
8646 IF NOT FND_API.compatible_api_call(l_api_version,
8647 p_api_version,
8648 l_api_name,G_PKG_NAME) THEN
8649 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8650 END IF;
8651
8652 IF FND_API.to_boolean(p_init_msg_list) THEN
8653 FND_MSG_PUB.initialize;
8654 END IF;
8655
8656 x_return_status:=FND_API.G_RET_STS_SUCCESS;
8657
8658 IF G_DEBUG='Y' THEN
8659 AHL_DEBUG_PUB.enable_debug;
8660 END IF;
8661
8662 --sikumar: added for FP for ER 5571241 -- Check if user has permission to cancel jobs.
8663 IF AHL_PRD_UTIL_PKG.Is_Wo_Cancel_Allowed = FND_API.G_FALSE THEN
8664 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_NOT_ALLOWED');
8665 FND_MSG_PUB.add;
8666 RAISE FND_API.G_EXC_ERROR;
8667 END IF;
8668
8669 -- Validate Inputs
8670 IF ( ( p_workorder_id IS NULL OR
8671 p_workorder_id = FND_API.G_MISS_NUM ) AND
8672 ( p_unit_effectivity_id IS NULL OR
8673 p_unit_effectivity_id = FND_API.G_MISS_NUM ) AND
8674 ( p_visit_id IS NULL OR
8675 p_visit_id = FND_API.G_MISS_NUM ) ) THEN
8676 FND_MESSAGE.set_name('AHL','AHL_PRD_WRONG_ARGUMENTS');
8677 FND_MESSAGE.set_token('PROC_NAME', l_api_name);
8678 FND_MSG_PUB.add;
8679 RAISE FND_API.G_EXC_ERROR;
8680 END IF;
8681
8682 -- Validate if Completion Dependencies exist
8683 validate_dependencies
8684 (
8685 p_api_version => 1.0,
8686 p_init_msg_list => FND_API.G_TRUE,
8687 p_commit => FND_API.G_FALSE,
8688 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
8689 p_default => FND_API.G_FALSE,
8690 p_module_type => NULL,
8691 x_return_status => l_return_status,
8692 x_msg_count => l_msg_count,
8693 x_msg_data => l_msg_data,
8694 p_visit_id => p_visit_id,
8695 p_unit_effectivity_id => p_unit_effectivity_id,
8696 p_workorder_id => p_workorder_id
8697 );
8698
8699 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
8700 RAISE FND_API.G_EXC_ERROR;
8701 END IF;
8702
8703 -- Determine the type of API call
8704 IF ( p_workorder_id IS NOT NULL AND
8705 p_workorder_id <> FND_API.G_MISS_NUM ) THEN
8706 l_input_type := 'WO';
8707 ELSIF ( p_unit_effectivity_id IS NOT NULL AND
8708 p_unit_effectivity_id <> FND_API.G_MISS_NUM ) THEN
8709 l_input_type := 'UE';
8710 ELSIF ( p_visit_id IS NOT NULL AND
8711 p_visit_id <> FND_API.G_MISS_NUM ) THEN
8712 l_input_type := 'VST';
8713 END IF;
8714
8715 -- Process Inputs for Cancelling Workorders
8716 -- Process Visit
8717 IF ( l_input_type = 'VST' ) THEN
8718
8719 -- Get the Visit Master Workorder
8720 OPEN get_visit_mwo( p_visit_id );
8721 FETCH get_visit_mwo
8722 INTO l_workorder_id,
8723 l_object_version_number,
8724 l_status_code,
8725 l_wip_entity_id,
8726 l_wo_name,
8727 l_visit_number;
8728
8729 IF ( get_visit_mwo%NOTFOUND ) THEN
8730 FND_MESSAGE.set_name('AHL','AHL_PRD_VISIT_MWO_NOT_FOUND');
8731 FND_MSG_PUB.add;
8732 CLOSE get_visit_mwo;
8733 RAISE FND_API.G_EXC_ERROR;
8734 END IF;
8735
8736 CLOSE get_visit_mwo;
8737
8738 -- rroy
8739 -- ACL Changes
8740 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
8741 p_ue_id => NULL,
8742 p_visit_id => NULL,
8743 p_item_instance_id => NULL);
8744 IF l_return_status = FND_API.G_TRUE THEN
8745 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_MWO_CNCL_UNTLCKD');
8746 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
8747 FND_MSG_PUB.ADD;
8748 RAISE FND_API.G_EXC_ERROR;
8749 END IF;
8750 -- rroy
8751 -- ACL Changes
8752
8753 -- Check if the Visit WO is in a status which can be cancelled
8754 IF ( l_status_code = G_JOB_STATUS_COMPLETE OR
8755 l_status_code = G_JOB_STATUS_COMPLETE_NC OR
8756 l_status_code = G_JOB_STATUS_CANCELLED OR
8757 l_status_code = G_JOB_STATUS_CLOSED OR
8758 l_status_code = G_JOB_STATUS_DELETED ) THEN
8759
8760 --Get status meaning
8761 SELECT meaning INTO l_status_meaning
8762 FROM fnd_lookup_values_vl
8763 WHERE lookup_type = 'AHL_JOB_STATUS'
8764 AND LOOKUP_CODE = l_status_code;
8765 --
8766 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_VISIT_STATUS');
8767 FND_MESSAGE.set_token('STATUS', l_status_meaning );
8768 FND_MSG_PUB.add;
8769 RAISE FND_API.G_EXC_ERROR;
8770 END IF;
8771
8772 -- apattark start for Bug #9075539 to validate for visit cancellation
8773 cancel_visit_validate
8774 (
8775 p_visit_id => p_visit_id,
8776 p_visit_number => l_visit_number,
8777 x_cancel_flag => l_cancel_flag
8778 );
8779 -- apattark end for Bug #9075539
8780
8781 IF (l_cancel_flag = 'N') THEN
8782 -- return validation error status.
8783 RAISE VISIT_VALIDATION_ERR;
8784
8785 END IF;
8786
8787 -- bug 4094884
8788 -- need to delete all completion dependencies
8789 -- if the l_input_type = 'VST' (whole visit is cancelled)
8790 -- so all the completion dependencies need to be deleted
8791 -- will use process_eam_workorders
8792
8793 -- 1. Find all the workorders in the visit that are not master wos
8794 -- 2. Loop through all the workorders and find the top level wos
8795 -- 3. get the entire hierarchy of workorders for all top level workorders
8796 idx := 1;
8797 FOR visit_wos_rec IN get_visit_wos(p_visit_id) LOOP
8798 OPEN get_parent_wos_count(visit_wos_rec.wip_entity_id);
8799 FETCH get_parent_wos_count INTO l_count;
8800 CLOSE get_parent_wos_count;
8801 IF l_count = 0 THEN
8802 -- this is a top level workorder in the completion dependency hierarchy
8803
8804 FOR com_dep_rec IN get_completion_dep_wo_all(visit_wos_rec.wip_entity_id) LOOP
8805 l_rel_found := FALSE;
8806 IF l_workorder_rel_tbl.COUNT > 0 THEN
8807 FOR i IN l_workorder_rel_tbl.FIRST..l_workorder_rel_tbl.LAST LOOP
8808 IF l_workorder_rel_tbl(i).wo_relationship_id = com_dep_rec.sched_relationship_id THEN
8809 l_rel_found := TRUE;
8810 EXIT;
8811 END IF;
8812 END LOOP;
8813 END IF;
8814
8815 IF l_rel_found = FALSE THEN
8816 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
8817 l_workorder_rel_tbl(idx).batch_id := p_visit_id;
8818 l_workorder_rel_tbl(idx).parent_header_id := idx;
8819 l_workorder_rel_tbl(idx).child_header_id := idx;
8820 l_workorder_rel_tbl(idx).parent_wip_entity_id := com_dep_rec.parent_object_id;
8821 l_workorder_rel_tbl(idx).child_wip_entity_id := com_dep_rec.child_object_id;
8822 l_workorder_rel_tbl(idx).relationship_type := 2;
8823 l_workorder_rel_tbl(idx).dml_operation := 'D';
8824 idx := idx + 1;
8825 END IF;
8826 END LOOP;
8827 END IF;
8828 END LOOP;
8829
8830 IF ( l_workorder_rel_tbl.COUNT > 0 ) THEN
8831 FOR i IN l_workorder_rel_tbl.FIRST..l_workorder_rel_tbl.LAST LOOP
8832
8833 -- Map all input AHL Workorder Relationship attributes to the
8834 -- corresponding EAM Workorder Relationship attributes.
8835 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rel_rec
8836 (
8837 p_workorder_rel_rec => l_workorder_rel_tbl(i),
8838 x_eam_wo_relations_rec => l_eam_wo_relations_tbl(i)
8839 );
8840
8841 END LOOP;
8842 END IF;
8843
8844
8845 -- Process all the Child Workorders of the Visit
8846 FOR child_csr IN get_child_wos( l_wip_entity_id ) LOOP
8847 /* bug 5104519 - start */
8848 OPEN get_wip_wo(child_csr.child_object_id);
8849 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_sts_code,l_wip_id, l_mwo_flag, l_child_wo_name;
8850 CLOSE get_wip_wo;
8851
8852 -- If a Child WO needs to be Cancelled add it in the WO Table
8853 IF ( l_sts_code <> G_JOB_STATUS_COMPLETE AND
8854 l_sts_code <> G_JOB_STATUS_COMPLETE_NC AND
8855 l_sts_code <> G_JOB_STATUS_CANCELLED AND
8856 l_sts_code <> G_JOB_STATUS_CLOSED AND
8857 l_sts_code <> G_JOB_STATUS_DELETED ) THEN
8858 -- rroy
8859 -- ACL Changes
8860 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
8861 p_ue_id => NULL,
8862 p_visit_id => NULL,
8863 p_item_instance_id => NULL);
8864 IF l_return_status = FND_API.G_TRUE THEN
8865 IF l_mwo_flag <> 'Y' THEN
8866 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_WO_CNCL_UNTLCKD');
8867 ELSE
8868 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_VST_MWO_CNCL_UNTLCKD');
8869 END IF;
8870 FND_MESSAGE.Set_Token('WO_NAME', l_child_wo_name);
8871 FND_MSG_PUB.ADD;
8872 RAISE FND_API.G_EXC_ERROR;
8873 END IF;
8874 -- rroy
8875 -- ACL Changes
8876
8877 /*
8878 * Balaji added following logic for bug # 5104519(Reopened issue reported by BANARAYA)
8879 * EAM has a validation which doesnt allow master workorder to be cancelled when all child
8880 * workorders are not in status 7(cancelled),12(closed),14(Pending Close),15(Failed Close).
8881 * Hence master workorders will be post processed after child workorder processing and will
8882 * be cancelled or closed accordingly.
8883 */
8884 /* bug 5104519 - start */
8885 IF l_mwo_flag = 'N' THEN
8886
8887 --sikumar: added for FP for ER 5571241 -- Check if user has permission to cancel jobs.
8888 IF AHL_PRD_UTIL_PKG.Is_Wo_Cancel_Allowed(l_wo_id) = FND_API.G_FALSE THEN
8889 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_NOT_ALLOWED');
8890 FND_MSG_PUB.add;
8891 RAISE FND_API.G_EXC_ERROR;
8892 END IF;
8893
8894 l_wo_count := l_wo_count + 1;
8895 l_workorder_tbl(l_wo_count).dml_operation := 'U';
8896 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
8897 l_workorder_tbl(l_wo_count).header_id := l_wip_id;
8898 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
8899 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
8900 l_workorder_tbl(l_wo_count).hold_reason_code := FND_API.G_MISS_CHAR;
8901
8902 -- If the Status is Draft, then, Delete else, Cancel
8903 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
8904 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_DELETED;
8905 ELSE
8906 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_CANCELLED;
8907 END IF;
8908 ELSE
8909 l_mwo_count := l_mwo_count + 1;
8910 l_master_workorder_tbl(l_mwo_count).dml_operation := 'U';
8911 l_master_workorder_tbl(l_mwo_count).batch_id := l_wip_entity_id;
8912 l_master_workorder_tbl(l_mwo_count).header_id := l_wip_id;
8913 l_master_workorder_tbl(l_mwo_count).workorder_id := l_wo_id;
8914 l_master_workorder_tbl(l_mwo_count).object_version_number := l_ovn;
8915
8916 -- Bug # 9075539 -- start
8917 l_master_workorder_tbl(l_mwo_count).wip_entity_id := l_wip_id;
8918 -- Bug # 9075539 -- end
8919
8920 -- If the Status is Draft, then, Delete else, Cancel
8921 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
8922 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_DELETED;
8923 ELSE
8924 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_CANCELLED;
8925 END IF;
8926 END IF;
8927 /* bug 5104519 - end */
8928 END IF;
8929
8930 END LOOP;
8931 /* bug 5104519 - Start */
8932 -- Add the Visit WO in the WO Table
8933 l_mwo_count := l_mwo_count + 1;
8934 l_master_workorder_tbl(l_mwo_count).dml_operation := 'U';
8935 l_master_workorder_tbl(l_mwo_count).batch_id := l_wip_entity_id;
8936 l_master_workorder_tbl(l_mwo_count).header_id := l_wip_entity_id;
8937 l_master_workorder_tbl(l_mwo_count).workorder_id := l_workorder_id;
8938 l_master_workorder_tbl(l_mwo_count).object_version_number := l_object_version_number;
8939 -- fix for bug 9075539
8940 l_master_workorder_tbl(l_mwo_count).wip_entity_id := l_wip_entity_id;
8941 -- end of fix for bug 9075539
8942 -- If the Status is Draft, then, Delete else, Cancel
8943 IF ( l_status_code = G_JOB_STATUS_DRAFT ) THEN
8944 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_DELETED;
8945 ELSE
8946 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_CANCELLED;
8947 END IF;
8948
8949 -- Process UE
8950 ELSIF ( l_input_type = 'UE' ) THEN
8951
8952 -- Get the UE Master Workorder
8953 OPEN get_ue_mwo( p_unit_effectivity_id );
8954 FETCH get_ue_mwo
8955 INTO l_workorder_id,
8956 l_object_version_number,
8957 l_status_code,
8958 l_wip_entity_id,
8959 l_wo_name,
8960 l_master_wo_flag;
8961
8962 IF ( get_ue_mwo%NOTFOUND ) THEN
8963 FND_MESSAGE.set_name('AHL','AHL_PRD_MR_MWO_NOT_FOUND');
8964 FND_MSG_PUB.add;
8965 CLOSE get_ue_mwo;
8966 RAISE FND_API.G_EXC_ERROR;
8967 END IF;
8968
8969 CLOSE get_ue_mwo;
8970 -- rroy
8971 -- ACL Changes
8972 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
8973 p_ue_id => NULL,
8974 p_visit_id => NULL,
8975 p_item_instance_id => NULL);
8976 IF l_return_status = FND_API.G_TRUE THEN
8977 IF l_master_wo_flag <> 'Y' THEN
8978 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_CNCL_UNTLCKD');
8979 ELSE
8980 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_CNCL_UNTLCKD');
8981 END IF;
8982 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
8983 FND_MSG_PUB.ADD;
8984 RAISE FND_API.G_EXC_ERROR;
8985 END IF;
8986 -- rroy
8987 -- ACL Changes
8988
8989 -- Check if the UE WO is in a status which can be cancelled
8990 IF ( l_status_code = G_JOB_STATUS_COMPLETE OR
8991 l_status_code = G_JOB_STATUS_COMPLETE_NC OR
8992 l_status_code = G_JOB_STATUS_CANCELLED OR
8993 l_status_code = G_JOB_STATUS_CLOSED OR
8994 l_status_code = G_JOB_STATUS_DELETED ) THEN
8995 --Get status meaning
8996 SELECT meaning INTO l_status_meaning
8997 FROM fnd_lookup_values_vl
8998 WHERE lookup_type = 'AHL_JOB_STATUS'
8999 AND LOOKUP_CODE = l_status_code;
9000
9001 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_MR_STATUS');
9002 FND_MESSAGE.set_token('STATUS', l_status_meaning );
9003 FND_MSG_PUB.add;
9004 RAISE FND_API.G_EXC_ERROR;
9005 END IF;
9006
9007 -- Process all the Child Workorders of the UE
9008 FOR child_csr IN get_child_wos( l_wip_entity_id ) LOOP
9009 /* bug 5104519 - start */
9010 OPEN get_wip_wo(child_csr.child_object_id);
9011 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_sts_code,l_wip_id, l_mwo_flag, l_child_wo_name;
9012 CLOSE get_wip_wo;
9013
9014 -- If a Child WO needs to be Cancelled add it in the WO Table
9015 IF ( l_sts_code <> G_JOB_STATUS_COMPLETE AND
9016 l_sts_code <> G_JOB_STATUS_COMPLETE_NC AND
9017 l_sts_code <> G_JOB_STATUS_CANCELLED AND
9018 l_sts_code <> G_JOB_STATUS_CLOSED AND
9019 l_sts_code <> G_JOB_STATUS_DELETED ) THEN
9020 -- rroy
9021 -- ACL Changes
9022 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
9023 p_ue_id => NULL,
9024 p_visit_id => NULL,
9025 p_item_instance_id => NULL);
9026 IF l_return_status = FND_API.G_TRUE THEN
9027 IF l_mwo_flag <> 'Y' THEN
9028 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_CNCL_UNTLCKD');
9029 ELSE
9030 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_CNCL_UNTLCKD');
9031 END IF;
9032 FND_MESSAGE.Set_Token('WO_NAME', l_child_wo_name);
9033 FND_MSG_PUB.ADD;
9034 RAISE FND_API.G_EXC_ERROR;
9035 END IF;
9036 -- rroy
9037 -- ACL Changes
9038
9039 /*
9040 * Balaji added following logic for bug # 5104519(Reopened issue reported by BANARAYA)
9041 * EAM has a validation which doesnt allow master workorder to be cancelled when all child
9042 * workorders are not in status 7(cancelled),12(closed),14(Pending Close),15(Failed Close).
9043 * Hence master workorders will be post processed after child workorder processing and will
9044 * be cancelled or closed accordingly.
9045 */
9046 /* bug 5104519 - start */
9047 IF l_mwo_flag = 'N' THEN
9048
9049 --sikumar: added for FP for ER 5571241 -- Check if user has permission to cancel jobs.
9050 IF AHL_PRD_UTIL_PKG.Is_Wo_Cancel_Allowed(l_wo_id) = FND_API.G_FALSE THEN
9051 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_NOT_ALLOWED');
9052 FND_MSG_PUB.add;
9053 RAISE FND_API.G_EXC_ERROR;
9054 END IF;
9055 l_wo_count := l_wo_count + 1;
9056 l_workorder_tbl(l_wo_count).dml_operation := 'U';
9057 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
9058 l_workorder_tbl(l_wo_count).header_id := child_csr.child_object_id;
9059 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
9060 l_workorder_tbl(l_wo_count).wip_entity_id := l_wip_id;
9061 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
9062 l_workorder_tbl(l_wo_count).hold_reason_code := FND_API.G_MISS_CHAR;
9063
9064 -- If the Status is Draft, then, Delete else, Cancel
9065 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
9066 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_DELETED;
9067 ELSE
9068 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_CANCELLED;
9069 END IF;
9070 ELSE
9071 l_mwo_count := l_mwo_count + 1;
9072 l_master_workorder_tbl(l_mwo_count).dml_operation := 'U';
9073 l_master_workorder_tbl(l_mwo_count).batch_id := l_wip_entity_id;
9074 l_master_workorder_tbl(l_mwo_count).header_id := child_csr.child_object_id;
9075 l_master_workorder_tbl(l_mwo_count).workorder_id := l_wo_id;
9076 l_master_workorder_tbl(l_mwo_count).wip_entity_id := l_wip_id;
9077 l_master_workorder_tbl(l_mwo_count).object_version_number := l_ovn;
9078
9079 -- If the Status is Draft, then, Delete else, Cancel
9080 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
9081 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_DELETED;
9082 ELSE
9083 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_CANCELLED;
9084 END IF;
9085 END IF;
9086 /* bug 5104519 - start */
9087 END IF;
9088
9089 END LOOP;
9090
9091 /* bug 5104519 - start */
9092 -- Add the UE WO in the WO Table
9093 l_mwo_count := l_mwo_count + 1;
9094 l_master_workorder_tbl(l_mwo_count).dml_operation := 'U';
9095 l_master_workorder_tbl(l_mwo_count).batch_id := l_wip_entity_id;
9096 l_master_workorder_tbl(l_mwo_count).header_id := l_wip_entity_id;
9097 l_master_workorder_tbl(l_mwo_count).workorder_id := l_workorder_id;
9098 l_master_workorder_tbl(l_mwo_count).wip_entity_id := l_wip_entity_id;
9099 l_master_workorder_tbl(l_mwo_count).object_version_number := l_object_version_number;
9100
9101 IF ( l_status_code = G_JOB_STATUS_DRAFT OR
9102 l_status_code = G_JOB_STATUS_UNRELEASED ) THEN
9103
9104 -- Need to Release Parents if they are DRAFT or UNRELEASED so,
9105 -- Release the UE WO which will in-turn release the parent WOs
9106 release_visit_jobs
9107 (
9108 p_api_version => 1.0,
9109 p_init_msg_list => FND_API.G_TRUE,
9110 p_commit => FND_API.G_FALSE,
9111 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9112 p_default => FND_API.G_FALSE,
9113 p_module_type => NULL,
9114 x_return_status => l_return_status,
9115 x_msg_count => l_msg_count,
9116 x_msg_data => l_msg_data,
9117 p_visit_id => NULL,
9118 p_unit_effectivity_id => NULL,
9119 p_workorder_id => l_workorder_id
9120 );
9121
9122 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
9123 RAISE FND_API.G_EXC_ERROR;
9124 END IF;
9125 -- Release job updates the OVN. Hence requery the record to get the new OVN.
9126 -- Balaji added the fix as a part of BAE OVN Fix.
9127 OPEN get_ue_mwo( p_unit_effectivity_id );
9128 FETCH get_ue_mwo
9129 INTO l_workorder_id,
9130 l_object_version_number,
9131 -- MANESING::NR Analysis, 03-Jun-2011, status code should not be overwritten here
9132 l_dummy, --l_status_code,
9133 l_wip_entity_id,
9134 l_wo_name,
9135 l_master_wo_flag;
9136 CLOSE get_ue_mwo;
9137
9138 l_master_workorder_tbl(l_mwo_count).object_version_number := l_object_version_number;
9139
9140 END IF;
9141
9142 -- If the Status is Draft, then, Delete else, Cancel
9143 IF ( l_status_code = G_JOB_STATUS_DRAFT ) THEN
9144 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_DELETED;
9145 ELSE
9146 l_master_workorder_tbl(l_mwo_count).status_code := G_JOB_STATUS_CANCELLED;
9147 END IF;
9148 /* bug 5104519 - end */
9149
9150 -- Process all the Parent Workorders of the UE
9151 -- Commented following code for not processing the parents any more
9152 /*Start of commented code*/
9153 /*FOR parent_csr IN get_parent_wos( l_wip_entity_id ) LOOP
9154 OPEN get_wip_wo(parent_csr.parent_object_id);
9155 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_sts_code,l_wip_id, l_mwo_flag, l_parent_wo_name;
9156 CLOSE get_wip_wo;
9157
9158 -- Check if the parent WO needs to be Cancelled
9159 IF ( l_sts_code <> G_JOB_STATUS_COMPLETE AND
9160 l_sts_code <> G_JOB_STATUS_COMPLETE_NC AND
9161 l_sts_code <> G_JOB_STATUS_CANCELLED AND
9162 l_sts_code <> G_JOB_STATUS_CLOSED AND
9163 l_sts_code <> G_JOB_STATUS_DELETED ) THEN
9164
9165 -- Parent WO can be cancelled only if all the children are cancelled
9166 IF ( are_child_wos_cancelled( parent_csr.parent_object_id, l_workorder_tbl ) ) THEN
9167 -- rroy
9168 -- ACL Changes
9169 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
9170 p_ue_id => NULL,
9171 p_visit_id => NULL,
9172 p_item_instance_id => NULL);
9173 IF l_return_status = FND_API.G_TRUE THEN
9174 IF l_mwo_flag <> 'Y' THEN
9175 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_WO_CNCL_UNTLCKD');
9176 ELSE
9177 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MR_MWO_CNCL_UNTLCKD');
9178 END IF;
9179 FND_MESSAGE.Set_Token('WO_NAME', l_parent_wo_name);
9180 FND_MSG_PUB.ADD;
9181 RAISE FND_API.G_EXC_ERROR;
9182 END IF;
9183 -- rroy
9184 -- ACL Changes
9185
9186 l_wo_count := l_wo_count + 1;
9187 l_workorder_tbl(l_wo_count).dml_operation := 'U';
9188 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
9189 l_workorder_tbl(l_wo_count).header_id := parent_csr.parent_object_id;
9190 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
9191 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
9192 l_workorder_tbl(l_wo_count).wip_entity_id := l_wip_id;
9193
9194 -- If the Status is Draft, then, Delete else, Cancel
9195 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
9196 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_DELETED;
9197 ELSE
9198 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_CANCELLED;
9199 END IF;
9200 ELSE
9201 -- No more parents can be cancelled
9202 EXIT;
9203 END IF;
9204
9205 END IF;
9206
9207 END LOOP;*/
9208 /*End of commented code*/
9209 -- adding the relationships to be deleted
9210 -- delete only those relationships which contain
9211 -- the ue
9212 -- 1. first, all the child dependencies of the ue mwo need to be deleted
9213 idx := 1;
9214 OPEN get_ue_wo(p_unit_effectivity_id);
9215 FETCH get_ue_wo INTO l_ue_wip_entity_id;
9216 CLOSE get_ue_wo;
9217
9218 FOR com_dep_rec IN get_completion_dep_wo_all(l_ue_wip_entity_id) LOOP
9219 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
9220 l_workorder_rel_tbl(idx).batch_id := l_ue_wip_entity_id;
9221 l_workorder_rel_tbl(idx).parent_header_id := idx;
9222 l_workorder_rel_tbl(idx).child_header_id := idx;
9223 l_workorder_rel_tbl(idx).parent_wip_entity_id := com_dep_rec.parent_object_id;
9224 l_workorder_rel_tbl(idx).child_wip_entity_id := com_dep_rec.child_object_id;
9225 l_workorder_rel_tbl(idx).relationship_type := 2;
9226 l_workorder_rel_tbl(idx).dml_operation := 'D';
9227 idx := idx + 1;
9228 END LOOP;
9229
9230 FOR com_dep_rec IN get_immediate_ue_parent(l_ue_wip_entity_id) LOOP
9231 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
9232 l_workorder_rel_tbl(idx).batch_id := l_ue_wip_entity_id;
9233 l_workorder_rel_tbl(idx).parent_header_id := idx;
9234 l_workorder_rel_tbl(idx).child_header_id := idx;
9235 l_workorder_rel_tbl(idx).parent_wip_entity_id := com_dep_rec.parent_object_id;
9236 l_workorder_rel_tbl(idx).child_wip_entity_id := l_ue_wip_entity_id;
9237 l_workorder_rel_tbl(idx).relationship_type := 2;
9238 l_workorder_rel_tbl(idx).dml_operation := 'D';
9239
9240 idx := idx + 1;
9241 END LOOP;
9242 -- 2. second, get all the parents of the ue
9243 FOR ue_parent_rec IN get_ue_completion_parents(l_ue_wip_entity_id) LOOP
9244 -- 3. for each parent, check if it is in the list of ue wos to be cancelled
9245 FOR i in l_workorder_tbl.FIRST..l_workorder_tbl.LAST LOOP
9246 IF l_workorder_tbl(i).wip_entity_id = ue_parent_rec.parent_object_id THEN
9247 -- This parent is in the list of wos to be cancelled
9248 -- therefore we need to delete all its child dependencies
9249 FOR com_dep_rec IN get_completion_dep_wo_all(ue_parent_rec.parent_object_id) LOOP
9250 -- if the relationship id does not exist already, then
9251 -- add it to the relationships table
9252 l_rel_found := FALSE;
9253 IF l_workorder_rel_tbl.COUNT > 0 THEN
9254 FOR j in l_workorder_rel_tbl.FIRST..l_workorder_rel_tbl.LAST LOOP
9255 IF l_workorder_rel_tbl(j).wo_relationship_id = com_dep_rec.sched_relationship_id THEN
9256 l_rel_found := TRUE;
9257 EXIT;
9258 END IF;
9259 END LOOP;
9260 END IF;
9261 IF l_rel_found = FALSE THEN
9262 -- if relationship does not exist
9263 -- then add it to the relationships table
9264 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
9265 l_workorder_rel_tbl(idx).batch_id := l_ue_wip_entity_id;
9266 l_workorder_rel_tbl(idx).parent_header_id := idx;
9267 l_workorder_rel_tbl(idx).child_header_id := idx;
9268 l_workorder_rel_tbl(idx).parent_wip_entity_id := com_dep_rec.parent_object_id;
9269 l_workorder_rel_tbl(idx).child_wip_entity_id := com_dep_rec.child_object_id;
9270 l_workorder_rel_tbl(idx).relationship_type := 2;
9271 l_workorder_rel_tbl(idx).dml_operation := 'D';
9272 idx := idx + 1;
9273 END IF;
9274 END LOOP;
9275 -- after deleting all the child dependencies
9276 -- delete its immediate parent dependency
9277 FOR imm_parents_rec IN get_immediate_ue_parent(ue_parent_rec.parent_object_id) LOOP
9278 l_workorder_rel_tbl(idx).wo_relationship_id := imm_parents_rec.sched_relationship_id;
9279 l_workorder_rel_tbl(idx).batch_id := l_ue_wip_entity_id;
9280 l_workorder_rel_tbl(idx).parent_header_id := idx;
9281 l_workorder_rel_tbl(idx).child_header_id := idx;
9282 l_workorder_rel_tbl(idx).parent_wip_entity_id := imm_parents_rec.parent_object_id;
9283 l_workorder_rel_tbl(idx).child_wip_entity_id := ue_parent_rec.parent_object_id;
9284 l_workorder_rel_tbl(idx).relationship_type := 2;
9285 l_workorder_rel_tbl(idx).dml_operation := 'D';
9286 idx := idx + 1;
9287 END LOOP;
9288
9289 END IF;
9290 END LOOP;
9291 END LOOP;
9292
9293
9294 IF ( l_workorder_rel_tbl.COUNT > 0 ) THEN
9295 FOR i IN l_workorder_rel_tbl.FIRST..l_workorder_rel_tbl.LAST LOOP
9296
9297 -- Map all input AHL Workorder Relationship attributes to the
9298 -- corresponding EAM Workorder Relationship attributes.
9299 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rel_rec
9300 (
9301 p_workorder_rel_rec => l_workorder_rel_tbl(i),
9302 x_eam_wo_relations_rec => l_eam_wo_relations_tbl(i)
9303 );
9304
9305
9306
9307 END LOOP;
9308 END IF;
9309
9310 -- Process Workorder
9311 ELSIF ( l_input_type = 'WO' ) THEN
9312
9313 -- Get the Workorder
9314 OPEN get_wo( p_workorder_id );
9315 FETCH get_wo
9316 INTO l_workorder_id,
9317 l_object_version_number,
9318 l_status_code,
9319 l_wip_entity_id,
9320 l_wo_name;
9321
9322 IF ( get_wo%NOTFOUND ) THEN
9323 FND_MESSAGE.set_name('AHL','AHL_PRD_WO_NOT_FOUND');
9324 FND_MSG_PUB.add;
9325 CLOSE get_wo;
9326 RAISE FND_API.G_EXC_ERROR;
9327 END IF;
9328 -- rroy
9329 -- ACL Changes
9330 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_workorder_id,
9331 p_ue_id => NULL,
9332 p_visit_id => NULL,
9333 p_item_instance_id => NULL);
9334 IF l_return_status = FND_API.G_TRUE THEN
9335 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_WO_CNCL_UNTLCKD');
9336 FND_MESSAGE.Set_Token('WO_NAME', l_wo_name);
9337 FND_MSG_PUB.ADD;
9338 RAISE FND_API.G_EXC_ERROR;
9339 END IF;
9340 -- rroy
9341 -- ACL Changes
9342
9343 CLOSE get_wo;
9344
9345 --sikumar: added for FP for ER 5571241 -- Check if user has permission to cancel jobs.
9346 IF AHL_PRD_UTIL_PKG.Is_Wo_Cancel_Allowed(p_workorder_id) = FND_API.G_FALSE THEN
9347 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_NOT_ALLOWED');
9348 FND_MSG_PUB.add;
9349 RAISE FND_API.G_EXC_ERROR;
9350 END IF;
9351
9352 -- Check if the WO is in a status which can be cancelled
9353 IF ( l_status_code = G_JOB_STATUS_COMPLETE OR
9354 l_status_code = G_JOB_STATUS_COMPLETE_NC OR
9355 l_status_code = G_JOB_STATUS_CANCELLED OR
9356 l_status_code = G_JOB_STATUS_CLOSED OR
9357 l_status_code = G_JOB_STATUS_DELETED ) THEN
9358 --Get status meaning
9359 SELECT meaning INTO l_status_meaning
9360 FROM fnd_lookup_values_vl
9361 WHERE lookup_type = 'AHL_JOB_STATUS'
9362 AND LOOKUP_CODE = l_status_code;
9363
9364 FND_MESSAGE.set_name('AHL','AHL_PRD_CANCEL_WO_STATUS');
9365 FND_MESSAGE.set_token('STATUS', l_status_meaning );
9366 FND_MSG_PUB.add;
9367 RAISE FND_API.G_EXC_ERROR;
9368 END IF;
9369
9370 -- Add the WO in the WO Table
9371 l_wo_count := l_wo_count + 1;
9372 l_workorder_tbl(l_wo_count).dml_operation := 'U';
9373 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
9374 l_workorder_tbl(l_wo_count).header_id := l_wip_entity_id;
9375 l_workorder_tbl(l_wo_count).workorder_id := l_workorder_id;
9376 l_workorder_tbl(l_wo_count).object_version_number := l_object_version_number;
9377
9378 IF ( l_status_code = G_JOB_STATUS_DRAFT OR
9379 l_status_code = G_JOB_STATUS_UNRELEASED ) THEN
9380
9381 -- Need to Release Parents if they are DRAFT or UNRELEASED so,
9382 -- Release the WO which will in-turn release the parent WOs
9383 release_visit_jobs
9384 (
9385 p_api_version => 1.0,
9386 p_init_msg_list => FND_API.G_TRUE,
9387 p_commit => FND_API.G_FALSE,
9388 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9389 p_default => FND_API.G_FALSE,
9390 p_module_type => NULL,
9391 x_return_status => l_return_status,
9392 x_msg_count => l_msg_count,
9393 x_msg_data => l_msg_data,
9394 p_visit_id => NULL,
9395 p_unit_effectivity_id => NULL,
9396 p_workorder_id => l_workorder_id
9397 );
9398
9399 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
9400 RAISE FND_API.G_EXC_ERROR;
9401 END IF;
9402 -- Release job updates the OVN. Hence requery the record to get the new OVN.
9403 -- Balaji added the fix as a part of BAE OVN Fix.
9404 OPEN get_wo( p_workorder_id );
9405 FETCH get_wo
9406 INTO l_workorder_id,
9407 l_object_version_number,
9408 l_status_code,
9409 l_wip_entity_id,
9410 l_wo_name;
9411 CLOSE get_wo;
9412
9413 l_workorder_tbl(l_wo_count).object_version_number := l_object_version_number;
9414
9415 END IF;
9416
9417 -- If the Status is Draft, then, Delete else, Cancel
9418 IF ( l_status_code = G_JOB_STATUS_DRAFT ) THEN
9419 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_DELETED;
9420 ELSE
9421 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_CANCELLED;
9422 END IF;
9423
9424 -- Process all the Parent Workorders of the WO
9425 -- Commented following code for not processing the parents any more
9426 /*Start of commented code*/
9427 /*
9428 FOR parent_csr IN get_parent_wos( l_wip_entity_id ) LOOP
9429 OPEN get_wip_wo(parent_csr.parent_object_id);
9430 FETCH get_wip_wo INTO l_wo_id, l_ovn, l_sts_code,l_wip_id, l_mwo_flag, l_parent_wo_name;
9431 CLOSE get_wip_wo;
9432
9433 -- Check if the parent WO needs to be Cancelled
9434 IF ( l_sts_code <> G_JOB_STATUS_COMPLETE AND
9435 l_sts_code <> G_JOB_STATUS_COMPLETE_NC AND
9436 l_sts_code <> G_JOB_STATUS_CANCELLED AND
9437 l_sts_code <> G_JOB_STATUS_CLOSED AND
9438 l_sts_code <> G_JOB_STATUS_DELETED ) THEN
9439
9440 -- Parent WO can be cancelled only if all the children are cancelled
9441 IF ( are_child_wos_cancelled( parent_csr.parent_object_id, l_workorder_tbl ) ) THEN
9442 -- rroy
9443 -- ACL Changes
9444 l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => l_wo_id,
9445 p_ue_id => NULL,
9446 p_visit_id => NULL,
9447 p_item_instance_id => NULL);
9448 IF l_return_status = FND_API.G_TRUE THEN
9449 IF l_mwo_flag <> 'Y' THEN
9450 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_WO_CNCL_UNTLCKD');
9451 ELSE
9452 FND_MESSAGE.Set_Name('AHL', 'AHL_PRD_MWO_CNCL_UNTLCKD');
9453 END IF;
9454 FND_MESSAGE.Set_Token('WO_NAME', l_parent_wo_name);
9455 FND_MSG_PUB.ADD;
9456 RAISE FND_API.G_EXC_ERROR;
9457 END IF;
9458 -- rroy
9459 -- ACL Changes
9460
9461 l_wo_count := l_wo_count + 1;
9462 l_workorder_tbl(l_wo_count).dml_operation := 'U';
9463 l_workorder_tbl(l_wo_count).batch_id := l_wip_entity_id;
9464 l_workorder_tbl(l_wo_count).header_id := parent_csr.parent_object_id;
9465 l_workorder_tbl(l_wo_count).workorder_id := l_wo_id;
9466 l_workorder_tbl(l_wo_count).object_version_number := l_ovn;
9467
9468 -- If the Status is Draft, then, Delete else, Cancel
9469 IF ( l_sts_code = G_JOB_STATUS_DRAFT ) THEN
9470 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_DELETED;
9471 ELSE
9472 l_workorder_tbl(l_wo_count).status_code := G_JOB_STATUS_CANCELLED;
9473 END IF;
9474 ELSE
9475 -- No more parents can be cancelled
9476 EXIT;
9477 END IF;
9478
9479 END IF;
9480
9481 END LOOP;*/
9482 /*End of commented code*/ -- bug 4094884
9483 -- need to delete all completion dependencies
9484 -- if the l_input_type = 'WO'
9485 -- so all the completion dependencies for the
9486 -- particular workorder need to be cancelled
9487 idx := 1;
9488 -- first get all the relationships where this workorder is the parent
9489 FOR com_dep_rec IN get_completion_dep_wo(l_wip_entity_id) LOOP
9490 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
9491 l_workorder_rel_tbl(idx).batch_id := l_wip_entity_id;
9492 l_workorder_rel_tbl(idx).parent_header_id := idx;
9493 l_workorder_rel_tbl(idx).child_header_id := idx;
9494 l_workorder_rel_tbl(idx).parent_wip_entity_id := l_wip_entity_id;
9495 l_workorder_rel_tbl(idx).child_wip_entity_id := com_dep_rec.child_object_id;
9496 l_workorder_rel_tbl(idx).relationship_type := 2;
9497 l_workorder_rel_tbl(idx).dml_operation := 'D';
9498 idx := idx + 1;
9499
9500 END LOOP;
9501 -- second, get all the relationships where this workorder is the child
9502 FOR com_dep_rec IN get_completion_dep_wo_child(l_wip_entity_id) LOOP
9503 l_workorder_rel_tbl(idx).wo_relationship_id := com_dep_rec.sched_relationship_id;
9504 l_workorder_rel_tbl(idx).batch_id := l_wip_entity_id;
9505 l_workorder_rel_tbl(idx).parent_header_id := idx;
9506 l_workorder_rel_tbl(idx).child_header_id := idx;
9507 l_workorder_rel_tbl(idx).parent_wip_entity_id := com_dep_rec.parent_object_id;
9508 l_workorder_rel_tbl(idx).child_wip_entity_id := l_wip_entity_id;
9509 l_workorder_rel_tbl(idx).relationship_type := 2;
9510 l_workorder_rel_tbl(idx).dml_operation := 'D';
9511 idx := idx + 1;
9512
9513 END LOOP;
9514
9515 IF ( l_workorder_rel_tbl.COUNT > 0 ) THEN
9516 FOR i IN l_workorder_rel_tbl.FIRST..l_workorder_rel_tbl.LAST LOOP
9517
9518 -- Map all input AHL Workorder Relationship attributes to the
9519 -- corresponding EAM Workorder Relationship attributes.
9520 AHL_EAM_JOB_PVT.map_ahl_eam_wo_rel_rec
9521 (
9522 p_workorder_rel_rec => l_workorder_rel_tbl(i),
9523 x_eam_wo_relations_rec => l_eam_wo_relations_tbl(i)
9524 );
9525
9526 END LOOP;
9527 END IF;
9528
9529 END IF;
9530 -- Bug 4094884
9531 -- Before cancelling the workorders
9532 -- delete the workorder completion dependencies
9533 IF l_eam_wo_relations_tbl.COUNT > 0 THEN
9534 AHL_EAM_JOB_PVT.process_eam_workorders
9535 (
9536 p_api_version => 1.0,
9537 p_init_msg_list => FND_API.G_TRUE,
9538 p_commit => FND_API.G_FALSE,
9539 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9540 p_default => FND_API.G_FALSE,
9541 p_module_type => NULL,
9542 x_return_status => l_return_status,
9543 x_msg_count => l_msg_count,
9544 x_msg_data => l_msg_data,
9545 p_x_eam_wo_tbl => l_eam_wo_tbl,
9546 p_eam_wo_relations_tbl => l_eam_wo_relations_tbl,
9547 p_eam_op_tbl => l_eam_op_tbl,
9548 p_eam_res_req_tbl => l_eam_res_req_tbl,
9549 p_eam_mat_req_tbl => l_eam_mat_req_tbl
9550 );
9551
9552 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
9553 RAISE FND_API.G_EXC_ERROR;
9554 END IF;
9555 END IF;
9556
9557
9558 -- Invoke Process Jobs API to perform the WO Cancellation
9559 IF ( l_wo_count > 0 ) THEN
9560 process_jobs
9561 (
9562 p_api_version => 1.0,
9563 p_init_msg_list => FND_API.G_TRUE,
9564 p_commit => FND_API.G_FALSE,
9565 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9566 p_default => FND_API.G_FALSE,
9567 p_module_type => NULL,
9568 x_return_status => l_return_status,
9569 x_msg_count => l_msg_count,
9570 x_msg_data => l_msg_data,
9571 p_x_prd_workorder_tbl => l_workorder_tbl,
9572 p_prd_workorder_rel_tbl => l_workorder_rel_cancel_tbl
9573 );
9574
9575 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
9576 RAISE FND_API.G_EXC_ERROR;
9577 END IF;
9578 END IF;
9579
9580 /* bug 5104519 - Start */
9581 /*
9582 * Balaji added following logic for bug # 5104519(Reopened issue reported by BANARAYA)
9583 * EAM has a validation which doesnt allow master workorder to be cancelled when all child
9584 * workorders are not in status 7(cancelled),12(closed),14(Pending Close),15(Failed Close).
9585 * Hence master workorders will be post processed after child workorder processing and will
9586 * be cancelled or closed accordingly as below.
9587 */
9588 -- All child workorders are processed.Now process parent workorders in order.
9589 IF l_mwo_count > 0
9590 THEN
9591 FOR l_count IN l_master_workorder_tbl.FIRST .. l_master_workorder_tbl.LAST
9592 LOOP
9593 OPEN chk_cmplt_wo_exists(l_master_workorder_tbl(l_count).wip_entity_id);
9594 FETCH chk_cmplt_wo_exists INTO l_exists;
9595 CLOSE chk_cmplt_wo_exists;
9596 /*
9597 * If All jobs under a MWO are cancelled(or valid statuses after that)
9598 * then cancel MWO else complete Master WO.
9599 */
9600 IF l_exists IS NULL THEN
9601 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
9602 fnd_log.string
9603 (
9604 fnd_log.level_statement,
9605 'ahl.AHL_PRD_WORKORDER_PVT.Cancel_Visit_Jobs',
9606 'cancelling mwo->'||l_master_workorder_tbl(l_count).workorder_id
9607 );
9608 END IF;
9609 -- Bug # 6815689 (FP for Bug # 68156890) -- start
9610 l_copy_mwo_tbl(1) := null;
9611 -- Bug # 6815689 (FP for Bug # 68156890) -- end
9612
9613 l_copy_mwo_tbl(1).dml_operation := l_master_workorder_tbl(l_count).dml_operation;
9614 l_copy_mwo_tbl(1).batch_id := l_master_workorder_tbl(l_count).batch_id;
9615 l_copy_mwo_tbl(1).header_id := l_master_workorder_tbl(l_count).header_id;
9616 l_copy_mwo_tbl(1).workorder_id := l_master_workorder_tbl(l_count).workorder_id;
9617 l_copy_mwo_tbl(1).wip_entity_id := l_master_workorder_tbl(l_count).wip_entity_id;
9618 l_copy_mwo_tbl(1).object_version_number := l_master_workorder_tbl(l_count).object_version_number;
9619 l_copy_mwo_tbl(1).status_code := l_master_workorder_tbl(l_count).status_code;
9620
9621 process_jobs
9622 (
9623 p_api_version => 1.0,
9624 p_init_msg_list => FND_API.G_TRUE,
9625 p_commit => FND_API.G_FALSE,
9626 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9627 p_default => FND_API.G_FALSE,
9628 p_module_type => NULL,
9629 x_return_status => l_return_status,
9630 x_msg_count => l_msg_count,
9631 x_msg_data => l_msg_data,
9632 p_x_prd_workorder_tbl => l_copy_mwo_tbl,
9633 p_prd_workorder_rel_tbl => l_workorder_rel_cancel_tbl
9634 );
9635
9636 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
9637 fnd_log.string
9638 (
9639 fnd_log.level_statement,
9640 'ahl.AHL_PRD_WORKORDER_PVT.Cancel_Visit_Jobs',
9641 'return status after calling complete_master_wo: ' || l_mwo_return_status
9642 );
9643 END IF;
9644
9645 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
9646 RAISE FND_API.G_EXC_ERROR;
9647 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9648 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9649 END IF;
9650
9651 ELSE
9652 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
9653 fnd_log.string
9654 (
9655 fnd_log.level_statement,
9656 'ahl.AHL_PRD_WORKORDER_PVT.Cancel_Visit_Jobs',
9657 'completing mwo->'||l_master_workorder_tbl(l_count).workorder_id
9658 );
9659 END IF;
9660
9661 l_mwo_return_status := AHL_COMPLETIONS_PVT.complete_master_wo(
9662 p_visit_id => null,
9663 p_workorder_id => l_master_workorder_tbl(l_count).workorder_id,
9664 p_ue_id => null
9665 );
9666
9667 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
9668 fnd_log.string
9669 (
9670 fnd_log.level_statement,
9671 'ahl.AHL_PRD_WORKORDER_PVT.Cancel_Visit_Jobs',
9672 'return status after calling complete_master_wo: ' || l_mwo_return_status
9673 );
9674 END IF;
9675
9676 IF l_mwo_return_status = FND_API.G_RET_STS_ERROR THEN
9677 RAISE FND_API.G_EXC_ERROR;
9678 ELSIF l_mwo_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9679 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9680 END IF;
9681
9682 END IF;
9683 END LOOP;
9684 END IF;
9685 /* bug 5104519 - End */
9686 -- Post-Process Inputs for Cancelling Un-Planned MRs in UMP
9687 -- This step is not required while cancelling WOs during Defferal
9688 /*
9689 * As per the mail from Shailaja dated 20-Apr-2005, Cancel Visit Jobs and Cancel MR Jobs will
9690 * not update the UE Status to 'CANCELLED'. Hence Balaji commented following portion of code
9691 * which updates the UE status. Reference bug #s 4095002 and 4094884.
9692 */
9693 /*
9694 IF ( NVL( p_module_type, 'X' ) <> 'DF' ) THEN
9695
9696 -- Process Visit
9697 IF ( l_input_type = 'VST' ) THEN
9698
9699 -- Get all the Unplanned Top UEs in the Visit
9700 FOR mr_csr IN get_visit_mrs( p_visit_id ) LOOP
9701
9702 l_status_code := AHL_COMPLETIONS_PVT.get_mr_status( mr_csr.unit_effectivity_id );
9703 -- UEs can be cancelled only if all it's WOs are cancelled
9704 IF ( l_status_code = G_MR_STATUS_JOBS_CANCELLED ) THEN
9705 l_ue_count := l_ue_count + 1;
9706 l_unit_effectivity_tbl(l_ue_count).unit_effectivity_id := mr_csr.unit_effectivity_id;
9707 l_unit_effectivity_tbl(l_ue_count).object_version_number := mr_csr.object_version_number;
9708 l_unit_effectivity_tbl(l_ue_count).status_code := G_MR_STATUS_CANCELLED;
9709 END IF;
9710
9711 END LOOP;
9712
9713 -- Process UE
9714 ELSIF ( l_input_type = 'UE' ) THEN
9715
9716 -- Get the Unplanned UE Details
9717 OPEN get_ue_details( p_unit_effectivity_id );
9718 FETCH get_ue_details
9719 INTO l_object_version_number;
9720
9721 IF ( get_ue_details%FOUND ) THEN
9722 CLOSE get_ue_details;
9723
9724 l_status_code := AHL_COMPLETIONS_PVT.get_mr_status( p_unit_effectivity_id );
9725 -- UEs can be cancelled only if all it's WOs are cancelled
9726 IF ( l_status_code = G_MR_STATUS_JOBS_CANCELLED ) THEN
9727 l_ue_count := l_ue_count + 1;
9728 l_unit_effectivity_tbl(l_ue_count).unit_effectivity_id := p_unit_effectivity_id;
9729 l_unit_effectivity_tbl(l_ue_count).object_version_number := l_object_version_number;
9730 l_unit_effectivity_tbl(l_ue_count).status_code := G_MR_STATUS_CANCELLED;
9731 END IF;
9732
9733 -- Get the Parent Unplanned UEs for the given UE
9734 FOR parent_csr IN get_parent_ues( p_unit_effectivity_id ) LOOP
9735 OPEN get_ue_details(parent_csr.ue_id);
9736 FETCH get_ue_details INTO l_ovn;
9737 CLOSE get_ue_details;
9738
9739 l_status_code := AHL_COMPLETIONS_PVT.get_mr_status( parent_csr.ue_id );
9740
9741 -- UEs can be cancelled only if all it's WOs are cancelled
9742 IF ( l_status_code = G_MR_STATUS_JOBS_CANCELLED ) THEN
9743 l_ue_count := l_ue_count + 1;
9744 l_unit_effectivity_tbl(l_ue_count).unit_effectivity_id := parent_csr.ue_id;
9745 l_unit_effectivity_tbl(l_ue_count).object_version_number := l_ovn;
9746 l_unit_effectivity_tbl(l_ue_count).status_code := G_MR_STATUS_CANCELLED;
9747 END IF;
9748
9749 END LOOP;
9750 ELSE
9751 CLOSE get_ue_details;
9752 END IF;
9753
9754
9755 -- Process WO
9756 ELSIF ( l_input_type = 'WO' ) THEN
9757
9758 -- Get the UE Details for WO
9759 OPEN get_ue_details_for_wo( p_workorder_id );
9760 FETCH get_ue_details_for_wo
9761 INTO l_unit_effectivity_id,
9762 l_object_version_number;
9763
9764 IF ( get_ue_details_for_wo%FOUND ) THEN
9765 l_status_code := AHL_COMPLETIONS_PVT.get_mr_status( l_unit_effectivity_id );
9766 -- UEs can be cancelled only if all it's WOs are cancelled
9767 IF ( l_status_code = G_MR_STATUS_JOBS_CANCELLED ) THEN
9768 l_ue_count := l_ue_count + 1;
9769 l_unit_effectivity_tbl(l_ue_count).unit_effectivity_id := l_unit_effectivity_id;
9770 l_unit_effectivity_tbl(l_ue_count).object_version_number := l_object_version_number;
9771 l_unit_effectivity_tbl(l_ue_count).status_code := G_MR_STATUS_CANCELLED;
9772 END IF;
9773
9774 -- Get the Parent Unplanned UEs for the UE associated to WO
9775 FOR parent_csr IN get_parent_ues( l_unit_effectivity_id ) LOOP
9776 OPEN get_ue_details(parent_csr.ue_id);
9777 FETCH get_ue_details INTO l_ovn;
9778 CLOSE get_ue_details;
9779
9780 l_status_code := AHL_COMPLETIONS_PVT.get_mr_status( parent_csr.ue_id );
9781
9782 -- UEs can be cancelled only if all it's WOs are cancelled
9783 IF ( l_status_code = G_MR_STATUS_JOBS_CANCELLED ) THEN
9784 l_ue_count := l_ue_count + 1;
9785 l_unit_effectivity_tbl(l_ue_count).unit_effectivity_id := parent_csr.ue_id;
9786 l_unit_effectivity_tbl(l_ue_count).object_version_number := l_ovn;
9787 l_unit_effectivity_tbl(l_ue_count).status_code := G_MR_STATUS_CANCELLED;
9788 END IF;
9789
9790 END LOOP;
9791
9792 END IF;
9793
9794 CLOSE get_ue_details_for_wo;
9795
9796 END IF;
9797
9798 END IF;
9799
9800 -- Cancel Unplanned MRs in UMP
9801 IF ( l_unit_effectivity_tbl.COUNT > 0 ) THEN
9802
9803 AHL_UMP_UNITMAINT_PVT.capture_mr_updates
9804 (
9805 p_api_version => 1.0,
9806 p_init_msg_list => FND_API.G_TRUE,
9807 p_commit => FND_API.G_FALSE,
9808 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9809 p_default => FND_API.G_TRUE,
9810 p_module_type => NULL,
9811 p_unit_effectivity_tbl => l_unit_effectivity_tbl,
9812 p_x_unit_threshold_tbl => l_unit_threshold_tbl,
9813 p_x_unit_accomplish_tbl => l_unit_accomplish_tbl,
9814 x_return_status => l_return_status,
9815 x_msg_count => l_msg_count,
9816 x_msg_data => l_msg_data
9817 );
9818
9819 IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
9820 -- Add Debug
9821 IF FND_API.to_boolean(p_init_msg_list) THEN
9822 FND_MSG_PUB.initialize;
9823 END IF;
9824 END IF;
9825 END IF;
9826 */
9827 IF FND_API.to_boolean(p_commit) THEN
9828 COMMIT;
9829 END IF;
9830
9831 IF G_DEBUG='Y' THEN
9832 AHL_DEBUG_PUB.disable_debug;
9833 END IF;
9834
9835 EXCEPTION
9836 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9837 ROLLBACK TO cancel_visit_jobs_PVT;
9838 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9839 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
9840 p_count => x_msg_count,
9841 p_data => x_msg_data);
9842 WHEN FND_API.G_EXC_ERROR THEN
9843 ROLLBACK TO cancel_visit_jobs_PVT;
9844 x_return_status := FND_API.G_RET_STS_ERROR;
9845 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
9846 p_count => x_msg_count,
9847 p_data => x_msg_data);
9848
9849 WHEN VISIT_VALIDATION_ERR THEN
9850 ROLLBACK TO cancel_visit_jobs_PVT;
9851 x_return_status := 'V';
9852 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
9853 p_count => x_msg_count,
9854 p_data => x_msg_data);
9855
9856 WHEN OTHERS THEN
9857 ROLLBACK TO cancel_visit_jobs_PVT;
9858 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9859 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
9860 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
9861 p_procedure_name =>l_api_name,
9862 p_error_text => SUBSTRB(SQLERRM,1,240));
9863
9864 END IF;
9865 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
9866 p_count => x_msg_count,
9867 p_data => x_msg_data);
9868 END cancel_visit_jobs;
9869 --
9870 PROCEDURE Reschedule_Visit_Jobs
9871 (
9872 p_api_version IN NUMBER := 1.0 ,
9873 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
9874 p_commit IN VARCHAR2 := FND_API.G_FALSE,
9875 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
9876 p_default IN VARCHAR2 := FND_API.G_FALSE,
9877 p_module_type IN VARCHAR2 := Null,
9878 x_return_status OUT NOCOPY VARCHAR2,
9879 x_msg_count OUT NOCOPY NUMBER,
9880 x_msg_data OUT NOCOPY VARCHAR2,
9881 p_visit_id IN NUMBER,
9882 p_x_scheduled_start_date IN OUT NOCOPY DATE,
9883 p_x_scheduled_end_date IN OUT NOCOPY DATE
9884 )
9885
9886 AS
9887
9888 l_api_name CONSTANT VARCHAR2(30) := 'Reschedule_Visit_Jobs';
9889 l_api_version CONSTANT NUMBER := 1.0;
9890 l_msg_count NUMBER;
9891 l_msg_data VARCHAR2(2000);
9892 l_return_status VARCHAR2(1);
9893 l_dummy NUMBER;
9894 l_work_order_id NUMBER;
9895 l_status_code NUMBER;
9896 l_scheduled_start_date DATE ;
9897 l_scheduled_end_date DATE ;
9898
9899 l_offset NUMBER ;
9900 l_offset_direction NUMBER := 1;
9901 l_schedule_method NUMBER := 1;
9902 l_ignore_firm_flag VARCHAR2(1) := 'Y';
9903
9904 l_object_type_id NUMBER ;
9905
9906 l_debug VARCHAR2(1) := 'N';
9907 l_output_dir VARCHAR2(80);
9908 l_debug_filename VARCHAR2(80);
9909 l_debug_file_mode VARCHAR2(1);
9910
9911 l_prd_workorder_tbl PRD_WORKORDER_TBL;
9912 l_prd_workorder_rel_tbl PRD_WORKORDER_REL_TBL;
9913
9914
9915 CURSOR validate_visit(c_visit_id NUMBER)
9916 IS
9917 SELECT 1
9918 FROM AHL_VISITS_B
9919 WHERE VISIT_ID=c_visit_id;
9920
9921 CURSOR check_workorder_exists(c_visit_id NUMBER)
9922 IS
9923 SELECT AWO.WORKORDER_ID,
9924 AWO.OBJECT_VERSION_NUMBER,
9925 WIP.WIP_ENTITY_ID,
9926 AWO.STATUS_CODE,
9927 WIP.SCHEDULED_START_DATE,
9928 WIP.SCHEDULED_COMPLETION_DATE
9929 FROM AHL_WORKORDERS AWO,
9930 WIP_DISCRETE_JOBS WIP
9931 WHERE AWO.VISIT_ID=c_visit_id
9932 AND AWO.VISIT_TASK_ID IS NULL
9933 AND AWO.MASTER_WORKORDER_FLAG = 'Y'
9934 AND AWO.WIP_ENTITY_ID = WIP.WIP_ENTITY_ID
9935 AND AWO.STATUS_CODE NOT IN ('22', '7');
9936
9937 check_workorder_exists_rec check_workorder_exists%rowtype;
9938
9939 CURSOR get_latest_schedule_dates(c_wip_entity_id IN NUMBER)
9940 IS
9941 SELECT scheduled_start_date,
9942 scheduled_completion_date
9943 FROM wip_discrete_jobs
9944 WHERE wip_entity_id = c_wip_entity_id;
9945
9946 latest_schedule_dates_rec get_latest_schedule_dates%ROWTYPE;
9947
9948 --cursor to get the master work orders hierarchy that has completed work order beneath and needs expanding.
9949 -- If there is enough buffer to expand the masters without violating scheduled
9950 -- end dates of completed work orders, no expansion takes place
9951 /*CURSOR mwos_for_comp_wos(c_visit_id IN NUMBER,c_offset_direction IN NUMBER,c_offset IN NUMBER) IS
9952 SELECT DISTINCT CWO.workorder_id workorder_id,
9953 CWO.object_version_number object_version_number,
9954 CWO.wip_entity_id wip_entity_id,
9955 CWO.status_code status_code,
9956 WIP.SCHEDULED_START_DATE,
9957 WIP.SCHEDULED_COMPLETION_DATE SCHEDULED_END_DATE,
9958 level
9959 FROM AHL_WORKORDERS CWO,
9960 WIP_SCHED_RELATIONSHIPS REL,
9961 WIP_DISCRETE_JOBS WIP
9962 WHERE CWO.wip_entity_id = REL.parent_object_id
9963 AND CWO.wip_entity_id = WIP.WIP_ENTITY_ID
9964 AND WIP.firm_planned_flag = '1'
9965 AND CWO.status_code NOT IN ('22','7','4','5','12')
9966 AND CWO.master_workorder_flag = 'Y'
9967 AND REL.parent_object_type_id = 1
9968 AND REL.child_object_type_id = 1
9969 START WITH REL.child_object_id IN
9970 (select wos.wip_entity_id from ahl_workorders wos, WIP_DISCRETE_JOBS WIPS
9971 where wos.wip_entity_id = wips.wip_entity_id
9972 and wips.date_completed IS NOT NULL
9973 and exists (Select 'X' from WIP_DISCRETE_JOBS WIPSP,WIP_SCHED_RELATIONSHIPS RELP
9974 where RELP.child_object_id = wips.wip_entity_id
9975 and RELP.parent_object_id = WIPSP.wip_entity_id
9976 and DECODE(c_offset_direction, 1,WIPSP.scheduled_start_date+c_offset,WIPS.scheduled_completion_date + c_offset)
9977 > DECODE(c_offset_direction, 1,WIPS.scheduled_start_date ,WIPSP.scheduled_completion_date))
9978 and wos.visit_id = c_visit_id)
9979 AND REL.relationship_type = 1
9980 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
9981 AND REL.relationship_type = 1
9982 ORDER BY level DESC,workorder_id asc;*/
9983
9984 /*changed for fix of bug 14466016 */
9985 CURSOR mwos_for_comp_wos(c_visit_id IN NUMBER,c_offset_direction IN NUMBER,c_offset IN NUMBER) IS
9986 SELECT cwo.workorder_id workorder_id, cwo.visit_id,
9987 cwo.object_version_number object_version_number,
9988 cwo.wip_entity_id wip_entity_id, cwo.status_code status_code,
9989 wip.scheduled_start_date,
9990 wip.scheduled_completion_date scheduled_end_date, LEVEL
9991 FROM
9992 (select cwo.workorder_id, cwo.visit_id,
9993 cwo.object_version_number,
9994 cwo.wip_entity_id , cwo.status_code status_code
9995 from ahl_workorders cwo
9996 WHERE cwo.visit_id = c_visit_id
9997 and cwo.status_code NOT IN ('22', '7', '4', '5', '12')
9998 AND cwo.master_workorder_flag = 'Y') cwo,
9999 wip_sched_relationships rel,
10000 wip_discrete_jobs wip
10001 WHERE cwo.wip_entity_id = rel.parent_object_id
10002 AND cwo.wip_entity_id = wip.wip_entity_id
10003 AND wip.firm_planned_flag = '1'
10004 AND rel.parent_object_type_id = 1
10005 AND rel.child_object_type_id = 1
10006 START WITH rel.child_object_id IN (
10007 SELECT distinct wos.wip_entity_id
10008 FROM wip_discrete_jobs wips, wip_discrete_jobs wipsp,
10009 wip_sched_relationships relp, ahl_workorders wos
10010 WHERE wos.visit_id = c_visit_id
10011 AND wos.wip_entity_id = wips.wip_entity_id
10012 AND wips.date_completed IS NOT NULL
10013 AND relp.child_object_id = wips.wip_entity_id
10014 AND relp.relationship_type = 1
10015 AND relp.child_object_type_id = 1
10016 AND relp.parent_object_id = wipsp.wip_entity_id
10017 AND DECODE (c_offset_direction,1, wipsp.scheduled_start_date + c_offset,wips.scheduled_completion_date + c_offset)>
10018 DECODE (c_offset_direction,1, wips.scheduled_start_date, wipsp.scheduled_completion_date))
10019 AND rel.relationship_type = 1
10020 CONNECT BY rel.child_object_id = PRIOR rel.parent_object_id
10021 AND rel.relationship_type = 1
10022 ORDER BY LEVEL DESC, workorder_id ASC;
10023
10024
10025 l_prev_workorder_id NUMBER;
10026
10027 -- just for logging pre and post mwo expansion
10028 CURSOR log_mwos_for_comp_wos(c_visit_id IN NUMBER) IS
10029 SELECT DISTINCT CWO.workorder_id,
10030 CWO.workorder_name,
10031 CWO.wip_entity_id wip_entity_id,
10032 CWO.status_code status_code,
10033 WIP.SCHEDULED_START_DATE,
10034 WIP.SCHEDULED_COMPLETION_DATE
10035 FROM AHL_WORKORDERS CWO,
10036 WIP_SCHED_RELATIONSHIPS REL,
10037 WIP_DISCRETE_JOBS WIP
10038 WHERE CWO.wip_entity_id = REL.parent_object_id
10039 AND CWO.wip_entity_id = WIP.WIP_ENTITY_ID
10040 AND WIP.firm_planned_flag = '1'
10041 AND CWO.status_code NOT IN ('22','7','4','5','12')
10042 AND CWO.master_workorder_flag = 'Y'
10043 AND REL.parent_object_type_id = 1
10044 AND REL.child_object_type_id = 1
10045 START WITH REL.child_object_id IN
10046 (select wos.wip_entity_id from ahl_workorders wos, WIP_DISCRETE_JOBS WIPS
10047 where wos.wip_entity_id = wips.wip_entity_id
10048 and wips.date_completed IS NOT NULL
10049 and wos.visit_id = c_visit_id)
10050 AND REL.relationship_type = 1
10051 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
10052 AND REL.relationship_type = 1
10053 ORDER BY workorder_id asc;
10054
10055 -- to find out minimum and maximum planning dates based on completed work order scheduled dates
10056 CURSOR get_minmax_comp_schedule_dates(c_visit_id IN NUMBER)
10057 IS
10058 SELECT min(scheduled_start_date) max_start_date,
10059 max(scheduled_completion_date) min_end_date
10060 FROM wip_discrete_jobs wips, ahl_workorders wos
10061 WHERE wips.wip_entity_id = wos.wip_entity_id
10062 and wips.date_completed IS NOT NULL
10063 and wos.visit_id = c_visit_id
10064 group by wos.visit_id;
10065
10066 get_minmax_comp_schdates_rec get_minmax_comp_schedule_dates%ROWTYPE;
10067
10068 BEGIN
10069
10070 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
10071 fnd_log.string(fnd_log.level_procedure,'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs.begin',
10072 'At the start of PLSQL procedure');
10073 END IF;
10074 -- Standard start of API savepoint
10075 SAVEPOINT Reschedule_Visit_Jobs;
10076 --
10077 IF NOT FND_API.compatible_api_call(l_api_version,
10078 p_api_version,
10079 l_api_name,G_PKG_NAME) THEN
10080 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10081 END IF;
10082 -- Initialize message list if p_init_msg_list is set to TRUE
10083 IF FND_API.to_boolean(p_init_msg_list) THEN
10084 FND_MSG_PUB.initialize;
10085 END IF;
10086 -- Initialize API return status to success
10087 x_return_status:=FND_API.G_RET_STS_SUCCESS;
10088
10089 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10090 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
10091 'Request for Rescheduling Workorders for Visit ID : ' || p_visit_id );
10092 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
10093 'Request for Rescheduling Workorder Schedule Start Date : ' || p_x_scheduled_start_date );
10094 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
10095 'Request for Rescheduling Workorder Schedule End Date : ' || p_x_scheduled_end_date );
10096 END IF;
10097
10098 ---Begin of the Validation
10099 OPEN validate_visit(p_visit_id) ;
10100 FETCH validate_visit into l_dummy ;
10101 IF (validate_visit%NOTFOUND) THEN
10102 FND_MESSAGE.Set_Name('AHL','AHL_PRD_VISIT_NOT_FOUND');
10103 FND_MSG_PUB.ADD;
10104 CLOSE validate_visit;
10105 RAISE FND_API.G_EXC_ERROR;
10106 END IF;
10107 CLOSE validate_visit;
10108
10109 IF ( G_DEBUG = 'Y' ) THEN
10110 set_eam_debug_params
10111 (
10112 x_debug => l_debug,
10113 x_output_dir => l_output_dir,
10114 x_debug_file_name => l_debug_filename,
10115 x_debug_file_mode => l_debug_file_mode
10116 );
10117 END IF;
10118
10119 OPEN check_workorder_exists(p_visit_id);
10120 FETCH check_workorder_exists into check_workorder_exists_rec;
10121 IF (check_workorder_exists%NOTFOUND) THEN
10122 FND_MESSAGE.Set_Name('AHL','AHL_PRD_VISIT_MWO_NOT_FOUND');
10123 FND_MSG_PUB.ADD;
10124 CLOSE check_workorder_exists;
10125 RAISE FND_API.G_EXC_ERROR;
10126 -- can not move visit if visit wo in 4 -> Complete -- 5 -> Complete No Charge -- 7 -> Cancelled -- 12 -> Closed
10127 ELSIF (check_workorder_exists_rec.status_code IN (4, 5, 7, 12) ) THEN
10128 FND_MESSAGE.Set_Name('AHL','AHL_PRD_JOB_STATUS_INVALID');
10129 FND_MSG_PUB.ADD;
10130 CLOSE check_workorder_exists;
10131 RAISE FND_API.G_EXC_ERROR;
10132 END IF;
10133 CLOSE check_workorder_exists;
10134
10135 -- Allow reschedule for Unreleased, Released and Draft Workorders
10136 /*Balaji commented out the code for the BAE bug # 4615383 which prevents
10137 the user from re-scheduling the visit when the visit workorder is in
10138 status other than 1,3 and 17.However this needs to be modified to the end status
10139 Complete, Cancelled, Closed and Complete No Charge as per the discussion with
10140 Shailaja. If the master workorder falls in any of these end statuses then
10141 rescheduling should be prevented.
10142 Hence removing this validation instead adding following validation.
10143 IF (check_workorder_exists_rec.status_code NOT IN ( 1,3,17) )
10144 THEN
10145 FND_MESSAGE.Set_Name('AHL','AHL_PRD_JOB_STATUS_INVALID');
10146 FND_MSG_PUB.ADD;
10147 close check_workorder_exists;
10148 RAISE FND_API.G_EXC_ERROR;
10149 END IF;
10150 */
10151
10152 -- min and max scheduled dates possible for visit- check
10153 OPEN get_minmax_comp_schedule_dates(p_visit_id);
10154 FETCH get_minmax_comp_schedule_dates INTO get_minmax_comp_schdates_rec.max_start_date,
10155 get_minmax_comp_schdates_rec.min_end_date;
10156 IF(get_minmax_comp_schedule_dates%FOUND)THEN
10157 IF(get_minmax_comp_schdates_rec.max_start_date < p_x_scheduled_start_date OR
10158 get_minmax_comp_schdates_rec.min_end_date > p_x_scheduled_end_date)THEN
10159 FND_MESSAGE.Set_Name('AHL','AHL_PRD_ENCOMP_CWO_INVALID');
10160 FND_MESSAGE.SET_TOKEN('MAX_START_DATE',to_char(get_minmax_comp_schdates_rec.max_start_date,'DD-MON-YYYY HH24:MI:SS'));
10161 FND_MESSAGE.SET_TOKEN('MIN_END_DATE',to_char(get_minmax_comp_schdates_rec.min_end_date,'DD-MON-YYYY HH24:MI:SS'));
10162 FND_MSG_PUB.ADD;
10163 CLOSE get_minmax_comp_schedule_dates;
10164 RAISE FND_API.G_EXC_ERROR;
10165 END IF;
10166 END IF;
10167 CLOSE get_minmax_comp_schedule_dates;
10168
10169
10170 -- rroy
10171 -- reschedule logic:
10172 -- 1. Reschedule will be done only if
10173 -- a) the visit start date and planned end date change
10174 -- b) only the visit start date changes
10175 -- 2. If only the visit planned end date changes then
10176 -- the visit master workorder end date will be updated
10177 -- 3. for all reschedules, the visit master workorder end date will,
10178 -- after rescheduling, be updated to the visit planned end date
10179 -- if while carrying out update, the resulting visit master workorder
10180 -- end date lies before any of the child workorder end dates
10181 -- then the EAM APIs will throw an error, which will
10182 -- probably be the scheduling hierarchy error.
10183 -- 4. All scheduling will always be forward scheduling
10184
10185 l_offset := p_x_scheduled_start_date - check_workorder_exists_rec.scheduled_start_date;
10186 l_schedule_method := 1; -- forward schedule
10187 IF (l_offset = 0) THEN
10188 -- only the planned end date has changed
10189 -- so we need to update the master workorder end date
10190 -- with a call to update jobs
10191 l_prd_workorder_tbl(1).DML_OPERATION := 'U';
10192 l_prd_workorder_tbl(1).WORKORDER_ID := check_workorder_exists_rec.workorder_id;
10193 l_prd_workorder_tbl(1).OBJECT_VERSION_NUMBER := check_workorder_exists_rec.object_version_number;
10194 l_prd_workorder_tbl(1).STATUS_CODE := check_workorder_exists_rec.status_code;
10195 l_prd_workorder_tbl(1).SCHEDULED_START_DATE := check_workorder_exists_rec.scheduled_start_date;
10196 l_prd_workorder_tbl(1).SCHEDULED_END_DATE := p_x_scheduled_end_date;
10197 --l_prd_workorder_tbl(1).BATCH_ID := 1;
10198 --l_prd_workorder_tbl(1).HEADER_ID := 0;
10199 l_prd_workorder_tbl(1).BATCH_ID := check_workorder_exists_rec.wip_entity_id;
10200 l_prd_workorder_tbl(1).HEADER_ID := check_workorder_exists_rec.wip_entity_id;
10201
10202
10203 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10204 fnd_log.string(fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10205 'Before Calling Process Jobs ');
10206 END IF;
10207
10208 process_jobs
10209 (
10210 p_api_version => 1.0,
10211 p_init_msg_list => FND_API.G_TRUE,
10212 p_commit => FND_API.G_FALSE,
10213 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10214 p_default => FND_API.G_TRUE,
10215 p_module_type => NULL,
10216 x_return_status => l_return_status,
10217 x_msg_count => l_msg_count,
10218 x_msg_data => l_msg_data,
10219 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
10220 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
10221 );
10222
10223 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10224 RAISE Fnd_Api.g_exc_error;
10225 END IF;
10226 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10227 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10228 'After calling Process Jobs API to reschedule master workorder' );
10229 END IF;
10230 IF FND_API.to_boolean(p_commit) THEN
10231 COMMIT;
10232 END IF;
10233 RETURN;
10234 END IF ; -- IF (l_offset = 0) THEN
10235 /*
10236 It is just an assumption. As all the CMRO Workorders Type are 1
10237 */
10238
10239 l_object_type_id := 1;
10240
10241 IF l_offset > 0 THEN
10242 l_offset_direction := 1;
10243 ELSE
10244 l_offset_direction := -1;
10245 l_offset := l_offset * (-1);
10246 END IF;
10247
10248 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10249 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'Rescheduled Wip Entity ID : ' || check_workorder_exists_rec.wip_entity_id );
10250 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'Object Type Id : ' || l_object_type_id );
10251 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'Offset : ' || l_offset );
10252 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'Offset Direction : ' || l_offset_direction );
10253 END IF;
10254 -- fix for move visit issues. Bug 9462278
10255 --logging master work order dates prior to adjustment by CMRO
10256 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10257 FOR mwo_rec IN log_mwos_for_comp_wos(p_visit_id) LOOP
10258 fnd_log.string
10259 (
10260 fnd_log.level_statement,
10261 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10262 'Original Scheduled start and completion dates : '
10263 || '{mwo_rec.workorder_name : ' || mwo_rec.workorder_name || '}'
10264 || '{mwo_rec.wip_entity_id : ' || mwo_rec.wip_entity_id || '}'
10265 || '{ mwo_rec.status_code : ' || mwo_rec.status_code || '}'
10266 || '{ mwo_rec.SCHEDULED_START_DATE : ' || to_char(mwo_rec.SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS') || '}'
10267 || '{mwo_rec.SCHEDULED_COMPLETION_DATE : ' || to_char(mwo_rec.SCHEDULED_COMPLETION_DATE,'DD-MON-YYYY HH24:MI:SS') || '}'
10268
10269 );
10270 END LOOP;
10271 END IF;
10272
10273 l_dummy :=1;
10274 l_prd_workorder_tbl.DELETE;
10275 l_prev_workorder_id := -1;
10276 FOR mwo_rec IN mwos_for_comp_wos(p_visit_id,l_offset_direction,l_offset) LOOP
10277 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10278 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'l_offset_direction : ' || l_offset_direction );
10279 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'mwo_rec.wip_entity_id : ' || mwo_rec.wip_entity_id );
10280 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'Offset : ' || l_offset );
10281 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':', 'check_workorder_exists_rec.wip_entity_id : ' || check_workorder_exists_rec.wip_entity_id );
10282 END IF;
10283 IF(mwo_rec.workorder_id <> l_prev_workorder_id) THEN
10284 IF(l_offset_direction = 1 AND mwo_rec.wip_entity_id <> check_workorder_exists_rec.wip_entity_id) THEN
10285 l_prd_workorder_tbl(l_dummy).SCHEDULED_START_DATE := mwo_rec.scheduled_start_date - l_offset;
10286 l_prd_workorder_tbl(l_dummy).SCHEDULED_END_DATE := mwo_rec.scheduled_end_date;
10287 l_prd_workorder_tbl(l_dummy).BATCH_ID := check_workorder_exists_rec.wip_entity_id;
10288 l_prd_workorder_tbl(l_dummy).HEADER_ID := mwo_rec.wip_entity_id;
10289 l_prd_workorder_tbl(l_dummy).DML_OPERATION := 'U';
10290 l_prd_workorder_tbl(l_dummy).WORKORDER_ID := mwo_rec.workorder_id;
10291 l_prd_workorder_tbl(l_dummy).OBJECT_VERSION_NUMBER := mwo_rec.object_version_number;
10292 l_prd_workorder_tbl(l_dummy).STATUS_CODE := mwo_rec.status_code;
10293 l_dummy := l_dummy + 1;
10294 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10295 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10296 'Expanding master work order{' || mwo_rec.workorder_id || '}{' || TO_CHAR(l_prd_workorder_tbl(l_dummy -1).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS')
10297 || '}{' || TO_CHAR(l_prd_workorder_tbl(l_dummy -1).SCHEDULED_END_DATE,'DD-MON-YYYY HH24:MI:SS') || '}' );
10298 END IF;
10299 ELSIF(l_offset_direction = -1) THEN
10300 l_prd_workorder_tbl(l_dummy).SCHEDULED_START_DATE := mwo_rec.scheduled_start_date;
10301 l_prd_workorder_tbl(l_dummy).SCHEDULED_END_DATE := mwo_rec.scheduled_end_date + l_offset;
10302 l_prd_workorder_tbl(l_dummy).BATCH_ID := check_workorder_exists_rec.wip_entity_id;
10303 l_prd_workorder_tbl(l_dummy).HEADER_ID := mwo_rec.wip_entity_id;
10304 l_prd_workorder_tbl(l_dummy).DML_OPERATION := 'U';
10305 l_prd_workorder_tbl(l_dummy).WORKORDER_ID := mwo_rec.workorder_id;
10306 l_prd_workorder_tbl(l_dummy).OBJECT_VERSION_NUMBER := mwo_rec.object_version_number;
10307 l_prd_workorder_tbl(l_dummy).STATUS_CODE := mwo_rec.status_code;
10308 l_dummy := l_dummy + 1;
10309 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10310 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10311 'Expanding master work order{' || mwo_rec.workorder_id || '}{' || TO_CHAR(l_prd_workorder_tbl(l_dummy -1).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS')
10312 || '}{' || TO_CHAR(l_prd_workorder_tbl(l_dummy -1).SCHEDULED_END_DATE,'DD-MON-YYYY HH24:MI:SS') || '}' );
10313 END IF;
10314 END IF;
10315 END IF;
10316 l_prev_workorder_id := mwo_rec.workorder_id;
10317 END LOOP;
10318 IF(l_dummy > 1)THEN
10319 process_jobs
10320 (
10321 p_api_version => 1.0,
10322 p_init_msg_list => FND_API.G_TRUE,
10323 p_commit => FND_API.G_FALSE,
10324 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10325 p_default => FND_API.G_TRUE,
10326 p_module_type => NULL,
10327 x_return_status => l_return_status,
10328 x_msg_count => l_msg_count,
10329 x_msg_data => l_msg_data,
10330 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
10331 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
10332 );
10333
10334 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10335 RAISE Fnd_Api.g_exc_error;
10336 END IF;
10337
10338 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10339 fnd_log.string
10340 (
10341 fnd_log.level_statement,
10342 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10343 'After calling Process Jobs API to reschedule master workorders expansion'
10344 );
10345 END IF;
10346 END IF;
10347 -- fix for move visit issues. Bug 9462278
10348
10349 --logging master work order dates after adjustment by CMRO
10350 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10351 FOR mwo_rec IN log_mwos_for_comp_wos(p_visit_id) LOOP
10352 fnd_log.string
10353 (
10354 fnd_log.level_statement,
10355 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10356 'CMRO Updated but prior to EAM move - Scheduled start and completion dates : '
10357 || '{mwo_rec.workorder_name : ' || mwo_rec.workorder_name || '}'
10358 || '{mwo_rec.wip_entity_id : ' || mwo_rec.wip_entity_id || '}'
10359 || '{ mwo_rec.status_code : ' || mwo_rec.status_code || '}'
10360 || '{ mwo_rec.SCHEDULED_START_DATE : ' || to_char(mwo_rec.SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS') || '}'
10361 || '{mwo_rec.SCHEDULED_COMPLETION_DATE : ' || to_char(mwo_rec.SCHEDULED_COMPLETION_DATE,'DD-MON-YYYY HH24:MI:SS') || '}'
10362
10363 );
10364 END LOOP;
10365 END IF;
10366
10367 --Call Eam APi TO Move all the workorders
10368 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10369 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10370 'Before Calling EAM_WO_NETWORK_UTIL_PVT.Move_WO ' );
10371 END IF;
10372 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10373 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs',
10374 '{' || TO_CHAR(p_x_scheduled_start_date,'DD-MON-YYYY HH24:MI:SS') || '}{' || TO_CHAR(l_scheduled_end_date,'DD-MON-YYYY HH24:MI:SS') || '}' );
10375 END IF;
10376
10377 -- this code will be executed only when offset is > 0
10378 EAM_WO_NETWORK_UTIL_PVT.Move_WO
10379 (
10380 p_api_version => p_api_version,
10381 p_init_msg_list => p_init_msg_list,
10382 p_commit => p_commit,
10383 p_validation_level => p_validation_level,
10384 p_work_object_id => check_workorder_exists_rec.wip_entity_id,
10385 p_work_object_type_id => l_object_type_id,
10386 p_offset_days => l_offset, -- 1 Day Default
10387 p_offset_direction => l_offset_direction, -- Forward
10388 p_start_date => latest_schedule_dates_rec.scheduled_start_date,--p_x_scheduled_start_date,
10389 p_completion_date => latest_schedule_dates_rec.scheduled_completion_date,--l_scheduled_end_date,
10390 p_schedule_method => l_schedule_method,
10391 p_ignore_firm_flag => l_ignore_firm_flag,
10392 x_return_status => l_return_status,
10393 x_msg_count => l_msg_count,
10394 x_msg_data => l_msg_data
10395 );
10396
10397 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10398 RAISE Fnd_Api.g_exc_error;
10399 END IF;
10400
10401 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10402 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs', 'After Calling EAM_WO_NETWORK_UTIL_PVT.Move_WO ' ||l_return_status );
10403 END IF;
10404
10405 -- after rescheduling,update the visit master workorder start and end scheduled dates
10406
10407 l_prd_workorder_tbl.DELETE;
10408 OPEN check_workorder_exists(p_visit_id);
10409 FETCH check_workorder_exists into check_workorder_exists_rec;
10410 CLOSE check_workorder_exists;
10411 l_prd_workorder_tbl(1).DML_OPERATION := 'U';
10412 l_prd_workorder_tbl(1).WORKORDER_ID := check_workorder_exists_rec.workorder_id;
10413 l_prd_workorder_tbl(1).OBJECT_VERSION_NUMBER := check_workorder_exists_rec.object_version_number;
10414 l_prd_workorder_tbl(1).STATUS_CODE := check_workorder_exists_rec.status_code;
10415 l_prd_workorder_tbl(1).SCHEDULED_START_DATE := p_x_scheduled_start_date;
10416 l_prd_workorder_tbl(1).SCHEDULED_END_DATE := p_x_scheduled_end_date;
10417 l_prd_workorder_tbl(1).BATCH_ID := check_workorder_exists_rec.wip_entity_id;
10418 l_prd_workorder_tbl(1).HEADER_ID := check_workorder_exists_rec.wip_entity_id;
10419
10420 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10421 fnd_log.string ( fnd_log.level_statement, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs.end', 'calling process_jobs' );
10422 END IF;
10423
10424 process_jobs
10425 (
10426 p_api_version => 1.0,
10427 p_init_msg_list => FND_API.G_TRUE,
10428 p_commit => FND_API.G_FALSE,
10429 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10430 p_default => FND_API.G_TRUE,
10431 p_module_type => NULL,
10432 x_return_status => l_return_status,
10433 x_msg_count => l_msg_count,
10434 x_msg_data => l_msg_data,
10435 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
10436 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
10437 );
10438
10439 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10440 OPEN get_latest_schedule_dates(check_workorder_exists_rec.wip_entity_id);
10441 FETCH get_latest_schedule_dates INTO latest_schedule_dates_rec;
10442 CLOSE get_latest_schedule_dates;
10443 IF p_x_scheduled_end_date <> latest_schedule_dates_rec.scheduled_completion_date
10444 THEN
10445 -- Initialize the message list not to show the EAM Error message
10446 IF FND_API.to_boolean(p_init_msg_list) THEN
10447 FND_MSG_PUB.initialize;
10448 END IF;
10449 FND_MESSAGE.Set_Name('AHL','AHL_PRD_PLANNED_DATE_INVALID');
10450 FND_MESSAGE.SET_TOKEN('DATE',latest_schedule_dates_rec.scheduled_completion_date);
10451 FND_MSG_PUB.ADD;
10452 END IF;
10453 RAISE Fnd_Api.g_exc_error;
10454
10455 END IF;
10456
10457 --
10458 IF FND_API.to_boolean(p_commit) THEN
10459 COMMIT;
10460 END IF;
10461 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
10462 fnd_log.string ( fnd_log.level_procedure, 'ahl.plsql.AHL_PRD_WORKORDER_PVT.Reschedule_Visit_Jobs.end', 'At the end of PLSQL procedure' );
10463 END IF;
10464
10465 EXCEPTION
10466 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10467 ROLLBACK TO Reschedule_Visit_Jobs;
10468 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10469 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
10470 p_count => x_msg_count,
10471 p_data => x_msg_data);
10472 WHEN FND_API.G_EXC_ERROR THEN
10473 ROLLBACK TO Reschedule_Visit_Jobs;
10474 x_return_status := FND_API.G_RET_STS_ERROR;
10475 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
10476 p_count => x_msg_count,
10477 p_data => x_msg_data);
10478
10479 WHEN OTHERS THEN
10480 ROLLBACK TO Reschedule_Visit_Jobs;
10481 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10482 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10483 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
10484 p_procedure_name =>l_api_name,
10485 p_error_text => SUBSTRB(SQLERRM,1,240));
10486
10487 END IF;
10488 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
10489 p_count => x_msg_count,
10490 p_data => x_msg_data);
10491
10492 END Reschedule_Visit_Jobs;
10493
10494
10495 PROCEDURE INSERT_TURNOVER_NOTES
10496 (
10497 p_api_version IN NUMBER := 1.0 ,
10498 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
10499 p_commit IN VARCHAR2 := FND_API.G_FALSE,
10500 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
10501 p_default IN VARCHAR2 := FND_API.G_FALSE,
10502 p_module_type IN VARCHAR2 := Null,
10503 x_return_status OUT NOCOPY VARCHAR2,
10504 x_msg_count OUT NOCOPY NUMBER,
10505 x_msg_data OUT NOCOPY VARCHAR2,
10506 p_trunover_notes_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.turnover_notes_tbl_type
10507 ) IS
10508
10509 l_api_version CONSTANT NUMBER := 1.0;
10510 l_api_name CONSTANT VARCHAR2(30) := 'INSERT_TURNOVER_NOTES';
10511
10512 CURSOR get_user_id_csr(p_emp_name VARCHAR2, p_org_id NUMBER) IS
10513
10514 /* fix for perf. bug# 4919298.
10515 SELECT FU.user_id, PF.person_id FROM fnd_user FU,PER_PEOPLE_F PF, HR_ORGANIZATION_UNITS HOU, PER_PERSON_TYPES PEPT, BOM_RESOURCE_EMPLOYEES BRE
10516 WHERE NVL(PF.CURRENT_EMPLOYEE_FLAG, 'X') = 'Y'
10517 AND PEPT.PERSON_TYPE_ID = PF.PERSON_TYPE_ID
10518 AND PEPT.SYSTEM_PERSON_TYPE = 'EMP'
10519 AND PF.PERSON_ID = BRE.PERSON_ID
10520 AND (TRUNC(SYSDATE) BETWEEN PF.EFFECTIVE_START_DATE AND PF.EFFECTIVE_END_DATE)
10521 AND HOU.BUSINESS_GROUP_ID = PF.BUSINESS_GROUP_ID
10522 AND HOU.ORGANIZATION_ID = NVL(p_org_id,HOU.ORGANIZATION_ID)
10523 --AND NVL(FU.employee_id,-1) = PF.person_id
10524 AND FU.employee_id = PF.person_id -- removed NVL to avoid FTS on fnd_user.
10525 AND UPPER(PF.FULL_NAME) like UPPER(p_emp_name);
10526 */
10527
10528 SELECT DISTINCT bre.person_id, fu.user_id
10529 FROM mtl_employees_current_view pf, bom_resource_employees bre, fnd_user fu
10530 WHERE pf.employee_id=bre.person_id
10531 and pf.organization_id = bre.organization_id
10532 and sysdate between BRE.EFFECTIVE_START_DATE and BRE.EFFECTIVE_END_DATE
10533 and FU.employee_id = pf.employee_id
10534 and pf.organization_id= p_org_id
10535 and UPPER(pf.full_name) like UPPER(p_emp_name);
10536
10537
10538 l_user_id NUMBER;
10539 l_count NUMBER;
10540 matchFound BOOLEAN;
10541
10542 BEGIN
10543 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
10544 fnd_log.string
10545 (
10546 fnd_log.level_procedure,
10547 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES.begin',
10548 'At the start of PLSQL procedure'
10549 );
10550 END IF;
10551 -- Standard start of API savepoint
10552 SAVEPOINT INSERT_TURNOVER_NOTES;
10553
10554 -- Standard call to check for call compatibility
10555 IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version,l_api_name, G_PKG_NAME ) THEN
10556 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10557 END IF;
10558 -- Initialize message list if p_init_msg_list is set to TRUE
10559 IF FND_API.To_Boolean( p_init_msg_list) THEN
10560 FND_MSG_PUB.Initialize;
10561 END IF;
10562
10563 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
10564 fnd_log.string
10565 (
10566 fnd_log.level_statement,
10567 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES',
10568 'p_init_message_list : ' || p_init_msg_list
10569 );
10570 fnd_log.string
10571 (
10572 fnd_log.level_statement,
10573 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES',
10574 'p_commit : ' || p_commit
10575 );
10576 END IF;
10577 -- Initialize API return status to success
10578 x_return_status := FND_API.G_RET_STS_SUCCESS;
10579 -- Insert notes
10580 FOR i IN p_trunover_notes_tbl.FIRST..p_trunover_notes_tbl.LAST LOOP
10581 -- validate source object code
10582 IF(p_trunover_notes_tbl(i).source_object_code <> 'AHL_WO_TURNOVER_NOTES')THEN
10583 FND_MESSAGE.Set_Name('AHL','AHL_PRD_WO_NOTES_INV_SOURCE');
10584 FND_MSG_PUB.ADD;
10585 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
10586 fnd_log.string
10587 (
10588 fnd_log.level_error,
10589 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES',
10590 'Invalid source object code for JTF notes' || p_trunover_notes_tbl(i).source_object_code
10591 );
10592 END IF;
10593 END IF;
10594 -- validate entered data
10595 IF(p_trunover_notes_tbl(i).entered_date > SYSDATE)THEN
10596 FND_MESSAGE.Set_Name('AHL','AHL_PRD_WO_NOTES_INV_ENT_DT');
10597 FND_MESSAGE.Set_Token('ENTERED_DATE',p_trunover_notes_tbl(i).entered_date);
10598 FND_MSG_PUB.ADD;
10599 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
10600 fnd_log.string
10601 (
10602 fnd_log.level_error,
10603 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES',
10604 'Invalid enterded date' || to_char(p_trunover_notes_tbl(i).entered_date)
10605 );
10606 END IF;
10607 END IF;
10608 -- validate that notes cant not be null
10609 IF(p_trunover_notes_tbl(i).notes IS NULL)THEN
10610 FND_MESSAGE.Set_Name('AHL','AHL_PRD_WO_NOTES_INV_NOTES_NLL');
10611 FND_MSG_PUB.ADD;
10612 IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
10613 fnd_log.string
10614 (
10615 fnd_log.level_error,
10616 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES',
10617 'Invalid enterded date' || to_char(p_trunover_notes_tbl(i).entered_date)
10618 );
10619 END IF;
10620 END IF;
10621
10622 IF p_trunover_notes_tbl(i).employee_name IS NULL THEN
10623 FND_MESSAGE.set_name('AHL','AHL_PRD_EMP_NULL_TRNTS');
10624 FND_MSG_PUB.ADD;
10625 --l_user_id := FND_GLOBAL.user_id;
10626 ELSE
10627 matchFound := FALSE;
10628 FOR emp_rec IN get_user_id_csr(p_trunover_notes_tbl(i).employee_name,
10629 p_trunover_notes_tbl(i).org_id) LOOP
10630 l_count := l_count + 1;
10631 l_user_id := emp_rec.user_id;
10632 IF(emp_rec.person_id = p_trunover_notes_tbl(i).employee_id)THEN
10633 matchFound := TRUE;
10634 EXIT;
10635 END IF;
10636 END LOOP;
10637 IF NOT(l_count = 1 OR matchFound)THEN
10638 -- Invalid or non unique employee
10639 FND_MESSAGE.set_name('AHL','AHL_PRD_INV_EMP_TRNTS');
10640 FND_MESSAGE.SET_TOKEN('EMP_NAME',p_trunover_notes_tbl(i).employee_name);
10641 FND_MSG_PUB.ADD;
10642 END IF;
10643 END IF;
10644
10645 IF(l_user_id IS NULL)THEN
10646 FND_MESSAGE.set_name('AHL','AHL_PRD_INV_EMP_NUQ_TRNTS');
10647 FND_MSG_PUB.ADD;
10648 END IF;
10649
10650
10651 -- add notes if no messages
10652 IF(FND_MSG_PUB.count_msg = 0)THEN
10653 JTF_NOTES_PUB.Create_note
10654 (
10655 p_api_version => 1.0,
10656 p_init_msg_list => FND_API.G_FALSE,
10657 p_commit => FND_API.G_FALSE,
10658 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10659 x_return_status => x_return_status,
10660 x_msg_count => x_msg_count,
10661 x_msg_data => x_msg_data,
10662 p_source_object_id => p_trunover_notes_tbl(i).source_object_id,
10663 p_source_object_code => p_trunover_notes_tbl(i).source_object_code,
10664 p_notes => p_trunover_notes_tbl(i).notes,
10665 p_entered_by => l_user_id,
10666 p_entered_date => p_trunover_notes_tbl(i).entered_date,
10667 x_jtf_note_id => p_trunover_notes_tbl(i).jtf_note_id
10668 );
10669 END IF;
10670 END LOOP;
10671 -- Check Error Message stack.
10672 x_msg_count := FND_MSG_PUB.count_msg;
10673 IF x_msg_count > 0 THEN
10674 RAISE FND_API.G_EXC_ERROR;
10675 END IF;
10676
10677 -- Standard check of p_commit
10678 IF FND_API.TO_BOOLEAN(p_commit) THEN
10679 COMMIT WORK;
10680 END IF;
10681 -- Standard call to get message count and if count is 1, get message info
10682 FND_MSG_PUB.Count_And_Get
10683 ( p_count => x_msg_count,
10684 p_data => x_msg_data,
10685 p_encoded => fnd_api.g_false
10686 );
10687 IF(x_msg_count > 0 )THEN
10688 RAISE FND_API.G_EXC_ERROR;
10689 END IF;
10690
10691 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
10692 fnd_log.string
10693 (
10694 fnd_log.level_procedure,
10695 'ahl.plsql.AHL_PRD_WORKORDER_PVT.INSERT_TURNOVER_NOTES.end',
10696 'At the end of PLSQL procedure'
10697 );
10698 END IF;
10699
10700 EXCEPTION
10701 WHEN FND_API.G_EXC_ERROR THEN
10702 Rollback to INSERT_TURNOVER_NOTES;
10703 x_return_status := FND_API.G_RET_STS_ERROR;
10704 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10705 p_data => x_msg_data,
10706 p_encoded => fnd_api.g_false);
10707
10708
10709 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10710 Rollback to INSERT_TURNOVER_NOTES;
10711 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10712 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10713 p_data => x_msg_data,
10714 p_encoded => fnd_api.g_false);
10715
10716
10717 WHEN OTHERS THEN
10718 Rollback to INSERT_TURNOVER_NOTES;
10719 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10720 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10721 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
10722 p_procedure_name => l_api_name,
10723 p_error_text => SUBSTRB(SQLERRM,1,500));
10724 END IF;
10725 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10726 p_data => x_msg_data,
10727 p_encoded => fnd_api.g_false);
10728 END INSERT_TURNOVER_NOTES;
10729
10730 FUNCTION get_date_and_time(p_date IN DATE,
10731 p_date_hh24 IN VARCHAR2,
10732 p_date_mi IN VARCHAR2,
10733 p_date_ss IN VARCHAR2) RETURN DATE IS
10734
10735 l_hour VARCHAR2(30);
10736 l_sec VARCHAR2(30);
10737 l_minutes VARCHAR2(30);
10738 l_date_time VARCHAR2(30);
10739 l_date DATE;
10740
10741 BEGIN
10742
10743 l_sec := TO_CHAR(p_date, 'ss');
10744 l_hour := TO_CHAR(p_date, 'hh24');
10745 l_minutes := TO_CHAR(p_date, 'mi');
10746 l_date := p_date;
10747
10748 IF ( p_date_hh24 IS NOT NULL AND
10749 p_date_hh24 <> FND_API.G_MISS_NUM ) THEN
10750 l_hour := p_date_hh24;
10751 END IF;
10752
10753 IF ( p_date_mi IS NOT NULL AND
10754 p_date_mi <> FND_API.G_MISS_NUM ) THEN
10755 l_minutes := p_date_mi;
10756 END IF;
10757
10758 IF(p_date_ss IS NOT NULL AND
10759 p_date_ss <> FND_API.G_MISS_NUM) THEN
10760 l_sec := p_date_ss;
10761 END IF;
10762
10763 IF ( l_hour <> '00' OR l_minutes <> '00' OR l_sec <> '00') THEN
10764 l_date_time := TO_CHAR(p_date, 'DD-MM-YYYY')||' :'|| l_hour ||':'|| l_minutes || ':'|| l_sec;
10765 l_date := TO_DATE(l_date_time , 'DD-MM-YYYY :HH24:MI:ss');
10766 END IF;
10767 RETURN l_date;
10768 END get_date_and_time;
10769
10770 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- start
10771 --------------------------------------------------------------------------------------------------
10772 -- Procedure added for Bug # 8329755 (FP for Bug # 7697909)
10773 -- This is a supplementary procedure for procedure Update_Master_Wo_Dates.
10774 --------------------------------------------------------------------------------------------------
10775 PROCEDURE default_missing_wo_attributes(
10776
10777 p_x_prd_workorder_rec IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC
10778
10779 )
10780 IS
10781 CURSOR get_workorder_rec(c_workorder_id NUMBER)
10782 IS
10783 SELECT
10784 WO.WIP_ENTITY_ID,
10785 WO.WORKORDER_NAME JOB_NUMBER,
10786 WDJ.DESCRIPTION JOB_DESCRIPTION,
10787 WO.OBJECT_VERSION_NUMBER,
10788 VST.ORGANIZATION_ID ORGANIZATION_ID,
10789 WDJ.FIRM_PLANNED_FLAG FIRM_PLANNED_FLAG,
10790 WDJ.CLASS_CODE CLASS_CODE,
10791 WDJ.OWNING_DEPARTMENT DEPARTMENT_ID,
10792 WO.STATUS_CODE JOB_STATUS_CODE,
10793 WDJ.SCHEDULED_START_DATE SCHEDULED_START_DATE,
10794 WDJ.SCHEDULED_COMPLETION_DATE SCHEDULED_END_DATE,
10795 WO.ACTUAL_START_DATE ACTUAL_START_DATE,
10796 WO.ACTUAL_END_DATE ACTUAL_END_DATE,
10797 CSI.INVENTORY_ITEM_ID INVENTORY_ITEM_ID,
10798 NVL(VTS.INSTANCE_ID,VST.ITEM_INSTANCE_ID) ITEM_INSTANCE_ID,
10799 WDJ.COMPLETION_SUBINVENTORY COMPLETION_SUBINVENTORY,
10800 WDJ.COMPLETION_LOCATOR_ID COMPLETION_LOCATOR_ID,
10801 WO.MASTER_WORKORDER_FLAG MASTER_WORKORDER_FLAG,
10802 WO.VISIT_TASK_ID VISIT_TASK_ID,
10803 -- FP of PIE changes
10804 --VST.PROJECT_ID PROJECT_ID,
10805 --VTS.PROJECT_TASK_ID PROJECT_TASK_ID,
10806 DECODE(WO.MASTER_WORKORDER_FLAG,'Y',to_number(NULL),VST.PROJECT_ID) PROJECT_ID,
10807 DECODE(WO.MASTER_WORKORDER_FLAG,'Y',to_number(NULL),VTS.PROJECT_TASK_ID) PROJECT_TASK_ID,
10808 WDJ.PRIORITY PRIORITY
10809 FROM
10810 AHL_WORKORDERS WO,
10811 AHL_VISITS_B VST,
10812 AHL_VISIT_TASKS_B VTS,
10813 WIP_DISCRETE_JOBS WDJ,
10814 CSI_ITEM_INSTANCES CSI
10815 WHERE
10816 WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
10817 AND WO.VISIT_TASK_ID = VTS.VISIT_TASK_ID
10818 AND VST.VISIT_ID = WO.VISIT_ID
10819 AND NVL(VTS.INSTANCE_ID,VST.ITEM_INSTANCE_ID) = CSI.INSTANCE_ID
10820 AND WO.VISIT_TASK_ID IS NOT NULL
10821 AND WO.STATUS_CODE <> '22'
10822 AND WO.workorder_id = c_workorder_id;
10823
10824 l_prd_workorder_rec get_workorder_rec%ROWTYPE;
10825
10826 BEGIN
10827
10828 p_x_prd_workorder_rec.DML_OPERATION := 'U';
10829
10830 OPEN get_workorder_rec(p_x_prd_workorder_rec.workorder_id);
10831 FETCH get_workorder_rec INTO l_prd_workorder_rec;
10832 IF get_workorder_rec%NOTFOUND THEN
10833 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_WO_NOT_FOUND');
10834 FND_MSG_PUB.ADD;
10835 CLOSE get_workorder_rec;
10836 RETURN;
10837 END IF;
10838 CLOSE get_workorder_rec;
10839
10840 p_x_prd_workorder_rec.WIP_ENTITY_ID:=l_prd_workorder_rec.WIP_ENTITY_ID;
10841 p_x_prd_workorder_rec.JOB_NUMBER:=l_prd_workorder_rec.JOB_NUMBER;
10842 p_x_prd_workorder_rec.JOB_DESCRIPTION:=l_prd_workorder_rec.JOB_DESCRIPTION;
10843 p_x_prd_workorder_rec.OBJECT_VERSION_NUMBER:=l_prd_workorder_rec.OBJECT_VERSION_NUMBER;
10844 p_x_prd_workorder_rec.ORGANIZATION_ID:=l_prd_workorder_rec.ORGANIZATION_ID;
10845
10846 p_x_prd_workorder_rec.FIRM_PLANNED_FLAG:=l_prd_workorder_rec.FIRM_PLANNED_FLAG;
10847 p_x_prd_workorder_rec.CLASS_CODE:=l_prd_workorder_rec.CLASS_CODE;
10848 p_x_prd_workorder_rec.DEPARTMENT_ID:=l_prd_workorder_rec.DEPARTMENT_ID;
10849
10850 p_x_prd_workorder_rec.STATUS_CODE:=l_prd_workorder_rec.job_STATUS_CODE;
10851
10852 p_x_prd_workorder_rec.SCHEDULED_START_DATE:=l_prd_workorder_rec.SCHEDULED_START_DATE;
10853 p_x_prd_workorder_rec.SCHEDULED_END_DATE:=l_prd_workorder_rec.SCHEDULED_END_DATE;
10854 p_x_prd_workorder_rec.ACTUAL_START_DATE:=l_prd_workorder_rec.ACTUAL_START_DATE;
10855 p_x_prd_workorder_rec.ACTUAL_END_DATE:=l_prd_workorder_rec.ACTUAL_END_DATE;
10856 p_x_prd_workorder_rec.INVENTORY_ITEM_ID:=l_prd_workorder_rec.INVENTORY_ITEM_ID;
10857 p_x_prd_workorder_rec.ITEM_INSTANCE_ID:=l_prd_workorder_rec.ITEM_INSTANCE_ID;
10858 p_x_prd_workorder_rec.COMPLETION_SUBINVENTORY:=l_prd_workorder_rec.COMPLETION_SUBINVENTORY;
10859 p_x_prd_workorder_rec.COMPLETION_LOCATOR_ID:=l_prd_workorder_rec.COMPLETION_LOCATOR_ID;
10860 p_x_prd_workorder_rec.MASTER_WORKORDER_FLAG:=l_prd_workorder_rec.MASTER_WORKORDER_FLAG;
10861 p_x_prd_workorder_rec.VISIT_TASK_ID:=l_prd_workorder_rec.VISIT_TASK_ID;
10862 p_x_prd_workorder_rec.PROJECT_ID:=l_prd_workorder_rec.PROJECT_ID;
10863 p_x_prd_workorder_rec.PROJECT_TASK_ID:=l_prd_workorder_rec.PROJECT_TASK_ID;
10864 p_x_prd_workorder_rec.JOB_PRIORITY:=l_prd_workorder_rec.PRIORITY;
10865
10866 END default_missing_wo_attributes;
10867
10868 --------------------------------------------------------------------------------------------------
10869 -- Procedure added for Bug # 8329755 (FP for Bug # 7697909)
10870 -- This procedure updates master work order scheduled dates by deriving
10871 -- it from underlying child work orders. This procedure does this logic
10872 -- by only looking at immediate children of any MWO instead of drilling
10873 -- down the entire hierarchy of children as done by update_job API.
10874 --------------------------------------------------------------------------------------------------
10875 PROCEDURE Update_Master_Wo_Dates(
10876
10877 p_workorder_id IN NUMBER
10878 )
10879 IS
10880
10881 CURSOR get_curr_wo_details(c_workorder_id NUMBER)
10882 IS
10883 SELECT
10884 AWO.wip_entity_id
10885 FROM
10886 ahl_workorders AWO
10887 WHERE
10888 awo.workorder_id = c_workorder_id;
10889
10890 CURSOR get_parent_workorder( c_child_wip_entity_id NUMBER )
10891 IS
10892 SELECT WO.workorder_id,
10893 WO.object_version_number,
10894 WO.wip_entity_id,
10895 WO.visit_task_id,
10896 WO.STATUS_CODE,
10897 WDJ.SCHEDULED_START_DATE SCHEDULED_START_DATE,
10898 WDJ.scheduled_completion_date scheduled_end_date
10899 FROM AHL_WORKORDERS WO,WIP_DISCRETE_JOBS WDJ,
10900 WIP_SCHED_RELATIONSHIPS WOR
10901 WHERE WO.WIP_ENTITY_ID = WOR.PARENT_OBJECT_ID
10902 AND WDJ.wip_entity_id = WO.wip_entity_id
10903 AND WO.master_workorder_flag = 'Y'
10904 AND WO.visit_task_id IS NOT NULL
10905 AND WO.status_code <> '22'
10906 AND WOR.parent_object_type_id = 1
10907 AND WOR.relationship_type = 1
10908 AND WOR.child_object_type_id = 1
10909 AND WOR.child_object_id = c_child_wip_entity_id;
10910
10911 l_parent_wo_rec get_parent_workorder%ROWTYPE;
10912
10913 CURSOR get_child_workorders( c_wip_entity_id NUMBER )
10914 IS
10915 SELECT WDJ.wip_entity_id,
10916 WDJ.scheduled_start_date scheduled_start_date,
10917 WDJ.scheduled_completion_date scheduled_end_date,
10918 WO.actual_start_date actual_start_date,
10919 WO.actual_end_date actual_end_date,
10920 WO.status_code status_code
10921 FROM WIP_DISCRETE_JOBS WDJ,
10922 AHL_WORKORDERS WO
10923 WHERE WDJ.wip_entity_id = WO.wip_entity_id
10924 AND WO.status_code <> '22'
10925 AND WO.wip_entity_id in
10926 (
10927 SELECT child_object_id
10928 FROM WIP_SCHED_RELATIONSHIPS
10929 WHERE parent_object_type_id = 1
10930 AND child_object_type_id = 1
10931 AND parent_object_id = c_wip_entity_id
10932 AND relationship_type = 1
10933 );
10934
10935 l_x_prd_workorder_rec AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
10936 l_resource_tbl AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
10937 l_material_tbl AHL_PP_MATERIALS_PVT.req_material_tbl_type;
10938 l_prd_workoper_tbl AHL_PRD_OPERATIONS_PVT.prd_operation_tbl;
10939
10940 l_parent_wo_st_date DATE;
10941 l_parent_wo_end_date DATE;
10942
10943 l_curr_wip_entity_id NUMBER;
10944
10945 l_api_name CONSTANT VARCHAR2(30) := 'Contract_Master_Wo_Dates';
10946 l_msg_data VARCHAR2(2000);
10947 l_return_status VARCHAR2(1);
10948 l_job_return_status VARCHAR2(1);
10949 l_msg_count NUMBER;
10950
10951 BEGIN
10952
10953
10954 OPEN get_curr_wo_details(p_workorder_id);
10955 FETCH get_curr_wo_details INTO l_curr_wip_entity_id;
10956 CLOSE get_curr_wo_details;
10957
10958 IF ( G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)
10959 THEN
10960 fnd_log.string(
10961 G_LEVEL_STATEMENT,
10962 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
10963 'Inside procedure Contract_Master_Wo_Dates first l_curr_wip_entity_id -> '||l_curr_wip_entity_id
10964 );
10965 END IF;
10966
10967 LOOP
10968
10969 OPEN get_parent_workorder(l_curr_wip_entity_id);
10970 FETCH get_parent_workorder INTO l_parent_wo_rec;
10971 CLOSE get_parent_workorder;
10972
10973 IF l_parent_wo_rec.wip_entity_id IS NOT NULL
10974 THEN
10975
10976 FOR child_wo_rec IN get_child_workorders(l_parent_wo_rec.wip_entity_id)
10977 LOOP
10978
10979 l_parent_wo_st_date := LEAST(NVL(l_parent_wo_st_date, child_wo_rec.scheduled_start_date), child_wo_rec.scheduled_start_date);
10980 l_parent_wo_end_date := GREATEST(NVL(l_parent_wo_end_date, child_wo_rec.scheduled_end_date), child_wo_rec.scheduled_end_date);
10981
10982 END LOOP;
10983
10984 IF ( G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)
10985 THEN
10986 fnd_log.string(
10987 G_LEVEL_STATEMENT,
10988 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
10989 'l_curr_wip_entity_id -> '||l_curr_wip_entity_id
10990 );
10991 fnd_log.string(
10992 G_LEVEL_STATEMENT,
10993 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
10994 'l_parent_wo_st_date -> '||TO_CHAR(l_parent_wo_st_date, 'DD-MON-YYYY HH24:MI:SS')
10995 );
10996 fnd_log.string(
10997 G_LEVEL_STATEMENT,
10998 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
10999 'l_parent_wo_end_date -> '||TO_CHAR(l_parent_wo_end_date, 'DD-MON-YYYY HH24:MI:SS')
11000 );
11001 END IF;
11002 IF(L_PARENT_WO_ST_DATE IS NULL)THEN
11003 l_parent_wo_st_date := l_parent_wo_rec.scheduled_start_date;
11004 END IF;
11005
11006 IF(L_PARENT_WO_END_DATE IS NULL)THEN
11007 l_parent_wo_end_date := l_parent_wo_rec.scheduled_end_date;
11008 END IF;
11009
11010 l_x_prd_workorder_rec.workorder_id := l_parent_wo_rec.workorder_id;
11011
11012 default_missing_wo_attributes( p_x_prd_workorder_rec => l_x_prd_workorder_rec);
11013
11014 l_x_prd_workorder_rec.scheduled_start_date := l_parent_wo_st_date;
11015 l_x_prd_workorder_rec.scheduled_start_hr := TO_NUMBER( TO_CHAR( l_parent_wo_st_date, 'HH24' ) );
11016 l_x_prd_workorder_rec.scheduled_start_mi := TO_NUMBER( TO_CHAR( l_parent_wo_st_date, 'MI' ) );
11017
11018
11019 l_x_prd_workorder_rec.scheduled_end_date := l_parent_wo_end_date;
11020 l_x_prd_workorder_rec.scheduled_end_hr := TO_NUMBER( TO_CHAR( l_parent_wo_end_date, 'HH24' ) );
11021 l_x_prd_workorder_rec.scheduled_end_mi := TO_NUMBER( TO_CHAR( l_parent_wo_end_date, 'MI' ) );
11022
11023
11024 INSERT INTO AHL_WORKORDER_TXNS
11025 (
11026 WORKORDER_TXN_ID,
11027 OBJECT_VERSION_NUMBER,
11028 LAST_UPDATE_DATE,
11029 LAST_UPDATED_BY,
11030 CREATION_DATE,
11031 CREATED_BY,
11032 LAST_UPDATE_LOGIN,
11033 WORKORDER_ID,
11034 TRANSACTION_TYPE_CODE,
11035 STATUS_CODE,
11036 SCHEDULED_START_DATE,
11037 SCHEDULED_END_DATE,
11038 ACTUAL_START_DATE,
11039 ACTUAL_END_DATE,
11040 LOT_NUMBER,
11041 COMPLETION_SUBINVENTORY,
11042 COMPLETION_LOCATOR_ID
11043 ) VALUES
11044 (
11045 AHL_WORKORDER_TXNS_S.NEXTVAL,
11046 NVL(l_x_prd_workorder_rec.OBJECT_VERSION_NUMBER,1),
11047 NVL(l_x_prd_workorder_rec.LAST_UPDATE_DATE,SYSDATE),
11048 NVL(l_x_prd_workorder_rec.LAST_UPDATED_BY,FND_GLOBAL.USER_ID),
11049 NVL(l_x_prd_workorder_rec.CREATION_DATE,SYSDATE),
11050 NVL(l_x_prd_workorder_rec.CREATED_BY,FND_GLOBAL.USER_ID),
11051 NVL(l_x_prd_workorder_rec.LAST_UPDATE_LOGIN,FND_GLOBAL.USER_ID),
11052 l_x_prd_workorder_rec.WORKORDER_ID,
11053 0,
11054 l_x_prd_workorder_rec.STATUS_CODE,
11055 l_x_prd_workorder_rec.SCHEDULED_START_DATE,
11056 l_x_prd_workorder_rec.SCHEDULED_END_DATE,
11057 l_x_prd_workorder_rec.ACTUAL_START_DATE,
11058 l_x_prd_workorder_rec.ACTUAL_END_DATE,
11059 0,
11060 l_x_prd_workorder_rec.COMPLETION_SUBINVENTORY,
11061 l_x_prd_workorder_rec.COMPLETION_LOCATOR_ID
11062 );
11063
11064 AHL_EAM_JOB_PVT.update_job_operations
11065 (
11066 p_api_version => 1.0 ,
11067 p_init_msg_list => FND_API.G_TRUE ,
11068 p_commit => FND_API.G_FALSE ,
11069 p_validation_level => FND_API.G_VALID_LEVEL_FULL ,
11070 p_default => FND_API.G_TRUE ,
11071 p_module_type => NULL ,
11072 x_return_status => l_return_status ,
11073 x_msg_count => l_msg_count ,
11074 x_msg_data => l_msg_data ,
11075 p_workorder_rec => l_x_prd_workorder_rec ,
11076 p_operation_tbl => l_prd_workoper_tbl ,
11077 p_material_req_tbl => l_material_tbl ,
11078 p_resource_req_tbl => l_resource_tbl
11079 );
11080
11081 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
11082 RAISE FND_API.G_EXC_ERROR;
11083 END IF;
11084 ELSE
11085
11086 EXIT;
11087
11088 END IF;
11089
11090 l_curr_wip_entity_id := l_parent_wo_rec.wip_entity_id;
11091 l_parent_wo_rec := NULL;
11092
11093 END LOOP;
11094
11095 END Update_Master_Wo_Dates;
11096 -- Fix for Bug # 8329755 (FP for Bug # 7697909) -- end
11097
11098 --apattark start for bug #9075539 to validate visit cancellation
11099
11100 PROCEDURE cancel_visit_validate
11101 (
11102 p_visit_id IN NUMBER,
11103 p_visit_number IN NUMBER,
11104 x_cancel_flag OUT NOCOPY VARCHAR2
11105 )
11106 AS
11107 --allow cancelation if wo status is 1, 3 or 7
11108 --added status '17' for USAF VWPE Enh. Visit can now contain a mix of draft and released/unreleased work orders.
11109 CURSOR wo_status_csr( c_visit_id NUMBER ) IS
11110 select 'x'
11111 from dual
11112 where exists (select 'x' from ahl_workorders
11113 where visit_id = c_visit_id
11114 and status_code NOT IN ('1','3','7', '17')
11115 );
11116
11117 --allow cancelation if no operation is complete
11118 CURSOR op_complete_csr( c_visit_id NUMBER ) IS
11119 select 'x'
11120 from dual
11121 where exists (select 'x'
11122 from ahl_workorders awo, ahl_workorder_operations awop
11123 where awo.workorder_id = awop.workorder_id
11124 and awo.visit_id = c_visit_id
11125 and awop.status_code = '1'
11126 );
11127
11128 --allow cancelation if no parts change txn
11129 CURSOR part_chg_txn_csr( c_visit_id NUMBER ) IS
11130 select 'x'
11131 from dual
11132 where exists (select 'x'
11133 from ahl_workorders awo, ahl_workorder_operations awop, ahl_part_changes apc
11134 where awo.workorder_id = awop.workorder_id
11135 and awop.workorder_operation_id = apc.workorder_operation_id
11136 and awo.visit_id = c_visit_id
11137 );
11138
11139 /* Not required as wo_material_csr and part_chg_txn_csr will cover this
11140 * validation and wo_material_csr applies across the Visit.
11141 CURSOR tracked_material_csr( c_visit_id NUMBER ) IS
11142 select 'x'
11143 from dual
11144 where exists (select 'x'
11145 from ahl_workorders awo, csi_item_instances cii
11146 where awo.wip_entity_id = cii.wip_job_id
11147 and cii.location_type_code = 'WIP'
11148 and cii.ACTIVE_START_DATE <= SYSDATE
11149 and ((cii.ACTIVE_END_DATE IS NULL) OR (cii.ACTIVE_END_DATE >= SYSDATE))
11150 and awo.visit_id = c_visit_id
11151 );
11152 */
11153
11154 --allow cancelation if no resource txns done
11155 CURSOR resource_txn_csr( c_visit_id NUMBER ) IS
11156 select 'x'
11157 from dual
11158 where exists (select 'x'
11159 from ahl_workorders awo, wip_transactions wipt
11160 where awo.wip_entity_id = wipt.wip_entity_id
11161 and awo.visit_id = c_visit_id
11162 UNION ALL
11163 select 'x'
11164 from ahl_workorders awos, wip_COST_TXN_INTERFACE wict
11165 where awos.wip_entity_id = wict.wip_entity_id
11166 and awos.visit_id = c_visit_id
11167 and process_status IN (1,3)
11168 );
11169
11170 --allow cancelation if no item/serial change txns present.
11171 CURSOR item_chg_txn_csr(c_visit_id NUMBER ) IS
11172 SELECT 'x'
11173 FROM dual
11174 WHERE EXISTS
11175 ( SELECT 'X'
11176 FROM csi_transactions cst ,
11177 csi_txn_types cstrntyp,
11178 ahl_workorders awo
11179 WHERE cstrntyp.source_transaction_type = 'ITEM_SERIAL_CHANGE'
11180 AND cst.transaction_type_id = cstrntyp.transaction_type_id
11181 AND cst.source_line_ref = 'AHL_PRD_WO'
11182 AND cst.source_line_ref_id = awo.workorder_id
11183 AND awo.visit_id = c_visit_id
11184 );
11185
11186 --allow cancelation if material have not been returned.
11187 -- check issue txns with return txns.
11188 CURSOR wo_material_csr(c_visit_id NUMBER ) IS
11189 SELECT INVENTORY_ITEM_ID, REVISION, LOT_NUMBER, SERIAL_NUMBER, sum(quantity) quantity
11190 FROM ahl_workorder_mtl_txns amt, ahl_workorder_operations awo, ahl_workorders aw
11191 WHERE aw.visit_id = c_visit_id
11192 and aw.workorder_id = awo.workorder_id
11193 and awo.workorder_operation_id = amt.workorder_operation_id
11194 and TRANSACTION_TYPE_ID = 35
11195 group by INVENTORY_ITEM_ID, REVISION, LOT_NUMBER, SERIAL_NUMBER
11196 MINUS
11197 SELECT INVENTORY_ITEM_ID, REVISION, LOT_NUMBER, SERIAL_NUMBER, sum(quantity) quantity
11198 FROM ahl_workorder_mtl_txns amt, ahl_workorder_operations awo, ahl_workorders aw
11199 WHERE aw.visit_id = c_visit_id
11200 and aw.workorder_id = awo.workorder_id
11201 and awo.workorder_operation_id = amt.workorder_operation_id
11202 and TRANSACTION_TYPE_ID = 43
11203 group by INVENTORY_ITEM_ID, REVISION, LOT_NUMBER, SERIAL_NUMBER;
11204
11205 mtl_rec wo_material_csr%ROWTYPE;
11206 l_dummy VARCHAR2(1);
11207 l_api_name CONSTANT VARCHAR2(30) := 'cancel_visit_validate';
11208 l_inv_segments VARCHAR2(500);
11209
11210 BEGIN
11211 -- initialize
11212 x_cancel_flag := 'Y';
11213
11214 -- check workorder statuses
11215 OPEN wo_status_csr(p_visit_id);
11216 FETCH wo_status_csr INTO l_dummy;
11217 IF wo_status_csr%FOUND THEN
11218 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_WOSTA');
11219 --Visit cancellation is allowed only if the Visit's workorders are in released, unreleased or canceled statuses
11220 Fnd_Message.Set_Token('VISIT',p_visit_number);
11221 Fnd_Msg_Pub.ADD;
11222 x_cancel_flag := 'N';
11223 CLOSE wo_status_csr;
11224 RETURN;
11225 END IF ;
11226 CLOSE wo_status_csr;
11227
11228 OPEN op_complete_csr(p_visit_id);
11229 FETCH op_complete_csr INTO l_dummy;
11230 IF op_complete_csr%FOUND THEN
11231 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_OPCOM');
11232 Fnd_Message.Set_Token('VISIT',p_visit_number);
11233 --At least one operation is complete. Cannot cancel Visit.
11234 Fnd_Msg_Pub.ADD;
11235 x_cancel_flag := 'N';
11236 CLOSE op_complete_csr;
11237 RETURN;
11238 END IF ;
11239 CLOSE op_complete_csr;
11240
11241 OPEN part_chg_txn_csr(p_visit_id);
11242 FETCH part_chg_txn_csr INTO l_dummy;
11243 IF part_chg_txn_csr%FOUND THEN
11244 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_PCHG');
11245 Fnd_Message.Set_Token('VISIT',p_visit_number);
11246 --At least one Parts Change transaction found. Cannot cancel Visit
11247 Fnd_Msg_Pub.ADD;
11248 x_cancel_flag := 'N';
11249 CLOSE part_chg_txn_csr;
11250 RETURN;
11251 END IF ;
11252 CLOSE part_chg_txn_csr;
11253
11254 OPEN wo_material_csr(p_visit_id);
11255 FETCH wo_material_csr INTO mtl_rec;
11256 IF wo_material_csr%FOUND THEN
11257 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_WOMTXN');
11258 --All issued material is not returned. Cannot cancel Visit
11259 Fnd_Message.Set_Token('VISIT',p_visit_number);
11260 -- get inv segments.
11261 BEGIN
11262 SELECT concatenated_segments INTO l_inv_segments
11263 FROM mtl_system_items_kfv
11264 WHERE inventory_item_id = mtl_rec.inventory_item_id
11265 and rownum < 2;
11266
11267 EXCEPTION
11268 WHEN NO_DATA_FOUND THEN
11269 null;
11270 END;
11271
11272 Fnd_Message.Set_Token('INV_ITEM', l_inv_segments);
11273 Fnd_Message.Set_Token('INV_LOT', mtl_rec.lot_number);
11274 Fnd_Message.Set_Token('INV_SERIAL', mtl_rec.serial_number);
11275 Fnd_Message.Set_Token('INV_REV', mtl_rec.revision);
11276 Fnd_Message.Set_Token('QTY', mtl_rec.quantity);
11277 Fnd_Msg_Pub.ADD;
11278 x_cancel_flag := 'N';
11279 CLOSE wo_material_csr;
11280 RETURN;
11281 END IF ;
11282 CLOSE wo_material_csr;
11283
11284 OPEN resource_txn_csr(p_visit_id);
11285 FETCH resource_txn_csr INTO l_dummy;
11286 IF resource_txn_csr%FOUND THEN
11287 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_WORTXN');
11288 --At least one Workorder found with resource transactions. Cannot cancel Visit
11289 Fnd_Message.Set_Token('VISIT',p_visit_number);
11290 Fnd_Msg_Pub.ADD;
11291 x_cancel_flag := 'N';
11292 CLOSE resource_txn_csr;
11293 RETURN;
11294 END IF ;
11295 CLOSE resource_txn_csr;
11296
11297 OPEN item_chg_txn_csr(p_visit_id);
11298 FETCH item_chg_txn_csr INTO l_dummy;
11299 IF item_chg_txn_csr%FOUND THEN
11300 Fnd_Message.SET_NAME('AHL','AHL_PRD_CNT_CANCEL_VST_ITEMTXN');
11301 --At least one Serial Number/ Item Number Change transaction found. Cannot cancel Visit.
11302 Fnd_Message.Set_Token('VISIT',p_visit_number);
11303 Fnd_Msg_Pub.ADD;
11304 x_cancel_flag := 'N';
11305 CLOSE item_chg_txn_csr;
11306 RETURN;
11307 END IF ;
11308 CLOSE item_chg_txn_csr;
11309
11310 END cancel_visit_validate;
11311 --apattark end for bug #9075539 to validate visit cancellation
11312
11313 -- JKJain, ER 9283136
11314 PROCEDURE Unclose_Workorder
11315 (
11316 p_api_version IN NUMBER := 1.0,
11317 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
11318 p_commit IN VARCHAR2 := FND_API.G_FALSE,
11319 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
11320 p_default IN VARCHAR2 := FND_API.G_FALSE,
11321 p_module_type IN VARCHAR2 := NULL,
11322 x_return_status OUT NOCOPY VARCHAR2,
11323 x_msg_count OUT NOCOPY NUMBER,
11324 x_msg_data OUT NOCOPY VARCHAR2,
11325 p_x_prd_workorder_rec IN OUT NOCOPY prd_workorder_rec
11326 )
11327 IS
11328
11329 CURSOR get_workorder_csr(c_workorder_id IN NUMBER)IS
11330 SELECT WORKORDER_ID,
11331 WIP_ENTITY_ID,
11332 OBJECT_VERSION_NUMBER,
11333 JOB_STATUS_CODE,
11334 ORGANIZATION_ID,
11335 CLASS_CODE,
11336 DATE_CLOSED,
11337 DATE_COMPLETED
11338 FROM AHL_WORKORDERS_V
11339 WHERE WORKORDER_ID = c_workorder_id
11340 FOR UPDATE OF JOB_STATUS_CODE;
11341
11342 CURSOR get_closed_mwo_csr(c_wip_entity_id IN NUMBER)IS
11343 SELECT WO.wip_entity_id wip_entity_id,
11344 WO.object_version_number ovn,
11345 WO.STATUS_CODE,
11346 WDJ.ORGANIZATION_ID organization_id,
11347 WDJ.CLASS_CODE class_code,
11348 WDJ.DATE_CLOSED,
11349 --sukhwsin::VEE Changes- included workorder_id
11350 WO.workorder_id
11351 FROM AHL_WORKORDERS WO,
11352 WIP_SCHED_RELATIONSHIPS WOR,
11353 WIP_DISCRETE_JOBS WDJ
11354 WHERE WO.wip_entity_id = WOR.parent_object_id
11355 AND WDJ.wip_entity_id = WO.wip_entity_id
11356 AND WO.master_workorder_flag = 'Y'
11357 AND WO.status_code = G_JOB_STATUS_CLOSED
11358 AND WOR.parent_object_type_id = 1
11359 AND WOR.relationship_type = 1
11360 AND WOR.child_object_type_id = 1
11361 START WITH WOR.child_object_id = c_wip_entity_id
11362 AND WOR.relationship_type = 1
11363 CONNECT BY WOR.child_object_id = PRIOR WOR.parent_object_id
11364 FOR UPDATE OF WO.STATUS_CODE,WDJ.DATE_CLOSED ;
11365
11366
11367
11368 l_api_name VARCHAR2(30) := 'Unclose_Workorder';
11369 l_api_version NUMBER := 1.0;
11370 l_function_name VARCHAR2(30 ):= 'AHL_PRD_UNCLOSE_WORKORDERS';
11371 l_workorder_id NUMBER;
11372 l_wip_entity_id NUMBER;
11373 l_obj_ver_no NUMBER;
11374 l_job_status_code VARCHAR2(30);
11375 l_organization_id NUMBER;
11376 l_class_code VARCHAR2(10);
11377 l_date_closed DATE;
11378 l_date_completed DATE;
11379 l_msg_data VARCHAR2(2000);
11380 l_return_status VARCHAR2(1);
11381 l_msg_count NUMBER;
11382 l_prd_workoper_tbl AHL_PRD_WORKORDER_PVT.prd_workoper_tbl;
11383 l_user_associated VARCHAR2(30);
11384
11385 BEGIN
11386
11387 IF (G_LEVEL_PROCEDURE >= G_CURRENT_LOG_LEVEL)THEN
11388 fnd_log.string(
11389 G_LEVEL_PROCEDURE,
11390 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11391 'At Begin of the Procedure Unclose_Workorder'
11392 );
11393 END IF;
11394
11395 -- Standard start of API savepoint
11396 SAVEPOINT Unclose_Workorder_PVT;
11397
11398 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
11399
11400 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
11401 p_api_version,
11402 l_api_name,G_PKG_NAME)
11403 THEN
11404 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11405 END IF;
11406
11407 -- User Hooks
11408 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'UPDATE_JOB', 'B', 'C' )) THEN
11409 ahl_prd_workorder_CUHK.update_job_pre(
11410 p_prd_workorder_rec => p_x_prd_workorder_rec,
11411 p_prd_workoper_tbl => l_prd_workoper_tbl,
11412 x_msg_count => l_msg_count,
11413 x_msg_data => l_msg_data,
11414 x_return_status => l_return_status);
11415 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
11416 RAISE FND_API.G_EXC_ERROR;
11417 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
11418 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11419 END IF;
11420 END IF;
11421
11422
11423 -- Initialize message list if p_init_msg_list is set to TRUE.
11424 IF FND_API.to_boolean(p_init_msg_list) THEN
11425 FND_MSG_PUB.initialize;
11426 END IF;
11427
11428 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
11429 fnd_log.string(
11430 G_LEVEL_STATEMENT,
11431 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11432 'Before Basic Validations for the procedure.'
11433 );
11434 END IF;
11435
11436 OPEN get_workorder_csr(p_x_prd_workorder_rec.workorder_id);
11437 FETCH get_workorder_csr INTO l_workorder_id ,
11438 l_wip_entity_id ,
11439 l_obj_ver_no ,
11440 l_job_status_code ,
11441 l_organization_id ,
11442 l_class_code ,
11443 l_date_closed ,
11444 l_date_completed ;
11445 CLOSE get_workorder_csr;
11446
11447 --User associated with Unclosing Workorder Function
11448
11449 l_user_associated := AHL_UTIL_PKG.Get_User_Role(l_function_name);
11450
11451 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
11452 fnd_log.string(
11453 G_LEVEL_STATEMENT,
11454 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11455 ' Present Status l_job_status_code = '|| l_job_status_code ||
11456 'AHL_UTIL_PKG.Get_User_Role(AHL_PRD_UNCLOSE_WORKORDERS) = '|| l_user_associated
11457 );
11458 END IF;
11459
11460 IF (l_user_associated IS NULL OR (l_function_name <> l_user_associated)) THEN
11461 FND_MESSAGE.Set_Name('AHL','AHL_PP_USER_NOT_FN_UNCLOSE');
11462 FND_MSG_PUB.ADD;
11463 RAISE FND_API.G_EXC_ERROR;
11464 END IF;
11465
11466 IF (l_job_status_code <> G_JOB_STATUS_CLOSED) THEN
11467 FND_MESSAGE.Set_Name('AHL','AHL_PP_UNCLOSE_ONLY_CLOSED');
11468 FND_MSG_PUB.ADD;
11469 RAISE FND_API.G_EXC_ERROR;
11470 END IF;
11471
11472 IF (l_date_completed IS NULL) THEN
11473 FND_MESSAGE.Set_Name('AHL','AHL_PP_JOB_CANTBE_UNCLOSE');
11474 FND_MSG_PUB.ADD;
11475 RAISE FND_API.G_EXC_ERROR;
11476 END IF;
11477
11478 IF(p_x_prd_workorder_rec.object_version_number IS NULL OR p_x_prd_workorder_rec.object_version_number <> l_obj_ver_no)THEN
11479 FND_MESSAGE.SET_NAME('AHL','AHL_COM_RECORD_CHANGED');
11480 FND_MSG_PUB.ADD;
11481 RAISE FND_API.G_EXC_ERROR;
11482 END IF;
11483
11484 IF(p_x_prd_workorder_rec.STATUS_CODE IS NULL OR p_x_prd_workorder_rec.STATUS_CODE <> G_JOB_STATUS_COMPLETE)THEN
11485 FND_MESSAGE.SET_NAME('AHL','AHL_PP_ONLY_UNCLOSE_TO_COMP');
11486 FND_MSG_PUB.ADD;
11487 RAISE FND_API.G_EXC_ERROR;
11488 END IF;
11489
11490 -- After Validations
11491
11492 IF(WIP_CLOSE_UTILITIES.Unclose_Job(l_wip_entity_id,l_organization_id,l_class_code) = 1) THEN
11493
11494 -- Fetching MWOs in closed status of this WO.
11495 FOR mwo_rec in get_closed_mwo_csr(l_wip_entity_id)
11496 LOOP
11497 IF(WIP_CLOSE_UTILITIES.Unclose_Job(mwo_rec.wip_entity_id,mwo_rec.organization_id,mwo_rec.class_code) = 1) THEN
11498
11499 UPDATE wip_discrete_jobs
11500 SET date_closed = NULL,
11501 status_type = G_JOB_STATUS_COMPLETE
11502 WHERE organization_id = mwo_rec.organization_id
11503 AND WIP_ENTITY_ID = mwo_rec.wip_entity_id;
11504
11505 --sukhwsin::VEE - enhancement for insertion of wo status change - starts
11506 ADD_WO_OPER_TURNOVER_NOTES
11507 (
11508 p_workorder_id => mwo_rec.workorder_id,
11509 p_new_status_code => G_JOB_STATUS_COMPLETE,
11510 p_validation_level => p_validation_level,
11511 p_default => p_default,
11512 p_module_type => p_module_type,
11513 x_return_status => l_return_status
11514 );
11515 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
11516 RAISE FND_API.G_EXC_ERROR;
11517 END IF;
11518 --sukhwsin::VEE - enhancement for insertion of wo status change - ends
11519
11520 UPDATE ahl_workorders
11521 SET status_code = G_JOB_STATUS_COMPLETE,
11522 object_version_number = mwo_rec.ovn+1
11523 WHERE wip_entity_id = mwo_rec.wip_entity_id;
11524
11525 ELSE
11526 FND_MESSAGE.SET_NAME('AHL','AHL_PP_CANT_UNCLOSE_WO');
11527 FND_MSG_PUB.ADD;
11528 RAISE FND_API.G_EXC_ERROR;
11529 END IF;
11530 END LOOP;
11531
11532 -- After Unclosing all the MWO to Status Complete
11533
11534 UPDATE wip_discrete_jobs
11535 SET date_closed = NULL,
11536 status_type = G_JOB_STATUS_COMPLETE
11537 WHERE organization_id = l_organization_id
11538 AND WIP_ENTITY_ID = l_wip_entity_id;
11539
11540 --sukhwsin::VEE - enhancement for insertion of wo status change - starts
11541 ADD_WO_OPER_TURNOVER_NOTES
11542 (
11543 p_workorder_id => l_workorder_id,
11544 p_new_status_code => G_JOB_STATUS_COMPLETE,
11545 p_validation_level => p_validation_level,
11546 p_default => p_default,
11547 p_module_type => p_module_type,
11548 x_return_status => l_return_status
11549 );
11550 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
11551 RAISE FND_API.G_EXC_ERROR;
11552 END IF;
11553 --sukhwsin::VEE - enhancement for insertion of wo status change - ends
11554
11555 UPDATE ahl_workorders
11556 SET status_code = G_JOB_STATUS_COMPLETE,
11557 object_version_number = l_obj_ver_no+1
11558 WHERE wip_entity_id = l_wip_entity_id;
11559
11560 ELSE
11561 FND_MESSAGE.SET_NAME('AHL','AHL_PP_CANT_UNCLOSE_WO');
11562 FND_MSG_PUB.ADD;
11563 RAISE FND_API.G_EXC_ERROR;
11564 END IF;
11565
11566
11567 -- User Hooks
11568 IF (JTF_USR_HKS.Ok_to_execute('AHL_PRD_WORKORDER_PVT', 'UPDATE_JOB', 'A', 'C' )) THEN
11569
11570 ahl_prd_workorder_CUHK.update_job_post(
11571 p_prd_workorder_rec => p_x_prd_workorder_rec,
11572 p_prd_workoper_tbl => l_prd_workoper_tbl,
11573 x_msg_count => l_msg_count,
11574 x_msg_data => l_msg_data,
11575 x_return_status => l_return_status);
11576
11577 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
11578 RAISE FND_API.G_EXC_ERROR;
11579 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
11580 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11581 END IF;
11582 END IF;
11583
11584 IF (G_LEVEL_PROCEDURE >= G_CURRENT_LOG_LEVEL)THEN
11585 fnd_log.string(
11586 G_LEVEL_PROCEDURE,
11587 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11588 'At END of the Procedure Unclose_Workorder'
11589 );
11590 END IF;
11591
11592 IF FND_API.to_boolean(p_commit) THEN
11593 COMMIT;
11594 END IF;
11595
11596 EXCEPTION
11597 WHEN FND_API.G_EXC_ERROR THEN
11598 x_return_status := FND_API.G_RET_STS_ERROR;
11599 Rollback to Unclose_Workorder_PVT;
11600 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
11601 p_data => x_msg_data,
11602 p_encoded => fnd_api.g_false);
11603
11604 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
11605 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11606 Rollback to Unclose_Workorder_PVT;
11607 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
11608 p_data => x_msg_data,
11609 p_encoded => fnd_api.g_false);
11610
11611 WHEN OTHERS THEN
11612 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11613 Rollback to Unclose_Workorder_PVT;
11614 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
11615 p_procedure_name => 'Unclose_Workorder',
11616 p_error_text => SQLERRM);
11617 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
11618 p_data => x_msg_data,
11619 p_encoded => fnd_api.g_false);
11620
11621 END unclose_workorder;
11622
11623 -- added for ER 9368251
11624 PROCEDURE expand_mwo_dates(p_workorder_id IN NUMBER,
11625 p_visit_id IN NUMBER)
11626 IS
11627
11628 CURSOR get_visit_wo_dates_csr(p_visit_id IN NUMBER)
11629 IS
11630 SELECT WIP.WIP_ENTITY_ID,
11631 WIP.SCHEDULED_START_DATE,
11632 WIP.SCHEDULED_COMPLETION_DATE SCHEDULED_END_DATE
11633 FROM AHL_WORKORDERS AWO,
11634 WIP_DISCRETE_JOBS WIP
11635 WHERE AWO.VISIT_ID = p_visit_id
11636 AND AWO.VISIT_TASK_ID IS NULL
11637 AND AWO.MASTER_WORKORDER_FLAG = 'Y'
11638 AND AWO.WIP_ENTITY_ID = WIP.WIP_ENTITY_ID
11639 AND AWO.STATUS_CODE NOT IN ('22', '7');
11640
11641 get_visit_wo_dates_rec get_visit_wo_dates_csr%rowtype;
11642
11643 -- get parent master workorders
11644 CURSOR get_parent_wos_csr(p_workorder_id IN NUMBER) IS
11645 SELECT DISTINCT CWO.workorder_id workorder_id,
11646 CWO.object_version_number object_version_number,
11647 CWO.wip_entity_id wip_entity_id,
11648 CWO.status_code status_code,
11649 CWO.visit_task_id,
11650 WIP.SCHEDULED_START_DATE,
11651 WIP.SCHEDULED_COMPLETION_DATE SCHEDULED_END_DATE,
11652 level
11653 FROM AHL_WORKORDERS CWO,
11654 WIP_SCHED_RELATIONSHIPS REL,
11655 WIP_DISCRETE_JOBS WIP
11656 WHERE CWO.wip_entity_id = REL.parent_object_id
11657 AND CWO.wip_entity_id = WIP.WIP_ENTITY_ID
11658 AND CWO.master_workorder_flag = 'Y'
11659 AND REL.parent_object_type_id = 1
11660 AND REL.child_object_type_id = 1
11661 START WITH REL.child_object_id IN (select wos.wip_entity_id
11662 from ahl_workorders wos
11663 where wos.workorder_id = p_workorder_id)
11664 AND REL.relationship_type = 1
11665 CONNECT BY REL.child_object_id = PRIOR REL.parent_object_id
11666 AND REL.relationship_type = 1
11667 ORDER BY level DESC,workorder_id asc;
11668
11669 l_wo_rec get_parent_wos_csr%ROWTYPE;
11670 l_prd_workorder_tbl PRD_WORKORDER_TBL;
11671 l_prd_workorder_rel_tbl PRD_WORKORDER_REL_TBL;
11672 i NUMBER;
11673 l_msg_count NUMBER;
11674 l_msg_data VARCHAR2(2000);
11675 l_return_status VARCHAR2(1);
11676 l_api_name VARCHAR2(40) := 'Expand_MWO_Dates';
11677
11678 BEGIN
11679 -- get visit workorder dates.
11680 OPEN get_visit_wo_dates_csr(p_visit_id);
11681 FETCH get_visit_wo_dates_csr INTO get_visit_wo_dates_rec;
11682 IF (get_visit_wo_dates_csr%FOUND) THEN
11683 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL) THEN
11684 fnd_log.string(
11685 G_LEVEL_STATEMENT,
11686 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11687 ' Visit dates:Start Date:' || to_char(get_visit_wo_dates_rec.scheduled_start_date,'mm/dd/yyyy hh24:ss')
11688 || ': end date:' || to_char(get_visit_wo_dates_rec.scheduled_end_date, 'mm/dd/yyyy hh24:ss')
11689 );
11690 END IF;
11691
11692 i := 1;
11693
11694 FOR l_wo_rec IN get_parent_wos_csr(p_workorder_id) LOOP
11695 IF (l_wo_rec.visit_TASK_ID IS NOT NULL) THEN
11696 l_prd_workorder_tbl(i).SCHEDULED_START_DATE := l_wo_rec.scheduled_start_date;
11697 l_prd_workorder_tbl(i).SCHEDULED_END_DATE := get_visit_wo_dates_rec.scheduled_end_date;
11698 l_prd_workorder_tbl(i).BATCH_ID := get_visit_wo_dates_rec.wip_entity_id;
11699 l_prd_workorder_tbl(i).HEADER_ID := l_wo_rec.wip_entity_id;
11700 --l_prd_workorder_tbl(i).HEADER_ID := get_visit_wo_dates_rec.wip_entity_id;
11701 l_prd_workorder_tbl(i).DML_OPERATION := 'U';
11702 l_prd_workorder_tbl(i).WORKORDER_ID := l_wo_rec.workorder_id;
11703 l_prd_workorder_tbl(i).OBJECT_VERSION_NUMBER := l_wo_rec.object_version_number;
11704 l_prd_workorder_tbl(i).STATUS_CODE := l_wo_rec.status_code;
11705
11706 l_prd_workorder_tbl(i).FIRM_PLANNED_FLAG := 2; -- planned.
11707
11708 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL) THEN
11709 fnd_log.string(
11710 G_LEVEL_STATEMENT,
11711 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11712 'MWO: ' || i || ':workorder_id:' || l_wo_rec.workorder_id || ':level:' || l_wo_rec.level
11713 );
11714 END IF;
11715
11716 i := i + 1;
11717 END IF;
11718
11719 END LOOP;
11720 IF (l_prd_workorder_tbl.count > 0) THEN
11721 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL) THEN
11722 fnd_log.string(
11723 G_LEVEL_STATEMENT,
11724 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11725 'Before call to process jobs:Count:' || l_prd_workorder_tbl.count
11726 );
11727 END IF;
11728 process_jobs
11729 (
11730 p_api_version => 1.0,
11731 p_init_msg_list => FND_API.G_TRUE,
11732 p_commit => FND_API.G_FALSE,
11733 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
11734 p_default => FND_API.G_TRUE,
11735 p_module_type => NULL,
11736 x_return_status => l_return_status,
11737 x_msg_count => l_msg_count,
11738 x_msg_data => l_msg_data,
11739 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
11740 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
11741 );
11742
11743 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11744 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL) THEN
11745 fnd_log.string( G_LEVEL_STATEMENT,
11746 'ahl.plsql.'||g_pkg_name||'.'||l_api_name ,
11747 'Process_Jobs return status:msg count:' || l_return_status || ':' || l_msg_count
11748 );
11749 END IF;
11750 RAISE Fnd_Api.g_exc_error;
11751 END IF;
11752 END IF; -- l_prd_workorder_tbl.count
11753 END IF; -- get_visit_wo_dates_csr
11754 CLOSE get_visit_wo_dates_csr;
11755
11756 END expand_mwo_dates;
11757
11758 -- STHILAK Project Integration ER - Begin
11759 PROCEDURE Synch_Wo_Projtask_Times(
11760 errbuf OUT NOCOPY VARCHAR2,
11761 retcode OUT NOCOPY NUMBER,
11762 p_api_version IN NUMBER,
11763 p_visit_id IN NUMBER,
11764 p_organization_id IN NUMBER,
11765 p_department_id IN NUMBER
11766 )
11767 IS
11768
11769 -- Cursor for retrieving all work orders of a visit
11770 CURSOR c_get_visit_wos(p_visit_id IN NUMBER)
11771 IS
11772 SELECT
11773 awo.workorder_id,
11774 awo.object_version_number,
11775 -- STHILAK :: FP:Bug 9186962
11776 -- Fetch visit task id also
11777 awo.visit_task_id
11778 FROM
11779 ahl_workorders awo,
11780 ahl_visits_b vst
11781 WHERE
11782 awo.visit_id = vst.visit_id
11783 AND vst.status_code not in ('CANCELLED', 'DELETED')
11784 AND vst.visit_id = p_visit_id
11785 order by visit_task_id desc; -- VWP expects visit master work order to be the first wo in table.
11786
11787 -- Cursor for retrieving Visits given
11788 -- 1. only organization id
11789 -- 2. organization id and department id
11790 -- 3. Neither of organization and department.
11791 CURSOR c_get_visits(p_organization_id IN NUMBER, p_department_id IN NUMBER)
11792 IS
11793 SELECT
11794 vst.visit_id
11795 FROM
11796 ahl_visits_b vst
11797 WHERE
11798 vst.status_code not in ('CANCELLED', 'DELETED', 'DRAFT')
11799 AND vst.department_id = nvl(p_department_id, vst.department_id)
11800 AND vst.organization_id = nvl(p_organization_id, vst.organization_id);
11801
11802 -- Local variables section
11803 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
11804 l_wo_count NUMBER;
11805 l_msg_count NUMBER;
11806 l_msg_data VARCHAR2(2000);
11807 l_return_status VARCHAR2(1);
11808 l_api_version NUMBER := 1.0;
11809 l_api_name VARCHAR2(30) := 'Synch_Wo_Projtask_Times';
11810 l_err_msg VARCHAR2(2000);
11811
11812 BEGIN
11813
11814 --fnd_global.APPS_INITIALIZE(fnd_global.USER_ID, 62211, 867);
11815 --mo_global.init('AHL');
11816
11817 -- 1. Initialize error message stack by default
11818 FND_MSG_PUB.Initialize;
11819
11820 -- Standard call to check for call compatibility
11821 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME)
11822 THEN
11823 retcode := 2;
11824 errbuf := FND_MSG_PUB.Get;
11825
11826 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11827 END IF;
11828
11829 -- 2. Dump all input parameters
11830 fnd_file.put_line(fnd_file.log, '************* Synch_Wo_Projtask_Times : API input parameters**************');
11831 fnd_file.put_line(fnd_file.log, 'p_visit_id -> '|| p_visit_id);
11832 fnd_file.put_line(fnd_file.log, 'p_organization_id -> '||p_organization_id);
11833 fnd_file.put_line(fnd_file.log, 'p_department_id -> '|| p_department_id);
11834 fnd_file.put_line(fnd_file.log, 'fnd_global.USER_ID -> '|| fnd_global.USER_ID);
11835 fnd_file.put_line(fnd_file.log, 'fnd_global.RESP_ID -> '||fnd_global.RESP_ID);
11836 fnd_file.put_line(fnd_file.log, 'fnd_global.PROG_APPL_ID -> '|| fnd_global.PROG_APPL_ID);
11837 fnd_file.put_line(fnd_file.log, 'mo_global.get_current_org_id -> '|| mo_global.get_current_org_id());
11838
11839 l_wo_count := 0;
11840
11841 -- 3. Only visit number is passed
11842 IF
11843 p_visit_id IS NOT NULL
11844 THEN
11845 FOR c_wo_rec IN c_get_visit_wos(p_visit_id)
11846 LOOP
11847 l_prd_workorder_tbl(l_wo_count).workorder_id := c_wo_rec.workorder_id;
11848 l_prd_workorder_tbl(l_wo_count).object_version_number := c_wo_rec.object_version_number;
11849 -- STHILAK :: FP:Bug 9186962
11850 -- Pass visit task id also
11851 l_prd_workorder_tbl(l_wo_count).visit_task_id := c_wo_rec.visit_task_id;
11852 l_wo_count := l_wo_count + 1;
11853 END LOOP;
11854
11855 fnd_file.put_line(fnd_file.log, 'before calling AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times');
11856 fnd_file.put_line(fnd_file.log, 'visit_id -> '||p_visit_id);
11857 fnd_file.put_line(fnd_file.log, 'total no of work orders -> '||l_prd_workorder_tbl.count);
11858
11859 -- 7. Call AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times to synchronize work order
11860 -- schedule times with project taks times.
11861 -- fnd_file.put_line(fnd_file.log,'HERE GOES THE CALL TO API AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times');
11862 AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times(
11863 p_prd_workorder_tbl => l_prd_workorder_tbl,
11864 p_commit => Fnd_Api.G_TRUE,
11865 x_return_status => l_return_status,
11866 x_msg_count => l_msg_count,
11867 x_msg_data => l_msg_data
11868 );
11869
11870 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
11871
11872 fnd_file.put_line(fnd_file.log, 'Following error occured while synchronizing task times..');
11873
11874 retcode := 2; -- error!!
11875
11876 LOOP
11877 l_err_msg := FND_MSG_PUB.GET;
11878 IF l_err_msg IS NULL
11879 THEN
11880 EXIT;
11881 END IF;
11882 fnd_file.put_line(fnd_file.log, l_err_msg);
11883 END LOOP;
11884
11885 END IF;
11886
11887 ELSE
11888 -- 4. Visit number is not passed but
11889 -- organization and department names are passed or
11890 -- organization is passed or
11891 -- no parameters were passed
11892 FOR c_visit_rec IN c_get_visits(p_organization_id, p_department_id)
11893 LOOP
11894 l_wo_count := 0;
11895
11896 FOR c_wo_rec IN c_get_visit_wos(c_visit_rec.visit_id)
11897 LOOP
11898 l_prd_workorder_tbl(l_wo_count).workorder_id := c_wo_rec.workorder_id;
11899 l_prd_workorder_tbl(l_wo_count).object_version_number := c_wo_rec.object_version_number;
11900 -- STHILAK :: FP:Bug 9186962
11901 -- Pass visit task id also
11902 l_prd_workorder_tbl(l_wo_count).visit_task_id := c_wo_rec.visit_task_id;
11903 l_wo_count := l_wo_count + 1;
11904 END LOOP;
11905
11906 fnd_file.put_line(fnd_file.log, 'before calling AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times');
11907 fnd_file.put_line(fnd_file.log, 'visit_id -> '||c_visit_rec.visit_id);
11908 fnd_file.put_line(fnd_file.log, 'total no of work orders -> '||l_prd_workorder_tbl.count);
11909
11910 -- 7. Call AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times to synchronize work order
11911 -- schedule times with project taks times.
11912 -- fnd_file.put_line(fnd_file.log,'HERE GOES THE CALL TO API AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times');
11913 AHL_VWP_PROJ_PROD_PVT.Update_Project_Task_Times(
11914 p_prd_workorder_tbl => l_prd_workorder_tbl,
11915 p_commit => Fnd_Api.G_TRUE,
11916 x_return_status => l_return_status,
11917 x_msg_count => l_msg_count,
11918 x_msg_data => l_msg_data
11919 );
11920
11921 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
11922
11923 fnd_file.put_line(fnd_file.log, 'Following error occured while synchronizing task times..');
11924
11925 retcode := 2; -- error!!
11926
11927 LOOP
11928 l_err_msg := FND_MSG_PUB.GET;
11929 IF l_err_msg IS NULL
11930 THEN
11931 EXIT;
11932 END IF;
11933 fnd_file.put_line(fnd_file.log, l_err_msg);
11934 END LOOP;
11935
11936 END IF;
11937
11938 END LOOP;
11939
11940 END IF;
11941
11942
11943
11944
11945 END Synch_Wo_Projtask_Times;
11946 -- Project Integration ER - End
11947
11948 -- ER#10257011 Supplier Warranty manisaga -- start
11949 PROCEDURE populate_entitlements(
11950 p_api_version IN NUMBER := 1.0,
11951 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
11952 p_commit IN VARCHAR2 := FND_API.G_FALSE,
11953 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
11954 p_contract_number IN NUMBER,
11955 p_warranty_entl_rec IN OUT NOCOPY AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Rec_Type,
11956 p_user_role IN VARCHAR2,
11957 x_return_status OUT NOCOPY VARCHAR2,
11958 x_msg_count OUT NOCOPY NUMBER,
11959 x_msg_data OUT NOCOPY VARCHAR2
11960 )
11961 AS
11962 l_api_name CONSTANT VARCHAR2(30) := 'populate_entitlements';
11963 l_api_version CONSTANT NUMBER := 1.0;
11964 l_msg_count NUMBER;
11965 l_msg_data VARCHAR2(2000);
11966 l_return_status VARCHAR2(1);
11967 l_warranty_entl_tbl AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type;
11968 l_dirty_flag VARCHAR2(1) := 'Y';
11969 l_entl_status VARCHAR2(30);
11970 l_contract_id NUMBER;
11971
11972
11973 l_debug_module CONSTANT VARCHAR2(100) := 'ahl.plsql.AHL_PRD_WORKORDER_PVT.POPULATE_ENTITLEMENTS';
11974
11975 CURSOR get_contract_id ( c_contract_number NUMBER, c_visit_task_id NUMBER) IS
11976 SELECT WARRANTY_CONTRACT_ID
11977 FROM AHL_WARRANTY_CONTRACTS_B AWCB,
11978 AHL_VISITS_B VST,
11979 AHL_VISIT_TASKS_B VTS
11980 WHERE VTS.VISIT_TASK_ID = c_visit_task_id
11981 AND VTS.VISIT_ID = VST.VISIT_ID
11982 AND NVL(VTS.INSTANCE_ID,VST.ITEM_INSTANCE_ID) = AWCB.ITEM_INSTANCE_ID
11983 AND CONTRACT_STATUS_CODE = 'ACTIVE'
11984 AND CONTRACT_NUMBER = c_contract_number;
11985
11986 CURSOR get_old_entl_details(c_visit_task_id NUMBER) IS
11987 SELECT ENTITLEMENT_STATUS_CODE,
11988 WARRANTY_CONTRACT_ID
11989 FROM AHL_WARRANTY_ENTITLEMENTS
11990 where VISIT_TASK_ID = c_visit_task_id;
11991
11992 CURSOR get_sr_incident_id(c_visit_task_id NUMBER) IS
11993 SELECT service_request_id
11994 FROM AHL_VISIT_TASKS_B
11995 WHERE TASK_TYPE_CODE = 'PLANNED'
11996 AND MR_ROUTE_ID IS NULL;
11997
11998 BEGIN
11999 SAVEPOINT populate_entitlements_pvt;
12000
12001 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,p_api_version,l_api_name,G_PKG_NAME) THEN
12002 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12003 END IF;
12004
12005 IF FND_API.to_boolean(p_init_msg_list) THEN
12006 FND_MSG_PUB.initialize;
12007 END IF;
12008
12009 x_return_status:=FND_API.G_RET_STS_SUCCESS;
12010
12011 IF G_DEBUG='Y' THEN
12012 AHL_DEBUG_PUB.enable_debug;
12013 END IF;
12014
12015 IF ( G_DEBUG = 'Y' ) THEN
12016 AHL_DEBUG_PUB.debug( l_api_name || ' - At Start of Populate Entitlement API' );
12017 END IF;
12018
12019 -- Get the error message count till this point
12020 l_msg_count := FND_MSG_PUB.count_msg;
12021
12022 IF p_contract_number <> FND_API.G_MISS_NUM AND p_contract_number IS NOT NULL THEN
12023 OPEN get_contract_id (p_contract_number, p_warranty_entl_rec.visit_task_id);
12024 FETCH get_contract_id INTO p_warranty_entl_rec.warranty_contract_id;
12025 CLOSE get_contract_id;
12026 IF p_warranty_entl_rec.warranty_contract_id is NULL THEN
12027 FND_MESSAGE.set_name('AHL','AHL_WARRANTY_INVALID_CNTR_NUM');
12028 FND_MESSAGE.set_token('CNTR_NUM', p_contract_number);
12029 FND_MSG_PUB.add;
12030 RAISE FND_API.G_EXC_ERROR;
12031 END IF;
12032 END IF;
12033
12034 IF p_contract_number = FND_API.G_MISS_NUM THEN
12035 p_warranty_entl_rec.warranty_contract_id := FND_API.G_MISS_NUM;
12036 END IF;
12037
12038 IF p_warranty_entl_rec.warranty_entitlement_id IS NULL THEN
12039 IF(p_warranty_entl_rec.ENTITLEMENT_STATUS_CODE <> 'NOT_APPLICABLE') THEN
12040 p_warranty_entl_rec.operation_flag := AHL_WARRANTY_ENTL_PVT.G_OP_CREATE;
12041 END IF;
12042 ELSE
12043 p_warranty_entl_rec.operation_flag := AHL_WARRANTY_ENTL_PVT.G_OP_UPDATE;
12044 END IF;
12045
12046 IF p_warranty_entl_rec.operation_flag = AHL_WARRANTY_ENTL_PVT.G_OP_UPDATE THEN
12047 OPEN get_old_entl_details(p_warranty_entl_rec.visit_task_id);
12048 FETCH get_old_entl_details into l_entl_status,l_contract_id;
12049 CLOSE get_old_entl_details;
12050
12051 IF l_entl_status = p_warranty_entl_rec.ENTITLEMENT_STATUS_CODE THEN
12052 IF l_entl_status = 'NOT_APPLICABLE' THEN
12053 l_dirty_flag := 'N';
12054 ELSIF l_entl_status = 'APPROVED' AND l_contract_id = p_warranty_entl_rec.warranty_contract_id THEN
12055 l_dirty_flag := 'N';
12056 END IF;
12057 END IF;
12058 END IF;
12059
12060 IF p_warranty_entl_rec.operation_flag is NOT NULL AND l_dirty_flag = 'Y' THEN
12061
12062 OPEN get_sr_incident_id(p_warranty_entl_rec.visit_task_id);
12063 FETCH get_sr_incident_id into p_warranty_entl_rec.sr_incident_id;
12064 close get_sr_incident_id;
12065
12066 l_warranty_entl_tbl(0) := p_warranty_entl_rec;
12067
12068 AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements(
12069 p_api_version => 1.0,
12070 p_init_msg_list => p_init_msg_list,
12071 p_commit => FND_API.G_FALSE,
12072 p_validation_level => p_validation_level,
12073 p_module_type => NULL,
12074 p_user_role => p_user_role,
12075 p_appr_action => NULL,
12076 p_x_warranty_entl_tbl => l_warranty_entl_tbl,
12077 x_return_status => l_return_status,
12078 x_msg_count => x_msg_count,
12079 x_msg_data => x_msg_data
12080 );
12081
12082 IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
12083 RAISE FND_API.G_EXC_ERROR;
12084 END IF;
12085 END IF;
12086
12087 IF ( G_DEBUG = 'Y' ) THEN
12088 AHL_DEBUG_PUB.debug( l_api_name || ' - Success' );
12089 END IF;
12090
12091 IF G_DEBUG='Y' THEN
12092 AHL_DEBUG_PUB.disable_debug;
12093 END IF;
12094
12095 EXCEPTION
12096 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12097 ROLLBACK TO populate_entitlements_pvt;
12098 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12099 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12100 p_count => x_msg_count,
12101 p_data => x_msg_data);
12102 WHEN FND_API.G_EXC_ERROR THEN
12103 ROLLBACK TO populate_entitlements_pvt;
12104 x_return_status := FND_API.G_RET_STS_ERROR;
12105 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12106 p_count => x_msg_count,
12107 p_data => x_msg_data);
12108
12109 WHEN OTHERS THEN
12110 ROLLBACK TO populate_entitlements_pvt;
12111 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12112 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
12113 FND_MSG_PUB.add_exc_msg(p_pkg_name =>g_pkg_name,
12114 p_procedure_name =>l_api_name,
12115 p_error_text =>SUBSTRB(SQLERRM,1,240));
12116 END IF;
12117
12118 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12119 p_count => x_msg_count,
12120 p_data => x_msg_data);
12121 END populate_entitlements;
12122 -- ER#10257011 Supplier Warranty manisaga -- end
12123 --sukhwsin::VEE Enhancement - Added following procedure for checking wo/op status change and inserting turnover notes.
12124 PROCEDURE ADD_WO_OPER_TURNOVER_NOTES
12125 (
12126 p_workorder_id IN NUMBER := NULL,
12127 p_workorder_op_id IN NUMBER := NULL,
12128 p_new_status_code IN VARCHAR2,
12129 --sukhwsin::Bug 12915297. Added new nullable parameter for hold reason.
12130 p_hold_reason_code IN VARCHAR2 := NULL,
12131 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
12132 p_default IN VARCHAR2 := FND_API.G_FALSE,
12133 p_module_type IN VARCHAR2 := Null,
12134 x_return_status OUT NOCOPY VARCHAR2
12135 ) IS
12136 --Cursor to Get Current login user's employee name and employee id
12137 CURSOR Get_Emp_Name_And_Id(c_organization_id NUMBER) IS
12138 SELECT distinct pf.full_name emp_name, pf.employee_id
12139 FROM mtl_employees_current_view pf, bom_resource_employees bre, fnd_user fu
12140 WHERE pf.employee_id=bre.person_id
12141 and pf.organization_id = bre.organization_id
12142 and sysdate between BRE.EFFECTIVE_START_DATE and BRE.EFFECTIVE_END_DATE
12143 and FU.employee_id = pf.employee_id
12144 and pf.organization_id= c_organization_id
12145 and fu.user_id = fnd_global.user_id;
12146 --Cursor to get lookup meaning against code and type
12147 CURSOR Get_Lkp_Meaning(c_lookup_code VARCHAR2, c_lookup_type VARCHAR2) IS
12148 select meaning
12149 from FND_LOOKUP_VALUES_VL
12150 where
12151 lookup_type = c_lookup_type
12152 and lookup_code = c_lookup_code
12153 and enabled_flag = 'Y'
12154 and nvl(end_date_active,sysdate + 1) > sysdate;
12155 --Cursor to get workorder status_code, hold_reason_code and organization_id
12156 CURSOR Get_Wo_Cur_Values(c_workorder_id NUMBER) IS
12157 --sukhwsin::Bug 12915297. Removed Hold Reason.
12158 --select wo.status_code, wo.hold_reason_code, vst.organization_id
12159 select wo.status_code, vst.organization_id
12160 from ahl_workorders wo, ahl_visits_b vst, ahl_visit_tasks_b vts
12161 where
12162 wo.visit_task_id = vts.visit_task_id
12163 and vts.visit_id = vst.visit_id
12164 and wo.workorder_id = c_workorder_id;
12165 --Cursor to get Operation organization_id, seq_num and status_code
12166 CURSOR Get_Op_Details(c_workorder_op_id NUMBER) IS
12167 select vst.organization_id, oper.operation_sequence_num, oper.status_code, wo.workorder_id
12168 from ahl_workorders wo, ahl_visits_b vst, ahl_visit_tasks_b vts,ahl_workorder_operations oper
12169 where
12170 wo.visit_task_id = vts.visit_task_id
12171 and vts.visit_id = vst.visit_id
12172 and oper.workorder_id = wo.workorder_id
12173 and oper.workorder_operation_id = c_workorder_op_id;
12174 --Local Variable Declaration
12175 l_emp_name VARCHAR2(240);
12176 l_emp_id NUMBER;
12177 l_hold_reason VARCHAR2(80) := NULL;
12178 l_old_status VARCHAR2(80) := NULL;
12179 l_new_status VARCHAR2(80) := NULL;
12180 l_notes VARCHAR2(2000);
12181 l_organization_id NUMBER;
12182 l_old_status_code VARCHAR2(30);
12183 --sukhwsin::Bug 12915297. Removed l_hold_reason_code.
12184 --l_hold_reason_code VARCHAR2(30);
12185 l_operation_seq_num NUMBER;
12186 l_msg_count NUMBER;
12187 l_msg_data VARCHAR2(2000);
12188 l_return_status VARCHAR2(1);
12189 l_insert_flag VARCHAR2(1);
12190 l_turnover_notes_tbl AHL_PRD_WORKORDER_PVT.turnover_notes_tbl_type;
12191 l_workorder_id NUMBER;
12192 l_jtf_note_id NUMBER;
12193 BEGIN
12194 -- Initialize return status to success
12195 x_return_status := FND_API.G_RET_STS_SUCCESS;
12196 l_insert_flag := 'N';
12197 --Assign current values
12198 IF(p_workorder_op_id IS NULL ) THEN
12199 --Handle WO Status Change
12200 IF (p_workorder_id IS NULL) THEN
12201 Fnd_Message.SET_NAME('AHL','AHL_PRD_TASK_ORG_WOID_REQ');
12202 Fnd_Msg_Pub.ADD;
12203 x_return_status := FND_API.G_RET_STS_ERROR;
12204 RETURN;
12205 END IF;
12206 l_workorder_id := p_workorder_id;
12207 OPEN Get_Wo_Cur_Values(p_workorder_id);
12208 --sukhwsin::Bug 12915297. Removed Hold Reason.
12209 --FETCH Get_Wo_Cur_Values INTO l_old_status_code, l_hold_reason_code, l_organization_id;
12210 FETCH Get_Wo_Cur_Values INTO l_old_status_code, l_organization_id;
12211 CLOSE Get_Wo_Cur_Values;
12212 IF(l_old_status_code <> p_new_status_code) THEN
12213 IF ( G_DEBUG = 'Y' ) THEN
12214 AHL_DEBUG_PUB.debug( 'Handling Wo status change' );
12215 END IF;
12216 OPEN Get_Emp_Name_And_Id(l_organization_id);
12217 /* FETCH Get_Emp_Name_And_Id INTO l_emp_name, l_emp_id;
12218 IF( Get_Emp_Name_And_Id%NOTFOUND ) THEN
12219 Fnd_Message.SET_NAME('AHL','AHL_PRD_EMP_NULL_TRNTS');
12220 Fnd_Msg_Pub.ADD;
12221 CLOSE Get_Emp_Name_And_Id;
12222 x_return_status := FND_API.G_RET_STS_ERROR;
12223 RETURN;
12224 END IF;
12225 CLOSE Get_Emp_Name_And_Id; */
12226 --Get Old Status Code
12227 OPEN Get_Lkp_Meaning(l_old_status_code,'AHL_JOB_STATUS');
12228 FETCH Get_Lkp_Meaning INTO l_old_status;
12229 CLOSE Get_Lkp_Meaning;
12230 --Get New Status Code
12231 OPEN Get_Lkp_Meaning(p_new_status_code,'AHL_JOB_STATUS');
12232 FETCH Get_Lkp_Meaning INTO l_new_status;
12233 CLOSE Get_Lkp_Meaning;
12234 --sukhwsin::Bug 12915297. Included capturing hold reason for Part Hold also.
12235 --IF(p_new_status_code = G_JOB_STATUS_ON_HOLD) THEN
12236 IF(p_new_status_code = G_JOB_STATUS_ON_HOLD OR p_new_status_code = G_JOB_STATUS_PARTS_HOLD) THEN
12237 --sukhwsin::Bug 12915297. Changed parameter to cursor from l_hold_reason_code to p_hold_reason_code
12238 --OPEN Get_Lkp_Meaning(l_hold_reason_code,'AHL_PRD_WO_HOLD_REASON');
12239 OPEN Get_Lkp_Meaning(p_hold_reason_code,'AHL_PRD_WO_HOLD_REASON');
12240 FETCH Get_Lkp_Meaning INTO l_hold_reason;
12241 CLOSE Get_Lkp_Meaning;
12242 fnd_message.set_name('AHL','AHL_PRD_WO_STS_CHG_TO_HLD');
12243 fnd_message.set_token('FROM_STS',l_old_status);
12244 fnd_message.set_token('TO_STS',l_new_status);
12245 fnd_message.set_token('REASON',l_hold_reason);
12246 ELSE
12247 fnd_message.set_name('AHL','AHL_PRD_WO_STS_CHG');
12248 fnd_message.set_token('FROM_STS',l_old_status);
12249 fnd_message.set_token('TO_STS',l_new_status);
12250 END IF;
12251 l_insert_flag := 'Y';
12252 END IF;
12253 ELSE
12254 --Handle WO Operation Status Change
12255 OPEN Get_Op_Details(p_workorder_op_id);
12256 FETCH Get_Op_Details INTO l_organization_id, l_operation_seq_num,l_old_status_code, l_workorder_id;
12257 CLOSE Get_Op_Details;
12258 IF(l_old_status_code <> p_new_status_code) THEN
12259 IF ( G_DEBUG = 'Y' ) THEN
12260 AHL_DEBUG_PUB.debug( 'Handling Wo Operation status change' );
12261 END IF;
12262 /*OPEN Get_Emp_Name_And_Id(l_organization_id);
12263 FETCH Get_Emp_Name_And_Id INTO l_emp_name, l_emp_id;
12264 IF( Get_Emp_Name_And_Id%NOTFOUND ) THEN
12265 Fnd_Message.SET_NAME('AHL','AHL_PRD_EMP_NULL_TRNTS');
12266 Fnd_Msg_Pub.ADD;
12267 CLOSE Get_Emp_Name_And_Id;
12268 x_return_status := FND_API.G_RET_STS_ERROR;
12269 RETURN;
12270 END IF;
12271 CLOSE Get_Emp_Name_And_Id; */
12272 --Get Old Status Code
12273 OPEN Get_Lkp_Meaning(l_old_status_code,'AHL_OPERATION_STATUS');
12274 FETCH Get_Lkp_Meaning INTO l_old_status;
12275 CLOSE Get_Lkp_Meaning;
12276 --Get New Status Code
12277 OPEN Get_Lkp_Meaning(p_new_status_code,'AHL_OPERATION_STATUS');
12278 FETCH Get_Lkp_Meaning INTO l_new_status;
12279 CLOSE Get_Lkp_Meaning;
12280 fnd_message.set_name('AHL','AHL_PRD_WO_OP_STS_CHG');
12281 fnd_message.set_token('OP_SEQ',l_operation_seq_num);
12282 fnd_message.set_token('FROM_STS',l_old_status);
12283 fnd_message.set_token('TO_STS',l_new_status);
12284 l_insert_flag := 'Y';
12285 END IF;
12286 END IF; -- if workorder_op_id null check.
12287 IF(l_insert_flag = 'Y') THEN
12288 l_notes := fnd_message.get;
12289 /*l_turnover_notes_tbl(0).source_object_id := l_workorder_id;
12290 l_turnover_notes_tbl(0).source_object_code := 'AHL_WO_TURNOVER_NOTES';
12291 l_turnover_notes_tbl(0).employee_id := l_emp_id;
12292 l_turnover_notes_tbl(0).employee_name := l_emp_name;
12293 l_turnover_notes_tbl(0).entered_date := SYSDATE;
12294 l_turnover_notes_tbl(0).org_id := l_organization_id;
12295 l_turnover_notes_tbl(0).notes := l_notes;
12296 INSERT_TURNOVER_NOTES
12297 (
12298 p_init_msg_list => FND_API.G_FALSE,
12299 p_commit => FND_API.G_FALSE,
12300 p_validation_level => p_validation_level,
12301 p_default => p_default,
12302 p_module_type => p_module_type,
12303 x_return_status => l_return_status,
12304 x_msg_count => l_msg_count,
12305 x_msg_data => l_msg_data,
12306 p_trunover_notes_tbl => l_turnover_notes_tbl
12307 ); */
12308 IF(l_notes IS NOT NULL )THEN
12309 JTF_NOTES_PUB.Create_note
12310 (
12311 p_api_version => 1.0,
12312 p_init_msg_list => FND_API.G_FALSE,
12313 p_commit => FND_API.G_FALSE,
12314 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
12315 x_return_status => l_return_status,
12316 x_msg_count => l_msg_count,
12317 x_msg_data => l_msg_data,
12318 p_source_object_id => l_workorder_id,
12319 p_source_object_code => 'AHL_WO_TURNOVER_NOTES',
12320 p_notes => l_notes,
12321 p_entered_by => fnd_global.user_id,
12322 p_entered_date => SYSDATE,
12323 x_jtf_note_id => l_jtf_note_id
12324 );
12325 END IF;
12326 -- Check Error Message stack.
12327 l_msg_count := FND_MSG_PUB.count_msg;
12328 IF l_msg_count > 0 THEN
12329 l_return_status := FND_API.G_RET_STS_ERROR;
12330 END IF;
12331 x_return_status := l_return_status;
12332 END IF;
12333 EXCEPTION
12334 WHEN OTHERS THEN
12335 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12336 END ADD_WO_OPER_TURNOVER_NOTES;
12337
12338 -- JKJain, NR Analysis and Forecasting
12339 procedure GET_UC_FLEET_MNTNC(
12340 p_prd_workorder_rec IN prd_workorder_rec,
12341 x_fleet_header_id OUT NOCOPY NUMBER,
12342 x_uc_header_id OUT NOCOPY NUMBER,
12343 x_nha_uc_header_id OUT NOCOPY NUMBER,
12344 x_maintenance_type_code OUT NOCOPY VARCHAR2
12345 )
12346 IS
12347
12348 CURSOR get_fleet_maintenance_csr(c_visit_task_id NUMBER) IS
12349 SELECT ue.fleet_header_id,
12350 vtsk.unit_effectivity_id,
12351 DECODE(ue.defer_from_ue_id, NULL,
12352 decode(vtsk.service_request_id, NULL, decode(vtsk.task_type_code,'PLANNED', 'ROUTINE', 'ROUTINE_UNKNOWN'), 'NONROUTINE'),
12353 decode(vtsk.service_request_id, NULL, 'DEFER_ROUTINE','DEFER_NONROUTINE')) maintenance_type_code
12354 FROM ahl_visit_tasks_b vtsk, ahl_unit_effectivities_b ue
12355 WHERE vtsk.unit_effectivity_id = ue.unit_effectivity_id(+)
12356 AND vtsk.visit_task_id = c_visit_task_id;
12357
12358 CURSOR get_uc_from_visit(c_visit_id NUMBER) IS
12359 Select UNIT_CONFIG_HEADER_ID from
12360 AHL_UNIT_CONFIG_HEADERS UC, AHL_VISITS_B V
12361 where V.ITEM_INSTANCE_ID = UC.CSI_ITEM_INSTANCE_ID
12362 AND V.ITEM_INSTANCE_ID = c_visit_id;
12363
12364 l_unit_effectivity_id NUMBER := NULL;
12365 l_fleet_header_id NUMBER := NULL;
12366 l_maintenance_type_code VARCHAR2(30) := NULL;
12367 l_uc_header_id NUMBER := NULL;
12368 l_nha_uc_header_id NUMBER := NULL;
12369
12370 BEGIN
12371
12372 -- JKJain, NR Analysis and Forecasting
12373 OPEN get_uc_from_visit(p_prd_workorder_rec.VISIT_ID);
12374 FETCH get_uc_from_visit into l_uc_header_id;
12375 CLOSE get_uc_from_visit;
12376
12377 IF(l_uc_header_id IS NULL)THEN
12378 l_uc_header_id := AHL_UTIL_UC_PKG.get_uc_header_id(p_prd_workorder_rec.ITEM_INSTANCE_ID);
12379 END IF;
12380
12381 l_nha_uc_header_id := AHL_UTIL_UC_PKG.get_sub_uc_header_id(p_prd_workorder_rec.ITEM_INSTANCE_ID);
12382 IF (p_prd_workorder_rec.visit_task_id IS NOT NULL) THEN
12383
12384 OPEN get_fleet_maintenance_csr(p_prd_workorder_rec.visit_task_id);
12385 FETCH get_fleet_maintenance_csr into l_fleet_header_id,l_unit_effectivity_id,l_maintenance_type_code;
12386 CLOSE get_fleet_maintenance_csr;
12387
12388 IF(l_unit_effectivity_id IS NULL and l_uc_header_id IS NOT NULL) THEN
12389 --Calculate Fleet Header ID from Unit and Schedule date combination for Primary plan
12390 l_fleet_header_id := AHL_UMP_ProcessUnit_PVT.get_fleet_from_unit_asso(l_uc_header_id,p_prd_workorder_rec.SCHEDULED_START_DATE,null);
12391 END IF;
12392 END IF;
12393
12394 x_fleet_header_id := l_fleet_header_id;
12395 x_uc_header_id := l_uc_header_id;
12396 x_nha_uc_header_id := l_nha_uc_header_id;
12397 x_maintenance_type_code := l_maintenance_type_code;
12398
12399 END get_uc_fleet_mntnc;
12400 -- JKJain, NR Analysis and Forecasting
12401 FUNCTION is_workorder_released
12402 (
12403 p_workorder_id IN NUMBER
12404 ) RETURN BOOLEAN
12405 IS
12406
12407 CURSOR get_wip_date_released( c_wo_id NUMBER ) IS
12408 SELECT WIP.DATE_RELEASED
12409 FROM AHL_WORKORDERS WO,
12410 WIP_DISCRETE_JOBS WIP
12411 WHERE WO.workorder_id = c_wo_id
12412 AND WO.wip_entity_id = WIP.wip_entity_id;
12413
12414 l_released_date DATE := NULL;
12415 BEGIN
12416
12417 OPEN get_wip_date_released(p_workorder_id);
12418 FETCH get_wip_date_released into l_released_date;
12419 CLOSE get_wip_date_released;
12420
12421 IF(l_released_date IS NULL) THEN
12422 RETURN FALSE;
12423 ELSE
12424 RETURN TRUE;
12425 END IF;
12426
12427 END is_workorder_released;
12428 --sukhwsin::Complex Assembly enhancements - Added following procedure for WO turnover notes for instance routing
12429 PROCEDURE Add_Inst_Rtng_Notes_To_WO(
12430 p_api_version IN NUMBER := 1.0,
12431 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
12432 p_commit IN VARCHAR2 := FND_API.G_FALSE,
12433 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
12434 x_return_status OUT NOCOPY VARCHAR2,
12435 x_msg_count OUT NOCOPY NUMBER,
12436 x_msg_data OUT NOCOPY VARCHAR2,
12437 p_workorder_id IN NUMBER,
12438 p_old_inst_rtng IN VARCHAR2 := NULL,
12439 p_new_inst_rtng IN VARCHAR2 := NULL
12440 ) IS
12441 CURSOR Get_Meaning_From_Code(c_inst_routing_code IN VARCHAR2) IS
12442 SELECT MEANING
12443 FROM FND_LOOKUP_VALUES_VL
12444 WHERE
12445 LOOKUP_TYPE = 'AHL_INSTANCE_ROUTING'
12446 AND LOOKUP_CODE = c_inst_routing_code
12447 AND NVL(ENABLED_FLAG,'N') = 'Y'
12448 AND NVL(END_DATE_ACTIVE,SYSDATE+1) > SYSDATE;
12449 l_api_name CONSTANT VARCHAR2(30) := 'ADD_INST_RTNG_NOTES_TO_WO';
12450 l_api_version CONSTANT NUMBER := 1.0;
12451 l_msg_count NUMBER;
12452 l_msg_data VARCHAR2(2000);
12453 l_return_status VARCHAR2(1);
12454 l_jtf_note_id NUMBER;
12455 l_notes VARCHAR2(2000);
12456 l_old_inst_rtng_meaning VARCHAR2(240);
12457 l_new_inst_rtng_meaning VARCHAR2(240);
12458 BEGIN
12459 SAVEPOINT inst_rtng_notes_to_wo;
12460 IF NOT FND_API.compatible_api_call(l_api_version,
12461 p_api_version,
12462 l_api_name,G_PKG_NAME) THEN
12463 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12464 END IF;
12465 IF FND_API.to_boolean(p_init_msg_list) THEN
12466 FND_MSG_PUB.initialize;
12467 END IF;
12468 x_return_status:=FND_API.G_RET_STS_SUCCESS;
12469 IF (p_workorder_id IS NULL) THEN
12470 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_NULL_WORKORDER_ID');
12471 FND_MSG_PUB.ADD;
12472 RAISE FND_API.G_EXC_ERROR;
12473 END IF;
12474 IF (p_old_inst_rtng IS NULL AND p_new_inst_rtng IS NULL) THEN
12475 FND_MESSAGE.SET_NAME('AHL','AHL_CAM_INST_RTNG_NULL'); -- pending to define.
12476 FND_MSG_PUB.ADD;
12477 RAISE FND_API.G_EXC_ERROR;
12478 END IF;
12479 --Get Meaning From Code for old instance routing
12480 IF (p_old_inst_rtng IS NOT NULL) THEN
12481 OPEN Get_Meaning_From_Code(p_old_inst_rtng);
12482 FETCH Get_Meaning_From_Code INTO l_old_inst_rtng_meaning;
12483 CLOSE Get_Meaning_From_Code;
12484 END IF;
12485 --Get Meaning From Code for new instance routing
12486 IF (p_new_inst_rtng IS NOT NULL) THEN
12487 OPEN Get_Meaning_From_Code(p_new_inst_rtng);
12488 FETCH Get_Meaning_From_Code INTO l_new_inst_rtng_meaning;
12489 CLOSE Get_Meaning_From_Code;
12490 END IF;
12491 IF (p_old_inst_rtng IS NOT NULL AND p_new_inst_rtng IS NOT NULL) THEN
12492 --Update Mode
12493 fnd_message.set_name('AHL','AHL_CAM_UPD_INST_RTNG');
12494 fnd_message.set_token('OLD_RTNG',l_old_inst_rtng_meaning);
12495 fnd_message.set_token('NEW_RTNG',l_new_inst_rtng_meaning);
12496 ELSIF(p_old_inst_rtng IS NULL AND p_new_inst_rtng IS NOT NULL) THEN
12497 --Create Mode
12498 fnd_message.set_name('AHL','AHL_CAM_NEW_INST_RTNG');
12499 fnd_message.set_token('NEW_RTNG',l_new_inst_rtng_meaning);
12500 ELSIF(p_old_inst_rtng IS NOT NULL AND p_new_inst_rtng IS NULL) THEN
12501 --Delete Mode
12502 fnd_message.set_name('AHL','AHL_CAM_DEL_INST_RTNG');
12503 fnd_message.set_token('OLD_RTNG',l_old_inst_rtng_meaning);
12504 END IF;
12505 --Call JTF API to create Workorder Notes for instance routing
12506 l_notes := fnd_message.get;
12507 JTF_NOTES_PUB.Create_note
12508 (
12509 p_api_version => 1.0,
12510 p_init_msg_list => FND_API.G_FALSE,
12511 p_commit => FND_API.G_FALSE,
12512 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
12513 x_return_status => l_return_status,
12514 x_msg_count => l_msg_count,
12515 x_msg_data => l_msg_data,
12516 p_source_object_id => p_workorder_id,
12517 p_source_object_code => 'AHL_WO_TURNOVER_NOTES',
12518 p_notes => l_notes,
12519 p_entered_by => fnd_global.user_id,
12520 p_entered_date => SYSDATE,
12521 x_jtf_note_id => l_jtf_note_id
12522 );
12523 l_msg_count := FND_MSG_PUB.count_msg;
12524 IF l_msg_count > 0 THEN
12525 l_return_status := FND_API.G_RET_STS_ERROR;
12526 END IF;
12527 x_return_status := l_return_status;
12528 --Commit if p_commit is true.
12529 IF FND_API.to_boolean(p_commit) THEN
12530 COMMIT;
12531 END IF;
12532 EXCEPTION
12533 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12534 ROLLBACK TO inst_rtng_notes_to_wo;
12535 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12536 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12537 p_count => x_msg_count,
12538 p_data => x_msg_data);
12539 WHEN FND_API.G_EXC_ERROR THEN
12540 ROLLBACK TO inst_rtng_notes_to_wo;
12541 x_return_status := FND_API.G_RET_STS_ERROR;
12542 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12543 p_count => x_msg_count,
12544 p_data => x_msg_data);
12545 WHEN OTHERS THEN
12546 ROLLBACK TO inst_rtng_notes_to_wo;
12547 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12548 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
12549 FND_MSG_PUB.add_exc_msg(p_pkg_name => g_pkg_name,
12550 p_procedure_name => l_api_name,
12551 p_error_text => SUBSTRB(SQLERRM,1,240));
12552 END IF;
12553 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12554 p_count => x_msg_count,
12555 p_data => x_msg_data);
12556 END Add_Inst_Rtng_Notes_To_WO;
12557
12558
12559 -- sansatpa - created for marshalling - to update WO AOG status when material aog status changes.
12560
12561 ---------------------------------------------------------------------------------------------------------
12562 -- SANSATPA:: Adding the following function for updating Work Order AOG Status
12563 ---------------------------------------------------------------------------------------------------------
12564 -----------------------
12565 -- Define procedures --
12566 -----------------------
12567 -- Start of Comments --
12568 --
12569 -- Procedure name : UPDATE_WO_AOG_STATUS
12570 -- Type : Private
12571 -- Description : This procedure is called for updating Work Order AOG Status.
12572 -- Pre-reqs :
12573 --
12574 -- Standard IN Parameters :
12575 -- p_api_version NUMBER := 1.0
12576 -- p_init_msg_list VARCHAR2 := FND_API.G_FALSE
12577 -- p_commit VARCHAR2 := FND_API.G_FALSE
12578 --
12579 -- Standard OUT Parameters :
12580 -- x_return_status VARCHAR2 Required
12581 -- x_msg_count NUMBER Required
12582 -- x_msg_data VARCHAR2 Required
12583 --
12584 --
12585 -- Procedure -- IN Parameters :
12586 -- p_workorder_id_tbl WORKORDER_ID_TBL_TYPE, Required: The table of Work Order IDs and corresponding Object version Numbers
12587 --
12588 -- Procedure -- OUT Parameters :
12589 --
12590 -- End of Comments
12591 PROCEDURE UPDATE_WO_AOG_STATUS
12592 (
12593 p_api_version IN NUMBER := 1.0,
12594 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
12595 p_commit IN VARCHAR2 := FND_API.G_FALSE,
12596 --p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
12597 p_workorder_id_tbl IN WORKORDER_ID_TBL_TYPE,
12598 x_return_status OUT NOCOPY VARCHAR2,
12599 x_msg_count OUT NOCOPY NUMBER,
12600 x_msg_data OUT NOCOPY VARCHAR2
12601 )
12602 is
12603
12604 l_api_name CONSTANT VARCHAR2(30) := 'update_wo_aog_status';
12605 l_api_version CONSTANT NUMBER := 1.0;
12606 l_msg_count NUMBER;
12607 l_return_status VARCHAR2(1);
12608 L_MSG_DATA VARCHAR2(2000);
12609 i NUMBER := 1;
12610
12611 L_AOG_FLAG VARCHAR2(1) DEFAULT NULL;
12612
12613 TYPE CUR_TYPE IS REF CURSOR;
12614 GET_WO_DETAILS CUR_TYPE;
12615 l_sql_string VARCHAR2(2000);
12616
12617 L_WORKORDER_ID NUMBER;
12618 L_WORKORDER_NAME VARCHAR2(80);
12619 L_WORKORDER_STATUS_CODE NUMBER;
12620 L_WORKORDER_STATUS VARCHAR2(80);
12621 l_curt_status varchar2(1) := 'S';
12622
12623 INVALID_WORKORDER_STATUS exception;
12624
12625 CURSOR GET_WORKORDER_REC(P_WORKORDER_ID NUMBER)
12626 IS
12627 SELECT WO.WORKORDER_ID,
12628 WO.WIP_ENTITY_ID,
12629 WO.WORKORDER_NAME JOB_NUMBER,
12630 WDJ.DESCRIPTION JOB_DESCRIPTION,
12631 WO.OBJECT_VERSION_NUMBER,
12632 WO.STATUS_CODE JOB_STATUS_CODE,
12633 WDJ.SCHEDULED_START_DATE SCHEDULED_START_DATE,
12634 WDJ.SCHEDULED_COMPLETION_DATE SCHEDULED_END_DATE,
12635 WO.ACTUAL_START_DATE ACTUAL_START_DATE,
12636 WO.ACTUAL_END_DATE ACTUAL_END_DATE,
12637 WDJ.COMPLETION_SUBINVENTORY COMPLETION_SUBINVENTORY,
12638 WDJ.COMPLETION_LOCATOR_ID COMPLETION_LOCATOR_ID,
12639 WDJ.PRIORITY PRIORITY
12640 FROM AHL_WORKORDERS WO,
12641 WIP_DISCRETE_JOBS WDJ
12642 WHERE WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
12643 AND WO.STATUS_CODE NOT IN (4, 5, 7, 12, 15, 17, 22)
12644 AND WO.WORKORDER_ID = P_WORKORDER_ID;
12645
12646 L_PRD_WORKORDER_REC GET_WORKORDER_REC%ROWTYPE;
12647
12648 BEGIN
12649
12650 IF (G_LEVEL_PROCEDURE >= G_CURRENT_LOG_LEVEL)THEN
12651 FND_LOG.STRING( G_LEVEL_PROCEDURE, 'ahl.plsql.'||G_PKG_NAME||'.'||
12652 L_API_NAME, 'At the start of PLSQL procedure UPDATE_WO_AOG_STATUS');
12653 END IF;
12654
12655 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12656 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||
12657 L_API_NAME, ' No of Workorders to be updated for AOG Status - ' || p_workorder_id_tbl.COUNT);
12658 END IF;
12659
12660 -- Standard Start of API savepoint
12661 SAVEPOINT UPDATE_WO_AOG_STATUS;
12662
12663 -- Initialize message list if p_init_msg_list is set to TRUE.
12664 IF FND_API.to_boolean(p_init_msg_list)
12665 THEN
12666 FND_MSG_PUB.initialize;
12667 END IF;
12668
12669 -- Initialize API return status to success
12670 x_return_status := FND_API.G_RET_STS_SUCCESS;
12671
12672 -- Standard call to check for call compatibility.
12673 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
12674 p_api_version,
12675 l_api_name,G_PKG_NAME)
12676 THEN
12677 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12678 END IF;
12679
12680 if (P_WORKORDER_ID_TBL.COUNT = 0) then
12681 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12682 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||
12683 L_API_NAME, ' No workorder details sent for updation, hence return.');
12684 END IF;
12685 RETURN;
12686 END IF;
12687
12688 l_sql_string := 'SELECT AW.WORKORDER_ID, AW.WORKORDER_NAME, AW.STATUS_CODE, FLV.MEANING WO_STATUS FROM AHL_WORKORDERS AW, FND_LOOKUP_VALUES_VL FLV WHERE AW.STATUS_CODE = FLV.LOOKUP_CODE AND FLV.LOOKUP_TYPE = ''AHL_JOB_STATUS'' AND WORKORDER_ID IN (0';
12689
12690 FOR i IN p_workorder_id_tbl.first .. p_workorder_id_tbl.last
12691 LOOP
12692 l_sql_string := l_sql_string || ',' || p_workorder_id_tbl(i).WORKORDER_ID;
12693 END LOOP;
12694
12695 l_sql_string := l_sql_string || ')';
12696
12697 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12698 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||
12699 L_API_NAME, ' Dynamic cursor formed as - ' || l_sql_string);
12700 END IF;
12701
12702 OPEN get_wo_details FOR L_SQL_STRING;
12703 LOOP
12704 FETCH GET_WO_DETAILS into L_WORKORDER_ID, L_WORKORDER_NAME, L_WORKORDER_STATUS_CODE, L_WORKORDER_STATUS;
12705 EXIT WHEN GET_WO_DETAILS%NOTFOUND;
12706 IF(L_WORKORDER_STATUS_CODE in (4, 5, 7, 12, 15, 17, 22))
12707 THEN
12708 L_CURT_STATUS := 'E';
12709 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12710 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, L_WORKORDER_NAME || ' has status - ' || L_WORKORDER_STATUS);
12711 END IF;
12712 FND_MESSAGE.SET_NAME('AHL', 'AHL_PRD_WORKORDER_STS_INVALID');
12713 FND_MESSAGE.SET_TOKEN('WORKORDER_NUM', L_WORKORDER_NAME);
12714 FND_MESSAGE.SET_TOKEN('WORKORDER_STATUS', L_WORKORDER_STATUS);
12715 fnd_msg_pub.add;
12716 end if;
12717
12718 END LOOP;
12719
12720 close GET_WO_DETAILS;
12721
12722 IF(L_CURT_STATUS <> 'S') THEN
12723 RAISE INVALID_WORKORDER_STATUS;
12724 END IF;
12725
12726 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12727 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'All workorder have proper status, lets update');
12728 END IF;
12729
12730 -- Go for bulk update of AHL_WORKORDERS table
12731 FORALL I IN P_WORKORDER_ID_TBL.first .. P_WORKORDER_ID_TBL.last
12732 UPDATE AHL_WORKORDERS
12733 SET AOG_FLAG = 'Y',
12734 OBJECT_VERSION_NUMBER = P_WORKORDER_ID_TBL(I).OBJ_VER_NUM + 1,
12735 LAST_UPDATE_DATE = SYSDATE,
12736 LAST_UPDATED_BY = FND_GLOBAL.USER_ID,
12737 LAST_UPDATE_LOGIN = FND_GLOBAL.USER_ID
12738 WHERE WORKORDER_ID = P_WORKORDER_ID_TBL(I).WORKORDER_ID
12739 and OBJECT_VERSION_NUMBER = P_WORKORDER_ID_TBL(I).OBJ_VER_NUM;
12740
12741
12742 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12743 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'Workorder updation over. Lets insert transaction details to AHL_WORKORDER_TXNS table');
12744 END IF;
12745
12746 FOR I IN P_WORKORDER_ID_TBL.first .. P_WORKORDER_ID_TBL.last
12747 LOOP
12748 OPEN GET_WORKORDER_REC(P_WORKORDER_ID_TBL(I).WORKORDER_ID);
12749 FETCH GET_WORKORDER_REC INTO L_PRD_WORKORDER_REC;
12750 CLOSE GET_WORKORDER_REC;
12751
12752 -- Insert into AHL_WORKORDER_TXNS table workorder by workorder
12753 INSERT INTO AHL_WORKORDER_TXNS
12754 (
12755 WORKORDER_TXN_ID,
12756 OBJECT_VERSION_NUMBER,
12757 LAST_UPDATE_DATE,
12758 LAST_UPDATED_BY,
12759 CREATION_DATE,
12760 CREATED_BY,
12761 LAST_UPDATE_LOGIN,
12762 WORKORDER_ID,
12763 TRANSACTION_TYPE_CODE,
12764 STATUS_CODE,
12765 SCHEDULED_START_DATE,
12766 SCHEDULED_END_DATE,
12767 ACTUAL_START_DATE,
12768 ACTUAL_END_DATE,
12769 LOT_NUMBER,
12770 COMPLETION_SUBINVENTORY,
12771 COMPLETION_LOCATOR_ID,
12772 AOG_FLAG
12773 )
12774 VALUES
12775 (
12776 AHL_WORKORDER_TXNS_S.NEXTVAL,
12777 NVL(L_PRD_WORKORDER_REC.OBJECT_VERSION_NUMBER,1),
12778 SYSDATE,
12779 FND_GLOBAL.USER_ID,
12780 SYSDATE,
12781 FND_GLOBAL.USER_ID,
12782 FND_GLOBAL.USER_ID,
12783 L_PRD_WORKORDER_REC.WORKORDER_ID,
12784 0,
12785 L_PRD_WORKORDER_REC.JOB_STATUS_CODE,
12786 L_PRD_WORKORDER_REC.SCHEDULED_START_DATE,
12787 L_PRD_WORKORDER_REC.SCHEDULED_END_DATE,
12788 L_PRD_WORKORDER_REC.ACTUAL_START_DATE,
12789 L_PRD_WORKORDER_REC.ACTUAL_END_DATE,
12790 0,
12791 L_PRD_WORKORDER_REC.COMPLETION_SUBINVENTORY,
12792 L_PRD_WORKORDER_REC.COMPLETION_LOCATOR_ID,
12793 'Y'
12794 );
12795
12796 END LOOP;
12797
12798 IF FND_API.to_boolean(p_commit) THEN
12799 commit;
12800 END IF;
12801
12802
12803 EXCEPTION
12804 WHEN INVALID_WORKORDER_STATUS THEN
12805 ROLLBACK TO UPDATE_WO_AOG_STATUS;
12806 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12807 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'INVALID_WORKORDER_STATUS exception generated');
12808 END IF;
12809 X_return_status := FND_API.G_RET_STS_ERROR;
12810 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12811 p_count => x_msg_count,
12812 P_DATA => X_MSG_DATA);
12813
12814 WHEN NO_DATA_FOUND THEN
12815 ROLLBACK TO UPDATE_WO_AOG_STATUS;
12816 IF (G_LEVEL_STATEMENT >= G_CURRENT_LOG_LEVEL)THEN
12817 FND_LOG.STRING( G_LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'|| L_API_NAME, 'NO_DATA_FOUND exception generated');
12818 END IF;
12819 FND_MESSAGE.SET_NAME('AHL', 'AHL_PRD_WO_ID_MISSING');
12820 FND_MESSAGE.SET_TOKEN('WORKORDER', P_WORKORDER_ID_TBL(I).WORKORDER_ID);
12821 fnd_msg_pub.add;
12822 X_return_status := FND_API.G_RET_STS_ERROR;
12823 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12824 p_count => x_msg_count,
12825 p_data => x_msg_data);
12826
12827 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12828 ROLLBACK TO UPDATE_WO_AOG_STATUS;
12829 X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12830 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12831 p_count => x_msg_count,
12832 p_data => x_msg_data);
12833
12834 WHEN OTHERS THEN
12835 ROLLBACK TO UPDATE_WO_AOG_STATUS;
12836 X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12837 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
12838 THEN
12839 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
12840 p_procedure_name => 'UPDATE_WO_AOG_STATUS',
12841 p_error_text => SUBSTR(SQLERRM,1,240));
12842 END IF;
12843 FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
12844 p_count => x_msg_count,
12845 p_data => x_msg_data);
12846
12847 IF (G_LEVEL_PROCEDURE >= G_CURRENT_LOG_LEVEL)THEN
12848 FND_LOG.STRING( G_LEVEL_PROCEDURE, 'ahl.plsql.'||G_PKG_NAME||'.'||
12849 L_API_NAME, 'At the end of PLSQL procedure UPDATE_WO_AOG_STATUS');
12850 END IF;
12851
12852
12853 END UPDATE_WO_AOG_STATUS;
12854
12855 END AHL_PRD_WORKORDER_PVT;