Compile function Shipment_Services(@Service, @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 SRP Computer Solutions, Inc. Name : Shipment_Services Description : Handler program for all Shipment services. Parameters : Service [in] -- Name of the service being requested Param1-10 [in/out] -- Additional request parameter holders Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure Metadata : History : (Date, Initials, Notes) 11/13/24 djm Original programmer. 1/8/2025 djm Added parsing for connection errors and logging for loop resets. Removed emails for COC_AVAILABILITY. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $insert LOGICAL $Insert SERVICE_SETUP $Insert COC_EQUATES $Insert COMPANY_EQUATES Declare function Error_Services, Company_Services, FTP_Services, Environment_Services, Logging_Services, Shipment_Services Declare function Database_Services Declare subroutine Error_Services, Mona_Services, Rlist, SRP_Stopwatch, Logging_Services, Database_Services Declare subroutine Shipment_Services, OBJ_Notes Equ CRLF$ to \0D0A\ LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\COC_Availability' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_Error' '.log' Headers = 'Logging DTM' : @FM : 'Shipment ID' : @FM : 'Expected Remote Directory' :@FM: 'Customer/COMPANY Number' :@FM: 'Error Output' ColumnWidths = 30 : @FM : 20 : @FM : 50 :@FM: 50 :@FM: 300 objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM GoToService Return Response or "" Options MonaResources = 'FILE_GENERATION', 'FILE_TRANSMISSION', 'FILE_AVAILABILITY' //----------------------------------------------------------------------------- // SERVICES //----------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- // CycleRetentionDates // // // Cycles the APP_INFO*COC_AVAILABILITY record dates to check a portion of the retention period at a time. // Intended to be run by the Service Manager. // //---------------------------------------------------------------------------------------------------------------------- Service CycleRetentionDates() hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID then CycleRec = Xlate('APP_INFO', 'COC_AVAILABILITY', '', 'X') TodayDate = Date() EarliestDate = Shipment_Services('GetEarliestDate') If CycleRec<1> EQ TodayDate then CurrStartDate = CycleRec<2> CurrEndDate = CycleRec<3> PotentialStartDate = CurrStartDate - 10 PotentialEndDate = CurrEndDate - 10 Begin Case Case CurrStartDate EQ EarliestDate gosub LogLoopReset StartDate = TodayDate - 10 EndDate = TodayDate Case PotentialStartDate LT EarliestDate StartDate = EarliestDate EndDate = EarliestDate + 10 Case Otherwise$ StartDate = PotentialStartDate EndDate = PotentialEndDate End Case NewRec = CycleRec NewRec<2> = StartDate NewRec<3> = EndDate Database_Services('WriteDataRow', 'APP_INFO', 'COC_AVAILABILITY', NewRec, True$, False$, False$) StartDate = Oconv(StartDate, 'D4-') EndDate = Oconv(EndDate, 'D4-') Shipment_Services('CheckFileAvailability', StartDate, EndDate) end else gosub LogLoopReset StartDate = TodayDate - 10 EndDate = TodayDate NewRec = '' NewRec<1> = TodayDate NewRec<2> = StartDate NewRec<3> = EndDate Database_Services('WriteDataRow', 'APP_INFO', 'COC_AVAILABILITY', NewRec, True$, False$, False$) StartDate = Oconv(StartDate, 'D4-') EndDate = Oconv(EndDate, 'D4-') Shipment_Services('CheckFileAvailability', StartDate, EndDate) end Unlock hSysLists, ServiceKeyID else null end end service //---------------------------------------------------------------------------------------------------------------------- // CheckFileAvailability // // // Confirms the availabiliy of generated files on the FTP serve, otherwise sets a MONA critical status for COC // FILE_AVAILABILITY. Intended to be run by the Service Manager. // //---------------------------------------------------------------------------------------------------------------------- Service CheckFileAvailability(StartDate, EndDate) Error_Services('Clear') OPEN 'COC' TO COCTable ELSE Error_Services('Add', 'Unable to open COC Table') Return END Statement1 = 'SELECT COC BY ENTRY_DATE WITH ENTRY_DATE GE ' : Quote(StartDate) Statement2 = 'SELECT COC WITH ENTRY_DATE LE ' : Quote(EndDate) Clearselect RList(Statement1, 5, '', '', '') RList(Statement2, 5, '', '', '') If @List_Active EQ 3 AND @RecCount NE 0 then Done = 0 LOOP READNEXT COCNo ELSE Done = 1 UNTIL Done READ COCRec FROM COCTable, COCNo THEN WONo = COCRec CustNo = XLATE('COC', COCNo, 'WO_CUST_NO_EX', 'X') If CustNo EQ '' then CustNo = XLATE('WO_LOG',WONo,'CUST_NO','X') AutoDataFlag = XLATE('COMPANY',CustNo,COMPANY_AUTO_FTP_FLAG$,'X') If AutoDataFlag then NewCOC = COCRec NewCOC = True$ Gosub CompanyExceptionCheck DeleteScript = True$ Query = '*' : COCNo : '*' QueryResult = FTP_Services('ListDirectory', FTPHost, Username, Password, RemoteDirectory, Query, '', DeleteScript, SSH, '') ErrTest = Error_Services('GetMessage') If ErrTest EQ '' then If QueryResult NE '' then NewCOC = True$ Database_Services('WriteDataRow', 'COC', COCNo, NewCOC, True$, False$, False$) end end else // Ignore ssh_init and network errors If ( (IndexC(ErrTest, 'ssh_init', 1) EQ 0) and (IndexC(ErrTest, 'Network error', 1) EQ 0 ) ) then Error_Services('Add', 'Expected file for shipment ' : COCNo : ' missing.') NewCOC = False$ Database_Services('WriteDataRow', 'COC', COCNo, NewCOC, True$, False$, False$) Gosub LogMissingFile End end end END REPEAT end // Code to run COC SELECT and change MONA Status EarliestDate = Shipment_Services('GetEarliestDate') EarliestDate = OConv(EarliestDate, 'D4-') Statement1 = 'SELECT COC BY ENTRY_DATE WITH ENTRY_DATE GE ' : Quote(EarliestDate) Statement2 = 'SELECT COC WITH FTP_SHOULD_EXIST EQ 1 AND WITH FTP_EXISTS EQ 0' Clearselect RList(Statement1, 5, '', '', '') RList(Statement2, 5, '', '', '') If @List_Active EQ 3 AND @RecCount NE 0 then Shipment_Services('SetMONACritical', 'FILE_AVAILABILITY', 'Error locating expected COC file(s). Please review the logs and correct.') end else Shipment_Services('ClearMONACritical', 'FILE_AVAILABILITY') end end service //---------------------------------------------------------------------------------------------------------------------- // GetEarliestDate // // // Returns the earliest date that the service should check for. // // //---------------------------------------------------------------------------------------------------------------------- Service GetEarliestDate() TodayDate = Date() /////// Earliest Date where all documents to date are accounted for. To be used until 3-2-25, after which the earliest date should always just be 1 year before the current date.//////////////////////////////////// TempEarliestDate = '3-2-24' TempEarliestDate = Iconv(TempEarliestDate, 'D') LastYearDate = TodayDate - 365 If LastYearDate LT TempEarliestDate then EarliestDate = TempEarliestDate end else EarliestDate = LastYearDate end Response = EarliestDate End Service //---------------------------------------------------------------------------------------------------------------------- // SetMONACritical // // // Sets a MONA Critical Status for the specified COC monitoring resource. // Sends a notification to the FI_SUPPORT notification group with the specified message. // // //---------------------------------------------------------------------------------------------------------------------- Service SetMONACritical(MONAResource=MONAResources, ErrorMessage) IF MONAResource = 'FILE_GENERATION' OR MONAResource = 'FILE_TRANSMISSION' OR MONAResource = 'FILE_AVAILABILITY' then Mona_Services('SendBufferedStatus', 'GRP_OPENINSIGHT_MES_OP_FE_COC', MONAResource, 'CRITICAL') * If ErrorMessage NE '' then * // Send an internal OI message to FI Support * Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', 'USER_ID', 'X') * SentFrom = 'SYSTEM' * Subject = 'COC ' : MONAResource : ' Error!' * Message = ErrorMessage * AttachWindow = '' * AttachKey = '' * SendToGroup = '' * Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup * obj_Notes('Create',Parms) * End end else Error_Services('Add', 'Invalid COC MONA resource.') end End Service //---------------------------------------------------------------------------------------------------------------------- // ClearMONACritical // // // Sets a MONA OK Status for the specified COC monitoring resource. // // //---------------------------------------------------------------------------------------------------------------------- Service ClearMONACritical(MONAResource=MONAResources) IF MONAResource = 'FILE_GENERATION' OR MONAResource = 'FILE_TRANSMISSION' OR MONAResource = 'FILE_AVAILABILITY' then Mona_Services('SendBufferedStatus', 'GRP_OPENINSIGHT_MES_OP_FE_COC', MONAResource, 'OK') end else Error_Services('Add', 'Invalid COC MONA resource.') end End Service //---------------------------------------------------------------------------------------------------------------------- // ResetAllCOCMonaStatus // // // Resets MONA critical status for COC FILE_GENERATION, FILE_TRANSMISSION, and FILE_AVAILABILITY. // // //---------------------------------------------------------------------------------------------------------------------- Service ResetAllCOCMonaStatus() Mona_Services('SendBufferedStatus', 'GRP_OPENINSIGHT_MES_OP_FE_COC', 'FILE_GENERATION', 'OK') Mona_Services('SendBufferedStatus', 'GRP_OPENINSIGHT_MES_OP_FE_COC', 'FILE_TRANSMISSION', 'OK') Mona_Services('SendBufferedStatus', 'GRP_OPENINSIGHT_MES_OP_FE_COC', 'FILE_AVAILABILITY', 'OK') End Service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LogMissingFile: LogData = '' LogData<1> = LoggingDTM LogData<2> = COCNo LogData<3> = RemoteDirectory LogData<4> = CustNo LogData<5> = ErrTest Logging_Services('AppendLog', objLog, LogData, @RM, @FM) return LogLoopReset: LogData = '' LogData<1> = LoggingDTM LogData<2> = '' LogData<3> = 'Loop Restart' LogData<4> = '' Logging_Services('AppendLog', objLog, LogData, @RM, @FM) return CompanyExceptionCheck: Begin Case Case CustNo EQ '6593' OR CustNo EQ '408' OR CustNo EQ '7076' FTPHost = '10.72.176.48' Username = 'Infineon\TEMFTPEPIMesa' Password = 'fW&EHJhKWg!skUKV4_34' RemoteDirectory = '\TEMFTP_EPIMesa\Archive' SSH = False$ Case CustNo EQ '6775' FTPHost = 'sFTPNA.extra.infineon.com' Username = 'DNAMesaFI-FTP' Password = 'OpenInsight2018....!' RemoteDirectory = '/Tower' SSH = True$ Case CustNo EQ '7053' OR CustNo EQ '7092' FTPHost = 'sFTPNA.extra.infineon.com' Username = 'DNAMesaFI-FTP' Password = 'OpenInsight2018....!' RemoteDirectory = '/Tower' SSH = True$ Case Otherwise$ FTPSettings = Company_Services('GetFTPServer', CustNo) FTPHost = FTPSettings<1>;//this is new Username = FTPSettings<2>;//this is new Password = FTPSettings<3>;//this is new RemoteDirectory = '/' : FTPSettings<5>;//this is new SSH = FTPSettings<6>;//this is new End Case return