Updated manage task API to create new task if assigned task have any errors
This commit is contained in:
parent
c113805ff9
commit
453150e24d
3283
Marco.Pms.DataAccess/Migrations/20250614051038_Added_ParentTask_In_WorkArea_Table.Designer.cs
generated
Normal file
3283
Marco.Pms.DataAccess/Migrations/20250614051038_Added_ParentTask_In_WorkArea_Table.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Marco.Pms.DataAccess.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class Added_ParentTask_In_WorkArea_Table : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<Guid>(
|
||||
name: "ParentTaskId",
|
||||
table: "WorkItems",
|
||||
type: "char(36)",
|
||||
nullable: true,
|
||||
collation: "ascii_general_ci");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "ParentTaskId",
|
||||
table: "WorkItems");
|
||||
}
|
||||
}
|
||||
}
|
@ -2098,6 +2098,9 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
b.Property<double>("CompletedWork")
|
||||
.HasColumnType("double");
|
||||
|
||||
b.Property<Guid?>("ParentTaskId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<double>("PlannedWork")
|
||||
.HasColumnType("double");
|
||||
|
||||
|
@ -8,6 +8,7 @@ namespace Marco.Pms.Model.Dtos.Project
|
||||
public Guid? Id { get; set; }
|
||||
public Guid WorkAreaID { get; set; }
|
||||
public Guid WorkCategoryId { get; set; }
|
||||
public Guid? ParentTaskId { get; set; }
|
||||
public Guid ActivityID { get; set; }
|
||||
public int PlannedWork { get; set; }
|
||||
public int CompletedWork { get; set; }
|
||||
|
@ -55,6 +55,7 @@ namespace Marco.Pms.Model.Mapper
|
||||
Id = model.Id != null ? model.Id.Value : Guid.Empty,
|
||||
ActivityId = model.ActivityID,
|
||||
CompletedWork = model.CompletedWork,
|
||||
ParentTaskId = model.ParentTaskId,
|
||||
PlannedWork = model.PlannedWork,
|
||||
WorkCategoryId = model.WorkCategoryId,
|
||||
TaskDate = DateTime.Now,
|
||||
|
@ -23,6 +23,7 @@ namespace Marco.Pms.Model.Projects
|
||||
[ForeignKey("WorkCategoryId")]
|
||||
[ValidateNever]
|
||||
public WorkCategoryMaster? WorkCategoryMaster { get; set; }
|
||||
public Guid? ParentTaskId { get; set; }
|
||||
public double PlannedWork { get; set; }
|
||||
public double CompletedWork { get; set; }
|
||||
public DateTime TaskDate { get; set; }
|
||||
|
@ -8,12 +8,12 @@ using Marco.Pms.Model.Projects;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.ViewModels.Employee;
|
||||
using Marco.Pms.Model.ViewModels.Projects;
|
||||
using Marco.Pms.Services.Service;
|
||||
using MarcoBMS.Services.Helpers;
|
||||
using MarcoBMS.Services.Service;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace MarcoBMS.Services.Controllers
|
||||
{
|
||||
@ -27,15 +27,19 @@ namespace MarcoBMS.Services.Controllers
|
||||
private readonly ILoggingService _logger;
|
||||
private readonly RolesHelper _rolesHelper;
|
||||
private readonly ProjectsHelper _projectsHelper;
|
||||
private readonly PermissionServices _permissionServices;
|
||||
private readonly Guid Approve_Task;
|
||||
|
||||
|
||||
public ProjectController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, RolesHelper rolesHelper, ProjectsHelper projectHelper)
|
||||
public ProjectController(ApplicationDbContext context, UserHelper userHelper, ILoggingService logger, RolesHelper rolesHelper, ProjectsHelper projectHelper, PermissionServices permissionServices)
|
||||
{
|
||||
_context = context;
|
||||
_userHelper = userHelper;
|
||||
_logger = logger;
|
||||
_rolesHelper = rolesHelper;
|
||||
_projectsHelper = projectHelper;
|
||||
_permissionServices = permissionServices;
|
||||
Approve_Task = Guid.Parse("db4e40c5-2ba9-4b6d-b8a6-a16a250ff99c");
|
||||
}
|
||||
|
||||
[HttpGet("list/basic")]
|
||||
@ -60,7 +64,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
}
|
||||
|
||||
|
||||
List<Project> projects = await _projectsHelper.GetMyProjects(tenantId, LoggedInEmployee);
|
||||
List<Project> projects = await _projectsHelper.GetMyProjects(tenantId, LoggedInEmployee);
|
||||
|
||||
|
||||
// 4. Project projection to ProjectInfoVM
|
||||
@ -572,46 +576,73 @@ namespace MarcoBMS.Services.Controllers
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates or updates project work items (tasks) based on provided data.
|
||||
/// </summary>
|
||||
/// <param name="workItemDot">List of work item DTOs.</param>
|
||||
/// <returns>API response with created/updated work items.</returns>
|
||||
[HttpPost("task")]
|
||||
public async Task<IActionResult> CreateProjectTask(List<WorkItemDot> workItemDot)
|
||||
{
|
||||
Guid tenantId = GetTenantId();
|
||||
List<WorkItemVM> workItems = new List<WorkItemVM> { };
|
||||
string responseMessage = "";
|
||||
if (workItemDot != null)
|
||||
if (workItemDot == null || !workItemDot.Any())
|
||||
{
|
||||
foreach (var item in workItemDot)
|
||||
_logger.LogWarning("CreateProjectTask called with empty workItemDot list.");
|
||||
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400));
|
||||
}
|
||||
|
||||
Guid tenantId = GetTenantId();
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
var hasApproveTaskPermission = await _permissionServices.HasPermission(Approve_Task, loggedInEmployee.Id);
|
||||
|
||||
var workItems = new List<WorkItemVM>();
|
||||
string responseMessage = ""; // Default fallback
|
||||
|
||||
foreach (var item in workItemDot)
|
||||
{
|
||||
try
|
||||
{
|
||||
WorkItem workItem = item.ToWorkItemFromWorkItemDto(tenantId);
|
||||
|
||||
if (item.Id != null)
|
||||
{
|
||||
//update
|
||||
// Update existing work item
|
||||
_context.WorkItems.Update(workItem);
|
||||
await _context.SaveChangesAsync();
|
||||
responseMessage = "Task Added Successfully";
|
||||
responseMessage = "Task Updated Successfully";
|
||||
|
||||
_logger.LogInfo("Work item {WorkItemId} updated by employee {EmployeeId}", item.Id, loggedInEmployee.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
//create
|
||||
// Check permission if task is a subtask
|
||||
if (item.ParentTaskId != null && !hasApproveTaskPermission)
|
||||
{
|
||||
_logger.LogWarning("Employee {EmployeeId} attempted to create subtask without permission.", loggedInEmployee.Id);
|
||||
return StatusCode(403, ApiResponse<object>.ErrorResponse("You don't have access", "User is forbidden to access this feature", 403));
|
||||
}
|
||||
|
||||
// Create new work item
|
||||
_context.WorkItems.Add(workItem);
|
||||
await _context.SaveChangesAsync();
|
||||
responseMessage = "Task Updated Successfully";
|
||||
responseMessage = "Task Added Successfully";
|
||||
|
||||
_logger.LogInfo("New work item created by employee {EmployeeId}", loggedInEmployee.Id);
|
||||
}
|
||||
var result = new WorkItemVM
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
workItems.Add(new WorkItemVM
|
||||
{
|
||||
WorkItemId = workItem.Id,
|
||||
WorkItem = workItem
|
||||
};
|
||||
workItems.Add(result);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError("Error processing work item with temporary ID {TempId} by employee {EmployeeId} : {Error}", item.Id ?? Guid.Empty, loggedInEmployee.Id, ex.Message);
|
||||
return StatusCode(500, ApiResponse<object>.ErrorResponse("Internal server error", ex.Message, 500));
|
||||
}
|
||||
var activity = await _context.ActivityMasters.ToListAsync();
|
||||
var category = await _context.WorkCategoryMasters.ToListAsync();
|
||||
return Ok(ApiResponse<object>.SuccessResponse(workItems, responseMessage, 200));
|
||||
}
|
||||
|
||||
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400));
|
||||
|
||||
return Ok(ApiResponse<object>.SuccessResponse(workItems, responseMessage, 200));
|
||||
}
|
||||
|
||||
[HttpDelete("task/{id}")]
|
||||
|
@ -903,11 +903,11 @@ namespace Marco.Pms.Services.Helpers
|
||||
List<ContactNote> notes = new List<ContactNote>();
|
||||
if (active)
|
||||
{
|
||||
notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.IsActive && n.TenantId == tenantId).ToListAsync();
|
||||
notes = await _context.ContactNotes.Include(n => n.Createdby).Where(n => n.ContactId == contact.Id && n.IsActive && n.TenantId == tenantId).ToListAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
notes = await _context.ContactNotes.Where(n => n.ContactId == contact.Id && n.TenantId == tenantId).ToListAsync();
|
||||
notes = await _context.ContactNotes.Include(n => n.Createdby).Where(n => n.ContactId == contact.Id && n.TenantId == tenantId).ToListAsync();
|
||||
}
|
||||
var noteIds = notes.Select(n => n.Id).ToList();
|
||||
List<DirectoryUpdateLog>? updateLogs = await _context.DirectoryUpdateLogs.Include(l => l.Employee).Where(l => noteIds.Contains(l.RefereanceId)).ToListAsync();
|
||||
|
Loading…
x
Reference in New Issue
Block a user