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.Models.CustomFields; using System.Text; using Sleis.Filter; using Sleis.Models.ErrorHandling; namespace Sleis.Controllers { [HandleError] public class ControlDeviceController : BaseController { public ControlDeviceService ControlDeviceService { get; set; } public override void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(ControlDeviceService, "ControlDeviceService"); } protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); TempData[Constants.GlobalErrorMessageKey] = ErrorOnSave; } [Authorize] public ActionResult List(int facilityId, int reportId = 0, int page=0) { SetSelectedFacility(facilityId); ControlDeviceView controlDeviceListViewModel = new ControlDeviceView(); if (reportId > 0) { controlDeviceListViewModel.Report = UserService.FacilityData.GetReport(facilityId, reportId); controlDeviceListViewModel.NumberOfRecords = ControlDeviceService.CountControlDevicesByReport(reportId); } else { controlDeviceListViewModel.NumberOfRecords = ControlDeviceService.CountControlDevicesByFacility(facilityId); controlDeviceListViewModel.ShowMasterRecords = true; } return View(controlDeviceListViewModel); } [Authorize, HttpGet] public JsonResult Get(int facilityId = 0, int reportId = 0, int emissionUnitId=0, int unitProcessId=0, bool showMasterRecords=false) { ListView model = new ListView(); if (unitProcessId > 0) { model.List = ControlDeviceService.GetControlDevicesByUnitProcess(unitProcessId); } else if (emissionUnitId > 0) { model.List = ControlDeviceService.GetControlDevicesByEmissionUnit(emissionUnitId); } else if (showMasterRecords == false && reportId > 0) { model.List = ControlDeviceService.GetControlDeviceListByReport(reportId); } else { model.List = ControlDeviceService.GetControlDeviceListByFacility(facilityId); } model.List.OrderBy(x => x.Identifier); return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, HttpGet] public JsonResult GetPagedList(int facilityId = 0, int reportId = 0, int page=0) { ListView model = new ListView(); if(reportId > 0) { model.List = ControlDeviceService.GetControlDeviceListByReport(reportId, page, 0); } else { model.List = ControlDeviceService.GetControlDeviceListByFacility(facilityId, page, 0); } return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, Toggle] public ActionResult Details(int id, int reportId, int facilityId) { ControlDeviceDetailView dv = GetControlDeviceDetailView(reportId, facilityId, id); dv.Fields = PageService.GetPageFields(GetPageContext("ControlDevice", "Details")); SetSelectedFacility(facilityId); return View(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Edit(int id, int reportId, int facilityId) { ControlDeviceDetailView dv = GetControlDeviceDetailView(reportId, facilityId, id); dv.Fields = PageService.GetPageFields(GetPageContext("ControlDevice", "Edit")); return ManageLoad(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor, AppUserRoleType.AgencyEditor)] public ActionResult Delete(int id, int reportId, int facilityId) { ControlDeviceDetailView dv = GetControlDeviceDetailView(reportId, facilityId, id); UserService.Audit(new AppEventModel(EventType.Audit, AppUser.User.Email, "Delete control device Emission Report", Request.UserHostAddress)); try { ControlDeviceService.Delete(dv.Item, dv.CustomFields); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The control device emission report was successfully deleted."); return RedirectToAction("List", new { reportId = dv.ReportId, facilityId = dv.FacilityId }); } catch (CannotDeleteException ex) { Log.Error("Control Device", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } catch (Exception ex) { Log.Error("Control Device", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.DeletingDataErrorMessage, true); } return ManageLoad(dv); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Edit(ControlDeviceDetailView dv, int reportId, int facilityId) { return Manage(dv, reportId, facilityId); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(int reportId, int facilityId) { ControlDeviceDetailView dv = GetControlDeviceDetailView(reportId, facilityId); dv.Fields = PageService.GetPageFields(GetPageContext("ControlDevice", "Edit")); return ManageLoad(dv); } [Authorize, HttpPost, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] public ActionResult Add(ControlDeviceDetailView dv, int reportId, int facilityId) { if (!SessionUtility.CurrentUser.IsAgencyUser()) { ((PublicControlDevice)dv.Item).IsAdd = true; } return Manage(dv, reportId, facilityId); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor)] private ActionResult Manage(ControlDeviceDetailView dv, int reportId, int facilityId) { ControlDeviceModel cd = ControlDeviceService.GetControlDevice(dv.Item.Id); if (SessionUtility.CurrentUser.IsAgencyUser()) { TryUpdateModel(cd as AgencyControlDevice, "Item"); } else { TryUpdateModel(cd as PublicControlDevice, "Item"); } dv.Item = cd; //reset Item.... if (Validator.Validate(dv,ModelState)) { UserService.Audit(new AppEventModel(EventType.Audit, AppUser.User.Email, "Save control device", Request.UserHostAddress)); try { //make sure facilityId is set. if (dv.Item.FacilityId == 0) { dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); dv.Item.FacilityId = dv.Item.Facility.Id; } ControlDeviceService.Update(dv); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The control device was successfully updated."); return RedirectToAction("List", new { reportId = dv.ReportId, facilityId = dv.FacilityId }); } catch (Sleis.Models.ErrorHandling.UniqueIdentifierException ex) { Log.Error("Control Device", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); //ModelState.AddModelError(dv.Item.Identifier, ex.Message); } catch (ApplicationException ex) { Log.Error("Control Device", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message , true); } catch (Exception ex) { Log.Error("Control Device", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } } else { TempData[Constants.GlobalErrorMessageKey] = Constants.TabErrorMessage; } dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); dv.Fields = PageService.GetPageFields(GetPageContext("ControlDevice", "Edit")); return View("Manage", dv); } private ActionResult ManageLoad(ControlDeviceDetailView dv) { return View("Manage", dv); } private ControlDeviceDetailView GetControlDeviceDetailView(int reportId, int facilityId, int id = 0) { ControlDeviceDetailView dv = new ControlDeviceDetailView(); if (reportId > 0) { dv.Report = UserService.FacilityData.GetReport(facilityId, reportId); } if (id != 0) { dv.Item = ControlDeviceService.GetControlDevice(id); } else { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item = new AgencyControlDevice(); } else { dv.Item = new PublicControlDevice(); } } //passing in rpeortId in case dv.Report is null and reportId =0 dv.CustomFields = GetCustomFields(id, reportId, CustomFieldEntityType.ControlDevice); dv.ReportId = reportId; dv.FacilityId = facilityId; dv.Item.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); //TODO : Hack for now. Adding dummy record so initial add will appear. if (dv.Item.Pollutants == null || dv.Item.Pollutants.Count == 0) { if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.Item.Pollutants.Add(new AgencyControlDevicePollutant()); } else {dv.Item.Pollutants.Add(new PublicControlDevicePollutant());} } return dv; } } }