- Hide Family Members tab/section for non-individual entities in client view, create flow, and preview - Hide Financial & Classification section for non-individual entities in personal data and preview - Fix legal form column in clients list — fetch legalForm from client API for correct display - Add person/business icon before client name in list rows - Remove unsupportedNpd filter — send authorizedSignatory, additionalInfo, dateOfRegistration to API - Add registration number format hint (mat-hint) based on constitution type - Add spacing between verification row and constitution type dropdowns - Reduce table cell padding and prevent action buttons from being clipped - Add missing MPL-2.0 license headers Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
174 lines
7.5 KiB
Java
174 lines
7.5 KiB
Java
/**
|
|
* CBS Nexora — Entity KYC Domain Object
|
|
* Package: org.apache.fineract.portfolio.client.domain
|
|
*/
|
|
package org.apache.fineract.portfolio.client.domain;
|
|
|
|
import jakarta.persistence.*;
|
|
import java.math.BigDecimal;
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDateTime;
|
|
|
|
@Entity
|
|
@Table(name = "m_client_entity_kyc", uniqueConstraints = {
|
|
@UniqueConstraint(columnNames = { "client_id" })
|
|
})
|
|
public class ClientEntityKyc {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
@OneToOne(fetch = FetchType.LAZY)
|
|
@JoinColumn(name = "client_id", nullable = false)
|
|
private Client client;
|
|
|
|
@Column(name = "constitution_type", length = 50)
|
|
private String constitutionType;
|
|
|
|
// ── MSME ──
|
|
@Column(name = "is_msme")
|
|
private Boolean isMsme = false;
|
|
|
|
@Column(name = "udyam_number", length = 19)
|
|
private String udyamNumber;
|
|
|
|
@Column(name = "enterprise_name", length = 300)
|
|
private String enterpriseName;
|
|
|
|
@Column(name = "business_sector", length = 50)
|
|
private String businessSector;
|
|
|
|
@Column(name = "msme_turnover", precision = 18, scale = 2)
|
|
private BigDecimal msmeTurnover;
|
|
|
|
@Column(name = "msme_investment", precision = 18, scale = 2)
|
|
private BigDecimal msmeInvestment;
|
|
|
|
@Column(name = "msme_type", length = 20)
|
|
private String msmeType;
|
|
|
|
// ── Entity KYC Document ──
|
|
@Column(name = "entity_kyc_doc_type", length = 100)
|
|
private String entityKycDocType;
|
|
|
|
@Column(name = "entity_kyc_doc_number", length = 100)
|
|
private String entityKycDocNumber;
|
|
|
|
@Column(name = "entity_kyc_doc_issue_date")
|
|
private LocalDate entityKycDocIssueDate;
|
|
|
|
@Column(name = "entity_kyc_doc_expiry_date")
|
|
private LocalDate entityKycDocExpiryDate;
|
|
|
|
// ── Authorized Signatory ──
|
|
@Column(name = "signatory_name", length = 200)
|
|
private String signatoryName;
|
|
|
|
@Column(name = "signatory_designation", length = 100)
|
|
private String signatoryDesignation;
|
|
|
|
@Column(name = "signatory_pan", length = 10)
|
|
private String signatoryPan;
|
|
|
|
@Column(name = "signatory_aadhaar_masked", length = 12)
|
|
private String signatoryAadhaarMasked;
|
|
|
|
@Column(name = "signatory_kyc_doc_type", length = 100)
|
|
private String signatoryKycDocType;
|
|
|
|
@Column(name = "signatory_kyc_doc_number", length = 100)
|
|
private String signatoryKycDocNumber;
|
|
|
|
// ── Authorization Document ──
|
|
@Column(name = "authorization_doc_type", length = 100)
|
|
private String authorizationDocType;
|
|
|
|
@Column(name = "authorization_doc_number", length = 100)
|
|
private String authorizationDocNumber;
|
|
|
|
@Column(name = "authorization_date")
|
|
private LocalDate authorizationDate;
|
|
|
|
// ── Risk ──
|
|
@Column(name = "entity_risk_category")
|
|
private Integer entityRiskCategory = 1;
|
|
|
|
@Column(name = "entity_remarks", columnDefinition = "TEXT")
|
|
private String entityRemarks;
|
|
|
|
// ── Audit ──
|
|
@Column(name = "created_date", updatable = false)
|
|
private LocalDateTime createdDate = LocalDateTime.now();
|
|
|
|
@Column(name = "last_modified_date")
|
|
private LocalDateTime lastModifiedDate = LocalDateTime.now();
|
|
|
|
protected ClientEntityKyc() {}
|
|
|
|
public static ClientEntityKyc create(Client client, String constitutionType) {
|
|
ClientEntityKyc kyc = new ClientEntityKyc();
|
|
kyc.client = client;
|
|
kyc.constitutionType = constitutionType;
|
|
return kyc;
|
|
}
|
|
|
|
public void update(java.util.Map<String, Object> data) {
|
|
if (data.containsKey("constitutionType")) this.constitutionType = (String) data.get("constitutionType");
|
|
if (data.containsKey("isMsme")) this.isMsme = (Boolean) data.get("isMsme");
|
|
if (data.containsKey("udyamNumber")) this.udyamNumber = (String) data.get("udyamNumber");
|
|
if (data.containsKey("enterpriseName")) this.enterpriseName = (String) data.get("enterpriseName");
|
|
if (data.containsKey("businessSector")) this.businessSector = (String) data.get("businessSector");
|
|
if (data.containsKey("msmeTurnover")) this.msmeTurnover = toBigDecimal(data.get("msmeTurnover"));
|
|
if (data.containsKey("msmeInvestment")) this.msmeInvestment = toBigDecimal(data.get("msmeInvestment"));
|
|
if (data.containsKey("msmeType")) this.msmeType = (String) data.get("msmeType");
|
|
if (data.containsKey("entityKycDocType")) this.entityKycDocType = (String) data.get("entityKycDocType");
|
|
if (data.containsKey("entityKycDocNumber")) this.entityKycDocNumber = (String) data.get("entityKycDocNumber");
|
|
if (data.containsKey("signatoryName")) this.signatoryName = (String) data.get("signatoryName");
|
|
if (data.containsKey("signatoryDesignation")) this.signatoryDesignation = (String) data.get("signatoryDesignation");
|
|
if (data.containsKey("signatoryPan")) this.signatoryPan = (String) data.get("signatoryPan");
|
|
if (data.containsKey("signatoryAadhaar")) {
|
|
String raw = (String) data.get("signatoryAadhaar");
|
|
this.signatoryAadhaarMasked = raw != null && raw.length() == 12 ? "XXXXXXXX" + raw.substring(8) : raw;
|
|
}
|
|
if (data.containsKey("signatoryKycDocType")) this.signatoryKycDocType = (String) data.get("signatoryKycDocType");
|
|
if (data.containsKey("signatoryKycDocNumber")) this.signatoryKycDocNumber = (String) data.get("signatoryKycDocNumber");
|
|
if (data.containsKey("authorizationDocType")) this.authorizationDocType = (String) data.get("authorizationDocType");
|
|
if (data.containsKey("authorizationDocNumber")) this.authorizationDocNumber = (String) data.get("authorizationDocNumber");
|
|
if (data.containsKey("entityRiskCategory")) this.entityRiskCategory = (Integer) data.get("entityRiskCategory");
|
|
if (data.containsKey("entityRemarks")) this.entityRemarks = (String) data.get("entityRemarks");
|
|
this.lastModifiedDate = LocalDateTime.now();
|
|
}
|
|
|
|
private BigDecimal toBigDecimal(Object val) {
|
|
if (val == null) return null;
|
|
if (val instanceof BigDecimal) return (BigDecimal) val;
|
|
return new BigDecimal(val.toString());
|
|
}
|
|
|
|
// Getters
|
|
public Long getId() { return id; }
|
|
public Client getClient() { return client; }
|
|
public String getConstitutionType() { return constitutionType; }
|
|
public Boolean getIsMsme() { return isMsme; }
|
|
public String getUdyamNumber() { return udyamNumber; }
|
|
public String getEnterpriseName() { return enterpriseName; }
|
|
public String getBusinessSector() { return businessSector; }
|
|
public BigDecimal getMsmeTurnover() { return msmeTurnover; }
|
|
public BigDecimal getMsmeInvestment() { return msmeInvestment; }
|
|
public String getMsmeType() { return msmeType; }
|
|
public String getEntityKycDocType() { return entityKycDocType; }
|
|
public String getEntityKycDocNumber() { return entityKycDocNumber; }
|
|
public LocalDate getEntityKycDocIssueDate() { return entityKycDocIssueDate; }
|
|
public LocalDate getEntityKycDocExpiryDate() { return entityKycDocExpiryDate; }
|
|
public String getSignatoryName() { return signatoryName; }
|
|
public String getSignatoryDesignation() { return signatoryDesignation; }
|
|
public String getSignatoryPan() { return signatoryPan; }
|
|
public String getSignatoryAadhaarMasked() { return signatoryAadhaarMasked; }
|
|
public String getAuthorizationDocType() { return authorizationDocType; }
|
|
public String getAuthorizationDocNumber() { return authorizationDocNumber; }
|
|
public LocalDate getAuthorizationDate() { return authorizationDate; }
|
|
public Integer getEntityRiskCategory() { return entityRiskCategory; }
|
|
public String getEntityRemarks() { return entityRemarks; }
|
|
}
|