Mike Phares b1c6903c1c Tasks 184281, 184799, 184800, 184801 and 184802
Align .editorconfig files

Move Controller logic to DMO classes

GlobalVars.AppSettings = Models.AppSettings.GetFromConfigurationManager();

Question EditorConfig
Project level editorconfig
Format White Spaces
AppSetting when EnvironmentVariable not set
Corrective Actions Tests
Schedule Actions Tests
DMO Tests
Controller Tests

Get ready to use VSCode IDE
2024-12-04 11:58:13 -07:00

443 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using Dapper;
using Fab2ApprovalSystem.Misc;
using Fab2ApprovalSystem.Models;
using Fab2ApprovalSystem.ViewModels;
namespace Fab2ApprovalSystem.DMO;
public class MiscDMO {
public static IEnumerable<Lot> SearchLots(string searchText, string searchBy) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
IEnumerable<Lot> lotList;
string sql = "";
if (GlobalVars.DBConnection.ToUpper() == "TEST" || GlobalVars.DBConnection.ToUpper() == "QUALITY") {
if (searchBy == GlobalVars.LOT_NO)
//sql = "SELECT WP_LOT_NO + '/' + ISNULL(WP_LOT_NO,'') AS LotNumber FROM WP_RECORD_MJ WHERE WP_LOT_NO LIKE '%" + searchText + "%' ";
sql = "SELECT WP_LOT_NO + '/' + ISNULL(WP_LOT_NO,'') AS LotNumber FROM SPNLot WHERE WP_LOT_NO LIKE '%" + searchText + "%' ";
else if (searchBy == GlobalVars.LOCATION) {
sql = "SELECT WP_LOT_NO + '/' + ISNULL(WP_LOT_NO,'') AS LotNumber FROM SPNLot WHERE WP_CURRENT_LOCATION = '" + searchText.Trim() + "' AND WP_LOT_NO + '/' + ISNULL(WP_LOT_NO,'') IS NOT NULL";
}
lotList = db.Query<Lot>(sql).ToList();
db.Close();
} else {
if (searchBy == GlobalVars.LOT_NO)
sql = "SELECT WP_LOT_NO + '/' + ISNULL(DieLotNumber,'') AS LotNumber FROM SPNLot WHERE WP_LOT_NO LIKE '%" + searchText + "%' OR DieLotNumber LIKE '%" + searchText + "%' ";
else if (searchBy == GlobalVars.LOCATION) {
sql = "SELECT WP_LOT_NO + '/' + ISNULL(DieLotNumber,'') AS LotNumber FROM SPNLot WHERE WP_CURRENT_LOCATION = '" + searchText.Trim() + "' AND WP_LOT_NO + '/' + ISNULL(DieLotNumber,'') IS NOT NULL";
}
lotList = db.Query<Lot>(sql).ToList();
db.Close();
}
return lotList;
}
public static IEnumerable<int> GetUserIDsBySubRoleID(int subRoleID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
IEnumerable<int> userList;
string sql = "";
sql = "SELECT UserID FROM UserSubRole WHERE SubRoleID = " + subRoleID;
userList = db.Query<int>(sql).ToList();
db.Close();
return userList;
}
public static IEnumerable<Lot> SearchLTLots(string searchText, string searchBy) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
string sql = "";
if (searchBy == GlobalVars.LOT_NO)
sql = "SELECT DISTINCT WP_LOT_NO AS LotNumber FROM vFAB2SPN_WP_RECORD WP WHERE WP_LOT_NO LIKE '%" + searchText.Trim() + "%' ";
else if (searchBy == GlobalVars.LOCATION) {
sql = "SELECT DISTINCT WP_LOT_NO AS LotNumber FROM vFAB2SPN_WP_RECORD WP WHERE WP_CURRENT_LOCATION = '" + searchText.Trim() + "'";
}
List<Lot> lotList = db.Query<Lot>(sql).ToList();
db.Close();
return lotList;
}
public static IEnumerable<WIPPart> SearchLTParts(string searchText) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
StringBuilder sql = new();
sql.Append("SELECT PartNumber + '~' + SiliconPart + '~' + ProcessFlow + '~' + PartDescription AS WIPPartData ");
sql.Append("FROM vWIPPartData WHERE PartNumber LIKE '%" + searchText + "%' ORDER BY PartNumber");
//StringBuilder sql = new StringBuilder();
//sql.Append("SELECT TO_PART AS PartNumber, FROM_PART AS SiliconPart, P.MP_DESCRIPTION AS PartDescirption, ");
//sql.Append("RTRIM(LTRIM(SUBSTRING(TO_PART_PROC, PATINDEX('% %', TO_PART_PROC), LEN(TO_PART_PROC)))) AS ProcessFlow ");
//sql.Append("FROM TEMIRWAP019.FAB2SPN.dbo.PG_RECORD W ");
//sql.Append("INNER JOIN TEMIRWAP019.Fab2SPN.dbo.MP_RECORD P ON W.TO_PART = P.MP_PART_NUMBER ");
//sql.Append("WHERE PartNumber LIKE '%" + searchText + "%' ORDER BY PartNumber ");
List<WIPPart> parList = db.Query<WIPPart>(sql.ToString()).ToList();
db.Close();
return parList;
}
public static void GetLotInformation(Lot lot) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
StringBuilder qryLotInfo = new();
qryLotInfo.Append("SELECT WP_STATUS , WP_LOT_NO, WP_PART_NUMBER, MP_PRODUCT_FAMILY, MP_DESCRIPTION, ");
qryLotInfo.Append("WP_CURRENT_QTY, WP_CURRENT_LOCATION, DieLotNumber, DiePartNo, DieCount, MP_QUALITY_CODE FROM SPNLot ");
qryLotInfo.Append("WHERE WP_Lot_No = @LotNumber ");
//var tempLotNumber = lot.LotNumber.Substring(0, 9);
var tempLotNumber = "";
if (lot.LotNumber.IndexOf('/') >= 0) {
tempLotNumber = lot.LotNumber.Substring(0, lot.LotNumber.IndexOf('/'));
} else
tempLotNumber = lot.LotNumber;
lot.LotNumber = tempLotNumber;
List<dynamic> lotInfoRow = db.Query<dynamic>(qryLotInfo.ToString(), new { LotNumber = tempLotNumber }).ToList();
foreach (dynamic lotInfoColumn in lotInfoRow) {
lot.LotNumber = lotInfoColumn.WP_LOT_NO;
if (lot.DieLotNumber == null || lot.DieLotNumber == "")
lot.DieLotNumber = lotInfoColumn.DieLotNumber;
if (lotInfoColumn.WP_PART_NUMBER != null)
lot.WipPartNo = lotInfoColumn.WP_PART_NUMBER.Trim();
if (lotInfoColumn.WP_CURRENT_LOCATION != null) {
// The data is returned from a view which is a combination from various sources and at times when the
// Lot is at the QDB location, which is extracted out of SAP, it also shows up at the 6600 location in SPN.
// There is a duplication.
//if the result returns 2 records , QDB overrides the other location (6600)
if (lot.Location == "QDB" && lotInfoColumn.WP_CURRENT_LOCATION == "6600")
lot.Location = "QDB";
else
lot.Location = lotInfoColumn.WP_CURRENT_LOCATION;
}
if (lotInfoColumn.MP_DESCRIPTION != null) {
lot.Description = lotInfoColumn.MP_DESCRIPTION;
if (lot.Description.Length > 0) {
string[] temp = lot.Description.Split(new char[] { ',' });
if (temp.Length > 0) {
try {
lot.ProductFamily = temp[0];
} catch { } // ignore the error
try {
//lot.Gen = double.Parse(temp[2].Substring(1, temp[2].Length - 1));
if (lot.Description.StartsWith("MA,"))
lot.Gen = temp[2];
else
lot.Gen = temp[2].Substring(1, temp[2].Length - 1);
} catch { }// ignore the error
try {
//lot.Hexsize = double.Parse(temp[6]);
lot.Hexsize = temp[6];
} catch { }// ignore the error
}
}
}
if (lotInfoColumn.WP_STATUS != null)
lot.Status = lotInfoColumn.WP_STATUS;
if (lotInfoColumn.DiePartNo != null)
lot.DiePartNo = lotInfoColumn.DiePartNo.Trim();
if (lotInfoColumn.WP_CURRENT_QTY != null)
lot.WaferCount = lotInfoColumn.WP_CURRENT_QTY;
if (lot.WipPartNo.Length > 0 || lot.DiePartNo.Length > 0) {
qryLotInfo.Clear();
qryLotInfo.Append("SELECT DiePartNo, SourceFAB, Diameter, Silicon, Gen, Layers,HexSize,Voltage,Channel, Type AS ProductFamily, ");
qryLotInfo.Append("WaferCost, DieCost FROM StdCost WHERE WIPWaferNo = @WIPPartNo OR DiePartNo = @DiePartNo ");
List<dynamic> moreLotInfoRow = db.Query<dynamic>(qryLotInfo.ToString(), new { WIPPartNo = lot.WipPartNo, DiePartNo = lot.DiePartNo }).ToList();
foreach (var moreLotInfoColumn in moreLotInfoRow) {
if (lotInfoColumn.DieCount != null && lotInfoColumn.DieCount != 0)
lot.DieCount = int.Parse(lotInfoColumn.DieCount.ToString());
lot.DieCost = double.Parse(moreLotInfoColumn.DieCost.ToString());
lot.WaferCost = double.Parse(moreLotInfoColumn.WaferCost.ToString());
if (moreLotInfoColumn.Channel != null)
lot.Channel = moreLotInfoColumn.Channel;
if (moreLotInfoColumn.Hexsize != null)
lot.Hexsize = moreLotInfoColumn.Hexsize;
if (moreLotInfoColumn.Voltage != null)
lot.Voltage = moreLotInfoColumn.Voltage;
if (lot.DieCount > 0)
lot.TotalCost = Math.Round(lot.DieCount * lot.DieCost, 2);
else if (lot.WaferCount > 0)
lot.TotalCost = Math.Round(lot.WaferCount * lot.WaferCost, 2);
}
}
// added this code if the data shows up at the 6600 location and also at QDB for a lot.
//if (lot.DieCost > 0)
// lot.Location = "QDB";
if (lotInfoColumn.MP_QUALITY_CODE != null)
lot.QualityCode = lotInfoColumn.MP_QUALITY_CODE.Trim();
}
db.Close();
//return lotStatusOption;
}
/// <summary>
/// /
/// </summary>
public static IEnumerable<UserProfile> GetUserList() {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
StringBuilder sql = new();
sql.Append("SELECT FirstName + ' ' + LastName AS FullName, U.UserID AS UserId ");
sql.Append("FROM Users U ");
sql.Append("ORDER BY FirstName");
return db.Query<UserProfile>(sql.ToString()).ToList();
}
public static List<string> GetApproverEmailListByDocument(int issueID, byte step, int documentType) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@IssueID", issueID);
parameters.Add("@Step", step);
List<string> emailList = db.Query<string>("GetApproverEmailListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList();
return emailList;
}
public static List<ApproversListViewModel> GetApproversListByDocument(int issueID, byte step, int documentType) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@IssueID", issueID);
parameters.Add("@Step", step);
List<ApproversListViewModel> approverList = db.Query<ApproversListViewModel>("GetApproversListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList();
return approverList;
}
public static IEnumerable<ApprovalModel> GetApprovalsByDocument(int issueID, int documentType) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@IssueID", issueID);
var approvalList = db.Query<ApprovalModel>(
"SELECT * FROM Approval WHERE IssueID = @IssueID AND DocumentTypeID = @DocumentTypeID", parameters);
return approvalList.ToList();
}
/// <summary>
/// NOT IN USE YET
/// </summary>
public static IEnumerable<LoginModel> GetApprovedApproversListByDocument(int issueID, int currentStep, int documentType) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
return db.Query<LoginModel>("GetApprovedApproversListByDocument", new { @DocumentTypeID = documentType, @IssueID = issueID, @Step = currentStep }, commandType: CommandType.StoredProcedure).ToList();
}
public static List<ApproversListViewModel> GetPendingApproversListByDocument(int issueID, byte step, int documentType) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@IssueID", issueID);
parameters.Add("@Step", step);
List<ApproversListViewModel> approverList = db.Query<ApproversListViewModel>("GetPendingApproversListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList();
return approverList;
}
public static List<string> GetEmergencyTECNApprovalNotifyList(int ecnNumber) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@ECNNumber", ecnNumber);
List<string> approverList = db.Query<string>("ECNGetETECNApprovalNotificationList", parameters, commandType: CommandType.StoredProcedure).ToList();
return approverList;
}
public static List<string> GetTECNCancelledApprovalNotifyList(int ecnNumber) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@ECNNumber", ecnNumber);
List<string> approverList = db.Query<string>("ECN_TECNCancelledApprovalNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList();
return approverList;
}
public static List<string> GetFabGroupNotifyList(int workRequestID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@WorkRequestID", workRequestID);
List<string> notifyList = db.Query<string>("LTFabGroupApprovalNotificationList", parameters, commandType: CommandType.StoredProcedure).ToList();
return notifyList;
}
public static List<string> GetWorkRequestRevisionNotifyList(int notificationType, int workRequestID, int userID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@NotificationType", notificationType);
parameters.Add("@UserID", userID);
parameters.Add("@WorkRequestID", workRequestID);
List<string> notifyList = db.Query<string>("LTGetWorkRequestRevisionNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList();
return notifyList;
}
public static List<string> GetWorkRequestApprovedNotifyList(int notificationType, int workRequestID, int userID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@NotificationType", notificationType);
parameters.Add("@UserID", userID);
parameters.Add("@WorkRequestID", workRequestID);
List<string> notifyList = db.Query<string>("LTGetWorkRequestApprovedNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList();
return notifyList;
}
public static List<string> GetLotTravelerCreationAndRevisionNotifyList(int ltLotID, int workRequestID, int userID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@LotID", ltLotID);
parameters.Add("@UserID", userID);
parameters.Add("@WorkRequestID", workRequestID);
List<string> notifyList = db.Query<string>("LTGetLotTravelerCreationAndRevisionNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList();
return notifyList;
}
public static int EnableOOOStatus(int oooUserID, int delegatedTo, DateTime startDate, DateTime endDate) {
int returnValue = 0;
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@OOOUserID", oooUserID);
parameters.Add("@DelegatedTo", delegatedTo);
parameters.Add("@OOOStartDate", startDate);
parameters.Add("@OOOExpirationDate", endDate);
parameters.Add("@ReturnValue", value: returnValue, direction: ParameterDirection.Output);
db.Execute("EnableOOOStatus", parameters, commandType: CommandType.StoredProcedure);
returnValue = parameters.Get<int>("@ReturnValue");
return returnValue;
}
public static void ExpireOOOStatus(int oooUserID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@OOOUserID", oooUserID);
var approverList = db.Execute("ExpireOOOStatus", parameters, commandType: CommandType.StoredProcedure);
}
public static List<Department> GetDepartments() {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
List<Department> departments = db.Query<Department>("GetDepartments", null, commandType: CommandType.StoredProcedure).ToList();
return departments;
}
public static List<AffectedModule> GetModules() {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
List<AffectedModule> modules = db.Query<AffectedModule>("GetModules", null, commandType: CommandType.StoredProcedure).ToList();
return modules;
}
public static void GetLTLotInformation(LTLot lot) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
StringBuilder qryLotInfo = new();
//qryLotInfo.Append("SELECT DISTINCT ");
//qryLotInfo.Append("WP_LOT_NO, WP_CURRENT_QTY, WP.WP_PART_NUMBER, MP_DESCRIPTION, WP_PROCESS, WO_LOCATION, WO_OPER_NO, WP_STATUS ");
//qryLotInfo.Append("FROM TEMIRWAP019.FAB2SPN.dbo.WO_RECORD WO ");
//qryLotInfo.Append("INNER JOIN TEMIRWAP019.FAB2SPN.dbo.WP_RECORD WP ");
//qryLotInfo.Append("ON WO.WO_LOT_NO = WP.WP_LOT_NO AND WO.InTime = (SELECT MAX(InTime) FROM TEMIRWAP019.FAB2SPN.dbo.WO_RECORD WHERE WO_LOT_NO = @LotNumber) ");
//qryLotInfo.Append("LEFT JOIN TEMIRWAP019.FAB2SPN.dbo.MP_RECORD MP ");
//qryLotInfo.Append("ON WP.WP_PART_NUMBER = MP.MP_PART_NUMBER ");
//qryLotInfo.Append("WHERE WO_LOT_NO = @LotNumber ");
qryLotInfo.Append("SELECT DISTINCT ");
qryLotInfo.Append("WP_LOT_NO, WP_CURRENT_QTY, WP.WP_PART_NUMBER, MP_DESCRIPTION, WP_PROCESS, WP_CURRENT_LOCATION, WP_OPER_NO, WP_STATUS ");
qryLotInfo.Append("FROM vFAB2SPN_WP_RECORD WP ");
qryLotInfo.Append("LEFT JOIN vFAB2SPN_MP_RECORD MP ");
qryLotInfo.Append("ON WP.WP_PART_NUMBER = MP.MP_PART_NUMBER ");
qryLotInfo.Append("WHERE WP_LOT_NO = @LotNumber ");
//var tempLotNumber = lot.LotNumber.Substring(0, 9);
var tempLotNumber = "";
if (lot.LotNumber.IndexOf('/') >= 0) {
tempLotNumber = lot.LotNumber.Substring(0, lot.LotNumber.IndexOf('/'));
} else
tempLotNumber = lot.LotNumber;
lot.LotNumber = tempLotNumber;
lot.LotNumber = tempLotNumber;
List<dynamic> lotInfoRow = db.Query<dynamic>(qryLotInfo.ToString(), new { LotNumber = tempLotNumber }).ToList();
foreach (dynamic lotInfoColumn in lotInfoRow) {
lot.WIPPartNumber = lotInfoColumn.WP_PART_NUMBER;
lot.WaferQty = lotInfoColumn.WP_CURRENT_QTY;
lot.PartDescription = lotInfoColumn.MP_DESCRIPTION;
lot.Process = lotInfoColumn.WP_PROCESS;
lot.Operation = lotInfoColumn.WP_OPER_NO;
lot.LotStatus = lotInfoColumn.WP_STATUS;
lot.Location = lotInfoColumn.WP_CURRENT_LOCATION;
}
}
public static string GetEmail(int? userID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@UserID", userID);
var email = db.Query<string>("GetEmail", parameters, commandType: CommandType.StoredProcedure).Single();
return email;
}
public static List<string> Get8DEmailListForClosureNotification(int issueID) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@DocID", issueID);
List<string> emailList = db.Query<string>("_8DGetEmailListClosureNotification", parameters, commandType: CommandType.StoredProcedure).ToList();
return emailList;
}
public static CredentialsStorage GetCredentialsInfo(string serverName, string credentialType) // TODO - need to use an enum for the credentialType
{
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@ServerName", serverName);
parameters.Add("@CredentialType", credentialType);
var data = db.Query<CredentialsStorage>("GetCredentialsInfo", param: parameters, commandType: CommandType.StoredProcedure).Single();
return data;
}
public List<ApproveListModel> GetApprovalReminderList() {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
List<ApproveListModel> approvals = db.Query<ApproveListModel>("GetApprovalForNotifcation", null, commandType: CommandType.StoredProcedure).ToList();
return approvals;
}
public void UpdateApprovalNotifyDate(int approvalId) {
IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
DynamicParameters parameters = new();
parameters.Add("@ApprovalId", approvalId);
db.Query<CredentialsStorage>("UpdateApprovalLastNotifyDate", param: parameters, commandType: CommandType.StoredProcedure).Single();
//return data;
}
//================================================================== End of Class
}