From 81e60948171d222588ff08b2a2e57b259917b50e Mon Sep 17 00:00:00 2001 From: mahan Date: Thu, 16 Oct 2025 13:52:05 +0330 Subject: [PATCH] feat: add bank inquiry functionality and validation methods for IBAN and card numbers --- 0_Framework/Application/Tools.cs | 8 ++ ...ContractingPartyBankAccountsApplication.cs | 24 +++++ ...ContractingPartyBankAccountsApplication.cs | 94 ++++++++++++++++++- .../PaymentInstrumentController.cs | 21 +---- 4 files changed, 124 insertions(+), 23 deletions(-) diff --git a/0_Framework/Application/Tools.cs b/0_Framework/Application/Tools.cs index 98f58bb9..23afe3cb 100644 --- a/0_Framework/Application/Tools.cs +++ b/0_Framework/Application/Tools.cs @@ -1512,6 +1512,14 @@ public static class Tools #region Mahan + public static bool IsvalidIban(this string iban) + { + return Regex.IsMatch(iban, @"^IR[0-9]{24}$"); + } + public static bool IsValidCardNumber(this string cardNumber) + { + return Regex.IsMatch(cardNumber, @"^[0-9]{16}$"); + } /// /// این متد حروف عربی را به فارسی در میاورد. مثال: علي را به علی تبدیل میکند /// diff --git a/CompanyManagment.App.Contracts/ContractingPartyBankAccounts/IContractingPartyBankAccountsApplication.cs b/CompanyManagment.App.Contracts/ContractingPartyBankAccounts/IContractingPartyBankAccountsApplication.cs index 379f07df..f4864441 100644 --- a/CompanyManagment.App.Contracts/ContractingPartyBankAccounts/IContractingPartyBankAccountsApplication.cs +++ b/CompanyManagment.App.Contracts/ContractingPartyBankAccounts/IContractingPartyBankAccountsApplication.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Security.AccessControl; +using System.Security.Cryptography; using System.Threading.Tasks; using System.Transactions; using _0_Framework.Application; +using _0_Framework.Application.UID; using CompanyManagment.App.Contracts.OriginalTitle; namespace CompanyManagment.App.Contracts.ContractingPartyBankAccounts; @@ -74,5 +76,27 @@ public interface IContractingPartyBankAccountsApplication /// نام سلکت شده /// Task> ContractingPartyNamesSelectList(string search, string selected); + + /// + /// احراز هویت اطلاعات بانکی طرف حساب + /// + /// + /// + Task InquiryContractingPartyBankDetails(InquiryContractingPartyBankDetailsRequest command); + +} +public class InquiryContractingPartyBankDetailsRequest +{ + public string CardNumber { get; set; } + public string AccountNumber { get; set; } + public string IBan { get; set; } + public UidBanks UidBank { get; set; } +} +public class ContractingPartyBankInquiryResponse +{ + public string FullName { get; set; } + public string Iban { get; set; } + public string AccountNumber { get; set; } + public string CardNumber { get; set; } } diff --git a/CompanyManagment.Application/ContractingPartyBankAccountsApplication.cs b/CompanyManagment.Application/ContractingPartyBankAccountsApplication.cs index e9a81eba..e1e1dc0a 100644 --- a/CompanyManagment.Application/ContractingPartyBankAccountsApplication.cs +++ b/CompanyManagment.Application/ContractingPartyBankAccountsApplication.cs @@ -1,6 +1,10 @@ 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; @@ -12,13 +16,15 @@ public class ContractingPartyBankAccountsApplication : IContractingPartyBankAcco { private readonly IContractingPartyBankAccountsRepository _contractingPartyBankAccountsRepository; private readonly IPersonalContractingPartyRepository _personalContractingPartyRepository; + private readonly IUidService _uidService; public ContractingPartyBankAccountsApplication( IContractingPartyBankAccountsRepository contractingPartyBankAccountsRepository, - IPersonalContractingPartyRepository personalContractingPartyRepository) + IPersonalContractingPartyRepository personalContractingPartyRepository, IUidService uidService) { _contractingPartyBankAccountsRepository = contractingPartyBankAccountsRepository; _personalContractingPartyRepository = personalContractingPartyRepository; + _uidService = uidService; } public async Task Create(CreateContractingPartyBankAccounts command) @@ -69,18 +75,19 @@ public class ContractingPartyBankAccountsApplication : IContractingPartyBankAcco if (string.IsNullOrWhiteSpace(command.IBan)) return operationResult.Failed("شماره شبا خود را وارد کنید"); } - else if(string.IsNullOrWhiteSpace(command.CardNumber) && + else if (string.IsNullOrWhiteSpace(command.CardNumber) && string.IsNullOrWhiteSpace(command.AccountNumber) && string.IsNullOrWhiteSpace(command.IBan)) { - return operationResult.Failed(" حداقل یکی از اطلاعات بانکی را وارد کنید: شماره کارت، شماره حساب یا شماره شبا"); + 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); @@ -130,4 +137,83 @@ public class ContractingPartyBankAccountsApplication : IContractingPartyBankAcco { 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); + 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; + } } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/PaymentInstrumentController.cs b/ServiceHost/Areas/Admin/Controllers/PaymentInstrumentController.cs index e5d86ca4..961942e7 100644 --- a/ServiceHost/Areas/Admin/Controllers/PaymentInstrumentController.cs +++ b/ServiceHost/Areas/Admin/Controllers/PaymentInstrumentController.cs @@ -229,26 +229,9 @@ public class PaymentInstrumentController:AdminBaseController [HttpPost("bank-account-inquiry")] - public async Task>> GetBankInquiry([FromBody]BankInquiryRequest command) + public async Task> GetBankInquiry([FromBody]InquiryContractingPartyBankDetailsRequest command) { - if ((!string.IsNullOrWhiteSpace(command.AccountNumber) && command.AccountNumber.StartsWith("111111")) || (!string.IsNullOrWhiteSpace(command.CardNumber)&&command.CardNumber.StartsWith("111111")) || (!string.IsNullOrWhiteSpace(command.IBan)&&command.IBan.StartsWith("1111111"))) - { - return new OperationResult().Succcedded(new BankInquiryResponse() - { - AccountNumber = "1111111", - IBan = "111111111111111111111111", - CardNumber = "1111111111111111", - AccountHolderName = "تست تستی", - BankName = "تست بانک", - }); - }else if ((!string.IsNullOrWhiteSpace(command.AccountNumber) && command.AccountNumber.StartsWith("222222")) || (!string.IsNullOrWhiteSpace(command.CardNumber)&&command.CardNumber.StartsWith("222222")) || (!string.IsNullOrWhiteSpace(command.CardNumber)&&command.CardNumber.StartsWith("222222"))) - { - return new OperationResult().Failed("دیتای وارد شده نامعتبر است"); - } - else - { - throw new InternalServerException("ارور سمت سرور"); - } + return await _contractingPartyBankAccountsApplication.InquiryContractingPartyBankDetails(command); } }