DBA Data[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;