COMPILE SUBROUTINE Print_Demand(ReportParm)
#pragma precomp SRP_PreCompiler

/*
	Print Material Demand Report
	10/27/2016 - John C Henry, J.C. Henry & Co., Inc. - Initial Coding
	10/05/2017 - Donald Bakke - No longer select SCHED_DET rows with an end date specified.
	10/24/2018 - Daniel Stieber - Patch added to resolve scheduling conflicts on the same day
*/

DECLARE SUBROUTINE Utility, ErrMsg, Set_Status, Set_Printer, RList, SRP_Stopwatch
DECLARE FUNCTION Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, obj_Install, Dialog_Box, obj_Location
DECLARE FUNCTION Schedule_Services

$INSERT OIPRINT_EQUATES
$INSERT SCHED_DET_EQUATES
$INSERT WO_LOG_EQUATES
$INSERT APPCOLORS
$INSERT MSG_EQUATES
$INSERT LOGICAL
$INSERT SCHEDULE_EQU

EQU TAB$				TO \09\
EQU TARGET_ACTIVELIST$	TO 5

ErrorTitle  =  'Error in stored procedure Print_Demand'
ErrCode		= ''
ErrorMsg	= ''
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'Initializing')
OPEN 'SCHED_DET' TO SchedDetTable ELSE
	ErrorMsg  =  'Unable to open "SCHED_DET" table.'
	ErrMsg(ErrorTitle:@SVM:ErrorMsg)
	RETURN
END

OPEN 'DICT.SCHED_DET' TO @DICT ELSE
	ErrorMsg = 'Unable to open "SCHED_DET" table.'
	ErrMsg(ErrorTitle:@SVM:ErrorMsg)
	RETURN
END

// Two full week
Today = OCONV(Date(),'D4/')
EndDate	= OCONV(Date()+13,'D4/')

ReactList 		= ''
WOList			= ''
SchedDetKeys	= ''

* SelectSent  = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' AND WITH SCHED_DT LE ':QUOTE(EndDate):' BY REACT_NO'
SelectSent  = 'SELECT SCHED_DET WITH SCHED_DT GE ':QUOTE(Today):' BY REACT_NO'

SRP_Stopwatch('Stop', 'Initializing')
SRP_Stopwatch('Start', 'Data Select')
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
IF Get_Status(errCode) THEN
	ErrMsg(errCode)
	RETURN
END
SRP_Stopwatch('Stop', 'Data Select')
SRP_Stopwatch('Start', 'Build Key List')
Done = 0

LOOP
	READNEXT @ID ELSE Done = 1
UNTIL Done
	ReactNo = @ID[1,'*']
	SchedDt	= @ID[COL2()+1,'*']
	SeqNo	= @ID[COL2()+1,'*']
* 	If @User4 EQ 'FRANCOIS_R' and ReactNo EQ '77' then debug
	READ SchedDetRec FROM SchedDetTable,@ID THEN
	
		WONo = SchedDetRec<SCHED_DET_WO_NO$>
	
		LOCATE ReactNo IN ReactList BY 'AR' USING @FM  SETTING Pos ELSE
			ReactList = INSERT(ReactList,Pos,0,0,ReactNo)
		END
		
		LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
            WOList 			= INSERT(WOList,Pos,-1,0,WONo)
            // Patch added on 10/24/18 to resolve scheduling conflicts on the same day for
            // the material track report. - djs
            PrevSchedDetKey = SchedDetKeys[-1, 'B':@FM]
            PrevReactNo = Field(PrevSchedDetKey, '*', 1)
            PrevSchedDt = Field(PrevSchedDetKey, '*', 2)               
            If (PrevReactNo EQ ReactNo) and (PrevSchedDt EQ SchedDt) then
                PrevSeqNo   = Field(PrevSchedDetKey, '*', 3)
                NumWO       = DCount(WOList<Pos>, @VM)
                PrevWONo    = WOList<Pos, NumWO - 1>
                SchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, WONo, SchedDt, SeqNo, True$)
                StartDt     = IConv(SchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
                PrevSchedEvents = Schedule_Services('GetScheduleEventSummary', ReactNo, PrevWONo, PrevSchedDt, PrevSeqNo, True$)
                PrevStartDt = IConv(PrevSchedEvents<SCHEDULE_ENTRY_DATE$>, 'D')
                If StartDt GT PrevStartDt then
                    // This is the common case
                    SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
                end else
                    // Scheduling irregularity - Insert this key in the second to last position.
                    NumKeys      = DCount(SchedDetKeys, @FM)
                    InsertPos    = NumKeys
                    SchedDetKeys = INSERT(SchedDetKeys,InsertPos,0,0,@ID)
                end
            end else
                SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
            end
		END
	END
	
REPEAT

CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
SRP_Stopwatch('Stop', 'Build Key List')	
SRP_Stopwatch('Start', 'Build Report')
IF ReportParm = 'T' THEN

	* Tracking Report
	
	Header		= "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page  'P'"
	MinDemand	= 0
	
END

IF ReportParm = 'D' THEN

	* Demand Report
	
	MinDemand	= Msg(@WINDOW,'','MIN_DEMAND_QTY')
	Header		= "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Demand with Reactor Queue < ':MinDemand:' Cassettes':@VM:"Page  'P'"
	
END

Set_Status(0)

/*
	Today		= OCONV(Date(),'D4/')
	Tomorrow	= OCONV(Date()+1,'D4/')

	SelectSent  = 'SELECT SCHED_DET WITH SCHED_DT = ':QUOTE(Today):' BY REACT_NO'

	RList(SelectSent,TARGET_ACTIVELIST$,'','','')
	IF Get_Status(errCode) THEN
		ErrMsg(errCode)
		RETURN
	END
*/

* Start of printing process

FileName		= 'Print Material Demand'
Title			= 'Printing Material Demand'

TopMargin		= 1.0
BottomMargin	= 0.75
LeftMargin		= 0.25
RightMargin		= 0.25

Margins = LeftMargin:@FM:TopMargin:@FM:RightMargin:@FM:BottomMargin

PageSetup	= '1'		;* LandScape
PrintSetup	= '2'		;* Preview Normal
PrintSetup<1,2> = '0'	;* All buttons
PrintSetup<1,5> = '1'	;* Page Range
PrintSetup<1,6> = 7		;* full mouse and keyboard support

If @UserName EQ 'MESCATXMUSER' then
    PageSetup	= '1' 							;* Landscape
    PrintSetup  = '0'							;* Print to specific location
    PrintPath	= Printer_Select(PrinterID)		;* Select printer - Displays popup if PrinterPort not found
end else
    * PrintPath = Printer_Select('',1)		;* Get Default printer path
    PrintPath = ''
end
stat = Set_Printer('INIT',FileName,Title,Margins,PageSetup,PrintSetup,PrintPath)

IF stat < 0 THEN
	ErrorMsg	= 'Stat = ' : Stat : ', PrintPath = ' : PrintPath
	GOTO OIPrintErr
end
DateRange = 'Effective ':OCONV(Date(),'D4')


*Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page  'P'"
Header<-1> = "'T'"
Header<-1> = ''																;* Blank line following heading

font	= 'Arial'
font<2>	= '10'
font<4>	= '0'		;* Bold

stat = Set_Printer('FONTHEADFOOT',font)	; IF stat < 0 THEN GOTO OIPrintErr
stat = Set_Printer('HEADER',Header)		; IF stat < 0 THEN GOTO OIPrintErr

Footer = " 'D' 'T'":@VM:@VM:"Page:  'P'"
stat = Set_Printer('FOOTER',Footer)		; IF stat < 0 THEN GOTO OIPrintErr

* 
@RECCOUNT	= 0
FirstPass	= 1
LastRecord	= 0
FirstLine 	= 1
fontSpacing	= 100

* Make Column Heading

ColHead = ''										; ColFmt = ''
ColHead<1,1>	= 'React No'						; ColFmt<1,1>	= '+^720'
ColHead<1,2>	= 'WO No'							; ColFmt<1,2>	= '+^1260'
ColHead<1,3>	= 'Sub Part No'						; ColFmt<1,3>	= '+<1800'
ColHead<1,4>	= 'Epi Part No'						; ColFmt<1,4>	= '+<1800'
ColHead<1,5>	= 'WO Qty'							; ColFmt<1,5>	= '+>720'
ColHead<1,6>	= 'RX Qty'							; ColFmt<1,6> 	= '+>720'
ColHead<1,7>	= 'UnRel Qty'						; ColFmt<1,7> 	= '+>720'
ColHead<1,8>	= 'Kit Location'					; ColFmt<1,8>	= '+^1260'
ColHead<1,9>	= 'Kit Qty'							; ColFmt<1,9> 	= '+^1260'
ColHead<1,10>	= '1K Stage Location'				; ColFmt<1,10>	= '+^1260'
ColHead<1,11>	= 'Stage Qty'						; ColFmt<1,11>	= '+^1260'
ColHead<1,12>	= 'PTI Location'					; ColFmt<1,12>	= '+^1260'
ColHead<1,13>	= 'PTI RO'							; ColFmt<1,13>	= '+^1260'


* Zero Accumulators For Each Break

Prev.ReactNo	 	= ''
Last.ReactNo.Break	= 1


* * * * * * *
ReadRecord:
* * * * * * *

* Zero Break Flags To False

ReactNo.Break=0


READNEXT @ID, Which.Value ELSE
	LastRecord		= 1
	ReactNo.Break	= 1
	ReactNo			= Prev.ReactNo
END

S.ATID = @ID

IF FirstPass AND LastRecord THEN
	GOTO Bail
END
 
IF LastRecord THEN GOTO BREAKS


READO @RECORD FROM SchedDetTable,@ID ELSE
	GOTO ReadRecord
END

@RECCOUNT += 1
 
* Calculate Value(s) For Column(s)

S.ATID			= {@ID}
I.ATID			= S.ATID
S.ReactNo		= {REACT_NO}
I.ReactNo		= S.ReactNo
S.WoNo			= {WO_NO}
I.WoNo			= S.WoNo
S.SubPartNo		= XLATE('WO_LOG',S.WoNo,'ORD_SUB_PART_NO','X')
I.SubPartNo		= S.SubPartNo
S.EpiPartNo		= XLATE('WO_LOG',S.WoNo,WO_LOG_EPI_PART_NO$,'X')
I.EpiPartNo		= S.EpiPartNo
S.WO_Qty		= {WO_QTY}
I.WO_Qty		= S.WO_Qty
S.WO_RX_Qty 	= {WO_RX_QTY}
I.WO_RX_Qty 	= S.WO_RX_Qty
S.WO_UnRel_QTY	= {WO_UNREL_QTY}
I.WO_UnRel_QTY	= S.WO_UnRel_QTY
S.Sched_DT		= {SCHED_DT}
I.Sched_DT		= S.Sched_DT

KitData = obj_Location('KitLocations',S.WONo)

SWAP CRLF$ WITH @VM IN KitData

S.KitLocation	= KitData<1>
I.KitLocation	= S.KitLocation

S.KitQty		= OCONV(SUM(KitData<2>) * 25,'MD0,Z')
I.KitQty		= S.KitQty

S.KitCassCnt	= COUNT(KitData<3>,',') + (KitData<3> NE '')
I.KitCassCnt	= S.KitCassCnt

StageData		= obj_Location('StageLocations',S.WONo)

SWAP CRLF$ WITH @VM IN StageData

S.StageLocation	= StageData<1>
I.StageLocation	= S.StageLocation

S.StageQty		= StageData<3>
I.StageQty		= S.StageQty

S.StageCassCnt	= COUNT(S.StageQty,',') + (S.StageQty NE '')
I.StageCassCnt	= S.StageCassCnt

PTIData		= obj_Location('PTILocations',S.WONo)

SWAP CRLF$ WITH @VM IN PTIData

S.PTILocation	= PTIData<1>
I.PTILocation	= S.PTILocation

S.PTIQty		= PTIData<3>
I.PTIQty		= S.PTIQty

S.PTICassCnt 	= COUNT(S.PTIQty,',') + (S.PTIQty NE '')
I.PTICassCnt	= S.PTICassCnt


CassQueueCnt = I.KitCassCnt + I.StageCassCnt + I.PTICassCnt


* TEST FOR CONTROL BREAK(S)
 
 
IF (S.ReactNo NE Prev.ReactNo) OR ReactNo.Break THEN
	ReactNo			= Prev.ReactNo
	Prev.ReactNo	= S.ReactNo
	ReactNo.Break  += 1
END

IF FirstPass THEN
	FirstPass=0
	GOTO DETAIL
END

* * * * * * *
BREAKS:
* * * * * * *

* Print Break Total(s) And Accumulate Total(s)

IF ReactNo.Break THEN
	
	IF ReportParm = 'D' ELSE
		stat = Set_Printer('TEXT')
	END

/*
	ColData = ''
	ColData<1,1> = ''
	ColData<1,2> = ''
	ColData<1,3> = ''
	ColData<1,4> = ''
	ColData<1,5> = ''
	ColData<1,6> = ''
	ColData<1,7> = ''
	ColData<1,8> = ''
	ColData<1,9> = ''
	ColData<1,10> = ''
	
	GOSUB PrintTable
*/	
	

END


* Perform Last Record Output If Done

IF LastRecord THEN
	
	colData = ''
	
	
	GOTO Bail
	
END


* * * * * * *
DETAIL:
* * * * * * *

* Do Conversion If Any


IF ReportParm = 'T' OR CassQueueCnt < MinDemand THEN
	  
	IF S.REACTNO NE "" 		THEN S.REACTNO		= OCONV(S.REACTNO,"MD0,")
	IF S.WONO NE "" 		THEN S.WONO			= OCONV(S.WONO,"MD0")
	IF S.WO_QTY NE "" 		THEN S.WO_QTY		= OCONV(S.WO_QTY,"MD0,")
	IF S.WO_RX_QTY NE ""	THEN S.WO_RX_QTY	= OCONV(S.WO_RX_QTY,"MD0,")
	IF S.WO_UNREL_QTY NE "" THEN S.WO_UNREL_QTY	= OCONV(S.WO_UNREL_QTY,"MD0,")
	IF S.SCHED_DT NE "" 	THEN S.SCHED_DT		= OCONV(S.SCHED_DT,"D4/")

	* PRINT DETAIL LINE
	
* 	If @User4 EQ 'FRANCOIS_R' then
	    
	    COLDATA = ''
	    RowNumber        = 0
	    For each Location in S.PTILocation using @VM setting fPos
	        LocationCassNos  = S.PTIQty<0, fPos>
	        FilteredCassList = ''
	        
	        For each CassNo in LocationCassNos using ','
	            WOMatKey = S.WoNo:'*':CassNo
	            InvActions = Xlate('WO_MAT', WOMatKey, 'INV_ACTION', 'X')
	            NumActions = DCount(InvActions, @VM)
	            CurrAction = InvActions<0, NumActions>
	            If CurrAction EQ 'PLACE' then	                
	                FilteredCassList<0, -1> = CassNo	                
	            end
	        Next CassNo
	        If ( (FilteredCassList NE '') and (Location NE '') ) or ( (FilteredCassList EQ '') and (Location EQ '') ) then
 
	            RowNumber += 1      
	            Convert @VM to ',' in FilteredCassList
                COLDATA<RowNumber,1>  = S.ReactNo
                COLDATA<RowNumber,2>  = S.WoNo
                COLDATA<RowNumber,3>  = S.SubPartNo
                ColData<RowNumber,4>  = S.EpiPartNo
                COLDATA<RowNumber,5>  = S.WO_Qty
                COLDATA<RowNumber,6>  = S.WO_RX_Qty
                COLDATA<RowNumber,7>  = S.WO_UnRel_Qty
                COLDATA<RowNumber,8>  = S.KitLocation
                COLDATA<RowNumber,9>  = S.KitQty				; *ColFmt<1,9>	= '_<1260'
                COLDATA<RowNumber,10> = S.StageLocation
                COLDATA<RowNumber,11> = S.StageQty				; *ColFmt<1,11>	= '_<1260'
                COLDATA<RowNumber,12> = S.PTILocation<0, fPos>
    *            COLDATA<fPos,13>  = S.PTIQty<0, fPos>				; *ColFmt<1,13>	= '_<1260'
                COLDATA<RowNumber,13> = FilteredCassList
	        end
	    Next Location
* 	end else
* 
*        COLDATA = ''
*        COLDATA<1,1>  = S.ReactNo
*        COLDATA<1,2>  = S.WoNo
*        COLDATA<1,3>  = S.SubPartNo
*        ColData<1,4>  = S.EpiPartNo
*        COLDATA<1,5>  = S.WO_Qty
*        COLDATA<1,6>  = S.WO_RX_Qty
*        COLDATA<1,7>  = S.WO_UnRel_Qty
*        COLDATA<1,8>  = S.KitLocation
*        COLDATA<1,9>  = S.KitQty				; *ColFmt<1,9>	= '_<1260'
*        COLDATA<1,10>  = S.StageLocation
*        COLDATA<1,11>  = S.StageQty				; *ColFmt<1,11>	= '_<1260'
*        COLDATA<1,12>  = S.PTILocation
*        COLDATA<1,13>  = S.PTIQty				; *ColFmt<1,13>	= '_<1260'
*    end
    
*    If @User4 EQ 'FRANCOIS_R' then
        If COLDATA NE '' then GoSub PrintTable
*    end else
*	    GOSUB PrintTable
*    end
    
END


GOTO ReadRecord
 

* * * * * * *
Bail:
* * * * * * *

stat = Set_Printer('TERM',1)
SRP_Stopwatch('Stop', 'Build Report')
* If @UserName EQ 'FRANCOIS_R' then SRP_Stopwatch('ShowAll')
RETURN




* * * * * * *
OIPrintErr:
* * * * * * *

ErrMsg(ErrorTitle:@SVM:ErrorMsg)
ErrMsg(ErrorTitle:@SVM:'Set_Printer returned errorcode ':stat)
stat = Set_Printer('TERM',1)

RETURN


* * * * * *
PrintTable:
* * * * * * 

PageHeight			= Get_Printer('PAGESIZE')<2>
PrintableHeight		= PageHeight - TopMargin - BottomMargin
PrinterHeight		= Get_Printer('POS')<2>

stat			= Set_Printer('CALCTABLE',ColFmt:@FM:ColData)
TableSize		= Get_Printer('CALCTABLE')


TableHeight		= TableSize<2>

fontSpacing			= 120

IF ( TableHeight + PrinterHeight >= PrintableHeight ) OR FirstLine THEN
	IF NOT(FirstLine) THEN
		stat = Set_Printer('PAGEBREAK')
	END
	FirstLine = 0
	font<2> = 10
	font<4> = 1		;* Bold
	stat = Set_Printer('FONT',font,'100')

	stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL)
	
	
	font<4> = 0
	stat = Set_Printer('FONT',font,fontSpacing)
	
	stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7)
	
END ELSE
	font<2> = 10
	font<4> = 0
	stat = Set_Printer('FONT',font,fontSpacing)
	stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',1,TB_ALL)

END
	
							
RETURN	 




