using GB5Shared.DTO.Framework.AutoNumber; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.Resource.Response; using GB5Shared.ResponseStandard; using GB5Shared.Validation; using MMDAL.CustomCode.PaymentTerm; using MMDAL.DTO.PaymentTerm; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MMBLL.PaymentTerm { public class PaymentTermBLL : IPaymentTermBLL { private readonly IPaymentTermDAL _PaymentTermDAL; private readonly AutoNumber _AutoNumber; private readonly IValidation _Validation; public PaymentTermBLL(IPaymentTermDAL PaymentTermDAL, AutoNumber AutoNumber, IValidation Validation) { _PaymentTermDAL = PaymentTermDAL; _AutoNumber = AutoNumber; _Validation = Validation; } public async Task GetPaymentTerm(int PaymentTermId, LoginDTO LoginDTO) { try { return await _PaymentTermDAL.GetPaymentTerm(PaymentTermId, LoginDTO); } catch (Exception) { throw; } } public async Task GetSelectListPaymentTerm(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { return await _PaymentTermDAL.GetSelectListPaymentTerm(CriteriaDTO, LoginDTO); } catch (Exception) { throw; } } public async Task SavePaymentTerm(PaymentTermDTO PaymentTermDTO, LoginDTO LoginDTO) { if (PaymentTermDTO == null) throw new ArgumentNullException(nameof(PaymentTermDTO)); AutoNumberDTO? autoNumberDTO = null; try { await _Validation.NotEmpty(PaymentTermDTO.PaymentTermCode, nameof(PaymentTermDTO.PaymentTermCode)); await _Validation.NotEmpty(PaymentTermDTO.PaymentTermName, nameof(PaymentTermDTO.PaymentTermName)); PaymentTermDTO.PaymentTermModifiedById = LoginDTO.UserId; PaymentTermDTO.PaymentTermModifiedOn = DateTime.UtcNow; bool isNew = PaymentTermDTO.PaymentTermId == 0; if (isNew) { int detailCount = PaymentTermDTO.PaymentTermDetailArray?.Count ?? 0; int totalRequired = 1 + detailCount; autoNumberDTO = await _AutoNumber.GetNumberAsync(totalRequired, "PAYMENTTERM", LoginDTO); int nextId = autoNumberDTO.StartNumber; PaymentTermDTO.PaymentTermId = nextId++; PaymentTermDTO.PaymentTermCreatedById = LoginDTO.UserId; PaymentTermDTO.PaymentTermCreatedOn = DateTime.UtcNow; if (PaymentTermDTO.PaymentTermDetailArray?.Count > 0) { foreach (var detail in PaymentTermDTO.PaymentTermDetailArray) { detail.PaymentTermDetailId = nextId++; detail.PaymentTermId = PaymentTermDTO.PaymentTermId; } } await _PaymentTermDAL.SavePaymentTerm(PaymentTermDTO, LoginDTO); return $"{SuccessResponse.SaveSuccess}"; } else { await _PaymentTermDAL.UpdatePaymentTerm(PaymentTermDTO, LoginDTO); return $"{SuccessResponse.UpdateSuccess}"; } } catch { if (autoNumberDTO != null && PaymentTermDTO.PaymentTermId > 0) { await _AutoNumber.RollbackAutoNumber("PAYMENTTERM", autoNumberDTO.StartNumber, LoginDTO); } throw; } } //public async Task DeletePaymentTerm(int PaymentTermId, LoginDTO LoginDTO) //{ // try // { // var detailsResult = await _PaymentTermDAL.DeletePaymentTermDetail(PaymentTermId, LoginDTO); // if (detailsResult <= 0) // return $"{ErrorResponse.DeleteNotFoundMessage}"; // var parentResult = await _PaymentTermDAL.DeletePaymentTerm(PaymentTermId, LoginDTO); // if (parentResult <= 0) // return $"{ErrorResponse.DeleteNotFoundMessage}"; // return $"{SuccessResponse.DeleteSuccessMessage}"; // } // catch (Exception ex) // { // throw new Exception($"Error Deleting PaymentTerm ID {PaymentTermId}", ex); // } //} public async Task DeletePaymentTerm(int PaymentTermId, LoginDTO LoginDTO) { try { // Delete child records first (ignore affected rows) await _PaymentTermDAL.DeletePaymentTermDetail(PaymentTermId, LoginDTO); // Delete parent record var parentResult = await _PaymentTermDAL.DeletePaymentTerm(PaymentTermId, LoginDTO); if (parentResult <= 0) return $"{ErrorResponse.DeleteNotFoundMessage}"; return $"{SuccessResponse.DeleteSuccessMessage}"; } catch (Exception ex) { throw new Exception($"Error Deleting PaymentTerm ID {PaymentTermId}", ex); } } } }