Files
cbsnexora/backend-schema/V1__client_schema_extensions.sql
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

150 lines
7.4 KiB
SQL

-- ============================================================
-- CBS Nexora — Client Schema Extensions
-- Fineract DB Migration Script
-- Run this AFTER backing up your database
-- ============================================================
-- ─── 1. m_client — New columns ───
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS nationality VARCHAR(20) DEFAULT 'INDIAN';
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS annual_turnover DECIMAL(18,2);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS credit_limit DECIMAL(18,2);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS is_minor TINYINT(1) DEFAULT 0;
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS age_years INT;
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS age_months INT;
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS age_days INT;
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS guardian_name VARCHAR(200);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS guardian_relation VARCHAR(50);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS guardian_mobile VARCHAR(15);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS guardian_id_number VARCHAR(50);
ALTER TABLE m_client ADD COLUMN IF NOT EXISTS guardian_address TEXT;
-- ─── 2. m_client_non_person — New columns ───
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS date_of_registration DATE;
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS enterprise_pan VARCHAR(10);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS cin_number VARCHAR(21);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS authorized_signatory VARCHAR(200);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS additional_info VARCHAR(500);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS credit_limit DECIMAL(18,2);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS is_msme TINYINT(1) DEFAULT 0;
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS udyam_number VARCHAR(19);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS enterprise_name VARCHAR(300);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS business_sector VARCHAR(50);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS msme_turnover DECIMAL(18,2);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS msme_investment DECIMAL(18,2);
ALTER TABLE m_client_non_person ADD COLUMN IF NOT EXISTS msme_type VARCHAR(20);
-- ─── 3. m_client_kyc — New columns ───
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS has_pan TINYINT(1) DEFAULT 1;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS pan_aadhaar_link_status VARCHAR(20);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS kyc_document_name VARCHAR(100);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS kyc_document_number VARCHAR(100);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS kyc_doc_issue_date DATE;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS kyc_doc_expiry_date DATE;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS kyc_expiry_date DATE;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS aml_check_status VARCHAR(20) DEFAULT 'CLEAR';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS banned_entity_match VARCHAR(20) DEFAULT 'NO';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS willful_defaulter VARCHAR(5) DEFAULT 'NO';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS ecgc_sal_flag VARCHAR(5) DEFAULT 'NO';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS dormant_flag VARCHAR(20) DEFAULT 'ACTIVE';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS account_status VARCHAR(20) DEFAULT 'ACTIVE';
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS freeze_reason VARCHAR(50);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS freeze_authority VARCHAR(50);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS form60_type VARCHAR(10);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS form60_date DATE;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS form15_applicable TINYINT(1) DEFAULT 0;
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS form15_type VARCHAR(5);
ALTER TABLE m_client_kyc ADD COLUMN IF NOT EXISTS form15_fy VARCHAR(10);
-- ─── 4. m_client_entity_kyc — New table ───
CREATE TABLE IF NOT EXISTS m_client_entity_kyc (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
client_id BIGINT NOT NULL,
constitution_type VARCHAR(50),
-- MSME
is_msme TINYINT(1) DEFAULT 0,
udyam_number VARCHAR(19),
enterprise_name VARCHAR(300),
business_sector VARCHAR(50),
msme_turnover DECIMAL(18,2),
msme_investment DECIMAL(18,2),
msme_type VARCHAR(20),
-- Entity KYC Document
entity_kyc_doc_type VARCHAR(100),
entity_kyc_doc_number VARCHAR(100),
entity_kyc_doc_issue_date DATE,
entity_kyc_doc_expiry_date DATE,
-- Authorized Signatory
signatory_name VARCHAR(200),
signatory_designation VARCHAR(100),
signatory_pan VARCHAR(10),
signatory_aadhaar_masked VARCHAR(12),
signatory_kyc_doc_type VARCHAR(100),
signatory_kyc_doc_number VARCHAR(100),
-- Authorization Document
authorization_doc_type VARCHAR(100),
authorization_doc_number VARCHAR(100),
authorization_date DATE,
-- Risk
entity_risk_category INT DEFAULT 1,
entity_remarks TEXT,
-- Audit
created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
last_modified_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES m_client(id) ON DELETE CASCADE,
UNIQUE KEY uk_client_entity_kyc (client_id)
);
-- ─── 5. m_client_address_india — New table ───
CREATE TABLE IF NOT EXISTS m_client_address_india (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
client_id BIGINT NOT NULL,
address_type ENUM('PERMANENT','CURRENT','OFFICE','CORRESPONDENCE') NOT NULL,
address_line_1 VARCHAR(500),
address_line_2 VARCHAR(500),
pin_code VARCHAR(6),
locality VARCHAR(200),
city VARCHAR(200),
district VARCHAR(200),
state VARCHAR(200),
country VARCHAR(100) DEFAULT 'India',
landmark VARCHAR(300),
-- Permanent-specific
proof_type VARCHAR(100),
proof_doc_number VARCHAR(100),
-- Current-specific
residence_type VARCHAR(50),
years_at_address INT,
same_as_permanent TINYINT(1) DEFAULT 0,
-- Office-specific
org_name VARCHAR(300),
department VARCHAR(200),
office_phone VARCHAR(20),
employment_type VARCHAR(100),
employee_id VARCHAR(50),
years_with_org INT,
-- Correspondence-specific
comm_mode VARCHAR(50),
contact_number VARCHAR(20),
-- Audit
created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
last_modified_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (client_id) REFERENCES m_client(id) ON DELETE CASCADE,
UNIQUE KEY uk_client_address_type (client_id, address_type)
);
-- ─── 6. Constitution Type code values (if not using API-driven options) ───
-- Find Gender code and add missing values
SET @gender_code_id = (SELECT id FROM m_code WHERE code_name = 'Gender' LIMIT 1);
INSERT IGNORE INTO m_code_value (code_id, code_value, order_position, is_active)
VALUES
(@gender_code_id, 'Transgender', 3, 1),
(@gender_code_id, 'Other', 4, 1);
-- ─── 7. Indexes for performance ───
CREATE INDEX IF NOT EXISTS idx_client_entity_kyc_client ON m_client_entity_kyc(client_id);
CREATE INDEX IF NOT EXISTS idx_client_address_india_client ON m_client_address_india(client_id);
CREATE INDEX IF NOT EXISTS idx_client_address_india_type ON m_client_address_india(client_id, address_type);
CREATE INDEX IF NOT EXISTS idx_client_kyc_expiry ON m_client_kyc(kyc_expiry_date);
CREATE INDEX IF NOT EXISTS idx_client_kyc_aml ON m_client_kyc(aml_check_status);
CREATE INDEX IF NOT EXISTS idx_client_minor ON m_client(is_minor);