progress on aligning transaction payloads
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
package zw.qantra.tm.domain.services;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import zw.qantra.tm.domain.models.TransactionEvent;
|
||||
import zw.qantra.tm.domain.repositories.TransactionEventRepository;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class TransactionEventService {
|
||||
private final TransactionEventRepository transactionEventRepository;
|
||||
|
||||
public void save(TransactionEvent transactionEvent) {
|
||||
transactionEventRepository.save(transactionEvent);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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() + "_" +
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package zw.qantra.tm.domain.services.processors.handlers;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import zw.qantra.tm.domain.enums.RequestType;
|
||||
import zw.qantra.tm.domain.models.Transaction;
|
||||
import zw.qantra.tm.utils.Utils;
|
||||
@@ -9,6 +11,7 @@ public class ConfirmationLogicHandler implements LogicHandler<Transaction, Trans
|
||||
public Transaction process(Transaction transaction) {
|
||||
if(transaction.getType().equals(RequestType.CONFIRM)) {
|
||||
transaction.setTrace(Utils.getUid());
|
||||
transaction.setReference(UUID.randomUUID().toString());
|
||||
}
|
||||
return transaction;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user