DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_PRD_OPERATIONS_PVT

Source


1 PACKAGE BODY AHL_PRD_OPERATIONS_PVT AS
2  /* $Header: AHLVPROB.pls 120.19.12010000.2 2008/12/17 00:48:16 sikumar ship $ */
3 
4 G_PKG_NAME   VARCHAR2(30) := 'AHL_PRD_OPERATIONS_PVT';
5 G_DEBUG      VARCHAR2(1)  := AHL_DEBUG_PUB.is_log_enabled;
6 
7 FUNCTION get_date_and_time(p_date IN DATE,
8                            p_date_hh24 IN VARCHAR2,
9                            p_date_mi IN VARCHAR2,
10                            p_date_ss IN VARCHAR2) RETURN DATE;
11 
12 PROCEDURE default_attributes
13 (
14   p_x_prd_workoper_rec       IN OUT NOCOPY AHL_PRD_OPERATIONS_PVT.prd_workoperation_rec
15 )
16 AS
17 
18   CURSOR get_workorder_rec(c_workorder_id  NUMBER)
19   IS
20   SELECT WO.route_id,
21          WO.wip_entity_id,
22          VST.organization_id,
23          WDJ.scheduled_start_date,
24          WDJ.scheduled_completion_date,
25          WO.actual_start_date,
26          WO.actual_end_date
27   FROM   AHL_WORKORDERS WO,
28          AHL_VISITS_B VST,
29          WIP_DISCRETE_JOBS WDJ
30   WHERE  WO.workorder_id         =c_workorder_id
31   AND    WO.status_code          <> '22'
32   AND    WO.visit_id             =VST.visit_id
33   AND    WO.wip_entity_id        =WDJ.wip_entity_id (+);
34 
35   l_job_organization_id       NUMBER;
36   l_job_wip_entity_id         NUMBER;
37   l_job_route_id              NUMBER;
38   l_job_scheduled_start_date  DATE;
39   l_job_scheduled_end_date    DATE;
40   l_job_actual_start_date     DATE;
41   l_job_actual_end_date       DATE;
42 
43   CURSOR get_operation_details(c_operation_code VARCHAR2)
44   IS
45   SELECT OP.operation_id,
46          OP.description,
47          OP.qa_inspection_type
48   FROM   AHL_OPERATIONS_VL OP
49   WHERE  OP.concatenated_segments=c_operation_code
50   AND    TRUNC(SYSDATE) BETWEEN TRUNC(NVL(OP.start_date_active,SYSDATE))
51                         AND     TRUNC(NVL(OP.end_date_active,SYSDATE+1))
52   AND    OP.revision_status_code='COMPLETE'
53   AND    OP.revision_number IN
54          ( SELECT MAX(revision_number)
55            FROM   AHL_OPERATIONS_B_KFV
56            WHERE  concatenated_segments=OP.concatenated_segments
57            AND    TRUNC(SYSDATE) BETWEEN TRUNC(start_date_active) AND
58                                          TRUNC(NVL(end_date_active,SYSDATE+1))
59          );
60   l_qa_inspection_type    VARCHAR2(150);
61   l_description           VARCHAR2(500);
62 
63   l_msg_count             NUMBER;
64   l_msg_data              VARCHAR2(2000);
65   l_return_status         VARCHAR2(1);
66 
67 BEGIN
68 
69   IF ( p_x_prd_workoper_rec.operation_code IS NOT NULL ) THEN
70 
71     IF ( G_DEBUG = 'Y' ) THEN
72       AHL_DEBUG_PUB.debug( 'Job Operation is based on Route Management Operation' );
73     END IF;
74 
75     OPEN  get_operation_details(p_x_prd_workoper_rec.operation_code);
76     FETCH get_operation_details
77     INTO  p_x_prd_workoper_rec.operation_id,
78           l_description,
79           l_qa_inspection_type;
80     CLOSE get_operation_details;
81 
82     IF p_x_prd_workoper_rec.operation_description is NULL THEN
83       p_x_prd_workoper_rec.operation_description:=l_description;
84     END IF;
85   END IF;
86 
87   SELECT ahl_workorder_operations_s.NEXTVAL
88   INTO   p_x_prd_workoper_rec.workorder_operation_id
89   FROM   DUAL;
90 
91   p_x_prd_workoper_rec.LAST_UPDATE_DATE     :=SYSDATE;
92   p_x_prd_workoper_rec.LAST_UPDATED_BY      :=FND_GLOBAL.user_id;
93   p_x_prd_workoper_rec.CREATION_DATE        :=SYSDATE;
94   p_x_prd_workoper_rec.CREATED_BY           :=FND_GLOBAL.user_id;
95   p_x_prd_workoper_rec.LAST_UPDATE_LOGIN    :=FND_GLOBAL.user_id;
96   p_x_prd_workoper_rec.OBJECT_VERSION_NUMBER:=1;
97   p_x_prd_workoper_rec.STATUS_CODE          :='2';
98 
99   OPEN  get_workorder_rec (p_x_prd_workoper_rec.workorder_id);
100   FETCH get_workorder_rec
101   INTO  l_job_route_id,
102         l_job_wip_entity_id,
103         l_job_organization_id,
104         l_job_scheduled_start_date,
105         l_job_scheduled_end_date,
106         l_job_actual_start_date,
107         l_job_actual_end_date;
108   CLOSE get_workorder_rec;
109 
110   IF ( ( p_x_prd_workoper_rec.wip_entity_id IS NULL OR
111          p_x_prd_workoper_rec.wip_entity_id = FND_API.G_MISS_NUM ) AND
112        l_job_wip_entity_id IS NOT NULL ) THEN
113     p_x_prd_workoper_rec.wip_entity_id := l_job_wip_entity_id;
114   END IF;
115 
116   IF ( p_x_prd_workoper_rec.organization_id IS NULL OR
117        p_x_prd_workoper_rec.organization_id = FND_API.G_MISS_NUM ) THEN
118     p_x_prd_workoper_rec.organization_id := l_job_organization_id;
119   END IF;
120 
121   IF ( G_DEBUG = 'Y' ) THEN
122     AHL_DEBUG_PUB.debug( 'Job Route ID :'||l_job_route_id );
123     AHL_DEBUG_PUB.debug( 'Operation Code :'|| p_x_prd_workoper_rec.operation_code );
124     AHL_DEBUG_PUB.debug( 'Operation ID :'|| p_x_prd_workoper_rec.operation_id );
125   END IF;
126 
127   IF ( l_job_route_id IS NULL AND
128        p_x_prd_workoper_rec.operation_id IS NULL ) THEN
129     l_qa_inspection_type:=fnd_profile.value('AHL_NR_WO_OP_PLAN_TYPE');
130 
131     IF ( G_DEBUG = 'Y' ) THEN
132       AHL_DEBUG_PUB.debug( 'Defaulting QA Inspection Type for Operation from Profile' );
133     END IF;
134 
135   END IF;
136 
137   IF l_qa_inspection_type IS NOT NULL THEN
138     AHL_QA_RESULTS_PVT.get_qa_plan
139     (
140       p_api_version           => 1.0,
141       p_init_msg_list         => FND_API.G_FALSE,
142       p_commit                => FND_API.G_FALSE,
143       p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
144       p_default               => FND_API.G_FALSE,
145       p_module_type           => NULL,
146       x_return_status         => l_return_status,
147       x_msg_count             => l_msg_count,
148       x_msg_data              => l_msg_data,
149       p_organization_id       => p_x_prd_workoper_rec.organization_id,
150       p_transaction_number    => 2002,
151       p_col_trigger_value     => l_qa_inspection_type,
152       x_plan_id               => p_x_prd_workoper_rec.plan_id
153     );
154   END IF;
155 
156   IF ( p_x_prd_workoper_rec.scheduled_start_date IS NOT NULL AND
157        p_x_prd_workoper_rec.scheduled_start_date <> FND_API.G_MISS_DATE AND
158        l_job_scheduled_start_date IS NOT NULL AND
159        TRUNC( p_x_prd_workoper_rec.scheduled_start_date ) = TRUNC( l_job_scheduled_start_date ) ) THEN
160     p_x_prd_workoper_rec.scheduled_start_date := l_job_scheduled_start_date;
161     IF ( p_x_prd_workoper_rec.scheduled_start_hr IS NULL OR
162          p_x_prd_workoper_rec.scheduled_start_hr = FND_API.G_MISS_NUM)
163     THEN
164     	p_x_prd_workoper_rec.scheduled_start_hr := TO_NUMBER( TO_CHAR( l_job_scheduled_start_date, 'HH24' ) );
165     END IF;
166 
167     IF( p_x_prd_workoper_rec.scheduled_start_mi IS NULL OR
168         p_x_prd_workoper_rec.scheduled_start_mi = FND_API.G_MISS_NUM)
169     THEN
170     	p_x_prd_workoper_rec.scheduled_start_mi := TO_NUMBER( TO_CHAR( l_job_scheduled_start_date, 'MI' ) );
171     END IF;
172   END IF;
173 
174   IF ( p_x_prd_workoper_rec.scheduled_end_date IS NOT NULL AND
175        p_x_prd_workoper_rec.scheduled_end_date <> FND_API.G_MISS_DATE AND
176        l_job_scheduled_end_date IS NOT NULL AND
177        TRUNC( p_x_prd_workoper_rec.scheduled_end_date ) = TRUNC( l_job_scheduled_end_date ) ) THEN
178     p_x_prd_workoper_rec.scheduled_end_date := l_job_scheduled_end_date;
179     IF ( p_x_prd_workoper_rec.scheduled_end_hr IS NULL OR
180          p_x_prd_workoper_rec.scheduled_end_hr = FND_API.G_MISS_NUM)
181     THEN
182     	p_x_prd_workoper_rec.scheduled_end_hr := TO_NUMBER( TO_CHAR( l_job_scheduled_end_date, 'HH24' ) );
183     END IF;
184 
185     IF ( p_x_prd_workoper_rec.scheduled_end_mi IS NULL OR
186          p_x_prd_workoper_rec.scheduled_end_mi = FND_API.G_MISS_NUM)
187     THEN
188     	p_x_prd_workoper_rec.scheduled_end_mi := TO_NUMBER( TO_CHAR( l_job_scheduled_end_date, 'MI' ) );
189     END IF;
190   ELSIF ( p_x_prd_workoper_rec.scheduled_end_date IS NOT NULL AND
191           p_x_prd_workoper_rec.scheduled_end_date <> FND_API.G_MISS_DATE AND
192           l_job_scheduled_start_date IS NOT NULL AND
193           TRUNC( p_x_prd_workoper_rec.scheduled_end_date ) = TRUNC( l_job_scheduled_start_date ) ) THEN
194     p_x_prd_workoper_rec.scheduled_end_date := l_job_scheduled_start_date;
195     IF ( p_x_prd_workoper_rec.scheduled_end_hr IS NULL OR
196          p_x_prd_workoper_rec.scheduled_end_hr = FND_API.G_MISS_NUM)
197     THEN
198     	p_x_prd_workoper_rec.scheduled_end_hr := TO_NUMBER( TO_CHAR( l_job_scheduled_start_date, 'HH24' ) );
199     END IF;
200 
201     IF ( p_x_prd_workoper_rec.scheduled_end_mi IS NULL OR
202          p_x_prd_workoper_rec.scheduled_end_mi = FND_API.G_MISS_NUM)
203     THEN
204     	p_x_prd_workoper_rec.scheduled_end_mi := TO_NUMBER( TO_CHAR( l_job_scheduled_start_date, 'MI' ) );
205     END IF;
206   END IF;
207 
208   IF ( p_x_prd_workoper_rec.actual_start_date IS NOT NULL AND
209        p_x_prd_workoper_rec.actual_start_date <> FND_API.G_MISS_DATE AND
210        l_job_actual_start_date IS NOT NULL AND
211        TRUNC( p_x_prd_workoper_rec.actual_start_date ) = TRUNC( l_job_actual_start_date ) ) THEN
212     p_x_prd_workoper_rec.actual_start_date := l_job_actual_start_date;
213     p_x_prd_workoper_rec.actual_start_hr := TO_NUMBER( TO_CHAR( l_job_actual_start_date, 'HH24' ) );
214     p_x_prd_workoper_rec.actual_start_mi := TO_NUMBER( TO_CHAR( l_job_actual_start_date, 'MI' ) );
215   END IF;
216 
217   IF ( p_x_prd_workoper_rec.actual_end_date IS NOT NULL AND
218        p_x_prd_workoper_rec.actual_end_date <> FND_API.G_MISS_DATE AND
219        l_job_actual_end_date IS NOT NULL AND
220        TRUNC( p_x_prd_workoper_rec.actual_end_date ) = TRUNC( l_job_actual_end_date ) ) THEN
221     p_x_prd_workoper_rec.actual_end_date := l_job_actual_end_date;
222     p_x_prd_workoper_rec.actual_end_hr := TO_NUMBER( TO_CHAR( l_job_actual_end_date, 'HH24' ) );
223     p_x_prd_workoper_rec.actual_end_mi := TO_NUMBER( TO_CHAR( l_job_scheduled_end_date, 'MI' ) );
224   ELSIF ( p_x_prd_workoper_rec.actual_end_date IS NOT NULL AND
225           p_x_prd_workoper_rec.actual_end_date <> FND_API.G_MISS_DATE AND
226           l_job_actual_start_date IS NOT NULL AND
227           TRUNC( p_x_prd_workoper_rec.actual_end_date ) = TRUNC( l_job_actual_start_date ) ) THEN
228     p_x_prd_workoper_rec.actual_end_date := l_job_actual_start_date;
229     p_x_prd_workoper_rec.actual_end_hr := TO_NUMBER( TO_CHAR( l_job_actual_start_date, 'HH24' ) );
230     p_x_prd_workoper_rec.actual_end_mi := TO_NUMBER( TO_CHAR( l_job_actual_start_date, 'MI' ) );
231   END IF;
232 
233 END default_attributes;
234 
235 PROCEDURE default_missing_attributes
236 (
237   p_x_prd_workoper_rec  IN OUT NOCOPY AHL_PRD_OPERATIONS_PVT.PRD_workoperation_rec,
238   p_module_type                  IN      VARCHAR2
239 )
240 AS
241 cursor get_operation_rec(c_operation_id NUMBER)
242 is
243 SELECT *
244 FROM   AHL_WORKORDER_OPERATIONS_V
245 WHERE  workorder_operation_id=c_operation_id;
246 
247 l_old_operation_rec       get_operation_rec%ROWTYPE;
248 
249 BEGIN
250   OPEN  get_operation_rec(p_x_prd_workoper_rec.WORKORDER_OPERATION_ID);
251   FETCH get_operation_rec INTO l_old_operation_rec;
252   CLOSE get_operation_rec;
253   IF(p_module_type IS NULL OR p_module_type NOT IN ('OAF','JSP'))THEN
254     IF p_x_prd_workoper_rec.SCHEDULED_START_DATE=FND_API.G_MISS_DATE THEN
255       p_x_prd_workoper_rec.SCHEDULED_START_DATE:=NULL;
256     ELSIF p_x_prd_workoper_rec.SCHEDULED_START_DATE IS NULL THEN
257       p_x_prd_workoper_rec.SCHEDULED_START_DATE:=l_old_operation_rec.SCHEDULED_START_DATE;
258     END IF;
259     IF p_x_prd_workoper_rec.SCHEDULED_START_HR=FND_API.G_MISS_NUM THEN
260       p_x_prd_workoper_rec.SCHEDULED_START_HR:=NULL;
261     ELSIF p_x_prd_workoper_rec.SCHEDULED_START_HR IS NULL THEN
262       p_x_prd_workoper_rec.SCHEDULED_START_HR:=l_old_operation_rec.SCHEDULED_START_HR;
263     END IF;
264 
265     IF p_x_prd_workoper_rec.SCHEDULED_START_MI=FND_API.G_MISS_NUM THEN
266       p_x_prd_workoper_rec.SCHEDULED_START_MI:=NULL;
267     ELSIF p_x_prd_workoper_rec.SCHEDULED_START_MI IS NULL THEN
268       p_x_prd_workoper_rec.SCHEDULED_START_MI:=l_old_operation_rec.SCHEDULED_START_MI;
269     END IF;
270 
271     IF p_x_prd_workoper_rec.SCHEDULED_END_DATE=FND_API.G_MISS_DATE THEN
272       p_x_prd_workoper_rec.SCHEDULED_END_DATE:=NULL;
273     ELSIF p_x_prd_workoper_rec.SCHEDULED_END_DATE IS NULL THEN
274       p_x_prd_workoper_rec.SCHEDULED_END_DATE:=l_old_operation_rec.SCHEDULED_END_DATE;
275     END IF;
276 
277     IF p_x_prd_workoper_rec.SCHEDULED_END_HR=FND_API.G_MISS_NUM THEN
278       p_x_prd_workoper_rec.SCHEDULED_END_HR:=NULL;
279     ELSIF p_x_prd_workoper_rec.SCHEDULED_END_HR IS NULL THEN
280       p_x_prd_workoper_rec.SCHEDULED_END_HR:=l_old_operation_rec.SCHEDULED_END_HR;
281     END IF;
282 
283     IF p_x_prd_workoper_rec.SCHEDULED_END_MI=FND_API.G_MISS_NUM THEN
284       p_x_prd_workoper_rec.SCHEDULED_END_MI:=NULL;
285     ELSIF p_x_prd_workoper_rec.SCHEDULED_END_MI IS NULL THEN
286       p_x_prd_workoper_rec.SCHEDULED_END_MI:=l_old_operation_rec.SCHEDULED_END_MI;
287     END IF;
288 
289     IF p_x_prd_workoper_rec.ACTUAL_START_DATE=FND_API.G_MISS_DATE THEN
290       p_x_prd_workoper_rec.ACTUAL_START_DATE:=NULL;
291     ELSIF p_x_prd_workoper_rec.ACTUAL_START_DATE IS NULL THEN
292       p_x_prd_workoper_rec.ACTUAL_START_DATE:=l_old_operation_rec.ACTUAL_START_DATE;
293     END IF;
294 
295     IF p_x_prd_workoper_rec.ACTUAL_START_HR=FND_API.G_MISS_NUM THEN
296       p_x_prd_workoper_rec.ACTUAL_START_HR:=NULL;
297     ELSIF p_x_prd_workoper_rec.ACTUAL_START_HR IS NULL THEN
298       p_x_prd_workoper_rec.ACTUAL_START_HR:=l_old_operation_rec.ACTUAL_START_HR;
299     END IF;
300 
301     IF p_x_prd_workoper_rec.ACTUAL_START_MI=FND_API.G_MISS_NUM THEN
302       p_x_prd_workoper_rec.ACTUAL_START_MI:=NULL;
303     ELSIF p_x_prd_workoper_rec.ACTUAL_START_MI IS NULL THEN
304       p_x_prd_workoper_rec.ACTUAL_START_MI:=l_old_operation_rec.ACTUAL_START_MI;
305     END IF;
306 
307     IF p_x_prd_workoper_rec.ACTUAL_END_DATE=FND_API.G_MISS_DATE THEN
308       p_x_prd_workoper_rec.ACTUAL_END_DATE:=NULL;
309     ELSIF p_x_prd_workoper_rec.ACTUAL_END_DATE IS NULL THEN
310       p_x_prd_workoper_rec.ACTUAL_END_DATE:=l_old_operation_rec.ACTUAL_END_DATE;
311     END IF;
312 
313     IF p_x_prd_workoper_rec.ACTUAL_END_HR=FND_API.G_MISS_NUM THEN
314       p_x_prd_workoper_rec.ACTUAL_END_HR:=NULL;
315     ELSIF p_x_prd_workoper_rec.ACTUAL_END_HR IS NULL THEN
316       p_x_prd_workoper_rec.ACTUAL_END_HR:=l_old_operation_rec.ACTUAL_END_HR;
317     END IF;
318 
319     IF p_x_prd_workoper_rec.ACTUAL_END_MI=FND_API.G_MISS_NUM THEN
320       p_x_prd_workoper_rec.ACTUAL_END_MI:=NULL;
321     ELSIF p_x_prd_workoper_rec.ACTUAL_END_MI IS NULL THEN
322       p_x_prd_workoper_rec.ACTUAL_END_MI:=l_old_operation_rec.ACTUAL_END_MI;
323     END IF;
324   ELSIF p_module_type = 'JSP' THEN
325     IF p_x_prd_workoper_rec.SCHEDULED_START_DATE IS NOT NULL THEN
326       IF p_x_prd_workoper_rec.SCHEDULED_START_HR=FND_API.G_MISS_NUM THEN
327         p_x_prd_workoper_rec.SCHEDULED_START_HR:=NULL;
328       ELSIF p_x_prd_workoper_rec.SCHEDULED_START_HR IS NULL THEN
329         p_x_prd_workoper_rec.SCHEDULED_START_HR:=l_old_operation_rec.SCHEDULED_START_HR;
330       END IF;
331       IF p_x_prd_workoper_rec.SCHEDULED_START_MI=FND_API.G_MISS_NUM THEN
332          p_x_prd_workoper_rec.SCHEDULED_START_MI:=NULL;
333       ELSIF p_x_prd_workoper_rec.SCHEDULED_START_MI IS NULL THEN
334          p_x_prd_workoper_rec.SCHEDULED_START_MI:=l_old_operation_rec.SCHEDULED_START_MI;
335       END IF;
336     END IF;
337 
338     IF p_x_prd_workoper_rec.SCHEDULED_END_DATE IS NOT NULL THEN
339       IF p_x_prd_workoper_rec.SCHEDULED_END_HR=FND_API.G_MISS_NUM THEN
340         p_x_prd_workoper_rec.SCHEDULED_END_HR:=NULL;
341       ELSIF p_x_prd_workoper_rec.SCHEDULED_END_HR IS NULL THEN
342         p_x_prd_workoper_rec.SCHEDULED_END_HR:=l_old_operation_rec.SCHEDULED_END_HR;
343       END IF;
344       IF p_x_prd_workoper_rec.SCHEDULED_END_MI=FND_API.G_MISS_NUM THEN
345         p_x_prd_workoper_rec.SCHEDULED_END_MI:=NULL;
346       ELSIF p_x_prd_workoper_rec.SCHEDULED_END_MI IS NULL THEN
347         p_x_prd_workoper_rec.SCHEDULED_END_MI:=l_old_operation_rec.SCHEDULED_END_MI;
348       END IF;
349     END IF;
350 
351     IF p_x_prd_workoper_rec.ACTUAL_START_DATE IS NOT NULL THEN
352       IF p_x_prd_workoper_rec.ACTUAL_START_HR=FND_API.G_MISS_NUM THEN
353         p_x_prd_workoper_rec.ACTUAL_START_HR:=NULL;
354       ELSIF p_x_prd_workoper_rec.ACTUAL_START_HR IS NULL THEN
355         p_x_prd_workoper_rec.ACTUAL_START_HR:=l_old_operation_rec.ACTUAL_START_HR;
356       END IF;
357 
358       IF p_x_prd_workoper_rec.ACTUAL_START_MI=FND_API.G_MISS_NUM THEN
359          p_x_prd_workoper_rec.ACTUAL_START_MI:=NULL;
360       ELSIF p_x_prd_workoper_rec.ACTUAL_START_MI IS NULL THEN
361          p_x_prd_workoper_rec.ACTUAL_START_MI:=l_old_operation_rec.ACTUAL_START_MI;
362       END IF;
363     END IF;
364 
365     IF p_x_prd_workoper_rec.ACTUAL_END_DATE IS NOT NULL THEN
366       IF p_x_prd_workoper_rec.ACTUAL_END_HR=FND_API.G_MISS_NUM THEN
367         p_x_prd_workoper_rec.ACTUAL_END_HR:=NULL;
368       ELSIF p_x_prd_workoper_rec.ACTUAL_END_HR IS NULL THEN
369         p_x_prd_workoper_rec.ACTUAL_END_HR:=l_old_operation_rec.ACTUAL_END_HR;
370       END IF;
371       IF p_x_prd_workoper_rec.ACTUAL_END_MI=FND_API.G_MISS_NUM THEN
372         p_x_prd_workoper_rec.ACTUAL_END_MI:=NULL;
373       ELSIF p_x_prd_workoper_rec.ACTUAL_END_MI IS NULL THEN
374         p_x_prd_workoper_rec.ACTUAL_END_MI:=l_old_operation_rec.ACTUAL_END_MI;
375       END IF;
376     END IF;
377   END IF;
378 
379    IF p_x_prd_workoper_rec.DEPARTMENT_ID= FND_API.G_MISS_NUM THEN
380      p_x_prd_workoper_rec.DEPARTMENT_ID:=NULL;
381    ELSIF p_x_prd_workoper_rec.DEPARTMENT_ID IS NULL THEN
382      p_x_prd_workoper_rec.DEPARTMENT_ID:=l_old_operation_rec.DEPARTMENT_ID;
383    END IF;
384 
385    IF p_x_prd_workoper_rec.DEPARTMENT_NAME= FND_API.G_MISS_CHAR THEN
386       p_x_prd_workoper_rec.DEPARTMENT_NAME:=NULL;
387    ELSIF p_x_prd_workoper_rec.DEPARTMENT_NAME IS NULL THEN
388       p_x_prd_workoper_rec.DEPARTMENT_NAME:=l_old_operation_rec.DEPARTMENT_NAME;
389    END IF;
390 
391   IF p_x_prd_workoper_rec.STATUS_CODE= FND_API.G_MISS_CHAR THEN
392     p_x_prd_workoper_rec.STATUS_CODE:=NULL;
393    ELSIF p_x_prd_workoper_rec.STATUS_CODE IS NULL THEN
394     p_x_prd_workoper_rec.STATUS_CODE:=l_old_operation_rec.STATUS_CODE;
395    END IF;
396 
397   IF p_x_prd_workoper_rec.STATUS_MEANING= FND_API.G_MISS_CHAR THEN
398      p_x_prd_workoper_rec.STATUS_MEANING:=NULL;
399   ELSIF p_x_prd_workoper_rec.STATUS_MEANING IS NULL THEN
400     p_x_prd_workoper_rec.STATUS_MEANING:=l_old_operation_rec.STATUS;
401   END IF;
402 
403   IF p_x_prd_workoper_rec.OPERATION_ID= FND_API.G_MISS_NUM THEN
404     p_x_prd_workoper_rec.OPERATION_ID:=NULL;
405   ELSIF p_x_prd_workoper_rec.OPERATION_ID IS NULL THEN
406     p_x_prd_workoper_rec.OPERATION_ID:=l_old_operation_rec.OPERATION_ID;
407   END IF;
408 
409   IF p_x_prd_workoper_rec.OPERATION_CODE= FND_API.G_MISS_CHAR THEN
410     p_x_prd_workoper_rec.OPERATION_CODE:=NULL;
411   ELSIF p_x_prd_workoper_rec.OPERATION_CODE IS NULL THEN
412     p_x_prd_workoper_rec.OPERATION_CODE:=l_old_operation_rec.OPERATION_CODE;
413   END IF;
414 
415   IF p_x_prd_workoper_rec.OPERATION_TYPE_CODE= FND_API.G_MISS_CHAR THEN
416     p_x_prd_workoper_rec.OPERATION_TYPE_CODE:=NULL;
417   ELSIF p_x_prd_workoper_rec.OPERATION_TYPE_CODE IS NULL THEN
418     p_x_prd_workoper_rec.OPERATION_TYPE_CODE:=l_old_operation_rec.OPERATION_TYPE_CODE;
419   END IF;
420 
421   IF p_x_prd_workoper_rec.OPERATION_TYPE= FND_API.G_MISS_CHAR THEN
422     p_x_prd_workoper_rec.OPERATION_TYPE:=NULL;
423   ELSIF p_x_prd_workoper_rec.OPERATION_TYPE IS NULL THEN
424     p_x_prd_workoper_rec.OPERATION_TYPE:=l_old_operation_rec.OPERATION_TYPE;
425   END IF;
426 
427   IF p_x_prd_workoper_rec.PLAN_ID= FND_API.G_MISS_NUM THEN
428     p_x_prd_workoper_rec.PLAN_ID:=NULL;
429   ELSIF p_x_prd_workoper_rec.PLAN_ID IS NULL THEN
430     p_x_prd_workoper_rec.PLAN_ID:=l_old_operation_rec.PLAN_ID;
431   END IF;
432 
433   IF p_x_prd_workoper_rec.COLLECTION_ID= FND_API.G_MISS_NUM THEN
434     p_x_prd_workoper_rec.COLLECTION_ID:=NULL;
435   ELSIF p_x_prd_workoper_rec.COLLECTION_ID IS NULL THEN
436     p_x_prd_workoper_rec.COLLECTION_ID:=l_old_operation_rec.COLLECTION_ID;
437   END IF;
438 
439   IF p_x_prd_workoper_rec.OPERATION_DESCRIPTION= FND_API.G_MISS_CHAR THEN
440     p_x_prd_workoper_rec.OPERATION_DESCRIPTION:=NULL;
441   ELSIF p_x_prd_workoper_rec.OPERATION_DESCRIPTION IS NULL THEN
442     p_x_prd_workoper_rec.OPERATION_DESCRIPTION:=l_old_operation_rec.DESCRIPTION;
443   END IF;
444 
445   IF p_x_prd_workoper_rec.ATTRIBUTE_CATEGORY= FND_API.G_MISS_CHAR THEN
446     p_x_prd_workoper_rec.ATTRIBUTE_CATEGORY:=NULL;
447   ELSIF p_x_prd_workoper_rec.ATTRIBUTE_CATEGORY IS NULL THEN
448     p_x_prd_workoper_rec.ATTRIBUTE_CATEGORY:=l_old_operation_rec.ATTRIBUTE_CATEGORY;
449   END IF;
450 
451   IF p_x_prd_workoper_rec.ATTRIBUTE1= FND_API.G_MISS_CHAR THEN
452     p_x_prd_workoper_rec.ATTRIBUTE1:=NULL;
453   ELSIF p_x_prd_workoper_rec.ATTRIBUTE1 IS NULL THEN
454     p_x_prd_workoper_rec.ATTRIBUTE1:=l_old_operation_rec.ATTRIBUTE1;
455   END IF;
456 
457   IF p_x_prd_workoper_rec.ATTRIBUTE2= FND_API.G_MISS_CHAR THEN
458     p_x_prd_workoper_rec.ATTRIBUTE2:=NULL;
459   ELSIF p_x_prd_workoper_rec.ATTRIBUTE2 IS NULL THEN
460     p_x_prd_workoper_rec.ATTRIBUTE2:=l_old_operation_rec.ATTRIBUTE2;
461   END IF;
462 
463   IF p_x_prd_workoper_rec.ATTRIBUTE3= FND_API.G_MISS_CHAR THEN
464     p_x_prd_workoper_rec.ATTRIBUTE3:=NULL;
465   ELSIF p_x_prd_workoper_rec.ATTRIBUTE3 IS NULL THEN
466     p_x_prd_workoper_rec.ATTRIBUTE3:=l_old_operation_rec.ATTRIBUTE3;
467   END IF;
468 
469   IF p_x_prd_workoper_rec.ATTRIBUTE4= FND_API.G_MISS_CHAR THEN
470     p_x_prd_workoper_rec.ATTRIBUTE4:=NULL;
471   ELSIF p_x_prd_workoper_rec.ATTRIBUTE4 IS NULL THEN
472     p_x_prd_workoper_rec.ATTRIBUTE4:=l_old_operation_rec.ATTRIBUTE4;
473   END IF;
474 
475   IF p_x_prd_workoper_rec.ATTRIBUTE5= FND_API.G_MISS_CHAR THEN
476     p_x_prd_workoper_rec.ATTRIBUTE5:=NULL;
477   ELSIF p_x_prd_workoper_rec.ATTRIBUTE5 IS NULL THEN
478     p_x_prd_workoper_rec.ATTRIBUTE5:=l_old_operation_rec.ATTRIBUTE5;
479   END IF;
480 
481   IF p_x_prd_workoper_rec.ATTRIBUTE6= FND_API.G_MISS_CHAR THEN
482     p_x_prd_workoper_rec.ATTRIBUTE6:=NULL;
483   ELSIF p_x_prd_workoper_rec.ATTRIBUTE6 IS NULL THEN
484     p_x_prd_workoper_rec.ATTRIBUTE6:=l_old_operation_rec.ATTRIBUTE6;
485   END IF;
486 
487   IF p_x_prd_workoper_rec.ATTRIBUTE7= FND_API.G_MISS_CHAR THEN
488     p_x_prd_workoper_rec.ATTRIBUTE7:=NULL;
489   ELSIF p_x_prd_workoper_rec.ATTRIBUTE7 IS NULL THEN
490     p_x_prd_workoper_rec.ATTRIBUTE7:=l_old_operation_rec.ATTRIBUTE7;
491   END IF;
492 
493   IF p_x_prd_workoper_rec.ATTRIBUTE8= FND_API.G_MISS_CHAR THEN
494     p_x_prd_workoper_rec.ATTRIBUTE8:=NULL;
495   ELSIF p_x_prd_workoper_rec.ATTRIBUTE8 IS NULL THEN
496     p_x_prd_workoper_rec.ATTRIBUTE8:=l_old_operation_rec.ATTRIBUTE8;
497   END IF;
498 
499   IF p_x_prd_workoper_rec.ATTRIBUTE9= FND_API.G_MISS_CHAR THEN
500     p_x_prd_workoper_rec.ATTRIBUTE9:=NULL;
501   ELSIF p_x_prd_workoper_rec.ATTRIBUTE9 IS NULL THEN
502     p_x_prd_workoper_rec.ATTRIBUTE9:=l_old_operation_rec.ATTRIBUTE9;
503   END IF;
504 
505   IF p_x_prd_workoper_rec.ATTRIBUTE10= FND_API.G_MISS_CHAR THEN
506     p_x_prd_workoper_rec.ATTRIBUTE10:=NULL;
507   ELSIF p_x_prd_workoper_rec.ATTRIBUTE10 IS NULL THEN
508     p_x_prd_workoper_rec.ATTRIBUTE10:=l_old_operation_rec.ATTRIBUTE10;
509   END IF;
510 
511   IF p_x_prd_workoper_rec.ATTRIBUTE11= FND_API.G_MISS_CHAR THEN
512     p_x_prd_workoper_rec.ATTRIBUTE11:=NULL;
513   ELSIF p_x_prd_workoper_rec.ATTRIBUTE11 IS NULL THEN
514     p_x_prd_workoper_rec.ATTRIBUTE11:=l_old_operation_rec.ATTRIBUTE11;
515   END IF;
516 
517   IF p_x_prd_workoper_rec.ATTRIBUTE12= FND_API.G_MISS_CHAR THEN
518     p_x_prd_workoper_rec.ATTRIBUTE12:=NULL;
519   ELSIF p_x_prd_workoper_rec.ATTRIBUTE12 IS NULL THEN
520     p_x_prd_workoper_rec.ATTRIBUTE12:=l_old_operation_rec.ATTRIBUTE12;
521   END IF;
522 
523   IF p_x_prd_workoper_rec.ATTRIBUTE13= FND_API.G_MISS_CHAR THEN
524     p_x_prd_workoper_rec.ATTRIBUTE13:=NULL;
525   ELSIF p_x_prd_workoper_rec.ATTRIBUTE13 IS NULL THEN
526     p_x_prd_workoper_rec.ATTRIBUTE13:=l_old_operation_rec.ATTRIBUTE13;
527   END IF;
528 
529   IF p_x_prd_workoper_rec.ATTRIBUTE14= FND_API.G_MISS_CHAR THEN
530     p_x_prd_workoper_rec.ATTRIBUTE14:=NULL;
531   ELSIF p_x_prd_workoper_rec.ATTRIBUTE14 IS NULL THEN
532     p_x_prd_workoper_rec.ATTRIBUTE14:=l_old_operation_rec.ATTRIBUTE14;
533   END IF;
534 
535   IF p_x_prd_workoper_rec.ATTRIBUTE15= FND_API.G_MISS_CHAR THEN
536     p_x_prd_workoper_rec.ATTRIBUTE15:=NULL;
537   ELSIF p_x_prd_workoper_rec.ATTRIBUTE15 IS NULL THEN
538     p_x_prd_workoper_rec.ATTRIBUTE15:=l_old_operation_rec.ATTRIBUTE15;
539   END IF;
540 
541   IF p_x_prd_workoper_rec.WORKORDER_OPERATION_ID= FND_API.G_MISS_NUM THEN
542     p_x_prd_workoper_rec.WORKORDER_OPERATION_ID:=NULL;
543   ELSIF p_x_prd_workoper_rec.WORKORDER_OPERATION_ID IS NULL THEN
544     p_x_prd_workoper_rec.WORKORDER_OPERATION_ID:=l_old_operation_rec.WORKORDER_OPERATION_ID;
545   END IF;
546 
547   IF p_x_prd_workoper_rec.ORGANIZATION_ID= FND_API.G_MISS_NUM THEN
548     p_x_prd_workoper_rec.ORGANIZATION_ID:=NULL;
549   ELSIF p_x_prd_workoper_rec.ORGANIZATION_ID IS NULL THEN
550     p_x_prd_workoper_rec.ORGANIZATION_ID:=l_old_operation_rec.ORGANIZATION_ID;
551   END IF;
552 
553   IF p_x_prd_workoper_rec.OPERATION_SEQUENCE_NUM= FND_API.G_MISS_NUM THEN
554     p_x_prd_workoper_rec.OPERATION_SEQUENCE_NUM:=NULL;
555   ELSIF p_x_prd_workoper_rec.OPERATION_SEQUENCE_NUM IS NULL THEN
556     p_x_prd_workoper_rec.OPERATION_SEQUENCE_NUM:=l_old_operation_rec.OPERATION_SEQUENCE_NUM;
557   END IF;
558 
559   IF p_x_prd_workoper_rec.WORKORDER_ID= FND_API.G_MISS_NUM THEN
560     p_x_prd_workoper_rec.WORKORDER_ID:=NULL;
561   ELSIF p_x_prd_workoper_rec.WORKORDER_ID IS NULL THEN
562     p_x_prd_workoper_rec.WORKORDER_ID:=l_old_operation_rec.WORKORDER_ID;
563   END IF;
564 
565   IF p_x_prd_workoper_rec.WIP_ENTITY_ID= FND_API.G_MISS_NUM THEN
566     p_x_prd_workoper_rec.WIP_ENTITY_ID:=NULL;
567   ELSIF p_x_prd_workoper_rec.WIP_ENTITY_ID IS NULL THEN
568     p_x_prd_workoper_rec.WIP_ENTITY_ID:=l_old_operation_rec.WIP_ENTITY_ID;
569   END IF;
570 
571   IF p_x_prd_workoper_rec.OBJECT_VERSION_NUMBER= FND_API.G_MISS_NUM THEN
572     p_x_prd_workoper_rec.OBJECT_VERSION_NUMBER:=NULL;
573   ELSIF p_x_prd_workoper_rec.OBJECT_VERSION_NUMBER IS NULL THEN
574     p_x_prd_workoper_rec.OBJECT_VERSION_NUMBER:=l_old_operation_rec.OBJECT_VERSION_NUMBER;
575   END IF;
576 
577   IF p_x_prd_workoper_rec.LAST_UPDATE_DATE=FND_API.G_MISS_DATE THEN
578     p_x_prd_workoper_rec.LAST_UPDATE_DATE:=NULL;
579   ELSIF p_x_prd_workoper_rec.LAST_UPDATE_DATE IS NULL THEN
580     p_x_prd_workoper_rec.LAST_UPDATE_DATE:=l_old_operation_rec.LAST_UPDATE_DATE;
581   END IF;
582 
583   IF p_x_prd_workoper_rec.LAST_UPDATED_BY= FND_API.G_MISS_NUM THEN
584     p_x_prd_workoper_rec.LAST_UPDATED_BY:=NULL;
585   ELSIF p_x_prd_workoper_rec.LAST_UPDATED_BY IS NULL THEN
586     p_x_prd_workoper_rec.LAST_UPDATED_BY:=l_old_operation_rec.LAST_UPDATED_BY;
587   END IF;
588 
589   IF p_x_prd_workoper_rec.CREATION_DATE=FND_API.G_MISS_DATE THEN
590     p_x_prd_workoper_rec.CREATION_DATE:=NULL;
591   ELSIF p_x_prd_workoper_rec.CREATION_DATE IS NULL THEN
592     p_x_prd_workoper_rec.CREATION_DATE:=l_old_operation_rec.CREATION_DATE;
593   END IF;
594 
595   IF p_x_prd_workoper_rec.CREATED_BY= FND_API.G_MISS_NUM THEN
596     p_x_prd_workoper_rec.CREATED_BY:=NULL;
597   ELSIF p_x_prd_workoper_rec.CREATED_BY IS NULL THEN
598     p_x_prd_workoper_rec.CREATED_BY:=l_old_operation_rec.CREATED_BY;
599   END IF;
600 
601   IF p_x_prd_workoper_rec.LAST_UPDATE_LOGIN= FND_API.G_MISS_NUM THEN
602     p_x_prd_workoper_rec.LAST_UPDATE_LOGIN:=NULL;
603   ELSIF p_x_prd_workoper_rec.LAST_UPDATE_LOGIN IS NULL THEN
604     p_x_prd_workoper_rec.LAST_UPDATE_LOGIN:=l_old_operation_rec.LAST_UPDATE_LOGIN;
605   END IF;
606 
607 
608 END default_missing_attributes;
609 
610 FUNCTION is_valid_operation_update(
611                       	p_operation_id   IN 	NUMBER,
612                       	p_wo_op_id       IN     NUMBER,
613                       	p_operation_code IN 	VARCHAR2,
614                       	p_dml_operation  IN 	VARCHAR2
615 )
616 RETURN NUMBER
617 IS
618 
619 ---- declare cursors here----
620 -- cursor for getting operation code of existing work order operation
621 CURSOR c_get_wo_op(p_wo_op_id IN NUMBER)
622 IS
623 SELECT
624    rop.concatenated_segments
625 FROM
626    AHL_WORKORDER_OPERATIONS wop,
627    AHL_OPERATIONS_B_KFV rop
628 WHERE
629        rop.operation_id = wop.operation_id
630    AND wop.workorder_operation_id = p_wo_op_id;
631 
632 -- cursor for getting latest revision of the operation
633 CURSOR get_operation(c_operation_code VARCHAR2)
634 IS
635 SELECT OP.operation_id
636 FROM   AHL_OPERATIONS_B_KFV OP
637 WHERE  OP.concatenated_segments=c_operation_code
638 AND    OP.revision_number IN
639          ( SELECT MAX(OP1.revision_number)
640            FROM   AHL_OPERATIONS_B_KFV OP1
641            WHERE  OP1.concatenated_segments=OP.concatenated_segments
642            AND    TRUNC(SYSDATE) BETWEEN TRUNC(OP1.start_date_active) AND
643                                          TRUNC(NVL(OP1.end_date_active,SYSDATE+1))
644            AND    OP1.revision_status_code='COMPLETE'
645          );
646 
647 ---- declare local variables here----
648 l_existing_op_code     VARCHAR2(154);
649 l_operation_id         NUMBER;
650 
651 BEGIN
652 
653    -- dump all the inputs
654 
655    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
656 		fnd_log.string
657 		(
658 			fnd_log.level_statement,
659 			'ahl.plsql.AHL_PRD_OPERATIONS_PVT.is_valid_operation_update',
660 			'p_operation_id : ' || p_operation_id
661 		);
662         fnd_log.string
663 		(
664 			fnd_log.level_statement,
665 			'ahl.plsql.AHL_PRD_OPERATIONS_PVT.is_valid_operation_update',
666 			'p_wo_op_id : ' || p_wo_op_id
667 		);
668         fnd_log.string
669 		(
670 			fnd_log.level_statement,
671 			'ahl.plsql.AHL_PRD_OPERATIONS_PVT.is_valid_operation_update',
672 			'p_operation_code : ' || p_operation_code
673 		);
674         fnd_log.string
675 		(
676 			fnd_log.level_statement,
677 			'ahl.plsql.AHL_PRD_OPERATIONS_PVT.is_valid_operation_update',
678 			'p_dml_operation : ' || p_dml_operation
679 		);
680    END IF;
681 
682 
683    l_operation_id := p_operation_id;
684 
685    -- create case
686    IF (
687         p_dml_operation = 'C'
688         AND
689         p_operation_code IS NOT NULL
690       )
691    THEN
692 
693       OPEN get_operation(p_operation_code);
694       FETCH get_operation INTO l_operation_id;
695       CLOSE get_operation;
696 
697    -- update case
698    ELSIF (
699           p_dml_operation = 'U'
700           --AND p_operation_id IS NULL
701           AND
702           p_operation_code IS NOT NULL
703           AND
704           p_operation_code <> FND_API.G_MISS_CHAR
705          )
706    THEN
707                 OPEN c_get_wo_op(p_wo_op_id);
708          	FETCH c_get_wo_op INTO l_existing_op_code;
709          	CLOSE c_get_wo_op;
710 
711          	IF nvl(l_existing_op_code, '-1') <> p_operation_code
712          	THEN
713 
714 		      OPEN get_operation(p_operation_code);
715 		      FETCH get_operation INTO l_operation_id;
716 		      CLOSE get_operation;
717 
718          	END IF;
719    END IF;
720 
721    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
722 		fnd_log.string
723 		(
724 			fnd_log.level_statement,
725 			'ahl.plsql.AHL_PRD_OPERATIONS_PVT.is_valid_operation_update',
726 			'Operation id returned -> l_operation_id : ' || l_operation_id
727 		);
728    END IF;
729 
730    RETURN l_operation_id;
731 
732 END is_valid_operation_update;
733 PROCEDURE convert_values_to_ids
734 (
735   p_x_prd_workoper_rec IN OUT NOCOPY AHL_PRD_OPERATIONS_PVT.prd_workoperation_rec,
736   p_module_type IN VARCHAR2
737 )
738 As
739 
740 CURSOR get_operation(c_operation_code VARCHAR2)
741 IS
742 SELECT operation_id
743 FROM   AHL_OPERATIONS_B_KFV
744 WHERE  concatenated_segments=c_operation_code
745 AND    TRUNC(SYSDATE) BETWEEN TRUNC(NVL(start_date_active,SYSDATE))
746                       AND  TRUNC(NVL(end_date_active,SYSDATE+1))
747 AND    revision_status_code='COMPLETE';
748 
749 CURSOR get_department(c_department_name VARCHAR2,c_org_id NUMBER)
750 IS
751 SELECT A.Department_id,
752        A.department_code,
753        A.description
754 FROM   BOM_DEPARTMENTS A
755 WHERE  UPPER(A.description) LIKE UPPER(c_department_name)
756 AND    A.organization_id=c_org_id;
757 
758 l_dept_rec              get_department%ROWTYPE;
759 
760 CURSOR get_operation_type(c_operation_type VARCHAR2)
761 IS
762 SELECT lookup_code
763 FROM   FND_LOOKUP_VALUES_VL
764 WHERE  lookup_type='AHL_OPERATION_TYPE'
765 AND    UPPER(meaning)=UPPER(c_operation_type)
766 AND    TRUNC(SYSDATE) BETWEEN TRUNC(NVL(start_date_active,SYSDATE))
767                       AND TRUNC(NVL(end_date_active,SYSDATE+1));
768 
769 CURSOR get_completion_sub_inv(c_com_subinv VARCHAR2,c_inventory_item_id NUMBER)
770 IS
771 SELECT a.Secondary_inventory
772 FROM   MTL_ITEM_SUB_INVENTORIES a,
773        MTL_PARAMETERS b
774 WHERE  a.Secondary_inventory=c_com_subinv
775 AND    a.organization_id=b.organization_id
776 AND    a.inventory_item_id=c_inventory_item_id;
777 
778 -- Balaji added for Release NR error
779 CURSOR get_op_sch_sec(c_wip_entity_id IN NUMBER, c_op_seq_no IN NUMBER)
780 IS
781 SELECT
782    TO_CHAR(FIRST_UNIT_START_DATE, 'ss') schedule_start_sec,
783    TO_CHAR(LAST_UNIT_COMPLETION_DATE, 'ss') schedule_end_sec
784 FROM
785    WIP_OPERATIONS
786 WHERE
787    WIP_ENTITY_ID = c_wip_entity_id AND
788    OPERATION_SEQ_NUM = c_op_seq_no;
789 
790 -- Balaji added for Release NR error
791 CURSOR get_op_act_sec(c_wo_op_id IN NUMBER)
792 IS
793 SELECT
794    TO_CHAR(ACTUAL_START_DATE, 'ss') actual_start_sec,
795    TO_CHAR(ACTUAL_END_DATE, 'ss') actual_end_sec
796 FROM
797    AHL_WORKORDER_OPERATIONS
798 WHERE
799    workorder_operation_id = c_wo_op_id;
800 
801 l_compl_subinv_rec      get_completion_sub_inv%ROWTYPE;
802 
803 l_ctr                   NUMBER:=0;
804 --l_hour                  VARCHAR2(30);
805 l_sec                   VARCHAR2(30);
806 --l_minutes               VARCHAR2(30);
807 --l_date_time             VARCHAR2(30);
808 l_sch_start_sec         VARCHAR2(30);
809 l_sch_end_sec           VARCHAR2(30);
810 l_act_start_sec         VARCHAR2(30);
811 l_act_end_sec           VARCHAR2(30);
812 l_operation_id          NUMBER;
813 
814 BEGIN
815   /*
816   -- Bug # 6717357 -- start
817   IF p_x_prd_workoper_rec.OPERATION_CODE IS NOT NULL AND
818      p_x_prd_workoper_rec.OPERATION_CODE<>FND_API.G_MISS_CHAR THEN
819     OPEN  get_operation(p_x_prd_workoper_rec.OPERATION_CODE);
820     FETCH get_operation INTO p_x_prd_workoper_rec.OPERATION_ID;
821 
822     IF    get_operation%NOTFOUND THEN
823       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPERATION_CODE_INVALID');
824       FND_MESSAGE.SET_TOKEN('FIELD1',p_x_prd_workoper_rec.operation_sequence_num,false);
825       FND_MSG_PUB.ADD;
826     END IF;
827     CLOSE get_operation;
828   END IF;
829   -- Bug # 6717357 -- end
830   */
831 
832   -- Added following code for Bug # 6717357 -- start
833   -- Operation code need to be converted to id in following cases
834   -- 1. DML operation is CREATE
835   -- 2. DML operation is UPDATE and Operation code is updated.
836   l_operation_id := is_valid_operation_update(
837                       	p_operation_id 		=>	p_x_prd_workoper_rec.operation_id,
838                       	p_wo_op_id		=>	p_x_prd_workoper_rec.workorder_operation_id,
839                       	p_operation_code	=>	p_x_prd_workoper_rec.operation_code,
840                       	p_dml_operation 	=>	p_x_prd_workoper_rec.dml_operation
841   		      );
842 
843   IF p_x_prd_workoper_rec.operation_code IS NOT NULL AND
844      l_operation_id IS NULL
845   THEN
846      FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPERATION_CODE_INVALID');
847      FND_MESSAGE.SET_TOKEN('FIELD1',p_x_prd_workoper_rec.operation_sequence_num,false);
848      FND_MSG_PUB.ADD;
849   ELSE
850      p_x_prd_workoper_rec.OPERATION_ID := l_operation_id;
851   END IF;
852   -- Added following code for Bug # 6717357 -- End
853   IF p_x_prd_workoper_rec.department_name IS NOT NULL AND
854      p_x_prd_workoper_rec.department_name<>FND_API.G_MISS_CHAR THEN
855     OPEN  get_department(p_x_prd_workoper_rec.department_name,p_x_prd_workoper_rec.organization_id);
856     FETCH get_department  INTO l_dept_rec;
857 
858     IF    get_department%NOTFOUND THEN
859       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_NAME_INVALID');
860       FND_MESSAGE.SET_TOKEN('FIELD1',p_x_prd_workoper_rec.department_name,false);
861       FND_MESSAGE.SET_TOKEN('RECORD',p_x_prd_workoper_rec.operation_sequence_num,false);
862       FND_MSG_PUB.ADD;
863     ELSIF   get_department%FOUND THEN
864       p_x_prd_workoper_rec.department_id:=l_dept_rec.department_id;
865     END IF;
866     CLOSE get_department;
867   END IF;
868 
869   IF p_x_prd_workoper_rec.OPERATION_TYPE IS NOT NULL AND
870      p_x_prd_workoper_rec.OPERATION_TYPE<>FND_API.G_MISS_CHAR THEN
871     OPEN  get_operation_type(p_x_prd_workoper_rec.OPERATION_TYPE);
872     FETCH get_operation_type  INTO p_x_prd_workoper_rec.OPERATION_TYPE_CODE;
873 
874     IF    get_operation_type%NOTFOUND THEN
875       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPERATION_TYPE_INVALID');
876       FND_MESSAGE.SET_TOKEN('FIELD1',p_x_prd_workoper_rec.OPERATION_TYPE,false);
877       FND_MESSAGE.SET_TOKEN('RECORD',p_x_prd_workoper_rec.operation_sequence_num,false);
878       FND_MSG_PUB.ADD;
879     END IF;
880     CLOSE get_operation_type;
881   END IF;
882 
883   OPEN get_op_sch_sec(p_x_prd_workoper_rec.wip_entity_id, p_x_prd_workoper_rec.operation_sequence_num);
884   FETCH get_op_sch_sec INTO l_sch_start_sec, l_sch_end_sec;
885   CLOSE get_op_sch_sec;
886 
887   IF ( G_DEBUG = 'Y' ) THEN
888       AHL_DEBUG_PUB.debug( 'p_x_prd_workoper_rec.SCHEDULED_START_DATE : ' || to_char(p_x_prd_workoper_rec.SCHEDULED_START_DATE,'DD-MON-YY hh24:mi:ss') );
889   END IF;
890 
891   IF p_x_prd_workoper_rec.SCHEDULED_START_DATE IS NOT NULL AND
892      p_x_prd_workoper_rec.SCHEDULED_START_DATE <> FND_API.G_MISS_DATE THEN
893 
894     l_sec := TO_CHAR(p_x_prd_workoper_rec.SCHEDULED_START_DATE, 'ss');
895     IF(l_sec = '00' AND p_module_type <> 'OAF' ) THEN
896        l_sec := l_sch_start_sec;
897     END IF;
898     p_x_prd_workoper_rec.SCHEDULED_START_DATE :=
899                   get_date_and_time
900                                   (p_date => p_x_prd_workoper_rec.SCHEDULED_START_DATE,
901                                    p_date_hh24 => p_x_prd_workoper_rec.SCHEDULED_START_HR,
902                                    p_date_mi => p_x_prd_workoper_rec.SCHEDULED_START_MI,
903                                    p_date_ss => l_sec);
904      IF ( G_DEBUG = 'Y' ) THEN
905       AHL_DEBUG_PUB.debug( 'p_x_prd_workoper_rec.SCHEDULED_START_DATE : ' || to_char(p_x_prd_workoper_rec.SCHEDULED_START_DATE,'DD-MON-YY hh24:mi:ss') );
906      END IF;
907   END IF;
908 
909   IF p_x_prd_workoper_rec.SCHEDULED_END_DATE IS NOT NULL AND
910      p_x_prd_workoper_rec.SCHEDULED_END_DATE <> FND_API.G_MISS_DATE THEN
911 
912     l_sec := TO_CHAR(p_x_prd_workoper_rec.SCHEDULED_END_DATE, 'ss');
913     IF(l_sec = '00' AND p_module_type <> 'OAF' ) THEN
914        l_sec := l_sch_end_sec;
915     END IF;
916     p_x_prd_workoper_rec.SCHEDULED_END_DATE :=
917                   get_date_and_time
918                                   (p_date => p_x_prd_workoper_rec.SCHEDULED_END_DATE,
919                                    p_date_hh24 => p_x_prd_workoper_rec.SCHEDULED_END_HR,
920                                    p_date_mi => p_x_prd_workoper_rec.SCHEDULED_END_MI,
921                                    p_date_ss => l_sec);
922     IF ( G_DEBUG = 'Y' ) THEN
923       AHL_DEBUG_PUB.debug( 'p_x_prd_workoper_rec.SCHEDULED_END_DATE : ' || to_char(p_x_prd_workoper_rec.SCHEDULED_END_DATE,'DD-MON-YY hh24:mi:ss') );
924      END IF;
925   END IF;
926 
927   -- Balaji added for Release NR error
928   OPEN get_op_act_sec(p_x_prd_workoper_rec.workorder_operation_id);
929   FETCH get_op_act_sec INTO l_act_start_sec, l_act_end_sec;
930   CLOSE get_op_act_sec;
931 
932   IF p_x_prd_workoper_rec.ACTUAL_START_DATE IS NOT NULL AND
933      p_x_prd_workoper_rec.ACTUAL_START_DATE <> FND_API.G_MISS_DATE THEN
934 
935     l_sec := TO_CHAR(p_x_prd_workoper_rec.ACTUAL_START_DATE, 'ss');
936     IF(l_sec = '00' AND p_module_type <> 'OAF' ) THEN
937        l_sec := l_act_start_sec;
938     END IF;
939     p_x_prd_workoper_rec.ACTUAL_START_DATE :=
940                   get_date_and_time
941                                   (p_date => p_x_prd_workoper_rec.ACTUAL_START_DATE,
942                                    p_date_hh24 => p_x_prd_workoper_rec.ACTUAL_START_HR,
943                                    p_date_mi => p_x_prd_workoper_rec.ACTUAL_START_MI,
944                                    p_date_ss => l_sec);
945     IF ( G_DEBUG = 'Y' ) THEN
946       AHL_DEBUG_PUB.debug( 'p_x_prd_workoper_rec.ACTUAL_START_DATE : ' || to_char(p_x_prd_workoper_rec.ACTUAL_START_DATE,'DD-MON-YY hh24:mi:ss') );
947      END IF;
948   END IF;
949 
950   IF p_x_prd_workoper_rec.ACTUAL_END_DATE IS NOT NULL AND
951      p_x_prd_workoper_rec.ACTUAL_END_DATE <> FND_API.G_MISS_DATE THEN
952 
953     l_sec := TO_CHAR(p_x_prd_workoper_rec.ACTUAL_END_DATE, 'ss');
954     IF(l_sec = '00' AND p_module_type <> 'OAF' ) THEN
955        l_sec := l_act_end_sec;
956     END IF;
957     p_x_prd_workoper_rec.ACTUAL_END_DATE :=
958                   get_date_and_time
959                                   (p_date => p_x_prd_workoper_rec.ACTUAL_END_DATE,
960                                    p_date_hh24 => p_x_prd_workoper_rec.ACTUAL_END_HR,
961                                    p_date_mi => p_x_prd_workoper_rec.ACTUAL_END_MI,
962                                    p_date_ss => l_sec);
963     IF ( G_DEBUG = 'Y' ) THEN
964       AHL_DEBUG_PUB.debug( 'p_x_prd_workoper_rec.ACTUAL_END_DATE : ' || to_char(p_x_prd_workoper_rec.ACTUAL_END_DATE,'DD-MON-YY hh24:mi:ss') );
965      END IF;
966   END IF;
967 
968 END convert_values_to_ids;
969 
970 PROCEDURE validate_operation
971 (
972   p_prd_workoper_rec    IN AHL_PRD_OPERATIONS_PVT.PRD_workoperation_rec
973 )
974 AS
975 CURSOR  validate_unique_operation(c_workorder_id NUMBER,c_operation_seq_num NUMBER)
976 IS
977 SELECT  'X'
978 FROM    AHL_WORKORDER_OPERATIONS
979 WHERE   workorder_id            =c_workorder_id
980 AND     operation_sequence_num  =c_operation_seq_num;
981 
982 l_unique_rec VARCHAR2(1);
983 
984 CURSOR validate_department(c_dept_id NUMBER,c_org_id NUMBER)
985 IS
986 SELECT B.eam_enabled_flag
987 FROM   BOM_DEPARTMENTS A,
988        MTL_PARAMETERS B
989 WHERE  A.department_id=c_dept_id
990 AND    A.organization_id=B.organization_id
991 AND    A.organization_id=c_org_id;
992 
993 CURSOR get_wo_status(c_wo_id NUMBER)
994 IS
995 SELECT AWOS.status_code,
996 							FNDL.meaning
997 FROM AHL_WORKORDERS AWOS,
998 					FND_LOOKUP_VALUES_VL FNDL
999 WHERE AWOS.workorder_id = c_wo_id
1000 AND FNDL.LOOKUP_CODE(+) = AWOS.STATUS_CODE
1001 AND FNDL.LOOKUP_TYPE(+) = 'AHL_JOB_STATUS';
1002 -- Cursor added by Balaji for actual dates check issue with operation.
1003 CURSOR get_wo_actual_dates(c_wo_id NUMBER)
1004 IS
1005 SELECT
1006   ACTUAL_START_DATE,
1007   ACTUAL_END_DATE
1008 FROM
1009   AHL_WORKORDERS
1010 WHERE
1011   WORKORDER_ID = c_wo_id;
1012 l_eam_enabled_flag      VARCHAR2(1);
1013 l_return_status         VARCHAR2(1);
1014 l_wo_status_code								VARCHAR2(80);
1015 l_wo_status													VARCHAR2(30);
1016 l_wo_actual_start_date  DATE;
1017 l_wo_actual_end_date    DATE;
1018 
1019 -- fix for bug# 7555681
1020 CURSOR  get_curr_operation_status(c_workorder_id NUMBER,c_operation_seq_num NUMBER)
1021 IS
1022 SELECT  status_code
1023 FROM    AHL_WORKORDER_OPERATIONS
1024 WHERE   workorder_id            =c_workorder_id
1025 AND     operation_sequence_num  =c_operation_seq_num;
1026 
1027 l_curr_op_status VARCHAR2(1);
1028 
1029 BEGIN
1030   IF p_prd_workoper_rec.dml_operation='U' THEN
1031 				OPEN get_wo_status(p_prd_workoper_rec.workorder_id);
1032 				FETCH get_wo_status INTO l_wo_status_code, l_wo_status;
1033 				CLOSE get_wo_status;
1034 
1035 				IF l_wo_status_code IN ('4', '5', '7', '12') THEN
1036 				  FND_MESSAGE.SET_NAME('AHL','AHL_PRD_UPDOP_WOSTS');
1037 						FND_MESSAGE.SET_TOKEN('WO_STS', l_wo_status);
1038       FND_MSG_PUB.ADD;
1039     END IF;
1040 
1041     -- fix for bug# 7555681
1042     /*IF p_prd_workoper_rec.status_code = '1' THEN
1043 				-- Bug 4393092
1044 				-- Cannot update an operation which is in status 'Complete'
1045       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_UPDOP_STS_COMP');
1046 						FND_MESSAGE.SET_TOKEN('OP_SEQ', p_prd_workoper_rec.OPERATION_SEQUENCE_NUM);
1047       FND_MSG_PUB.ADD;
1048     END IF;*/
1049     IF (l_wo_status_code = '1' AND p_prd_workoper_rec.status_code = '1') THEN
1050                 FND_MESSAGE.SET_NAME('AHL','AHL_PRD_UPDOP_WOSTS');
1051                 FND_MESSAGE.SET_TOKEN('WO_STS', l_wo_status);
1052                 FND_MSG_PUB.ADD;
1053     ELSE
1054                  OPEN get_curr_operation_status(p_prd_workoper_rec.workorder_id,p_prd_workoper_rec.operation_sequence_num);
1055                  FETCH get_curr_operation_status INTO l_curr_op_status;
1056                  IF(l_curr_op_status = '1')THEN
1057 
1058                    -- Bug 4393092
1059                    -- Cannot update an operation which is in status 'Complete'
1060                    FND_MESSAGE.SET_NAME('AHL','AHL_PRD_UPDOP_STS_COMP');
1061                    FND_MESSAGE.SET_TOKEN('OP_SEQ', p_prd_workoper_rec.OPERATION_SEQUENCE_NUM);
1062                    FND_MSG_PUB.ADD;
1063                  END IF;
1064                  CLOSE get_curr_operation_status;
1065     END IF;
1066   END IF;
1067 
1068 		-- rroy
1069 		-- ACL Changes
1070 		/*l_return_status := AHL_PRD_UTIL_PKG.Is_Unit_Locked(p_workorder_id => p_prd_workoper_rec.workorder_id,																																																									p_ue_id => NULL,
1071 																																																									p_visit_id => NULL,
1072 																																																									p_item_instance_id => NULL);
1073  	IF l_return_status = FND_API.G_TRUE THEN
1074 				IF p_prd_workoper_rec.dml_operation='C' THEN
1075 			 		FND_MESSAGE.Set_Name('AHL', 'AHL_PP_OP_CRT_UNTLCKD');
1076 				ELSIF p_prd_workoper_rec.dml_operation='U' THEN
1077 			 		FND_MESSAGE.Set_Name('AHL', 'AHL_PP_OP_UPD_UNTLCKD');
1078 				END IF;
1079 				FND_MSG_PUB.ADD;
1080 				RAISE FND_API.G_EXC_ERROR;
1081 		END IF;
1082 		*/
1083 		-- rroy
1084 		-- ACL Changes
1085 
1086   IF p_prd_workoper_rec.DEPARTMENT_ID IS NULL OR
1087      p_prd_workoper_rec.DEPARTMENT_ID=FND_API.G_MISS_NUM THEN
1088     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_ID_NULL');
1089     FND_MSG_PUB.ADD;
1090   END IF;
1091 
1092   IF p_prd_workoper_rec.SCHEDULED_START_DATE IS NULL OR
1093      p_prd_workoper_rec.SCHEDULED_START_DATE=FND_API.G_MISS_DATE THEN
1094     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_SCHEDSTART_DT_NULL');
1095     FND_MSG_PUB.ADD;
1096   ELSIF p_prd_workoper_rec.SCHEDULED_END_DATE IS NULL OR
1097         p_prd_workoper_rec.SCHEDULED_END_DATE=FND_API.G_MISS_DATE THEN
1098     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_SCHEDEND_DT_NULL');
1099     FND_MSG_PUB.ADD;
1100   ELSIF NVL(p_prd_workoper_rec.SCHEDULED_START_DATE,SYSDATE) > NVL(p_prd_workoper_rec.SCHEDULED_END_DATE,SYSDATE) THEN
1101     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_SCHEDDTS_INVALID_DT');
1102     FND_MSG_PUB.ADD;
1103   END IF;
1104 
1105    IF p_prd_workoper_rec.ACTUAL_START_DATE IS NOT NULL AND
1106       p_prd_workoper_rec.ACTUAL_START_DATE <> FND_API.G_MISS_DATE AND
1107       p_prd_workoper_rec.ACTUAL_START_DATE  > SYSDATE THEN
1108      FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_ACT_STRT_DT_INVALID');
1109      FND_MSG_PUB.ADD;
1110    END IF;
1111 
1112   IF (p_prd_workoper_rec.ACTUAL_START_DATE  IS NULL OR
1113       p_prd_workoper_rec.ACTUAL_START_DATE=FND_API.G_MISS_DATE) AND
1114      (p_prd_workoper_rec.ACTUAL_END_DATE<>FND_API.G_MISS_DATE AND
1115       p_prd_workoper_rec.ACTUAL_END_DATE IS NOT NULL) THEN
1116     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_ACT_START_DT_NULL');
1117     FND_MESSAGE.SET_TOKEN('RECORD',p_prd_workoper_rec.operation_sequence_num,false);
1118     FND_MSG_PUB.ADD;
1119   END IF;
1120 
1121   IF  p_prd_workoper_rec.ACTUAL_START_DATE IS NOT NULL AND
1122       p_prd_workoper_rec.ACTUAL_START_DATE<>FND_API.G_MISS_DATE AND
1123       p_prd_workoper_rec.ACTUAL_END_DATE<>FND_API.G_MISS_DATE AND
1124       p_prd_workoper_rec.ACTUAL_END_DATE IS NOT NULL AND
1125       p_prd_workoper_rec.ACTUAL_START_DATE > p_prd_workoper_rec.ACTUAL_END_DATE THEN
1126     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_ACT_SE_DT_INVALID');
1127     FND_MSG_PUB.ADD;
1128   END IF;
1129 
1130   IF p_prd_workoper_rec.ACTUAL_END_DATE IS NOT NULL AND
1131      p_prd_workoper_rec.ACTUAL_END_DATE <> FND_API.G_MISS_DATE AND
1132      TRUNC( p_prd_workoper_rec.ACTUAL_END_DATE ) > TRUNC( SYSDATE ) THEN
1133     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OP_ACT_END_DT_INVALID');
1134     FND_MSG_PUB.ADD;
1135   END IF;
1136 
1137   -- Balaji added actual date validation against workorder actual dates.
1138   OPEN get_wo_actual_dates(p_prd_workoper_rec.workorder_id);
1139   FETCH get_wo_actual_dates INTO l_wo_actual_start_date, l_wo_actual_end_date;
1140   CLOSE get_wo_actual_dates;
1141 
1142   IF ( p_prd_workoper_rec.actual_start_date IS NOT NULL AND
1143        p_prd_workoper_rec.actual_start_date <> FND_API.G_MISS_DATE AND
1144        l_wo_actual_start_date IS NOT NULL AND
1145        p_prd_workoper_rec.actual_start_date < l_wo_actual_start_date ) THEN
1146     FND_MESSAGE.set_name( 'AHL', 'AHL_PRD_OP_WO_ST_DT' );
1147     FND_MSG_PUB.add;
1148   END IF;
1149 
1150   IF ( p_prd_workoper_rec.actual_end_date IS NOT NULL AND
1151        p_prd_workoper_rec.actual_end_date <> FND_API.G_MISS_DATE AND
1152        l_wo_actual_end_date IS NOT NULL AND
1153        p_prd_workoper_rec.actual_end_date > l_wo_actual_end_date ) THEN
1154     FND_MESSAGE.set_name( 'AHL', 'AHL_PRD_OP_WO_END_DT' );
1155     FND_MSG_PUB.add;
1156   END IF;
1157 
1158   IF  p_prd_workoper_rec.OPERATION_SEQUENCE_NUM IS NULL OR
1159       p_prd_workoper_rec.OPERATION_SEQUENCE_NUM=FND_API.G_MISS_NUM THEN
1160     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPERATION_SEQ_NULL');
1161     FND_MSG_PUB.ADD;
1162   ELSIF p_prd_workoper_rec.OPERATION_SEQUENCE_NUM <=0 THEN
1163     FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPERATION_SEQ_NEGZERO');
1164     FND_MSG_PUB.ADD;
1165   ELSE
1166     IF  p_prd_workoper_rec.dml_operation='C' THEN
1167       OPEN  validate_unique_operation(p_prd_workoper_rec.workorder_id,p_prd_workoper_rec.operation_sequence_num);
1168       FETCH validate_unique_operation INTO l_unique_rec;
1169       IF validate_unique_operation%FOUND THEN
1170         FND_MESSAGE.SET_NAME('AHL','AHL_PRD_OPER_SEQ_NOTUNIQ');
1171         FND_MESSAGE.SET_TOKEN('RECORD',p_prd_workoper_rec.operation_sequence_num,false);
1172         FND_MSG_PUB.ADD;
1173       END IF;
1174       CLOSE validate_unique_operation;
1175     END IF;
1176   END IF;
1177 
1178   IF p_prd_workoper_rec.dml_operation='U' THEN
1179     IF p_prd_workoper_rec.WORKORDER_OPERATION_ID IS NULL OR
1180        p_prd_workoper_rec.WORKORDER_OPERATION_ID=FND_API.G_MISS_NUM THEN
1181       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_WO_OPERID_NULL');
1182       FND_MSG_PUB.ADD;
1183     END IF;
1184   END IF;
1185 
1186   IF p_prd_workoper_rec.ORGANIZATION_ID IS NOT NULL AND
1187      p_prd_workoper_rec.ORGANIZATION_ID<>FND_API.G_MISS_NUM AND
1188      p_prd_workoper_rec.DEPARTMENT_ID IS NOT NULL AND
1189      p_prd_workoper_rec.DEPARTMENT_ID<>FND_API.G_MISS_NUM THEN
1190     OPEN  validate_department(p_prd_workoper_rec.DEPARTMENT_ID,p_prd_workoper_rec.ORGANIZATION_ID);
1191     FETCH validate_department INTO l_eam_enabled_flag;
1192 
1193     IF    validate_department%NOTFOUND THEN
1194       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_NAME_INVALID');
1195       FND_MSG_PUB.ADD;
1196     ELSIF    validate_department%FOUND  AND l_eam_enabled_flag='N' THEN
1197       FND_MESSAGE.SET_NAME('AHL','AHL_PRD_DEPT_NOT_EAM_ENABLED');
1198       FND_MSG_PUB.ADD;
1199     END IF;
1200     CLOSE validate_department;
1201   END IF;
1202 
1203 END validate_operation;
1204 
1205 PROCEDURE process_operations
1206 (
1207  p_api_version                  IN      NUMBER    := 1.0,
1208  p_init_msg_list                IN      VARCHAR2  := FND_API.G_TRUE,
1209  p_commit                       IN      VARCHAR2  := FND_API.G_FALSE,
1210  p_validation_level             IN      NUMBER    := FND_API.G_VALID_LEVEL_FULL,
1211  p_default                      IN      VARCHAR2  := FND_API.G_FALSE,
1212  p_module_type                  IN      VARCHAR2,
1213  p_wip_mass_load_flag           IN      VARCHAR2,
1214  x_return_status                OUT NOCOPY      VARCHAR2,
1215  x_msg_count                    OUT NOCOPY      NUMBER,
1216  x_msg_data                     OUT NOCOPY      VARCHAR2,
1217  p_x_prd_operation_tbl          IN OUT NOCOPY   PRD_OPERATION_TBL
1218 )
1219 AS
1220 
1221   l_api_name     CONSTANT VARCHAR2(30) := 'process_operations';
1222   l_api_version  CONSTANT NUMBER       := 1.0;
1223   l_msg_count             NUMBER;
1224   l_msg_data              VARCHAR2(2000);
1225   l_return_status         VARCHAR2(1);
1226 
1227   l_empty_workorder_rec   AHL_PRD_WORKORDER_PVT.prd_workorder_rec;
1228   l_resource_tbl          AHL_PP_RESRC_REQUIRE_PVT.resrc_require_tbl_type;
1229   l_material_tbl          AHL_PP_MATERIALS_PVT.req_material_tbl_type;
1230   l_op_status             VARCHAR2(30);
1231   l_prd_operation_tbl     PRD_OPERATION_TBL;
1232   idx                     NUMBER;
1233 
1234   --cursor to retrieve the Operation Status Code
1235   CURSOR get_op_status(x_workorder_operation_id NUMBER)
1236   IS
1237   SELECT STATUS_CODE
1238   FROM AHL_WORKORDER_OPERATIONS
1239   WHERE WORKORDER_OPERATION_ID = x_workorder_operation_id;
1240 
1241 BEGIN
1242   SAVEPOINT process_operations_PVT;
1243 
1244   --   Initialize message list IF p_init_msg_list is set to TRUE.
1245   IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
1246                                      p_api_version,
1247                                      l_api_name,G_PKG_NAME) THEN
1248     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1249   END IF;
1250 
1251   IF FND_API.to_boolean(p_init_msg_list) THEN
1252     FND_MSG_PUB.initialize;
1253   END IF;
1254 
1255   x_return_status:=FND_API.G_RET_STS_SUCCESS;
1256 
1257   IF G_DEBUG='Y' THEN
1258     AHL_DEBUG_PUB.enable_debug;
1259   END IF;
1260 
1261   IF ( G_DEBUG = 'Y' ) THEN
1262     AHL_DEBUG_PUB.debug( l_api_name || ' - Total number of Operations - ' || p_x_prd_operation_tbl.COUNT );
1263   END IF;
1264 
1265   IF FND_API.to_boolean(p_default) THEN
1266     IF p_x_prd_operation_tbl.COUNT >0 THEN
1267       FOR i in p_x_prd_operation_tbl.FIRST..p_x_prd_operation_tbl.LAST
1268       LOOP
1269 
1270         IF p_x_prd_operation_tbl(i).DML_OPERATION='C' THEN
1271           IF ( G_DEBUG = 'Y' ) THEN
1272             AHL_DEBUG_PUB.debug( l_api_name || ' - Before default_attributes' );
1273           END IF;
1274 
1275           default_attributes
1276           (
1277             p_x_prd_workoper_rec       => p_x_prd_operation_tbl(i)
1278           );
1279 
1280         ELSIF p_x_prd_operation_tbl(i).DML_OPERATION='U' THEN
1281           IF ( G_DEBUG = 'Y' ) THEN
1282             AHL_DEBUG_PUB.debug( l_api_name || ' - Before default_missing_attributes' );
1283           END IF;
1284 
1285           default_missing_attributes
1286           (
1287             p_x_prd_workoper_rec    => p_x_prd_operation_tbl(i),
1288             p_module_type           => p_module_type
1289           );
1290         END IF;
1291       END LOOP;
1292     END IF;
1293   END IF;
1294 
1295   IF p_module_type='JSP' OR p_module_type = 'OAF' THEN
1296     IF p_x_prd_operation_tbl.COUNT >0 THEN
1297       FOR i in p_x_prd_operation_tbl.FIRST..p_x_prd_operation_tbl.LAST
1298       LOOP
1299         IF ( G_DEBUG = 'Y' ) THEN
1300           AHL_DEBUG_PUB.debug( l_api_name || ' - Before convert_values_to_ids' );
1301         END IF;
1302 
1303         convert_values_to_ids
1304         (
1305           p_x_prd_workoper_rec    =>p_x_prd_operation_tbl(i),
1306           p_module_type           => p_module_type
1307         );
1308       END LOOP;
1309     END IF;
1310   END IF;
1311 
1312   l_msg_count:=FND_MSG_PUB.count_msg;
1313 
1314   IF l_msg_count > 0 THEN
1315     x_msg_count := l_msg_count;
1316     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1317     IF p_wip_mass_load_flag<>'Y' THEN
1318       RETURN;
1319     END IF;
1320   END IF;
1321 
1322   idx := 1;
1323 
1324   IF p_x_prd_operation_tbl.COUNT >0 THEN
1325     FOR i IN p_x_prd_operation_tbl.FIRST..p_x_prd_operation_tbl.LAST
1326     LOOP
1327       x_return_status:=FND_API.G_RET_STS_SUCCESS;
1328 
1329       IF ( G_DEBUG = 'Y' ) THEN
1330         AHL_DEBUG_PUB.debug( l_api_name || ' - Before validate_operation' );
1331       END IF;
1332 
1333       validate_operation
1334       (
1335         p_prd_workoper_rec    =>p_x_prd_operation_tbl(i)
1336       );
1337 
1338       l_msg_count:=FND_MSG_PUB.count_msg;
1339       IF l_msg_count > 0 THEN
1340         x_msg_count := l_msg_count;
1341         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1342       END IF;
1343 
1344       IF x_return_status=FND_API.G_RET_STS_SUCCESS THEN
1345 
1346         IF p_x_prd_operation_tbl(i).dml_operation='C' THEN
1347 
1348           IF ( G_DEBUG = 'Y' ) THEN
1349             AHL_DEBUG_PUB.debug( l_api_name || ' - Before Inserting into AHL_WORKORDER_OPERATIONS' );
1350           END IF;
1351 
1352           INSERT INTO AHL_WORKORDER_OPERATIONS
1353           (
1354             WORKORDER_OPERATION_ID,
1355             OBJECT_VERSION_NUMBER ,
1356             LAST_UPDATE_DATE      ,
1357             LAST_UPDATED_BY       ,
1358             CREATION_DATE         ,
1359             CREATED_BY            ,
1360             LAST_UPDATE_LOGIN     ,
1361             OPERATION_SEQUENCE_NUM,
1362             WORKORDER_ID          ,
1363             STATUS_CODE           ,
1364             OPERATION_ID          ,
1365             PLAN_ID               ,
1366             COLLECTION_ID         ,
1367             OPERATION_TYPE_CODE   ,
1368             ACTUAL_START_DATE     ,
1369             ACTUAL_END_DATE       ,
1370             ATTRIBUTE_CATEGORY    ,
1371             ATTRIBUTE1            ,
1372             ATTRIBUTE2            ,
1373             ATTRIBUTE3            ,
1374             ATTRIBUTE4            ,
1375             ATTRIBUTE5            ,
1376             ATTRIBUTE6            ,
1377             ATTRIBUTE7            ,
1378             ATTRIBUTE8            ,
1379             ATTRIBUTE9            ,
1380             ATTRIBUTE10           ,
1381             ATTRIBUTE11           ,
1382             ATTRIBUTE12           ,
1383             ATTRIBUTE13           ,
1384             ATTRIBUTE14           ,
1385             ATTRIBUTE15
1386           ) VALUES
1387           (
1388             p_x_prd_operation_tbl(I).WORKORDER_OPERATION_ID,
1389             p_x_prd_operation_tbl(I).OBJECT_VERSION_NUMBER ,
1390             p_x_prd_operation_tbl(I).LAST_UPDATE_DATE      ,
1391             p_x_prd_operation_tbl(I).LAST_UPDATED_BY       ,
1392             p_x_prd_operation_tbl(I).CREATION_DATE         ,
1393             p_x_prd_operation_tbl(I).CREATED_BY            ,
1394             p_x_prd_operation_tbl(I).LAST_UPDATE_LOGIN     ,
1395             p_x_prd_operation_tbl(I).OPERATION_SEQUENCE_NUM,
1396             p_x_prd_operation_tbl(I).WORKORDER_ID          ,
1397             NVL(p_x_prd_operation_tbl(I).STATUS_CODE,'2'),
1398             p_x_prd_operation_tbl(I).OPERATION_ID          ,
1399             p_x_prd_operation_tbl(I).PLAN_ID               ,
1400             p_x_prd_operation_tbl(I).COLLECTION_ID         ,
1401             p_x_prd_operation_tbl(I).OPERATION_TYPE_CODE   ,
1402             p_x_prd_operation_tbl(I).ACTUAL_START_DATE     ,
1403             p_x_prd_operation_tbl(I).ACTUAL_END_DATE       ,
1404             p_x_prd_operation_tbl(I).ATTRIBUTE_CATEGORY    ,
1405             p_x_prd_operation_tbl(I).ATTRIBUTE1            ,
1406             p_x_prd_operation_tbl(I).ATTRIBUTE2            ,
1407             p_x_prd_operation_tbl(I).ATTRIBUTE3            ,
1408             p_x_prd_operation_tbl(I).ATTRIBUTE4            ,
1409             p_x_prd_operation_tbl(I).ATTRIBUTE5            ,
1410             p_x_prd_operation_tbl(I).ATTRIBUTE6            ,
1411             p_x_prd_operation_tbl(I).ATTRIBUTE7            ,
1412             p_x_prd_operation_tbl(I).ATTRIBUTE8            ,
1413             p_x_prd_operation_tbl(I).ATTRIBUTE9            ,
1414             p_x_prd_operation_tbl(I).ATTRIBUTE10           ,
1415             p_x_prd_operation_tbl(I).ATTRIBUTE11           ,
1416             p_x_prd_operation_tbl(I).ATTRIBUTE12           ,
1417             p_x_prd_operation_tbl(I).ATTRIBUTE13           ,
1418             p_x_prd_operation_tbl(I).ATTRIBUTE14           ,
1419             p_x_prd_operation_tbl(I).ATTRIBUTE15
1420           );
1421         ELSIF p_x_prd_operation_tbl(I).DML_OPERATION='U' THEN
1422 
1423           IF ( G_DEBUG = 'Y' ) THEN
1424             AHL_DEBUG_PUB.debug( l_api_name || ' - Before Updating AHL_WORKORDER_OPERATIONS' );
1425           END IF;
1426 
1427 	  -- R12
1428 	  -- Tech UIs
1429           OPEN get_op_status(p_x_prd_operation_tbl(I).WORKORDER_OPERATION_ID);
1430           FETCH get_op_status INTO l_op_status;
1431           CLOSE get_op_status;
1432 
1433 	  IF p_x_prd_operation_tbl(I).status_code = '1' AND l_op_status <> '1' THEN
1434             -- If this is an operation completion
1435             l_prd_operation_tbl(idx).workorder_operation_id := p_x_prd_operation_tbl(i).workorder_operation_id;
1436             l_prd_operation_tbl(idx).object_version_number := p_x_prd_operation_tbl(i).object_version_number + 1;
1437             p_x_prd_operation_tbl(i).status_code := l_op_status;
1438             idx  := idx + 1;
1439           END IF;
1440 
1441           UPDATE AHL_WORKORDER_OPERATIONS SET
1442             OBJECT_VERSION_NUMBER   =p_x_prd_operation_tbl(I).OBJECT_VERSION_NUMBER +1,
1443             LAST_UPDATE_DATE        =NVL(p_x_prd_operation_tbl(I).LAST_UPDATE_DATE,SYSDATE),
1444             LAST_UPDATED_BY         =NVL(p_x_prd_operation_tbl(I).LAST_UPDATED_BY,FND_GLOBAL.user_id),
1445             OPERATION_SEQUENCE_NUM  =p_x_prd_operation_tbl(I).OPERATION_SEQUENCE_NUM,
1446             WORKORDER_ID            =p_x_prd_operation_tbl(I).WORKORDER_ID          ,
1447             STATUS_CODE             =p_x_prd_operation_tbl(I).STATUS_CODE          ,
1448             OPERATION_ID            =p_x_prd_operation_tbl(I).OPERATION_ID          ,
1449             PLAN_ID                 =p_x_prd_operation_tbl(I).PLAN_ID               ,
1450             COLLECTION_ID           =p_x_prd_operation_tbl(I).COLLECTION_ID         ,
1451             OPERATION_TYPE_CODE     =p_x_prd_operation_tbl(I).OPERATION_TYPE_CODE   ,
1452             ACTUAL_START_DATE       =p_x_prd_operation_tbl(I).ACTUAL_START_DATE     ,
1453             ACTUAL_END_DATE         =p_x_prd_operation_tbl(I).ACTUAL_END_DATE       ,
1454             ATTRIBUTE_CATEGORY      =p_x_prd_operation_tbl(I).ATTRIBUTE_CATEGORY    ,
1455             ATTRIBUTE1              =p_x_prd_operation_tbl(I).ATTRIBUTE1            ,
1456             ATTRIBUTE2              =p_x_prd_operation_tbl(I).ATTRIBUTE2            ,
1457             ATTRIBUTE3              =p_x_prd_operation_tbl(I).ATTRIBUTE3            ,
1458             ATTRIBUTE4              =p_x_prd_operation_tbl(I).ATTRIBUTE4            ,
1459             ATTRIBUTE5              =p_x_prd_operation_tbl(I).ATTRIBUTE5            ,
1460             ATTRIBUTE6              =p_x_prd_operation_tbl(I).ATTRIBUTE6            ,
1461             ATTRIBUTE7              =p_x_prd_operation_tbl(I).ATTRIBUTE7            ,
1462             ATTRIBUTE8              =p_x_prd_operation_tbl(I).ATTRIBUTE8            ,
1463             ATTRIBUTE9              =p_x_prd_operation_tbl(I).ATTRIBUTE9            ,
1464             ATTRIBUTE10             =p_x_prd_operation_tbl(I).ATTRIBUTE10           ,
1465             ATTRIBUTE11             =p_x_prd_operation_tbl(I).ATTRIBUTE11           ,
1466             ATTRIBUTE12             =p_x_prd_operation_tbl(I).ATTRIBUTE12           ,
1467             ATTRIBUTE13             =p_x_prd_operation_tbl(I).ATTRIBUTE13           ,
1468             ATTRIBUTE14             =p_x_prd_operation_tbl(I).ATTRIBUTE14           ,
1469             ATTRIBUTE15             =p_x_prd_operation_tbl(I).ATTRIBUTE15
1470           WHERE  WORKORDER_OPERATION_ID=p_x_prd_operation_tbl(I).WORKORDER_OPERATION_ID
1471           AND    OBJECT_VERSION_NUMBER =p_x_prd_operation_tbl(I).OBJECT_VERSION_NUMBER;
1472 
1473           p_x_prd_operation_tbl(i).OBJECT_VERSION_NUMBER := p_x_prd_operation_tbl(i).OBJECT_VERSION_NUMBER + 1;
1474 
1475         END IF;
1476       END IF;
1477     END LOOP;
1478   END IF;
1479 
1480   l_msg_count:=FND_MSG_PUB.count_msg;
1481 
1482   IF l_msg_count > 0 THEN
1483     x_msg_count := l_msg_count;
1484     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1485 
1486     IF p_wip_mass_load_flag='Y' THEN
1487       RAISE FND_API.G_EXC_ERROR;
1488     ELSE
1489       RETURN;
1490     END IF;
1491 
1492   END IF;
1493 
1494   IF  p_wip_mass_load_flag='Y' THEN
1495 
1496     IF ( G_DEBUG = 'Y' ) THEN
1497       AHL_DEBUG_PUB.debug( l_api_name || ' - Before AHL_EAM_JOB_PVT.update_job_operations' );
1498     END IF;
1499 
1500     AHL_EAM_JOB_PVT.update_job_operations
1501     (
1502       p_api_version            => 1.0                        ,
1503       p_init_msg_list          => FND_API.G_TRUE             ,
1504       p_commit                 => FND_API.G_FALSE            ,
1505       p_validation_level       => FND_API.G_VALID_LEVEL_FULL ,
1506       p_default                => FND_API.G_TRUE             ,
1507       p_module_type            => NULL                       ,
1508       x_return_status          => l_return_status            ,
1509       x_msg_count              => l_msg_count                ,
1510       x_msg_data               => l_msg_data                 ,
1511       p_workorder_rec          => l_empty_workorder_rec      ,
1512       p_operation_tbl          => p_x_prd_operation_tbl      ,
1513       p_material_req_tbl       => l_material_tbl             ,
1514       p_resource_req_tbl       => l_resource_tbl
1515     );
1516 
1517     IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
1518       RAISE FND_API.G_EXC_ERROR;
1519     END IF;
1520   END IF; -- IF  p_wip_mass_load_flag='Y' THEN
1521 
1522   -- R12
1523   -- Tech UIs
1524   -- Check if operations need to be completed.
1525   IF l_prd_operation_tbl.COUNT > 0 THEN
1526     FOR j in l_prd_operation_tbl.FIRST..l_prd_operation_tbl.LAST LOOP
1527       AHL_COMPLETIONS_PVT.complete_operation
1528       (p_api_version  => 1.0,
1529        p_init_msg_list => FND_API.G_TRUE,
1530        p_commit => FND_API.G_FALSE,
1531        p_validation_level => FND_API.G_VALID_LEVEL_FULL,
1532        p_default => FND_API.G_FALSE,
1533        x_return_status => l_return_status,
1534        x_msg_count => l_msg_count,
1535        x_msg_data => l_msg_data,
1536        p_workorder_operation_id => l_prd_operation_tbl(j).workorder_operation_id,
1537        p_object_version_no => l_prd_operation_tbl(j).object_version_number
1538       );
1539       IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
1540         RAISE FND_API.G_EXC_ERROR;
1541       END IF;
1542     END LOOP;
1543   END IF; -- IF l_prd_operation_tbl.COUNT > 0 THEN
1544 
1545 
1546   IF FND_API.TO_BOOLEAN(p_commit) THEN
1547     COMMIT;
1548   END IF;
1549 
1550   IF ( G_DEBUG = 'Y' ) THEN
1551     AHL_DEBUG_PUB.debug( l_api_name || ' - Success' );
1552   END IF;
1553 
1554   IF G_DEBUG='Y' THEN
1555     AHL_DEBUG_PUB.disable_debug;
1556   END IF;
1557 
1558 EXCEPTION
1559  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1560     ROLLBACK TO process_operations_PVT;
1561     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1562     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1563                                p_count => x_msg_count,
1564                                p_data  => x_msg_data);
1565  WHEN FND_API.G_EXC_ERROR THEN
1566     ROLLBACK TO process_operations_PVT;
1567     x_return_status := FND_API.G_RET_STS_ERROR;
1568     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1569                                p_count => x_msg_count,
1570                                p_data  => x_msg_data);
1571 
1572  WHEN OTHERS THEN
1573     ROLLBACK TO process_operations_PVT;
1574     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1575     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1576       FND_MSG_PUB.add_exc_msg(p_pkg_name        =>g_pkg_name,
1577                               p_procedure_name  =>l_api_name,
1578                               p_error_text      => SUBSTR(SQLERRM,1,240));
1579 
1580     END IF;
1581     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1582                                p_count => x_msg_count,
1583                                p_data  => x_msg_data);
1584 
1585 END;
1586 
1587 FUNCTION get_date_and_time(p_date IN DATE,
1588                            p_date_hh24 IN VARCHAR2,
1589                            p_date_mi IN VARCHAR2,
1590                            p_date_ss IN VARCHAR2) RETURN DATE IS
1591 
1592 l_hour                  VARCHAR2(30);
1593 l_sec                   VARCHAR2(30);
1594 l_minutes               VARCHAR2(30);
1595 l_date_time             VARCHAR2(30);
1596 l_date                  DATE;
1597 
1598 BEGIN
1599 
1600     l_sec := TO_CHAR(p_date, 'ss');
1601     l_hour := TO_CHAR(p_date, 'hh24');
1602     l_minutes := TO_CHAR(p_date, 'mi');
1603     l_date := p_date;
1604 
1605     IF ( p_date_hh24 IS NOT NULL AND
1606          p_date_hh24 <> FND_API.G_MISS_NUM ) THEN
1607       l_hour := p_date_hh24;
1608     END IF;
1609 
1610     IF ( p_date_mi IS NOT NULL AND
1611          p_date_mi <> FND_API.G_MISS_NUM ) THEN
1612       l_minutes := p_date_mi;
1613     END IF;
1614 
1615     IF(p_date_ss IS NOT NULL AND
1616        p_date_ss <> FND_API.G_MISS_NUM) THEN
1617        l_sec := p_date_ss;
1618     END IF;
1619 
1620     IF ( l_hour <> '00' OR l_minutes <> '00' OR l_sec <> '00') THEN
1621       l_date_time := TO_CHAR(p_date, 'DD-MM-YYYY')||' :'|| l_hour ||':'|| l_minutes || ':'|| l_sec;
1622       l_date := TO_DATE(l_date_time , 'DD-MM-YYYY :HH24:MI:ss');
1623     END IF;
1624     RETURN l_date;
1625 END get_date_and_time;
1626 
1627 END  AHL_PRD_OPERATIONS_PVT;
1628