using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sleis.Models; using NHibernate; using Sleis.ViewModels; using Sleis.Utility; namespace Sleis.Service { public class AgencyProcessEmissionService : ProcessEmissionService, IProcessEmissionService { /// /// Fetches Process Emission List by Report Id. This is a Left Join on Unit Processes. Does not fully load each object by default. /// /// /// public override List GetProcessEmissionList(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); AgencyReport report = ProcessEmissionData.GetSingle(x => x.Id == reportId); //TODO: this is a hack right now. left join was returning a null record to the list. Instead might be better to return a list of Unit Processes. //this will work for now to minimalize refactoring on the UI side. //List unitProcesses = UnitProcessData.GetUnitProcessesByAgencyReport(reportId); var unitProcesses = ProcessEmissionData.Get(p => p.EmissionUnit.FacilityId == facility.Id && ((p.EmissionUnit.Facility.FacilityStatus.ToUpper() == "OP" || p.EmissionUnit.Facility.FacilityStatusAsOfDate.Value.Year > report.Number) && (p.EmissionUnit.StatusCode.ToUpper() == "OP" || p.EmissionUnit.StatusEffectiveDate.Value.Year > report.Number) && (!p.LastEmissionsYear.HasValue || p.LastEmissionsYear.Value >= report.Number) )).ToList(); List list = new List(); foreach (var up in unitProcesses) { ProcessEmission pe = ProcessEmissionData.GetSingle(p => p.UnitProcessId == up.Id); //perform mock left join... if (pe == null) { pe = new AgencyProcessEmission(); // TODO: refactor for agency. } pe.UnitProcess = new AgencyUnitProcess(up); pe.UnitProcess.EmissionUnit = EmissionUnitData.GetSingle(e => e.Id == pe.UnitProcess.EmissionUnitId, e => new AgencyEmissionUnit { Id = e.Id, Identifier = e.Identifier, Description = e.Description }); pe.UnitProcess.EmissionIdentifier = pe.UnitProcess.EmissionUnit.Identifier; pe.UnitProcess.Type = LookupUtility.Get(pe.UnitProcess.UnitProcessClassCode); LoadModel(pe); list.Add(pe); } //LoadModel(list); return list; } public override int CountProcessEmissions(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); return ProcessEmissionData.Count(x=>x.UnitProcess.EmissionUnit.FacilityId==facility.Id); } /// /// Fetches Process Emission List by Report Id. /// /// /// Indicates whether or not to fully load each object in the list. /// public override List GetProcessEmissionList(int reportId, bool fullyLoad) { List processes = GetProcessEmissionList(reportId); if (fullyLoad) { foreach (ProcessEmission p in processes) { LoadCompleteModel(p); } } return processes; } public override List GetProcessEmissionListItemsByReport(int reportId, int reportYear) { if (reportId > 0) { FacilityModel facility = FacilityData.GetReportFacility(reportId); List list = new List(); if (facility!=null && facility.Id > 0) { return ProcessEmissionData.Get(p => p.UnitProcess.EmissionUnit.FacilityId == facility.Id && p.IsOperational(reportYear)) .OrderBy(x=>x.UnitProcess.EmissionUnit.Identifier) .ThenBy(x=>x.UnitProcess.Identifier) .ToList(); } return list; } return new List(); } public override List GetProcessEmissionListItemsByReport(int reportId, int pageNum, int pageSize) { AgencyReport report = ProcessEmissionData.GetSingle(x => x.Id == reportId); if (pageSize < 1) { pageSize = GetDefaultPageSize(); } if (reportId > 0) { FacilityModel facility = FacilityData.GetReportFacility(reportId); List list = new List(); if (facility != null && facility.Id > 0) { return ProcessEmissionData.Get(p => p.UnitProcess.EmissionUnit.FacilityId == facility.Id && ((p.UnitProcess.EmissionUnit.Facility.FacilityStatus.ToUpper() == "OP" || p.UnitProcess.EmissionUnit.Facility.FacilityStatusAsOfDate.Value.Year > report.Number) && (p.UnitProcess.EmissionUnit.StatusCode.ToUpper() == "OP" || p.UnitProcess.EmissionUnit.StatusEffectiveDate.Value.Year > report.Number) && (!p.UnitProcess.LastEmissionsYear.HasValue || p.UnitProcess.LastEmissionsYear.Value >= report.Number) ), o => o.Asc(p => p.UnitProcess.EmissionUnit.Identifier, d => d.UnitProcess.Identifier), pageNum, pageSize) .ToList(); } } return new List(); } public override List GetProcessEmissionListItems(int reportId, int emissionUnitId) { return ProcessEmissionData.Get(x => x.UnitProcess.EmissionUnit.Id == emissionUnitId).ToList(); } public override List GetProcessEmissionListItemsByUnitProcess(int unitProcessId) { return ProcessEmissionData.Get(x => x.UnitProcess.Id == unitProcessId).ToList(); } public override ProcessEmission GetProcessEmission(int id) { ProcessEmission pe = ProcessEmissionData.GetById(id); LoadCompleteModel(pe); LoadEmissions(pe); return pe; } public override ProcessEmission GetProcessEmission(int id, int unitProcessId) { ProcessEmission pe = new AgencyProcessEmission(); //try and get object if id is present. if (id > 0) { pe = GetProcessEmission(id); } //try and get by unit process id since 1 to 1 relationship else { pe = ProcessEmissionData.GetSingle(x => x.UnitProcessId == unitProcessId); } if (pe == null) { pe = new AgencyProcessEmission(); } if (pe.UnitProcessId == 0) { pe.UnitProcessId = unitProcessId; } LoadUnitProcessDetails(pe); return pe; } public override ProcessEmission GetProcessEmission(int id, UnitProcess unitProcess) { ProcessEmission pe = new AgencyProcessEmission(); //try and get object if id is present. if (id > 0) { pe = GetProcessEmission(id); } //try and get by unit process id since 1 to 1 relationship else { pe = ProcessEmissionData.GetSingle(x => x.UnitProcessId == unitProcess.Id); } if (pe == null) { pe = new AgencyProcessEmission(); } else { LoadModel(pe); } if (pe.UnitProcessId == 0) { pe.UnitProcessId = unitProcess.Id; } return pe; } public override void LoadEmissions(ProcessEmission pe) { pe.Emissions = EmissionData.Get(e => e.ProcessEmissionId == pe.Id).OrderBy(m => m.PollutantCode).ToList(); //TODO: Fix this for public / agency. } public override void LoadUnitProcessDetails(ProcessEmission processEmission) { //AgencyReport report = ReportDataSessionUtility.CurrentUserView.SelectedFacility if (processEmission.LastUpdatedBy != null && processEmission.LastUpdatedBy.Id > 0) { processEmission.LastUpdatedBy = UserData.GetById(processEmission.LastUpdatedBy.Id); } if (processEmission.UnitProcess == null || processEmission.UnitProcess.Id == 0) { processEmission.UnitProcess = UnitProcessData.GetById(processEmission.UnitProcessId); //TODO REFACTOR } //calculate ControlEfficiency foreach (AgencyEmission emission in processEmission.Emissions) { emission.ProcessEmission = processEmission; emission.ControlEfficiency = ProcessEmissionData.CalculateControlEfficiency(SessionUtility.CurrentReport.Number, processEmission.UnitProcessId, emission.PollutantCode); } if (processEmission.UnitProcess == null || processEmission.UnitProcess.Id < 1) { processEmission.UnitProcess = UnitProcessData.GetSingle(u => u.Id == processEmission.UnitProcessId); } processEmission.UnitProcess.Type = LookupUtility.Get(processEmission.UnitProcess.UnitProcessClassCode); processEmission.UnitProcess.EmissionUnit = EmissionUnitData.GetSingle(e => e.Id == processEmission.UnitProcess.EmissionUnitId, e => new AgencyEmissionUnit { Id = e.Id, Identifier = e.Identifier, Description = e.Description, StatusCode = e.StatusCode, StatusEffectiveDate = e.StatusEffectiveDate }); processEmission.UnitProcess.EmissionIdentifier = processEmission.UnitProcess.EmissionUnit.Identifier; } public override ProcessEmission SaveProcessEmission(ProcessEmission processEmission, List customFields) { using (ISession session = ProcessEmissionData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { processEmission.LastUpdated = DateTime.Now; processEmission.LastUpdatedBy = SessionUtility.CurrentUser; //Delete related emissions if we are updating if (processEmission.Id > 0) { EmissionData.DeleteAllByProcessEmission(processEmission.Id, session); session.Flush(); //persist to DB. } //set default values for save. TODO:// will need to add these to UI eventually, but right now always saving same value SetProcessEmissionDefaultValues(processEmission); //Create or Update process emission record ProcessEmissionData.SaveOrUpdate(processEmission as AgencyProcessEmission, session); //Save related emissions always as new records, since UI will not be aware of ones that are removed, or edited. if (processEmission.Emissions != null) { foreach (AgencyEmission emission in processEmission.Emissions) { emission.ProcessEmissionId = processEmission.Id; //set here always in case processEmission was a new record. emission.Id = 0; SetEmissionDefaultValues(emission); //prevent empty records from saving. if (!String.IsNullOrWhiteSpace(emission.PollutantCode)) { EmissionData.SaveOrUpdate(emission, session); } } } trans.Commit(); //return trans.WasCommitted; return processEmission; } } } public override void DeleteProcessEmission(int id) { using (ISession session = ProcessEmissionData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { trans.Begin(); ProcessEmissionData.Delete(id); EmissionData.DeleteAllByProcessEmission(id, session); trans.Commit(); } } } /*public override int RecalculateEmissions(List processes) { int count = 0; using (ISession session = ProcessEmissionData.GetSession()) { foreach (ProcessEmission pe in processes) { foreach (Emission emis in pe.Emissions) { EmissionCalculation cal = new EmissionCalculation ( pe.UnitProcessId, pe.Value, pe.ValueUomCode, emis.PollutantCode, emis.CalculationMethodCode, emis.Factor, emis.FactorDenomenatorUomCode ); //recalculate total emissions ProcessEmissionData.CalculateEmissions(cal); //set new total - TODO://Might need to check for error code.... emis.TotalEmissions = cal.TotalEmissions; //save EmissionData.SaveOrUpdate(emis as AgencyEmission, session); count++; } } } return count; } * */ } }