using Indotalent.ConfigBackEnd.Exceptions; using Indotalent.Infrastructure.Database; using MediatR; using Microsoft.EntityFrameworkCore; namespace Indotalent.Features.Organization.Employee.Cqrs; public class UpdateEmployeeRequest : CreateEmployeeRequest { public string Id { get; set; } = string.Empty; public DateTimeOffset? CreatedAt { get; set; } public string? CreatedBy { get; set; } public DateTimeOffset? UpdatedAt { get; set; } public string? UpdatedBy { get; set; } } public class UpdateEmployeeResponse { public string? Id { get; set; } public bool Success { get; set; } } public record UpdateEmployeeCommand(UpdateEmployeeRequest Data) : IRequest; public class UpdateEmployeeHandler : IRequestHandler { private readonly AppDbContext _context; public UpdateEmployeeHandler(AppDbContext context) => _context = context; public async Task Handle(UpdateEmployeeCommand request, CancellationToken cancellationToken) { var entity = await _context.Employee.FirstOrDefaultAsync(x => x.Id == request.Data.Id, cancellationToken); if (entity == null) return new UpdateEmployeeResponse { Id = request.Data.Id, Success = false }; var isExists = await _context.Employee.AnyAsync(x => x.Code == request.Data.Code && x.Id != request.Data.Id, cancellationToken); if (isExists) throw new AlreadyExistsException("Employee", request.Data.Code); entity.Code = request.Data.Code; entity.FirstName = request.Data.FirstName; entity.MiddleName = request.Data.MiddleName; entity.LastName = request.Data.LastName; entity.JobDescription = request.Data.JobDescription; entity.GradeId = request.Data.GradeId; entity.BasicSalary = request.Data.BasicSalary; entity.SalaryBankName = request.Data.SalaryBankName; entity.SalaryBankAccountName = request.Data.SalaryBankAccountName; entity.SalaryBankAccountNumber = request.Data.SalaryBankAccountNumber; entity.PlaceOfBirth = request.Data.PlaceOfBirth; entity.DateOfBirth = request.Data.DateOfBirth; entity.Gender = request.Data.Gender; entity.MaritalStatus = request.Data.MaritalStatus; entity.Religion = request.Data.Religion; entity.BloodType = request.Data.BloodType; entity.IdentityNumber = request.Data.IdentityNumber; entity.TaxNumber = request.Data.TaxNumber; entity.LastEducation = request.Data.LastEducation; entity.JoinedDate = request.Data.JoinedDate; entity.ResignedDate = request.Data.ResignedDate; entity.EmployeeStatus = request.Data.EmployeeStatus; entity.EmploymentType = request.Data.EmploymentType; entity.StreetAddress = request.Data.StreetAddress; entity.City = request.Data.City; entity.StateProvince = request.Data.StateProvince; entity.ZipCode = request.Data.ZipCode; entity.Phone = request.Data.Phone; entity.Email = request.Data.Email; entity.BranchId = request.Data.BranchId; entity.DepartmentId = request.Data.DepartmentId; entity.DesignationId = request.Data.DesignationId; entity.SocialMediaLinkedIn = request.Data.SocialMediaLinkedIn; entity.SocialMediaX = request.Data.SocialMediaX; entity.SocialMediaFacebook = request.Data.SocialMediaFacebook; entity.SocialMediaInstagram = request.Data.SocialMediaInstagram; entity.SocialMediaTikTok = request.Data.SocialMediaTikTok; entity.OtherInformation1 = request.Data.OtherInformation1; entity.OtherInformation2 = request.Data.OtherInformation2; entity.OtherInformation3 = request.Data.OtherInformation3; await _context.SaveChangesAsync(cancellationToken); return new UpdateEmployeeResponse { Id = entity.Id, Success = true }; } }