James Carl Sitsit

MutualLink

Loans, savings, and collections for a multi-purpose cooperative

Building

MutualLink amortization schedule for a demo loan, with paid and unpaid installments (synthetic data)
MutualLink payment posting with the live penalty, interest, and principal breakdown (synthetic data)
MutualLink delinquency aging report with brackets and a demand-letter action (synthetic data)

MutualLink runs a multi-purpose cooperative’s members, savings, share capital, and loans: application to approval to release, payments with official receipts, delinquency aging, demand letters, reminders, reports, and an audit log, across five staff roles.

At a glance

Scope
Members, savings and share capital, loan products, application → approval → release, payments with official receipts, delinquency aging, demand letters, email reminders, reports, audit log
Constraints
Numbers had to match the spreadsheet staff already trusted; separation of duties (whoever encodes a loan cannot approve it); financial records reversed or voided, never deleted

The problem

The cooperative computed loans in a spreadsheet and tracked collections by hand. Any system replacing that had to produce the same peso-and-centavo numbers staff already trusted, and could never double-post a payment.

The approach

A PHP and MySQL system built around the cooperative’s own loan sheet: diminishing-balance schedules with equal principal, daily past-due accrual, and payments applied penalty, then interest, then principal. Money actions run in transactions with row locks, and financial records are only ever reversed or voided, never deleted.

Stack

  • PHP 8.2
  • MySQL 8.4
  • AdminLTE
  • Bootstrap
  • DataTables
  • Chart.js
  • PHPMailer

Status

Amortization tested against the cooperative’s own sample loan

Have a project like this?

Tell me what you’re building, or book a short call about a similar system.

Let’s talk