Added Apis for task allocations

This commit is contained in:
ashutosh.nehete 2025-04-04 15:42:42 +05:30
parent 352b4fb40e
commit 7ddb37852e
31 changed files with 4906 additions and 165 deletions

View File

@ -39,7 +39,7 @@ namespace Marco.Pms.DataAccess.Data
public DbSet<WorkArea> WorkAreas { get; set; }
public DbSet<WorkItem> WorkItems { get; set; }
public DbSet<WorkItemMapping> WorkItemMapping { get; set; }
//public DbSet<WorkItemMapping> WorkItemMapping { get; set; }
public DbSet<WorkShift> WorkShifts { get; set; }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,37 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Marco.Pms.DataAccess.Migrations
{
/// <inheritdoc />
public partial class Make_ReportDate_Nullable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<DateTime>(
name: "ReportedDate",
table: "TaskAllocations",
type: "datetime(6)",
nullable: true,
oldClrType: typeof(DateTime),
oldType: "datetime(6)");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<DateTime>(
name: "ReportedDate",
table: "TaskAllocations",
type: "datetime(6)",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified),
oldClrType: typeof(DateTime),
oldType: "datetime(6)",
oldNullable: true);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,131 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Marco.Pms.DataAccess.Migrations
{
/// <inheritdoc />
public partial class Removed_WorkItemMapping : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_TaskAllocations_WorkItemMapping_WorkItemMappingId",
table: "TaskAllocations");
migrationBuilder.DropTable(
name: "WorkItemMapping");
migrationBuilder.DropIndex(
name: "IX_TaskAllocations_WorkItemMappingId",
table: "TaskAllocations");
migrationBuilder.DropColumn(
name: "WorkItemMappingId",
table: "TaskAllocations");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "TaskAllocations",
type: "longtext",
nullable: true,
oldClrType: typeof(string),
oldType: "longtext")
.Annotation("MySql:CharSet", "utf8mb4")
.OldAnnotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "TaskAllocations",
keyColumn: "Description",
keyValue: null,
column: "Description",
value: "");
migrationBuilder.AlterColumn<string>(
name: "Description",
table: "TaskAllocations",
type: "longtext",
nullable: false,
oldClrType: typeof(string),
oldType: "longtext",
oldNullable: true)
.Annotation("MySql:CharSet", "utf8mb4")
.OldAnnotation("MySql:CharSet", "utf8mb4");
migrationBuilder.AddColumn<int>(
name: "WorkItemMappingId",
table: "TaskAllocations",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateTable(
name: "WorkItemMapping",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
TenantId = table.Column<int>(type: "int", nullable: false),
WorkAreaId = table.Column<int>(type: "int", nullable: false),
WorkItemId = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WorkItemMapping", x => x.Id);
table.ForeignKey(
name: "FK_WorkItemMapping_Tenants_TenantId",
column: x => x.TenantId,
principalTable: "Tenants",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_WorkItemMapping_WorkAreas_WorkAreaId",
column: x => x.WorkAreaId,
principalTable: "WorkAreas",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_WorkItemMapping_WorkItems_WorkItemId",
column: x => x.WorkItemId,
principalTable: "WorkItems",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
})
.Annotation("MySql:CharSet", "utf8mb4");
migrationBuilder.CreateIndex(
name: "IX_TaskAllocations_WorkItemMappingId",
table: "TaskAllocations",
column: "WorkItemMappingId");
migrationBuilder.CreateIndex(
name: "IX_WorkItemMapping_TenantId",
table: "WorkItemMapping",
column: "TenantId");
migrationBuilder.CreateIndex(
name: "IX_WorkItemMapping_WorkAreaId",
table: "WorkItemMapping",
column: "WorkAreaId");
migrationBuilder.CreateIndex(
name: "IX_WorkItemMapping_WorkItemId",
table: "WorkItemMapping",
column: "WorkItemId");
migrationBuilder.AddForeignKey(
name: "FK_TaskAllocations_WorkItemMapping_WorkItemMappingId",
table: "TaskAllocations",
column: "WorkItemMappingId",
principalTable: "WorkItemMapping",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -1,7 +1,10 @@
// <auto-generated />
using System;
using Marco.Pms.DataAccess.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
@ -17,7 +20,7 @@ namespace Marco.Pms.DataAccess.Migrations
.HasAnnotation("ProductVersion", "8.0.12")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
// MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
//MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder);
modelBuilder.Entity("Marco.Pms.Model.Activities.TaskAllocation", b =>
{
@ -37,13 +40,12 @@ namespace Marco.Pms.DataAccess.Migrations
.HasColumnType("double");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("longtext");
b.Property<double>("PlannedTask")
.HasColumnType("double");
b.Property<DateTime>("ReportedDate")
b.Property<DateTime?>("ReportedDate")
.HasColumnType("datetime(6)");
b.Property<int>("TenantId")
@ -52,9 +54,6 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<int>("WorkItemId")
.HasColumnType("int");
b.Property<int>("WorkItemMappingId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("AssignedBy");
@ -63,8 +62,6 @@ namespace Marco.Pms.DataAccess.Migrations
b.HasIndex("WorkItemId");
b.HasIndex("WorkItemMappingId");
b.ToTable("TaskAllocations");
});
@ -1362,34 +1359,6 @@ namespace Marco.Pms.DataAccess.Migrations
b.ToTable("WorkItems");
});
modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItemMapping", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<int>("TenantId")
.HasColumnType("int");
b.Property<int>("WorkAreaId")
.HasColumnType("int");
b.Property<int>("WorkItemId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("TenantId");
b.HasIndex("WorkAreaId");
b.HasIndex("WorkItemId");
b.ToTable("WorkItemMapping");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
@ -1631,19 +1600,11 @@ namespace Marco.Pms.DataAccess.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Projects.WorkItemMapping", "WorkItemMapping")
.WithMany()
.HasForeignKey("WorkItemMappingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Employee");
b.Navigation("Tenant");
b.Navigation("WorkItem");
b.Navigation("WorkItemMapping");
});
modelBuilder.Entity("Marco.Pms.Model.Activities.TaskComment", b =>
@ -2034,33 +1995,6 @@ namespace Marco.Pms.DataAccess.Migrations
b.Navigation("WorkArea");
});
modelBuilder.Entity("Marco.Pms.Model.Projects.WorkItemMapping", b =>
{
b.HasOne("Marco.Pms.Model.Entitlements.Tenant", "Tenant")
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Projects.WorkArea", "WorkArea")
.WithMany()
.HasForeignKey("WorkAreaId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Projects.WorkItem", "WorkItem")
.WithMany()
.HasForeignKey("WorkItemId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Tenant");
b.Navigation("WorkArea");
b.Navigation("WorkItem");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)

View File

@ -1,10 +1,8 @@
using Marco.Pms.Model.Employees;
using System.ComponentModel.DataAnnotations.Schema;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Projects;
using Marco.Pms.Utility;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Activities
@ -17,31 +15,29 @@ namespace Marco.Pms.Model.Activities
public DateTime AssignmentDate { get; set; }
public double PlannedTask { get; set; }
public double CompletedTask { get; set; }
public DateTime? ReportedDate { get; set; }
public string? Description { get; set; }
public DateTime ReportedDate { get; set; }
//public int? WorkItemMappingId { get; set; }
//[ForeignKey("WorkItemMappingId")]
//[ValidateNever]
//public WorkItemMapping? WorkItemMapping { get; set; }
public string Description { get; set; }
public int WorkItemMappingId { get; set; }
[ForeignKey("WorkItemMappingId")]
[ValidateNever]
public WorkItemMapping WorkItemMapping { get; set; }
public int AssignedBy { get; set; }
public int AssignedBy { get; set; } //Employee Id
[ForeignKey("AssignedBy")]
[ValidateNever]
public Employee Employee { get; set; }
public Employee? Employee { get; set; }
public int WorkItemId { get; set; }
[ForeignKey("WorkItemId")]
[ValidateNever]
public WorkItem WorkItem { get; set; }
public WorkItem? WorkItem { get; set; }
public int TenantId { get; set; }
[ValidateNever]
[ForeignKey(nameof(TenantId))]
public Tenant Tenant { get; set; }
public Tenant? Tenant { get; set; }
}
}

View File

@ -1,30 +1,27 @@
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.Utilities;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Activities
{
public class TaskComment
public class TaskComment : TenantTest
{
public long Id { get; set; }
public long TaskAllocationId { get; set; }
[ValidateNever]
[ForeignKey(nameof(TaskAllocationId))]
public TaskAllocation TaskAllocation { get; set; }
public TaskAllocation? TaskAllocation { get; set; }
public DateTime CommentDate { get; set; }
public string Comment { get; set; }
public int CommentedBy { get; set; }
[ForeignKey("CommentedBy")]
[ValidateNever]
public Employee Employee { get; set; }
public Employee? Employee { get; set; }
public int TenantId { get; set; }
[ValidateNever]
[ForeignKey(nameof(TenantId))]
public Tenant Tenant { get; set; }
}
}

View File

@ -1,12 +1,7 @@
using Marco.Pms.Model.Employees;
using System.ComponentModel.DataAnnotations.Schema;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Model.Activities
{

View File

@ -2,5 +2,11 @@
{
public class AssignTaskDto
{
public DateTime AssignmentDate { get; set; }
public double PlannedTask { get; set; }
public string Description { get; set; }
public List<int> TaskTeam { get; set; } //Employee Ids
public int WorkItemId { get; set; }
}
}

View File

@ -0,0 +1,10 @@
using System.ComponentModel;
namespace Marco.Pms.Model.Dtos.Activities
{
public class CreateActivityMasterDto
{
public string ActivityName { get; set; }
public string UnitOfMeasurement { get; set; }
}
}

View File

@ -0,0 +1,11 @@
namespace Marco.Pms.Model.Dtos.Activities
{
public class CreateCommentDto
{
public long TaskAllocationId { get; set; }
public DateTime CommentDate { get; set; }
public string Comment { get; set; }
}
}

View File

@ -0,0 +1,10 @@
namespace Marco.Pms.Model.Dtos.Activities
{
public class ReportTaskDto
{
public long Id { get; set; }
public double CompletedTask { get; set; }
public DateTime ReportedDate { get; set; }
public string Comment { get; set; }
}
}

View File

@ -1,11 +1,6 @@
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
namespace Marco.Pms.Model.Entitlements
{

View File

@ -1,6 +1,99 @@
namespace Marco.Pms.Model.Mapper
using Marco.Pms.Model.Activities;
using Marco.Pms.Model.Dtos.Activities;
using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.ViewModels.Activities;
using Microsoft.Extensions.DependencyModel;
namespace Marco.Pms.Model.Mapper
{
public class ActivitiesMapper
public static class ActivitiesMapper
{
public static TaskAllocation ToTaskAllocationFromAssignTaskDto(this AssignTaskDto assignTask, int EmployeeId,int tenantId)
{
return new TaskAllocation
{
AssignmentDate = assignTask.AssignmentDate,
PlannedTask = assignTask.PlannedTask,
CompletedTask = 0,
Description = assignTask.Description,
AssignedBy = EmployeeId,
WorkItemId = assignTask.WorkItemId,
TenantId = tenantId
};
}
public static TaskComment ToCommentFromReportTaskDto(this ReportTaskDto reportTask, int tenantId, int EmployeeId)
{
return new TaskComment
{
TaskAllocationId = reportTask.Id,
CommentDate = reportTask.ReportedDate,
Comment = reportTask.Comment,
CommentedBy = EmployeeId,
TenantId = tenantId
};
}
public static TaskComment ToCommentFromCommentDto(this CreateCommentDto createComment, int tenantId, int EmployeeId) {
return new TaskComment {
TaskAllocationId = createComment.TaskAllocationId,
CommentDate = createComment.CommentDate,
Comment = createComment.Comment,
CommentedBy = EmployeeId,
TenantId = tenantId
};
}
public static TaskVM TaskAllocationToTaskVM(this TaskAllocation taskAllocation,string employeeName,string tenant )
{
return new TaskVM
{
Id = taskAllocation.Id,
AssignmentDate = taskAllocation.AssignmentDate,
PlannedTask = taskAllocation.PlannedTask,
CompletedTask = taskAllocation.CompletedTask,
ReportedDate = taskAllocation.ReportedDate,
Description = taskAllocation.Description,
AssignBy = employeeName,
Tenant = tenant,
WorkItem = taskAllocation.WorkItem
};
}
public static AssignedTaskVM ToAssignTaskVMFromTaskAllocation(this TaskAllocation taskAllocation)
{
return new AssignedTaskVM
{
Id = taskAllocation.Id,
AssignmentDate = taskAllocation.AssignmentDate,
PlannedTask = taskAllocation.PlannedTask,
CompletedTask = taskAllocation.CompletedTask,
ReportedDate= taskAllocation.ReportedDate,
Description = taskAllocation.Description,
AssignedBy = taskAllocation.Employee.ToEmployeeVMFromEmployee(),
WorkItemId = taskAllocation.WorkItemId,
TenantId = taskAllocation.TenantId
};
}
public static ReportTaskVM ToReportTaskVMFromTaskAllocation(this TaskAllocation taskAllocation)
{
return new ReportTaskVM
{
Id = taskAllocation.Id,
AssignmentDate = taskAllocation.AssignmentDate,
PlannedTask = taskAllocation.PlannedTask,
CompletedTask = taskAllocation.CompletedTask,
ReportedDate = taskAllocation.ReportedDate,
Description = taskAllocation.Description,
AssignedBy = taskAllocation.AssignedBy,
WorkItemId = taskAllocation.WorkItemId,
TenantId = taskAllocation.TenantId
};
}
public static ActivityMaster ToActivityMasterFromCreateActivityMasterDto(this CreateActivityMasterDto createActivity,int tenantId)
{
return new ActivityMaster
{
ActivityName = createActivity.ActivityName,
UnitOfMeasurement = createActivity.UnitOfMeasurement,
TenantId = tenantId
};
}
}
}

View File

@ -1,10 +1,6 @@
using Marco.Pms.Model.Dtos.Project;
using Marco.Pms.Model.Projects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Marco.Pms.Model.ViewModels.Activities;
namespace Marco.Pms.Model.Mapper
{
@ -67,5 +63,12 @@ namespace Marco.Pms.Model.Mapper
};
}
//public static WorkItemVm ToWorkItemVMFromWorkItem(this WorkItem workItem)
//{
// return new WorkItemVm
// {
// Id
// }
//}
}
}

View File

@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Projects
{
public class WorkItemMapping
public class WorkItemMapping1
{
public int Id { get; set; }
public int WorkAreaId { get; set; }

View File

@ -0,0 +1,15 @@
using System.ComponentModel.DataAnnotations.Schema;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
namespace Marco.Pms.Model.Utilities
{
public class TenantTest
{
public int TenantId { get; set; }
[ValidateNever]
[ForeignKey(nameof(TenantId))]
public Tenant? Tenant { get; set; }
}
}

View File

@ -1,6 +1,25 @@
namespace Marco.Pms.Model.ViewModels.Activities
using Marco.Pms.Model.ViewModels.Employee;
namespace Marco.Pms.Model.ViewModels.Activities
{
public class AssignedTaskVM
{
public long Id { get; set; }
public DateTime AssignmentDate { get; set; }
public double PlannedTask { get; set; }
public double CompletedTask { get; set; }
public DateTime? ReportedDate { get; set; }
public string? Description { get; set; }
public EmployeeVM? AssignedBy { get; set; }
public int WorkItemId { get; set; }
public int TenantId { get; set; }
public List<EmployeeVM> teamMembers { get; set; }
}
}

View File

@ -0,0 +1,19 @@
using Marco.Pms.Model.Activities;
namespace Marco.Pms.Model.ViewModels.Activities
{
public class ReportTaskVM
{
public long Id { get; set; }
public DateTime AssignmentDate { get; set; }
public double PlannedTask { get; set; }
public double CompletedTask { get; set; }
public DateTime? ReportedDate { get; set; }
public string? Description { get; set; }
public int AssignedBy { get; set; }
public int WorkItemId { get; set; }
public int TenantId { get; set; }
public List<TaskComment> Comments { get; set; }
}
}

View File

@ -0,0 +1,22 @@
using Marco.Pms.Model.Activities;
using Marco.Pms.Model.Projects;
using Marco.Pms.Model.ViewModels.Employee;
namespace Marco.Pms.Model.ViewModels.Activities
{
public class TaskVM
{
public long Id { get; set; }
public DateTime AssignmentDate { get; set; }
public double PlannedTask { get; set; }
public double CompletedTask { get; set; }
public DateTime? ReportedDate { get; set; }
public string? Description { get; set; }
public string AssignBy { get; set; }
public WorkItem WorkItem { get; set; }
public string Tenant { get; set; }
public List<TaskComment> Comments { get; set; }
public List<EmployeeVM> TeamMembers { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Marco.Pms.Model.ViewModels.Activities
{
public class TasksVM
{
public long Id { get; set; }
public string ActivityName { get; set; }
public double TotalPlannedTask { get; set; }
public double PlannedTask { get; set; }
public double CompletedTask { get; set; }
public double TotalCopmletedTask { get; set; }
}
}

View File

@ -0,0 +1,11 @@
namespace Marco.Pms.Model.ViewModels.Activities
{
public class WorkItemVm
{
public int Id { get; set; }
public string ActivityName { get; set; }
public double PlannedWork { get; set; }
public double CompletedWork { get; set; }
public DateTime TaskDate { get; set; }
}
}

View File

@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Model.ViewModels.Employee
namespace Marco.Pms.Model.ViewModels.Employee
{
public class EmployeeVM
{

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Marco.Pms.Model.Projects;
namespace Marco.Pms.Model.ViewModels
{
public class InfraVM
{
public Building? building { get; set; }
public Floor? floor { get; set; }
public WorkArea workArea { get; set; }
}
}

View File

@ -0,0 +1,37 @@
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Dtos.Activities;
using Marco.Pms.Model.Mapper;
using Marco.Pms.Model.Utilities;
using MarcoBMS.Services.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Marco.Pms.Services.Controllers
{
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class MasterController : ControllerBase
{
private readonly ApplicationDbContext _context;
private readonly UserHelper _userHelper;
public MasterController(ApplicationDbContext context,UserHelper userHelper)
{
_context = context;
_userHelper = userHelper;
}
public async Task<IActionResult> CreateActivity([FromBody] CreateActivityMasterDto createActivity)
{
var tenantId = _userHelper.GetTenantId();
var employee = await _userHelper.GetCurrentEmployeeAsync();
if(employee.TenantId != tenantId)
{
return Unauthorized(ApiResponse<object>.ErrorResponse("Current tenant did not match with user's tenant", "Current tenant did not match with user's tenant",401));
}
var activityMaster = createActivity.ToActivityMasterFromCreateActivityMasterDto(tenantId);
_context.ActivityMasters.Add(activityMaster);
await _context.SaveChangesAsync();
return Ok(ApiResponse<object>.SuccessResponse(activityMaster, "Activity created successfully", 200));
}
}
}

View File

@ -159,7 +159,7 @@ namespace MarcoBMS.Services.Controllers
List<WorkArea> workAreas = await _context.WorkAreas.Where(c => idList.Contains(c.FloorId)).ToListAsync();
idList = floors.Select(o => o.Id).ToList();
idList = workAreas.Select(o => o.Id).ToList();
List<WorkItem> workItems = await _context.WorkItems.Where(c => idList.Contains(c.WorkAreaId)).Include(c=>c.ActivityMaster).ToListAsync();
// List <WorkItem> workItems = _unitOfWork.WorkItem.GetAll(c => idList.Contains(c.WorkAreaId), includeProperties: "ActivityMaster").ToList();
@ -426,6 +426,7 @@ namespace MarcoBMS.Services.Controllers
[HttpPost("task")]
public async Task<IActionResult> CreateProjectTask(List<WorkItemDot> workItemDot)
{
List<WorkItem> workItems = new List<WorkItem> { };
if (workItemDot != null)
{
foreach (var item in workItemDot)
@ -445,9 +446,10 @@ namespace MarcoBMS.Services.Controllers
_context.WorkItems.Add(workItem);
await _context.SaveChangesAsync();
}
workItems.Add(workItem);
}
return Ok(ApiResponse<object>.SuccessResponse(null, "Data saved successfully.", 200));
return Ok(ApiResponse<object>.SuccessResponse(workItems, "Data saved successfully.", 200));
}
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Work Item Details are not valid.", 400));
@ -455,8 +457,8 @@ namespace MarcoBMS.Services.Controllers
}
[HttpPost("manage-infra")]
public async Task<IActionResult> ManageProjectInfra(List<InfraDot> infraDots)
{
var responseData = new InfraVM{ };
if (infraDots != null)
{
foreach (var item in infraDots)
@ -472,12 +474,15 @@ namespace MarcoBMS.Services.Controllers
//create
_context.Buildings.Add(building);
await _context.SaveChangesAsync();
responseData.building = building;
}
else
{
//update
_context.Buildings.Update(building);
await _context.SaveChangesAsync();
responseData.building = building;
}
}
if (item.Floor != null)
@ -490,12 +495,14 @@ namespace MarcoBMS.Services.Controllers
//create
_context.Floor.Add(floor);
await _context.SaveChangesAsync();
responseData.floor = floor;
}
else
{
//update
_context.Floor.Update(floor);
await _context.SaveChangesAsync();
responseData.floor = floor;
}
}
if (item.WorkArea != null)
@ -508,16 +515,18 @@ namespace MarcoBMS.Services.Controllers
//create
_context.WorkAreas.Add(workArea);
await _context.SaveChangesAsync();
responseData.workArea = workArea;
}
else
{
//update
_context.WorkAreas.Update(workArea);
await _context.SaveChangesAsync();
responseData.workArea = workArea;
}
}
}
return Ok(ApiResponse<object>.SuccessResponse(null, "Data saved successfully.", 200));
return Ok(ApiResponse<object>.SuccessResponse(responseData, "Data saved successfully.", 200));
}
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid details.", "Infra Details are not valid.", 400));

View File

@ -1,4 +1,12 @@
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Activities;
using Marco.Pms.Model.Dtos.Activities;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Mapper;
using Marco.Pms.Model.Projects;
using Marco.Pms.Model.Utilities;
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Employee;
using MarcoBMS.Services.Helpers;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@ -21,46 +29,199 @@ namespace MarcoBMS.Services.Controllers
_userHelper = userHelper;
}
private int GetTenantId()
{
return _userHelper.GetTenantId();
}
[HttpGet]
[Route("activities")]
public async Task<IActionResult> GetActivitiesMaster()
{
var activities = await _context.ActivityMasters.Where(c => c.TenantId == _userHelper.GetTenantId()).ToListAsync();
return Ok(activities);
var tenantId = GetTenantId();
var activities = await _context.ActivityMasters.Where(c => c.TenantId == tenantId).ToListAsync();
return Ok(ApiResponse<object>.SuccessResponse(activities, "Success.", 200));
}
[HttpPost("assign")]
public ActionResult AssignTask()
public async Task<IActionResult> AssignTask([FromBody] AssignTaskDto assignTask)
{
return Ok();
if (!ModelState.IsValid)
{
var errors = ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage)
.ToList();
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid data", errors, 400));
}
var tenantId = GetTenantId();
var Employee = await _userHelper.GetCurrentEmployeeAsync();
var taskAllocation = assignTask.ToTaskAllocationFromAssignTaskDto(Employee.Id,tenantId);
_context.TaskAllocations.Add(taskAllocation);
await _context.SaveChangesAsync();
var response = taskAllocation.ToAssignTaskVMFromTaskAllocation();
var teamMembers = new List<TaskMembers> { };
foreach (var teamMember in assignTask.TaskTeam) {
var result = new TaskMembers
{
TaskAllocationId = taskAllocation.Id,
EmployeeId = teamMember,
TenantId = tenantId,
};
teamMembers.Add(result);
}
_context.TaskMembers.AddRange(teamMembers);
await _context.SaveChangesAsync();
var idList = teamMembers.Select(m => m.EmployeeId);
List<Employee> employees = await _context.Employees.Where(e=> idList.Contains(e.Id)).ToListAsync();
foreach (var employee in employees) {
response.teamMembers.Add(employee.ToEmployeeVMFromEmployee());
}
return Ok(ApiResponse<object>.SuccessResponse(response, "Task assignned successfully", 200));
}
[HttpPost("report")]
public ActionResult ReportTaskProgress()
public async Task<IActionResult> ReportTaskProgress([FromBody]ReportTaskDto reportTask)
{
return Ok();
if (!ModelState.IsValid)
{
var errors = ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage)
.ToList();
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid data", errors, 400));
}
var tenantId = GetTenantId();
var Employee = await _userHelper.GetCurrentEmployeeAsync();
var taskAllocation = await _context.TaskAllocations.Include(t => t.WorkItem).FirstOrDefaultAsync(t => t.Id == reportTask.Id);
if (taskAllocation == null) {
return BadRequest(ApiResponse<object>.ErrorResponse("No such task has been allocated.", "No such task has been allocated.", 400));
}
taskAllocation.ReportedDate = reportTask.ReportedDate;
taskAllocation.CompletedTask = reportTask.CompletedTask;
taskAllocation.WorkItem.CompletedWork += reportTask.CompletedTask;
var comment = reportTask.ToCommentFromReportTaskDto(tenantId,Employee.Id);
_context.TaskComments.Add(comment);
await _context.SaveChangesAsync();
var response = taskAllocation.ToReportTaskVMFromTaskAllocation();
response.Comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync();
return Ok(ApiResponse<object>.SuccessResponse(response, "Task reported successfully", 200));
}
[HttpPost("comment")]
public ActionResult AddCommentForTask()
public async Task<IActionResult> AddCommentForTask([FromBody]CreateCommentDto createComment )
{
return Ok();
var tenantId = GetTenantId();
var Employee = await _userHelper.GetCurrentEmployeeAsync();
var comment = createComment.ToCommentFromCommentDto(tenantId, Employee.Id);
_context.TaskComments.Add(comment);
await _context.SaveChangesAsync();
return Ok(ApiResponse<object>.SuccessResponse(comment, "Comment saved successfully", 200));
}
[HttpPost("list")]
public ActionResult GetTasksList()
[HttpGet("list")]
public async Task<IActionResult> GetTasksList([FromQuery] int projectId, [FromQuery] string? dateFrom = null, [FromQuery] string? dateTo = null)
{
return Ok();
int tenantId = GetTenantId();
DateTime fromDate = new DateTime();
DateTime toDate = new DateTime();
if (dateFrom != null && DateTime.TryParse(dateFrom, out fromDate) == false)
{
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid starting date.", "Invalid starting date.", 400));
}
if (dateTo != null && DateTime.TryParse(dateTo, out toDate) == false)
{
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid ending date.", "Invalid ending date.", 400));
}
if (dateTo == null) toDate = DateTime.UtcNow;
if (dateFrom == null) fromDate = toDate.AddDays(-1);
//var taskAllocations = await _context.TaskAllocations.Where(t => t.WorkItem.WorkArea.Floor.Building.ProjectId == projectId && t.AssignmentDate >= fromDate && t.AssignmentDate <= toDate && t.TenantId == tenantId).Include(t => t.WorkItemId).ToListAsync();
List<Building> buildings = await _context.Buildings.Where(b => b.ProjectId == projectId && b.TenantId == tenantId).ToListAsync();
List<int> idList = buildings.Select(b => b.Id).ToList();
List<Floor> floors = await _context.Floor.Where(f => idList.Contains(f.BuildingId) && f.TenantId == tenantId).ToListAsync();
idList = floors.Select(f => f.Id).ToList();
List<WorkArea> workAreas = await _context.WorkAreas.Where(a => idList.Contains(a.FloorId) && a.TenantId == tenantId).ToListAsync();
idList = workAreas.Select(a => a.Id).ToList();
List<WorkItem> workItems = await _context.WorkItems.Where(i => idList.Contains(i.WorkAreaId) && i.TenantId == tenantId).Include(i => i.ActivityMaster).ToListAsync();
idList = workAreas.Select(i => i.Id).ToList();
List<TaskAllocation> taskAllocations = await _context.TaskAllocations.Where(t => idList.Contains(t.WorkItemId) && t.AssignmentDate >= fromDate && t.AssignmentDate <= toDate && t.TenantId == tenantId).Include(t => t.WorkItem).ToListAsync();
//var taskAllocations = await (from t in _context.TaskAllocations
// join w in _context.WorkItems on t.WorkItemId equals w.Id
// join a in _context.ActivityMasters on w.ActivityId equals a.Id
// where t.WorkItem.WorkArea.Floor.Building.ProjectId == projectId && t.AssignmentDate >= fromDate && t.AssignmentDate <= toDate && t.TenantId == tenantId
// select new {TaskAllocation = t, WorkItems = w, ActivityMasters = a }).ToListAsync();
List<TasksVM> tasks = new List<TasksVM>();
foreach (var workItem in workItems)
{
foreach (var taskAllocation in taskAllocations)
{
var result = new TasksVM
{
Id = workItem.ActivityMaster.Id,
ActivityName = workItem.ActivityMaster.ActivityName,
TotalPlannedTask = workItem.PlannedWork,
PlannedTask = taskAllocation.PlannedTask,
CompletedTask = taskAllocation.CompletedTask,
TotalCopmletedTask = workItem.CompletedWork
};
tasks.Add(result);
}
}
return Ok(ApiResponse<object>.SuccessResponse(tasks, "Success", 200));
}
[HttpPost("get/{taskId}")]
public ActionResult GetTask()
[HttpGet("get/{taskId}")]
public async Task<IActionResult> GetTask(long taskId)
{
return Ok();
if (taskId == 0) return BadRequest(ApiResponse<object>.ErrorResponse("Invalid data", "Invalid data", 400));
var taskAllocation = await _context.TaskAllocations.Include(t => t.Tenant).Include(t => t.Employee).Include(t => t.WorkItem).FirstOrDefaultAsync(t => t.Id == taskId);
if (taskAllocation != null && taskAllocation.Employee != null && taskAllocation.Tenant != null)
{
//var employee = await _context.Employees.FirstOrDefaultAsync(e => e.Id == taskAllocation.AssignedBy);
string employeeName = System.String.Format("{0} {1}", taskAllocation.Employee.FirstName, taskAllocation.Employee.LastName);
string tenantName = taskAllocation.Tenant.ContactName;
if (taskAllocation == null) return NotFound(ApiResponse<object>.ErrorResponse("Task Not Found", "Task not found", 404));
var taskVM = taskAllocation.TaskAllocationToTaskVM(employeeName,tenantName);
var comments = await _context.TaskComments.Where(c => c.TaskAllocationId == taskAllocation.Id).ToListAsync();
var team = await _context.TaskMembers.Where(m => m.TaskAllocationId == taskAllocation.Id).Include(m => m.Employee).ToListAsync();
var teamMembers = new List<EmployeeVM> { };
foreach(var member in team)
{
var result = member.Employee.ToEmployeeVMFromEmployee();
teamMembers.Add(result);
}
taskVM.Comments = comments;
taskVM.TeamMembers = teamMembers;
return Ok(ApiResponse<object>.SuccessResponse(taskVM, "Success", 200));
}
return NotFound(ApiResponse<object>.ErrorResponse("Task Not Found", "Task not Found", 404));
}
}
}

View File

@ -35,11 +35,20 @@ namespace MarcoBMS.Services.Controllers
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
var errors = ModelState.Values
.SelectMany(v => v.Errors)
.Select(e => e.ErrorMessage)
.ToList();
return BadRequest(ApiResponse<object>.ErrorResponse("Invalid data", errors, 400));
}
var user = await _userHelper.GetCurrentUserAsync();
Employee emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
Employee emp = new Employee { };
if(user != null)
{
emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
}
List<FeaturePermission> featurePermission = await _rolesHelper.GetFeaturePermissionByEmployeeID(emp.Id);
string[] projectsId = [];
@ -54,16 +63,18 @@ namespace MarcoBMS.Services.Controllers
List<ProjectAllocation> allocation = await _projectsHelper.GetProjectByEmployeeID(emp.Id);
projectsId = allocation.Select(c => c.ProjectId.ToString()).ToArray();
}
EmployeeProfile profile = new EmployeeProfile() { };
if (featurePermission != null)
{
EmployeeVM employeeVM = EmployeeMapper.ToEmployeeVMFromEmployee(emp);
EmployeeProfile profile = new EmployeeProfile()
profile = new EmployeeProfile()
{
EmployeeInfo = employeeVM,
Projects = projectsId,
FeaturePermissions = featurePermission.Select(c => c.Id.ToString()).Distinct().ToArray(),
Features = featurePermission.Select(c => c.FeatureId.ToString()).Distinct().ToArray(),
};
}
return Ok(ApiResponse<object>.SuccessResponse(profile, "Success", 200));

View File

@ -1,6 +1,9 @@
using Marco.Pms.Model.Dtos.Employees;
using Marco.Pms.DataAccess.Data;
using Marco.Pms.Model.Dtos.Employees;
using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
namespace MarcoBMS.Services.Helpers
@ -9,11 +12,13 @@ namespace MarcoBMS.Services.Helpers
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ApplicationDbContext _context;
public UserHelper(UserManager<IdentityUser> userManager, IHttpContextAccessor httpContextAccessor)
public UserHelper(UserManager<IdentityUser> userManager, IHttpContextAccessor httpContextAccessor,ApplicationDbContext context)
{
_userManager = userManager;
_httpContextAccessor = httpContextAccessor;
_context = context;
}
public int GetTenantId()
@ -31,6 +36,12 @@ namespace MarcoBMS.Services.Helpers
var user = await _userManager.FindByEmailAsync(userId);
return user; //await _userManager.FindByIdAsync(userId);
}
public async Task<Employee> GetCurrentEmployeeAsync()
{
var user = await GetCurrentUserAsync();
var Employee = await _context.Employees.FirstOrDefaultAsync(e => e.ApplicationUserId == user.Id);
return Employee;
}
public async Task<object?> GetCurrentUserProfileAsync()
{

View File

@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Marco.Pms.Utility
{
@ -19,8 +14,11 @@ namespace Marco.Pms.Utility
{
return Activator.CreateInstance<T>();
}
return JsonConvert.DeserializeObject<T>(json);
var result = JsonConvert.DeserializeObject<T>(json);
if (result == null) {
return Activator.CreateInstance<T>();
}
return result;
}
}
}