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 log4net; using Sleis.Utility; using Sleis.Data; using Sleis.ViewModels; using Sleis.Models.CustomFields; using Sleis.Models.ErrorHandling; namespace Sleis.Service { public class AgencyUnitProcessService : UnitProcessService, IUnitProcessService { protected override void LoadModel(UnitProcess model) { model.Type = LookupUtility.Get(model.UnitProcessClassCode); model.EmissionUnit = EmissionUnitData.GetSingle(eu => eu.Id == model.EmissionUnitId); model.Scc = EmissionUnitData.GetSingle(x => x.Code == model.UnitProcessClassCode); model.UnitProcessReleasePoints = UnitProcessReleasePointData.GetUnitProcessReleasePoints(model.Id).ToList(); if (model.LastUpdatedBy != null && model.LastUpdatedBy.Id > 0) { model.LastUpdatedBy = UserData.GetById(model.LastUpdatedBy.Id); } model.EmissionIdentifier = model.EmissionUnit.Identifier; model.ControlApproach = ControlApproachData.GetSingle(x => x.UnitProcessId == model.Id); if (model.ControlApproach == null) { model.ControlApproach = new AgencyUnitProcessControlApproach(); } //prevent view from crashing on null ref. else { model.ControlApproach.EntityControlDevices = ControlApproachData.Get(cd => cd.ControlApproachId == model.ControlApproach.Id).OrderBy(x=>x.SequenceNumber).ToList(); foreach (AgencyUnitProcessControlDevice cd in model.ControlApproach.EntityControlDevices) { cd.ControlDevice = ControlDeviceData.GetSingle(c => c.Id == cd.ControlDeviceId); } } } public override List GetUnitProcessListByReport(int reportId) { List list = UnitProcessData.GetUnitProcessesByAgencyReport(reportId); LoadModel(list); return list; } public override List GetUnitProcessListByFacility(int facilityId) { List list = UnitProcessData.GetUnitProcessesByFacility(facilityId); LoadModel(list); return list; } public override List GetUnitProcessListByEmissionUnit(int emissionUnitId) { List list = UnitProcessData.Get(x => x.EmissionUnitId == emissionUnitId).ToList(); //LoadModel(list); return list; } public override List GetEmissionUnitsByFacility(int facilityId) { return (from d in EmissionUnitData.Get(e=>e.FacilityId == facilityId) select new SimpleEmissionUnit { Id = d.Id, Identifier = d.Identifier, Description = d.Description}).ToList(); } public override List GetEmissionUnitsByReport(int reportId) { return (from d in EmissionUnitData.GetEmissionUnitsByReport(reportId) select new SimpleEmissionUnit { Id = d.Id, Identifier = d.Identifier, Description = d.Description }).ToList(); } public override List GetUnitProcessListItemsByReport(int reportId, int pageNum, int pageSize) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return GetUnitProcessListItemsByFacility(facility.Id, pageNum, pageSize); } return new List(); } public override List GetUnitProcessListItemsByFacility(int facilityId, int pageNum, int pageSize) { return UnitProcessData.Get(x => x.EmissionUnit.FacilityId == facilityId, o => o.Asc(p => p.EmissionUnit.Identifier, d => d.Identifier), pageNum, pageSize).ToList(); } public override int CountUnitProcessesByFacility(int facilityId) { return UnitProcessData.Count(x => x.EmissionUnit.FacilityId == facilityId); } public override int CountUnitProcessesByReport(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return CountUnitProcessesByFacility(facility.Id); } throw new Exception("No facility associated with current report."); } public override List GetUnitProcessListItemsByReport(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return UnitProcessData.Get(x => x.EmissionUnit.FacilityId == facility.Id).ToList(); } return new List(); } public override List GetUnitProcessListItemsByFacility(int facilityId) { return UnitProcessData.Get(x => x.EmissionUnit.FacilityId == facilityId).ToList(); } public override List GetUnitProcessListItemsByEmissionUnit(int emissionUnitId) { return UnitProcessData.Get(x => x.EmissionUnit.Id == emissionUnitId).ToList(); } public override UnitProcess GetUnitProcess(int unitProcessId) { AgencyUnitProcess unitProcess = UnitProcessData.GetUnitProcess(unitProcessId) as AgencyUnitProcess; if (unitProcess.LastUpdatedBy != null && unitProcess.LastUpdatedBy.Id > 0) { unitProcess.LastUpdatedBy = UserData.GetById(unitProcess.LastUpdatedBy.Id); } LoadModel(unitProcess); LoadRegulationPrograms(unitProcess); unitProcess.Facility = FacilityData.GetByUnitProcess(unitProcessId); unitProcess.ReleasePoints = ReleasePointData.GetReleasePointsByUnitProcess(unitProcessId); //unitProcess.EntityControlDevice.SortByIndex(); if (unitProcess.IsMaster) { unitProcess.MasterRecordComments = UnitProcessData.Get(c => c.UnitProcessId == unitProcess.Id).ToList(); foreach (Comment comment in unitProcess.MasterRecordComments) { comment.User = UserData.GetSingle(u => u.Id == comment.UserId); } unitProcess.Identifiers = UnitProcessData.Get(i => i.UnitProcessId == unitProcess.Id).ToList(); } return unitProcess; } public override void Update(UnitProcess detail, List customFields) { UnitProcess oldProc = detail.Id > 0 ? GetUnitProcess(detail.Id) : new AgencyUnitProcess(); bool isAdd = detail.Id < 1; using (ISession session = UnitProcessData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { bool addProcEmisRecord = detail.Id < 1; detail.LastUpdated = DateTime.Now; detail.LastUpdatedBy = SessionUtility.CurrentUser; string masterComment = ""; if (((AgencyUnitProcess)detail).IsMaster) { masterComment = detail.Comment; detail.Comment = ""; //clear value, so doesn't save. //if master record, dont add PE addProcEmisRecord = false; } if (!UnitProcessData.IsIdentifierUnique(detail)) { throw new Utility.UniqueIdentifierException("Unit Process Identifier must be unique."); } //update unit process UnitProcessData.SaveOrUpdate(detail, session); if (addProcEmisRecord) { AgencyProcessEmission pe = new AgencyProcessEmission() { UnitProcessId = detail.Id, TypeCode = "A", OperatingTypeCode = "R", IsReported = true, IsCbi = false }; UnitProcessData.SaveOrUpdate(pe, session); } //update unit process regulatory programs if (Properties.Get(Constants.EnableRegulatoryProgramIn) == Constants.EnableRegulatoryProgramInUnitProcess) { //delete programs RegulationProgramData.DeleteAllByUnitProcess(detail.Id, session); //save all programs as new foreach (AgencyUnitProcessRegulationProgram rp in detail.RegulationPrograms) { rp.Id = 0; //clear to make sure always being saved as new. rp.UnitProcessId = detail.Id; if (!String.IsNullOrWhiteSpace(rp.ProgramCode)) { RegulationProgramData.SaveOrUpdate(rp, session); } } } //Update control approach and control devices. DELETE ALL PREVIOUS RECORDS. SAVE UPDATES AS NEW if (Properties.Get(Constants.UseEmissionUnitControlApproach) == "false") { if (detail.ControlApproach.NotControlled) { detail.ControlApproach.Efficency = 0; detail.ControlApproach.EntityControlDevices = new List(); } detail.ControlApproach.UnitProcessId = detail.Id; ControlApproachData.SaveOrUpdate(detail.ControlApproach as AgencyUnitProcessControlApproach, session); //update unit process control device //delete all EntityControlDeviceData.DeleteAllUnitProcessRelatedByControlApproach(detail.ControlApproach.Id, session); //update all changes as new. foreach (AgencyUnitProcessControlDevice pcd in detail.ControlApproach.EntityControlDevices) { pcd.Id = 0; //clear to make sure always being saved as new. pcd.ControlApproachId = detail.ControlApproach.Id; if (pcd.ControlDeviceId > 0) { EntityControlDeviceData.SaveOrUpdate(pcd, session); } } } //update the unit process release point apportionment. Delete ALL PREVIOUS RECORDS. SAVE UPDATES AS NEW UnitProcessReleasePointData.DeleteAllAgencyByUnitProcess(detail.Id, session); //update foreach (AgencyUnitProcessReleasePoint rp in detail.UnitProcessReleasePoints) { rp.UnitProcessId = detail.Id; rp.Id = 0; //clear to make sure always being saved as new. if (rp.ReleasePointId > 0) { UnitProcessReleasePointData.SaveOrUpdate(rp, session); } } /* //delete all previously stored Ids UnitProcessIdentifierData.DeleteAllByUnitProcess(detail.Id, session); //save all ids as new if (((AgencyUnitProcess)detail).Identifiers != null) { foreach (AgencyUnitProcessIdentifier id in ((AgencyUnitProcess)detail).Identifiers) { id.Id = 0; //clear to make sure always being saved as new. id.UnitProcessId = detail.Id; UnitProcessIdentifierData.SaveOrUpdate(id, session); } } * */ if (((AgencyUnitProcess)detail).IsMaster && isAdd) { AgencyUnitProcessIdentifier id = new AgencyUnitProcessIdentifier() { UnitProcessId = detail.Id, IdentifierText = detail.Identifier, ProSysCode = "SLEIS", EffectiveDate = DateTime.Now }; UnitProcessIdentifierData.SaveOrUpdate(id, session); } //add and save master comment if (((AgencyUnitProcess)detail).IsMaster && !String.IsNullOrWhiteSpace(masterComment)) { AgencyUnitProcessComment comment = new AgencyUnitProcessComment(); comment.Text = masterComment; comment.UnitProcessId = detail.Id; comment.UserId = SessionUtility.CurrentUser.Id; comment.Date = DateTime.Now; ReleasePointData.SaveOrUpdate(comment, session); } //save customFieldValue SaveCustomFields(customFields, detail.Id, session); trans.Commit(); } } CheckAndUpdateReleatedEmissions(oldProc, detail); } protected override void LoadRegulationPrograms(UnitProcess model) { if (Properties.Get(Constants.EnableRegulatoryProgramIn) == Constants.EnableRegulatoryProgramInUnitProcess) { List list = new List(); using (ISession session = RegulationProgramData.GetSession()) { list = RegulationProgramData.Get(p => p.UnitProcessId == model.Id).ToList(); } if (list != null && list.Count > 0) { model.EpaRegulationPrograms.Clear(); model.RegulationPrograms.Clear(); model.RegulationPrograms = list; foreach (UnitProcessRegulationProgram prog in list) { SimpleLookupItem item = LookupUtility.Get(prog.ProgramCode); SimpleLookupItem it = new SimpleLookupItem(); it.Code = item.Code; it.Value = item.Value; it.Year = item.Year; it.Value = string.Format("{0} - {1}", it.Code, it.Value); model.EpaRegulationPrograms.Add(it); } } } else { model.RegulationPrograms = null; model.EpaRegulationPrograms = null; } } public override void Delete(UnitProcess detail, List customFields) { if (!UnitProcessData.CanDelete(detail.Id) || detail.MasterUnitProcessId.HasValue) { throw new CannotDeleteException(Properties.Get(Constants.AgencyUnitProcessCannotDeleteMessage)); } using (ISession session = UnitProcessData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { //delete identifiers UnitProcessIdentifierData.DeleteAllByUnitProcess(detail.Id, session); //delete comments CommentData.DeleteUnitProcessComments(detail.Id, session); //delete unit process release points UnitProcessReleasePointData.DeleteAllAgencyByUnitProcess(detail.Id, session); //delete process emission if (!((AgencyUnitProcess)detail).IsMaster) ProcessEmissionService.DeleteProcessEmission(ProcessEmissionService.GetProcessEmission(0, detail.Id)); //delete regulatory programs if (detail.RegulationPrograms != null) { foreach (AgencyUnitProcessRegulationProgram program in detail.RegulationPrograms) { RegulationProgramData.Delete(program, session); } } //delete unit process control device if (detail.ControlApproach.EntityControlDevices != null) { foreach (AgencyUnitProcessControlDevice device in detail.ControlApproach.EntityControlDevices) { EntityControlDeviceData.Delete(device, session); } } //delete unit process control device approach ControlApproachData.Delete(detail.ControlApproach as AgencyUnitProcessControlApproach, session); //delete custom fields foreach (CustomFieldView customFeild in customFields) { AgencyUnitProcessCustomFieldValue val = customFeild.Value.Convert(); val.EntityId = detail.Id; val.FieldValue.CustomFieldId = customFeild.Field.Id; CustomFieldValueData.Delete(session, val); } //delete unit process UnitProcessData.Delete(detail, session); trans.Commit(); } } } } }