progress on aligning transaction payloads

This commit is contained in:
2025-09-01 20:16:32 +02:00
parent 61f5503bdb
commit 0ee5c2297d
16 changed files with 143 additions and 18 deletions

View File

@@ -30,6 +30,8 @@ import zw.qantra.tm.domain.services.processors.handlers.RecipientsUpdateHandler;
import zw.qantra.tm.domain.services.processors.handlers.ValidationHandler;
import zw.qantra.tm.domain.services.processors.handlers.erp.PurchaseInvoiceHandler;
import zw.qantra.tm.domain.services.processors.handlers.erp.SalesInvoiceHandler;
import zw.qantra.tm.domain.models.TransactionEvent;
import zw.qantra.tm.domain.services.TransactionEventService;
import zw.qantra.tm.exceptions.ApiException;
import zw.qantra.tm.utils.Utils;
@@ -45,10 +47,18 @@ public class TransactionService {
private final ChargeService chargeService;
private final AdditionalDataService additionalDataService;
private final RecipientService recipientService;
private final TransactionEventService transactionEventService;
public Transaction integration(Transaction transaction) {
transaction.setType(RequestType.INTEGRATION);
TransactionEvent transactionEvent = TransactionEvent.builder()
.transactionId(transaction.getId().toString())
.event(transaction.getType().name())
.status(Status.PROCESSING)
.build();
transactionEventService.save(transactionEvent);
LogicPipeline<Transaction, Transaction> transactionLogic =
new LogicPipeline<>(new ValidationHandler());
transaction = transactionLogic.execute(transaction);
@@ -81,6 +91,10 @@ public class TransactionService {
LogicPipeline<Transaction, Transaction> postTransactionLogic =
new LogicPipeline<>(new PurchaseInvoiceHandler());
transaction = postTransactionLogic.execute(transaction);
transactionEvent.setStatus(transaction.getStatus());
transactionEvent.setMessage(transaction.getErrorMessage());
transactionEventService.save(transactionEvent);
return transaction;
}
@@ -96,6 +110,13 @@ public class TransactionService {
return transaction;
}
TransactionEvent transactionEvent = TransactionEvent.builder()
.transactionId(transaction.getId().toString())
.event(RequestType.POLL.name())
.status(Status.PROCESSING)
.build();
transactionEventService.save(transactionEvent);
// no persistence happens during polling unless the transaction status changes
String label = getLabel(transaction);
logger.info("label: {}", label);
@@ -106,12 +127,14 @@ public class TransactionService {
// find out if the gateway tran was successful
transactionProcessorInterface.poll(transaction);
// if tran was successful deep copy transaction & push integration to the aggregator
transactionEvent.setStatus(transaction.getStatus());
transactionEvent.setMessage(transaction.getErrorMessage());
transactionEventService.save(transactionEvent);
// if tran was successful push integration to the aggregator
if(transaction.getStatus() == Status.SUCCESS){
Transaction transactionCopy = Utils.deepCopy(transaction, Transaction.class);
transactionCopy.setType(RequestType.INTEGRATION);
transactionCopy.setId(null);
integration(transactionCopy);
transaction.setType(RequestType.INTEGRATION);
integration(transaction);
}
} catch (Exception e) {
e.printStackTrace();
@@ -119,11 +142,25 @@ public class TransactionService {
transaction.setResponseCode("01");
transaction.setErrorMessage(e.getMessage());
}
return transaction;
}
public Transaction execute(Transaction transaction) {
transaction.setReference(UUID.randomUUID().toString());
public Transaction execute(Transaction incomingTransaction) {
// if payment request (not confirm), then fetch already existing transaction record
Transaction transaction = incomingTransaction;
if(incomingTransaction.getId() != null){
transaction = getTransactionRepository().findById(incomingTransaction.getId()).orElseThrow(() ->
new ApiException("Transaction not found for ID: " + incomingTransaction.getId()));
transaction.setType(incomingTransaction.getType()); // type should be REQUEST here
}
TransactionEvent transactionEvent = TransactionEvent.builder()
.transactionId(transaction.getId().toString())
.event(transaction.getType().name())
.status(Status.PROCESSING)
.build();
transactionEventService.save(transactionEvent);
// run pre transaction logic
LogicPipeline<Transaction, Transaction> preTransactionLogic =
@@ -143,6 +180,12 @@ public class TransactionService {
// MAIN TRANSACTION LOGIC!
transactionProcessorInterface.process(transaction);
if(transaction.getType() == RequestType.CONFIRM){
transaction.setConfirmationStatus(transaction.getStatus());
}else{
transaction.setPaymentStatus(transaction.getStatus());
}
}catch (Exception e){
e.printStackTrace();
transaction.setStatus(Status.FAILED);
@@ -158,13 +201,16 @@ public class TransactionService {
.addHandler(new SalesInvoiceHandler());
transaction = postTransactionLogic.execute(transaction);
transactionEvent.setStatus(transaction.getStatus());
transactionEvent.setMessage(transaction.getErrorMessage());
transactionEventService.save(transactionEvent);
return transaction;
}
private String getLabel(Transaction transaction){
String label = "";
List<RequestType> list = Arrays.asList(RequestType.CONFIRM);
if(list.contains(transaction.getType())){
if(transaction.getType() == RequestType.CONFIRM){
// get processor label from billClientId
Provider provider = providerService.getProviderRepository()
.findByClientId(transaction.getBillClientId());
@@ -173,6 +219,8 @@ public class TransactionService {
}
label = transaction.getType() + "_" +
provider.getLabel();
transaction.setIntegrationProcessorLabel(provider.getIntegrationProcessorLabel());
}else{
label = transaction.getType() + "_" +
transaction.getPaymentProcessorLabel() + "_" +