Compile function REACT_MODE_CHG_NG_EVENTS(CtrlEntId, Event, @PARAMS) /*********************************************************************************************************************** This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written permission from Infineon. Name : React_Mode_Chg_NG_Events Description : This function acts as a commuter module for all events related to this window. Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the application-specific promoted event handler. This makes it possible to add QuickEvents that need to execute Basic+ logic without having use the Form Designer to make the association, although this is limited to the events which are currently promoted. If the form needs to call the commuter module directly then the QuickEvent parameters should be formatted like this: '@SELF','@EVENT',['@PARAM1','@PARAMx'] Parameters : CtrlEntId [in] -- The fully qualified name of the control calling the promoted event Event [in] -- The event being executed. See the Notes section regarding "PRE" events Param1-15 [in] -- Additional event parameter holders EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in EVENT_SETUP insert History : (Date, Initials, Notes) 04/17/24 djs Replaced BACKCOLOR Set_Property calls with ENABLED -1 calls (disabled hard) in order to work around an OI 10 migration bug. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler #window REACT_MODE_CHG_NG $Insert EVENT_SETUP $Insert APP_INSERTS $Insert REACT_MODE_EQUATES $Insert REACT_MODE_NG_EQUATES $Insert REACTOR_MODES_EQUATES $Insert REACT_MODE_EQU ;* THESE ARE NOT THE SAME jch, Update 9/15/21. These are the equates for the CONFIG records $Insert MSG_EQUATES $Insert RLIST_EQUATES $Insert REACT_PROB_CAT_EQUATES $Insert REACTOR_LOG_EQU $Insert REACT_UTIL_EQU $Insert WO_LOG_EQU $Insert REACTOR_CHILD_KEY_IDS_EQUATES $Insert REACTOR_EQUATES $Insert POPUP_EQUATES $insert Message_Box_Equates Declare function center_window, msg, Memberof, Get_Property, NextKey, next_key, rowexists, Get_Status Declare function SRP_Array, start_window, Dialog_Box, Reactor_Log_Services, Reactor_Modes_Services, GetTickCount Declare function Reactor_Services, Error_Services, Logging_Services, Environment_Services, Database_Services Declare function SRP_List Declare subroutine RList, Set_Property, Set_List_Box_Data, end_dialog, record_lock, obj_React_Mode, ErrMsg Declare subroutine Mona_Services, Reactor_Services, Error_Services, obj_React_Status, Logging_Services Declare subroutine Database_Services, Override_Log_Services, SRP_List, Message_Box, Reactor_Log_Services GoToEvent Event for CtrlEntId else // Event not implemented end Return EventFlow or 1 //----------------------------------------------------------------------------- // EVENT HANDLERS //----------------------------------------------------------------------------- Event WINDOW.CREATE(CreateParam) Reactor = CreateParam[1,'*'] Wo = CreateParam[COL2()+1,'*'] ForceModeChange = CreateParam[COL2()+1,'*'] FourthParm = CreateParam[COL2()+1,'*'] LeakLampAutoFlag = (FourthParm = 1 ) IF INDEX(CreateParam,'CENTER',1 ) THEN void = center_window( @WINDOW ) END ELSE Void = Set_Property( @WINDOW, 'VISIBLE', 1 ) END EventFlow = 1 // Get List of Reactor Modes CurrentMode = Reactor_Services('GetReactCurrModeName', Reactor) ModeList = Reactor_Modes_Services('AvailableModes', CurrentMode, @User4, Reactor) Set_Property(@Window : '.MODE', 'LIST', ModeList) // End of Get list of Reactor Modes // Find the current REACT_MODE OR REACT_MODE_NG record. OldGenReactModeKey = XLATE('REACTOR_CHILD_KEY_IDS', Reactor, REACTOR_CHILD_KEY_IDS_REACT_MODE_KEY_IDS$, 'X') NewGenReactModeKey = XLATE('REACTOR_CHILD_KEY_IDS_NG', Reactor, REACTOR_CHILD_KEY_IDS_REACT_MODE_KEY_IDS$, 'X') OldGenReactModeDTM = Field(OldGenReactModeKey, '*', 2) NewGenReactModeDTM = Field(NewGenReactModeKey, '*', 2) ReactModeKeyToUse = '' If OldGenReactModeDTM GT NewGenReactModeDTM then ReactModeKeyToUse = OldGenReactModeKey GoSub TranslateOldCodes end If NewGenReactModeDTM GT OldGenReactModeDTM then ReactModeKeyToUse = NewGenReactModeKey end // End find the current REACT_MODE OR REACT_MODE_NG record. Set_List_Box_Data( @WINDOW ) // Check for Groups allowed to change IF memberof( @USER4, 'DATA_ENTRY' ) OR memberof( @USER4, 'SUPERVISOR' ) OR memberof( @USER4, 'MAINTENANCE' ) OR @USER4 EQ 'JONATHAN_O' THEN IF Reactor NE '' THEN * called from status window and createparam is the reactor number * so simply READ and lock OPEN 'CONFIG' TO ConfigTable ELSE Void = msg( '', 'Unable to open CONFIG table...' ) RETURN 0 END LOCK ConfigTable, 'REACT_MODE':Reactor THEN IF ForceModeChange THEN Set_Property(@Window : '.CANCEL', 'ENABLED', 0) Set_Property(@Window : '.APPLY', 'ENABLED', 1) END END ELSE Set_Property(@Window : '.MODE', 'ENABLED', 0) Set_Property(@Window : '.REACTMODESVC', 'ENABLED', 0) Set_Property(@Window : '.CANCEL', 'TEXT', 'OK') MsgInfo = '' MsgInfo = 'Reactor ':Reactor:' is currently being set to another mode...' MsgInfo = '!' NotSignedRL = 1 Void = msg( '', MsgInfo ) END GOSUB DoRead unlock ConfigTable, 'REACT_MODE':Reactor else NULL END ELSE * let them enter the reactor number and get a lock on the onchange event Set_Property(@Window : '.reactor_no', 'ENABLED', 1) END ;* End of check for Non-Null Reactor No END ELSE Set_Property(@Window : '.MODE', 'ENABLED', 0) Set_Property(@Window : '.REACTMODESVC', 'ENABLED', 0) Set_Property(@Window : '.CANCEL', 'TEXT', 'OK') GOSUB DoRead END ;* End of check for Groups allowed to change OriginalCommentSize = Get_Property(@Window:'.EDB_COMMENT', 'SIZE') Set_Property(@Window, '@EDB_COMMENT_ORIG_SIZE', OriginalCommentSize) End Event Event MODE.CHANGED() Set_Property(@Window:'.EDB_COMMENT', 'TEXT', '') OrigMode = Get_Property(@Window: '.CURRENT_MODE', 'TEXT') NewMode = Get_Property(@Window : '.MODE', 'TEXT') IF OrigMode NE NewMode then Set_Property(@Window : '.APPLY', 'ENABLED', 1) Set_Property(@Window : '.REACTMODESVC', 'TEXT', '') end else Set_Property(@Window : '.APPLY', 'ENABLED', 1) end CatDesc = Xlate('REACTOR_MODES', NewMode, REACTOR_MODES_SERVICE_CATEGORIES$, 'X') Swap @VM with @FM in CatDesc Set_Property(@Window : '.REACTMODESVC', 'VISIBLE', 1) Set_Property(@Window : '.REACTMODESVC', 'ENABLED', 1) Set_Property(@Window : '.REACTMODESVC', 'LIST', CatDesc) Set_Property(@Window : '.SERV_LABEL', 'VISIBLE', 1) IF NewMode EQ 'CHANGEOVER_SCHEDULED' then //GoSub ChangeOverAutoSet end If (NewMode _NEC 'WAITING_FOR_MAINTENANCE_UNSCHEDULED') and (NewMode _NEC 'WAITING_FOR_ENGTECH_UNSCHEDULED') then GoSub HideDropDownComments end end event Event REACTMODESVC.CHANGED() Set_Property(@Window:'.EDB_COMMENT', 'TEXT', '') UseDropDownComments = 0 NewMode = Get_Property(@Window : '.MODE', 'TEXT') SvcCat = Get_Property(@Window:'.REACTMODESVC', 'TEXT') If NewMode _EQC 'WAITING_FOR_MAINTENANCE_UNSCHEDULED' then AvailableMaintComments = Xlate('APP_INFO', 'REACT_MODE_CHANGE_MAINT_COMMENT_OPTIONS', 1, 'X') Swap @VM with @FM in AvailableMaintComments Set_Property(@Window:'.COB_COMMENT', 'LIST', AvailableMaintComments) UseDropDownComments += 1 end If NewMode _EQC 'WAITING_FOR_ENGTECH_UNSCHEDULED' then AvailableEngrComments = Xlate('APP_INFO', 'REACT_MODE_CHANGE_ENGR_COMMENT_OPTIONS', 1, 'X') Swap @VM with @FM in AvailableEngrComments Set_Property(@Window:'.COB_COMMENT', 'LIST', AvailableEngrComments) UseDropDownComments += 1 end If SvcCat _EQC 'WF-PARTICLES' then UseDropDownComments += 1 end If UseDropDownComments GT 1 then Set_Property(@Window:'.COB_COMMENT', 'ENABLED', True$) Set_Property(@Window:'.COB_COMMENT', 'VISIBLE', True$) OriginalCommentSize = Get_Property(@Window, '@EDB_COMMENT_ORIG_SIZE') CommentSize = Get_Property(@Window, '@EDB_COMMENT_ORIG_SIZE') CommentSize<2> = CommentSize<2> + 37 CommentSize<4> = 65 Set_Property(@Window:'.EDB_COMMENT', 'SIZE', CommentSize) Set_Property(@Window:'.COB_COMMENT', 'TEXT', '') Set_Property(@Window:'.EDB_COMMENT', 'ENABLED', -1) end else GoSub HideDropDownComments end end event Event APPLY.CLICK() // Initialize Logging LogPath = Environment_Services('GetApplicationRootPath') : '\ReactMode\LogFiles' Date = Oconv(Date(), 'D4/') LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' ReactMode Log.csv' Headers = 'Logging DTM' : @FM : 'Description' ColumnWidths = 20 : @FM : 250 objLog = Logging_Services('NewLog', LogPath, LogFilename, CRLF$, ' ', Headers, ColumnWidths, False$, False$) ReactNo = Get_Property(@WINDOW:'.REACTOR_NO','TEXT') NewMode = Get_Property(@Window : '.MODE', 'TEXT') NewReactModeSvc = Get_Property(@WINDOW:'.REACTMODESVC','TEXT') ;* .reactmodesvc->text NewNoteText = '' CobCommentEnabled = Get_Property(@Window:'.COB_COMMENT', 'ENABLED') If CobCommentEnabled then SelectedComment = Get_Property(@Window:'.COB_COMMENT', 'TEXT') If SelectedComment _EQC 'other' then NewNoteText = Get_Property(@Window:'.EDB_COMMENT', 'TEXT') end else NewNoteText = SelectedComment end end else NewNoteText = Get_Property(@Window:'.EDB_COMMENT', 'TEXT') end CurrentModeRecord = Reactor_Services('GetReactCurrModeRec', ReactNo) CurrentMode = CurrentModeRecord CurrentServiceDesc = CurrentModeRecord If (CurrentMode _EQC 'test_scheduled' or CurrentMode _EQC 'test_unscheduled') and CurrentServiceDesc _EQC 'spv test' then ReactType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X') If Len(ReactType) GE 3 and ReactType[1, 3] _EQC 'HTR' then Message = 'Remember to load the production recipe. Please find another employee to confirm this has been done.' Verification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, '':@FM:'':@FM:'':@FM:Message) ValidVerification = Verification<1> and Verification<2> NE @User4 If ValidVerification EQ True$ then ConfirmNote = 'Confirmed production recipe loaded' Reactor_Log_Services('AddComment', ReactNo, ConfirmNote, Verification<2>) end else If Verification<1> NE True$ then Message_Box(@Window, 'Invalid signature!', "Error", MSG_ICON_EXCLAM$) end else Message_Box(@Window, 'You must get another user to confirm the production recipe is loaded!', "Error", MSG_ICON_EXCLAM$) end Error_Services('Add', 'Post HTR SPV test recipe verification not complete') end end end If Error_Services('NoError') then Reactor_Services('CreateReactModeChange', @User4, ReactNo, NewMode, NewReactModeSvc, NewNoteText) If Error_Services('NoError') then End_Dialog(@Window, NewMode) end else Error_Services('DisplayError') ActiveProveIn = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_ACTIVE$, 'X') If ActiveProveIn then OverrideGroups = 'LEAD':@VM:'SUPERVISOR' UserMsg = "Reactor prove in must be processed in NICA. Override required from a lead or supervisor to bypass NICA." UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg) Override = UserVerification<1> If Override EQ True$ then ProveInOrderIds = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_ORDER_ID$, 'X') ProveInOrderList = SRP_List('Create', ProveInOrderIds, @VM) ProveInTypes = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_TYPE$, 'X') ProveInTypeList = SRP_List('Create', ProveInTypes, @VM) If SRP_List('Count', ProveInOrderList) GT 1 then OverrideData = Dialog_Box('PROVE_IN_OVERRIDE', @Window, ReactNo) ProveInTypesToCancel = OverrideData<1, 1> ProveInTypesToCancelList = SRP_List('Create', ProveInTypesToCancel, @VM) ResponseComment = '' for each ProveInType in ProveInTypes using @VM setting Idx If SRP_List('Locate', ProveInTypesToCancelList, ProveInType) GT 0 then ProveInOrderId = SRP_List('GetAt', ProveInOrderList, Idx) Reactor_Services('CancelReactorProveIn', ReactNo, ProveInOrderId) If ResponseComment NE '' then ResponseComment := ', ' end ResponseComment := ProveInType end Next ProveInType ResponseComment := ': ' ResponseComment := OverrideData<2, 1> Override_Log_Services('Create', 'REACTOR', ReactNo, UserVerification<2>, ResponseComment, 'REACTOR_PROVE_IN') SRP_List('Release', ProveInTypesToCancelList) end else ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)<2> If Assigned(ResponseComment) and Len(ResponseComment) GT 4 then ProveInOrderId = SRP_List('GetAt', ProveInOrderList, 1) Reactor_Services('CancelReactorProveIn', ReactNo, ProveInOrderId) Override_Log_Services('Create', 'REACTOR', ReactNo, UserVerification<2>, ResponseComment, 'REACTOR_PROVE_IN') Reactor_Services('CreateReactModeChange', @User4, ReactNo, NewMode, NewReactModeSvc, NewNoteText) If Error_Services('NoError') then End_Dialog(@Window, NewMode) end end else Message_Box(@Window, 'You must enter a comment greater than 4 letters!', 'Error', MSG_ICON_EXCLAM$) end end SRP_List('Release', ProveInOrderList) SRP_List('Release', ProveInTypeList) end end end end EventFlow = 0 end event Event RL_BUTTON.CLICK() If Get_Property('NDW_MAIN', 'VISIBLE') then AppMain = 'NDW_MAIN' end else AppMain = 'LSL_MAIN2' end ReactorLogID = Get_Property(@Window : '.RLID', 'TEXT') //Void = start_window( 'REACTOR_LOG', AppMain, ReactorLogID:'*CENTER', '', '' ) Void = Dialog_Box('REACTOR_LOG', AppMain, ReactorLogID:'*CENTER') void = Set_Property('REACTOR_LOG','@PARENT','REACT_MODE_CHG_NG') If Reactor_Log_Services('IsMaint', ReactorLogID) AND Reactor_Log_Services('IsSigned', ReactorLogID) then Set_Property(@Window : '.MODE', 'ENABLED', 1) end EventFlow = 0 end event Event CANCEL.CLICK() Reactor = Get_Property(@Window : '.REACTOR_NO', 'TEXT') CurMode = Get_Property(@Window: '.CURRENT_MODE','TEXT') End_Dialog(@Window, CurMode) end event Event COB_COMMENT.CHANGED() Set_Property(@Window:'.EDB_COMMENT', 'TEXT', '') Comment = Get_Property(@Window:'.COB_COMMENT', 'TEXT') If Comment _EQC 'other' then Set_Property(@Window:'.EDB_COMMENT', 'ENABLED', True$) end else Set_Property(@Window:'.EDB_COMMENT', 'ENABLED', -1) end end event //----------------------------------------------------------------------------- // INTERNAL GOSUBS //----------------------------------------------------------------------------- DoRead: // Pull in the full REACT_MODE or REACT_MODE_NG record. CurReactModeRec = XLATE('REACT_MODE', ReactModeKeyToUse, '','X') If CurReactModeRec EQ '' then //If CurReactModeRec is blank then check the NG table for that record. CurReactModeRec = XLATE('REACT_MODE_NG', ReactModeKeyToUse, '','X') end // This basically pulls in redundant information from a config table Rec = XLATE( 'CONFIG', 'REACT_MODE_NG':Reactor, '', 'X' ) If Rec = '' then Rec = XLATE( 'CONFIG', 'REACT_MODE':Reactor, '', 'X' ) end Service = Rec Note = Rec Mode = Rec ReactLogID = Rec ReactLogCat = XLATE('REACTOR_LOG', ReactLogID, 6, 'X') IF ReactLogID NE '' then IF Reactor_Log_Services('IsMaint', ReactLogID) then Set_Property(@Window : '.RL_BUTTON', 'VISIBLE', 1) IF NOT(Reactor_Log_Services('IsSigned', ReactLogID)) then * DO NOT ALLOW A MODE CHANGE CAUSE THE REACTOR LOG IS STILL OPEN MsgInfo = '' MsgInfo = 'You are not allowed to change the mode because the maintenance tech has not signed off on the reactor log entry...' MsgInfo = '!' Set_Property(@Window : '.MODE', 'ENABLED', 0); NotSignedRL = 1 Void = msg( '', MsgInfo ) end end else * ALLOW A MODE CHANGE CAUSE IT HAS BEEN SIGNED BY A MAINTENANCE TECHNICIAN end end Set_Property(@WINDOW:'.REACTOR_NO','TEXT', Reactor) Set_Property(@WINDOW:'.USERNAME','TEXT', Rec) Set_Property(@WINDOW:'.DATE','TEXT', Rec) Set_Property(@WINDOW:'.TIME','TEXT', Rec) Set_Property(@WINDOW:'.CURRENT_MODE','TEXT', Mode) Set_Property(@WINDOW:'.CURRENT_REACTMODESVC','TEXT', Service) Set_Property(@WINDOW:'.RUID','TEXT', Rec) Set_Property(@WINDOW:'.RLID','TEXT', Rec) Set_Property(@WINDOW:'.WO','TEXT', Wo) IF Service THEN Set_Property(@WINDOW:'.REACTMODESVC','VISIBLE',TRUE$) Set_Property(@WINDOW:'.SERV_LABEL','VISIBLE',TRUE$) Set_Property(@WINDOW:'.REACTMODESVC','ENABLED', 0) ;* Do not allow them to change the service until they change the mode END // Get Possible Modes here ModeList = '' ModeList = Reactor_Modes_Services('AvailableModes', Mode, @User4, Reactor) Set_Property(@Window : '.MODE', 'LIST', ModeList) return TranslateOldCodes: ReactorModeList = Xlate('SYSREPOSPOPUPS', @APPID<1>:'**':'REACTOR_MODE', PDISPLAY$, 'X') ReactorModeArray = ReactorModeList<8> Convert @VM to @FM in ReactorModeArray Convert @SVM to @VM in ReactorModeArray CurReactModeCode = XLATE('REACT_MODE', ReactModeKeyToUse, REACT_MODE_MODE$, 'X') Locate CurReactModeCode in ReactorModeArray using @FM setting CodePos then NewMode = ReactorModeArray end return CheckReactorLogStatus: return ChangeOverAutoSet: LastWO = '' NextWO = '' return HideDropDownComments: Set_Property(@Window:'.COB_COMMENT', 'ENABLED', False$) Set_Property(@Window:'.COB_COMMENT', 'VISIBLE', False$) Set_Property(@Window:'.EDB_COMMENT', 'ENABLED', True$) Set_Property(@Window:'.EDB_COMMENT', 'VISIBLE', True$) OriginalCommentSize = Get_Property(@Window, '@EDB_COMMENT_ORIG_SIZE') Set_Property(@Window:'.EDB_COMMENT', 'SIZE', OriginalCommentSize) Set_Property(@Window:'.COB_COMMENT', 'TEXT', '') return