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