# ๐Ÿงพ 3. Table Design (Detailed) --- ## `loan_applications` (MAIN TABLE) This is the core record. ```sql id (PK) loan_type_id (FK) amount_requested deduction_period purpose status (SUBMITTED, UNDER_REVIEW, APPROVED, REJECTED) created_at updated_at ``` ## `applicants` One-to-one with loan application. ```sql id (PK) loan_application_id (FK) name ic_num phone_num member_id_num birth_date email employer_name current_position position_status address bank_account_number bank_name basic_salary total_income deduction service_date service_period ``` ## `guarantors` ๐Ÿ‘‰ One loan โ†’ **3 guarantors** (One-to-Many) ```sql id (PK) loan_application_id (FK) name ic_num unit address phone_num member_id_number basic_salary allowance total_income ``` ## `loan_approvals` One-to-one with loan application. ```sql id (PK) loan_application_id (FK) level role approver_id decision (PENDING, APPROVED, REJECTED) remarks approved_at ``` ## `loan_evaluations` ```sql id (PK) loan_application_id (FK) calculated_by (FK users) total_loan total_payment period insurance_per_month deduction_start_date deduction_end_date number_of_shares total_fees debt_balance payment_date created_at ``` ## `documents` ```sql id loan_application_id (FK) file_name file_url file_type uploaded_by uploaded_at ``` ## `loan_status_history` ```sql id (PK) loan_application_id (FK) status (DRAFT, SUBMITTED, UNDER_REVIEW, APPROVED, REJECTED) changed_by (FK users) changed_at (timestamp) remarks (optional) ``` ## `repayments` ```sql id (PK) loan_application_id (FK) installment_number (1, 2, 3...) due_date amount_due amount_paid payment_date status (PENDING, PAID, LATE) created_at ``` --- # ๐Ÿ”— 4. Relationships Diagram (Simple) ```id="c2x7qp" loan_applications โ”‚ โ”œโ”€โ”€ applicants (1:1) โ”œโ”€โ”€ guarantors (1:N) โ””โ”€โ”€ loan_reviews (1:1) ``` --- # ๐Ÿงฉ 6. JPA Entity Mapping (Example) ### LoanApplication ```java @Entity public class LoanApplication { @Id @GeneratedValue private Long id; private BigDecimal amountRequested; private Integer deductionPeriod; private String purpose; @Enumerated(EnumType.STRING) private LoanStatus status; @OneToOne(mappedBy = "loanApplication", cascade = CascadeType.ALL) private Applicant applicant; @OneToMany(mappedBy = "loanApplication", cascade = CascadeType.ALL) private List guarantors; @OneToOne(mappedBy = "loanApplication", cascade = CascadeType.ALL) private LoanReview review; } ``` --- # โš ๏ธ 7. Important Constraints ## ๐Ÿ”น Enforce in Backend (NOT DB) * Exactly **3 guarantors** * Valid IC format * Salary > 0 * Loan amount limits --- # ๐Ÿ” 8. Audit & Compliance (Very Important) Add these fields to key tables: ```sql created_by created_at updated_by updated_at ``` --- # ๐Ÿš€ 9. Future Enhancements You can easily extend this design with: * ๐Ÿ“Ž `documents` table (for uploads) * ๐Ÿ“Š `repayments` table * ๐Ÿงพ `audit_logs` * ๐Ÿ”„ `loan_status_history` --- # ๐Ÿ Final Architecture Mapping Your DB aligns perfectly with your system: ```id="z7wq3f" Frontend Form โ†’ LoanApplication โ†’ Applicant + Guarantors โ†“ Officer Review โ†“ Decision ```