This commit is contained in:
2021-03-25 18:03:01 +00:00
parent c92c5424b0
commit 58d2772593
7 changed files with 235 additions and 216 deletions

View File

@@ -8,15 +8,20 @@ using System.Linq;
using System;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace AyaNova.Biz
{
/*
###############
MUST be able to update any section at any level independantly
Fetch must be able to get entire graph or from any level down or single header only as required
probably need a woheaderfetch route separately
*/
internal class WorkOrderBiz : BizObject, IJobObject, ISearchAbleObject, IReportAbleObject, IExportAbleObject, INotifiableObject
{
//Feature specific roles
internal static AuthorizationRoles RolesAllowedToChangeSerial = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.AccountingFull;
// //Feature specific roles
// internal static AuthorizationRoles RolesAllowedToChangeSerial = AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.AccountingFull;
internal WorkOrderBiz(AyContext dbcontext, long currentUserId, long userTranslationId, AuthorizationRoles UserRoles)
{
@@ -37,16 +42,6 @@ namespace AyaNova.Biz
}
//###################################################################################################################################################
//###################################################################################################################################################
// WARNING! THIS OBJECT IS AN INITIAL TEST VERSION NOT UP TO CURRENT STANDARDS, SEE PARTASSEMBLYBIZ / some of WORKORDERBIZ FOR HOW THIS SHOULD BE CODED
//###################################################################################################################################################
//###################################################################################################################################################
//NOTE: this *is* working but is probably coded wrong for the child collections
//see the partassemblybiz and associated code / schema structure for proper way to do this
//and meld into this design
/*
██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗
@@ -69,10 +64,8 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
//
internal async Task<WorkOrder> WorkOrderCreateAsync(dtWorkOrder dtNewObject)
internal async Task<WorkOrder> WorkOrderCreateAsync(WorkOrder newObject)
{
WorkOrder newObject = new WorkOrder();
CopyObject.Copy(dtNewObject, newObject);
await WorkOrderValidateAsync(newObject, null);
if (HasErrors)
return null;
@@ -125,7 +118,7 @@ namespace AyaNova.Biz
//https://docs.microsoft.com/en-us/ef/core/querying/related-data
//docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections
var ret =
await ct.WorkOrder
await ct.WorkOrder.AsNoTracking()
.Include(w => w.Items)
.ThenInclude(wi => wi.Expenses)
.Include(w => w.Items)
@@ -155,52 +148,43 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//
internal async Task<WorkOrder> WorkOrderPutAsync(dtWorkOrder dtPutObject)
internal async Task<WorkOrder> WorkOrderPutAsync(WorkOrder putObject)
{
WorkOrder dbObject = await ct.WorkOrder.SingleOrDefaultAsync(z => z.Id == dtPutObject.Id);
WorkOrder dbObject = await WorkOrderGetAsync(putObject.Id, false);
if (dbObject == null)
{
AddError(ApiErrorCode.NOT_FOUND, "id");
return null;
}
// make a snapshot of the original for validation but update the original to preserve workflow
WorkOrder SnapshotOfOriginalDBObj = new WorkOrder();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
//Replace the db object with the PUT object
CopyObject.Copy(dtPutObject, dbObject, "Id");
//if user has rights then change it, otherwise just ignore it and do the rest
if (dtPutObject.Serial != 0 && SnapshotOfOriginalDBObj.Serial != dtPutObject.Serial && Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial))
if (dbObject.Concurrency != putObject.Concurrency)
{
dbObject.Serial = dtPutObject.Serial;
AddError(ApiErrorCode.CONCURRENCY_CONFLICT);
return null;
}
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await WorkOrderValidateAsync(dbObject, SnapshotOfOriginalDBObj);
putObject.Tags = TagBiz.NormalizeTags(putObject.Tags);
putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields);
await WorkOrderValidateAsync(putObject, dbObject);
if (HasErrors)
return null;
ct.Replace(dbObject, putObject);
try
{
await ct.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!await WorkOrderExistsAsync(dtPutObject.Id))
if (!await WorkOrderExistsAsync(putObject.Id))
AddError(ApiErrorCode.NOT_FOUND);
else
AddError(ApiErrorCode.CONCURRENCY_CONFLICT);
return null;
}
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
await WorkOrderSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject;
await WorkOrderSearchIndexAsync(putObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject);
return putObject;
}
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -237,15 +221,6 @@ namespace AyaNova.Biz
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
#if (DEBUG)
if (dbObject.Wiki == "INTEGRATION_DELETE_TEST_FAIL_BEFORE_COMMIT")
{
// await transaction.RollbackAsync();
return false;//thus not committing transaction
}
#endif
await transaction.CommitAsync();
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
}
@@ -623,7 +598,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
//
internal async Task<WorkOrderItem> ItemCreateAsync(dtWorkOrderItem dtNewObject)
internal async Task<WorkOrderItem> ItemCreateAsync(WorkOrderItem dtNewObject)
{
WorkOrderItem newObject = new WorkOrderItem();
CopyObject.Copy(dtNewObject, newObject);
@@ -676,7 +651,7 @@ namespace AyaNova.Biz
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//
internal async Task<WorkOrderItem> ItemPutAsync(dtWorkOrderItem dtPutObject)
internal async Task<WorkOrderItem> ItemPutAsync(WorkOrderItem dtPutObject)
{
WorkOrderItem dbObject = await ct.WorkOrderItem.SingleOrDefaultAsync(z => z.Id == dtPutObject.Id);
@@ -2647,19 +2622,19 @@ namespace AyaNova.Biz
case AyaType.WorkOrder:
if (o is WorkOrder)
{
dtWorkOrder dto = new dtWorkOrder();
WorkOrder dto = new WorkOrder();
CopyObject.Copy(o, dto);
return await WorkOrderPutAsync((dtWorkOrder)dto);
return await WorkOrderPutAsync((WorkOrder)dto);
}
return await WorkOrderPutAsync((dtWorkOrder)o) as ICoreBizObjectModel;
return await WorkOrderPutAsync((WorkOrder)o) as ICoreBizObjectModel;
case AyaType.WorkOrderItem:
if (o is WorkOrderItem)
{
dtWorkOrderItem dto = new dtWorkOrderItem();
WorkOrderItem dto = new WorkOrderItem();
CopyObject.Copy(o, dto);
return await ItemPutAsync((dtWorkOrderItem)dto);
return await ItemPutAsync((WorkOrderItem)dto);
}
return await ItemPutAsync((dtWorkOrderItem)o);
return await ItemPutAsync((WorkOrderItem)o);
case AyaType.WorkOrderItemExpense:
return await ExpensePutAsync((WorkOrderItemExpense)o);
case AyaType.WorkOrderItemLabor: