diff --git a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java index c499ecde6..ad216bdd8 100644 --- a/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java +++ b/fineract-core/src/main/java/org/apache/fineract/portfolio/client/domain/Client.java @@ -100,10 +100,10 @@ public class Client extends AbstractAuditableWithUTCDateTimeCustom { @Column(name = "lastname", length = 50) private String lastname; - @Column(name = "fullname", length = 100) + @Column(name = "fullname", length = 160) private String fullname; - @Column(name = "display_name", length = 100, nullable = false) + @Column(name = "display_name", length = 160, nullable = false) private String displayName; @Column(name = "mobile_no", length = 50, unique = true) @@ -493,32 +493,29 @@ public class Client extends AbstractAuditableWithUTCDateTimeCustom { } public void deriveDisplayName() { - - StringBuilder nameBuilder = new StringBuilder(); - Integer legalForm = this.getLegalForm(); - if (legalForm == null || LegalForm.fromInt(legalForm).isPerson()) { - if (StringUtils.isNotBlank(this.firstname)) { - nameBuilder.append(this.firstname).append(' '); - } - - if (StringUtils.isNotBlank(this.middlename)) { - nameBuilder.append(this.middlename).append(' '); - } - - if (StringUtils.isNotBlank(this.lastname)) { - nameBuilder.append(this.lastname); - } - - if (StringUtils.isNotBlank(this.fullname)) { - nameBuilder = new StringBuilder(this.fullname); - } - } else if (LegalForm.fromInt(legalForm).isEntity()) { - if (StringUtils.isNotBlank(this.fullname)) { - nameBuilder = new StringBuilder(this.fullname); + if (StringUtils.isNotBlank(this.fullname)) { + this.displayName = this.fullname; + } else { + StringBuilder nameBuilder = new StringBuilder(); + if (legalForm == null || LegalForm.fromInt(legalForm).isPerson()) { + if (StringUtils.isNotBlank(this.firstname)) { + nameBuilder.append(this.firstname); + } + if (StringUtils.isNotBlank(this.middlename)) { + if (!nameBuilder.isEmpty()) { + nameBuilder.append(' '); + } + nameBuilder.append(this.middlename); + } + if (StringUtils.isNotBlank(this.lastname)) { + if (!nameBuilder.isEmpty()) { + nameBuilder.append(' '); + } + nameBuilder.append(this.lastname); + } } + this.displayName = nameBuilder.toString(); } - - this.displayName = nameBuilder.toString(); } public LocalDate getActivationLocalDate() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java index 017837f40..7766ef070 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java @@ -304,6 +304,8 @@ final class ClientsApiResourceSwagger { public String fullname; @Schema(example = "Client_FirstName") public String firstname; + @Schema(example = "Client_MiddleName") + public String middlename; @Schema(example = "123") public String externalId; @Schema(example = "Client_LastName") diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java index bbbe4ee7e..f8a5b9274 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientDataValidator.java @@ -318,7 +318,7 @@ public final class ClientDataValidator { private void fullnameCannotBeBlank(final JsonElement element, final DataValidatorBuilder baseDataValidator) { final String fullnameParam = this.fromApiJsonHelper.extractStringNamed(ClientApiConstants.fullnameParamName, element); - baseDataValidator.reset().parameter(ClientApiConstants.fullnameParamName).value(fullnameParam).notBlank().notExceedingLengthOf(100); + baseDataValidator.reset().parameter(ClientApiConstants.fullnameParamName).value(fullnameParam).notBlank().notExceedingLengthOf(160); } private boolean isIndividualNamePartParameterPassed(final JsonElement element) { diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index 849dcb903..51f316ece 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -146,4 +146,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0127_client_name_length.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0127_client_name_length.xml new file mode 100644 index 000000000..c432f78d2 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0127_client_name_length.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java index e5ffeab2a..96ad52d64 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/ClientTest.java @@ -19,7 +19,11 @@ package org.apache.fineract.integrationtests; import static org.apache.fineract.integrationtests.client.IntegrationTest.assertThat; +import static org.apache.fineract.integrationtests.common.ClientHelper.DEFAULT_DATE; +import static org.apache.fineract.integrationtests.common.ClientHelper.LEGALFORM_ID_PERSON; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import io.restassured.builder.RequestSpecBuilder; @@ -30,8 +34,10 @@ import io.restassured.specification.ResponseSpecification; import java.security.SecureRandom; import java.util.HashMap; import java.util.List; +import java.util.UUID; import org.apache.commons.lang3.BooleanUtils; import org.apache.fineract.client.models.GetClientClientIdAddressesResponse; +import org.apache.fineract.client.models.GetClientsClientIdResponse; import org.apache.fineract.client.models.GlobalConfigurationPropertyData; import org.apache.fineract.client.models.PostClientClientIdAddressesRequest; import org.apache.fineract.client.models.PostClientClientIdAddressesResponse; @@ -263,4 +269,31 @@ public class ClientTest { assertThat(addressResponse.getPostalCode()).isEqualTo(postalCode); } + @Test + public void testClientName() { + String firstName = Utils.randomStringGenerator("FN", 48); + String middleName = Utils.randomStringGenerator("MN", 48); + String lastName = Utils.randomStringGenerator("LN", 48); + String fullName = firstName + ' ' + middleName + ' ' + lastName; + + PostClientsRequest request = new PostClientsRequest().officeId(1).legalFormId(LEGALFORM_ID_PERSON).firstname(firstName) + .middlename(middleName).lastname(lastName).externalId(UUID.randomUUID().toString()).dateFormat(Utils.DATE_FORMAT) + .locale("en").active(true).activationDate(DEFAULT_DATE); + Integer clientId = ClientHelper.createClient(requestSpec, responseSpec, request); + assertNotNull(clientId); + + GetClientsClientIdResponse client = ClientHelper.getClient(requestSpec, responseSpec, clientId); + assertNotNull(client); + assertEquals(fullName, client.getDisplayName()); + + request = new PostClientsRequest().officeId(1).legalFormId(LEGALFORM_ID_PERSON).fullname(fullName) + .externalId(UUID.randomUUID().toString()).dateFormat(Utils.DATE_FORMAT).locale("en").active(true) + .activationDate(DEFAULT_DATE); + clientId = ClientHelper.createClient(requestSpec, responseSpec, request); + assertNotNull(clientId); + + client = ClientHelper.getClient(requestSpec, responseSpec, clientId); + assertNotNull(client); + assertEquals(fullName, client.getDisplayName()); + } }