This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 33fae09afb FINERACT-2326: Charges with Tax group Id ignored
33fae09afb is described below

commit 33fae09afbbc86c2d8951893293b9c6545805036
Author: Jose Alberto Hernandez <alberto@black-box.local>
AuthorDate: Wed Aug 6 19:37:43 2025 -0500

    FINERACT-2326: Charges with Tax group Id ignored
---
 .../charge/api/ChargesApiResourceSwagger.java      | 15 ++++++++
 .../CreateChargeDefinitionCommandHandler.java      |  9 +----
 .../DeleteChargeDefinitionCommandHandler.java      |  9 +----
 .../UpdateChargeDefinitionCommandHandler.java      |  9 +----
 .../portfolio/charge/request/ChargeRequest.java    |  1 +
 .../fineract/integrationtests/ChargesTest.java     | 44 ++++++++++++++++++++++
 .../common/TaxComponentHelper.java                 |  9 +++--
 .../integrationtests/common/TaxGroupHelper.java    |  9 +++--
 .../common/charges/ChargesHelper.java              |  4 --
 9 files changed, 78 insertions(+), 31 deletions(-)

diff --git 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
index 8fc27d688e..a7172f0631 100644
--- 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
+++ 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
@@ -96,6 +96,16 @@ final class ChargesApiResourceSwagger {
             public String description;
         }
 
+        static final class GetChargesTaxGroup {
+
+            private GetChargesTaxGroup() {}
+
+            @Schema(example = "1")
+            public Long id;
+            @Schema(example = "tax")
+            public String name;
+        }
+
         @Schema(example = "1")
         public Long id;
         @Schema(example = "Loan Service fee")
@@ -113,6 +123,7 @@ final class ChargesApiResourceSwagger {
         public GetChargesPaymentModeResponse chargePaymentMode;
         public BigDecimal minCap;
         public BigDecimal maxCap;
+        public GetChargesTaxGroup taxGroup;
     }
 
     @Schema(description = "PostChargesRequest")
@@ -146,6 +157,8 @@ final class ChargesApiResourceSwagger {
         public BigDecimal minCap;
         @Schema(example = "45.56")
         public BigDecimal maxCap;
+        @Schema(example = "1")
+        public Long taxGroupId;
     }
 
     @Schema(description = "PostChargesResponse")
@@ -206,6 +219,8 @@ final class ChargesApiResourceSwagger {
         public BigDecimal minCap;
         @Schema(example = "120.0")
         public BigDecimal maxCap;
+        @Schema(example = "1")
+        public Long taxGroupId;
     }
 
     @Schema(description = "PutChargesChargeIdResponse")
diff --git 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/CreateChargeDefinitionCommandHandler.java
 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/CreateChargeDefinitionCommandHandler.java
index 9114ada65c..c5ee1586ea 100644
--- 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/CreateChargeDefinitionCommandHandler.java
+++ 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/CreateChargeDefinitionCommandHandler.java
@@ -18,30 +18,25 @@
  */
 package org.apache.fineract.portfolio.charge.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.portfolio.charge.service.ChargeWritePlatformService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+@RequiredArgsConstructor
 @Service
 @CommandType(entity = "CHARGE", action = "CREATE")
 public class CreateChargeDefinitionCommandHandler implements 
NewCommandSourceHandler {
 
     private final ChargeWritePlatformService clientWritePlatformService;
 
-    @Autowired
-    public CreateChargeDefinitionCommandHandler(final 
ChargeWritePlatformService clientWritePlatformService) {
-        this.clientWritePlatformService = clientWritePlatformService;
-    }
-
     @Transactional
     @Override
     public CommandProcessingResult processCommand(final JsonCommand command) {
-
         return this.clientWritePlatformService.createCharge(command);
     }
 }
diff --git 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/DeleteChargeDefinitionCommandHandler.java
 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/DeleteChargeDefinitionCommandHandler.java
index 448194757c..e97fb278a3 100644
--- 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/DeleteChargeDefinitionCommandHandler.java
+++ 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/DeleteChargeDefinitionCommandHandler.java
@@ -18,30 +18,25 @@
  */
 package org.apache.fineract.portfolio.charge.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.portfolio.charge.service.ChargeWritePlatformService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+@RequiredArgsConstructor
 @Service
 @CommandType(entity = "CHARGE", action = "DELETE")
 public class DeleteChargeDefinitionCommandHandler implements 
NewCommandSourceHandler {
 
     private final ChargeWritePlatformService clientWritePlatformService;
 
-    @Autowired
-    public DeleteChargeDefinitionCommandHandler(final 
ChargeWritePlatformService clientWritePlatformService) {
-        this.clientWritePlatformService = clientWritePlatformService;
-    }
-
     @Transactional
     @Override
     public CommandProcessingResult processCommand(final JsonCommand command) {
-
         return 
this.clientWritePlatformService.deleteCharge(command.entityId());
     }
 }
diff --git 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/UpdateChargeDefinitionCommandHandler.java
 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/UpdateChargeDefinitionCommandHandler.java
index a9d650fce6..537255b9e9 100644
--- 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/UpdateChargeDefinitionCommandHandler.java
+++ 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/handler/UpdateChargeDefinitionCommandHandler.java
@@ -18,30 +18,25 @@
  */
 package org.apache.fineract.portfolio.charge.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.portfolio.charge.service.ChargeWritePlatformService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+@RequiredArgsConstructor
 @Service
 @CommandType(entity = "CHARGE", action = "UPDATE")
 public class UpdateChargeDefinitionCommandHandler implements 
NewCommandSourceHandler {
 
     private final ChargeWritePlatformService clientWritePlatformService;
 
-    @Autowired
-    public UpdateChargeDefinitionCommandHandler(final 
ChargeWritePlatformService clientWritePlatformService) {
-        this.clientWritePlatformService = clientWritePlatformService;
-    }
-
     @Transactional
     @Override
     public CommandProcessingResult processCommand(final JsonCommand command) {
-
         return 
this.clientWritePlatformService.updateCharge(command.entityId(), command);
     }
 }
diff --git 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/request/ChargeRequest.java
 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/request/ChargeRequest.java
index d4002823a8..2fde7d37e1 100644
--- 
a/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/request/ChargeRequest.java
+++ 
b/fineract-charge/src/main/java/org/apache/fineract/portfolio/charge/request/ChargeRequest.java
@@ -51,5 +51,6 @@ public class ChargeRequest implements Serializable {
     private Boolean enablePaymentType;
     private BigDecimal minCap;
     private BigDecimal maxCap;
+    private Long taxGroupId;
 
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ChargesTest.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ChargesTest.java
index a84e0231dd..a31f340326 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ChargesTest.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ChargesTest.java
@@ -27,9 +27,18 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 import org.apache.fineract.client.models.ChargeRequest;
 import org.apache.fineract.client.models.GetChargesResponse;
 import org.apache.fineract.client.models.PostChargesResponse;
+import org.apache.fineract.client.models.PostTaxesComponentsRequest;
+import org.apache.fineract.client.models.PostTaxesComponentsResponse;
+import org.apache.fineract.client.models.PostTaxesGroupRequest;
+import org.apache.fineract.client.models.PostTaxesGroupResponse;
+import org.apache.fineract.client.models.PostTaxesGroupTaxComponents;
+import org.apache.fineract.integrationtests.common.TaxComponentHelper;
+import org.apache.fineract.integrationtests.common.TaxGroupHelper;
 import org.apache.fineract.integrationtests.common.Utils;
 import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
 import org.apache.fineract.portfolio.charge.domain.ChargeCalculationType;
@@ -352,4 +361,39 @@ public class ChargesTest {
         Assertions.assertEquals(maxCapVal.stripTrailingZeros(), 
chargeResponseData.getMaxCap().stripTrailingZeros());
     }
 
+    @Test
+    public void testChargeCreationWithTaxGroup() {
+        final ChargesHelper chargesHelper = new ChargesHelper();
+
+        final PostTaxesComponentsRequest taxComponentRequest = new 
PostTaxesComponentsRequest()
+                .name(Utils.randomStringGenerator("TAX_COM_", 
4)).percentage(12.0f).startDate("01 January 2023").dateFormat("dd MMMM yyyy")
+                .locale("en");
+
+        final PostTaxesComponentsResponse taxComponentRespose = 
TaxComponentHelper.createTaxComponent(taxComponentRequest);
+        Assertions.assertNotNull(taxComponentRequest);
+
+        final Set<PostTaxesGroupTaxComponents> taxComponentsSet = new 
HashSet<>();
+        taxComponentsSet
+                .add(new 
PostTaxesGroupTaxComponents().taxComponentId(taxComponentRespose.getResourceId()).startDate("01
 January 2023"));
+        final PostTaxesGroupRequest taxGroupRequest = new 
PostTaxesGroupRequest().name(Utils.randomStringGenerator("TAX_GRP_", 4))
+                .taxComponents(taxComponentsSet).dateFormat("dd MMMM 
yyyy").locale("en");
+        final PostTaxesGroupResponse taxGroupResponse = 
TaxGroupHelper.createTaxGroup(taxGroupRequest);
+        Assertions.assertNotNull(taxGroupResponse);
+
+        final PostChargesResponse feeCharge = chargesHelper.createCharges(
+                new 
ChargeRequest().penalty(false).amount(9.0).chargeCalculationType(ChargeCalculationType.PERCENT_OF_AMOUNT.getValue())
+                        
.chargeTimeType(ChargeTimeType.DISBURSEMENT.getValue()).chargePaymentMode(ChargePaymentMode.REGULAR.getValue())
+                        
.currencyCode("USD").name(Utils.randomStringGenerator("FEE_" + 
Calendar.getInstance().getTimeInMillis(), 5))
+                        
.chargeAppliesTo(1).locale("en").active(true).taxGroupId(taxGroupResponse.getResourceId()));
+
+        Assertions.assertNotNull(feeCharge);
+        final Long chargeId = feeCharge.getResourceId();
+        Assertions.assertNotNull(chargeId);
+
+        final GetChargesResponse chargeResponseData = 
chargesHelper.retrieveCharge(chargeId);
+        Assertions.assertNotNull(chargeResponseData);
+        Assertions.assertNotNull(chargeResponseData.getTaxGroup());
+        Assertions.assertEquals(chargeResponseData.getTaxGroup().getId(), 
taxGroupResponse.getResourceId());
+    }
+
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxComponentHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxComponentHelper.java
index 889af4a889..3a363e0d24 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxComponentHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxComponentHelper.java
@@ -22,6 +22,9 @@ import com.google.gson.Gson;
 import io.restassured.specification.RequestSpecification;
 import io.restassured.specification.ResponseSpecification;
 import java.util.HashMap;
+import org.apache.fineract.client.models.PostTaxesComponentsRequest;
+import org.apache.fineract.client.models.PostTaxesComponentsResponse;
+import org.apache.fineract.client.util.Calls;
 import org.apache.fineract.integrationtests.common.accounting.Account;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,7 +69,7 @@ public final class TaxComponentHelper {
     @Deprecated(forRemoval = true)
     public static HashMap<String, String> getBasicTaxComponentMap(final String 
percentage) {
         final HashMap<String, String> map = new HashMap<>();
-        map.put("name", randomNameGenerator("Tax_component_Name_", 5));
+        map.put("name", Utils.randomStringGenerator("Tax_component_Name_", 5));
         map.put("dateFormat", "dd MMMM yyyy");
         map.put("locale", "en");
         map.put("percentage", percentage);
@@ -74,8 +77,8 @@ public final class TaxComponentHelper {
         return map;
     }
 
-    public static String randomNameGenerator(final String prefix, final int 
lenOfRandomSuffix) {
-        return Utils.randomStringGenerator(prefix, lenOfRandomSuffix);
+    public static PostTaxesComponentsResponse 
createTaxComponent(PostTaxesComponentsRequest request) {
+        return 
Calls.ok(FineractClientHelper.getFineractClient().taxComponents.createTaxComponent(request));
     }
 
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxGroupHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxGroupHelper.java
index 6bf2ee3134..c1c38fe592 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxGroupHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/TaxGroupHelper.java
@@ -25,6 +25,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
+import org.apache.fineract.client.models.PostTaxesGroupRequest;
+import org.apache.fineract.client.models.PostTaxesGroupResponse;
+import org.apache.fineract.client.util.Calls;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,7 +57,7 @@ public final class TaxGroupHelper {
     @Deprecated(forRemoval = true)
     public static String getTaxGroupAsJSON(final Collection<Integer> 
taxComponentIds) {
         final HashMap<String, Object> map = new HashMap<>();
-        map.put("name", randomNameGenerator("Tax_component_Name_", 5));
+        map.put("name", Utils.randomStringGenerator("Tax_group_Name_", 5));
         map.put("dateFormat", "dd MMMM yyyy");
         map.put("locale", "en");
         map.put("taxComponents", getTaxGroupComponents(taxComponentIds));
@@ -84,8 +87,8 @@ public final class TaxGroupHelper {
         return map;
     }
 
-    public static String randomNameGenerator(final String prefix, final int 
lenOfRandomSuffix) {
-        return Utils.randomStringGenerator(prefix, lenOfRandomSuffix);
+    public static PostTaxesGroupResponse createTaxGroup(PostTaxesGroupRequest 
request) {
+        return 
Calls.ok(FineractClientHelper.getFineractClient().taxGroups.createTaxGroup(request));
     }
 
 }
diff --git 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java
 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java
index dd4a680a39..4f052b429e 100644
--- 
a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java
+++ 
b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/charges/ChargesHelper.java
@@ -65,10 +65,6 @@ public final class ChargesHelper {
     public static final Integer SHARE_PURCHASE = 14;
     public static final Integer SHARE_REDEEM = 15;
 
-    private static final Integer CHARGE_SAVINGS_NO_ACTIVITY_FEE = 16;
-
-    private static final Integer CHARGE_CLIENT_SPECIFIED_DUE_DATE = 1;
-
     public static final Integer CHARGE_CALCULATION_TYPE_FLAT = 1;
     public static final Integer CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT = 2;
     public static final Integer 
CHARGE_CALCULATION_TYPE_PERCENTAGE_AMOUNT_AND_INTEREST = 3;

Reply via email to