Removed nugetSource from pipeline Removed more comments Created Static Classes for most DMO / Controller Classes Push ConfigurationManager.AppSettings to controller Align Tests with other Projects
320 lines
14 KiB
C#
320 lines
14 KiB
C#
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<string> 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<string> 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);
|
|
}
|
|
|
|
#if !NET8
|
|
ExcelData x = new ExcelData(physicalPath);
|
|
lotDataList = x.ReadQDBFlagData();
|
|
|
|
foreach (string lotData in lotDataList) {
|
|
mrbDMO.InsertMRB_QDB_HoldFlag(guid, lotData, operation);
|
|
}
|
|
#endif
|
|
|
|
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<string> 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<string> 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);
|
|
}
|
|
|
|
#if !NET8
|
|
ExcelData x = new ExcelData(physicalPath);
|
|
lotDataList = x.ReadQDBFlagData();
|
|
|
|
foreach (string lotData in lotDataList) {
|
|
mrbDMO.InsertMRB_QDB_HoldFlag(guid, lotData, operation);
|
|
}
|
|
#endif
|
|
|
|
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<Disposition> 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);
|
|
|
|
#if !NET8
|
|
IEnumerable<ExcelData.ExcelLotInfo> lotNumbers;
|
|
|
|
try {
|
|
using (var fileStream = new FileStream(physicalPath, FileMode.Create, FileAccess.Write)) {
|
|
stream.CopyTo(fileStream);
|
|
}
|
|
ExcelData x = new ExcelData(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 Lot();
|
|
l.LotNumber = lotInfo.LotNo;
|
|
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 Lot();
|
|
l.LotNumber = lotInfo.LotNo;
|
|
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);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
FileInfo f = new(physicalPath);
|
|
if (f.Exists)
|
|
f.Delete();
|
|
|
|
return physicalPath;
|
|
}
|
|
|
|
} |