DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_OPERATION_RESOURCES_PUB

Source


1 PACKAGE BODY GMD_OPERATION_RESOURCES_PUB AS
2 /*  $Header: GMDPOPRB.pls 120.1.12010000.2 2008/11/06 21:48:32 rpatangy ship $
3  +=========================================================================+
4  | FILENAME                                                                |
5  |     GMDPOPRB.pls                                                        |
6  |                                                                         |
7  | DESCRIPTION                                                             |
8  |     This package contains public definitions for  			   |
9  |     creating, modifying, deleting operation resources                   |
10  |                                                                         |
11  | HISTORY                                                                 |
12  |     22-AUG-2002  Sandra Dulyk    Created                                |
13  |     25-NOV-2002  Thomas Daniel   Bug# 2679110                           |
14  |                                  Rewrote the procedures to handle the   |
15  |                                  errors properly and also to handle     |
16  |                                  further validations                    |
17  |     20-FEB-2004  NSRIVAST        Bug# 3222090, Removed call to          |
18  |                                  FND_PROFILE.VALUE('AFLOG_ENABLED')     |
19  |     20-APR-2006  KMOTUPAL        Bug# 5172254  Closed the cursors before|
20  |                                  raising the exception if a validation  |
21  |                                  fails.                                 |
22  |     26-MAY-2008  KBANDDYO       Bug#7118558: column um_code is replaced |
23  |                                 with uom_code and table sy_uoms_mst is  |
24  |                                 replaced with mtl_units_of_measure      |
25  +=========================================================================+
26   API Name  : GMD_OPERATION_RESOURCES_PUB
27   Type      : Public
28   Function  : This package contains public procedures used to create, modify, and delete operation resources
29   Pre-reqs  : N/A
30   Parameters: Per function
31 
32   Current Vers  : 1.0
33 
34   Previous Vers : 1.0
35 
36   Initial Vers  : 1.0
37   Notes
38 */
39 
40   /* Global Cursors */
41   CURSOR check_oprn_line_id(V_oprn_line_id NUMBER) IS
42      SELECT 1
43      FROM gmd_operation_activities
44      WHERE oprn_line_id = v_oprn_line_id;
45 
46 
47      --Bug#7118558
48   CURSOR check_uom(v_uom VARCHAR2) IS
49      SELECT 1
50      FROM mtl_units_of_measure
51      WHERE uom_Code = v_uom
52        AND (disable_date IS NULL or disable_date > SYSDATE);    /* pku */
53 
54 
55   CURSOR check_cost_cmpntcls_id(v_cost_cmpntcls_id NUMBER) IS
56       SELECT 1
57       FROM cm_cmpt_mst
58       WHERE COST_CMPNTCLS_id = v_cost_cmpntcls_id
59                       AND delete_mark = 0;
60 
61   CURSOR check_cost_analysis_code(v_cost_analysis_code VARCHAR2) IS
62       SELECT 1
63       FROM cm_alys_mst
64       WHERE cost_analysis_code = v_cost_analysis_code
65                       AND delete_mark = 0;
66 
67   CURSOR check_Resource(p_oprn_line_id NUMBER, p_resources VARCHAR2)  IS
68       SELECT 1
69       FROM gmd_operation_resources
70       WHERE oprn_line_id = p_oprn_line_id
71       AND  resources = p_resources;
72 
73   CURSOR check_one_prim_rsrc (V_oprn_line_id NUMBER) IS
74       SELECT COUNT(1)
75       FROM gmd_operation_resources
76       WHERE oprn_line_id = V_oprn_line_id
77       AND prim_rsrc_ind  = 1;
78 
79   CURSOR check_atleast_one (V_oprn_line_id NUMBER, V_resources VARCHAR2) IS
80       SELECT COUNT(1)
81       FROM gmd_operation_resources
82       WHERE oprn_line_id = V_oprn_line_id
83       AND  (V_resources IS NULL OR resources <> V_resources)
84       AND  prim_rsrc_ind = 1;
85 
86 
87 --Bug 3222090, NSRIVAST 20-FEB-2004, BEGIN
88 --Forward declaration.
89    FUNCTION set_debug_flag RETURN VARCHAR2;
90    l_debug VARCHAR2(1) := set_debug_flag;
91 
92    FUNCTION set_debug_flag RETURN VARCHAR2 IS
93    l_debug VARCHAR2(1):= 'N';
94    BEGIN
95     IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
96       l_debug := 'Y';
97     END IF;
98     RETURN l_debug;
99    END set_debug_flag;
100 --Bug 3222090, NSRIVAST 20-FEB-2004, END
101 
102   /*================================================
103   Procedure
104      insert_operation_resources
105   Description
106     This particular procedure is used to insert an
107     operation resources Parameters
108   ================================================ */
109   PROCEDURE insert_operation_resources
110   ( p_api_version 	IN 	    NUMBER
111   , p_init_msg_list	IN 	    BOOLEAN
112   , p_commit		IN 	    BOOLEAN
113   , p_oprn_line_id	IN	    gmd_operation_activities.oprn_line_id%TYPE
114   , p_oprn_rsrc_tbl	IN 	    gmd_operation_resources_pub.gmd_oprn_resources_tbl_type
115   , x_message_count 	OUT NOCOPY  NUMBER
116   , x_message_list 	OUT NOCOPY  VARCHAR2
117   , x_return_status	OUT NOCOPY  VARCHAR2)  IS
118 
119     v_resources		   gmd_operation_resources.resources%TYPE;
120     v_uom     		   gmd_operation_resources.resource_usage_uom%TYPE;
121     v_cost_cmpntcls_id	   gmd_operation_resources.cost_cmpntcls_id%TYPE;
122     v_cost_analysis_code   gmd_operation_resources.cost_analysis_code%TYPE;
123     v_count		   NUMBER DEFAULT 0;
124     l_return_status	   VARCHAR2(1);
125     l_api_version          NUMBER := 1.0;
126 
127     setup_failure  	EXCEPTION;
128     invalid_version	EXCEPTION;
129     ins_oprn_rsrc_err	EXCEPTION;
130     inv_resource_ind	EXCEPTION;
131 
132     CURSOR get_oprn_id(V_oprn_line_id NUMBER) IS
133       SELECT oprn_id
134       FROM   gmd_operation_activities
135       WHERE  oprn_line_id = V_oprn_line_id;
136 
137     CURSOR fetch_proc_uom (V_oprn_line_id NUMBER) IS
138       SELECT process_qty_uom
139       FROM   gmd_operations a, gmd_operation_activities b
140       WHERE  a.oprn_id = b.oprn_id
141       AND    b.oprn_line_id = V_oprn_line_id;
142 
143     CURSOR get_resource_det (V_resources VARCHAR2) IS
144       SELECT cr.cost_cmpntcls_id
145       FROM   cr_rsrc_mst cr, cm_cmpt_mst cm
146       WHERE  cr.cost_cmpntcls_id = cm.cost_cmpntcls_id
147       AND    cr.resources = V_resources
148       AND    cr.delete_mark = 0
149       AND    cm.delete_mark = 0
150       AND    cm.usage_ind = 3;
151 
152     CURSOR get_cost_analysis_code (V_oprn_line_id NUMBER) IS
153       SELECT cost_analysis_code
154       FROM   fm_actv_mst a, gmd_operation_activities o
155       WHERE  o.activity = a.activity
156       AND    o.oprn_line_id = V_oprn_line_id;
157 
158 --Bug#7118558
159     CURSOR Cur_get_resource_usage_uom(V_resources VARCHAR2)  IS
160       SELECT std_usage_uom
161       FROM   cr_rsrc_mst
162       WHERE  resources = V_resources;
163 
164     l_cost_cmpntcls_id	cm_cmpt_mst.cost_cmpntcls_id%TYPE;
165     l_oprn_id           NUMBER;
166     l_oprn_rsrc_tbl 	gmd_operation_resources_pub.gmd_oprn_resources_tbl_type;
167     l_rsrc_count	NUMBER(5);
168     l_usage_uom         VARCHAR2(4);
169   BEGIN
170     SAVEPOINT insert_oprn_rsrc;
171 
172     /* Initially let us assign the return status to success */
173     x_return_status := FND_API.g_ret_sts_success;
174 
175     IF NOT gmd_api_grp.setup_done THEN
176       gmd_api_grp.setup_done := gmd_api_grp.setup;
177     END IF;
178     IF NOT gmd_api_grp.setup_done THEN
179       RAISE setup_failure;
180     END IF;
181 
182     /* Make sure we are call compatible */
183     IF NOT FND_API.compatible_api_call(l_api_version
184                                        ,p_api_version
185                                        ,'insert_operation_resources'
186                                        ,'gmd_operation_resources_pub') THEN
187       RAISE invalid_version;
188     END IF;
189 
190     /* Initialize message list and count if needed */
191     IF p_init_msg_list THEN
192       fnd_msg_pub.initialize;
193     END IF;
194 
195     IF (l_debug = 'Y') THEN
196       gmd_debug.put_line('In insert_operation_resources public.');
197     END IF;
198 
199     /* Operation Line ID must be passed, otherwise give error, also check operation line id exists */
200     IF p_oprn_line_id IS NULL THEN
201       IF (l_debug = 'Y') THEN
202         gmd_debug.put_line('operation line ID is required');
203       END IF;
204       FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
205       FND_MESSAGE.SET_TOKEN ('MISSING', 'OPRN_LINE_ID');
206       FND_MSG_PUB.ADD;
207       RAISE ins_oprn_rsrc_err;
208     ELSIF p_oprn_line_id IS NOT NULL THEN
209       /* check to see that it is valid id */
210       OPEN check_oprn_line_id(p_oprn_line_id);
211       FETCH check_oprn_line_id INTO v_count;
212       IF check_oprn_line_id%NOTFOUND THEN
213         /* must pass existing operation line id */
214         FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_OPRNLINE_ID');
215         FND_MSG_PUB.ADD;
216       CLOSE check_oprn_line_id;
217         RAISE ins_oprn_rsrc_err;
218       END IF;
219       CLOSE check_oprn_line_id;
220     END IF;
221 
222     /* Operation Security Validation */
223     OPEN get_oprn_id(p_oprn_line_id);
224     FETCH get_oprn_id INTO l_oprn_id;
225     CLOSE get_oprn_id;
226 
227     /* Operation Security Validation */
228     /* Validation: Chcek if this users performing update has access to this
229        operation owner orgn code */
230     IF NOT GMD_API_GRP.Check_orgn_access(Entity     => 'OPERATION'
231                                         ,Entity_id  => l_oprn_id) THEN
232       RAISE ins_oprn_rsrc_err;
233     END IF;
234 
235     FOR i in 1 .. p_oprn_rsrc_tbl.count LOOP
236       /* Lets initialize the local structure which will be passed to private layer */
237       l_oprn_rsrc_tbl(i) := p_oprn_rsrc_tbl(i);
238 
239       /* Resource must be passed, otherwise give error */
240       IF l_oprn_rsrc_tbl(i).resources IS NULL THEN
241         IF (l_debug = 'Y') THEN
242           gmd_debug.put_line('operation resource required');
243         END IF;
244   	FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
245         FND_MESSAGE.SET_TOKEN ('MISSING', 'RESOURCES');
246         FND_MSG_PUB.ADD;
247         RAISE ins_oprn_rsrc_err;
248       ELSE   /* check resource exists */
249         v_resources := l_oprn_rsrc_tbl(i).resources;
250         OPEN get_resource_det(v_resources);
251         FETCH get_resource_det INTO l_cost_cmpntcls_id;
252         IF get_resource_det%NOTFOUND THEN
253           /* must pass valid resource */
254           FND_MESSAGE.SET_NAME('GMD','FM_BAD_RESOURCE');
255           FND_MSG_PUB.ADD;
256         CLOSE get_resource_det;
257           RAISE ins_oprn_rsrc_err;
258         END IF;
259         CLOSE get_resource_det;
260       END IF;
261 
262       /* Process_Qty must be passed, otherwise give error */
263       IF l_oprn_rsrc_tbl(i).process_qty IS NULL THEN
264         IF (l_debug = 'Y') THEN
265           gmd_debug.put_line('resource process qty required');
266         END IF;
267 	FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
268         FND_MESSAGE.SET_TOKEN ('MISSING', 'PROCESS_QTY');
269         FND_MSG_PUB.ADD;
270         RAISE ins_oprn_rsrc_err;
271       ELSIF l_oprn_rsrc_tbl(i).process_qty < 0 THEN
272         FND_MESSAGE.SET_TOKEN('GMD', 'FM_PROCQTYERR');
273         FND_MSG_PUB.ADD;
274         RAISE ins_oprn_rsrc_err;
275       END IF;
276 
277       /* resource usagemust be passed, otherwise give error */
278       IF l_oprn_rsrc_tbl(i).resource_usage IS NULL THEN
279         IF (l_debug = 'Y') THEN
280           gmd_debug.put_line('resource usage required');
281         END IF;
282 
283         FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
284         FND_MESSAGE.SET_TOKEN ('MISSING', 'RESOURCE_USAGE');
285         FND_MSG_PUB.ADD;
286         RAISE ins_oprn_rsrc_err;
287       END IF;
288 
289       -- Negative usage
290       IF l_oprn_rsrc_tbl(i).resource_usage < 0 THEN
291         FND_MESSAGE.SET_NAME('GMD', 'FM_RESUSGERR');
292         FND_MSG_PUB.ADD;
293         RAISE ins_oprn_rsrc_err;
294       END IF;
295 
296       /* If Usage is not passed, derive the default from resource */
297       IF l_oprn_rsrc_tbl(i).resource_usage_uom IS NULL THEN
298         IF (l_debug = 'Y') THEN
299           gmd_debug.put_line('resource usage uom required');
300         END IF;
301         OPEN Cur_get_resource_usage_uom(l_oprn_rsrc_tbl(i).resources);
302       	FETCH Cur_get_resource_usage_uom INTO l_oprn_rsrc_tbl(i).resource_usage_uom;
303       	  IF Cur_get_resource_usage_uom%NOTFOUND THEN
304       	     FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
305              FND_MESSAGE.SET_TOKEN ('MISSING', 'resource_usage_uom');
306              FND_MSG_PUB.ADD;
307         CLOSE Cur_get_resource_usage_uom;
308              RAISE ins_oprn_rsrc_err;
309           END IF;
310         CLOSE Cur_get_resource_usage_uom;
311       ELSE  /* check uom exists */
312         v_uom := l_oprn_rsrc_tbl(i).resource_usage_uom;
313         OPEN check_uom(v_uom);
314         FETCH check_uom INTO v_count;
315         IF check_uom%NOTFOUND THEN
316           /* must pass existing uom */
317           FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_UM_CODE');
318           FND_MSG_PUB.ADD;
319         CLOSE check_uom;
320           RAISE ins_oprn_rsrc_err;
321         END IF;
322         CLOSE check_uom;
323       END IF;
324 
325       /* cost component id, otherwise give error */
326       IF l_oprn_rsrc_tbl(i).cost_cmpntcls_id IS NULL THEN
327         l_oprn_rsrc_tbl(i).cost_cmpntcls_id := l_cost_cmpntcls_id;
328       ELSE   /* check cost_cmpntcls_id exists */
329         v_cost_cmpntcls_id := l_oprn_rsrc_tbl(i).cost_cmpntcls_id;
330         OPEN check_cost_cmpntcls_id(v_cost_cmpntcls_id);
331         FETCH check_cost_cmpntcls_id INTO v_count;
332         IF check_cost_cmpntcls_id%NOTFOUND THEN
333           FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_COST_CMPNTCLS_ID');
334           FND_MSG_PUB.ADD;
335         CLOSE check_cost_cmpntcls_id;
336           RAISE ins_oprn_rsrc_err;
337         END IF;
338         CLOSE check_cost_cmpntcls_id;
339       END IF;
340 
341       /* Cost Analysis code must be passed, otherwise give error */
342       IF l_oprn_rsrc_tbl(i).cost_analysis_code IS NULL THEN
343         OPEN get_cost_analysis_code (P_oprn_line_id);
344         FETCH get_cost_analysis_code INTO l_oprn_rsrc_tbl(i).cost_analysis_code;
345         CLOSE get_cost_analysis_code;
346       ELSE   /* check cost_analysis_code exists */
347         v_cost_analysis_code := l_oprn_rsrc_tbl(i).cost_analysis_code;
348         OPEN check_cost_analysis_code(v_cost_analysis_code);
349         FETCH check_cost_analysis_code INTO v_count;
350         IF check_cost_analysis_code%NOTFOUND THEN
351           FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_COST_ANLYS_CODE');
352           FND_MSG_PUB.ADD;
353         CLOSE check_cost_analysis_code;
354           RAISE ins_oprn_rsrc_err;
355         END IF;
356         CLOSE check_cost_analysis_code;
357       END IF;
358 
359       IF l_oprn_rsrc_tbl(i).prim_rsrc_ind IS NULL THEN
360         l_oprn_rsrc_tbl(i).prim_rsrc_ind := 0;
361       END IF;
362       /* Plan Type/Resource Indicator should be valid */
363       IF l_oprn_rsrc_tbl(i).prim_rsrc_ind NOT IN (0,1,2) THEN
364         gmd_api_grp.log_message ('FM_RSRCINDERR');
365         RAISE ins_oprn_rsrc_err;
366       END IF;
367 
368       /* Resource Count must be passed, otherwise give error */
369       IF l_oprn_rsrc_tbl(i).resource_count IS NULL THEN
370         IF (l_debug = 'Y') THEN
371           gmd_debug.put_line('Resource Count required');
372  	END IF;
373         FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
374         FND_MESSAGE.SET_TOKEN ('MISSING', 'RESOURCE_COUNT');
375         FND_MSG_PUB.ADD;
376         RAISE ins_oprn_rsrc_err;
377       ELSIF l_oprn_rsrc_tbl(i).resource_count < 0 THEN
378         gmd_api_grp.log_message ('FM_RESCOUNTERR');
379         RAISE ins_oprn_rsrc_err;
380       END IF;
381 
382       /* Offset Interval must be passed, otherwise give error */
383       IF l_oprn_rsrc_tbl(i).offset_interval IS NULL THEN
384         IF (l_debug = 'Y') THEN
385           gmd_debug.put_line('Offset interval required');
386         END IF;
387 	FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
388         FND_MESSAGE.SET_TOKEN ('MISSING', 'OFFSET_INTERVAL');
389         FND_MSG_PUB.ADD;
390         RAISE ins_oprn_rsrc_err;
391       END IF;
392 
393       /* Scale Type must be passed, otherwise give error */
394       IF l_oprn_rsrc_tbl(i).scale_type IS NULL THEN
395         IF (l_debug = 'Y') THEN
396           gmd_debug.put_line('Scale Type is null assigning default 1');
397  	END IF;
398         l_oprn_rsrc_tbl(i).scale_type := 1;
399       ELSIF l_oprn_rsrc_tbl(i).scale_type NOT IN (0, 1, 2) THEN
400         gmd_api_grp.log_message ('FM_SCALETYPERR');
401         RAISE ins_oprn_rsrc_err;
402       END IF;
403 
404       /* Lets initialialize the default values */
405       IF x_return_status = FND_API.g_ret_sts_success THEN
406         OPEN fetch_proc_uom (p_oprn_line_id);
407         FETCH fetch_proc_uom INTO l_oprn_rsrc_tbl(i).resource_process_uom;
408         CLOSE fetch_proc_uom;
409       END IF;
410     END LOOP;
411 
412     IF x_return_status = 'S' THEN
413       IF (l_debug = 'Y') THEN
414         gmd_debug.put_line('before PVT routine called');
415       END IF;
416 
417       GMD_OPERATION_RESOURCES_PVT.insert_operation_resources(p_oprn_line_id 	=> p_oprn_line_id,
418 							     p_oprn_rsrc_tbl 	=> l_oprn_rsrc_tbl,
419          				  		     x_message_count 	=>   x_message_count,
420         				  		     x_message_list     =>   x_message_list,
421        				  			     x_return_status    =>   l_return_status);
422 
423       IF l_return_status <> FND_API.g_ret_sts_success THEN
424         RAISE ins_oprn_rsrc_err;
425       END IF;
426 
427       /* Let us check if their are more than one resource marked as primary */
428       OPEN  check_one_prim_rsrc (p_oprn_line_id);
429       FETCH check_one_prim_rsrc INTO v_count;
430       CLOSE check_one_prim_rsrc;
431       IF v_count > 1 THEN
432         gmd_api_grp.log_message ('GMD_ONE_PRIMARY_RESOURCE');
433         RAISE inv_resource_ind;
434       END IF;
435 
436       /* This implies that we are setting this current resource as secondary or auxillary */
437       /* so let us check if their exists atleast one primary resource */
438       OPEN  check_atleast_one (p_oprn_line_id, NULL);
439       FETCH check_atleast_one INTO v_count;
440       CLOSE check_atleast_one;
441       IF v_count = 0 THEN
442         gmd_api_grp.log_message ('GMD_MIN_ONE_PRIMARY_RESOURCE');
443         RAISE inv_resource_ind;
444       END IF;
445 
446       IF p_commit THEN
447         COMMIT;
448       END IF;
449     END IF;
450 
451     FND_MSG_PUB.count_and_get(p_count   => x_message_count
452                              ,p_data    => x_message_list);
453 
454     IF (l_debug = 'Y') THEN
455       gmd_debug.put_line('End of insert_operation_resource PUB');
456     END IF;
457   EXCEPTION
458     WHEN setup_failure OR invalid_version OR inv_resource_ind THEN
459       ROLLBACK TO SAVEPOINT insert_oprn_rsrc;
460       x_return_status := FND_API.G_RET_STS_ERROR;
461       FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
462        		                 P_data  => x_message_list);
463     WHEN ins_oprn_rsrc_err THEN
464       ROLLBACK TO SAVEPOINT insert_oprn_rsrc;
465       x_return_status := FND_API.G_RET_STS_ERROR;
466       FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
467        		                 P_data  => x_message_list);
468     WHEN OTHERS THEN
469       ROLLBACK TO SAVEPOINT insert_oprn_rsrc;
470       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
471       FND_MESSAGE.SET_NAME('GMD', 'GMD_UNEXPECTED_ERROR');
472       FND_MESSAGE.SET_TOKEN('ERROR', sqlerrm);
473       FND_MSG_PUB.ADD;
474       FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
475                                  P_data  => x_message_list);
476   END insert_operation_resources;
477 
478   /*========================================================
479   Procedure
480      update_operation_resources
481   Description
482     This particular procedure is used to update operation resources
483     Parameters
484   ================================================ */
485   PROCEDURE update_operation_resources
486   ( p_api_version 		IN 	NUMBER
487   , p_init_msg_list 		IN 	BOOLEAN
488   , p_commit			IN 	BOOLEAN
489   , p_oprn_line_id		IN	gmd_operation_resources.oprn_line_id%TYPE
490   , p_resources			IN	gmd_operation_resources.resources%TYPE
491   , p_update_table		IN	gmd_operation_resources_pub.update_tbl_type
492   , x_message_count 		OUT NOCOPY  	NUMBER
493   , x_message_list 		OUT NOCOPY  	VARCHAR2
494   , x_return_status		OUT NOCOPY  	VARCHAR2)    IS
495 
496      v_oprn_id 			gmd_operations.oprn_id%TYPE;
497      l_return_status		VARCHAR2(1);
498      l_api_version		NUMBER := 1.0;
499      l_exist			NUMBER(5);
500 
501      invalid_version		EXCEPTION;
502      setup_failure		EXCEPTION;
503 
504     CURSOR get_oprn_id (p_oprN_line_id gmd_operation_resources.oprn_line_id%TYPE) IS
505       SELECT oprn_id
506       FROM gmd_operation_activities
507       WHERE oprn_line_id = p_oprn_line_id;
508 
509     upd_oprn_rsrc_err	EXCEPTION;
510   BEGIN
511     SAVEPOINT update_oprn_rsrc;
512 
513     /* Initially let us assign the return status to success */
514     x_return_status := FND_API.g_ret_sts_success;
515 
516     /* Make sure we are call compatible */
517     IF NOT FND_API.compatible_api_call(l_api_version
518                                        ,p_api_version
519                                        ,'update_operation_resources'
520                                        ,'gmd_operation_resources_pub') THEN
521       RAISE invalid_version;
522     END IF;
523 
524     /* Initialize message list and count if needed */
525     IF p_init_msg_list THEN
526       fnd_msg_pub.initialize;
527     END IF;
528 
529     IF NOT gmd_api_grp.setup_done THEN
530       gmd_api_grp.setup_done := gmd_api_grp.setup;
531     END IF;
532     IF NOT gmd_api_grp.setup_done THEN
533       RAISE setup_failure;
534     END IF;
535 
536     IF (l_debug = 'Y') THEN
537        gmd_debug.put_line('Start of update_operation_activity PUB');
538     END IF;
539 
540     /* Oprn_line_id must be passed, otherwise give error */
541     IF p_oprn_line_id IS NULL THEN
542       FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
543       FND_MESSAGE.SET_TOKEN ('MISSING', 'OPRN_LINE_ID');
544       FND_MSG_PUB.ADD;
545       RAISE upd_oprn_rsrc_err;
546     ELSE   /* check oprn_line_id exists */
547       OPEN check_oprn_line_id(p_oprn_line_id);
548       FETCH check_oprn_line_id INTO l_exist;
549       IF check_oprn_line_id%NOTFOUND THEN
550       	FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_OPRNLINE_ID');
551         FND_MSG_PUB.ADD;
552       CLOSE check_oprn_line_id;
553 	RAISE upd_oprn_rsrc_err;
554       END IF;
555       CLOSE check_oprn_line_id;
556     END IF;
557 
558     /* Resources must be passed, otherwise give error */
559     IF p_resources IS NULL THEN
560       FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
561       FND_MESSAGE.SET_TOKEN ('MISSING', 'P_RESOURCES');
562       FND_MSG_PUB.ADD;
563       RAISE upd_oprn_rsrc_err;
564     ELSE   /* check resource exists */
565       OPEN check_resource(p_oprn_line_id, p_resources);
566       FETCH check_resource INTO l_exist;
567       IF check_resource%NOTFOUND THEN
568         /* must pass valid resource */
569     	FND_MESSAGE.SET_NAME('GMD','FM_BAD_RESOURCE');
570         FND_MSG_PUB.ADD;
571       CLOSE check_resource;
572 	RAISE upd_oprn_rsrc_err;
573       END IF;
574       CLOSE check_resource;
575     END IF;
576 
577     /* Loop thru cols to be updated - verify col and value are present */
578     FOR i in 1 .. p_update_table.count LOOP
579       /* Col_to_update and value must be passed, otherwise give error */
580       IF p_update_table(i).p_col_to_update IS NULL THEN
581         FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
582         FND_MESSAGE.SET_TOKEN ('MISSING', 'P_COL_TO_UPDATE');
583         FND_MSG_PUB.ADD;
584         RAISE upd_oprn_rsrc_err;
585       ELSIF p_update_table(i).p_value IS NULL THEN
586         FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
587         FND_MESSAGE.SET_TOKEN ('MISSING', 'P_VALUE');
588         FND_MSG_PUB.ADD;
589         RAISE upd_oprn_rsrc_err;
590       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'COST_ANALYSIS_CODE' THEN
591         OPEN check_cost_analysis_code(p_update_table(i).p_value);
592         FETCH check_cost_analysis_code INTO l_exist;
593         IF check_cost_analysis_code%NOTFOUND THEN
594           FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_COST_ANLYS_CODE');
595           FND_MSG_PUB.ADD;
596         CLOSE check_cost_analysis_code;
597           RAISE upd_oprn_rsrc_err;
598         END IF;
599         CLOSE check_cost_analysis_code;
600       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'RESOURCE_USAGE' THEN
601         IF p_update_table(i).p_value < 0 THEN
602           gmd_api_grp.log_message('FM_RESUSGERR');
603           RAISE upd_oprn_rsrc_err;
604         END IF;
605       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'PROCESS_QTY' THEN
606         IF p_update_table(i).p_value < 0 THEN
607           gmd_api_grp.log_message('FM_PROCQTYERR');
608           RAISE upd_oprn_rsrc_err;
609         END IF;
610       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'resource_usage_uom' THEN
611         OPEN check_uom(p_update_table(i).p_value);
612         FETCH check_uom INTO l_exist;
613         IF check_uom%NOTFOUND THEN
614           /* must pass existing uom */
615           FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_UM_CODE');
616           FND_MSG_PUB.ADD;
617         CLOSE check_uom;
618           RAISE upd_oprn_rsrc_err;
619         END IF;
620         CLOSE check_uom;
621       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'COST_CMPNTCLS_ID' THEN
622         OPEN check_cost_cmpntcls_id(p_update_table(i).p_value);
623         FETCH check_cost_cmpntcls_id INTO l_exist;
624         IF check_cost_cmpntcls_id%NOTFOUND THEN
625           FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_COST_CMPNTCLS_ID');
626           FND_MSG_PUB.ADD;
627         CLOSE check_cost_cmpntcls_id;
628           RAISE upd_oprn_rsrc_err;
629         END IF;
630         CLOSE check_cost_cmpntcls_id;
631       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'PRIM_RSRC_IND' THEN
632         IF p_update_table(i).p_value NOT IN (0, 1, 2) THEN
633           gmd_api_grp.log_message ('FM_RSRCINDERR');
634           RAISE upd_oprn_rsrc_err;
635         ELSIF p_update_table(i).p_value = 1 THEN
636           /* This implies that we are setting this current resource as primary */
637           /* so let us check if their are any other primaries already existing */
638           OPEN  check_one_prim_rsrc (p_oprn_line_id);
639           FETCH check_one_prim_rsrc INTO l_exist;
640           CLOSE check_one_prim_rsrc;
641           IF l_exist > 0 THEN
642             gmd_api_grp.log_message ('GMD_ONE_PRIMARY_RESOURCE');
643             RAISE upd_oprn_rsrc_err;
644           END IF;
645         ELSIF p_update_table(i).p_value IN (0,2) THEN
646           /* This implies that we are setting this current resource as secondary or auxillary */
647           /* so let us check if their exists atleast one primary resource */
648           OPEN  check_atleast_one (p_oprn_line_id, p_resources);
649           FETCH check_atleast_one INTO l_exist;
650           CLOSE check_atleast_one;
651           IF l_exist = 0 THEN
652             gmd_api_grp.log_message ('GMD_MIN_ONE_PRIMARY_RESOURCE');
653             RAISE upd_oprn_rsrc_err;
654           END IF;
655         END IF;
656       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'RESOURCE_COUNT' THEN
657         IF p_update_table(i).p_value < 0 THEN
658           gmd_api_grp.log_message ('FM_RESCOUNTERR');
659           RAISE upd_oprn_rsrc_err;
660         END IF;
661       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'OFFSET_INTERVAL' THEN
662         IF p_update_table(i).p_value < 0 THEN
663           gmd_api_grp.log_message('GMD_INVALID_OFFSET');
664           RAISE upd_oprn_rsrc_err;
665         END IF;
666       ELSIF UPPER(p_update_table(i).p_col_to_update) = 'SCALE_TYPE' THEN
667         IF p_update_table(i).p_value NOT IN (0, 1, 2) THEN
668           gmd_api_grp.log_message ('FM_SCALETYPERR');
669           RAISE upd_oprn_rsrc_err;
670         END IF;
671       END IF;
672     END LOOP;
673 
674     OPEN get_oprn_id(p_oprn_line_id);
675     FETCH get_oprn_id INTO v_oprn_id;
676     CLOSE get_oprn_id;
677 
678     /* Operation Security Validation */
679     /* Validation: Chcek if this users performing update has access to this
680        operation owner orgn code */
681     IF NOT GMD_API_GRP.Check_orgn_access(Entity     => 'OPERATION'
682                                     ,Entity_id  => v_oprn_id) THEN
683       RAISE upd_oprn_rsrc_err;
684     END IF;
685 
686     /* Validation : Verify Operation status is not On Hold nor Obsolete/Archived
687     and Operation is not logically deleted */
688     IF NOT GMD_COMMON_VAL.UPDATE_ALLOWED(Entity => 'OPERATION',
689                                          Entity_id => v_oprn_id ) THEN
690       FND_MESSAGE.SET_NAME('GMD', 'GMD_OPRN_NOT_VALID');
691       FND_MSG_PUB.ADD;
692       RAISE upd_oprn_rsrc_err;
693     END IF;
694 
695     IF x_return_status = 'S' THEN
696       IF (l_debug = 'Y') THEN
697         gmd_debug.put_line('before PVT routine called');
698       END IF;
699 
700       GMD_OPERATION_RESOURCES_PVT.update_operation_resources(p_oprn_line_id 	=> p_oprn_line_id
701        							, p_resources 		=> p_resources
702        							, p_update_table	=> p_update_table
703        							, x_message_count 	=> x_message_count
704        							, x_message_list 	=> x_message_list
705        							, x_return_status 	=> l_return_status);
706       IF l_return_status <> FND_API.g_ret_sts_success THEN
707         RAISE upd_oprn_rsrc_err;
708       END IF;
709       IF p_commit THEN
710         COMMIT;
711       END IF;
712     END IF;
713 
714     FND_MSG_PUB.count_and_get(p_count   => x_message_count
715                               ,p_data    => x_message_list);
716 
717     IF (l_debug = 'Y') THEN
718       gmd_debug.put_line('END of update_operation_resource PUB');
719     END IF;
720 
721   EXCEPTION
722     WHEN invalid_version OR setup_failure THEN
723       ROLLBACK TO SAVEPOINT update_oprn_rsrc;
724       x_return_status := FND_API.G_RET_STS_ERROR;
725       FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
726       		                 P_data  => x_message_list);
727     WHEN upd_oprn_rsrc_err THEN
728       ROLLBACK TO SAVEPOINT update_oprn_rsrc;
729       x_return_status := FND_API.G_RET_STS_ERROR;
730       FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
731        		                 P_data  => x_message_list);
732      WHEN OTHERS THEN
733        ROLLBACK TO SAVEPOINT update_oprn_rsrc;
734        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
735        FND_MESSAGE.SET_NAME('GMD', 'GMD_UNEXPECTED_ERROR');
736        FND_MESSAGE.SET_TOKEN('ERROR', sqlerrm);
737        FND_MSG_PUB.ADD;
738        FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
739 		                  P_data  => x_message_list);
740   END update_operation_resources;
741 
742   /*=============================================================
743   Procedure
744    delete_operation_resources
745   Description
746     This particular procedure is used to delete operation resources
747     Parameters
748   ================================================ */
749   PROCEDURE delete_operation_resources
750   ( p_api_version 		IN 	NUMBER
751   , p_init_msg_list 		IN 	BOOLEAN
752   , p_commit		IN 	BOOLEAN
753   , p_oprn_line_id		IN	gmd_operation_resources.oprn_line_id%TYPE
754   , p_resources		IN 	gmd_operation_resources.resources%TYPE
755   , x_message_count 		OUT NOCOPY  	NUMBER
756   , x_message_list 		OUT NOCOPY  	VARCHAR2
757   , x_return_status		OUT NOCOPY  	VARCHAR2)  IS
758 
759    v_update_table   		gmd_operation_resources_pub.update_tbl_type;
760    v_count			NUMBER;
761    l_return_status		VARCHAR2(1);
762    l_api_version		NUMBER := 1.0;
763    v_oprn_id                    NUMBER;
764 
765    invalid_version		EXCEPTION;
766    setup_failure		EXCEPTION;
767    del_oprn_rsrc_err		EXCEPTION;
768    inv_resource_ind		EXCEPTION;
769 
770    CURSOR check_oprn_line_id(p_oprn_line_id NUMBER) IS
771      SELECT 1
772      FROM gmd_operation_activities
773      WHERE oprn_line_id = p_oprn_line_id;
774 
775    CURSOR check_Resource(p_oprn_line_id NUMBER, p_resources VARCHAR2)  IS
776      SELECT 1
777      FROM gmd_operation_resources
778      WHERE oprn_line_id = p_oprn_line_id
779      AND   resources = p_resources;
780 
781     CURSOR get_oprn_id (p_oprN_line_id gmd_operation_resources.oprn_line_id%TYPE) IS
782       SELECT oprn_id
783       FROM gmd_operation_activities
784       WHERE oprn_line_id = p_oprn_line_id;
785 
786   BEGIN
787     SAVEPOINT delete_oprn_rsrc;
788 
789     /* Initially let us assign the return status to success */
790     x_return_status := FND_API.g_ret_sts_success;
791 
792     /* Initialize message list and count if needed */
793     IF p_init_msg_list THEN
794       fnd_msg_pub.initialize;
795     END IF;
796 
797     /* Make sure we are call compatible */
798     IF NOT FND_API.compatible_api_call(l_api_version
799                                        ,p_api_version
800                                        ,'delete_operation_resources'
801                                        ,'gmd_operation_resources_pub') THEN
802       RAISE invalid_version;
803     END IF;
804 
805     IF NOT gmd_api_grp.setup_done THEN
806       gmd_api_grp.setup_done := gmd_api_grp.setup;
807     END IF;
808     IF NOT gmd_api_grp.setup_done THEN
809       RAISE setup_failure;
810     END IF;
811 
812     IF (l_debug = 'Y') THEN
813        gmd_debug.put_line('START of delete_operation_resources PUB');
814     END IF;
815 
816     /* Operation Line ID must be passed, otherwise give error */
817     IF (p_oprn_line_id IS NULL OR p_resources IS NULL) THEN
818       FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
819       FND_MESSAGE.SET_TOKEN ('MISSING', 'P_OPRN_LINE_ID');
820       FND_MSG_PUB.ADD;
821       RAISE del_oprn_rsrc_err;
822     ELSE   /* check oprn_line_id and resource exist */
823       OPEN check_oprn_line_id(p_oprn_line_id);
824       FETCH check_oprn_line_id INTO v_count;
825       IF check_oprn_line_id%NOTFOUND THEN
826         /* must pass valid oprn_line_id */
827       	FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_OPRNLINE_ID');
828         FND_MSG_PUB.ADD;
829         CLOSE check_oprn_line_id;   /* pku */
830         RAISE del_oprn_rsrc_err;
831       ELSE
832         OPEN check_resource(p_oprn_line_id, p_resources);
833         FETCH check_resource INTO v_count;
834         IF check_resource%NOTFOUND THEN
835           /* must pass valid resource */
836           FND_MESSAGE.SET_NAME('GMD','FM_BAD_RESOURCE');
837           FND_MSG_PUB.ADD;
838           CLOSE check_resource;
839           CLOSE check_oprn_line_id; /* pku */
840 	  RAISE del_oprn_rsrc_err;
841         END IF;
842         CLOSE check_resource;
843       END IF;
844       CLOSE check_oprn_line_id;
845     END IF;
846 
847     /* get the oprn_id */
848     OPEN get_oprn_id(p_oprn_line_id);
849     FETCH get_oprn_id INTO v_oprn_id;
850     CLOSE get_oprn_id;
851 
852     /* Operation Security Validation */
853     /* Validation: Chcek if this users performing update has access to this
854        operation owner orgn code */
855     IF NOT GMD_API_GRP.Check_orgn_access(Entity     => 'OPERATION'
856                                     ,Entity_id  => v_oprn_id) THEN
857       RAISE del_oprn_rsrc_err;
858     END IF;
859 
860 
861     IF x_return_status = FND_API.g_ret_sts_success THEN
862       /* Call PVT delete_operation_resources */
863       IF (l_debug = 'Y') THEN
864         gmd_debug.put_line('before call to delete_operation_resource PVT');
865       END IF;
866       gmd_operation_resources_pvt.delete_operation_resource(p_oprn_line_id    => p_oprn_line_id
867             						   ,p_resources    => p_resources
868                        					   , x_message_count => x_message_count
869 		       					   , x_message_list 	=> x_message_list
870        							   , x_return_status 	=> l_return_status);
871       IF l_return_status <> FND_API.g_ret_sts_success THEN
872         RAISE del_oprn_rsrc_err;
873       END IF;
874 
875       /* This implies that we are setting this current resource as secondary or auxillary */
876       /* so let us check if their exists atleast one primary resource */
877       OPEN  check_atleast_one (p_oprn_line_id, NULL);
878       FETCH check_atleast_one INTO v_count;
879       CLOSE check_atleast_one;
880       IF v_count = 0 THEN
881         gmd_api_grp.log_message ('GMD_MIN_ONE_PRIMARY_RESOURCE');
882         RAISE inv_resource_ind;
883       END IF;
884 
885       IF p_commit THEN
886         COMMIT;
887       END IF;
888     END IF;
889 
890     FND_MSG_PUB.count_and_get(p_count   => x_message_count
891                               ,p_data    => x_message_list);
892 
893     IF (l_debug = 'Y') THEN
894        gmd_debug.put_line('END of delete_operation_resources PUB');
895     END IF;
896 
897   EXCEPTION
898      WHEN invalid_version OR setup_failure OR inv_resource_ind THEN
899         ROLLBACK TO SAVEPOINT delete_oprn_rsrc;
900         x_return_status := FND_API.G_RET_STS_ERROR;
901         FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
902         	                   P_data  => x_message_list);
903      WHEN del_oprn_rsrc_err THEN
904         ROLLBACK TO SAVEPOINT delete_oprn_rsrc;
905         x_return_status := FND_API.G_RET_STS_ERROR;
906         FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
907         		           P_data  => x_message_list);
908      WHEN OTHERS THEN
909          ROLLBACK TO SAVEPOINT delete_oprn_rsrc;
910          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
911          FND_MESSAGE.SET_NAME('GMD', 'GMD_UNEXPECTED_ERROR');
912          FND_MESSAGE.SET_TOKEN('ERROR', sqlerrm);
913          FND_MSG_PUB.ADD;
914          FND_MSG_PUB.COUNT_AND_GET (P_count => x_message_count,
915          		            P_data  => x_message_list);
916   END delete_operation_resources;
917 
918 END GMD_OPERATION_RESOURCES_PUB;