DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMICVAL

Source


1 PACKAGE BODY GMICVAL AS
2 /* $Header: gmicvalb.pls 115.6 2004/04/30 17:40:42 adeshmuk ship $ */
3   /* =============================================
4   PROCEDURE:
5   trans_date_val
6 
7   DESCRIPTION:
8   This PL/SQL function is responsible for
9   validating that a transaction date is in
10   an open warehouse and inventory calendar period.
11 
12   SYNOPSIS:
13   iret := GMICVAL.trans_date_val(ptrans_date,
14   porgn_code, pwhse_code);
15 
16   ptrans_date - transaction date
17   porgn_code  - organization associated to the warehouse.
18   pwhse_code  - warehouse affected by the transaction.
19 
20   RETURNS:
21   0 Success
22   ============================================= */
23   PROCEDURE trans_date_val(ptrans_date DATE,
24                            porgn_code  VARCHAR2,
25                            pwhse_code  VARCHAR2) IS
26 
27     /* Local variable initialization and
28     declarations.
29     =================================*/
30     l_iret   NUMBER       := -1;
31 
32     BEGIN
33 
34       l_iret := GMICCAL.trans_date_validate(ptrans_date,
35                   porgn_code, pwhse_code);
36 
37       IF (l_iret = -21) THEN
38         FND_MESSAGE.set_name('GMI', 'INVCAL_FISCALYR_ERR');
39         APP_EXCEPTION.raise_exception;
40 
41       ELSIF (l_iret = -22) THEN
42         FND_MESSAGE.set_name('GMI', 'INVCAL_PERIOD_ERR');
43         APP_EXCEPTION.raise_exception;
44 
45       ELSIF (l_iret = -23) THEN
46         FND_MESSAGE.set_name('GMI', 'INVCAL_CLOSED_PERIOD_ERR');
47         APP_EXCEPTION.raise_exception;
48 
49       ELSIF (l_iret = -24) THEN
50         FND_MESSAGE.set_name('GMI', 'INVCAL_INVALIDCO_ERR');
51         APP_EXCEPTION.raise_exception;
52 
53       ELSIF (l_iret = -25) THEN
54         FND_MESSAGE.set_name('GMI', 'INVCAL_WHSE_CLOSED_ERR');
55         APP_EXCEPTION.raise_exception;
56 
57       ELSIF (l_iret = -26) THEN
58         FND_MESSAGE.set_name('GMI', 'INVCAL_TRANS_DATE_ERR');
59         APP_EXCEPTION.raise_exception;
60 
61       ELSIF (l_iret = -27) THEN
62         FND_MESSAGE.set_name('GMI', 'INVCAL_INVALIDORGN_ERR');
63         APP_EXCEPTION.raise_exception;
64 
65       ELSIF (l_iret = -28) THEN
66         FND_MESSAGE.set_name('GMI', 'INVCAL_WHSEPARM_ERR');
67         APP_EXCEPTION.raise_exception;
68 
69       ELSIF (l_iret = -29) THEN
70         FND_MESSAGE.set_name('GMI', 'INVCAL_WHSE_ERR');
71         APP_EXCEPTION.raise_exception;
72 
73       ELSIF (l_iret < -29) THEN
74         FND_MESSAGE.set_name('GMI', 'INVCAL_GENL_ERR');
75         APP_EXCEPTION.raise_exception;
76 
77       END IF;
78 
79     END trans_date_val;
80   /* =============================================
81       PROCEDURE:
82         deviation_val
83 
84       DESCRIPTION:
85         This PL/SQL procedure is responsible for
86         calling the unit of measure deviation function
87         contained in this package and handling all
88         error messaging centrally.
89 
90       SYNOPSIS:
91         GMICVAL.deviation_val(pitem_id, plot_id, pcur_qty,
92                         pcur_uom, pnew_qty, pnew_uom);
93 
94       ============================================= */
95   PROCEDURE deviation_val(pitem_id     NUMBER,
96                           plot_id      NUMBER,
97                           pcur_qty     NUMBER,
98                           pcur_uom     VARCHAR2,
99                           pnew_qty     NUMBER,
100                           pnew_uom     VARCHAR2) IS
101 
102     /* Local variable initialization and
103     declarations.
104     =================================*/
105     l_iret     NUMBER       := -1;
106     l_atomic   NUMBER       :=  0;
107     l_neg_flag NUMBER       :=  0;
108     l_cur_qty  NUMBER       :=  0;
109     l_new_qty  NUMBER       :=  0;
110 
111     BEGIN
112 
113       /* Now let's check for dualum types 2 and 3 deviation
114       if appropriate.
115       ==================================================*/
116       IF(pcur_qty < 0) THEN
117         l_cur_qty := (pcur_qty * -1);
118       ELSE
119         l_cur_qty := pcur_qty;
120       END IF;
121 
122       l_new_qty := pnew_qty;
123 
124       l_iret := GMICVAL.dev_validation(pitem_id, plot_id, l_cur_qty,
125                   pcur_uom, l_new_qty, pnew_uom, l_atomic);
126 
127       IF(l_iret = -68) THEN
128         FND_MESSAGE.set_name('GMI', 'IC_DEVIATION_HI_ERR');
129         APP_EXCEPTION.raise_exception;
130 
131       ELSIF (l_iret = -69) THEN
132         FND_MESSAGE.set_name('GMI', 'IC_DEVIATION_LO_ERR');
133         APP_EXCEPTION.raise_exception;
134       END IF;
135 
136     END deviation_val;
137   /* =============================================
138       PROCEDURE:
139         itm_loct_validation
140 
141       DESCRIPTION:
142         This PL/SQL function is responsible for
143         validating that a location is properly
144         validated.  Please refer to the below grid.
145 
146        XXXXX | whse0 | whse1 | whse2
147        ======= =====================
148        item0 |   0   |  0    |  0        0 = NO control
149        =============================     1 = Location Controlled
150        item1 |   0   |  1    |  2        2 = Non-Validated
151        =============================
152        item2 |   0   |  2    |  2
153 
154       SYNOPSIS:
155         iret := GMICVAL.location_validation(plocation,
156                   pwhse_code,ploct_ctl);
157 
158         plocation   - location to be validated
159         pwhse_code  - warehouse where the location resides.
160         ploct_ctl   - the items loction control indicator
161                       as found in ic_item_mst.
162 
163       RETURNS:
164           0 Success
165         -62 Location is not valid.
166         -65 Warehouse is not valid.
167         -76 Cannot retrieve warehouse controls.
168         -77 System default LOCATION not found.
169         -78 Using default location ERROR.
170         -82 The item is not location controlled.
171       ============================================= */
172   PROCEDURE itm_loct_validation(plocation   VARCHAR2,
173                                 pwhse_code  VARCHAR2,
174                                 ploct_ctl   NUMBER) IS
175 
176     /* Local variable initialization and
177     declarations.
178     =================================*/
179     l_iret  NUMBER := -1;
180 
181     BEGIN
182 
183         l_iret := GMICVAL.itm_location_val(plocation,
184                     pwhse_code, ploct_ctl);
185 
186         IF (l_iret = -62) THEN
187           FND_MESSAGE.set_name('GMI', 'IC_LOCATION_ERR');
188           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
189           APP_EXCEPTION.raise_exception;
190         ELSIF (l_iret = -65) THEN
191           FND_MESSAGE.set_name('GMI', 'IC_WHSE_ERR');
192           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
193           APP_EXCEPTION.raise_exception;
194         ELSIF (l_iret = -76) THEN
195           FND_MESSAGE.set_name('GMI', 'IC_WHSE_CNTLS_ERR');
196           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
197           APP_EXCEPTION.raise_exception;
198         ELSIF (l_iret = -77) THEN
199           FND_MESSAGE.set_name('GMI', 'IC_DEFAULT_LOCT_ERR');
200           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
201           APP_EXCEPTION.raise_exception;
202         ELSIF (l_iret = -78) THEN
203           FND_MESSAGE.set_name('GMI', 'IC_USING_DEFAULT_LOCT_ERR');
204           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
205           APP_EXCEPTION.raise_exception;
206         ELSIF (l_iret = -82) THEN
207           FND_MESSAGE.set_name('GMI', 'IC_NOT_LOCT_CTL_ERR');
208           FND_MESSAGE.set_token('ERRNO', TO_CHAR(l_iret));
209           APP_EXCEPTION.raise_exception;
210         END IF;
211 
212     END itm_loct_validation;
213   /* =============================================
214       FUNCTION:
215         item_val                OVER LOADED FUNCTION!
216 
217       DESCRIPTION:
218         This PL/SQL function is responsible for
219         validating items based on item_id passed.
220         This is an over loaded function call.
221         The second way to call this validation is
222         by item_no. See below function.
223 
224       SYNOPSIS:
225         iret := GMICVAL.item_val(pitem_id);
226 
227         pitem_id     the item surrogate of the item you
228                      are validating.
229 
230       RETURNS:
231           0 Success
232         -75 Reason code not valid.
233       ============================================= */
234   FUNCTION item_val(pitem_id NUMBER)
235     RETURN NUMBER IS
236 
237     /* Cursor Definitions
238     ==================*/
239     CURSOR validate_item IS
240       SELECT item_no
241       FROM   ic_item_mst
242       WHERE  item_id = pitem_id
243       AND    delete_mark = 0;
244 
245     /* Local variables.
246     ================*/
247     l_item_no ic_item_mst.item_no%TYPE;
248 
249     /* ================================================*/
250     BEGIN
251 
252 
253       /* ==================================
254 
255        Initialize Variables
256       ==================== */
257       l_item_no := NULL;
258 
259 
260       OPEN validate_item;
261       FETCH validate_item INTO
262         l_item_no;
263 
264       IF(validate_item%NOTFOUND) THEN
265 
266         CLOSE validate_item;
267         RETURN VAL_ITEM_ERR;
268 
269       END IF;
270       CLOSE validate_item;
271       RETURN 0;
272 
273 
274       EXCEPTION
275         WHEN OTHERS THEN
276 
277           RETURN SQLCODE;
278     END item_val;
279   /* =============================================
280       FUNCTION:
281         item_val                OVER LOADED FUNCTION!
282 
283       DESCRIPTION:
284         This PL/SQL function is responsible for
285         validating items based on item_id passed.
286         This is an over loaded function call.
287         The second way to call this validation is
288         by item_id. See above function.
289 
290       SYNOPSIS:
291         iret := GMICVAL.item_val(pitem_no);
292 
293         pitem_no     the item number of the item you
294                      are validating.
295 
296       RETURNS:
297           0 Success
298         -75 Reason code not valid.
299       ============================================= */
300   FUNCTION item_val(pitem_no VARCHAR2)
301     RETURN NUMBER IS
302 
303     /* Cursor Definitions
304     ==================*/
305     CURSOR validate_item IS
306       SELECT item_id
307       FROM   ic_item_mst
308       WHERE  item_no = UPPER(pitem_no)
309       AND    delete_mark = 0;
310 
311     /* Local variables.
312     ================*/
313     l_item_id item_surg_type;
314 
315     /* ================================================ */
316     BEGIN
317 
318 
319       /* ==================================
320 
321       Initialize Variables
322       ====================*/
323       l_item_id := 0;
324 
325 
326       OPEN validate_item;
327       FETCH validate_item INTO
328         l_item_id;
329 
330       IF(validate_item%NOTFOUND) THEN
331 
332         CLOSE validate_item;
333         RETURN VAL_ITEM_ERR;
334 
335       END IF;
336       CLOSE validate_item;
337       RETURN 0;
338 
339 
340       EXCEPTION
341         WHEN OTHERS THEN
342 
343           RETURN SQLCODE;
344     END item_val;
345   /* =============================================
346       FUNCTION:
347         reason_code_val
348 
349       DESCRIPTION:
350         This PL/SQL function is responsible for
351         validating valid reason codes.
352 
353       SYNOPSIS:
354         iret := GMICVAL.reason_code_val(preason_code);
355 
356         preason_code     the reason code you are working on.
357 
358       RETURNS:
359           0 Success
360         -61 Reason code not valid.
361       ============================================= */
362   FUNCTION reason_code_val(preason_code VARCHAR2)
363     RETURN NUMBER IS
364 
365     /* Cursor Definitions
366     ================== */
367     CURSOR validate_reason IS
368       SELECT reason_desc1
369       FROM   sy_reas_cds
370       WHERE  reason_code = UPPER(preason_code)
371       AND    delete_mark = 0;
372 
373     /* Local variables.
374     ================*/
375     -- Shikha Nagar B2464367 made variable to VARCHAR2(80) from reason_type
376     l_reason_desc1 VARCHAR2(40);
377 
378     BEGIN
379 
380 
381       /* Initialize Variables
382       ==================== */
383       l_reason_desc1 := NULL;
384 
385 
386       OPEN validate_reason;
387       FETCH validate_reason INTO
388         l_reason_desc1;
389 
390       IF(validate_reason%NOTFOUND) THEN
391 
392         CLOSE validate_reason;
393         RETURN VAL_REASONCODE_ERR;
394 
395       END IF;
396       CLOSE validate_reason;
397       RETURN 0;
398 
399 
400       EXCEPTION
401         WHEN OTHERS THEN
402 
403           RETURN SQLCODE;
404     END reason_code_val;
405   /* =============================================
406       FUNCTION:
407         itm_location_val
408 
409       DESCRIPTION:
410         This PL/SQL function is responsible for
411         validating an items inventory location.
412 
413       SYNOPSIS:
414         iret := GMICVAL.itm_location_val(plocation, pwhse_code,
415                   ploct_ctl);
416 
417         plocation  the location you are working on.
418         pwhse_code the warehouse associated with the location.
419         ploct_ctl  The location control of the item.
420 
421       RETURNS:
422         -62 Location is not valid.
423         -65 Warehouse is not valid.
424         -76 Cannot retrieve warehouse controls.
425         -77 System default LOCATION not found.
426         -78 Using default location ERROR.
427         -82 The item is not location controlled.
428           0 Success
429       ============================================= */
430   FUNCTION itm_location_val(plocation  VARCHAR2,
431                             pwhse_code VARCHAR2,
432                             ploct_ctl  NUMBER)
433     RETURN NUMBER IS
434 
435     /* Local Variable declaration:
436     ===========================*/
437     --l_loct_desc   ic_loct_mst.loct_desc%TYPE; -- Bug 3585309
438     l_location      ic_loct_mst.location%TYPE;  -- Bug 3585309
439     l_default_loct  ic_loct_mst.location%TYPE;
440     l_whse_loct_ctl ic_whse_mst.loct_ctl%TYPE;
441     l_whse          ic_whse_mst.whse_code%TYPE;
442 
443     /* Cursor Definitions
444     ==================*/
445     CURSOR validate_whse IS
446       SELECT whse_code
447       FROM   ic_whse_mst
448       WHERE  whse_code = UPPER(pwhse_code)
449       AND    delete_mark = 0;
450 
451     CURSOR validate_location IS
452       SELECT location
453       FROM   ic_loct_mst
454       WHERE  location = UPPER(plocation)
455       AND    whse_code = UPPER(pwhse_code)
456       AND    delete_mark = 0;
457 
458     CURSOR get_whse_ctl IS
459       SELECT loct_ctl
460       FROM   ic_whse_mst
461       WHERE  whse_code = UPPER(pwhse_code);
462 
463     BEGIN
464 
465 
466       /* ==================================
467       Initialize local Variables
468       ==================================*/
469       --l_loct_desc   := NULL; -- Bug 3585309
470       l_location      := NULL;
471       l_default_loct  := NULL;
472       l_whse          := NULL;
473       l_whse_loct_ctl := 0;
474 
475       /* Is the item location controlled?
476       If not this is an error.
477       =============================================*/
478       IF(ploct_ctl = 0) THEN
479         RETURN VAL_NOTLOCATION_CTL_ERR;
480       END IF;
481 
482       /* ========================================
483       OK .. First determine if the warehouse
484       code passed is valid.
485       ========================================== */
486       OPEN validate_whse;
487       FETCH validate_whse INTO
488         l_whse;
489       IF(validate_whse%NOTFOUND) THEN
490 
491         CLOSE validate_whse;
492         RETURN VAL_WHSE_ERR;
493 
494       END IF;
495       CLOSE validate_whse;
496 
497       /* ========================================
498       OK .. Second determine the type of location
499       control we have for the warehouse.
500       ========================================== */
501       OPEN get_whse_ctl;
502       FETCH get_whse_ctl INTO
503         l_whse_loct_ctl;
504       IF(get_whse_ctl%NOTFOUND) THEN
505 
506         CLOSE get_whse_ctl;
507         RETURN VAL_CONTROLS_ERR;
508 
509       END IF;
510       CLOSE get_whse_ctl;
511 
512       /* OK .. first let's get the system default
513       location BUSINESS RULE. NO LOCATION BEING
514       VALIDATED MAY HAVE THE SAME LOCATION AS
515       THE SYSTEM DEFAULT LOCATION.
516       ========================================== */
517       l_default_loct := FND_PROFILE.value('IC$DEFAULT_LOCT');
518 
519       IF(l_default_loct IS NULL) THEN
520 
521         RETURN VAL_DEFAULT_LOCT_ERR;
522       END IF;
523 
524       IF((ploct_ctl = 1 AND l_whse_loct_ctl = 2) OR
525          (l_whse_loct_ctl > 1)) THEN
526         /* ========================================
527         NON Validated Location
528         Let it go.
529         ========================================*/
530 
531         IF(plocation = l_default_loct) THEN
532           RETURN VAL_USING_DEFAULT_ERR;
533         END IF;
534         RETURN 0;
535       END IF;
536 
537       /* If the location passed is the same
538       as the default location, do not bother
539       validating cause this is an error!
540       ====================================== */
541       IF(plocation = l_default_loct) THEN
542 
543         RETURN VAL_USING_DEFAULT_ERR;
544       END IF;
545 
546       /* Validate please!
547       ================ */
548       OPEN validate_location;
549       FETCH validate_location INTO
550         l_location;
551 
552       IF(validate_location%NOTFOUND) THEN
553 
554         CLOSE validate_location;
555         RETURN VAL_LOCATION_ERR;
556 
557       END IF;
558       CLOSE validate_location;
559 
560       -- Bug 3585309
561       -- Commented the following as desc is a nullable field.
562       --IF(l_loct_desc IS NULL) THEN
563       -- RETURN VAL_LOCATION_ERR;
564       --END IF;
565 
566       RETURN 0;
567 
568 
569       EXCEPTION
570         WHEN OTHERS THEN
571 
572           RETURN SQLCODE;
573     END itm_location_val;
574   /* =============================================
575       FUNCTION:
576         whse_location_val
577 
578       DESCRIPTION:
579         This PL/SQL function is responsible for
580         validating an location in a particular warehouse.
581 
582       SYNOPSIS:
583         iret := GMICVAL.whse_location_val(porgn_code, pwhse_code,
584                   plocation);
585 
586         porgn_code the organization associated to the whse.
587         pwhse_code the warehouse associated with the location.
588         plocation  The location in the warehouse.
589 
590       RETURNS:
591           0 Success
592         -62 Location is not valid.
593         -65 Warehouse is not valid.
594         -77 System default LOCATION not found.
595         -78 Using default location ERROR.
596       ============================================= */
597   FUNCTION whse_location_val(porgn_code   VARCHAR2,
598                              pwhse_code   VARCHAR2,
599                              plocation    VARCHAR2)
600     RETURN NUMBER IS
601 
602     /* Local Variable declaration:
603     =========================== */
604     --l_loct_desc     ic_loct_mst.loct_desc%TYPE; -- Bug 3585309
605     l_location      ic_loct_mst.location%TYPE;    -- Bug 3585309
606     l_default_loct  ic_loct_mst.location%TYPE;
607     l_whse_loct_ctl ic_whse_mst.loct_ctl%TYPE;
608     l_whse          ic_whse_mst.whse_code%TYPE;
609 
610     /* Cursor Definitions
611     ================== */
612     CURSOR validate_whse IS
613       SELECT whse_code
614       FROM   ic_whse_mst
615       WHERE  whse_code = UPPER(pwhse_code)
616       AND    orgn_code = UPPER(porgn_code)
617       AND    delete_mark = 0;
618 
619     CURSOR validate_location IS
620       SELECT location
621       FROM   ic_loct_mst
622       WHERE  location = UPPER(plocation)
623       AND    whse_code = UPPER(pwhse_code)
624       AND    delete_mark = 0;
625 
626     BEGIN
627 
628 
629       /* ==================================
630       Initialize local Variables
631       ================================== */
632       --l_loct_desc   := NULL; -- Bug 3585309
633       l_location      := NULL;
634       l_default_loct  := NULL;
635       l_whse          := NULL;
636       l_whse_loct_ctl := 0;
637 
638       /* ========================================
639       OK .. First determine if the warehouse
640       code passed is valid.
641       ========================================== */
642       OPEN validate_whse;
643       FETCH validate_whse INTO
644         l_whse;
645       IF(validate_whse%NOTFOUND) THEN
646 
647         CLOSE validate_whse;
648         RETURN VAL_WHSE_ERR;
649 
650       END IF;
651       CLOSE validate_whse;
652 
653       /* OK .. first let's get the system default
654       location BUSINESS RULE. NO LOCATION BEING
655       VALIDATED MAY HAVE THE SAME LOCATION AS
656       THE SYSTEM DEFAULT LOCATION.
657       ========================================== */
658       l_default_loct := FND_PROFILE.value('IC$DEFAULT_LOCT');
659 
660       IF(l_default_loct IS NULL) THEN
661 
662         RETURN VAL_DEFAULT_LOCT_ERR;
663       END IF;
664 
665       IF(plocation = l_default_loct) THEN
666 
667         RETURN VAL_USING_DEFAULT_ERR;
668       END IF;
669 
670       OPEN validate_location;
671       FETCH validate_location INTO
672         l_location;
673 
674       IF(validate_location%NOTFOUND) THEN
675 
676         CLOSE validate_location;
677         RETURN VAL_LOCATION_ERR;
678 
679       END IF;
680       CLOSE validate_location;
681 
682       -- Bug 3585309
683       -- Commented the following as desc is a nullable field.
684       --IF(l_loct_desc IS NULL) THEN
685       -- RETURN VAL_LOCATION_ERR;
686       --END IF;
687 
688       RETURN 0;
689 
690 
691       EXCEPTION
692         WHEN OTHERS THEN
693 
694           RETURN SQLCODE;
695     END whse_location_val;
696   /* =============================================
697       FUNCTION:
698         grade_val
699 
700       DESCRIPTION:
701         This PL/SQL function is responsible for
702         validating an item's QC grade.
703 
704       SYNOPSIS:
705         iret := GMICVAL.grade_val(pqc_grade);
706 
707         pqc_grade     the QC grade of an item.
708 
709       RETURNS:
710         -63 QC Grade is not valid.
711           0 Success
712       ============================================= */
713   FUNCTION grade_val(pqc_grade  VARCHAR2)
714     RETURN NUMBER IS
715 
716     /* Cursor Definitions
717     ================== */
718     CURSOR validate_grade IS
719       SELECT qc_grade_desc
720       FROM   qc_grad_mst
721       WHERE  qc_grade = UPPER(pqc_grade)
722       AND    delete_mark = 0;
723 
724     /* Local Variable Declaration:
725     =========================== */
726     l_qc_grade_desc  qc_grad_mst.qc_grade_desc%TYPE;
727 
728 
729     BEGIN
730 
731 
732       /* Initialize Local Variables
733        ========================== */
734 
735       l_qc_grade_desc := NULL;
736 
737 
738       OPEN validate_grade;
739       FETCH validate_grade INTO
740         l_qc_grade_desc;
741 
742       IF(validate_grade%NOTFOUND) THEN
743 
744         CLOSE validate_grade;
745         RETURN VAL_GRADE_ERR;
746 
747       END IF;
748       CLOSE validate_grade;
749       RETURN 0;
750 
751 
752       EXCEPTION
753         WHEN OTHERS THEN
754 
755           RETURN SQLCODE;
756     END grade_val;
757    /* =============================================
758       FUNCTION:
759         lot_status_val
760 
761       DESCRIPTION:
762         This PL/SQL function is responsible for
763         validating the lot status of a lot controlled
764         and lot status controlled item.
765 
766       SYNOPSIS:
767         iret := GMICVAL.lot_status_val(plot_status);
768 
769         pclot_status  the Lot Status of the item.
770 
771       RETURNS:
772         -64 Lot Status is not valid.
773           0 Success
774       ============================================= */
775   FUNCTION lot_status_val(plot_status  VARCHAR2)
776     RETURN NUMBER IS
777 
778     /* Cursor Definitions
779     ================== */
780     CURSOR validate_status IS
781       SELECT status_desc
782       FROM   ic_lots_sts
783       WHERE  lot_status = UPPER(plot_status)
784       AND    delete_mark = 0;
785 
786     /* Local Variable Declaration:
787     =========================== */
788     l_status_desc  ic_lots_sts.status_desc%TYPE;
789 
790 
791     BEGIN
792 
793 
794       /* ==================================
795       Local Variable Initialization
796       ============================= */
797       l_status_desc := NULL;
798 
799 
800       OPEN validate_status;
801       FETCH validate_status INTO
802         l_status_desc;
803 
804       IF(validate_status%NOTFOUND) THEN
805 
806         CLOSE validate_status;
807         RETURN VAL_LOTSTATUS_ERR;
808 
809       END IF;
810       CLOSE validate_status;
811       RETURN 0;
812 
813 
814       EXCEPTION
815         WHEN OTHERS THEN
816 
817           RETURN SQLCODE;
818     END lot_status_val;
819   /* =============================================
820       FUNCTION:
821         whse_val
822 
823       DESCRIPTION:
824         This PL/SQL function is responsible for
825         validating valid warehouse codes.
826 
827       SYNOPSIS:
828         iret := GMICVAL.whse_val(pwhse_code, porgn_code);
829 
830         pwhse_code     the warehouse code you are working on.
831         porgn_code     The organization associated with the
832                        warehouse being validated.
833 
834       RETURNS:
835         -65 Reason code not valid.
836           0 Success
837       ============================================= */
838   FUNCTION whse_val(pwhse_code VARCHAR2, porgn_code VARCHAR2)
839     RETURN NUMBER IS
840 
841     /* Cursor Definitions
842     ================== */
843     CURSOR validate_whse IS
844       SELECT whse_code
845       FROM   ic_whse_mst
846       WHERE  whse_code = UPPER(pwhse_code)
847       AND    orgn_code = UPPER(porgn_code)
848       AND    delete_mark = 0;
849 
850     /* Local variables.
851     ================ */
852     l_whse_code whse_type;
853 
854     BEGIN
855 
856 
857       /* ==================================
858 
859       Initialize Variables
860       ==================== */
861       l_whse_code := NULL;
862 
863 
864       OPEN validate_whse;
865       FETCH validate_whse INTO
866         l_whse_code;
867 
868       IF(validate_whse%NOTFOUND) THEN
869 
870         CLOSE validate_whse;
871         RETURN VAL_WHSE_ERR;
872 
873       END IF;
874       CLOSE validate_whse;
875 
876       IF(l_whse_code IS NULL) THEN
877         RETURN VAL_WHSE_ERR;
878       END IF;
879 
880       RETURN 0;
881 
882 
883       EXCEPTION
884         WHEN OTHERS THEN
885 
886           RETURN SQLCODE;
887     END whse_val;
888   /* =============================================
889       FUNCTION:
890         lot_validate
891 
892       DESCRIPTION:
893         This PL/SQL function is responsible for
894         validating valid lot surrogates, lot numbers,
895         sulot numbers or combinations.
896 
897       SYNOPSIS:
898         iret := GMICVAL.lot_validate(pitem_no, plot_no, psublot_no);
899 
900         pitem_no     the item number are working on.
901         plot_no      the lot number you want to validate.
902         psublot_no   the sublot number you want to validate.
903 
904       RETURNS:
905         -66 Reason code not valid.
906           0 Success
907       ============================================= */
908   FUNCTION lot_validate(pitem_no VARCHAR2, plot_no VARCHAR2,
909                         psublot_no VARCHAR2)
910     RETURN NUMBER IS
911 
912     /* Local variables.
913     ================ */
914     l_item_id    ic_item_mst.item_id%TYPE;
915     l_lot_ctl    ic_item_mst.lot_ctl%TYPE;
916     l_sublot_ctl ic_item_mst.sublot_ctl%TYPE;
917     l_lot_id     ic_lots_mst.lot_id%TYPE;
918 
919 
920     CURSOR get_item_attributes IS
921       SELECT item_id, lot_ctl, sublot_ctl
922       FROM   ic_item_mst
923       WHERE  item_no = UPPER(pitem_no)
924       AND    delete_mark = 0;
925 
926     CURSOR validate_lot IS
927       SELECT lot_id
928       FROM   ic_lots_mst
929       where  item_id = l_item_id
930       AND    lot_no  = UPPER(plot_no)
931       AND    delete_mark = 0;
932 
933     CURSOR validate_sublot IS
934       SELECT lot_id
935       FROM   ic_lots_mst
936       WHERE  item_id = l_item_id
937       AND    lot_no  = UPPER(plot_no)
938       AND    sublot_no = UPPER(psublot_no)
939       AND    delete_mark = 0;
940 
941 
942     BEGIN
943 
944 
945       /* ==================================
946 
947       Initialize Variables
948       ==================== */
949       l_item_id := 0;
950       l_lot_id  := 0;
951       l_lot_ctl := 0;
952       l_sublot_ctl := 0;
953 
954 
955       OPEN get_item_attributes;
956       FETCH get_item_attributes INTO
957         l_item_id, l_lot_ctl, l_sublot_ctl;
958 
959       IF(get_item_attributes%NOTFOUND) THEN
960 
961         CLOSE get_item_attributes;
962         RETURN VAL_ITEMATTR_ERR;
963 
964       END IF;
965       CLOSE get_item_attributes;
966 
967       IF(l_lot_ctl = 0) THEN
968         RETURN VAL_NOTLOT_CTL_ERR;
969       END IF;
970 
971       IF(l_lot_ctl = 1 AND plot_no IS NULL) THEN
972         RETURN VAL_LOT_PARM_ERR;
973       END IF;
974 
975       IF(l_lot_ctl = 1 AND l_sublot_ctl = 0) THEN
976         OPEN validate_lot;
977         FETCH validate_lot INTO
978         l_lot_id;
979 
980         IF(validate_lot%NOTFOUND) THEN
981 
982           CLOSE validate_lot;
983           RETURN VAL_LOT_ERR;
984         END IF;
985 
986       CLOSE validate_lot;
987       RETURN 0;
988 
989       ELSIF(l_lot_ctl = 1 AND l_sublot_ctl = 1) THEN
990         /* =========================================
991         BUSINESS RULE:
992         If a sublot controlled item is passed a
993         NULL sublot, only validate the lot number
994         ========================================= */
995         IF(psublot_no IS NULL OR psublot_no = ' ') THEN
996           OPEN validate_lot;
997           FETCH validate_lot INTO
998           l_lot_id;
999 
1000           IF(validate_lot%NOTFOUND) THEN
1001 
1002             CLOSE validate_lot;
1003             RETURN VAL_LOT_ERR;
1004           END IF;
1005 
1006           CLOSE validate_lot;
1007           RETURN 0;
1008         ELSE
1009           /* =======================================
1010           Perform normal sublot validation.
1011           ======================================= */
1012           OPEN validate_sublot;
1013           FETCH validate_sublot INTO
1014           l_lot_id;
1015 
1016           IF(validate_sublot%NOTFOUND) THEN
1017 
1018             CLOSE validate_sublot;
1019             RETURN VAL_SUBLOT_ERR;
1020           END IF;
1021 
1022           CLOSE validate_sublot;
1023           RETURN 0;
1024         END IF;
1025       END IF;
1026 
1027       EXCEPTION
1028         WHEN OTHERS THEN
1029 
1030           RETURN SQLCODE;
1031     END lot_validate;
1032   /* =============================================
1033       FUNCTION:
1034         lot_validate
1035 
1036       DESCRIPTION:
1037         This PL/SQL function is responsible for
1038         validating valid lot surrogates, lot numbers,
1039         sulot numbers or combinations.
1040 
1041       SYNOPSIS:
1042         iret := GMICVAL.lot_validate(pitem_no, plot_no, psublot_no);
1043 
1044         pitem_no     the item number are working on.
1045         plot_no      the lot number you want to validate.
1046         psublot_no   the sublot number you want to validate.
1047 
1048       RETURNS:
1049         -66 Reason code not valid.
1050           0 Success
1051       ============================================= */
1052   FUNCTION lot_validate(pitem_id NUMBER,
1053                         plot_id  NUMBER)
1054     RETURN NUMBER IS
1055 
1056     /* Local variables.
1057     ================ */
1058     l_item_id    ic_item_mst.item_id%TYPE;
1059     l_lot_ctl    ic_item_mst.lot_ctl%TYPE;
1060     l_sublot_ctl ic_item_mst.sublot_ctl%TYPE;
1061     l_lot_id     ic_lots_mst.lot_id%TYPE;
1062     /* Cursor Definitions
1063 
1064 
1065     ================== */
1066     CURSOR get_item_attributes IS
1067       SELECT item_id, lot_ctl, sublot_ctl
1068       FROM   ic_item_mst
1069       WHERE  item_no = UPPER(pitem_id)
1070       AND    delete_mark = 0;
1071 
1072     CURSOR validate_lot IS
1073       SELECT lot_id
1074       FROM   ic_lots_mst
1075       where  item_id = pitem_id
1076       AND    lot_id  = plot_id
1077       AND    delete_mark = 0;
1078 
1079     BEGIN
1080 
1081 
1082       /* ==================================
1083 
1084       Initialize Variables
1085       ==================== */
1086       l_item_id := 0;
1087       l_lot_id  := 0;
1088       l_lot_ctl := 0;
1089       l_sublot_ctl := 0;
1090 
1091 
1092       OPEN get_item_attributes;
1093       FETCH get_item_attributes INTO
1094         l_item_id, l_lot_ctl, l_sublot_ctl;
1095 
1096       IF(get_item_attributes%NOTFOUND) THEN
1097 
1098         CLOSE get_item_attributes;
1099         RETURN VAL_ITEMATTR_ERR;
1100 
1101       END IF;
1102       CLOSE get_item_attributes;
1103 
1104       IF(l_lot_ctl = 0) THEN
1105         RETURN VAL_NOTLOT_CTL_ERR;
1106       END IF;
1107 
1108 
1109       IF(l_lot_ctl = 1) THEN
1110         OPEN validate_lot;
1111         FETCH validate_lot INTO
1112         l_lot_id;
1113 
1114         IF(validate_lot%NOTFOUND) THEN
1115 
1116           CLOSE validate_lot;
1117           RETURN VAL_LOT_ERR;
1118         END IF;
1119       END IF;
1120       CLOSE validate_lot;
1121       RETURN 0;
1122 
1123       EXCEPTION
1124         WHEN OTHERS THEN
1125 
1126           RETURN SQLCODE;
1127     END lot_validate;
1128   /* =============================================
1129       FUNCTION:
1130         co_code_val
1131 
1132       DESCRIPTION:
1133         This PL/SQL function is responsible for
1134         validating that an organization passed is
1135         a company.
1136 
1137       SYNOPSIS:
1138         iret := GMICVAL.co_code_val(porgn_code);
1139 
1140         porgn_code   the organization code you are working on.
1141 
1142       RETURNS:
1143        <-79 RDBMS Oracle Error.
1144         -79 The orgnization code passed is not valid.
1145          0 Success
1146       ============================================= */
1147   FUNCTION co_code_val(porgn_code VARCHAR2)
1148     RETURN NUMBER IS
1149 
1150     /* Cursor Definitions
1151     ================== */
1152     CURSOR validate_orgn IS
1153       SELECT orgn_name
1154       FROM   sy_orgn_mst
1155       WHERE  co_code   = UPPER(porgn_code)
1156       AND    orgn_code = UPPER(porgn_code)
1157       AND    delete_mark = 0;
1158 
1159     /* Local variables.
1160     ================ */
1161     l_orgn_name sy_orgn_mst.orgn_name%TYPE;
1162 
1163     BEGIN
1164 
1165 
1166       /* ==================================
1167 
1168       Initialize Variables
1169       ==================== */
1170       l_orgn_name := NULL;
1171 
1172 
1173       OPEN validate_orgn;
1174       FETCH validate_orgn INTO
1175         l_orgn_name;
1176 
1177       IF(validate_orgn%NOTFOUND) THEN
1178 
1179         CLOSE validate_orgn;
1180         RETURN VAL_CO_CODE_ERR;
1181 
1182       END IF;
1183       CLOSE validate_orgn;
1184 
1185       IF(l_orgn_name IS NULL) THEN
1186         RETURN VAL_CO_CODE_ERR;
1187       END IF;
1188 
1189       RETURN 0;
1190 
1191 
1192       EXCEPTION
1193         WHEN OTHERS THEN
1194 
1195           RETURN SQLCODE;
1196     END co_code_val;
1197   /* =============================================
1198       FUNCTION:
1199         orgn_code_val
1200 
1201       DESCRIPTION:
1202         This PL/SQL function is responsible for
1203         validating organizations.
1204 
1205       SYNOPSIS:
1206         iret := GMICVAL.orgn_code_val(porgn_code);
1207 
1208         porgn_code     the orgn_code you are working on.
1209 
1210       RETURNS:
1211        <-80 RDBMS Oracle Error.
1212         -80 The orgn_code passed is not valid.
1213          0 Success
1214       ============================================= */
1215   FUNCTION orgn_code_val(porgn_code VARCHAR2)
1216     RETURN NUMBER IS
1217 
1218     /* Cursor Definitions
1219     ================== */
1220     CURSOR validate_orgn IS
1221       SELECT orgn_name
1222       FROM   sy_orgn_mst
1223       WHERE  orgn_code  = UPPER(porgn_code)
1224       AND    delete_mark = 0;
1225 
1226     /* Local variables.
1227     ================ */
1228     l_orgn_name sy_orgn_mst.orgn_name%TYPE;
1229 
1230     BEGIN
1231 
1232 
1233       /* ==================================
1234 
1235       Initialize Variables
1236       ==================== */
1237       l_orgn_name := NULL;
1238 
1239 
1240       OPEN validate_orgn;
1241       FETCH validate_orgn INTO
1242         l_orgn_name;
1243 
1244       IF(validate_orgn%NOTFOUND) THEN
1245 
1246         CLOSE validate_orgn;
1247         RETURN VAL_ORGN_CODE_ERR;
1248 
1249       END IF;
1250       CLOSE validate_orgn;
1251 
1252       IF(l_orgn_name IS NULL) THEN
1253         RETURN VAL_ORGN_CODE_ERR;
1254       END IF;
1255 
1256       RETURN 0;
1257 
1258 
1259       EXCEPTION
1260         WHEN OTHERS THEN
1261 
1262           RETURN SQLCODE;
1263     END orgn_code_val;
1264   /* =============================================
1265       FUNCTION:
1266         uomcode_val
1267 
1268       DESCRIPTION:
1269         This PL/SQL function is responsible for
1270         validating a unit of measure code (ie. LBS).
1271 
1272       SYNOPSIS:
1273         iret := GMICVAL.uomcode_val(puom_code);
1274 
1275         puom_code the uom code you are working on.
1276 
1277       RETURNS:
1278        <-81 RDBMS Oracle Error.
1279         -81 The UOM CODE passed is not valid.
1280          0 Success
1281       ============================================= */
1282   FUNCTION uomcode_val(puom_code VARCHAR2)
1283     RETURN NUMBER IS
1284 
1285     /* Cursor Definitions
1286     ================== */
1287     CURSOR validate_uomcode IS
1288       SELECT um_desc
1289       FROM   sy_uoms_mst
1290       WHERE  um_code  = puom_code
1291       AND    delete_mark = 0;
1292 
1293     /* Local variables.
1294     ================ */
1295     l_um_desc sy_uoms_mst.um_desc%TYPE;
1296 
1297     BEGIN
1298 
1299 
1300       /* ==================================
1301 
1302       Initialize Variables
1303       ==================== */
1304       l_um_desc := NULL;
1305 
1306 
1307       OPEN validate_uomcode;
1308       FETCH validate_uomcode INTO
1309         l_um_desc;
1310 
1311       IF(validate_uomcode%NOTFOUND) THEN
1312 
1313         CLOSE validate_uomcode;
1314         RETURN VAL_UOMCODE_ERR;
1315 
1316       END IF;
1317       CLOSE validate_uomcode;
1318 
1319       IF(l_um_desc IS NULL) THEN
1320         RETURN VAL_UOMCODE_ERR;
1321       END IF;
1322 
1323       RETURN 0;
1324 
1325 
1326       EXCEPTION
1327         WHEN OTHERS THEN
1328 
1329           RETURN SQLCODE;
1330     END uomcode_val;
1331   /* =============================================
1332       FUNCTION:
1333         dev_validation
1334 
1335       DESCRIPTION:
1336         This PL/SQL function is responsible for
1337         dualum indicator type 2 and 3 ONLY!
1338 
1339         The purpose of the function is to validate
1340         that the secondary quantity is within the
1341         standard deviation high and low for an item
1342         as defined by the item in the ic_item_mst table.
1343 
1344       PARAMETERS:
1345         pitem_id     The surrogate key of the item number
1346 
1347         plot_id      The surrogate key for the lot number/
1348                      sublot of the item number being converted.
1349 
1350         ptrans_qty1  The quantity in the primary UOM for the
1351                      item.
1352 
1353         pprim_uom    The UOM of trans_qty1.
1354 
1355         ptrans_qty2  The quantity in the secondary UOM for the
1356                      item.
1357         psec_uom     The UOM of trans_qty2.
1358 
1359         patomic      Flag to signify if integer or full
1360                      conversion with percision should be performed.
1361                        0 - Full percision
1362                        1 - Integer conversion.
1363 
1364       SPECIAL NOTES:
1365 
1366       RETURNS:
1367         0 - SUCCESS
1368        -1 - Package problem.
1369        -2 - Lab Type not passed for LAB conversion.
1370        -3 - UM_TYPE and conversion factor for current UOM not found.
1371        -4 - UM_TYPE and conversion factor for NEW UOM not found.
1372        -5 - Cannot determine INVENTORY UOM for item.
1373        -6 - UM_TYPE and conversion factor for INV UOM not found.
1374        -7 - Cannot find conversion factor for CURRENT UOM.
1375        -8 - LAB CONVERSION - LM$DENSITY variable not found.
1376        -9 - LAB CONVERSION - conversion factor not found.
1377       -10 - Cannot find conversion factor for NEW UOM.
1378       -11 - Package/Security Issue to gmicitm Package.
1379       -12 - Package/Security Issue to gmicuom Package.
1380       -13 - Quantity is GREATER than allowed deviation.
1381       -14 - Quantity is LESS THAN allowed deviation.
1382 
1383       HISTORY:
1384       WJ Harris III 26-JUN-98 rel 4.01.06
1385       Changes to function dev_validation().
1386       Added parameters pprim_uom and psec_uom.
1387       Removed all references to OUT type parameters as
1388       well as rewriting functionality.
1389       ============================================= */
1390   FUNCTION dev_validation(pitem_id    NUMBER,
1391                           plot_id     NUMBER,
1392                           ptrans_qty1 NUMBER,
1393                           pprim_uom   VARCHAR2,
1394                           ptrans_qty2 NUMBER,
1395                           psec_uom    VARCHAR2,
1396                           patomic     NUMBER)
1397     RETURN NUMBER IS
1398 
1399     /* Variable Declarations
1400     ===================== */
1401     l_converted_qty   quantity_type;
1402     l_iret            NUMBER;
1403     BEGIN
1404 
1405     /* ===============================
1406     Initialize Variables
1407     =============================== */
1408     l_converted_qty  := 0;
1409     l_iret           := -1;
1410 
1411 
1412     /* ============================================
1413     OK .... first let's go out and grab the
1414     required attributes we need for the item.
1415     ============================================ */
1416     l_iret := GMICVAL.det_dualum_ind(pitem_id);
1417 
1418     IF(l_iret < -1) THEN
1419       RETURN l_iret;
1420     ELSIF(l_iret = -1) THEN
1421       RETURN VAL_PACKAGE_ERR;
1422     END IF;
1423 
1424     /* =================================================
1425     If the item is either NOT DUAL controlled or DUAL
1426     Controlled type one .... we have nothing to do!.
1427     ================================================= */
1428     IF(l_iret = 0 OR l_iret = 1) THEN
1429       RETURN 0;
1430     END IF;
1431 
1432     /* ==================================================
1433     Next .... let's perform  a unit of measure
1434     conversion to determine the base converted amount.
1435     ================================================== */
1436     l_iret := -1;
1437     l_iret := GMICUOM.uom_conversion(pitem_id, plot_id,
1438                 ptrans_qty1, pprim_uom, psec_uom, patomic);
1439 
1440     IF(l_iret < -1) THEN
1441       RETURN l_iret;
1442     ELSIF(l_iret = -1) THEN
1443       RETURN VAL_PACKAGE_ERR;
1444     END IF;
1445 
1446     /* ======================================================
1447     If the passed in secondary quantity is greater than
1448     the deviation high boundary OR less than the deviation
1449     low boundary, we have an error!
1450     ====================================================== */
1451     l_converted_qty := l_iret;
1452     l_iret := -1;
1453     l_iret := GMICVAL.calc_deviation(pitem_id, ptrans_qty2,
1454                                      l_converted_qty);
1455 
1456     IF(l_iret = VAL_CALCDEV_HIGH_ERR) THEN
1457       RETURN l_iret;
1458     ELSIF(l_iret = VAL_CALCDEV_LO_ERR) THEN
1459       RETURN l_iret;
1460     ELSIF(l_iret = -1) THEN
1461       RETURN VAL_PACKAGE_ERR;
1462     END IF;
1463 
1464     RETURN 0;
1465 
1466     EXCEPTION
1467       WHEN OTHERS THEN
1468 
1469       RETURN SQLCODE;
1470     END dev_validation;
1471   /* =============================================
1472       FUNCTION:
1473         det_dualum_ind
1474 
1475       DESCRIPTION:
1476         This PL/SQL function is responsible for
1477         returning  the dual unit of measure indicator
1478         of an item.
1479 
1480       SYNOPSIS:
1481         iret := GMICVAL.det_dualum_ind(pitem_id);
1482 
1483         pitem_id     the item surrogate you are working on.
1484         iodualum_ind The dual UOM indicator of the item.
1485                      Valid values are:
1486                      o 0 - Denotes single UOM controlled.
1487                      o 1 - Denotes Dual UOM auto calculated.
1488                      o 2 - Denotes Dual UOM auto calculated.
1489                      o 3 - Denotes Dual UOM entry required.
1490 
1491         SPECIAL NOTE:
1492         DUALUM 2 is auto calculated by the system HOWEVER allows
1493         the user to modify the quantity which is then compared to a
1494         high/low deviation.  If the quantity entered by the
1495         user is outside these boundaries, this is an error.
1496 
1497         DUALUM 3 requires entry from the user.  NO CALCULATION IS
1498         DONE BY THE SYSTEM.  The quantity entered is then
1499         validated the same as DUALUM 2.
1500 
1501       RETURNS:
1502         -67 Whse code not passed.
1503          >0 Success
1504       ============================================= */
1505   FUNCTION det_dualum_ind(pitem_id    NUMBER)
1506     RETURN NUMBER IS
1507 
1508     /* Local variable definitions
1509     ========================== */
1510     l_dualum_ind dualum_type;
1511 
1512     /* Cursor Definitions
1513     ================== */
1514     CURSOR item_uom_attr IS
1515       SELECT dualum_ind
1516       FROM   ic_item_mst
1517       WHERE  item_id = pitem_id
1518       AND    delete_mark = 0;
1519 
1520     BEGIN
1521 
1522 
1523       OPEN item_uom_attr;
1524       FETCH item_uom_attr INTO
1525         l_dualum_ind;
1526 
1527       IF(item_uom_attr%NOTFOUND) THEN
1528 
1529         CLOSE item_uom_attr;
1530         RETURN VAL_DUALUM_ERR;
1531 
1532       END IF;
1533       CLOSE item_uom_attr;
1534 
1535       RETURN l_dualum_ind;
1536 
1537 
1538       EXCEPTION
1539         WHEN OTHERS THEN
1540 
1541           RETURN SQLCODE;
1542     END det_dualum_ind;
1543   /* =============================================
1544       FUNCTION:
1545         calc_deviation
1546 
1547       DESCRIPTION:
1548         This PL/SQL function is responsible for
1549         determining whether an entered quantity
1550         is within the allowable deviation + or -
1551         of an item.
1552 
1553       SYNOPSIS:
1554         iret := GMICVAL.calc_deviation(pitem_id, ptrans_qty2,
1555                                        pconverted_qty);
1556 
1557         pitem_id     the item surrogate you are working on.
1558         ptrans_qty2  the secondary quantity entered by the user.
1559         pconverted_qty the system calculated secondary quantity.
1560 
1561         SPECIAL NOTE:
1562         l_dev_hi     The returned high boundary for allowed
1563                      deviation percentage expressed as a decimal.
1564                      (ie 20% is represented as .20)
1565         l_dev_lo     The returned low boundary for allowed
1566                      deviation percentage expressed as a decimal.
1567                      (ie 20% is represented as .20)
1568 
1569         DUALUM 2 is auto calculated by the system HOWEVER allows
1570         the user to modify the quantity which is then compared to a
1571         high/low deviation.  If the quantity entered by the
1572         user is outside these boundaries, this is an error.
1573 
1574         DUALUM 3 requires entry from the user.  NO CALCULATION IS
1575         DONE BY THE SYSTEM.  The quantity entered is then
1576         validated the same as DUALUM 2.
1577 
1578       RETURNS:
1579         -1 Whse code not passed.
1580        > 0 Success
1581       ============================================= */
1582   FUNCTION calc_deviation(pitem_id       NUMBER,
1583                           ptrans_qty2    NUMBER,
1584                           pconverted_qty NUMBER)
1585     RETURN NUMBER IS
1586 
1587     /* Local variable definitions
1588     ========================== */
1589     l_deviation_hi      dev_type;
1590     l_deviation_lo      dev_type;
1591     l_hi_boundary NUMBER;
1592     l_lo_boundary NUMBER;
1593     ltrans_qty2   NUMBER;
1594 
1595 
1596     /* Cursor Definitions
1597     ================== */
1598     CURSOR item_uom_attr IS
1599       SELECT deviation_hi, deviation_lo
1600       FROM   ic_item_mst
1601       WHERE  item_id = pitem_id
1602       AND    delete_mark = 0;
1603 
1604     BEGIN
1605 
1606       /* Local Variable Initialization
1607       ============================= */
1608       l_deviation_hi      := 0.0;
1609       l_deviation_lo      := 0.0;
1610       l_hi_boundary := 0;
1611       l_lo_boundary := 0;
1612 
1613 
1614 
1615       OPEN item_uom_attr;
1616       FETCH item_uom_attr INTO
1617         l_deviation_hi, l_deviation_lo;
1618 
1619       IF(item_uom_attr%NOTFOUND) THEN
1620 
1621         CLOSE item_uom_attr;
1622         RETURN VAL_UOMATTR_ERR;
1623 
1624       END IF;
1625       CLOSE item_uom_attr;
1626 
1627       /* ========================
1628       Set temporary boundaries
1629       ======================== */
1630       l_hi_boundary    := (pconverted_qty * (1 + l_deviation_hi));
1631       l_lo_boundary    := (pconverted_qty * (1 - l_deviation_lo));
1632 
1633 
1634       /* ======================================================
1635       If the passed in secondary quantity is greater than
1636       the deviation high boundary OR less than the deviation
1637       low boundary, we have an error!
1638       ====================================================== */
1639       /* =====================================================
1640          Deviation check should restrict only to 9 precision
1641          as round till 9 is the apps standard
1642          ====================================================*/
1643       ltrans_qty2 :=  round(ptrans_qty2,9);
1644       IF(ltrans_qty2 > round(l_hi_boundary,9)) THEN
1645         RETURN VAL_CALCDEV_HIGH_ERR;
1646       ELSIF(ltrans_qty2 < round(l_lo_boundary,9)) THEN
1647         RETURN VAL_CALCDEV_LO_ERR;
1648       END IF;
1649 
1650       RETURN 0;
1651 
1652       EXCEPTION
1653         WHEN OTHERS THEN
1654 
1655         RETURN SQLCODE;
1656     END calc_deviation;
1657   END;