This commit is contained in:
2020-07-17 00:06:02 +00:00
parent 371684e510
commit bfb64dffc6
2 changed files with 110 additions and 86 deletions

View File

@@ -110,110 +110,134 @@ namespace AyaNova.Biz
//then *this* code will go through and look for subscriptions related to that event
//this way the biz object code can be "dumb" about notifications in general and just let this code handle it as needed
//will iterate the subscriptions and see if any apply here
internal static async Task HandlePotentialNotificationEvent(AyaType ayaType, AyaEvent ayaEvent, BizObject newObject, BizObject currentObject, )
internal static async Task HandlePotentialNotificationEvent(AyaType ayaType, AyaEvent ayaEvent, BizObject newObject, BizObject currentObject)
{
log.LogTrace($"UpsertEvent processing: [{ev.ToString()}]");
log.LogTrace($"HandlePotentialNotificationEvent processing: [AyaType:{ayaType}, AyaEvent:{ayaEvent}]");
try
{
var HasTags = inTags != null && inTags.Count > 0;
// var HasTags = inTags != null && inTags.Count > 0;
using (AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext)
{
//find all the Notification subscription subs that are relevant
//this first query ensures that the equality matching conditions of AyaType and EventType and idValue are matched leaving only more complex matches to rectify below
var subs = await ct.NotifySubscription.AsNoTracking().Where(z => z.EventType == ev.EventType && z.AyaType == ev.AyaType && z.IdValue == ev.IdValue).ToListAsync();
foreach (var sub in subs)
//switch through AyaEvent then individual Ayatypes as required for event types
switch (ayaEvent)
{
//CONDITION CHECK Tags condition
if (sub.Tags.Count > 0)
{
if (!HasTags)
continue;//not a match, this sub needs tags and we don't have any
//bool existsCheck = list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId));
//would tell you if all of list1's items are in list2.
if (!sub.Tags.All(z => inTags.Any(x => x == z)))
continue;
}
//CONDITION CHECK Decimal value, so far only for "The Andy" so the only condition is that the event value be greater than or equal to subscription setting
if (ev.EventType == NotifyEventType.WorkorderTotalExceedsThreshold && ev.DecValue < sub.DecValue)
continue;
//Here ready for delivery
//HANDLE RELATED INDIRECT EVENTS AND CLEANUP
//some event types create related events here automatically (e.g. WorkorderStatusChange in turn will trigger workorderstatusage if subbed here)
//Deleting an object or changing status etc will affect other events in turn so clean up for them here
switch (ev.EventType)
{
case NotifyEventType.ObjectDeleted:
{
//object is deleted so remove any other events pending for it
//current working concept is there is no reason to keep any event related to a freshly deleted object
var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
ct.NotifyEvent.RemoveRange(deleteEventList);
await ct.SaveChangesAsync();
}
break;
case NotifyEventType.WorkorderStatusChange:
{
//Workorder status changed so remove any other prior workorderstatuschanged events and
//remove any prior workorderstatusAge events for this object id
var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType && ev.EventType == NotifyEventType.WorkorderStatusChange).ToListAsync();
ct.NotifyEvent.RemoveRange(deleteEventList);
await ct.SaveChangesAsync();
}
break;
case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
case NotifyEventType.QuoteStatusAge:
//Delete any existing ones
var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
break;
}
//AgeValue refresh?
//Age based ones need to replace any prior existing age based ones made for the same object as they are the only ones that can sit in the queue for any length of time
//and become invalidated (i.e. deadman type deliveries that sb removed if no longer applicable e.g. WorkorderStatusAge)
switch (ev.EventType)
{
case NotifyEventType.ObjectAge://this is set on creation so it will never change unless the object is deleted
case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
case NotifyEventType.QuoteStatusAge:
//Delete any existing ones
var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
break;
}
//Here we know the sub matches the event and passes all the conditions so set the deliver date if necessary and save the NotifyEvent here
//todo: create message here (delivery thing?)
//todo: Attach report here or is that a delivery thing (delivery thing)
case AyaEvent.Created:
case AyaEvent.Modified:
case AyaEvent.Deleted:
default:
#if (DEBUG)
throw (new System.NotSupportedException($"NotifyEventProcessor:HandlePotentialNotificationEvent - AyaEvent {ayaEvent} was specified which is unexpected and not supported"));
#else
break;
#endif
}
//################### FIRST ATTEMPT STUFF
// //find all the Notification subscription subs that are relevant
// //this first query ensures that the equality matching conditions of AyaType and EventType and idValue are matched leaving only more complex matches to rectify below
// var subs = await ct.NotifySubscription.AsNoTracking().Where(z => z.EventType == ev.EventType && z.AyaType == ev.AyaType && z.IdValue == ev.IdValue).ToListAsync();
// foreach (var sub in subs)
// {
// //CONDITION CHECK Tags condition
// if (sub.Tags.Count > 0)
// {
// if (!HasTags)
// continue;//not a match, this sub needs tags and we don't have any
// //bool existsCheck = list1.All(x => list2.Any(y => x.SupplierId == y.SupplierId));
// //would tell you if all of list1's items are in list2.
// if (!sub.Tags.All(z => inTags.Any(x => x == z)))
// continue;
// }
// //CONDITION CHECK Decimal value, so far only for "The Andy" so the only condition is that the event value be greater than or equal to subscription setting
// if (ev.EventType == NotifyEventType.WorkorderTotalExceedsThreshold && ev.DecValue < sub.DecValue)
// continue;
// //Here ready for delivery
// //HANDLE RELATED INDIRECT EVENTS AND CLEANUP
// //some event types create related events here automatically (e.g. WorkorderStatusChange in turn will trigger workorderstatusage if subbed here)
// //Deleting an object or changing status etc will affect other events in turn so clean up for them here
// switch (ev.EventType)
// {
// case NotifyEventType.ObjectDeleted:
// {
// //object is deleted so remove any other events pending for it
// //current working concept is there is no reason to keep any event related to a freshly deleted object
// var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
// ct.NotifyEvent.RemoveRange(deleteEventList);
// await ct.SaveChangesAsync();
// }
// break;
// case NotifyEventType.WorkorderStatusChange:
// {
// //Workorder status changed so remove any other prior workorderstatuschanged events and
// //remove any prior workorderstatusAge events for this object id
// var deleteEventList = await ct.NotifyEvent.Where(z => z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType && ev.EventType == NotifyEventType.WorkorderStatusChange).ToListAsync();
// ct.NotifyEvent.RemoveRange(deleteEventList);
// await ct.SaveChangesAsync();
// }
// break;
// case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
// case NotifyEventType.QuoteStatusAge:
// //Delete any existing ones
// var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
// break;
// }
// //AgeValue refresh?
// //Age based ones need to replace any prior existing age based ones made for the same object as they are the only ones that can sit in the queue for any length of time
// //and become invalidated (i.e. deadman type deliveries that sb removed if no longer applicable e.g. WorkorderStatusAge)
// switch (ev.EventType)
// {
// case NotifyEventType.ObjectAge://this is set on creation so it will never change unless the object is deleted
// case NotifyEventType.WorkorderStatusAge://delete any workorder status age ones because there is potentially a new status invalidating the old status
// case NotifyEventType.QuoteStatusAge:
// //Delete any existing ones
// var StaleAgedEvents = await ct.NotifyEvent.Where(z => z.EventType == ev.EventType && z.ObjectId == ev.ObjectId && z.AyaType == ev.AyaType).ToListAsync();
// break;
// }
// //Here we know the sub matches the event and passes all the conditions so set the deliver date if necessary and save the NotifyEvent here
// //todo: create message here (delivery thing?)
// //todo: Attach report here or is that a delivery thing (delivery thing)
// }
}
}
catch (Exception ex)
{
log.LogError(ex, $"Error adding notification event: [{ev.ToString()}]");
log.LogError(ex, $"Error processing event");
}
finally
{
log.LogTrace($"Notify event processed: [{ev.ToString()}]");
log.LogTrace($"Notify event processing completed");
}

View File

@@ -17,10 +17,10 @@ namespace AyaNova.Biz
ContractExpiring = 5,
CSRAccepted = 6,
CSRRejected = 7,
WorkorderClosed = 8,
QuoteStatusChange = 9,
ObjectAge = 10,
ServiceBankDepleted = 11,
WorkorderClosed = 8,//Deprecated? Now fulfilled by workorder status specifically, or.. perhaps this still exists but as when wo set to any closed type status? There is a todo in client end related to thsi
QuoteStatusChange = 9,//quote created / modified
ObjectAge = 10,//upon object created, conditional on AgeValue
ServiceBankDepleted = 11,//any change to service bank triggers this check
ReminderImminent = 12,
ScheduledOnWorkorder = 13,
ScheduledOnWorkorderImminent = 14,