bug fixes

This commit is contained in:
2026-06-01 13:27:57 +02:00
parent c2f5b63fa6
commit cc1169f09c
10 changed files with 55 additions and 151 deletions

View File

@@ -23,6 +23,7 @@ import java.util.UUID;
public class Transaction extends BaseEntity {
private String userId;
private String trace;
private String region;
private BigDecimal amount;
private BigDecimal charge;
private BigDecimal gatewayCharge;

View File

@@ -15,4 +15,5 @@ public interface ChargeRepository extends JpaRepository<Charge, UUID> {
List<Charge> findAllByCurrency(CurrencyType currency);
boolean existsByChargeLabelAndCurrency(ChargeLabelEnum chargeLabel, CurrencyType currency);
boolean existsByChargeLabelAndCurrencyAndPercentageRate(ChargeLabelEnum chargeLabel, CurrencyType currency, BigDecimal percentageRate);
boolean existsByChargeLabelAndCurrencyAndDescription(ChargeLabelEnum chargeLabel, CurrencyType currency, String description);
}

View File

@@ -34,52 +34,6 @@ public class HotRechargeTokenService {
private long cacheExpiryTime;
public synchronized String getToken() {
if (isCacheValid()) {
logger.info("Cache is valid, attempting token refresh");
return refreshCachedToken();
}
return fetchNewToken();
}
private boolean isCacheValid() {
return cachedToken != null && cachedRefreshToken != null && System.currentTimeMillis() < cacheExpiryTime;
}
private synchronized String refreshCachedToken() {
if (!isCacheValid()) {
return fetchNewToken();
}
try {
logger.info("Refreshing HotRecharge token via refresh endpoint");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
Map<String, String> payload = Map.of(
"token", cachedToken,
"refreshToken", cachedRefreshToken
);
LinkedHashMap<String, Object> response = restService.postAs(hotAuthUrl + "/identity/refresh", payload, headers, LinkedHashMap.class);
cachedToken = (String) response.get("token");
cachedRefreshToken = (String) response.get("refreshToken");
cacheExpiryTime = System.currentTimeMillis() + (cacheDurationMinutes * 60 * 1000L);
logger.info("HotRecharge token refreshed via refresh endpoint, cache extended by {} minutes", cacheDurationMinutes);
return cachedToken;
} catch (Exception e) {
logger.error("Failed to refresh HotRecharge token: " + e.getMessage(), e);
// Fall back to login on refresh failure
return fetchNewToken();
}
}
private synchronized String fetchNewToken() {
if (isCacheValid()) {
return refreshCachedToken();
}
try {
logger.info("Fetching new HotRecharge token via login");
HttpHeaders headers = new HttpHeaders();
@@ -99,9 +53,33 @@ public class HotRechargeTokenService {
logger.info("New HotRecharge token cached, cache expires in {} minutes", cacheDurationMinutes);
return cachedToken;
} catch (Exception e) {
logger.error("Failed to fetch HotRecharge token: " + e.getMessage(), e);
cachedToken = null;
cachedRefreshToken = null;
logger.error("Failed to fetch HotRecharge token: {}", e.getMessage(), e);
logger.info("Trying to refresh token");
return refreshCachedToken();
}
}
private synchronized String refreshCachedToken() {
try {
logger.info("Refreshing HotRecharge token via refresh endpoint");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
Map<String, String> payload = Map.of(
"token", cachedToken,
"refreshToken", cachedRefreshToken
);
LinkedHashMap<String, Object> response = restService.postAs(hotAuthUrl + "/identity/refresh", payload, headers, LinkedHashMap.class);
cachedToken = (String) response.get("token");
cachedRefreshToken = (String) response.get("refreshToken");
cacheExpiryTime = System.currentTimeMillis() + (cacheDurationMinutes * 60 * 1000L);
logger.info("HotRecharge token refreshed via refresh endpoint, cache extended by {} minutes", cacheDurationMinutes);
return cachedToken;
} catch (Exception e) {
logger.error("Failed to refresh HotRecharge token: {}", e.getMessage(), e);
return null;
}
}

View File

@@ -155,10 +155,10 @@ public class VelocityPaymentService {
.paymentProcessorLabel(paymentProcessorLabel)
.debitCurrency(transaction.getDebitCurrency().name())
.debitRef(transaction.getErpSalesRef())
.creditPhone(velocityApiProperties.getCreditPhone())
.creditPhone("")
.creditRegion("ZW")
.creditAccount(velocityApiProperties.getCreditAccount())
.authType(velocityApiProperties.getDefaultAuthType())
.creditAccount("")
.authType(paymentProcessorLabel.equals("VMC") ? "WEB" : "REMOTE")
.build();
if ("MPGS".equalsIgnoreCase(transaction.getPaymentProcessorLabel())) {

View File

@@ -59,9 +59,15 @@ public class NetoneConfirmationHotProcessor implements TransactionProcessorInter
put("value", transaction.getBillName());
}});
additionalDataList.add(new HashMap() {{
put("name", "Destination Phone Number");
put("name", "From");
put("value", transaction.getDebitPhone());
}});
additionalDataList.add(new HashMap() {{
put("name", "To");
put("value", transaction.getCreditAccount());
}});
if(transaction.getBillProductName() != null && !transaction.getBillProductName().isEmpty()) {
additionalDataList.add(new HashMap() {{
put("name", "Product");

View File

@@ -74,14 +74,12 @@ public class CleanupHandler implements HandlerInterface {
String debitPhoneNumber = transaction.getDebitPhone();
String creditPhoneNumber = transaction.getCreditPhone();
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
if(debitPhoneNumber != null && !debitPhoneNumber.isEmpty()){
transaction.setDebitPhone(Utils.formatPhoneNumber(debitPhoneNumber, ""));
transaction.setDebitPhone(Utils.formatPhoneNumber(debitPhoneNumber, transaction.getRegion()));
}
if(creditPhoneNumber != null && !creditPhoneNumber.isEmpty()){
transaction.setDebitPhone(Utils.formatPhoneNumber(creditPhoneNumber, "ZW"));
transaction.setCreditAccount(Utils.formatPhoneNumber(creditPhoneNumber, "ZW"));
}
return transaction;