using Fab2ApprovalSystem.DMO; using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Web; using System.Web.Mvc; using Kendo.Mvc.Extensions; using Kendo.Mvc.UI; using Fab2ApprovalSystem.Models; using Fab2ApprovalSystem.Misc; using System.IO; using System.Reflection; using System.Configuration; using Fab2ApprovalSystem.ViewModels; namespace Fab2ApprovalSystem.Controllers { [Authorize] [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] [SessionExpireFilter] public class LotDispositionController : Controller { // GET: /LotDisposition/ LotDispositionDMO ldDMO = new LotDispositionDMO(); WorkflowDMO wfDMO = new WorkflowDMO(); // GET: /LotDisposition/Create public ActionResult Create() { //excel.FileName = ""; //var lot = LotDisposition lotDispo = new LotDisposition(); try { // insert a records to get the issueID lotDispo.OriginatorID = (int)Session[GlobalVars.SESSION_USERID]; ldDMO.InsertLotDisposition(lotDispo); return RedirectToAction("Edit", new { issueID = lotDispo.IssueID.ToString() }); } catch(Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\nCreat Lot Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = lotDispo.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); return View("Error"); } } /// /// /// /// /// public JsonResult AddLot(Lot lot) { Lot l = lot; MRB_DMO mrbDMO = new MRB_DMO(); IssueWithExistingLotsViewModel issueWEL = new IssueWithExistingLotsViewModel(); try { lot.LotStatusOption.LotStatusOptionID = l.LotStatusOptionID; lot.LotStatusOption.LotStatusOption = l.LotStatusOptionName; ldDMO.InsertLot(lot, false); //if (!mrbDMO.DoesMRBLotExist(lot.LotNumber)) //{ //get All the MRBs associated to the Parent lot //insert the lot into the MRBChildLotNotInMRB table and NOT in the MRB Lot table for each MRB //ldDMO.InsertChildLot_NotInTheMRB(lot.LotNumber); //} } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + lot.IssueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Add Lot Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = l.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); throw new Exception(e.Message); } return Json(l, JsonRequestBehavior.AllowGet); } /// /// Add array of lots /// /// /// //public void AddLots(string lotNumbers, int issueID) //{ // try // { // if (lotNumbers.Length > 0) // { // string[] tempLots = lotNumbers.Split(new char[] { '~' }); // foreach (string lotNumber in tempLots) // { // Lot l = new Lot(); // l.LotNumber = lotNumber; // l.IssueID = issueID; // l.LotStatusOption.LotStatusOptionID = (int)GlobalVars.LotStatusOption.NotAvailable; // ldDMO.InsertLot(l, true); // } // } // } // catch (Exception e) // { // string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + issueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); // Functions.WriteEvent(@User.Identity.Name + "\r\n AddLots Disposition\r\n" + e.Message.ToString(), System.Diagnostics.EventLogEntryType.Error); // EventLogDMO.Add(new WinEventLog() { UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); // throw new Exception(e.Message); // } //} public JsonResult AddLots(string lotNumbers, int issueID) { MRB_DMO mrbDMO = new MRB_DMO(); bool existingLotUpdated; IssueWithExistingLotsViewModel issueWEL = new IssueWithExistingLotsViewModel(); try { if (lotNumbers.Length > 0) { string[] tempLots = lotNumbers.Split(new char[] { '~' }); foreach (string lotNumber in tempLots) { Lot l = new Lot(); l.LotNumber = lotNumber; l.IssueID = issueID; l.LotStatusOption.LotStatusOptionID = (int)GlobalVars.LotStatusOption.NotAvailable; ldDMO.InsertLot(l, true); if (l.OpenIssueWithExistingLots != 0) { issueWEL.LotList += l.LotNumber + "~"; issueWEL.IssuesList += l.OpenIssueWithExistingLots + "~"; } } //foreach (string lotNumber in tempLots) //{ //=================================================================== // ONLY DO THIS PART IF THE LOT DOES NOT EXIST IN THE //"MRBLot" TABLE AND THE "MRBChildLotNotInMRB" TABLE //=================================================================== //if (!mrbDMO.DoesMRBLotExist(lotNumber)) //{ // //get All the MRBs associated to the Parent lot // //insert the lot into the MRBChildLotNotInMRB table and NOT in the MRB Lot table for each MRB // ldDMO.InsertChildLot_NotInTheMRB(lotNumber); //} // } } } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + issueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n AddLots Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); throw new Exception(e.Message); } return Json(issueWEL, JsonRequestBehavior.AllowGet); } // // GET: /LotDisposition/Edit/5 public ActionResult Edit(int issueID) { int isITARCompliant = 1; try { LotDisposition lotDispo = new LotDisposition(); lotDispo = ldDMO.GetLotDispositionItemForRead(issueID, out isITARCompliant, (int) Session[GlobalVars.SESSION_USERID]); if (isITARCompliant == 0) // not ITAR Compliant { return View("UnAuthorizedAccess"); } else { if (lotDispo.CloseDate != null) { return RedirectToAction("ReadOnly", new { issueID = issueID }); } if (lotDispo.CurrentStep == 1) { List userList = MiscDMO.GetPendingApproversListByDocument(issueID, lotDispo.CurrentStep, (int)GlobalVars.DocumentType.LotDisposition); //ApproversListViewModel approver = userList.Find(delegate(ApproversListViewModel al) { return al.UserID == GlobalVars.USER_ID; }); ApproversListViewModel approver = userList.Find(delegate(ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; }); if (approver == null) ViewBag.IsApprover = "false"; else ViewBag.IsApprover = "true"; if (approver == null && (!(bool)Session[GlobalVars.IS_ADMIN]) && (int)Session[GlobalVars.SESSION_USERID] != lotDispo.OriginatorID ) { //return RedirectToAction("ReadOnly", lotDispo); return RedirectToAction("ReadOnly", new { issueID = issueID }); } else { if ((ViewBag.IsApprover == "true" || (bool)Session[GlobalVars.IS_ADMIN]) || (int)Session[GlobalVars.SESSION_USERID] == lotDispo.OriginatorID) { lotDispo = ldDMO.GetLotDispositionItem(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); if (lotDispo.RecordLockIndicator && lotDispo.RecordLockedBy == (int)Session[GlobalVars.SESSION_USERID]) { PopulateLotStatusOptions(); ViewBag.OriginatorList = ldDMO.GetUserList(); ViewBag.deps = ldDMO.GetDepartments(); ViewBag.ResponsibilityList = ldDMO.GetResponsibilityList(); ViewBag.ResponsibilityIssueList = ldDMO.GetResponsibilityIssueList(lotDispo.ResponsibilityID); return View(lotDispo); } else { return RedirectToAction("ReadOnly", new { issueID = issueID }); } } else { return RedirectToAction("ReadOnly", new { issueID = issueID }); } } } else if (lotDispo.CurrentStep > 1) { List userList = MiscDMO.GetPendingApproversListByDocument(issueID, lotDispo.CurrentStep, (int)GlobalVars.DocumentType.LotDisposition); //ApproversListViewModel approver = userList.Find(delegate(ApproversListViewModel al) { return al.UserID == GlobalVars.USER_ID; }); ApproversListViewModel approver = userList.Find(delegate(ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; }); if (approver == null) { ViewBag.IsApprover = "false"; } else { ViewBag.IsApprover = "true"; } if (approver == null && (!(bool)Session[GlobalVars.IS_ADMIN]) && (int)Session[GlobalVars.SESSION_USERID] != lotDispo.OriginatorID) { return RedirectToAction("ReadOnly", new { issueID = issueID }); } else { //// Check the record Lock indicator //if ((lotDispo.RecordLockIndicator && lotDispo.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID]) || (ViewBag.IsApprover == "false")) //{ // return RedirectToAction("ReadOnly", new { issueID = issueID }); //} //else // return RedirectToAction("EditStep", new { issueID = issueID }); if ((ViewBag.IsApprover == "true" || (bool)Session[GlobalVars.IS_ADMIN]) || (int)Session[GlobalVars.SESSION_USERID] == lotDispo.OriginatorID) { return RedirectToAction("EditStep", new { issueID = issueID }); } else { return RedirectToAction("ReadOnly", new { issueID = issueID }); } } } else { // TODO // Check the recordlock indicator if ((lotDispo.RecordLockIndicator && lotDispo.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID]) || (ViewBag.IsApprover == "false")) { return RedirectToAction("ReadOnly", new { issueID = issueID }); } else { lotDispo = ldDMO.GetLotDispositionItem(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); PopulateLotStatusOptions(); ViewBag.OriginatorList = ldDMO.GetUserList(); ViewBag.deps = ldDMO.GetDepartments(); ViewBag.ResponsibilityList = ldDMO.GetResponsibilityList(); ViewBag.ResponsibilityIssueList = ldDMO.GetResponsibilityIssueList(lotDispo.ResponsibilityID); return View(lotDispo); } } } } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\nEdit Lot Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); return View("Error"); } } // // POST: /LotDisposition/Edit/5 /// /// /// /// [HttpPost] public void Edit(LotDisposition lotDispo) { try { ldDMO.UpdateLotDisposition(lotDispo); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + lotDispo.IssueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n UpdatEdit Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = lotDispo.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// public ActionResult ReadOnly(int issueID) { int isITARCompliant = 1; try { LotDisposition lotDispo = new LotDisposition(); lotDispo = ldDMO.GetLotDispositionItemForRead(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); PopulateLotStatusOptions(); ViewBag.OriginatorList = ldDMO.GetUserList(); ViewBag.deps = ldDMO.GetDepartments(); ViewBag.ResponsibilityList = ldDMO.GetResponsibilityList(); ViewBag.ResponsibilityIssueList = ldDMO.GetResponsibilityIssueList(lotDispo.ResponsibilityID); return View(lotDispo); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + issueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n ReadOnly Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// public ActionResult EditStep(int issueID) { int isITARCompliant = 1; try { LotDisposition lotDispo = new LotDisposition(); lotDispo = ldDMO.GetLotDispositionItemForRead(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); List userList = MiscDMO.GetPendingApproversListByDocument(issueID, lotDispo.CurrentStep, (int)GlobalVars.DocumentType.LotDisposition); ApproversListViewModel appUser = userList.Find(delegate(ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; }); if (appUser == null) ViewBag.IsApprover = "false"; else ViewBag.IsApprover = "true"; // Check the recordlock indicator //if ((lotDispo.RecordLockIndicator && lotDispo.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID])) //{ // return RedirectToAction("ReadOnly", new { issueID = issueID }); //} //else //{ // PopulateLotStatusOptions(); // ViewBag.OriginatorList = ldDMO.GetUserList(); // ViewBag.deps = ldDMO.GetDepartments(); // ViewBag.ResponsibilityList = ldDMO.GetResponsibilityList(); // ViewBag.ResponsibilityIssueList = ldDMO.GetResponsibilityIssueList(lotDispo.ResponsibilityID); //} if ((ViewBag.IsApprover == "true" || (bool)Session[GlobalVars.IS_ADMIN])) { lotDispo = ldDMO.GetLotDispositionItem(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); if (lotDispo.RecordLockIndicator && lotDispo.RecordLockedBy == (int)Session[GlobalVars.SESSION_USERID]) { PopulateLotStatusOptions(); ViewBag.OriginatorList = ldDMO.GetUserList(); ViewBag.deps = ldDMO.GetDepartments(); ViewBag.ResponsibilityList = ldDMO.GetResponsibilityList(); ViewBag.ResponsibilityIssueList = ldDMO.GetResponsibilityIssueList(lotDispo.ResponsibilityID); return View(lotDispo); } else { return RedirectToAction("ReadOnly", new { issueID = issueID }); } } else { return RedirectToAction("ReadOnly", new { issueID = issueID }); } //return View(lotDispo); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "IssueID=" + issueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n EditStep Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = exceptionString }); throw new Exception(e.Message); } } // // GET: /LotDisposition/Delete/5 public ActionResult Delete(int id) { return View(); } /// /// /// /// /// public JsonResult GetResponsibilityIssue(int responsibilityID) { List respIssue = ldDMO.GetResponsibilityIssueList(responsibilityID); var data = respIssue.Select(s => new SelectListItem{ Value = s.ResponsibilityIssueID.ToString(), Text = s.Issue}); return Json(data, JsonRequestBehavior.AllowGet); } /// /// /// /// /// public JsonResult GetDepartments([DataSourceRequest] DataSourceRequest request) { var departments = ldDMO.GetDepartments(); return Json(departments, JsonRequestBehavior.AllowGet); } public void PopulateLotStatusOptions() { var lotStatusOptions = ldDMO.GetLotStatusOptions(); ViewData["LotStatusOptions"] = lotStatusOptions; //ViewData["DefaultLotStatusOptions"] = lotStatusOptions.First(); } /// /// /// /// /// /// public ActionResult EditingCustom_Read([DataSourceRequest] DataSourceRequest request, int issueID) { return Json(ldDMO.GetLotDispositionLots(issueID).ToDataSourceResult(request)); } /// /// Updates the lot tables /// /// /// /// [AcceptVerbs(HttpVerbs.Post)] public ActionResult EditingCustom_Update([DataSourceRequest] DataSourceRequest request, Lot lot) { if (lot != null && ModelState.IsValid) { ldDMO.UpdateLotDispoLot(lot); } lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID; return Json(new[] { lot }.ToDataSourceResult(request, ModelState)); } /// /// Deletes record from the lot table /// /// /// /// [AcceptVerbs(HttpVerbs.Post)] public ActionResult EditingCustom_Destroy([DataSourceRequest] DataSourceRequest request, Lot lot) { try { if (lot != null && ModelState.IsValid) { ldDMO.DeleteLotDispoLot(lot.LotID); } } catch (Exception ex) { // TODO throw new Exception(ex.Message); } return Json(new[] { lot }.ToDataSourceResult(request, ModelState)); } // REGION ATTACHMENT /// /// /// /// /// /// public ActionResult Attachment_Read([DataSourceRequest] DataSourceRequest request, int issueID) { return Json(ldDMO.GetLotDispoAttachments(issueID).ToDataSourceResult(request)); } /// /// /// /// /// /// [AcceptVerbs(HttpVerbs.Post)] public ActionResult Attachment_Destroy([DataSourceRequest] DataSourceRequest request, Attachment attachment) { try { if (attachment != null && ModelState.IsValid) { ldDMO.DeleteLotDispoAttachment(attachment.AttachmentID); } } catch (Exception e) { //string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Delete =" + attachmentID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); //Functions.WriteEvent(@User.Identity.Name + "\r\n AttachmentID Disposition\r\n" + e.Message.ToString(), System.Diagnostics.EventLogEntryType.Error); //EventLogDMO.Add(new WinEventLog() { UserID = @User.Identity.Name, OperationType = "Error", Comments = exceptionString }); //throw new Exception(e.Message); } return Json(new[] { attachment }.ToDataSourceResult(request, ModelState)); } //[AcceptVerbs(HttpVerbs.Post)] /// /// /// /// /// [HttpPost] public void DeleteAttachment(int attachmentID, string fileName) { try { if (ModelState.IsValid) { ldDMO.DeleteLotDispoAttachment(attachmentID); //var physicalPath = Path.Combine(Server.MapPath("~/UserUploads"), fileName); var physicalPath = Path.Combine(Functions.GetAttachmentFolder() + "LotDisposition", fileName); FileInfo f = new FileInfo(physicalPath); if (f.Exists) f.Delete(); } } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "AttachmentID=" + attachmentID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n AttachmentID Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = 999, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "AttachmentID Disposition " + exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// public JsonResult GetLotDispoAttachments(int issueID) { var model = ldDMO.GetLotDispoAttachments(issueID); return Json(model, JsonRequestBehavior.AllowGet); } /// /// /// /// /// public ActionResult AttachSave(IEnumerable files, int issueID ) { // The Name of the Upload component is "files" if (files != null) { foreach (var file in files) { // Some browsers send file names with full path. // We are only interested in the file name. var fileName = Path.GetFileName(file.FileName); //var physicalPath = Path.Combine(Server.MapPath("~/UserUploads"), fileName); var physicalPath = Path.Combine(Functions.GetAttachmentFolder() + "LotDisposition", fileName); file.SaveAs(physicalPath); Attachment attach = new Attachment() { IssueID = issueID, FileName = fileName, UserID = (int)Session[GlobalVars.SESSION_USERID], }; ldDMO.InsertLotDispositionAttachment(attach); } } //var model = ldDMO.GetLotDispoAttachments(issueID); return Content(""); } /// /// /// /// /// /// public JsonResult SearchLots(string searchText, string searchBy) { List lotlist = MiscDMO.SearchLots(searchText, searchBy).Select(x => x.LotNumber).ToList(); //IEnumerable lotlist = MiscDMO.SearchLots(searchText, searchBy); return Json(lotlist, JsonRequestBehavior.AllowGet); } /// /// /// /// public void DeleteAllLots(int issueID) { // trap the error on then client side ldDMO.DeleteAllLotDispoLot(issueID); } /// /// /// /// /// /// [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] public ActionResult LotStatusDetail(int issueID, string lotNumber, bool readonlyView, string lotLocation = "") { ViewBag.LotLocation = lotLocation; var model = new ScrapLot(); var data = ldDMO.GetLotStausDetail(issueID, lotNumber); if (data != null) model = data; model.IssueID = issueID; model.LotNo = lotNumber; if (lotLocation.Equals("QDB", StringComparison.OrdinalIgnoreCase) || lotLocation.Equals("EDB", StringComparison.OrdinalIgnoreCase)) { model.WaferCount = 50; } if (readonlyView) return PartialView("_ScrapReleaseReadOnly", model); else return PartialView("_ScrapRelease", model); } /// /// /// /// public void UpdateLotScrapReleaseStatus(ScrapLot sl) { int scrapCount = 0; int releaseCount = 0; int splitOfHoldCount = 0; int closeToQDBCount = 0; try { foreach (PropertyInfo pi in sl.GetType().GetProperties()) { if (pi.Name.ToLower().StartsWith("lot") && pi.Name.ToLower().EndsWith("state")) { byte currentValue = (byte)pi.GetValue(sl, null); if (currentValue == (int)GlobalVars.LotStatusOption.Release || currentValue == (int)GlobalVars.LotStatusOption.CloseToQDB) { releaseCount++; //required to update the lot status option if (currentValue == (int)GlobalVars.LotStatusOption.CloseToQDB) closeToQDBCount++; } else if (currentValue == (int)GlobalVars.LotStatusOption.Scrap) scrapCount++; else if (currentValue == (int)GlobalVars.LotStatusOption.SplitOffHold) splitOfHoldCount++; } } sl.ScrapCount = scrapCount; sl.ReleaseCount = releaseCount; sl.SplitOfHoldCount = splitOfHoldCount; sl.CloseToQDBCount = closeToQDBCount; ldDMO.UpdateLotScrapReleaseStatus(sl); ldDMO.UpdateLotStatus(sl); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + sl.IssueID.ToString() + " LotNo:" + sl.LotNo.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Scrap Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = sl.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "UpdateLotScrapReleaseStatus - " + exceptionString }); throw new Exception(e.Message); } } /// /// Update the all the lots to "RELEASE" Status for a given Lot disposition document /// /// public void ReleaseAll(int issueID) { ScrapLot sl = new ScrapLot(); try { sl.IssueID = issueID; foreach (PropertyInfo pi in sl.GetType().GetProperties()) { if (pi.Name.ToLower().StartsWith("lot") && pi.Name.ToLower().EndsWith("state")) { //byte currentValue = (byte)pi.GetValue(sl, null); //if (currentValue != 2) pi.SetValue(sl, (byte)1, null); } } ldDMO.UpdateLotStatusAll(sl, (int)GlobalVars.LotStatusOption.Release); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + sl.IssueID.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Release All Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = sl.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "ReleaseAll - " + exceptionString }); throw new Exception(e.Message); } } /// /// Update the all the lots to "SCRAP" Status for a given Lot disposition document /// /// public void ScrapAll(int issueID) { ScrapLot sl = new ScrapLot(); try { sl.IssueID = issueID; foreach (PropertyInfo pi in sl.GetType().GetProperties()) { if (pi.Name.ToLower().StartsWith("lot") && pi.Name.ToLower().EndsWith("state")) { //byte currentValue = (byte)pi.GetValue(sl, null); //if (currentValue != 2) pi.SetValue(sl, (byte)2, null); } } ldDMO.UpdateLotStatusAll(sl, (int)GlobalVars.LotStatusOption.Scrap); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + sl.IssueID.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Scrap All Disposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = sl.IssueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "ScrapAll - " + exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// public JsonResult GetLotDispositionLotSummary(int issueID) { return Json(ldDMO.GetLotDispositionLotSummary(issueID), JsonRequestBehavior.AllowGet); } /// /// /// /// /// /// public ActionResult SubmitDocument(int issueID, bool peRequired, bool mrbRequired) { try { int appoverCount = ldDMO.SubmitDocument(issueID, peRequired, mrbRequired, (int)Session[GlobalVars.SESSION_USERID]); if (appoverCount > 0) NotifyApprovers(issueID, (byte)GlobalVars.WorkFLowStepNumber.Step1); else { // automaically approve current step (Step 1) beacuase there are no approvers in step 1 and move to the next step of approval Approve(issueID, (byte)GlobalVars.WorkFLowStepNumber.Step1, ""); // this is the Submit Level Approval } if (Request.IsAjaxRequest()) { return Content("Redirect"); } else return Content("Invalid"); } 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() + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n SubmitDocument\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "SubmitDocument - " + exceptionString }); Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; return Json(new { result = "Error", issueID = issueID, detail = e.Message }, JsonRequestBehavior.AllowGet); } } /// /// /// /// /// /// public void Approve(int issueID, byte currentStep, string comments) { int isITARCompliant = 1; try { bool lastStep = false; LotDisposition ltDispo = ldDMO.GetLotDispositionItemForRead(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]); bool lastApprover = wfDMO.Approve(issueID, currentStep, comments, out lastStep, (int)Session[GlobalVars.SESSION_USERID], (int)GlobalVars.DocumentType.LotDisposition, ltDispo.WorkFlowNumber); while (lastApprover && !lastStep) { currentStep++; lastApprover = wfDMO.Approve(issueID, currentStep, comments, out lastStep, (int)Session[GlobalVars.SESSION_USERID],(int)GlobalVars.DocumentType.LotDisposition, ltDispo.WorkFlowNumber); NotifyApprovers(issueID, currentStep); } } 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:" + currentStep + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n " + "Approve\r\n" + issueID.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "Approve - " + exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// /// public void Reject(int issueID, byte currentStep, string comments) { try { if (Session[GlobalVars.SESSION_USERID] != null) { wfDMO.Reject(issueID, currentStep, comments, (int)Session[GlobalVars.SESSION_USERID], (int) GlobalVars.DocumentType.LotDisposition); NotifyRejectionToOrginator(issueID); } else { Response.Redirect("~/Account/Login"); } } 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:" + currentStep + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Reject\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "Reject - " + exceptionString }); throw new Exception(e.Message); } } /// /// Get a list of Approvers and the status /// /// /// /// /// public ActionResult GetApproversList([DataSourceRequest] DataSourceRequest request, int issueID, byte step) { //return Json(ldDMO.GetApproversList(issueID, step).ToDataSourceResult(request)); return Json(MiscDMO.GetApproversListByDocument(issueID, step, (int)GlobalVars.DocumentType.LotDisposition).ToDataSourceResult(request)); } /// /// /// /// /// /// public JsonResult GetAllUsersList() { //var userList = ldDMO.GetApprovedApproversList(issueID, currentStep); //return Json(userList, JsonRequestBehavior.AllowGet); UserAccountDMO userDMO = new UserAccountDMO(); IEnumerable userlist = userDMO.GetAllUsers(); return Json(userlist, JsonRequestBehavior.AllowGet); } /// /// /// /// /// /// public void ReAssignApproval(int issueID, int userIDs, byte step) { var email = ""; try { email = wfDMO.ReAssignApproval(issueID, (int)Session[GlobalVars.SESSION_USERID], userIDs, step, (int)GlobalVars.DocumentType.LotDisposition); } 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.Identity.Name + "\r\n ReAssignApproval\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "ReAssignApproval - " + exceptionString }); throw new Exception(e.Message); } string emailTemplate = "LotDispositionReAssigned.txt"; string userEmail = string.Empty; string subject = "Lot Disposition Re-Assignment"; string senderName = "LotDisposition"; subject = "Lot Disposition Re-Assignment" + " - Email would be sent to " + email; EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); string[] emailparams = new string[3]; emailparams[0] = issueID.ToString(); emailparams[1] = issueID.ToString(); emailparams[2] = GlobalVars.hostURL; userEmail = email; //#if(DEBUG) // userEmail = "rkotian1@irf.com"; //#endif en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); try { EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Email", Comments = "ReAssign Approver: " + email }); } catch { } } /// /// /// /// /// /// /// public void ReAssignApproverByAdmin(int issueID, int reAssignApproverFrom, int reAssignApproverTo, byte step) { var email = ""; try { email = wfDMO.ReAssignApproval(issueID, reAssignApproverFrom, reAssignApproverTo, step, (int)GlobalVars.DocumentType.LotDisposition); } 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.Identity.Name + "\r\n ReAssignApproval\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "ReAssignApproval - " + exceptionString }); throw new Exception(e.Message); } string emailTemplate = "LotDispositionReAssigned.txt"; string userEmail = string.Empty; string subject = "Lot Disposition Re-Assignment"; string senderName = "LotDisposition"; subject = "Lot Disposition Re-Assignment" + " - Email would be sent to " + email; EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); string[] emailparams = new string[3]; emailparams[0] = issueID.ToString(); emailparams[1] = issueID.ToString(); emailparams[2] = GlobalVars.hostURL; userEmail = email; //#if(DEBUG) // userEmail = "rkotian1@irf.com"; //#endif en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); try { EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Email", Comments = "ReAssign Approver: " + email }); } catch { } } #region Additional Approvers /// /// /// /// public JsonResult GetUserListForAdditionalAppprrovers() { UserAccountDMO userDMO = new UserAccountDMO(); IEnumerable userlist = userDMO.GetAllUsers(); return Json(userlist, JsonRequestBehavior.AllowGet); } public void AddAdditionalApproval(int issueID, byte step, string userIDs) { string emailSentList = ""; var emailArray = ""; try { emailArray = wfDMO.AddAdditionalApproval(issueID, userIDs, step, (int) GlobalVars.DocumentType.LotDisposition); } 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 + " " + " Userid:" + userIDs + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n AddAdditionalApproval\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "AddAdditionalApproval - " + exceptionString }); throw new Exception(e.Message); } string emailTemplate = "LotDispositionAssigned.txt"; string userEmail = string.Empty; string subject = "Lot Disposition Assignment"; string senderName = "LotDisposition"; string[] emailIst = emailArray.Split(new char[] { '~' }); foreach (string email in emailIst) { if (email.Length > 0) { //subject = "Lot Disposition Assignment" + " - Email would be sent to " + email; subject = "Lot Disposition Assignment"; EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); string[] emailparams = new string[3]; emailparams[0] = issueID.ToString(); emailparams[1] = issueID.ToString(); emailparams[2] = GlobalVars.hostURL; userEmail =email; //#if(DEBUG) // userEmail = "rkotian1@irf.com"; //#endif en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); emailSentList += email + ","; } } try { EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Email", Comments = "Additonal Approver: " + emailSentList }); } catch { } } #endregion /// /// /// /// /// public void NotifyApprovers(int issueID, byte currentStep) { try { string emailSentList = ""; //List emailIst = ldDMO.GetApproverEmailList(@issueID, currentStep).Distinct().ToList(); List emailIst = MiscDMO.GetApproverEmailListByDocument(@issueID, currentStep, (int)GlobalVars.DocumentType.LotDisposition).Distinct().ToList(); string emailTemplate = "LotDispositionAssigned.txt"; string userEmail = string.Empty; string subject = "Lot Disposition Assignment"; string senderName = "LotDisposition"; foreach (string email in emailIst) { subject = "Lot Disposition Assignment"; EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); string[] emailparams = new string[3]; emailparams[0] = issueID.ToString(); emailparams[1] = issueID.ToString(); emailparams[2] = GlobalVars.hostURL; userEmail = email; //#if(DEBUG) // userEmail = "rkotian1@irf.com"; //#endif en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); emailSentList += email + ","; } try { EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Email", Comments = "Approvers for Step " + currentStep.ToString() + ":" + emailSentList }); } catch { } } 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:" + currentStep + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString(); Functions.WriteEvent(@User.Identity.Name + "\r\n Lot Dispo - NotifyApprovers\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "AddAdditionalApproval - " + exceptionString }); throw e; } //EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); //string[] emailparams = new string[4]; //emailparams[0] = issueID.ToString(); //emailparams[1] = issueID.ToString(); //emailparams[2] = GlobalVars.hostURL; //emailparams[3] =Session[GlobalVars.SESSION_USERNAME].ToString(); //en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, emailIst, null, subject, emailparams); } /// /// /// /// public void NotifyRejectionToOrginator(int issueID) { List emailIst = ldDMO.GetRejectionOrginatorEmailList(@issueID).Distinct().ToList(); string emailTemplate = "LotDispositionReject.txt"; string userEmail = string.Empty; string subject = "Lot Disposition Rejection"; string senderName = "LotDisposition"; foreach (string email in emailIst) { subject = "Lot Disposition Rejection"; EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]); string[] emailparams = new string[4]; emailparams[0] = issueID.ToString(); emailparams[1] = issueID.ToString(); emailparams[2] = GlobalVars.hostURL; emailparams[3] = Session[GlobalVars.SESSION_USERNAME].ToString(); userEmail = email; //#if(DEBUG) // userEmail = "rkotian1@irf.com"; //#endif en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams); } try { EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Email", Comments = "Rejection: " + userEmail }); } catch { } } /// /// /// /// /// public void UpdateReasonForDisposition(int issueID, string reasonForDisposition) { try { ldDMO.UpdateReasonForDisposition(issueID, reasonForDisposition); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim(); Functions.WriteEvent(@User.Identity.Name + "\r\n UpdateReasonForDisposition\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "UpdateReasonForDisposition - " + exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// /// public ActionResult GetComments([DataSourceRequest] DataSourceRequest request, int issueID) { //return Json(ldDMO.GetApproversList(issueID, step).ToDataSourceResult(request)); return Json(ldDMO.GetComments(issueID).ToDataSourceResult(request)); } /// /// /// /// /// public void InsertComments(int issueID, string Comments) { try { ldDMO.InsertComments(issueID, Comments, (int)Session[GlobalVars.SESSION_USERID]); } catch (Exception e) { string detailedException = ""; try { detailedException = e.InnerException.ToString(); } catch { detailedException = e.Message; } string exceptionString = e.Message.ToString().Trim(); Functions.WriteEvent(@User.Identity.Name + "\r\n UpdateCopmments\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error); EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = "Lot Disposition", OperationType = "Error", Comments = "UpdateCopmments - " + exceptionString }); throw new Exception(e.Message); } } /// /// /// /// /// /// public ActionResult ExcelLotOpen(IEnumerable Lotfile, int issueID) { MRB_DMO mrbDMO = new MRB_DMO(); var physicalPath = ""; try { foreach (var file in Lotfile) { //string guid = ""; string fName = User.Identity.Name + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString(); //physicalPath = Path.Combine(@"C:\Websites\FabApprovalTempPipeLine", fName + "." + Path.GetExtension(file.FileName));\ physicalPath = Path.Combine(ConfigurationManager.AppSettings["LotTempPipeLine"].ToString(), fName + "." + Path.GetExtension(file.FileName)); file.SaveAs(physicalPath); ExcelData x = new ExcelData(physicalPath); var lotNumbers = x.ReadData(); foreach (var lotInfo in lotNumbers) { Lot l = new Lot(); l.LotNumber = lotInfo.LotNo; l.IssueID = issueID; if (l.LotStatusOptionID == 0) l.LotStatusOption.LotStatusOptionID = (int)GlobalVars.LotStatusOption.Release; ldDMO.InsertLot(l, true); //if (!mrbDMO.DoesMRBLotExist(lotInfo.LotNo)) //{ // //get All the MRBs associated to the Parent lot // //insert the lot into the MRBChildLotNotInMRB table and NOT in the MRB Lot table for each MRB // ldDMO.InsertChildLot_NotInTheMRB(lotInfo.LotNo); //} } FileInfo f = new FileInfo(physicalPath); if (f.Exists) f.Delete(); } return Content(""); } catch { FileInfo f = new FileInfo(physicalPath); if (f.Exists) f.Delete(); return Content("Incorrect File Format"); } } /// /// /// /// public void ReleaseLockOnDocument(int issueID) { try { ldDMO.ReleaseLockOnDocument((int)Session[GlobalVars.SESSION_USERID], issueID); } catch (Exception e) { try { Functions.WriteEvent(@User.Identity.Name + "\r\n ReleaseLockOnDocument LD\r\n" + issueID.ToString() + "\r\n" + e.Message, System.Diagnostics.EventLogEntryType.Error); } catch { } ldDMO.ReleaseLockOnDocument(-1, issueID); } } public ActionResult GetFileMetaData(){ return Content(""); } /// /// /// /// /// /// public FileResult DownloadFile(string attachmentID) { //fileName = "ECNForm_71132.pdf"; string fileName = ldDMO.GetFileName(attachmentID); var sDocument = Path.Combine(Functions.GetAttachmentFolder() + "LotDisposition", fileName); var FDir_AppData = Functions.GetAttachmentFolder(); 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; //throw new Exception("File not found"); } return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); } } }