Files
cbsnexora/backend-schema/ClientEntityKyc.java
AdityaandClaude Opus 4.6 b890d24bb7 feat: non-individual entity UI improvements — hide individual-only sections, fix legal form display, send extended fields to API
- 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>
2026-04-04 15:10:51 +05:30

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; }
}