From 13f04cffbfd00af2a79983b1f8398c4b08928f97 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 18 Jan 2021 20:12:41 +0000 Subject: [PATCH] --- .vscode/launch.json | 2 +- ...2014-06-24--partsinventoryoverviewDONE.odt | Bin 33624 -> 33689 bytes server/AyaNova/biz/PartAssemblyBiz.cs | 11 ++++++++++- server/AyaNova/models/PartAssemblyItem.cs | 6 +++++- server/AyaNova/util/AySchema.cs | 2 +- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0e2049e9..8fd97968 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": "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/devdocs/specs/joyce-planning-docs-used/2014-06-24--partsinventoryoverviewDONE.odt b/devdocs/specs/joyce-planning-docs-used/2014-06-24--partsinventoryoverviewDONE.odt index ef72b79af2d7ea9d14cad18ddb207660ea45a911..b1422850883a227a86ad0ed720652244d824e6e8 100644 GIT binary patch delta 16591 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 G(fVH($ht28 delta 16646 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 PL3{s|z9&re`RM&GLxt9h diff --git a/server/AyaNova/biz/PartAssemblyBiz.cs b/server/AyaNova/biz/PartAssemblyBiz.cs index 0adba8bd..9307fb07 100644 --- a/server/AyaNova/biz/PartAssemblyBiz.cs +++ b/server/AyaNova/biz/PartAssemblyBiz.cs @@ -109,7 +109,7 @@ namespace AyaNova.Biz if (logTheGetEvent && ret != null) await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); - if (populatePartNames && ret.Items!=null && ret.Items.Count > 0) + if (populatePartNames && ret.Items != null && ret.Items.Count > 0) { var partIdList = ret.Items.Select(z => z.PartId).ToArray(); var PickList = PickListFactory.GetAyaPickList(AyaType.Part); @@ -265,6 +265,15 @@ namespace AyaNova.Biz if (proposedObj.Items.GroupBy(z => z.PartId).Any(g => g.Count() > 1)) { AddError(ApiErrorCode.VALIDATION_FAILED, "Items", "Duplicate parts are not allowed in the items collection"); + return; + } + + //Make sure there are no < 1 quantities and if there are make them 1 rather than reporting a broken rule + //(decided this based on UI and likelyhood etc it woudl be hard to show this as a biz rule with the simple UI for it) + foreach (var pai in proposedObj.Items) + { + if (pai.Quantity < 1) + pai.Quantity = 1; } //Any form customizations to validate? diff --git a/server/AyaNova/models/PartAssemblyItem.cs b/server/AyaNova/models/PartAssemblyItem.cs index 65194880..ab566c39 100644 --- a/server/AyaNova/models/PartAssemblyItem.cs +++ b/server/AyaNova/models/PartAssemblyItem.cs @@ -12,12 +12,16 @@ namespace AyaNova.Models [Required] public long PartAssemblyId { get; set; } + [Required] public long PartId { get; set; } + [Required] + public decimal Quantity { get; set; } + [JsonIgnore] public PartAssembly PartAssembly { get; set; } [NotMapped] - public string PartDisplay {get;set;} + public string PartDisplay { get; set; } }//eoc diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 67817460..09d6c1b5 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -671,7 +671,7 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); //PARTASSEMBLYITEM await ExecQueryAsync("CREATE TABLE apartassemblyitem (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, partassemblyid bigint not null REFERENCES apartassembly on delete cascade, " + - "partid bigint not null REFERENCES apart, " + + "partid bigint not null REFERENCES apart, quantity decimal(19,4) not null default 1, " + "CONSTRAINT UNQ_PartAssemblyPart UNIQUE (partid, partassemblyid) " +//ensure no duplicate parts in the same assembly ")"); // await ExecQueryAsync("CREATE INDEX idx_apartassemblyitem_partid ON apartassemblyitem(partid)");