using System.Data.Common; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GoodBooks.PAY.PAYDAL.DTO.Order; using GoodBooks.PAY.PAYDAL.Query.Order; using Newtonsoft.Json; namespace GoodBooks.PAY.PAYDAL.CustomCode.Order { public class PayTransactionDAL : IPayTransactionDAL { private readonly IQueryExecutor _QueryExecutor; public PayTransactionDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── Insert payment transaction record ───────────────────────────── // Participates in caller-managed transaction when tx is provided. // Typically inserted atomically with the parent PayOrder status update // inside the webhook handler or payment return processor. public async Task InsertPayTransaction( PayTransactionDTO dto, LoginDTO loginDTO, DbTransaction? tx = null) { try { int rows = await _QueryExecutor.ExecuteAsync( loginDTO, PayTransactionQB.INSERT_PAY_TRANSACTION, dto, tx).ConfigureAwait(false); return rows; } catch (Exception) { throw; } } // ── Get single transaction by Id ────────────────────────────────── public async Task GetPayTransaction(int payTransactionId, LoginDTO loginDTO) { try { var param = new { PayTransactionId = payTransactionId, TenantId = loginDTO.ClientId }; var result = await _QueryExecutor.QuerySingleAsync( loginDTO, PayTransactionQB.GET_PAY_TRANSACTION, param).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } // ── Get all transactions for a pay order ────────────────────────── // Returns ordered by TxnInitiatedOn DESC — most recent first. // Includes refund and chargeback transactions via PARENTTXNID linkage. public async Task GetPayTransactionsByOrder(int payOrderId, LoginDTO loginDTO) { try { var param = new { PayOrderId = payOrderId, TenantId = loginDTO.ClientId }; var result = await _QueryExecutor.QueryAsync( loginDTO, PayTransactionQB.GET_PAY_TRANSACTIONS_BY_ORDER, param).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } catch (Exception) { throw; } } } }