          SUBROUTINE (MAT OE.VARS,MAT OE.SFLAGS,MAT PAF.DATA,O.SHP.DTS)
** Version# 410.0005[4] - 04/11/2017 - 12:36pm - TSMITH - eclipse
*** V410.0005 Change - Custom Coding . - 04/11/2017 - TSMITH - eclipse
*** V410.0004 Change - Custom Coding . - 01/06/2016 - TSMITH - eclipse
*** V410.0003 Change - Custom Coding . - 06/11/2015 - TSMITH - eclipse
*** V410.0002 Change - Custom Coding CUSTOM - 01/16/2015 - TSMITH - eclipse
*** V410.0001 Change - Custom Coding . - 12/23/2014 - TSMITH - eclipse

*** Subroutine - OE.STATUS
*-------------------------------------------------------------------------*
*** This routine is for the core order entry status screen. It allows the
*** user to see, change and manipulate the statuses, shipdate, required
*** dates and shipvias of sales order, purchase orders, and transfers.
*-------------------------------------------------------------------------*
*** OE.VARS   - OID, GEN, etc. (see CC OE.EQUATES)                 [IN]
*** OE.SFLAGS - Order Entry screen display flags                   [IN/OUT]
*** PAF.DATA  - Contains flags dealing with Pass-Along-Freight     [IN/OUT]
*** O.SHP.DTS - Ship dates coming into this routine                (IN)
*-------------------------------------------------------------------------*
*** Common:  LED, LD, OID.DATA$, ACT.ID$, ABC.ENABLED$, BLINK$, NORM$,
*** UET.ENABLED$, HAJOCA.SITE$, CUSS, REMOTE.CUST
*-------------------------------------------------------------------------*
          $INCLUDE CC OE.EQUATES

          DIM OE.STATE(150)    ;* Variables Used to Maintain the State

          * Save original Mode as we are manipulating MODE here, we will
          * restore in Finish so that OE can continue to function correctly
          SV.ORIG.MODE = MODE%

          MODE% = OID%[1,1]
          IF MODE%='R' THEN AUTH.MODE='S' ELSE AUTH.MODE=MODE%

          ORIG.SHP.DTS     = O.SHP.DTS
          ORIG.GIDS        = LED(12)
          LOCK.REQ.DTS     = NO ;* This will only allow access to req dates
          CLOSED.OPEN.OK   = NO ;* Can not reopen invoiced order w/o auth
          TAGGED           = NO
          BACK.TO.BODY     = NO
          TARGET.OK        = NO
          NO.PROMPT        = NO
          DEL.ALL          = NO
          SHP.DT.CHGD.FLG  = NO
          CANCEL.CLOSED.OK = NO ;* Can not cancel without auth
          ABC.FLAG         = NO
          DO.OPEN.TOTALS   = NO

          AUTH.KEY = AUTH.MODE:'OE.CLOSED.ORDER.EDIT'
          CHECK.OE.CLOSED.AUTH.KEYS OID%,GEN%,AUTH.KEY,CLOSED.OK
          CHECK.KEY AUTH.MODE:'OE.CLOSED.ORDER.OPEN',CLOSED.OPEN.OK

          CANCEL.KEY = AUTH.MODE:'OE.CLOSED.ORDER.CANCEL'
          CHECK.OE.CLOSED.AUTH.KEYS OID%,GEN%,CANCEL.KEY,CANCEL.CLOSED.OK

          * Check to see if user authorized to print open PO's or directs
          * Get the order total as we need to use it throughout the
          * code for level 1 vs level 2 auth.
          CHECK.KEY 'POE.OPEN.ORDER.PRINT',POE.PRT, POE.PRT.LVL
          OE.ORDER.TOTAL OID%,GEN%,QSIGN%,POE.PRT.TTL

          CHECK.KEY "SOE.DIRECT.EDIT",DIR.OK
          OE.STATUS.GET MODE%,VALID.STATS,HELP.STATS

          * If 'Reserve Inventory', then we are always VIEW.ONLY
          IF MODE% = 'S' AND LED(6)<1,GEN%> = 'R' THEN
             VIEW.ONLY% = YES
          END
          * Set the initial view only status
          INIT.VIEW.ONLY = VIEW.ONLY%

          * Remove 'Direct' status if the user is not authorized to create
          * or this is a consignment transfer.
          IF NOT(DIR.OK) OR LED(110)<1,GEN%> = 'S' THEN
             LOCATE 'D' IN VALID.STATS<1> SETTING POS THEN
                VALID.STATS = DELETE(VALID.STATS,1,POS)
                HELP.STATS  = DELETE(HELP.STATS,1,POS)
             END
          END

          READ SHIPMENT.MAINT.ENABLED FROM CTRBFILE,'RF.RECV.856.ADV.SHIP~':LED(2)<1,GEN%,2> ELSE
             SHIPMENT.MAINT.ENABLED = NO
          END

          READ CHK.ORIG.SHP FROM CTRLFILE,'CHK.REQ.DT' ELSE CHK.ORIG.SHP=''

          * Saves the original print status of the order.
          READV WRK FROM LEDLFILE,OID%,9 ELSE WRK = ''
          SV.STAT = WRK<1,GEN%>

          * This to insure if programs calling OE.STATUS did not change
          * logic to set POST.ENTRY arguement, then will be caught by
          * OID.DATA$<9> set in OE
          IF NOT(POST.ENTRY%) AND OID.DATA$<9> THEN
             POST.ENTRY% = OID.DATA$<9>
          END

          IF NEW.ORDER% ELSE
             CHECK.KEY AUTH.MODE:'OE.ORDER.TO.BID',BID.OK
             IF NOT(BID.OK) THEN
                LOCATE 'B' IN VALID.STATS<1> SETTING POS THEN
                   VALID.STATS = DELETE(VALID.STATS,1,POS)
                   HELP.STATS  = DELETE(HELP.STATS,1,POS)
                END
             END
          END

          IF MODE%='S' AND REMOTE.CUST THEN
             SCRN = 'R.OE.STATUS'
          END ELSE
             IF MODE% = "R" THEN SCRN = "S.OE.STATUS" ELSE
                SCRN = MODE%:'.OE.STATUS'
             END
          END
          WINDOW ,,,,9,SCRN

          IF NOT(SHIPMENT.MAINT.ENABLED) THEN
             IF MODE% # 'P' THEN
                PRINT @(10,20):SPACE(5)
             END
          END

          XFER     = (MODE%='T')
          OLD.GID  = LED(12)<1,GEN%>
          OINVN    = LED(8)<1,GEN%>
          OLD.BT   = LED(1)<1,GEN%>
          OLD.ST   = LED(5)<1,GEN%>
          LOADED.BT = OLD.BT
          LOADED.ST = OLD.ST
          MATBUILD OLD.CUS FROM CUS
          MATBUILD OLD.CUSS FROM CUSS
          COL      = 1
          SHP.DATE = ''
          NEW.STAT = ''
          SAV.LINE = ''
          VIEW = 1
          ASN.ID   = ''

START:    *** restart here
          VSCROLL.DEFINE 1,1,3,78,10,MODE%:'.OE.STATUS'
          VSCROLL.SET 1
          GOSUB LOAD.HOTKEYS
          IF NOT(VIEW.ONLY%) AND LED(6)<1,GEN%>='E' THEN
             OE.SHIP.POST.DATE LED(9)<1,GEN%>,POST.DATE
             CHK.GL.POST POST.DATE,GL.OK,OID%
             IF NOT(GL.OK) THEN
                SURE = 'Y'
                MSG  = 'Post Date Is In A Closed Accounting Period. Change'
                MSG := ' To Today? (Y/N) : '
IN$$14:         INP.PROMPT SURE,MSG,'YN',1
                IF SURE THEN
                   LED(9)<1,GEN%>  = DATE()
                   LED(23)<1,GEN%> = DATE()
                END ELSE
                   F12             = YES
                   IF NEW.ORDER% THEN
                      NO.PROMPT    = YES
                      GOTO FILEIT
                   END ELSE
                      GOTO FINISH
                   END
                END
             END





             SOE.PROCESS.ORDER OID%,GEN%,LED(9)<1,GEN%>
             IF MODE%='T' THEN
                OE.PROCESS.ORDER OID%,2,LED(9)<1,GEN%>
             END
          END

          GOSUB DISP.REM

REDISP:   *** redisplay
          GOSUB DISPLAY

          IF INIT.VIEW.ONLY THEN
             PRINT @(2,0):BLINK$:'View Only':NORM$
          END

          BEGIN CASE
          CASE (LED(128)<1,1>)
             PRINT @(30,0):BLINK$:"Master Job Bid":NORM$
          CASE (LED(129)<1,1>)
             OFMT      = "L#":OID.LGTH$
             MASTER.ID = LED(129)<1,1>
             NVER      = 28 - ((OID.LGTH$ - 8) / 2)
             PRINT @(NVER,0):BLINK$:"Junior To-":MASTER.ID OFMT:NORM$
          CASE (LED(129)<1,2>)
             OFMT      = "L#":OID.LGTH$
             MASTER.ID = LED(129)<1,2>
             NVER      = 28 - ((OID.LGTH$ - 8) / 2)
             PRINT @(NVER,0):BLINK$:"Change For-":MASTER.ID OFMT:NORM$
          CASE OTHERWISE
             PRINT @(27,0):""
          END CASE

          * Check for leadtimes
          READV LTW FROM CTRLFILE,'WARN.LEAD.TIME',1 ELSE LTW = ''
          IF LTW THEN
             IF CUSS(75) THEN
             WMSG = 'Warning: It takes ':CUSS(75):' days to ship to ':CUSS(1)
             MESS 5,10,WMSG
             END
          END

          IF SAV.LINE THEN
             LINE = SAV.LINE
             SAV.LINE = ''
             IF NOT(GENS<LINE>) THEN LINE = 1
          END ELSE
             LINE = 1
          END
          GEN% = GENS<LINE>

          * This calculates handing charge which will be posted in
          * the OE.CALC.FGHT.ALL routine below.
          * CTJ051 - Don't calculate freight if the order is view only.
          IF NOT(VIEW.ONLY%) THEN
             * The sign for the receiving generation of a transfer should
             * always be a positive 1. Set QSIGN% to 1 before calculating
             * freight and handling. We will restore QSIGN% after the
             * calculations to limit the impact of this change.
             IF MODE%='T' AND GEN%=2 THEN
                SV.QSIGN = QSIGN%
                QSIGN% = 1
             END

             OE.CALC.HNDL.ALL OID%,GEN%,QSIGN%,YES

             * This calculates freight then posts both freight and handling
             IF LED(8)<1,GEN%> THEN CALC.TAX = NO ELSE CALC.TAX = YES

             OE.CALC.FGHT.ALL OID%,GEN%,QSIGN%,YES,CALC.TAX

             UPDATE.LEDGER OID%,GEN%

             IF MODE%='T' AND GEN%=2 THEN
                QSIGN% = SV.QSIGN
             END
          END

          IF MODE% = 'S' THEN
             OE.TRIGGERS 5,OID%,GEN%,NEW.ORDER%,,VIEW.ONLY%
          END

          QUIT = NO; COL = 1
          PREV.LINE = LINE; ABC.LOGGED = NO
          GOSUB EVALUATE.XF.GEN
          IF NEW.ORDER% OR MODE% # 'S' THEN
             ABC.LOGGED = YES  ;* New orders only log at final <esc>
          END
          DWNOK = YES; NEWOK = NO; CUR.STAT = ''; COLS = 4; MIN.COLS = 3
*-------------------------------------------------------------------------*
MOVENEXT: *** handles the screen movements

          IF QUIT THEN GOTO FILEIT
          DONT.CHECK.AVAIL = '';* Used to determine if the CHK.AVAIL flag
                                * should be turned on in OE.CHANGE.SHIPDATE
          IF MOVE=5 AND CUR.STAT='X' THEN MOVE=4; COL = 1
          PARSEMOVE COL,LINE,COLS,LN.CT,10,DWNOK,NEWOK
          IF PREV.LINE # LINE THEN
             ABC.LOGGED = NO
          END
          PREV.LINE = LINE
          IF NEW.ORDER% OR MODE% # 'S' THEN
             ABC.LOGGED = YES
          END
          GEN%         = GENS<LINE>
          OID.DATA$<2> = GEN%
          ACT.ID$      = OID%:'.':LED(8)<1,GEN%>"R%3"
          SV.STAT      = WRK<1,GEN%>
          CUR.STAT     = LED(6)<1,GEN%,1>
          IF CUR.STAT  = 'X' THEN COL = 1
          IF CUR.STAT  = 'Y' AND COL=1 THEN COL = 2
          * Set view only status based on the gen we're dealing with.
          VIEW.ONLY% = (INIT.VIEW.ONLY OR ((CUR.STAT = "Y") AND LED(8)<1,GEN%> AND OE.LOCKED.DIR$))

          CHK.BT = LED(1)<1,GEN%>
          CHK.ST = LED(5)<1,GEN%>
          GOSUB LOAD.CUS.CUSS

          * If Shipment on file for this gen then highlight Shpmt hotkey
          ASN.ID     = '' ; * Shipment ID
          ASN.STATUS = ''
          IF SHIPMENT.MAINT.ENABLED THEN
             IF MODE% = 'P' OR MODE% = 'T' THEN
                ASN.ID = ASN.ID.GET(OID%,LED(12)<1,GEN%>,,,ASN.STATUS)
                IF ASN.ID THEN
                   IF MODE% = 'P' THEN
                      PRINT @(68,20):BLINK$:'hpmt':NORM$
                   END ELSE
                      PRINT @(11,20):BLINK$:'hpmt':NORM$
                   END
                END ELSE
                   IF MODE% = 'P' THEN
                      PRINT @(68,20):'hpmt'
                   END ELSE
                      PRINT @(11,20):'hpmt'
                   END
                END
             END
          END

          ABC.ENABLED = NO
          IF ABC.ENABLED$ THEN
             CTRB.ID = 'ABC.ENABLED~':LED(2)<1,GEN%,2>
             READV ABC.ENABLED FROM CTRBFILE,CTRB.ID,1 ELSE ABC.ENABLED=NO
          END

          UET.ENABLED = NO
          IF UET.ENABLED$ THEN
             CTRB.ID = 'UET.ENABLED~':LED(2)<1,GEN%,2>
             READV UET.ENABLED FROM CTRBFILE,CTRB.ID,1 ELSE UET.ENABLED=NO
          END

          GOSUB CHECK.AUTH

          BEGIN CASE
          CASE LOCK.REQ.DTS AND EDIT.OK
             GOTO IN.VIA
          CASE LOCKED.DIR AND EDIT.OK
             ON COL GOTO IN.PRT, IN.PRT, IN.SHPDT, IN.VIA
          CASE VIEW.ONLY% AND GEN%=2 AND HAJOCA.SITE$ AND RECV.GEN.ONLY
             ON COL GOTO IN.STAT, IN.PRT, IN.SHPDT, IN.VIA
          CASE NOT(VIEW.ONLY%) AND EDIT.OK
             ON COL GOTO IN.STAT, IN.PRT, IN.SHPDT, IN.VIA
          CASE OTHERWISE
             MESS 20,15,'No Editing Allowed'
             IF INP.PRTS<LINE> THEN GOTO IN.PRT ELSE
IN$$1:          INPV A,9,LINE,0
                IF MOVE = 5 THEN MOVE = 4
             END
          END CASE

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Order status input
IN.STAT:  INPV NEW.STAT,10,LINE,1,'MCU',A_1
          IF HELP OR CHANGED THEN
             IF LED(129)<1,2> AND MODE% = 'S' THEN
                VALID.TMP = 'X':VM:'O':VM:'C'
                HELP.TMP  = 'X-Cancel':VM:'O-Open':VM:'C-Committed'
             END ELSE
                VALID.TMP = VALID.STATS<1>
                HELP.TMP  = HELP.STATS
             END
             LOCATE NEW.STAT IN VALID.TMP<1> SETTING SEL ELSE
                HELP = YES
                SEL  = 1
             END

             IF HELP THEN
                SV.QUIT = QUIT
                MENU.TABLE NEW.STAT,30,10,1,5,32,,,HELP.TMP,'Status',SEL
                QUIT = SV.QUIT
                IF NEW.STAT # '' THEN
                   NEW.STAT = NEW.STAT[1,1]
                   CHANGED = YES
                END
             END
          END

          IF CHANGED THEN
             * Don't repetetively copy code, use a flag.
             NSTAT.ERR = NO

             * Hajoca - do not allow cancellation of a receiving gen on a
             * transfer whose shipping gen is closed.
             IF HAJOCA.SITE$ AND RECV.GEN.ONLY AND CUR.STAT # 'X' AND NEW.STAT = 'X' THEN
                MESS 10,14,BELL:'Item Transmitted, cannot cancel'
                NSTAT.ERR = YES
             END

             IF CUR.STAT = 'I' AND NEW.STAT # 'I' THEN
                IF NEW.STAT = 'X' THEN
                   * Trying to cancel an closed order requires
                   * OE.CLOSED.ORDER.CANCEL auth key.
                   IF NOT(CANCEL.CLOSED.OK) THEN
                      NSTAT.ERR = YES
                   END
                END ELSE
                   * Trying to open a closed order requires
                   * OE.CLOSED.ORDER.OPEN auth key.
                   IF NOT(CLOSED.OPEN.OK) THEN
                      NSTAT.ERR = YES
                   END
                END
             END

             * if user is canceling a generation with a partial kit
             * we need to check all the other generations and user auth
             * to decide if they can cancel it
             IF NEW.STAT = 'X' THEN
                RESPS = ''; MSGS = ''; MSG.FLAG = ''; ABORTED = ''
                LOOP
                   SOE.CHECK.PARTIAL.KIT MAT OE.VARS,MSG.FLAG,MSGS,RESPS,NSTAT.ERR,DEL.ALL,BO.KIT.LDIDS
                   IF MSG.FLAG THEN
                      OE.ACTION.DISPLAY MAT OE.VARS,,MAT OE.SFLAGS,,ADD.LINES,MSGS,ABORTED,RESPS
                   END
                   WHILE MSG.FLAG AND NOT(ABORTED)
                REPEAT

                * Check if user can cancel a packed order.
                PACK.CHECK.CANCEL.ORDER OID%, GEN%, ERR.MSG
                IF ERR.MSG THEN NSTAT.ERR = YES
             END

             * don't let them re-open received POs w/out authorization
             IF MODE% = 'P' AND CUR.STAT = 'R' AND NEW.STAT # 'R' THEN
                IF NEW.STAT # 'X' THEN
                   IF NOT(CLOSED.OPEN.OK) THEN
                      NSTAT.ERR = YES
                   END
                END ELSE
                   * don't let them cancel received POs w/out auth
                   IF NOT(CANCEL.CLOSED.OK) THEN
                      NSTAT.ERR = YES
                   END
                END
             END

             * if this is a transfer and we are trying to reopen
             * a shipped gen or received gen then we want to make
             * sure that they have TOE.CLOSE.ORDER.OPEN first
             IF MODE%= 'T' AND NEW.STAT = 'O' THEN
                IF CUR.STAT = 'R' OR CUR.STAT = 'S' THEN
                   IF NOT(CLOSED.OPEN.OK) THEN
                      NSTAT.ERR = YES
                   END
                END
             END

             IF (NEW.STAT='I' OR NEW.STAT='T') AND NOT(CLOSED.OK) THEN
                NSTAT.ERR = YES
             END

             IF NEW.STAT="D" AND NOT(DIR.OK) THEN
                NSTAT.ERR = YES
             END

             JM.ORDER = (LED(83)<1,1>[1,7] = "@JOBNO="); * Job Mgmt

             * Logic for Directs
             IF LED(33)<1,GEN%> THEN

                * Don't let them set any Statuses for Job Management
                * Letting Eclipse users do it for extreme situations.
                IF JM.ORDER THEN
                   IF USER.ID = "ECLIPSE" THEN
                      SURE = 'No '
                      PRMT = "This is a Job Managment Order and it's Status should not be changed through the Host side, Continue Anyway? "
INJMDIR:              INP.PROMPT SURE,PRMT,'YN',3
                      IF NOT(SURE) THEN
                         NSTAT.ERR = YES
                      END
                   END ELSE
                      NSTAT.ERR = YES
                   END
                END

                * If we are attempting to cancel the SO side of a direct,
                * check to make sure the PO side is not in a closed period
                * before allowing the cancellation.
                IF MODE% = 'S' AND CUR.STAT = 'I' AND NEW.STAT = 'X' THEN
                   LOCATE LED(33)<1,GEN%> IN LED(12)<1> SETTING DGEN THEN
                      IF LED(8)<1,DGEN> THEN
                         CHK.GL.POST LED(23)<1,DGEN>,OK,OID%,LED(6)<1,DGEN>
                         IF NOT(OK) THEN
                            ERR.MSG  = "Cannot Cancel a Direct with a P/O "
                            ERR.MSG := "Date in a Closed Period!"
                            GOSUB DISPLAY.ERR

                            NSTAT.ERR = YES
                         END
                      END
                   END
                END

                * If CUR.STAT='X'and LED(33)<1,GEN%> has something in it,
                *  this is a previously invoiced, canceled direct.
                IF NEW.STAT="I" AND CUR.STAT='X' THEN
                   SURE = 'No '
                   PRMT = "Directs Must Be Opened Before Invoicing, Set Status to Direct? "
INDIR:             INP.PROMPT SURE,PRMT,'YN',3
                   IF NOT(SURE) THEN
                      NSTAT.ERR = YES
                   END ELSE
                      NEW.STAT = 'D'
                   END
                END
             END ELSE
                * Don't let them set to cancel or bids for Job Management
                * on Stock Orders.
                * Letting Eclipse users do it for extreme situations.
                IF JM.ORDER AND (NEW.STAT = 'X' OR NEW.STAT = 'B' OR NEW.STAT = 'D') THEN
                   IF USER.ID = "ECLIPSE" THEN
                      SURE = 'No '
                      PRMT = "This is a Job Managment Order and it's Status should not be changed through the Host side, Continue Anyway? "
INJMDIR2:             INP.PROMPT SURE,PRMT,'YN',3
                      IF NOT(SURE) THEN
                         NSTAT.ERR = YES
                      END
                   END ELSE
                      NSTAT.ERR = YES
                   END
                END
             END

             IF NEW.STAT='B' AND CUR.STAT='D' AND LED(98)<1,GEN%> THEN
                LOT.LD = LED(98)<1,GEN%>
                FOR GNX = 1 TO DCOUNT(LED(12),VM)
                   IF GNX = GEN% THEN CONTINUE
                   IF LED(98)<1,GNX> = LOT.LD THEN
                      NSTAT.ERR = YES
                   END
                NEXT GNX
             END

             IF LED(128)<1,1> AND (NEW.STAT # "B" AND NEW.STAT # "X") THEN
                PRMT  = "Master Bids Can Only Have a Status of "
                PRMT := "B-Bid or X-Cancel"
                MESS 10,8,PRMT
                NSTAT.ERR = YES
             END

             IF LED(128)<1,1> AND (NEW.STAT = "X") THEN
                VAR   = "N"
                PRMT  = "Cancelling A Master Bid Will Remove All "
                PRMT := "Junior Orders. Continue (Y/N)? "
INMJB:          INP.PROMPT VAR,PRMT,'YN',3
                IF NOT(VAR) THEN
                   NSTAT.ERR = YES
                END
             END

             IF LED(129)<1,2> THEN
                PRMT = ''
                CO.ERR = (NEW.STAT#'X' AND NEW.STAT#'O' AND NEW.STAT#'C')
                BEGIN CASE
                CASE CO.ERR
                   PRMT  = "Change Orders Can Only Have a Status of "
                   PRMT := "C-Commit, O-Open, or X-Cancel"
                CASE NEW.STAT = 'X' AND LED(128)<1,8> = 'C'
                   PRMT  = "Change Orders Must Be Un-Committed "
                   PRMT := "Before Cancelling."
                END CASE
                IF PRMT THEN
                   MESS  5,8,PRMT
                   NSTAT.ERR = YES
                END
             END

             * When a Bid is converted to an order check for deleted PNs
             IF MODE%='S' AND CUR.STAT='B' AND NEW.STAT#'B' AND NEW.STAT#'X' THEN
                GOSUB CHK.USE.DEL
             END

             * There was an error with the new status.
             IF NSTAT.ERR THEN
                LN = LINE; GOSUB DISP.LN
                PRINT BELL:; GOTO IN.STAT
             END
             OE.STATUS.CONV OID%,GEN%,NEW.STAT,STAT.DESC,INVALID.STAT,INP.PRT
             IF INVALID.STAT THEN
                MESS 10,14,BELL:'Invalid Status'
                LN = LINE; GOSUB DISP.LN
                GOTO IN.STAT
             END

IN$$2:       INP.PRTS<LINE> = INP.PRT
             VPRINT 10,LINE,STAT.DESC "L#37"
             IF MODE%='S' AND NEW.STAT='S' AND LED(6)<1,GEN%,1>#'S' THEN
IN.SHIPON:      ERR = NO
                VPRINT  10,LINE,'Ship On' "L#37"
                VPRINT 49,LINE,'' "L#10"
IN$$3:          INPV SHP.DATE,49,LINE,10,'D4/'
                IF NOT(QUIT) AND SHP.DATE+0<DATE() THEN
                   PRINT BELL:
                   GOTO IN.SHIPON
                END
                IF QUIT THEN
                   LN = LINE; GOSUB DISP.LN; GOTO IN.STAT
                END ELSE
                   * the shipdate is saved and restored because we need
                   * LED(9) to be the updated value in OE.UPDATE.STATUS
                   * which is called from UPD.STAT.There is an overcommit
                   * check that uses led(9) to determine so we are
                   * faking led(9) and restoring it after upd.stat and
                   * if there are no issues then UPD.SHIPDATE will handle
                   * the real updating of LED(9). We couldn't call
                   * UPD.SHIPDATE first because then the change log cmt
                   * would be incorrect.
                   SV.SHP.DATE = LED(9)<1,GEN%>
                   LED(9)<1,GEN%>  = SHP.DATE
                   GOSUB UPD.STAT
                   LED(9)<1,GEN%>  = SV.SHP.DATE
                   IF ERR THEN
                      LN = LINE; GOSUB DISP.LN
                      GOTO IN.STAT
                   END
                   GOSUB UPD.SHIPDATE
                   IF ERR THEN GOTO IN.SHIPON
                   GOTO MOVENEXT
                END
             END

             GOSUB UPD.STAT
             IF ERR THEN
                LN = LINE; GOSUB DISP.LN
                GOTO IN.STAT
             END
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Print status input
IN.PRT:   IF INP.PRTS<LINE> THEN
             OE.PRT.STATUS.GET OID%,GEN%,VIEW.ONLY%,CUR.STAT,SV.STAT,PRT.OPTS
IN$$4:       INPV PRT,46,LINE,1,'MCU',V_'D:':PRT.OPTS
             IF CHANGED THEN
                * If order is being edited by another user, do not allow
                CHECK.RECORD.LOCK LEDFILE,OID%,IS.LOCKED,USER.LOCKED
                IF (USER.LOCKED # USER.ID) AND (USER.LOCKED # '') THEN
                   LOCK.MSG = 'Order is being edited by ':USER.LOCKED
                   LOCK.MSG<-1> = 'Not able to change print status.'
                   MESS 5,10,BELL:LOCK.MSG
                   READV CUR.STAT FROM LEDLFILE,OID%,9 ELSE CUR.STAT = ''
                   PRT = CUR.STAT<1,GEN%>
                   VPRINT 46,LINE,PRT    "L#1"
                   GOTO IN.PRT
                END

                * If user is not authorized for any print options, do
                * not let them make any changes
                IF PRT.OPTS = '' THEN
                   PRINT BELL:;
                   VPRINT 46,LINE,PRT.STAT    "L#1"
                   GOTO IN.PRT
                END

                * If there is credit card info on the order, we need
                * to make sure that if the new print stat = "B" that
                * we change to "C" if auth method is after review
                NEW.PRT = PRT
                CREDIT.CARD.CHK.PRT.ST NEW.PRT,OID%,GEN%
                IF NEW.PRT # PRT THEN
                   PRT     = NEW.PRT
                   VPRINT 46,LINE,NEW.PRT    "L#1"
                END

                * check to see if the 'E' status has been overridden
                * to another status
                IF MODE% = 'P' OR LED(6)<1,GEN%> = 'Y' THEN
                   GOSUB CHECK.EDI.CHANGE
                END

                * if the print status is null then we want to just
                * set the status back to what it was previously.
                IF PRT = '' THEN
                   READV CUR.STAT FROM LEDLFILE,OID%,9 ELSE CUR.STAT = ''
                   PRT = CUR.STAT<1,GEN%>
                   VPRINT 46,LINE, PRT    "L#1"
                END
                OE.UPD.PRINT.STAT OID%,GEN%,PRT

                * Need to update xmit record for transfers if PRT = 'N'
                IF HAJOCA.SITE$ AND PRT = 'N' THEN
                   IF MODE% = 'T' AND LED(8)<1,GEN%> AND LED(30)<1,GEN%> = 'SX' THEN
                      AR.ID = OID%:'.':LED(8)<1,GEN%>"R%3"
                      READ ARREC FROM ARFILE,AR.ID THEN
                         HAJO.ADD.TO.QUEUE AR.ID,ARREC<20>,ARREC<15>,ARREC<10>
                      END
                   END
                END

                IF PRT # 'Y' AND PRT # 'E' AND PRT # 'F' THEN
                   LOCATE GEN% IN LOG.MV%<1> SETTING X ELSE LOG.MV%<1,-1>=GEN%
                   OE.ADD.COMMENT OID%,GEN%,'Prt Status changed to : ':PRT
                END
             END
          END ELSE
             IF (LED(83)<1,1>[1,7] = "@JOBNO=") OR (MOVE = 3 OR MOVE = 5) THEN
                COL = 3
             END ELSE
                COL = 1
             END
             MOVE = 0
             LASTKEY = 0
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Ship date input
IN.SHPDT: INPV SHP.DATE,49,LINE,10,'D4/'
          IF CHANGED THEN
             BEGIN CASE
             CASE SHP.DATE+0<DATE() AND MODE%='S' AND CUR.STAT#'T' AND LED(8)<1,GEN%>=''
                PRINT BELL:
                LN = LINE
                GOSUB DISP.LN
                GOTO IN.SHPDT
             CASE SHP.DATE+0 < DATE() AND MODE% = 'T' AND NOT(LED(8)<1,GEN%>)
                PRINT BELL:
                LN = LINE
                GOSUB DISP.LN
                GOTO IN.SHPDT
             END CASE

             GOSUB UPD.SHIPDATE
             IF ERR THEN LN = LINE; GOSUB DISP.LN; GOTO IN.SHPDT
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Ship via input
IN.VIA:   BEGIN CASE
          CASE VIEW = 2
IN.RD:       RDT = LED(10)<1,GEN%>
INP.RD:      INPV RDT,60,LINE,8,'D2/'
             IF CHANGED THEN
                SV.RDT = LED(10)<1,GEN%>
                IF RDT < LED(4)<1,GEN%> THEN
                   SURE = 'No '
                   PRMT = 'Required Date is Before Order Date, Continue ? '
IN$$5:             INP.PROMPT SURE,PRMT,'YN',3
                   IF NOT(SURE) THEN
                      LN = LINE;   GOSUB DISP.LN
                      PRINT BELL:; GOTO IN.RD
                   END
                END
                COMMENT.IN  = 'Required Date changed from : '
                COMMENT.IN := OCONV(SV.RDT,'D4/'):' to ':OCONV(RDT,'D4/')
                OE.ADD.COMMENT OID%,GEN%,COMMENT.IN
                LOCATE GEN% IN LOG.MV%<1> SETTING X ELSE LOG.MV%<1,-1>=GEN%

                * Auto Quality Logging
                IF UET.ENABLED THEN
                   SV.QUIT = QUIT
                   DAYS = RDT - LED(10)<1,GEN%>
                   IF MODE% = "S" OR MODE% = "P" THEN
                      IF DAYS < 0 THEN
                         UET.CODE = MODE%:"CKERQD"
                      END ELSE
                         UET.CODE = MODE%:"CKLRQD"
                      END
                      UET.LOG.AUTO UET.CODE,10,DAYS
                   END
                   QUIT = SV.QUIT
                END

                * Calculate new shipdate based upon required date if
                * and only if mirror shipdate control record is set.
                CTRB.ID = 'MIRROR.REQ.DT~':LED(2)<1,GEN%,2>
                READV MIRROR FROM CTRBFILE,CTRB.ID,1 ELSE MIRROR = ''
                IF NEW.ORDER% AND MIRROR AND MODE% = 'S' AND LED(6)<1,GEN%> # 'I' THEN
                   OE.SHIPDATE.CALC OID%,GEN%,RDT,SHP.DATE
                   GOSUB UPD.SHIPDATE
                END
             END

             LED(10)<1,GEN%> = RDT
             GOSUB UPD.LINE
             LN = LINE; GOSUB DISP.LN
          CASE VIEW = 3
IN$$6:       INPV DDT,60,LINE,7,'MTH'
             IF CHANGED THEN
                READVU DDATA FROM LEDLFILE,OID%,16 ELSE DDATA = ''
                DDATA<1,GEN%,1> = DDT
                WRITEV DDATA ON LEDLFILE,OID%,16
                LN = LINE; GN = GEN%
                GOSUB DISP.DTIME
             END
          CASE VIEW = 1
             IF MODE% = 'S' THEN
                SOE.CLOSED.SVIA.AUTH SVIA.EDIT.OK,OID%,GEN%,NEW.ORDER%
                IF NOT(SVIA.EDIT.OK) THEN COL -= 2; GOTO MOVENEXT
             END
             VIA = LED(70)<1,GEN%>
IN$$7:       INPV VIA,60,LINE,18,'MCU',V_'S:VERF.BR.SHIPVIA,':LED(2)<1,GEN%,2>
             IF CHANGED THEN
                OE.CHNG.SHIPVIA OID%,GEN%,VIA,LOG.MV%,LED(70)<1,GEN%>
                IF MODE%='S' THEN
                   LED(64)<1,GEN%> = ''
                   * Clear out the LD. We needed to do this in order for
                   * OE.TAXABLE.RECALC to do an ld.put which will save off
                   * LD. LD(22) was getting set correctly but then it
                   * was overlayed later since we do an ld.get in the
                   * tax calculation routines. Tax was then incorrect
                   * when the shipvia change caused the line item
                   * taxability to change.
                   MAT LD     = ""
                   MAT OLD.LD = ""
                   OE.TAX.CALC OID%,GEN%,QSIGN%
                   IF ABC.ENABLED THEN
                      IF NOT(ABC.LOGGED) AND LED(6)<1,GEN%> # 'X' THEN
                         ACD = 'SCKAQ'
                         OE.ACD.GET ACD,LED(6)<1,GEN%>
                         GOSUB SET.DATA
                         GOSUB LOG.ABC
                      END
                   END
                END
                SHP.DATE = LED(9)<1,GEN%>

                * if it is an invoiced sales order, changing ship via don't
                * need to update ship date, since it is already invoiced
                * and no gen combining will happen.
                IF NOT(MODE%='S' AND LED(6)<1,GEN%> = 'I') THEN
                   DONT.CHECK.AVAIL = YES; * Don't need to check avail when
                   GOSUB UPD.SHIPDATE    ; * only changing ship via
                END

                GOSUB UPD.LINE
                LN = LINE
                GOSUB DISP.LN
             END
          END CASE

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
LOAD.HOTKEYS: *** load hotkeys

          IS.MJB = (LED(128)<1,1> # "" OR LED(129)<1,2> # "")
          IS.UNREL.JM = (LED(83)<1,1>[1,14] = "@JOBNO=Reserve" OR LED(83)<1,1>[1,10] = "@JOBNO=HFR")

          MENU.CLEAR
          MENU.LOAD  2,18, 6,1,'H'                  ;* Header
          MENU.LOAD 11,18, 4,1,'B'                  ;* Body
          MENU.LOAD 18,18, 6,1,'T'                  ;* Totals
          IF NOT(REMOTE.CUST) OR MODE% = 'T' THEN
             MENU.LOAD 27,18, 4,1,'V'               ;* View
             IF NOT(IS.MJB) THEN
                IF MODE% = 'T' THEN
                   MENU.LOAD 34,18,14,1,'M'         ;* Manifest Q
                END ELSE
                   MENU.LOAD 34,18,10,1,'M'
                END
             END ELSE
                MENU.LOAD                           ;* <Manifest Q>
             END
          END ELSE
             MENU.LOAD                              ;* <View>
             MENU.LOAD                              ;* <Manifest Q>
          END
          IF MODE%='T' OR IS.MJB THEN
             MENU.LOAD ,,,,''                       ;* <Detail Scheduling>
          END ELSE
             MENU.LOAD 48,18,17,1,'D'               ;* Detail Scheduling
          END
          IF MODE% #'T' THEN
             MENU.LOAD 68,18,10,6,'I'               ;* View Items
          END ELSE
             MENU.LOAD 67,18,10,6,'I'
          END
          IF MODE%#'T' THEN
             IF NOT(REMOTE.CUST) THEN
                MENU.LOAD 2 ,20,12,1,'A'            ;* All Complete
                MENU.LOAD 18,20,13,5,'F'            ;* Bid Follow Up
             END ELSE
                MENU.LOAD                           ;* <All Complete>
                MENU.LOAD                           ;* <Bid Follow Up>
             END
          END ELSE
             MENU.LOAD                              ;* <All Complete>
             MENU.LOAD                              ;* <Bid Follow Up>
          END
          IF MODE%='S' THEN
             IF NOT(REMOTE.CUST) THEN
                IF NOT(IS.MJB) THEN
                   MENU.LOAD 34,20,10,1,'S'         ;* Ship Avail
                END ELSE
                   MENU.LOAD                        ;* <Ship Avail>
                END
                IF NOT(IS.UNREL.JM) THEN
                   MENU.LOAD 47,20, 7,1,'P'         ;* Print Opt
                END ELSE
                   MENU.LOAD
                END
                IF NOT(IS.MJB) THEN
                   MENU.LOAD 61,20, 7,1,'C'         ;* Procure CONFIRM
                   MENU.LOAD ,,,,''                 ;* <Label>
                   MENU.LOAD 57,20, 7,2,'R'         ;* PROCURE Confirm
                END ELSE
                   MENU.LOAD                        ;* <Procure CONFIRM>
                   MENU.LOAD                        ;* <Label>
                   MENU.LOAD                        ;* <PROCURE Confirm>
                END
                MENU.LOAD
                MENU.LOAD
                MENU.LOAD
                MENU.LOAD
                MENU.LOAD 71,20,7,3,'Q'             ;* Sales Inquiries
             END
          END
          IF MODE%='P' THEN
             MENU.LOAD ,,,,''                       ;* <Ship Available>
             MENU.LOAD 34,20, 7,1,'P'               ;* Print Opt
             MENU.LOAD ,,,,''                       ;* <Procure CONFIRM>
             MENU.LOAD 44,20, 3,1,'L'               ;* Label
             MENU.LOAD ,,,,''                       ;* <PROCURE Confirm>
             MENU.LOAD 50,20, 5,1,'X'               ;* XDock
             MENU.LOAD 58,20, 6,3,'O'               ;* Drop Point
             IF SHIPMENT.MAINT.ENABLED THEN
                MENU.LOAD 67,20, 5,1,'S'            ;* Shipment ID
             END ELSE
                MENU.LOAD
             END
             MENU.LOAD 73,20,3,2,'E'                ;* Shpmt DEt
          END
          IF MODE%='T' THEN
             MENU.LOAD ,,,,''                       ;* <Ship Available>
             MENU.LOAD 51,18,13,1,'P'               ;* <Print Opt>
             MENU.LOAD ,,,,''                       ;* <Procure CONFIRM>
             MENU.LOAD ,,,,''                       ;* <Label>
             MENU.LOAD ,,,,''                       ;* <PROCURE Confirm>
             MENU.LOAD  2,20, 5,1,'X'               ;* xDock
             MENU.LOAD ,,,,''                       ;* <Drop Point>
             IF SHIPMENT.MAINT.ENABLED THEN
                MENU.LOAD 10,20, 5,1,'S'            ;* Shipment ID
             END ELSE
                MENU.LOAD
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.AUTH: *** check user auth
          LOCKED.DIR = NO    ;* set when po side of direct has been paid
          EDIT.OK    = YES
          PRNT.OK    = YES
          BEGIN CASE
          CASE MODE% = 'S'
             BEGIN CASE
             CASE CUR.STAT='$';                           EDIT.OK = NO
             CASE CUR.STAT='Y'
                CHECK.KEY 'OE.PRICE.VIEW.LEVEL',OE.VIEW.OK,OE.LEVEL
                READV PV.LEVEL FROM CTRLFILE,'PRICE.VIEW.LEVEL',1 ELSE PV.LEVEL = ''
                IF PV.LEVEL = '' THEN PV.LEVEL = 8
                IF OE.LEVEL <= PV.LEVEL THEN
                   PRNT.OK = NO
                END
                IF PRNT.OK THEN
                   CHECK.KEY 'SOE.DIRECT.EDIT',KEY.OK,LVL
                   IF NOT(KEY.OK) OR LVL+0 < 1 THEN PRNT.OK = NO
                END

                * Check to see if this PO has been reconciled and then
                * paid and if so, set LOCKED.DIR flag
                GOSUB IS.RECON
             CASE CUR.STAT='D'
                SOE.DIRECT.EDIT.CHECK OID%,GEN%,NO.CHANGE
                EDIT.OK = NOT(NO.CHANGE)
                CHECK.KEY 'SOE.DIRECT.EDIT',KEY.OK,LVL
                IF NOT(KEY.OK) OR LVL+0 < 1 THEN PRNT.OK = NO
             CASE CUR.STAT='I'
                * Check auth key again to see if we can open invoice. This
                * needs to be done because of gen specific lines. Some
                * gens could have printed and some may not and the user's
                * could prevent them from editing printed invoices.
                AUTH.KEY = 'SOE.CLOSED.ORDER.EDIT'
                CHECK.OE.CLOSED.AUTH.KEYS OID%,GEN%,AUTH.KEY,CLSD.OK
                EDIT.OK = CLSD.OK
                SOE.CHECK.AUTH.PRT.INV OID%,GEN%,NO.AUTH,ERR.MSG,ZERO.AUTH
                IF ZERO.AUTH OR NO.AUTH THEN PRNT.OK = NO
                IF LED(33)<1,GEN%> THEN
                   GOSUB IS.RECON
                END
             CASE CUR.STAT='T'; EDIT.OK = CLOSED.OK
             END CASE
          CASE MODE%='T'
             IF GEN% > 2 THEN EDIT.OK = NO
             XFER.BR = LED(2)<1,GEN%,2>
             LOCATE XFER.BR IN SECURITY<9> SETTING XX ELSE EDIT.OK=NO
             IF RECV.GEN.ONLY AND GEN% # 2 THEN
                EDIT.OK = NO
             END
             IF ASN.ID AND ASN.STATUS # 'R' THEN
                EDIT.OK = NO; * No edit of shipping or recv gen on Shipment
             END
          CASE MODE% = 'P' AND CUR.STAT = 'O'
             IF NOT(POE.PRT) THEN PRNT.OK = NO

             * Users with level one authorization can only print
             * PO's with negative totals.
             IF POE.PRT.LVL = 1 THEN
                IF POE.PRT.TTL >= 0 THEN
                   PRNT.OK = NO
                END
             END
          CASE MODE% = 'P' AND ASN.ID AND ASN.STATUS # 'R'
             EDIT.OK = NO
          CASE CUR.STAT='R'
             GOSUB IS.RECON
          END CASE

          * This was a "backdoor" that allowed change stat on xmit ord
          IF HAJOCA.SITE$ AND LED(8)<1,GEN%> AND NOT(VIEW.ONLY%) AND EDIT.OK THEN
             HAJO.XMIT.CHECK OID%:'.':LED(8)<1,GEN%>"R%3",TST
             IF TST THEN
                MESS 5,10,BELL:'Item transmitted on : ':OCONV(TST,'D4/')
                IF USER.ID # 'ECLIPSE' THEN EDIT.OK = NO
             END
          END

          * Initialize Edit Print Stat flag to Edit OK flag
          EDIT.PS.OK = EDIT.OK
          IF EDIT.OK AND LED(8)<1,GEN%> THEN
             CHK.GL.POST LED(23)<1,GEN%>,EDIT.OK,OID%,LED(6)<1,GEN%>
             IF LED(100)<1,GEN%> OR LED(99)<1,GEN%> THEN EDIT.OK = NO

             * Print Stat can be edited even if logic below determines
             * that other edits cannot be made
             EDIT.PS.OK = EDIT.OK
             IF EDIT.OK THEN
                GOSUB CHECK.POST
                EDIT.OK = NOT(NO.CHANGE)
             END
          END

          RETURN
*-------------------------------------------------------------------------*
DISPLAY:  *** Display the info

          * Print out the Order Number
          PRINT @(30,1):OID% "L#10"

          * Initialize sort variables and print lists
          SORTBYS  = ''
          GENS     = ''
IN$$8:    INP.PRTS = ''

          * Loop through all the GENs and sort them accordingly
          GEN.CT = DCOUNT(LED(12),VM)
          FOR GN = 1 TO GEN.CT
             IF LED(6)<1,GN>='X' THEN
                SORTBY = 'Z'        ;*Put cancelled gens @ end of sort
             END ELSE
                SORTBY = 'A'        ;*Put non-cancelled @ front
             END

             * For a Y-GEN, make sure there is Y is LED(6) and that
             * LED(33) is filled in. If LED(33) is not filled in, it
             * will cause a problem
             IF (LED(6)<1,GN> = "Y") AND (LED(33)<1,GN> # "") THEN
                SORTBY := LED(8)<1,GN>"R%3":LED(9)<1,GN>"R%6":LED(33)<1,GN>"R%3":"Z"
             END ELSE
                SORTBY := LED(8)<1,GN>"R%3":LED(9)<1,GN>"R%6":LED(12)<1,GN>"R%3"
             END
             LOCATE SORTBY IN SORTBYS BY 'AL' SETTING POS ELSE NULL
             SORTBYS = INSERT(SORTBYS,POS;SORTBY)
             GENS    = INSERT(GENS,POS;GN)
          NEXT GN
          LN.CT = DCOUNT(GENS,AM)

          * Depending on the view, make sure the columns are prepared
          * on the screen.
          BEGIN CASE
          CASE VIEW = 1
             PRINT @(61,1):'   Ship Via       '
             PRINT @(61,2):''
             FOR LN = 1 TO 10
                PRINT @(69,2+LN):' '
             NEXT LN
          CASE VIEW = 2
             PRINT @(61,1):' Req Dt  Complt Dt'
             PRINT @(61,2):''
             FOR LN = 1 TO 10
                PRINT @(69,2+LN):''
             NEXT LN
          CASE VIEW = 3
             PRINT @(61,1):'Delv Tm  Actual Tm'
             * Display system time zone
             TZ = TIME.ZONE$
             BEGIN CASE
             CASE LEN(TZ) = 0; TZ = ''
             CASE LEN(TZ) = 1; TZ = '':TZ
             CASE LEN(TZ) = 2; TZ = '':TZ
             CASE OTHERWISE;   TZ = TZ "L#3"
             END CASE
             PRINT @(61,2):'':TZ:'':TZ:''
             FOR LN = 1 TO 10
                PRINT @(69,2+LN):''
             NEXT LN
          END CASE

          FOR LN = 1 TO LN.CT
             GOSUB DISP.LN
          NEXT LN
          VCLR LN.CT+1

          RETURN
*-------------------------------------------------------------------------*
DISP.LN:  *** display one generation line

          GN        = GENS<LN>
          STAT.CODE = LED(6)<1,GN>
          SHIP.DATE  = LED(9)<1,GN>
          SVIA      = LED(70)<1,GN>

          OE.STATUS.CONV OID%,GN,STAT.CODE,STAT.DESC,,INP.PRT,PRT.STAT
IN$$9:    INP.PRTS<LN> = INP.PRT
          IF SHIP.DATE>84000 THEN SHIP.DATE = ''
          VPRINT  0,LN,LED(2)<1,GN,1>                  "R#4"
          VPRINT  5,LN,LED(2)<1,GN,2>                  "R#4"
          VPRINT  10,LN,STAT.DESC                      "L#37"
          VPRINT 49,LN,OCONV(SHIP.DATE,'D4/')          "L#10"
          BEGIN CASE
          CASE VIEW = 1
             VPRINT 60,LN,SVIA                          "L#18"
          CASE VIEW = 2
             GOSUB DISP.EDATE
          CASE VIEW = 3
             GOSUB DISP.DTIME
          END CASE

          RETURN
*-------------------------------------------------------------------------*
DISP.EDATE: *** display earliest shipdate

          STAT = LED(6)<1,GN,1>
          BEGIN CASE
          CASE STAT = '$'; EDATE = 'Deposit'
          CASE STAT = 'Y'; EDATE = 'Direct'
          CASE STAT = 'D'; EDATE = 'Direct'
          CASE OTHERWISE
             OE.EARLIEST.SHIPDATE OID%,GN,EDATE
             IF EDATE<=DATE() AND EDATE#'' THEN EDATE = 'Now'
          END CASE
          VPRINT 60,LN,OCONV(LED(10)<1,GN>,'D2/')         "L#8":' '
          VPRINT 70,LN,OCONV(EDATE,'D2/')                 "L#8"

          RETURN
*-------------------------------------------------------------------------*
DISP.DTIME: *** display delivery time

          READV DDATA FROM LEDLFILE,OID%,16 ELSE DDATA = ''
          DTIME        = DDATA<1,GN,1>
          ACT.DTIME    = DDATA<1,GN,2>
          ACT.DTIME.CD = ''
          IF ACT.DTIME = '' THEN
             READV MNFST.IDS FROM LEDLFILE,OID%,17 ELSE MNFST.IDS = ''
             MNFST.ID = MNFST.IDS<1,GN>
             IF MNFST.ID # '' THEN
                UT.OPEN.FILE 'MANIFESTS',MNFSTFILE,ERR.MSG,YES
                IF ERR.MSG = '' THEN
                   READ MNFST FROM MNFSTFILE,MNFST.ID THEN
                      IF LED(8)<1,GN> THEN
                         TICKET.NO = OID%:'.':LED(8)<1,GN>"R%3"
                      END ELSE
                         TICKET.NO = OID%:'.':LED(12)<1,GN>"R%4"
                      END
                      FINDSTR TICKET.NO IN MNFST<15> SETTING XX,STP,XX THEN
                         ACT.DTIME    = MNFST<11,STP>
                         ACT.DTIME.CD = 'e'
                      END
                   END
                END
             END
          END
          IF DTIME = '' THEN
             * get normal delivery time for cust/vend
             READV DTIME FROM CUSFILE,LED(5)<1,GN>,87 ELSE DTIME = ''
             IF DTIME = '' THEN
                ZIPCD = LED(75)<1,GN>
                IF LEN(FIELD(ZIPCD,'-',1))=5 AND NUM(ZIPCD[1,5]) THEN ZIPCD=ZIPCD[1,5]
                READ ZREC FROM ZIPFILE,ZIPCD ELSE ZREC = ''
                SVIA = ''
                LOCATE LED(2)<1,GN,2> IN ZREC<11> SETTING ZPS THEN
                   SVIA = ZREC<12,ZPS>
                END
                IF SVIA = '' THEN SVIA = ZREC<7>
                IF SVIA = LED(70)<1,GN> THEN
                   DTIME = ''
                   LOCATE LED(2)<1,GN,2> IN ZREC<11> SETTING ZPS THEN
                      DTIME = ZREC<13,ZPS>
                   END
                   IF DTIME = '' THEN DTIME = ZREC<8>
                END
             END
             VPRINT 60,LN,OCONV(DTIME,'MTH')          "L#8":''
          END ELSE
             VPRINT 60,LN,OCONV(DTIME,'MTH')          "L#7":'*'
          END
          VPRINT 69,LN,ACT.DTIME.CD"L#2":OCONV(ACT.DTIME,'MTH')  "L#7"

          RETURN
*-------------------------------------------------------------------------*
CHECK.POST: *** check GL postings

          NO.CHANGE = NO
          IF MODE%='P' OR (MODE%='S' AND LED(33)<1,GEN%>) THEN NULL ELSE RETURN
          IF MODE%='S' THEN
             LOCATE LED(33)<1,GEN%> IN LED(12)<1> SETTING PGN ELSE PGN=1
          END ELSE
             PGN = GEN%
          END
          AR.ID = OID%:'.':LED(8)<1,PGN>"R%3"
          READV AP.AIDS FROM ARFILE,AR.ID,2 ELSE AP.AIDS = ''
          AP.ID = AP.AIDS<1,2>
          IF AP.ID#'' THEN
             AP.OID = FIELD(AP.ID,'.',2)
             AR.ID  = OCONV(AP.ID,'G1.2')
             READV AP.BAL FROM ARFILE,AR.ID,8 ELSE AP.BAL = ''
             IF AP.BAL<1,2>+0=0 THEN
                NO.CHANGE = YES
             END ELSE
                CHK.GL.POST FIELD(AP.ID,'.',1),OK,AP.OID
                IF NOT(OK) THEN NO.CHANGE = YES
             END
          END

          RETURN
*-------------------------------------------------------------------------*
SUBS:     IF LOCK.REQ.DTS THEN PRINT BELL:; RETURN
          ON OPTION GOTO HEADER, BODY, TOTALS, VIEW.CHG, MANIFEST, SCHEDULE.DET, VIEW.ITEMS, ALL.COMPLETE, BID.FLWUP, SHP.AVL, PRT.OPTS, CONF.PROC, LABELS, PROC.ALL, XDOCK, DROP.PT,SHIPMENT.ID,SHIP.DET,STATUS.INQ
*-------------------------------------------------------------------------*
HEADER:   *** display the OE Header screen

          IF CUR.STAT='$' THEN PRINT BELL:; RETURN
          GN = GENS<LINE>
          VONLY = NOT(EDIT.OK) OR VIEW.ONLY%
          IF VONLY AND (MODE% = 'S' OR MODE% = 'R') AND CUR.STAT # 'Y' THEN
             * Add a flag on vonly to allow users in soe.header to
             * update notes while keeping the ledger record locked.
             VONLY = VONLY:VM:(NOT(VIEW.ONLY%) AND NOT(EDIT.OK))
          END

          * Save off the original CUS/CUSS for directs. OE.HEADER refreshes
          * CUS/CUSS with vendor info and this was causing a redisplay
          * issue when attempting to go back into the body of the order.
          IF LED(6)<1,GN,1> = 'Y' THEN
             MATBUILD SV.CUS FROM CUS
             MATBUILD SV.CUSS FROM CUSS
          END

          OE.HEADER OID%,GN,LOG.MV%,NEW.ORDER%,REDISP,'Status',VONLY,POST.ENTRY%

          * Change CUS/CUSS back before OE.HEADER was called.
          IF LED(6)<1,GN,1> = 'Y' THEN
             MATPARSE CUS FROM SV.CUS
             MATPARSE CUSS FROM SV.CUSS
          END

          IF MOVE  = 2 THEN RETURN TO FILEIT
          SAV.LINE = LINE

          RETURN TO REDISP
*-------------------------------------------------------------------------*
BODY:     *** display the OE Body screen

          MOVE = 2
          BACK.TO.BODY = YES

          RETURN TO FILEIT
*-------------------------------------------------------------------------*
TOTALS:   *** display the OE Totals screen

          IF CUR.STAT = 'D' OR CUR.STAT = 'Y' THEN
             VONLY = VIEW.ONLY%
          END ELSE
             VONLY = NOT(EDIT.OK) OR VIEW.ONLY%
          END
          OE.TOTALS OID%,GEN%,LOG.MV%,NEW.ORDER%,'Status',,VONLY
          IF MOVE=2 THEN RETURN TO FILEIT
          SAV.LINE = LINE

          RETURN TO REDISP
*-------------------------------------------------------------------------*
VIEW.CHG: *** Change the data view on the screen.

          IF COL > MIN.COLS THEN PRINT BELL:; RETURN

          VIEW.TBL = 'Ship Via':VM:'Req Date / Complt Date':VM:'Delivery Times'
          MENU.TABLE VAR,30,10,1,3,35,,,VIEW.TBL,'View Choices',VIEW
          LOCATE VAR IN VIEW.TBL<1> SETTING NEW.VIEW ELSE NEW.VIEW = VIEW
DISP.NEW.VIEW: *
          IF NEW.VIEW = VIEW THEN RETURN

          COLS = MIN.COLS + 1
          VIEW = NEW.VIEW
          GOSUB DISPLAY

          RETURN
*-------------------------------------------------------------------------*
MANIFEST: *** display the Shipment Manifest screen

          IF REMOTE.CUST   THEN RETURN
          IF LED(129)<1,2> THEN RETURN
          READV MNFST.IDS FROM LEDLFILE,OID%,17 ELSE MNFST.IDS=''
          MNFST.ID = MNFST.IDS<1,GEN%>
          IF MNFST.ID = '' THEN
             MESS 10,14,BELL:'This generation is not on a manifest'
          END ELSE
             EXEC.PGM "SOE.MANIFEST.QUEUE",MNFST.ID:',,4'
             UPDATE.LEDGER.CHECK OID%,GEN%
          END

          RETURN
*-------------------------------------------------------------------------*
SCHEDULE.DET: *** display the OE Schedule Detail screen

          IF VIEW.ONLY%    THEN PRINT BELL:; RETURN
          IF LED(129)<1,2> THEN RETURN
          OE.SCHEDULE.ALL MAT OE.VARS,MAT OE.SFLAGS,MAT PAF.DATA,'Status',SHP.DT.CHGD.FLG
          IF MOVE=2 THEN RETURN TO FINISH

          RETURN TO REDISP
*-------------------------------------------------------------------------*
VIEW.ITEMS: *** display the OE View Items screen

          GN = GENS<LINE>
          IF LED(6)<1,GN,1>='$' THEN PRINT BELL:; RETURN
          SV.GEN = GEN%
          GEN%   = GN
          OE.VIEW.ITEMS MAT OE.VARS
          GEN%   = SV.GEN

          RETURN
*-------------------------------------------------------------------------*
ALL.COMPLETE: *** flag all items on all gens as complete

          IF VIEW.ONLY% THEN RETURN
          OE.ALL.COMPLETE OID%,LOG.MV%,QSIGN%

          RETURN TO REDISP
*-------------------------------------------------------------------------*
BID.FLWUP: *** display the OE Bid Follow Up screen

          FLWUP.OK = NO
          FOR GN = 1 TO GEN.CT UNTIL FLWUP.OK
             IF LED(6)<1,GN,1>='B' THEN FLWUP.OK = YES
          NEXT GN
          IF NOT(FLWUP.OK) THEN
             MESS 10,14,BELL:'No Bids to follow up on'
             RETURN
          END
          OE.FOLLOW.UP OID%,,VIEW.ONLY%

          RETURN
*-------------------------------------------------------------------------*
BID.FLWUP.REQ: *** display the OE Bid Follow Up screen

          FLWUP.OK = NO
          FOR GN = 1 TO GEN.CT UNTIL FLWUP.OK
             IF LED(6)<1,GN,1>='B' THEN FLWUP.OK = YES
          NEXT GN
          IF NOT(FLWUP.OK) THEN
             MESS 10,14,BELL:'No Bids to follow up on'
             RETURN
          END
          OE.FOLLOW.UP.PLUMB OID%,,VIEW.ONLY%

          RETURN
*-------------------------------------------------------------------------*
SHP.AVL:  *** ship all avail gens

          IF VIEW.ONLY% THEN RETURN
          SOE.SHIP.ALL.AVL.GENS OID%,SHP.GEN=SHP.GEN
          IF SHP.GEN # 0 THEN GEN% = SHP.GEN

          RETURN TO REDISP
*-------------------------------------------------------------------------*
PRT.OPTS: *** Allow user to print/fax/email order

          * Allowing user to get appropriate authorization code if
          * they themselves are not authorized to print order
          IF NOT(POE.PRT) THEN
             GOSUB CHK.AUTH
             IF NOT(ACTION.OK) THEN RETURN
          END

          * Users with level one authorization can only print
          * PO's with negative totals.
          IF POE.PRT.LVL = 1 THEN
             IF POE.PRT.TTL >= 0 THEN
                GOSUB CHK.AUTH
                IF NOT(ACTION.OK) THEN RETURN
             END
          END

          * See if target needs to be checked before entering OE.PRT.OPTS
          CHK.TARGET = NO
          BEGIN CASE
          CASE LED(8)<1,GEN%> # ''
             * Don't check if gen is already received
             CHK.TARGET = NO
          CASE MODE% = 'P' AND CUSS(165) # ''
             CHK.TARGET = YES
          CASE MODE% = 'S'
             CHK.TARGET = NO
             LOCATE 'D' IN LED(6)<1> SETTING X THEN
                READV CHK.TARGET FROM CTRLFILE,'DIR.VEN.MIN',1 ELSE NULL
             END
             * see if we need to go to totals screen for payment on direct
             IF INDEX('DY',LED(6)<1,GEN%>,1) THEN
                GOSUB CHECK.VIA
                IF VIA.ERR THEN RETURN TO MOVENEXT
                READ SVIA.CASH FROM CTRLFILE,'SOE.CASH.REQD.CHECK' ELSE
                   SVIA.CASH = ''
                END
                * check only this direct gen
                SV.GEN = GEN%
                IF LED(6)<1,GEN%> = 'Y' THEN
                   LOCATE LED(33)<1,GEN%> IN LED(12)<1> SETTING GEN% ELSE NULL
                END
                PSTAT = ''
                NEXT.SHIP.GEN.LIST = GEN%
                GOSUB CHECK.SHIP.VIA
                * these calls will set DO OPEN TOTALS if totals screen ness
                GOSUB CHECK.CC
                GOSUB CHECK.CASH
                GEN% = SV.GEN
             END
          CASE OTHERWISE
             CHK.TARGET = NO
          END CASE

          IF CHK.TARGET THEN
             POE.TARGET.CHECK OID%,GEN%,TARGET.OK
             IF TARGET.OK THEN
                OE.PRINT.OPTS OID%,GEN%,,,VIEW.ONLY%,DO.OPEN.TOTALS
             END
          END ELSE
             OE.PRINT.OPTS OID%,GEN%,,,VIEW.ONLY%,DO.OPEN.TOTALS
          END

          RETURN
*-------------------------------------------------------------------------*
UPD.LINE: *** update status line

          IF VIEW.ONLY% THEN
             IF HAJOCA.SITE$ AND RECV.GEN.ONLY THEN
                NULL
             END ELSE
                RETURN
             END
          END
          UPDATE.LEDGER OID%,GEN%

          RETURN
*-------------------------------------------------------------------------*
UPD.SHIPDATE: *** update shipdate

          IF VIEW.ONLY% THEN
             IF HAJOCA.SITE$ AND RECV.GEN.ONLY THEN
                NULL
             END ELSE
                RETURN
             END
          END
          IF DONT.CHECK.AVAIL THEN
             CHK.AVAIL = NO
          END ELSE
             CHK.AVAIL = (MODE%='S' OR (MODE%='T' AND GEN%=1))
          END
          DONT.CHECK.AVAIL = ''
          CHK.ONLY  = MODE%='S'
          OLD.SHPDT = LED(9)<1,GEN%>
          ERR.CODE  = ''
          CHK.BT = LED(1)<1,GEN%>
          CHK.ST = LED(5)<1,GEN%>
          GOSUB LOAD.CUS.CUSS

          IF CHK.ONLY THEN
             * On sales orders we need to run a check first to determine
             * if the sales order has been paid. If the user has the auth
             * key OE.CLOSED.CHANGE.SHIPDATE then we just warn them
             * otherwise we are going to through an error and disallow
             * We need to run a similar check if the PO side of direct
             * has been reconciled.  If so, we will warn user
             IF SHP.DATE = '' THEN
                SHP.DATE = LED(9)<1,GEN%>
             END
             OE.CHANGE.SHIPDATE OID%,GEN%,SHP.DATE,QSIGN%,LOG.MV%,CHK.AVAIL,ERRMSG,YES,,ERR.CODE

             BEGIN CASE
             CASE ERR.CODE = 5 OR ERR.CODE = 6
                * 5 = Authorized for cash receipt action
                * 6 = PO side of reconciled payable
                MSG     = ERRMSG
                CONVERT VM TO AM IN MSG
                MSG<-1> = 'Continue (Y/N) : '
                SURE    = 'N'
IN$$16:         INP.PROMPT SURE,MSG,'YN',1
                ERRMSG = ''
                IF SURE THEN
                   OE.CHANGE.SHIPDATE OID%,GEN%,SHP.DATE,QSIGN%,LOG.MV%,CHK.AVAIL,ERRMSG
                END
             CASE NOT(ERRMSG)       ;* Change Ship Date
                * Don't send in CHK.AVAIL because we already checked above
                OE.CHANGE.SHIPDATE OID%,GEN%,SHP.DATE,QSIGN%,LOG.MV%,,ERRMSG
             CASE OTHERWISE         ;* Error and not auth.
             END CASE
          END ELSE
             OE.CHANGE.SHIPDATE OID%,GEN%,SHP.DATE,QSIGN%,LOG.MV%,CHK.AVAIL,ERRMSG
          END

          CTRB.ID = 'MIRROR.REQ.DT~':LED(2)<1,GEN%,2>
          READV MIRROR FROM CTRBFILE,CTRB.ID,1 ELSE MIRROR = ''
          IF NEW.ORDER% AND NOT(ERRMSG) AND MIRROR AND MODE% = 'S' THEN
             ** If there are lead time days spec'd, add them
             IF CUSS(75) THEN
                LED(10)<1,GEN%> = SHP.DATE + CUSS(75)
                   END ELSE
                LED(10)<1,GEN%> = SHP.DATE
             END
             UPDATE.LEDGER OID%,GEN%
          END
          GOSUB DISPLAY
          IF ERRMSG THEN
             VSCROLL.GET.VER LINE,VER
             IF ERR.CODE = 4 THEN
                ERR.MESS 10,VER+2,ERRMSG
             END ELSE
                MESS 10,VER+2,BELL:ERRMSG
             END
             ERR = YES
          END ELSE ERR = NO

          LOCATE GEN% IN GENS SETTING LINE ELSE LINE = 1
          IF ABC.ENABLED THEN
             IF NOT(ABC.LOGGED) THEN
                ACD = 'SCKAQ'
                LOCATE LED(6)<1,GEN%> IN VALID.STATS<1> SETTING POS THEN
                   STAT.DESC = UPCASE(HELP.STATS<1,POS>)
                   IF INDEX(STAT.DESC,'SHIP',1) THEN
                      ACD = 'CQSCHDEL'; * Delivery Scheduled *
                   END ELSE
                      OE.ACD.GET ACD,LED(6)<1,GEN%>
                   END
                END
                GOSUB SET.DATA
                GOSUB LOG.ABC
             END
          END
          OE.LOT.CHECK.STATUS LOT.STAT,OID%,GEN%
          IF LOT.STAT = 2 THEN
             OE.LOT.CHNG.SHIPDATE.LOG OID%,GEN%,OLD.SHPDT
             GOSUB UPD.LINE
          END
          MATBUILD SV.LD FROM LD
          MATBUILD SV.OLD.LD FROM OLD.LD
          SV.LDID = LDID%
          OE.GET.LDID.LIST LDID.LIST,OID%,GEN%
          LDCNT = DCOUNT(LDID.LIST,VM)
          FOR LI = 1 TO LDCNT
             LDID% = LDID.LIST<1,LI>
             LD.GET LDID%
             IF LD(124) OR LD(122) THEN
                IF LD(124) THEN
                   MATBUILD SV.LD FROM LD
                   MATBUILD SV.OLD.LD FROM OLD.LD
                   SVLDID = LDID%
                   LDID% = LD(124)
                   LD.GET LDID%
                   COMP.LIST = LDID%:VM:LD(122)
                   MATPARSE LD FROM SV.LD
                   MATPARSE OLD.LD FROM SV.OLD.LD
                   LDID% = SVLDID
                END
                IF LD(122) THEN COMP.LIST = LDID%:VM:LD(122)
                IF NOT(LD(125)) THEN
                   OE.MOVE.PRICE.COST OID%,GEN%,LDID%,QSIGN%,COMP.LIST
                END
             END
          NEXT LI

          MATPARSE LD FROM SV.LD
          MATPARSE OLD.LD FROM SV.OLD.LD
          LDID% = SV.LDID

          RETURN
*-------------------------------------------------------------------------*
CONF.PROC: *** confirm procurement

          IF VIEW.ONLY% THEN PRINT BELL:;RETURN
          EXEC.PGM "PROCURE.EDIT",OID%:",":GEN%:",,":YES
          MATREAD LED FROM LEDFILE,OID% ELSE RETURN TO FINISH
          UPDATE.LEDGER.CHECK OID%,GEN%

          RETURN TO START
*-------------------------------------------------------------------------*
LABELS:   *** Call to Label Routines

          READV SORT.PO FROM CTRLFILE,'SORT.JOHNSTONE.PO',1 ELSE SORT.PO=''

          * We need to update the ledger before calling label routines
          * Like for Johnstone that does a sort of the PO.
          IF SORT.PO THEN
             JS.SORT.PO OID%,GEN%
          END
          OE.LABEL.PRINT OID%,GEN%

          RETURN
*-------------------------------------------------------------------------*
PROC.ALL: *** allow the user to procure all items

          IF VIEW.ONLY% THEN PRINT BELL:; RETURN
          GN = GENS<LINE>
          OE.PROCURE.ALL OID%,GN,LOG.MV%,VIEW.ONLY%,NEW.ORDER%
          MATREAD LED FROM LEDFILE,OID% ELSE RETURN TO FINISH
          UPDATE.LEDGER.CHECK OID%,GN
          OE.DEL.NULL.GENS OID%,GN
          SHIP.TAG.ALONGS.TOGETHER MAT OE.VARS
          RETURN TO START
*-------------------------------------------------------------------------*
UPD.STAT: *** update gen status

          IF VIEW.ONLY% THEN
             IF HAJOCA.SITE$ AND RECV.GEN.ONLY THEN
                NULL
             END ELSE
                RETURN
             END
          END

          OS    = LED(6)<1,GEN%,1>
          ODIR  = LED(33)<1,GEN%>
          GN.CT = DCOUNT(LED(12),VM)
          IF NEW.ORDER% THEN
             PASS.NS = NEW.STAT:VM:NEW.ORDER%
          END ELSE
             PASS.NS = NEW.STAT
          END
          OID.DATA$<8> = NEW.ORDER%

          * On receipt of PO, we need to make sure all freight is
          * properly posted considering freight allowed setting
          * If freight still needs to be posted on receipt, take user
          * into PO totals screen
          CHK.FRT = (MODE% = "P" AND OS # "R" AND NEW.STAT = "R")
          IF CHK.FRT THEN GOSUB FRT.TOTALS

          WRN.MSG = ''
          OE.UPDATE.STATUS OID%,GEN%,QSIGN%,LOG.MV%,PASS.NS,ERR.MSG,,,,WRN.MSG
          IF WRN.MSG THEN
             * If this is a Receiving Branch error, display the message
             IF WRN.MSG<2>[1,18] = "THE RECEIVE BRANCH" THEN
                MESS 8,10,WRN.MSG
             END
          END

          * Delete all partial kit line items if we cancelled a
          * generation that had a partial kit on it
          IF DEL.ALL AND NEW.STAT = 'X' AND NOT(ERR.MSG) THEN
             SOE.DELETE.PARTIAL.KIT MAT OE.VARS,BO.KIT.LDIDS
             OE.DEL.NULL.GENS OID%
             GOSUB DISPLAY
          END

          * Check to see if direct consignment has been 'I'nvoiced.
          * If so need to put order in View.Only
          DIR.CONSIGN = (LED(110)<1,1> = 'S' AND LED(33)<1,GEN%>)
          IF LED(8)<1,GEN%> AND DIR.CONSIGN THEN
             VIEW.ONLY% = YES
             PRINT @(2,0):BLINK$:'View Only':NORM$
          END

          IF OS    = "D" AND NEW.STAT # "D" THEN
             GOSUB CHK.RETURNS
             GOSUB DISP.REM
          END
          NEW.STAT = PASS.NS

          * Auths should be obtained for pick up now orders
          * if the order requires pre-auth or auth before
          * shipment.  (Not valid for "I" gens, since we have already
          * run OE.PROCESS.ORDER by this point.)
          IF NEW.STAT = 'P' AND LED(121) AND NOT(ERR.MSG) THEN
             GOSUB VERF.CC
          END

          * Display error message - Because of the new DISP.MESS logic
          * that will call INP when in vscroll region, we don't need
          * an INP after message display
          IF ERR.MSG THEN
             GOSUB DISPLAY.ERR
          END

          IF GN.CT#DCOUNT(LED(12),VM) OR NEW.STAT='X' OR OS= 'X' OR ODIR THEN
             GOSUB DISPLAY
             LOCATE GEN% IN GENS SETTING LINE ELSE LINE = 1
          END ELSE
             LN = LINE; GOSUB DISP.LN
          END

          PO.CHK  = (CUSS(45)<1,1>#'' AND CUSS(45)<1,1>#'R' AND CUSS(45)<1,1>#0 AND CUSS(45)<1,1>#'N' AND LED(13)<1,GEN%>='')
          REL.CHK = (CUSS(45)<1,1>='R' OR CUSS(45)<1,1>='B' AND LED(65)<1,GEN%>='')
          IF ABC.ENABLED THEN
             IF NOT(ABC.LOGGED) AND NEW.STAT # 'X' THEN
                ACD = 'SCKAQ'
                LOCATE NEW.STAT IN VALID.STATS<1> SETTING POS THEN
                   STAT.DESC = UPCASE(HELP.STATS<1,POS>)
                   IF INDEX(STAT.DESC,'SHIP',1) THEN
                      ACD = 'CQSCHDEL'; * Delivery Scheduled *
                   END ELSE
                      OE.ACD.GET ACD,NEW.STAT
                   END
                END
                GOSUB SET.DATA
                GOSUB LOG.ABC
             END
          END

          IF MODE%='S' AND (PO.CHK OR REL.CHK) AND OS='B' AND LED(6)<1,GEN%>#'X' AND LED(6)<1,GEN%>#'B' THEN
             OE.HEADER OID%,GEN%,LOG.MV%,NEW.ORDER%,REDISP,'Status',,POST.ENTRY%
             QUIT = NO
          END

          RETURN
*-------------------------------------------------------------------------*
FRT.TOTALS: *** If there was a freight amount and we are distributing
          *** freight USING Bill Freight to Tagged Sales Orders Logic
          *** we need to make sure this has not been missed by not going
          *** to the Total Screen

          OE.CALC.FGHT OID%,GEN%,FGHT,FGHT.IN
          IF LED(69)<1,GEN%,2> AND FGHT THEN
             POE.RECALC.FREIGHT OID%,GEN%
          END

          GOSUB CHECK.TOTALS.REQD
          IF TOTALS.REQD THEN
             POE.TOTALS OID%,GEN%,LOG.MV%,'Status',VIEW.ONLY%,REDISP,YES:AM:YES
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.TOTALS.REQD: *** check if we need to display the POE totals screen

          TOTALS.REQD = NO

          * Don't bother checking freight if there is no freight rule on PO
          IF NOT(LED(69)<1,GEN%,1>) THEN RETURN

          * init vendor freight term settings
          FRT.DATA          = LED(69)<1,GEN%,1>
          VEN.FREIGHT.TERMS.INIT FRT.DATA,,FRT.TERM.VALUES
          FREIGHT.VEND.REQD = FRT.TERM.VALUES<3>
          PO.FREIGHT.REQD   = FRT.TERM.VALUES<4>
          BOL.REQD          = FRT.TERM.VALUES<6>

          * Verify a freight vendor was entered
          IF FREIGHT.VEND.REQD AND NOT(LED(93)<1,GEN%,2>) THEN
             TOTALS.REQD = YES
             RETURN
          END

          * Verify a freight amount was entered
          IF PO.FREIGHT.REQD AND NOT(FGHT) THEN
             TOTALS.REQD = YES
             RETURN
          END

          * Verify a Bill of Lading was entered
          IF BOL.REQD AND NOT(LED(93)<1,GEN%,3>) THEN
             TOTALS.REQD = YES
             RETURN
          END

          RETURN
*-------------------------------------------------------------------------*
XDOCK:    *** Cross dock entry

          IF LED(6)<1,GEN%> # 'R' THEN
             PRINT BELL:
             RETURN
          END
          XDOCK OID%,GEN%
          QUIT = NO

          RETURN
*-------------------------------------------------------------------------*
DROP.PT:  *** display OE Drop Point Entry screen

          OE.DROP.POINT.MAINT OID%,GEN%,VIEW.ONLY%

          RETURN
*-------------------------------------------------------------------------*
SHIPMENT.ID: *** View Shipment (P/Os & Transfers Only)

          IF ASN.ID THEN
             MATBUILD SV.LED FROM LED
             SHIPMENT.MAINT ASN.ID:AM:LED(2)<1,GEN%,2>:AM:YES
             MATPARSE LED FROM SV.LED
          END

          RETURN
*-------------------------------------------------------------------------*
SHIP.DET: *** Run the Order Shipment Details
          OE.SHIPMENT.DETAILS OID%

          RETURN
*-------------------------------------------------------------------------*
STATUS.INQ:*** Open the screen containing the available status inquiries
          OE.STATUS.INQS OID%,GEN%

          RETURN
*-------------------------------------------------------------------------*
CHECK.TAGS: *** check tags

          TAGGED = NO
          LD.CT  = LED(50) - 1
          G.CT   = DCOUNT(LED(12),VM)
          UPDATE.LEDGER.CHECK OID%
          SAVE.LDID = LDID%
          MATBUILD SAVE.LD FROM LD
          MATBUILD SAVE.OLD.LD FROM OLD.LD

          * Loop through each line item and each gen's locs to find a tag
          FOR LDID% = 1 TO LD.CT
             LD.GET LDID%
             FOR GX  = 1 TO G.CT
                LOC.CT = DCOUNT(LD(7)<1,GX>,SVM)
                FOR LLN = 1 TO LOC.CT
                   IF LD(7)<1,GX,LLN>[1,2] = "T~" THEN
                      TAGGED = YES
                      EXIT
                   END
                NEXT LLN
                IF TAGGED THEN EXIT
             NEXT GX
             IF TAGGED THEN EXIT
          NEXT LDID%

          LDID% = SAVE.LDID
          MATPARSE LD FROM SAVE.LD
          MATPARSE OLD.LD FROM SAVE.OLD.LD

          RETURN
*-------------------------------------------------------------------------*
FILEIT:   *** file changes

          IF ((CUR.STAT = "Y") AND LED(8)<1,GEN%> AND OE.LOCKED.DIR$) THEN
             * Set gen to sales gen
             XGID = LED(33)<1,GEN%>
             LOCATE XGID IN LED(12)<1> SETTING GEN% ELSE GEN%=1
          END
          VIEW.ONLY% = INIT.VIEW.ONLY

          * Before printing POs verify that the total meets the vendors
          * minimum target level. For direct SOEs only check the target
          * level when the include directs control is set to yes.
          BEGIN CASE
          CASE BACK.TO.BODY
             CHK.TARGET = NO
          CASE MODE% = 'P' AND CUSS(165) # ''
             CHK.TARGET = YES
          CASE MODE% = 'S'
             CHK.TARGET = NO
             GOSUB NO.PAYMENTS.ON.BIDS
             LOCATE 'D' IN LED(6)<1> SETTING X THEN
                READV CHK.TARGET FROM CTRLFILE,'DIR.VEN.MIN',1 ELSE NULL
             END
          CASE OTHERWISE
             CHK.TARGET = NO
          END CASE

          IF CHK.TARGET THEN
             READV PRT.STATS FROM LEDLFILE,OID%,9 ELSE PRT.STATS = ''
             READV OLD.STATS FROM LEDLFILE,OID%,8 ELSE OLD.STATS = ''
             CHKD   = NO
             GEN.CT = DCOUNT(LED(12),VM)
             FOR GN = 1 TO GEN.CT UNTIL TARGET.OK
                PRT = PRT.STATS<1,GN>
                IF PRT='Y' OR PRT='F' OR PRT='A' OR PRT='E' THEN
                   TGEN = LED(12)<1,GN>
                   IF MODE% = 'S' THEN
                      IF LED(6)<1,GN> # 'D' THEN
                         IF LED(48)<1,GN> # 'DIRECT' THEN CONTINUE
                         TGEN = LED(33)<1,GN>
                      END
                   END
                   IF NOT(CHKD) THEN ;* Only check and prompt user once
                      IF LED(8)<1,TGEN> # '' THEN CONTINUE
                      POE.TARGET.CHECK OID%,TGEN,TARGET.OK
                      CHKD = YES
                   END
                   IF NOT(TARGET.OK) THEN
                      PRT = OLD.STATS<1,GN>
                      OE.UPD.PRINT.STAT OID%,GN,PRT
                      GOTO START
                   END
                END
             NEXT GN
          END

          IF VIEW.ONLY% THEN
             IF HAJOCA.SITE$ AND RECV.GEN.ONLY THEN
                OE.UNLOCK.LED OID%
             END
             GOTO FINISH
          END
          IS.NEW = NEW.ORDER%
          IF IS.NEW THEN
             OE.IS.NEW.ORDER OID%,IS.NEW
          END
          IF F12 THEN
             COMMIT.CO = NO
             IF LED(129)<1,2> AND LED(128)<1,8> = 'C' THEN COMMIT.CO = YES
             IF IS.NEW AND NOT(COMMIT.CO) THEN
                OE.DEL.ORDER OID%,QSIGN%,NO.PROMPT
                IF QUIT THEN
                   GOSUB CHECK.TAGS
                   IF TAGGED THEN
                      NEW.ORDER% = NO
                      GOTO NOW.OLD
                   END
                END
                IF QUIT THEN LASTKEY=0; MOVE=0; QUIT=0; GOTO MOVENEXT

                * Logic to Remove new Order from User History List if F12
                BEGIN CASE
                CASE MODE% = 'S'
                   USER.LOG.HISTORY '1',OID%,YES
                CASE MODE% = 'P'
                   USER.LOG.HISTORY '2',OID%,YES
                CASE MODE% = 'T'
                   USER.LOG.HISTORY '3',OID%,YES
                END CASE

                OID%    = ''
                LOG.MV% = ''

                GOTO FINISH
             END ELSE
                LASTKEY = 0; MOVE = 0; QUIT = 0
                GOTO MOVENEXT
             END
          END ELSE
             GOSUB CHECK.TAGS
             IF TAGGED THEN NEW.ORDER% = NO
          END

          *ST.CN = LED(5)<1,GEN%>
          *IF NEW.ORDER%  AND MODE% = 'S' THEN
          *IF LED(6)<1,GEN%> = 'B' AND ST.CN = '4358' THEN
          *GOSUB BID.FLWUP.REQ
          *END
          *END


          * Sets PO.CHK.2 to see if customer is PO required; if so, checks
          * all gens to ensure that their PO's have been filled in. If not
          * then the user is prompted with a warning message.  Addition:
          * Addition: prompt does not display if an element of an order is
          * a bid, a direct shipment, or a payment.
          PO.CHK.2 = (CUSS(45)<1,1>#'' AND CUSS(45)<1,1>#'R' AND CUSS(45)<1,1>#0 AND CUSS(45)<1,1>#'N')
          SV.MOVE  = MOVE
          IF MODE% = 'S' AND PO.CHK.2 THEN
             PO.PROMPT = NO
             GEN.CT  = DCOUNT(LED(12),VM)
             FOR GN = 1 TO GEN.CT
                IF (LED(13)<1,GN>='') AND (LED(6)<1,GN>#'$') AND (LED(6)<1,GN>#'Y') AND (LED(6)<1,GN>#'B') AND (LED(6)<1,GN>#'X') THEN
                   PO.PROMPT = YES
                   EXIT
                END
             NEXT GN
             IF PO.PROMPT THEN
                PO.PROMPT.CONF = ''
                PO.PROMPT.TEXT = "Warning! All P.O.'s have not been filled in. Continue? (Y/N) : "
IN$$13:         INP.PROMPT PO.PROMPT.CONF,PO.PROMPT.TEXT,'YN',1
                IF NOT(PO.PROMPT.CONF) THEN GOTO START
             END
          END
          MOVE = SV.MOVE

NOW.OLD:  *** Compare original gids and original shipdates to new gids and
          *** and new shipdates to see if ship date values have really
          *** changed and if so, prompt user
          SHP.DT.CHG = NO
          IF ORIG.SHP.DTS AND NOT(NEW.ORDER%) AND CHK.ORIG.SHP<1,1> AND MODE% = 'S' AND MOVE # '2' AND NOT(VIEW.ONLY%) AND LED(6)<1,GEN%> # 'X' THEN
             NEW.GIDS   = LED(12)
             GID.CT     = DCOUNT(NEW.GIDS,VM)
             FOR GDN    = 1 TO GID.CT
                NEW.GID = NEW.GIDS<1,GDN>
                LOCATE NEW.GID IN ORIG.GIDS<1> SETTING GPOS THEN
                   NEW.SHP.DT = LED(9)<1,GDN>
                   OLD.SHP.DT = ORIG.SHP.DTS<1,GPOS>

                   IF OLD.SHP.DT AND NEW.SHP.DT # OLD.SHP.DT THEN
                      SHP.DT.CHG = YES
                      EXIT
                   END
                END
             NEXT GDN
             IF USER.ID#"TSMITH" THEN
             IF SHP.DT.CHG OR SHP.DT.CHGD.FLG THEN
                SURE = 'Y'
                MSG  = 'Ship Dates Have Changed, Edit Required Dates (Y/N) ? '
IN$$10:         INP.PROMPT SURE,MSG,'YN',3
                IF SURE THEN
                   NEW.VIEW = 2
                   GOSUB DISP.NEW.VIEW

                   LASTKEY = 0; MOVE = 0; QUIT = 0; COL = 4
                   ORIG.SHP.DTS = ''
                   LOCK.REQ.DTS = YES
                   GOTO MOVENEXT
                END
             END
          END
          END
          IF NEW.ORDER% AND MODE% = 'S' THEN
             FOR T = 1 TO DCOUNT(LED(10),VM)
                CTRB.ID = 'MIRROR.REQ.DT~':LED(2)<1,T,2>
                READV MIRROR FROM CTRBFILE,CTRB.ID,1 ELSE MIRROR = ''
                IF MIRROR THEN
                   ** If there are lead time days spec'd, add them
                   IF CUSS(75) THEN
                      LED(10)<1,T> = LED(9)<1,T> + CUSS(75)
                   END ELSE
                      LED(10)<1,T> = LED(9)<1,T>
                   END
                END
                UPDATE.LEDGER OID%,GEN%
             NEXT T

             IF NOT(BACK.TO.BODY) AND NOT(ABC.FLAG) THEN
                OE.UPDATE.ABC OID%
                ABC.FLAG = YES
             END
          END

          * Logic to add Order to the User History List
          BEGIN CASE
          CASE MODE% = 'S'
             USER.LOG.HISTORY '1',OID%
          CASE MODE% = 'P'
             USER.LOG.HISTORY '2',OID%
          CASE MODE% = 'T'
             USER.LOG.HISTORY '3',OID%
          END CASE

          IF MOVE=2 THEN GOTO FINISH
          IF IS.NEW AND NOT(TAGGED) THEN GOSUB CHK.DEL
          IF MODE%='S' THEN
             GOSUB CHECK.VIA
             IF VIA.ERR THEN GOTO MOVENEXT
             SV.GEN = GEN%
             GOSUB SET.NEXT.SHIP.GEN
             GEN% = NEXT.SHIP.GEN
             IF GEN% # 0 THEN
                READ SVIA.CASH FROM CTRLFILE,'SOE.CASH.REQD.CHECK' ELSE
                   SVIA.CASH = ''
                END
                GOSUB CHECK.SHIP.VIA
                GOSUB CHECK.CC
                IF MOVE=2 THEN
                   GEN% = SV.GEN
                   GOTO FINISH
                END
                GOSUB CHECK.CASH

                * Open the totals screen
                IF DO.OPEN.TOTALS THEN
                   OE.TOTALS OID%,GEN%,LOG.MV%,NEW.ORDER%,'Done',CHECK.REQD
                END

                IF MOVE=2 THEN
                   GEN% = SV.GEN
                   GOTO FINISH
                END
             END
             GEN% = SV.GEN

             * LN.CT is calculated in display.
             FOR GN = 1 TO LN.CT
                IF LED(6)<1,GN>#'Y' OR LED(6)<1,GN>#'$' THEN
                   SOE.CHECK.CUS OID%,GN,LED(1)<1,GN>,LED(5)<1,GEN%>,QSIGN%,LOG.MV%
                   * Exit after hitting SOE.CHECK.CUS
                   * This will set the GN to 1 which will update LED(1)
                   * correctly with the customer information
                   EXIT
                END
             NEXT GN
          END

          GOTO FINISH
*-------------------------------------------------------------------------*
CHECK.SHIP.VIA: *** Loop through ship vias list on order to determine if
          *** cash required should be checked.  If any gens are open
          *** and have the ship via flag set, we should pop up the box.

          SVIA.IGNORE.CASH.REQD = NO

          * Check our list of next ship gens.  These will be in status of
          * Pick Up Now, Invoice(if user JUST set to Invoiced status
          * manually), or Open status.  Typically, there is only one - the
          * NEXT.SHIP.GEN that's a P or as determined by OE.NEXT.SHIPDATE
          * But there may be more than one P gen if user set mutiple gens
          SHIPVIA.LIST = ''
          NEXT.GEN.CT = DCOUNT(NEXT.SHIP.GEN.LIST,AM)
          FOR NPOS = 1 TO NEXT.GEN.CT
             GN.II  = NEXT.SHIP.GEN.LIST(NPOS)
             GN.STAT = LED(6)<1,GN.II>
             IF GN.STAT='X' OR GN.STAT='Y' OR GN.STAT='$' THEN CONTINUE
             CURR.SHIPVIA = LED(70)<1,GN.II>
             LOCATE CURR.SHIPVIA IN SHIPVIA.LIST SETTING POS ELSE
                SHIPVIA.LIST<-1> = CURR.SHIPVIA
                READV IGNORE.C.REQD FROM SVIAFILE,CURR.SHIPVIA,5 ELSE
                   IGNORE.C.REQD = 'N'
                END
                *Determine if we should look at another ship via
                BEGIN CASE
                CASE IGNORE.C.REQD = 'Y'
                   *This ship via says to ignore it - keep looking though
                   SVIA.IGNORE.CASH.REQD = YES
                CASE IGNORE.C.REQD = 'P' AND PSTAT > 0
                   *If pick up now, then ignore it as well - keep looking
                   SVIA.IGNORE.CASH.REQD = YES
                CASE OTHERWISE
                   *We found a scenario that requires cash to be checked.
                   *Make sure the flag is set to check it and bail out NOW.
                   SVIA.IGNORE.CASH.REQD = NO
                   EXIT
                END CASE
             END
          NEXT NPOS
          RETURN
*-------------------------------------------------------------------------*
SET.NEXT.SHIP.GEN: *** Finds the next open ship gen when looking at cc
          *** required and or cash required.
             * See if there is a Pick-Up-Now gen anywhere on the order, and
             * check for Cash Req'd
             PSTAT = ''
             NEXT.SHIP.GEN.LIST = ''
             LOCATE 'P' IN LED(6)<1> SETTING GN THEN
                NEXT.SHIP.GEN  = GN
                PSTAT = GN

                * There could be multiple Pick Up Now gens with different
                * ship vias or dates.  Check for others, we will want to
                * check these to see if we prompt for cash or not
                TGN.CNT = DCOUNT(LED(9),VM)
                FOR TGN = GN TO TGN.CNT    ;* Start at GN, we know its 'P'
                   IF LED(6)<1,TGN> = 'P' THEN
                      NEXT.SHIP.GEN.LIST<-1> = TGN
                   END
                NEXT TGN
             END ELSE
                NEXT.SHIP.GEN = GEN%
                OE.NEXT.SHIPDATE NEXT.SHIP.GEN
                * If oe.next.shipdate returns a gen that is cancelled, change
                * this to a 0, because there was no other open gen.
                IF (NEXT.SHIP.GEN # 0 AND LED(6)<1,NEXT.SHIP.GEN> = 'X') THEN
                   NEXT.SHIP.GEN = 0
                END

                * If there is not a future shpmt of material, but curr gen
                * has been changed to 'I', still check credit card required
                IF NEXT.SHIP.GEN = 0 AND (LED(8)<1,GEN%> AND NOT(OINVN)) THEN
                   NEXT.SHIP.GEN = GEN%
                END

             END

             * If we don't have a list of gens to check, just check the
             * Next ship gen
             IF NEXT.SHIP.GEN.LIST = '' THEN
                NEXT.SHIP.GEN.LIST = NEXT.SHIP.GEN
             END
          RETURN
*-------------------------------------------------------------------------*
CHK.DEL:  *** Check for canceling a NEW ORDER, Delete call traces

          DEL.NEW = YES
          FOR J=1 TO GEN.CT
             IF LED(6)<1,J,1>#'X' OR LED(8)<1,J> THEN DEL.NEW = NO; EXIT
          NEXT J

          IF DEL.NEW THEN
             READV TST FROM LEDLFILE,OID%,1 ELSE TST = ''
             IF TST='' THEN
                OE.DEL.ORDER OID%,QSIGN%
                IF QUIT THEN RETURN TO IN.STAT
                OID%    = ''
                LOG.MV% = ''
                RETURN TO FINISH
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.VIA: *** Checks for valid ship via and requires a ship via for
          *** certain order statuses.

          VIA.ERR = NO
          IF VIEW.ONLY% THEN RETURN
          VIA.REQ = NO
          GEN.CT  = DCOUNT(LED(12),VM)
          FOR VGN = 1 TO GEN.CT
             STAT = LED(6)<1,VGN,1>
             SC   = (LED(28)<1,VGN>='S/C')

             * Requires ship via for all ship and pick up now statuses
             IF NOT(SC) AND STAT#'X' AND STAT#'B' AND STAT#'C' AND STAT#'Y' AND STAT#'$' AND STAT #'W' AND STAT #'L' THEN
                READV TST FROM SVIAFILE,LED(70)<1,VGN>,0 ELSE
                   CUR.STAT   = STAT
                   SV.GEN     = GEN%
                   GEN%       = VGN
                   GOSUB CHECK.AUTH
                   GEN%       = SV.GEN
                   IF EDIT.OK THEN
                      VIA.REQ = YES
                      EXIT
                   END
                END
             END
          NEXT VGN

          IF VIA.REQ THEN
             IF VIEW # 1 THEN NEW.VIEW = 1; GOSUB DISP.NEW.VIEW
             MESS 25,1,BELL:'Valid Shipvia is required'
             LOCATE VGN IN GENS SETTING LINE ELSE LINE = 1
             COL = 4; MOVE = 0; LASTKEY = 0; QUIT = 0
             VIA.ERR = YES
          END

          RETURN
*-------------------------------------------------------------------------*
NO.PAYMENTS.ON.BIDS: *** Warn the user if they are attempting to exit with
          *** a payment on an order with a bid gen and no open generations.

          STATUS.CT = DCOUNT(LED(6)<1>,VM)
          ONE.OPEN    = NO ;* True there is one open generation
          ONE.BID     = NO ;* True if there are one bid
          ONE.PAYMENT = NO ;* True if one payment gen
          FOR YY = 1 TO STATUS.CT
             CURRENT.STATUS = LED(6)<1,YY>
             BEGIN CASE
             CASE NOT(INDEX('XB$',CURRENT.STATUS,1))
                ONE.OPEN = YES
                EXIT
             CASE CURRENT.STATUS = 'B'
                ONE.BID = YES
             CASE CURRENT.STATUS = '$'
                PMTS = LED(45)<1,YY>
                IF PMTS<1,1,1> OR PMTS<1,1,2> OR PMTS<1,1,3> THEN
                   ONE.PAYMENT = YES
                END
             END CASE
          NEXT YY

          IF NOT(ONE.OPEN) AND ONE.BID AND ONE.PAYMENT THEN
             ANSWER = 'N'
IN$$11:      INP.PROMPT ANSWER,'%791':AM:' (Y/N):','YN',1
             IF NOT(ANSWER) THEN
                LASTKEY = 0; MOVE = 0; QUIT = 0; COL = 1 ; LINE = 1
                RETURN TO MOVENEXT
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.CASH: *** Check that cash required is fulfilled on order

          CHK.BT = LED(1)<1,GEN%>
          CHK.ST = LED(5)<1,GEN%>
          GOSUB LOAD.CUS.CUSS
          SOE.CALC.CASH OID%,GEN%,AMT.DUE,,,,DIR.AMT.DUE
          AMT.DUE += DIR.AMT.DUE
          OE.ORDER.TOTAL OID%,GEN%,QSIGN%,TOT.AMT,SUB.TOL,,,TAX.TOL
          IF AMT.DUE # 0 THEN
             IF AMT.DUE < 0 THEN
                SOE.CREDIT.CHECK LED(5)<1,GEN%>,,COD,,,,,OID%,GEN%
                IF NOT(COD) THEN RETURN
             END

             * If no ship via then see if the control default is set
             * to ignore cash required.
             IF LED(70)<1,GEN%> = '' AND SVIA.CASH THEN RETURN

             IF SVIA.IGNORE.CASH.REQD THEN RETURN

             * CHECK.REQD will be set to NO if we already went into
             * the TOTALS screen for CHECK.CC
             IF CHECK.REQD THEN
                DO.OPEN.TOTALS = YES
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.CC: *** Check that default credit card info is fulfilled on order

          CHK.BT = LED(1)<1,GEN%>
          CHK.ST = LED(5)<1,GEN%>
          GOSUB LOAD.CUS.CUSS
          NADDL    = CHK.BT   ;* BillTo
          NADDL<2> = CHK.ST   ;* ShipTo
          CC.NEED.DFLT.INFO NEW.ORDER%,DFLT.NEEDED,PAY.CC,NADDL
          IF DFLT.NEEDED THEN
             SOE.CALC.CASH OID%,GEN%,AMT.DUE, AMT.PAID, CASH.DISC,,DIR.AMT.DUE
             AMT.DUE += DIR.AMT.DUE
             OE.ORDER.TOTAL OID%,GEN%,QSIGN%,TOT.AMT,SUB.TOL,,,TAX.TOL
             TOT.BAL = TOT.AMT + AMT.PAID + CASH.DISC
             IF (AMT.DUE # 0 AND TOT.BAL # 0) THEN
                NEW.STAT   = LED(6)<1,GEN%>
                CHECK.REQD = YES

                * If ship via is set to ignore cash required or the
                * ship via is empty and the control rec is set to
                * not stop the processing, then set check.reqd to no.
                IF LED(70)<1,GEN%> = '' AND SVIA.CASH THEN CHECK.REQD = NO
                IF SVIA.IGNORE.CASH.REQD THEN
                   CHECK.REQD = NO
                END
                DO.OPEN.TOTALS = YES
                IF MOVE=2 THEN RETURN

                * Authorize Credit Card for Pick Up Nows and Invoices,
                * but only if there is still an amount due.
                IF ((NEW.STAT = 'P') OR (NEW.STAT = 'I')) THEN
                   GOSUB VERF.CC
                   IF ERR.MSG THEN RETURN TO IN.STAT
                END
             END ELSE
                CHECK.REQD = YES
                IF (AMT.DUE > 0) OR (TOT.BAL > 0) THEN
                   * Collect the Default Credit Card Information
                   LOOP
                      SOE.CREDIT.CARD.DEFAULT OID%,GEN%,VIEW.ONLY%,CCERR
                   UNTIL NOT(CCERR) DO REPEAT
                END
             END
          END ELSE
             CHECK.REQD = YES
          END

          RETURN
*-------------------------------------------------------------------------*
VERF.CC:  *** Authorize Credit Card for Invoices and Pick up nows

          ERR.MSG = ''
          OE.PROCESS.AUTH.CC OID%,GEN%,NEW.STAT,,ERR.MSG
          IF ERR.MSG THEN
             GOSUB DISPLAY.ERR
             ERR.MSG = ''
          END
          GOSUB DISPLAY

          RETURN
*-------------------------------------------------------------------------*
CHK.RETURNS: *** Check to see if there are items on the gen being returned.
             *** If there are, send them to SOE.CHECK.RETURN to validate
             *** the return (location) type.
          MATBUILD SV.LD FROM LD
          MATBUILD SV.OLD.LD FROM OLD.LD
          SV.LDID = LDID%

          OE.GET.LDID.LIST LDID.LIST,OID%,GEN%

          LDCNT = DCOUNT(LDID.LIST,VM)
          FOR LI = 1 TO LDCNT
             LDID% = LDID.LIST<1,LI>
             LD.GET LDID%

             * If the user has already gone through the return verification
             * then don't prompt them through it again.
             IF LD(44) # "" THEN CONTINUE

             IF SUM(LD(5)<1,GEN%>) + SUM(LD(6)<1,GEN%>) <= 0 THEN CONTINUE

             SOE.RETURN.CHECK OID%,GEN%,LDID%,,,VIEW.ONLY%
          NEXT LI

          MATPARSE LD FROM SV.LD
          MATPARSE OLD.LD FROM SV.OLD.LD
          LDID% = SV.LDID

          RETURN
*-------------------------------------------------------------------------*
CHK.USE.DEL:*** Check if it's okay to use products with a delete status.

          LDID.LIST = RAISE(LED(48)<1,GEN%>)
          LDCNT = DCOUNT(LDID.LIST,VM)
          FOR LX = 1 TO LDCNT
             LD.GETV TPN,LDID.LIST<1,LX>,1
             IF NOT(NUM(TPN)) THEN CONTINUE
             MATREAD PRD FROM PRDFILE,TPN ELSE CONTINUE
             IF PRD(3) = 4 THEN;* delete status
                SHP.BR = LED(2)<1,GEN%,2>
                OE.CHK.DEL.PROD TPN,GEN%,SHP.BR,DEL.FLAG,PRMPT
                IF DEL.FLAG THEN
                   SV.QUIT = QUIT
                   OE.GET.AUTH OID%,PRMPT,'OE.PRODUCT.USE.DELETE',ACT.OK
                   QUIT = SV.QUIT
                   IF NOT(ACT.OK) THEN
                      NSTAT.ERR = YES
                      EXIT
                   END
                END
             END
          NEXT LX

          RETURN
*-------------------------------------------------------------------------*
DISP.REM: *** display any OE reminders set for this customer

          BEGIN CASE
          CASE LED(33)<1,GEN%>;   TRIG = 12
          CASE MODE% = 'P';       TRIG = 6
          CASE MODE% = 'T';       TRIG = 9
          CASE OTHERWISE;         TRIG = 3
          END CASE

          BT.CN = LED(1)<1,GEN%>
          ST.CN = LED(5)<1,GEN%>

          REMINDER.VIEW BT.CN,,TRIG,80,23
          IF ST.CN # BT.CN THEN
             REMINDER.VIEW ST.CN,,TRIG,80,23
          END

          RETURN
*-------------------------------------------------------------------------*
IS.RECON: *** Determine whether or not the direct Gen has been Reconciled
          *** If it has an AP rec check auth key before allowing editing.

          IF MODE% = 'S' THEN
             LOCATE LED(33)<1,GEN%> IN LED(12)<1> SETTING RGN ELSE
                RGN = GEN%
             END
          END ELSE
             RGN = GEN%
          END

          * If current GEN is the po side of direct, make sure to read
          * in that side of direct
          IF LED(6)<1,GEN%> = 'Y' THEN RGN = GEN%

          AR.ID  = OID%:'.':LED(8)<1,RGN>  "R%3"
          READV AP.AIDS FROM ARFILE,AR.ID,2 ELSE AP.AIDS = ''

          AP.ID     = AP.AIDS<1,2>
          AP.OID    = FIELD(AP.ID,'.',2)         ;* order ID
          PAY.AR.ID = FIELD(AP.ID,'.',2,2)       ;* payable ID

          IF AP.ID # '' THEN
             CHECK.KEY 'AP.EDIT.REC.PO',EDIT.OK,LEVEL
             IF EDIT.OK THEN
                CHK.GL.POST FIELD(AP.ID,'.',1),AP.GL.OK,AP.OID
                IF NOT(AP.GL.OK) THEN
                   * If order is in a closed period make sure to check
                   * locked direct flag - User will be put into view
                   * only in CHECK.POST:
                   GOSUB CHK.LCK.DIR
                END ELSE
                   * Check to see if this payable was paid off
                   GOSUB CHK.PAID
                   IF PAID THEN
                      GOSUB CHK.LCK.DIR
                   END
                END
             END
          END

          MATREAD LED FROM LEDFILE,OID% ELSE MAT LED = ''

          RETURN
*-------------------------------------------------------------------------*
CHK.PAID: *** Check to see if the payable on this direct PO is paid

          PAID = NO

          READV AR.STATUS FROM ARFILE,PAY.AR.ID,20 ELSE AR.STATUS = ''

          * Check to make sure this is not in cancelled status
          IF AR.STATUS # 'X' THEN
             IF PAY.AR.ID[1,1] = 'Y' THEN
                * If this is a hajoca site and the invoice has been
                * reconciled but not transmitted then do not change
                * change view only status else make PO gen view only
                IF HAJOCA.SITE$ THEN
                   HAJO.XMIT.CHECK PAY.AR.ID,HAJO.XMIT.DT
                END

                * Pay Date for this order
                READV PAYON FROM ARFILE,PAY.AR.ID,22 ELSE PAYON = ''

                * Set paid flag to yes
                PAID   = YES
                FOR Q  = 1 TO DCOUNT(PAYON,VM)
                   QID = PAY.AR.ID:'.':PAYON<1,Q>
                   READ NOTHING FROM PQFILE,QID THEN
                      PAID = NO
                   END ELSE
                      * Contain the payable that paid the order
                      EXIT
                   END
                NEXT Q
             END ELSE
                READV AP.BAL FROM ARFILE,PAY.AR.ID,8 ELSE AP.BAL = ''
                IF AP.BAL<1,2> + 0 = 0 THEN
                   PAID = YES
                END ELSE
                   PAID = NO
                END
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHK.LCK.DIR: *** See if this user is auth'd to edit a partially locked dir

          IF LED(6)<1,GEN%> = 'Y' THEN
             EDIT.OK = NO
          END ELSE
             CHECK.KEY 'SOE.EDIT.LOCKED.DIRECT',EDIT.OK
             IF EDIT.OK THEN LOCKED.DIR = YES
          END

          RETURN
*-------------------------------------------------------------------------*
SET.DATA: *** set order data

          OID.DATA$<1> = OID%
          OID.DATA$<2> = GEN%
          OID.DATA$<4> = LED(5)<1,GEN%>

          RETURN
*-------------------------------------------------------------------------*
LOG.ABC:  *** log activity based costing

          ABC.LOG.AUTO ACD
          ABC.LOGGED = YES

          RETURN
*-------------------------------------------------------------------------*
CHK.AUTH: *** Check authorization to print if mode is 'S' and a direct OR
          *** mode is 'P' and an open order

          IF MODE% = 'P' AND LED(6)<1,GEN%> = 'O' THEN
             PRMPT  = 'Print an Open PO'
             LOG.CMNT = 'Authorized ':USER.ID:' to Print Order'
             KEY.REQD = 'POE.OPEN.ORDER.PRINT'

             * Level 1 authorization to release negative PO's, level 2
             * to release any PO's
             IF POE.PRT.TTL < 0 THEN
                OE.GET.AUTH OID%,PRMPT,KEY.REQD,ACTION.OK,GEN%,LOG.CMNT,1
             END ELSE
                OE.GET.AUTH OID%,PRMPT,KEY.REQD,ACTION.OK,GEN%,LOG.CMNT,2
             END
          END ELSE
             ACTION.OK = YES
          END

          RETURN
*-------------------------------------------------------------------------*
FINISH:   *** exit this routine

          LOCATE OLD.GID IN LED(12)<1> SETTING GEN% ELSE
             OE.NEXT.SHIPDATE GEN%
             IF GEN% = 0 THEN GEN% = 1
          END

          * Restore original Mode so that OE can continue
          * to function correctly.
          MODE% = SV.ORIG.MODE

          OID.DATA$<2> = GEN%
          WINDOW.CLOSE
          IF MODE% = 'S' THEN
             SV.QUIT = QUIT
             SV.MOVE = MOVE
             SV.F12  = F12

             IF OID%#'' THEN
                OE.TRIGGERS 6,OID%,GEN%,NEW.ORDER%,,VIEW.ONLY%
                IF NOT(VIEW.ONLY%) THEN
                   UPDATE.LEDGER OID%,GEN%
                END
             END

             MOVE = SV.MOVE
             QUIT = SV.QUIT
             F12  = SV.F12
          END

          * Check to see if we are going back to the body of the order.
          * We may need to reload CUS/CUSS if changes were made
          IF (BACK.TO.BODY) THEN
             CHK.BT = LED(1)<1,GEN%>
             CHK.ST = LED(5)<1,GEN%>

             HST.RCV.GN = (LED(30)<1,GEN%>='HST' AND LED(6)<1,GEN%>='R')
             IF (MODE%='T') AND (LED(30)<1,GEN%>='RX' OR HST.RCV.GN) THEN
                * Swap BT and ST
                CHK.BT = LED(5)<1,GEN%>
                CHK.ST = LED(1)<1,GEN%>
             END
             GOSUB LOAD.CUS.CUSS
          END

          RETURN
*-------------------------------------------------------------------------*
EVALUATE.XF.GEN: *** see if the user can edit the receive quantity and cost

          RECV.GEN.ONLY = NO
          IF NOT(VIEW.ONLY%) OR HAJOCA.SITE$ THEN
             OE.RECV.GEN.ONLY OID%,GEN%,RECV.GEN.ONLY,VIEW.ONLY%
             IF RECV.GEN.ONLY THEN
                PRINT @(2,0):BLINK$:'Edit Receiving Only':NORM$
             END
          END

          RETURN
*-------------------------------------------------------------------------*
CHECK.EDI.CHANGE: *** need to see if the print status has changed from an
          *** 'E' if the control record is set.

          CTRL.ID = 'CONFIRM.OVRD.PSTAT.E'
          READ CONFIRM.OVRD FROM CTRLFILE,CTRL.ID ELSE CONFIRM.OVRD = ''
          IF NOT(CONFIRM.OVRD) THEN RETURN

          READV O.PSTAT FROM LEDLFILE,OID%,9 ELSE O.PSTAT = ''
          IF O.PSTAT<1,GEN%> = 'E' AND PRT # 'E' THEN
             O.PROMPT = 'Change Print Status From E To ':PRT:'? '
             ANS = 'N'
IN$$15:      INP.PROMPT ANS,O.PROMPT,'YN',1
             IF NOT(ANS) THEN
                PRT = 'E'
                VPRINT 46,LINE,PRT    "L#1"
                RETURN
             END
             CMT = 'Print Status Changed From E to ':PRT:' by ':USER.ID
             OE.ADD.COMMENT OID%,GEN%,CMT
             CMT = ''
             OE.ADD.COMMENT OID%,GEN%,CMT
          END

          RETURN
*-------------------------------------------------------------------------*
DISPLAY.ERR: *** Display Error Message

          IF LEN(ERR.MSG) > 60 THEN
             FOLD.STRING ERR.MSG,60,NEW.ERR.MSG
             NEW.ERR.MSG = RAISE(NEW.ERR.MSG)
          END ELSE
             NEW.ERR.MSG = ERR.MSG
          END
          VSCROLL.GET.VER LINE,VER
          MESS 10,VER+2,BELL:NEW.ERR.MSG

          RETURN
*-------------------------------------------------------------------------*
LOAD.CUS.CUSS: * Load CUS and CUSS if needed

          IF (CHK.BT = LOADED.BT) AND (CHK.ST = LOADED.ST) THEN
             * Current BT and ST are the same as last time we loaded CUS
             RETURN
          END ELSE
             IF (OLD.BT = CHK.BT) AND (OLD.ST = CHK.ST) THEN
                * Since the CNs are the same, we can reload CUS
                * from what we saved off at the beginning
                MATPARSE CUS FROM OLD.CUS
                MATPARSE CUSS FROM OLD.CUSS
             END ELSE
                * CNs have changed, reload
                GET.CUS LED(2)<1,GEN%,1>,CHK.BT,CHK.ST,QSIGN%
                LOADED.BT = CHK.BT
                LOADED.ST = CHK.ST
             END
          END

          RETURN
*-------------------------------------------------------------------------*
!TSMITH~04/11/17~12:36
