using System; using System.Collections; 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.Export; using Sleis.Filter; namespace Sleis.Controllers { [HandleError] public class ReleasePointController : BaseController { public IReleasePointService ReleasePointService { get; set; } public IReportService ReportService { get; set; } public override void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(ReleasePointService, "ReleasePointService"); } [Authorize] public ActionResult List(int facilityId, bool showMasterRecords = false, int reportId = 0, int page=0) { SetSelectedFacility(facilityId); ReleasePointView releasePointView = new ReleasePointView(); releasePointView.ShowMasterRecords = showMasterRecords; //TODO: would be a good idea to move GetFacilityEmissionReport method to ReportService. not critical.. releasePointView.Report = FacilityService.GetFacilityEmissionReport(facilityId, reportId); if (reportId > 0) { releasePointView.NumberOfRecords = ReleasePointService.CountReleasePointsByReport(reportId); } else { releasePointView.NumberOfRecords = ReleasePointService.CountReleasePointsByFacility(facilityId); } return View(releasePointView); } [Authorize, HttpGet, Toggle] public ActionResult Details(int id, int facilityId, int reportId=0) { ReleasePointDetailView dv = BuildReleasePointView("Details", reportId, facilityId, ReleasePointService.GetReleasePoint(reportId, id)); //get toggle info. /*dv.ToggleInfo = GetTempData(Constants.ToggleInfo); //make sure toggle info was found. this allows if (dv.ToggleInfo != null) { dv.ToggleInfo.UpdateToggleInfo(id); //save updated toggle info. SetTempData(Constants.ToggleInfo, dv.ToggleInfo); } */ SetSelectedFacility(facilityId); return View(dv); } [Authorize, HttpGet] public JsonResult Get(int reportId = 0, int facilityId = 0, bool showMasterRecords = false, int unitProcessId = 0, int emissionUnitId = 0) { ListView model = new ListView(); if (unitProcessId > 0) { model.List = ReleasePointService.GetReleasePointsByUnitProcess(unitProcessId); } else if ( emissionUnitId > 0) { model.List = ReleasePointService.GetReleasePointsByEmissionUnit(emissionUnitId); } else if (reportId > 0) { model.List = ReleasePointService.GetReleasePoints(reportId); } else if(SessionUtility.CurrentUser.IsAgencyUser() && facilityId>0) { model.List = ReleasePointService.GetMasterReleasePoints(facilityId).ToList(); } model.List = model.List.OrderBy(x => x.Identifier).ToList(); return Json(model, JsonRequestBehavior.AllowGet); } [Authorize, HttpGet] public JsonResult GetPagedList(int reportId = 0, int facilityId = 0, int page = 0) { ListView model = new ListView(); if (reportId > 0) { model.List = ReleasePointService.GetReleasePoints(reportId, page, 0); } else if (SessionUtility.CurrentUser.IsAgencyUser() && facilityId > 0) { model.List = ReleasePointService.GetReleasePointsByFacility(facilityId, page, 0); } return Json(model, JsonRequestBehavior.AllowGet); } /* [Authorize, HttpGet] public ActionResult Export(int reportId, int reportYear) { IExport export = ReleasePointService.Export(reportId, reportYear, PageService.GetPageFields(GetPageContext("ReleasePoint", "Details"))); return File(export.Content, export.ContentType, export.FileName); } */ [Authorize,AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor), HttpGet] public ActionResult Add(int reportId, int facilityId) { ReleasePoint rp; if (SessionUtility.CurrentUser.IsAgencyUser()) { rp = new AgencyReleasePoint(); rp.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); //populate so we can figure out if master record } else { rp = new PublicReleasePoint(); } ReleasePointDetailView rpView = BuildReleasePointView("Add", reportId, facilityId, rp); return View("Add", rpView); } [Authorize,AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor), HttpPost] public ActionResult Add(ReleasePointDetailView rpdv, int reportId, int facilityId) { if (SessionUtility.CurrentUser.IsAgencyUser()) { TryUpdateModel(rpdv.CurrentReleasePoint as AgencyReleasePoint, "CurrentReleasePoint"); } else { TryUpdateModel(rpdv.CurrentReleasePoint as PublicReleasePoint, "CurrentReleasePoint"); } if (!SessionUtility.CurrentUser.IsAgencyUser()) { ((PublicReleasePoint)rpdv.CurrentReleasePoint).IsAdd = true; } //TODO: trying to avoid refactoring...but right now the only quick fix is to get the whole public facility for getting the public facilityId FacilityView model = new FacilityView(); model.Facility = reportId > 0 ? FacilityService.GetFacilityByReport(reportId) : FacilityService.GetFacility(facilityId); rpdv.CurrentReleasePoint.Facility = model.Facility; rpdv.CurrentReleasePoint.FacilityId = model.Facility.Id; if (Validator.Validate(rpdv, ModelState)) { try { ReleasePointService.AddReleasePoint(rpdv.CurrentReleasePoint, rpdv.CustomFields); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The release point was successfully saved."); return RedirectToAction("List", new { reportId = reportId, facilityId = facilityId }); } catch (UniqueIdentifierException ex) { Log.Error("Release Point", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); //ModelState.AddModelError(rpdv.CurrentReleasePoint.Identifier, ex.Message); } catch (ApplicationException ex) { Log.Error("Release Point", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(ex.Message, true); } catch (Exception ex) { Log.Error("Release Point", ex); TempData[Constants.GlobalMessageKey] = new SimpleMessage(Constants.SavingDataErrorMessage, true); } } //rebuild view and show user errors; TempData[Constants.GlobalErrorMessageKey] = Constants.TabErrorMessage; rpdv.CurrentReleasePoint.Facility = model.Facility; ReleasePointDetailView dv = BuildReleasePointView("Add", reportId, facilityId, rpdv); return View(dv); } [Authorize,AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor), HttpGet] public ActionResult Edit(int id, int facilityId, int reportId=0) { ReleasePointDetailView dv = BuildReleasePointView("Edit", reportId, facilityId, ReleasePointService.GetReleasePoint(reportId, id)); SetSelectedFacility(facilityId); return View(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor,AppUserRoleType.AgencyEditor), HttpPost] public ActionResult Edit(ReleasePointDetailView rpdv, int facilityId, int reportId = 0) { //TODO: trying to avoid refactoring...but right now the only quick fix is to get the whole public facility for getting the public facilityId FacilityView model = new FacilityView(); rpdv.CurrentReleasePoint = ReleasePointService.GetReleasePoint(reportId, rpdv.CurrentReleasePoint.Id); if (SessionUtility.CurrentUser.IsAgencyUser()) { TryUpdateModel(rpdv.CurrentReleasePoint as AgencyReleasePoint, "CurrentReleasePoint"); } else { TryUpdateModel(rpdv.CurrentReleasePoint as PublicReleasePoint, "CurrentReleasePoint"); } //if (facilityId < 1) //{ // ReportService.GetReportFacility(facilityId, reportId); // rpdv.CurrentReleasePoint.FacilityId = model.Facility.Id; //} //else //{ // rpdv.CurrentReleasePoint.FacilityId = facilityId; //} if (Validator.Validate(rpdv, ModelState)) { ReleasePointService.UpdateReleasePoint(rpdv.CurrentReleasePoint, rpdv.CustomFields); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The release point was successfully updated."); return RedirectToAction("List", new { reportId = reportId, facilityId = facilityId }); } //rebuild view and show user errors; TempData[Constants.GlobalErrorMessageKey] = Constants.TabErrorMessage; ReleasePointDetailView dv = BuildReleasePointView("Edit", reportId, facilityId, rpdv); if (SessionUtility.CurrentUser.IsAgencyUser()) { dv.CurrentReleasePoint.Facility = FacilityService.GetFacility(rpdv.CurrentReleasePoint.FacilityId); //needed for IsMaster or not... } return View(dv); } [Authorize, AppFacilityRoleValidation(AppUserRoleType.FacilityEditor, AppUserRoleType.AgencyEditor)] public ActionResult Delete(int id, int reportId, int facilityId) { try { ReleasePointService.DeleteReleasePoint(id, GetCustomFields(id, reportId, CustomFieldEntityType.ReleasePoint)); TempData[Constants.GlobalMessageKey] = new SimpleMessage("The release point was successfully deleted.", false); return RedirectToAction("List", new { reportId = reportId, facilityId = facilityId }); } catch (Exception err) { TempData[Constants.GlobalMessageKey] = new SimpleMessage(err.Message, true); return RedirectToAction("Edit", new {id=id, reportId = reportId, facilityId = facilityId }); } } private ReleasePointDetailView BuildReleasePointView(string action, int reportId, int facilityId, ReleasePointDetailView rpdv) { rpdv.Report = ReportService.GetAgencyReport(facilityId, reportId); rpdv.Fields = PageService.GetPageFields(GetPageContext("ReleasePoint", action)); PrepareView(rpdv); return rpdv; } private ReleasePointDetailView BuildReleasePointView(string action, int reportId, int facilityId, ReleasePoint rp) { ReleasePointDetailView dv = new ReleasePointDetailView(ReportService.GetAgencyReport(facilityId, reportId), rp); dv.Fields = PageService.GetPageFields(GetPageContext("ReleasePoint", action)); dv.CustomFields = GetCustomFields(rp.Id, reportId, CustomFieldEntityType.ReleasePoint); if (action.ToLower() != "details") { PrepareView(dv); } return dv; } private void PrepareView(ReleasePointDetailView rpdv) { //make sure Location is always new object on Edit/Add if UsesFacilityLoc is true if (rpdv.CurrentReleasePoint.UsesFacilitySiteLocation) { rpdv.CurrentReleasePoint.Location = new GeographicLocation(); } } } }