From e8b3486a9e6791945012af796bc8c45e22b45066 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Sat, 31 Oct 2026 14:57:42 -0700 Subject: [PATCH] case 4653 - deleting a record still in use is refused with "in use by" instead of a server error Co-Authored-By: Claude Opus 5.5 --- devdocs/modernization/NET10-PORT.md | 1 + docs/8.0/ayanova/docs/changelog.md | 1 + server/AyaNova/biz/CustomerBiz.cs | 6 ++++ .../AyaNova/biz/CustomerServiceRequestBiz.cs | 12 ++++---- server/AyaNova/biz/LoanUnitBiz.cs | 12 ++++++-- server/AyaNova/biz/PartBiz.cs | 10 +++++++ server/AyaNova/biz/PartWarehouseBiz.cs | 10 +++++++ server/AyaNova/biz/ProjectBiz.cs | 6 ++++ server/AyaNova/biz/ServiceRateBiz.cs | 10 +++++++ server/AyaNova/biz/TaxCodeBiz.cs | 28 +++++++++++++++++++ server/AyaNova/biz/TranslationBiz.cs | 6 ++++ server/AyaNova/biz/TravelRateBiz.cs | 8 ++++++ server/AyaNova/biz/UnitBiz.cs | 14 ++++++++++ server/AyaNova/biz/VendorBiz.cs | 14 ++++++++++ .../AyaNova/biz/WorkOrderItemPriorityBiz.cs | 4 +++ server/AyaNova/biz/WorkOrderItemStatusBiz.cs | 4 +++ 16 files changed, 137 insertions(+), 9 deletions(-) diff --git a/devdocs/modernization/NET10-PORT.md b/devdocs/modernization/NET10-PORT.md index d489e0c6..ab0ace78 100644 --- a/devdocs/modernization/NET10-PORT.md +++ b/devdocs/modernization/NET10-PORT.md @@ -285,6 +285,7 @@ Found during the port, out of scope. One line each. - From case 4755 (tidy-up, no behaviour change): `SetNextBackup` no longer reads `NextBackup`'s previous value, so the startup line `NextBackup = FileUtil.MostRecentAutomatedBackupFileDate()` (`util/ServerGlobalOpsSettingsCache.cs:50`), the reset to `DateTime.MinValue` in `GlobalOpsBackupSettingsBiz` and `FileUtil.MostRecentAutomatedBackupFileDate` itself are dead. Same in Sockeye - Found in case 4755's integration run (2026-10-31): a 500 response produced by the exception handler (e.g. `/` on a debug server whose `wwwroot` has no client) has none of the three safe headers from case 4727 (F35), because the handler clears headers set before it. Integration test `ApiRoute.SafeHeadersOnEveryResponse` fails for that reason on a debug server without the client in `wwwroot`; it passes on a release build - Pre-existing (found in the 4632 IIS test, John: Deferred): emailed report attachments have the content type `application/pdf/pdf`, because `Mailer.cs:51` builds `new MimePart("application/pdf", "pdf")` (media type and subtype) instead of `new MimePart("application", "pdf")`. Mail programs still open the file by its `.pdf` name +- Found in case 4653 (pre-existing): `CustomerBiz.ValidateCanDeleteAsync` refuses to delete a customer that has contacts (users), yet `DeleteAsync` then has code to delete the customer's contacts, which can never run. Its comment says contacts were meant to be deleted with the customer, and that the check is there "for now". Decide which behaviour is wanted; same in Sockeye ## Log diff --git a/docs/8.0/ayanova/docs/changelog.md b/docs/8.0/ayanova/docs/changelog.md index 88dbb398..ac9cf2f0 100644 --- a/docs/8.0/ayanova/docs/changelog.md +++ b/docs/8.0/ayanova/docs/changelog.md @@ -18,6 +18,7 @@ IN PROGRESS - Server: in some cases the automatic backup could be skipped for one day after the AyaNova server was restarted or a manual backup was made; it now always runs at the next chosen [backup time](ops-form-backup.md#backup-time). - Server: opening a record that has since been deleted (for example from an old link) now shows a "not found" message instead of a server error, and a report printed for records of which some have since been deleted now prints the remaining ones instead of failing. +- Server: in some cases deleting a record that is still in use elsewhere (for example a customer, unit, part or rate used on a work order, quote or PM) gave a server error; it now always says which kind of record is using it. ### AyaNova 8.3.0 diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 819939bb..6b1801c7 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -339,6 +339,12 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("CustomerServiceRequest")); if (await ct.PurchaseOrder.AnyAsync(m => m.DropShipToCustomerId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + if (await ct.WorkOrder.AnyAsync(z => z.CustomerId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrder")); + if (await ct.Quote.AnyAsync(z => z.CustomerId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Quote")); + if (await ct.PM.AnyAsync(z => z.CustomerId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PM")); // await Task.CompletedTask; } diff --git a/server/AyaNova/biz/CustomerServiceRequestBiz.cs b/server/AyaNova/biz/CustomerServiceRequestBiz.cs index 4b78b40c..db99cf9b 100644 --- a/server/AyaNova/biz/CustomerServiceRequestBiz.cs +++ b/server/AyaNova/biz/CustomerServiceRequestBiz.cs @@ -120,7 +120,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; { @@ -239,12 +239,12 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(CustomerServiceRequest inObj) + private async Task ValidateCanDeleteAsync(CustomerServiceRequest inObj) { - //whatever needs to be check to delete this object - //can't delete if it's accepted - - + //FOREIGN KEY CHECKS + //an accepted request is linked from the work order item made from it + if (await ct.WorkOrderItem.AnyAsync(z => z.FromCSRId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrder")); } diff --git a/server/AyaNova/biz/LoanUnitBiz.cs b/server/AyaNova/biz/LoanUnitBiz.cs index 5d0fe331..a9477aee 100644 --- a/server/AyaNova/biz/LoanUnitBiz.cs +++ b/server/AyaNova/biz/LoanUnitBiz.cs @@ -125,7 +125,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; { @@ -230,9 +230,15 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(LoanUnit inObj) + private async Task ValidateCanDeleteAsync(LoanUnit inObj) { - //whatever needs to be check to delete this object + //FOREIGN KEY CHECKS + if (await ct.WorkOrderItemLoan.AnyAsync(z => z.LoanUnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemLoan")); + if (await ct.QuoteItemLoan.AnyAsync(z => z.LoanUnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Quote") + " - " + await Translate("WorkOrderItemLoan")); + if (await ct.PMItemLoan.AnyAsync(z => z.LoanUnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PM") + " - " + await Translate("WorkOrderItemLoan")); } diff --git a/server/AyaNova/biz/PartBiz.cs b/server/AyaNova/biz/PartBiz.cs index 57d242b3..e3b9f3c0 100644 --- a/server/AyaNova/biz/PartBiz.cs +++ b/server/AyaNova/biz/PartBiz.cs @@ -467,6 +467,16 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartStockingLevels")); if (await ct.PurchaseOrderItem.AnyAsync(m => m.PartId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.WorkOrderItemPart.AnyAsync(z => z.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemPart")); + if (await ct.QuoteItemPart.AnyAsync(z => z.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.PMItemPart.AnyAsync(z => z.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.WorkOrderItemPartRequest.AnyAsync(z => z.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemPartRequest")); } diff --git a/server/AyaNova/biz/PartWarehouseBiz.cs b/server/AyaNova/biz/PartWarehouseBiz.cs index 5cc6968e..53fdb1ef 100644 --- a/server/AyaNova/biz/PartWarehouseBiz.cs +++ b/server/AyaNova/biz/PartWarehouseBiz.cs @@ -246,6 +246,16 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartStockingLevels")); if (await ct.PurchaseOrderItem.AnyAsync(m => m.PartWarehouseId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.WorkOrderItemPart.AnyAsync(z => z.PartWarehouseId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemPart")); + if (await ct.QuoteItemPart.AnyAsync(z => z.PartWarehouseId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.PMItemPart.AnyAsync(z => z.PartWarehouseId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.WorkOrderItemPartRequest.AnyAsync(z => z.PartWarehouseId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemPartRequest")); } diff --git a/server/AyaNova/biz/ProjectBiz.cs b/server/AyaNova/biz/ProjectBiz.cs index 34253771..beb16001 100644 --- a/server/AyaNova/biz/ProjectBiz.cs +++ b/server/AyaNova/biz/ProjectBiz.cs @@ -236,6 +236,12 @@ namespace AyaNova.Biz //FOREIGN KEY CHECKS if (await ct.PurchaseOrder.AnyAsync(m => m.ProjectId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + if (await ct.WorkOrder.AnyAsync(z => z.ProjectId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrder")); + if (await ct.Quote.AnyAsync(z => z.ProjectId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Quote")); + if (await ct.PM.AnyAsync(z => z.ProjectId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PM")); } diff --git a/server/AyaNova/biz/ServiceRateBiz.cs b/server/AyaNova/biz/ServiceRateBiz.cs index f674c968..029e4dd5 100644 --- a/server/AyaNova/biz/ServiceRateBiz.cs +++ b/server/AyaNova/biz/ServiceRateBiz.cs @@ -273,6 +273,16 @@ namespace AyaNova.Biz if (await ct.WorkOrderItemScheduledUser.AnyAsync(x => x.ServiceRateId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemScheduledUser")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.QuoteItemLabor.AnyAsync(z => z.ServiceRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemLabor")); + if (await ct.PMItemLabor.AnyAsync(z => z.ServiceRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemLabor")); + if (await ct.QuoteItemScheduledUser.AnyAsync(z => z.ServiceRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemScheduledUser")); + if (await ct.PMItemScheduledUser.AnyAsync(z => z.ServiceRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemScheduledUser")); } diff --git a/server/AyaNova/biz/TaxCodeBiz.cs b/server/AyaNova/biz/TaxCodeBiz.cs index 6cc54905..d27397e1 100644 --- a/server/AyaNova/biz/TaxCodeBiz.cs +++ b/server/AyaNova/biz/TaxCodeBiz.cs @@ -294,6 +294,34 @@ namespace AyaNova.Biz if (await ct.WorkOrderItemExpense.AnyAsync(x => x.ChargeTaxCodeId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemExpense")); + if (await ct.WorkOrderItemOutsideService.AnyAsync(z => z.TaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemOutsideService")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.QuoteItemTravel.AnyAsync(z => z.TaxCodeSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemTravel")); + if (await ct.PMItemTravel.AnyAsync(z => z.TaxCodeSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemTravel")); + if (await ct.QuoteItemPart.AnyAsync(z => z.TaxPartSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.PMItemPart.AnyAsync(z => z.TaxPartSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemPart")); + if (await ct.QuoteItemLoan.AnyAsync(z => z.TaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemLoan")); + if (await ct.PMItemLoan.AnyAsync(z => z.TaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemLoan")); + if (await ct.QuoteItemLabor.AnyAsync(z => z.TaxCodeSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemLabor")); + if (await ct.PMItemLabor.AnyAsync(z => z.TaxCodeSaleId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemLabor")); + if (await ct.QuoteItemExpense.AnyAsync(z => z.ChargeTaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemExpense")); + if (await ct.PMItemExpense.AnyAsync(z => z.ChargeTaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemExpense")); + if (await ct.QuoteItemOutsideService.AnyAsync(z => z.TaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemOutsideService")); + if (await ct.PMItemOutsideService.AnyAsync(z => z.TaxCodeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemOutsideService")); } diff --git a/server/AyaNova/biz/TranslationBiz.cs b/server/AyaNova/biz/TranslationBiz.cs index 5fc181c9..90a15a0f 100644 --- a/server/AyaNova/biz/TranslationBiz.cs +++ b/server/AyaNova/biz/TranslationBiz.cs @@ -579,6 +579,12 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, null, "Can't be deleted in use by one or more Users"); return; } + + if (await ct.CustomerNotifySubscription.AnyAsync(e => e.TranslationId == inObj.Id)) + { + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, null, "Can't be deleted in use by one or more customer notification subscriptions"); + return; + } } diff --git a/server/AyaNova/biz/TravelRateBiz.cs b/server/AyaNova/biz/TravelRateBiz.cs index 32151fab..c85ec1e1 100644 --- a/server/AyaNova/biz/TravelRateBiz.cs +++ b/server/AyaNova/biz/TravelRateBiz.cs @@ -268,6 +268,14 @@ namespace AyaNova.Biz //FOREIGN KEY CHECKS if (await ct.ContractTravelRate.AnyAsync(m => m.TravelRateId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Contract")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.WorkOrderItemTravel.AnyAsync(z => z.TravelRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemTravel")); + if (await ct.QuoteItemTravel.AnyAsync(z => z.TravelRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemTravel")); + if (await ct.PMItemTravel.AnyAsync(z => z.TravelRateId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemTravel")); } diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index 695138a0..23720fdb 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -286,6 +286,20 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("LoanUnit")); if (await ct.CustomerServiceRequest.AnyAsync(z => z.UnitId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("CustomerServiceRequest")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.WorkOrderItemUnit.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemUnit")); + if (await ct.QuoteItemUnit.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemUnit")); + if (await ct.PMItemUnit.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemUnit")); + if (await ct.WorkOrderItemOutsideService.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemOutsideService")); + if (await ct.QuoteItemOutsideService.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemOutsideService")); + if (await ct.PMItemOutsideService.AnyAsync(z => z.UnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemOutsideService")); } diff --git a/server/AyaNova/biz/VendorBiz.cs b/server/AyaNova/biz/VendorBiz.cs index 3f8b185a..c64e26ef 100644 --- a/server/AyaNova/biz/VendorBiz.cs +++ b/server/AyaNova/biz/VendorBiz.cs @@ -284,6 +284,20 @@ namespace AyaNova.Biz if (await ct.PurchaseOrder.AnyAsync(m => m.VendorId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + var quotetext = await Translate("Quote"); + var pmtext = await Translate("PM"); + if (await ct.WorkOrderItemOutsideService.AnyAsync(z => z.VendorSentToId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemOutsideService")); + if (await ct.QuoteItemOutsideService.AnyAsync(z => z.VendorSentToId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemOutsideService")); + if (await ct.PMItemOutsideService.AnyAsync(z => z.VendorSentToId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemOutsideService")); + if (await ct.WorkOrderItemOutsideService.AnyAsync(z => z.VendorSentViaId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItemOutsideService")); + if (await ct.QuoteItemOutsideService.AnyAsync(z => z.VendorSentViaId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", quotetext + " - " + await Translate("WorkOrderItemOutsideService")); + if (await ct.PMItemOutsideService.AnyAsync(z => z.VendorSentViaId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", pmtext + " - " + await Translate("WorkOrderItemOutsideService")); } diff --git a/server/AyaNova/biz/WorkOrderItemPriorityBiz.cs b/server/AyaNova/biz/WorkOrderItemPriorityBiz.cs index d0c97a4c..d906a5a0 100644 --- a/server/AyaNova/biz/WorkOrderItemPriorityBiz.cs +++ b/server/AyaNova/biz/WorkOrderItemPriorityBiz.cs @@ -208,6 +208,10 @@ namespace AyaNova.Biz //FOREIGN KEY CHECKS if (await ct.WorkOrderItem.AnyAsync(m => m.WorkOrderItemPriorityId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItem")); + if (await ct.QuoteItem.AnyAsync(z => z.WorkOrderItemPriorityId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Quote")); + if (await ct.PMItem.AnyAsync(z => z.WorkOrderItemPriorityId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PM")); } diff --git a/server/AyaNova/biz/WorkOrderItemStatusBiz.cs b/server/AyaNova/biz/WorkOrderItemStatusBiz.cs index 6d777fd4..a604c9c9 100644 --- a/server/AyaNova/biz/WorkOrderItemStatusBiz.cs +++ b/server/AyaNova/biz/WorkOrderItemStatusBiz.cs @@ -210,6 +210,10 @@ namespace AyaNova.Biz //FOREIGN KEY CHECKS if (await ct.WorkOrderItem.AnyAsync(m => m.WorkOrderItemStatusId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("WorkOrderItem")); + if (await ct.QuoteItem.AnyAsync(z => z.WorkOrderItemStatusId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Quote")); + if (await ct.PMItem.AnyAsync(z => z.WorkOrderItemStatusId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PM")); }