using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using NHibernate; using NHibernate.Linq; using Sleis.Models; using Sleis.Infrastructure; using Sleis.Service; using Sleis.Utility; using Sleis.Validation; using Sleis.Validation.Attribute; using Sleis.ViewModels; using Sleis.Filter; namespace Sleis.Controllers { [HandleError] public class UnitProcessController : BaseController { public IUnitProcessService UnitProcessService { get; set; } public IReleasePointService ReleasePointService { get; set; } public IEmissionUnitService EmissionUnitService { get; set; } public IReportService ReportService { get; set; } public IControlDeviceService ControlDeviceService { get; set; } public override void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(UnitProcessService, "UnitProcessService"); } [Authorize] public ActionResult List(int facilityId, int reportId = 0, int page=0) { SetSelectedFacility(facilityId); UnitProcessView unitProcessView = new UnitProcessView(); if (reportId > 0) { unitProcessView.Report = UserService.FacilityData.GetReport(facilityId, reportId); unitProcessView.NumberOfRecords = UnitProcessService.CountUnitProcessesByReport(reportId); } else { unitProcessView.NumberOfRecords = UnitProcessService.CountUnitProcessesByFacility(facilityId); unitProcessView.ShowMasterRecords = true; } return View(unitProcessView); } [Authorize, HttpGet] public JsonResult Get(int facilityId, int reportId=0, int emissionUnitId=0, int page=0) { ListView model = new ListView(); if (emissionUnitId > 0) { model.List = UnitProcessService.GetUnitProcessListItemsByEmissionUnit(emissionUnitId); } else if (reportId > 0) { model.List = UnitProcessService.GetUnitProcessListItemsByReport(reportId); } else { model.List = UnitProcessService.GetUnitProcessListItemsByFacility(facilityId); } model.List = model.List.OrderBy(x => x.Identifier).ToList(); return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, HttpGet] public JsonResult GetPagedList(int facilityId, int reportId = 0, int page = 0) { ListView model = new ListView(); if (reportId > 0) { model.List = UnitProcessService.GetUnitProcessListItemsByReport(reportId, page, 0); } else { model.List = UnitProcessService.GetUnitProcessListItemsByFacility(facilityId, page, 0); } return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor,AppUserRoleType.AgencyViewer,AppUserRoleType.FacilityViewer), Toggle] public ActionResult Details(int id, int facilityId, int reportId=0) { UnitProcessDetailView dv = new UnitProcessDetailView(); if (reportId > 0) { dv.Report = UserService.FacilityData.GetReport(facilityId, reportId); } dv.Item = UnitProcessService.GetUnitProcess(id); dv.Fields = PageService.GetPageFields(GetPageContext("UnitProcess", "Details")); dv.CustomFields = GetCustomFields(id, reportId, CustomFieldEntityType.UnitProcess); SetSelectedFacility(facilityId); return View(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(int facilityId, int reportId = 0) { UnitProcessDetailView dv = GetUnitProcessDetailView(reportId, facilityId); dv.Fields = PageService.GetPageFields(GetPageContext("UnitProcess", "Edit")); if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item.UnitProcessReleasePoints.Add(new PublicUnitProcessReleasePoint()); } else { dv.Item.UnitProcessReleasePoints.Add(new AgencyUnitProcessReleasePoint()); } return ManageLoad(dv); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(UnitProcessDetailView dv, int facilityId, int reportId = 0) { if (!SessionUtility.CurrentUser.IsAgencyUser()) { ((PublicUnitProcess)dv.Item).IsAdd = 1; } return Manage(dv, facilityId, reportId); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Edit(int id, int facilityId, int reportId=0) { UnitProcessDetailView dv = GetUnitProcessDetailView(reportId, facilityId, id); dv.Fields = PageService.GetPageFields(GetPageContext("UnitProcess", "Edit")); return ManageLoad(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor, AppUserRoleType.AgencyEditor)] public ActionResult Delete(int id, int facilityId, int reportId=0) { //id is the unit process id UnitProcessDetailView dv = GetUnitProcessDetailView(reportId, facilityId, id); UserService.Audit(new AppEventModel(EventType.Audit, AppUser.User.Email, "Delete unit process", Request.UserHostAddress)); try { UnitProcessService.Delete(dv.Item, dv.CustomFields); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The unit process was successfully deleted."); return RedirectToAction("List", new { reportId = dv.ReportId, facilityId = dv.FacilityId }); } catch (Sleis.Models.ErrorHandling.CannotDeleteException ex) { TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } catch (Exception ex) { Log.Error("Emission Unit", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.SavingDataErrorMessage, true); } dv.Item.UnitProcessReleasePointSelectionList = BuildReleasePointSelectList(dv.Item, dv.Report, facilityId); dv.EmissionUnits = reportId > 0 ? EmissionUnitService.GetEmissionUnitListItemsByReport(reportId) : EmissionUnitService.GetEmissionUnitListItemsByFacility(facilityId); dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Edit")); return ManageLoad(dv); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor, AppUserRoleType.AgencyEditor)] public ActionResult Edit(UnitProcessDetailView dv, int facilityId, int reportId=0) { return Manage(dv, facilityId, reportId); } private ActionResult Manage(UnitProcessDetailView dv, int facilityId, int reportId=0) { UnitProcess up = dv.Item.Id >0 ? UnitProcessService.GetUnitProcess(dv.Item.Id) : null; if (SessionUtility.CurrentUser.IsAgencyUser()) { if (up == null) { up = new AgencyUnitProcess(); } TryUpdateModel(up as AgencyUnitProcess, "Item"); } else { if (up == null) { up = new PublicUnitProcess(); } TryUpdateModel(up as PublicUnitProcess, "Item"); } dv.Item = up; //reset Item... dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); //if control approach, fetch related control devices for validation purposes. if (dv.Item.ControlApproach != null && dv.Item.ControlApproach.EntityControlDevices != null && dv.Item.ControlApproach.EntityControlDevices.Count > 0) { foreach (EntityControlDevice ecd in dv.Item.ControlApproach.EntityControlDevices) { ecd.ControlDevice = ControlDeviceService.GetControlDevice(ecd.ControlDeviceId); } } if (Validator.Validate(dv, ModelState)) { UserService.Audit(new AppEventModel(EventType.Audit, AppUser.User.Email, "Save unit process", Request.UserHostAddress)); try { UnitProcessService.Update(dv); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The unit process was successfully updated."); return RedirectToAction("List", new { reportId = dv.ReportId, facilityId = dv.FacilityId }); } catch (UniqueIdentifierException ex) { Log.Error("Unit Process", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); //ModelState.AddModelError(dv.Item.Identifier, ex.Message); //TempData[Constants.GlobalMessageKey] = new SimpleMessage(ErrorOnSave, true); } catch (ApplicationException ex) { Log.Error("Unit Process", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } catch (Exception ex) { Log.Error("Unit Process", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.SavingDataErrorMessage, true); } } else { TempData[Constants.GlobalMessageKey] = new SimpleMessage(ErrorOnSave, true); //for debug //foreach (string key in ModelState.Keys) //{ // if (ModelState[key].Errors.Count > 0) // { // TempData[Constants.GlobalMessageKey] = new SimpleMessage(ModelState[key].Errors[0].ErrorMessage, true); // } //} } dv.PublicFacility = ReportService.FacilityData.GetReportFacility(dv.ReportId); dv.Item.UnitProcessReleasePointSelectionList = BuildReleasePointSelectList(dv.Item, dv.Report, facilityId); dv.EmissionUnits = EmissionUnitService.GetOperationalEmissionUnits(facilityId, reportId, reportId > 0 ? ReportService.GetAgencyReport(facilityId, reportId).Number:0); dv.Fields = PageService.GetPageFields(GetPageContext("UnitProcess", "Edit")); //get scc dv.Item.Scc = UnitProcessService.EmissionUnitData.GetSingle(x => x.Code == dv.Item.UnitProcessClassCode); return View("Manage", dv); } private ActionResult ManageLoad(UnitProcessDetailView dv) { //Add an empty row for display on the UI. if (dv.Item.EpaRegulationPrograms == null || dv.Item.EpaRegulationPrograms.Count == 0) { dv.Item.EpaRegulationPrograms = new List(); dv.Item.EpaRegulationPrograms.Add(new SimpleLookupItem()); } if (dv.Item.RegulationPrograms == null || dv.Item.RegulationPrograms.Count == 0) { dv.Item.RegulationPrograms = new List(); dv.Item.RegulationPrograms.Add(new PublicUnitProcessRegulationProgram()); } if (dv.Item.UnitProcessReleasePoints == null || dv.Item.UnitProcessReleasePoints.Count == 0) { dv.Item.UnitProcessReleasePoints = new List(); dv.Item.UnitProcessReleasePoints.Add(new PublicUnitProcessReleasePoint()); } return View("Manage", dv); } private UnitProcessDetailView GetUnitProcessDetailView(int reportId, int facilityId, int unitProcessId=0) { UnitProcessDetailView dv = new UnitProcessDetailView(); if (reportId > 0) { dv.Report = UserService.FacilityData.GetReport(facilityId, reportId); dv.PublicFacility = ReportService.FacilityData.GetReportFacility(reportId); } dv.CustomFields = GetCustomFields(unitProcessId, reportId, CustomFieldEntityType.UnitProcess); dv.ReportId = reportId; dv.FacilityId = facilityId; if (unitProcessId != 0) { dv.Item = UnitProcessService.GetUnitProcess(unitProcessId); } else { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item = new AgencyUnitProcess(); dv.Item.ControlApproach = new AgencyUnitProcessControlApproach(); } else { dv.Item = new PublicUnitProcess(); dv.Item.ControlApproach = new PublicUnitProcessControlApproach(); } } if (dv.Item.ControlApproach == null) { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item.ControlApproach = new AgencyUnitProcessControlApproach(); } else { dv.Item.ControlApproach = new PublicUnitProcessControlApproach(); } } if (dv.Item.ControlApproach.EntityControlDevices.Count == 0) { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item.ControlApproach.EntityControlDevices.Add(new AgencyUnitProcessControlDevice()); dv.Item.ControlApproach.EntityControlDevices[0].ControlDevice = new AgencyControlDevice(); } else { dv.Item.ControlApproach.EntityControlDevices.Add(new PublicUnitProcessControlDevice()); dv.Item.ControlApproach.EntityControlDevices[0].ControlDevice = new PublicControlDevice(); } } dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); //dv.EmissionUnits = reportId > 0 ? UnitProcessService.GetEmissionUnitsByReport(reportId) : UnitProcessService.GetEmissionUnitsByFacility(facilityId); dv.EmissionUnits = EmissionUnitService.GetOperationalEmissionUnits(facilityId, reportId, dv.Report != null ? dv.Report.Number:0); dv.Item.UnitProcessReleasePointSelectionList = BuildReleasePointSelectList(dv.Item, dv.Report, facilityId); return dv; } private List BuildReleasePointSelectList(UnitProcess up, AgencyReport report, int facilityId) { //TODO : Eventually we might want to refactor the select list to use lighter weight models for better performance. List operationalReleasePoints = report!=null && report.Id > 0 ? UnitProcessService.GetUnitProcessReleasePointSelection(report!=null ? report.Id : 0, report!=null ? report.Number : 0) : ReleasePointService.GetOperationalMasterReleasePoints(facilityId); foreach (UnitProcessReleasePoint rp in up.UnitProcessReleasePoints) { //if unit proc release point is not in the select list, we need to add it. if(!operationalReleasePoints.Exists(x=>x.Id == rp.ReleasePointId) && rp.ReleasePointId > 0) //prevent null records from getting added. { operationalReleasePoints.Add(ReleasePointService.GetReleasePoint(report!=null ? report.Id : 0, rp.ReleasePointId)); } } return operationalReleasePoints.OrderBy(x=>x.Identifier).ToList(); } } }