diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java index bf18b74a7..a2a5cb7ac 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/api/BulkImportApiResource.java @@ -73,7 +73,7 @@ public class BulkImportApiResource { this.context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSION); Collection importData = new ArrayList<>(); if (entityType.equals(GlobalEntityType.CLIENT.getCode())) { - final Collection importForClientEntity = this.bulkImportWorkbookService.getImports(GlobalEntityType.CLIENTS_ENTTTY); + final Collection importForClientEntity = this.bulkImportWorkbookService.getImports(GlobalEntityType.CLIENTS_ENTITY); final Collection importForClientPerson = this.bulkImportWorkbookService.getImports(GlobalEntityType.CLIENTS_PERSON); if (importForClientEntity != null) { importData.addAll(importForClientEntity); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java index cab690cac..6f2fa8fbc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/data/GlobalEntityType.java @@ -23,7 +23,7 @@ import java.util.Map; public enum GlobalEntityType { - INVALID(0, "invalid"), CLIENTS_PERSON(1, "clients.person"), CLIENTS_ENTTTY(2, "clients.entity"), GROUPS(3, "groups"), CENTERS(4, + INVALID(0, "invalid"), CLIENTS_PERSON(1, "clients.person"), CLIENTS_ENTITY(2, "clients.entity"), GROUPS(3, "groups"), CENTERS(4, "centers"), OFFICES(5, "offices"), STAFF(6, "staff"), USERS(7, "users"), SMS(8, "sms"), DOCUMENTS(9, "documents"), TEMPLATES(10, "templates"), NOTES(11, "templates"), CALENDAR(12, "calendar"), MEETINGS(13, "meetings"), HOLIDAYS(14, "holidays"), LOANS(15, "loans"), LOAN_PRODUCTS(16, "loancharges"), LOAN_TRANSACTIONS(18, diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java index 595834b13..a82b7fedf 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportEventListener.java @@ -80,7 +80,7 @@ public class BulkImportEventListener implements ApplicationListener constitutionCodeValues = fetchCodeValuesByCodeName("Constitution"); List mainBusinessline = fetchCodeValuesByCodeName("Main Business Line"); return new ClientEntityWorkbookPopulator(new OfficeSheetPopulator(offices), new PersonnelSheetPopulator(staff, offices), diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java index 26af6968d..5e4bdda42 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/bulkimport/service/BulkImportWorkbookServiceImpl.java @@ -110,8 +110,8 @@ public class BulkImportWorkbookServiceImpl implements BulkImportWorkbookService if (entity.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_PERSON.toString())) { entityType = GlobalEntityType.CLIENTS_PERSON; primaryColumn = 0; - } else if (entity.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_ENTTTY.toString())) { - entityType = GlobalEntityType.CLIENTS_ENTTTY; + } else if (entity.trim().equalsIgnoreCase(GlobalEntityType.CLIENTS_ENTITY.toString())) { + entityType = GlobalEntityType.CLIENTS_ENTITY; primaryColumn = 0; } else if (entity.trim().equalsIgnoreCase(GlobalEntityType.CENTERS.toString())) { entityType = GlobalEntityType.CENTERS; diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java index 0c973fd45..85aa01359 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java @@ -38,6 +38,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; +import lombok.AllArgsConstructor; import org.apache.fineract.commands.domain.CommandWrapper; import org.apache.fineract.commands.service.CommandWrapperBuilder; import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; @@ -50,37 +51,19 @@ import org.apache.fineract.infrastructure.dataqueries.data.EntityDataTableChecks import org.apache.fineract.infrastructure.dataqueries.data.EntityDataTableChecksTemplateData; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; import org.apache.fineract.infrastructure.dataqueries.service.EntityDatatableChecksReadService; -import org.apache.fineract.infrastructure.dataqueries.service.GenericDataService; -import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Path("/entityDatatableChecks") +@AllArgsConstructor @Component @Scope("singleton") @Tag(name = "Entity Data Table", description = "This defines Entity-Datatable Check.") public class EntityDatatableChecksApiResource { - private final PlatformSecurityContext context; - private final GenericDataService genericDataService; private final EntityDatatableChecksReadService readEntityDatatableChecksService; private final ToApiJsonSerializer toApiJsonSerializer; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(EntityDatatableChecksApiResource.class); - - @Autowired - public EntityDatatableChecksApiResource(final PlatformSecurityContext context, final GenericDataService genericDataService, - final EntityDatatableChecksReadService readEntityDatatableChecksService, - final ToApiJsonSerializer toApiJsonSerializer, - final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { - this.context = context; - this.genericDataService = genericDataService; - this.readEntityDatatableChecksService = readEntityDatatableChecksService; - this.toApiJsonSerializer = toApiJsonSerializer; - this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; - } @GET @Consumes({ MediaType.APPLICATION_JSON }) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecks.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecks.java index 84ef4eaf6..4d661555e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecks.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecks.java @@ -21,12 +21,17 @@ package org.apache.fineract.infrastructure.dataqueries.domain; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; +@AllArgsConstructor +@NoArgsConstructor +@Getter @Entity @Table(name = "m_entity_datatable_check") - public class EntityDatatableChecks extends AbstractPersistableCustom { @Column(name = "application_table_name", nullable = false) @@ -44,18 +49,6 @@ public class EntityDatatableChecks extends AbstractPersistableCustom { @Column(name = "product_id", nullable = true) private Long productId; - public EntityDatatableChecks() {} - - public EntityDatatableChecks(final String entity, final String datatableName, final Long status, final boolean systemDefined, - final Long productId) { - - this.entity = entity; - this.status = status; - this.datatableName = datatableName; - this.systemDefined = systemDefined; - this.productId = productId; - } - public static EntityDatatableChecks fromJson(final JsonCommand command) { final String entity = command.stringValueOfParameterNamed("entity"); @@ -78,23 +71,8 @@ public class EntityDatatableChecks extends AbstractPersistableCustom { } - public String getEntity() { - return this.entity; - } - - public Long getStatus() { - return this.status; - } - - public String getDatatableName() { - return this.datatableName; - } - public boolean isSystemDefined() { return this.systemDefined; } - public Long getProductId() { - return productId; - } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecksRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecksRepository.java index 5b08ae304..fa92b24bd 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecksRepository.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/EntityDatatableChecksRepository.java @@ -27,7 +27,17 @@ import org.springframework.data.repository.query.Param; public interface EntityDatatableChecksRepository extends JpaRepository, JpaSpecificationExecutor { - List findByEntityAndStatus(String entityName, Long status); + List findByEntityAndStatus(String entityName, Integer status); + + @Query(""" + SELECT dt + FROM EntityDatatableChecks dt + INNER JOIN RegisteredDatatable rdt ON rdt.datatableName = dt.datatableName + WHERE dt.entity = :entity + AND dt.status = :status + AND rdt.subtype = :subtype + """) + List findByEntityAndStatusAndSubtype(String entity, Integer status, String subtype); @Query("select t from EntityDatatableChecks t WHERE t.status =:status and t.entity=:entity and t.productId = :productId ") List findByEntityStatusAndProduct(@Param("entity") String entity, @Param("status") Long status, diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatable.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatable.java new file mode 100644 index 000000000..c29d593a6 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatable.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.dataqueries.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; + +@Getter +@Setter +@AllArgsConstructor +@Entity +@Table(name = "x_registered_table") +public class RegisteredDatatable extends AbstractPersistableCustom { + + @Column(name = "registered_table_name", nullable = false) + private String datatableName; + + @Column(name = "application_table_name", nullable = false) + private String entity; + + @Column(name = "entity_subtype", nullable = true) + private String subtype; + + @Column(name = "category", nullable = false) + private int category; + + public RegisteredDatatable() {} + +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatableRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatableRepository.java new file mode 100644 index 000000000..44d0a17f2 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/domain/RegisteredDatatableRepository.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.infrastructure.dataqueries.domain; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface RegisteredDatatableRepository + extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformService.java index 0bb309e42..def42a3b9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformService.java @@ -28,7 +28,7 @@ public interface EntityDatatableChecksWritePlatformService { CommandProcessingResult deleteCheck(Long entityDatatableCheckId); - void runTheCheck(Long entityId, String entityName, Long statusCode, String foreignKeyColumn); + void runTheCheck(Long entityId, String entityName, Integer statusCode, String foreignKeyColumn, String entitySubtype); void runTheCheckForProduct(Long entityId, String entityName, Long statusCode, String foreignKeyColumn, long productLoanId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java index 5e4e7c929..8ea58dcf5 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/EntityDatatableChecksWritePlatformServiceImpl.java @@ -24,6 +24,8 @@ import com.google.gson.JsonObject; import java.util.ArrayList; import java.util.List; import javax.persistence.PersistenceException; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService; import org.apache.fineract.infrastructure.core.api.JsonCommand; @@ -46,18 +48,15 @@ import org.apache.fineract.infrastructure.security.service.PlatformSecurityConte import org.apache.fineract.portfolio.loanproduct.service.LoanProductReadPlatformService; import org.apache.fineract.portfolio.savings.service.SavingsProductReadPlatformService; import org.apache.fineract.useradministration.domain.AppUser; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j +@AllArgsConstructor @Service public class EntityDatatableChecksWritePlatformServiceImpl implements EntityDatatableChecksWritePlatformService { - private static final Logger LOG = LoggerFactory.getLogger(EntityDatatableChecksWritePlatformServiceImpl.class); - private final PlatformSecurityContext context; private final EntityDatatableChecksDataValidator fromApiJsonDeserializer; private final EntityDatatableChecksRepository entityDatatableChecksRepository; @@ -67,24 +66,6 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData private final FromJsonHelper fromApiJsonHelper; private final ConfigurationDomainService configurationDomainService; - @Autowired - public EntityDatatableChecksWritePlatformServiceImpl(final PlatformSecurityContext context, - final EntityDatatableChecksDataValidator fromApiJsonDeserializer, - final EntityDatatableChecksRepository entityDatatableChecksRepository, - final ReadWriteNonCoreDataService readWriteNonCoreDataService, - final LoanProductReadPlatformService loanProductReadPlatformService, - final SavingsProductReadPlatformService savingsProductReadPlatformService, final FromJsonHelper fromApiJsonHelper, - final ConfigurationDomainService configurationDomainService) { - this.context = context; - this.fromApiJsonDeserializer = fromApiJsonDeserializer; - this.entityDatatableChecksRepository = entityDatatableChecksRepository; - this.readWriteNonCoreDataService = readWriteNonCoreDataService; - this.loanProductReadPlatformService = loanProductReadPlatformService; - this.savingsProductReadPlatformService = savingsProductReadPlatformService; - this.fromApiJsonHelper = fromApiJsonHelper; - this.configurationDomainService = configurationDomainService; - } - @Transactional @Override public CommandProcessingResult createCheck(final JsonCommand command) { @@ -107,7 +88,7 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData final String foreignKeyColumnName = EntityTables.getForeignKeyColumnNameOnDatatable(entity); final boolean columnExist = datatableData.hasColumn(foreignKeyColumnName); - LOG.debug("{} has column {} ? {}", datatableData.getRegisteredTableName(), foreignKeyColumnName, columnExist); + log.debug("{} has column {} ? {}", datatableData.getRegisteredTableName(), foreignKeyColumnName, columnExist); if (!columnExist) { throw new EntityDatatableCheckNotSupportedException(datatableData.getRegisteredTableName(), entity); @@ -159,9 +140,15 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData } @Override - public void runTheCheck(final Long entityId, final String entityName, final Long statusCode, String foreignKeyColumn) { - final List tableRequiredBeforeClientActivation = entityDatatableChecksRepository - .findByEntityAndStatus(entityName, statusCode); + public void runTheCheck(final Long entityId, final String entityName, final Integer statusCode, String foreignKeyColumn, + final String entitySubtype) { + List tableRequiredBeforeClientActivation; + if (entitySubtype == null) { + tableRequiredBeforeClientActivation = entityDatatableChecksRepository.findByEntityAndStatus(entityName, statusCode); + } else { + tableRequiredBeforeClientActivation = entityDatatableChecksRepository.findByEntityAndStatusAndSubtype(entityName, statusCode, + entitySubtype.toUpperCase()); + } if (tableRequiredBeforeClientActivation != null) { List reqDatatables = new ArrayList<>(); @@ -170,7 +157,7 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData final String datatableName = t.getDatatableName(); final Long countEntries = readWriteNonCoreDataService.countDatatableEntries(datatableName, entityId, foreignKeyColumn); - LOG.debug("The are {} entries in the table {}", countEntries, datatableName); + log.debug("The are {} entries in the table {}", countEntries, datatableName); if (countEntries.intValue() == 0) { reqDatatables.add(datatableName); } @@ -199,7 +186,7 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData final String datatableName = t.getDatatableName(); final Long countEntries = readWriteNonCoreDataService.countDatatableEntries(datatableName, entityId, foreignKeyColumn); - LOG.debug("The are {} entries in the table {}", countEntries, datatableName); + log.debug("The are {} entries in the table {}", countEntries, datatableName); if (countEntries.intValue() == 0) { reqDatatables.add(datatableName); } @@ -281,7 +268,7 @@ public class EntityDatatableChecksWritePlatformServiceImpl implements EntityData throw new EntityDatatableCheckAlreadyExistsException(entity, status, datatableName, productId); } - LOG.error("Error occured.", dae); + log.error("Error occured.", dae); throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java index da4cabcff..0a40087b4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/service/TellerManagementReadPlatformServiceImpl.java @@ -66,7 +66,6 @@ public class TellerManagementReadPlatformServiceImpl implements TellerManagement private final JdbcTemplate jdbcTemplate; private final PlatformSecurityContext context; private final TellerLookupMapper lookupMapper = new TellerLookupMapper(); - private final TellerInOfficeHierarchyMapper tellerInOfficeHierarchyMapper = new TellerInOfficeHierarchyMapper(); private final OfficeReadPlatformService officeReadPlatformService; private final StaffReadPlatformService staffReadPlatformService; private final CurrencyReadPlatformService currencyReadPlatformService; @@ -113,33 +112,6 @@ public class TellerManagementReadPlatformServiceImpl implements TellerManagement } } - private static final class TellerInOfficeHierarchyMapper implements RowMapper { - - @Override - public TellerData mapRow(final ResultSet rs, final int rowNum) throws SQLException { - - final Long id = rs.getLong("id"); - final String tellerName = rs.getString("teller_name"); - final String description = rs.getString("description"); - final String officeName = rs.getString("office_name"); - final Long officeId = rs.getLong("office_id"); - TellerStatus tellerStatus = null; - final Integer status = rs.getInt("status"); - if (status != null) { - tellerStatus = TellerStatus.fromInt(status); - } - final Long debitAccountId = rs.getLong("debit_account_id"); - final Long creditAccountId = rs.getLong("credit_account_id"); - - final LocalDate startDate = JdbcSupport.getLocalDate(rs, "start_date"); - final LocalDate endDate = JdbcSupport.getLocalDate(rs, "end_date"); - - return TellerData.instance(id, officeId, debitAccountId, creditAccountId, tellerName, description, startDate, endDate, - tellerStatus, officeName, null, null); - - } - } - private static final class TellerLookupMapper implements RowMapper { private final String schemaSql; @@ -378,8 +350,6 @@ public class TellerManagementReadPlatformServiceImpl implements TellerManagement tellerName = tellerData.getName(); } - final Collection offices = this.officeReadPlatformService.retrieveAllOfficesForDropdown(); - Collection staffOptions = null; final boolean loanOfficersOnly = false; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java index bd29d5741..3415ec9da 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/LegalForm.java @@ -18,29 +18,26 @@ */ package org.apache.fineract.portfolio.client.domain; +import lombok.Getter; + /** * Type used to differentiate the type of client */ +@Getter public enum LegalForm { - PERSON(1, "legalFormType.person"), + PERSON(1, "legalFormType.person", "Person"), - ENTITY(2, "legalFormType.entity"); + ENTITY(2, "legalFormType.entity", "Entity"); private final Integer value; private final String code; + private final String label; - LegalForm(final Integer value, final String code) { + LegalForm(final Integer value, final String code, final String label) { this.value = value; this.code = code; - } - - public Integer getValue() { - return this.value; - } - - public String getCode() { - return this.code; + this.label = label; } public static LegalForm fromInt(final Integer type) { @@ -64,4 +61,9 @@ public enum LegalForm { public boolean isEntity() { return this.value.equals(LegalForm.ENTITY.getValue()); } + + @Override + public String toString() { + return this.label; + } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java index e7e7740fe..6268e9e74 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientWritePlatformServiceJpaRepositoryImpl.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import javax.persistence.PersistenceException; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.fineract.commands.domain.CommandWrapper; @@ -86,12 +87,12 @@ import org.apache.fineract.portfolio.savings.domain.SavingsProductRepository; import org.apache.fineract.portfolio.savings.exception.SavingsProductNotFoundException; import org.apache.fineract.portfolio.savings.service.SavingsApplicationProcessWritePlatformService; import org.apache.fineract.useradministration.domain.AppUser; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.orm.jpa.JpaSystemException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@AllArgsConstructor @Service @Slf4j public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWritePlatformService { @@ -120,47 +121,6 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP private final BusinessEventNotifierService businessEventNotifierService; private final EntityDatatableChecksWritePlatformService entityDatatableChecksWritePlatformService; - @Autowired - public ClientWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, - final ClientRepositoryWrapper clientRepository, final ClientNonPersonRepositoryWrapper clientNonPersonRepository, - final OfficeRepositoryWrapper officeRepositoryWrapper, final NoteRepository noteRepository, - final ClientDataValidator fromApiJsonDeserializer, final AccountNumberGenerator accountNumberGenerator, - final GroupRepository groupRepository, final StaffRepositoryWrapper staffRepository, - final CodeValueRepositoryWrapper codeValueRepository, final LoanRepositoryWrapper loanRepositoryWrapper, - final SavingsAccountRepositoryWrapper savingsRepositoryWrapper, final SavingsProductRepository savingsProductRepository, - final SavingsApplicationProcessWritePlatformService savingsApplicationProcessWritePlatformService, - final CommandProcessingService commandProcessingService, final ConfigurationDomainService configurationDomainService, - final AccountNumberFormatRepositoryWrapper accountNumberFormatRepository, final FromJsonHelper fromApiJsonHelper, - final ConfigurationReadPlatformService configurationReadPlatformService, - final AddressWritePlatformService addressWritePlatformService, - final ClientFamilyMembersWritePlatformService clientFamilyMembersWritePlatformService, - final BusinessEventNotifierService businessEventNotifierService, - final EntityDatatableChecksWritePlatformService entityDatatableChecksWritePlatformService) { - this.context = context; - this.clientRepository = clientRepository; - this.clientNonPersonRepository = clientNonPersonRepository; - this.officeRepositoryWrapper = officeRepositoryWrapper; - this.noteRepository = noteRepository; - this.fromApiJsonDeserializer = fromApiJsonDeserializer; - this.accountNumberGenerator = accountNumberGenerator; - this.groupRepository = groupRepository; - this.staffRepository = staffRepository; - this.codeValueRepository = codeValueRepository; - this.loanRepositoryWrapper = loanRepositoryWrapper; - this.savingsRepositoryWrapper = savingsRepositoryWrapper; - this.savingsProductRepository = savingsProductRepository; - this.savingsApplicationProcessWritePlatformService = savingsApplicationProcessWritePlatformService; - this.commandProcessingService = commandProcessingService; - this.configurationDomainService = configurationDomainService; - this.accountNumberFormatRepository = accountNumberFormatRepository; - this.fromApiJsonHelper = fromApiJsonHelper; - this.configurationReadPlatformService = configurationReadPlatformService; - this.addressWritePlatformService = addressWritePlatformService; - this.clientFamilyMembersWritePlatformService = clientFamilyMembersWritePlatformService; - this.businessEventNotifierService = businessEventNotifierService; - this.entityDatatableChecksWritePlatformService = entityDatatableChecksWritePlatformService; - } - @Transactional @Override public CommandProcessingResult deleteClient(final Long clientId) { @@ -232,8 +192,6 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final Boolean isAddressEnabled = configuration.isEnabled(); - final Boolean isStaff = command.booleanObjectValueOfParameterNamed(ClientApiConstants.isStaffParamName); - final Long officeId = command.longValueOfParameterNamed(ClientApiConstants.officeIdParamName); final Office clientOffice = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId); @@ -280,8 +238,9 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final Integer legalFormParamValue = command.integerValueOfParameterNamed(ClientApiConstants.legalFormIdParamName); boolean isEntity = false; Integer legalFormValue = null; + LegalForm legalForm = LegalForm.PERSON; if (legalFormParamValue != null) { - LegalForm legalForm = LegalForm.fromInt(legalFormParamValue); + legalForm = LegalForm.fromInt(legalFormParamValue); if (legalForm != null) { legalFormValue = legalForm.getValue(); isEntity = legalForm.isEntity(); @@ -294,7 +253,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP boolean rollbackTransaction = false; if (newClient.isActive()) { validateParentGroupRulesBeforeClientActivation(newClient); - runEntityDatatableCheck(newClient.getId()); + runEntityDatatableCheck(newClient.getId(), newClient.getLegalForm()); final CommandWrapper commandWrapper = new CommandWrapperBuilder().activateClient(null).build(); rollbackTransaction = this.commandProcessingService.validateCommand(commandWrapper, currentUser); } @@ -332,8 +291,9 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP command.arrayOfParameterNamed(ClientApiConstants.datatables)); } + legalForm = LegalForm.fromInt(newClient.getLegalForm()); entityDatatableChecksWritePlatformService.runTheCheck(newClient.getId(), EntityTables.CLIENT.getName(), - StatusEnum.CREATE.getCode().longValue(), EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable()); + StatusEnum.CREATE.getCode(), EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable(), legalForm.getLabel()); businessEventNotifierService.notifyPostBusinessEvent(new ClientCreateBusinessEvent(newClient)); if (newClient.isActive()) { businessEventNotifierService.notifyPostBusinessEvent(new ClientActivateBusinessEvent(newClient)); @@ -582,7 +542,7 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP final DateTimeFormatter fmt = DateTimeFormatter.ofPattern(command.dateFormat()).withLocale(locale); final LocalDate activationDate = command.localDateValueOfParameterNamed("activationDate"); - runEntityDatatableCheck(clientId); + runEntityDatatableCheck(clientId, client.getLegalForm()); final AppUser currentUser = this.context.authenticatedUser(); client.activate(currentUser, fmt, activationDate); @@ -718,8 +678,9 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP throw new InvalidClientStateTransitionException("close", "date.cannot.before.client.actvation.date", errorMessage, closureDate, client.getActivationLocalDate()); } - entityDatatableChecksWritePlatformService.runTheCheck(clientId, EntityTables.CLIENT.getName(), - StatusEnum.CLOSE.getCode().longValue(), EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable()); + final LegalForm legalForm = LegalForm.fromInt(client.getLegalForm()); + entityDatatableChecksWritePlatformService.runTheCheck(clientId, EntityTables.CLIENT.getName(), StatusEnum.CLOSE.getCode(), + EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable(), legalForm.getLabel()); final List clientLoans = this.loanRepositoryWrapper.findLoanByClientId(clientId); for (final Loan loan : clientLoans) { @@ -813,9 +774,10 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP } } - private void runEntityDatatableCheck(final Long clientId) { - entityDatatableChecksWritePlatformService.runTheCheck(clientId, EntityTables.CLIENT.getName(), - StatusEnum.ACTIVATE.getCode().longValue(), EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable()); + private void runEntityDatatableCheck(final Long clientId, final Integer legalFormId) { + final LegalForm legalForm = LegalForm.fromInt(legalFormId); + entityDatatableChecksWritePlatformService.runTheCheck(clientId, EntityTables.CLIENT.getName(), StatusEnum.ACTIVATE.getCode(), + EntityTables.CLIENT.getForeignKeyColumnNameOnDatatable(), legalForm.getLabel()); } @Override diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/CenterReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/CenterReadPlatformServiceImpl.java index 5c459f828..d1119a457 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/CenterReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/CenterReadPlatformServiceImpl.java @@ -23,7 +23,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; import java.time.LocalTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -55,7 +54,6 @@ import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.fineract.organisation.staff.service.StaffReadPlatformService; import org.apache.fineract.portfolio.calendar.data.CalendarData; import org.apache.fineract.portfolio.calendar.service.CalendarEnumerations; -import org.apache.fineract.portfolio.calendar.service.CalendarReadPlatformService; import org.apache.fineract.portfolio.calendar.service.CalendarUtils; import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.domain.ClientEnumerations; @@ -86,8 +84,6 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService private final StaffReadPlatformService staffReadPlatformService; private final CodeValueReadPlatformService codeValueReadPlatformService; private final ConfigurationDomainService configurationDomainService; - private final CalendarReadPlatformService calendarReadPlatformService; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final ColumnValidator columnValidator; // data mappers diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java index b72e69d3c..c90bf1898 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/service/GroupingTypesWritePlatformServiceJpaRepositoryImpl.java @@ -207,7 +207,7 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group } this.entityDatatableChecksWritePlatformService.runTheCheck(newGroup.getId(), EntityTables.GROUP.getName(), - StatusEnum.CREATE.getCode().longValue(), EntityTables.GROUP.getForeignKeyColumnNameOnDatatable()); + StatusEnum.CREATE.getCode(), EntityTables.GROUP.getForeignKeyColumnNameOnDatatable(), null); } return new CommandProcessingResultBuilder() // @@ -323,8 +323,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group if (!isGroupClientCountValid) { throw new GroupMemberCountNotInPermissibleRangeException(group.getId(), minClients, maxClients); } - entityDatatableChecksWritePlatformService.runTheCheck(group.getId(), EntityTables.GROUP.getName(), - StatusEnum.ACTIVATE.getCode().longValue(), EntityTables.GROUP.getForeignKeyColumnNameOnDatatable()); + entityDatatableChecksWritePlatformService.runTheCheck(group.getId(), EntityTables.GROUP.getName(), StatusEnum.ACTIVATE.getCode(), + EntityTables.GROUP.getForeignKeyColumnNameOnDatatable(), null); } public void validateGroupRulesBeforeClientAssociation(final Group group) { @@ -595,8 +595,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group validateLoansAndSavingsForGroupOrCenterClose(group, closureDate); - entityDatatableChecksWritePlatformService.runTheCheck(groupId, EntityTables.GROUP.getName(), StatusEnum.CLOSE.getCode().longValue(), - EntityTables.GROUP.getForeignKeyColumnNameOnDatatable()); + entityDatatableChecksWritePlatformService.runTheCheck(groupId, EntityTables.GROUP.getName(), StatusEnum.CLOSE.getCode(), + EntityTables.GROUP.getForeignKeyColumnNameOnDatatable(), null); group.close(currentUser, closureReason, closureDate); @@ -670,8 +670,8 @@ public class GroupingTypesWritePlatformServiceJpaRepositoryImpl implements Group validateLoansAndSavingsForGroupOrCenterClose(center, closureDate); - entityDatatableChecksWritePlatformService.runTheCheck(centerId, EntityTables.GROUP.getName(), - StatusEnum.ACTIVATE.getCode().longValue(), EntityTables.GROUP.getForeignKeyColumnNameOnDatatable()); + entityDatatableChecksWritePlatformService.runTheCheck(centerId, EntityTables.GROUP.getName(), StatusEnum.ACTIVATE.getCode(), + EntityTables.GROUP.getForeignKeyColumnNameOnDatatable(), null); center.close(currentUser, closureReason, closureDate); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java index 28f01a5b8..16753405a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/importhandler/client/ClientEntityImportHandlerTest.java @@ -97,7 +97,7 @@ public class ClientEntityImportHandlerTest { CodeHelper.retrieveOrCreateCodeValue(25, requestSpec, responseSpec); ClientHelper clientHelper = new ClientHelper(requestSpec, responseSpec); - Workbook workbook = clientHelper.getClientEntityWorkbook(GlobalEntityType.CLIENTS_ENTTTY, "dd MMMM yyyy"); + Workbook workbook = clientHelper.getClientEntityWorkbook(GlobalEntityType.CLIENTS_ENTITY, "dd MMMM yyyy"); // insert dummy data into client entity sheet Sheet clientEntitySheet = workbook.getSheet(TemplatePopulateImportConstants.CLIENT_ENTITY_SHEET_NAME); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/populator/client/ClientEntityWorkbookPopulatorTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/populator/client/ClientEntityWorkbookPopulatorTest.java index 1fe82f5ae..0a6cd1b07 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/populator/client/ClientEntityWorkbookPopulatorTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/bulkimport/populator/client/ClientEntityWorkbookPopulatorTest.java @@ -65,7 +65,7 @@ public class ClientEntityWorkbookPopulatorTest { Assertions.assertNotNull(outcome_office_creation, "Could not create office"); ClientHelper clientHelper = new ClientHelper(requestSpec, responseSpec); - Workbook workbook = clientHelper.getClientEntityWorkbook(GlobalEntityType.CLIENTS_ENTTTY, "dd MMMM yyyy"); + Workbook workbook = clientHelper.getClientEntityWorkbook(GlobalEntityType.CLIENTS_ENTITY, "dd MMMM yyyy"); Sheet officeSheet = workbook.getSheet(TemplatePopulateImportConstants.OFFICE_SHEET_NAME); Row firstOfficeRow = officeSheet.getRow(1); Assertions.assertNotNull(firstOfficeRow.getCell(1), "No offices found for given OfficeId "); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java index 7b696d733..00b51347a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ClientHelper.java @@ -29,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -156,6 +157,15 @@ public class ClientHelper extends IntegrationTest { "clientId"); } + public static PostClientsResponse createClientAsPersonWithDatatable(final RequestSpecification requestSpec, + final ResponseSpecification responseSpec, final String activationDate, final String officeId, + final HashMap datatables) { + log.info("---------------------------------CREATING A CLIENT PERSON WITH DATATABLE---------------------------------------------"); + final String response = Utils.performServerPost(requestSpec, responseSpec, CREATE_CLIENT_URL, + getTestPersonClientAsJSON(activationDate, officeId, datatables), null); + return GSON.fromJson(response, PostClientsResponse.class); + } + public static Integer createClientAsEntity(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) { return createClientAsEntity(requestSpec, responseSpec, "04 March 2011"); } @@ -281,6 +291,25 @@ public class ClientHelper extends IntegrationTest { return GSON.toJson(map); } + public static String getTestPersonClientAsJSON(final String dateOfJoining, final String officeId, + final HashMap datatables) { + final HashMap map = new HashMap<>(); + map.put("officeId", officeId); + map.put("fullname", Utils.randomNameGenerator("Client_FullName_", 5)); + map.put("externalId", randomIDGenerator("ID_", 7)); + map.put("dateFormat", Utils.DATE_FORMAT); + map.put("locale", "en"); + map.put("active", "true"); + map.put("activationDate", dateOfJoining); + map.put("legalFormId", 1); + if (datatables != null) { + map.put("datatables", Arrays.asList(datatables)); + } + + log.info("map : {}", map); + return GSON.toJson(map); + } + public static String getTestEntityClientAsJSON(final String dateOfJoining, final String officeId, final Integer soleProprietorCodeValueId) { final HashMap map = new HashMap<>(); @@ -665,7 +694,7 @@ public class ClientHelper extends IntegrationTest { public String importClientEntityTemplate(File file) { String locale = "en"; String dateFormat = "dd MMMM yyyy"; - String legalFormType = GlobalEntityType.CLIENTS_ENTTTY.toString(); + String legalFormType = GlobalEntityType.CLIENTS_ENTITY.toString(); requestSpec.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA); return Utils.performServerTemplatePost(requestSpec, responseSpec, CLIENT_URL + "/uploadtemplate" + "?" + Utils.TENANT_IDENTIFIER, legalFormType, file, locale, dateFormat); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java index 858d13db3..035e2cadf 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/Utils.java @@ -210,6 +210,7 @@ public final class Utils { public static T performServerPost(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, final String postURL, final String jsonBodyToSend, final String jsonAttributeToGetBack) { + LOG.info("JSON {}", jsonBodyToSend); final String json = given().spec(requestSpec).body(jsonBodyToSend).expect().spec(responseSpec).log().ifError().when().post(postURL) .andReturn().asString(); if (jsonAttributeToGetBack == null) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java index bce369f68..79ae47a22 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksHelper.java @@ -22,6 +22,8 @@ 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.PostEntityDatatableChecksTemplateResponse; +import org.apache.fineract.client.util.JSON; import org.apache.fineract.integrationtests.common.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,6 +36,8 @@ public class EntityDatatableChecksHelper { private static final String DATATABLE_CHECK_URL = "/fineract-provider/api/v1/entityDatatableChecks"; + private static final Gson GSON = new JSON().getGson(); + public EntityDatatableChecksHelper(final RequestSpecification requestSpec, final ResponseSpecification responseSpec) { this.requestSpec = requestSpec; this.responseSpec = responseSpec; @@ -45,6 +49,14 @@ public class EntityDatatableChecksHelper { getTestEdcAsJSON(apptableName, datatableName, status, productId), "resourceId"); } + public PostEntityDatatableChecksTemplateResponse addEntityDatatableCheck(final String apptableName, final String datatableName, + final int status, final Integer productId) { + final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, + DATATABLE_CHECK_URL + "?" + Utils.TENANT_IDENTIFIER, getTestEdcAsJSON(apptableName, datatableName, status, productId), + null); + return GSON.fromJson(response, PostEntityDatatableChecksTemplateResponse.class); + } + public Integer deleteEntityDatatableCheck(final Integer entityDatatableCheckId) { return Utils.performServerDelete(requestSpec, responseSpec, DATATABLE_CHECK_URL + "/" + entityDatatableCheckId + "?" + Utils.TENANT_IDENTIFIER, "resourceId"); diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java index 190416d34..d439c82f5 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/organisation/EntityDatatableChecksIntegrationTest.java @@ -21,6 +21,7 @@ package org.apache.fineract.integrationtests.common.organisation; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import com.google.gson.Gson; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; import io.restassured.http.ContentType; @@ -30,6 +31,8 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import org.apache.fineract.client.models.PostClientsResponse; +import org.apache.fineract.client.models.PostEntityDatatableChecksTemplateResponse; import org.apache.fineract.integrationtests.common.ClientHelper; import org.apache.fineract.integrationtests.common.CollateralManagementHelper; import org.apache.fineract.integrationtests.common.CommonConstants; @@ -549,4 +552,75 @@ public class EntityDatatableChecksIntegrationTest { datatablesListMap.add(datatableMap); return datatablesListMap; } + + @Test + public void createClientWithDatatableUsingEntitySubtype() { + // creating datatable for client entity person subentity + HashMap columnMap = new HashMap<>(); + final List> datatableColumnsList = new ArrayList<>(); + final String datatableNamePerson = Utils.randomNameGenerator(CLIENT_APP_TABLE_NAME + "_person_", 5).toLowerCase().toLowerCase(); + final String datatableNameEntity = Utils.randomNameGenerator(CLIENT_APP_TABLE_NAME + "_entity_", 5).toLowerCase().toLowerCase(); + + String itsAString = "itsastring"; + DatatableHelper.addDatatableColumns(datatableColumnsList, itsAString, "String", true, 10, null); + + // Person Subtype + columnMap.put("datatableName", datatableNamePerson); + columnMap.put("apptableName", CLIENT_APP_TABLE_NAME); + columnMap.put("entitySubType", "PERSON"); + columnMap.put("multiRow", false); + String dateFormat = "dateFormat"; + + columnMap.put("columns", datatableColumnsList); + String datatabelRequestJsonString = new Gson().toJson(columnMap); + LOG.info("map : {}", datatabelRequestJsonString); + + datatableHelper.createDatatable(datatabelRequestJsonString, ""); + + PostEntityDatatableChecksTemplateResponse entityDatatableChecksResponse = entityDatatableChecksHelper + .addEntityDatatableCheck(CLIENT_APP_TABLE_NAME, datatableNamePerson, 100, null); + assertNotNull(entityDatatableChecksResponse); + final Long personDatatableCheck = entityDatatableChecksResponse.getResourceId(); + LOG.info("entityDatatableChecksResponse Person: {}", entityDatatableChecksResponse.getResourceId()); + + // Entity Subtype + columnMap = new HashMap<>(); + columnMap.put("datatableName", datatableNameEntity); + columnMap.put("apptableName", CLIENT_APP_TABLE_NAME); + columnMap.put("entitySubType", "ENTITY"); + columnMap.put("multiRow", false); + + columnMap.put("columns", datatableColumnsList); + datatabelRequestJsonString = new Gson().toJson(columnMap); + LOG.info("map : {}", datatabelRequestJsonString); + + datatableHelper.createDatatable(datatabelRequestJsonString, ""); + + entityDatatableChecksResponse = entityDatatableChecksHelper.addEntityDatatableCheck(CLIENT_APP_TABLE_NAME, datatableNameEntity, 100, + null); + assertNotNull(entityDatatableChecksResponse); + final Long entityDatatableCheck = entityDatatableChecksResponse.getResourceId(); + LOG.info("entityDatatableChecksResponse Entity: {}", entityDatatableChecksResponse.getResourceId()); + + final HashMap datatableEntryMap = new HashMap<>(); + datatableEntryMap.put(itsAString, Utils.randomStringGenerator("", 8)); + datatableEntryMap.put("locale", "en"); + + final HashMap datatablesMap = new HashMap<>(); + datatablesMap.put("registeredTableName", datatableNamePerson); + datatablesMap.put("data", datatableEntryMap); + + String datatablesJsonString = new Gson().toJson(datatablesMap); + LOG.info("map : {}", datatablesJsonString); + + PostClientsResponse postClientsResponse = ClientHelper.createClientAsPersonWithDatatable(requestSpec, responseSpec, "04 March 2011", + "1", datatablesMap); + assertNotNull(postClientsResponse); + assertNotNull(postClientsResponse.getResourceId()); + + // Remove the Entity Datatable checks for others tests + entityDatatableChecksHelper.deleteEntityDatatableCheck(personDatatableCheck.intValue()); + entityDatatableChecksHelper.deleteEntityDatatableCheck(entityDatatableCheck.intValue()); + } + }