DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_ROUTINGS_PUB

Source


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