This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user