diff --git a/server/AyaNova/Controllers/UnitController.cs b/server/AyaNova/Controllers/UnitController.cs index 0709f838..489c7e8b 100644 --- a/server/AyaNova/Controllers/UnitController.cs +++ b/server/AyaNova/Controllers/UnitController.cs @@ -61,7 +61,7 @@ namespace AyaNova.Api.Controllers else return CreatedAtAction(nameof(UnitController.GetUnit), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); } - + /// /// Get Unit /// @@ -97,7 +97,7 @@ namespace AyaNova.Api.Controllers UnitBiz biz = UnitBiz.GetBiz(ct, HttpContext); if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - var o = await biz.PutAsync(updatedObject); + var o = await biz.PutAsync(updatedObject); if (o == null) { if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT)) @@ -339,7 +339,7 @@ namespace AyaNova.Api.Controllers var UnitContractInfo = await ct.Unit.AsNoTracking().Where(x => x.Id == id).Select(x => new { x.ContractId, x.ContractExpires }).FirstOrDefaultAsync(); if (UnitContractInfo == null || UnitContractInfo.ContractExpires < DateTime.UtcNow)//none or expired return Ok(ApiOkResponse.Response(ret)); - + var c = await ct.Contract.AsNoTracking().FirstOrDefaultAsync(x => x.Id == UnitContractInfo.ContractId); if (c == null || c.Active == false) return Ok(ApiOkResponse.Response(ret)); @@ -362,16 +362,36 @@ namespace AyaNova.Api.Controllers { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - UnitBiz biz = UnitBiz.GetBiz(ct, HttpContext); - if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + UnitMeterReadingBiz biz = UnitMeterReadingBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, AyaType.Unit)) return StatusCode(403, new ApiNotAuthorizedResponse()); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - UnitMeterReading o = await biz.CreateMeterReadingAsync(newObject); + UnitMeterReading o = await biz.CreateAsync(newObject); if (o == null) return BadRequest(new ApiErrorResponse(biz.Errors)); else - return CreatedAtAction(nameof(UnitController.GetUnit), new { id = o.UnitId, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + return CreatedAtAction(nameof(UnitController.GetUnitMeterReading), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + } + + /// + /// Get Unit Meter Reading entry + /// + /// + /// Unit + [HttpGet("meter-reading/{id}")] + public async Task GetUnitMeterReading([FromRoute] long id) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + UnitMeterReadingBiz biz = UnitMeterReadingBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Unit)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + var o = await biz.GetAsync(id); + if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); + return Ok(ApiOkResponse.Response(o)); } diff --git a/server/AyaNova/biz/PurchaseOrderBiz.cs b/server/AyaNova/biz/PurchaseOrderBiz.cs index cbf64a58..f9b21b6e 100644 --- a/server/AyaNova/biz/PurchaseOrderBiz.cs +++ b/server/AyaNova/biz/PurchaseOrderBiz.cs @@ -217,10 +217,8 @@ namespace AyaNova.Biz if (item.WorkOrderItemPartRequestId != null) { po.HasPartRequest = true; - var wid = (await WorkOrderBiz.GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItemPartRequest, (long)item.WorkOrderItemPartRequestId, ct)).ParentId; - var WOSerial = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid).Select(x => new { x.Serial }).FirstOrDefaultAsync(); - if (WOSerial != null) - item.WorkOrderItemPartRequestViz = WOSerial.Serial.ToString(); + + item.WorkOrderItemPartRequestViz=(await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItemPartRequest, (long)item.WorkOrderItemPartRequestId, ct)).ToString(); if (item.PartRequestedById != null) item.PartRequestedByViz = await ct.User.AsNoTracking().Where(x => x.Id == item.PartRequestedById).Select(x => x.Name).FirstOrDefaultAsync(); } diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index 1a40838d..2bf6708b 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -434,7 +434,7 @@ namespace AyaNova.Biz public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -548,123 +548,21 @@ namespace AyaNova.Biz }//Contract expiry event + //#todo: METER READING EVENT + //MIGRATE_OUTSTANDING need meter reading object to complete unit notification for UnitMeterReadingMultipleExceeded + //UnitMeterReadingMultipleExceeded = 26,//* UnitMeterReading object, Created, conditional on DecValue as the Multiple threshold, if passed then notifies + //{ + //first remove any existing, potentially stale notifyevents for this exact object and notifyeventtype + //await NotifyEventHelper.ClearPriorEventsForObject(ct, AyaType.Unit, o.Id, NotifyEventType.UnitMeterReadingMultipleExceeded); + //then check if unit is still metered etc etc and do the rest once the unit meter reading is coded + + //} } }//end of process notifications - ////////////////// METER READING ////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////// - //CREATE - // - internal async Task CreateMeterReadingAsync(UnitMeterReading newObject) - { - await ValidateMeterReadingAsync(newObject); - if (HasErrors) - return null; - else - { - await ct.UnitMeterReading.AddAsync(newObject); - await ct.SaveChangesAsync(); - await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); - await SearchIndexAsync(newObject, true); - await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); - await MeterReadingHandlePotentialNotificationEvent(AyaEvent.Created, newObject); - return newObject; - } - } - - - - - private async Task ValidateMeterReadingAsync(UnitMeterReading proposedObj) - { - //Unit required - var unit = await ct.Unit.AsNoTracking().FirstOrDefaultAsync(z => z.Id == proposedObj.UnitId); - if (unit == null) - { - AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "UnitId", "Unit not found with that id");//api issue not user issue so no need to translate - return; - } - - if(!unit.Metered){ - AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "UnitId", "This is not a metered unit, reading cannot be saved");//api issue not user issue so no need to translate - return; - } - - if(proposedObj.WorkOrderItemId!=null){ - if(!await ct.WorkOrderItem.AnyAsync(z=>z.Id==proposedObj.WorkOrderItemId)){ - AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "WorkOrderItemId", "work order item id was not found");//api issue not user issue so no need to translate - return; - } - } - - } - - - public async Task MeterReadingHandlePotentialNotificationEvent(AyaEvent ayaEvent, UnitMeterReading proposedObj) - { - ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; - log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{AyaType.UnitMeterReading}, AyaEvent:{ayaEvent}]"); - - - - //## CREATED EVENTS (only ever created) - if (ayaEvent == AyaEvent.Created || ayaEvent == AyaEvent.Modified) - { - - // //# CONTRACT EXPIRY - // { - // if (o.ContractId != null && o.ContractExpires != null) - // { - // var ContractExpirydate = (DateTime)o.ContractExpires; - // //notify users about contract expiry (time delayed) - // var subs = await ct.NotifySubscription.Where(z => z.EventType == NotifyEventType.ContractExpiring).ToListAsync(); - // foreach (var sub in subs) - // { - // //not for inactive users - // if (!await UserBiz.UserIsActive(sub.UserId)) continue; - - // //Tag match? (will be true if no sub tags so always safe to call this) - // if (NotifyEventHelper.ObjectHasAllSubscriptionTags(o.Tags, sub.Tags)) - // { - // NotifyEvent n = new NotifyEvent() - // { - // EventType = NotifyEventType.ContractExpiring, - // UserId = sub.UserId, - // AyaType = o.AyaType, - // ObjectId = o.Id, - // NotifySubscriptionId = sub.Id, - // Name = o.Serial, - // EventDate = ContractExpirydate - // }; - // await ct.NotifyEvent.AddAsync(n); - // log.LogDebug($"Adding NotifyEvent: [{n.ToString()}]"); - // await ct.SaveChangesAsync(); - // } - // } - // } - // }//Contract expiry event - - - - } - - - }//end of process notifications - - //#todo: METER READING EVENT - //MIGRATE_OUTSTANDING need meter reading object to complete unit notification for UnitMeterReadingMultipleExceeded - //UnitMeterReadingMultipleExceeded = 26,//* UnitMeterReading object, Created, conditional on DecValue as the Multiple threshold, if passed then notifies - //{ - //first remove any existing, potentially stale notifyevents for this exact object and notifyeventtype - //await NotifyEventHelper.ClearPriorEventsForObject(ct, AyaType.Unit, o.Id, NotifyEventType.UnitMeterReadingMultipleExceeded); - - //then check if unit is still metered etc etc and do the rest once the unit meter reading is coded - - //} ///////////////////////////////////////////////////////////////////// diff --git a/server/AyaNova/biz/UnitMeterReadingBiz.cs b/server/AyaNova/biz/UnitMeterReadingBiz.cs new file mode 100644 index 00000000..d296b20f --- /dev/null +++ b/server/AyaNova/biz/UnitMeterReadingBiz.cs @@ -0,0 +1,220 @@ +using System; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using System.Linq; +using AyaNova.Util; +using AyaNova.Api.ControllerHelpers; +using Microsoft.Extensions.Logging; +using AyaNova.Models; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace AyaNova.Biz +{ + internal class UnitMeterReadingBiz : BizObject, ISearchAbleObject, IReportAbleObject, IExportAbleObject + { + internal UnitMeterReadingBiz(AyContext dbcontext, long currentUserId, long userTranslationId, AuthorizationRoles UserRoles) + { + ct = dbcontext; + UserId = currentUserId; + UserTranslationId = userTranslationId; + CurrentUserRoles = UserRoles; + BizType = AyaType.UnitMeterReading; + } + + internal static UnitMeterReadingBiz GetBiz(AyContext ct, Microsoft.AspNetCore.Http.HttpContext httpContext = null) + { + if (httpContext != null) + return new UnitMeterReadingBiz(ct, UserIdFromContext.Id(httpContext.Items), UserTranslationIdFromContext.Id(httpContext.Items), UserRolesFromContext.Roles(httpContext.Items)); + else + return new UnitMeterReadingBiz(ct, 1, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, AuthorizationRoles.BizAdmin); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //EXISTS + internal async Task ExistsAsync(long id) + { + return await ct.UnitMeterReading.AnyAsync(z => z.Id == id); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //CREATE + // + internal async Task CreateAsync(UnitMeterReading newObject) + { + await ValidateAsync(newObject); + if (HasErrors) + return null; + else + { + + await ct.UnitMeterReading.AddAsync(newObject); + await ct.SaveChangesAsync(); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); + await SearchIndexAsync(newObject, true); + await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); + return newObject; + } + } + + + //////////////////////////////////////////////////////////////////////////////////////////////// + //GET + // + internal async Task GetAsync(long id, bool logTheGetEvent = true) + { + var ret = await ct.UnitMeterReading.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id); + if (logTheGetEvent && ret != null) + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); + return ret; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //SEARCH + // + private async Task SearchIndexAsync(UnitMeterReading obj, bool isNew) + { + var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, BizType); + DigestSearchText(obj, SearchParams); + if (isNew) + await Search.ProcessNewObjectKeywordsAsync(SearchParams); + else + await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams); + } + + public async Task GetSearchResultSummary(long id) + { + var obj = await GetAsync(id, false); + var SearchParams = new Search.SearchIndexProcessObjectParameters(); + DigestSearchText(obj, SearchParams); + return SearchParams; + } + + public void DigestSearchText(UnitMeterReading obj, Search.SearchIndexProcessObjectParameters searchParams) + { + if (obj != null) + searchParams.AddText(obj.Description) + .AddText(obj.Meter); + } + + + + //////////////////////////////////////////////////////////////////////////////////////////////// + //VALIDATION + // + + private async Task ValidateAsync(UnitMeterReading proposedObj) + { + //Unit required + var unit = await ct.Unit.AsNoTracking().FirstOrDefaultAsync(z => z.Id == proposedObj.UnitId); + if (unit == null) + { + AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "UnitId", "Unit not found with that id");//api issue not user issue so no need to translate + return; + } + + if (!unit.Metered) + { + AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "UnitId", "This is not a metered unit, reading cannot be saved");//api issue not user issue so no need to translate + return; + } + + if (proposedObj.WorkOrderItemId != null) + { + if (!await ct.WorkOrderItem.AnyAsync(z => z.Id == proposedObj.WorkOrderItemId)) + { + AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "WorkOrderItemId", "work order item id was not found");//api issue not user issue so no need to translate + return; + } + } + + + } + + + //////////////////////////////////////////////////////////////////////////////////////////////// + //REPORTING + // + public async Task GetReportData(DataListSelectedRequest dataListSelectedRequest) + { + var idList = dataListSelectedRequest.SelectedRowIds; + JArray ReportData = new JArray(); + while (idList.Any()) + { + var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); + idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); + //query for this batch, comes back in db natural order unfortunately + var batchResults = await ct.UnitMeterReading.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); + //order the results back into original + var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + foreach (UnitMeterReading w in orderedList) + { + await PopulateVizFields(w); + var jo = JObject.FromObject(w); + ReportData.Add(jo); + } + } + return ReportData; + } + + + //populate viz fields from provided object + private async Task PopulateVizFields(UnitMeterReading o) + { + o.UnitViz = await ct.Unit.AsNoTracking().Where(x => x.Id == o.UnitId).Select(x => x.Serial).FirstOrDefaultAsync(); + if (o.WorkOrderItemId != null) + o.WorkOrderViz = (await WorkOrderBiz.GetWorkOrderSerialFromRelativeAsync(AyaType.WorkOrderItem, (long)o.WorkOrderItemId, ct)).ToString();//await ct.Unit.AsNoTracking().Where(x => x.Id == o.UnitId).Select(x => x.Serial).FirstOrDefaultAsync(); + } + + + //////////////////////////////////////////////////////////////////////////////////////////////// + // IMPORT EXPORT + // + + public async Task GetExportData(DataListSelectedRequest dataListSelectedRequest) + { + //for now just re-use the report data code + //this may turn out to be the pattern for most biz object types but keeping it seperate allows for custom usage from time to time + return await GetReportData(dataListSelectedRequest); + } + + + + + + + //////////////////////////////////////////////////////////////////////////////////////////////// + // NOTIFICATION PROCESSING + // + public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, UnitMeterReading proposedObj) + { + ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); + + await Task.CompletedTask; + //SPECIFIC EVENTS FOR THIS OBJECT + //#todo: METER READING EVENT + //MIGRATE_OUTSTANDING need meter reading object to complete unit notification for UnitMeterReadingMultipleExceeded + //UnitMeterReadingMultipleExceeded = 26,//* UnitMeterReading object, Created, conditional on DecValue as the Multiple threshold, if passed then notifies + //{ + //first remove any existing, potentially stale notifyevents for this exact object and notifyeventtype + //await NotifyEventHelper.ClearPriorEventsForObject(ct, AyaType.Unit, o.Id, NotifyEventType.UnitMeterReadingMultipleExceeded); + + //then check if unit is still metered etc etc and do the rest once the unit meter reading is coded + + //} + + }//end of process notifications + + + + + ///////////////////////////////////////////////////////////////////// + + }//eoc + + +}//eons + diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 99276826..f6143cbf 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -586,7 +586,15 @@ namespace AyaNova.Biz .SingleOrDefaultAsync(); w.ChildItemId = woitemid; return w; + } + //////////////////////////////////////////////////////////////////////////////////////////////// + //GET WORKORDER SERIAL FROM DESCENDANT TYPE AND ID + // + internal static async Task GetWorkOrderSerialFromRelativeAsync(AyaType ayaType, long id, AyContext ct) + { + var wid = (await GetWorkOrderIdFromRelativeAsync(ayaType, id, ct)).ParentId; + return await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid).Select(x => x.Serial).FirstOrDefaultAsync(); } @@ -1033,7 +1041,7 @@ namespace AyaNova.Biz public async Task WorkOrderHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; WorkOrder oProposed = (WorkOrder)proposedObj; @@ -1443,7 +1451,7 @@ namespace AyaNova.Biz { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -2009,7 +2017,7 @@ namespace AyaNova.Biz public async Task ItemHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -2367,7 +2375,7 @@ namespace AyaNova.Biz public async Task ExpenseHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -2743,7 +2751,7 @@ namespace AyaNova.Biz public async Task LaborHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -3170,7 +3178,7 @@ namespace AyaNova.Biz public async Task LoanHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -3482,7 +3490,7 @@ namespace AyaNova.Biz OutsideServiceReceived = 17,//* Workorder object , WorkOrderItemOutsideService updated, instant notification when item received, tag filterable */ ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -4223,7 +4231,7 @@ namespace AyaNova.Biz public async Task PartHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -4472,7 +4480,7 @@ namespace AyaNova.Biz public async Task PartRequestHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -4739,7 +4747,7 @@ namespace AyaNova.Biz public async Task ScheduledUserHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -5122,7 +5130,7 @@ namespace AyaNova.Biz public async Task TaskHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -5490,7 +5498,7 @@ namespace AyaNova.Biz public async Task TravelHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; @@ -5773,7 +5781,7 @@ namespace AyaNova.Biz public async Task UnitHandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{proposedObj.AyaType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; diff --git a/server/AyaNova/models/UnitMeterReading.cs b/server/AyaNova/models/UnitMeterReading.cs index bf512003..139e0df0 100644 --- a/server/AyaNova/models/UnitMeterReading.cs +++ b/server/AyaNova/models/UnitMeterReading.cs @@ -10,22 +10,26 @@ namespace AyaNova.Models //NOTE: Any non required field (nullable in DB) sb nullable here, i.e. decimal? not decimal, //otherwise the server will call it an invalid record if the field isn't sent from client - public class UnitMeterReading + public class UnitMeterReading { public long Id { get; set; } - public uint Concurrency { get; set; } + public uint Concurrency { get; set; } public string Description { get; set; } - public long Meter { get; set; } + public long Meter { get; set; } public DateTime MeterDate { get; set; } public long UnitId { get; set; } - public long? WorkOrderItemId { get; set; } + public long? WorkOrderItemId { get; set; } + [NotMapped] + public string UnitViz { get; set; } + [NotMapped] + public string WorkOrderViz { get; set; } public UnitMeterReading() { - + } - + }//eoc