From fbc3967215de96d4a17cb68ba792cda485676771 Mon Sep 17 00:00:00 2001 From: Vusa Date: Thu, 9 Jul 2026 21:19:43 +0200 Subject: [PATCH] added openwa failure notifications --- .../domain/repositories/TransactionRepository.java | 2 +- .../zw/qantra/tm/domain/services/JobService.java | 13 +++++++++---- .../tm/domain/services/NotificationService.java | 2 +- .../payments/CityWalletRemotePaymentProcessor.java | 2 ++ .../payments/EcocashRemotePaymentProcessor.java | 2 ++ .../payments/MPGSWebPaymentProcessor.java | 3 +++ .../processors/workflows/RegistrationWorkflow.java | 8 ++++---- .../workflows/handlers/GatewayPaymentHandler.java | 12 +++++++++++- .../workflows/handlers/IntegrationHandler.java | 11 +++++++++++ src/main/resources/application.properties | 1 + 10 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main/java/zw/qantra/tm/domain/repositories/TransactionRepository.java b/src/main/java/zw/qantra/tm/domain/repositories/TransactionRepository.java index 6f97b66..61ada40 100644 --- a/src/main/java/zw/qantra/tm/domain/repositories/TransactionRepository.java +++ b/src/main/java/zw/qantra/tm/domain/repositories/TransactionRepository.java @@ -22,5 +22,5 @@ public interface TransactionRepository extends JpaRepository, List findAllByWorkspaceIdIsNullAndUserIdIsNotNull(); List findAllByConfirmationStatusAndPaymentStatusAndIntegrationStatus( Status s1, Status s2, Status s3); - List findAllByPaymentStatusAndPollingStatus(Status s1, Status s2); + List findAllByPollingStatus(Status s2); } \ No newline at end of file diff --git a/src/main/java/zw/qantra/tm/domain/services/JobService.java b/src/main/java/zw/qantra/tm/domain/services/JobService.java index 47a3d75..89d2db1 100644 --- a/src/main/java/zw/qantra/tm/domain/services/JobService.java +++ b/src/main/java/zw/qantra/tm/domain/services/JobService.java @@ -35,7 +35,7 @@ public class JobService { public void checkOrphanedTransactions() { List transactions = transactionService.getTransactionRepository() - .findAllByPaymentStatusAndPollingStatus(Status.SUCCESS, Status.PENDING); + .findAllByPollingStatus(Status.PENDING); if (!transactions.isEmpty()) log.info("Transaction count {}", transactions.size()); @@ -47,8 +47,13 @@ public class JobService { int maxRetries = settingService.getIntegerSetting("MAX_RETRIES"); int retries = transaction.getRetries() == null ? 0 : transaction.getRetries(); - if (retries >= maxRetries) + if (retries >= maxRetries) { + transaction.setPaymentStatus(Status.FAILED); + transaction.setPollingStatus(Status.FAILED); + transaction.setErrorMessage("Maximum retries reached"); + transactionService.save(transaction); break; + } transaction.setRetries(retries + 1); // polling logic @@ -106,8 +111,8 @@ public class JobService { success++; }else { - transaction.setPollingStatus(Status.FAILED); - transaction.setIntegrationStatus(Status.FAILED); + transaction.setPollingStatus(Status.PENDING); + transaction.setIntegrationStatus(Status.PENDING); transactionService.save(transaction); } diff --git a/src/main/java/zw/qantra/tm/domain/services/NotificationService.java b/src/main/java/zw/qantra/tm/domain/services/NotificationService.java index 596a5f9..a34b27c 100644 --- a/src/main/java/zw/qantra/tm/domain/services/NotificationService.java +++ b/src/main/java/zw/qantra/tm/domain/services/NotificationService.java @@ -108,7 +108,7 @@ public class NotificationService { public void sendWA(String chatId, String text) { try { Map payload = new HashMap<>(); - payload.put("chatId", chatId); + payload.put("chatId", String.format("%s@c.us", chatId)); payload.put("text", text); HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/payments/CityWalletRemotePaymentProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/payments/CityWalletRemotePaymentProcessor.java index ad804ed..fb7c33c 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/payments/CityWalletRemotePaymentProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/payments/CityWalletRemotePaymentProcessor.java @@ -40,6 +40,7 @@ public class CityWalletRemotePaymentProcessor implements TransactionProcessorInt } catch (Exception e) { e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); + transaction.setPaymentStatus(Status.FAILED); transaction.setStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); @@ -71,6 +72,7 @@ public class CityWalletRemotePaymentProcessor implements TransactionProcessorInt } catch (Exception e) { e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); + transaction.setPollingStatus(Status.FAILED); transaction.setStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/payments/EcocashRemotePaymentProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/payments/EcocashRemotePaymentProcessor.java index cfb48a2..2f57e19 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/payments/EcocashRemotePaymentProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/payments/EcocashRemotePaymentProcessor.java @@ -46,6 +46,7 @@ public class EcocashRemotePaymentProcessor implements TransactionProcessorInterf e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); transaction.setStatus(Status.FAILED); + transaction.setPaymentStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); transaction.setErrorMessage("Payment failed. Please try again."); @@ -77,6 +78,7 @@ public class EcocashRemotePaymentProcessor implements TransactionProcessorInterf e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); transaction.setStatus(Status.FAILED); + transaction.setPollingStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); transaction.setErrorMessage("Payment failed. Please try again."); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/payments/MPGSWebPaymentProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/payments/MPGSWebPaymentProcessor.java index b8b0eae..091eb40 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/payments/MPGSWebPaymentProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/payments/MPGSWebPaymentProcessor.java @@ -48,6 +48,7 @@ public class MPGSWebPaymentProcessor implements TransactionProcessorInterface { e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); transaction.setStatus(Status.FAILED); + transaction.setPaymentStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); transaction.setErrorMessage("Payment failed. Please try again"); @@ -62,6 +63,7 @@ public class MPGSWebPaymentProcessor implements TransactionProcessorInterface { if(settingService.getBooleanSetting("SIMULATE_MPGS_SUCCESS")) { transaction.setStatus(Status.SUCCESS); + transaction.setPollingStatus(Status.SUCCESS); transaction.setResponseCode("02"); transaction.setTargetUrl("/home"); return transaction; @@ -74,6 +76,7 @@ public class MPGSWebPaymentProcessor implements TransactionProcessorInterface { e.printStackTrace(); logger.error("Network error during payment processing: {}", e.getMessage(), e); transaction.setStatus(Status.FAILED); + transaction.setPollingStatus(Status.FAILED); transaction.setResponseCode("99"); transaction.setSystemErrorMessage("Network error: " + e.getMessage()); transaction.setErrorMessage("Payment failed. Please try again"); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/RegistrationWorkflow.java b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/RegistrationWorkflow.java index c056aff..77986f0 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/RegistrationWorkflow.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/RegistrationWorkflow.java @@ -120,8 +120,8 @@ public class RegistrationWorkflow extends WorkflowDefinition { Otp otp = otpService.generateOtp(username, "REGISTRATION"); notificationService.sendOtpEmail(email, username, otp.getOtp()); - notificationService.sendSms(registerRequest.getPhone(), - "Your Velocity Pay verification code is: " + otp.getOtp()); + String message = "Your Velocity Pay verification code is: " + otp.getOtp(); + notificationService.sendSms(registerRequest.getPhone(), message); log.info("otp generated successfully: {}", otp.getOtp()); } catch (Exception e) { @@ -146,8 +146,8 @@ public class RegistrationWorkflow extends WorkflowDefinition { Otp otp = otpService.generateOtp(otpRequest.getUsername(), "REGISTRATION"); // The username field in OtpRequest may actually contain the email; use it directly notificationService.sendOtpEmail(otpRequest.getUsername(), otpRequest.getUsername(), otp.getOtp()); - notificationService.sendSms(otpRequest.getPhone(), - "Your Velocity Pay verification code is: " + otp.getOtp()); + String message = "Your Velocity Pay verification code is: " + otp.getOtp(); + notificationService.sendSms(otpRequest.getPhone(), message); log.info("otp resent successfully: {}", otp.getOtp()); } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/GatewayPaymentHandler.java b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/GatewayPaymentHandler.java index faf98ca..4515442 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/GatewayPaymentHandler.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/GatewayPaymentHandler.java @@ -3,6 +3,7 @@ package zw.qantra.tm.domain.services.processors.workflows.handlers; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import zw.qantra.tm.domain.enums.Status; import zw.qantra.tm.domain.models.Transaction; @@ -22,6 +23,10 @@ public class GatewayPaymentHandler implements HandlerInterface { private final RecipientService recipientService; private final TransactionEventService transactionEventService; private final TransactionService transactionService; + private final NotificationService notificationService; + + @Value("${wa.api.phone}") + private String waPhone; @Override public Object process(Transaction incomingTransaction) throws Exception { @@ -73,7 +78,12 @@ public class GatewayPaymentHandler implements HandlerInterface { transaction.setResponseCode("01"); transaction.setErrorMessage(e.getMessage()); transactionService.save(transaction); - return transaction; + } + + if(transaction.getPaymentStatus().equals(Status.FAILED)) { + notificationService.sendWA(waPhone, String.format( + "Payment failed: Transaction: %s, Customer message: %s, System message: %s", + transaction.getId(), transaction.getErrorMessage(), transaction.getSystemErrorMessage())); } transactionEvent.setStatus(transaction.getStatus()); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/IntegrationHandler.java b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/IntegrationHandler.java index 63a3442..aa1345a 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/IntegrationHandler.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/workflows/handlers/IntegrationHandler.java @@ -3,6 +3,7 @@ package zw.qantra.tm.domain.services.processors.workflows.handlers; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import zw.qantra.tm.domain.enums.RequestType; import zw.qantra.tm.domain.enums.Status; @@ -28,6 +29,10 @@ public class IntegrationHandler implements HandlerInterface { private final RecipientService recipientService; private final TransactionEventService transactionEventService; private final TransactionService transactionService; + private final NotificationService notificationService; + + @Value("${wa.api.phone}") + private String waPhone; List lock = new ArrayList<>(); @@ -86,6 +91,12 @@ public class IntegrationHandler implements HandlerInterface { transaction.setIntegrationStatus(transaction.getStatus()); + if(!transaction.getIntegrationStatus().equals(Status.SUCCESS)) { + notificationService.sendWA(waPhone, String.format( + "Integration failed: Transaction %s, Customer message: %s, System message: %s", + transaction.getId(), transaction.getErrorMessage(), transaction.getSystemErrorMessage())); + } + removeLock(transaction.getId().toString()); if(transaction.getStatus() != Status.SUCCESS){ transactionService.save(transaction); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0827306..5cdced2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -94,3 +94,4 @@ cloudflare-zone-id=378cea8e50c0d9a158816109b3b1fd8d wa.api.url=http://173.212.247.232:2785/api/sessions/70eae8dc-2be8-465a-a54b-b6c1d3313699/messages/send-text wa.api.key=owa_k1_3d2198d81573303f0b48c3c4a6981fd13261b1d0099758eabf4efb53beaba77d +wa.api.phone=263773591219 \ No newline at end of file