From d31c8a1e11a0aebd3413656575d55378d293ee0c Mon Sep 17 00:00:00 2001 From: Vusumuzi Khoza Date: Sun, 3 May 2026 23:42:02 +0200 Subject: [PATCH] hotrecharge integration complete --- pom.xml | 8 ++ src/main/java/zw/qantra/tm/TmApplication.java | 2 + .../java/zw/qantra/tm/config/CacheConfig.java | 25 +++++ .../controllers/ProviderController.java | 2 +- .../controllers/TransactonController.java | 4 +- .../qantra/tm/domain/dtos/SBZProductDto.java | 1 + .../zw/qantra/tm/domain/models/Provider.java | 5 + .../tm/domain/services/ProviderService.java | 91 +++++++++++++++++-- ...EconetBundlesConfirmationHotProcessor.java | 30 ++---- .../EconetConfirmationHotProcessor.java | 30 ++---- .../NetoneConfirmationHotProcessor.java | 72 +++++++++++++++ .../ZesaConfirmationHotProcessor.java | 8 +- .../HotRechargeIntegrationProcessor.java | 42 +++++---- .../EcocashRemotePaymentProcessor.java | 18 ++-- 14 files changed, 253 insertions(+), 85 deletions(-) create mode 100644 src/main/java/zw/qantra/tm/config/CacheConfig.java diff --git a/pom.xml b/pom.xml index 13bb307..1dc43bd 100644 --- a/pom.xml +++ b/pom.xml @@ -175,6 +175,14 @@ loki-logback-appender 2.0.1 + + org.springframework.boot + spring-boot-starter-cache + + + com.github.ben-manes.caffeine + caffeine + diff --git a/src/main/java/zw/qantra/tm/TmApplication.java b/src/main/java/zw/qantra/tm/TmApplication.java index 1a7763c..c60ab3c 100644 --- a/src/main/java/zw/qantra/tm/TmApplication.java +++ b/src/main/java/zw/qantra/tm/TmApplication.java @@ -3,6 +3,7 @@ package zw.qantra.tm; import io.nflow.rest.config.RestConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import com.google.gson.Gson; @@ -10,6 +11,7 @@ import org.springframework.context.annotation.Import; @SpringBootApplication @Import(RestConfiguration.class) +@EnableCaching public class TmApplication { public static void main(String[] args) { diff --git a/src/main/java/zw/qantra/tm/config/CacheConfig.java b/src/main/java/zw/qantra/tm/config/CacheConfig.java new file mode 100644 index 0000000..cdd302b --- /dev/null +++ b/src/main/java/zw/qantra/tm/config/CacheConfig.java @@ -0,0 +1,25 @@ +package zw.qantra.tm.config; + +import com.github.benmanes.caffeine.cache.Caffeine; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.caffeine.CaffeineCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@Configuration +@EnableCaching +public class CacheConfig { + + @Bean + public CacheManager cacheManager() { + CaffeineCacheManager cacheManager = new CaffeineCacheManager("providerProducts"); + cacheManager.setCaffeine(Caffeine.newBuilder() + .expireAfterWrite(24, TimeUnit.HOURS) + .maximumSize(10000)); + return cacheManager; + } +} + diff --git a/src/main/java/zw/qantra/tm/domain/controllers/ProviderController.java b/src/main/java/zw/qantra/tm/domain/controllers/ProviderController.java index ad9334c..1f6d8ce 100644 --- a/src/main/java/zw/qantra/tm/domain/controllers/ProviderController.java +++ b/src/main/java/zw/qantra/tm/domain/controllers/ProviderController.java @@ -22,7 +22,7 @@ public class ProviderController { @GetMapping("/{id}/products") public ResponseEntity getProducts(@PathVariable UUID id) { - return ResponseEntity.ok(providerService.getProviderProducts(id)); + return ResponseEntity.ok(providerService.getProviderProducts(id.toString())); } @GetMapping("/{id}/products/{productId}") diff --git a/src/main/java/zw/qantra/tm/domain/controllers/TransactonController.java b/src/main/java/zw/qantra/tm/domain/controllers/TransactonController.java index e7c7805..35347b5 100644 --- a/src/main/java/zw/qantra/tm/domain/controllers/TransactonController.java +++ b/src/main/java/zw/qantra/tm/domain/controllers/TransactonController.java @@ -109,7 +109,7 @@ public class TransactonController { workflowInstanceService.updateWorkflowInstance(update, action); CompletableFuture future = workflowUtils - .waitForState(transaction.getWorkflowId(), new String[]{"purchaseInvoicePaymentSuccess", "failed"}, + .waitForState(transaction.getWorkflowId(), new String[]{"integrationStatusSuccess", "done", "failed"}, 15000, 50); Object response = future.get(); LogUtils.logPrettyJson(logger, "outgoing transaction", response); @@ -139,7 +139,7 @@ public class TransactonController { workflowInstanceService.updateWorkflowInstance(update, action); CompletableFuture future = workflowUtils - .waitForState(transaction.getWorkflowId(), new String[]{"done", "failed"}, + .waitForState(transaction.getWorkflowId(), new String[]{"pollStatusSuccess", "done", "failed"}, 15000, 50); Object response = future.get(); LogUtils.logPrettyJson(logger, "outgoing transaction", response); diff --git a/src/main/java/zw/qantra/tm/domain/dtos/SBZProductDto.java b/src/main/java/zw/qantra/tm/domain/dtos/SBZProductDto.java index 2ec6e6d..da8df2d 100644 --- a/src/main/java/zw/qantra/tm/domain/dtos/SBZProductDto.java +++ b/src/main/java/zw/qantra/tm/domain/dtos/SBZProductDto.java @@ -21,4 +21,5 @@ public class SBZProductDto { private BigDecimal defaultAmount; private boolean requiresAmount; private UUID uid; + private String externalId; } \ No newline at end of file diff --git a/src/main/java/zw/qantra/tm/domain/models/Provider.java b/src/main/java/zw/qantra/tm/domain/models/Provider.java index 22d66dc..1fa4c2b 100644 --- a/src/main/java/zw/qantra/tm/domain/models/Provider.java +++ b/src/main/java/zw/qantra/tm/domain/models/Provider.java @@ -16,12 +16,17 @@ import org.hibernate.annotations.SQLRestriction; public class Provider extends BaseEntity { private String clientId; private String label; + private String name; private String description; private String externalId; private String image; private String category; private String accountFieldName; private String integrationProcessorLabel; + private String uid; + private Boolean requiresAmount; + private Boolean requiresPhone; + private Boolean requiresAccount; private double percentageCommission; @Column(columnDefinition = "TEXT") private String meta; diff --git a/src/main/java/zw/qantra/tm/domain/services/ProviderService.java b/src/main/java/zw/qantra/tm/domain/services/ProviderService.java index b924afe..1a2e592 100644 --- a/src/main/java/zw/qantra/tm/domain/services/ProviderService.java +++ b/src/main/java/zw/qantra/tm/domain/services/ProviderService.java @@ -3,9 +3,9 @@ package zw.qantra.tm.domain.services; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.text.WordUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.Cacheable; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; @@ -15,28 +15,37 @@ import com.fasterxml.jackson.databind.ObjectMapper; import zw.qantra.tm.domain.dtos.SBZProductDto; import zw.qantra.tm.domain.models.Provider; import zw.qantra.tm.domain.repositories.ProviderRepository; +import zw.qantra.tm.exceptions.ApiException; import zw.qantra.tm.rest.RestService; +import zw.qantra.tm.utils.Utils; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Service @RequiredArgsConstructor +@Slf4j public class ProviderService { @Getter private final ProviderRepository providerRepository; private final RestService restService; + private final HotRechargeTokenService hotRechargeTokenService; + + @Value("${hot.api.url:https://ssl.hot.co.zw/api/v3}") + private String hotApiUrl; @Value("${sbz.aggregator.url}") private String aggregatorUrl; public SBZProductDto getProviderProduct(UUID providerId, UUID productId) { - return getProviderProducts(providerId).stream() + return getProviderProducts(providerId.toString()).stream() .filter(product -> product.getUid().equals(productId)) .findFirst() .orElse(null); } + @Deprecated public List getProviderProducts(UUID providerId) { String token = restService.getMerchantToken(); @@ -46,9 +55,9 @@ public class ProviderService { headers.setBearerAuth(token); LinkedHashMap response = this.restService.getAs( - aggregatorUrl + "/merchant/aggregation/products?size=20&clientUid=" + providerId.toString(), - headers, - LinkedHashMap.class + aggregatorUrl + "/merchant/aggregation/products?size=20&clientUid=" + providerId.toString(), + headers, + LinkedHashMap.class ); LinkedHashMap body = (LinkedHashMap) response.get("body"); @@ -64,6 +73,74 @@ public class ProviderService { return products; } + @Cacheable(value = "providerProducts", key = "#providerId") + public List getProviderProducts(String providerId) { + try { + Provider provider = providerRepository.findByClientId(providerId); + if (provider == null) { + return Collections.emptyList(); + } + String stockUrl = hotApiUrl + "/query/stock/" + 111; + HttpHeaders headers = new HttpHeaders(); + String token = hotRechargeTokenService.getToken(); + headers.setBearerAuth(token); + + LinkedHashMap response = restService.getAs(stockUrl, headers, LinkedHashMap.class); + List stock = (List) response.get("stock"); + + List products = new ArrayList<>(); + for (Object item : stock) { + LinkedHashMap stockItem = (LinkedHashMap) item; + String stockProviderId = (String) stockItem.get("providerId"); + if (stockProviderId.equals(providerId)) { + log.info("Found matching provider in stock: " + stockItem); + + SBZProductDto sbzProductDto = new SBZProductDto(); + sbzProductDto.setName((String) stockItem.get("name")); + sbzProductDto.setDescription((String) stockItem.get("description")); + sbzProductDto.setDisplayName((String) stockItem.get("name")); + sbzProductDto.setDefaultAmount(new BigDecimal(stockItem.get("amount").toString())); + sbzProductDto.setRequiresAmount(true); // always true for now + sbzProductDto.setUid(UUID.fromString(Utils.getUid())); + sbzProductDto.setExternalId((String) stockItem.get("productCode")); + products.add(sbzProductDto); + } + } + + return products; + } catch (IllegalArgumentException e) { + return Collections.emptyList(); + } + } + + public String getProviderId(String billClientId) { + Provider provider = getProviderRepository() + .findByClientId(billClientId); + if(provider == null){ + throw new ApiException("Provider not found for billClientId: " + billClientId); + } + @SuppressWarnings("unchecked") + Map meta = Utils.fromJson(provider.getMeta(), Map.class); + return meta.get("hotProductId"); + } + + public String getExternalId(String providerId, String productUuid) { + try { + UUID productUid = UUID.fromString(productUuid); + + List products = getProviderProducts(providerId); + + return products.stream() + .filter(product -> product.getUid().equals(productUid)) + .map(SBZProductDto::getExternalId) + .findFirst() + .orElse(null); + } catch (IllegalArgumentException e) { + log.error("Invalid UUID format: " + productUuid, e); + return null; + } + } + public Object getProviderByClientId(String clientId) { Provider provider = providerRepository.findByClientId(clientId); if (provider != null) { @@ -81,7 +158,7 @@ public class ProviderService { existingProviders = getProviderRepository().findAll(); } - return getProviders(existingProviders); + return existingProviders; } public Object getProviders(List existingProviders) { diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetBundlesConfirmationHotProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetBundlesConfirmationHotProcessor.java index 50b7597..6688de3 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetBundlesConfirmationHotProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetBundlesConfirmationHotProcessor.java @@ -1,29 +1,17 @@ package zw.qantra.tm.domain.services.processors.confirmations.hotrecharge; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import zw.qantra.tm.domain.enums.Status; -import zw.qantra.tm.domain.models.Transaction; -import zw.qantra.tm.domain.services.processors.TransactionProcessorInterface; +import zw.qantra.tm.domain.services.AdditionalDataService; +import zw.qantra.tm.domain.services.HotRechargeTokenService; +import zw.qantra.tm.rest.RestService; @Service("CONFIRM_ECONET_BUNDLES_HOT") -@RequiredArgsConstructor -public class EconetBundlesConfirmationHotProcessor implements TransactionProcessorInterface { - @Override - public Object process(Transaction transaction) throws Exception { - transaction.setStatus(Status.SUCCESS); - transaction.setResponseCode("00"); - return transaction; - } - - @Override - public Object reverse(Transaction transaction) { - return transaction; - } - - @Override - public Object poll(Transaction transaction) throws Exception { - return transaction; +public class EconetBundlesConfirmationHotProcessor extends NetoneConfirmationHotProcessor { + public EconetBundlesConfirmationHotProcessor( + AdditionalDataService additionalDataService, + HotRechargeTokenService hotRechargeTokenService, + RestService restService) { + super(additionalDataService, hotRechargeTokenService, restService); } } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetConfirmationHotProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetConfirmationHotProcessor.java index 59c5d13..09378dc 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetConfirmationHotProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/EconetConfirmationHotProcessor.java @@ -1,29 +1,17 @@ package zw.qantra.tm.domain.services.processors.confirmations.hotrecharge; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import zw.qantra.tm.domain.enums.Status; -import zw.qantra.tm.domain.models.Transaction; -import zw.qantra.tm.domain.services.processors.TransactionProcessorInterface; +import zw.qantra.tm.domain.services.AdditionalDataService; +import zw.qantra.tm.domain.services.HotRechargeTokenService; +import zw.qantra.tm.rest.RestService; @Service("CONFIRM_ECONET_HOT") -@RequiredArgsConstructor -public class EconetConfirmationHotProcessor implements TransactionProcessorInterface { - @Override - public Object process(Transaction transaction) throws Exception { - transaction.setStatus(Status.SUCCESS); - transaction.setResponseCode("00"); - return transaction; - } - - @Override - public Object reverse(Transaction transaction) { - return transaction; - } - - @Override - public Object poll(Transaction transaction) throws Exception { - return transaction; +public class EconetConfirmationHotProcessor extends NetoneConfirmationHotProcessor { + public EconetConfirmationHotProcessor( + AdditionalDataService additionalDataService, + HotRechargeTokenService hotRechargeTokenService, + RestService restService) { + super(additionalDataService, hotRechargeTokenService, restService); } } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/NetoneConfirmationHotProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/NetoneConfirmationHotProcessor.java index b43347f..53eeb52 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/NetoneConfirmationHotProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/NetoneConfirmationHotProcessor.java @@ -1,19 +1,68 @@ package zw.qantra.tm.domain.services.processors.confirmations.hotrecharge; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; +import zw.qantra.tm.domain.enums.RequestType; import zw.qantra.tm.domain.enums.Status; +import zw.qantra.tm.domain.models.AdditionalData; import zw.qantra.tm.domain.models.Transaction; +import zw.qantra.tm.domain.services.AdditionalDataService; +import zw.qantra.tm.domain.services.HotRechargeTokenService; import zw.qantra.tm.domain.services.processors.TransactionProcessorInterface; +import zw.qantra.tm.rest.RestService; +import zw.qantra.tm.utils.Utils; + +import java.math.BigDecimal; +import java.util.*; @Service("CONFIRM_NETONE_HOT") @RequiredArgsConstructor +@Slf4j public class NetoneConfirmationHotProcessor implements TransactionProcessorInterface { + private final AdditionalDataService additionalDataService; + private final HotRechargeTokenService hotRechargeTokenService; + private final RestService restService; + + @Value("${hot.api.url:https://ssl.hot.co.zw/api/v3}") + private String hotApiUrl; + + @Override public Object process(Transaction transaction) throws Exception { + + String token = hotRechargeTokenService.getToken(); + if (!checkBalance(token, transaction.getAmount())) { + transaction.setStatus(Status.FAILED); + transaction.setResponseCode("92"); + transaction.setErrorMessage("There's a technical issue on our end. Please try again later."); + return transaction; + } + transaction.setStatus(Status.SUCCESS); transaction.setResponseCode("00"); + + List additionalDataList = new ArrayList<>(); + additionalDataList.add(new HashMap() {{ + put("name", "Provider"); + put("value", transaction.getBillName()); + }}); + additionalDataList.add(new HashMap() {{ + put("name", "Destination Phone Number"); + put("value", transaction.getCreditAccount()); + }}); + transaction.setAdditionalData(additionalDataList); + + AdditionalData additionalData = AdditionalData.builder() + .transactionId(transaction.getId().toString()) + .requestType(RequestType.CONFIRM) + .jsonString(Utils.toJson(additionalDataList)) + .build(); + additionalDataService.getAdditionalDataRepository().save(additionalData); + return transaction; } @@ -26,4 +75,27 @@ public class NetoneConfirmationHotProcessor implements TransactionProcessorInter public Object poll(Transaction transaction) throws Exception { return transaction; } + + private boolean checkBalance(String token, BigDecimal amount) { + try { + String balanceUrl = hotApiUrl + "/account/balance/4"; + HttpHeaders headers = new HttpHeaders(); + headers.setBearerAuth(token); + + LinkedList responseEntity = restService.getAs(balanceUrl, headers, LinkedList.class); + LinkedHashMap response = (LinkedHashMap) responseEntity.get(0); + log.info("Response: {}", response); + + if (response != null && response.containsKey("balance")) { + Object balance = response.get("balance"); + log.info("Current balance: {}", balance); + return (new BigDecimal(balance.toString())).compareTo(amount) > 0; + } + return false; + } catch (Exception e) { + log.error("Failed to check balance: {}", e.getMessage(), e); + return false; + } + } + } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/ZesaConfirmationHotProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/ZesaConfirmationHotProcessor.java index 7d4f7ed..81d9a2f 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/ZesaConfirmationHotProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/hotrecharge/ZesaConfirmationHotProcessor.java @@ -52,8 +52,8 @@ public class ZesaConfirmationHotProcessor implements TransactionProcessorInterfa if (!checkBalance(token, transaction.getAmount())) { transaction.setStatus(Status.FAILED); - transaction.setResponseCode("91"); - transaction.setErrorMessage("Insufficient balance"); + transaction.setResponseCode("92"); + transaction.setErrorMessage("There's a technical issue on our end. Please try again later."); return transaction; } @@ -91,12 +91,12 @@ public class ZesaConfirmationHotProcessor implements TransactionProcessorInterfa private List> buildAdditionalData(Map customerData) { List> additionalDataList = new ArrayList<>(); if (customerData != null) { - additionalDataList.add(Map.of("key", "accountNumber", + additionalDataList.add(Map.of("name", "MeterNumber", "value", customerData.getOrDefault("accountNumber", "").toString())); Map details = (Map) customerData.get("details"); if (details != null) { for (Map.Entry entry : details.entrySet()) { - additionalDataList.add(Map.of("key", entry.getKey(), "value", entry.getValue().toString())); + additionalDataList.add(Map.of("name", entry.getKey(), "value", entry.getValue().toString())); } } } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/integrations/HotRechargeIntegrationProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/integrations/HotRechargeIntegrationProcessor.java index ed14fd9..bfbadcc 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/integrations/HotRechargeIntegrationProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/integrations/HotRechargeIntegrationProcessor.java @@ -13,11 +13,9 @@ import org.springframework.web.client.ResourceAccessException; import zw.qantra.tm.domain.enums.RequestType; import zw.qantra.tm.domain.enums.Status; import zw.qantra.tm.domain.models.AdditionalData; -import zw.qantra.tm.domain.models.Provider; import zw.qantra.tm.domain.models.Transaction; import zw.qantra.tm.domain.services.*; import zw.qantra.tm.domain.services.processors.TransactionProcessorInterface; -import zw.qantra.tm.exceptions.ApiException; import zw.qantra.tm.rest.RestService; import zw.qantra.tm.utils.Utils; @@ -73,8 +71,8 @@ public class HotRechargeIntegrationProcessor implements TransactionProcessorInte if (!checkBalance(token, transaction.getAmount())) { transaction.setStatus(Status.FAILED); - transaction.setResponseCode("91"); - transaction.setErrorMessage("Insufficient balance"); + transaction.setResponseCode("92"); + transaction.setErrorMessage("There's a technical issue on our end. Please try again later."); return transaction; } @@ -155,17 +153,18 @@ public class HotRechargeIntegrationProcessor implements TransactionProcessorInte Map request = new LinkedHashMap<>(); request.put("AgentReference", UUID.randomUUID().toString()); - request.put("ProductId", getProductId(transaction.getBillClientId())); + request.put("ProductId", providerService.getProviderId(transaction.getBillClientId())); request.put("Target", transaction.getCreditAccount()); request.put("Amount", transaction.getAmount()); - if(getProductId(transaction.getBillClientId()).equals("41")) { + // do this for zesa + if(providerService.getProviderId(transaction.getBillClientId()).equals("41")) { List> rechargeOptions = new ArrayList<>(); - if (transaction.getCreditPhone() != null) { + if (transaction.getDebitPhone() != null) { Map option = new LinkedHashMap<>(); option.put("Name", "NotifyNumber"); option.put("ParameterType", "String"); - option.put("Value", transaction.getCreditPhone()); + option.put("Value", transaction.getDebitPhone()); rechargeOptions.add(option); } if (!rechargeOptions.isEmpty()) { @@ -173,6 +172,18 @@ public class HotRechargeIntegrationProcessor implements TransactionProcessorInte } } + // do this for Econet bundles + if(providerService.getProviderId(transaction.getBillClientId()).equals("111")) { + String productCode = providerService.getExternalId( + providerService.getProviderId(transaction.getBillClientId()), transaction.getProductUid()); + List> rechargeOptions = new ArrayList<>(); + Map option = new LinkedHashMap<>(); + option.put("Name", "ProductCode"); + option.put("ParameterType", "String"); + option.put("Value", productCode); + rechargeOptions.add(option); + } + logger.info("Sending recharge request: {}", request); ResponseEntity response = restService.postAsEntity(rechargeUrl, request, headers, LinkedHashMap.class); logger.info("Recharge response: {}", response.getBody()); @@ -213,25 +224,16 @@ public class HotRechargeIntegrationProcessor implements TransactionProcessorInte private List> buildAdditionalDataList(Map rechargeData) { List> additionalDataList = new ArrayList<>(); for (Map.Entry entry : rechargeData.entrySet()) { + if(entry.getKey().equals("Cost")) + continue; Map dataItem = new LinkedHashMap<>(); - dataItem.put("key", entry.getKey()); + dataItem.put("name", entry.getKey()); dataItem.put("value", entry.getValue().toString()); additionalDataList.add(dataItem); } return additionalDataList; } - private String getProductId(String billClientId) { - Provider provider = providerService.getProviderRepository() - .findByClientId(billClientId); - if(provider == null){ - throw new ApiException("Provider not found for billClientId: " + billClientId); - } - @SuppressWarnings("unchecked") - Map meta = Utils.fromJson(provider.getMeta(), Map.class); - return meta.get("hotProductId"); - } - @Override public Object reverse(Transaction transaction) { return transaction; 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 0df5449..92f0844 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 @@ -42,6 +42,15 @@ public class EcocashRemotePaymentProcessor implements TransactionProcessorInterf @Override public Object process(Transaction transaction) throws Exception { logger.info("processing transaction"); + + if(settingService.getBooleanSetting("SIMULATE_ECOCASH_SUCCESS")) { + transaction.setStatus(Status.SUCCESS); + transaction.setResponseCode("00"); + transaction.setPaymentProcessorRef(RandomStringUtils.randomNumeric(10)); + transaction.setDebitRef(RandomStringUtils.randomNumeric(10)); + return transaction; + } + String token = restService.getMerchantToken(); // send total less gateway charges @@ -83,15 +92,6 @@ public class EcocashRemotePaymentProcessor implements TransactionProcessorInterf LinkedHashMap body = (LinkedHashMap) response.get("body"); transaction.setSdkActionId((String) body.get("uid")); - // todo: REMOVE THIS - if(settingService.getBooleanSetting("SIMULATE_ECOCASH_SUCCESS")){ - body.put("status", "SUCCESS"); - LinkedHashMap hashMap = new LinkedHashMap(); - hashMap.put("debitReference", RandomStringUtils.randomNumeric(10)); - body.put("transaction", hashMap); - body.put("targetUrl", "/home"); - } - if(body.get("status").equals("SUCCESS")){ transaction.setStatus(Status.SUCCESS); transaction.setResponseCode("00");