1 PACKAGE BODY GMD_ROUTINGS_PUB AS
2 /* $Header: GMDPROUB.pls 120.4.12010000.2 2008/11/12 18:16:40 rnalla ship $ */
3
4
5 --Bug 3222090, NSRIVAST 20-FEB-2004, BEGIN
6 --Forward declaration.
7 FUNCTION set_debug_flag RETURN VARCHAR2;
8 l_debug VARCHAR2(1) := set_debug_flag;
9
10 FUNCTION set_debug_flag RETURN VARCHAR2 IS
11 l_debug VARCHAR2(1):= 'N';
12 BEGIN
13 IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
14 l_debug := 'Y';
15 END IF;
16 RETURN l_debug;
17 END set_debug_flag;
18 --Bug 3222090, NSRIVAST 20-FEB-2004, END
19
20 /* ================================================================= */
21 /* Procedure: */
22 /* insert_routing */
23 /* */
24 /* DESCRIPTION: */
25 /* */
26 /* API returns (x_return_code) = 'S' if the insert into routing */
27 /* header (fm_rout_hdr or gmd_routings) table is successfully. */
28 /* */
29 /* History : */
30 /* Shyam 07/29/2002 Initial implementation */
31 /* P.Raghu 08/27/2003 Bug#3068013 K is intialized with 1. */
32 /* kkillams23-03-2004 Added call to modify_status to set routing */
33 /* status to default status if default status is */
34 /* defined organization level w.r.t. bug 3408799 */
35 /* Uday Phadtare 13-MAR-2008 Bug 6871738. Select ROUTING_CLASS_UOM */
36 /* instead of UOM in Cursor Rout_cls_cur. */
37 /* ================================================================= */
38 PROCEDURE insert_routing
39 (
40 p_api_version IN NUMBER := 1
41 , p_init_msg_list IN BOOLEAN := TRUE
42 , p_commit IN BOOLEAN := FALSE
43 , p_routings IN gmd_routings%ROWTYPE
44 , p_routings_step_tbl IN GMD_ROUTINGS_PUB.gmd_routings_step_tab
45 , p_routings_step_dep_tbl IN GMD_ROUTINGS_PUB.gmd_routings_step_dep_tab
46 , x_message_count OUT NOCOPY NUMBER
47 , x_message_list OUT NOCOPY VARCHAR2
48 , x_return_status OUT NOCOPY VARCHAR2
49 ) IS
50
51 /* Local variable section */
52 l_api_name CONSTANT VARCHAR2(30) := 'INSERT_ROUTING';
53 l_row_id ROWID;
54 k NUMBER := 1;
55 l_return_from_routing_step_dep VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
56 l_routing_id NUMBER;
57 l_owner_id NUMBER;
58 l_oprn_no gmd_operations.oprn_no%TYPE;
59 l_oprn_vers gmd_operations.oprn_vers%TYPE;
60 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
61 l_return_from_routing_hdr VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
62 l_return_from_routing_step VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
63 l_routing_qty gmd_routings.routing_qty%TYPE := 0;
64 l_process_loss gmd_routings.process_loss%TYPE := 0;
65 l_routing_class_um fm_rout_cls.uom%TYPE;
66 l_stepdep_tbl GMD_ROUTINGS_PUB.gmd_routings_step_dep_tab;
67 l_step_dep_tab GMD_ROUTINGS_PUB.gmd_routings_step_dep_tab;
68
69 --kkillams,bug 3408799
70 l_entity_status GMD_API_GRP.status_rec_type;
71
72 /* Define cursors */
73 /* gets the routing class uom */
74 --Bug 6871738. Select ROUTING_CLASS_UOM instead of UOM.
75 Cursor Rout_cls_cur(vRouting_class fm_rout_hdr.routing_class%TYPE) IS
76 Select ROUTING_CLASS_UOM
77 From fm_rout_cls
78 Where routing_class = vRouting_class
79 and delete_mark = 0;
80
81 /* gets the operation no and version associated to the routing detail/Step */
82 Cursor Get_oprn_details(vOprn_id fm_rout_dtl.oprn_id%TYPE) IS
83 Select oprn_no, oprn_vers
84 From gmd_operations_b
85 Where oprn_id = vOprn_id;
86
87 /* get routing id sequence */
88 CURSOR Get_routing_id_seq IS
89 SELECT gem5_routing_id_s.NEXTVAL
90 FROM sys.dual;
91
92 /* B5609637 UOM cursor to find the routing UOM class and the routing class UOM class */
93 CURSOR Cur_uom_class (p_uom_code VARCHAR2) IS
94 SELECT uom_class
95 FROM mtl_units_of_measure
96 WHERE uom_code = p_uom_code;
97
98 l_routing_class_um_class VARCHAR2(30);
99 l_routing_um_class VARCHAR2(30);
100 l_routing_qty_cnv NUMBER;
101
102
103 /* get a record type */
104 l_routings_rec gmd_routings%ROWTYPE;
105
106 /* Define Exceptions */
107 routing_creation_failure EXCEPTION;
108 routing_step_creation_failure EXCEPTION;
109 routing_step_dep_failure EXCEPTION;
110 invalid_version EXCEPTION;
111 setup_failure EXCEPTION;
112 default_status_err EXCEPTION;
113
114 BEGIN
115 SAVEPOINT create_routing;
116
117 /* Set the return status to success initially */
118 x_return_status := FND_API.G_RET_STS_SUCCESS;
119 l_routings_rec := p_routings;
120
121 /* B5609637 Initialize the routing qty and the process loss with the passed values */
122 l_process_loss := p_routings.process_loss;
123 l_routing_qty := p_routings.routing_qty;
124
125
126
127 /* Initialize message list and count if needed */
128 IF p_init_msg_list THEN
129 fnd_msg_pub.initialize;
130 END IF;
131
132 IF (l_debug = 'Y') THEN
133 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Begin of API');
134 END IF;
135
136
137 /* Intialize the setup fields */
138 IF NOT gmd_api_grp.setup_done THEN
139 gmd_api_grp.setup_done := gmd_api_grp.setup;
140 END IF;
141 IF NOT gmd_api_grp.setup_done THEN
142 RAISE setup_failure;
143 END IF;
144
145 /* Make sure we are call compatible */
146 IF NOT FND_API.compatible_api_call ( gmd_routings_PUB.m_api_version
147 ,p_api_version
148 ,'INSERT_ROUTING'
149 ,gmd_routings_PUB.m_pkg_name) THEN
150 RAISE invalid_version;
151 END IF;
152
153 IF p_routings.routing_no IS NULL THEN
154 IF (l_debug = 'Y') THEN
155 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing Number required');
156 END IF;
157 FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
158 FND_MESSAGE.SET_TOKEN ('MISSING', 'ROUTING_NO');
159 FND_MSG_PUB.ADD;
160 RAISE routing_creation_failure;
161 END IF;
162
163 IF p_routings.routing_vers IS NULL THEN
164 IF (l_debug = 'Y') THEN
165 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing Version required');
166 END IF;
167 FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
168 FND_MESSAGE.SET_TOKEN ('MISSING', 'ROUTING_VERS');
169 FND_MSG_PUB.ADD;
170 RAISE routing_creation_failure;
171 ELSIF p_routings.routing_vers IS NOT NULL THEN
172 IF (p_routings.routing_vers < 0 ) THEN
173 FND_MESSAGE.SET_NAME ('GMD', 'GMD_NEGATIVE_FIELDS');
174 FND_MSG_PUB.ADD;
175 RAISE routing_creation_failure;
176 END IF;
177 END IF;
178
179 IF p_routings.routing_desc IS NULL THEN
180 IF (l_debug = 'Y') THEN
181 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing Description required');
182 END IF;
183 FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
184 FND_MESSAGE.SET_TOKEN ('MISSING', 'ROUTING_DESC');
185 FND_MSG_PUB.ADD;
186 RAISE routing_creation_failure;
187 END IF;
188
189 /* routing_uom must be passed, otherwise give error */
190 IF p_routings.routing_uom IS NULL THEN
191 IF (l_debug = 'Y') THEN
192 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Item uom required');
193 END IF;
194 FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
195 FND_MESSAGE.SET_TOKEN ('MISSING', 'ROUTING_UOM');
196 FND_MSG_PUB.ADD;
197 RAISE routing_creation_failure;
198 /* call common function to check if um passed is valid */
199 ELSIF (NOT(gmd_api_grp.validate_um(p_routings.routing_uom))) THEN
200 IF (l_debug = 'Y') THEN
201 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Item uom invalid');
202 END IF;
203 FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_UM_CODE');
204 FND_MSG_PUB.ADD;
205 RAISE routing_creation_failure;
206 END IF;
207
208 /*
209 * Convergence related fix - Shyam S
210 *
211 */
212
213 --Check that organization id is not null if raise an error message
214 IF (p_routings.owner_organization_id IS NULL) THEN
215 FND_MESSAGE.SET_NAME('GMD', 'GMD_MISSING_ORGANIZATION_ID');
216 FND_MSG_PUB.Add;
217 RAISE routing_creation_failure;
218 END IF;
219
220 -- Check if the responsibility has access to the organization
221 IF NOT (GMD_API_GRP.OrgnAccessible (powner_orgn_id => p_routings.owner_organization_id) ) THEN
222 RAISE routing_creation_failure;
223 END IF;
224
225 --Check the organization id passed is process enabled if not raise an error message
226 IF NOT (gmd_api_grp.check_orgn_status(p_routings.owner_organization_id)) THEN
227 FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ORGANIZATION_ID');
228 FND_MESSAGE.SET_TOKEN('ORGN_ID', p_routings.owner_organization_id);
229 FND_MSG_PUB.Add;
230 RAISE routing_creation_failure;
231 END IF;
232
233 /* Validation : Validate if the Routing start and end dates */
234 l_routings_rec.effective_start_date := TRUNC(NVL(p_routings.effective_start_date,SYSDATE));
235 IF l_routings_rec.effective_start_date IS NOT NULL AND
236 p_routings.effective_end_date IS NOT NULL THEN
237 /* Effective end date must be greater than start date, otherwise give error */
238 IF l_routings_rec.effective_start_date > p_routings.effective_end_date THEN
239 IF (l_debug = 'Y') THEN
240 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
241 ||'effective start date must be less then end date');
242 END IF;
243 FND_MESSAGE.SET_NAME('GMD', 'QC_MIN_MAX_DATE');
244 FND_MSG_PUB.ADD;
245 RAISE routing_creation_failure;
246 END IF;
247 END IF;
248
249 /* Validation 1. Check if this routing that is created does not exists
250 in the the database. The routing_id is the PK or Routing_no and version is
251 the unique key for this table (gmd_routings_b). */
252 GMDRTVAL_PUB.check_routing(pRouting_no => p_routings.routing_no
253 ,pRouting_vers => p_routings.routing_vers
254 ,xRouting_id => l_routing_id
255 ,xReturn_status => l_return_status);
256
257 IF l_return_status <> 'E' THEN /* it indicates that this routing exists */
258 FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_DUPLICATION');
259 FND_MSG_PUB.ADD;
260 RAISE routing_creation_failure;
261 ELSE
262 OPEN Get_routing_id_seq;
263 FETCH Get_routing_id_seq INTO l_routing_id;
264 IF Get_routing_id_seq%NOTFOUND then
265 FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ROUT_SEQ');
266 FND_MSG_PUB.ADD;
267 RAISE routing_creation_failure;
268 END IF;
269 CLOSE Get_routing_id_seq;
270 END IF; /* l_return_status <> 'E' */
271
272 /* Validation : Validate if the Routing dates fall within the associated operation
273 start and end dates. */
274 FOR b IN 1 .. p_routings_step_tbl.count LOOP
275 OPEN Get_oprn_details(p_routings_step_tbl(b).oprn_id);
276 FETCH Get_oprn_details INTO l_oprn_no, l_oprn_vers;
277 IF (Get_oprn_details%NOTFOUND) THEN
278 FND_MESSAGE.SET_NAME('GMD', 'GMD_MISSING_OPRN');
279 FND_MSG_PUB.ADD;
280 CLOSE Get_oprn_details;
281 RAISE routing_creation_failure;
282 END IF;
283 CLOSE Get_oprn_details;
284
285 IF GMDRTVAL_PUB.check_oprn(poprn_no =>l_oprn_no
286 ,poprn_vers => l_oprn_vers
287 ,prouting_start_date => l_routings_rec.effective_start_date
288 ) <> 0 THEN
289 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUT_DATES_INVALID');
290 FND_MSG_PUB.ADD;
291 RAISE routing_creation_failure;
292 END IF;
293 END LOOP; /* loop to validate routing dates */
294
295 /* Assingning the owner_id,enforce_step_dependency if they are not passed */
296 l_routings_rec.owner_id := gmd_api_grp.user_id; -- Bug 4603060
297 l_routings_rec.enforce_step_dependency := NVL(p_routings.enforce_step_dependency,0);
298
299 /* Validation : Check if Routing class is valid */
300 IF p_routings.routing_class IS NOT NULL THEN
301 IF GMDRTVAL_PUB.check_routing_class(p_routings.routing_class) <> 0 THEN
302 FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ROUT_CLS');
303 FND_MSG_PUB.ADD;
304 RAISE routing_creation_failure;
305 END IF;
306 END IF;
307
308 /* Calculations - Process loss. Based on the Routing qty, its uom and Routing class
309 calculate the planned process loss.
310 This is done only if the a NULL value was passed for this field */
311 IF (p_routings.process_loss IS NULL) THEN
312 /* Get the routing_qty in its routing_class uom */
313 IF (p_routings.Routing_class IS NOT NULL) THEN
314 OPEN Rout_cls_cur(p_routings.Routing_class);
315 FETCH Rout_cls_cur INTO l_routing_class_um;
316 IF Rout_cls_cur%NOTFOUND THEN
317 FND_MESSAGE.SET_NAME('GMD', 'GMD_TPL_WO_ROUT_CLS');
318 FND_MSG_PUB.Add;
319 CLOSE Rout_cls_cur;
320 Raise routing_creation_failure;
321 END IF;
322 CLOSE Rout_cls_cur;
323
324 /* Bug 5609637 , check for the uom class of routing and the routing class UOM */
325 OPEN Cur_uom_class(l_routing_class_um);
326 FETCH Cur_uom_class INTO l_routing_class_um_class;
327 CLOSE Cur_uom_class;
328
329 OPEN Cur_uom_class(p_routings.routing_uom);
330 FETCH Cur_uom_class INTO l_routing_um_class;
331 CLOSE Cur_uom_class;
332
333 IF l_routing_um_class = l_routing_class_um_class THEN
334
335 l_routing_qty_cnv := INV_CONVERT.inv_um_convert
336 ( item_id => null
337 ,precision => 5
338 ,from_quantity => p_routings.Routing_qty
339 ,from_unit => p_routings.routing_uom
340 ,to_unit => l_routing_class_um
341 ,from_name => NULL
342 ,to_name => NULL);
343
344 /* Calculate the process loss */
345 l_process_loss := GMDRTVAL_PUB.get_theoretical_process_loss
346 (prouting_class => p_routings.Routing_class,
347 pquantity => l_routing_qty_cnv);
348
349 ELSE
350 FND_MESSAGE.SET_NAME('GMD', 'GMD_RTG_CLS_VS_RTG_UM_TYPE');
351 FND_MSG_PUB.Add;
352 x_return_status := FND_API.G_RET_STS_ERROR;
353 Raise routing_creation_failure;
354
355 END IF; /* IF l_routing_um_class = l_routing_class_um_class */
356
357 END IF; /* if routing class is not null */
358 ELSE
359 l_process_loss := p_routings.process_loss;
360 l_routing_qty := p_routings.routing_qty;
361 END IF; /* if process loss is null */
362
363 /* Assign values that were derived in this API */
364 l_routings_rec.routing_id := l_routing_id;
365 l_routings_rec.process_loss := l_process_loss;
366 l_routings_rec.routing_qty := NVL(l_routing_qty,0);
367 l_routings_rec.contiguous_ind := NVL(p_routings.contiguous_ind,0);
368
369 /* Following steps are followed during creation of a routing
370 1. Business Rule : There must be at least one routing step for a
371 routing header to be created.
372 2. After routing steps are created, routing step dependencies can be
373 created for these steps. However, there need to be more than one routing steps
374 to create step dependencies for this routing. Routing details/Steps API
375 should take care of this. */
376 IF (p_routings_step_tbl.count > 0) THEN
377 /* Step 1 : Create Routing header */
378 GMD_ROUTINGS_PVT.insert_routing
379 ( p_routings => l_routings_rec
380 , x_message_count => x_message_count
381 , x_message_list => x_message_list
382 , x_return_status => x_return_status
383 );
384 /* After creating this routing pass the routing id */
385 /* to the function that creates the routing steps */
386
387 /* Step 2 : Create Routing steps */
388 IF (l_debug = 'Y') THEN
389 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
390 ||'Insert the routing steps for routing with routing id = '||l_routing_id);
391 END IF;
392
393 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
394 Raise routing_creation_failure;
395 END IF;
396
397 /* Looping each routing step detail row */
398 /* After creating routing steps pass the routing id */
399 /* and the routing step no to the function that generates */
400 /* the step dependencies */
401 FOR i IN 1 .. p_routings_step_tbl.count LOOP
402 GMD_ROUTING_STEPS_PUB.insert_routing_steps
403 (p_routing_id => l_routing_id
404 ,p_routing_step_rec => p_routings_step_tbl(i)
405 ,p_routings_step_dep_tbl => l_stepdep_tbl
406 ,p_commit => FALSE
407 ,x_message_count => x_message_count
408 ,x_message_list => x_message_list
409 ,x_return_status => l_return_from_routing_step
410 );
411 -- Check if routing detail was created
412 IF l_return_from_routing_step <> FND_API.G_RET_STS_SUCCESS THEN
413 RAISE routing_step_creation_failure;
414 END IF;
415 END LOOP; /* End loop for p_routings_step_tbl */
416
417 IF p_routings_step_dep_tbl.count > 0 THEN
418 IF (l_debug = 'Y') THEN
419 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
420 ||'Creating Routing Step dependencies ');
421 END IF;
422 FOR i IN 1 .. p_routings_step_tbl.count LOOP
423 -- Call the routing step dep function
424 -- For each routingStep_no, routing_id enter all the dependent
425 -- routing step nos
426 -- Construct a PL/SQL table that is specific only to this
427 -- routing step no and routing id.
428 l_step_dep_tab.delete;
429 /* Begin Bug#3068013 P.Raghu */
430 /* Initializing k */
431 k := 1;
432 /* End Bug#3068013 */
433 FOR j IN 1 .. p_routings_step_dep_tbl.count LOOP
434 IF (p_routings_step_tbl(i).ROUTINGSTEP_NO
435 = p_routings_step_dep_tbl(j).ROUTINGSTEP_NO) THEN
436 l_step_dep_tab(k).routingstep_no := p_routings_step_dep_tbl(j).routingstep_no ;
437 l_step_dep_tab(k).dep_routingstep_no := p_routings_step_dep_tbl(j).dep_routingstep_no ;
438 l_step_dep_tab(k).routing_id := l_routing_id ;
439 l_step_dep_tab(k).dep_type := p_routings_step_dep_tbl(j).dep_type ;
440 l_step_dep_tab(k).rework_code := p_routings_step_dep_tbl(j).rework_code ;
441 l_step_dep_tab(k).standard_delay := p_routings_step_dep_tbl(j).standard_delay ;
442 l_step_dep_tab(k).minimum_delay := p_routings_step_dep_tbl(j).minimum_delay ;
443 l_step_dep_tab(k).max_delay := p_routings_step_dep_tbl(j).max_delay ;
444 l_step_dep_tab(k).transfer_qty := p_routings_step_dep_tbl(j).transfer_qty ;
445 l_step_dep_tab(k).RoutingStep_No_uom := p_routings_step_dep_tbl(j).RoutingStep_No_uom ;
446 l_step_dep_tab(k).text_code := p_routings_step_dep_tbl(j).text_code ;
447 l_step_dep_tab(k).last_updated_by := p_routings_step_dep_tbl(j).last_updated_by ;
448 l_step_dep_tab(k).created_by := p_routings_step_dep_tbl(j).created_by ;
449 l_step_dep_tab(k).last_update_date := p_routings_step_dep_tbl(j).last_update_date ;
450 l_step_dep_tab(k).creation_date := p_routings_step_dep_tbl(j).creation_date ;
451 l_step_dep_tab(k).last_update_login := p_routings_step_dep_tbl(j).last_update_login ;
452 l_step_dep_tab(k).transfer_pct := p_routings_step_dep_tbl(j).transfer_pct ;
453
454 k := k + 1;
455 END IF;
456 END LOOP;
457
458 /* Since we call this procedure for each routingStep we dont have to reinitialize K
459 value after populating dependency PLSQL table. Call the step dependency function */
460
461 IF l_step_dep_tab.count > 0 THEN
462 GMD_ROUTING_STEPS_PUB.insert_step_dependencies
463 (
464 p_routing_id => l_routing_id
465 ,p_routingstep_no => p_routings_step_tbl(i).routingstep_no
466 ,p_routings_step_dep_tbl => l_step_dep_tab
467 ,p_commit => FALSE
468 ,x_message_count => x_message_count
469 ,x_message_list => x_message_list
470 ,x_return_status => l_return_from_routing_step_dep
471 );
472
473 /* Check if insert of step dependency was done */
474 IF l_return_from_routing_step_dep <> FND_API.G_RET_STS_SUCCESS THEN
475 RAISE routing_step_dep_failure;
476 END IF; /* IF l_return_from_routing_step_dep <> FND_API.G_RET_STS_SUCCESS */
477 END IF; /* when l_step_dep_tab.count > 0 */
478 END LOOP;
479 END IF; /* if p_routings_step_dep_tbl.count > 0 */
480 ELSE
481 IF (l_debug = 'Y') THEN
482 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
483 ||'Routing API needs atleast one step to create its header');
484 END IF;
485 RAISE routing_creation_failure;
486 END IF;
487
488 /* Check if work was done */
489 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
490 RAISE routing_creation_failure;
491 END IF; /* IF x_return_status <> FND_API.G_RET_STS_SUCCESS */
492
493 IF (P_commit) THEN
494 COMMIT;
495 --kkillams,bug 3408799
496 SAVEPOINT default_status_sp;
497 --Getting the default status for the owner orgn code or null orgn of recipe from parameters table
498 gmd_api_grp.get_status_details (V_entity_type => 'ROUTING',
499 V_orgn_id => p_routings.owner_organization_id, --W.r.t. bug 4004501
500 X_entity_status => l_entity_status);
501 --Add this code after the call to gmd_routings_pkg.insert_row.
502 IF (l_entity_status.entity_status > 100) THEN
503 Gmd_status_pub.modify_status ( p_api_version => 1
504 , p_init_msg_list => TRUE
505 , p_entity_name =>'ROUTING'
506 , p_entity_id => l_routings_rec.routing_id
507 , p_entity_no => NULL
508 , p_entity_version => NULL
509 , p_to_status => l_entity_status.entity_status
510 , p_ignore_flag => FALSE
511 , x_message_count => x_message_count
512 , x_message_list => x_message_list
513 , x_return_status => X_return_status);
514 IF x_return_status NOT IN (FND_API.g_ret_sts_success,'P') THEN
515 RAISE default_status_err;
516 END IF; --x_return_status NOT IN (FND_API.g_ret_sts_success,'P')
517 END IF; --l_entity_status <> 100
518 COMMIT;
519 END IF; --P_commit
520
521 fnd_msg_pub.count_and_get (
522 p_count => x_message_count
523 ,p_encoded => FND_API.g_false
524 ,p_data => x_message_list);
525
526 IF x_message_count = 0 THEN
527 IF (l_debug = 'Y') THEN
528 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
529 ||'Routing Header was created successfully');
530 END IF;
531 END IF;
532
533 IF (l_debug = 'Y') THEN
534 gmd_debug.put_line('Completed '||l_api_name ||' at '
535 ||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
536 END IF;
537
538 EXCEPTION
539 WHEN routing_creation_failure OR invalid_version THEN
540 IF (l_debug = 'Y') THEN
541 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
542 END IF;
543 fnd_msg_pub.count_and_get (
544 p_count => x_message_count
545 ,p_encoded => FND_API.g_false
546 ,p_data => x_message_list);
547 x_return_status := FND_API.G_RET_STS_ERROR;
548 ROLLBACK TO SAVEPOINT create_routing;
549 WHEN setup_failure THEN
550 ROLLBACK TO SAVEPOINT create_routing;
551 x_return_status := FND_API.G_RET_STS_ERROR;
552 fnd_msg_pub.count_and_get (
553 p_count => x_message_count
554 ,p_encoded => FND_API.g_false
555 ,p_data => x_message_list);
556 WHEN default_status_err THEN
557 ROLLBACK TO default_status_sp;
558 x_return_status := FND_API.G_RET_STS_ERROR;
559 fnd_msg_pub.count_and_get (
560 p_count => x_message_count
561 ,p_encoded => FND_API.g_false
562 ,p_data => x_message_list);
563 WHEN OTHERS THEN
564 ROLLBACK TO SAVEPOINT create_routing;
565 x_return_status := FND_API.g_ret_sts_unexp_error;
566 fnd_msg_pub.add_exc_msg (gmd_routings_PUB.m_pkg_name, l_api_name);
567 IF (l_debug = 'Y') THEN
568 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
569 END IF;
570 fnd_msg_pub.count_and_get (
571 p_count => x_message_count
572 ,p_encoded => FND_API.g_false
573 ,p_data => x_message_list);
574 END insert_routing;
575
576 /* =============================================================== */
577 /* Procedure: */
578 /* update_routing */
579 /* */
580 /* DESCRIPTION: */
581 /* */
582 /* API returns (x_return_code) = 'S' if the update into routing */
583 /* header (fm_rout_hdr or gmd_routings) table is successfully. */
584 /* */
585 /* History : */
586 /* Shyam 07/29/2002 Initial implementation */
587 /* RLNAGARA 25-Apr-2008 B6997624 Check if the fixed process loss uom is valid*/
588 /* =============================================================== */
589 PROCEDURE update_routing
590 ( p_api_version IN NUMBER := 1
591 , p_init_msg_list IN BOOLEAN := TRUE
592 , p_commit IN BOOLEAN := FALSE
593 , p_routing_id IN gmd_routings.routing_id%TYPE := NULL
594 , p_routing_no IN gmd_routings.routing_no%TYPE := NULL
595 , p_routing_vers IN gmd_routings.routing_vers%TYPE := NULL
596 , p_update_table IN update_tbl_type
597 , x_message_count OUT NOCOPY NUMBER
598 , x_message_list OUT NOCOPY VARCHAR2
599 , x_return_status OUT NOCOPY VARCHAR2
600 ) IS
601
602 /* Local variable section */
603 l_api_name CONSTANT VARCHAR2(30) := 'UPDATE_ROUTING';
604 l_routing_id gmd_routings.routing_id%TYPE;
605 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
606 l_cur_status gmd_status.status_code%TYPE;
607 l_owner_id gmd_routings.owner_id%TYPE;
608 l_owner_orgn_id NUMBER;
609
610 /* Define record type that hold the routing data */
611 l_old_routing_rec gmd_routings%ROWTYPE;
612
613 /* Cursor section */
614 Cursor get_cur_status(vRouting_id gmd_routings.routing_id%TYPE ) IS
615 Select routing_status
616 From gmd_routings
617 Where routing_id = vRouting_id;
618
619 CURSOR get_old_routing_rec(vRouting_id gmd_routings.routing_id%TYPE) IS
620 Select *
621 From gmd_routings
622 Where Routing_id = vRouting_id;
623
624 /* Define Exceptions */
625 routing_update_failure EXCEPTION;
626 invalid_version EXCEPTION;
627 setup_failure EXCEPTION;
628
629 BEGIN
630 SAVEPOINT update_routing;
631
632 /* Set the return status to success initially */
633 x_return_status := FND_API.G_RET_STS_SUCCESS;
634
635 /* Initialize message list and count if needed */
636 IF p_init_msg_list THEN
637 fnd_msg_pub.initialize;
638 END IF;
639
640 IF (l_debug = 'Y') THEN
641 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
642 ||'Begining of Update API ');
643 END IF;
644
645 /* Intialize the setup fields */
646 IF NOT gmd_api_grp.setup_done THEN
647 gmd_api_grp.setup_done := gmd_api_grp.setup;
648 END IF;
649 IF NOT gmd_api_grp.setup_done THEN
650 RAISE setup_failure;
651 END IF;
652
653 /* Make sure we are call compatible */
654 IF NOT FND_API.compatible_api_call ( GMD_ROUTINGS_PUB.m_api_version
655 ,p_api_version
656 ,l_api_name
657 ,GMD_ROUTINGS_PUB.m_pkg_name) THEN
658 RAISE invalid_version;
659 END IF;
660
661 /* Validation 1. Check if this routing that is updated does exists
662 in the the database. The routing_id is the PK or Routing_no and version is
663 the unique key for this table (gmd_routings_b). */
664 IF p_routing_id IS NOT NULL THEN
665 l_routing_id := p_routing_id;
666 ELSE
667 GMDRTVAL_PUB.check_routing(pRouting_no => p_routing_no
668 ,pRouting_vers => p_routing_vers
669 ,xRouting_id => l_routing_id
670 ,xReturn_status => l_return_status);
671
672 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
673 /* it indicates that this routing does'ntexists */
674 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUTING_INVALID');
675 FND_MSG_PUB.ADD;
676 RAISE routing_update_failure;
677 END IF;
678 END IF;
679
680 /* Check the routing id is not null */
681 IF l_routing_id IS NULL THEN
682 IF (l_debug = 'Y') THEN
683 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing id is required');
684 END IF;
685 FND_MESSAGE.SET_NAME ('GMI', 'GMI_MISSING');
686 FND_MESSAGE.SET_TOKEN ('MISSING', 'ROUTING_ID');
687 FND_MSG_PUB.ADD;
688 RAISE routing_update_failure;
689 END IF;
690
691 /* Routing Security fix */
692 /* Validation: Check if for given user this routing can be modified */
693 IF (l_debug = 'Y') THEN
694 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'
695 ||'Validation of user - owner orgn ocde = '||gmd_api_grp.user_id);
696 END IF;
697
698 IF NOT GMD_API_GRP.Check_orgn_access(Entity => 'ROUTING'
699 ,Entity_id => l_routing_id) THEN
700 RAISE routing_update_failure;
701 END IF;
702
703 /* Validation: Operation status level should be higher or equal
704 the routing level status. For instance, if the routing status
705 is "Approved for Laboratory Use", operations with a status cannot be "New"
706 are not allowed. Therefore when the routing status is updated check
707 all the associated operation status */
708 OPEN get_cur_status(l_routing_id);
709 FETCH get_cur_status INTO l_cur_status;
710 CLOSE get_cur_status;
711
712 FOR a IN 1 .. p_update_table.count LOOP
713 /* Validation: status dependencies */
714 IF UPPER(p_update_table(a).p_col_to_update) = 'STATUS' THEN
715 IF NOT GMD_STATUS_CODE.CHECK_DEPENDENT_STATUS
716 ( P_Entity_Type => 4,
717 P_Entity_id => l_routing_id,
718 P_Current_Status => l_cur_status,
719 P_To_Status => p_update_table(a).p_value) THEN
720 FND_MESSAGE.SET_NAME('GMD', 'GMD_STATUS_DEPEND_NOT_APPROVED');
721 FND_MSG_PUB.ADD;
722 RAISE routing_update_failure;
723 END IF;
724 /* Validation : Check if owner_orgn_id is valid */
725 /* Routing Security fix */
726 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'OWNER_ORGANIZATION_ID' THEN
727 l_owner_orgn_id := p_update_table(a).p_value;
728 IF NOT GMD_API_GRP.OrgnAccessible(l_owner_orgn_id) THEN
729 RAISE routing_update_failure;
730 END IF;
731 /* Validation : Check if Routing class is valid */
732 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'ROUTING_CLASS' THEN
733 IF p_update_table(a).p_value IS NOT NULL THEN
734 IF GMDRTVAL_PUB.check_routing_class(p_update_table(a).p_value) <> 0 THEN
735 FND_MESSAGE.SET_NAME('GMD', 'GMD_INVALID_ROUT_CLS');
736 FND_MSG_PUB.ADD;
737 RAISE routing_update_failure;
738 END IF;
739 END IF;
740 /* Validation : Check if Routing uom is valid */
741 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'ROUTING_UOM' THEN
742 IF p_update_table(a).p_value IS NOT NULL THEN
743 IF (NOT(gmd_api_grp.validate_um(p_update_table(a).p_value))) THEN
744 FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_UM_CODE');
745 FND_MSG_PUB.ADD;
746 RAISE routing_update_failure;
747 END IF;
748 END IF;
749 /* Validation: delete_mark validation */
750 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'DELETE_MARK' THEN
751 GMDRTVAL_PUB.check_delete_mark ( Pdelete_mark => p_update_table(a).p_value,
752 x_return_status => l_return_status);
753 IF l_return_status <> 'S' THEN /* it indicates that invalid value has been passed */
754 FND_MESSAGE.SET_NAME('GMA', 'SY_BADDELETEMARK');
755 FND_MSG_PUB.ADD;
756 RAISE routing_update_failure;
757 END IF;
758 /*RLNAGARA B6997624 Check if the fixed process loss uom is valid*/
759 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'FIXED_PROCESS_LOSS_UOM' THEN
760 IF p_update_table(a).p_value IS NOT NULL THEN
761 IF (NOT(gmd_api_grp.validate_um(p_update_table(a).p_value))) THEN
762 FND_MESSAGE.SET_NAME('GMA', 'SY_INVALID_UM_CODE');
763 FND_MSG_PUB.ADD;
764 RAISE routing_update_failure;
765 END IF;
766 END IF;
767 ELSIF UPPER(p_update_table(a).p_col_to_update) = 'OWNER_ID' THEN
768 l_owner_id := gmd_api_grp.user_id; -- Bug 4603060
769 END IF;
770
771
772 /* Validation : Routing status is not On Hold nor Obsolete/Archived
773 and Routing is not logically deleted */
774 IF NOT GMD_COMMON_VAL.UPDATE_ALLOWED
775 (Entity => 'ROUTING',
776 Entity_id => l_routing_id,
777 Update_Column_Name => p_update_table(a).p_col_to_update ) THEN
778 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUT_NOT_VALID');
779 FND_MSG_PUB.ADD;
780 RAISE routing_update_failure;
781 END IF;
782 END LOOP;
783
784 /* Call the Routing Pvt API */
785 GMD_ROUTINGS_PVT.update_routing
786 ( p_routing_id => l_routing_id
787 , p_update_table => p_update_table
788 , x_message_count => x_message_count
789 , x_message_list => x_message_list
790 , x_return_status => x_return_status
791 );
792
793 /* Check if work was done */
794 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
795 RAISE routing_update_failure;
796 END IF; /* IF x_return_status <> FND_API.G_RET_STS_SUCCESS */
797
798 fnd_msg_pub.count_and_get (
799 p_count => x_message_count
800 ,p_encoded => FND_API.g_false
801 ,p_data => x_message_list);
802
803 IF x_message_count = 0 THEN
804 IF (l_debug = 'Y') THEN
805 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing was updated successfullly');
806 END IF;
807 END IF;
808
809 IF (P_commit) THEN
810 COMMIT;
811 END IF;
812
813 IF (l_debug = 'Y') THEN
814 gmd_debug.put_line('Completed '||l_api_name ||' at '
815 ||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
816 END IF;
817
818 EXCEPTION
819 WHEN routing_update_failure OR invalid_version THEN
820 ROLLBACK TO SAVEPOINT update_routing;
821 x_return_status := FND_API.G_RET_STS_ERROR;
822 IF (l_debug = 'Y') THEN
823 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
824 END IF;
825 fnd_msg_pub.count_and_get (
826 p_count => x_message_count
827 ,p_encoded => FND_API.g_false
828 ,p_data => x_message_list);
829 WHEN setup_failure THEN
830 ROLLBACK TO SAVEPOINT update_routing;
831 x_return_status := FND_API.G_RET_STS_ERROR;
832 fnd_msg_pub.count_and_get (
833 p_count => x_message_count
834 ,p_encoded => FND_API.g_false
835 ,p_data => x_message_list);
836 WHEN OTHERS THEN
837 ROLLBACK TO SAVEPOINT update_routing;
838 x_return_status := FND_API.g_ret_sts_unexp_error;
839 fnd_msg_pub.add_exc_msg (gmd_routings_PUB.m_pkg_name, l_api_name);
840 IF (l_debug = 'Y') THEN
841 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
842 END IF;
843 fnd_msg_pub.count_and_get (
844 p_count => x_message_count
845 ,p_encoded => FND_API.g_false
846 ,p_data => x_message_list);
847 END update_routing;
848
849 /* =============================================================== */
850 /* Procedure: */
851 /* delete_routing */
852 /* */
853 /* DESCRIPTION: */
854 /* */
855 /* API returns (x_return_code) = 'S' if the delete into routing */
856 /* header (fm_rout_hdr or gmd_routings) table is successfully. */
857 /* */
858 /* History : */
859 /* Shyam 07/29/2002 Initial implementation */
860 /* kkillams 02/17/2004 Added new validation which checks whether */
861 /* Routing is associated with any recipe or */
862 /* not w.r.t. bug 3355204 */
863 /* =============================================================== */
864 PROCEDURE delete_routing
865 ( p_api_version IN NUMBER := 1
866 , p_init_msg_list IN BOOLEAN := TRUE
867 , p_commit IN BOOLEAN := FALSE
868 , p_routing_id IN gmd_routings.routing_id%TYPE := NULL
869 , p_routing_no IN gmd_routings.routing_no%TYPE := NULL
870 , p_routing_vers IN gmd_routings.routing_vers%TYPE := NULL
871 , x_message_count OUT NOCOPY NUMBER
872 , x_message_list OUT NOCOPY VARCHAR2
873 , x_return_status OUT NOCOPY VARCHAR2
874 ) IS
875
876 /*Cursor verifies whether routing associated with any recipe or not*/
877 CURSOR Cur_check_rout(cp_routing_id gmd_recipes.routing_id%TYPE)
878 IS SELECT count(1) FROM gmd_recipes
879 WHERE routing_id = cp_routing_id
880 AND delete_mark = 0;
881 /* Local variable section */
882 l_api_name CONSTANT VARCHAR2(30) := 'DELETE_ROUTING';
883 l_routing_id gmd_routings.routing_id%TYPE;
884 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
885 l_count NUMBER;
886
887 /* Define a table type */
888 l_update_table GMD_ROUTINGS_PUB.UPDATE_TBL_TYPE;
889
890
891 /* Define Exceptions */
892 routing_delete_failure EXCEPTION;
893 invalid_version EXCEPTION;
894 setup_failure EXCEPTION;
895 routing_used EXCEPTION;
896 BEGIN
897 SAVEPOINT delete_routing;
898 IF (l_debug = 'Y') THEN
899 gmd_debug.log_initialize('Dertpub');
900 END IF;
901
902 /* Set the return status to success initially */
903 x_return_status := FND_API.G_RET_STS_SUCCESS;
904
905 /* Initialize message list and count if needed */
906 IF p_init_msg_list THEN
907 fnd_msg_pub.initialize;
908 END IF;
909
910 /* Intialize the setup fields */
911 IF NOT gmd_api_grp.setup_done THEN
912 gmd_api_grp.setup_done := gmd_api_grp.setup;
913 END IF;
914 IF NOT gmd_api_grp.setup_done THEN
915 RAISE setup_failure;
916 END IF;
917
918 /* Make sure we are call compatible */
919 IF NOT FND_API.compatible_api_call ( GMD_ROUTINGS_PUB.m_api_version
920 ,p_api_version
921 ,l_api_name
922 ,GMD_ROUTINGS_PUB.m_pkg_name) THEN
923 x_return_status := FND_API.G_RET_STS_ERROR;
924 RAISE invalid_version;
925 END IF;
926
927 /* Validation :. Check if this routing that is deleted does exists
928 in the the database. The routing_id is the PK or Routing_no and version is
929 the unique key for this table (gmd_routings_b). */
930 IF p_routing_id IS NOT NULL THEN
931 l_routing_id := p_routing_id;
932 ELSE
933 GMDRTVAL_PUB.check_routing(pRouting_no => p_routing_no
934 ,pRouting_vers => p_routing_vers
935 ,xRouting_id => l_routing_id
936 ,xReturn_status => l_return_status);
937
938 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
939 /* it indicates that this routing does'ntexists */
940 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUTING_INVALID');
941 FND_MSG_PUB.ADD;
942 RAISE routing_delete_failure;
943 END IF;
944 END IF;
945
946 /*Validation: Verifies whether routing associated with any recipe or not.
947 If yes, then system raises error and terminates remaining processes w.r.t. bug 3355204*/
948 OPEN Cur_check_rout(p_routing_id);
949 FETCH Cur_check_rout INTO l_count;
950 IF (l_count <> 0) THEN
951 x_return_status := FND_API.G_RET_STS_ERROR;
952 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUTING_USED');
953 FND_MSG_PUB.ADD;
954 RAISE routing_used;
955 END IF;
956
957 l_update_table(1).P_COL_TO_UPDATE := 'DELETE_MARK';
958 l_update_table(1).P_VALUE := '1';
959
960 GMD_ROUTINGS_PUB.update_routing
961 ( p_routing_id => l_routing_id
962 , p_update_table => l_update_table
963 , p_commit => FALSE
964 , x_message_count => x_message_count
965 , x_message_list => x_message_list
966 , x_return_status => x_return_status
967 );
968
969 /* Check if work was done */
970 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
971 RAISE routing_delete_failure;
972 END IF; /* IF x_return_status <> FND_API.G_RET_STS_SUCCESS */
973
974 fnd_msg_pub.count_and_get (
975 p_count => x_message_count
976 ,p_encoded => FND_API.g_false
977 ,p_data => x_message_list);
978
979 IF x_message_count = 0 THEN
980 IF (l_debug = 'Y') THEN
981 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing was created successfullly');
982 END IF;
983 END IF;
984
985 IF (P_commit) THEN
986 COMMIT;
987 END IF;
988
989 IF (l_debug = 'Y') THEN
990 gmd_debug.put_line('Completed '||l_api_name ||' at '
991 ||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
992 END IF;
993
994 EXCEPTION
995 WHEN routing_delete_failure OR invalid_version or routing_used THEN
996 ROLLBACK TO SAVEPOINT delete_routing;
997 x_return_status := FND_API.G_RET_STS_ERROR;
998 IF (l_debug = 'Y') THEN
999 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
1000 END IF;
1001 fnd_msg_pub.count_and_get (
1002 p_count => x_message_count
1003 ,p_encoded => FND_API.g_false
1004 ,p_data => x_message_list);
1005 WHEN setup_failure THEN
1006 ROLLBACK TO SAVEPOINT delete_routing;
1007 x_return_status := FND_API.G_RET_STS_ERROR;
1008 fnd_msg_pub.count_and_get (
1009 p_count => x_message_count
1010 ,p_encoded => FND_API.g_false
1011 ,p_data => x_message_list);
1012 WHEN OTHERS THEN
1013 ROLLBACK TO SAVEPOINT delete_routing;
1014 x_return_status := FND_API.g_ret_sts_unexp_error;
1015 fnd_msg_pub.add_exc_msg (gmd_routings_PUB.m_pkg_name, l_api_name);
1016 IF (l_debug = 'Y') THEN
1017 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
1018 END IF;
1019 fnd_msg_pub.count_and_get (
1020 p_count => x_message_count
1021 ,p_encoded => FND_API.g_false
1022 ,p_data => x_message_list);
1023 END delete_routing;
1024
1025 /* =============================================================== */
1026 /* Procedure: */
1027 /* undelete_routing */
1028 /* */
1029 /* DESCRIPTION: */
1030 /* */
1031 /* API returns (x_return_code) = 'S' if the delete into routing */
1032 /* header (fm_rout_hdr or gmd_routings) table is successfully. */
1033 /* */
1034 /* History : */
1035 /* Shyam 07/29/2002 Initial implementation */
1036 /* =============================================================== */
1037 PROCEDURE undelete_routing
1038 ( p_api_version IN NUMBER := 1
1039 , p_init_msg_list IN BOOLEAN := TRUE
1040 , p_commit IN BOOLEAN := FALSE
1041 , p_routing_id IN gmd_routings.routing_id%TYPE := NULL
1042 , p_routing_no IN gmd_routings.routing_no%TYPE := NULL
1043 , p_routing_vers IN gmd_routings.routing_vers%TYPE := NULL
1044 , x_message_count OUT NOCOPY NUMBER
1045 , x_message_list OUT NOCOPY VARCHAR2
1046 , x_return_status OUT NOCOPY VARCHAR2
1047 ) IS
1048
1049 /* Local variable section */
1050 l_api_name CONSTANT VARCHAR2(30) := 'UNDELETE_ROUTING';
1051 l_routing_id gmd_routings.routing_id%TYPE;
1052 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
1053
1054 /* Define a table type */
1055 l_update_table GMD_ROUTINGS_PUB.UPDATE_TBL_TYPE;
1056
1057 /* Define Exceptions */
1058 routing_undelete_failure EXCEPTION;
1059 invalid_version EXCEPTION;
1060 setup_failure EXCEPTION;
1061 BEGIN
1062 SAVEPOINT undelete_routing;
1063 IF (l_debug = 'Y') THEN
1064 gmd_debug.log_initialize('Undrtpub');
1065 END IF;
1066
1067 /* Set the return status to success initially */
1068 x_return_status := FND_API.G_RET_STS_SUCCESS;
1069
1070 /* Initialize message list and count if needed */
1071 IF p_init_msg_list THEN
1072 fnd_msg_pub.initialize;
1073 END IF;
1074
1075 /* Intialize the setup fields */
1076 IF NOT gmd_api_grp.setup_done THEN
1077 gmd_api_grp.setup_done := gmd_api_grp.setup;
1078 END IF;
1079 IF NOT gmd_api_grp.setup_done THEN
1080 RAISE setup_failure;
1081 END IF;
1082
1083 /* Make sure we are call compatible */
1084 IF NOT FND_API.compatible_api_call ( GMD_ROUTINGS_PUB.m_api_version
1085 ,p_api_version
1086 ,l_api_name
1087 ,GMD_ROUTINGS_PUB.m_pkg_name) THEN
1088 x_return_status := FND_API.G_RET_STS_ERROR;
1089 RAISE invalid_version;
1090 END IF;
1091
1092 /* Validation :. Check if this routing that is deleted does exists
1093 in the the database. The routing_id is the PK or Routing_no and version is
1094 the unique key for this table (gmd_routings_b). */
1095 IF p_routing_id IS NOT NULL THEN
1096 l_routing_id := p_routing_id;
1097 ELSE
1098 GMDRTVAL_PUB.check_routing(pRouting_no => p_routing_no
1099 ,pRouting_vers => p_routing_vers
1100 ,xRouting_id => l_routing_id
1101 ,xReturn_status => l_return_status);
1102
1103 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1104 /* it indicates that this routing does'ntexists */
1105 FND_MESSAGE.SET_NAME('GMD', 'GMD_ROUTING_INVALID');
1106 FND_MSG_PUB.ADD;
1107 RAISE routing_undelete_failure;
1108 END IF;
1109 END IF;
1110
1111 UPDATE gmd_routings_b
1112 SET delete_mark = 0
1113 WHERE routing_id = l_routing_id;
1114
1115 fnd_msg_pub.count_and_get (
1116 p_count => x_message_count
1117 ,p_encoded => FND_API.g_false
1118 ,p_data => x_message_list);
1119
1120 IF x_message_count = 0 THEN
1121 IF (l_debug = 'Y') THEN
1122 gmd_debug.put_line(m_pkg_name||'.'||l_api_name||':'||'Routing was undeleted successfullly');
1123 END IF;
1124 END IF;
1125
1126 IF (P_commit) THEN
1127 COMMIT;
1128 END IF;
1129
1130 IF (l_debug = 'Y') THEN
1131 gmd_debug.put_line('Completed '||l_api_name ||' at '
1132 ||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
1133 END IF;
1134
1135 EXCEPTION
1136 WHEN routing_undelete_failure OR invalid_version THEN
1137 ROLLBACK TO SAVEPOINT undelete_routing;
1138 x_return_status := FND_API.G_RET_STS_ERROR;
1139 IF (l_debug = 'Y') THEN
1140 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
1141 END IF;
1142 fnd_msg_pub.count_and_get (
1143 p_count => x_message_count
1144 ,p_encoded => FND_API.g_false
1145 ,p_data => x_message_list);
1146 WHEN setup_failure THEN
1147 ROLLBACK TO SAVEPOINT undelete_routing;
1148 x_return_status := FND_API.G_RET_STS_ERROR;
1149 fnd_msg_pub.count_and_get (
1150 p_count => x_message_count
1151 ,p_encoded => FND_API.g_false
1152 ,p_data => x_message_list);
1153 WHEN OTHERS THEN
1154 ROLLBACK TO SAVEPOINT undelete_routing;
1155 x_return_status := FND_API.g_ret_sts_unexp_error;
1156 fnd_msg_pub.add_exc_msg (gmd_routings_PUB.m_pkg_name, l_api_name);
1157 IF (l_debug = 'Y') THEN
1158 gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
1159 END IF;
1160 fnd_msg_pub.count_and_get (
1161 p_count => x_message_count
1162 ,p_encoded => FND_API.g_false
1163 ,p_data => x_message_list);
1164 END undelete_routing;
1165
1166
1167 END GMD_ROUTINGS_PUB;