diff --git a/e-suite.API.Common/e-suite.API.Common/CreateActivity.cs b/e-suite.API.Common/e-suite.API.Common/CreateActivity.cs new file mode 100644 index 0000000..6557eda --- /dev/null +++ b/e-suite.API.Common/e-suite.API.Common/CreateActivity.cs @@ -0,0 +1,10 @@ +using eSuite.Core.Miscellaneous; + +namespace e_suite.API.Common; + +public class CreateActivity +{ + public GeneralIdRef WorkflowTemplateVersionId { get; set; } + + public string ActivityName { get; set; } +} \ No newline at end of file diff --git a/e-suite.API/eSuite.API/Controllers/ActivityController.cs b/e-suite.API/eSuite.API/Controllers/ActivityController.cs new file mode 100644 index 0000000..30ed9e0 --- /dev/null +++ b/e-suite.API/eSuite.API/Controllers/ActivityController.cs @@ -0,0 +1,33 @@ +using e_suite.API.Common; +using eSuite.API.security; +using eSuite.API.Utilities; +using eSuite.Core.Security; +using Microsoft.AspNetCore.Mvc; + +namespace eSuite.API.Controllers; + +[Route("api/[controller]")] +[ApiController] +public class ActivityController : ESuiteControllerBase +{ + /// + /// Create a new workflow template + /// + /// Create a new user for e-suite. The minimum information needed is the email address, which forms the account user name. Once created the user will get an e-mail asking them to confirm the account. + /// Contains the details that need to be supplied to create the user. + /// + /// + [Route("create")] + [HttpPost] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(ProblemDetails))] + [AccessKey(SecurityAccess.AddWorkflowTemplate)] + public async Task CreateWorkflowTemplateVersion( + [FromBody] CreateActivity template, + CancellationToken cancellationToken = default! + ) + { + //await _workflowTemplateManager.PostTemplateVersion(AuditUserDetails, template, cancellationToken); + return Ok(); + } +} \ No newline at end of file diff --git a/e-suite.Core/eSuite.Core/Enums/ActivityState.cs b/e-suite.Core/eSuite.Core/Enums/ActivityState.cs new file mode 100644 index 0000000..ae6c80a --- /dev/null +++ b/e-suite.Core/eSuite.Core/Enums/ActivityState.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; + +namespace eSuite.Core.Enums; + +public enum ActivityState +{ + [Description("The activity is ready to start")] + Pending, + [Description("The activity has been cancelled")] + Cancelled, + [Description("The activity is currently active for processing")] + Active, + [Description("Processing of this activity has finished")] + Completed +} \ No newline at end of file diff --git a/e-suite.Workflow.Core/Enums/TaskStatus.cs b/e-suite.Core/eSuite.Core/Enums/TaskStatus.cs similarity index 89% rename from e-suite.Workflow.Core/Enums/TaskStatus.cs rename to e-suite.Core/eSuite.Core/Enums/TaskStatus.cs index d5e7ac2..cc7db67 100644 --- a/e-suite.Workflow.Core/Enums/TaskStatus.cs +++ b/e-suite.Core/eSuite.Core/Enums/TaskStatus.cs @@ -1,6 +1,6 @@ using System.ComponentModel; -namespace e_suite.Workflow.Core.Enums; +namespace eSuite.Core.Enums; public enum TaskState { diff --git a/e-suite.Core/eSuite.Core/Security/SecurityAccess.cs b/e-suite.Core/eSuite.Core/Security/SecurityAccess.cs index 4194d68..74ee6af 100644 --- a/e-suite.Core/eSuite.Core/Security/SecurityAccess.cs +++ b/e-suite.Core/eSuite.Core/Security/SecurityAccess.cs @@ -249,4 +249,7 @@ public enum SecurityAccess [Display(Name = "EditWorkflowTemplate", Description = "Delete Workflow Templates", GroupName = "Workflow Templates")] DeleteWorkflowTemplate = 76, + + [Display(Name = "CreateActivity", Description = "Create an activity based on a Workflow Template", GroupName = "Activities")] + CreateActivity = 77 } \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/EsuiteDatabaseDbContext.cs b/e-suite.Database.Core/e-suite.Database.Core/EsuiteDatabaseDbContext.cs index d628fa0..3b61009 100644 --- a/e-suite.Database.Core/e-suite.Database.Core/EsuiteDatabaseDbContext.cs +++ b/e-suite.Database.Core/e-suite.Database.Core/EsuiteDatabaseDbContext.cs @@ -1,4 +1,5 @@ using e_suite.Database.Core.Helpers; +using e_suite.Database.Core.Tables.Activity; using e_suite.Database.Core.Tables.Contacts; using e_suite.Database.Core.Tables.CustomFields; using e_suite.Database.Core.Tables.Diagnostics; @@ -72,4 +73,6 @@ public class EsuiteDatabaseDbContext : SunDatabaseEntityContext, IEsuiteDatabase public DbSet ExternalKeys { get; set; } public DbSet Workflows { get; set; } public DbSet WorkflowVersions { get; set; } + public DbSet Activities { get; set; } + public DbSet ActivityTasks { get; set; } } \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/IEsuiteDatabaseDbContext.cs b/e-suite.Database.Core/e-suite.Database.Core/IEsuiteDatabaseDbContext.cs index f6ec146..251abd7 100644 --- a/e-suite.Database.Core/e-suite.Database.Core/IEsuiteDatabaseDbContext.cs +++ b/e-suite.Database.Core/e-suite.Database.Core/IEsuiteDatabaseDbContext.cs @@ -1,4 +1,5 @@ using e_suite.Database.Audit.Tables.Audit; +using e_suite.Database.Core.Tables.Activity; using e_suite.Database.Core.Tables.Contacts; using e_suite.Database.Core.Tables.CustomFields; using e_suite.Database.Core.Tables.Diagnostics; @@ -15,7 +16,7 @@ using e_suite.Database.Core.Tables.Workflow; namespace e_suite.Database.Core; -public interface IEsuiteDatabaseDbContext : IAudit, ISentinel, IUserManager, IDiagnostics, ISequences, ICustomFields, IForm, IGlossaries, IPrinter, IContact, IMail, IDomain, IMiscellaneous, IWorkflowManager +public interface IEsuiteDatabaseDbContext : IAudit, ISentinel, IUserManager, IDiagnostics, ISequences, ICustomFields, IForm, IGlossaries, IPrinter, IContact, IMail, IDomain, IMiscellaneous, IWorkflowManager, IActivity { IQueryable Set(Type entityType); } \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/Activity.cs b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/Activity.cs new file mode 100644 index 0000000..2017e40 --- /dev/null +++ b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/Activity.cs @@ -0,0 +1,45 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using e_suite.Database.Audit.Attributes; +using e_suite.Database.Core.Models; +using e_suite.Database.Core.Tables.Workflow; +using eSuite.Core.Enums; +using Microsoft.EntityFrameworkCore; + +namespace e_suite.Database.Core.Tables.Activity; + +[DisplayName("Activity")] +[Table("Activities", Schema = "Activity")] +[Index(nameof(Name), IsUnique = true)] +[Index(nameof(Guid), IsUnique = true)] +public class Activity : IGeneralId, ISoftDeletable +{ + [Key] + public long Id { get; set; } + public Guid Guid { get; set; } + + [AuditName] + [Required] + public string Name { get; set; } = string.Empty; + + [Required] + public long WorkflowVersionId { get; set; } + + [Required] + public ActivityState ActivityState { get; set; } = ActivityState.Pending; + + [AuditSoftDelete(true)] + [Required] + [DefaultValue(false)] + public bool Deleted { get; set; } + + [AuditLastUpdated] + public DateTimeOffset LastUpdated { get; set; } + + + [ForeignKey(nameof(WorkflowVersionId))] + public virtual WorkflowVersion WorkflowVersion { get; set; } = null!; + + public ICollection Tasks { get; set; } = []; +} \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/ActivityTask.cs b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/ActivityTask.cs new file mode 100644 index 0000000..84710e2 --- /dev/null +++ b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/ActivityTask.cs @@ -0,0 +1,66 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using e_suite.Database.Audit.Attributes; +using e_suite.Database.Core.Models; +using eSuite.Core.Enums; +using Microsoft.EntityFrameworkCore; + +namespace e_suite.Database.Core.Tables.Activity; + +[DisplayName("Activity")] +[Table("ActivityTasks", Schema = "Activity")] +[Index(nameof(Guid), IsUnique = true)] +[Index(nameof(ActivityId), nameof(ActivityOrdinal), IsUnique = true)] +public class ActivityTask : IGeneralId, ISoftDeletable +{ + [Key] + public long Id { get; set; } + + public Guid Guid { get; set; } + + public long? ParentId { get; set; } + + public long ActivityId { get; set; } + + public long ActivityOrdinal { get; set; } + + /// + /// This is the guid of the task from the workflow template + /// + [Required] + public Guid TaskGuid { get; set; } + + [AuditName] + [Required] + public string TaskName { get; set; } + + public ActivityState ActivityState { get; set; } = ActivityState.Pending; + + /// + /// Contains the date and time when the task was changed from Pending to Active + /// + public DateTimeOffset? StartDateTime { get; set; } + + /// + /// Contains the date and time when the task was changed from Active to Completed + /// + public DateTimeOffset? FinishDateTime { get; set; } + + [AuditSoftDelete(true)] + [Required] + [DefaultValue(false)] + public bool Deleted { get; set; } + + [AuditLastUpdated] + public DateTimeOffset LastUpdated { get; set; } + + + [ForeignKey(nameof(ActivityId))] + public virtual Activity Activity { get; set; } = null!; + + [ForeignKey(nameof(ParentId))] + public virtual ActivityTask ParentTask { get; set; } = null!; + + public ICollection Tasks { get; set; } = []; +} \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/IActivity.cs b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/IActivity.cs new file mode 100644 index 0000000..c774972 --- /dev/null +++ b/e-suite.Database.Core/e-suite.Database.Core/Tables/Activity/IActivity.cs @@ -0,0 +1,9 @@ +using Microsoft.EntityFrameworkCore; + +namespace e_suite.Database.Core.Tables.Activity; + +public interface IActivity : IDatabaseCore +{ + DbSet Activities { get; set; } + DbSet ActivityTasks { get; set; } +} \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/Tables/Contacts/IContact.cs b/e-suite.Database.Core/e-suite.Database.Core/Tables/Contacts/IContact.cs index 19d1bb7..1f923af 100644 --- a/e-suite.Database.Core/e-suite.Database.Core/Tables/Contacts/IContact.cs +++ b/e-suite.Database.Core/e-suite.Database.Core/Tables/Contacts/IContact.cs @@ -1,9 +1,8 @@ using Microsoft.EntityFrameworkCore; -namespace e_suite.Database.Core.Tables.Contacts +namespace e_suite.Database.Core.Tables.Contacts; + +public interface IContact : IDatabaseCore { - public interface IContact : IDatabaseCore - { - DbSet Contacts { get; set; } - } -} + DbSet Contacts { get; set; } +} \ No newline at end of file diff --git a/e-suite.Database.Core/e-suite.Database.Core/Tables/Workflow/Workflow.cs b/e-suite.Database.Core/e-suite.Database.Core/Tables/Workflow/Workflow.cs index 9195c0b..a7889a2 100644 --- a/e-suite.Database.Core/e-suite.Database.Core/Tables/Workflow/Workflow.cs +++ b/e-suite.Database.Core/e-suite.Database.Core/Tables/Workflow/Workflow.cs @@ -1,6 +1,5 @@ using e_suite.Database.Audit.Attributes; using e_suite.Database.Core.Models; -using e_suite.Database.Core.Tables.Forms; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using System.ComponentModel.DataAnnotations; diff --git a/e-suite.Workflow.Core/Enums/WorkflowState.cs b/e-suite.Workflow.Core/Enums/WorkflowState.cs index 41a0b4c..a53108e 100644 --- a/e-suite.Workflow.Core/Enums/WorkflowState.cs +++ b/e-suite.Workflow.Core/Enums/WorkflowState.cs @@ -6,12 +6,12 @@ public enum WorkflowState { [Description("The workflow has not yet started")] Pending, - [Description("The workflow has been cancelled abd wukk bit be processed")] + [Description("The workflow has been cancelled")] Cancelled, [Description("The workflow is currently active for user/system interaction and processing")] Active, [Description("The active portion of the workflow has finished and the workflow is ready to complete")] ReadyToComplete, - [Description("Processing of this item has finished the ")] + [Description("Processing of this item has finished")] Completed } \ No newline at end of file