using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using _0_Framework.Application; using _0_Framework.Application.UID; using _0_Framework.Exceptions; using Company.Domain.ContarctingPartyAgg; using Company.Domain.ContractingPartyBankAccountsAgg; using CompanyManagment.App.Contracts.ContractingPartyBankAccounts; using CompanyManagment.App.Contracts.PersonalContractingParty; namespace CompanyManagment.Application; public class ContractingPartyBankAccountsApplication : IContractingPartyBankAccountsApplication { private readonly IContractingPartyBankAccountsRepository _contractingPartyBankAccountsRepository; private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; private readonly IUidService _uidService; public ContractingPartyBankAccountsApplication( IContractingPartyBankAccountsRepository contractingPartyBankAccountsRepository, IPersonalContractingPartyRepository personalContractingPartyRepository, IUidService uidService) { _contractingPartyBankAccountsRepository = contractingPartyBankAccountsRepository; _personalContractingPartyRepository = personalContractingPartyRepository; _uidService = uidService; } public async Task Create(CreateContractingPartyBankAccounts command) { var operationResult = new OperationResult(); if (!_personalContractingPartyRepository.Exists(x => x.id == command.ContractingPartyId)) return operationResult.Failed("طرف حساب مورد نظر یافت نشد"); if (string.IsNullOrWhiteSpace(command.CardNumber)) return operationResult.Failed("شماره کارت خود را وارد کنید"); if (string.IsNullOrWhiteSpace(command.AccountNumber)) return operationResult.Failed("شماره حساب خود را وارد کنید"); if (string.IsNullOrWhiteSpace(command.IBan)) return operationResult.Failed("شماره شبا خود را وارد کنید"); if (string.IsNullOrWhiteSpace(command.AccountHolderName)) return operationResult.Failed("نام صاحب حساب را وارد کنید"); var entity = new ContractingPartyBankAccount(command.ContractingPartyId, command.CardNumber, command.AccountHolderName, command.AccountNumber, command.IBan, command.IsAuth); await _contractingPartyBankAccountsRepository.CreateAsync(entity); await _contractingPartyBankAccountsRepository.SaveChangesAsync(); return operationResult.Succcedded(); } public async Task Create(List commands) { var operationResult = new OperationResult(); foreach (var command in commands) { if (!_personalContractingPartyRepository.Exists(x => x.id == command.ContractingPartyId)) return operationResult.Failed("طرف حساب مورد نظر یافت نشد"); if (command.IsAuth) { if (string.IsNullOrWhiteSpace(command.CardNumber)) return operationResult.Failed("شماره کارت خود را وارد کنید"); if (string.IsNullOrWhiteSpace(command.AccountNumber)) return operationResult.Failed("شماره حساب خود را وارد کنید"); if (string.IsNullOrWhiteSpace(command.IBan)) return operationResult.Failed("شماره شبا خود را وارد کنید"); } else if (string.IsNullOrWhiteSpace(command.CardNumber) && string.IsNullOrWhiteSpace(command.AccountNumber) && string.IsNullOrWhiteSpace(command.IBan)) { return operationResult.Failed( " حداقل یکی از اطلاعات بانکی را وارد کنید: شماره کارت، شماره حساب یا شماره شبا"); } if (string.IsNullOrWhiteSpace(command.AccountHolderName)) { return operationResult.Failed("نام صاحب حساب را وارد کنید"); } var entity = new ContractingPartyBankAccount(command.ContractingPartyId, command.CardNumber, command.AccountHolderName, command.AccountNumber, command.IBan, command.IsAuth); await _contractingPartyBankAccountsRepository.CreateAsync(entity); } await _contractingPartyBankAccountsRepository.SaveChangesAsync(); return operationResult.Succcedded(); } public async Task GetList( ContractingPartyBankAccountSearchModel searchModel) { return await _contractingPartyBankAccountsRepository.GetList(searchModel); } public async Task> ContractingPartyOrAccountHolderNameSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.ContractingPartyOrAccountHolderNameSelectList(search, selected); } public async Task> CardNumberSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.CardNumberSelectList(search, selected); } public async Task> IBanSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.IBanSelectList(search, selected); } public async Task> AccountNumberSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.AccountNumberSelectList(search, selected); } public async Task> GetAccountHolderNameSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.GetAccountHolderNameSelectList(search, selected); } public async Task> ContractingPartyNamesSelectList(string search, string selected) { return await _contractingPartyBankAccountsRepository.ContractingPartyNamesSelectList(search, selected); } public async Task InquiryContractingPartyBankDetails( InquiryContractingPartyBankDetailsRequest command) { var iBan = command.IBan; var cardNumber = command.CardNumber; var accountNumber = command.AccountNumber; var uidBank = command.UidBank; ContractingPartyBankInquiryResponse result = new ContractingPartyBankInquiryResponse(); if (!string.IsNullOrWhiteSpace(iBan)) { if (!iBan.IsvalidIban()) { throw new BadRequestException("شماره شبا وارد شده معتبر نمی باشد"); } var response = await _uidService.IbanInquiry(iBan); if (response.ResponseContext.Status.Code != 0) { throw new BadRequestException("خطای احراز هویت. کد خطا: " + response.ResponseContext.Status.Code); } var owner = response.Owners.FirstOrDefault(); var ownerFirstName = owner != null ? $"{owner.FirstName} {owner.LastName}" : ""; result.FullName = ownerFirstName; result.AccountNumber = response.AccountBasicInformation.AccountNumber; result.Iban = response.AccountBasicInformation.Iban; } else if (!string.IsNullOrWhiteSpace(cardNumber)) { if (!cardNumber.IsValidCardNumber()) { throw new BadRequestException("شماره کارت وارد شده معتبر نمی باشد"); } var bankCardRes = await _uidService.CardToIban(cardNumber); if (bankCardRes.ResponseContext.Status.Code != 0) { throw new BadRequestException("خطای احراز هویت. کد خطا: " + bankCardRes.ResponseContext.Status.Code); } var response = await _uidService.IbanInquiry(bankCardRes.Iban); if (response.ResponseContext.Status.Code != 0) { throw new BadRequestException("خطای احراز هویت. کد خطا: " + response.ResponseContext.Status.Code); } var owner = response.Owners.FirstOrDefault(); var ownerFirstName = owner != null ? $"{owner.FirstName} {owner.LastName}" : ""; result.FullName = ownerFirstName; result.AccountNumber = response.AccountBasicInformation.AccountNumber; result.CardNumber = cardNumber; result.Iban = response.AccountBasicInformation.Iban; } else if (!string.IsNullOrWhiteSpace(accountNumber)) { var accountNumberRes = await _uidService.AccountToIban(accountNumber, uidBank.Value); if (accountNumberRes.ResponseContext.Status.Code != 0) { throw new BadRequestException( "خطای احراز هویت. کد خطا: " + accountNumberRes.ResponseContext.Status.Code); } var response = await _uidService.IbanInquiry(accountNumberRes.Iban); var owner = response.Owners.FirstOrDefault(); var ownerFirstName = owner != null ? $"{owner.FirstName} {owner.LastName}" : ""; result.FullName = ownerFirstName; result.AccountNumber = response.AccountBasicInformation.AccountNumber; result.Iban = response.AccountBasicInformation.Iban; } else { throw new BadRequestException( "حداقل یکی از اطلاعات بانکی را وارد کنید: شماره کارت، شماره حساب یا شماره شبا"); } return result; } }