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 00000000..d21b61a2 Binary files /dev/null and b/devdocs/specs/joyce-planning-docs-used/2017-11-22--1_DONEPOandPOReceipt.odt differ diff --git a/server/AyaNova/biz/AyaType.cs b/server/AyaNova/biz/AyaType.cs index 5f191f9a..17216d8c 100644 --- a/server/AyaNova/biz/AyaType.cs +++ b/server/AyaNova/biz/AyaType.cs @@ -128,7 +128,10 @@ namespace AyaNova.Biz [CoreBizObject] TravelRate = 63, [CoreBizObject] - TaxCode = 64 + TaxCode = 64, + [CoreBizObject] + PartAssembly = 65 + diff --git a/server/AyaNova/biz/BizObjectExistsInDatabase.cs b/server/AyaNova/biz/BizObjectExistsInDatabase.cs index 1f0f6aaa..808be436 100644 --- a/server/AyaNova/biz/BizObjectExistsInDatabase.cs +++ b/server/AyaNova/biz/BizObjectExistsInDatabase.cs @@ -48,6 +48,8 @@ namespace AyaNova.Biz return await ct.Memo.AnyAsync(z => 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, " +