diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index b32236a6..4d878a11 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -156,7 +156,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; if (HasErrors) @@ -255,9 +255,13 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(Contract inObj) + private async Task ValidateCanDeleteAsync(Contract inObj) { - //whatever needs to be check to delete this object + //FOREIGN KEY CHECKS + if (await ct.Customer.AnyAsync(m => m.ContractId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Customer")); + if (await ct.HeadOffice.AnyAsync(m => m.ContractId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("HeadOffice")); } diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 9459751e..be3da4c4 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -120,10 +120,10 @@ namespace AyaNova.Biz AddError(ApiErrorCode.CONCURRENCY_CONFLICT); return null; } - + putObject.Tags = TagBiz.NormalizeTags(putObject.Tags); putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields); - await ValidateAsync(putObject, dbObject); + await ValidateAsync(putObject, dbObject); if (HasErrors) return null; ct.Replace(dbObject, putObject); try @@ -335,14 +335,12 @@ namespace AyaNova.Biz - //Referential integrity error - //Just an example - // if (await ct.User.AnyAsync(z => z.CustomerId == inObj.Id) == true) - // { - // //Note: errorbox will ensure it appears in the general errror box and not field specific - // //the translation key is to indicate what the linked object is that is causing the error - // AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", "LT:Contact"); - // } + //FOREIGN KEY CHECKS + if (await ct.User.AnyAsync(m => m.CustomerId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("User")); + if (await ct.Unit.AnyAsync(m => m.CustomerId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Unit")); + await Task.CompletedTask; } diff --git a/server/AyaNova/biz/HeadOfficeBiz.cs b/server/AyaNova/biz/HeadOfficeBiz.cs index 38417cdc..d86815d6 100644 --- a/server/AyaNova/biz/HeadOfficeBiz.cs +++ b/server/AyaNova/biz/HeadOfficeBiz.cs @@ -300,12 +300,11 @@ namespace AyaNova.Biz private async Task ValidateCanDeleteAsync(HeadOffice inObj) { //Referential integrity + //FOREIGN KEY CHECKS + if (await ct.User.AnyAsync(m => m.HeadOfficeId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("User")); if (await ct.Customer.AnyAsync(z => z.HeadOfficeId == inObj.Id) == true) - { - //Note: errorbox will ensure it appears in the general errror box and not field specific - //the translation key is to indicate what the linked object is that is causing the error AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Customer")); - } } diff --git a/server/AyaNova/biz/PartBiz.cs b/server/AyaNova/biz/PartBiz.cs index cab8717a..9d9e9cdb 100644 --- a/server/AyaNova/biz/PartBiz.cs +++ b/server/AyaNova/biz/PartBiz.cs @@ -160,7 +160,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; if (HasErrors) @@ -399,9 +399,20 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(Part inObj) + + private async Task ValidateCanDeleteAsync(Part inObj) { - //whatever needs to be check to delete this object + //Referential integrity + //FOREIGN KEY CHECKS + if (await ct.PartSerial.AnyAsync(m => m.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartSerial")); + if (await ct.PartAssemblyItem.AnyAsync(z => z.PartId == inObj.Id) == true) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartAssembly")); + if (await ct.PartInventory.AnyAsync(z => z.PartId == inObj.Id) == true) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartInventoryList"));//translates to "Part inventory" + if (await ct.PartStockLevel.AnyAsync(m => m.PartId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartStockingLevels")); + } diff --git a/server/AyaNova/biz/PartWarehouseBiz.cs b/server/AyaNova/biz/PartWarehouseBiz.cs index 139c3278..9c348251 100644 --- a/server/AyaNova/biz/PartWarehouseBiz.cs +++ b/server/AyaNova/biz/PartWarehouseBiz.cs @@ -160,7 +160,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - await ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; ct.PartWarehouse.Remove(dbObject); @@ -257,24 +257,20 @@ namespace AyaNova.Biz } } - private async Task ValidateCanDelete(PartWarehouse inObj) - { - //Can't delete the default warehouse + + private async Task ValidateCanDeleteAsync(PartWarehouse inObj) + {//Can't delete the default warehouse if (inObj.Id == 1) { AddError(ApiErrorCode.INVALID_OPERATION, "generalerror", "Default part warehouse can not be deleted"); return;//nothing more need be checked this is completetly disqualifying } - - //FOREIGN KEY CHECKS - - //PartInventory record? + //Referential integrity if (await ct.PartInventory.AnyAsync(m => m.PartWarehouseId == inObj.Id)) - { AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartInventoryTransaction")); - - } + if (await ct.PartStockLevel.AnyAsync(m => m.PartWarehouseId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PartStockingLevels")); } diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index 040aa480..35cb8ce8 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -160,7 +160,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - await ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; if (HasErrors) @@ -271,16 +271,15 @@ namespace AyaNova.Biz } - private async Task ValidateCanDelete(Unit inObj) + private async Task ValidateCanDeleteAsync(Unit inObj) { - //whatever needs to be check to delete this object - - //Can't delete a unit if it's a shadow unit for a loanunit + //FOREIGN KEY CHECKS + if (await ct.Unit.AnyAsync(m => m.ParentUnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("UnitParentUnitID")); + if (await ct.Unit.AnyAsync(m => m.ReplacedByUnitId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("UnitReplacedByUnitID")); if (await ct.LoanUnit.AnyAsync(z => z.UnitId == inObj.Id)) - { AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("LoanUnit")); - } - } diff --git a/server/AyaNova/biz/UnitModelBiz.cs b/server/AyaNova/biz/UnitModelBiz.cs index d6428d04..f1917e4e 100644 --- a/server/AyaNova/biz/UnitModelBiz.cs +++ b/server/AyaNova/biz/UnitModelBiz.cs @@ -172,7 +172,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; if (HasErrors) @@ -264,11 +264,14 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(UnitModel inObj) - { - //whatever needs to be check to delete this object - } + private async Task ValidateCanDeleteAsync(UnitModel inObj) + { + //FOREIGN KEY CHECKS + if (await ct.Unit.AnyAsync(m => m.UnitModelId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Unit")); + + } //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/server/AyaNova/biz/VendorBiz.cs b/server/AyaNova/biz/VendorBiz.cs index 7b46dec2..1ab0d885 100644 --- a/server/AyaNova/biz/VendorBiz.cs +++ b/server/AyaNova/biz/VendorBiz.cs @@ -160,7 +160,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.NOT_FOUND); return false; } - ValidateCanDelete(dbObject); + await ValidateCanDeleteAsync(dbObject); if (HasErrors) return false; ct.Vendor.Remove(dbObject); @@ -282,9 +282,24 @@ namespace AyaNova.Biz } - private void ValidateCanDelete(Vendor inObj) + + private async Task ValidateCanDeleteAsync(Vendor inObj) { - //whatever needs to be check to delete this object + //Referential integrity + //FOREIGN KEY CHECKS + if (await ct.User.AnyAsync(m => m.VendorId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("User")); + if (await ct.UnitModel.AnyAsync(m => m.VendorId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("UnitModel")); + if (await ct.Unit.AnyAsync(m => m.PurchasedFromVendorId == inObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Unit")); + //part has three potential references, if any match that's good enough since it's the same message + if (await ct.Part.AnyAsync(z => z.ManufacturerId == inObj.Id) == true) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Part")); + else if (await ct.Part.AnyAsync(z => z.WholeSalerId == inObj.Id) == true) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Part")); + else if (await ct.Part.AnyAsync(z => z.AlternativeWholeSalerId == inObj.Id) == true) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("Part")); } diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 97ad8da8..5bc4bad7 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -499,7 +499,6 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); await ExecQueryAsync("CREATE TABLE aopsjob (gid uuid PRIMARY KEY, name TEXT NOT NULL, created TIMESTAMP NOT NULL, exclusive BOOL NOT NULL, " + "startafter TIMESTAMP NOT NULL, jobtype INTEGER NOT NULL, subtype INTEGER, objectid BIGINT, objecttype INTEGER, jobstatus INTEGER NOT NULL, jobinfo TEXT)"); await ExecQueryAsync("CREATE TABLE aopsjoblog (gid uuid PRIMARY KEY, jobid uuid NOT NULL, created TIMESTAMP NOT NULL, statustext TEXT NOT NULL)"); - // REFERENCES aopsjob (gid) took this out to allow for internal job logs with guid.empty and no parent job as there seems no need anyway await SetSchemaLevelAsync(++currentSchema); }