diff --git a/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs b/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs new file mode 100644 index 0000000..fb89b64 --- /dev/null +++ b/Marco.Pms.Model/Dtos/Master/PaymentModeMatserDto.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.Dtos.Master +{ + public class PaymentModeMatserDto + { + public Guid? Id { get; set; } + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + } +} diff --git a/Marco.Pms.Services/Controllers/MasterController.cs b/Marco.Pms.Services/Controllers/MasterController.cs index 0a5a7a8..d959046 100644 --- a/Marco.Pms.Services/Controllers/MasterController.cs +++ b/Marco.Pms.Services/Controllers/MasterController.cs @@ -908,6 +908,13 @@ namespace Marco.Pms.Services.Controllers return StatusCode(response.StatusCode, response); } + [HttpPost("payment-mode")] + public async Task CreatePaymentMode(PaymentModeMatserDto dto) + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + var response = await _masterService.CreatePaymentModeAsync(dto, loggedInEmployee, tenantId); + return StatusCode(response.StatusCode, response); + } #endregion } diff --git a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs index 5db13c1..6453bcd 100644 --- a/Marco.Pms.Services/MappingProfiles/MappingProfile.cs +++ b/Marco.Pms.Services/MappingProfiles/MappingProfile.cs @@ -188,6 +188,9 @@ namespace Marco.Pms.Services.MappingProfiles #endregion #region ======================================================= Master ======================================================= + + #region ======================================================= Expenses Type Master ======================================================= + CreateMap() .ForMember( dest => dest.Id, @@ -195,8 +198,6 @@ namespace Marco.Pms.Services.MappingProfiles opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) ); CreateMap(); - CreateMap(); - CreateMap(); CreateMap() .ForMember( @@ -205,10 +206,16 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion + + #region ======================================================= Expenses Status Master ======================================================= + + CreateMap(); CreateMap() .ForMember( @@ -217,10 +224,22 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion + + #region ======================================================= Payment Mode Matser ======================================================= + + CreateMap() + .ForMember( + dest => dest.Id, + // Explicitly and safely convert nullable Guid to non-nullable Guid + opt => opt.MapFrom(src => src.Id != null ? src.Id : Guid.Empty) + ); + CreateMap(); CreateMap() .ForMember( @@ -229,11 +248,13 @@ namespace Marco.Pms.Services.MappingProfiles .ForMember( dest => dest.TenantId, opt => opt.MapFrom(src => src.TenantId.ToString())); + CreateMap() .ForMember( dest => dest.Id, opt => opt.MapFrom(src => Guid.Parse(src.Id))); + #endregion #endregion diff --git a/Marco.Pms.Services/Service/MasterService.cs b/Marco.Pms.Services/Service/MasterService.cs index 5e816aa..12ca747 100644 --- a/Marco.Pms.Services/Service/MasterService.cs +++ b/Marco.Pms.Services/Service/MasterService.cs @@ -169,6 +169,47 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Internal Error occured while featching list of payment modes list", ExceptionMapper(ex), 500); } } + public async Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId) + { + try + { + // Validation if employee is taking action in same tenant + if (tenantId != loggedInEmployee.TenantId) + { + _logger.LogWarning("Employee {EmployeeId} attempted to add new payment mode in different tenant", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied", "User do not have access for this information", 403); + } + var hasManagePermission = await _permission.HasPermission(PermissionsMaster.ManageMasters, loggedInEmployee.Id); + if (!hasManagePermission) + { + _logger.LogWarning("Access DENIED for employee {EmployeeId} for managing PAYMENT MODE MASTER.", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Access Denied.", "You do not have permission to Upload expenses for this project", 403); + + } + // Mapping the DTO to PaymentModeMatser Model + var paymentMode = _mapper.Map(model); + paymentMode.TenantId = tenantId; + + _context.PaymentModeMatser.Add(paymentMode); + await _context.SaveChangesAsync(); + + _logger.LogInfo("New Payment Mode {PaymentModeId} was added by employee {EmployeeId}", paymentMode.Id, loggedInEmployee.Id); + + // Mapping the PaymentModeMatser Model to View Model + var response = _mapper.Map(paymentMode); + return ApiResponse.SuccessResponse(response, "Payment Mode craeted Successfully", 201); + } + catch (DbUpdateException dbEx) + { + _logger.LogError(dbEx, "Database Exception occured while adding new payment mode by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(dbEx), 500); + } + catch (Exception ex) + { + _logger.LogError(ex, "Exception occured while adding new payment mode by employee {EmployeeId}", loggedInEmployee.Id); + return ApiResponse.ErrorResponse("Internal Error occured", ExceptionMapper(ex), 500); + } + } #endregion diff --git a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs index 13bdcbb..fb2e86c 100644 --- a/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs +++ b/Marco.Pms.Services/Service/ServiceInterfaces/IMasterService.cs @@ -17,6 +17,7 @@ namespace Marco.Pms.Services.Service.ServiceInterfaces #endregion #region =================================================================== Payment mode APIs =================================================================== Task> GetPaymentModeListAsync(Employee loggedInEmployee, Guid tenantId); + Task> CreatePaymentModeAsync(PaymentModeMatserDto model, Employee loggedInEmployee, Guid tenantId); #endregion }