updates to wallet functionality
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -31,4 +31,5 @@ build/
|
|||||||
|
|
||||||
### VS Code ###
|
### VS Code ###
|
||||||
.vscode/
|
.vscode/
|
||||||
logs/
|
logs/
|
||||||
|
data/
|
||||||
|
|||||||
Binary file not shown.
@@ -1,64 +0,0 @@
|
|||||||
2026-06-11 11:30:43.191867+02:00 database: flush
|
|
||||||
org.h2.message.DbException: General error: "org.h2.mvstore.MVStoreException: The file is locked: /Users/khoza/dev/qantra/qpay-transaction-manager-spring-boot/data/jobrunr.mv.db [2.2.224/7]" [50000-224]
|
|
||||||
at org.h2.message.DbException.get(DbException.java:212)
|
|
||||||
at org.h2.message.DbException.convert(DbException.java:407)
|
|
||||||
at org.h2.mvstore.db.Store.lambda$new$0(Store.java:122)
|
|
||||||
at org.h2.mvstore.MVStore.handleException(MVStore.java:1546)
|
|
||||||
at org.h2.mvstore.MVStore.panic(MVStore.java:371)
|
|
||||||
at org.h2.mvstore.MVStore.<init>(MVStore.java:291)
|
|
||||||
at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035)
|
|
||||||
at org.h2.mvstore.db.Store.<init>(Store.java:133)
|
|
||||||
at org.h2.engine.Database.<init>(Database.java:326)
|
|
||||||
at org.h2.engine.Engine.openSession(Engine.java:92)
|
|
||||||
at org.h2.engine.Engine.openSession(Engine.java:222)
|
|
||||||
at org.h2.engine.Engine.createSession(Engine.java:201)
|
|
||||||
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343)
|
|
||||||
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125)
|
|
||||||
at org.h2.Driver.connect(Driver.java:59)
|
|
||||||
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137)
|
|
||||||
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360)
|
|
||||||
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202)
|
|
||||||
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461)
|
|
||||||
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550)
|
|
||||||
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98)
|
|
||||||
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111)
|
|
||||||
at org.jobrunr.storage.sql.common.SqlStorageProviderFactory.getStorageProviderUsingDataSource(SqlStorageProviderFactory.java:40)
|
|
||||||
at org.jobrunr.storage.sql.common.SqlStorageProviderFactory.using(SqlStorageProviderFactory.java:36)
|
|
||||||
at org.jobrunr.storage.sql.common.SqlStorageProviderFactory.using(SqlStorageProviderFactory.java:31)
|
|
||||||
at org.jobrunr.spring.autoconfigure.storage.JobRunrSqlStorageAutoConfiguration.sqlStorageProvider(JobRunrSqlStorageAutoConfiguration.java:33)
|
|
||||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
|
||||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
|
||||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
|
||||||
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
|
|
||||||
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:146)
|
|
||||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:644)
|
|
||||||
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636)
|
|
||||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1355)
|
|
||||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1185)
|
|
||||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562)
|
|
||||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
|
|
||||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
|
|
||||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
|
||||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
|
|
||||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
|
|
||||||
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975)
|
|
||||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:971)
|
|
||||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:625)
|
|
||||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
|
|
||||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
|
|
||||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
|
|
||||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
|
|
||||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363)
|
|
||||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352)
|
|
||||||
at zw.qantra.tm.TmApplication.main(TmApplication.java:20)
|
|
||||||
Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: The file is locked: /Users/khoza/dev/qantra/qpay-transaction-manager-spring-boot/data/jobrunr.mv.db [2.2.224/7]" [50000-224]
|
|
||||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:566)
|
|
||||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
|
||||||
... 51 more
|
|
||||||
Caused by: org.h2.mvstore.MVStoreException: The file is locked: /Users/khoza/dev/qantra/qpay-transaction-manager-spring-boot/data/jobrunr.mv.db [2.2.224/7]
|
|
||||||
at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996)
|
|
||||||
at org.h2.mvstore.SingleFileStore.lockFileChannel(SingleFileStore.java:143)
|
|
||||||
at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:117)
|
|
||||||
at org.h2.mvstore.SingleFileStore.open(SingleFileStore.java:81)
|
|
||||||
at org.h2.mvstore.MVStore.<init>(MVStore.java:286)
|
|
||||||
... 45 more
|
|
||||||
@@ -8,8 +8,6 @@ import zw.qantra.tm.domain.dtos.erp.VelocityAccountDto;
|
|||||||
import zw.qantra.tm.domain.dtos.erp.VelocityStatementDto;
|
import zw.qantra.tm.domain.dtos.erp.VelocityStatementDto;
|
||||||
import zw.qantra.tm.domain.services.VelocityAccountService;
|
import zw.qantra.tm.domain.services.VelocityAccountService;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/accounts")
|
@RequestMapping("/accounts")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@@ -19,10 +17,10 @@ public class AccountController {
|
|||||||
|
|
||||||
@GetMapping("/phone/{currencyPhoneConcat}")
|
@GetMapping("/phone/{currencyPhoneConcat}")
|
||||||
@PreAuthorize("hasRole('ACCOUNT_READ')")
|
@PreAuthorize("hasRole('ACCOUNT_READ')")
|
||||||
public ResponseEntity<Object> getAccountByPhone(
|
public ResponseEntity<VelocityAccountDto> getAccountByPhone(
|
||||||
@PathVariable String currencyPhoneConcat) {
|
@PathVariable String currencyPhoneConcat) {
|
||||||
try {
|
try {
|
||||||
Object account = velocityAccountService.getAccountByPhone(currencyPhoneConcat);
|
VelocityAccountDto account = velocityAccountService.getAccountByPhone(currencyPhoneConcat);
|
||||||
return ResponseEntity.ok(account);
|
return ResponseEntity.ok(account);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return ResponseEntity.badRequest().build();
|
return ResponseEntity.badRequest().build();
|
||||||
|
|||||||
@@ -2,15 +2,12 @@ package zw.qantra.tm.domain.dtos.erp;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
import jakarta.persistence.*;
|
|
||||||
import jakarta.validation.constraints.NotNull;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.sql.Timestamp;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@@ -27,11 +24,10 @@ public class VelocityAccountDto {
|
|||||||
private String type;
|
private String type;
|
||||||
private String category;
|
private String category;
|
||||||
private String ledger;
|
private String ledger;
|
||||||
private Timestamp deactivatedAt;
|
|
||||||
private BigDecimal balance;
|
private BigDecimal balance;
|
||||||
private String partyType;
|
private String partyType;
|
||||||
private String party;
|
private String party;
|
||||||
private String currency;
|
private Object currency;
|
||||||
private String customerStringId;
|
private String customerStringId;
|
||||||
private String companyStringId;
|
private String companyStringId;
|
||||||
}
|
}
|
||||||
@@ -253,8 +253,10 @@ public class GroupBatchService {
|
|||||||
CompletableFuture<Object> future = workflowUtils
|
CompletableFuture<Object> future = workflowUtils
|
||||||
.waitForState(batch.getWorkflowId(), new String[]{"done", "failed"},
|
.waitForState(batch.getWorkflowId(), new String[]{"done", "failed"},
|
||||||
15000, 50);
|
15000, 50);
|
||||||
future.get();
|
StateResponse response = (StateResponse) future.get();
|
||||||
return getBatch(batchId, userId);
|
String id = response.getBody().toString(); // this returns Batch Transaction ID
|
||||||
|
String cleaned = id.replaceAll("^\"|\"$", "");
|
||||||
|
return transactionService.findById(UUID.fromString(cleaned));
|
||||||
} catch (InterruptedException | ExecutionException e) {
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,6 @@ public class GroupBatchWorkflowService {
|
|||||||
return groupBatchRepository.save(batch);
|
return groupBatchRepository.save(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public GroupBatch processPoll(UUID batchId) throws Exception {
|
public GroupBatch processPoll(UUID batchId) throws Exception {
|
||||||
GroupBatch batch = getBatchById(batchId);
|
GroupBatch batch = getBatchById(batchId);
|
||||||
if (batch.getStatus() != GroupBatchStatus.REQUESTED && batch.getStatus() != GroupBatchStatus.POLL_FAILED) {
|
if (batch.getStatus() != GroupBatchStatus.REQUESTED && batch.getStatus() != GroupBatchStatus.POLL_FAILED) {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class ProviderService {
|
|||||||
try {
|
try {
|
||||||
response = restService.getAs(stockUrl, headers, LinkedHashMap.class);
|
response = restService.getAs(stockUrl, headers, LinkedHashMap.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("Error fetching products for provider " + providerId, e);
|
log.error("Error fetching products for provider " + providerId);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class VelocityAccountService {
|
|||||||
* @param currencyPhoneConcat The concatenation of currency and phone (e.g. "USD+263771234567").
|
* @param currencyPhoneConcat The concatenation of currency and phone (e.g. "USD+263771234567").
|
||||||
* @return VelocityAccountDto with account details.
|
* @return VelocityAccountDto with account details.
|
||||||
*/
|
*/
|
||||||
public Object getAccountByPhone(String currencyPhoneConcat) {
|
public VelocityAccountDto getAccountByPhone(String currencyPhoneConcat) {
|
||||||
try {
|
try {
|
||||||
LinkedHashMap responseMap = velocityPaymentService.makeRequest(
|
LinkedHashMap responseMap = velocityPaymentService.makeRequest(
|
||||||
HttpMethod.GET,
|
HttpMethod.GET,
|
||||||
@@ -37,7 +37,7 @@ public class VelocityAccountService {
|
|||||||
log.error("Error fetching account");
|
log.error("Error fetching account");
|
||||||
throw new IllegalStateException("Error fetching account");
|
throw new IllegalStateException("Error fetching account");
|
||||||
}
|
}
|
||||||
return responseMap;
|
return Utils.deepCopy(responseMap, VelocityAccountDto.class);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("Error fetching account by phone {}: {}", currencyPhoneConcat, e.getMessage(), e);
|
log.error("Error fetching account by phone {}: {}", currencyPhoneConcat, e.getMessage(), e);
|
||||||
throw new IllegalStateException("Error fetching account: " + e.getMessage(), e);
|
throw new IllegalStateException("Error fetching account: " + e.getMessage(), e);
|
||||||
|
|||||||
@@ -205,8 +205,10 @@ public class VelocityPaymentService {
|
|||||||
int maxRetries = settingService.getIntegerSetting("MAX_RETRIES");
|
int maxRetries = settingService.getIntegerSetting("MAX_RETRIES");
|
||||||
int retries = transaction.getRetries() == null ? 0 : transaction.getRetries();
|
int retries = transaction.getRetries() == null ? 0 : transaction.getRetries();
|
||||||
|
|
||||||
if (retries >= maxRetries)
|
if (retries >= maxRetries) {
|
||||||
|
transaction.setErrorMessage("Maximum retries reached");
|
||||||
return transaction;
|
return transaction;
|
||||||
|
}
|
||||||
|
|
||||||
transaction.setRetries(retries + 1);
|
transaction.setRetries(retries + 1);
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ public class CityWalletRemotePaymentProcessor implements TransactionProcessorInt
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
transaction = velocityPaymentService.pollPaymentStatus(transaction);
|
transaction = velocityPaymentService.pollPaymentStatus(transaction);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
logger.error("Network error during payment processing: {}", e.getMessage(), e);
|
logger.error("Network error during payment processing: {}", e.getMessage(), e);
|
||||||
@@ -88,6 +87,7 @@ public class CityWalletRemotePaymentProcessor implements TransactionProcessorInt
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
velocityPaymentService.updateTransaction(transaction.getOrderTransactionId(), code);
|
velocityPaymentService.updateTransaction(transaction.getOrderTransactionId(), code);
|
||||||
|
transaction.setStatus(Status.SUCCESS);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
logger.error("Network error during payment update: {}", e.getMessage(), e);
|
logger.error("Network error during payment update: {}", e.getMessage(), e);
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ sbz.aggregator.encryption-key=91b5b3c7-860f-473c-ac5c-b12d9121819b
|
|||||||
|
|
||||||
steward.payment.processor.url=${sbz.merchant.url}
|
steward.payment.processor.url=${sbz.merchant.url}
|
||||||
|
|
||||||
mpgs.return-url=https://vdt.co.zw/#/return
|
mpgs.return-url=https://pay.velocityafrica.net/return
|
||||||
|
|
||||||
# JWT Configuration
|
# JWT Configuration
|
||||||
jwt.secret=your-super-secret-jwt-key-here-make-it-very-long-and-secure-in-production
|
jwt.secret=your-super-secret-jwt-key-here-make-it-very-long-and-secure-in-production
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
|
|
||||||
<changeSet author="khoza (generated)" id="1781189342457-3">
|
|
||||||
<addColumn tableName="transaction">
|
|
||||||
<column name="order_transaction_id" type="varchar(255)"/>
|
|
||||||
</addColumn>
|
|
||||||
</changeSet>
|
|
||||||
<changeSet author="khoza (generated)" id="1781189342457-4">
|
|
||||||
<addColumn tableName="transaction">
|
|
||||||
<column name="retries" type="integer"/>
|
|
||||||
</addColumn>
|
|
||||||
</changeSet>
|
|
||||||
<changeSet author="khoza (generated)" id="1781189342457-5">
|
|
||||||
<addColumn tableName="transaction">
|
|
||||||
<column name="verification_code" type="varchar(255)"/>
|
|
||||||
</addColumn>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
Reference in New Issue
Block a user