This commit is contained in:
@@ -61,31 +61,7 @@ namespace AyaNova.Api.Controllers
|
|||||||
else
|
else
|
||||||
return CreatedAtAction(nameof(UnitController.GetUnit), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
|
return CreatedAtAction(nameof(UnitController.GetUnit), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
|
||||||
}
|
}
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// Duplicate Unit
|
|
||||||
// /// (Wiki and Attachments are not duplicated)
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="id">Source object id</param>
|
|
||||||
// /// <param name="apiVersion">From route path</param>
|
|
||||||
// /// <returns>Unit</returns>
|
|
||||||
// [HttpPost("duplicate/{id}")]
|
|
||||||
// public async Task<IActionResult> DuplicateUnit([FromRoute] long id, ApiVersion apiVersion)
|
|
||||||
// {
|
|
||||||
// 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))
|
|
||||||
// return StatusCode(403, new ApiNotAuthorizedResponse());
|
|
||||||
// if (!ModelState.IsValid)
|
|
||||||
// return BadRequest(new ApiErrorResponse(ModelState));
|
|
||||||
// Unit o = await biz.DuplicateAsync(id);
|
|
||||||
// if (o == null)
|
|
||||||
// return BadRequest(new ApiErrorResponse(biz.Errors));
|
|
||||||
// else
|
|
||||||
// return CreatedAtAction(nameof(UnitController.GetUnit), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get Unit
|
/// Get Unit
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -375,5 +351,29 @@ namespace AyaNova.Api.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create Unit Meter Reading entry
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="newObject"></param>
|
||||||
|
/// <param name="apiVersion">From route path</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("meter-reading")]
|
||||||
|
public async Task<IActionResult> PostUnitMeterReading([FromBody] UnitMeterReading newObject, ApiVersion apiVersion)
|
||||||
|
{
|
||||||
|
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))
|
||||||
|
return StatusCode(403, new ApiNotAuthorizedResponse());
|
||||||
|
if (!ModelState.IsValid)
|
||||||
|
return BadRequest(new ApiErrorResponse(ModelState));
|
||||||
|
UnitMeterReading o = await biz.CreateMeterReadingAsync(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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}//eoc
|
}//eoc
|
||||||
}//eons
|
}//eons
|
||||||
@@ -60,39 +60,6 @@ namespace AyaNova.Biz
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// //DUPLICATE
|
|
||||||
// //
|
|
||||||
// internal async Task<Unit> DuplicateAsync(long id)
|
|
||||||
// {
|
|
||||||
// var dbObject = await GetAsync(id, false);
|
|
||||||
// if (dbObject == null)
|
|
||||||
// {
|
|
||||||
// AddError(ApiErrorCode.NOT_FOUND, "id");
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// var newObject = new Unit();
|
|
||||||
// CopyObject.Copy(dbObject, newObject, "Wiki");
|
|
||||||
// string newUniqueName = string.Empty;
|
|
||||||
// bool NotUnique = true;
|
|
||||||
// long l = 1;
|
|
||||||
// do
|
|
||||||
// {
|
|
||||||
// newUniqueName = Util.StringUtil.UniqueNameBuilder(dbObject.Serial, l++, 255);
|
|
||||||
// NotUnique = await ct.Unit.AnyAsync(z => z.Serial == newUniqueName);
|
|
||||||
// } while (NotUnique);
|
|
||||||
// newObject.Serial = newUniqueName;
|
|
||||||
// newObject.Id = 0;
|
|
||||||
// newObject.Concurrency = 0;
|
|
||||||
// await ct.Unit.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 HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
|
|
||||||
// return newObject;
|
|
||||||
// }
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//GET
|
//GET
|
||||||
//
|
//
|
||||||
@@ -467,7 +434,7 @@ namespace AyaNova.Biz
|
|||||||
public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null)
|
public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null)
|
||||||
{
|
{
|
||||||
ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger<UnitBiz>();
|
ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger<UnitBiz>();
|
||||||
if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return;
|
if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return;
|
||||||
log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]");
|
log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]");
|
||||||
|
|
||||||
bool isNew = currentObj == null;
|
bool isNew = currentObj == null;
|
||||||
@@ -581,21 +548,123 @@ namespace AyaNova.Biz
|
|||||||
}//Contract expiry event
|
}//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
|
}//end of process notifications
|
||||||
|
|
||||||
|
////////////////// METER READING //////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//CREATE
|
||||||
|
//
|
||||||
|
internal async Task<UnitMeterReading> 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<UnitBiz>();
|
||||||
|
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
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ namespace AyaNova.Models
|
|||||||
public virtual DbSet<PurchaseOrderItem> PurchaseOrderItem { get; set; }
|
public virtual DbSet<PurchaseOrderItem> PurchaseOrderItem { get; set; }
|
||||||
public virtual DbSet<Unit> Unit { get; set; }
|
public virtual DbSet<Unit> Unit { get; set; }
|
||||||
public virtual DbSet<UnitModel> UnitModel { get; set; }
|
public virtual DbSet<UnitModel> UnitModel { get; set; }
|
||||||
|
public virtual DbSet<UnitMeterReading> UnitMeterReading { get; set; }
|
||||||
public virtual DbSet<Vendor> Vendor { get; set; }
|
public virtual DbSet<Vendor> Vendor { get; set; }
|
||||||
public virtual DbSet<TaxCode> TaxCode { get; set; }
|
public virtual DbSet<TaxCode> TaxCode { get; set; }
|
||||||
public virtual DbSet<ServiceRate> ServiceRate { get; set; }
|
public virtual DbSet<ServiceRate> ServiceRate { get; set; }
|
||||||
|
|||||||
Reference in New Issue
Block a user