From 0a9d1fcbef250eae935682513bea521d2e8d982e Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 14 Oct 2021 23:19:12 +0000 Subject: [PATCH] case 3999 --- .vscode/launch.json | 2 +- server/AyaNova/DataList/UnitDataList.cs | 2 +- server/AyaNova/DataList/UnitModelDataList.cs | 18 +++++-------- server/AyaNova/PickList/UnitModelPickList.cs | 20 ++++----------- server/AyaNova/PickList/UnitPickList.cs | 12 ++------- server/AyaNova/biz/FormFieldReference.cs | 3 --- server/AyaNova/biz/PMBiz.cs | 4 +-- server/AyaNova/biz/QuoteBiz.cs | 4 +-- server/AyaNova/biz/UnitModelBiz.cs | 27 +++++++++----------- server/AyaNova/biz/WorkOrderBiz.cs | 5 ++-- server/AyaNova/models/PMItemUnit.cs | 3 +-- server/AyaNova/models/QuoteItemUnit.cs | 3 +-- server/AyaNova/models/UnitModel.cs | 4 +-- server/AyaNova/models/WorkOrderItemUnit.cs | 3 +-- server/AyaNova/util/AySchema.cs | 14 +++++----- server/AyaNova/util/Seeder.cs | 7 ++--- 16 files changed, 46 insertions(+), 85 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index f92c39ec..976f60e9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -52,7 +52,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": "false", + "AYANOVA_SERVER_TEST_MODE": "true", "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/DataList/UnitDataList.cs b/server/AyaNova/DataList/UnitDataList.cs index e877e9ff..34d6306b 100644 --- a/server/AyaNova/DataList/UnitDataList.cs +++ b/server/AyaNova/DataList/UnitDataList.cs @@ -127,7 +127,7 @@ LEFT JOIN LATERAL UiFieldDataType = (int)UiFieldDataType.Text, AType = (int)AyaType.UnitModel, SqlIdColumnName = "aunitmodel.id", - SqlValueColumnName = "aunitmodel.number" + SqlValueColumnName = "aunitmodel.name" }); FieldDefinitions.Add(new DataListFieldDefinition diff --git a/server/AyaNova/DataList/UnitModelDataList.cs b/server/AyaNova/DataList/UnitModelDataList.cs index aecd623d..56a96103 100644 --- a/server/AyaNova/DataList/UnitModelDataList.cs +++ b/server/AyaNova/DataList/UnitModelDataList.cs @@ -10,28 +10,22 @@ namespace AyaNova.DataList SQLFrom = "from aunitmodel left join avendor on (aunitmodel.vendorid=avendor.id)"; var RoleSet = BizRoles.GetRoleSet(DefaultListAType); AllowedRoles = RoleSet.ReadFullRecord | RoleSet.Change; - DefaultColumns = new List() { "UnitModelModelNumber", "Name", "UnitModelVendorID", "Active" }; - DefaultSortBy = new Dictionary() { { "UnitModelModelNumber", "+" } }; + DefaultColumns = new List() { "UnitModelName", "UnitModelVendorID", "Active" }; + DefaultSortBy = new Dictionary() { { "UnitModelName", "+" } }; FieldDefinitions = new List(); FieldDefinitions.Add(new DataListFieldDefinition { - TKey = "UnitModelModelNumber", - FieldKey = "UnitModelModelNumber", + TKey = "UnitModelName", + FieldKey = "UnitModelName", AType = (int)AyaType.UnitModel, UiFieldDataType = (int)UiFieldDataType.Text, SqlIdColumnName = "aunitmodel.id", - SqlValueColumnName = "aunitmodel.number", + SqlValueColumnName = "aunitmodel.name", IsRowId = true }); - FieldDefinitions.Add(new DataListFieldDefinition - { - TKey = "Name", - FieldKey = "Name", - UiFieldDataType = (int)UiFieldDataType.Text, - SqlValueColumnName = "aunitmodel.name" - }); + FieldDefinitions.Add(new DataListFieldDefinition { diff --git a/server/AyaNova/PickList/UnitModelPickList.cs b/server/AyaNova/PickList/UnitModelPickList.cs index fadc3b09..87729321 100644 --- a/server/AyaNova/PickList/UnitModelPickList.cs +++ b/server/AyaNova/PickList/UnitModelPickList.cs @@ -15,12 +15,10 @@ namespace AyaNova.PickList dynamic cm = null; cm = new JObject(); - cm.fld = "UnitModelModelNumber"; + cm.fld = "UnitModelName"; dTemplate.Add(cm); - cm = new JObject(); - cm.fld = "Name"; - dTemplate.Add(cm); + cm = new JObject(); cm.fld = "UnitModelVendorID"; @@ -45,22 +43,14 @@ namespace AyaNova.PickList ColumnDefinitions.Add(new AyaPickListFieldDefinition { - TKey = "UnitModelModelNumber", - FieldKey = "UnitModelModelNumber", + TKey = "UnitModelName", + FieldKey = "UnitModelName", ColumnDataType = UiFieldDataType.Text, SqlIdColumnName = "aunitmodel.id", - SqlValueColumnName = "aunitmodel.number", + SqlValueColumnName = "aunitmodel.name", IsRowId = true }); - ColumnDefinitions.Add(new AyaPickListFieldDefinition - { - TKey = "Name", - FieldKey = "Name", - ColumnDataType = UiFieldDataType.Text, - SqlValueColumnName = "aunitmodel.name" - }); - ColumnDefinitions.Add(new AyaPickListFieldDefinition { diff --git a/server/AyaNova/PickList/UnitPickList.cs b/server/AyaNova/PickList/UnitPickList.cs index 654f9d34..62b7698f 100644 --- a/server/AyaNova/PickList/UnitPickList.cs +++ b/server/AyaNova/PickList/UnitPickList.cs @@ -22,7 +22,7 @@ namespace AyaNova.PickList dTemplate.Add(cm); cm = new JObject(); - cm.fld = "UnitModelModelNumber"; + cm.fld = "UnitModelName"; dTemplate.Add(cm); cm = new JObject(); @@ -56,15 +56,6 @@ namespace AyaNova.PickList IsRowId = true }); - ColumnDefinitions.Add(new AyaPickListFieldDefinition - { - FieldKey = "UnitModelModelNumber", - TKey = "UnitModelModelNumber", - ColumnDataType = UiFieldDataType.Text, - SqlIdColumnName = "aunitmodel.id", - SqlValueColumnName = "aunitmodel.number" - }); - ColumnDefinitions.Add(new AyaPickListFieldDefinition { FieldKey = "UnitModelName", @@ -74,6 +65,7 @@ namespace AyaNova.PickList SqlValueColumnName = "aunitmodel.name" }); + ColumnDefinitions.Add(new AyaPickListFieldDefinition { FieldKey = "UnitModelVendorID", diff --git a/server/AyaNova/biz/FormFieldReference.cs b/server/AyaNova/biz/FormFieldReference.cs index a39b5fe9..cf55ec3e 100644 --- a/server/AyaNova/biz/FormFieldReference.cs +++ b/server/AyaNova/biz/FormFieldReference.cs @@ -898,7 +898,6 @@ namespace AyaNova.Biz //WORKORDER ITEM UNIT l.Add(new FormField { TKey = "WorkOrderItemUnitNotes", FieldKey = "WorkOrderItemUnitNotes", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "Unit", FieldKey = "WorkOrderItemUnit", TKeySection = "WorkOrderItemUnit" }); - l.Add(new FormField { TKey = "UnitModelModelNumber", FieldKey = "UnitModelModelNumber", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelVendorID", FieldKey = "UnitModelVendorID", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelName", FieldKey = "UnitModelName", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitDescription", FieldKey = "UnitDescription", TKeySection = "WorkOrderItemUnit" }); @@ -1159,7 +1158,6 @@ namespace AyaNova.Biz //WORKORDER ITEM UNIT l.Add(new FormField { TKey = "WorkOrderItemUnitNotes", FieldKey = "WorkOrderItemUnitNotes", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "Unit", FieldKey = "WorkOrderItemUnit", TKeySection = "WorkOrderItemUnit" }); - l.Add(new FormField { TKey = "UnitModelModelNumber", FieldKey = "UnitModelModelNumber", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelVendorID", FieldKey = "UnitModelVendorID", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelName", FieldKey = "UnitModelName", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitDescription", FieldKey = "UnitDescription", TKeySection = "WorkOrderItemUnit" }); @@ -1452,7 +1450,6 @@ namespace AyaNova.Biz //WORKORDER ITEM UNIT l.Add(new FormField { TKey = "WorkOrderItemUnitNotes", FieldKey = "WorkOrderItemUnitNotes", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "Unit", FieldKey = "WorkOrderItemUnit", TKeySection = "WorkOrderItemUnit" }); - l.Add(new FormField { TKey = "UnitModelModelNumber", FieldKey = "UnitModelModelNumber", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelVendorID", FieldKey = "UnitModelVendorID", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitModelName", FieldKey = "UnitModelName", TKeySection = "WorkOrderItemUnit" }); l.Add(new FormField { TKey = "UnitDescription", FieldKey = "UnitDescription", TKeySection = "WorkOrderItemUnit" }); diff --git a/server/AyaNova/biz/PMBiz.cs b/server/AyaNova/biz/PMBiz.cs index 428327a8..6c770624 100644 --- a/server/AyaNova/biz/PMBiz.cs +++ b/server/AyaNova/biz/PMBiz.cs @@ -4337,9 +4337,9 @@ namespace AyaNova.Biz if (unitInfo.UnitModelId != null) { - var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId, x.Number }).FirstOrDefaultAsync(); + var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId }).FirstOrDefaultAsync(); o.UnitModelNameViz = unitModelInfo.Name; - o.UnitModelModelNumberViz = unitModelInfo.Number; + if (unitModelInfo.VendorId != null) o.UnitModelVendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == unitModelInfo.VendorId).Select(x => x.Name).FirstOrDefaultAsync(); diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index 17db5c4c..320d77c6 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -4652,9 +4652,9 @@ namespace AyaNova.Biz if (unitInfo.UnitModelId != null) { - var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId, x.Number }).FirstOrDefaultAsync(); + var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId }).FirstOrDefaultAsync(); o.UnitModelNameViz = unitModelInfo.Name; - o.UnitModelModelNumberViz = unitModelInfo.Number; + if (unitModelInfo.VendorId != null) o.UnitModelVendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == unitModelInfo.VendorId).Select(x => x.Name).FirstOrDefaultAsync(); diff --git a/server/AyaNova/biz/UnitModelBiz.cs b/server/AyaNova/biz/UnitModelBiz.cs index 6016c799..e124b334 100644 --- a/server/AyaNova/biz/UnitModelBiz.cs +++ b/server/AyaNova/biz/UnitModelBiz.cs @@ -213,8 +213,7 @@ namespace AyaNova.Biz { if (obj != null) searchParams.AddText(obj.Notes) - .AddText(obj.Name) - .AddText(obj.Number) + .AddText(obj.Name) .AddText(obj.UPC) .AddText(obj.WarrantyTerms) .AddText(obj.Wiki) @@ -233,23 +232,21 @@ namespace AyaNova.Biz bool isNew = currentObj == null; - //## Name is not required nor required to be unique for a UnitModel so no validation for that here - //number is required but also not necessarily unique as two manufacturers could have the same model number for different products - //However, a number and vendorid combo must be unique as it's considered that the same vendor would not have two models with identical numbers + //Name required + if (string.IsNullOrWhiteSpace(proposedObj.Name)) + AddError(ApiErrorCode.VALIDATION_REQUIRED, "Name"); - //Number required - if (string.IsNullOrWhiteSpace(proposedObj.Number)) - { - AddError(ApiErrorCode.VALIDATION_REQUIRED, "Number"); - return;//this is disqualifying outright so no need to check further rules - } - //If Number is otherwise OK, check CONSTRAINT UNQ_UnitModelNumberVendorId UNIQUE (number, vendorid) - if (await ct.UnitModel.AnyAsync(m => m.Number == proposedObj.Number && m.VendorId == proposedObj.VendorId && m.Id != proposedObj.Id)) + //If name is otherwise OK, check that name is unique + if (!PropertyHasErrors("Name")) { - AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Number", "Model number + Vendor must be unique"); - return;//this is disqualifying outright so no need to check further rules + //Use Any command is efficient way to check existance, it doesn't return the record, just a true or false + if (await ct.UnitModel.AnyAsync(z => z.Name == proposedObj.Name && z.Id != proposedObj.Id)) + { + AddError(ApiErrorCode.VALIDATION_NOT_UNIQUE, "Name"); + } } + //Any form customizations to validate? var FormCustomization = await ct.FormCustom.AsNoTracking().SingleOrDefaultAsync(z => z.FormKey == AyaType.UnitModel.ToString()); diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index fe938bbd..0b6098f3 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -6063,9 +6063,8 @@ namespace AyaNova.Biz } if (unitInfo.UnitModelId != null) { - var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId, x.Number }).FirstOrDefaultAsync(); - o.UnitModelNameViz = unitModelInfo.Name; - o.UnitModelModelNumberViz = unitModelInfo.Number; + var unitModelInfo = await ct.UnitModel.AsNoTracking().Where(x => x.Id == unitInfo.UnitModelId).Select(x => new { x.Name, x.VendorId }).FirstOrDefaultAsync(); + o.UnitModelNameViz = unitModelInfo.Name; if (unitModelInfo.VendorId != null) o.UnitModelVendorViz = await ct.Vendor.AsNoTracking().Where(x => x.Id == unitModelInfo.VendorId).Select(x => x.Name).FirstOrDefaultAsync(); diff --git a/server/AyaNova/models/PMItemUnit.cs b/server/AyaNova/models/PMItemUnit.cs index 9f5639ec..786625d3 100644 --- a/server/AyaNova/models/PMItemUnit.cs +++ b/server/AyaNova/models/PMItemUnit.cs @@ -29,8 +29,7 @@ namespace AyaNova.Models public string UnitModelNameViz { get; set; } [NotMapped] public string UnitModelVendorViz { get; set; } - [NotMapped] - public string UnitModelModelNumberViz { get; set; } + [NotMapped] public string UnitDescriptionViz { get; set; } diff --git a/server/AyaNova/models/QuoteItemUnit.cs b/server/AyaNova/models/QuoteItemUnit.cs index 4a86a128..fb581a59 100644 --- a/server/AyaNova/models/QuoteItemUnit.cs +++ b/server/AyaNova/models/QuoteItemUnit.cs @@ -29,8 +29,7 @@ namespace AyaNova.Models public string UnitModelNameViz { get; set; } [NotMapped] public string UnitModelVendorViz { get; set; } - [NotMapped] - public string UnitModelModelNumberViz { get; set; } + [NotMapped] public string UnitDescriptionViz { get; set; } diff --git a/server/AyaNova/models/UnitModel.cs b/server/AyaNova/models/UnitModel.cs index f899ff3f..81671236 100644 --- a/server/AyaNova/models/UnitModel.cs +++ b/server/AyaNova/models/UnitModel.cs @@ -15,7 +15,7 @@ namespace AyaNova.Models public long Id { get; set; } public uint Concurrency { get; set; } - + [Required] public string Name { get; set; } public bool Active { get; set; } public string Notes { get; set; } @@ -23,8 +23,6 @@ namespace AyaNova.Models public string CustomFields { get; set; } public List Tags { get; set; } - [Required] - public string Number { get; set; } public long? VendorId { get; set; } [NotMapped] public string VendorViz { get; set; } diff --git a/server/AyaNova/models/WorkOrderItemUnit.cs b/server/AyaNova/models/WorkOrderItemUnit.cs index 8a086beb..c51a50fa 100644 --- a/server/AyaNova/models/WorkOrderItemUnit.cs +++ b/server/AyaNova/models/WorkOrderItemUnit.cs @@ -29,8 +29,7 @@ namespace AyaNova.Models public string UnitModelNameViz { get; set; } [NotMapped] public string UnitModelVendorViz { get; set; } - [NotMapped] - public string UnitModelModelNumberViz { get; set; } + [NotMapped] public string UnitDescriptionViz { get; set; } [NotMapped] diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 42a5445b..aa38cbb3 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -22,8 +22,8 @@ namespace AyaNova.Util //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImportingAsync WHEN NEW TABLES ADDED!!!! private const int DESIRED_SCHEMA_LEVEL = 1; - internal const long EXPECTED_COLUMN_COUNT = 1301; - internal const long EXPECTED_INDEX_COUNT = 147; + internal const long EXPECTED_COLUMN_COUNT = 1300; + internal const long EXPECTED_INDEX_COUNT = 146; internal const long EXPECTED_CHECK_CONSTRAINTS = 517; internal const long EXPECTED_FOREIGN_KEY_CONSTRAINTS = 193; internal const long EXPECTED_VIEWS = 11; @@ -31,7 +31,7 @@ namespace AyaNova.Util //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImportingAsync WHEN NEW TABLES ADDED!!!! - ///////////////////////////////////////////////////////////////// C1301:I147:CC517:FC193:V11:R2 + ///////////////////////////////////////////////////////////////// C1300:I146:CC517:FC193:V11:R2 @@ -399,7 +399,7 @@ BEGIN when 29 then return 'LT:WorkOrderItemLoan'; when 30 then return 'LT:WorkOrderItemPart'; when 31 then aytable = 'aunit'; aynamecolumn = 'serial'; - when 32 then aytable = 'aunitmodel'; aynamecolumn = 'number'; + when 32 then aytable = 'aunitmodel'; aynamecolumn = 'name'; when 33 then aytable = 'avendor'; when 34 then aytable = 'aworkorder'; aynamecolumn = 'serial'; when 35 then return 'LT:WorkOrderItem'; @@ -732,10 +732,10 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); //UNITMODEL - await ExecQueryAsync("CREATE TABLE aunitmodel (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name TEXT NULL, active BOOL NOT NULL, " + await ExecQueryAsync("CREATE TABLE aunitmodel (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name TEXT NOT NULL, active BOOL NOT NULL, " + "notes TEXT, wiki TEXT, customfields TEXT, tags VARCHAR(255) ARRAY, " - + "number TEXT NOT NULL, vendorid BIGINT NULL REFERENCES avendor(id), upc TEXT NULL, lifetimewarranty BOOL NOT NULL, introduceddate TIMESTAMP NULL, " - + "discontinued BOOL NOT NULL, discontinueddate TIMESTAMP NULL, warrantylength INTEGER NULL, warrantyterms TEXT NULL, CONSTRAINT UNQ_UnitModelNumberVendorId UNIQUE (number, vendorid) " + + "vendorid BIGINT NULL REFERENCES avendor(id), upc TEXT NULL, lifetimewarranty BOOL NOT NULL, introduceddate TIMESTAMP NULL, " + + "discontinued BOOL NOT NULL, discontinueddate TIMESTAMP NULL, warrantylength INTEGER NULL, warrantyterms TEXT NULL " + ")"); diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 2ab0573d..59dc178b 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -2143,13 +2143,10 @@ namespace AyaNova.Util do { - o.Name = $"{Fake.Vehicle.Model()} {Fake.Commerce.Categories(1)[0]}"; + o.Name = $"{Fake.Vehicle.Model()} {Fake.Commerce.Categories(1)[0]} - {Fake.Finance.Account(6)}"; } while (!HashUnitModelNames.Add(o.Name)); - do - { - o.Number = Fake.Finance.Account(6); - } while (!HashUnitModelNames.Add(o.Number)); + o.Active = true; o.Notes = Fake.Lorem.Sentence();