From 255d74ae1f3146abf7b51d21da373d59c52e56c3 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 20 Jan 2023 02:19:05 +0000 Subject: [PATCH] --- server/generator/SockBotProcessPurchases.cs | 117 ++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 server/generator/SockBotProcessPurchases.cs diff --git a/server/generator/SockBotProcessPurchases.cs b/server/generator/SockBotProcessPurchases.cs new file mode 100644 index 0000000..b9c0c1d --- /dev/null +++ b/server/generator/SockBotProcessPurchases.cs @@ -0,0 +1,117 @@ +using System; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Sockeye.Models; +using Sockeye.Util; + +namespace Sockeye.Biz +{ + + + /// + /// Process purchases that are from vendor notification + /// Turn vendordata into fully filled out purchase + /// attempt to match to existing customer or create one if necessary + /// + /// A Separate job will make licenses + /// + /// + internal static class SockBotProcessPurchases + { + private static ILogger log = Sockeye.Util.ApplicationLogging.CreateLogger("SockBotProcessPurchases"); + private static DateTime lastSweep = DateTime.MinValue; + private static TimeSpan PROCESS_EVERY_INTERVAL = new TimeSpan(0, 5, 10);//every 5 minutes roughly meaning 15 minutes down is highest fail state + //////////////////////////////////////////////////////////////////////////////////////////////// + // DoSweep + // + public static async Task DoWorkAsync() + { + //This will get triggered roughly every minute, but we don't want to check that frequently + if (DateTime.UtcNow - lastSweep < PROCESS_EVERY_INTERVAL) + return; + + if (ServerBootConfig.MIGRATING) return;//don't do this during migration (migration is one time only so can remove after up and running) + + log.LogDebug("Process purchases starting"); + using (AyContext ct = Sockeye.Util.ServiceProviderProvider.DBContext) + { + + //get a list of all active server ID's + var ProcessablePurchaseIdList = await ct.Purchase + .AsNoTracking() + .Where(z => z.Processed == false) + .OrderBy(z => z.Id) + .Select(z => z.Id) + .ToListAsync(); + + try + { + foreach (long purchaseId in ProcessablePurchaseIdList) + { + var biz = PurchaseBiz.GetBiz(ct); + var p = await biz.GetAsync(purchaseId, false); + if (p == null) + { + //this is a serious issue log and server ops it + var err = $"SockBotProcessPurchases error running job, purchase record id {purchaseId} could not be fetched {biz.GetErrorsAsString}"; + await NotifyEventHelper.AddOpsProblemEvent(err); + log.LogError(err); + } + else + { + log.LogDebug($"Processing order {p.SalesOrderNumber}"); + + if (string.IsNullOrWhiteSpace(p.VendorData)) + { + var err = $"Purchase record with ID {purchaseId} has no vendor data for sales order {p.SalesOrderNumber}"; + await NotifyEventHelper.AddOpsProblemEvent("SockBotProcessPurchases: " + err); + log.LogError(err); + continue; + } + + +//Parse json vendordata + +//Existing customer or create new one? +//here maybe need to match by vendor provided customer ID?? +//sometimes a user will make a new account for a new purchase but intend it as an addon to v7 +//for v8 it should be straightforward, however if pricing chagnes and new product needs to be purchased they may create a new record +//same dbid for v8 should do the trick + + + //save changes + p.Processed = true; + await biz.PutAsync(p); + } + } + } + catch (Exception ex) + { + var err = "SockBotProcessPurchases error running job"; + //serious issue requires immediate notification + await NotifyEventHelper.AddOpsProblemEvent(err, ex); + log.LogError(ex, err); + } + + } + lastSweep = DateTime.UtcNow; + } + + + + + + + + + + ///////////////////////////////////////////////////////////////////// + + }//eoc + + +}//eons +