diff --git a/server/AyaNova/biz/AyaType.cs b/server/AyaNova/biz/AyaType.cs index 159e999d..c3f625a0 100644 --- a/server/AyaNova/biz/AyaType.cs +++ b/server/AyaNova/biz/AyaType.cs @@ -137,7 +137,8 @@ namespace AyaNova.Biz DataListColumnView = 68, PartInventoryRestock = 69,//for list only, synthetic object PartInventoryRequest = 70,//for list only not, synthetic object - WorkOrderStatus = 71 + WorkOrderStatus = 71, + TaskGroup = 72 diff --git a/server/AyaNova/biz/WorkorderItemTaskCompletionType.cs b/server/AyaNova/biz/WorkorderItemTaskCompletionType.cs new file mode 100644 index 00000000..0d5dc668 --- /dev/null +++ b/server/AyaNova/biz/WorkorderItemTaskCompletionType.cs @@ -0,0 +1,22 @@ +namespace AyaNova.Biz +{ + /// + /// Indicates status of task + /// + public enum WorkorderItemTaskCompletionType : int + { + /// + /// Not finished + /// + Incomplete = 1, + /// + /// Finished + /// + Complete = 2, + /// + /// Not relevant + /// + NotApplicable = 3 + } + +}//eons \ No newline at end of file diff --git a/server/AyaNova/models/AyContext.cs b/server/AyaNova/models/AyContext.cs index 0aaadf03..75a9b231 100644 --- a/server/AyaNova/models/AyContext.cs +++ b/server/AyaNova/models/AyContext.cs @@ -70,7 +70,8 @@ namespace AyaNova.Models public virtual DbSet ServiceRate { get; set; } public virtual DbSet TravelRate { get; set; } public virtual DbSet CustomerServiceRequest { get; set; } - + public virtual DbSet TaskGroup { get; set; } + public virtual DbSet TaskGroupItem { get; set; } //WorkOrder diff --git a/server/AyaNova/models/TaskGroup.cs b/server/AyaNova/models/TaskGroup.cs new file mode 100644 index 00000000..e9df106c --- /dev/null +++ b/server/AyaNova/models/TaskGroup.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using AyaNova.Biz; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace AyaNova.Models +{ + //https://stackoverflow.com/questions/46517584/how-to-add-a-parent-record-with-its-children-records-in-ef-core#46615455 + + public class TaskGroup + { + 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 List Items { get; set; } = new List(); + + [NotMapped, JsonIgnore] + public AyaType AyaType { get => AyaType.TaskGroup; } + + }//eoc + +}//eons + diff --git a/server/AyaNova/models/TaskGroupItem.cs b/server/AyaNova/models/TaskGroupItem.cs new file mode 100644 index 00000000..28331846 --- /dev/null +++ b/server/AyaNova/models/TaskGroupItem.cs @@ -0,0 +1,27 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; + +namespace AyaNova.Models +{ + //https://stackoverflow.com/questions/46517584/how-to-add-a-parent-record-with-its-children-records-in-ef-core#46615455 + public class TaskGroupItem + { + public long Id { get; set; } + public uint Concurrency { get; set; } + + [Required] + public long TaskGroupId { get; set; } + + public int DisplayOrder { get; set; } = 0; + + [Required] + public string Task { get; set; } + + + [JsonIgnore] + public TaskGroup TaskGroup { get; set; } + + }//eoc + +}//eons \ No newline at end of file diff --git a/server/AyaNova/models/WorkOrderItemLabor.cs b/server/AyaNova/models/WorkOrderItemLabor.cs index 2673e922..3bd693bf 100644 --- a/server/AyaNova/models/WorkOrderItemLabor.cs +++ b/server/AyaNova/models/WorkOrderItemLabor.cs @@ -21,7 +21,9 @@ namespace AyaNova.Models public decimal NoChargeQuantity { get; set; } public long? ServiceBankId { get; set; } public long? TaxCodeSaleId { get; set; } - + public decimal BasePrice { get; set; }//Rate price per unit at time of entry + public decimal Price { get; set; }//contract adjusted price or a copy of BasePrice if no contract + public decimal ManualDiscountPct { get; set; }// (V7 "Discount") ad-hoc / % off of the contractprice (which is always set regardless if contract or not) entered manually [Required] diff --git a/server/AyaNova/models/WorkOrderItemTask.cs b/server/AyaNova/models/WorkOrderItemTask.cs index 2754622c..7c18ca5c 100644 --- a/server/AyaNova/models/WorkOrderItemTask.cs +++ b/server/AyaNova/models/WorkOrderItemTask.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Newtonsoft.Json; @@ -8,15 +8,20 @@ namespace AyaNova.Models { public class WorkOrderItemTask : ICoreBizObjectModel { - public WorkOrderItemTask() - { - Tags = new List(); - } + public long Id { get; set; } public uint Concurrency { get; set; } - public string Notes { get; set; } - public string CustomFields { get; set; } - public List Tags { get; set; } + + public int DisplayOrder { get; set; } = 0; + [Required] + public string Task { get; set; } + [Required] + public WorkorderItemTaskCompletionType Status { get; set; } = WorkorderItemTaskCompletionType.Incomplete; + public long? CompletedByUserId { get; set; } + public DateTime? CompletedDate { get; set; } + + + [Required] public long WorkOrderItemId { get; set; } [JsonIgnore] @@ -27,3 +32,15 @@ namespace AyaNova.Models }//eoc }//eons +/* +CREATE TABLE [dbo].[AWORKORDERITEMTASK]( + [AID] [uniqueidentifier] NOT NULL, + [AWORKORDERITEMID] [uniqueidentifier] NOT NULL, + [ATASKID] [uniqueidentifier] NOT NULL,//drop, feeds now, Task it linked to is literally just a single string "Name" so this is an easy decision + [ATASKGROUPID] [uniqueidentifier] NOT NULL,//drop feeds now + [ACREATOR] [uniqueidentifier] NOT NULL, + [AMODIFIER] [uniqueidentifier] NOT NULL, + [ACREATED] [datetime] NOT NULL, + [AMODIFIED] [datetime] NOT NULL, + [AWORKORDERITEMTASKCMPLTNTYPE] [smallint] NOT NULL//rename to Status +*/ \ No newline at end of file diff --git a/server/AyaNova/models/WorkOrderItemTravel.cs b/server/AyaNova/models/WorkOrderItemTravel.cs index c90b7f90..96a3789a 100644 --- a/server/AyaNova/models/WorkOrderItemTravel.cs +++ b/server/AyaNova/models/WorkOrderItemTravel.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Newtonsoft.Json; @@ -8,15 +8,26 @@ namespace AyaNova.Models { public class WorkOrderItemTravel : ICoreBizObjectModel { - public WorkOrderItemTravel() - { - Tags = new List(); - } + public long Id { get; set; } public uint Concurrency { get; set; } public string Notes { get; set; } - public string CustomFields { get; set; } - public List Tags { get; set; } + + + public long? UserId { get; set; } + public DateTime? TravelStartDate { get; set; } + public DateTime? TravelStopDate { get; set; } + public long? TravelRateId { get; set; } + public string TravelDetails { get; set; } + public decimal TravelRateQuantity { get; set; } + public decimal NoChargeQuantity { get; set; } + public long? ServiceBankId { get; set; } + public long? TaxCodeSaleId { get; set; } + public decimal Distance { get; set; } + public decimal BasePrice { get; set; }//Rate price per unit at time of entry + public decimal Price { get; set; }//contract adjusted price or a copy of BasePrice if no contract + public decimal ManualDiscountPct { get; set; }// (V7 "Discount") ad-hoc / % off of the contractprice (which is always set regardless if contract or not) entered manually + [Required] public long WorkOrderItemId { get; set; } [JsonIgnore] @@ -27,3 +38,23 @@ namespace AyaNova.Models }//eoc }//eons +/* +CREATE TABLE [dbo].[AWORKORDERITEMTRAVEL]( + [AID] [uniqueidentifier] NOT NULL, + [AWORKORDERITEMID] [uniqueidentifier] NOT NULL, + [ACREATOR] [uniqueidentifier] NOT NULL, + [AMODIFIER] [uniqueidentifier] NOT NULL, + [ACREATED] [datetime] NOT NULL, + [AMODIFIED] [datetime] NOT NULL, + [ANOTES] [ntext] NULL, + [AUSERID] [uniqueidentifier] NULL, + [ATRAVELSTARTDATE] [datetime] NULL, + [ATRAVELSTOPDATE] [datetime] NULL, + [ATRAVELRATEID] [uniqueidentifier] NULL, + [ATRAVELDETAILS] [nvarchar](255) NULL, + [ATRAVELRATEQUANTITY] [decimal](19, 5) NULL, + [ANOCHARGEQUANTITY] [decimal](19, 5) NULL, + [ADISTANCE] [decimal](19, 5) NULL, + [ATAXRATESALEID] [uniqueidentifier] NULL, + [ASERVICEBANKID] [uniqueidentifier] NULL +*/ \ No newline at end of file diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 3eec2282..9e9b4949 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -736,6 +736,14 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); ╚███╔███╔╝╚██████╔╝██║ ██║██║ ██╗ ╚██████╔╝██║ ██║██████╔╝███████╗██║ ██║ ╚══╝╚══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝╚═╝ ╚═╝ */ + + //TASKGROUP + await ExecQueryAsync("CREATE TABLE ataskgroup (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name TEXT NOT NULL UNIQUE, active BOOL NOT NULL, notes TEXT)"); + + //TASK + await ExecQueryAsync("CREATE TABLE ataskgroupitem (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, taskgroupid BIGINT NOT NULL REFERENCES ataskgroup ON DELETE CASCADE, " + + "displayorder INTEGER NOT NULL DEFAULT 0, name TEXT NOT NULL)"); + //WORKORDER STATUS await ExecQueryAsync("CREATE TABLE aworkorderstatus (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name TEXT NOT NULL UNIQUE, active BOOL NOT NULL, " + "notes TEXT, color VARCHAR(12) NOT NULL default '#000000', selectroles INTEGER NOT NULL, removeroles INTEGER NOT NULL, completed BOOL NOT NULL, locked BOOL NOT NULL)"); @@ -775,7 +783,9 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); //WORKORDERITEM LABOR await ExecQueryAsync("CREATE TABLE aworkorderitemlabor (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), " + "userid BIGINT REFERENCES auser, servicestartdate TIMESTAMP, servicestopdate TIMESTAMP, servicerateid BIGINT REFERENCES aservicerate, servicedetails text, " - + "serviceratequantity DECIMAL(19,5) NOT NULL default 0, nochargequantity DECIMAL(19,5) NOT NULL default 0, servicebankid BIGINT REFERENCES aservicebank, taxcodesaleid BIGINT REFERENCES ataxcode" + + "serviceratequantity DECIMAL(19,5) NOT NULL default 0, nochargequantity DECIMAL(19,5) NOT NULL default 0, servicebankid BIGINT REFERENCES aservicebank, " + + "taxcodesaleid BIGINT REFERENCES ataxcode, baseprice DECIMAL(38,18) NOT NULL default 0, price DECIMAL(38,18) NOT NULL default 0, " + + "manualdiscountpct DECIMAL(8,5) NOT NULL default 0 " + ")"); //WORKORDERITEM LOAN @@ -804,17 +814,24 @@ $BODY$ LANGUAGE PLPGSQL STABLE"); + "estimatedquantity DECIMAL(19,5) NOT NULL default 0" + ")"); + //WORKORDERITEM TASK await ExecQueryAsync("CREATE TABLE aworkorderitemtask (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), " - + "notes TEXT, customfields TEXT, tags VARCHAR(255) ARRAY)"); + + "displayorder INTEGER NOT NULL DEFAULT 0, task text NOT NULL, status INTEGER NOT NULL DEFAULT 1, completedbyuserid BIGINT REFERENCES auser, completeddate TIMESTAMP" + + ")"); + //WORKORDERITEM TRAVEL await ExecQueryAsync("CREATE TABLE aworkorderitemtravel (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), " - + "notes TEXT, customfields TEXT, tags VARCHAR(255) ARRAY)"); + + "userid BIGINT REFERENCES auser, travelstartdate TIMESTAMP, travelstopdate TIMESTAMP, travelrateid BIGINT REFERENCES atravelrate, traveldetails text, " + + "travelratequantity DECIMAL(19,5) NOT NULL default 0, nochargequantity DECIMAL(19,5) NOT NULL default 0, servicebankid BIGINT REFERENCES atravelbank, " + + "taxcodesaleid BIGINT REFERENCES ataxcode, distance DECIMAL(19,5) NOT NULL default 0, baseprice DECIMAL(38,18) NOT NULL default 0, price DECIMAL(38,18) NOT NULL default 0, " + + "manualdiscountpct DECIMAL(8,5) NOT NULL default 0 " + + ")"); + + await ExecQueryAsync("CREATE TABLE aworkorderitemunit (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), " + "notes TEXT, customfields TEXT, tags VARCHAR(255) ARRAY)"); - - //POITEM LINK await ExecQueryAsync("ALTER TABLE apurchaseorderitem ADD column workorderitempartrequestid BIGINT REFERENCES aworkorderitempartrequest");