diff --git a/src/main/java/zw/qantra/tm/domain/controllers/AdditionalDataController.java b/src/main/java/zw/qantra/tm/domain/controllers/AdditionalDataController.java index 08d6fdd..1efdc99 100644 --- a/src/main/java/zw/qantra/tm/domain/controllers/AdditionalDataController.java +++ b/src/main/java/zw/qantra/tm/domain/controllers/AdditionalDataController.java @@ -26,7 +26,7 @@ public class AdditionalDataController { @GetMapping("/transaction/{transactionId}") public ResponseEntity getByTransactionId(@PathVariable UUID transactionId) { - return additionalDataService.getAdditionalDataRepository().findByTransactionId(transactionId) + return additionalDataService.getAdditionalDataRepository().findByTransactionId(transactionId.toString()) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } diff --git a/src/main/java/zw/qantra/tm/domain/dtos/AuthResponse.java b/src/main/java/zw/qantra/tm/domain/dtos/AuthResponse.java index ebff706..c8d9ef9 100644 --- a/src/main/java/zw/qantra/tm/domain/dtos/AuthResponse.java +++ b/src/main/java/zw/qantra/tm/domain/dtos/AuthResponse.java @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.UUID; + @Data @AllArgsConstructor @NoArgsConstructor @@ -15,4 +17,5 @@ public class AuthResponse { private String phone; private String firstName; private String lastName; + private UUID uuid; } diff --git a/src/main/java/zw/qantra/tm/domain/models/AdditionalData.java b/src/main/java/zw/qantra/tm/domain/models/AdditionalData.java index c66ce1a..d383fa9 100644 --- a/src/main/java/zw/qantra/tm/domain/models/AdditionalData.java +++ b/src/main/java/zw/qantra/tm/domain/models/AdditionalData.java @@ -21,9 +21,7 @@ import zw.qantra.tm.domain.enums.RequestType; @AllArgsConstructor @NoArgsConstructor public class AdditionalData extends BaseEntity { - @OneToOne - @JoinColumn(name = "transaction_id") - private Transaction transaction; + private String transactionId; @Column(columnDefinition = "TEXT") private String jsonString; 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 3ab23f1..af4eeec 100644 --- a/src/main/java/zw/qantra/tm/domain/models/Provider.java +++ b/src/main/java/zw/qantra/tm/domain/models/Provider.java @@ -19,4 +19,5 @@ public class Provider extends BaseEntity { private String category; private String accountFieldName; private String integrationProcessorLabel; + private double percentageCommission; } diff --git a/src/main/java/zw/qantra/tm/domain/models/TransactionEvent.java b/src/main/java/zw/qantra/tm/domain/models/TransactionEvent.java index 92c6e22..091a3d8 100644 --- a/src/main/java/zw/qantra/tm/domain/models/TransactionEvent.java +++ b/src/main/java/zw/qantra/tm/domain/models/TransactionEvent.java @@ -2,6 +2,7 @@ package zw.qantra.tm.domain.models; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Enumerated; import jakarta.persistence.EnumType; @@ -24,6 +25,7 @@ public class TransactionEvent extends BaseEntity { private String event; @Enumerated(EnumType.STRING) private Status status; + @Column(columnDefinition = "TEXT") private String message; private String data; } diff --git a/src/main/java/zw/qantra/tm/domain/repositories/AdditionalDataRepository.java b/src/main/java/zw/qantra/tm/domain/repositories/AdditionalDataRepository.java index d71db9a..7fa62f6 100644 --- a/src/main/java/zw/qantra/tm/domain/repositories/AdditionalDataRepository.java +++ b/src/main/java/zw/qantra/tm/domain/repositories/AdditionalDataRepository.java @@ -11,6 +11,6 @@ import java.util.UUID; @Repository public interface AdditionalDataRepository extends JpaRepository { - Optional findByTransactionId(UUID transactionId); - Optional findByTransactionIdAndRequestType(UUID transactionId, RequestType requestType); + Optional findByTransactionId(String transactionId); + Optional findByTransactionIdAndRequestType(String transactionId, RequestType requestType); } \ No newline at end of file diff --git a/src/main/java/zw/qantra/tm/domain/repositories/UserRepository.java b/src/main/java/zw/qantra/tm/domain/repositories/UserRepository.java index c291093..58f1a31 100644 --- a/src/main/java/zw/qantra/tm/domain/repositories/UserRepository.java +++ b/src/main/java/zw/qantra/tm/domain/repositories/UserRepository.java @@ -9,7 +9,7 @@ import java.util.UUID; @Repository public interface UserRepository extends JpaRepository { - Optional findById(String uid); + Optional findById(UUID uid); Optional findByUsername(String username); Optional findByEmail(String email); Optional findByPhone(String phone); diff --git a/src/main/java/zw/qantra/tm/domain/services/TransactionService.java b/src/main/java/zw/qantra/tm/domain/services/TransactionService.java index d67ea6a..8021590 100644 --- a/src/main/java/zw/qantra/tm/domain/services/TransactionService.java +++ b/src/main/java/zw/qantra/tm/domain/services/TransactionService.java @@ -28,10 +28,7 @@ import zw.qantra.tm.domain.services.processors.handlers.FormattingHandler; import zw.qantra.tm.domain.services.processors.handlers.LogicPipeline; 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.JournalEntryHandler; -import zw.qantra.tm.domain.services.processors.handlers.erp.PaymentEntryHandler; -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.services.processors.handlers.erp.*; import zw.qantra.tm.domain.models.TransactionEvent; import zw.qantra.tm.exceptions.ApiException; import zw.qantra.tm.utils.Utils; @@ -50,6 +47,12 @@ public class TransactionService { private final RecipientService recipientService; private final TransactionEventService transactionEventService; + private final SalesInvoiceHandler salesInvoiceHandler; + private final JournalEntryHandler journalEntryHandler; + private final PaymentEntryHandler paymentEntryHandler; + private final PurchaseInvoiceHandler purchaseInvoiceHandler; + private final PurchasePaymentEntryHandler purchasePaymentEntryHandler; + public Transaction integration(Transaction transaction) { transaction.setType(RequestType.INTEGRATION); @@ -62,8 +65,8 @@ public class TransactionService { LogicPipeline transactionLogic = new LogicPipeline<>(new ValidationHandler()) - .addHandler(new JournalEntryHandler()) // todo: do this in a separate thread - .addHandler(new PaymentEntryHandler()); // todo: do this in a separate thread + .addHandler(journalEntryHandler) // todo: do this in a separate thread + .addHandler(paymentEntryHandler); // todo: do this in a separate thread transaction = transactionLogic.execute(transaction); Provider provider = providerService.getProviderRepository() @@ -84,7 +87,7 @@ public class TransactionService { transaction.setIntegrationStatus(transaction.getStatus()); transactionRepository.save(transaction); }catch (Exception e){ - e.printStackTrace(); + e.getCause().printStackTrace(); transaction.setStatus(Status.FAILED); transaction.setResponseCode("01"); transaction.setErrorMessage(e.getMessage()); @@ -94,8 +97,8 @@ public class TransactionService { // run post integration logic LogicPipeline postTransactionLogic = - new LogicPipeline<>(new PurchaseInvoiceHandler()) // todo: do this in a separate thread - .addHandler(new PurchaseInvoiceHandler()); // todo: do this in a separate thread + new LogicPipeline<>(purchaseInvoiceHandler) // todo: do this in a separate thread + .addHandler(purchasePaymentEntryHandler); // todo: do this in a separate thread transaction = postTransactionLogic.execute(transaction); transactionEvent.setStatus(transaction.getStatus()); @@ -204,7 +207,7 @@ public class TransactionService { // run post transaction logic LogicPipeline postTransactionLogic = new LogicPipeline<>(new RecipientsUpdateHandler(recipientService)) - .addHandler(new SalesInvoiceHandler());// todo: do this in a separate thread + .addHandler(salesInvoiceHandler);// todo: do this in a separate thread transaction = postTransactionLogic.execute(transaction); transactionEvent.setStatus(transaction.getStatus()); @@ -267,7 +270,7 @@ public class TransactionService { try { AdditionalData additionalData = additionalDataService.getAdditionalDataRepository() - .findByTransactionIdAndRequestType(id, RequestType.INTEGRATION).orElseThrow(() -> + .findByTransactionIdAndRequestType(id.toString(), RequestType.INTEGRATION).orElseThrow(() -> new ApiException("Additional data not found for transaction ID: " + id + " and request type: " + RequestType.INTEGRATION)); transaction.setAdditionalData(Utils.fromJson(additionalData.getJsonString(), List.class)); } catch (ApiException e) { diff --git a/src/main/java/zw/qantra/tm/domain/services/UserService.java b/src/main/java/zw/qantra/tm/domain/services/UserService.java index cee309f..7199859 100644 --- a/src/main/java/zw/qantra/tm/domain/services/UserService.java +++ b/src/main/java/zw/qantra/tm/domain/services/UserService.java @@ -57,7 +57,7 @@ public class UserService implements UserDetailsService { String token = jwtUtils.generateToken(savedUser); return new AuthResponse(token, "Bearer", savedUser.getUsername(), - savedUser.getEmail(), savedUser.getPhone(), savedUser.getFirstName(), savedUser.getLastName()); + savedUser.getEmail(), savedUser.getPhone(), savedUser.getFirstName(), savedUser.getLastName(), savedUser.getId()); } public AuthResponse login(LoginRequest request) { @@ -71,6 +71,6 @@ public class UserService implements UserDetailsService { String token = jwtUtils.generateToken(user); return new AuthResponse(token, "Bearer", user.getUsername(), - user.getEmail(), user.getPhone(), user.getFirstName(), user.getLastName()); + user.getEmail(), user.getPhone(), user.getFirstName(), user.getLastName(), user.getId()); } } diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/EconetConfirmationProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/EconetConfirmationProcessor.java index 24a6d53..e7fd825 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/EconetConfirmationProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/EconetConfirmationProcessor.java @@ -69,7 +69,7 @@ public class EconetConfirmationProcessor implements TransactionProcessorInterfac transactionService.save(transaction); AdditionalData additionalData = AdditionalData.builder() - .transaction(transaction) + .transactionId(transaction.getId().toString()) .requestType(RequestType.CONFIRM) .jsonString(Utils.toJson(body.get("additionalData"))) .build(); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/ZesaConfirmationProcessor.java b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/ZesaConfirmationProcessor.java index 52d9441..36baee6 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/ZesaConfirmationProcessor.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/confirmations/ZesaConfirmationProcessor.java @@ -69,7 +69,7 @@ public class ZesaConfirmationProcessor implements TransactionProcessorInterface transactionService.save(transaction); AdditionalData additionalData = AdditionalData.builder() - .transaction(transaction) + .transactionId(transaction.getId().toString()) .requestType(RequestType.CONFIRM) .jsonString(Utils.toJson(body.get("additionalData"))) .build(); diff --git a/src/main/java/zw/qantra/tm/domain/services/processors/handlers/erp/JournalEntryHandler.java b/src/main/java/zw/qantra/tm/domain/services/processors/handlers/erp/JournalEntryHandler.java index 8092217..aaf42a9 100644 --- a/src/main/java/zw/qantra/tm/domain/services/processors/handlers/erp/JournalEntryHandler.java +++ b/src/main/java/zw/qantra/tm/domain/services/processors/handlers/erp/JournalEntryHandler.java @@ -1,5 +1,6 @@ package zw.qantra.tm.domain.services.processors.handlers.erp; +import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,7 @@ import zw.qantra.tm.domain.enums.Status; import zw.qantra.tm.domain.models.Transaction; import zw.qantra.tm.domain.models.TransactionEvent; import zw.qantra.tm.domain.models.User; +import zw.qantra.tm.domain.repositories.TransactionRepository; import zw.qantra.tm.domain.services.TransactionEventService; import zw.qantra.tm.domain.services.TransactionService; import zw.qantra.tm.domain.services.UserService; @@ -24,23 +26,17 @@ import zw.qantra.tm.exceptions.ApiException; import zw.qantra.tm.rest.RestService; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Base64; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; @Service +@RequiredArgsConstructor public class JournalEntryHandler implements LogicHandler{ Logger logger = LoggerFactory.getLogger(JournalEntryHandler.class); - @Autowired - private RestService restService; - @Autowired - private UserService userService; - @Autowired - private TransactionEventService transactionEventService; - @Autowired - private TransactionService transactionService; + private final RestService restService; + private final UserService userService; + private final TransactionEventService transactionEventService; + private final TransactionRepository transactionRepository; @Value("${erpnext.url}") private String erpnextUrl; @@ -104,28 +100,20 @@ public class JournalEntryHandler implements LogicHandler{ Logger logger = LoggerFactory.getLogger(PaymentEntryHandler.class); - @Autowired - private RestService restService; - @Autowired - private UserService userService; - @Autowired - private TransactionEventService transactionEventService; - @Autowired - private TransactionService transactionService; + private final RestService restService; + private final UserService userService; + private final TransactionEventService transactionEventService; + private final TransactionRepository transactionRepository; @Value("${erpnext.url}") private String erpnextUrl; @@ -99,7 +95,7 @@ public class PaymentEntryHandler implements LogicHandler{ Logger logger = LoggerFactory.getLogger(PurchaseInvoiceHandler.class); - @Autowired - private RestService restService; - @Autowired - private UserService userService; - @Autowired - private TransactionEventService transactionEventService; - @Autowired - private TransactionService transactionService; + private final RestService restService; + private final UserService userService; + private final TransactionEventService transactionEventService; + private final TransactionRepository transactionRepository; + private final ProviderService providerService; + @Value("${erpnext.url}") private String erpnextUrl; @@ -94,28 +99,36 @@ public class PurchaseInvoiceHandler implements LogicHandler{ Logger logger = LoggerFactory.getLogger(PurchasePaymentEntryHandler.class); - @Autowired - private RestService restService; - @Autowired - private UserService userService; - @Autowired - private TransactionEventService transactionEventService; - @Autowired - private TransactionService transactionService; + private final RestService restService; + private final UserService userService; + private final TransactionEventService transactionEventService; + private final TransactionRepository transactionRepository; + private final ProviderService providerService; @Value("${erpnext.url}") private String erpnextUrl; @@ -57,7 +57,7 @@ public class PurchasePaymentEntryHandler implements LogicHandler{ Logger logger = LoggerFactory.getLogger(SalesInvoiceHandler.class); - @Autowired - private RestService restService; - @Autowired - private UserService userService; - @Autowired - private TransactionEventService transactionEventService; - @Autowired - private TransactionService transactionService; + private final RestService restService; + private final UserService userService; + private final TransactionEventService transactionEventService; + private final TransactionRepository transactionRepository; @Value("${erpnext.url}") private String erpnextUrl; @@ -64,7 +61,7 @@ public class SalesInvoiceHandler implements LogicHandler