using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.GB5Solution; using GB5Shared.Resource.Response; using GB5Shared.ResponseStandard; using GB5Shared.Validation; using MMDAL.CustomCode.Charge; using MMDAL.DTO.Charge; using System; using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; namespace MMBLL.Charge { public class ChargeBLL : IChargeBLL { private readonly IChargeDAL _ChargeDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public ChargeBLL(IChargeDAL ChargeDAL, AutoNumber AutoNumber, IValidation validation) { _ChargeDAL = ChargeDAL; _AutoNumber = AutoNumber; _Validation = validation; } public async Task GetCharge(int ChargeId, LoginDTO LoginDTO) { try { return await _ChargeDAL.GetCharge(ChargeId, LoginDTO); } catch (Exception) { throw; } } public async Task SaveCharge(ChargeDTO chargeDTO, LoginDTO loginDTO) { if (chargeDTO == null) throw new ArgumentNullException(nameof(chargeDTO)); AutoNumberDTO? autoNumberDTO = null; try { // Validations await _Validation.NotEmpty(chargeDTO.ChargeCode, nameof(chargeDTO.ChargeCode)); await _Validation.NotEmpty(chargeDTO.ChargeName, nameof(chargeDTO.ChargeName)); // Modified Info chargeDTO.ChargeModifiedById = loginDTO.UserId; chargeDTO.ChargeModifiedOn = DateTime.UtcNow; int count = 1; if (chargeDTO.ChargeId == 0) { // Generate autonumber for new record autoNumberDTO = await _AutoNumber.GetAutoNumber(count, "CHARGE", loginDTO); chargeDTO.ChargeId = autoNumberDTO.StartNumber; // Created Info chargeDTO.ChargeCreatedById = loginDTO.UserId; chargeDTO.ChargeCreatedOn = DateTime.UtcNow; await _ChargeDAL.SaveCharge(chargeDTO, loginDTO); return $"{SuccessResponse.SaveSuccessMessage} {chargeDTO.ChargeId}"; } else { await _ChargeDAL.UpdateCharge(chargeDTO, loginDTO); return $"{SuccessResponse.UpdateSuccessMessage} {chargeDTO.ChargeId}"; } } catch (ValidationException vex) { throw new Exception(vex.Message); } catch (Exception) { // Rollback autonumber if failed for new entry if (autoNumberDTO != null && chargeDTO.ChargeId > 0) await _AutoNumber.RollbackAutoNumber("CHARGE", chargeDTO.ChargeId, loginDTO); throw; } } public async Task GetSelectListCharge(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { return await _ChargeDAL.GetSelectListCharge(CriteriaDTO, LoginDTO); } catch (Exception) { throw; } } public async Task DeleteCharge(int ChargeId, LoginDTO LoginDTO) { try { return await _ChargeDAL.DeleteCharge(ChargeId, LoginDTO); } catch (Exception) { throw; } } } }