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 SearchLots(string searchText, string searchBy) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); IEnumerable 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(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(sql).ToList(); db.Close(); } return lotList; } public static IEnumerable GetUserIDsBySubRoleID(int subRoleID) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); IEnumerable userList; string sql = ""; sql = "SELECT UserID FROM UserSubRole WHERE SubRoleID = " + subRoleID; userList = db.Query(sql).ToList(); db.Close(); return userList; } public static IEnumerable 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 lotList = db.Query(sql).ToList(); db.Close(); return lotList; } public static IEnumerable 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 parList = db.Query(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 lotInfoRow = db.Query(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 moreLotInfoRow = db.Query(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; } /// /// / /// public static IEnumerable 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(sql.ToString()).ToList(); } public static List 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 emailList = db.Query("GetApproverEmailListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList(); return emailList; } public static List 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 approverList = db.Query("GetApproversListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList(); return approverList; } public static IEnumerable 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( "SELECT * FROM Approval WHERE IssueID = @IssueID AND DocumentTypeID = @DocumentTypeID", parameters); return approvalList.ToList(); } /// /// NOT IN USE YET /// public static IEnumerable GetApprovedApproversListByDocument(int issueID, int currentStep, int documentType) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); return db.Query("GetApprovedApproversListByDocument", new { @DocumentTypeID = documentType, @IssueID = issueID, @Step = currentStep }, commandType: CommandType.StoredProcedure).ToList(); } public static List 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 approverList = db.Query("GetPendingApproversListByDocument", parameters, commandType: CommandType.StoredProcedure).ToList(); return approverList; } public static List GetEmergencyTECNApprovalNotifyList(int ecnNumber) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); DynamicParameters parameters = new(); parameters.Add("@ECNNumber", ecnNumber); List approverList = db.Query("ECNGetETECNApprovalNotificationList", parameters, commandType: CommandType.StoredProcedure).ToList(); return approverList; } public static List GetTECNCancelledApprovalNotifyList(int ecnNumber) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); DynamicParameters parameters = new(); parameters.Add("@ECNNumber", ecnNumber); List approverList = db.Query("ECN_TECNCancelledApprovalNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList(); return approverList; } public static List GetFabGroupNotifyList(int workRequestID) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); DynamicParameters parameters = new(); parameters.Add("@WorkRequestID", workRequestID); List notifyList = db.Query("LTFabGroupApprovalNotificationList", parameters, commandType: CommandType.StoredProcedure).ToList(); return notifyList; } public static List 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 notifyList = db.Query("LTGetWorkRequestRevisionNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList(); return notifyList; } public static List 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 notifyList = db.Query("LTGetWorkRequestApprovedNotifyList", parameters, commandType: CommandType.StoredProcedure).ToList(); return notifyList; } public static List 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 notifyList = db.Query("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("@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 GetDepartments() { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); List departments = db.Query("GetDepartments", null, commandType: CommandType.StoredProcedure).ToList(); return departments; } public static List GetModules() { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); List modules = db.Query("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 lotInfoRow = db.Query(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("GetEmail", parameters, commandType: CommandType.StoredProcedure).Single(); return email; } public static List Get8DEmailListForClosureNotification(int issueID) { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); DynamicParameters parameters = new(); parameters.Add("@DocID", issueID); List emailList = db.Query("_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("GetCredentialsInfo", param: parameters, commandType: CommandType.StoredProcedure).Single(); return data; } public List GetApprovalReminderList() { IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); List approvals = db.Query("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("UpdateApprovalLastNotifyDate", param: parameters, commandType: CommandType.StoredProcedure).Single(); //return data; } //================================================================== End of Class }