From fb2fc7adf28f9354b15d9f935d38d1be9c68f429 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 13 Jan 2021 00:42:47 +0000 Subject: [PATCH] --- .../2017-11-22--1_DONEPOandPOReceipt.odt | Bin 0 -> 32171 bytes server/AyaNova/biz/AyaType.cs | 5 +- .../AyaNova/biz/BizObjectExistsInDatabase.cs | 2 + server/AyaNova/biz/BizObjectFactory.cs | 2 + server/AyaNova/biz/BizRoles.cs | 16 ++++++ server/AyaNova/models/AyContext.cs | 2 + server/AyaNova/models/PartAssembly.cs | 47 ++++++++++++++++++ server/AyaNova/models/PartAssemblyItem.cs | 35 +++++++++++++ server/AyaNova/util/AySchema.cs | 13 +++++ 9 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 devdocs/specs/joyce-planning-docs-used/2017-11-22--1_DONEPOandPOReceipt.odt create mode 100644 server/AyaNova/models/PartAssembly.cs create mode 100644 server/AyaNova/models/PartAssemblyItem.cs diff --git a/devdocs/specs/joyce-planning-docs-used/2017-11-22--1_DONEPOandPOReceipt.odt b/devdocs/specs/joyce-planning-docs-used/2017-11-22--1_DONEPOandPOReceipt.odt new file mode 100644 index 0000000000000000000000000000000000000000..d21b61a2c9737ddee2e4f5a93c3d1338b12958b1 GIT binary patch literal 32171 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 z.Id == id); case AyaType.Part: return await ct.Part.AnyAsync(z => z.Id == id); + case AyaType.PartAssembly: + return await ct.PartAssembly.AnyAsync(z => z.Id == id); case AyaType.PM: return await ct.PM.AnyAsync(z => z.Id == id); case AyaType.PMItem: diff --git a/server/AyaNova/biz/BizObjectFactory.cs b/server/AyaNova/biz/BizObjectFactory.cs index 020f7272..842689c1 100644 --- a/server/AyaNova/biz/BizObjectFactory.cs +++ b/server/AyaNova/biz/BizObjectFactory.cs @@ -49,6 +49,8 @@ namespace AyaNova.Biz return new LoanUnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); case AyaType.Part: return new PartBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); + case AyaType.PartAssembly: + return new PartAssemblyBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); case AyaType.PM: return new PMBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles); diff --git a/server/AyaNova/biz/BizRoles.cs b/server/AyaNova/biz/BizRoles.cs index 0a9e4edd..a113f4ff 100644 --- a/server/AyaNova/biz/BizRoles.cs +++ b/server/AyaNova/biz/BizRoles.cs @@ -145,6 +145,22 @@ namespace AyaNova.Biz Select = AuthorizationRoles.All }); + + //////////////////////////////////////////////////////////// + //Part assembly + // + roles.Add(AyaType.PartAssembly, new BizRoleSet() + { + Change = AuthorizationRoles.InventoryFull + | AuthorizationRoles.BizAdminFull + | AuthorizationRoles.AccountingFull, + ReadFullRecord = AuthorizationRoles.DispatchFull + | AuthorizationRoles.InventoryLimited + | AuthorizationRoles.BizAdminLimited + | AuthorizationRoles.DispatchLimited, + Select = AuthorizationRoles.All + }); + ///////////////////////////////////////////////////////////////// //PurchaseOrder // this is also effectively part warehouse inventory control diff --git a/server/AyaNova/models/AyContext.cs b/server/AyaNova/models/AyContext.cs index 43913724..7eace9b2 100644 --- a/server/AyaNova/models/AyContext.cs +++ b/server/AyaNova/models/AyContext.cs @@ -40,6 +40,8 @@ namespace AyaNova.Models public virtual DbSet Notification { get; set; } public virtual DbSet NotifyDeliveryLog { get; set; } public virtual DbSet Part { get; set; } + public virtual DbSet PartAssembly { get; set; } + public virtual DbSet PartAssemblyItem { get; set; } public virtual DbSet PM { get; set; } public virtual DbSet PMItem { get; set; } public virtual DbSet PMTemplate { get; set; } diff --git a/server/AyaNova/models/PartAssembly.cs b/server/AyaNova/models/PartAssembly.cs new file mode 100644 index 00000000..b0422f05 --- /dev/null +++ b/server/AyaNova/models/PartAssembly.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using AyaNova.Biz; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace AyaNova.Models +{ + //NOTE: Any non required field (nullable in DB) sb nullable here, i.e. decimal? not decimal, + //otherwise the server will call it an invalid record if the field isn't sent from client + + public class PartAssembly : ICoreBizObjectModel + { + 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; } + public string Wiki { get; set; } + public string CustomFields { get; set; } + public List Tags { get; set; } + + public PartAssembly() + { + Tags = new List(); + } + + [NotMapped, JsonIgnore] + public AyaType AyaType { get => AyaType.PartAssembly; } + + }//eoc + +}//eons + + +// CREATE TABLE [dbo].[APARTASSEMBLY]( +// [AID] [uniqueidentifier] NOT NULL, +// [ACREATED] [datetime] NULL, +// [AMODIFIED] [datetime] NULL, +// [AACTIVE] [bit] NOT NULL, +// [ACREATOR] [uniqueidentifier] NULL, +// [AMODIFIER] [uniqueidentifier] NULL, +// [ANAME] [nvarchar](255) NULL, +// [ADESCRIPTION] [nvarchar](255) NULL, \ No newline at end of file diff --git a/server/AyaNova/models/PartAssemblyItem.cs b/server/AyaNova/models/PartAssemblyItem.cs new file mode 100644 index 00000000..4a8b0b59 --- /dev/null +++ b/server/AyaNova/models/PartAssemblyItem.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using AyaNova.Biz; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace AyaNova.Models +{ + //NOTE: Any non required field (nullable in DB) sb nullable here, i.e. decimal? not decimal, + //otherwise the server will call it an invalid record if the field isn't sent from client + + public class PartAssemblyItem + { + public long Id { get; set; } + public uint Concurrency { get; set; } + + //Principle + [Required] + public long PartAssemblyId { get; set; }//fk + // public PartAssembly PartAssembly { get; set; } //FOR NOW COMMENTINGH OUT THESE CONVENIENCE REFERENCES UNCOMMENT IF NEED LATER COULD BE YAGNI + + public long PartId { get; set; }//fk + //public Part Part { get; set; } + + public PartAssemblyItem() + { + + } + + + + }//eoc + +}//eons \ No newline at end of file diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index fd15f7ea..33a4b8cd 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -392,6 +392,7 @@ BEGIN when 62 then aytable = 'aservicerate'; when 63 then aytable = 'atravelrate'; when 64 then aytable = 'ataxcode'; + when 65 then aytable = 'apartassembly'; else RETURN format('??PUBLIC.AYGETNAME-UNKNOWN_TYPE:%S',ayobjecttype);-- This should not happen unless dev forgot to update this end case; @@ -684,6 +685,18 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); await ExecQueryAsync("CREATE UNIQUE INDEX apart_name_id_idx ON apart (id, name);"); await ExecQueryAsync("CREATE INDEX apart_tags ON apart using GIN(tags)"); + //PARTASSEMBLY + await ExecQueryAsync("CREATE TABLE apart (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text not null unique, active bool not null, " + + "notes text, wiki text, customfields text, tags varchar(255) ARRAY )"); + await ExecQueryAsync("CREATE UNIQUE INDEX apart_name_id_idx ON apart (id, name);"); + await ExecQueryAsync("CREATE INDEX apart_tags ON apart using GIN(tags)"); + + //PARTASSEMBLYITEM + await ExecQueryAsync("CREATE TABLE apartassemblyitem (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, partassemblyid bigint not null REFERENCES apartassembly, " + + "key text not null, display text not null)"); + + + //PROJECT await ExecQueryAsync("CREATE TABLE aproject (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text not null unique, active bool not null, " + "notes text, wiki text, customfields text, tags varchar(255) ARRAY, " +