Added the Promoter and PMC in project

This commit is contained in:
ashutosh.nehete 2025-09-17 18:09:58 +05:30
parent 0eb740fa25
commit 4a25158cc9
13 changed files with 6478 additions and 97 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,136 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Marco.Pms.DataAccess.Migrations
{
/// <inheritdoc />
public partial class Added_Promoter_And_PMC_In_Project_Table_As_Forgin_Key : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Employees_Tenants_TenantId",
table: "Employees");
migrationBuilder.AddColumn<Guid>(
name: "PMCId",
table: "Projects",
type: "char(36)",
nullable: false,
defaultValue: new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"),
collation: "ascii_general_ci");
migrationBuilder.AddColumn<Guid>(
name: "PromoterId",
table: "Projects",
type: "char(36)",
nullable: false,
defaultValue: new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"),
collation: "ascii_general_ci");
migrationBuilder.AlterColumn<Guid>(
name: "TenantId",
table: "Employees",
type: "char(36)",
nullable: true,
collation: "ascii_general_ci",
oldClrType: typeof(Guid),
oldType: "char(36)")
.OldAnnotation("Relational:Collation", "ascii_general_ci");
migrationBuilder.UpdateData(
table: "Projects",
keyColumn: "Id",
keyValue: new Guid("85bf587b-7ca9-4685-b77c-d817f5847e85"),
columns: new[] { "PMCId", "PromoterId" },
values: new object[] { new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"), new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea") });
migrationBuilder.CreateIndex(
name: "IX_Projects_PMCId",
table: "Projects",
column: "PMCId");
migrationBuilder.CreateIndex(
name: "IX_Projects_PromoterId",
table: "Projects",
column: "PromoterId");
migrationBuilder.AddForeignKey(
name: "FK_Employees_Tenants_TenantId",
table: "Employees",
column: "TenantId",
principalTable: "Tenants",
principalColumn: "Id");
migrationBuilder.AddForeignKey(
name: "FK_Projects_Organizations_PMCId",
table: "Projects",
column: "PMCId",
principalTable: "Organizations",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "FK_Projects_Organizations_PromoterId",
table: "Projects",
column: "PromoterId",
principalTable: "Organizations",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Employees_Tenants_TenantId",
table: "Employees");
migrationBuilder.DropForeignKey(
name: "FK_Projects_Organizations_PMCId",
table: "Projects");
migrationBuilder.DropForeignKey(
name: "FK_Projects_Organizations_PromoterId",
table: "Projects");
migrationBuilder.DropIndex(
name: "IX_Projects_PMCId",
table: "Projects");
migrationBuilder.DropIndex(
name: "IX_Projects_PromoterId",
table: "Projects");
migrationBuilder.DropColumn(
name: "PMCId",
table: "Projects");
migrationBuilder.DropColumn(
name: "PromoterId",
table: "Projects");
migrationBuilder.AlterColumn<Guid>(
name: "TenantId",
table: "Employees",
type: "char(36)",
nullable: false,
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"),
collation: "ascii_general_ci",
oldClrType: typeof(Guid),
oldType: "char(36)",
oldNullable: true)
.OldAnnotation("Relational:Collation", "ascii_general_ci");
migrationBuilder.AddForeignKey(
name: "FK_Employees_Tenants_TenantId",
table: "Employees",
column: "TenantId",
principalTable: "Tenants",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -1250,7 +1250,7 @@ namespace Marco.Pms.DataAccess.Migrations
b.Property<byte[]>("Photo") b.Property<byte[]>("Photo")
.HasColumnType("longblob"); .HasColumnType("longblob");
b.Property<Guid>("TenantId") b.Property<Guid?>("TenantId")
.HasColumnType("char(36)"); .HasColumnType("char(36)");
b.HasKey("Id"); b.HasKey("Id");
@ -3852,12 +3852,18 @@ namespace Marco.Pms.DataAccess.Migrations
.IsRequired() .IsRequired()
.HasColumnType("longtext"); .HasColumnType("longtext");
b.Property<Guid>("PMCId")
.HasColumnType("char(36)");
b.Property<string>("ProjectAddress") b.Property<string>("ProjectAddress")
.HasColumnType("longtext"); .HasColumnType("longtext");
b.Property<Guid>("ProjectStatusId") b.Property<Guid>("ProjectStatusId")
.HasColumnType("char(36)"); .HasColumnType("char(36)");
b.Property<Guid>("PromoterId")
.HasColumnType("char(36)");
b.Property<string>("ShortName") b.Property<string>("ShortName")
.HasColumnType("longtext"); .HasColumnType("longtext");
@ -3869,8 +3875,12 @@ namespace Marco.Pms.DataAccess.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.HasIndex("PMCId");
b.HasIndex("ProjectStatusId"); b.HasIndex("ProjectStatusId");
b.HasIndex("PromoterId");
b.HasIndex("TenantId"); b.HasIndex("TenantId");
b.ToTable("Projects"); b.ToTable("Projects");
@ -3882,8 +3892,10 @@ namespace Marco.Pms.DataAccess.Migrations
ContactPerson = "Project 1 Contact Person", ContactPerson = "Project 1 Contact Person",
EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified),
Name = "Project 1", Name = "Project 1",
PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"),
ProjectAddress = "Project 1 Address", ProjectAddress = "Project 1 Address",
ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"), ProjectStatusId = new Guid("b74da4c2-d07e-46f2-9919-e75e49b12731"),
PromoterId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"),
StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified), StartDate = new DateTime(2025, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified),
TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26") TenantId = new Guid("b3466e83-7e11-464c-b93a-daf047838b26")
}); });
@ -5146,9 +5158,7 @@ namespace Marco.Pms.DataAccess.Migrations
b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant")
.WithMany() .WithMany()
.HasForeignKey("TenantId") .HasForeignKey("TenantId");
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ApplicationUser"); b.Navigation("ApplicationUser");
@ -5830,20 +5840,36 @@ namespace Marco.Pms.DataAccess.Migrations
modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b => modelBuilder.Entity("Marco.Pms.Model.Projects.Project", b =>
{ {
b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "PMC")
.WithMany()
.HasForeignKey("PMCId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus") b.HasOne("Marco.Pms.Model.Master.StatusMaster", "ProjectStatus")
.WithMany() .WithMany()
.HasForeignKey("ProjectStatusId") .HasForeignKey("ProjectStatusId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter")
.WithMany()
.HasForeignKey("PromoterId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant") b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant")
.WithMany() .WithMany()
.HasForeignKey("TenantId") .HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.Navigation("PMC");
b.Navigation("ProjectStatus"); b.Navigation("ProjectStatus");
b.Navigation("Promoter");
b.Navigation("Tenant"); b.Navigation("Tenant");
}); });

View File

@ -1,13 +1,13 @@
using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.OrganizationModel;
using Marco.Pms.Model.Roles; using Marco.Pms.Model.Roles;
using Marco.Pms.Model.Utilities; using Marco.Pms.Model.TenantModels;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Employees namespace Marco.Pms.Model.Employees
{ {
public class Employee : TenantRelation public class Employee
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public string FirstName { get; set; } = string.Empty; public string FirstName { get; set; } = string.Empty;
@ -42,6 +42,12 @@ namespace Marco.Pms.Model.Employees
[ForeignKey("OrganizationId")] [ForeignKey("OrganizationId")]
public Organization? Organization { get; set; } public Organization? Organization { get; set; }
public Guid? TenantId { get; set; }
[ValidateNever]
[ForeignKey("TenantId")]
public Tenant? Tenant { get; set; }
} }
} }

View File

@ -36,7 +36,7 @@ namespace Marco.Pms.Model.Mapper
IsRootUser = model.ApplicationUser?.IsRootUser ?? false, IsRootUser = model.ApplicationUser?.IsRootUser ?? false,
IsSystem = model.IsSystem, IsSystem = model.IsSystem,
JoiningDate = model.JoiningDate, JoiningDate = model.JoiningDate,
TenantId = model.TenantId TenantId = model.TenantId ?? Guid.Empty
}; };
} }
public static BasicEmployeeVM ToBasicEmployeeVMFromEmployee(this Employee employee) public static BasicEmployeeVM ToBasicEmployeeVMFromEmployee(this Employee employee)

View File

@ -1,9 +1,10 @@
using System.ComponentModel; using Marco.Pms.Model.Master;
using System.ComponentModel.DataAnnotations; using Marco.Pms.Model.OrganizationModel;
using System.ComponentModel.DataAnnotations.Schema;
using Marco.Pms.Model.Master;
using Marco.Pms.Model.Utilities; using Marco.Pms.Model.Utilities;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Marco.Pms.Model.Projects namespace Marco.Pms.Model.Projects
{ {
@ -32,5 +33,16 @@ namespace Marco.Pms.Model.Projects
[ValidateNever] [ValidateNever]
[ForeignKey(nameof(ProjectStatusId))] [ForeignKey(nameof(ProjectStatusId))]
public StatusMaster? ProjectStatus { get; set; } public StatusMaster? ProjectStatus { get; set; }
public Guid PromoterId { get; set; } = Guid.Parse("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea");
[ValidateNever]
[ForeignKey("PromoterId")]
public Organization? Promoter { get; set; }
public Guid PMCId { get; set; } = Guid.Parse("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea");
[ValidateNever]
[ForeignKey("PMCId")]
public Organization? PMC { get; set; }
} }
} }

View File

@ -98,7 +98,7 @@ namespace MarcoBMS.Services.Controllers
} }
// Generate tokens // Generate tokens
var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId, _jwtSettings); var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId ?? Guid.Empty, _jwtSettings);
var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings); var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
_logger.LogInfo("User login successful - UserId: {UserId}", user.Id); _logger.LogInfo("User login successful - UserId: {UserId}", user.Id);
@ -167,7 +167,7 @@ namespace MarcoBMS.Services.Controllers
} }
// Generate JWT token // Generate JWT token
var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId, _jwtSettings); var token = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId ?? Guid.Empty, _jwtSettings);
// Generate Refresh Token and store in DB // Generate Refresh Token and store in DB
var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings); var refreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
@ -358,7 +358,7 @@ namespace MarcoBMS.Services.Controllers
// Step 4: Fetch employee and generate new tokens // Step 4: Fetch employee and generate new tokens
var emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id); var emp = await _employeeHelper.GetEmployeeByApplicationUserID(user.Id);
var newJwtToken = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId, _jwtSettings); var newJwtToken = _refreshTokenService.GenerateJwtToken(user.UserName, emp.TenantId ?? Guid.Empty, _jwtSettings);
var newRefreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings); var newRefreshToken = await _refreshTokenService.CreateRefreshToken(user.Id, emp.TenantId.ToString(), _jwtSettings);
_logger.LogInfo("New access and refresh token issued for user: {UserId}", user.Id); _logger.LogInfo("New access and refresh token issued for user: {UserId}", user.Id);
@ -610,7 +610,7 @@ namespace MarcoBMS.Services.Controllers
// Generate access and refresh tokens // Generate access and refresh tokens
var accessToken = _refreshTokenService.GenerateJwtToken( var accessToken = _refreshTokenService.GenerateJwtToken(
requestEmployee.ApplicationUser?.UserName, requestEmployee.ApplicationUser?.UserName,
requestEmployee.TenantId, requestEmployee.TenantId ?? Guid.Empty,
_jwtSettings _jwtSettings
); );

View File

@ -880,7 +880,7 @@ namespace Marco.Pms.Services.Controllers
if (documentAttachment == null) if (documentAttachment == null)
{ {
_logger.LogWarning("Document attachment not found. Requested Id: {DocumentId}, TenantId: {TenantId}", id, tenantId); _logger.LogWarning("Document attachment not found. Requested Id: {DocumentId}, TenantId: {TenantId}", id, tenantId ?? Guid.Empty);
return NotFound(ApiResponse<object>.ErrorResponse("Attachment not found", "Attachment not found in database", 404)); return NotFound(ApiResponse<object>.ErrorResponse("Attachment not found", "Attachment not found in database", 404));
} }

View File

@ -52,7 +52,7 @@ namespace Marco.Pms.Services.Controllers
public async Task<IActionResult> CreateGlobalService([FromBody] ServiceMasterDto serviceMasterDto) public async Task<IActionResult> CreateGlobalService([FromBody] ServiceMasterDto serviceMasterDto)
{ {
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var response = await _masterService.CreateServiceAsync(serviceMasterDto, loggedInEmployee, tenantId); var response = await _masterService.CreateGlobalServiceAsync(serviceMasterDto, loggedInEmployee, tenantId);
return StatusCode(response.StatusCode, response); return StatusCode(response.StatusCode, response);
} }
@ -181,7 +181,7 @@ namespace Marco.Pms.Services.Controllers
var employee = await _userHelper.GetCurrentEmployeeAsync(); var employee = await _userHelper.GetCurrentEmployeeAsync();
if (employee.TenantId != tenantId) if (employee.TenantId != tenantId)
{ {
_logger.LogWarning("User from tenant {employeeTenantId} tries to access data from tenant {tenantId}", employee.TenantId, tenantId); _logger.LogWarning("User from tenant {employeeTenantId} tries to access data from tenant {tenantId}", employee.TenantId ?? Guid.Empty, 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)); 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); var activityMaster = createActivity.ToActivityMasterFromCreateActivityMasterDto(tenantId);

View File

@ -5,6 +5,7 @@ using Marco.Pms.Model.Employees;
using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Entitlements;
using Marco.Pms.Model.OrganizationModel; using Marco.Pms.Model.OrganizationModel;
using Marco.Pms.Model.Utilities; using Marco.Pms.Model.Utilities;
using Marco.Pms.Model.ViewModels.Activities;
using Marco.Pms.Model.ViewModels.Organization; using Marco.Pms.Model.ViewModels.Organization;
using Marco.Pms.Services.Service; using Marco.Pms.Services.Service;
using MarcoBMS.Services.Helpers; using MarcoBMS.Services.Helpers;
@ -100,14 +101,29 @@ namespace Marco.Pms.Services.Controllers
{ {
await using var _context = await _dbContextFactory.CreateDbContextAsync(); await using var _context = await _dbContextFactory.CreateDbContextAsync();
using var scope = _serviceScope.CreateScope(); using var scope = _serviceScope.CreateScope();
await using var transaction = await _context.Database.BeginTransactionAsync();
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>(); try
{
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var hasPermission = await _permission.HasPermission(PermissionsMaster.AddOrganization, loggedInEmployee.Id); var hasPermissionTask = Task.Run(async () =>
{
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
return await permissionService.HasPermission(PermissionsMaster.AddOrganization, loggedInEmployee.Id);
});
if (!hasPermission) var IsPrimaryOrganizationTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.Tenants.AnyAsync(t => t.OrganizationId == loggedInEmployee.OrganizationId);
});
await Task.WhenAll(hasPermissionTask, IsPrimaryOrganizationTask);
var hasPermission = hasPermissionTask.Result;
var IsPrimaryOrganization = IsPrimaryOrganizationTask.Result;
if (!hasPermission && !IsPrimaryOrganization)
{ {
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied", "You do not have permission to create new service provider.", 403)); return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied", "You do not have permission to create new service provider.", 403));
} }
@ -119,6 +135,7 @@ namespace Marco.Pms.Services.Controllers
Organization organization = _mapper.Map<Organization>(model); Organization organization = _mapper.Map<Organization>(model);
organization.SPRID = lastSPRID + 1; organization.SPRID = lastSPRID + 1;
organization.CreatedAt = DateTime.UtcNow; organization.CreatedAt = DateTime.UtcNow;
organization.CreatedById = loggedInEmployee.Id;
organization.IsActive = true; organization.IsActive = true;
_context.Organizations.Add(organization); _context.Organizations.Add(organization);
@ -141,9 +158,9 @@ namespace Marco.Pms.Services.Controllers
if (!result.Succeeded) if (!result.Succeeded)
return BadRequest(ApiResponse<object>.ErrorResponse("Failed to create user", result.Errors, 400)); return BadRequest(ApiResponse<object>.ErrorResponse("Failed to create user", result.Errors, 400));
var jobRole = await _context.ApplicationRoles.FirstOrDefaultAsync(ar => ar.Role == "Admin" && ar.TenantId == tenantId); var jobRole = await _context.JobRoles.FirstOrDefaultAsync(jr => jr.Name == "Admin" && jr.TenantId == tenantId);
if (jobRole == null) if (jobRole == null)
jobRole = await _context.ApplicationRoles.FirstOrDefaultAsync(ar => ar.TenantId == tenantId); jobRole = await _context.JobRoles.FirstOrDefaultAsync(jr => jr.TenantId == tenantId);
var fullName = model.ContactPerson.Split(" "); var fullName = model.ContactPerson.Split(" ");
@ -160,13 +177,27 @@ namespace Marco.Pms.Services.Controllers
IsActive = true, IsActive = true,
IsSystem = false, IsSystem = false,
IsPrimary = true, IsPrimary = true,
OrganizationId = organization.Id, OrganizationId = organization.Id
TenantId = tenantId
}; };
if (newEmployee.ApplicationUserId != null)
{
newEmployee.HasApplicationAccess = true;
}
_context.Employees.Add(newEmployee); _context.Employees.Add(newEmployee);
var serviceOrgMapping = model.ServiceIds.Select(s => new OrgServiceMapping
{
ServiceId = s,
OrganizationId = organization.Id
}).ToList();
_context.OrgServiceMappings.AddRange(serviceOrgMapping);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
await transaction.CommitAsync();
/* SEND USER REGISTRATION MAIL*/ /* SEND USER REGISTRATION MAIL*/
var token = await _userManager.GeneratePasswordResetTokenAsync(user); var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}"; var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}";
@ -176,9 +207,23 @@ namespace Marco.Pms.Services.Controllers
} }
var response = _mapper.Map<OrganizationVM>(organization); var response = _mapper.Map<OrganizationVM>(organization);
response.CreatedBy = _mapper.Map<BasicEmployeeVM>(loggedInEmployee);
return Ok(ApiResponse<object>.SuccessResponse(response, "Successfully created the service provider", 200)); return Ok(ApiResponse<object>.SuccessResponse(response, "Successfully created the service provider", 200));
} }
catch (DbUpdateException dbEx)
{
await transaction.RollbackAsync();
_logger.LogError(dbEx, "Database Exception has been occured");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Internal error", "An database exception has been occured", 500));
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception has been occured");
return StatusCode(500, ApiResponse<object>.ErrorResponse("Internal error", "An internal exception has been occured", 500));
}
}
//[HttpPost("assign/project")] //[HttpPost("assign/project")]
//public async Task<IActionResult> AssignServiceProviderToProjectAsync([FromBody] AssignOrganizationDto model) //public async Task<IActionResult> AssignServiceProviderToProjectAsync([FromBody] AssignOrganizationDto model)

View File

@ -63,7 +63,7 @@ namespace MarcoBMS.Services.Controllers
/* User with permission manage project can see all projects */ /* User with permission manage project can see all projects */
if (featurePermission != null && featurePermission.Exists(c => c.Id.ToString() == "172fc9b6-755b-4f62-ab26-55c34a330614")) if (featurePermission != null && featurePermission.Exists(c => c.Id.ToString() == "172fc9b6-755b-4f62-ab26-55c34a330614"))
{ {
List<Project> projects = await _projectServices.GetAllProjectByTanentID(emp.TenantId); List<Project> projects = await _projectServices.GetAllProjectByTanentID(emp.TenantId ?? Guid.Empty);
projectsId = projects.Select(c => c.Id.ToString()).ToArray(); projectsId = projects.Select(c => c.Id.ToString()).ToArray();
} }
else else

View File

@ -8,6 +8,7 @@ using Marco.Pms.Model.Dtos.Directory;
using Marco.Pms.Model.Dtos.DocumentManager; using Marco.Pms.Model.Dtos.DocumentManager;
using Marco.Pms.Model.Dtos.Expenses; using Marco.Pms.Model.Dtos.Expenses;
using Marco.Pms.Model.Dtos.Master; using Marco.Pms.Model.Dtos.Master;
using Marco.Pms.Model.Dtos.Organization;
using Marco.Pms.Model.Dtos.Project; using Marco.Pms.Model.Dtos.Project;
using Marco.Pms.Model.Dtos.Tenant; using Marco.Pms.Model.Dtos.Tenant;
using Marco.Pms.Model.Employees; using Marco.Pms.Model.Employees;
@ -19,6 +20,7 @@ using Marco.Pms.Model.MongoDBModels.Employees;
using Marco.Pms.Model.MongoDBModels.Expenses; using Marco.Pms.Model.MongoDBModels.Expenses;
using Marco.Pms.Model.MongoDBModels.Masters; using Marco.Pms.Model.MongoDBModels.Masters;
using Marco.Pms.Model.MongoDBModels.Project; using Marco.Pms.Model.MongoDBModels.Project;
using Marco.Pms.Model.OrganizationModel;
using Marco.Pms.Model.Projects; using Marco.Pms.Model.Projects;
using Marco.Pms.Model.TenantModels; using Marco.Pms.Model.TenantModels;
using Marco.Pms.Model.TenantModels.MongoDBModel; using Marco.Pms.Model.TenantModels.MongoDBModel;
@ -29,6 +31,7 @@ using Marco.Pms.Model.ViewModels.Employee;
using Marco.Pms.Model.ViewModels.Expanses; using Marco.Pms.Model.ViewModels.Expanses;
using Marco.Pms.Model.ViewModels.Expenses; using Marco.Pms.Model.ViewModels.Expenses;
using Marco.Pms.Model.ViewModels.Master; using Marco.Pms.Model.ViewModels.Master;
using Marco.Pms.Model.ViewModels.Organization;
using Marco.Pms.Model.ViewModels.Projects; using Marco.Pms.Model.ViewModels.Projects;
using Marco.Pms.Model.ViewModels.Tenant; using Marco.Pms.Model.ViewModels.Tenant;
@ -38,6 +41,13 @@ namespace Marco.Pms.Services.MappingProfiles
{ {
public MappingProfile() public MappingProfile()
{ {
#region ======================================================= Organization =======================================================
CreateMap<CreateOrganizationDto, Organization>();
CreateMap<Organization, OrganizationVM>();
#endregion
#region ======================================================= Tenant ======================================================= #region ======================================================= Tenant =======================================================
CreateMap<Tenant, TenantVM>(); CreateMap<Tenant, TenantVM>();
CreateMap<Tenant, TenantListVM>(); CreateMap<Tenant, TenantListVM>();

View File

@ -103,11 +103,9 @@ namespace Marco.Pms.Services.Service
_context.GlobalServiceMasters.Add(service); _context.GlobalServiceMasters.Add(service);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
var response = _mapper.Map<ServiceMasterVM>(service);
_logger.LogInfo("New global service '{ServiceName}' created successfully by employeeId: {EmployeeId}", service.Name, loggedInEmployee.Id); _logger.LogInfo("New global service '{ServiceName}' created successfully by employeeId: {EmployeeId}", service.Name, loggedInEmployee.Id);
return ApiResponse<object>.SuccessResponse(response, "New global service created successfully", 201); return ApiResponse<object>.SuccessResponse(service, "New global service created successfully", 201);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -1721,7 +1719,7 @@ namespace Marco.Pms.Services.Service
if (tenantId != loggedInEmployee.TenantId) if (tenantId != loggedInEmployee.TenantId)
{ {
_logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document categories for TenantId: {RequestedTenantId}", _logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document categories for TenantId: {RequestedTenantId}",
loggedInEmployee.Id, loggedInEmployee.TenantId, tenantId); loggedInEmployee.Id, loggedInEmployee.TenantId ?? Guid.Empty, tenantId);
return ApiResponse<object>.ErrorResponse("Access Denied", "You do not have access to this information", 403); return ApiResponse<object>.ErrorResponse("Access Denied", "You do not have access to this information", 403);
} }
@ -1969,7 +1967,7 @@ namespace Marco.Pms.Services.Service
if (tenantId != loggedInEmployee.TenantId) if (tenantId != loggedInEmployee.TenantId)
{ {
_logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document types for TenantId: {RequestedTenantId}", _logger.LogWarning("Access denied. Employee {EmployeeId} (TenantId: {EmployeeTenantId}) attempted to fetch document types for TenantId: {RequestedTenantId}",
loggedInEmployee.Id, loggedInEmployee.TenantId, tenantId); loggedInEmployee.Id, loggedInEmployee.TenantId ?? Guid.Empty, tenantId);
return ApiResponse<object>.ErrorResponse("Access Denied", "You do not have access to this information", 403); return ApiResponse<object>.ErrorResponse("Access Denied", "You do not have access to this information", 403);
} }