diff --git a/.vscode/launch.json b/.vscode/launch.json index fcc80a75..b77f3b95 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -53,7 +53,7 @@ "AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles", "AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles", "AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles", - "AYANOVA_SERVER_TEST_MODE": "true", + "AYANOVA_SERVER_TEST_MODE": "false", "AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small", "AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7", "AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\" diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 3f727f31..82ed3a65 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -2184,7 +2184,7 @@ namespace AyaNova.Biz var wid = await GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItem, oProposed.WorkOrderId, ct); var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); - //for notification purposes because has no name field itself + //for notification purposes because has no name field itself oProposed.Name = WorkorderInfo.Serial.ToString(); //STANDARD EVENTS FOR ALL OBJECTS @@ -2559,7 +2559,7 @@ namespace AyaNova.Biz bool isNew = currentObj == null; WorkOrderItemExpense oProposed = (WorkOrderItemExpense)proposedObj; var wid = await GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItem, oProposed.WorkOrderItemId, ct); - var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); + var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); oProposed.Tags = WorkorderInfo.Tags; //STANDARD EVENTS FOR ALL OBJECTS @@ -3049,7 +3049,7 @@ namespace AyaNova.Biz WorkOrderItemLabor oProposed = (WorkOrderItemLabor)proposedObj; var wid = await GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItem, oProposed.WorkOrderItemId, ct); var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); - //for notification purposes because has no name or tags field itself + //for notification purposes because has no name or tags field itself oProposed.Name = WorkorderInfo.Serial.ToString(); oProposed.Tags = WorkorderInfo.Tags; @@ -3429,7 +3429,7 @@ namespace AyaNova.Biz WorkOrderItemLoan oProposed = (WorkOrderItemLoan)proposedObj; var wid = await GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItem, oProposed.WorkOrderItemId, ct); var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); - //for notification purposes because has no name / tags field itself + //for notification purposes because has no name / tags field itself oProposed.Name = WorkorderInfo.Serial.ToString(); oProposed.Tags = WorkorderInfo.Tags; @@ -3746,7 +3746,7 @@ namespace AyaNova.Biz var wid = await GetWorkOrderIdFromRelativeAsync(AyaType.WorkOrderItem, oProposed.WorkOrderItemId, ct); var WorkorderInfo = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == wid.WorkOrderId).Select(x => new { Serial = x.Serial, Tags = x.Tags }).FirstOrDefaultAsync(); //for notification purposes because has no name / tags field itself - oProposed.Name = WorkorderInfo.Serial.ToString(); + oProposed.Name = WorkorderInfo.Serial.ToString(); oProposed.Tags = WorkorderInfo.Tags; //STANDARD EVENTS FOR ALL OBJECTS @@ -4027,38 +4027,36 @@ namespace AyaNova.Biz // internal async Task PartDeleteAsync(long id, IDbContextTransaction parentTransaction = null) { - // var transaction = parentTransaction ?? await ct.Database.BeginTransactionAsync(); - using (var transaction = parentTransaction ?? await ct.Database.BeginTransactionAsync()) + var transaction = parentTransaction ?? await ct.Database.BeginTransactionAsync(); + + try { - try + var dbObject = await PartGetAsync(id, false); + PartValidateCanDelete(dbObject); + if (HasErrors) + return false; + await PartBizActionsAsync(AyaEvent.Deleted, null, dbObject, transaction); + ct.WorkOrderItemPart.Remove(dbObject); + await ct.SaveChangesAsync(); + await PartInventoryAdjustmentAsync(AyaEvent.Deleted, null, dbObject, transaction); + if (HasErrors) { - var dbObject = await PartGetAsync(id, false); - PartValidateCanDelete(dbObject); - if (HasErrors) - return false; - await PartBizActionsAsync(AyaEvent.Deleted, null, dbObject, transaction); - ct.WorkOrderItemPart.Remove(dbObject); - await ct.SaveChangesAsync(); - await PartInventoryAdjustmentAsync(AyaEvent.Deleted, null, dbObject, transaction); - if (HasErrors) - { - await transaction.RollbackAsync(); - return false; - } - //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, dbObject.AyaType, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//Fix?? - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, dbObject.AyaType, ct); - //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); - //await FileUtil.DeleteAttachmentsForObjectAsync(dbObject.AyaType, dbObject.Id, ct); - if (parentTransaction == null) - await transaction.CommitAsync(); - await PartHandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); - } - catch - { - //Just re-throw for now, let exception handler deal, but in future may want to deal with this more here - throw; + await transaction.RollbackAsync(); + return false; } + //Log event + await EventLogProcessor.DeleteObjectLogAsync(UserId, dbObject.AyaType, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct);//Fix?? + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, dbObject.AyaType, ct); + //await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + //await FileUtil.DeleteAttachmentsForObjectAsync(dbObject.AyaType, dbObject.Id, ct); + if (parentTransaction == null) + await transaction.CommitAsync(); + await PartHandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); + } + catch + { + //Just re-throw for now, let exception handler deal, but in future may want to deal with this more here + throw; } return true; } @@ -4385,15 +4383,8 @@ namespace AyaNova.Biz if (newObj.Quantity != 0 && !string.IsNullOrWhiteSpace(newObj.Serials)) await PartBiz.RemoveSerialsAsync(newObj.PartId, newObj.Serials, ct, UserId); } - - } - - - } - - } diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 823d58c6..91c2420c 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -2209,6 +2209,7 @@ "WorkOrderSerialNumber": "Nummer", "Sequence": "Reihenfolge", "SoftDelete": "Zum Löschen markieren", + "SoftDeleteAll": "*alle* zum Löschen markieren", "Undelete": "Wiederherstellen", "NewStatus": "Neuer Status", "WorkOrderCustom1": "Angepasstes Feld 1", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 502f498a..fa470ed8 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -2209,6 +2209,7 @@ "WorkOrderSerialNumber": "Number", "Sequence": "Sequence", "SoftDelete": "Mark for deletion", + "SoftDeleteAll": "Mark *all* for deletion", "Undelete": "Undelete", "NewStatus": "New status", "WorkOrderCustom1": "Custom1", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 1dcd0f01..db9b180e 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -2209,6 +2209,7 @@ "WorkOrderSerialNumber": "Número", "Sequence": "Secuencia", "SoftDelete": "Marcar para borrar", + "SoftDeleteAll": "Marcar *todo* para borrar", "Undelete": "Recuperar", "NewStatus": "Nuevo estado", "WorkOrderCustom1": "Campo personalizado 1", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index c0eb24fb..027127b0 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -2209,6 +2209,7 @@ "WorkOrderSerialNumber": "Numéro", "Sequence": "Séquence", "SoftDelete": "Marquer pour suppression", + "SoftDeleteAll": "Marquer *tout* pour suppression", "Undelete": "Annuler la suppression", "NewStatus": "Nouveau statut", "WorkOrderCustom1": "Champ personnalisé 1",