This commit is contained in:
2021-03-30 00:13:43 +00:00
parent f343de0544
commit 6660cf302b

View File

@@ -390,10 +390,10 @@ namespace AyaNova.Biz
//THESE TWO ARE REDUNDANT: //THESE TWO ARE REDUNDANT:
this is actually workorderstatuschange because can just pick any status under workorderstatuschange to be notified about this is actually workorderstatuschange because can just pick any status under workorderstatuschange to be notified about
WorkorderFinished = 30, //*Service work order is set to any status that is flagged as a "Finished" type of status. Customer & User WorkorderFinished = 30, //*travel work order is set to any status that is flagged as a "Finished" type of status. Customer & User
//This one could be accomplished with WorkorderStatusAge, just pick a finished status and set a time frame and wala! //This one could be accomplished with WorkorderStatusAge, just pick a finished status and set a time frame and wala!
WorkorderFinishedFollowUp = 32, //* Service workorder closed status follow up again after this many TIMESPAN WorkorderFinishedFollowUp = 32, //* travel workorder closed status follow up again after this many TIMESPAN
todo: CHANGE WorkorderFinishStatusOverdue = 15,//* Workorder object not set to a "Finished" flagged workorder status type in selected time span from creation of workorder todo: CHANGE WorkorderFinishStatusOverdue = 15,//* Workorder object not set to a "Finished" flagged workorder status type in selected time span from creation of workorder
Change this to a new type that is based on so many days *without* being set to a particular status Change this to a new type that is based on so many days *without* being set to a particular status
@@ -882,13 +882,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); // newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); // newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemExpense.AddAsync(newObject); await ct.WorkOrderItemExpense.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Created), ct);
await ExpenseSearchIndexAsync(newObject, true); await ExpenseSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -929,8 +929,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); // dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); // dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await ExpenseValidateAsync(dbObject, SnapshotOfOriginalDBObj); await ExpenseValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -949,7 +949,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Modified), ct);
await ExpenseSearchIndexAsync(dbObject, false); await ExpenseSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -969,7 +969,7 @@ namespace AyaNova.Biz
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemExpense, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemExpense, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemExpense, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemExpense, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1000,7 +1000,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); // CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1029,7 +1029,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemExpense); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemExpense);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Name).AddText(obj.Description);
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -1042,10 +1042,10 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemExpense.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemExpense.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Description).AddText(obj.Name);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item EXPENSE level
/* /*
@@ -1075,13 +1075,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemLabor.AddAsync(newObject); await ct.WorkOrderItemLabor.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Created), ct);
await LaborSearchIndexAsync(newObject, true); await LaborSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -1122,8 +1122,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); //dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); //dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await LaborValidateAsync(dbObject, SnapshotOfOriginalDBObj); await LaborValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -1142,7 +1142,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Modified), ct);
await LaborSearchIndexAsync(dbObject, false); await LaborSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -1162,7 +1162,7 @@ namespace AyaNova.Biz
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLabor, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLabor, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLabor, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLabor, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1193,7 +1193,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1222,7 +1222,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemLabor); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemLabor);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.ServiceDetails);
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -1235,7 +1235,7 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemLabor.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemLabor.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.ServiceDetails);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item LABOR level
@@ -1267,13 +1267,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemLoan.AddAsync(newObject); await ct.WorkOrderItemLoan.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Created), ct);
await LoanSearchIndexAsync(newObject, true); await LoanSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -1314,8 +1314,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); // dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); // dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await LoanValidateAsync(dbObject, SnapshotOfOriginalDBObj); await LoanValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -1334,7 +1334,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Modified), ct);
await LoanSearchIndexAsync(dbObject, false); await LoanSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -1354,7 +1354,7 @@ namespace AyaNova.Biz
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLoan, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLoan, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLoan, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLoan, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1385,7 +1385,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1414,7 +1414,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemLoan); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemLoan);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Notes);
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -1427,10 +1427,210 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemLoan.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemLoan.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Notes);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item LOAN level
/*
██████╗ ██╗ ██╗████████╗███████╗██╗██████╗ ███████╗ ███████╗███████╗██████╗ ██╗ ██╗██╗ ██████╗███████╗
██╔═══██╗██║ ██║╚══██╔══╝██╔════╝██║██╔══██╗██╔════╝ ██╔════╝██╔════╝██╔══██╗██║ ██║██║██╔════╝██╔════╝
██║ ██║██║ ██║ ██║ ███████╗██║██║ ██║█████╗ ███████╗█████╗ ██████╔╝██║ ██║██║██║ █████╗
██║ ██║██║ ██║ ██║ ╚════██║██║██║ ██║██╔══╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║██║ ██╔══╝
╚██████╔╝╚██████╔╝ ██║ ███████║██║██████╔╝███████╗ ███████║███████╗██║ ██║ ╚████╔╝ ██║╚██████╗███████╗
╚═════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝╚═════╝ ╚══════╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═════╝╚══════╝
*/
#region WorkOrderItemOutsideService level
////////////////////////////////////////////////////////////////////////////////////////////////
//EXISTS
internal async Task<bool> OutsideServiceExistsAsync(long id)
{
return await ct.WorkOrderItemOutsideService.AnyAsync(z => z.Id == id);
}
////////////////////////////////////////////////////////////////////////////////////////////////
//CREATE
//
internal async Task<WorkOrderItemOutsideService> OutsideServiceCreateAsync(WorkOrderItemOutsideService newObject)
{
await OutsideServiceValidateAsync(newObject, null);
if (HasErrors)
return null;
else
{
// newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
//newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemOutsideService.AddAsync(newObject);
await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemOutsideService, AyaEvent.Created), ct);
await OutsideServiceSearchIndexAsync(newObject, true);
// await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
// GET
//
internal async Task<WorkOrderItemOutsideService> OutsideServiceGetAsync(long id, bool logTheGetEvent = true)
{
//Note: there could be rules checking here in future, i.e. can only get own workorder or something
//if so, then need to implement AddError and in route handle Null return with Error check just like PUT route does now
//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.WorkOrderItemOutsideService
.SingleOrDefaultAsync(z => z.Id == id);
if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemOutsideService, AyaEvent.Retrieved), ct);
return ret;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//UPDATE
//
internal async Task<WorkOrderItemOutsideService> OutsideServicePutAsync(WorkOrderItemOutsideService dtPutObject)
{
WorkOrderItemOutsideService dbObject = await ct.WorkOrderItemOutsideService.SingleOrDefaultAsync(z => z.Id == dtPutObject.Id);
if (dbObject == null)
{
AddError(ApiErrorCode.NOT_FOUND, "id");
return null;
}
WorkOrderItemOutsideService SnapshotOfOriginalDBObj = new WorkOrderItemOutsideService();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id");
// dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
// dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await OutsideServiceValidateAsync(dbObject, SnapshotOfOriginalDBObj);
if (HasErrors) return null;
try
{
await ct.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!await OutsideServiceExistsAsync(dtPutObject.Id))
AddError(ApiErrorCode.NOT_FOUND);
else
AddError(ApiErrorCode.CONCURRENCY_CONFLICT);
return null;
}
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemOutsideService, AyaEvent.Modified), ct);
await OutsideServiceSearchIndexAsync(dbObject, false);
//await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//DELETE
//
internal async Task<bool> OutsideServiceDeleteAsync(long id)
{
WorkOrderItemOutsideService dbObject = await ct.WorkOrderItemOutsideService.SingleOrDefaultAsync(z => z.Id == id);
OutsideServiceValidateCanDelete(dbObject);
if (HasErrors)
return false;
ct.WorkOrderItemOutsideService.Remove(dbObject);
await ct.SaveChangesAsync();
//Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemOutsideService, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//FIX why woitem, shouldn't it be outsideservice??
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemOutsideService, ct);
//await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//VALIDATION
//
private async Task OutsideServiceValidateAsync(WorkOrderItemOutsideService proposedObj, WorkOrderItemOutsideService currentObj)
{
//run validation and biz rules
bool isNew = currentObj == null;
if (proposedObj.WorkOrderItemId == 0)
AddError(ApiErrorCode.VALIDATION_REQUIRED, "WorkOrderItemId");
else if (!await ItemExistsAsync(proposedObj.WorkOrderItemId))
{
AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "WorkOrderItemId");
}
//Any form customizations to validate?
var FormCustomization = await ct.FormCustom.AsNoTracking().SingleOrDefaultAsync(z => z.FormKey == AyaType.WorkOrderItemOutsideService.ToString());
if (FormCustomization != null)
{
//Yeppers, do the validation, there are two, the custom fields and the regular fields that might be set to required
//validate users choices for required non custom fields
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields
//CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
}
}
private void OutsideServiceValidateCanDelete(WorkOrderItemOutsideService obj)
{
if (obj == null)
{
AddError(ApiErrorCode.NOT_FOUND, "id");
return;
}
//re-check rights here necessary due to traversal delete from Principle object
if (!Authorized.HasDeleteRole(CurrentUserRoles, AyaType.WorkOrderItemOutsideService))
{
AddError(ApiErrorCode.NOT_AUTHORIZED);
return;
}
}
//////////////////////////////////////////////
//INDEXING
//
private async Task OutsideServiceSearchIndexAsync(WorkOrderItemOutsideService obj, bool isNew)
{
//SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemOutsideService);
SearchParams.AddText(obj.Notes).AddText(obj.RMANumber).AddText(obj.TrackingNumber);
if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams);
else
await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams);
}
public async Task<Search.SearchIndexProcessObjectParameters> OutsideServiceGetSearchResultSummary(long id)
{
var obj = await ct.WorkOrderItemOutsideService.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.RMANumber).AddText(obj.TrackingNumber);
return SearchParams;
}
#endregion work order item OUTSIDE SERVICE level
/* /*
@@ -1460,13 +1660,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemPart.AddAsync(newObject); await ct.WorkOrderItemPart.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Created), ct);
await PartSearchIndexAsync(newObject, true); await PartSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
return newObject; return newObject;
} }
} }
@@ -1506,8 +1706,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); //dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); //dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await PartValidateAsync(dbObject, SnapshotOfOriginalDBObj); await PartValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -1526,7 +1726,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Modified), ct);
await PartSearchIndexAsync(dbObject, false); await PartSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -1544,9 +1744,9 @@ namespace AyaNova.Biz
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPart, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPart, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//FIX woitem??
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPart, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPart, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); // await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1577,7 +1777,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1603,7 +1803,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemPart); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemPart);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Description).AddText(obj.Serials);
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -1616,10 +1816,10 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemPart.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemPart.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Description).AddText(obj.Serials);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item PARTS level
/* /*
@@ -1649,13 +1849,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemPartRequest.AddAsync(newObject); await ct.WorkOrderItemPartRequest.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Created), ct);
await PartRequestSearchIndexAsync(newObject, true); //await PartRequestSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -1673,7 +1873,7 @@ namespace AyaNova.Biz
//docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections //docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections
var ret = var ret =
await ct.WorkOrderItemPartRequest await ct.WorkOrderItemPartRequest
.SingleOrDefaultAsync(z => z.Id == id); .SingleOrDefaultAsync(z => z.Id == id);//FIX this GetAsync not using AsNoTracking and neither are any of the others!!
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemPartRequest, AyaEvent.Retrieved), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemPartRequest, AyaEvent.Retrieved), ct);
return ret; return ret;
@@ -1696,8 +1896,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); // dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); //dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await PartRequestValidateAsync(dbObject, SnapshotOfOriginalDBObj); await PartRequestValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -1715,8 +1915,8 @@ namespace AyaNova.Biz
return null; return null;
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Modified), ct);
await PartRequestSearchIndexAsync(dbObject, false); // await PartRequestSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -1734,9 +1934,9 @@ namespace AyaNova.Biz
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPartRequest, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPartRequest, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//FIX "woitem"??
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPartRequest, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPartRequest, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); // await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1767,7 +1967,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1789,30 +1989,32 @@ namespace AyaNova.Biz
} }
//////////////////////////////////////////////
//INDEXING
//
private async Task PartRequestSearchIndexAsync(WorkOrderItemPartRequest obj, bool isNew)
{
//SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemPartRequest);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
if (isNew) //### NOTE: Currently there is nothing to index, no text fields
await Search.ProcessNewObjectKeywordsAsync(SearchParams); // //////////////////////////////////////////////
else // //INDEXING
await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams); // //
} // private async Task PartRequestSearchIndexAsync(WorkOrderItemPartRequest obj, bool isNew)
// {
// //SEARCH INDEXING
// var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemPartRequest);
// SearchParams.AddText(obj.).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
public async Task<Search.SearchIndexProcessObjectParameters> PartRequestGetSearchResultSummary(long id) // if (isNew)
{ // await Search.ProcessNewObjectKeywordsAsync(SearchParams);
var obj = await ct.WorkOrderItemPartRequest.SingleOrDefaultAsync(z => z.Id == id); // else
var SearchParams = new Search.SearchIndexProcessObjectParameters(); // await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams);
if (obj != null) // }
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
return SearchParams; // public async Task<Search.SearchIndexProcessObjectParameters> PartRequestGetSearchResultSummary(long id)
} // {
#endregion work order item LABOR level // var obj = await ct.WorkOrderItemPartRequest.SingleOrDefaultAsync(z => z.Id == id);
// var SearchParams = new Search.SearchIndexProcessObjectParameters();
// if (obj != null)
// SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
// return SearchParams;
// }
#endregion work order item PART REQUEST level
/* /*
@@ -1842,13 +2044,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemScheduledUser.AddAsync(newObject); await ct.WorkOrderItemScheduledUser.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Created), ct);
await ScheduledUserSearchIndexAsync(newObject, true); //await ScheduledUserSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -1889,8 +2091,8 @@ namespace AyaNova.Biz
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); //dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); // dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await ScheduledUserValidateAsync(dbObject, SnapshotOfOriginalDBObj); await ScheduledUserValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -1908,8 +2110,8 @@ namespace AyaNova.Biz
return null; return null;
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Modified), ct);
await ScheduledUserSearchIndexAsync(dbObject, false); // await ScheduledUserSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -1927,9 +2129,9 @@ namespace AyaNova.Biz
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemScheduledUser, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemScheduledUser, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//FIX woitem text??
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemScheduledUser, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemScheduledUser, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -1960,7 +2162,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -1982,30 +2184,32 @@ namespace AyaNova.Biz
} }
////////////////////////////////////////////// //### CUrrently nothing to index as no text fields to search
//INDEXING
//
private async Task ScheduledUserSearchIndexAsync(WorkOrderItemScheduledUser obj, bool isNew)
{
//SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemScheduledUser);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
if (isNew) // //////////////////////////////////////////////
await Search.ProcessNewObjectKeywordsAsync(SearchParams); // //INDEXING
else // //
await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams); // private async Task ScheduledUserSearchIndexAsync(WorkOrderItemScheduledUser obj, bool isNew)
} // {
// //SEARCH INDEXING
// var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemScheduledUser);
// SearchParams.AddText(obj.).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
public async Task<Search.SearchIndexProcessObjectParameters> ScheduledUserGetSearchResultSummary(long id) // if (isNew)
{ // await Search.ProcessNewObjectKeywordsAsync(SearchParams);
var obj = await ct.WorkOrderItemScheduledUser.SingleOrDefaultAsync(z => z.Id == id); // else
var SearchParams = new Search.SearchIndexProcessObjectParameters(); // await Search.ProcessUpdatedObjectKeywordsAsync(SearchParams);
if (obj != null) // }
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
return SearchParams; // public async Task<Search.SearchIndexProcessObjectParameters> ScheduledUserGetSearchResultSummary(long id)
} // {
#endregion work order item LABOR level // var obj = await ct.WorkOrderItemScheduledUser.SingleOrDefaultAsync(z => z.Id == id);
// var SearchParams = new Search.SearchIndexProcessObjectParameters();
// if (obj != null)
// SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
// return SearchParams;
// }
#endregion work order item SCHEDULED USER level
/* /*
@@ -2035,13 +2239,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemTask.AddAsync(newObject); await ct.WorkOrderItemTask.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Created), ct);
await TaskSearchIndexAsync(newObject, true); await TaskSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -2059,7 +2263,7 @@ namespace AyaNova.Biz
//docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections //docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections
var ret = var ret =
await ct.WorkOrderItemTask await ct.WorkOrderItemTask
.SingleOrDefaultAsync(z => z.Id == id); .SingleOrDefaultAsync(z => z.Id == id);//FIX asnotracking
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemTask, AyaEvent.Retrieved), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemTask, AyaEvent.Retrieved), ct);
return ret; return ret;
@@ -2079,11 +2283,11 @@ namespace AyaNova.Biz
// make a snapshot of the original for validation but update the original to preserve workflow // make a snapshot of the original for validation but update the original to preserve workflow
WorkOrderItemTask SnapshotOfOriginalDBObj = new WorkOrderItemTask(); WorkOrderItemTask SnapshotOfOriginalDBObj = new WorkOrderItemTask();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);//FIX not using copyobject anymore
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); //dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); //dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await TaskValidateAsync(dbObject, SnapshotOfOriginalDBObj); await TaskValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -2102,7 +2306,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Modified), ct);
await TaskSearchIndexAsync(dbObject, false); await TaskSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -2122,7 +2326,7 @@ namespace AyaNova.Biz
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTask, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTask, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTask, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTask, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -2153,7 +2357,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -2182,7 +2386,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemTask); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemTask);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Task);//some are manually entered so this is worthwhile for that at least, also I guess predefined tasks that are more rare
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -2195,10 +2399,10 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemTask.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemTask.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Task);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item TASK level
/* /*
@@ -2228,13 +2432,13 @@ namespace AyaNova.Biz
return null; return null;
else else
{ {
newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); //newObject.Tags = TagBiz.NormalizeTags(newObject.Tags);
newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); //newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields);
await ct.WorkOrderItemTravel.AddAsync(newObject); await ct.WorkOrderItemTravel.AddAsync(newObject);
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Created), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Created), ct);
await TravelSearchIndexAsync(newObject, true); await TravelSearchIndexAsync(newObject, true);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
await HandlePotentialNotificationEvent(AyaEvent.Created, newObject); await HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
return newObject; return newObject;
} }
@@ -2252,7 +2456,7 @@ namespace AyaNova.Biz
//docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections //docs say this will not query twice but will recognize the duplicate woitem bit which is required for multiple grandchild collections
var ret = var ret =
await ct.WorkOrderItemTravel await ct.WorkOrderItemTravel
.SingleOrDefaultAsync(z => z.Id == id); .SingleOrDefaultAsync(z => z.Id == id);//FIX asnotracking
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemTravel, AyaEvent.Retrieved), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, AyaType.WorkOrderItemTravel, AyaEvent.Retrieved), ct);
return ret; return ret;
@@ -2273,10 +2477,10 @@ namespace AyaNova.Biz
// make a snapshot of the original for validation but update the original to preserve workflow // make a snapshot of the original for validation but update the original to preserve workflow
WorkOrderItemTravel SnapshotOfOriginalDBObj = new WorkOrderItemTravel(); WorkOrderItemTravel SnapshotOfOriginalDBObj = new WorkOrderItemTravel();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");//FIX outdated method
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); //dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); // dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency;
await TravelValidateAsync(dbObject, SnapshotOfOriginalDBObj); await TravelValidateAsync(dbObject, SnapshotOfOriginalDBObj);
@@ -2295,7 +2499,7 @@ namespace AyaNova.Biz
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Modified), ct);
await TravelSearchIndexAsync(dbObject, false); await TravelSearchIndexAsync(dbObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); //await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj);
return dbObject; return dbObject;
} }
@@ -2315,7 +2519,7 @@ namespace AyaNova.Biz
//Log event //Log event
await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTravel, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTravel, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);
await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTravel, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTravel, ct);
await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); // await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags);
await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct);
await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject);
return true; return true;
@@ -2346,7 +2550,7 @@ namespace AyaNova.Biz
RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors RequiredFieldsValidator.Validate(this, FormCustomization, proposedObj);//note: this is passed only to add errors
//validate custom fields //validate custom fields
CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); //CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields);
} }
} }
@@ -2375,7 +2579,7 @@ namespace AyaNova.Biz
{ {
//SEARCH INDEXING //SEARCH INDEXING
var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemTravel); var SearchParams = new Search.SearchIndexProcessObjectParameters(UserTranslationId, obj.Id, AyaType.WorkOrderItemTravel);
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Notes).AddText(obj.TravelDetails);
if (isNew) if (isNew)
await Search.ProcessNewObjectKeywordsAsync(SearchParams); await Search.ProcessNewObjectKeywordsAsync(SearchParams);
@@ -2388,7 +2592,7 @@ namespace AyaNova.Biz
var obj = await ct.WorkOrderItemTravel.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemTravel.SingleOrDefaultAsync(z => z.Id == id);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Notes).AddText(obj.TravelDetails);
return SearchParams; return SearchParams;
} }
#endregion work order item LABOR level #endregion work order item LABOR level
@@ -2463,7 +2667,6 @@ namespace AyaNova.Biz
return null; return null;
} }
// make a snapshot of the original for validation but update the original to preserve workflow
WorkOrderItemUnit SnapshotOfOriginalDBObj = new WorkOrderItemUnit(); WorkOrderItemUnit SnapshotOfOriginalDBObj = new WorkOrderItemUnit();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj);
CopyObject.Copy(dtPutObject, dbObject, "Id"); CopyObject.Copy(dtPutObject, dbObject, "Id");
@@ -2578,7 +2781,7 @@ namespace AyaNova.Biz
public async Task<Search.SearchIndexProcessObjectParameters> UnitGetSearchResultSummary(long id) public async Task<Search.SearchIndexProcessObjectParameters> UnitGetSearchResultSummary(long id)
{ {
var obj = await ct.WorkOrderItemUnit.SingleOrDefaultAsync(z => z.Id == id); var obj = await ct.WorkOrderItemUnit.SingleOrDefaultAsync(z => z.Id == id);//FIX sb asnotracking (all others too I'm guessing)
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
if (obj != null) if (obj != null)
SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields); SearchParams.AddText(obj.Notes).AddText(obj.Tags).AddCustomFields(obj.CustomFields);
@@ -2694,7 +2897,7 @@ namespace AyaNova.Biz
return await TravelDeleteAsync(id); return await TravelDeleteAsync(id);
case AyaType.WorkOrderItemUnit: case AyaType.WorkOrderItemUnit:
return await UnitDeleteAsync(id); return await UnitDeleteAsync(id);
case AyaType.WorkOrderItemOutsideService: case AyaType.WorkOrderItemOutsideService:
return await OutsideServiceDeleteAsync(id); return await OutsideServiceDeleteAsync(id);
default: default:
throw new System.ArgumentOutOfRangeException($"WorkOrder::GetWorkOrderGraphItem -> Invalid ayaType{ayaType}"); throw new System.ArgumentOutOfRangeException($"WorkOrder::GetWorkOrderGraphItem -> Invalid ayaType{ayaType}");