add: implement Sepehr payment gateway integration and enhance financial invoice handling
This commit is contained in:
@@ -9,15 +9,13 @@ using CompanyManagment.EFCore;
|
||||
|
||||
namespace CompanyManagment.Application;
|
||||
|
||||
public class FinancialInvoiceApplication : RepositoryBase<long, FinancialInvoice>, IFinancialInvoiceApplication
|
||||
public class FinancialInvoiceApplication : IFinancialInvoiceApplication
|
||||
{
|
||||
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
||||
private readonly CompanyContext _context;
|
||||
|
||||
public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository, CompanyContext context) : base(context)
|
||||
public FinancialInvoiceApplication(IFinancialInvoiceRepository financialInvoiceRepository)
|
||||
{
|
||||
_financialInvoiceRepository = financialInvoiceRepository;
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public OperationResult Create(CreateFinancialInvoice command)
|
||||
@@ -185,6 +183,7 @@ public class FinancialInvoiceApplication : RepositoryBase<long, FinancialInvoice
|
||||
{
|
||||
return _financialInvoiceRepository.Search(searchModel);
|
||||
}
|
||||
|
||||
|
||||
//public OperationResult Remove(long id)
|
||||
//{
|
||||
|
||||
@@ -3,9 +3,12 @@ using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using Company.Domain.ContarctingPartyAgg;
|
||||
using Company.Domain.FinancialInvoiceAgg;
|
||||
using Company.Domain.FinancialStatmentAgg;
|
||||
using CompanyManagment.App.Contracts.FinancialInvoice;
|
||||
using CompanyManagment.App.Contracts.FinancialStatment;
|
||||
using CompanyManagment.App.Contracts.FinancilTransaction;
|
||||
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||
using Microsoft.AspNetCore.Components.Forms;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
@@ -16,12 +19,20 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
private readonly IFinancialStatmentRepository _financialStatmentRepository;
|
||||
private readonly IFinancialTransactionApplication _financialTransactionApplication;
|
||||
private readonly IPersonalContractingPartyRepository _contractingPartyRepository;
|
||||
private readonly IFinancialInvoiceRepository _financialInvoiceRepository;
|
||||
private readonly ISepehrPaymentGatewayService _sepehrPaymentGatewayService;
|
||||
|
||||
public FinancialStatmentApplication(IFinancialStatmentRepository financialStatmentRepository, IFinancialTransactionApplication financialTransactionApplication, IPersonalContractingPartyRepository contractingPartyRepository)
|
||||
public FinancialStatmentApplication(IFinancialStatmentRepository financialStatmentRepository,
|
||||
IFinancialTransactionApplication financialTransactionApplication,
|
||||
IPersonalContractingPartyRepository contractingPartyRepository,
|
||||
IFinancialInvoiceRepository financialInvoiceRepository,
|
||||
ISepehrPaymentGatewayService sepehrPaymentGatewayService)
|
||||
{
|
||||
_financialStatmentRepository = financialStatmentRepository;
|
||||
_financialTransactionApplication = financialTransactionApplication;
|
||||
_contractingPartyRepository = contractingPartyRepository;
|
||||
_financialInvoiceRepository = financialInvoiceRepository;
|
||||
_sepehrPaymentGatewayService = sepehrPaymentGatewayService;
|
||||
}
|
||||
|
||||
public OperationResult CreateFromBankGateway(CreateFinancialStatment command)
|
||||
@@ -51,7 +62,6 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
if (createTransaction.IsSuccedded)
|
||||
return op.Succcedded();
|
||||
return op.Failed("خطا در انجام عملیات");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -71,8 +81,6 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
Balance = 0,
|
||||
TypeOfTransaction = command.TypeOfTransaction,
|
||||
DescriptionOption = command.DescriptionOption
|
||||
|
||||
|
||||
};
|
||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||
if (createTransaction.IsSuccedded)
|
||||
@@ -98,22 +106,22 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
{
|
||||
debtor = 0;
|
||||
creditor = command.CreditorString.MoneyToDouble();
|
||||
|
||||
}
|
||||
else if (command.TypeOfTransaction == "debt")
|
||||
{
|
||||
creditor = 0;
|
||||
debtor = command.DeptorString.MoneyToDouble();
|
||||
|
||||
}
|
||||
|
||||
if (!command.TdateFa.TryToGeorgianDateTime(out var tDateGr))
|
||||
{
|
||||
return op.Failed("تاریخ وارد شده صحیح نمی باشد");
|
||||
}
|
||||
|
||||
if (_financialStatmentRepository.Exists(x => x.ContractingPartyId == command.ContractingPartyId))
|
||||
{
|
||||
var financialStatment = _financialStatmentRepository.GetDetailsByContractingPartyId(command.ContractingPartyId);
|
||||
var financialStatment =
|
||||
_financialStatmentRepository.GetDetailsByContractingPartyId(command.ContractingPartyId);
|
||||
var transaction = new CreateFinancialTransaction()
|
||||
{
|
||||
FinancialStatementId = financialStatment.Id,
|
||||
@@ -124,20 +132,15 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
Creditor = creditor,
|
||||
TypeOfTransaction = command.TypeOfTransaction,
|
||||
DescriptionOption = command.DescriptionOption
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||
|
||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||
if (createTransaction.IsSuccedded)
|
||||
return op.Succcedded();
|
||||
return op.Failed("خطا در انجام عملیات");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
var statement = new FinancialStatment(command.ContractingPartyId, command.ContractingPartyName);
|
||||
_financialStatmentRepository.Create(statement);
|
||||
_financialStatmentRepository.SaveChanges();
|
||||
@@ -153,20 +156,14 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
Balance = 0,
|
||||
TypeOfTransaction = command.TypeOfTransaction,
|
||||
DescriptionOption = command.DescriptionOption
|
||||
|
||||
|
||||
};
|
||||
var createTransaction = _financialTransactionApplication.Create(transaction);
|
||||
if (createTransaction.IsSuccedded)
|
||||
return op.Succcedded();
|
||||
return op.Failed("خطا در انجام عملیات");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public List<FinancialStatmentViewModel> Search(FinancialStatmentSearchModel searchModel)
|
||||
{
|
||||
@@ -203,6 +200,45 @@ public class FinancialStatmentApplication : IFinancialStatmentApplication
|
||||
public async Task<FinancialStatmentDetailsByContractingPartyViewModel> GetDetailsByContractingParty(
|
||||
long contractingPartyId, FinancialStatementSearchModel searchModel)
|
||||
{
|
||||
return await _financialStatmentRepository.GetDetailsByContractingParty(contractingPartyId,searchModel);
|
||||
return await _financialStatmentRepository.GetDetailsByContractingParty(contractingPartyId, searchModel);
|
||||
}
|
||||
|
||||
public async Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreatePaymentGateWayAndCreateInvoice(
|
||||
CreateFinancialPayRequest request, string gateWayCallBackUrl)
|
||||
{
|
||||
var op = new OperationResult<CreateSepehrPaymentGatewayResponse>();
|
||||
// گام 1: دریافت موجودی حساب
|
||||
var balanceAmount = await GetBalanceAmount(request.Id);
|
||||
if (balanceAmount.Amount <= 0)
|
||||
{
|
||||
return op.Failed("موجودی حساب شما صفر است");
|
||||
}
|
||||
// گام 2: ایجاد درگاه پرداخت سپهر
|
||||
|
||||
var financialInvoice = await _financialInvoiceRepository
|
||||
.GetUnPaidFinancialInvoiceByContractingPartyIdAndAmount(balanceAmount.ContractingPartyId,
|
||||
balanceAmount.Amount);
|
||||
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
financialInvoice = new FinancialInvoice(balanceAmount.Amount, balanceAmount.ContractingPartyId,
|
||||
"پرداخت بدهی صورت حساب مالی");
|
||||
|
||||
var items = new FinancialInvoiceItem("پرداخت بدهی صورت حساب مالی", balanceAmount.Amount,
|
||||
financialInvoice.id, FinancialInvoiceItemType.PreviousDebt, 0);
|
||||
financialInvoice.AddItem(items);
|
||||
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
||||
await _financialInvoiceRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
var gatewayResult = await _sepehrPaymentGatewayService.CreateSepehrPaymentGateway(
|
||||
amount: balanceAmount.Amount,
|
||||
contractingPartyId: balanceAmount.ContractingPartyId,
|
||||
frontCallbackUrl: request.BaseUrl,
|
||||
gatewayCallbackUrl: gateWayCallBackUrl,
|
||||
financialInvoiceId: financialInvoice.id,
|
||||
extraData: null);
|
||||
|
||||
return gatewayResult;
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ using CompanyManagment.App.Contracts.FinancialStatment;
|
||||
using CompanyManagment.App.Contracts.InstitutionContract;
|
||||
using CompanyManagment.App.Contracts.InstitutionContractContactinfo;
|
||||
using CompanyManagment.App.Contracts.PaymentTransaction;
|
||||
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||
using CompanyManagment.App.Contracts.Workshop;
|
||||
using PersianTools.Core;
|
||||
using ConnectedPersonnelViewModel = CompanyManagment.App.Contracts.Workshop.ConnectedPersonnelViewModel;
|
||||
@@ -48,6 +49,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
||||
private readonly IPaymentGateway _paymentGateway;
|
||||
private readonly IPaymentTransactionRepository _paymentTransactionRepository;
|
||||
private readonly IRollCallServiceRepository _rollCallServiceRepository;
|
||||
private readonly ISepehrPaymentGatewayService _sepehrPaymentGatewayService;
|
||||
|
||||
|
||||
public InstitutionContractApplication(IInstitutionContractRepository institutionContractRepository,
|
||||
@@ -58,7 +60,8 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
||||
IFinancialStatmentRepository financialStatmentRepository, IContactInfoApplication contactInfoApplication,
|
||||
IAccountApplication accountApplication, ISmsService smsService,
|
||||
IFinancialInvoiceRepository financialInvoiceRepository, IHttpClientFactory httpClientFactory,
|
||||
IPaymentTransactionRepository paymentTransactionRepository, IRollCallServiceRepository rollCallServiceRepository)
|
||||
IPaymentTransactionRepository paymentTransactionRepository, IRollCallServiceRepository rollCallServiceRepository,
|
||||
ISepehrPaymentGatewayService sepehrPaymentGatewayService)
|
||||
{
|
||||
_institutionContractRepository = institutionContractRepository;
|
||||
_contractingPartyRepository = contractingPartyRepository;
|
||||
@@ -74,6 +77,7 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
||||
_financialInvoiceRepository = financialInvoiceRepository;
|
||||
_paymentTransactionRepository = paymentTransactionRepository;
|
||||
_rollCallServiceRepository = rollCallServiceRepository;
|
||||
_sepehrPaymentGatewayService = sepehrPaymentGatewayService;
|
||||
_paymentGateway = new SepehrPaymentGateway(httpClientFactory);
|
||||
}
|
||||
|
||||
@@ -1258,119 +1262,93 @@ public class InstitutionContractApplication : IInstitutionContractApplication
|
||||
if (contractingParty == null)
|
||||
throw new NotFoundException("طرف قرارداد یافت نشد");
|
||||
|
||||
if (institutionContract.VerifyCode != code)
|
||||
return op.Failed("کد وارد شده صحیح نمی باشد");
|
||||
|
||||
var financialStatement =await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
|
||||
if (institutionContract.VerifyCode != code)
|
||||
return op.Failed("کد وارد شده صحیح نمی باشد");
|
||||
|
||||
var dbTransaction = await _institutionContractRepository.BeginTransactionAsync();
|
||||
FinancialInvoice financialInvoice;
|
||||
FinancialInvoiceItem financialInvoiceItem;
|
||||
var today = DateTime.Today;
|
||||
double invoiceAmount = 0;
|
||||
string invoiceItemDescription = string.Empty;
|
||||
FinancialInvoiceItemType invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||
long invoiceItemEntityId = 0;
|
||||
var financialStatement = await _financialStatmentRepository.GetByContractingPartyId(contractingParty.id);
|
||||
|
||||
if (institutionContract.IsInstallment)
|
||||
{
|
||||
var firstInstallment = institutionContract.Installments.First();
|
||||
var firstInstallmentAmount = firstInstallment.Amount;
|
||||
var dbTransaction = await _institutionContractRepository.BeginTransactionAsync();
|
||||
FinancialInvoice financialInvoice;
|
||||
FinancialInvoiceItem financialInvoiceItem;
|
||||
var today = DateTime.Today;
|
||||
double invoiceAmount = 0;
|
||||
string invoiceItemDescription = string.Empty;
|
||||
FinancialInvoiceItemType invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||
long invoiceItemEntityId = 0;
|
||||
|
||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(firstInstallment.Id, FinancialInvoiceItemType.BuyInstitutionContractInstallment);
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||
"قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
|
||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||
invoiceAmount = firstInstallmentAmount;
|
||||
invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {institutionContract.ContractNo}";
|
||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
|
||||
invoiceItemEntityId = firstInstallment.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
invoiceAmount = financialInvoice.Amount;
|
||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||
invoiceItemType = financialInvoice.Items.First().Type;
|
||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(institutionContract.id, FinancialInvoiceItemType.BuyInstitutionContract);
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||
"پرداخت کل سرویس", "debt", "بابت خدمات", institutionContract.TotalAmount, 0, 0);
|
||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||
invoiceAmount = institutionContract.TotalAmount;
|
||||
invoiceItemDescription = $"پرداخت کل قرارداد شماره {institutionContract.ContractNo}";
|
||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||
invoiceItemEntityId = institutionContract.id;
|
||||
}
|
||||
else
|
||||
{
|
||||
invoiceAmount = financialInvoice.Amount;
|
||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||
invoiceItemType = financialInvoice.Items.First().Type;
|
||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||
}
|
||||
}
|
||||
if (institutionContract.IsInstallment)
|
||||
{
|
||||
var firstInstallment = institutionContract.Installments.First();
|
||||
var firstInstallmentAmount = firstInstallment.Amount;
|
||||
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {institutionContract.ContractNo}");
|
||||
financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId);
|
||||
financialInvoice.AddItem(financialInvoiceItem);
|
||||
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
||||
}
|
||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(firstInstallment.Id, FinancialInvoiceItemType.BuyInstitutionContractInstallment);
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||
"قسط اول سرویس", "debt", "بابت خدمات", firstInstallmentAmount, 0, 0);
|
||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||
invoiceAmount = firstInstallmentAmount;
|
||||
invoiceItemDescription = $"پرداخت قسط اول قرارداد شماره {institutionContract.ContractNo}";
|
||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContractInstallment;
|
||||
invoiceItemEntityId = firstInstallment.Id;
|
||||
}
|
||||
else
|
||||
{
|
||||
invoiceAmount = financialInvoice.Amount;
|
||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||
invoiceItemType = financialInvoice.Items.First().Type;
|
||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
financialInvoice = await _financialInvoiceRepository.GetUnPaidByEntityId(institutionContract.id, FinancialInvoiceItemType.BuyInstitutionContract);
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
var financialTransaction = new FinancialTransaction(0, today, today.ToFarsi(),
|
||||
"پرداخت کل سرویس", "debt", "بابت خدمات", institutionContract.TotalAmount, 0, 0);
|
||||
financialStatement.AddFinancialTransaction(financialTransaction);
|
||||
invoiceAmount = institutionContract.TotalAmount;
|
||||
invoiceItemDescription = $"پرداخت کل قرارداد شماره {institutionContract.ContractNo}";
|
||||
invoiceItemType = FinancialInvoiceItemType.BuyInstitutionContract;
|
||||
invoiceItemEntityId = institutionContract.id;
|
||||
}
|
||||
else
|
||||
{
|
||||
invoiceAmount = financialInvoice.Amount;
|
||||
invoiceItemDescription = financialInvoice.Items.First().Description;
|
||||
invoiceItemType = financialInvoice.Items.First().Type;
|
||||
invoiceItemEntityId = financialInvoice.Items.First().EntityId;
|
||||
}
|
||||
}
|
||||
|
||||
await _financialInvoiceRepository.SaveChangesAsync();
|
||||
if (financialInvoice == null)
|
||||
{
|
||||
financialInvoice = new FinancialInvoice(invoiceAmount, contractingParty.id, $"خرید قرارداد مالی شماره {institutionContract.ContractNo}");
|
||||
financialInvoiceItem = new FinancialInvoiceItem(invoiceItemDescription, invoiceAmount, 0, invoiceItemType, invoiceItemEntityId);
|
||||
financialInvoice.AddItem(financialInvoiceItem);
|
||||
await _financialInvoiceRepository.CreateAsync(financialInvoice);
|
||||
}
|
||||
|
||||
var transaction = new PaymentTransaction(institutionContract.ContractingPartyId, invoiceAmount,
|
||||
institutionContract.ContractingPartyName, "https://client.gozareshgir.ir",
|
||||
PaymentTransactionGateWay.SepehrPay);
|
||||
await _paymentTransactionRepository.CreateAsync(transaction);
|
||||
await _financialInvoiceRepository.SaveChangesAsync();
|
||||
await _financialInvoiceRepository.SaveChangesAsync();
|
||||
|
||||
var createPayment = new CreatePaymentGatewayRequest()
|
||||
{
|
||||
Amount = invoiceAmount,
|
||||
TransactionId = transaction.id.ToString(),
|
||||
CallBackUrl = callbackUrl,
|
||||
FinancialInvoiceId = financialInvoice.id,
|
||||
};
|
||||
var gatewayResponse = await _paymentGateway.Create(createPayment);
|
||||
if (!gatewayResponse.IsSuccess)
|
||||
return op.Failed("خطا در ایجاد درگاه پرداخت: " + gatewayResponse.Message + gatewayResponse.ErrorCode);
|
||||
// استفاده از سرویس مشترک برای ایجاد درگاه پرداخت
|
||||
var gatewayResult = await _sepehrPaymentGatewayService.CreateSepehrPaymentGateway(
|
||||
amount: (long)invoiceAmount,
|
||||
contractingPartyId: institutionContract.ContractingPartyId,
|
||||
gatewayCallbackUrl: callbackUrl,
|
||||
financialInvoiceId: financialInvoice.id,
|
||||
extraData: null);
|
||||
|
||||
|
||||
// institutionContract.SetPendingWorkflow();
|
||||
//
|
||||
// var phone = institutionContract.ContactInfoList.FirstOrDefault(x =>
|
||||
// x.SendSms && x.Position == "طرف قرارداد" && x.PhoneType == "شماره همراه");
|
||||
// if (phone !=null)
|
||||
// {
|
||||
// var userPass = contractingParty.IsLegal == "حقیقی"
|
||||
// ? contractingParty.Nationalcode
|
||||
// : contractingParty.NationalId;
|
||||
// var createAcc = new RegisterAccount
|
||||
// {
|
||||
// Fullname = contractingParty.LName,
|
||||
// Username = userPass,
|
||||
// Password = userPass,
|
||||
// Mobile = phone.PhoneNumber,
|
||||
// NationalCode = userPass
|
||||
// };
|
||||
// var res = _accountApplication.RegisterClient(createAcc);
|
||||
// if (res.IsSuccedded)
|
||||
// CreateContractingPartyAccount(contractingParty.id, res.SendId);
|
||||
// }
|
||||
if (!gatewayResult.IsSuccedded)
|
||||
{
|
||||
await dbTransaction.RollbackAsync();
|
||||
return op.Failed(gatewayResult.Message);
|
||||
}
|
||||
|
||||
await dbTransaction.CommitAsync();
|
||||
await _institutionContractRepository.SaveChangesAsync();
|
||||
return op.Succcedded(gatewayResponse.Token);
|
||||
return op.Succcedded(gatewayResult.Data.Token);
|
||||
}
|
||||
|
||||
public async Task<InstitutionContractWorkshopDetailViewModel> GetWorkshopInitialDetails(long workshopDetailsId)
|
||||
|
||||
117
CompanyManagment.Application/SepehrPaymentGatewayService.cs
Normal file
117
CompanyManagment.Application/SepehrPaymentGatewayService.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Application.PaymentGateway;
|
||||
using CompanyManagment.App.Contracts.PaymentTransaction;
|
||||
using CompanyManagment.App.Contracts.SepehrPaymentGateway;
|
||||
|
||||
namespace CompanyManagment.Application;
|
||||
|
||||
/// <summary>
|
||||
/// سرویس مشترک برای ایجاد درگاه پرداخت سپهر
|
||||
/// </summary>
|
||||
public class SepehrPaymentGatewayService : ISepehrPaymentGatewayService
|
||||
{
|
||||
private readonly IPaymentGateway _paymentGateway;
|
||||
private readonly IPaymentTransactionApplication _paymentTransactionApplication;
|
||||
|
||||
public SepehrPaymentGatewayService(
|
||||
IPaymentTransactionApplication paymentTransactionApplication,
|
||||
IHttpClientFactory httpClientFactory)
|
||||
{
|
||||
_paymentGateway = new SepehrPaymentGateway(httpClientFactory);
|
||||
_paymentTransactionApplication = paymentTransactionApplication;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ایجاد درگاه پرداخت سپهر برای یک تراکنش
|
||||
/// </summary>
|
||||
/// <param name="amount">مبلغ</param>
|
||||
/// <param name="contractingPartyId">شناسه طرف قرارداد</param>
|
||||
/// <param name="frontCallbackUrl">آدرس بازگشتی به فرانت برای نمایش نتیجه</param>
|
||||
/// <param name="gatewayCallbackUrl">آدرس بازگشتی درگاه پرداخت</param>
|
||||
/// <param name="financialInvoiceId">شناسه فاکتور مالی (اختیاری)</param>
|
||||
/// <param name="extraData">دادههای اضافی (اختیاری)</param>
|
||||
/// <param name="cancellationToken">توکن لغو</param>
|
||||
/// <returns>شامل Token درگاه یا OperationResult با خطا</returns>
|
||||
public async Task<OperationResult<CreateSepehrPaymentGatewayResponse>> CreateSepehrPaymentGateway(
|
||||
double amount,
|
||||
long contractingPartyId,
|
||||
long financialInvoiceId,
|
||||
string gatewayCallbackUrl,
|
||||
string frontCallbackUrl="https://client.gozareshgir.ir",
|
||||
Dictionary<string, object> extraData = null,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var op = new OperationResult<CreateSepehrPaymentGatewayResponse>();
|
||||
|
||||
try
|
||||
{
|
||||
// گام 1: ایجاد تراکنش پرداخت
|
||||
var transactionCommand = new CreatePaymentTransaction()
|
||||
{
|
||||
Amount = amount,
|
||||
ContractingPartyId = contractingPartyId,
|
||||
CallBackUrl = frontCallbackUrl,
|
||||
Gateway = PaymentTransactionGateWay.SepehrPay
|
||||
};
|
||||
|
||||
var transactionResult = await _paymentTransactionApplication.Create(transactionCommand);
|
||||
|
||||
if (!transactionResult.IsSuccedded)
|
||||
{
|
||||
return op.Failed(transactionResult.Message);
|
||||
}
|
||||
|
||||
// گام 2: ایجاد درخواست درگاه پرداخت
|
||||
extraData ??= new Dictionary<string, object>();
|
||||
|
||||
var createPaymentCommand = new CreatePaymentGatewayRequest()
|
||||
{
|
||||
Amount = amount,
|
||||
TransactionId = transactionResult.SendId.ToString(),
|
||||
CallBackUrl = gatewayCallbackUrl,
|
||||
FinancialInvoiceId = financialInvoiceId,
|
||||
ExtraData = extraData
|
||||
};
|
||||
|
||||
// گام 3: ارسال درخواست به درگاه سپهر
|
||||
var gatewayResponse = await _paymentGateway.Create(createPaymentCommand, cancellationToken);
|
||||
|
||||
#if DEBUG
|
||||
gatewayResponse.IsSuccess = true;
|
||||
#endif
|
||||
if (!gatewayResponse.IsSuccess)
|
||||
{
|
||||
return op.Failed($"خطا در ایجاد درگاه پرداخت: {gatewayResponse.Message ?? gatewayResponse.ErrorCode?.ToString()}");
|
||||
}
|
||||
|
||||
// گام 4: ذخیره Token در تراکنش
|
||||
var setTokenResult = await _paymentTransactionApplication.SetTransactionId(
|
||||
transactionResult.SendId,
|
||||
gatewayResponse.Token);
|
||||
|
||||
if (!setTokenResult.IsSuccedded)
|
||||
{
|
||||
return op.Failed("خطا در ذخیره Token درگاه");
|
||||
}
|
||||
|
||||
// گام 5: بازگشت اطلاعات درگاه پرداخت
|
||||
var response = new CreateSepehrPaymentGatewayResponse
|
||||
{
|
||||
Token = gatewayResponse.Token,
|
||||
TransactionId = transactionResult.SendId,
|
||||
PaymentUrl = _paymentGateway.GetStartPayUrl(gatewayResponse.Token)
|
||||
};
|
||||
|
||||
return op.Succcedded(response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return op.Failed($"خطا در ایجاد درگاه پرداخت: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user