2023-10-03 10:14:54 -07:00

1016 lines
48 KiB
C#

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Web;
using Fab2ApprovalSystem.Models;
using Dapper;
using System.Transactions;
using Fab2ApprovalSystem.ViewModels;
using System.Reflection;
using Fab2ApprovalSystem.Misc;
namespace Fab2ApprovalSystem.DMO
{
public class WorkflowDMO
{
private IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING);
//delegate TResult MathFunction<T1, T2, TResult>(T1 var1, T2 var2);
//static void PrintResult<T1, T2, TResult>(MathFunction<T1, T2,
// TResult> mathFunction, T1 var1, T2 var2)
//{
// TResult result = mathFunction(var1, var2);
// Console.WriteLine(String.Format("Result is {0}", result));
//}
//PrintResult((x, y) => x / y, 2, 8);
//GenericDelegateNumber<int, int> e = new GenericDelegateNumber<int, int>(AddInt);
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="docType"></param>
/// <returns></returns>
public string GetSubRoleItems(int issueID, int docType)
{
List<string> subRoleItems = new List<string>();
StringBuilder sqlString = new StringBuilder();
string resultInClause = "";
// LOTDISPSITION
if (GlobalVars.DocumentType.LotDisposition == (GlobalVars.DocumentType)docType)
{
resultInClause = GetLotDispositionSubRoleItems(issueID);
}
// MRB
else if (GlobalVars.DocumentType.MRB == (GlobalVars.DocumentType)docType)
{
subRoleItems.Add("'MRBApprover'"); // TODO remove Hard coding
resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
}
else if (GlobalVars.DocumentType.MRB == (GlobalVars.DocumentType)docType)
{
subRoleItems.Add("'QA_Admin'"); // TODO remove Hard coding
resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
}
else if (GlobalVars.DocumentType.ECN == (GlobalVars.DocumentType)docType || GlobalVars.DocumentType.TECNCancelledExpired == (GlobalVars.DocumentType)docType)
{
// TODO remove Hard coding
resultInClause = GetECNSubRoleItems(issueID, docType);
}
else if (GlobalVars.DocumentType.EECN == (GlobalVars.DocumentType)docType)
{
resultInClause = GetECNSubRoleItems(issueID, docType);
}
else if (GlobalVars.DocumentType.LotTraveler == (GlobalVars.DocumentType)docType)
{
resultInClause = GetLotTravelerSubRoleItems(issueID);
}
else if (GlobalVars.DocumentType.CorrectiveAction == (GlobalVars.DocumentType)docType)
{
resultInClause = GetCorrectiveActionSubRoleItems(issueID);
}
else if (GlobalVars.DocumentType.CorrectiveActionSection == (GlobalVars.DocumentType)docType)
{
resultInClause = GetCorrectiveActionSectionSubRoleItems(issueID);
}
else if (GlobalVars.DocumentType.PartsRequest == (GlobalVars.DocumentType)docType)
{
resultInClause = GetSubRolesForPartsRequestNextStep(issueID);
}
return resultInClause;
}
/// <summary>
///
/// </summary>
/// <param name="caNo"></param>
/// <returns></returns>
string GetCorrectiveActionSubRoleItems(int caNo)
{
List<string> subRoleItems = new List<string>();
StringBuilder sqlString = new StringBuilder();
subRoleItems.Add("'Integration'");
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
string GetCorrectiveActionSectionSubRoleItems(int caNo)
{
List<string> subRoleItems = new List<string>();
StringBuilder sqlString = new StringBuilder();
subRoleItems.Add("'8DQA'");
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
/// <summary>
/// Get the Lot Disposition Document WorkFlow Sub Roles
/// </summary>
/// <param name="issueID"></param>
/// <returns></returns>
string GetLotDispositionSubRoleItems(int issueID)
{
List<string> subRoleItems = new List<string>();
int recordCount = 0;
StringBuilder sqlString = new StringBuilder();
// Check if "Disposition by OCAP" is checked
sqlString.Append("SELECT COUNT(*) FROM LotDisposition WHERE (DispositionByOCAP = 1) AND IssueID = @IssueID ");
recordCount = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single();
if (recordCount > 0)
{
// if "Disposition by OCAP" is checked only the get roles for the "Execution" level only
// For Step 3
// Get the Location Role
sqlString = new StringBuilder();
sqlString.Append("SELECT Location FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE LD.IssueID = @IssueID ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
string tempLocation = "";
foreach (var dataRow in dataRows)
{
tempLocation = dataRow.Location.ToString();
if (tempLocation == "QDB" || tempLocation == "EDB")
subRoleItems.Add("'" + tempLocation + "'");
else if (tempLocation == "6300" || tempLocation == "6400" || tempLocation == "6600")
subRoleItems.Add("'Probe'");
else
subRoleItems.Add("'Fab'");
}
}
else
{
// NOT "Disposition by OCAP"
// For Step 1
// Get the "Issue"
sqlString = new StringBuilder();
sqlString.Append("SELECT Issue FROM LotDisposition LD INNER JOIN ResponsibilityIssue R ON LD.ResponsibilityIssueID = R.ResponsibilityIssueID WHERE LD.IssueID = @IssueID ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.Issue.ToString() + "'");
}
#region YE Role
// ==================================================================YE ROLE===============================================================================================
// For Step 1
// check if there any IG Medical products
sqlString = new StringBuilder();
sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE LD.IssueID = @IssueID AND (L.Description LIKE 'IG,%' AND L.Description LIKE '%MA,%')");
int recordCountForIG_MA = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single();
// Get list of the YE "Product-Generation"
sqlString = new StringBuilder();
sqlString.Append("SELECT DISTINCT SubRoleCategoryItem, LTRIM(RTRIM(L.ProductFamily)) + '-' + ISNULL(LTRIM(RTRIM(CONVERT(varchar(10), L.Gen))), 'NULL') AS LotFamilyGen, ");
sqlString.Append("CASE WHEN L.LotStatusOptionID = 2 OR (ISNULL(S.ScrapCount, 0) > 0 AND ISNULL(S.ReleaseCount, 0) = 0) THEN 1 ELSE 0 END AS LotIsFullyScrapped, ");
sqlString.Append("L.Location ");
sqlString.Append("FROM Lot L ");
sqlString.Append("LEFT OUTER JOIN vFamilyGenYESubRole ON FamilyGen = LTRIM(RTRIM(L.ProductFamily)) + @FamilySuffix + '-' + LTRIM(RTRIM(CONVERT(varchar(10), L.Gen))) ");
sqlString.Append("LEFT OUTER JOIN ScrapLot S on S.LotNo = L.LotNumber AND S.IssueID = L.IssueID ");
sqlString.Append("WHERE L.IssueID = @IssueID ");
dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID, FamilySuffix = (recordCountForIG_MA > 0 ? "_MA" : "") }).ToList();
foreach (var dataRow in dataRows)
{
if (dataRow.LotIsFullyScrapped == 1)
{ // if lot is fully scrapped
int location = 0;
if (!Int32.TryParse(dataRow.Location, out location))
location = 9999;
if (location < 6300) // only add YE if location is >= 6300
continue;
}
if (dataRow.SubRoleCategoryItem == null)
throw new Exception("Missing YE for family/gen: " + dataRow.LotFamilyGen);
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
#endregion
#region PE Role
// ==================================================================PE ROLE===============================================================================================
// For Step 1
// check if all wafers with in the lots for the Dispo are "SCRAP"
sqlString = new StringBuilder();
sqlString.Append("SELECT COUNT(*) FROM [ScrapLot] S ");
sqlString.Append("INNER JOIN Lot L ON S.LotNo = L.LotNumber ");
sqlString.Append("WHERE L.IssueID = @IssueID AND (L.LotStatusOptionID <> 2 OR S.ReleaseCount > 0)");
bool allLotsAreScrap = (this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single() == 0);
// If PE Required OR MRB Required (Could be combined with the MA OR RH rule)
// But not if all lots are scrap
sqlString = new StringBuilder();
sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID ");
sqlString.Append("WHERE (PERequired = 1 OR Location = 'QDB' OR Location = 'EDB' ) AND LD.IssueID = @IssueID ");
recordCount = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single();
if ((recordCount > 0) && (allLotsAreScrap == false))
{
// check if there any IG Medical products
if (recordCountForIG_MA > 0)
{
sqlString = new StringBuilder();
sqlString.Append("SELECT 'PE_' + LTRIM(RTRIM(L.ProductFamily)) + '_MA-' + LTRIM(RTRIM(CONVERT(NCHAR(10),L.Gen))) AS ProdGen ");
sqlString.Append("FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE LD.IssueID = @IssueID ");
dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.ProdGen.ToString() + "'");
}
}
else
{
// Get list of the PE "Product-Generation"
sqlString = new StringBuilder();
sqlString.Append("SELECT 'PE_' + LTRIM(RTRIM(L.ProductFamily)) + '-' + LTRIM(RTRIM(CONVERT(NCHAR(10),L.Gen))) AS ProdGen ");
sqlString.Append("FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE LD.IssueID = @IssueID ");
dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.ProdGen.ToString() + "'");
}
}
}
#endregion
// For Step 1 and Step 2
// check to see if the Lot has any M_Suffix
sqlString = new StringBuilder();
sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE (L.LotStatusOptionID = 4) AND LD.IssueID = @IssueID ");
recordCount = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'M_Suffix'");
}
// get wafer scrap counts
sqlString = new StringBuilder();
sqlString.Append("SELECT ISNULL(SUM(ScrapCount), 0) AS ScrapCount FROM Lot L ");
sqlString.Append("INNER JOIN ScrapLot S ON S.IssueID = L.IssueID AND S.LotNo = L.LotNumber ");
sqlString.Append("WHERE L.IssueID = @IssueID AND L.Location < '6300'");
int scrapCountLocationBelow6300 = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).SingleOrDefault();
if (scrapCountLocationBelow6300 > 10)
{
// For Step 2
if (!subRoleItems.Contains("'Engineering'"))
subRoleItems.Add("'Engineering'");
}
sqlString = new StringBuilder();
sqlString.Append("SELECT ISNULL(SUM(ScrapCount), 0) AS ScrapCount FROM Lot L ");
sqlString.Append("INNER JOIN ScrapLot S ON S.IssueID = L.IssueID AND S.LotNo = L.LotNumber ");
sqlString.Append("WHERE L.IssueID = @IssueID AND L.Location >= '6300'");
int scrapCountLocation6300AndGreater = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).SingleOrDefault();
if (scrapCountLocation6300AndGreater > 10)
{
// For Step 2
if (!subRoleItems.Contains("'Integration / YE'"))
subRoleItems.Add("'Integration / YE'");
}
/* ===== Remove the code for Director Approval Loop - Changed per Dixie's request 08/06/2018
*/
//If Location = "QDB" OR PRRequired or MRB Required OR(Product = MA / RH AND Location = Probe) Get "Director" Role for all departments, except "Facilities"
sqlString = new StringBuilder();
//sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID ");
//sqlString.Append("WHERE ( ((L.ProductFamily = 'RH' OR L.ProductFamily = 'MA') ");
//sqlString.Append("AND (Location = '6300' OR Location = '6400' OR Location = '6600')) ");
//sqlString.Append("OR Location = 'QDB' OR Location = 'EDB' OR LD.PERequired = 1 OR LD.MRBRequired = 1) AND LD.IssueID = @IssueID ");
// 09/01/2020 -
// Per Hans, do not include directors if PE required is checked
//sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID ");
//sqlString.Append("WHERE (LD.PERequired = 1 OR Location = 'QDB' OR Location = 'EDB' ) ");
//sqlString.Append("AND LD.IssueID = @IssueID ");
// 09/01/2020
// Per Hans, do not include directors if PE required is checked
sqlString.Append("SELECT COUNT(*) FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID ");
sqlString.Append("WHERE (Location = 'QDB' OR Location = 'EDB' ) ");
sqlString.Append("AND LD.IssueID = @IssueID ");
recordCount = this.db.Query<int>(sqlString.ToString(), new { IssueID = issueID }).Single();
if (recordCount > 0)
{
// For Step 2
// get all the departments, except the 'Facilities' and 'Die bank' dept
sqlString = new StringBuilder();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'Department' AND SubRoleCategoryItem <> 'Facilities' AND SubRoleCategoryItem <> 'Die Bank' ");
dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
// For Step 3
// Get the Location Role
sqlString = new StringBuilder();
sqlString.Append("SELECT Location FROM LotDisposition LD INNER JOIN Lot L ON LD.IssueID = L.IssueID WHERE LD.IssueID = @IssueID ");
dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { IssueID = issueID }).ToList();
string tempLocation = "";
foreach (var dataRow in dataRows)
{
tempLocation = dataRow.Location.ToString();
if (tempLocation.ToUpper() == "QDB" || tempLocation.ToUpper() == "EDB")
subRoleItems.Add("'" + tempLocation + "'");
else if (tempLocation == "6300" || tempLocation == "6400" || tempLocation == "6600")
subRoleItems.Add("'Probe'");
else
subRoleItems.Add("'Fab'");
}
}
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
/// <summary>
///
/// </summary>
/// <param name="ecnNumber"></param>
/// <param name="documentType"></param>
/// <returns></returns>
string GetECNSubRoleItems(int ecnNumber, int documentType)
{
StringBuilder qryString = new StringBuilder();
List<string> subRoleItems = new List<string>();
int recordCount = 0;
// EMERGENCY TECNS ==============================================================================================
if (GlobalVars.DocumentType.EECN == (GlobalVars.DocumentType)documentType)
{
//subRoleItems.Add("'QA Pre Approver'");
qryString.Clear();
qryString.Append("SELECT DISTINCT SRC.SubRoleCategoryItem FROM DocumentType D ");
qryString.Append("INNER JOIN Workflows W ON D.DocumentTypeID = W.DocumentTypeID ");
qryString.Append("INNER JOIN WorkFlowSteps WS ON W.WorkflowID = WS.WorkflowID ");
qryString.Append("INNER JOIN Role R ON WS.RoleID = R.RoleID ");
qryString.Append("INNER JOIN SubRole SR ON R.RoleID = SR.RoleID ");
qryString.Append("INNER JOIN SubRoleCategory SRC ON SR.SubRoleCategoryID = SRC.SubRoleCategoryID ");
qryString.Append("WHERE D.DocumentTypeID = @DocumentType");
//qryString.Append("WHERE D.DocumentTypeID = 3");
//subRoleItems.Add("'QA_Admin'");
var dataRows = this.db.Query<dynamic>(qryString.ToString(), new { DocumentType = documentType }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
//subRoleItems.Add("'QA Final Approver'");
} //===============================================================================================================
else
{
subRoleItems.Add("'QA Pre Approver'");
// get the affected Department: Removed by JRO per Jeanne
//qryString.Clear();
//qryString.Append("SELECT ModuleName FROM ECNModule E INNER JOIN ECNAffectedModule AM ON E.ModuleID = AM.ModuleID WHERE AM.ECNNumber= @ECNNumber");
//var dataRows = this.db.Query<dynamic>(qryString.ToString(), new { ECNNumber = ecnNumber }).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.ModuleName.ToString() + "'");
//}
// get the approvers
qryString.Clear();
qryString.Append("SELECT SubRoleCategoryItem FROM SubRoleCategory S INNER JOIN ECNAffectedDepartment AD ON S.SubRoleCategoryID = AD.DepartmentID WHERE AD.ECNNumber= @ECNNumber");
var dataRows = this.db.Query<dynamic>(qryString.ToString(), new { ECNNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
// Add Directors if # of Lots Affected is > 10
qryString.Clear();
// Impact / Change Sub Roles =======================================================================================================================
// Get the "Environment" Impact SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND ImpactOnEnvironment = 2 ");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'Environment'");
//qryString.Clear();
//qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategoryItem = 'Environment' ");
//dataRows = this.db.Query<dynamic>(qryString.ToString()).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
//}
}
// Get the "Capacity" Impact SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (ImpactOnCapacity = 1 )");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'Capacity'");
//qryString.Clear();
//qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategoryItem = 'Capacity' ");
//dataRows = this.db.Query<dynamic>(qryString.ToString()).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
//}
}
// Get the "MaterialConsumptionChangeRequired" Impact SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (MaterialConsumptionChangeRequired = 1 )");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'MaterialConsumption'");
//qryString.Clear();
//qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategoryItem = 'MaterialConsumption' ");
//dataRows = this.db.Query<dynamic>(qryString.ToString()).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
//}
}
// Get the "NewPartFlow" Impact SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (NewPartFlowRequired = 1 )");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'NewPartFlow'");
subRoleItems.Add("'SPN-Execution'");
//subRoleItems.Add("'TestProgram'");
subRoleItems.Add("'Metrology Change'");
subRoleItems.Add("'SPC'");
//qryString.Clear();
//qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategoryItem = 'NewPartFlow' ");
//dataRows = this.db.Query<dynamic>(qryString.ToString()).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
//}
}
subRoleItems.Add("'Document Control Admin'");
subRoleItems.Add("'Training Notification'");
//=======================================================================================================================
// Execution level========================================================================================================
// Get the "SPN" SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (SPNChangeRequired = 1) ");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
//subRoleItems.Add("'SPN-Execution'");
//qryString.Clear();
//qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategoryItem = 'SPN' ");
//dataRows = this.db.Query<dynamic>(qryString.ToString()).ToList();
//foreach (var dataRow in dataRows)
//{
// subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
//}
}
// Get the "Metrology Change" SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (MetrologyChangeRequired = 1) ");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'Metrology Change'");
}
// Get the "SPCChange" SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (SPCChangeRequired = 1) ");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'SPC'");
}
// Get the "FIChange" SubRole
qryString.Clear();
qryString.Append("SELECT COUNT(*) FROM ECN WHERE ECNNumber= @ECNNumber AND (FIChangeRequired = 1) ");
recordCount = this.db.Query<int>(qryString.ToString(), new { ECNNumber = ecnNumber }).Single();
if (recordCount > 0)
{
subRoleItems.Add("'FI-Execution'");
}
}
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
/// <summary>
///
/// </summary>
/// <param name="workRequestID"></param>
/// <returns></returns>
string GetLotTravelerSubRoleItems(int workRequestID)
{
List<string> subRoleItems = new List<string>();
StringBuilder qryString = new StringBuilder();
// get the affected Modules
qryString.Clear();
qryString.Append("SELECT ModuleName FROM Module M INNER JOIN LTAffectedModule AM ON M.ModuleID = AM.ModuleID WHERE AM.LTWorkRequestID = @WorkRequestID");
var dataRows = this.db.Query<dynamic>(qryString.ToString(), new { WorkRequestID = workRequestID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.ModuleName.ToString() + "'");
}
// get the affected Department
qryString.Clear();
qryString.Append("SELECT SubRoleCategoryItem FROM SubRoleCategory S INNER JOIN LTAffectedDepartment AD ON S.SubRoleCategoryID = AD.DepartmentID WHERE AD.LTWorkRequestID= @WorkRequestID");
dataRows = this.db.Query<dynamic>(qryString.ToString(), new { WorkRequestID = workRequestID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
qryString.Clear();
qryString.Append("SELECT * FROM LTWorkRequest WHERE ID = @WorkRequestID");
dataRows = this.db.Query<dynamic>(qryString.ToString(), new { WorkRequestID = workRequestID }).ToList();
var engLotStartReq = -1;
var lotTypeConversion = -1;
foreach (dynamic dataRow in dataRows)
{
engLotStartReq = dataRow.EngLotStartRequired;
lotTypeConversion = dataRow.LotTypeConversion;
}
if (engLotStartReq == 1 )
{
if (!subRoleItems.Contains("Operations")) // need to remove the hard coding
{
subRoleItems.Add("'Operations'");
}
if (!subRoleItems.Contains("Engineering")) // need to remove the hard coding
{
subRoleItems.Add("'Engineering'");
}
if (!subRoleItems.Contains("Integration / YE")) // need to remove the hard coding
{
subRoleItems.Add("'Integration / YE'");
}
}
if (lotTypeConversion == 1)
{
if (!subRoleItems.Contains("Operations")) // need to remove the hard coding
{
subRoleItems.Add("'Operations'");
}
}
if (engLotStartReq == 1 || lotTypeConversion == 1)
{
// END OF DEpartments= ===========================================================
qryString.Clear();
qryString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'FabPlanner' ");
dataRows = this.db.Query<dynamic>(qryString.ToString(), new { WorkRequestID = workRequestID }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
/// <summary>
/// Returns a boolean to indicate whethere it is was the last step in the approval
/// </summary>
/// <param name="issueID"></param>
/// <param name="stepNumber"></param>
public bool Approve(int issueID, byte step, string comments, out bool lastStep, int userID, int documentType, int workFlowNumber)
{
bool lastApproverInCurrentStep = false;
try
{
string subRolesInClause = GetSubRoleItems(issueID, documentType);
lastStep = false;
var parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@CurrentStep", step);
parameters.Add("@ItemStatus", (int)GlobalVars.ApprovalOption.Approved);
parameters.Add("@UserID", userID);
parameters.Add("@Comments", comments);
parameters.Add("@SubRoleCategoriesClause", subRolesInClause);
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@LastStep", lastStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
parameters.Add("@LastApproverInCurrentStep", lastApproverInCurrentStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
parameters.Add("@WorkFlowNumber", workFlowNumber);
this.db.Execute("UpdateApproval", parameters, commandType: CommandType.StoredProcedure);
lastStep = parameters.Get<bool>("@LastStep");
lastApproverInCurrentStep = parameters.Get<bool>("@LastApproverInCurrentStep");
}
catch (Exception e)
{
string detailedException = "";
try
{
detailedException = e.InnerException.ToString();
}
catch
{
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + issueID.ToString() + " Step:" + step + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent("User ID:" + userID + "\r\n " + "ApproveDMO\r\n" + issueID.ToString() + "\r\n" + e.InnerException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = userID.ToString(), DocumentType = "Lot Disposition", OperationType = "Error", Comments = "ApproveDMO - " + exceptionString });
throw new Exception(e.Message);
}
return lastApproverInCurrentStep;
}
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="step"></param>
/// <param name="comments"></param>
/// <param name="userID"></param>
/// <returns></returns>
public bool Reject(int issueID, byte step, string comments, int userID, int docType)
{
bool lastStep = false;
bool lastApproverInCurrentStep = false;
var parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@CurrentStep", step);
parameters.Add("@ItemStatus", (int)GlobalVars.ApprovalOption.Denied);
parameters.Add("@UserID", userID);
parameters.Add("@Comments", comments);
parameters.Add("@DocumentTypeID", docType);
parameters.Add("@SubRoleCategoriesClause", string.Empty);
parameters.Add("@LastStep", lastStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
parameters.Add("@LastApproverInCurrentStep", lastApproverInCurrentStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
this.db.Execute("UpdateApproval", parameters, commandType: CommandType.StoredProcedure);
lastStep = parameters.Get<bool>("@LastStep");
lastApproverInCurrentStep = parameters.Get<bool>("@LastApproverInCurrentStep");
return lastApproverInCurrentStep;
}
public bool Recall(int issueID, byte step, string comments, int userID, int docType)
{
bool lastStep = false;
bool lastApproverInCurrentStep = false;
var parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@CurrentStep", step);
parameters.Add("@ItemStatus", (int)GlobalVars.ApprovalOption.Recalled);
parameters.Add("@UserID", userID);
parameters.Add("@Comments", comments);
parameters.Add("@DocumentTypeID", docType);
parameters.Add("@SubRoleCategoriesClause", string.Empty);
parameters.Add("@LastStep", lastStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
parameters.Add("@LastApproverInCurrentStep", lastApproverInCurrentStep, dbType: DbType.Boolean, direction: ParameterDirection.Output);
this.db.Execute("UpdateApproval", parameters, commandType: CommandType.StoredProcedure);
lastStep = parameters.Get<bool>("@LastStep");
lastApproverInCurrentStep = parameters.Get<bool>("@LastApproverInCurrentStep");
return lastApproverInCurrentStep;
}
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="step"></param>
/// <param name="comments"></param>
/// <param name="userID"></param>
/// <param name="docType"></param>
/// <returns></returns>
public void RejectTECNExtension(int ecnNumber, byte step, string comments, int userID, int docType)
{
var parameters = new DynamicParameters();
parameters.Add("@ECNNumber", ecnNumber);
parameters.Add("@CurrentStep", step);
parameters.Add("@UserID", userID);
parameters.Add("@DocumentTypeID", docType);
this.db.Execute("ECN_TECNExtensionRejection", parameters, commandType: CommandType.StoredProcedure);
}
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="userIDs"></param>
/// <param name="step"></param>
public string ReAssignApproval(int issueID, int assignedFromUser, int assignedToUser, byte step, int docType)
{
string email = "";
//string emailArray = "";
string emailIDArray = "";
var parameters = new DynamicParameters(); ;
email = "";
parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@Step", step);
parameters.Add("@AssignedFromUser", assignedFromUser);
parameters.Add("@AssignedToUser", assignedToUser);
parameters.Add("@DocumentTypeID", docType);
parameters.Add("@Email", email, DbType.String, direction: ParameterDirection.InputOutput);
this.db.Execute("ReAssignApproval", parameters, commandType: CommandType.StoredProcedure);
emailIDArray = emailIDArray + parameters.Get<string>("@Email");
return emailIDArray;
}
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="assignedFromUser"></param>
/// <param name="assignedToUser"></param>
/// <param name="docType"></param>
/// <returns></returns>
public string DelegateDocumentApproval(int issueID, int delegateFromUser, int delegateToUser)
{
string email = "";
//string emailArray = "";
string emailID = "";
var parameters = new DynamicParameters(); ;
email = "";
parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@DelegateFromUser", delegateFromUser);
parameters.Add("@DelegateToUser", delegateToUser);
parameters.Add("@Email", email, DbType.String, direction: ParameterDirection.InputOutput);
this.db.Execute("DelegateApproval", parameters, commandType: CommandType.StoredProcedure);
emailID = parameters.Get<string>("@Email");
return emailID;
}
/// <summary>
///
/// </summary>
/// <param name="issueID"></param>
/// <param name="userIDs"></param>
/// <param name="step"></param>
public string AddAdditionalApproval(int issueID, string userIDs, byte step, int documentType)
{
string email = "";
//string emailArray = "";
string emailIDArray = "";
string[] arrayOfUsers = userIDs.Split(new char[] { '~' });
var parameters = new DynamicParameters(); ;
for (int i = 0; i < arrayOfUsers.Length; i++)
{
email = "";
parameters = new DynamicParameters();
parameters.Add("@IssueID", issueID);
parameters.Add("@Step", step);
parameters.Add("@UserID", arrayOfUsers[i]);
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@Email", email, DbType.String, direction: ParameterDirection.InputOutput);
this.db.Execute("InsertdAdditionalApproval", parameters, commandType: CommandType.StoredProcedure);
emailIDArray = emailIDArray + parameters.Get<string>("@Email") + "~";
}
return emailIDArray;
}
/// <summary>
///
/// </summary>
/// <param name="ecnNumber"></param>
/// <param name="step"></param>
/// <param name="documentType"></param>
/// <param name="engUserIDs"></param>
/// <param name="opUserIDs"></param>
/// <returns></returns>
public string AddEECNApproval(int ecnNumber, byte step, int documentType, string engUserIDs, string opUserIDs)
{
string email = "";
//string emailArray = "";
string emailIDArray = "";
string[] arrayOfUsers = engUserIDs.Split(new char[] { '~' });
//Engineering SubRole
var parameters = new DynamicParameters(); ;
for (int i = 0; i < arrayOfUsers.Length; i++)
{
email = "";
parameters = new DynamicParameters();
parameters.Add("@ECNNumber", ecnNumber);
parameters.Add("@Step", step);
parameters.Add("@UserID", arrayOfUsers[i]);
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@SubRoleCategoryName", "Engineering");
parameters.Add("@Email", email, DbType.String, direction: ParameterDirection.InputOutput);
this.db.Execute("ECNInsertEmergencyECNApprovers", parameters, commandType: CommandType.StoredProcedure);
emailIDArray = emailIDArray + parameters.Get<string>("@Email") + "~";
}
// Operations SubRole
arrayOfUsers = opUserIDs.Split(new char[] { '~' });
parameters = new DynamicParameters(); ;
for (int i = 0; i < arrayOfUsers.Length; i++)
{
email = "";
parameters = new DynamicParameters();
parameters.Add("@ECNNumber", ecnNumber);
parameters.Add("@Step", step);
parameters.Add("@UserID", arrayOfUsers[i]);
parameters.Add("@DocumentTypeID", documentType);
parameters.Add("@SubRoleCategoryName", "Operations");
parameters.Add("@Email", email, DbType.String, direction: ParameterDirection.InputOutput);
this.db.Execute("ECNInsertEmergencyECNApprovers", parameters, commandType: CommandType.StoredProcedure);
emailIDArray = emailIDArray + parameters.Get<string>("@Email") + "~";
}
return emailIDArray;
}
/// <summary>
///
/// </summary>
/// <param name="ecnNumber"></param>
/// <returns></returns>
public string GetApproversForCancelled_ExpiredTECNDocs(int ecnNumber)
{
List<string> subRoleItems = new List<string>();
StringBuilder sqlString = new StringBuilder();
sqlString.Append(
"SELECT TestProgramChangeRequired, SPCChangeRequired, NewPartFlowRequired, SPNChangeRequired, FIChangeRequired FROM ECN WHERE ECNNumber = @ecNumber ");
var data = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).Single();
if (data.TestProgramChangeRequired == 1)
{
sqlString.Clear();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'TestProgram' ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
if (data.SPCChangeRequired == 1)
{
sqlString.Clear();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'SPC' ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
if (data.NewPartFlowRequired == 1)
{
sqlString.Clear();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'NewPartFlow' ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
if (data.SPNChangeRequired == 1)
{
sqlString.Clear();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'SPN-Execution' ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
if (data.FIChangeRequired == 1)
{
sqlString.Clear();
sqlString.Append("SELECT SubRoleCategoryItem FROM [SubRoleCategory] WHERE SubRoleCategory = 'FI-Execution' ");
var dataRows = this.db.Query<dynamic>(sqlString.ToString(), new { ecNumber = ecnNumber }).ToList();
foreach (var dataRow in dataRows)
{
subRoleItems.Add("'" + dataRow.SubRoleCategoryItem.ToString() + "'");
}
}
string resultInClause = "(" + String.Join(", ", subRoleItems.Distinct().ToArray()) + ")";
return resultInClause;
}
public string GetSubRolesForPartsRequestNextStep(int prNumber)
{
string subRoles = this.db.Query<string>("SELECT dbo.fnPartsRequestGetSubRolesForNextStep(@PRNumber)",
new { PRNumber = prNumber },
commandType: CommandType.Text).First();
subRoles = "('" + subRoles + "')";
return subRoles;
}
public WorkflowSteps GetWorkflowStep(int docTypeID, int wfNumber, int stepNumber)
{
return this.db.Query<WorkflowSteps>(
"SELECT s.* FROM WorkflowSteps s INNER JOIN Workflows w ON w.WorkflowID = s.WorkflowID " +
"WHERE w.DocumentTypeID = @docTypeID AND w.WorkFlowNumber = @wfNumber AND s.WorkflowStepNumber = @stepNumber",
param: new { docTypeID = docTypeID, wfNumber = wfNumber, stepNumber = stepNumber },
commandType: CommandType.Text).FirstOrDefault();
}
}
}