using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using Fab2ApprovalSystem.DMO; using Fab2ApprovalSystem.Models; namespace Fab2ApprovalSystem.Misc; public class MRBHelper { public static string NotifyApprovers(AppSettings appSettings, int mrbNumber, List emailIst) { string emailSentList = ""; string emailTemplate = "MRBAssigned.txt"; string userEmail = string.Empty; string subject = "MRB Assignment"; string senderName = "MRB"; foreach (string email in emailIst) { subject = "MRB Assignment"; EmailNotification en = new(appSettings, subject, emailTemplate); string[] emailparams = new string[3]; emailparams[0] = mrbNumber.ToString(); emailparams[1] = mrbNumber.ToString(); emailparams[2] = GlobalVars.hostURL; userEmail = email; en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); emailSentList += email + ","; } return emailSentList; } public static string ImportRemoveQDBFlag(AppSettings appSettings, MRB_DMO mrbDMO, string operation, out string physicalPath, string userIdentityName, string a, string b, string c, string fullFileName, Stream stream) { IEnumerable lotDataList = null; var guid = Guid.NewGuid().ToString(); var fileExtension = Path.GetExtension(fullFileName); physicalPath = Path.Combine(appSettings.LotTempPipeLine, guid + "." + fileExtension); using (FileStream fileStream = new(physicalPath, FileMode.Create, FileAccess.Write)) { stream.CopyTo(fileStream); } ExcelData x = new(physicalPath); lotDataList = x.ReadQDBFlagData(); foreach (string lotData in lotDataList) { mrbDMO.InsertMRB_QDB_HoldFlag(guid, lotData, operation); } FileInfo f = new(physicalPath); if (f.Exists) f.Delete(); // Send the data to SPN if (SendQDBFlagToSPN(appSettings, mrbDMO, guid, userIdentityName, a, b, c)) mrbDMO.UpdateMRB_QDB_HoldFlag(guid, true); else { mrbDMO.UpdateMRB_QDB_HoldFlag(guid, false); return "Problems while uploading to SPN"; } return string.Empty; } public static bool BatchFTP(AppSettings appSettings, string sourceFile, string destFile, string ftpLogDirectory, string userIdentityName, string a, string b, string c) { FileInfo sourcefile = new(sourceFile); try { ProcessStartInfo psiFab1 = new(); Process procFab1 = new(); StringBuilder sb = new(); if (GlobalVars.DBConnection.ToUpper() == "TEST" || GlobalVars.DBConnection.ToUpper() == "QUALITY") { psiFab1.FileName = a; } else { psiFab1.FileName = b; } psiFab1.Arguments = sourcefile.FullName + " " + destFile; psiFab1.RedirectStandardOutput = true; psiFab1.UseShellExecute = false; psiFab1.WorkingDirectory = c; procFab1.StartInfo = psiFab1; procFab1.OutputDataReceived += (sender, args) => sb.AppendLine(args.Data); ; procFab1.Start(); procFab1.BeginOutputReadLine(); procFab1.WaitForExit(4000); File.WriteAllText(Path.Combine(ftpLogDirectory, sourcefile.Name + ".txt"), sb.ToString()); return true; } catch (Exception e) { Functions.WriteEvent(appSettings, userIdentityName + "\r\n Approve\r\n" + e.Message.ToString(), EventLogEntryType.Error); return false; } } public static bool SendQDBFlagToSPN(AppSettings appSettings, MRB_DMO mrbDMO, string guid, string userIdentityName, string a, string b, string c) { StringBuilder output = new(); try { IEnumerable data = mrbDMO.GetMRB_QDB_HoldFlags(guid); foreach (string tempData in data) { output.Append(tempData.Trim() + Environment.NewLine); } try { if (output.Length > 0) { DateTime dt = DateTime.Now; string newsourceFileName = "S" + dt.Day.ToString("00") + dt.Month.ToString("00") + dt.Year.ToString("00") + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".mrb"; string newDestFileName = "S" + dt.Hour.ToString("00") + dt.Minute.ToString("00") + dt.Second.ToString("00") + ".mrb"; string outputFile = appSettings.HoldFlagDirectory + newsourceFileName; File.WriteAllText(outputFile, output.ToString()); #if (DEBUG) Thread.Sleep(1000); #endif try { if (BatchFTP(appSettings, outputFile, newDestFileName, appSettings.SPNMRBHoldFlagFTPLogDirectory, userIdentityName, a, b, c)) { mrbDMO.UpdateMRB_QDB_HoldFlag(guid, true); } else { mrbDMO.UpdateMRB_QDB_HoldFlag(guid, false); } } catch (Exception e) { string exceptionString = e.Message.ToString().Trim().Length > 500 ? "MRB =" + guid.ToString() + " FTPToSPN(): FTP Upload Error " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); EventLogDMO.Add(new WinEventLog() { IssueID = -1, UserID = userIdentityName, DocumentType = "MRB", OperationType = "Error", Comments = exceptionString }); return false; } } return true; } catch (Exception e) { string exceptionString = e.Message.ToString().Trim().Length > 500 ? "MRB =" + guid.ToString() + " SPN Hold Flag(SendToSPN) " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(appSettings, userIdentityName + "\r\n Approve\r\n" + e.Message.ToString(), EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = -1, UserID = userIdentityName, DocumentType = "MRB", OperationType = "Error", Comments = exceptionString }); return false; } } catch (Exception e) { string exceptionString = e.Message.ToString().Trim().Length > 500 ? "GUID =" + guid.ToString() + " SPN Hold Flag(SendToSPN) " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(appSettings, userIdentityName + "\r\n Approve\r\n" + e.Message.ToString(), EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = -1, UserID = userIdentityName, DocumentType = "MRB", OperationType = "Error", Comments = exceptionString }); return false; } } public static string ImportAddQDBFlag(AppSettings appSettings, MRB_DMO mrbDMO, string operation, out string physicalPath, string userIdentityName, string a, string b, string c, string fullFileName, Stream stream) { IEnumerable lotDataList = null; var guid = Guid.NewGuid().ToString(); var fileExtension = Path.GetExtension(fullFileName); physicalPath = Path.Combine(appSettings.LotTempPipeLine, guid + "." + fileExtension); using (FileStream fileStream = new(physicalPath, FileMode.Create, FileAccess.Write)) { stream.CopyTo(fileStream); } ExcelData x = new(physicalPath); lotDataList = x.ReadQDBFlagData(); foreach (string lotData in lotDataList) { mrbDMO.InsertMRB_QDB_HoldFlag(guid, lotData, operation); } FileInfo f = new(physicalPath); if (f.Exists) f.Delete(); if (SendQDBFlagToSPN(appSettings, mrbDMO, guid, userIdentityName, a, b, c)) mrbDMO.UpdateMRB_QDB_HoldFlag(guid, true); else { mrbDMO.UpdateMRB_QDB_HoldFlag(guid, false); return "Problems while uploading to SPN"; } return string.Empty; } public static void AttachSave(AppSettings appSettings, MRB_DMO mrbDMO, int mrbNumber, int userId, string fullFileName, Stream stream) { // Some browsers send file names with full path. // We are only interested in the file name. var fileName = Path.GetFileName(fullFileName); string physicalFileName; string physicalPath; // Check to see if this filename is in use var attachments = mrbDMO.GetMRBAttachments(mrbNumber); if (attachments.Count() > 0) { if (attachments.Count(a => string.Equals(a.FileName, fileName, StringComparison.OrdinalIgnoreCase)) > 0) { // This filename is used on this MRB // So we want to delete those records so the new record replaces them foreach (var a in attachments) { mrbDMO.DeleteMRBAttachment(a.AttachmentID); physicalFileName = a.Path; if (string.IsNullOrEmpty(physicalFileName)) physicalFileName = a.FileName; physicalPath = Path.Combine(appSettings.AttachmentFolder + "MRB", physicalFileName); if (File.Exists(physicalPath)) File.Delete(physicalPath); } } } physicalFileName = mrbNumber.ToString() + "_" + Guid.NewGuid().ToString() + Path.GetExtension(fileName); physicalPath = Path.Combine(appSettings.AttachmentFolder + "MRB", physicalFileName); using (FileStream fileStream = new(physicalPath, FileMode.Create, FileAccess.Write)) { stream.CopyTo(fileStream); } MRBAttachment attach = new() { MRBNumber = mrbNumber, FileName = fileName, Path = physicalFileName, #if (DEBUG) UserID = 114, #endif #if (!DEBUG) UserID = userId, #endif }; mrbDMO.InsertMRBAttachment(attach); } public static string ExcelLotOpen(MRB_DMO mrbDMO, int mrbNumber, StringBuilder warnings, IEnumerable dispos, string userIdentityName, string lotTempPipeLine, string fullFileName, Stream stream) { var fileName = Path.GetFileName(fullFileName); var fileExtension = Path.GetExtension(fullFileName); string fName = userIdentityName + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString(); string physicalPath = Path.Combine(lotTempPipeLine, fName + "." + fileExtension); IEnumerable lotNumbers; try { using (FileStream fileStream = new(physicalPath, FileMode.Create, FileAccess.Write)) { stream.CopyTo(fileStream); } ExcelData x = new(physicalPath); lotNumbers = x.ReadData(); } catch (Exception ex) { throw new Exception(string.Format("Invalid file format for {0}: {1}", fileName, ex.Message)); } // Get Tool, Issue Start and End Date MRB mrbInfo = mrbDMO.GetToolIssueStartEndDateData(mrbNumber, null); foreach (var lotInfo in lotNumbers) { if (lotInfo.LotDispo.Length == 1) { if (dispos.Count(d => d.DispositionType.Trim().ToUpper() == lotInfo.LotDispo.Trim().ToUpper()) == 0) { throw new Exception(string.Format("Invalid lot disposition {0} for lot no {1}", lotInfo.LotDispo, lotInfo.LotNo)); } } } // RJK - 12/17 // Only find the child Splits when a Tool or a list of Tools is provided if (!mrbInfo.ToolCSV.ToUpper().Equals("NA")) { foreach (var lotInfo in lotNumbers) { bool existingLotUpdated; Lot l = new(); l.LotNumber = lotInfo.LotNo ?? string.Empty; if (lotInfo.LotDispo.Length == 1) { l.DispoType = lotInfo.LotDispo[0]; } l.MRBNumber = mrbNumber; mrbDMO.InsertLot(l, true, out existingLotUpdated); // cannot do the check below , because what if the parent lot had splits after the prior lot split analysis if (!mrbDMO.InsertLotSplitsAffectedByIncident(mrbNumber, l.LotNumber, mrbInfo.ToolCSV, mrbInfo.IssueStartDate, mrbInfo.IssueEndDate)) { warnings.AppendFormat("Lot number {0} is not affected by these tools and issue start/end time.\n Uploaded without Lot Genealogy tracing", l.LotNumber); } } // Not required - Will be using each lot's Insert Date time stamp, // as lot could be added using search functionality // UpdateLastLotSplitAnalysisTime(mrbNumber); } else { // RJK - 12/17 // Only find the child Splits when a Tool or a list of Tools is provided foreach (var lotInfo in lotNumbers) { bool existingLotUpdated; Lot l = new(); l.LotNumber = lotInfo.LotNo ?? string.Empty; if (lotInfo.LotDispo.Length == 1) { l.DispoType = lotInfo.LotDispo[0]; } l.MRBNumber = mrbNumber; // do not insert any new lots when importing from excel mrbDMO.InsertLot(l, true, out existingLotUpdated); } } FileInfo f = new(physicalPath); if (f.Exists) f.Delete(); return physicalPath; } }