; RT_360645013_157_54_GreenDotPrePro_Staging (aOcsBankCustomerInputFilePreProcessor) (Def Version:54) (Implem Version:2) uses wUITypes, aOcsBankPersoCustomerOffer, aOcsInputFileProcessing, aOcsInputFileSplittingParameters, aOcsBankInputFileSplittingTool, aListOfInstances, aOcsPReader, OcsPrimaryTypes, aOcsDMEDecipherKeyDesc, OcsHsmInterface, aOcsGrammarHsmInterface, aOcsDMETranscipherKeyInstance, aOcsTransportKeyDef, aOcsDMETranscipherKeyDesc, aOcsBankInputFileImportTool const cKeyName = 'DEK.523738.00000001' const cKeyNotFoundMsg = 'Key not found' multiLang const cSplitFolder = 'GreenDotPreProcess_Files' const cSplitParamsName = 'GreenDot_EmbossSplit' const cTrigram = 'GRE' ;globals var alertMessage : Text var AlertFile : Int4 var AlertFileName : CString memory FromImportTool : aOcsBankInputFileImportTool override function LoadInputFile(fromFile : CString) return aOcsPReader uses Motor, aOcsPReaderByBlock, aClassDef, wUtil if wUtil.FGETSIZE(fromFile) > 4 * 1024 * 1024 _Result = Motor.NewInst(MetaModelEntity(aOcsPReaderByBlock).Id) else new(_Result) endIf _Result.LoadFile(fromFile) endFunc function GetInputFileParams return aOcsInputFileSplittingParameters forEach _Result in OQL Select * from x in aOcsInputFileSplittingParameters where Upcase(x.Name) = cSplitParamsName break endFor endFunc procedure AppendTextToFile(inOut theText : Text, disposeText : Boolean, inFile : Int4) uses MotorTypes, aTextType, wUtil var ThetextHeader : tpTextHeader absolute theText var lenWritten : Int4 ;LW 01/02/2014 check data in theText before attempting to write if not theText.type.IsBlank(@theText) wUtil.F_SEEK(inFile, wUtil.F_SIZE(inFile)) wUtil.F_BLOCKWRITE(inFile, @ThetextHeader.Content, ThetextHeader.TextLength, lenWritten) if lenWritten <> ThetextHeader.TextLength ;RF: The file failed to write, bring up err\w fname endIf if disposeText theText.type.Blank(@theText) endIf endIf ;End LW 01/02/2014 check data in theText before attempting to write endProc function GetEmbossSplitFileName(FromInputFile : tFileName, keySequence : CString, inOut errMsg : CString) return CString uses aOcsPersonaliser, wUtil, OcsPersonaliserInfo, aTextType, OcsASCIIEbcdicUtils var curPos : Int4 var detailContent : Text var ElementToFind : CString var EmbossFileCount : Int4 var embossseq_number : CString var embossseq_numberText : Text var ListOfFiles : aListOfInstances var MyFile : tFileName var tempFile : aOcsPReader ElementToFind = '_' + Copy(wUtil.FGETNAME(FromInputFile), 4, 4) + '.A001' new(ListOfFiles) wUtil.FindFiles(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\ProductCodeSplit\*' + ElementToFind, ListOfFiles) if ListOfFiles.count > 0 EmbossFileCount = 0 forEach MyFile in ListOfFiles if Pos(ElementToFind, MyFile) > 0 new(tempFile) tempFile = self.LoadInputFile(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\ProductCodeSplit\' + MyFile) curPos = 0 while (curPos >= 0) and (curPos < tempFile.Text_Length) detailContent = tempFile.Text_CopyText(curPos, curPos + 3000 - 1) embossseq_numberText = detailContent.type.CopyText(1723, 1734, @detailContent) embossseq_number = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(embossseq_numberText.type.AsCString(@embossseq_numberText), HP_EBCDIC) if keySequence = embossseq_number _Result = MyFile break endIf embossseq_number = '' curPos += 3000 endWhile dispose(tempFile) ;_Result = MyFile EmbossFileCount++ if _Result <> '' break endIf endIf endFor endIf if EmbossFileCount <> 1 ; there is an error ;NO MATCH ;Trigger file for CS AlertFileName = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\ErrorManagement\T_' + wUtil.FGETNAME(FromInputFile) + '_NoMatch.alert' ;RF prepare data to write to file WriteLn(alertMessage, 'Print Filename: ' && wUtil.FGETNAME(FromInputFile)) if EmbossFileCount = 0 errMsg = 'Error - No Emboss file for ' + FromInputFile WriteLn(alertMessage, 'Emboss Filename: (None)') elseIf EmbossFileCount > 1 errMsg = 'Error - More than one Emboss file for ' + FromInputFile WriteLn(alertMessage, 'Emboss Filename: ' && '(multiple)') ;RF TODO make this list! WriteLn(alertMessage, 'Mismatch reason: multiple matching emboss files') ;RF better messages later. WriteLn(alertMessage,'') ;visibly pleasing AlertFile = wUtil.F_OPEN(1, AlertFileName) if AlertFile = 0 wUtil.CreateDirsIfNecessary(AlertFileName) AlertFile = wUtil.F_CREATE(1, AlertFileName) endIf self.AppendTextToFile(alertMessage, True, AlertFile) wUtil.F_CLOSE(AlertFile) endIf endIf dispose(ListOfFiles) endFunc function GetMergedFileName(Param : CString, inOut ListOfOkFiles : aListOfInstances, inOut ErrorMsg : CString) return Boolean uses aOcsPersonaliser, wUtil, OcsPersonaliserInfo var ListOfFiles : aListOfInstances var MyFile : CString var Counter : Int4 var ElementToFind : CString ElementToFind = wUtil.FGETNAME(Param) new(ListOfFiles) wUtil.FindFiles(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatching' + '\*', ListOfFiles) if ListOfFiles.count > 0 Counter = 0 forEach MyFile in ListOfFiles if Pos(ElementToFind, MyFile) > 0 ListOfOkFiles.append(MyFile) Counter++ endIf endFor endIf if Counter > 0 _Result = True else _Result = False ErrorMsg = 'Error - No Emboss Print file for ' + Param endIf dispose(ListOfFiles) endFunc function Decipher(Data : CString) return CString uses OcsByteArray, aOcsKeyTransportKeyDef, OCSCryptoDLL, aOcsBankCustomerOfferSchedule, OcsBankHSMUtilities const cKeyName = 'DEK.523738.00000001' const cKeyNotFoundMsg = 'Key not found' multiLang var COS : aOcsBankCustomerOfferSchedule var CipheredData : tVarByteArray var DecipherKeyDef : aOcsTransportKeyDef var DecipherKeys : aListOfInstances var DecryptionKey : aOcsDMEDecipherKeyDesc var DmeType : tDMEType var ErrorMsg : CString var Padding : CString var hsm : aOcsGrammarHsmInterface var theKeyInstance : aOcsDMETranscipherKeyInstance ;Get the COS forEach COS in OQL Select * from x in aOcsBankCustomerOfferSchedule where Upcase(x.Name) = 'Green Dot PrePaid - PreProcessor' break endFor OcsByteArray.LoadFromHexCString(Data, CipheredData) forEach DecipherKeyDef in OQL Select * from x in aOcsKeyTransportKeyDef where Upcase(x.FullName) = cKeyName break endFor if DecipherKeyDef <> Nil new(DecryptionKey) DecryptionKey.KeyLabel = DecipherKeyDef DecryptionKey.DecipherAlgo = cDecipherTripleDESCBC DecipherKeys = DecryptionKey.ProduceDecipherKeyInstances(Nil, Nil, Nil, Nil, Nil, self.UseCryptoTestEquipment, ErrorMsg) if DecipherKeys <> Nil theKeyInstance = DecipherKeys.GetObjectAt(0) if theKeyInstance <> Nil if theKeyInstance.KCVValue = '' if DecipherKeys.RemoveObject(theKeyInstance) theKeyInstance.KCVValue = '38F94C' DecipherKeys.AppendObject(theKeyInstance) endIf endIf theKeyInstance.ICVValue = '0000000000000000' endIf ;if member(ForBatch, aOcsBankInputFileProcessing) DmeType = cEMV hsm = OcsBankHSMUtilities.GetDecryptionHsmInterface(DmeType, self.UseCryptoTestEquipment, COS, ErrorMsg) if hsm <> Nil if hsm.DecipherGrammarData(CipheredData, DecipherKeys, cPadding80, ErrorMsg) _Result = OcsByteArray.AsHexString(CipheredData) endIf endIf ;ASU 2012/11/14 - Bug 2706 - avoid memory leak dispose(DecipherKeys) endIf else ErrorMsg = cKeyNotFoundMsg endIf if ErrorMsg <> '' endIf endFunc function ComputeDetailFirst2Last3(inOut InFile : Int4, FromDetail : Text, inOut ErrorMsg : CString, UPC : CString, GreenDotSku : CString) return Boolean uses aTextType, OcsASCIIEbcdicUtils var Line : Text var TempText : Text var TempCstring : CString var CvC1 : CString ; ;Card Number TempText = FromDetail.type.CopyText(13, 31, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring) ;Expiration Date TempText = FromDetail.type.CopyText(883, 890, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) ;Put correct format TempCstring = Copy(TempCstring, 5, 2) + '/' + Copy(TempCstring, 3, 2) WriteLn(Line, TempCstring) ;Cardholder name TempText = FromDetail.type.CopyText(87, 112, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring) ;Last for name TempText = FromDetail.type.CopyText(13, 31, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, Copy(TempCstring, 13, 4)) ;CVC2 TempText = FromDetail.type.CopyText(1395, 1410, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, self.Decipher(TempCstring)) ;BIN TempText = FromDetail.type.CopyText(3000, 3004, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring) ;External ID TempText = FromDetail.type.CopyText(3005, 3014, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring) ;Track 1 & 2 ; ; TempText = FromDetail.type.CopyText(1379, 1394, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) CvC1 = self.Decipher(TempCstring) ;Track 1 TempText = FromDetail.type.CopyText(1143, 1221, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring + CvC1) ;Track 2 TempText = FromDetail.type.CopyText(1222, 1410, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring + CvC1) ;GD PrtSequence TempText = FromDetail.type.CopyText(3015, 3026, @FromDetail) TempCstring = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(TempText.type.AsCString(@TempText), HP_EBCDIC) WriteLn(Line, TempCstring) ;UPC WriteLn(Line, UPC) ;Green Dot Sku WriteLn(Line, GreenDotSku) self.AppendTextToFile(Line, True, InFile) _Result = True endFunc function sequenceError(seq1 : String, seq2 : String) return Boolean var s1a : String var s1b : String var s2a : String var s2b : String var s1ai : Int4 var s1bi : Int4 var s2ai : Int4 var s2bi : Int4 ;string1 is s1a+s1b and string2 is s2a+s2b ; separate two halves of both s1 and s2 s1a = Copy(seq1, 1, 6) s1b = Copy(seq1, 7, 6) s2a = Copy(seq2, 1, 6) s2b = Copy(seq2, 7, 6) ; converting halves to integers s1ai = SaI(s1a) s1bi = SaI(s1b) s2ai = SaI(s2a) s2bi = SaI(s2b) if (s1ai = s2ai) and (s2bi = s1bi + 1) _Result = False ; Typical ideal case elseif (s1bi = 999999) and (s2bi = 0) and (s2ai = s1ai + 1) _Result = False ; This happens once every 10 million records else _Result = True ; There IS a sequence error endIf endFunc function PreProcessFile(FromInputFile : tFileName, FirstComplementaryInputFile : tFileName, SecondComplementaryInputFile : tFileName, FromCustomerOffer : aOcsBankPersoCustomerOffer, inOut CustomIdentifier : CString, var WithInputFileProcessing : aOcsInputFileProcessing, inOut ErrorMsg : CString) return Boolean override uses OcsTechArchi, OcsASCIIEbcdicUtils, wUtil, OcsDocUtil, aStringByStringHashTable, aTextType, OcsPersonaliserInfo, aOcsPersonaliser, aHashTableIterator var curLine : String var curLine2 : String var curLine2Text : Text var curLineText : Text var CurPos : Int4 var CurPos2 : Int4 var CurPosEmboss : Int4 var CurPosPrint : Int4 var CurrentSeq : Int4 var DetailContent : Text var EmbossSplitFile : CString var EndPos : Int4 var FileCardseq_number : CString var FileCardseq_numberText : Text var FileCounterDet : Int4 var FileSize : Int4 var LastRecordIncorrect : Boolean var fileIterator : Int4 var FileIteratorID : Int4 var First1Line : Text var First2Last3File : Int4 var First2Line : Text var firstLinePos : Int4 var folderToProcessTrigram : CString var GreenDotSku : CString var GUIFile : aOcsPReader var InFileConter : Int4 var key : CString var Last1Line : Text var Last2Line : Text var Last3Line : Text var LastCharPos : Int4 var LastEndLine : Int4 var BadSequences : aListOfInstances var ListOfErrorText : Text var ListOfOkFiles : aListOfInstances var ListOfSplittedIF : aListOfInstances var MainIFT : aOcsPReader var MergedEmbossPrintCandidate : tFileName var MergedEmbossPrintCandidateReader : aOcsPReader var MergedEmbossPrintFile : CString var MergedFile : Int4 var MovedFile : CString var MyBatchHeader : Text var MyBatchTrailer : Text var MyErrorGUI : CString var MyFileHeader : Text var MyFileTrailer : Text var myPrintFileIter : aHashTableIterator var NbatchHeader : Int4 var NbHeader : Int4 var numberofdetails : Int4 var numberofdetailsEmbossFile : Int4 var numberofdetailsPrintFile : Int4 var OriginalEmbossFileName : CString var Params : aOcsInputFileSplittingParameters var PrevBatchPos : Int4 var PrevLineEnd : Int4 var prev_seq_num : Int4 var prev_seq_string : CString var PrintDetailFromHash : CString var PrintFile : aOcsPReader var PrintFileElements : aStringByStringHashTable var PrintFileElementsList : aListOfInstances var PrintFileMatch : Boolean var PrintFileProductCode : CString var ProductCodeType : CString var QACounter : Int4 var QAFile : Int4 var QAFileTemp : CString var QA_Qty : CString var QA_QtyInt : Int4 var QtyForEmbossPrintFileSplit : Int4 var seq_num : Int4 var seq_string : String var seq_text : Text var SplitEmbossFile : aOcsPReader var SplittedIF : tFileName var SplittlingEngine : aOcsBankInputFileSplittingTool var StartPos : Int4 var TempFirst2Last3File : CString var TempMergedFile : CString var TestQty : Int4 var UPC : CString if OcsTechArchi.OpenDebug <> Nil endIf if self.FromImportTool.IsForProductionDebug and (OcsTechArchi.OpenDebug <> Nil) endIf ; ; ;Quantity for the Emboss/Print File Split QtyForEmbossPrintFileSplit = 5 ;//////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////EMBOSS FILE Treatment/////////////////////////////////// ;////////////////////////////////////////////////////////////////////////////////// if (Copy(wUtil.FGETNAME(FromInputFile), 1, 3) = 'YTF') or (Copy(wUtil.FGETNAME(FromInputFile), 1, 3) = 'MCI') and (wUtil.FGETEXT(FromInputFile) <> '.GUI') ;Get the splitting Parameters Params = self.GetInputFileParams if Params = Nil ErrorMsg = 'Cannot find splitting parameters "' + cSplitParamsName + '"' _Result = False else new(SplittlingEngine) new(ListOfSplittedIF) OriginalEmbossFileName = wUtil.FGETNAME(FromInputFile) SplittlingEngine.InputFileSplittingParameters = Params SplittlingEngine.MainInputFile = FromInputFile SplittlingEngine.SplitInputFile ListOfSplittedIF = SplittlingEngine.SplittedInputFiles new(BadSequences) forEach SplittedIF in ListOfSplittedIF MainIFT = self.LoadInputFile(SplittedIF) CurPos = 0 BadSequences.purge LastRecordIncorrect = False ProductCodeType = '' ;Count Number of details numberofdetails = 0 NbHeader = 0 NbatchHeader = 0 while (CurPos >= 0) and (CurPos < MainIFT.Text_Length) MainIFT.Text_Readln(curLine, CurPos) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if curLine[1] = '1' ;is a file header NbHeader++ NbatchHeader++ elseif curLine[1] = '2' ;is a batch header ;Get Product Type ProductCodeType = DelBeginEndSpace(Copy(curLine, 34, 26)) NbatchHeader++ elseif curLine[1] = '3' numberofdetails++ endIf CurPos += 2745 endWhile CurPos = 0 seq_num = 0 CurrentSeq = 0 ;Check Sequence while (CurPos >= 0) and (CurPos < MainIFT.Text_Length) MainIFT.Text_Readln(curLine, CurPos) ;! This increments CurPos by 255 ! curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if curLine[1] = '1' ;is a file hearder elseif curLine[1] = '2' ProductCodeType = DelBeginEndSpace(Copy(curLine, 34, 26)) ;is a batch header elseif curLine[1] = '3' ;Detail Level CurrentSeq++ prev_seq_num = seq_num prev_seq_string = seq_string ;#RF get the seq number CurPos2 = CurPos - 255 + 1723 ; note that Text_Readln mutated CurPos MainIFT.Text_Readln(seq_string, CurPos2) seq_string = Copy(seq_string, 1, 12) seq_string = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(seq_string, HP_EBCDIC) ;Check Sequence and if nok load error into list and flag IF ;Do not report adjacent sequence errors if LastRecordIncorrect LastRecordIncorrect = False elseif (CurrentSeq > 1) and self.sequenceError(prev_seq_string, seq_string) LastRecordIncorrect = True BadSequences.append(seq_num) ;remember this sequence number ;prepare data to write to file Write(alertMessage, 'Records: ') Write(alertMessage, CurrentSeq - 1) Write(alertMessage, ' to ') WriteLn(alertMessage, CurrentSeq) WriteLn(alertMessage, 'First Sequence: ' && prev_seq_string) WriteLn(alertMessage, 'Second Sequence: ' && seq_string) WriteLn(alertMessage, 'File Name: ' && wUtil.FGETNAME(FromInputFile)) WriteLn(alertMessage,'') ;visibly pleasing ;now, write this text to the alert file AlertFileName = wUtil.FGETDIR(SplittedIF) + '\ErrorManagement\T_' + OriginalEmbossFileName + '_' + ProductCodeType + '_NonSequential.alert' AlertFile = wUtil.F_OPEN(1, AlertFileName) ;write in 1 byte blocks ;RF If the file didn't exist, create it. if AlertFile = 0 wUtil.CreateDirsIfNecessary(AlertFileName) AlertFile = wUtil.F_CREATE(1, AlertFileName) endIf self.AppendTextToFile(alertMessage, True, AlertFile) wUtil.F_CLOSE(AlertFile) endIf prev_seq_num = seq_num endIf CurPos += 2745 endWhile ;move the file MovedFile = wUtil.FGETDIR(SplittedIF) + 'ProductCodeSplit\' + OriginalEmbossFileName + '_' + ProductCodeType + wUtil.FGETEXT(SplittedIF) wUtil.CreateDirsIfNecessary(MovedFile) if OcsTechArchi.MOVEFILE(SplittedIF, MovedFile) endIf dispose(MainIFT) endFor dispose(BadSequences) dispose(ListOfSplittedIF) ;Tweak to avoid fake errors. The splitting moves the files to .Input\Failed\Imported ;but the external processing is expecting a file in Input\Failed so it can move at the end of the processing if OcsTechArchi.MOVEFILE(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\Input\Failed\Imported\' + wUtil.FGETNAME(FromInputFile) + wUtil.FGETEXT(FromInputFile), OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\Input\Failed\' + wUtil.FGETNAME(FromInputFile) + wUtil.FGETEXT(FromInputFile)) endIf _Result = True endIf ; ;//////////////////////////////////////////////////////////////////////////////////// ;//////////////////////PRINT FILE Treatment///////////////////////////////////////// ;////////////////////////////////////////////////////////////////////////////////// ; elseif Copy(wUtil.FGETNAME(FromInputFile), 1, 2) = 'WM' ;Initiate Lists and Hash tables new(PrintFileElements) new(PrintFileElementsList) PrintFileElementsList.initForRecords(-1, sizeof(CString)) ; ;Get the product Code PrintFileProductCode = '' PrintFileProductCode = Copy(wUtil.FGETNAME(FromInputFile), 4, 4) PrintFile = self.LoadInputFile(FromInputFile) ; ;Initiate Values for loops CurPosPrint = 0 CurPosEmboss = 0 numberofdetailsPrintFile = 0 numberofdetailsEmbossFile = 0 PrintFileMatch = True ;Go throught the Print file, get the number of details and the detail content into the hashtable. while (CurPosPrint >= 0) and (CurPosPrint < PrintFile.Text_Length) and (PrintFileMatch = True) PrintFile.Text_Readln(curLine, CurPosPrint) key = '' key = Copy(curLine, 16, 12) PrintFileElements.AppendString(curLine + 'D', key) PrintFileElementsList.append(key) numberofdetailsPrintFile++ EmbossSplitFile = self.GetEmbossSplitFileName(FromInputFile, key, ErrorMsg) if ErrorMsg <> '' ;Emboss file not found PrintFileMatch = False endIf endWhile dispose(PrintFile) ;////////////////////////////////// ;///End of Print File Treatment/// ;//////////////////////////////// ; ; ; ;////////////////////////////////// ;Merge emboss & print file treatment ;//////////////////////////////// ; ;Load the Emboss File if PrintFileMatch = True SplitEmbossFile = self.LoadInputFile(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\ProductCodeSplit\' + EmbossSplitFile) ; FileCounterDet = 0 InFileConter = 0 CurPosEmboss = 0 curLine = '' ;Create Merge File File name TempMergedFile = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatching' + '\' + EmbossSplitFile wUtil.CreateDirsIfNecessary(TempMergedFile) MergedFile = wUtil.F_CREATE(1, TempMergedFile) ;curLine = '' ;Loop in file to count details and get the FileCardSequence see if it match those of the previous PrintFile (in the hash table now) while (CurPosEmboss >= 0) and (CurPosEmboss < SplitEmbossFile.Text_Length) and (PrintFileMatch = True) ;SplitEmbossFile.Text_Readln(curLine, CurPosEmboss) ;curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) DetailContent = SplitEmbossFile.Text_CopyText(CurPosEmboss, CurPosEmboss + 3000 - 1) curLine = DetailContent.type.Copy(255, 0, @DetailContent) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) fileIterator++ switch curLine[1] when '1' MyFileHeader = DetailContent self.AppendTextToFile(MyFileHeader, True, MergedFile) endWhen when '2' MyBatchHeader = DetailContent self.AppendTextToFile(MyBatchHeader, True, MergedFile) endWhen when '3' FileCounterDet++ numberofdetailsEmbossFile++ FileCardseq_numberText = DetailContent.type.CopyText(1723, 1734, @DetailContent) FileCardseq_number = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(FileCardseq_numberText.type.AsCString(@FileCardseq_numberText), HP_EBCDIC) if PrintFileElements.GetStringFromString(PrintDetailFromHash, FileCardseq_number) ;We have a match Write(DetailContent, OcsASCIIEbcdicUtils.ASCIIToEBCDICString(PrintDetailFromHash, HP_EBCDIC)) self.AppendTextToFile(DetailContent, True, MergedFile) PrintFileElements.DeleteString(FileCardseq_number) else ;No Match PrintFileMatch = False Write(self.FromImportTool.Report, 'Error: cannot match emboss sequence' && FileCardseq_number && 'to print file' && FromInputFile) endIf endWhen when '4' MyBatchTrailer = DetailContent self.AppendTextToFile(MyBatchTrailer, True, MergedFile) endWhen when '9' MyFileTrailer = DetailContent self.AppendTextToFile(MyFileTrailer, True, MergedFile) endWhen endSwitch CurPosEmboss += 3000 endWhile ;Close the file InFileConter = 0 wUtil.F_CLOSE(MergedFile) dispose(SplitEmbossFile) endIf ; if PrintFileMatch = True if PrintFileElements.Count > 0 PrintFileMatch = False Write(self.FromImportTool.Report, 'Error: one or more print sequence numbers in' && FromInputFile && 'could not be matched to emboss file' && EmbossSplitFile) endIf endIf ;Clean Mem dispose(PrintFileElements) dispose(PrintFileElementsList) ; ;//////////////////////////////////////////////////////////////////////////////////// ;////////////////////////GUI FILE Treatment///////////////////////////////////////// ;////////////////////////////////////////////////////////////////////////////////// ; elseif wUtil.FGETEXT(FromInputFile) = '.GUI' ; ; ;Open the GUI File, check the info and get the required infof for the first 2 last three report ; ; ;Note that we do not loop in the GUI file as it seems that there will be just a detail line ; ;Init just in case if OcsTechArchi.OpenDebug <> Nil endIf ; ;folderToProcessTrigram = '\\uschserv17\CPS\GDP\Input' folderToProcessTrigram = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\GDP\Input\ToBeProcessed' ; CurPos = 0 ;Load the file in the memory GUIFile = self.LoadInputFile(FromInputFile) ;Start ready the first line GUIFile.Text_Readln(curLine, CurPos) ;Get the end of the first line PrevLineEnd = GUIFile.Text_EndOfLine(CurPos) ;Set the second line cursor CurPos = PrevLineEnd + 1 ; ;Get the data required for the First 2 last 3 report UPC = GUIFile.CopyString(CurPos + 102, CurPos + 122, vtASCII) GreenDotSku = GUIFile.CopyString(CurPos + 216, CurPos + 236, vtASCII) StartPos = CurPos EndPos = GUIFile.Len QA_Qty = GUIFile.CopyString(StartPos + 572, EndPos, vtASCII) QA_QtyInt = SaI(DelBeginEndSpace(QA_Qty)) ;QA_QtyInt = SaI('1200') ; QA_QtyInt = SaI(DelBeginEndSpace(Copy(QA_Qty, 1, 4))) new(ListOfOkFiles) ListOfOkFiles.initForRecords(-1, sizeof(CString)) MyErrorGUI = '' ; Try to get the correspond Emboss + Print File if self.GetMergedFileName(wUtil.FGETNAME(FromInputFile), ListOfOkFiles, MyErrorGUI) _Result = True ;Gui file MovedFile = folderToProcessTrigram + '\' + wUtil.FGETNAME(FromInputFile) + wUtil.FGETEXT(FromInputFile) wUtil.CreateDirsIfNecessary(MovedFile) if OcsTechArchi.COPYFILE(FromInputFile, MovedFile, False, '') ;MOVEFILE(FromInputFile, MovedFile) else ErrorMsg = 'Unable To Move the GUI file ' + wUtil.FGETNAME(FromInputFile) _Result = False endIf ; ;Don't continue if you can move the file if _Result <> False ; ; ; We have a loop but in theory there should be only one element ;In this loop we will create the First2Last3 report, split the emboss+print file and move them to the computing trigram forEach MergedEmbossPrintCandidate in ListOfOkFiles ; CurPosEmboss = 0 curLine = '' numberofdetailsEmbossFile = 0 ; ;Load the Emboss File MergedEmbossPrintCandidateReader = self.LoadInputFile(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatching\' + MergedEmbossPrintCandidate) ; ;//////////////////////////////////////////////////////////////////////////////////// ;////////////////////////////////QA Treatment//////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////// ;Create QA File name QACounter = 0 QAFileTemp = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatchingQA' + '\' + MergedEmbossPrintCandidate wUtil.CreateDirsIfNecessary(QAFileTemp) QAFile = wUtil.F_CREATE(1, QAFileTemp) while (CurPosEmboss >= 0) and (CurPosEmboss < MergedEmbossPrintCandidateReader.Text_Length) DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3000 - 1) curLine = DetailContent.type.Copy(255, 0, @DetailContent) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if (curLine[1] = '1') or (curLine[1] = '2') or (curLine[1] = '4') or (curLine[1] = '9') self.AppendTextToFile(DetailContent, True, QAFile) CurPosEmboss += 3000 elseif curLine[1] = '3' QACounter++ ;Get Sequence DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3046 - 1) FileCardseq_numberText = DetailContent.type.CopyText(1723, 1734, @DetailContent) if QACounter = QA_QtyInt ;if QA_QtyInt = 600 ; Write(DetailContent, OcsASCIIEbcdicUtils.ASCIIToEBCDICString('QA' + ; QA_Qty + '00', HP_EBCDIC)) ;else Write(DetailContent, OcsASCIIEbcdicUtils.ASCIIToEBCDICString('QA' + QA_Qty, HP_EBCDIC)) ;endIf else ;Not QA card then just add the card sequence Write(DetailContent, OcsASCIIEbcdicUtils.ASCIIToEBCDICString('NOQA ', HP_EBCDIC)) endIf self.AppendTextToFile(DetailContent, True, QAFile) ;details size is now 3037 because of the merging CurPosEmboss += 3046 endIf endWhile wUtil.F_CLOSE(QAFile) dispose(MergedEmbossPrintCandidateReader) ;Load the Emboss File with QA MergedEmbossPrintCandidateReader = self.LoadInputFile(OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatchingQA\' + MergedEmbossPrintCandidate) ;//////////////////////////////////////////////////////////////////////////////////// ;////////////////////////////////File Split//////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////// CurPosEmboss = 0 curLine = '' ;Step 1 Get the Headers and trailers and count details while (CurPosEmboss >= 0) and (CurPosEmboss < MergedEmbossPrintCandidateReader.Text_Length) DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3000 - 1) curLine = DetailContent.type.Copy(255, 0, @DetailContent) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if (curLine[1] = '1') or (curLine[1] = '2') or (curLine[1] = '4') or (curLine[1] = '9') ;MyFileHeader if curLine[1] = '1' MyFileHeader = DetailContent elseif curLine[1] = '9' MyFileTrailer = DetailContent elseif curLine[1] = '2' MyBatchHeader = DetailContent elseif curLine[1] = '4' MyBatchTrailer = DetailContent endIf ;Header and trailer size are 3000 CurPosEmboss += 3000 else ;Count number of detail for latter treatment numberofdetailsEmbossFile++ ;details size is now 3052 because of the QA CurPosEmboss += 3052 endIf endWhile ; ;Step 2 Get the 2 first and Last three details InFileConter = 0 CurPosEmboss = 0 while (CurPosEmboss >= 0) and (CurPosEmboss < MergedEmbossPrintCandidateReader.Text_Length) DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3000 - 1) curLine = DetailContent.type.Copy(255, 0, @DetailContent) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if (curLine[1] = '1') or (curLine[1] = '2') or (curLine[1] = '4') or (curLine[1] = '9') ;Header and trailer size are 3000 CurPosEmboss += 3000 else ;Get the detail number InFileConter++ ;details size is now 3037 because of the merging if InFileConter = 1 First1Line = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) elseif InFileConter = 2 First2Line = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) elseif InFileConter = numberofdetailsEmbossFile - 2 Last1Line = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) elseif InFileConter = numberofdetailsEmbossFile - 1 Last2Line = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) elseif InFileConter = numberofdetailsEmbossFile Last3Line = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) endIf CurPosEmboss += 3052 endIf endWhile ; ; ; ;;Step 3 Compute the First2Last3 report ; ; TempFirst2Last3File = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + cTrigram + '\' + cSplitFolder + '\First2Last3' + '\' + MergedEmbossPrintCandidate + '_' + 'First2Last3' wUtil.CreateDirsIfNecessary(TempFirst2Last3File) First2Last3File = wUtil.F_CREATE(1, TempFirst2Last3File) ; ;///////// ;Detail 1 ;///////// ; if self.ComputeDetailFirst2Last3(First2Last3File, First1Line, ErrorMsg, UPC, GreenDotSku) endIf ;///////// ;Detail 2 ;///////// ; if self.ComputeDetailFirst2Last3(First2Last3File, First2Line, ErrorMsg, UPC, GreenDotSku) endIf ;///////// ;Detail n-2 ;///////// ; if self.ComputeDetailFirst2Last3(First2Last3File, Last1Line, ErrorMsg, UPC, GreenDotSku) endIf ;///////// ;Detail n-1 ;///////// ; if self.ComputeDetailFirst2Last3(First2Last3File, Last2Line, ErrorMsg, UPC, GreenDotSku) endIf ;///////// ;Detail n ;///////// ; if self.ComputeDetailFirst2Last3(First2Last3File, Last3Line, ErrorMsg, UPC, GreenDotSku) endIf ;;/// ;WClose file; wUtil.F_CLOSE(First2Last3File) ;; ;Step 4 Compute Files ; fileIterator = 1 FileCounterDet = 0 InFileConter = 0 CurPosEmboss = 0 curLine = '' while (CurPosEmboss >= 0) and (CurPosEmboss < MergedEmbossPrintCandidateReader.Text_Length) DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3000 - 1) curLine = DetailContent.type.Copy(255, 0, @DetailContent) curLine = OcsASCIIEbcdicUtils.EBCDICtoASCIIString(curLine, HP_EBCDIC) if curLine[1] = '3' DetailContent = MergedEmbossPrintCandidateReader.Text_CopyText(CurPosEmboss, CurPosEmboss + 3052 - 1) ;To get the curent detail number of the main file FileCounterDet++ ;get the current the detail number within a split InFileConter++ ;Create a new file if it a the first detail witin a split if InFileConter = 1 ;SubSplit File name ;SubSplit File name TempMergedFile = OcsPersonaliserInfo.BankPersoCenter.CPSDataDirectory + '\' + cTrigram + '\' + cSplitFolder + '\EmbPrtMatchingSplit' + '\' + MergedEmbossPrintCandidate + '_' + IaS(fileIterator) wUtil.CreateDirsIfNecessary(TempMergedFile) ;Create file MergedFile = wUtil.F_CREATE(1, TempMergedFile) ;Count File fileIterator++ ;Put the header and trailer self.AppendTextToFile(MyFileHeader, True, MergedFile) self.AppendTextToFile(MyBatchHeader, True, MergedFile) endIf ;Add line self.AppendTextToFile(DetailContent, True, MergedFile) ;if we reach the split max quantity or the end of the file close the file if (InFileConter = QtyForEmbossPrintFileSplit) or (FileCounterDet = numberofdetailsEmbossFile) ;Add the trailers self.AppendTextToFile(MyBatchTrailer, True, MergedFile) self.AppendTextToFile(MyFileTrailer, True, MergedFile) ;Reset the in split counter InFileConter = 0 ;Close the file wUtil.F_CLOSE(MergedFile) ; ;Movefile To Input MovedFile = folderToProcessTrigram + '\' + MergedEmbossPrintCandidate + '_' + IaS(fileIterator) wUtil.CreateDirsIfNecessary(MovedFile) if OcsTechArchi.MOVEFILE(TempMergedFile, MovedFile) else ErrorMsg = 'Unable To Move the Emboss Print file ' + MergedEmbossPrintCandidate + '_' + IaS(fileIterator) _Result = False endIf endIf CurPosEmboss += 3052 else CurPosEmboss += 3000 endIf endWhile endFor ;Treatment OK if _Result <> False _Result = True endIf endIf else ErrorMsg = MyErrorGUI _Result = False endIf dispose(ListOfOkFiles) endIf endFunc