From 7a76b2e3617031c6666af47475046db119ce8f39 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 19 Feb 2021 18:29:06 +0000 Subject: [PATCH] --- .../GlobalBizSettingsController.cs | 3 ++ server/AyaNova/biz/TaxCodeBiz.cs | 37 +++++++++++++++---- server/AyaNova/models/GlobalBizSettings.cs | 5 +++ server/AyaNova/resource/de.json | 2 +- server/AyaNova/resource/en.json | 2 +- server/AyaNova/resource/es.json | 2 +- server/AyaNova/resource/fr.json | 2 +- server/AyaNova/util/AySchema.cs | 7 +++- .../AyaNova/util/ServerGlobalBizSettings.cs | 16 +++++--- 9 files changed, 56 insertions(+), 20 deletions(-) diff --git a/server/AyaNova/Controllers/GlobalBizSettingsController.cs b/server/AyaNova/Controllers/GlobalBizSettingsController.cs index 849ff938..efe0c158 100644 --- a/server/AyaNova/Controllers/GlobalBizSettingsController.cs +++ b/server/AyaNova/Controllers/GlobalBizSettingsController.cs @@ -110,6 +110,9 @@ namespace AyaNova.Api.Controllers //Actual global settings: SearchCaseSensitiveOnly = AyaNova.Util.ServerGlobalBizSettings.SearchCaseSensitiveOnly, UseInventory = AyaNova.Util.ServerGlobalBizSettings.UseInventory, + DefaultTaxPartSaleId = AyaNova.Util.ServerGlobalBizSettings.TaxPartSaleId, + DefaultTaxPartPurchaseId = AyaNova.Util.ServerGlobalBizSettings.TaxPartPurchaseId, + DefaultTaxRateSaleId = AyaNova.Util.ServerGlobalBizSettings.TaxRateSaleId, //used to drive UI in case of unlicensed or attention required LicenseStatus = AyaNova.Core.License.ActiveKey.Status, MaintenanceExpired = AyaNova.Core.License.ActiveKey.MaintenanceExpired, diff --git a/server/AyaNova/biz/TaxCodeBiz.cs b/server/AyaNova/biz/TaxCodeBiz.cs index e21a4901..c636502a 100644 --- a/server/AyaNova/biz/TaxCodeBiz.cs +++ b/server/AyaNova/biz/TaxCodeBiz.cs @@ -225,18 +225,39 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //VALIDATION // - private async Task ValidateAsync(TaxCode proposedObj, TaxCode currentObj) { bool isNew = currentObj == null; + bool isGlobalDefault = (!isNew + && ServerGlobalBizSettings.TaxPartPurchaseId == proposedObj.Id + || ServerGlobalBizSettings.TaxPartSaleId == proposedObj.Id + || ServerGlobalBizSettings.TaxRateSaleId == proposedObj.Id); + + if (!isNew + && proposedObj.Name != currentObj.Name + || proposedObj.TaxA != currentObj.TaxA + || proposedObj.TaxB != currentObj.TaxB + || proposedObj.TaxOnTax != currentObj.TaxOnTax) + { + //MIGRATE_OUTSTANDING - check workorder records once wo is coded here for this tax code in use + + if (await ct.PurchaseOrderItem.AnyAsync(x => x.PurchaseTaxCodeId == proposedObj.Id)) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + + if (isGlobalDefault) + AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("AdministrationGlobalSettings")); + } + + //Active not changeable for global default + if (isGlobalDefault && proposedObj.Active == false) + AddError(ApiErrorCode.VALIDATION_INVALID_VALUE, "Active", await Translate("TaxCodeDefault")); + //Name required if (string.IsNullOrWhiteSpace(proposedObj.Name)) AddError(ApiErrorCode.VALIDATION_REQUIRED, "Name"); - - //If name is otherwise OK, check that name is unique if (!PropertyHasErrors("Name")) { @@ -247,10 +268,6 @@ namespace AyaNova.Biz } } - //MIGRATE_OUTSTANDING - Biz rule needs porting - //BrokenRules.Assert("DefaultMustBeActive", "TaxCode.Error.Default","Active",value==false && AyaBizUtils.GlobalSettings.TaxCodeIsADefault(this.mID)); - - //Any form customizations to validate? var FormCustomization = await ct.FormCustom.AsNoTracking().SingleOrDefaultAsync(x => x.FormKey == AyaType.TaxCode.ToString()); if (FormCustomization != null) @@ -263,7 +280,6 @@ namespace AyaNova.Biz //validate custom fields CustomFieldsValidator.Validate(this, FormCustomization, proposedObj.CustomFields); } - } private async Task ValidateCanDeleteAsync(TaxCode inObj) @@ -272,6 +288,11 @@ namespace AyaNova.Biz //FOREIGN KEY CHECKS if (await ct.PurchaseOrderItem.AnyAsync(m => m.PurchaseTaxCodeId == inObj.Id)) AddError(ApiErrorCode.VALIDATION_REFERENTIAL_INTEGRITY, "generalerror", await Translate("PurchaseOrder")); + + if (ServerGlobalBizSettings.TaxPartPurchaseId == inObj.Id + || ServerGlobalBizSettings.TaxPartSaleId == inObj.Id + || ServerGlobalBizSettings.TaxRateSaleId == inObj.Id) + AddError(ApiErrorCode.INVALID_OPERATION, "generalerror", await Translate("TaxCodeDefault")); } diff --git a/server/AyaNova/models/GlobalBizSettings.cs b/server/AyaNova/models/GlobalBizSettings.cs index 7b1a6135..7cddd7e2 100644 --- a/server/AyaNova/models/GlobalBizSettings.cs +++ b/server/AyaNova/models/GlobalBizSettings.cs @@ -23,6 +23,11 @@ namespace AyaNova.Models public bool SearchCaseSensitiveOnly { get; set; } public bool UseInventory { get; set; } + //TAX CODE DEFAULTS + public long? TaxPartPurchaseId {get;set;} + public long? TaxPartSaleId {get;set;} + public long? TaxRateSaleId {get;set;} + public GlobalBizSettings() diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 3b828d2f..f164e6b1 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -760,7 +760,7 @@ "PurchaseOrderReceiptItemPurchaseOrderReceiptID": "Einkaufsauftragseingang", "PurchaseOrderReceiptItemQuantityReceived": "Empfangene Menge", "PurchaseOrderReceiptItemQuantityReceivedErrorInvalid": "Der Eintrag muss gleich oder kleiner dem ausstehenden Betrag vom Einkaufsauftrag oder positiv sein", - "PurchaseOrderReceiptItemReceiptCost": "Ist-Kosten", + "PurchaseOrderReceiptItemReceiptCost": "Erhaltene Kosten", "PurchaseOrderReceiptItemReferenceNumber": "Referenz", "PurchaseOrderReceiptItemWarehouseID": "Teilelager", "PurchaseOrderReceiptItemWorkOrderNumber": "Arbeitsauftragsnummer", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 93e37583..74221898 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -760,7 +760,7 @@ "PurchaseOrderReceiptItemPurchaseOrderReceiptID": "Purchase Order Receipt", "PurchaseOrderReceiptItemQuantityReceived": "Quantity Received", "PurchaseOrderReceiptItemQuantityReceivedErrorInvalid": "Entry must be equal or less than outstanding amount from purchase order and non-negative", - "PurchaseOrderReceiptItemReceiptCost": "Actual Cost", + "PurchaseOrderReceiptItemReceiptCost": "Received Cost", "PurchaseOrderReceiptItemReferenceNumber": "Reference", "PurchaseOrderReceiptItemWarehouseID": "Part Warehouse", "PurchaseOrderReceiptItemWorkOrderNumber": "WorkOrder #", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index f8a10c69..63479def 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -759,7 +759,7 @@ "PurchaseOrderReceiptItemPurchaseOrderReceiptID": "Recibo orden de compra", "PurchaseOrderReceiptItemQuantityReceived": "Cantidad recibida", "PurchaseOrderReceiptItemQuantityReceivedErrorInvalid": "La entrada debe ser igual o inferior a la cantidad restante de la orden de compra y no negativa", - "PurchaseOrderReceiptItemReceiptCost": "Coste real", + "PurchaseOrderReceiptItemReceiptCost": "Costo recibido", "PurchaseOrderReceiptItemReferenceNumber": "Referencia", "PurchaseOrderReceiptItemWarehouseID": "Almacén de la pieza", "PurchaseOrderReceiptItemWorkOrderNumber": "Núm. pedido", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index e72d737c..76fa3b93 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -760,7 +760,7 @@ "PurchaseOrderReceiptItemPurchaseOrderReceiptID": "Reçu de bon de commande", "PurchaseOrderReceiptItemQuantityReceived": "Quantité réceptionnée", "PurchaseOrderReceiptItemQuantityReceivedErrorInvalid": "Cette entrée doit être positive et égale ou inférieure à l'encours du bon de commande", - "PurchaseOrderReceiptItemReceiptCost": "Coût réel", + "PurchaseOrderReceiptItemReceiptCost": "Coût reçu", "PurchaseOrderReceiptItemReferenceNumber": "Référence", "PurchaseOrderReceiptItemWarehouseID": "Magasin de pièces", "PurchaseOrderReceiptItemWorkOrderNumber": "Bon de travail n° ", diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index b150f914..d88d4269 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -236,8 +236,11 @@ namespace AyaNova.Util //create global biz settings table await ExecQueryAsync("CREATE TABLE aglobalbizsettings (id INTEGER NOT NULL PRIMARY KEY, " - + "searchcasesensitiveonly BOOL default false, " - + "useinventory BOOL default true " + + "searchcasesensitiveonly BOOL DEFAULT FALSE, " + + "useinventory BOOL DEFAULT TRUE, " + + "taxpartpurchaseid BIGINT, " + + "taxpartsaleid BIGINT, " + + "taxratesaleid BIGINT " + ")"); //create global ops BACKUP settings table diff --git a/server/AyaNova/util/ServerGlobalBizSettings.cs b/server/AyaNova/util/ServerGlobalBizSettings.cs index 1180025a..91b9c605 100644 --- a/server/AyaNova/util/ServerGlobalBizSettings.cs +++ b/server/AyaNova/util/ServerGlobalBizSettings.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; -using System.IO; -using Microsoft.Extensions.Configuration; -using Microsoft.EntityFrameworkCore; using System.Linq; using AyaNova.Models; @@ -18,9 +14,14 @@ namespace AyaNova.Util { internal static bool SearchCaseSensitiveOnly { get; set; } - internal static bool UseInventory {get;set;} + internal static bool UseInventory { get; set; } + //TAX CODE DEFAULTS + internal static long? TaxPartPurchaseId { get; set; } + internal static long? TaxPartSaleId { get; set; } + internal static long? TaxRateSaleId { get; set; } + + - /// /// Populate and / or create the settings @@ -43,6 +44,9 @@ namespace AyaNova.Util //We have the object, now copy the static values here SearchCaseSensitiveOnly = global.SearchCaseSensitiveOnly; UseInventory = global.UseInventory; + TaxPartPurchaseId = global.TaxPartPurchaseId; + TaxPartSaleId = global.TaxPartSaleId; + TaxRateSaleId = global.TaxRateSaleId; }