mesa-fab-approval/Fab2ApprovalSystem/Controllers/ChangeControlController.cs
Mike Phares 7650bf2869 Removed PdfViewController, HtmlViewRenderer and FakeView to be replaced with ViewEngineResult Render method
Added HttpException class for missing HttpException for net8

Wrapped HttpContext.Session, GetJsonResult, IsAjaxRequest and GetUserIdentityName in controllers for net8

Added AuthenticationService to test Fab2ApprovalMKLink code for net8

Compile conditionally flags to debug in dotnet core
2025-05-23 12:51:42 -07:00

794 lines
31 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
#if !NET8
using System.Web;
using System.Web.Mvc;
using System.Web.Services;
#endif
#if NET8
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
#endif
using Fab2ApprovalSystem.DMO;
using Fab2ApprovalSystem.Misc;
using Fab2ApprovalSystem.Models;
using Fab2ApprovalSystem.ViewModels;
#if !NET8
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
#endif
namespace Fab2ApprovalSystem.Controllers;
[Authorize]
#if !NET8
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
[SessionExpireFilter]
#endif
#if NET8
[Route("[controller]")]
#endif
public class ChangeControlController : Controller {
private readonly ChangeControlDMO ccDMO = new();
private readonly AppSettings? _AppSettings = GlobalVars.AppSettings;
public ActionResult Index() {
return View();
}
public ActionResult Create() {
ChangeControlViewModel cc = new();
try {
cc.OwnerID = GlobalVars.GetUserId(GetSession());
ccDMO.InsertChangeControl(cc);
return RedirectToAction("Edit", new { issueID = cc.PlanNumber });
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + cc.PlanNumber.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n Create - Change Control\r\n" + cc.PlanNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = cc.PlanNumber, UserID = GetUserIdentityName(), DocumentType = "Change Control", OperationType = "Error", Comments = "Create - " + exceptionString });
throw new Exception(e.Message);
}
}
public ActionResult Edit(int issueID) {
string jwt = GlobalVars.GetJWT(GetSession());
string encodedJwt = System.Net.WebUtility.UrlEncode(jwt);
string refreshToken = GlobalVars.GetRefreshToken(GetSession());
string encodedRefreshToken = System.Net.WebUtility.UrlEncode(refreshToken);
string mrbUrl = $"{GlobalVars.AppSettings.WasmClientUrl}/redirect?jwt={encodedJwt}&refreshToken={encodedRefreshToken}&redirectPath=pcrb/{issueID}";
return Redirect(mrbUrl);
}
public ActionResult ReadOnlyCC(int issueID) {
string jwt = GlobalVars.GetJWT(GetSession());
string encodedJwt = System.Net.WebUtility.UrlEncode(jwt);
string refreshToken = GlobalVars.GetRefreshToken(GetSession());
string encodedRefreshToken = System.Net.WebUtility.UrlEncode(refreshToken);
string mrbUrl = $"{GlobalVars.AppSettings.WasmClientUrl}/redirect?jwt={encodedJwt}&refreshToken={encodedRefreshToken}&redirectPath=pcrb/{issueID}";
return Redirect(mrbUrl);
}
[HttpPost]
public ActionResult Edit(ChangeControlViewModel model) {
try {
var data = model;
ccDMO.UpdateChangeControl(model, GlobalVars.GetUserId(GetSession()));
ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
} catch (Exception ex) {
return Content(ex.Message);
}
return Content("Successfully Saved");
}
public int GetUserIDByDisplayName(string displayName) {
try {
var UserList = ccDMO.GetUsers();
int UserID = (from a in UserList where a.AttendeeName.Equals(displayName) select a.AttendeeID).First();
return UserID;
} catch (Exception ex) {
return 0;
}
}
public JsonResult SearchParts(string searchText) {
List<string> partList = MiscDMO.SearchLTParts(searchText.Trim()).Select(x => x.WIPPartData).ToList();
return GetJsonResult(partList);
}
#if !NET8
public ActionResult GetCCAttachments([DataSourceRequest] DataSourceRequest request, int planNumber) {
return Json(ccDMO.GetCCAttachment(planNumber).ToDataSourceResult(request));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateCCAttachment([DataSourceRequest] DataSourceRequest request, CCAttachment model) {
if (model != null && ModelState.IsValid) {
ccDMO.UpdateCCAttachemnt(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DeleteCCAttachment([DataSourceRequest] DataSourceRequest request, CCAttachment model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeleteCCAttachemnt(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
public ActionResult InsertCCAttachmentItem([DataSourceRequest] DataSourceRequest request, CCAttachment model) {
if (model != null && ModelState.IsValid) {
model = ccDMO.InsertCCAttachment(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
public ActionResult AttachSaveCC(IEnumerable<HttpPostedFileBase> files, int planNumber, int attachID) {
// The Name of the Upload component is "files"
if (files != null) {
int userId = GlobalVars.GetUserId(GetSession());
foreach (var file in files) {
ChangeControlHelper.AttachSaveCC(_AppSettings, ccDMO, planNumber, attachID, userId, file.FileName, file.InputStream);
}
}
return Content("");
}
public ActionResult GetMeetingDecisionSummaryList([DataSourceRequest] DataSourceRequest request, int planNumber) {
return Json(ccDMO.GetMeetingDecisionSummaryList(planNumber).ToDataSourceResult(request));
}
public ActionResult GetMeetingAttachments([DataSourceRequest] DataSourceRequest request, int meetingID) {
return Json(ccDMO.GetMeetingAttachments(meetingID).ToDataSourceResult(request));
}
public ActionResult GetPCRB([DataSourceRequest] DataSourceRequest request, int PlanNumber, string PCRB) {
return Json(ccDMO.GetPCRB(PlanNumber, PCRB).ToDataSourceResult(request));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateMeetingAttachmentAttrib([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model) {
if (model != null && ModelState.IsValid) {
ccDMO.UpdateMeetingAttachmentAttrib(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DeleteMeetingAttachment([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeleteMeetingAttachemnt(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult InsertMeetingAttachmentItemAttrib([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model) {
if (model != null && ModelState.IsValid) {
model = ccDMO.InsertMeetingAttachmentAttrib(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
public ActionResult AttachSaveMeeting(IEnumerable<HttpPostedFileBase> files, int planNumber, int meetingID, int attachID) {
// The Name of the Upload component is "files"
if (files != null) {
int userId = GlobalVars.GetUserId(GetSession());
foreach (var file in files) {
ChangeControlHelper.AttachSaveMeeting(_AppSettings, ccDMO, planNumber, attachID, userId, file.FileName, file.InputStream);
}
}
return Content("");
}
#endif
public FileResult DownloadCCFile(string fileGuid, int planNumber) {
string fileName = ccDMO.GetCCFileName(fileGuid);
string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));
string ecnFolderPath = _AppSettings.AttachmentFolder + "ChangeControl\\" + planNumber.ToString();
var sDocument = System.IO.Path.Combine(ecnFolderPath, fileGuid + fileExtension);
var FDir_AppData = _AppSettings.AttachmentFolder;
if (!sDocument.StartsWith(FDir_AppData)) {
// Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
// and block requests outside like "../web.config"
throw new HttpException(403, "Forbidden");
}
if (!System.IO.File.Exists(sDocument)) {
return null;
}
return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
public ActionResult CreateMeeting(int planNumber) {
try {
int meetingID = ccDMO.InsertMeeting(planNumber);
return Content(meetingID.ToString());
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + planNumber.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n Create - Meeting\r\n" + planNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = planNumber, UserID = GetUserIdentityName(), DocumentType = "Meeting", OperationType = "Error", Comments = "Create - " + exceptionString });
throw new Exception("Error: " + e.Message);
}
}
public ActionResult EditMeeting(int meetingID) {
int isITARCompliant = 1;
CCMeeting meeting = new();
meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, GlobalVars.GetUserId(GetSession()));
ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
// TODO locked functionality
List<ApproversListViewModel> userList = MiscDMO.GetApproversListByDocument(meeting.PlanNumber, meeting.CurrentStep, (int)GlobalVars.DocumentType.ChangeControl);
ApproversListViewModel appUser = userList.Find(delegate (ApproversListViewModel al) { return al.UserID == GlobalVars.GetUserId(GetSession()); });
if (appUser != null) {
ViewBag.IsApprover = "true";
}
if (isITARCompliant == 0) // not ITAR Compliant
{
return View("UnAuthorizedAccess");
} else {
if ((meeting.RecordLockIndicator && meeting.RecordLockedBy != GlobalVars.GetUserId(GetSession()))
|| (meeting.PCRBClosed)) {
return RedirectToAction("ReadOnlyMeeting", new { meetingID = meetingID });
} else if (meeting.Decision != -1) {
return RedirectToAction("EditMeetingUpdate", new { meetingID = meetingID });
} else {
ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
ViewBag.Attendees = ccDMO.GetUsers();
ViewBag.Sites = ccDMO.GetSites();
ViewBag.PCRValues = ccDMO.GetPCRValues();
meeting = ccDMO.GetMeeting(meetingID, out isITARCompliant, GlobalVars.GetUserId(GetSession()));
return View(meeting);
}
}
}
public ActionResult ReadOnlyMeeting(int meetingID) {
int isITARCompliant = 1;
CCMeeting meeting = new();
meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, GlobalVars.GetUserId(GetSession()));
ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
ViewBag.PCRValues = ccDMO.GetPCRValues();
if (isITARCompliant == 0) // not ITAR Compliant
{
return View("UnAuthorizedAccess");
} else {
return View(meeting);
}
}
[HttpPost]
public ActionResult EditMeeting(CCMeeting meeting) {
try {
ccDMO.UpdateMeeting(meeting);
} catch (Exception ex) {
return Content(ex.Message);
}
return Content("Successfully Saved");
}
public ActionResult EditMeetingUpdate(int meetingID) {
int isITARCompliant = 1;
CCMeeting meeting = new();
meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, GlobalVars.GetUserId(GetSession()));
ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
ViewBag.PCRValues = ccDMO.GetPCRValues();
// TODO locked functionality
List<ApproversListViewModel> userList = MiscDMO.GetApproversListByDocument(meeting.PlanNumber, meeting.CurrentStep, (int)GlobalVars.DocumentType.ChangeControl);
ApproversListViewModel appUser = userList.Find(delegate (ApproversListViewModel al) { return al.UserID == GlobalVars.GetUserId(GetSession()); });
if (appUser != null) {
ViewBag.IsApprover = "true";
}
if (isITARCompliant == 0) // not ITAR Compliant
{
return View("UnAuthorizedAccess");
} else {
if ((meeting.RecordLockIndicator && meeting.RecordLockedBy != GlobalVars.GetUserId(GetSession()))
|| (meeting.PCRBClosed)) {
return RedirectToAction("ReadOnlyMeeting", new { meetingID = meetingID });
} else {
meeting = ccDMO.GetMeeting(meetingID, out isITARCompliant, GlobalVars.GetUserId(GetSession()));
ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
return View(meeting);
}
}
}
public FileResult DownloadMeetingFile(string fileGuid, int planNumber) {
string fileName = ccDMO.GetMeetingFileName(fileGuid);
string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));
string ecnFolderPath = _AppSettings.AttachmentFolder + "ChangeControl\\" + planNumber.ToString();
var sDocument = System.IO.Path.Combine(ecnFolderPath, fileGuid + fileExtension);
var FDir_AppData = _AppSettings.AttachmentFolder;
if (!sDocument.StartsWith(FDir_AppData)) {
// Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
// and block requests outside like "../web.config"
throw new HttpException(403, "Forbidden");
}
if (!System.IO.File.Exists(sDocument)) {
return null;
}
return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
#if !NET8
public ActionResult GetDecisionsSummaryList([DataSourceRequest] DataSourceRequest request, int meetingID) {
return Json(ccDMO.GetDecisionsSummaryList(meetingID).ToDataSourceResult(request));
}
#endif
public ActionResult UpdateMeetingDecisionNotes(CCDecisionSummary model) {
try {
ccDMO.UpdateDecisionSummary(model);
} catch (Exception ex) {
return Content(ex.Message);
}
return Content("Saved Succesfully");
}
#if !NET8
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DeleteDecisionsSummary([DataSourceRequest] DataSourceRequest request, CCDecisionSummary model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeleteDecisionSummary(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
#endif
public ActionResult InsertDecisionsSummary(CCDecisionSummary model) {
try {
ccDMO.InsertDecisionSummary(model);
} catch (Exception ex) {
return Content(ex.Message);
}
return Content("Saved Succesfully");
}
public ActionResult UpdateECN_LotDispoLinks(int id, string ecnLinks, string lotDispoLinks) {
try {
ccDMO.UpdateDecisionSummaryLinks(id, ecnLinks, lotDispoLinks);
} catch (Exception ex) {
return Content(ex.Message);
}
return Content("Saved Succesfully", "application/json");
}
#if !NET8
public ActionResult GetMeetingList([DataSourceRequest] DataSourceRequest request, int planNumber) {
var meetingList = ccDMO.GetMeetingList(planNumber);
return Json(meetingList.ToDataSourceResult(request));
}
public ActionResult GetMeetingAttendees([DataSourceRequest] DataSourceRequest request, int meetingID) {
return Json(ccDMO.GetMeetingAttendees(meetingID).ToDataSourceResult(request));
}
public ActionResult GetPCRBAttendees([DataSourceRequest] DataSourceRequest request, int PCRBID) {
return Json(ccDMO.GetPCRBAttendees(PCRBID).ToDataSourceResult(request));
}
#endif
public void InsertNewMeetingAttendee(string attendeeName, string jobTitle, string siteName) {
try {
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
}
}
public void UpdateMeetingAttendee(int id, string attendeeName, string jobTitle, string siteName) {
int docid = id;
try {
ccDMO.UpdateMeetingAttendee(id, attendeeName, jobTitle, siteName);
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n UpdateMeetingAttendee - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = GetUserIdentityName(), DocumentType = "Change Control", OperationType = "Error", Comments = "UpdateMeetingAttendee - " + exceptionString });
throw new Exception(e.Message);
}
}
[HttpPost]
public void UpdatePCRBAttendee(int id, int attendeeId, string jobTitle, string siteName) {
int docid = id;
try {
ccDMO.UpdatePCRBAttendee(id, attendeeId, jobTitle, siteName);
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n UpdateMeetingAttendee - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = GetUserIdentityName(), DocumentType = "Change Control", OperationType = "Error", Comments = "UpdateMeetingAttendee - " + exceptionString });
throw new Exception(e.Message);
}
}
#if !NET8
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DeleteMeetingAttendee([DataSourceRequest] DataSourceRequest request, CCMeetingAttendee model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeleteMeetingAttendee(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult InsertMeetingAttendee([DataSourceRequest] DataSourceRequest request, int pcrId, int attendeeId, string jobTitle, string siteName) {
CCPCRBAttendee newAttendee = new CCPCRBAttendee();
newAttendee.AttendeeID = attendeeId;
newAttendee.PCRBID = pcrId;
newAttendee.JobTitle = jobTitle;
newAttendee.Location = siteName;
try {
ccDMO.InsertMeetingAttendee(newAttendee);
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
public ActionResult GetMeetingActionItems([DataSourceRequest] DataSourceRequest request, int meetingID) {
return Json(ccDMO.GetMeetingActionItems(meetingID).ToDataSourceResult(request));
}
public ActionResult GetPCRBActionItems([DataSourceRequest] DataSourceRequest request, int pcrbID) {
return Json(ccDMO.GetPCRBActionItems(pcrbID).ToDataSourceResult(request));
}
public ActionResult GetMeetingActionItems_All([DataSourceRequest] DataSourceRequest request, int planNumber) {
return Json(ccDMO.GetMeetingActionItems_All(planNumber).ToDataSourceResult(request));
}
#endif
public ActionResult InsertPCRBActionItem(CCPCRBActionItem model) {
try {
if (model != null) {
ccDMO.InsertPCRBActionItem(model);
}
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
public ActionResult InsertMeetingActionItem(CCMeetingActionItem model) {
try {
if (model != null) {
ccDMO.InsertMeetingActionItem(model);
}
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
#if !NET8
public ActionResult InsertPCRBAttendee([DataSourceRequest] DataSourceRequest request, int pcrId, int attendeeId, string jobTitle, string siteName) {
CCPCRBAttendee newAttendee = new CCPCRBAttendee();
newAttendee.AttendeeID = attendeeId;
newAttendee.PCRBID = pcrId;
newAttendee.JobTitle = jobTitle;
newAttendee.Location = siteName;
try {
ccDMO.InsertPCRBAttendee(newAttendee);
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
#endif
public ActionResult UpdatePCRBActionItem(CCPCRBActionItem model) {
try {
if (model != null) {
ccDMO.UpdatePCRBActionItem(model);
}
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
#if !NET8
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateMeetingActionItemAll([DataSourceRequest] DataSourceRequest request, CCMeetingActionItemAll model) {
if (model != null && ModelState.IsValid) {
model.ClosedBy = GlobalVars.GetUserId(GetSession());
ccDMO.UpdateMeetingActionItem_All(model);
}
if (model.ClosedStatus)
model.ClosedDate = DateTime.Now;
else
model.ClosedDate = null;
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
#endif
public ActionResult UpdateMeetingActionItem(CCMeetingActionItem model) {
try {
if (model != null) {
ccDMO.UpdateMeetingActionItem(model);
}
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
[HttpPost]
public ActionResult ReassignMeetingActionItemResponsiblePersons(int meetingActionItemId, string newResponsiblePersonIDs, string comments) {
if (GlobalVars.IsAdminValueNull(GetSession()))
throw new Exception("Permission denied");
try {
ccDMO.ReassignMeetingActionItemResponsiblePersons(meetingActionItemId, newResponsiblePersonIDs, comments, GlobalVars.GetUserId(GetSession()));
} catch (Exception ex) {
return Content(ex.Message.ToString());
}
return Content("1");
}
#if !NET8
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult DeleteMeetingActionItem([DataSourceRequest] DataSourceRequest request, CCMeetingActionItem model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeleteMeetingActionItem(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
public ActionResult DeletePCRBActionItem([DataSourceRequest] DataSourceRequest request, CCPCRBActionItem model) {
if (model != null && ModelState.IsValid) {
ccDMO.DeletePCRBActionItem(model);
}
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
#endif
public void CompleteCC(int planNumber) {
int docid = planNumber;
try {
ccDMO.CompleteCC(planNumber);
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n CompleteCC - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = GetUserIdentityName(), DocumentType = "Change Control", OperationType = "Error", Comments = "CompleteCC - " + exceptionString });
throw new Exception(e.Message);
}
}
public void CancelCC(int planNumber) {
int docid = planNumber;
try {
ccDMO.CancelCC(planNumber);
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n CompleteCC - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = GetUserIdentityName(), DocumentType = "Change Control", OperationType = "Error", Comments = "CancelCC - " + exceptionString });
throw new Exception(e.Message);
}
}
#if !NET8
public ActionResult AttachSaveActionItem(IEnumerable<HttpPostedFileBase> AIfiles, int planNumber, int attachID) {
// The Name of the Upload component is "files"
if (AIfiles != null) {
int userId = GlobalVars.GetUserId(GetSession());
foreach (var file in AIfiles) {
ChangeControlHelper.AttachSaveActionItem(_AppSettings, ccDMO, planNumber, attachID, userId, file.FileName, file.InputStream);
}
}
return Content("");
}
#endif
public FileResult DownloadActionItemFile(string fileGuid, int planNumber) {
string fileName = ccDMO.GetActionItemFileName(fileGuid);
string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));
string ecnFolderPath = _AppSettings.AttachmentFolder + "ChangeControl\\" + planNumber.ToString();
var sDocument = System.IO.Path.Combine(ecnFolderPath, fileGuid + fileExtension);
var FDir_AppData = _AppSettings.AttachmentFolder;
if (!sDocument.StartsWith(FDir_AppData)) {
// Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
// and block requests outside like "../web.config"
throw new HttpException(403, "Forbidden");
}
if (!System.IO.File.Exists(sDocument)) {
return null;
}
return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
public void UpdateMeetingNotes(int meetingID, string notes) {
ccDMO.UpdateMeetingNotes(meetingID, notes);
}
public void ReleaseLockOnDocument(int planNumber) {
ccDMO.ReleaseLockOnDocument(GlobalVars.GetUserId(GetSession()), planNumber);
try {
ccDMO.ReleaseLockOnDocument(GlobalVars.GetUserId(GetSession()), planNumber);
} catch (Exception e) {
try {
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n ReleaseLockOnDocument LD\r\n" + planNumber.ToString() + "\r\n" + e.Message, System.Diagnostics.EventLogEntryType.Error);
} catch { }
ccDMO.ReleaseLockOnDocument(-1, planNumber);
}
}
public JsonResult GetAllUsersList() {
UserAccountDMO userDMO = new();
IEnumerable<LoginModel> userlist = userDMO.GetAllUsers();
return GetJsonResult(userlist);
}
[HttpPost]
public void ReAssignOwnerByAdmin(string planNumber, string comments, int newOwnerId) {
if (GlobalVars.IsAdminValueNull(GetSession()))
throw new Exception("Permission denied");
int planNumberInt = 0;
try {
// remove non-numeric characters from Plan # then convert to int
planNumberInt = int.Parse(new string(planNumber.Where(char.IsNumber).ToArray()));
ccDMO.ReassignOwner(planNumberInt, newOwnerId, comments, GlobalVars.GetUserId(GetSession()));
} catch (Exception e) {
string detailedException = "";
try {
detailedException = e.InnerException.ToString();
} catch {
detailedException = e.Message;
}
string exceptionString = e.Message.ToString().Trim();
if (exceptionString.Length > 450)
exceptionString = exceptionString.Substring(0, 450);
Functions.WriteEvent(_AppSettings, GetUserIdentityName() + "\r\n ReAssignOwnerByAdmin\r\n" + planNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
EventLogDMO.Add(new WinEventLog() { IssueID = planNumberInt, UserID = GetUserIdentityName(), DocumentType = "ChangeControl", OperationType = "Error", Comments = "ReAssignOwnerByAdmin - " + exceptionString });
throw new Exception(e.Message);
}
}
public ActionResult GetPCRBMesaTitle(int issueID) {
int isItarCompliant = 1;
ChangeControlViewModel cc = ccDMO.GetChangeControlRead(issueID, out isItarCompliant, GlobalVars.GetUserId(GetSession()));
string content = cc.PlanTitle;
return Content(content);
}
#if !NET8
private System.Web.HttpSessionStateBase GetSession() =>
Session;
private JsonResult GetJsonResult(object? data) =>
Json(data, JsonRequestBehavior.AllowGet);
private bool IsAjaxRequest() =>
Request.IsAjaxRequest();
#endif
#if NET8
private Microsoft.AspNetCore.Http.ISession GetSession() =>
HttpContext.Session;
private JsonResult GetJsonResult(object? data) =>
Json(data);
private bool IsAjaxRequest() =>
Request.Headers.TryGetValue("X-Requested-With", out Microsoft.Extensions.Primitives.StringValues strings) && strings[0] == "XMLHttpRequest";
#endif
private string GetUserIdentityName() =>
@User.Identity.Name;
}