using Indotalent.ConfigBackEnd.Extensions; using Indotalent.Infrastructure.Database; using MediatR; namespace Indotalent.Features.Performance.Appraisal.Cqrs; public class CreateAppraisalRequest { public string EmployeeId { get; set; } = string.Empty; public string LastRating { get; set; } = string.Empty; public decimal CurrentSalary { get; set; } public decimal IncrementPercentage { get; set; } public decimal NewSalary { get; set; } public string AppraisalType { get; set; } = string.Empty; public DateTime EffectiveDate { get; set; } public string AppraisalNote { get; set; } = string.Empty; public string Status { get; set; } = string.Empty; } public class CreateAppraisalResponse { public string? Id { get; set; } public string? AutoNumber { get; set; } } public record CreateAppraisalCommand(CreateAppraisalRequest Data) : IRequest; public class CreateAppraisalHandler : IRequestHandler { private readonly AppDbContext _context; public CreateAppraisalHandler(AppDbContext context) => _context = context; public async Task Handle(CreateAppraisalCommand request, CancellationToken cancellationToken) { var entityName = nameof(Data.Entities.Appraisal); var autoNo = await _context.GenerateAutoNumberAsync( entityName: entityName, prefixTemplate: $"{entityName.ToShortNameConsonant(3)}/{{Year}}/", ct: cancellationToken ); var entity = new Data.Entities.Appraisal { AutoNumber = autoNo, EmployeeId = request.Data.EmployeeId, LastRating = request.Data.LastRating, CurrentSalary = request.Data.CurrentSalary, IncrementPercentage = request.Data.IncrementPercentage, NewSalary = request.Data.NewSalary, AppraisalType = request.Data.AppraisalType, EffectiveDate = request.Data.EffectiveDate, AppraisalNote = request.Data.AppraisalNote, Status = request.Data.Status }; _context.Appraisal.Add(entity); await _context.SaveChangesAsync(cancellationToken); return new CreateAppraisalResponse { Id = entity.Id, AutoNumber = entity.AutoNumber }; } }