DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_VALIDITY_RULES_PVT

Source


1 PACKAGE BODY GMD_VALIDITY_RULES_PVT AS
2 /* $Header: GMDVRVRB.pls 120.2.12010000.2 2008/11/12 18:10:31 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   # NAME
22   #    Determine_Product
23   # SYNOPSIS
24   #    Proc Determine_Product
25   # DESCRIPTION
26   #    This procedure validates if the item that is being modified
27   #    is a valid product or a co-product
28   # HISTORY
29   #####################################################*/
30   FUNCTION Determine_Product(pRecipe_id NUMBER, pItem_id NUMBER) RETURN BOOLEAN IS
31     CURSOR product_cur(vRecipe_id NUMBER, vItem_id NUMBER) IS
32       Select 1 from fm_matl_dtl fm
33       Where exists (Select 1
34                     From   gmd_recipes_b rc
35                     Where  fm.formula_id = rc.formula_id
36                     And    fm.line_type IN (1,2)
37                     And    fm.inventory_item_id = vItem_id -- NPD Conv.
38                     And    rc.recipe_id = vRecipe_id);
39     l_count NUMBER;
40   BEGIN
41 
42     OPEN  product_cur(pRecipe_id, pItem_id);
43     FETCH product_cur INTO l_count;
44       IF (product_cur%NOTFOUND) THEN
45         CLOSE product_cur;
46         Return FALSE;
47       END IF;
48     CLOSE product_cur;
49 
50     Return TRUE;
51   END;
52 
53   /*#####################################################
54   # NAME
55   #    validate_start_date
56   # SYNOPSIS
57   #    Proc validate_start_date
58   # DESCRIPTION
59   #    This procedure validates that start date is no earlier
60   #    than any routing start date.
61   # HISTORY
62   #####################################################*/
63   PROCEDURE validate_start_date (P_disp_start_date  Date,
64                                  P_routing_start_date Date,
65                                  x_return_status OUT NOCOPY VARCHAR2) IS
66     l_api_name  VARCHAR2(100) := 'validate_start_date' ;
67   BEGIN
68     x_return_status := 'S';
69 
70     IF P_disp_start_date < P_routing_start_date THEN
71        FND_MESSAGE.SET_NAME('GMD','GMD_VALIDITY_DATE_IN_ROUT_DATE');
72        FND_MSG_PUB.ADD;
73        x_return_status := 'E';
74     END IF;
75 
76   EXCEPTION
77     WHEN OTHERS THEN
78       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
79       x_return_status := FND_API.g_ret_sts_unexp_error;
80   END  validate_start_date;
81 
82   /*#####################################################
83   # NAME
84   #    validate_end_date
85   # SYNOPSIS
86   #    Proc validate_end_date
87   # DESCRIPTION
88   #    This procedure validates that end date is no later
89   #    than any routing end date.
90   #    Also validates date entered against sys max date.
91   # HISTORY
92   #####################################################*/
93   PROCEDURE validate_end_date (P_end_date  Date,
94                                P_routing_end_date Date,
95                                x_return_status OUT NOCOPY VARCHAR2) IS
96     l_api_name  VARCHAR2(100) := 'validate_end_date' ;
97   BEGIN
98     x_return_status := 'S';
99     IF (P_end_date IS NOT NULL) AND
100        (P_routing_end_date IS NOT NULL) AND
101        (P_end_date > P_routing_end_date) THEN
102        FND_MESSAGE.SET_NAME('GMD','GMD_VALIDITY_DATE_IN_ROUT_DATE');
103        FND_MSG_PUB.ADD;
104        x_return_status := 'E';
105     END IF;
106 
107     -- Routing end date is finite but Vr end date is infinite
108     IF (P_routing_end_date IS NOT NULL) AND
109        (P_end_date IS NULL) THEN
110        FND_MESSAGE.SET_NAME('GMD','GMD_VALIDITY_DATE_IN_ROUT_DATE');
111        FND_MSG_PUB.ADD;
112        x_return_status := 'E';
113     END IF;
114 
115   EXCEPTION
116     WHEN OTHERS THEN
117       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
118       x_return_status := FND_API.g_ret_sts_unexp_error;
119   END  validate_end_date;
120 
121 
122   /*#####################################################
123   # NAME
124   #    effective_dates
125   # SYNOPSIS
126   #    Proc effective_dates
127   # DESCRIPTION
128   #    Validates dates to be within proper ranges.
129   # HISTORY
130   #####################################################*/
131   PROCEDURE effective_dates ( P_start_date DATE,
132                               P_end_date DATE,
133                               x_return_status OUT NOCOPY VARCHAR2)   IS
134     l_api_name  VARCHAR2(100) := 'effective_dates' ;
135   BEGIN
136     x_return_status := 'S';
137 
138     IF (P_end_date IS NOT NULL AND P_start_date IS NOT NULL) THEN
139       IF (P_end_date < P_start_date) THEN
140         FND_MESSAGE.SET_NAME('GMD', 'QC_MIN_MAX_DATE');
141         FND_MSG_PUB.ADD;
142         x_return_status := 'E';
143       END IF;
144     END IF;
145   EXCEPTION
146     WHEN OTHERS THEN
147       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
148       x_return_status := FND_API.g_ret_sts_unexp_error;
149   END effective_dates;
150 
151 /*###################################################################
152   # NAME
153   #    std_qty
154   # SYNOPSIS
155   #    proc std_qty
156   #    Called from when-val-record trigger
157   # DESCRIPTION
158   #    Checks for std_qty is in between min_qty and max_qty
159   #    Std qty cannot be negative
160   #
161   ###################################################################*/
162   PROCEDURE std_qty(P_std_qty NUMBER,
163                     P_min_qty NUMBER,
164                     P_max_qty NUMBER,
165                     x_return_status OUT NOCOPY VARCHAR2) IS
166     l_api_name  VARCHAR2(100) := 'std_qty' ;
167   BEGIN
168     x_return_status := 'S';
169     IF P_std_qty IS NOT NULL THEN
170       IF (P_std_qty < P_min_qty
171           OR P_std_qty > P_max_qty)
172           OR P_std_qty <= 0  THEN
173         IF P_std_qty <= 0  THEN
174           FND_MESSAGE.SET_NAME('GMD','FM_INV_STD_QTY');
175           FND_MSG_PUB.ADD;
176           x_return_status := 'E';
177         ELSE
178           FND_MESSAGE.SET_NAME('GMD','FM_INV_STD_RANGE');
179           FND_MSG_PUB.ADD;
180           x_return_status := 'E';
181         END IF;  -- end if std qty is the problem, or the range
182       END IF;    -- end if std qty not within range
183     END IF;      -- end if std qty is not null
184   EXCEPTION
185     WHEN OTHERS THEN
186       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
187       x_return_status := FND_API.g_ret_sts_unexp_error;
188   END std_qty;
189 
190   /*#####################################################
191   # NAME
192   #    max_qty
193   # SYNOPSIS
194   #    proc max_qty
195   #    Called from when-val-record trigger
196   # DESCRIPTION
197   #    Checks for max_qty is greater than min_qty
198   #
199   #######################################################*/
200   PROCEDURE max_qty(P_min_qty NUMBER,
201                     P_max_qty NUMBER,
202                     x_return_status OUT NOCOPY VARCHAR2) IS
203     l_api_name  VARCHAR2(100) := 'max_qty' ;
204   BEGIN
205     x_return_status := 'S';
206     IF P_max_qty IS NOT NULL THEN
207       IF (P_max_qty < P_min_qty
208            OR P_min_qty < 0) THEN
209         IF P_min_qty < 0  THEN
210           FND_MESSAGE.SET_NAME('GMD','FM_INV_MIN_QTY');
211           FND_MSG_PUB.ADD;
212           x_return_status := 'E';
213         ELSE
214           FND_MESSAGE.SET_NAME('GMD','FM_INV_MIN_MAX');
215           FND_MSG_PUB.ADD;
216           x_return_status := 'E';
217         END IF;       -- end if qty is the problem, or the range
218       END IF;         -- IF (P_max_qty < P_min_qty
219     END IF;           -- IF P_max_qty IS NOT NULL
220   EXCEPTION
221     WHEN OTHERS THEN
222       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
223       x_return_status := FND_API.g_ret_sts_unexp_error;
224   END max_qty;
225 
226 
227   /*#####################################################
228   # NAME
229   #    calc_inv_qtys
230   # SYNOPSIS
231   #    proc calc_inv_qtys
232   #    Parms
233   # DESCRIPTION
234   #    Checks for item_uom with standard item UOM, if different
235   #    Converts the quantity from the initial UOM to the
236   #    final UOM.
237   #######################################################*/
238   PROCEDURE calc_inv_qtys (P_inv_item_um VARCHAR2,
239                            P_item_um     VARCHAR2,
240                            P_item_id     NUMBER,
241                            P_min_qty     NUMBER,
242                            P_max_qty     NUMBER,
243                            X_inv_min_qty OUT NOCOPY NUMBER,
244                            X_inv_max_qty OUT NOCOPY NUMBER,
245                            x_return_status OUT NOCOPY VARCHAR2
246                            ) IS
247     l_api_name  VARCHAR2(100) := 'calc_inv_qtys' ;
248   BEGIN
249     x_return_status := 'S';
250 
251     IF P_inv_item_um = P_item_um THEN
252       X_inv_min_qty := P_min_qty;
253       X_inv_max_qty := P_max_qty;
254     ELSE
255 
256      /*########################################################
257        # Stored Procedure call made here for the UOM conversion
258        # between two different UOM's
259        #########################################################*/
260 
261 
262       /* NPD Conv. Changed the call to INV_CONVERT.inv_um_convert from gmicuom.uom_conversion */
263 
264       X_inv_min_qty := INV_CONVERT.inv_um_convert( item_id       => P_item_id    ,
265                                                    precision	 => 5            ,
266                                                    from_quantity => P_min_qty    ,
267                                                    from_unit     => P_item_um    ,
268                                                    to_unit       => P_inv_item_um,
269                                                    from_name	 => NULL         ,
270                                                    to_name	 => NULL);
271 
272 
273 
274       X_inv_max_qty := INV_CONVERT.inv_um_convert( item_id       => P_item_id    ,
275                                                    precision	 => 5            ,
276                                                    from_quantity => P_max_qty    ,
277                                                    from_unit     => P_item_um    ,
278                                                    to_unit       => P_inv_item_um,
279                                                    from_name	 => NULL         ,
280                                                    to_name	 => NULL);
281 
282 
283     END IF;
284     X_inv_min_qty := ROUND(X_inv_min_qty,5);  --NPD Conv. Round upto 5 digits
285     X_inv_max_qty := ROUND(X_inv_max_qty,5);
286   EXCEPTION
287     WHEN OTHERS THEN
288       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
289       x_return_status := FND_API.g_ret_sts_unexp_error;
290   END calc_inv_qtys;
291 
292   /*#####################################################
293   # NAME
294   #    calculate_process_loss
295   # SYNOPSIS
296   #    Proc calculate_process_loss
297   # DESCRIPTION
298   #    derives theoretical and planned process loss
299   #####################################################*/
300   PROCEDURE calculate_process_loss( V_assign 	IN	NUMBER DEFAULT 1
301                                    ,P_vr_id   IN  NUMBER
302                                    ,X_TPL      OUT NOCOPY NUMBER
303                                    ,X_PPL      OUT NOCOPY NUMBER
304                                    ,x_return_status OUT NOCOPY VARCHAR2) IS
305 
306     process_loss_rec    GMD_COMMON_VAL.process_loss_rec;
307     l_process_loss      GMD_PROCESS_LOSS.process_loss%TYPE;
308     l_recipe_theo_loss  GMD_PROCESS_LOSS.process_loss%TYPE;
309     x_msg_cnt           NUMBER;
310     x_msg_dat           VARCHAR2(2000);
311 
312     l_std_qty           gmd_recipe_validity_rules.std_qty%TYPE;
313     l_detail_uom        gmd_recipe_validity_rules.detail_uom%TYPE;
314     l_item_id           gmd_recipe_validity_rules.inventory_item_id%TYPE;
315     l_orgn_code         gmd_recipe_validity_rules.orgn_code%TYPE;
316 
317     CURSOR get_other_vr_details(V_vr_id NUMBER) IS
318       SELECT std_qty, inventory_item_id, detail_uom, orgn_code
319       FROM   gmd_recipe_validity_rules
320       WHERE  recipe_validity_rule_id = V_vr_id;
321 
322     l_api_name  VARCHAR2(100) := 'calculate_process_loss' ;
323 
324   BEGIN
325     x_return_status := 'S';
326 
327     OPEN  get_other_vr_details(p_vr_id);
328     FETCH get_other_vr_details INTO l_std_qty, l_item_id, l_detail_uom, l_orgn_code;
329     CLOSE get_other_vr_details;
330 
331     process_loss_rec.validity_rule_id := p_vr_id;
332     process_loss_rec.qty := l_std_qty;
333     process_loss_rec.uom := l_detail_uom;
334     process_loss_rec.orgn_code := l_orgn_code;
335     process_loss_rec.item_id := l_item_id;
336 
337     gmd_common_val.calculate_process_loss(process_loss       => process_loss_rec,
338 					  Entity_type        => 'VALIDITY',
339 					  x_recipe_theo_loss => X_TPL,
340                                           x_process_loss     => X_PPL,
341                                           x_return_status    => x_return_status,
342                                           x_msg_count        => X_msg_cnt,
343                                           x_msg_data         => X_msg_dat);
344 
345     X_TPL := TRUNC(X_TPL,2);
346     X_PPL := TRUNC(X_PPL,2);
347 
348     IF (V_assign = 1) THEN
349       IF X_PPL IS NULL THEN
350         X_PPL := X_TPL;
351       END IF;
352     END IF;
353   EXCEPTION
354     WHEN OTHERS THEN
355       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
356       x_return_status := FND_API.g_ret_sts_unexp_error;
357   END calculate_process_loss;
358 
359   /*#####################################################
360   # NAME
361   #    check_for_duplicate
362   # SYNOPSIS
363   #    Proc check_for_duplicate
364   #    Parms
365   # DESCRIPTION
366   #    check duplication of record
367   #
368   # Bug 4134275 18-NOV-2005 Added one more parameter p_recipe_validity_rule_id
369   #                         This is used as the duplicate check should check that the updated record is not going
370   #                         to create a duplicate record, i.e. the same details should not match any
371   #                         other record(corresponding to p_recipe_validity_rule_id other than this one)
372   #####################################################*/
373   PROCEDURE check_for_duplicate(p_recipe_validity_rule_id NUMBER        -- 4134275 Added the validity_rule_id condition for duplicate check
374                                ,pRecipe_id NUMBER
375                                ,pitem_id NUMBER
376                                ,pOrgn_code VARCHAR2 DEFAULT NULL
377                                -- NPD Conv.
378                                ,pOrganization_id NUMBER
379                                ,pRecipe_Use NUMBER
380                                ,pPreference NUMBER
381                                ,pstd_qty NUMBER
382                                ,pmin_qty NUMBER
383                                ,pmax_qty NUMBER
384                                ,pinv_max_qty NUMBER
385                                ,pinv_min_qty NUMBER
386                                ,pitem_um VARCHAR2
387                                ,pValidity_Rule_Status  VARCHAR2
388                                ,pstart_date DATE
389                                ,pend_date DATE DEFAULT NULL
390                                ,pPlanned_process_loss NUMBER DEFAULT NULL
391                                ,x_return_status OUT NOCOPY VARCHAR2
392                                ) IS
393 
394  CURSOR Cur_check_dup_upd IS
395       SELECT recipe_validity_rule_id
396       FROM   gmd_recipe_validity_rules
397       WHERE  recipe_id         = pRecipe_id
398        AND inventory_item_id       = pitem_id -- NPD Conv.
399        AND ((orgn_code   = pOrgn_code)  OR
400            (orgn_code IS NULL AND pOrgn_code IS NULL))
401        -- NPD Conv.
402        AND ((organization_id   = pOrganization_id)  OR
403            (organization_id IS NULL AND pOrganization_id IS NULL))
404        AND recipe_use    = pRecipe_Use
405        AND preference    = pPreference
406        AND std_qty       = pstd_qty
407        AND min_qty       = pmin_qty
408        AND max_qty       = pmax_qty
409        AND inv_max_qty   = pinv_max_qty
410        AND inv_min_qty   = pinv_min_qty
411        AND detail_uom    = pitem_um
412 
413        AND validity_rule_status  = pValidity_Rule_status
414        AND ((pPlanned_process_loss IS NULL AND Planned_process_loss IS NULL) OR
415             (planned_process_loss = pPlanned_process_loss))
416        AND start_date = pstart_date
417        AND ((end_date  = pend_date)  OR (end_date is NULL and pend_date is NULL))
418        AND  recipe_validity_rule_id <> p_recipe_validity_rule_id;
419 
420     l_api_name  VARCHAR2(100) := 'check_for_duplicate' ;
421   BEGIN
422     x_return_status := 'S';
423     FOR VR_dup_rec IN Cur_check_dup_upd LOOP
424       IF (l_debug = 'Y') THEN
425         gmd_debug.put_line(m_pkg_name||'.'||l_api_name
426                         ||': Duplicate VR id  = '||VR_dup_rec.recipe_validity_rule_id);
427 
428       END IF;
429       FND_MESSAGE.SET_NAME('GMD','GMD_DUP_VR_EXIST');
430       FND_MSG_PUB.ADD;
431       x_return_status := 'E';
432     END LOOP;
433   EXCEPTION
434     WHEN OTHERS THEN
435       fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
436       x_return_status := FND_API.g_ret_sts_unexp_error;
437   END check_for_duplicate;
438 
439 
440  /* =============================================================== */
441   /* Procedure:                                                      */
442   /*   update_validity_rules                                         */
443   /*                                                                 */
444   /* DESCRIPTION:                                                    */
445   /*                                                                 */
446   /*                                                                 */
447   /* History :                                                       */
448   /* Shyam   07/29/2002   Initial implementation                     */
449   /* Kapil M 18-NOV-2005   Bug # 4134275                             */
450   /*         Changed the call from fnd_date.CHARDATE_TO_DATE to      */
451   /*         fnd_date.CANONICAL_TO_DATE
452   /* =============================================================== */
453   PROCEDURE update_validity_rules
454   ( p_validity_rule_id	IN	    gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE
455   , p_update_table	IN	    gmd_validity_rules_pvt.update_tbl_type
456   , x_message_count 	OUT NOCOPY  NUMBER
457   , x_message_list 	OUT NOCOPY  VARCHAR2
458   , x_return_status	OUT NOCOPY  VARCHAR2
459   ) IS
460 
461   /* Local variable section */
462   l_api_name              CONSTANT VARCHAR2(30) := 'UPDATE_VALIDITY_RULES';
463   l_db_date               DATE;
464   l_inv_item_um           mtl_units_of_measure.uom_code%TYPE; -- NPD Conv.
465   l_tpl                   NUMBER;
466   l_fixed_scale           NUMBER;
467 
468   -- NPD Conv. Added the following local var's
469   l_formula_id            NUMBER;
470   l_recp_use              NUMBER;
471 
472   /* Define record type that hold the routing data */
473   l_old_vr_rec              gmd_recipe_validity_rules%ROWTYPE;
474 
475   /* Define Exceptions */
476   VR_update_failure                EXCEPTION;
477   last_update_date_failure         EXCEPTION;
478   invalid_version                  EXCEPTION;
479   setup_failure                    EXCEPTION;
480 
481   /* Define cursor section */
482   CURSOR get_old_vr_rec(vValidity_rule_id
483                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
484      Select *
485      From   gmd_recipe_validity_rules
486      Where  recipe_validity_rule_id = vValidity_rule_id;
487 
488   CURSOR Get_db_last_update_date(vValidity_rule_id
489                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
490      Select last_update_date
491      From   gmd_recipe_validity_rules
492      Where  recipe_validity_rule_id = vValidity_rule_id;
493 
494   CURSOR Get_Routing_Details(vValidity_rule_id
495                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
496     Select rt.Effective_Start_Date,
497            rt.Effective_End_Date
498     From   gmd_routings_b rt, gmd_recipes_b rc,
499            gmd_recipe_validity_rules vr
500     Where  vr.recipe_id = rc.recipe_id AND
501            rc.routing_id = rt.routing_id AND
502            vr.recipe_validity_rule_id = vValidity_rule_id AND
503            rt.delete_mark = 0;
504 
505    CURSOR check_fmdtl_fixed_scale(vRecipe_id gmd_recipes_b.recipe_id%TYPE
506                                  ,vItem_id   ic_item_mst_b.item_id%TYPE)  IS
507      SELECT 1
508      FROM   sys.dual
509      WHERE  EXISTS (Select d.formula_id
510                     From  fm_matl_dtl d, gmd_recipes_b r
511                     WHERE r.formula_id = d.formula_id AND
512                           r.recipe_id  = vRecipe_id AND
513                           d.line_type = 1 AND
514                           d.inventory_item_id   = vItem_id AND  -- NPD Conv.
515                           d.scale_type = 0);
516 
517    CURSOR check_fmhdr_fixed_scale(vRecipe_id gmd_recipes_b.recipe_id%TYPE)  IS
518      SELECT 1
519      FROM   sys.dual
520      WHERE  EXISTS (Select h.formula_id
521                     From  fm_form_mst h, gmd_recipes_b r
522                     WHERE r.formula_id = h.formula_id AND
523                           r.recipe_id  = vRecipe_id AND
524                           h.scale_type = 0);
525 
526    -- Cursor to fetch recipe use and formula id of the VR
527    CURSOR get_recp_dets IS
528      SELECT r.formula_id, v.recipe_use
529      FROM   gmd_recipes_b r, gmd_recipe_validity_rules v
530      WHERE  v.recipe_validity_rule_id = p_validity_rule_id
531      AND    v.recipe_id = r.recipe_id;
532 
533   BEGIN
534     /* Intialize the setup fields */
535 
536     IF NOT gmd_api_grp.setup_done THEN
537       gmd_api_grp.setup_done := gmd_api_grp.setup;
538     END IF;
539 
540     IF NOT gmd_api_grp.setup_done THEN
541       RAISE setup_failure;
542     END IF;
543 
544     /* Set the return status to success initially */
545     x_return_status := FND_API.G_RET_STS_SUCCESS;
546 
547     IF (l_debug = 'Y') THEN
548       gmd_debug.put_line(m_pkg_name||'.'||l_api_name
549       ||' : About to get the db VR record for VR id = '
550       ||p_validity_rule_id);
551     END IF;
552 
553     /* Get the old routing rec value */
554     OPEN  get_old_vr_rec(p_validity_rule_id);
555     FETCH get_old_vr_rec INTO l_old_vr_rec;
556       IF get_old_vr_rec%NOTFOUND THEN
557         FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_INVALID');
558         FND_MSG_PUB.ADD;
559         CLOSE get_old_vr_rec;
560         RAISE vr_update_failure;
561       END IF;
562     CLOSE get_old_vr_rec;
563 
564     /* Loop thro' every column in p_update_table table and for each column name
565        assign or replace the old value with the table value */
566     FOR i IN 1 .. p_update_table.count  LOOP
567 
568        IF (l_debug = 'Y') THEN
569          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||' : The column to be updated = '
570                            ||p_update_table(i).p_col_to_update||' and value = '
571                            ||p_update_table(i).p_value);
572        END IF;
573 
574       -- IF (UPPER(p_update_table(i).p_col_to_update) = 'RECIPE_ID') THEN
575       --     l_old_vr_rec.RECIPE_ID := p_update_table(i).p_value;
576       -- ELSE
577 
578        IF (UPPER(p_update_table(i).p_col_to_update) = 'ORGN_CODE') THEN
579            l_old_vr_rec.ORGN_CODE := p_update_table(i).p_value;
580        -- NPD Conv.
581        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ORGANIZATION_ID') THEN
582 	   l_old_vr_rec.ORGANIZATION_ID  := p_update_table(i).p_value;
583        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'INVENTORY_ITEM_ID') THEN
584            l_old_vr_rec.INVENTORY_ITEM_ID := p_update_table(i).p_value;
585        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'REVISION') THEN
586            l_old_vr_rec.REVISION := p_update_table(i).p_value;
587        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'DETAIL_UOM') THEN
588            l_old_vr_rec.DETAIL_UOM := p_update_table(i).p_value;
589        -- End NPD Conv.
590        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'TEXT_CODE') THEN
591            l_old_vr_rec.TEXT_CODE := p_update_table(i).p_value;
592        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'RECIPE_USE') THEN
593            l_old_vr_rec.RECIPE_USE := p_update_table(i).p_value;
594        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'PREFERENCE') THEN
595            l_old_vr_rec.PREFERENCE := p_update_table(i).p_value;
596        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'START_DATE') THEN
597            IF (l_debug = 'Y') THEN
598               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||
599               ' : Before conversion of Start date - '||
600               ' CharDT to Date Format ');
601            END IF;
602            l_old_vr_rec.START_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
603            IF (l_debug = 'Y') THEN
604               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
605                                  ||' : After conversion of CharDT to Date '||
606                                  ' Start Date = '||l_old_vr_rec.START_DATE);
607            END IF;
608        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'END_DATE') THEN
609            IF (l_debug = 'Y') THEN
610               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
611                        ||' : Before conversion of end date - '
612                        ||' CharDT to Date Format '||p_update_table(i).p_value);
613            END IF;
614            l_old_vr_rec.END_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
615            IF (l_debug = 'Y') THEN
616               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
617                        ||' : After conversion of CharDT to Date '||
618                          ' End Date = '||l_old_vr_rec.END_DATE);
619            END IF;
620 
621        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'PLANNED_PROCESS_LOSS') THEN
622            l_old_vr_rec.PLANNED_PROCESS_LOSS := p_update_table(i).p_value;
623 --RLNAGARA start B6997624 Added code to update Fixed Process Loss and UOM
624        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'FIXED_PROCESS_LOSS') THEN
625            l_old_vr_rec.FIXED_PROCESS_LOSS := p_update_table(i).p_value;
626        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'FIXED_PROCESS_LOSS_UOM') THEN
627            l_old_vr_rec.FIXED_PROCESS_LOSS_UOM := p_update_table(i).p_value;
628 --RLNAGARA end B6997624
629        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'STD_QTY') THEN
630            l_old_vr_rec.STD_QTY := p_update_table(i).p_value;
631        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'MIN_QTY') THEN
632            l_old_vr_rec.MIN_QTY := p_update_table(i).p_value;
633        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'MAX_QTY') THEN
634            l_old_vr_rec.MAX_QTY := p_update_table(i).p_value;
635        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'DELETE_MARK') THEN
636            l_old_vr_rec.DELETE_MARK := p_update_table(i).p_value;
637            -- Bug #4134275 Kapil M
638        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATED_BY') THEN
639            l_old_vr_rec.LAST_UPDATED_BY := NVL(p_update_table(i).p_value, fnd_global.user_id);
640        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATE_DATE') THEN
641            l_old_vr_rec.LAST_UPDATE_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
642        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATE_LOGIN') THEN
643            l_old_vr_rec.LAST_UPDATE_LOGIN := NVL(p_update_table(i).p_value,gmd_api_grp.login_id);
644        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE1') THEN
645            l_old_vr_rec.ATTRIBUTE1 := p_update_table(i).p_value;
646        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE2') THEN
647            l_old_vr_rec.ATTRIBUTE2 := p_update_table(i).p_value;
648        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE3') THEN
649            l_old_vr_rec.ATTRIBUTE3 := p_update_table(i).p_value;
650        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE4') THEN
651            l_old_vr_rec.ATTRIBUTE4 := p_update_table(i).p_value;
652        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE5') THEN
653            l_old_vr_rec.ATTRIBUTE5 := p_update_table(i).p_value;
654        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE6') THEN
655            l_old_vr_rec.ATTRIBUTE6 := p_update_table(i).p_value;
656        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE7') THEN
657            l_old_vr_rec.ATTRIBUTE7 := p_update_table(i).p_value;
658        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE8') THEN
659            l_old_vr_rec.ATTRIBUTE8 := p_update_table(i).p_value;
660        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE9') THEN
661            l_old_vr_rec.ATTRIBUTE9 := p_update_table(i).p_value;
662        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE10') THEN
663            l_old_vr_rec.ATTRIBUTE10 := p_update_table(i).p_value;
664        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE11') THEN
665            l_old_vr_rec.ATTRIBUTE11 := p_update_table(i).p_value;
666        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE12') THEN
667            l_old_vr_rec.ATTRIBUTE12 := p_update_table(i).p_value;
668        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE13') THEN
669            l_old_vr_rec.ATTRIBUTE13 := p_update_table(i).p_value;
670        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE14') THEN
671            l_old_vr_rec.ATTRIBUTE14 := p_update_table(i).p_value;
672        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE15') THEN
673            l_old_vr_rec.ATTRIBUTE15 := p_update_table(i).p_value;
674        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE16') THEN
675            l_old_vr_rec.ATTRIBUTE16 := p_update_table(i).p_value;
676        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE17') THEN
677            l_old_vr_rec.ATTRIBUTE17 := p_update_table(i).p_value;
678        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE18') THEN
679            l_old_vr_rec.ATTRIBUTE18 := p_update_table(i).p_value;
680        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE19') THEN
681            l_old_vr_rec.ATTRIBUTE19 := p_update_table(i).p_value;
682        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE20') THEN
683            l_old_vr_rec.ATTRIBUTE20 := p_update_table(i).p_value;
684        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE21') THEN
685            l_old_vr_rec.ATTRIBUTE21 := p_update_table(i).p_value;
686        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE22') THEN
687            l_old_vr_rec.ATTRIBUTE22 := p_update_table(i).p_value;
688        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE23') THEN
689            l_old_vr_rec.ATTRIBUTE23 := p_update_table(i).p_value;
690        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE24') THEN
691            l_old_vr_rec.ATTRIBUTE24 := p_update_table(i).p_value;
692        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE25') THEN
693            l_old_vr_rec.ATTRIBUTE25 := p_update_table(i).p_value;
694        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE26') THEN
695            l_old_vr_rec.ATTRIBUTE26 := p_update_table(i).p_value;
696        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE27') THEN
697            l_old_vr_rec.ATTRIBUTE27 := p_update_table(i).p_value;
698        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE28') THEN
699            l_old_vr_rec.ATTRIBUTE28 := p_update_table(i).p_value;
700        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE29') THEN
701            l_old_vr_rec.ATTRIBUTE29 := p_update_table(i).p_value;
702        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE30') THEN
703            l_old_vr_rec.ATTRIBUTE30 := p_update_table(i).p_value;
704        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE_CATEGORY') THEN
705            l_old_vr_rec.ATTRIBUTE_CATEGORY := p_update_table(i).p_value;
706        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'VALIDITY_RULE_STATUS') THEN
707          -- Users should be prompted to use change status API
708          -- Since Change Status API commits work it cannot be
709          -- called from here directly
710          FND_MESSAGE.set_name('GMD','GMD_NOT_USE_API_UPD_STATUS');
711          FND_MSG_PUB.ADD;
712          RAISE vr_update_failure;
713        END IF;
714 
715        IF (l_debug = 'Y') THEN
716          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': '||
717                             'Assigned all values - Now performing indv validations ');
718        END IF;
719 
720        /* Chcek if update is allowed */
721        IF NOT GMD_COMMON_VAL.update_allowed('VALIDITY'
722                                              ,p_Validity_rule_id
723                                              ,UPPER(p_update_table(i).p_col_to_update) ) THEN
724          FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_CANNOT_UPD');
725          FND_MSG_PUB.ADD;
726          RAISE vr_update_failure;
727        END IF;
728 
729        /* Compare Dates - if the last update date passed in via the API is less than
730           the last update in the db - it indicates someelse has updated this row after this
731           row was selected */
732        IF (l_debug = 'Y') THEN
733          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 1 '||
734                             'Comparing last updates to check if there any locking issues ');
735        END IF;
736 
737        OPEN  Get_db_last_update_date(p_Validity_rule_id);
738        FETCH Get_db_last_update_date INTO l_db_date;
739          IF Get_db_last_update_date%NOTFOUND THEN
740             CLOSE Get_db_last_update_date;
741             RAISE vr_update_failure;
742          END IF;
743        CLOSE Get_db_last_update_date;
744 
745        -- Validation are done here
746        -- it might have to moved to a PUB layer !!!!
747        IF l_old_vr_rec.LAST_UPDATE_DATE < l_db_date THEN
748        	  RAISE last_update_date_failure;
749        END IF;
750 
751        IF (l_debug = 'Y') THEN
752          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2 '||
753                             'Start and End Date validation '||l_old_vr_rec.start_date||
754                             ' - '||l_old_vr_rec.end_date);
755        END IF;
756 
757        -- Check if the item being modified is either a product or a by-product
758        IF (UPPER(p_update_table(i).p_col_to_update) = 'ITEM_ID') THEN
759           IF NOT Determine_Product(l_old_vr_rec.RECIPE_ID, l_old_vr_rec.INVENTORY_ITEM_ID) THEN -- NPD Conv.
760              FND_MESSAGE.SET_NAME('GMD', 'GMD_ITEM_IS_PRODUCT');
761              FND_MSG_PUB.ADD;
762              x_return_status := 'E';
763              RAISE vr_update_failure;
764           END IF;
765        END IF;
766 
767        -- Validity rule date validation with routing dates
768        IF (UPPER(p_update_table(i).p_col_to_update) IN ('START_DATE','END_DATE')) THEN
769 
770          -- Validity rule start and end date validation
771          IF (l_debug = 'Y') THEN
772             gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2c '||
773                           'Checking if end date ( '||l_old_vr_rec.end_date||' ) '||
774                           ' > '||' start date ( '||l_old_vr_rec.start_date||' ) ');
775          END IF;
776          -- Comparing Vr start and End dates
777          effective_dates ( P_start_date => l_old_vr_rec.start_date,
778                            P_end_date => l_old_vr_rec.end_date,
779                            x_return_status => x_return_status);
780 
781          IF (x_return_status <> 'S') THEN
782            RAISE vr_update_failure;
783          END IF;
784 
785          -- Comparing Vr dates with Routing Dates
786          IF (l_debug = 'Y') THEN
787               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2a0 '||
788                             'Comparing Vr dates with Routing Dates ');
789          END IF;
790 
791          FOR get_routing_rec in Get_Routing_Details(p_validity_rule_id) LOOP
792            -- Get the routing start date if applicable
793            IF (l_debug = 'Y') THEN
794              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
795                                 ||': The vr start date = '||l_old_vr_rec.start_date
796                                 ||' rout start date = '||get_routing_rec.effective_start_date);
797              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
798                                 ||': The Vr end date = '||l_old_vr_rec.end_date
799                                 ||' rout end date = '||get_routing_rec.effective_end_date);
800            END IF;
801 
802            IF (l_debug = 'Y') THEN
803               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2a '||
804                             'Checking if VR start date > Routing start date ');
805            END IF;
806 
807            validate_start_date (P_disp_start_date  => l_old_vr_rec.start_date,
808                                 P_routing_start_date => get_routing_rec.effective_start_date,
809                                 x_return_status => x_return_status);
810            IF (x_return_status <> 'S') THEN
811              RAISE vr_update_failure;
812            END IF;
813 
814            -- Get the routing start date if applicable
815            IF (l_debug = 'Y') THEN
816               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2b '||
817                             'Chceking if VR end date < Routing end date ');
818            END IF;
819            validate_end_date (P_end_date  => l_old_vr_rec.end_date,
820                               P_routing_end_date => get_routing_rec.effective_end_date,
821                               x_return_status => x_return_status);
822 
823            IF (x_return_status <> 'S') THEN
824              RAISE vr_update_failure;
825            END IF;
826          END LOOP;
827 
828        END IF; -- When start or end dates are updated
829 
830        IF (l_debug = 'Y') THEN
831            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '
832                       ||' : About to validate std qty '
833                       ||'The min qty <  max qty <  std qty = '
834                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
835                       ||' - '||l_old_vr_rec.std_qty);
836          END IF;
837 
838        -- Min, MAx and Std qty validation
839        IF (UPPER(p_update_table(i).p_col_to_update)
840                                   IN ('STD_QTY','MIN_QTY','MAX_QTY')) THEN
841          -- Check if scale type at formula header is fixed, if yes then
842          -- the qty's fields cannot be updated
843          IF (l_debug = 'Y') THEN
844            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
845                             'Checking if formula hdr is fixed scaled ');
846          END IF;
847 
848          OPEN check_fmhdr_fixed_scale(l_old_vr_rec.Recipe_id);
849          FETCH check_fmhdr_fixed_scale INTO l_fixed_scale;
850          CLOSE check_fmhdr_fixed_scale;
851 
852          IF (l_fixed_scale = 1) THEN
853            FND_MESSAGE.SET_NAME('GMD', 'GMD_FXD_HDR_FOR_VR');
854            FND_MSG_PUB.ADD;
855            RAISE vr_update_failure;
856          END IF;
857 
858          -- Check if scale type at formula dtl for the VR product is fixed, if yes then
859          -- the qty's fields cannot be updated
860          IF (l_debug = 'Y') THEN
861            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
862                             'Checking if formula dtl is fixed scaled ');
863          END IF;
864 
865          OPEN check_fmdtl_fixed_scale(l_old_vr_rec.Recipe_id, l_old_vr_rec.inventory_item_id); -- NPD Conv.
866          FETCH check_fmdtl_fixed_scale INTO l_fixed_scale;
867          CLOSE check_fmdtl_fixed_scale;
868 
869          IF (l_fixed_scale = 1) THEN
870            FND_MESSAGE.SET_NAME('GMD', 'GMD_FXD_HDR_FOR_VR');
871            FND_MSG_PUB.ADD;
872            RAISE vr_update_failure;
873          END IF;
874        END IF;
875 -- Bug 5024092 KapilM
876 -- Moved the stnd qty and min max qty check out of this loop.
877        -- The inv_min and max qty changes only ifthe min or max_qty value is changed
878        IF (UPPER(p_update_table(i).p_col_to_update) IN ('MIN_QTY','MAX_QTY')) THEN
879          SELECT UNIQUE primary_uom_code
880          INTO   l_inv_item_um
881          FROM   mtl_system_items
882          WHERE  inventory_item_id = l_old_vr_rec.inventory_item_id;
883 
884          IF (l_debug = 'Y') THEN
885              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
886                       ||': Val 4: About to calc inv min/max qty '
887                       ||'The min qty, max qty  = '
888                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty);
889          END IF;
890 
891          calc_inv_qtys (P_inv_item_um   => l_inv_item_um,
892                         P_item_um       => l_old_vr_rec.detail_uom,
893                         P_item_id       => l_old_vr_rec.inventory_item_id,
894                         P_min_qty       => l_old_vr_rec.min_qty,
895                         P_max_qty       => l_old_vr_rec.max_qty,
896                         X_inv_min_qty   => l_old_vr_rec.inv_min_qty,
897                         X_inv_max_qty   => l_old_vr_rec.inv_max_qty,
898                         x_return_status => x_return_status);
899 
900          IF (x_return_status <> 'S') THEN
901            RAISE vr_update_failure;
902          END IF;
903        END IF;
904 
905        IF (l_debug = 'Y') THEN
906           gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to calc process loss '
907                       ||'The min qty, max qty and std qty = '
908                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
909                       ||' - '||l_old_vr_rec.std_qty);
910        END IF;
911 
912        IF ((UPPER(p_update_table(i).p_col_to_update) = 'STD_QTY') AND
913           (UPPER(p_update_table(i).p_col_to_update) <> 'PLANNED_PROCESS_LOSS')) THEN
914          calculate_process_loss( V_assign 	=> 1
915                                 ,P_vr_id    => p_validity_rule_id
916                                 ,X_TPL      => l_tpl
917                                 ,X_PPL      => l_old_vr_rec.planned_process_loss
918                                 ,x_return_status => x_return_status);
919          IF (x_return_status <> 'S') THEN
920            --Ignore this error, its ok to update VR without Process loss
921            x_return_status := 'S';
922            --RAISE vr_update_failure;
923          END IF;
924        END IF;
925 
926        IF (l_debug = 'Y') THEN
927          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to check for duplicates ');
928        END IF;
929 
930        IF (l_debug = 'Y') THEN
931           gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 6: About to check for duplicates '
932                       ||'The min qty, max qty and std qty = '
933                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
934                       ||' - '||l_old_vr_rec.std_qty);
935        END IF;
936 
937        -- Check for duplicate VR
938        -- bug 4134275
939        check_for_duplicate (    p_recipe_validity_rule_id => p_validity_rule_id
940                                ,pRecipe_id              => l_old_vr_rec.recipe_id
941                                ,pitem_id                => l_old_vr_rec.inventory_item_id
942                                ,pOrgn_code              => l_old_vr_rec.orgn_code
943                                -- NPD Conv.
944                                ,pOrganization_id        => l_old_vr_rec.organization_id
945                                ,pRecipe_Use             => l_old_vr_rec.recipe_use
946                                ,pPreference             => l_old_vr_rec.preference
947                                ,pstd_qty                => l_old_vr_rec.std_qty
948                                ,pmin_qty                => l_old_vr_rec.min_qty
949                                ,pmax_qty                => l_old_vr_rec.max_qty
950                                ,pinv_max_qty            => l_old_vr_rec.inv_max_qty
951                                ,pinv_min_qty            => l_old_vr_rec.inv_min_qty
952                                ,pitem_um                => l_old_vr_rec.detail_uom
953                                ,pValidity_Rule_status   => l_old_vr_rec.validity_rule_status
954                                ,pstart_date             => l_old_vr_rec.start_date
955                                ,pend_date               => l_old_vr_rec.end_date
956                                ,pplanned_process_loss   => l_old_vr_rec.planned_process_loss
957                                ,x_return_status         => x_return_status
958                                );
959 
960        IF (x_return_status <> 'S') THEN
961          RAISE vr_update_failure;
962        END IF;
963 
964        IF (l_debug = 'Y') THEN
965          gmd_debug.put_line(m_pkg_name||'.'||l_api_name
966                       ||': Before Final update : About to Update Val Rules '
967                       ||'The min qty, max qty and std qty = '
968                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
969                       ||' - '||l_old_vr_rec.std_qty);
970        END IF;
971 
972        -- NPD Conv.
973        /* Check if for the updated organization - formula items remain valid */
974        IF (UPPER(p_update_table(i).p_col_to_update) IN ('ORGN_CODE','ORGANIZATION_ID')) THEN
975 
976        -- Get the formula_id and recipe_use for the VR
977        OPEN get_recp_dets;
978        FETCH get_recp_dets INTO l_formula_id, l_recp_use;
979        CLOSE get_recp_dets;
980        -- If recipe_use is for production ( =0), pass production flag as TRUE to check_item_exists
981        IF (NVL(l_recp_use,0) = 0) THEN
982                GMD_API_GRP.check_item_exists (p_formula_id 	 => l_formula_id,
983 	                                      x_return_status 	 => x_return_status,
984 	                                      p_organization_id  => l_old_vr_rec.organization_id,
985 	                                      p_orgn_code 	 => l_old_vr_rec.orgn_code,
986 	                                      p_production_check => TRUE);
987 
988        ELSE
989                GMD_API_GRP.check_item_exists (p_formula_id 	 => l_formula_id,
990                	                              x_return_status 	 => x_return_status,
991 	                                      p_organization_id  => l_old_vr_rec.organization_id,
992 	                                      p_orgn_code 	 => l_old_vr_rec.orgn_code,
993 	                                      p_production_check => FALSE);
994 
995        END IF;
996 
997        IF (x_return_status <> 'S') THEN
998            RAISE vr_update_failure;
999        END IF;
1000 
1001        END IF;
1002     END LOOP;
1003 
1004 -- Bug 5024092 Kapil M
1005 -- Moved the stnd qty and min max qty check out of above loop.
1006          IF (l_debug = 'Y') THEN
1007            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
1008                             'Checking if min qty < std qty < max qty ');
1009          END IF;
1010          -- Checks if std_qty is between min and max qty
1011 
1012 
1013          std_qty(P_std_qty => l_old_vr_rec.std_qty,
1014                  P_min_qty => l_old_vr_rec.min_qty,
1015                  P_max_qty => l_old_vr_rec.max_qty,
1016                  x_return_status => x_return_status);
1017 
1018          IF (x_return_status <> 'S') THEN
1019            RAISE vr_update_failure;
1020          END IF;
1021 
1022          IF (l_debug = 'Y') THEN
1023              gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to validate max qty '
1024                       ||'The min qty, max qty  = '
1025                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty);
1026          END IF;
1027 
1028          -- Min, Max qty validation
1029          max_qty(P_min_qty => l_old_vr_rec.min_qty,
1030                  P_max_qty => l_old_vr_rec.max_qty,
1031                  x_return_status => x_return_status);
1032 
1033          IF (x_return_status <> 'S') THEN
1034            RAISE vr_update_failure;
1035          END IF;
1036 
1037        /* Number of times this routine is equal to number of rows in the p_update_table */
1038        UPDATE  GMD_RECIPE_VALIDITY_RULES
1039        SET
1040            recipe_id            = l_old_vr_rec.recipe_id
1041          , orgn_code            = l_old_vr_rec.orgn_code
1042          -- NPD Conv.
1043          , organization_id      = l_old_vr_rec.organization_id
1044          , inventory_item_id    = l_old_vr_rec.inventory_item_id
1045          , revision             = l_old_vr_rec.revision
1046          , detail_uom           = l_old_vr_rec.detail_uom
1047          -- End NPD Conv.
1048          , recipe_use           = l_old_vr_rec.recipe_use
1049          , preference           = l_old_vr_rec.preference
1050          , start_date           = l_old_vr_rec.start_date
1051          , end_date             = l_old_vr_rec.end_date
1052          , min_qty              = l_old_vr_rec.min_qty
1053          , max_qty              = l_old_vr_rec.max_qty
1054          , std_qty              = l_old_vr_rec.std_qty
1055          , inv_min_qty          = l_old_vr_rec.inv_min_qty
1056          , inv_max_qty          = l_old_vr_rec.inv_max_qty
1057          , text_code            = l_old_vr_rec.text_code
1058          , attribute_category   = l_old_vr_rec.attribute_category
1059          , attribute1           = l_old_vr_rec.attribute1
1060          , attribute2           = l_old_vr_rec.attribute2
1061          , attribute3           = l_old_vr_rec.attribute3
1062          , attribute4           = l_old_vr_rec.attribute4
1063          , attribute5           = l_old_vr_rec.attribute5
1064          , attribute6           = l_old_vr_rec.attribute6
1065          , attribute7           = l_old_vr_rec.attribute7
1066          , attribute8           = l_old_vr_rec.attribute8
1067          , attribute9           = l_old_vr_rec.attribute9
1068          , attribute10          = l_old_vr_rec.attribute10
1069          , attribute11          = l_old_vr_rec.attribute11
1070          , attribute12          = l_old_vr_rec.attribute12
1071          , attribute13          = l_old_vr_rec.attribute13
1072          , attribute14          = l_old_vr_rec.attribute14
1073          , attribute15          = l_old_vr_rec.attribute15
1074          , attribute16          = l_old_vr_rec.attribute16
1075          , attribute17          = l_old_vr_rec.attribute17
1076          , attribute18          = l_old_vr_rec.attribute18
1077          , attribute19          = l_old_vr_rec.attribute19
1078          , attribute20          = l_old_vr_rec.attribute20
1079          , attribute21          = l_old_vr_rec.attribute21
1080          , attribute23          = l_old_vr_rec.attribute23
1081          , attribute22          = l_old_vr_rec.attribute22
1082          , attribute24          = l_old_vr_rec.attribute24
1083          , attribute25          = l_old_vr_rec.attribute25
1084          , attribute26          = l_old_vr_rec.attribute26
1085          , attribute27          = l_old_vr_rec.attribute27
1086          , attribute28          = l_old_vr_rec.attribute28
1087          , attribute29          = l_old_vr_rec.attribute29
1088          , attribute30          = l_old_vr_rec.attribute30
1089          , created_by           = l_old_vr_rec.created_by
1090          , creation_date        = l_old_vr_rec.creation_date
1091          , last_updated_by      = l_old_vr_rec.last_updated_by
1092          , last_update_date     = l_old_vr_rec.last_update_date
1093          , last_update_login    = l_old_vr_rec.last_update_login
1094          , delete_mark          = l_old_vr_rec.delete_mark
1095          , validity_rule_status = l_old_vr_rec.validity_rule_status
1096          , lab_type             = l_old_vr_rec.lab_type
1097          , planned_process_loss = l_old_vr_rec.planned_process_loss
1098 	 , fixed_process_loss   = l_old_vr_rec.fixed_process_loss           /* RLNAGARA   Bug6997624 */
1099 	 , fixed_process_loss_uom = l_old_vr_rec.fixed_process_loss_uom     /* RLNAGARA   Bug6997624 */
1100        where recipe_validity_rule_id = p_validity_rule_id;
1101 
1102        IF (sql%notfound) THEN
1103           FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_UPD_NO_ACCESS');
1104           FND_MSG_PUB.ADD;
1105           RAISE vr_update_failure;
1106        END IF;
1107 
1108        IF (l_debug = 'Y') THEN
1109          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': After Update of Val Rules ');
1110        END IF;
1111 
1112      /* Check if work was done */
1113      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1114        RAISE vr_update_failure;
1115      END IF;  /* IF x_return_status <> FND_API.G_RET_STS_SUCCESS */
1116 
1117     /* Get the messgae list and count generated by this API */
1118     fnd_msg_pub.count_and_get (
1119        p_count   => x_message_count
1120       ,p_encoded => FND_API.g_false
1121       ,p_data    => x_message_list);
1122 
1123      IF (l_debug = 'Y') THEN
1124         gmd_debug.put_line(m_pkg_name||'.'||l_api_name
1125                            ||' Completed '||l_api_name
1126                            ||' at '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
1127      END IF;
1128   EXCEPTION
1129     WHEN vr_update_failure OR invalid_version THEN
1130          IF (l_debug = 'Y') THEN
1131             gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
1132          END IF;
1133          x_return_status := FND_API.G_RET_STS_ERROR;
1134          fnd_msg_pub.count_and_get (
1135             p_count   => x_message_count
1136            ,p_encoded => FND_API.g_false
1137            ,p_data    => x_message_list);
1138     WHEN last_update_date_failure THEN
1139          x_return_status := FND_API.G_RET_STS_ERROR;
1140          FND_MESSAGE.SET_NAME('FND', 'FND_RECORD_CHANGED_ERROR');
1141          FND_MSG_PUB.ADD;
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          x_return_status := FND_API.G_RET_STS_ERROR;
1148          fnd_msg_pub.count_and_get (
1149             p_count   => x_message_count
1150            ,p_encoded => FND_API.g_false
1151            ,p_data    => x_message_list);
1152     WHEN OTHERS THEN
1153          IF (l_debug = 'Y') THEN
1154             gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
1155          END IF;
1156          fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
1157          x_return_status := FND_API.g_ret_sts_unexp_error;
1158          fnd_msg_pub.count_and_get (
1159             p_count   => x_message_count
1160            ,p_encoded => FND_API.g_false
1161            ,p_data    => x_message_list);
1162   END update_validity_rules;
1163 
1164 END GMD_VALIDITY_RULES_PVT;