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; using Spring.Expressions; namespace Sleis.Controllers { [HandleError] public class EmissionUnitController : BaseController { public IEmissionUnitService EmissionUnitService { get; set; } public IReportService ReportService { get; set; } public IControlDeviceService ControlDeviceService {get; set;} public override void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(EmissionUnitService, "EmissionUnitService"); } [Authorize] public ActionResult List(int facilityId, int reportId=0, bool showMasterRecords=false) //, bool showMasterRecords { SetSelectedFacility(facilityId); EmissionUnitView emissionUnitView = new EmissionUnitView(); emissionUnitView.Report = ReportService.GetAgencyReport(facilityId, reportId); emissionUnitView.ShowMasterRecords = reportId == 0 ? true : showMasterRecords; if (reportId > 0) { emissionUnitView.NumberOfRecords = EmissionUnitService.CountEmissionUnitsByReport(reportId); } else { emissionUnitView.NumberOfRecords = EmissionUnitService.CountEmissionUnitsByFacility(facilityId); } return View(emissionUnitView); } [Authorize, HttpGet] public JsonResult Get(int facilityId, int reportId=0) { ListView model = new ListView(); model.List = reportId > 0 ? EmissionUnitService.GetEmissionUnitListByReport(reportId) : EmissionUnitService.GetEmissionUnitListByFacility(facilityId); model.List = model.List.OrderBy(x => x.Identifier).ToList(); return Json(model, JsonRequestBehavior.AllowGet); } public JsonResult GetPagedList(int facilityId, int reportId = 0, int pageNum=0, int pageSize=0) { ListView model = new ListView(); model.List = reportId > 0 ? EmissionUnitService.GetEmissionUnitListItemsByReport(reportId, pageNum, pageSize) : EmissionUnitService.GetEmissionUnitListItemsByFacility(facilityId, pageNum, pageSize); return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, Toggle] public ActionResult Details(int id, int reportId, int facilityId) { EmissionUnitDetailView dv = GetEmissionUnitDetailView(facilityId, reportId,id); dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Details")); SetSelectedFacility(facilityId); return View(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Edit(int id, int facilityId, int reportId=0) { EmissionUnitDetailView dv = GetEmissionUnitDetailView(facilityId, reportId, id); dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Edit")); return ManageLoad(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Delete(int id, int facilityId, int reportId=0) { EmissionUnitDetailView dv = GetEmissionUnitDetailView(facilityId, reportId); UserService.Audit(new AppEventModel(EventType.Audit, AppUser.User.Email, "Delete control device Emission Report", Request.UserHostAddress)); try { EmissionUnitService.Delete(EmissionUnitService.GetEmissionUnit(id), GetCustomFields(id, reportId, CustomFieldEntityType.EmissionUnit)); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The emission unit was successfully deleted."); return RedirectToAction("List", new { reportId = reportId, facilityId = facilityId }); } catch (Sleis.Models.ErrorHandling.CannotDeleteException err) { TempData[Constants.GlobalMessageKey] = new SimpleMessage(err.Message, true); } catch (Exception ex) { Log.Error("Emission Unit", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.SavingDataErrorMessage, true); } dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Edit")); return ManageLoad(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(int id, int facilityId, int reportId=0) { EmissionUnitDetailView dv = GetEmissionUnitDetailView(facilityId, reportId); dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Edit")); dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); dv.Item.FacilityId = dv.Item.Facility.Id; return ManageLoad(dv); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(EmissionUnitDetailView dv, int facilityId, int reportId = 0) { return Manage(dv, facilityId, reportId); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Edit(EmissionUnitDetailView dv, int facilityId, int reportId = 0) { return Manage(dv, facilityId, reportId); } private EmissionUnitDetailView GetEmissionUnitDetailView(int facilityId, int reportId=0, int id = 0) { EmissionUnitDetailView dv = new EmissionUnitDetailView(); if (reportId > 0) { dv.Report = UserService.FacilityData.GetReport(facilityId, reportId); } if (id != 0) { dv.Item = EmissionUnitService.GetEmissionUnit(id); } else { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item = new AgencyEmissionUnit(); } else { dv.Item = new PublicEmissionUnit(); } } InitializeView(dv); dv.CustomFields = GetCustomFields(id, reportId, CustomFieldEntityType.EmissionUnit); dv.ReportId = reportId; dv.FacilityId = facilityId; return dv; } private ActionResult ManageLoad(EmissionUnitDetailView view) { InitializeView(view); return View("Manage", view); } private void InitializeView(EmissionUnitDetailView view) { view.Item.UnitProcessIdentifiers = view.Item.UnitProcessIdentifiers ?? new List(); view.Item.RelatedUnitProcesses = view.Item.RelatedUnitProcesses ?? new List(); if (SessionUtility.CurrentUser.IsAgencyUser()) { if (view.Item.RegulationPrograms != null && view.Item.RegulationPrograms.Count() == 0) view.Item.RegulationPrograms.Add(new AgencyEmissionUnitRegulationProgram()); if (view.Item.EpaRegulationPrograms != null && view.Item.EpaRegulationPrograms.Count() == 0) view.Item.EpaRegulationPrograms.Add(new SimpleLookupItem()); view.Item.ControlApproach = view.Item.ControlApproach ?? new AgencyEmissionUnitControlApproach(); if (view.Item.ControlApproach.EntityControlDevices.Count() == 0) { AgencyUnitProcessControlDevice device = new AgencyUnitProcessControlDevice(); device.ControlDevice = new AgencyControlDevice(); view.Item.ControlApproach.EntityControlDevices.Add(device); } } else { if (view.Item.RegulationPrograms != null && view.Item.RegulationPrograms.Count() == 0) view.Item.RegulationPrograms.Add(new PublicEmissionUnitRegulationProgram()); if (view.Item.EpaRegulationPrograms != null && view.Item.EpaRegulationPrograms.Count() == 0) view.Item.EpaRegulationPrograms.Add(new SimpleLookupItem()); view.Item.ControlApproach = view.Item.ControlApproach ?? new PublicEmissionUnitControlApproach(); if (view.Item.ControlApproach.EntityControlDevices.Count() == 0) { PublicUnitProcessControlDevice device = new PublicUnitProcessControlDevice(); device.ControlDevice = new PublicControlDevice(); view.Item.ControlApproach.EntityControlDevices.Add(device); } } } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor, AppUserRoleType.AgencyEditor)] private ActionResult Manage(EmissionUnitDetailView dv, int facilityId, int reportId=0) { EmissionUnit eu = EmissionUnitService.GetEmissionUnit(dv.Item.Id); if (SessionUtility.CurrentUser.IsAgencyUser()) { TryUpdateModel(eu as AgencyEmissionUnit, "Item"); } else { TryUpdateModel(eu as PublicEmissionUnit, "Item"); } eu.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); eu.FacilityId = eu.Facility.Id; if (!SessionUtility.CurrentUser.IsAgencyUser()) { ((PublicEmissionUnit)dv.Item).IsAdd = 1; } dv.Item = eu; //reset Item.... dv.Report = ReportService.GetAgencyReport(facilityId, reportId); //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 emission unit", Request.UserHostAddress)); try { EmissionUnitService.Update(dv.Item, dv.CustomFields); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The emission unit was successfully updated."); return RedirectToAction("List", new { reportId = dv.ReportId, facilityId = dv.FacilityId }); } catch (UniqueIdentifierException ex) { Log.Error("Emission Unit", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); //ModelState.AddModelError(dv.Item.Identifier, ex.Message); } catch (ApplicationException ex) { Log.Error("Emission Unit", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } catch (Exception ex) { Log.Error("Emission Unit", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.TabErrorMessage, true); } } else { //TempData[Constants.GlobalMessageKey] = new SimpleMessage(ErrorOnSave, true); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ErrorOnSave, true); } dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); dv.Item.FacilityId = dv.Item.Facility.Id; dv.Fields = PageService.GetPageFields(GetPageContext("EmissionUnit", "Edit")); return View("Manage", dv); } } }