Added the Promoter and PMC in project
This commit is contained in:
parent
0eb740fa25
commit
4a25158cc9
File diff suppressed because one or more lines are too long
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1250,7 +1250,7 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
b.Property<byte[]>("Photo")
|
||||
.HasColumnType("longblob");
|
||||
|
||||
b.Property<Guid>("TenantId")
|
||||
b.Property<Guid?>("TenantId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.HasKey("Id");
|
||||
@ -3852,12 +3852,18 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
.IsRequired()
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<Guid>("PMCId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<string>("ProjectAddress")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
b.Property<Guid>("ProjectStatusId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<Guid>("PromoterId")
|
||||
.HasColumnType("char(36)");
|
||||
|
||||
b.Property<string>("ShortName")
|
||||
.HasColumnType("longtext");
|
||||
|
||||
@ -3869,8 +3875,12 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("PMCId");
|
||||
|
||||
b.HasIndex("ProjectStatusId");
|
||||
|
||||
b.HasIndex("PromoterId");
|
||||
|
||||
b.HasIndex("TenantId");
|
||||
|
||||
b.ToTable("Projects");
|
||||
@ -3882,8 +3892,10 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
ContactPerson = "Project 1 Contact Person",
|
||||
EndDate = new DateTime(2026, 4, 20, 10, 11, 17, 588, DateTimeKind.Unspecified),
|
||||
Name = "Project 1",
|
||||
PMCId = new Guid("4e3a6d31-c640-40f7-8d67-6c109fcdb9ea"),
|
||||
ProjectAddress = "Project 1 Address",
|
||||
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),
|
||||
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")
|
||||
.WithMany()
|
||||
.HasForeignKey("TenantId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
.HasForeignKey("TenantId");
|
||||
|
||||
b.Navigation("ApplicationUser");
|
||||
|
||||
@ -5830,20 +5840,36 @@ namespace Marco.Pms.DataAccess.Migrations
|
||||
|
||||
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")
|
||||
.WithMany()
|
||||
.HasForeignKey("ProjectStatusId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Marco.Pms.Model.OrganizationModel.Organization", "Promoter")
|
||||
.WithMany()
|
||||
.HasForeignKey("PromoterId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("Marco.Pms.Model.TenantModels.Tenant", "Tenant")
|
||||
.WithMany()
|
||||
.HasForeignKey("TenantId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("PMC");
|
||||
|
||||
b.Navigation("ProjectStatus");
|
||||
|
||||
b.Navigation("Promoter");
|
||||
|
||||
b.Navigation("Tenant");
|
||||
});
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
using Marco.Pms.Model.Entitlements;
|
||||
using Marco.Pms.Model.OrganizationModel;
|
||||
using Marco.Pms.Model.Roles;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.TenantModels;
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Marco.Pms.Model.Employees
|
||||
{
|
||||
public class Employee : TenantRelation
|
||||
public class Employee
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string FirstName { get; set; } = string.Empty;
|
||||
@ -42,6 +42,12 @@ namespace Marco.Pms.Model.Employees
|
||||
[ForeignKey("OrganizationId")]
|
||||
public Organization? Organization { get; set; }
|
||||
|
||||
public Guid? TenantId { get; set; }
|
||||
|
||||
[ValidateNever]
|
||||
[ForeignKey("TenantId")]
|
||||
public Tenant? Tenant { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ namespace Marco.Pms.Model.Mapper
|
||||
IsRootUser = model.ApplicationUser?.IsRootUser ?? false,
|
||||
IsSystem = model.IsSystem,
|
||||
JoiningDate = model.JoiningDate,
|
||||
TenantId = model.TenantId
|
||||
TenantId = model.TenantId ?? Guid.Empty
|
||||
};
|
||||
}
|
||||
public static BasicEmployeeVM ToBasicEmployeeVMFromEmployee(this Employee employee)
|
||||
|
@ -1,9 +1,10 @@
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using Marco.Pms.Model.Master;
|
||||
using Marco.Pms.Model.Master;
|
||||
using Marco.Pms.Model.OrganizationModel;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace Marco.Pms.Model.Projects
|
||||
{
|
||||
@ -32,5 +33,16 @@ namespace Marco.Pms.Model.Projects
|
||||
[ValidateNever]
|
||||
[ForeignKey(nameof(ProjectStatusId))]
|
||||
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; }
|
||||
}
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
_logger.LogInfo("User login successful - UserId: {UserId}", user.Id);
|
||||
@ -167,7 +167,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
}
|
||||
|
||||
// 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
|
||||
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
|
||||
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);
|
||||
|
||||
_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
|
||||
var accessToken = _refreshTokenService.GenerateJwtToken(
|
||||
requestEmployee.ApplicationUser?.UserName,
|
||||
requestEmployee.TenantId,
|
||||
requestEmployee.TenantId ?? Guid.Empty,
|
||||
_jwtSettings
|
||||
);
|
||||
|
||||
|
@ -880,7 +880,7 @@ namespace Marco.Pms.Services.Controllers
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,7 @@ namespace Marco.Pms.Services.Controllers
|
||||
public async Task<IActionResult> CreateGlobalService([FromBody] ServiceMasterDto serviceMasterDto)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@ -181,7 +181,7 @@ namespace Marco.Pms.Services.Controllers
|
||||
var employee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
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));
|
||||
}
|
||||
var activityMaster = createActivity.ToActivityMasterFromCreateActivityMasterDto(tenantId);
|
||||
|
@ -5,6 +5,7 @@ using Marco.Pms.Model.Employees;
|
||||
using Marco.Pms.Model.Entitlements;
|
||||
using Marco.Pms.Model.OrganizationModel;
|
||||
using Marco.Pms.Model.Utilities;
|
||||
using Marco.Pms.Model.ViewModels.Activities;
|
||||
using Marco.Pms.Model.ViewModels.Organization;
|
||||
using Marco.Pms.Services.Service;
|
||||
using MarcoBMS.Services.Helpers;
|
||||
@ -100,84 +101,128 @@ namespace Marco.Pms.Services.Controllers
|
||||
{
|
||||
await using var _context = await _dbContextFactory.CreateDbContextAsync();
|
||||
using var scope = _serviceScope.CreateScope();
|
||||
|
||||
var _permission = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
|
||||
var hasPermission = await _permission.HasPermission(PermissionsMaster.AddOrganization, loggedInEmployee.Id);
|
||||
|
||||
if (!hasPermission)
|
||||
await using var transaction = await _context.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
return StatusCode(403, ApiResponse<object>.ErrorResponse("Access Denied", "You do not have permission to create new service provider.", 403));
|
||||
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||
|
||||
var hasPermissionTask = Task.Run(async () =>
|
||||
{
|
||||
var permissionService = scope.ServiceProvider.GetRequiredService<PermissionServices>();
|
||||
return await permissionService.HasPermission(PermissionsMaster.AddOrganization, loggedInEmployee.Id);
|
||||
});
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
var lastOrganization = await _context.Organizations.OrderByDescending(sp => sp.SPRID).FirstOrDefaultAsync();
|
||||
|
||||
var lastSPRID = lastOrganization != null ? lastOrganization.SPRID : 5400;
|
||||
|
||||
Organization organization = _mapper.Map<Organization>(model);
|
||||
organization.SPRID = lastSPRID + 1;
|
||||
organization.CreatedAt = DateTime.UtcNow;
|
||||
organization.CreatedById = loggedInEmployee.Id;
|
||||
organization.IsActive = true;
|
||||
|
||||
_context.Organizations.Add(organization);
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var user = new ApplicationUser
|
||||
{
|
||||
UserName = model.Email,
|
||||
Email = model.Email,
|
||||
EmailConfirmed = true
|
||||
};
|
||||
|
||||
var _configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
|
||||
var _emailSender = scope.ServiceProvider.GetRequiredService<IEmailSender>();
|
||||
var _userManager = scope.ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>();
|
||||
|
||||
// Create Identity User
|
||||
var result = await _userManager.CreateAsync(user, "User@123");
|
||||
if (!result.Succeeded)
|
||||
return BadRequest(ApiResponse<object>.ErrorResponse("Failed to create user", result.Errors, 400));
|
||||
|
||||
var jobRole = await _context.JobRoles.FirstOrDefaultAsync(jr => jr.Name == "Admin" && jr.TenantId == tenantId);
|
||||
if (jobRole == null)
|
||||
jobRole = await _context.JobRoles.FirstOrDefaultAsync(jr => jr.TenantId == tenantId);
|
||||
|
||||
var fullName = model.ContactPerson.Split(" ");
|
||||
|
||||
Employee newEmployee = new Employee
|
||||
{
|
||||
FirstName = fullName[0],
|
||||
LastName = fullName[fullName.Length - 1],
|
||||
Email = model.Email,
|
||||
PermanentAddress = model.Address,
|
||||
CurrentAddress = model.Address,
|
||||
PhoneNumber = model.ContactNumber,
|
||||
ApplicationUserId = user.Id,
|
||||
JobRoleId = jobRole?.Id ?? Guid.Empty,
|
||||
IsActive = true,
|
||||
IsSystem = false,
|
||||
IsPrimary = true,
|
||||
OrganizationId = organization.Id
|
||||
};
|
||||
|
||||
if (newEmployee.ApplicationUserId != null)
|
||||
{
|
||||
newEmployee.HasApplicationAccess = true;
|
||||
}
|
||||
_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 transaction.CommitAsync();
|
||||
|
||||
/* SEND USER REGISTRATION MAIL*/
|
||||
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
|
||||
var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}";
|
||||
if (newEmployee.FirstName != null)
|
||||
{
|
||||
await _emailSender.SendResetPasswordEmailOnRegister(user.Email, newEmployee.FirstName, resetLink);
|
||||
}
|
||||
|
||||
var response = _mapper.Map<OrganizationVM>(organization);
|
||||
response.CreatedBy = _mapper.Map<BasicEmployeeVM>(loggedInEmployee);
|
||||
|
||||
return Ok(ApiResponse<object>.SuccessResponse(response, "Successfully created the service provider", 200));
|
||||
}
|
||||
|
||||
var lastOrganization = await _context.Organizations.OrderByDescending(sp => sp.SPRID).FirstOrDefaultAsync();
|
||||
|
||||
var lastSPRID = lastOrganization != null ? lastOrganization.SPRID : 5400;
|
||||
|
||||
Organization organization = _mapper.Map<Organization>(model);
|
||||
organization.SPRID = lastSPRID + 1;
|
||||
organization.CreatedAt = DateTime.UtcNow;
|
||||
organization.IsActive = true;
|
||||
|
||||
_context.Organizations.Add(organization);
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var user = new ApplicationUser
|
||||
catch (DbUpdateException dbEx)
|
||||
{
|
||||
UserName = model.Email,
|
||||
Email = model.Email,
|
||||
EmailConfirmed = true
|
||||
};
|
||||
await transaction.RollbackAsync();
|
||||
|
||||
var _configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
|
||||
var _emailSender = scope.ServiceProvider.GetRequiredService<IEmailSender>();
|
||||
var _userManager = scope.ServiceProvider.GetRequiredService<UserManager<ApplicationUser>>();
|
||||
|
||||
// Create Identity User
|
||||
var result = await _userManager.CreateAsync(user, "User@123");
|
||||
if (!result.Succeeded)
|
||||
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);
|
||||
if (jobRole == null)
|
||||
jobRole = await _context.ApplicationRoles.FirstOrDefaultAsync(ar => ar.TenantId == tenantId);
|
||||
|
||||
var fullName = model.ContactPerson.Split(" ");
|
||||
|
||||
Employee newEmployee = new Employee
|
||||
{
|
||||
FirstName = fullName[0],
|
||||
LastName = fullName[fullName.Length - 1],
|
||||
Email = model.Email,
|
||||
PermanentAddress = model.Address,
|
||||
CurrentAddress = model.Address,
|
||||
PhoneNumber = model.ContactNumber,
|
||||
ApplicationUserId = user.Id,
|
||||
JobRoleId = jobRole?.Id ?? Guid.Empty,
|
||||
IsActive = true,
|
||||
IsSystem = false,
|
||||
IsPrimary = true,
|
||||
OrganizationId = organization.Id,
|
||||
TenantId = tenantId
|
||||
};
|
||||
_context.Employees.Add(newEmployee);
|
||||
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
/* SEND USER REGISTRATION MAIL*/
|
||||
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
|
||||
var resetLink = $"{_configuration["AppSettings:WebFrontendUrl"]}/reset-password?token={WebUtility.UrlEncode(token)}";
|
||||
if (newEmployee.FirstName != null)
|
||||
{
|
||||
await _emailSender.SendResetPasswordEmailOnRegister(user.Email, newEmployee.FirstName, resetLink);
|
||||
_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));
|
||||
}
|
||||
|
||||
var response = _mapper.Map<OrganizationVM>(organization);
|
||||
|
||||
return Ok(ApiResponse<object>.SuccessResponse(response, "Successfully created the service provider", 200));
|
||||
}
|
||||
|
||||
//[HttpPost("assign/project")]
|
||||
|
@ -63,7 +63,7 @@ namespace MarcoBMS.Services.Controllers
|
||||
/* User with permission manage project can see all projects */
|
||||
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();
|
||||
}
|
||||
else
|
||||
|
@ -8,6 +8,7 @@ using Marco.Pms.Model.Dtos.Directory;
|
||||
using Marco.Pms.Model.Dtos.DocumentManager;
|
||||
using Marco.Pms.Model.Dtos.Expenses;
|
||||
using Marco.Pms.Model.Dtos.Master;
|
||||
using Marco.Pms.Model.Dtos.Organization;
|
||||
using Marco.Pms.Model.Dtos.Project;
|
||||
using Marco.Pms.Model.Dtos.Tenant;
|
||||
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.Masters;
|
||||
using Marco.Pms.Model.MongoDBModels.Project;
|
||||
using Marco.Pms.Model.OrganizationModel;
|
||||
using Marco.Pms.Model.Projects;
|
||||
using Marco.Pms.Model.TenantModels;
|
||||
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.Expenses;
|
||||
using Marco.Pms.Model.ViewModels.Master;
|
||||
using Marco.Pms.Model.ViewModels.Organization;
|
||||
using Marco.Pms.Model.ViewModels.Projects;
|
||||
using Marco.Pms.Model.ViewModels.Tenant;
|
||||
|
||||
@ -38,6 +41,13 @@ namespace Marco.Pms.Services.MappingProfiles
|
||||
{
|
||||
public MappingProfile()
|
||||
{
|
||||
#region ======================================================= Organization =======================================================
|
||||
|
||||
CreateMap<CreateOrganizationDto, Organization>();
|
||||
CreateMap<Organization, OrganizationVM>();
|
||||
|
||||
#endregion
|
||||
|
||||
#region ======================================================= Tenant =======================================================
|
||||
CreateMap<Tenant, TenantVM>();
|
||||
CreateMap<Tenant, TenantListVM>();
|
||||
|
@ -103,11 +103,9 @@ namespace Marco.Pms.Services.Service
|
||||
_context.GlobalServiceMasters.Add(service);
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
var response = _mapper.Map<ServiceMasterVM>(service);
|
||||
|
||||
_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)
|
||||
{
|
||||
@ -1721,7 +1719,7 @@ namespace Marco.Pms.Services.Service
|
||||
if (tenantId != loggedInEmployee.TenantId)
|
||||
{
|
||||
_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);
|
||||
}
|
||||
@ -1969,7 +1967,7 @@ namespace Marco.Pms.Services.Service
|
||||
if (tenantId != loggedInEmployee.TenantId)
|
||||
{
|
||||
_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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user