using System; using System.Collections.Generic; using System.Linq; using System.Web; using NHibernate; using Sleis.Models; using Sleis.ViewModels; using Sleis.Models.CustomFields; using Sleis.Utility; namespace Sleis.Service { public class PublicControlDeviceService : ControlDeviceService, IControlDeviceService { public override List GetControlDeviceListByReport(int reportId) { List list = ControlDeviceData.GetControlDevicesByReport(reportId); LoadSimpleLookupItems(list); foreach (var cd in list) { cd.Pollutants = ControlDevicePollutantData.Get(p => p.ControlDeviceId == cd.Id).ToList(); foreach (ControlDevicePollutant p in cd.Pollutants) { p.Pollutant = LookupUtility.Get(p.Code); } } return list; } public override List GetControlDeviceListByReport(int reportId, int pageNum, int pageSize) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return GetControlDeviceListByFacility(facility.Id, pageNum, pageSize); } return new List(); } public override List GetControlDeviceListByFacility(int facilityId) { return new List(); } public override int CountControlDevicesByFacility(int facilityId) { return ControlDeviceData.Count(x => x.FacilityId == facilityId); } public override int CountControlDevicesByReport(int reportId) { FacilityModel facility = FacilityData.GetReportFacility(reportId); if (facility != null && facility.Id > 0) { return CountControlDevicesByFacility(facility.Id); } throw new Exception("No facility associated with current report."); } public override List GetControlDeviceListByFacility(int facilityId, int pageNum, int pageSize) { List list = ControlDeviceData.Get(x => x.FacilityId == facilityId, o => o.Asc(d => d.Identifier), pageNum, pageSize).ToList(); LoadSimpleLookupItems(list); return list; } public override void Update(ControlDeviceModel controlDevice, List customFields) { PublicControlDevice pcd = controlDevice as PublicControlDevice; ControlDeviceModel oldCd = GetControlDevice(controlDevice.Id); using (ISession session = ControlDeviceData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { controlDevice.LastUpdated = DateTime.Now; controlDevice.LastUpdatedBy = SessionUtility.CurrentUser; if (!ControlDeviceData.IsIdentifierUnique(controlDevice)) { throw new Utility.UniqueIdentifierException("Control Device Identifier must be unique."); } trans.Begin(); if (pcd.Id == 0) { pcd.IsAdd = true; } ControlDeviceData.SaveOrUpdate(pcd, session); //delete all previously assoicated pollutants ControlDevicePollutantData.DeleteAllByControlDevice(controlDevice.Id, session); //save all pollutants as new records foreach (PublicControlDevicePollutant pollutant in controlDevice.Pollutants) { //only check if values have changed if update flag is still false. //make sure values are always set this. pollutant.Id = 0; pollutant.ControlDeviceId = controlDevice.Id; if (!String.IsNullOrEmpty(pollutant.Code)) { ControlDevicePollutantData.SaveOrUpdate(pollutant, session); } } //save custom fields SaveCustomFields(customFields, controlDevice.Id, session); trans.Commit(); } } CheckAndRecalculateEmissions(oldCd, controlDevice); } public override ControlDeviceModel GetControlDevice(int id) { PublicControlDevice cd = new PublicControlDevice(); if (id > 0) { cd = ControlDeviceData.GetSingle(c => c.Id == id); if (cd.LastUpdatedBy != null && cd.LastUpdatedBy.Id > 0) { cd.LastUpdatedBy = UserData.GetById(cd.LastUpdatedBy.Id); } List pollutants = ControlDevicePollutantData.Get(p => p.ControlDeviceId == cd.Id).ToList(); if (pollutants.Count > 0) { cd.Pollutants = pollutants.ToList(); foreach (ControlDevicePollutant p in cd.Pollutants) { p.Pollutant = LookupUtility.Get(p.Code); } } LoadSimpleLookupItems(cd); LoadModel(cd); foreach (UnitProcess up in cd.RelatedUnitProcesses) { up.EmissionUnit = EmissionUnitData.GetById(up.EmissionUnitId); up.EmissionIdentifier = up.EmissionUnit.Identifier; } } return cd; } public override void Delete(ControlDeviceModel controlDevice, List customFields) { using (ISession session = ControlDeviceData.GetSession()) { using (ITransaction trans = session.BeginTransaction()) { //delete pollutant first foreach (PublicControlDevicePollutant pollutant in controlDevice.Pollutants) { ControlDevicePollutantData.Delete(pollutant, session); } //delete custom field value foreach (CustomFieldView customFeild in customFields) { ControlDeviceCustomFieldValue val = customFeild.Value.Convert(); val.EntityId = controlDevice.Id; val.FieldValue.CustomFieldId = customFeild.Field.Id; CustomFieldValueData.Delete(session, val); } ControlDeviceData.Delete(controlDevice, session); trans.Commit(); } } } } }