using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sleis.Models.CustomFields; using Sleis.ViewModels; using Sleis.Models; using NHibernate; using Sleis.Utility; using Sleis.Models.ErrorHandling; namespace Sleis.Service { public class AgencyEmissionUnitService : EmissionUnitService, IEmissionUnitService { public override EmissionUnit GetEmissionUnit(int emissionUnitId) { AgencyEmissionUnit emissionUnit = new AgencyEmissionUnit(); if (emissionUnitId > 0) { emissionUnit = EmissionUnitData.GetById(emissionUnitId); emissionUnit.Facility = FacilityData.GetById(emissionUnit.FacilityId); LoadModel(emissionUnit as EmissionUnit, true); //load EmissionUnitRegulationProgram LoadRegulationPrograms(emissionUnit); emissionUnit.ControlApproach = ControlApproachData.GetSingle(a => a.EmissionUnitId == emissionUnit.Id); if (emissionUnit.ControlApproach != null && emissionUnit.ControlApproach.Id > 0) { emissionUnit.ControlApproach.EntityControlDevices = ControlApproachData.Get(cd => cd.ControlApproachId == emissionUnit.ControlApproach.Id).OrderBy(x=>x.SequenceNumber).ToList(); foreach (AgencyEmissionUnitControlDevice cd in emissionUnit.ControlApproach.EntityControlDevices) { cd.ControlDevice = ControlDeviceData.GetSingle(c => c.Id == cd.ControlDeviceId); } } emissionUnit.UnitProcessIdentifiers = UnitProcessData.GetUnitProcessIdentifiers(emissionUnitId); emissionUnit.Identifiers = EmissionUnitIdentifierData.Get(x => x.EmissionUnitId == emissionUnit.Id).ToList(); emissionUnit.MasterRecordComments = UnitProcessData.Get(c => c.EmissionUnitId == emissionUnit.Id).ToList(); foreach (Comment comment in emissionUnit.MasterRecordComments) { comment.User = UserData.GetSingle(u => u.Id == comment.UserId); } } return emissionUnit; } public override void Update(EmissionUnit emissionUnit, List customFields) { EmissionUnit oldEu = GetEmissionUnit(emissionUnit.Id); bool isAdd = emissionUnit.Id < 1; using (ISession session = EmissionUnitData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { emissionUnit.LastUpdated = DateTime.Now; emissionUnit.LastUpdatedBy = SessionUtility.CurrentUser; string masterComment = ""; if (((AgencyEmissionUnit)emissionUnit).IsMaster && !String.IsNullOrEmpty(emissionUnit.Comment)) { masterComment = emissionUnit.Comment; emissionUnit.Comment = ""; } if (!EmissionUnitData.IsIdentifierUnique(emissionUnit)) { throw new Utility.UniqueIdentifierException("Emission Unit Identifier must be unique."); } //bool isAdded = false; //update emission unit EmissionUnitData.SaveOrUpdate(emissionUnit as AgencyEmissionUnit, session); //update EmissionUnitControlDeviceApproach if (Properties.Get(Constants.UseEmissionUnitControlApproach) == "true") { //make sure we dont save any control devices if not controlled if (emissionUnit.ControlApproach.NotControlled) { emissionUnit.ControlApproach.Efficency = 0; emissionUnit.ControlApproach.EntityControlDevices = new List(); } ((AgencyEmissionUnitControlApproach)emissionUnit.ControlApproach).EmissionUnitId = emissionUnit.Id; ControlApproachData.SaveOrUpdate(emissionUnit.ControlApproach as AgencyEmissionUnitControlApproach, session); //delete all EntityControlDeviceData.DeleteAllEmissionUnitRelatedByControlApproach(emissionUnit.ControlApproach.Id, session); //update all changes as new. foreach (AgencyEmissionUnitControlDevice pcd in emissionUnit.ControlApproach.EntityControlDevices) { pcd.Id = 0;// clear to make sure always saving as new pcd.ControlApproachId = emissionUnit.ControlApproach.Id; if (pcd.ControlDeviceId > 0) { EntityControlDeviceData.SaveOrUpdate(pcd, session); } } } //update emission regulatory programs if (Properties.Get(Constants.EnableRegulatoryProgramIn) == Constants.EnableRegulatoryProgramInEmissionUnit) { RegulationProgramData.DeleteAllByEmissionUnit(emissionUnit.Id, session); foreach (AgencyEmissionUnitRegulationProgram program in emissionUnit.RegulationPrograms) { program.Id = 0; //make sure always saving as new. program.EmissionUnitId = emissionUnit.Id; if (!String.IsNullOrWhiteSpace(program.ProgramCode)) { RegulationProgramData.SaveOrUpdate(program, session); } } } /* //delete all previously stored Ids EmissionUnitIdentifierData.DeleteAllByEmissionUnit(emissionUnit.Id, session); //save all ids as new if (((AgencyEmissionUnit)emissionUnit).Identifiers != null) { foreach (AgencyEmissionUnitIdentifier id in ((AgencyEmissionUnit)emissionUnit).Identifiers) { id.EmissionUnitId = emissionUnit.Id; EmissionUnitIdentifierData.SaveOrUpdate(id, session); } }*/ //add master iden on add..then it never changes if (((AgencyEmissionUnit)emissionUnit).IsMaster && isAdd) { AgencyEmissionUnitIdentifier id = new AgencyEmissionUnitIdentifier() { EmissionUnitId = emissionUnit.Id, IdentifierText = emissionUnit.Identifier, ProSysCode = "SLEIS", EffectiveDate = DateTime.Now }; EmissionUnitIdentifierData.SaveOrUpdate(id, session); } //add comment. We never delete these. keep a running tally. if (((AgencyEmissionUnit)emissionUnit).IsMaster && !String.IsNullOrWhiteSpace(masterComment)) { AgencyEmissionUnitComment comment = new AgencyEmissionUnitComment(); comment.Text = masterComment; comment.EmissionUnitId = emissionUnit.Id; comment.UserId = SessionUtility.CurrentUser.Id; comment.Date = DateTime.Now; EmissionUnitData.SaveOrUpdate(comment, session); } //save customFieldValue SaveCustomFields(customFields, emissionUnit.Id, session); trans.Commit(); } } CheckAndUpdateReleatedEmissions(oldEu, emissionUnit); } public override void Delete(EmissionUnit emissionUnit, List customFields) { if (!EmissionUnitData.CanDelete(emissionUnit.Id) || emissionUnit.MasterEmissionUnitId.HasValue) { throw new CannotDeleteException(Properties.Get(Constants.AgencyEmissionUnitCannotDeleteMessage)); } FacilityModel facility = FacilityData.GetById(emissionUnit.FacilityId); using (ISession session = EmissionUnitData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { //delete master identifiers EmissionUnitIdentifierData.DeleteAllByEmissionUnit(emissionUnit.Id, session); //delete master comments foreach (AgencyEmissionUnitComment cmnt in ((AgencyEmissionUnit)emissionUnit).MasterRecordComments) { EmissionUnitData.Delete(cmnt, session); } //delete emission-unit -control-device /*foreach (PublicEmissionUnitControlDevice device in emissionUnit.EntityControlDevice.EntityControlDevices) { EntityControlDeviceData.Delete(session, device); }*/ if (emissionUnit.ControlApproach != null) { foreach (AgencyEmissionUnitControlDevice device in emissionUnit.ControlApproach.EntityControlDevices) { EntityControlDeviceData.Delete(device, session); } //delete emission-unit-control-device-approach ControlApproachData.Delete(emissionUnit.ControlApproach as AgencyEmissionUnitControlApproach, session); } if (emissionUnit.RegulationPrograms != null) { //delete emission-unit-regulatory-programs foreach (AgencyEmissionUnitRegulationProgram prog in emissionUnit.RegulationPrograms) { RegulationProgramData.Delete(prog, session); } } //Delete CustomFields foreach (CustomFieldView customField in customFields) { AgencyEmissionUnitCustomFieldValue val = customField.Value.Convert(); val.EntityId = emissionUnit.Id; val.FieldValue.CustomFieldId = customField.Field.Id; CustomFieldValueData.Delete(session, val); } //delete emission-unit EmissionUnitData.Delete(emissionUnit, session); trans.Commit(); } } } protected override List GetRegulationPrograms(int emissionUnitId) { using (ISession session = RegulationProgramData.GetSession()) { return (from d in RegulationProgramData.Get(p => p.EmissionUnitId == emissionUnitId) select d).ToList(); } } public override List GetEmissionUnitListItemsByFacility(int facilityId) { return EmissionUnitData.Get(x => x.FacilityId == facilityId).ToList(); } public override List GetEmissionUnitListItemsByReport(int reportId) { AgencyFacilityModel facility = FacilityData.GetSingle(x => x.ReportId == reportId); return GetEmissionUnitListItemsByFacility(facility.Id); } public override List GetEmissionUnitListItemsByFacility(int facilityId, int pageNum, int pageSize) { List list = EmissionUnitData.Get(x => x.FacilityId == facilityId, o => o.Asc(rp => rp.Identifier), pageNum, pageSize).ToList(); LoadList(list); return list; } public override List GetEmissionUnitListItemsByReport(int reportId, int pageNum, int pageSize) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return GetEmissionUnitListItemsByFacility(facility.Id, pageNum, pageSize); } return new List(); } public override int CountEmissionUnitsByFacility(int facilityId) { return EmissionUnitData.Count(x => x.FacilityId == facilityId); } public override int CountEmissionUnitsByReport(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return CountEmissionUnitsByFacility(facility.Id); } throw new Exception("No facility associated with current report."); } } }