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.5.12020000.3 2012/09/29 08:40:53 maychen 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   /*  Michael Tou 25-Oct-2011 Bug# 6713805 Added ITEM_UM in order to re-calculate */
453   /*                                     inv_min_qty, inv_max_qty whenever UOM updates */
454   /* =============================================================== */
455   PROCEDURE update_validity_rules
456   ( p_validity_rule_id	IN	    gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE
457   , p_update_table	IN	    gmd_validity_rules_pvt.update_tbl_type
458   , x_message_count 	OUT NOCOPY  NUMBER
459   , x_message_list 	OUT NOCOPY  VARCHAR2
460   , x_return_status	OUT NOCOPY  VARCHAR2
461   ) IS
462 
463   /* Local variable section */
464   l_api_name              CONSTANT VARCHAR2(30) := 'UPDATE_VALIDITY_RULES';
465   l_db_date               DATE;
466   l_inv_item_um           mtl_units_of_measure.uom_code%TYPE; -- NPD Conv.
467   l_tpl                   NUMBER;
468   l_fixed_scale           NUMBER;
469 
470   -- NPD Conv. Added the following local var's
471   l_formula_id            NUMBER;
472   l_recp_use              NUMBER;
473 
474   /* Define record type that hold the routing data */
475   l_old_vr_rec              gmd_recipe_validity_rules%ROWTYPE;
476   l_organization_id   number := null; -- Bug 14690148 pal
477 
478   /* Define Exceptions */
479   VR_update_failure                EXCEPTION;
480   last_update_date_failure         EXCEPTION;
481   invalid_version                  EXCEPTION;
482   setup_failure                    EXCEPTION;
483 
484   /* Define cursor section */
485   CURSOR get_old_vr_rec(vValidity_rule_id
486                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
487      Select *
488      From   gmd_recipe_validity_rules
489      Where  recipe_validity_rule_id = vValidity_rule_id;
490 
491   CURSOR Get_db_last_update_date(vValidity_rule_id
492                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
493      Select last_update_date
494      From   gmd_recipe_validity_rules
495      Where  recipe_validity_rule_id = vValidity_rule_id;
496 
497   CURSOR Get_Routing_Details(vValidity_rule_id
498                         gmd_recipe_validity_rules.recipe_validity_rule_id%TYPE)  IS
499     Select rt.Effective_Start_Date,
500            rt.Effective_End_Date
501     From   gmd_routings_b rt, gmd_recipes_b rc,
502            gmd_recipe_validity_rules vr
503     Where  vr.recipe_id = rc.recipe_id AND
504            rc.routing_id = rt.routing_id AND
505            vr.recipe_validity_rule_id = vValidity_rule_id AND
506            rt.delete_mark = 0;
507 
508    CURSOR check_fmdtl_fixed_scale(vRecipe_id gmd_recipes_b.recipe_id%TYPE
509                                  ,vItem_id   ic_item_mst_b.item_id%TYPE)  IS
510      SELECT 1
511      FROM   sys.dual
512      WHERE  EXISTS (Select d.formula_id
513                     From  fm_matl_dtl d, gmd_recipes_b r
514                     WHERE r.formula_id = d.formula_id AND
515                           r.recipe_id  = vRecipe_id AND
516                           d.line_type = 1 AND
517                           d.inventory_item_id   = vItem_id AND  -- NPD Conv.
518                           d.scale_type = 0);
519 
520    CURSOR check_fmhdr_fixed_scale(vRecipe_id gmd_recipes_b.recipe_id%TYPE)  IS
521      SELECT 1
522      FROM   sys.dual
523      WHERE  EXISTS (Select h.formula_id
524                     From  fm_form_mst h, gmd_recipes_b r
525                     WHERE r.formula_id = h.formula_id AND
526                           r.recipe_id  = vRecipe_id AND
527                           h.scale_type = 0);
528 
529    -- Cursor to fetch recipe use and formula id of the VR
530    CURSOR get_recp_dets IS
531      SELECT r.formula_id, v.recipe_use
532      FROM   gmd_recipes_b r, gmd_recipe_validity_rules v
533      WHERE  v.recipe_validity_rule_id = p_validity_rule_id
534      AND    v.recipe_id = r.recipe_id;
535 
536   BEGIN
537     /* Intialize the setup fields */
538 
539     IF NOT gmd_api_grp.setup_done THEN
540       gmd_api_grp.setup_done := gmd_api_grp.setup;
541     END IF;
542 
543     IF NOT gmd_api_grp.setup_done THEN
544       RAISE setup_failure;
545     END IF;
546 
547     /* Set the return status to success initially */
548     x_return_status := FND_API.G_RET_STS_SUCCESS;
549 
550     IF (l_debug = 'Y') THEN
551       gmd_debug.put_line(m_pkg_name||'.'||l_api_name
552       ||' : About to get the db VR record for VR id = '
553       ||p_validity_rule_id);
554     END IF;
555 
556     /* Get the old routing rec value */
557     OPEN  get_old_vr_rec(p_validity_rule_id);
558     FETCH get_old_vr_rec INTO l_old_vr_rec;
559       IF get_old_vr_rec%NOTFOUND THEN
560         FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_INVALID');
561         FND_MSG_PUB.ADD;
562         CLOSE get_old_vr_rec;
563         RAISE vr_update_failure;
564       END IF;
565     CLOSE get_old_vr_rec;
566 
567     /* Loop thro' every column in p_update_table table and for each column name
568        assign or replace the old value with the table value */
569     FOR i IN 1 .. p_update_table.count  LOOP
570 
571        IF (l_debug = 'Y') THEN
572          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||' : The column to be updated = '
573                            ||p_update_table(i).p_col_to_update||' and value = '
574                            ||p_update_table(i).p_value);
575        END IF;
576 
577       -- IF (UPPER(p_update_table(i).p_col_to_update) = 'RECIPE_ID') THEN
578       --     l_old_vr_rec.RECIPE_ID := p_update_table(i).p_value;
579       -- ELSE
580 
581        IF (UPPER(p_update_table(i).p_col_to_update) = 'ORGN_CODE') THEN
582            l_old_vr_rec.ORGN_CODE := p_update_table(i).p_value;
583        -- NPD Conv.
584        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ORGANIZATION_ID') THEN
585 	   l_old_vr_rec.ORGANIZATION_ID  := p_update_table(i).p_value;
586        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'INVENTORY_ITEM_ID') THEN
587            l_old_vr_rec.INVENTORY_ITEM_ID := p_update_table(i).p_value;
588        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'REVISION') THEN
589            l_old_vr_rec.REVISION := p_update_table(i).p_value;
590        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'DETAIL_UOM') THEN
591            l_old_vr_rec.DETAIL_UOM := p_update_table(i).p_value;
592        -- End NPD Conv.
593        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'TEXT_CODE') THEN
594            l_old_vr_rec.TEXT_CODE := p_update_table(i).p_value;
595        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'RECIPE_USE') THEN
596            l_old_vr_rec.RECIPE_USE := p_update_table(i).p_value;
597        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'PREFERENCE') THEN
598            l_old_vr_rec.PREFERENCE := p_update_table(i).p_value;
599        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'START_DATE') THEN
600            IF (l_debug = 'Y') THEN
601               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||
602               ' : Before conversion of Start date - '||
603               ' CharDT to Date Format ');
604            END IF;
605            l_old_vr_rec.START_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
606            IF (l_debug = 'Y') THEN
607               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
608                                  ||' : After conversion of CharDT to Date '||
609                                  ' Start Date = '||l_old_vr_rec.START_DATE);
610            END IF;
611        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'END_DATE') THEN
612            IF (l_debug = 'Y') THEN
613               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
614                        ||' : Before conversion of end date - '
615                        ||' CharDT to Date Format '||p_update_table(i).p_value);
616            END IF;
617            l_old_vr_rec.END_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
618            IF (l_debug = 'Y') THEN
619               gmd_debug.put_line(m_pkg_name||'.'||l_api_name
620                        ||' : After conversion of CharDT to Date '||
621                          ' End Date = '||l_old_vr_rec.END_DATE);
622            END IF;
623 
624        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'PLANNED_PROCESS_LOSS') THEN
625            l_old_vr_rec.PLANNED_PROCESS_LOSS := p_update_table(i).p_value;
626 --RLNAGARA start B6997624 Added code to update Fixed Process Loss and UOM
627        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'FIXED_PROCESS_LOSS') THEN
628            l_old_vr_rec.FIXED_PROCESS_LOSS := p_update_table(i).p_value;
629        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'FIXED_PROCESS_LOSS_UOM') THEN
630            l_old_vr_rec.FIXED_PROCESS_LOSS_UOM := p_update_table(i).p_value;
631 --RLNAGARA end B6997624
632        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'STD_QTY') THEN
633            l_old_vr_rec.STD_QTY := p_update_table(i).p_value;
634        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'MIN_QTY') THEN
635            l_old_vr_rec.MIN_QTY := p_update_table(i).p_value;
636        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'MAX_QTY') THEN
637            l_old_vr_rec.MAX_QTY := p_update_table(i).p_value;
638        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'DELETE_MARK') THEN
639            l_old_vr_rec.DELETE_MARK := p_update_table(i).p_value;
640            -- Bug #4134275 Kapil M
641        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATED_BY') THEN
642            l_old_vr_rec.LAST_UPDATED_BY := NVL(p_update_table(i).p_value, fnd_global.user_id);
643        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATE_DATE') THEN
644            l_old_vr_rec.LAST_UPDATE_DATE := FND_DATE.canonical_to_date(p_update_table(i).p_value);
645        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'LAST_UPDATE_LOGIN') THEN
646            l_old_vr_rec.LAST_UPDATE_LOGIN := NVL(p_update_table(i).p_value,gmd_api_grp.login_id);
647        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE1') THEN
648            l_old_vr_rec.ATTRIBUTE1 := p_update_table(i).p_value;
649        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE2') THEN
650            l_old_vr_rec.ATTRIBUTE2 := p_update_table(i).p_value;
651        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE3') THEN
652            l_old_vr_rec.ATTRIBUTE3 := p_update_table(i).p_value;
653        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE4') THEN
654            l_old_vr_rec.ATTRIBUTE4 := p_update_table(i).p_value;
655        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE5') THEN
656            l_old_vr_rec.ATTRIBUTE5 := p_update_table(i).p_value;
657        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE6') THEN
658            l_old_vr_rec.ATTRIBUTE6 := p_update_table(i).p_value;
659        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE7') THEN
660            l_old_vr_rec.ATTRIBUTE7 := p_update_table(i).p_value;
661        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE8') THEN
662            l_old_vr_rec.ATTRIBUTE8 := p_update_table(i).p_value;
663        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE9') THEN
664            l_old_vr_rec.ATTRIBUTE9 := p_update_table(i).p_value;
665        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE10') THEN
666            l_old_vr_rec.ATTRIBUTE10 := p_update_table(i).p_value;
667        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE11') THEN
668            l_old_vr_rec.ATTRIBUTE11 := p_update_table(i).p_value;
669        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE12') THEN
670            l_old_vr_rec.ATTRIBUTE12 := p_update_table(i).p_value;
671        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE13') THEN
672            l_old_vr_rec.ATTRIBUTE13 := p_update_table(i).p_value;
673        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE14') THEN
674            l_old_vr_rec.ATTRIBUTE14 := p_update_table(i).p_value;
675        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE15') THEN
676            l_old_vr_rec.ATTRIBUTE15 := p_update_table(i).p_value;
677        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE16') THEN
678            l_old_vr_rec.ATTRIBUTE16 := p_update_table(i).p_value;
679        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE17') THEN
680            l_old_vr_rec.ATTRIBUTE17 := p_update_table(i).p_value;
681        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE18') THEN
682            l_old_vr_rec.ATTRIBUTE18 := p_update_table(i).p_value;
683        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE19') THEN
684            l_old_vr_rec.ATTRIBUTE19 := p_update_table(i).p_value;
685        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE20') THEN
686            l_old_vr_rec.ATTRIBUTE20 := p_update_table(i).p_value;
687        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE21') THEN
688            l_old_vr_rec.ATTRIBUTE21 := p_update_table(i).p_value;
689        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE22') THEN
690            l_old_vr_rec.ATTRIBUTE22 := p_update_table(i).p_value;
691        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE23') THEN
692            l_old_vr_rec.ATTRIBUTE23 := p_update_table(i).p_value;
693        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE24') THEN
694            l_old_vr_rec.ATTRIBUTE24 := p_update_table(i).p_value;
695        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE25') THEN
696            l_old_vr_rec.ATTRIBUTE25 := p_update_table(i).p_value;
697        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE26') THEN
698            l_old_vr_rec.ATTRIBUTE26 := p_update_table(i).p_value;
699        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE27') THEN
700            l_old_vr_rec.ATTRIBUTE27 := p_update_table(i).p_value;
701        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE28') THEN
702            l_old_vr_rec.ATTRIBUTE28 := p_update_table(i).p_value;
703        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE29') THEN
704            l_old_vr_rec.ATTRIBUTE29 := p_update_table(i).p_value;
705        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE30') THEN
706            l_old_vr_rec.ATTRIBUTE30 := p_update_table(i).p_value;
707        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'ATTRIBUTE_CATEGORY') THEN
708            l_old_vr_rec.ATTRIBUTE_CATEGORY := p_update_table(i).p_value;
709        ELSIF (UPPER(p_update_table(i).p_col_to_update) = 'VALIDITY_RULE_STATUS') THEN
710          -- Users should be prompted to use change status API
711          -- Since Change Status API commits work it cannot be
712          -- called from here directly
713          FND_MESSAGE.set_name('GMD','GMD_NOT_USE_API_UPD_STATUS');
714          FND_MSG_PUB.ADD;
715          RAISE vr_update_failure;
716        END IF;
717 
718        IF (l_debug = 'Y') THEN
719          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': '||
720                             'Assigned all values - Now performing indv validations ');
721        END IF;
722 
723        /* Chcek if update is allowed */
724        IF NOT GMD_COMMON_VAL.update_allowed('VALIDITY'
725                                              ,p_Validity_rule_id
726                                              ,UPPER(p_update_table(i).p_col_to_update) ) THEN
727          FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_CANNOT_UPD');
728          FND_MSG_PUB.ADD;
729          RAISE vr_update_failure;
730        END IF;
731 
732        /* Compare Dates - if the last update date passed in via the API is less than
733           the last update in the db - it indicates someelse has updated this row after this
734           row was selected */
735        IF (l_debug = 'Y') THEN
736          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 1 '||
737                             'Comparing last updates to check if there any locking issues ');
738        END IF;
739 
740        OPEN  Get_db_last_update_date(p_Validity_rule_id);
741        FETCH Get_db_last_update_date INTO l_db_date;
742          IF Get_db_last_update_date%NOTFOUND THEN
743             CLOSE Get_db_last_update_date;
744             RAISE vr_update_failure;
745          END IF;
746        CLOSE Get_db_last_update_date;
747 
748        -- Validation are done here
749        -- it might have to moved to a PUB layer !!!!
750        IF l_old_vr_rec.LAST_UPDATE_DATE < l_db_date THEN
751        	  RAISE last_update_date_failure;
752        END IF;
753 
754        IF (l_debug = 'Y') THEN
755          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2 '||
756                             'Start and End Date validation '||l_old_vr_rec.start_date||
757                             ' - '||l_old_vr_rec.end_date);
758        END IF;
759 
760        -- Check if the item being modified is either a product or a by-product
761        IF (UPPER(p_update_table(i).p_col_to_update) = 'ITEM_ID') THEN
762           IF NOT Determine_Product(l_old_vr_rec.RECIPE_ID, l_old_vr_rec.INVENTORY_ITEM_ID) THEN -- NPD Conv.
763              FND_MESSAGE.SET_NAME('GMD', 'GMD_ITEM_IS_PRODUCT');
764              FND_MSG_PUB.ADD;
765              x_return_status := 'E';
766              RAISE vr_update_failure;
767           END IF;
768        END IF;
769 
770        -- Validity rule date validation with routing dates
771        IF (UPPER(p_update_table(i).p_col_to_update) IN ('START_DATE','END_DATE')) THEN
772 
773          -- Validity rule start and end date validation
774          IF (l_debug = 'Y') THEN
775             gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2c '||
776                           'Checking if end date ( '||l_old_vr_rec.end_date||' ) '||
777                           ' > '||' start date ( '||l_old_vr_rec.start_date||' ) ');
778          END IF;
779          -- Comparing Vr start and End dates
780          effective_dates ( P_start_date => l_old_vr_rec.start_date,
781                            P_end_date => l_old_vr_rec.end_date,
782                            x_return_status => x_return_status);
783 
784          IF (x_return_status <> 'S') THEN
785            RAISE vr_update_failure;
786          END IF;
787 
788          -- Comparing Vr dates with Routing Dates
789          IF (l_debug = 'Y') THEN
790               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2a0 '||
791                             'Comparing Vr dates with Routing Dates ');
792          END IF;
793 
794          FOR get_routing_rec in Get_Routing_Details(p_validity_rule_id) LOOP
795            -- Get the routing start date if applicable
796            IF (l_debug = 'Y') THEN
797              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
798                                 ||': The vr start date = '||l_old_vr_rec.start_date
799                                 ||' rout start date = '||get_routing_rec.effective_start_date);
800              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
801                                 ||': The Vr end date = '||l_old_vr_rec.end_date
802                                 ||' rout end date = '||get_routing_rec.effective_end_date);
803            END IF;
804 
805            IF (l_debug = 'Y') THEN
806               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2a '||
807                             'Checking if VR start date > Routing start date ');
808            END IF;
809 
810            validate_start_date (P_disp_start_date  => l_old_vr_rec.start_date,
811                                 P_routing_start_date => get_routing_rec.effective_start_date,
812                                 x_return_status => x_return_status);
813            IF (x_return_status <> 'S') THEN
814              RAISE vr_update_failure;
815            END IF;
816 
817            -- Get the routing start date if applicable
818            IF (l_debug = 'Y') THEN
819               gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 2b '||
820                             'Chceking if VR end date < Routing end date ');
821            END IF;
822            validate_end_date (P_end_date  => l_old_vr_rec.end_date,
823                               P_routing_end_date => get_routing_rec.effective_end_date,
824                               x_return_status => x_return_status);
825 
826            IF (x_return_status <> 'S') THEN
827              RAISE vr_update_failure;
828            END IF;
829          END LOOP;
830 
831        END IF; -- When start or end dates are updated
832 
833        IF (l_debug = 'Y') THEN
834            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '
835                       ||' : About to validate std qty '
836                       ||'The min qty <  max qty <  std qty = '
837                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
838                       ||' - '||l_old_vr_rec.std_qty);
839          END IF;
840 
841        -- Min, MAx and Std qty validation
842        IF (UPPER(p_update_table(i).p_col_to_update)
843                                   IN ('STD_QTY','MIN_QTY','MAX_QTY')) THEN
844          -- Check if scale type at formula header is fixed, if yes then
845          -- the qty's fields cannot be updated
846          IF (l_debug = 'Y') THEN
847            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
848                             'Checking if formula hdr is fixed scaled ');
849          END IF;
850 
851          OPEN check_fmhdr_fixed_scale(l_old_vr_rec.Recipe_id);
852          FETCH check_fmhdr_fixed_scale INTO l_fixed_scale;
853          CLOSE check_fmhdr_fixed_scale;
854 
855          IF (l_fixed_scale = 1) THEN
856            FND_MESSAGE.SET_NAME('GMD', 'GMD_FXD_HDR_FOR_VR');
857            FND_MSG_PUB.ADD;
858            RAISE vr_update_failure;
859          END IF;
860 
861          -- Check if scale type at formula dtl for the VR product is fixed, if yes then
862          -- the qty's fields cannot be updated
863          IF (l_debug = 'Y') THEN
864            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
865                             'Checking if formula dtl is fixed scaled ');
866          END IF;
867 
868          OPEN check_fmdtl_fixed_scale(l_old_vr_rec.Recipe_id, l_old_vr_rec.inventory_item_id); -- NPD Conv.
869          FETCH check_fmdtl_fixed_scale INTO l_fixed_scale;
870          CLOSE check_fmdtl_fixed_scale;
871 
872          IF (l_fixed_scale = 1) THEN
873            FND_MESSAGE.SET_NAME('GMD', 'GMD_FXD_HDR_FOR_VR');
874            FND_MSG_PUB.ADD;
875            RAISE vr_update_failure;
876          END IF;
877        END IF;
878 -- Bug 5024092 KapilM
879 -- Moved the stnd qty and min max qty check out of this loop.
880        -- The inv_min and max qty changes only ifthe min or max_qty value is changed
881        IF (UPPER(p_update_table(i).p_col_to_update) IN ('MIN_QTY','MAX_QTY','ITEM_UM','DETAIL_UOM')) THEN/*Bug #6713805 -Added ITEM_UM also.  */
882          -- Bug 14690148 pal check for null organization_id , if so need to get the owner_organization_id from the recipe
883 
884          IF l_old_vr_rec.organization_id is NULL then
885         			SELECT owner_organization_id
886          			INTO   l_organization_id
887          			FROM   GMD_RECIPES
888          			WHERE  RECIPE_ID =  l_old_vr_rec.RECIPE_ID;
889 
890          END IF; --  IF l_old_vr_rec.organization_id is NULL then
891          SELECT UNIQUE primary_uom_code
892          INTO   l_inv_item_um
893          FROM   mtl_system_items
894          WHERE  inventory_item_id = l_old_vr_rec.inventory_item_id
895         and  organization_id = nvl(l_old_vr_rec.organization_id, l_organization_id);      -- Bug 14690148 pal need to stripe with org
896 
897          IF (l_debug = 'Y') THEN
898              gmd_debug.put_line(m_pkg_name||'.'||l_api_name
899                       ||': Val 4: About to calc inv min/max qty '
900                       ||'The min qty, max qty  = '
901                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty);
902          END IF;
903 
904          calc_inv_qtys (P_inv_item_um   => l_inv_item_um,
905                         P_item_um       => l_old_vr_rec.detail_uom,
906                         P_item_id       => l_old_vr_rec.inventory_item_id,
907                         P_min_qty       => l_old_vr_rec.min_qty,
908                         P_max_qty       => l_old_vr_rec.max_qty,
909                         X_inv_min_qty   => l_old_vr_rec.inv_min_qty,
910                         X_inv_max_qty   => l_old_vr_rec.inv_max_qty,
911                         x_return_status => x_return_status);
912 
913          IF (x_return_status <> 'S') THEN
914            RAISE vr_update_failure;
915          END IF;
916        END IF;
917 
918        IF (l_debug = 'Y') THEN
919           gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to calc process loss '
920                       ||'The min qty, max qty and std qty = '
921                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
922                       ||' - '||l_old_vr_rec.std_qty);
923        END IF;
924 --Bug 12744266 Planned process loss is passed by user no need to calculate here
925       /* IF ((UPPER(p_update_table(i).p_col_to_update) = 'STD_QTY') AND
926           (UPPER(p_update_table(i).p_col_to_update) <> 'PLANNED_PROCESS_LOSS')) THEN
927          calculate_process_loss( V_assign 	=> 1
928                                 ,P_vr_id    => p_validity_rule_id
929                                 ,X_TPL      => l_tpl
930                                 ,X_PPL      => l_old_vr_rec.planned_process_loss
931                                 ,x_return_status => x_return_status);
932          IF (x_return_status <> 'S') THEN
933            --Ignore this error, its ok to update VR without Process loss
934            x_return_status := 'S';
935            --RAISE vr_update_failure;
936          END IF;
937        END IF;*/
938 
939        IF (l_debug = 'Y') THEN
940          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to check for duplicates ');
941        END IF;
942 
943        IF (l_debug = 'Y') THEN
944           gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 6: About to check for duplicates '
945                       ||'The min qty, max qty and std qty = '
946                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
947                       ||' - '||l_old_vr_rec.std_qty);
948        END IF;
949 
950        -- Check for duplicate VR
951        -- bug 4134275
952        check_for_duplicate (    p_recipe_validity_rule_id => p_validity_rule_id
953                                ,pRecipe_id              => l_old_vr_rec.recipe_id
954                                ,pitem_id                => l_old_vr_rec.inventory_item_id
955                                ,pOrgn_code              => l_old_vr_rec.orgn_code
956                                -- NPD Conv.
957                                ,pOrganization_id        => l_old_vr_rec.organization_id
958                                ,pRecipe_Use             => l_old_vr_rec.recipe_use
959                                ,pPreference             => l_old_vr_rec.preference
960                                ,pstd_qty                => l_old_vr_rec.std_qty
961                                ,pmin_qty                => l_old_vr_rec.min_qty
962                                ,pmax_qty                => l_old_vr_rec.max_qty
963                                ,pinv_max_qty            => l_old_vr_rec.inv_max_qty
964                                ,pinv_min_qty            => l_old_vr_rec.inv_min_qty
965                                ,pitem_um                => l_old_vr_rec.detail_uom
966                                ,pValidity_Rule_status   => l_old_vr_rec.validity_rule_status
967                                ,pstart_date             => l_old_vr_rec.start_date
968                                ,pend_date               => l_old_vr_rec.end_date
969                                ,pplanned_process_loss   => l_old_vr_rec.planned_process_loss
970                                ,x_return_status         => x_return_status
971                                );
972 
973        IF (x_return_status <> 'S') THEN
974          RAISE vr_update_failure;
975        END IF;
976 
977        IF (l_debug = 'Y') THEN
978          gmd_debug.put_line(m_pkg_name||'.'||l_api_name
979                       ||': Before Final update : About to Update Val Rules '
980                       ||'The min qty, max qty and std qty = '
981                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty
982                       ||' - '||l_old_vr_rec.std_qty);
983        END IF;
984 
985        -- NPD Conv.
986        /* Check if for the updated organization - formula items remain valid */
987        IF (UPPER(p_update_table(i).p_col_to_update) IN ('ORGN_CODE','ORGANIZATION_ID')) THEN
988 
989        -- Get the formula_id and recipe_use for the VR
990        OPEN get_recp_dets;
991        FETCH get_recp_dets INTO l_formula_id, l_recp_use;
992        CLOSE get_recp_dets;
993        -- If recipe_use is for production ( =0), pass production flag as TRUE to check_item_exists
994        IF (NVL(l_recp_use,0) = 0) THEN
995                GMD_API_GRP.check_item_exists (p_formula_id 	 => l_formula_id,
996 	                                      x_return_status 	 => x_return_status,
997 	                                      p_organization_id  => l_old_vr_rec.organization_id,
998 	                                      p_orgn_code 	 => l_old_vr_rec.orgn_code,
999 	                                      p_production_check => TRUE);
1000 
1001        ELSE
1002                GMD_API_GRP.check_item_exists (p_formula_id 	 => l_formula_id,
1003                	                              x_return_status 	 => x_return_status,
1004 	                                      p_organization_id  => l_old_vr_rec.organization_id,
1005 	                                      p_orgn_code 	 => l_old_vr_rec.orgn_code,
1006 	                                      p_production_check => FALSE);
1007 
1008        END IF;
1009 
1010        IF (x_return_status <> 'S') THEN
1011            RAISE vr_update_failure;
1012        END IF;
1013 
1014        END IF;
1015     END LOOP;
1016 
1017 -- Bug 5024092 Kapil M
1018 -- Moved the stnd qty and min max qty check out of above loop.
1019          IF (l_debug = 'Y') THEN
1020            gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': Val 3 '||
1021                             'Checking if min qty < std qty < max qty ');
1022          END IF;
1023          -- Checks if std_qty is between min and max qty
1024 
1025 
1026          std_qty(P_std_qty => l_old_vr_rec.std_qty,
1027                  P_min_qty => l_old_vr_rec.min_qty,
1028                  P_max_qty => l_old_vr_rec.max_qty,
1029                  x_return_status => x_return_status);
1030 
1031          IF (x_return_status <> 'S') THEN
1032            RAISE vr_update_failure;
1033          END IF;
1034 
1035          IF (l_debug = 'Y') THEN
1036              gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': About to validate max qty '
1037                       ||'The min qty, max qty  = '
1038                       ||l_old_vr_rec.min_qty||' - '||l_old_vr_rec.max_qty);
1039          END IF;
1040 
1041          -- Min, Max qty validation
1042          max_qty(P_min_qty => l_old_vr_rec.min_qty,
1043                  P_max_qty => l_old_vr_rec.max_qty,
1044                  x_return_status => x_return_status);
1045 
1046          IF (x_return_status <> 'S') THEN
1047            RAISE vr_update_failure;
1048          END IF;
1049 
1050        /* Number of times this routine is equal to number of rows in the p_update_table */
1051        UPDATE  GMD_RECIPE_VALIDITY_RULES
1052        SET
1053            recipe_id            = l_old_vr_rec.recipe_id
1054          , orgn_code            = l_old_vr_rec.orgn_code
1055          -- NPD Conv.
1056          , organization_id      = l_old_vr_rec.organization_id
1057          , inventory_item_id    = l_old_vr_rec.inventory_item_id
1058          , revision             = l_old_vr_rec.revision
1059          , detail_uom           = l_old_vr_rec.detail_uom
1060          -- End NPD Conv.
1061          , recipe_use           = l_old_vr_rec.recipe_use
1062          , preference           = l_old_vr_rec.preference
1063          , start_date           = l_old_vr_rec.start_date
1064          , end_date             = l_old_vr_rec.end_date
1065          , min_qty              = l_old_vr_rec.min_qty
1066          , max_qty              = l_old_vr_rec.max_qty
1067          , std_qty              = l_old_vr_rec.std_qty
1068          , inv_min_qty          = l_old_vr_rec.inv_min_qty
1069          , inv_max_qty          = l_old_vr_rec.inv_max_qty
1070          , text_code            = l_old_vr_rec.text_code
1071          , attribute_category   = l_old_vr_rec.attribute_category
1072          , attribute1           = l_old_vr_rec.attribute1
1073          , attribute2           = l_old_vr_rec.attribute2
1074          , attribute3           = l_old_vr_rec.attribute3
1075          , attribute4           = l_old_vr_rec.attribute4
1076          , attribute5           = l_old_vr_rec.attribute5
1077          , attribute6           = l_old_vr_rec.attribute6
1078          , attribute7           = l_old_vr_rec.attribute7
1079          , attribute8           = l_old_vr_rec.attribute8
1080          , attribute9           = l_old_vr_rec.attribute9
1081          , attribute10          = l_old_vr_rec.attribute10
1082          , attribute11          = l_old_vr_rec.attribute11
1083          , attribute12          = l_old_vr_rec.attribute12
1084          , attribute13          = l_old_vr_rec.attribute13
1085          , attribute14          = l_old_vr_rec.attribute14
1086          , attribute15          = l_old_vr_rec.attribute15
1087          , attribute16          = l_old_vr_rec.attribute16
1088          , attribute17          = l_old_vr_rec.attribute17
1089          , attribute18          = l_old_vr_rec.attribute18
1090          , attribute19          = l_old_vr_rec.attribute19
1091          , attribute20          = l_old_vr_rec.attribute20
1092          , attribute21          = l_old_vr_rec.attribute21
1093          , attribute23          = l_old_vr_rec.attribute23
1094          , attribute22          = l_old_vr_rec.attribute22
1095          , attribute24          = l_old_vr_rec.attribute24
1096          , attribute25          = l_old_vr_rec.attribute25
1097          , attribute26          = l_old_vr_rec.attribute26
1098          , attribute27          = l_old_vr_rec.attribute27
1099          , attribute28          = l_old_vr_rec.attribute28
1100          , attribute29          = l_old_vr_rec.attribute29
1101          , attribute30          = l_old_vr_rec.attribute30
1102          , created_by           = l_old_vr_rec.created_by
1103          , creation_date        = l_old_vr_rec.creation_date
1104          , last_updated_by      = l_old_vr_rec.last_updated_by
1105          , last_update_date     = l_old_vr_rec.last_update_date
1106          , last_update_login    = l_old_vr_rec.last_update_login
1107          , delete_mark          = l_old_vr_rec.delete_mark
1108          , validity_rule_status = l_old_vr_rec.validity_rule_status
1109          , lab_type             = l_old_vr_rec.lab_type
1110          , planned_process_loss = l_old_vr_rec.planned_process_loss
1111 	 , fixed_process_loss   = l_old_vr_rec.fixed_process_loss           /* RLNAGARA   Bug6997624 */
1112 	 , fixed_process_loss_uom = l_old_vr_rec.fixed_process_loss_uom     /* RLNAGARA   Bug6997624 */
1113        where recipe_validity_rule_id = p_validity_rule_id;
1114 
1115        IF (sql%notfound) THEN
1116           FND_MESSAGE.SET_NAME('GMD', 'GMD_VR_UPD_NO_ACCESS');
1117           FND_MSG_PUB.ADD;
1118           RAISE vr_update_failure;
1119        END IF;
1120 
1121        IF (l_debug = 'Y') THEN
1122          gmd_debug.put_line(m_pkg_name||'.'||l_api_name||': After Update of Val Rules ');
1123        END IF;
1124 
1125      /* Check if work was done */
1126      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1127        RAISE vr_update_failure;
1128      END IF;  /* IF x_return_status <> FND_API.G_RET_STS_SUCCESS */
1129 
1130     /* Get the messgae list and count generated by this API */
1131     fnd_msg_pub.count_and_get (
1132        p_count   => x_message_count
1133       ,p_encoded => FND_API.g_false
1134       ,p_data    => x_message_list);
1135 
1136      IF (l_debug = 'Y') THEN
1137         gmd_debug.put_line(m_pkg_name||'.'||l_api_name
1138                            ||' Completed '||l_api_name
1139                            ||' at '||to_char(sysdate,'MM/DD/YYYY HH24:MI:SS'));
1140      END IF;
1141   EXCEPTION
1142     WHEN vr_update_failure OR invalid_version THEN
1143          IF (l_debug = 'Y') THEN
1144             gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'API not complete');
1145          END IF;
1146          x_return_status := FND_API.G_RET_STS_ERROR;
1147          fnd_msg_pub.count_and_get (
1148             p_count   => x_message_count
1149            ,p_encoded => FND_API.g_false
1150            ,p_data    => x_message_list);
1151     WHEN last_update_date_failure THEN
1152          x_return_status := FND_API.G_RET_STS_ERROR;
1153          FND_MESSAGE.SET_NAME('FND', 'FND_RECORD_CHANGED_ERROR');
1154          FND_MSG_PUB.ADD;
1155          fnd_msg_pub.count_and_get (
1156             p_count   => x_message_count
1157            ,p_encoded => FND_API.g_false
1158            ,p_data    => x_message_list);
1159     WHEN setup_failure THEN
1160          x_return_status := FND_API.G_RET_STS_ERROR;
1161          fnd_msg_pub.count_and_get (
1162             p_count   => x_message_count
1163            ,p_encoded => FND_API.g_false
1164            ,p_data    => x_message_list);
1165     WHEN OTHERS THEN
1166          IF (l_debug = 'Y') THEN
1167             gmd_debug.put_line (m_pkg_name||'.'||l_api_name||':'||'When others exception:'||SQLERRM);
1168          END IF;
1169          fnd_msg_pub.add_exc_msg (m_pkg_name, l_api_name);
1170          x_return_status := FND_API.g_ret_sts_unexp_error;
1171          fnd_msg_pub.count_and_get (
1172             p_count   => x_message_count
1173            ,p_encoded => FND_API.g_false
1174            ,p_data    => x_message_list);
1175   END update_validity_rules;
1176 
1177 END GMD_VALIDITY_RULES_PVT;