COMPILE FUNCTION Comm_Shipment(Instruction, Parm1,Parm2)
#pragma precomp SRP_PreCompiler
/*
	Commuter module for Shipment (COC) window
	
	02/02/2005 - John C. Henry, J.C. Henry & Co., Inc. (Happy Ground Hog's day)
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window, Post_Event, Set_List_Box_Data, Print_Shipment, Print_Carton_Labels
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, obj_Shipment, Print_Ship_CheckList,Print_Pallet_Labels
DECLARE SUBROUTINE obj_Notes, Security_Err_Msg, End_Window, Forward_Event, Start_Window,Print_Cass_Ship_Label, Print_COC_Back, Print_Packing_Slip, Print_CoC_Invoice
DECLARE SUBROUTINE obj_Invoice, obj_Export, Print_Comm_Invoice
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Center_Window, Popup, Collect.Ixvals, obj_RDS, ETMethod, Export_Tower_Met, Export_IR
DECLARE FUNCTION Send_Message, Msg, Security_Check, RowExists, NextKey, obj_Shipment, obj_WO_Log, Set_Printer, obj_Install, MemberOf, Environment_Services
$INSERT POPUP_EQUATES
$INSERT LOGICAL
$INSERT MSG_EQUATES
$INSERT APPCOLORS
$INSERT COC_EQUATES
$INSERT LSL_USERS_EQU
$INSERT SECURITY_RIGHTS_EQU
$INSERT WO_LOG_EQU
$INSERT WO_STEP_EQU
$INSERT COMPANY_EQU
$INSERT ORDER_EQU
$INSERT OIPRINT_EQUATES
EQU COL$WO_STEP			TO 1
EQU COL$CASS_NO			TO 2
EQU COL$RDS_NO			TO 3
EQU COL$RDS_LOT_NO		TO 4
EQU COL$RDS_PART_NO		TO 5
EQU COL$RDS_SCHED		TO 6
EQU COL$RDS_PTEST		TO 7
EQU COL$RDS_REJECT		TO 8
EQU COL$RDS_OUT			TO 9
EQU COL$RDS_HOT_LOT		TO 10
EQU COL$RDS_CURR_STATUS	TO 11	;* OCONV'd status
EQU COL$RDS_STAT_CD		TO 12	;* Internal status
EQU PI$LEFT		TO 1		;* Page info stuff until I can get the printing routines cleaned up
EQU PI$TOP		TO 2
EQU PI$RIGHT	TO 3
EQU PI$BOTTOM	TO 4
EQU PI$WIDTH	TO 5
EQU PI$HEIGHT	TO 6
EQU PI$SIZE		TO 7
ErrTitle = 'Error in Comm_Shipment'
ErrorMsg = ''
Result = ''
BEGIN CASE
	CASE Instruction = 'Create' 			; GOSUB Create
	CASE Instruction = 'Refresh'			; GOSUB Refresh
	CASE Instruction = 'Read'				; GOSUB Read
	CASE Instruction = 'Write'				; GOSUB Write
	CASE Instruction = 'Clear'				; GOSUB Clear
	CASE Instruction = 'Delete'				; GOSUB Delete
	CASE Instruction = 'Page'				; GOSUB Page
	CASE Instruction = 'Close'				; GOSUB Close
	CASE Instruction = 'LUShipNo'			; GOSUB LUShipNo
	CASE Instruction = 'ShipNoLF'			; GOSUB ShipNoLF
	CASE Instruction = 'ShippingWOS'		; GOSUB ShippingWOS
	CASE Instruction = 'NewShipment'		; GOSUB NewShipment
	CASE Instruction = 'TodaysShipments'	; GOSUB TodaysShipments
	CASE Instruction = 'ActiveShipments'	; GOSUB ActiveShipments
	CASE Instruction = 'NewViewInvoice'		; GOSUB NewViewInvoice
	CASE Instruction = 'LUShipVia'			; GOSUB LUShipVia
	CASE Instruction = 'ShipViaGF'			; GOSUB ShipViaGF
	CASE Instruction = 'WONoLF'				; GOSUB WONoLF
	CASE Instruction = 'RDSDetailDC'		; GOSUB RDSDetailDC
	CASE Instruction = 'SelectCassettes'	; GOSUB SelectCassettes
	CASE Instruction = 'ScanCassettes'		; GOSUB ScanCassettes
	CASE Instruction = 'Pick'				; GOSUB Pick
	CASE Instruction = 'Unpick'				; GOSUB Unpick
	CASE Instruction = 'ViewBillCust'		; GOSUB ViewBillCust
	CASE Instruction = 'ViewOrder'			; GOSUB ViewOrder
	CASE Instruction = 'ViewWO'	;			; GOSUB ViewWO
	CASE Instruction = 'PrintCassLabel'		; GOSUB PrintCassLabel
	CASE Instruction = 'PrintCheck'			; GOSUB PrintCheck
	CASE Instruction = 'PrintPackingList'	; GOSUB PrintPackingList
	CASE Instruction = 'PrintDocuments'		; GOSUB PrintDocuments
	CASE Instruction = 'PrintPalletLabels'	; GOSUB PrintPalletLabels
	CASE Instruction = 'PrintCartonLabels'	; GOSUB PrintCartonLabels
	CASE Instruction = 'PrintCoCInvoice'	; GOSUB PrintCoCInvoice
	CASE Instruction = 'PrintCommInvoice'	; GOSUB PrintcommInvoice
	CASE Instruction = 'SendToVision'		; GOSUB SendToVision
	CASE Instruction = 'VtsDel'				; GOSUB VtsDel
	CASE Instruction = 'VtsIns'				; GOSUB VtsIns
	CASE Instruction = 'ReTxTechData'		; GOSUB ReTxTechData
	
	CASE 1
		ErrorMsg = 'Unknown Instruction ':QUOTE(Instruction):' passed to routine.'
		ErrMsg(ErrorMsg)
END CASE
RETURN Result
* * * * * * *
Create:
* * * * * * *
    IF NOT(Security_Check('COC',READ$)) THEN
        Security_Err_Msg('COC',READ$)
        End_Window(@WINDOW)
        RETURN
    END
    obj_Appwindow('Create',@WINDOW)
    * Provides compatibility with the existing messaging attachment system
    IF Parm1 NE '' THEN
        PassedKeys = FIELD(Parm1,'*',1)
        obj_Appwindow('ViewRelated',@WINDOW:@RM:PassedKeys)
    END
    GOSUB Refresh
RETURN
* * * * * * *
Clear:
* * * * * * *
    Send_Event(@WINDOW,'PAGE',1)
* * * * * * *
Refresh:
* * * * * * *
    IF Security_Check('COC',EDIT$) AND (Get_Property(@WINDOW:'.PICK_BUTTON','TEXT') = 'Pick') THEN
        Set_Property(@WINDOW:'.RDS_DETAIL','ENABLED',1)
    END ELSE
        Set_Property(@WINDOW:'.RDS_DETAIL','ENABLED',0)
    END
    Invoiced = ''
    IF Get_Property(@WINDOW:'.INVOICE_NO','TEXT') = '' THEN Invoiced = 0 ELSE Invoiced = 1
    IF NOT(Invoiced) THEN
        obj_Appwindow('ReadOnly',@WINDOW:@RM:1)					;* Clear Read Only
    END ELSE
        obj_Appwindow('ReadOnly',@WINDOW)					;* Set window to read only
    END
    WindowTitle = Get_Property(@WINDOW,'TEXT')
    ShipNo		= Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF INDEX(WindowTitle,'New',1) OR ShipNo = '' THEN
        Set_Property(@WINDOW:'.WO_NO','ENABLED',1)
        Set_Property(@WINDOW:'.WO_NO','BACKCOLOR',WHITE$)
    END ELSE
        Set_Property(@WINDOW:'.WO_NO','ENABLED',0)
        Set_Property(@WINDOW:'.WO_NO','BACKCOLOR',GREEN$)
    END
    IF Get_Property(@WINDOW:'.INVOICE_NO','TEXT') = '' THEN
        Set_Property(@WINDOW:'.INVOICE_BUTTON','TEXT','New Invoice')
    END ELSE
        Set_Property(@WINDOW:'.INVOICE_BUTTON','TEXT','View Invoice')
    END
    Ctrls  = @WINDOW:'.PICK_BUTTON':@RM			; Props  = 'TEXT':@RM
    Ctrls := @WINDOW:'.PICK_BUTTON':@RM			; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.PICKED_FIX':@RM			; Props := 'VISIBLE':@RM
    Ctrls := @WINDOW:'.UNPICK_BUTTON':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.SELECT_RDS':@RM			; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.SCAN_CASS_BUTTON'		; Props := 'ENABLED'
    PrintCtrls  = @WINDOW:'.PRINT_PACKINGLIST':@RM			; PrintProps  = 'ENABLED':@RM
    PrintCtrls := @WINDOW:'.PRINT_DOCUMENTS':@RM			; PrintProps := 'ENABLED':@RM
    PrintCtrls := @WINDOW:'.PRINT_LABELS':@RM				; PrintProps := 'ENABLED':@RM
    PrintCtrls := @WINDOW:'.PRINT_CARTON_LABELS':@RM		; PrintProps := 'ENABLED':@RM
    PrintCtrls := @WINDOW:'.PRINT_PALLET_LABELS'			; PrintProps := 'ENABLED'
    Vals = ''
    IF Get_Property(@WINDOW:'.PICK_DTM','TEXT') NE '' THEN
        
        Vals<1> = 'Picked'		;* PickButton text
        Vals<2> = 0				;* PickButton Disabled
        Vals<3> = 1				;* Picked Text Visisble
        Vals<4> = 1				;* Unpick button Enabled
        Vals<5> = 0				;* Select RDS button Disabled
        Vals<6> = 0				;* Scan Cassettes button Disabled      
        PrintVals = '1':@RM:'1':@RM:'1':@RM:'1':@RM:'1'
            
    END ELSE
        Vals<1> = 'Pick'	;* PickButton text       
        IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
            Vals<2> = 1			;* PickButton Enabled
            Vals<3> = 0			;* Picked Text invisible
            Vals<4> = 0			;* Unpick button Disabled
            Vals<5> = 1			;* Select RDS button Enabled
            Vals<6> = 1			;* Scan Cassettes button Enabled         
        END ELSE
            Vals<2> = 0			;* PickButton Enabled
            Vals<3> = 0			;* Picked Text invisible
            Vals<4> = 0			;* Unpick button Disabled
            Vals<5> = 0			;* Select RDS button Disabled
            Vals<6> = 0			;* Scan Cassettes button Disabled
        END       
        PrintVals = '0':@RM:'0':@RM:'0':@RM:'0':@RM:'0'
    END
    Set_Property(PrintCtrls,PrintProps,PrintVals)
    IF Invoiced THEN 
        Vals<1> = 'Picked'		;* PickButton text
        IF Get_Property(@WINDOW:'.INVOICE_NO','TEXT') = '' THEN
            Set_Property(@WINDOW:'.INVOICE_BUTTON','TEXT','New Invoice')
        END ELSE
            Set_Property(@WINDOW:'.INVOICE_BUTTON','TEXT','View Invoice')
        END
            Vals<2> = 0				;* PickButton Disabled
            Vals<3> = 1				;* Picked Text Visisble
            Vals<4> = 0				;* Unpick button Enabled
            Vals<5> = 0				;* Select RDS button Disabled
            Vals<6> = 0
        END
    CONVERT @FM TO @RM IN Vals
    Set_Property(Ctrls,Props,Vals)
    Ctrls  = @WINDOW:'.ENTER_BY':@RM		; Props  = 'TEXT':@RM
    Ctrls := @WINDOW:'.ENTER_DTM'			; Props := 'TEXT'
    Vals = Get_Property(Ctrls,Props)
    EnterBy		= Vals[1,@RM]
    EnterDTM	= Vals[COL2()+1,@RM]
    IF EnterBy	= '' THEN Vals  = 1:@RM ELSE Vals  = 0:@RM
    IF EnterDTM = '' THEN Vals := 1		ELSE Vals := 0
    Props = 'ENABLED':@RM:'ENABLED'
    Set_Property(Ctrls,Props,Vals)
    NextNumber = XLATE('DICT.COC','%SK%',1,'X')
    Set_Property(@WINDOW:'.NEW_BUTTON','TEXT',NextNumber)
    * QBF buttons
    Ctrls  = @WINDOW:'.QBF_FIRST_FIX':@RM		; Props  = 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM			; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM		; Props := 'ENABLED':@RM
    Ctrls := @WINDOW:'.QBF_STOP_FIX'			; Props := 'ENABLED'
    IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
        Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
    END ELSE
        Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
    END
    Set_Property(Ctrls,Props,Vals)
    * All cassette detail background colors
    CtrlName = @WINDOW:'.RDS_DETAIL'
    RDSArray = Get_Property(CtrlName,'INVALUE')
    RdsStatuses = RDSArray
	
    FOR I = 1 TO COUNT(RdsStatuses,@VM) + (RdsStatuses NE '')
        RdsStatus	= RdsStatuses<1,I>      
        RdsHotLot	= RDSArray       
        IF  RdsHotLot THEN
            IF RdsHotLot THEN LineColor = RED$
        END ELSE
            BEGIN CASE
                CASE RdsStatus[1,3] = 'Rec'	; LineColor = RCV_BLUE$
                CASE RdsStatus[1,3] = 'Pre'	; LineColor = PRE_BLUE$
                CASE RdsStatus[1,3] = 'In '	; LineColor = INP_BLUE$
                CASE RdsStatus[1,3] = 'Pos'	; LineColor = POS_BLUE$
                CASE RdsStatus[1,3] = 'Rea' ; LineColor = GREEN$
                CASE RdsStatus[1,3] = 'Shi'	; LineColor = LTGREY$
                CASE RdsStatus[1,3] = 'Pro'	; LineColor = RED$
                CASE 1	; LineColor = WHITE$
            END CASE
        END
        stat = Send_Message(CtrlName,'COLOR_BY_POS',0,I,LineColor)
    NEXT I
    * Turn edit table symbolic column backgrounds to green
    ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS')		;* Loaded during 'Create' in obj_Appwindow
    ETCtrls	= ETSymbolics<1>
    ETCols	= ETSymbolics<2>
    FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
        ETCtrl	= ETCtrls<1,I>
        IF ETCtrl NE @WINDOW:'.RDS_DETAIL' THEN
            ETList = Get_Property(ETCtrl,'LIST')
            FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
                IF ETList NE '' THEN
                    FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '')
                        stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,GREEN$)
                    NEXT N
                END
            NEXT I
        END
    NEXT I
RETURN
* * * * * * *
Page:
* * * * * * *
	Page = Parm1
	
	IF Page = '' THEN
		Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
	END ELSE
		Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
	END
	
	Set_Property(@WINDOW,'VPOSITION', Page)
RETURN
* * * * * * *
Read:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'SHIP_NO','TEXT')
    IF RowExists('COC',ShipNo) ELSE
        IF NOT(Security_Check('COC',WRITE$)) THEN
            Send_Event(@WINDOW,'CLEAR')
            Security_Err_Msg('COC',WRITE$)
            RETURN
        END
    END
    EnterBy = Get_Property(@WINDOW:'.ENTER_BY','TEXT')
    IF EnterBy = '' THEN
        CurrDate = OCONV(Date(),'D4/')
        CurrTime = OCONV(Time(),'MTH')      
        IF @USER4 = '' THEN @USER4 = 'TESTING'
        Set_Property(@WINDOW:'.ENTER_BY','TEXT',OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
        Set_Property(@WINDOW:'.ENTER_DT','TEXT',CurrDate)
    END
    GOSUB Refresh
RETURN
* * * * * * *
Write:
* * * * * * *
    Result = 1
RETURN
* * * * * * *
Delete:
* * * * * * *
    IF Security_Check('COC',Delete$) THEN
        Result = 0
        IF Get_Property(@WINDOW:'.INVOICE_NO','TEXT') = '' THEN
            IF Get_Property(@WINDOW:'.PICK_BY','TEXT') = ''  THEN
                Result = 1
            END ELSE
                ErrMsg('Record has material picked against it and may not be deleted.')
                Result = 0
            END
        END ELSE
            ErrMsg('Record has been invoiced and may not be deleted.')
            Result = 0
        END
        
        IF Get_Property(@WINDOW:'.RDS_DETAIL','ARRAY') = '' THEN
            Result = 1
        END ELSE
            ErrMsg('Record has material picked against it and may not be deleted.')
            Result = 0
        END
        
    END ELSE
        Security_Err_Msg('COC',Delete$)
        Result = 0		;* Stop event chain
    END
RETURN
* * * * * * *
LUShipNo:
* * * * * * * 
    IF NOT(ASSIGNED(Parm1)) THEN FocusControl = ''	ELSE FocusControl = Parm1
    IF NOT(ASSIGNED(Parm2)) THEN FocusPos = ''		ELSE FocusPos = Parm2
    Set_Status(0)
    ShipKeys = obj_Shipment('Find')	
    errCode  = ''
    IF Get_Status(errCode) THEN ErrMsg(ErrCode)
    IF INDEX(ShipKeys,@VM,1) THEN
        TypeOver = ''
        TypeOver = 'K'
        TypeOver = ShipKeys
        ShipKeys = Popup(@WINDOW,TypeOver,'COC_QUERY')
        IF Get_Status(errCode) THEN
            ErrMsg(errCode) 
            RETURN
        END
    END
    CONVERT @VM TO @FM IN ShipKeys
    IF INDEX(ShipKeys,@FM,1) THEN
        Send_Event(@WINDOW,'QBFINIT')
        Set_Property(@WINDOW,'QBFLIST',ShipKeys)
        GOSUB Refresh
        Send_Event(@WINDOW,'QBFIRST')
    END ELSE
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipKeys)
    END
RETURN
* * * * * * *
ShipNoLF:
* * * * * * *
RETURN
* * * * * * *
NewShipment:
* * * * * * *
    ShipNo = Get_Property(@WINDOW,'ID')
    IF NOT(Security_Check('COC',WRITE$)) THEN
        Security_Err_Msg('COC',WRITE$)
        RETURN
    END
    IF ShipNo = '' THEN
        NextShipNo = NextKey('COC')
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:NextShipNo)
    END
    
RETURN
* * * * * * *
TodaysShipments:
* * * * * * *
ShipNo = Get_Property(@WINDOW,'ID')
IF ShipNo NE '' THEN
	Send_Event(@WINDOW,'WRITE')
END
OpenShipKeys = obj_Shipment('TodaysShipments')
IF INDEX(OpenShipKeys,@VM,1) THEN
	OpenShipKeys := @VM
	CONVERT @VM TO @RM IN OpenShipKeys
	CALL V119('S','','D','R',OpenShipKeys,'')
	IF Get_Status(errCode) THEN
	    ErrMsg(errCode)
	    RETURN
	END
	CONVERT @RM TO @VM IN OpenShipKeys
	OpenShipKeys[-1,1] = ''					;* Strip trailing delimiter		
	TypeOver = ''
	TypeOver = 'K'
	TypeOver = OpenShipKeys
	TypeOver	= 2							;* Single Select
	ShipKeys = Popup(@WINDOW,TypeOver,'COC_QUERY')
	IF Get_Status(errCode) THEN
		ErrMsg(errCode) 
		RETURN
	END
END ELSE
	ShipKeys = OpenShipKeys
END
IF INDEX(ShipKeys,@VM,1) THEN
	Send_Event(@WINDOW,'QBFINIT')
	Set_Property(@WINDOW,'QBFLIST',ShipKeys)
	Send_Event(@WINDOW,'QBFFIRST')
END ELSE
	obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipKeys)
END
RETURN
* * * * * * *
ActiveShipments:
* * * * * * *
    ShipNo = Get_Property(@WINDOW,'ID')
    IF ShipNo NE '' THEN
        Send_Event(@WINDOW,'WRITE')
    END
    OpenShipKeys = obj_Shipment('OpenShipments')
    IF INDEX(OpenShipKeys,@VM,1) THEN
                
        OpenShipKeys := @VM
        CONVERT @VM TO @RM IN OpenShipKeys
        CALL V119('S','','D','R',OpenShipKeys,'')
        IF Get_Status(errCode) THEN
            ErrMsg(errCode) 
        END
        CONVERT @RM TO @VM IN OpenShipKeys
        OpenShipKeys[-1,1] = ''					;* Strip trailing delimiter	
        
        TypeOver = ''
        TypeOver = 'K'
        TypeOver = OpenShipKeys
        TypeOver	= 2							;* Single Select
        ShipKeys = Popup(@WINDOW,TypeOver,'COC_QUERY')
        IF Get_Status(errCode) THEN
            ErrMsg(errCode) 
            RETURN
        END
        
    END ELSE
        ShipKeys = OpenShipKeys
    END
    IF INDEX(ShipKeys,@VM,1) THEN
        Send_Event(@WINDOW,'QBFINIT')
        Set_Property(@WINDOW,'QBFLIST',ShipKeys)
        Send_Event(@WINDOW,'QBFFIRST')
    END ELSE
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipKeys)
    END
RETURN
* * * * * * *
NewViewInvoice:
* * * * * * *
    Ctrls  = @WINDOW:@RM					; Props  = 'ID':@RM
    Ctrls := @WINDOW:'.SHIP_DT':@RM			; Props := 'TEXT':@RM
    Ctrls := @WINDOW:'.WO_NO':@RM			; Props := 'TEXT':@RM
    Ctrls := @WINDOW:'.RDS_DETAIL':@RM		; Props := 'ARRAY':@RM
    Ctrls := @WINDOW:'.TRACKING_NOS':@RM	; Props := 'ARRAY':@RM
    Ctrls := @WINDOW:'.INVOICE_NO':@RM		; Props := 'TEXT':@RM
    Ctrls := @WINDOW:'.CUST_NO':@RM			; Props := 'TEXT':@RM
    Ctrls := @WINDOW:'.WO_CUST_NO_SHIP_TO'	; Props := 'TEXT'
    Vals = Get_Property(Ctrls,Props)
    ShipNo		= Vals[1,@RM]
    ShipDt		= Vals[COL2()+1,@RM]
    WONo		= Vals[COL2()+1,@RM]
    RDSList		= Vals[COL2()+1,@RM]
    TrackingNo	= Vals[COL2()+1,@RM]<1,1>
    InvoiceNo	= Vals[COL2()+1,@RM]
    CustNo		= Vals[COL2()+1,@RM]
    ShipCustNo	= Vals[COL2()+1,@RM]
    RDSNos	= RDSList
    WOSteps = RDSList
    CassNos = RDSList
    SWAP @VM:@VM WITH '' IN RDSNos
    IF RDSNos[-1,1] = @VM THEN RDSNos[-1,1] = ''
    IF InvoiceNo NE '' THEN
        obj_AppWindow('ViewRelated','INVOICE':@RM:InvoiceNo)
    END ELSE
        IF ShipNo = '' OR ShipDt = '' OR WONo = '' THEN RETURN		;* Not finished with the shipment yet
        LOOP
        UNTIL RDSNos[-1,1] NE @VM OR RDSNos = ''
            RDSNos[-1,1] = ''
        REPEAT
        
        LOOP
        UNTIL WOSteps[-1,1] NE @VM OR WOSteps = ''
            WOSteps[-1,1] = ''
        REPEAT
        
        LOOP
        UNTIL CassNos[-1,1] NE @VM OR CassNos = ''
            CassNos[-1,1] = ''
        REPEAT
        Send_Event(@WINDOW,'CLEAR')
        obj_Invoice('Create',ShipNo:@RM:ShipDt:@RM:WONo:@RM:WOSteps:@RM:CassNos:@RM:RDSNos)
        IF Get_Status(errCode) THEN
            ErrMsg(errCode)
            RETURN
        END
        
        IF CustNo = '6874' OR CustNo = '7055' THEN 
            * This is Wales -> transmit via ftp		
            KeyList = RDSNos		
            IF KeyList = '' THEN
                ErrMsg('There are no RDS records attached to this shipment.  No data will be sent to the customer. (EpiPRO process)')
                RETURN
            END
            DosTable = Environment_Services('GetReportsRootPath') : '\W':ShipNo:'.csv'
            ExportID = 'WALES_SYSTEM_RDS_DATA'
            NoHeader = 1	
            obj_Export('ExportDelimited','Comma':@RM:KeyList:@RM:ExportID:@RM:DosTable:@RM:@RM:@RM:NoHeader)
            // Default Remote Directory "/NPTirep"
            ToWalesScript  = 'open 10.131.104.18'					:CRLF$
            ToWalesScript := 'user'									:CRLF$
            ToWalesScript := 'EU\NPTirep'							:CRLF$
            ToWalesScript := 'Wk4F6X61!2016Friday1'					:CRLF$
            ToWalesScript := 'pwd '									:CRLF$
            ToWalesScript := 'append ':DosTable:' EpiMesa_2018.csv'	:CRLF$	
            ToWalesScript := 'bye'									:CRLF$
            OSWrite ToWalesScript ON Environment_Services('GetReportsRootPath') : '\ToWales.scr'
            stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToWales.scr", -1 )	
            IF Get_Status(errCode) THEN 
                ErrMsg(errCode)
            END		
            OSDelete DosTable		 		
        END
        
        IF CustNo = '7053' THEN		
            * This is Tower via El Segundo - uses same setup as Wales		
            KeyList = RDSNos		
            IF KeyList = '' THEN
                ErrMsg('There are no RDS records attached to this shipment.  No data will be sent to the customer. (EpiPRO process)')
                RETURN
            END
            DosTable = Environment_Services('GetReportsRootPath') : '\T':ShipNo:'.csv'
            ExportID = 'WALES_SYSTEM_RDS_DATA'			
            NoHeader = 0		
            obj_Export('ExportDelimited','Comma':@RM:KeyList:@RM:ExportID:@RM:DosTable:@RM:@RM:@RM:NoHeader)			
            ToTowerScript  = 'open 194.90.108.5':CRLF$
            ToTowerScript := 'user':CRLF$
            ToTowerScript := 'irepif2':CRLF$
            ToTowerScript := 'BGfq1h':CRLF$
            ToTowerScript := 'lcd \':CRLF$
            ToTowerScript := 'append ':DosTable:' EpiMesa.csv':CRLF$		;* * * * * * * * *Append to existing file
            ToTowerScript := 'bye':CRLF$
            OSWrite ToTowerScript ON Environment_Services('GetReportsRootPath') : '\ToTower.scr'		
            stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTower.scr",-1)
            IF Get_Status(errCode) THEN 
                ErrMsg(errCode)
            END
            OSDelete DosTable		;* Removes table from C: drive 
        END
        IF CustNo = '6593' OR CustNo = '408' OR CustNo = '7076' THEN 
            * This is Temecula & El Segundo -> transmit via ftp
            DosTable = Export_IR(ShipNo)			
            ToTemeculaScript  = 'open 10.72.100.40':CRLF$
            ToTemeculaScript  := 'user':CRLF$
            ToTemeculaScript  := 'EPIMesa':CRLF$
            ToTemeculaScript  := 'irepi01':CRLF$
            ToTemeculaScript  := 'lcd \':CRLF$
            ToTemeculaScript  := 'send ':DosTable:CRLF$		;* Send file to file with same name on remote
            ToTemeculaScript  := 'bye':CRLF$
            OSWrite ToTemeculaScript  ON Environment_Services('GetReportsRootPath') : '\ToTemecula.scr'
            stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTemecula.scr",-1)
            IF Get_Status(errCode) THEN 
                ErrMsg(errCode)
            END
            OSDelete DosTable		;* Removes table from C: drive 		
        END
        
        IF ShipCustNo = '6775' THEN
        
            DosTable = Export_Tower_Met(ShipNo)		;* This is Tower -> transmit via ftp
            ToTowerScript  = 'open 194.90.108.5':CRLF$		;* Secured server
            ToTowerScript := 'user':CRLF$
            ToTowerScript := 'irepi':CRLF$
            ToTowerScript := 'REPii2':CRLF$
            ToTowerScript := 'lcd \':CRLF$
            ToTowerScript := 'put ':DosTable:CRLF$		;* Single file transfer
            ToTowerScript := 'bye':CRLF$
            OSWrite ToTowerScript ON Environment_Services('GetReportsRootPath') : '\ToTower.scr'
            stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTower.scr",-1)
            IF Get_Status(errCode) THEN 
                ErrMsg(errCode)
            END
            OSDelete DosTable		;* Removes table from C: drive 
                
        END	
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)	
    END
RETURN
* * * * * * *
ShipViaGF:
* * * * * * *
    WONo = Get_Property(@WINDOW:'.WO_NO','TEXT')
    ShipVia = Get_Property(@WINDOW:'.SHIP_VIA','TEXT')
    IF WONo NE '' AND ShipVia = '' THEN
        OrderNo = XLATE('WO_LOG',WONo,WO_LOG_ORDER_NO$,'X')
        ShipVia = XLATE('ORDER',OrderNo,ORDER_SHIP_VIA$,'X')
        AcctNo	= XLATE('ORDER',OrderNo,ORDER_ACCOUNT_NO$,'X')
        Set_Property(@WINDOW:'.SHIP_VIA','TEXT',ShipVia)
        Set_Property(@WINDOW:'.SHIP_VIA_ACCT_NO','TEXT',AcctNo)
    END
RETURN
* * * * * * *
LUShipVia:
* * * * * * *
    CustNo = Get_Property(@WINDOW:'.CUST_NO','TEXT')
    ShipVia = Get_Property(@WINDOW:'.SHIP_VIA','TEXT')
    IF CustNo NE '' AND ShipVia = '' THEN
        CustRec = XLATE('COMPANY',CustNo,'','X')
        ShipVias = CustRec
        IF INDEX(ShipVias,@VM,1) THEN
            Display = ''
            FOR I = 1 TO COUNT(ShipVias,@VM) + (ShipVias NE '')
                Display<1,I> = ShipVias<1,I>:@SVM:CustRec
            NEXT I
            TypeOver = ''
            TypeOver = Display
            SelectedItems = Popup(@WINDOW,TypeOver,'ORDER_SHIPPER_INFO')
            IF SelectedItems = '' THEN RETURN
            ShipVia		= SelectedItems<1,1>
            AcctNo		= SelectedItems<1,2>
        END ELSE
            ShipVia		= ShipVias
            AcctNo		= CustRec
        END
        Set_Property(@WINDOW:'.SHIP_VIA','TEXT',ShipVia)
        Set_Property(@WINDOW:'.SHIP_VIA_ACCT_NO','TEXT',AcctNo)
        
    END
RETURN
* * * * * * *
WONoLF:
* * * * * * *
    WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
    ReactType = Get_Property(@WINDOW:'.REACTOR_TYPE','DEFPROP')
    IF WONo NE '' AND ReactType = '' THEN
        WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
        ShipWOStepKey = WOStepKeys[-1,'B':@VM]
        ShipPSN = XLATE('WO_STEP',ShipWOStepKey,1,'X')
        ReactType = XLATE('PROD_SPEC',ShipPSN,80,'X')
        Set_Property(@WINDOW:'.REACTOR_TYPE','DEFPROP',ReactType)
    END
    GOSUB Refresh
RETURN
* * * * * * *
Close:
* * * * * * *
    obj_Notes('Inbox',@USER4)	;* Checks for any new messages
    obj_Appwindow('CardReturn',@WINDOW)
RETURN
* * * * * * *
LUWONo:
* * * * * * *
    Set_Status(0)
    WOKeys = obj_WO_Log('Find')	
    IF Get_Status(errCode) THEN ErrMsg(ErrCode)
    IF WOKeys NE '' THEN
        TypeOver = ''
        TypeOver = WOKeys
        TypeOver = 'K'
        WOKeys = Popup(@WINDOW,TypeOver,'WO_LOG_QUERY')
        IF Get_Status(errCode) THEN
            ErrMsg(errCode)
        END
    END
    
RETURN
* * * * * * * 
ShippingWOS:
* * * * * * *
    OpenWONo = obj_WO_Log('ShipWONos','')
    ShipNo	= Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    WONo	= Get_Property(@WINDOW:'.WO_NO','TEXT')
    IF OpenWONo NE '' AND ShipNo NE '' AND WONo = '' THEN
        obj_AppWindow('LUValReturn',OpenWONo:@RM:@WINDOW:'.WO_NO')
    END
RETURN
* * * * * * *
ViewBillCust:
* * * * * * *
    BillCustNo = Get_Property(@WINDOW:'.BILL_CUST_NO','TEXT')
    IF BillCustNo NE '' THEN
        obj_Appwindow('ViewRelated','COMPANY':@RM:BillCustNo)
    END
RETURN
* * * * * * *
ViewOrder:
* * * * * * *
    OrderNo = Get_Property(@WINDOW:'.ORD_NO','TEXT')
    IF OrderNo NE '' THEN
        obj_Appwindow('ViewRelated','ORDER2':@RM:OrderNo)
    END
RETURN
* * * * * * *
RDSDetailDC:
* * * * * * *
    ShipNo = Get_Property(@WINDOW,'ID')
    CtrlEntID = @WINDOW:'.RDS_DETAIL'
    CurrPos = Get_Property(CtrlEntID,'SELPOS')
    CurrCol = CurrPos<1>
    CurrRow = CurrPos<2>
    IF CurrCol = 1 THEN
        RdsNo = Get_Property(CtrlEntID,'CELLPOS',1:@FM:CurrRow)
        IF RdsNo NE '' THEN           
            thisFormName = 'RDS_UNLOAD'           
            thisFormWindowUp = Get_Property(thisFormName,'VISIBLE')	;* Returns 0 = hidden, 1 = visible, 2 = minimized, 3 = maximized 
            IF thisFormWindowUp = ''	THEN
                If Get_Property('NDW_MAIN', 'VISIBLE') then
                    AppMain = 'NDW_MAIN'
                end else
                    AppMain = 'LSL_MAIN2'
                end
                Start_Window(thisFormName,AppMain,RDSNo:'*CENTER', '', '')	;* Put up the card window
                RETURN
            END           
            IF thisFormWindowUp = 2		THEN Set_Property(thisFormName,'VISIBLE',9)	;* Restore the window if minimized
            IF Get_Property(thisFormName,'SAVEWARN') THEN
                Send_Event(thisFormName,'CLEAR')					;* Clear anything existing (prompts for save first)
            END
        END
    END	;* End of ItemNo column
RETURN
* * * * * * *
SelectCassettes:
* * * * * * *
    WONo = Get_Property(@WINDOW:'.WO_NO','TEXT')
    IF WONo = '' THEN RETURN
    ReactorType = XLATE('WO_STEP',WONo:'*1','PS_REACTOR_TYPE','X')
    IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
        * EpiPRO process
        OPEN 'DICT.WM_OUT' TO DictVar ELSE
            ErrMsg('Unable to open "DICT.WM_OUT" for index lookup in COMM_SHIPMENT routine.')
            RETURN
        END
        
        SearchString  = 'WO_NO':@VM:WONo:@FM
        WMOutKeys = ''
        Flag = ''
        Btree.Extract(SearchString, 'WM_OUT', DictVar, WMOutKeys, '', Flag)
        
        IF Get_Status(errCode) THEN
            ErrMsg(errCode)
            RETURN
        END
        
        IF WMOutKeys = '' THEN
            ErrMsg('Work Order has no WM_OUT cassettes.')
            RETURN
        END
        
        PopupData = ''
        PLineCnt = 0
        FOR I = 1 TO COUNT(WMOutKeys,@VM) + (WMOutKEys NE '')
            CurrStatus	= XLATE('WM_OUT',WMOutKeys<1,I>,'CURR_STATUS','X')
            WfrQty		= XLATE('WM_OUT',WMOutKeys<1,I>,'WFRS_OUT','X')
            IF CurrStatus = 'RTS' THEN
                PLineCnt += 1
                PopupData<1,PLineCnt,1> = FIELD(WMOutKeys<1,I>,'*',2)
                PopupData<1,PLineCnt,2> = FIELD(WMOutKeys<1,I>,'*',3)
                PopupData<1,PLineCnt,3> = ''
                PopupData<1,PLineCnt,4> = WfrQty
                
            END
        NEXT I
        
        IF PopupData = '' THEN
            ErrMsg('Work Order has no Ready To Ship cassettes.')
            RETURN
        END
        TypeOver = ''
        TypeOver = PopupData
        NewRows = Popup(@WINDOW,TypeOver,'SHIP_RTS_CASSETTES')
        
    END ELSE
        WOMatKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_MAT_KEY$,'X')
        IF WOMatKeys = '' THEN
            ErrMsg('Work Order has no Material (WO_MAT) records.')
            RETURN
        END
        PopupData = ''
        PLineCnt = 0
        FOR I = 1 TO COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
            WOMatKey = WOMatKeys<1,I>
            CurrStatus	= XLATE('WO_MAT',WOMatKey,'CURR_STATUS','X')
            WfrQty		= XLATE('WO_MAT',WOMatKey,'CURR_WFR_CNT','X')
            ShipRDS		= XLATE('WO_MAT',WOMatKey,'SHIP_RDS','X')
            ShipStep	= XLATE('WO_MAT',WOMatKey,'SHIP_WO_STEP','X')
            IF CurrStatus = 'RTS' THEN
                PLineCnt += 1
                PopupData<1,PLineCnt,1> = ShipStep
                PopupData<1,PLineCnt,2> = FIELD(WOMatKeys<1,I>,'*',2)
                PopupData<1,PLineCnt,3> = ShipRDS
                PopupData<1,PLineCnt,4> = WfrQty
                
            END
        NEXT I
        IF PopupData = '' THEN
            ErrMsg('Work Order has no Ready To Ship cassettes.')
            RETURN
        END
        TypeOver = ''
        TypeOver = PopupData
        NewRows = Popup(@WINDOW,TypeOver,'SHIP_RTS_CASSETTES')
        
    END
    
    IF NewRows NE '' THEN
        OrgArray = Get_Property(@WINDOW:'.RDS_DETAIL','DEFPROP')
        OrgCassNos = OrgArray
        
        OrgLineCnt = COUNT(OrgArray,@FM) + (OrgCassNos NE '')		;* Number of lines in edit table (including blank lines)
        
        CurrStepNos = ''
        CurrCassNos = ''
        CurrRDSNos  = ''
        
        FOR I = 1 TO OrgLineCnt
            IF OrgCassNos<1,I> NE '' THEN
                CurrStepNos<1,-1> = OrgArray<1,I>
                CurrCassNos<1,-1> = OrgArray<2,I>
                CurrRDSNos<1,-1> = OrgArray<3,I>
            END
        NEXT I
        
        FOR I = 1 TO COUNT(NewRows,@FM) + (NewRows NE '')
            NewStepNo	= NewRows
            NewCassNo	= NewRows
            NewRdsNo	= NewRows
            
            LOCATE NewCassNo IN CurrCassNos BY 'AR' USING @VM  SETTING Pos ELSE
                CurrStepNos	= INSERT(CurrStepNos,1,Pos,0,NewStepNo)
                CurrCassNos	= INSERT(CurrCassNos,1,Pos,0,NewCassNo)
                CurrRdsNos	= INSERT(CurrRdsNos,1,Pos,0,NewRdsNo)
            END
        NEXT I
        
        CurrLineCnt = COUNT(CurrRdsNos,@VM) + (CurrRdsNos NE '')
        
        IF CurrLineCnt < OrgLineCnt THEN
            CurrStepNos := Str(@VM,OrgLineCnt - CurrLineCnt)		;* Pad with blank lines to fill edit table control
            CurrCassNos := Str(@VM,OrgLineCnt - CurrLineCnt)
            CurrRdsNos	:= Str(@VM,OrgLineCnt - CurrLineCnt)
        END ELSE
            CurrStepNos	:= @VM
            CurrCassNos	:= @VM		
            CurrRdsNos 	:= @VM									;* Pad with single blank line at end of edit table
        END       
        Set_Property(@WINDOW:'.RDS_DETAIL','DEFPROP',CurrStepNos:@FM:CurrCassNos:@FM:CurrRdsNos)    
        FOR I = COL$RDS_LOT_NO TO COL$RDS_STAT_CD
            Send_Event(@WINDOW:'.RDS_DETAIL','CALCULATE',I)
        NEXT I      
        GOSUB Refresh      
    END
RETURN
* * * * * * *
ScanCassettes:
* * * * * * *
    WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
    NewRows = Dialog_Box("DIALOG_MAT_SCAN", @window, 'Ship':@VM:'Scan Cassettes for WO ':WONo)
    IF NewRows = 'Cancel' THEN RETURN
    IF NewRows NE '' THEN
        OrgArray = Get_Property(@WINDOW:'.RDS_DETAIL','DEFPROP')
        OrgCassNos = OrgArray
        
        OrgLineCnt = COUNT(OrgArray,@FM) + (OrgCassNos NE '')		;* Number of lines in edit table (including blank lines)
        
        CurrStepNos = ''
        CurrCassNos = ''
        CurrRDSNos  = ''
        
        FOR I = 1 TO OrgLineCnt
            IF OrgCassNos<1,I> NE '' THEN
                CurrStepNos<1,-1> = OrgArray<1,I>
                CurrCassNos<1,-1> = OrgArray<2,I>
                CurrRDSNos<1,-1> = OrgArray<3,I>
            END
        NEXT I
        
        FOR I = 1 TO COUNT(NewRows,@FM) + (NewRows NE '')
            NewStepNo	= NewRows
            NewCassNo	= NewRows
            NewRdsNo	= NewRows
            
            LOCATE NewCassNo IN CurrCassNos USING @VM  SETTING Pos ELSE
                CurrStepNos	= INSERT(CurrStepNos,1,Pos,0,NewStepNo)
                CurrCassNos	= INSERT(CurrCassNos,1,Pos,0,NewCassNo)
                CurrRdsNos	= INSERT(CurrRdsNos,1,Pos,0,NewRdsNo)
            END
        NEXT I
        
        CurrLineCnt = COUNT(CurrRdsNos,@VM) + (CurrRdsNos NE '')
        
        IF CurrLineCnt < OrgLineCnt THEN
            CurrStepNos := Str(@VM,OrgLineCnt - CurrLineCnt)		;* Pad with blank lines to fill edit table control
            CurrCassNos := Str(@VM,OrgLineCnt - CurrLineCnt)
            CurrRdsNos	:= Str(@VM,OrgLineCnt - CurrLineCnt)
        END ELSE
            CurrStepNos	:= @VM
            CurrCassNos	:= @VM		
            CurrRdsNos 	:= @VM									;* Pad with single blank line at end of edit table
        END
        
        Set_Property(@WINDOW:'.RDS_DETAIL','DEFPROP',CurrStepNos:@FM:CurrCassNos:@FM:CurrRdsNos)
        
        FOR I = COL$RDS_LOT_NO TO COL$RDS_STAT_CD
            Send_Event(@WINDOW:'.RDS_DETAIL','CALCULATE',I)
        NEXT I
        
        GOSUB Refresh
        
    END
RETURN
* * * * * * *
Pick:
* * * * * * *
    IF Get_Property(@WINDOW:'.PICK_DTM','TEXT') NE '' THEN RETURN  ;* Check for pre-existing picked flag
    ShipNo = Get_Property(@WINDOW,'ID')
    IF ShipNo = '' THEN RETURN
    Send_Event(@WINDOW,'WRITE')
    obj_Shipment('Pick',ShipNo)
    IF Get_Status(errCode) THEN
        ErrMsg(errCode)
    END
    obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    Send_Event(@WINDOW,'PAGE',2)
    GOSUB REFRESH
RETURN
* * * * * *
UnPick:
* * * * * *
    IF Get_Property(@WINDOW:'.PICK_DTM','TEXT') = '' THEN RETURN  ;* Check for null pickeded flag
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    Set_Property(@WINDOW,'SAVEWARN',0)
    Send_Event(@WINDOW,'CLEAR')
    obj_Shipment('UnPick',ShipNo)
    IF Get_Status(errCode) THEN
        ErrMsg(errCode)
    END
    obj_AppWindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    Send_Event(@WINDOW,'PAGE',2)
    GOSUB Refresh
RETURN
* * * * * * *
ViewWO:
* * * * * * *
    WONo = Get_Property(@WINDOW:'.WO_NO','TEXT')
    IF WONo NE '' THEN
        WOStepKeys = XLATE('WO_LOG',WONo,34,'X')
        LastStepKey = WOStepKeys[-1,'B':@VM]
        obj_Appwindow('ViewRelated','WO_PROD':@RM:LastStepKey)
    END
RETURN
* * * * * * *
PrintCassLabel:
* * * * * * * 
    CtrlEntID = @WINDOW:'.RDS_DETAIL'
    RDSArray = Get_Property(CtrlEntID,'DEFPROP')
    WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
    PDisplay = ''
    LineCnt = 0
    FOR I = 1 TO COUNT(RDSArray<1>,@VM) + (RDSArray<1> NE '')
        IF RDSArray NE '' OR RDSArray NE '' THEN
            LineCnt += 1
            PDisplay<1,LineCnt,1> = RDSArray
            PDisplay<1,LineCnt,2> = RDSArray
            PDisplay<1,LineCnt,3> = RDSArray
        END
    NEXT I
    TypeOver = ''
    TypeOver = PDisplay
    SelectedCassettes = Popup(@WINDOW,TypeOver,'PRINT_CASS_SHIP_LABELS')
    WOStepNos = ''
    WOCassNos = ''
    RDSNos = ''
    FOR I = 1 TO COUNT(SelectedCassettes,@FM) + (SelectedCassettes NE '')
        WOStepNos<1,I>	= SelectedCassettes
        WOCassNos<1,I>	= SelectedCassettes
        RDSNos<1,I>		= SelectedCassettes
    NEXT I
    Print_Cass_Ship_Label( WONo,WOStepNos,WOCassNos,RDSNos )
RETURN
* * * * * * *
PrintPackingList:
* * * * * * * 
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF security_check( 'COC', Print$ ) THEN
        
        Send_Event(@WINDOW,'WRITE')
        Print_Packing_Slip(ShipNo)
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
        
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
PrintCheck:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    Send_Event(@WINDOW,'WRITE')
    Print_Ship_CheckList(ShipNo)
    obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
RETURN
* * * * * * *
PrintDocuments:
* * * * * * * 
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF Security_Check( 'COC', Print$ ) THEN
        Send_Event(@WINDOW,'WRITE')
        Print_Shipment(ShipNo)
        
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
PrintPalletLabels:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF Security_Check( 'COC', Print$ ) THEN
        Send_Event(@WINDOW,'WRITE')
        Print_Pallet_Labels( ShipNo )
        
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
        
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
PrintCartonLabels:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF Security_Check( 'COC', Print$ ) THEN
        Send_Event(@WINDOW,'WRITE')
        Print_Carton_Labels( ShipNo )
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
PrintCoCInvoice:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF Security_Check( 'COC', Print$ ) THEN
        Send_Event(@WINDOW,'WRITE')
        Print_CoC_Invoice( ShipNo )
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
PrintCommInvoice:
* * * * * * *
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF Security_Check( 'COC', Print$ ) THEN
        Send_Event(@WINDOW,'WRITE')
        Print_Comm_Invoice( ShipNo )
        obj_Appwindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
    END ELSE
        Security_Err_Msg( 'COC', Print$ )
    END
RETURN
* * * * * * *
SendToVision:
* * * * * * *
    IF Get_Property(@WINDOW:'.VISION_DTM','TEXT') NE '' THEN RETURN  ;* Check for null picked flag
    ShipNo = Get_Property(@WINDOW:'.SHIP_NO','TEXT')
    IF ShipNo = '' THEN RETURN
    IF NOT(Security_Check('Vision',WRITE$)) THEN
        IF NOT(MemberOf(@USER4,'SHIPPING')) THEN
            Security_Err_Msg('Vision',WRITE$)
            RETURN
        END
    END
    Set_Property(@WINDOW,'SAVEWARN',0)
    Send_Event(@WINDOW,'CLEAR')
    obj_Shipment('SendToVision',ShipNo)
    IF Get_Status(errCode) THEN
        ErrMsg(errCode)
    END
    obj_AppWindow('LoadFormKeys',@WINDOW:@RM:ShipNo)
RETURN
* * * * * * *
VtsDel:
* * * * * * *
RETURN
* * * * * * *
VtsIns:
* * * * * * *
RETURN
* * * * * * * 
ReTxTechData:
* * * * * * *
    Ctrls  = @WINDOW:@RM					; Props  = 'ID':@RM
    Ctrls := @WINDOW:'.RDS_DETAIL':@RM		; Props := 'ARRAY':@RM
    Ctrls := @WINDOW:'.CUST_NO':@RM			; Props := 'TEXT':@RM
    Ctrls := @WINDOW:'.WO_CUST_NO_SHIP_TO'	; Props := 'TEXT'
    Vals = Get_Property(Ctrls,Props)
    ShipNo		= Vals[1,@RM]
    RDSList		= Vals[COL2()+1,@RM]
    CustNo		= Vals[COL2()+1,@RM]
    ShipCustNo 	= Vals[COL2()+1,@RM]
    RDSNos	= RDSList
    SWAP @VM:@VM WITH '' IN RDSNos
    IF RDSNos[-1,1] = @VM THEN RDSNos[-1,1] = ''
    LOOP
    UNTIL RDSNos[-1,1] NE @VM OR RDSNos = ''
        RDSNos[-1,1] = ''
    REPEAT
    IF CustNo = '6874' OR CustNo = '7055' THEN 
        * This is Wales -> transmit via ftp       
        KeyList = RDSNos      
        IF KeyList = '' THEN
            ErrMsg('There are no RDS records attached to this shipment.  No data will be sent to the customer. (EpiPRO process)')
            RETURN
        END
        DosTable = Environment_Services('GetReportsRootPath') : '\W':ShipNo:'.csv'
        ExportID = 'WALES_SYSTEM_RDS_DATA'        
        NoHeader = 1      
        obj_Export('ExportDelimited','Comma':@RM:KeyList:@RM:ExportID:@RM:DosTable:@RM:@RM:@RM:NoHeader)
        ToWalesScript  = 'open 10.131.104.18'					:CRLF$	
        ToWalesScript := 'user'									:CRLF$
        ToWalesScript := 'EU\NPTirep'							:CRLF$
        ToWalesScript := 'Wk4F6X61!2016Friday1'					:CRLF$
        ToWalesScript := 'pwd '									:CRLF$
        ToWalesScript := 'append ':DosTable:' EpiMesa_2018.csv'	:CRLF$	
        ToWalesScript := 'bye'									:CRLF$
        OSWrite ToWalesScript ON Environment_Services('GetReportsRootPath') : '\ToWales.scr'     
        stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToWales.scr",-1)
        IF Get_Status(errCode) THEN 
            ErrMsg(errCode)
        END
        OSDelete DosTable		;* Removes table from C: drive 
        
    END
        
    IF CustNo = '7053' THEN
        * This is TSMC - uses same setup as Wales       
        KeyList = RDSNos     
        IF KeyList = '' THEN
            ErrMsg('There are no RDS records attached to this shipment.  No data will be sent to the customer. (EpiPRO process)')
            RETURN
        END
        DosTable = Environment_Services('GetReportsRootPath') : '\T':ShipNo:'.csv'
        ExportID = 'WALES_SYSTEM_RDS_DATA'	       
        NoHeader = 0      
        obj_Export('ExportDelimited','Comma':@RM:KeyList:@RM:ExportID:@RM:DosTable:@RM:@RM:@RM:NoHeader)          
        ToWalesScript  = 'open 194.90.108.5':CRLF$
        ToWalesScript := 'user':CRLF$
        ToWalesScript := 'irepif2':CRLF$
        ToWalesScript := 'BGfq1h':CRLF$
        ToWalesScript := 'lcd \':CRLF$
        ToWalesScript := 'append ':DosTable:' EpiMesa.csv':CRLF$		;* * * * * * * * *Append to existing file
        ToWalesScript := 'bye':CRLF$
        OSWrite ToWalesScript ON Environment_Services('GetReportsRootPath') : '\ToWales.scr'
        stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToWales.scr",-1)
        IF Get_Status(errCode) THEN 
            ErrMsg(errCode)
        END
        OSDelete DosTable		;* Removes table from C: drive 
    END
    IF CustNo = '6593' OR CustNo = '408' OR CustNo = '7076' THEN 
        * This is Temecula & El Segundo -> transmit via ftp
        DosTable = Export_IR(ShipNo)           
        ToTemeculaScript  = 'open 10.72.100.40':CRLF$
        ToTemeculaScript  := 'user':CRLF$
        ToTemeculaScript  := 'EPIMesa':CRLF$
        ToTemeculaScript  := 'irepi01':CRLF$
        ToTemeculaScript  := 'lcd \':CRLF$
        ToTemeculaScript  := 'send ':DosTable:CRLF$		;* Send file to file with same name on remote
        ToTemeculaScript  := 'bye':CRLF$
        OSWrite ToTemeculaScript  ON Environment_Services('GetReportsRootPath') : '\ToTemecula.scr'
        stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTemecula.scr",-1)
        IF Get_Status(errCode) THEN 
            ErrMsg(errCode)
        END
        OSDelete DosTable		;* Removes table from C: drive 
        
    END
    IF ShipCustNo = '6775' THEN
        DosTable = Export_Tower_Met(ShipNo)		;* This is Tower -> transmit via ftp       
        * This is the ftp code here
        ToTowerScript  = 'open 194.90.108.5':CRLF$			;* Secured Server - ftps.ts.co.il
        ToTowerScript := 'user':CRLF$
        ToTowerScript := 'irepi':CRLF$
        ToTowerScript := 'REPii2':CRLF$
        ToTowerScript := 'lcd \':CRLF$
        ToTowerScript := 'put ':DosTable:CRLF$		;* Single file transfer
        ToTowerScript := 'bye':CRLF$
        OSWrite ToTowerScript ON Environment_Services('GetReportsRootPath') : '\ToTower.scr'
        stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTower.scr",-1)
        IF Get_Status(errCode) THEN 
            ErrMsg(errCode)
        END
        OSDelete DosTable		;* Removes table from C: drive 
        
    END
    IF ShipCustNo = '7053' OR ShipCustNo = '7092' THEN
        DosTable = Export_Tower_Met(ShipNo)		;* This is Tower -> transmit via ftp       
        * This is the ftp code here        
        ToTowerScript  = 'open 194.90.108.5':CRLF$			;* Secured Server - ftps.ts.co.il
        ToTowerScript := 'user':CRLF$
        ToTowerScript := 'irepif2':CRLF$
        ToTowerScript := 'BGfq1h':CRLF$
        ToTowerScript := 'lcd \':CRLF$
        ToTowerScript := 'put ':DosTable:CRLF$		;* Single file transfer
        ToTowerScript := 'bye':CRLF$
        OSWrite ToTowerScript ON Environment_Services('GetReportsRootPath') : '\ToTower.scr'
        stat = UTILITY('RUNWIN',"ftp -i -n -s:" : Environment_Services('GetReportsRootPath') : "\ToTower.scr",-1)
        IF Get_Status(errCode) THEN 
            ErrMsg(errCode)
        END
        OSDelete DosTable		 
                
    END
	
RETURN