Bind Settlement Controller Documentation
File: /controllers/bindsettlement.php
Purpose: Employee cash custody settlement and expense management system
Last Updated: December 20, 2024
Total Functions: 8
Lines of Code: 506
---
๐ Overview
The Bind Settlement Controller manages employee cash custody (bind) settlements and expense tracking. This is a critical financial control system that handles:
- โข Employee cash custody settlements
- โข Expense reimbursement processing
- โข Cash advance reconciliation
- โข Multi-way settlement processing (cash/expense)
- โข Project-based cost center allocation
- โข Financial accounting integration
- โข Employee cash balance tracking
- โข Settlement grouping and audit trails
- โข Automated journal entry creation
- โข Expense type categorization
Primary Functions
- โ Employee cash custody settlement
- โ Expense reimbursement processing
- โ Cash advance reconciliation
- โ Multi-settlement transaction handling
- โ Project/cost center allocation
- โ Financial accounting integration
- โ Settlement audit trail
- โ Balance calculation and tracking
- โ Automated journal entries
- โ Expense categorization
Related Controllers
- โข billsfunctions.php - Sales utilities
- โข Employee Management - Employee operations
---
๐๏ธ Database Tables
Primary Settlement Tables
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **bindsettlement** | Settlement transactions | id, employeeid, settlementway, settlementwayid, value, groupno, projectid, comment, dailyentryid, deleted | |
| **bind** | Employee cash custody | id, employeeid, savevalue, ckekvalue, bindtype, deleted | |
| **employee** | Employee master data | id, employeeName, conditions |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **save** | Cash registers/safes | saveid, savename, savecurrentvalue, treeId | |
| **expensestype** | Expense categories | id, expensestypename, treeId | |
| **project** | Project master (deprecated) | id, projectname, finish, deleted | |
| **costcenter** | Cost center master | id, name, deleted |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **dailyentry** | Accounting journal entries | dailyentryid, dDateTime, entryComment, fromFlag | |
| **dailyentrycreditor** | Credit entries | id, dailyentryid, accountstreeid, value, pluginControllerName, costcenterid | |
| **dailyentrydebtor** | Debit entries | id, dailyentryid, accountstreeid, value, pluginControllerName | |
| **accountstree** | Chart of accounts | id, name, parentid, accounttype |
| Table Name | Purpose | Key Columns |
|---|---|---|
| **youtubelink** | Tutorial resources | youtubelinkid, title, url |
๐ Key Functions
1. Default Action / Settlement Form - Settlement Interface
Location: Line 121
Purpose: Display settlement creation form with employee and reference data
Process Flow:
1. Load employees with existing cash custody (bind)
2. Load available cash registers/safes
3. Load expense type categories
4. Load cost centers for project allocation
5. Display settlement creation form
Data Loading:
$binds = $bindEx->getAllEmployeeWithBind(); // Employees with cash custody
$save = $saveDAO->queryByConditions(0); // Active cash registers
$expensesType = $expensesTypeDAO->queryByCondition(0); // Expense categories
$costCenter = $costCenterDAO->queryByCondation(0); // Cost centers
---
2. add() - Process Settlement Transactions
Location: Line 144
Purpose: Create multiple settlement transactions in a single group
Function Signature:
elseif ($_GET['do'] == "add")
// Processes: Multiple settlement lines in one transaction group
Process Flow:
1. Get iteration count and employee ID
2. Generate new group number for transaction set
3. Process each settlement line via add($i, $group)
4. Handle transaction completion and error management
Group Processing Logic:
$itr = filter_input(INPUT_POST, "itr"); // Number of settlement lines
$employeeId = filter_input(INPUT_POST, "employee"); // Employee being settled
$bindSettlement = $bindSettlementEx->getLastGroupNo($employeeId);
$group = $bindSettlement->groupno + 1; // New group number
for ($i = 1; $i <= $itr; $i++) {
add($i, $group); // Process each settlement line
}
---
3. add($itr, $group) - Individual Settlement Processing
Location: Line 409
Purpose: Process individual settlement line item
Function Signature:
function add($itr, $group)
Process Flow:
1. Extract settlement parameters for line item
2. Determine settlement type (cash vs expense)
3. Create settlement record
4. Generate financial journal entry via saveDailyEntry()
Settlement Type Processing:
$bindSettlementType = filter_input(INPUT_POST, "bindSettlement" . $itr);
if ($bindSettlementType == 1) {
// Cash settlement - return money to safe
$bindSettlement->settlementwayid = $save;
$id = $save;
} else {
// Expense settlement - reimburse expense
$bindSettlement->settlementwayid = $expensestype;
$id = $expensestype;
}
---
4. saveDailyEntry() - Financial Accounting Integration
Location: Line 316
Purpose: Create comprehensive accounting entries for settlements
Function Signature:
function saveDailyEntry($value, $bindSettlementType, $employeeId, $id,
$bindSettlementId, $project)
Accounting Logic:
1. Credit: Employee custody account (reduce employee cash)
2. Debit: Cash account (if cash return) OR Expense account (if expense)
3. Cost Center: Apply project allocation if specified
Journal Entry Structure:
// Credit: Employee custody account (always)
$employee = $employeeDAO->load($employeeId);
$custodyAccountName = 'ุนูุฏุฉ ' . $employee->employeeName; // "Custody of [Employee Name]"
$treeId3 = addTreeElement($custodyAccountName, 46, 3, 0, 1, '', 0, 0);
$dailyEntryCreditor->value = $value;
$dailyEntryCreditor->accountstreeid = $treeId3;
// Debit: Cash or expense account (depending on settlement type)
if ($bindSettlementType == 1) {
// Cash return
$mySave = $mySaveDAO->load($id);
$treeId2 = $mySave->treeId; // Cash account
} else {
// Expense reimbursement
$expensesType = $expensesTypeDAO->load($id);
$treeId2 = $expensesType->treeId; // Expense account
}
$dailyEntryDebtor->value = $value;
$dailyEntryDebtor->accountstreeid = $treeId2;
---
5. show() - Settlement Listing
Location: Line 232
Purpose: Display settlement transaction listing
Process Flow:
1. Load employee data for filtering
2. Load tutorial resources
3. Display settlement listing template
---
6. edit() - Settlement Modification
Location: Line 163
Purpose: Edit existing settlement group
Function Signature:
elseif ($_GET['do'] == "edit")
// Parameters: groupno, employeeid
Process Flow:
1. Load existing settlement records by group
2. Calculate current employee cash balance
3. Display edit form with current data
Balance Calculation:
// Calculate employee cash position
$bs = $bindEx->queryByEmployeeidAndDeleted($employeeId, 0); // Total binds
$bSs = $bindSettlementEx->queryByEmployeeidAndDeleted($employeeId, 0); // Total settlements
$sumBind = 0; // Total cash given to employee
$sumSettlement = 0; // Total cash settled by employee
foreach ($bs as $b) {
if ($b->bindtype == 1) {
$sumBind += $b->savevalue; // External cash
} else {
$sumBind += $b->ckekvalue; // Internal cash
}
}
foreach ($bSs as $bS) {
$sumSettlement += $bS->value; // Settlement amounts
}
$sumNet = $sumBind - $sumSettlement; // Net cash position
---
7. update() - Settlement Group Update
Location: Line 282
Purpose: Update existing settlement group
Function Signature:
elseif ($_GET['do'] == "update")
Process Flow:
1. Process each settlement line in group
2. Update existing records or create new ones
3. Reverse old journal entries and create new ones
4. Handle mixed update/create scenarios
---
8. updateOne() - Individual Settlement Update
Location: Line 462
Purpose: Update individual settlement record
Function Signature:
function updateOne($bindSettlementId, $groupNo, $itr)
Process Flow:
1. Load existing settlement record
2. Update all settlement fields
3. Reverse existing journal entry
4. Create new journal entry with updated data
---
๐ Workflows
Workflow 1: Employee Cash Custody Settlement
---
Workflow 2: Employee Cash Balance Management
---
๐งฎ Balance Calculation Methods
Employee Cash Balance Calculation
function calculateEmployeeBalance($employeeId) {
// Get all cash custody records
$binds = $bindEx->queryByEmployeeidAndDeleted($employeeId, 0);
// Get all settlements (excluding current editing group)
$settlements = $bindSettlementEx->queryByEmployeeidAndDeleted($employeeId, 0);
// Calculate total cash given to employee
$sumBind = 0;
foreach ($binds as $bind) {
if ($bind->bindtype == 1) {
$sumBind += $bind->savevalue; // External cash
} else {
$sumBind += $bind->ckekvalue; // Internal cash
}
}
// Calculate total settlements
$sumSettlement = 0;
foreach ($settlements as $settlement) {
$sumSettlement += $settlement->value;
}
// Net position (positive = employee owes company)
$netBalance = $sumBind - $sumSettlement;
return [
'totalBind' => $sumBind,
'totalSettlement' => $sumSettlement,
'netBalance' => $netBalance
];
}
Settlement Group Management
function getNextGroupNumber($employeeId) {
$lastSettlement = $bindSettlementEx->getLastGroupNo($employeeId);
return ($lastSettlement->groupno ?? 0) + 1;
}
---
๐ URL Routes & Actions
| URL Parameter | Function Called | Description | |
|---|---|---|---|
| `do=` (empty) | Default action | Settlement creation form | |
| `do=add` | `add()` | Process new settlement group | |
| `do=show` | `show()` | List settlement transactions | |
| `do=showreport` | `showreport()` | Settlement reporting | |
| `do=edit` | `edit()` | Edit settlement group | |
| `do=update` | `update()` | Update settlement group | |
| `do=delete` | `delete()` | Delete settlement (soft) | |
| `do=sucess` | Success page | Operation completed | |
| `do=error` | Error page | Operation failed |
Add Settlement (do=add):
- โข
employee- Employee ID - โข
itr- Number of settlement lines - โข
bindSettlement[i]- Settlement type (1=cash, 2=expense) - โข
save[i]- Cash register ID (for cash settlements) - โข
expensestype[i]- Expense type ID (for expense settlements) - โข
project[i]- Project/cost center ID (optional) - โข
value[i]- Settlement amount - โข
comment[i]- Settlement notes
Edit Settlement (do=edit):
- โข
groupno- Settlement group number - โข
employeeid- Employee ID
Update Settlement (do=update):
- โข
groupNo- Group number being updated - โข
itr- Number of settlement lines - โข
bindSettleId[i]- Existing settlement ID (if updating) - โข All fields from add operation
---
๐ Security & Permissions
Access Control
// Authentication required for all operations
include_once("../public/authentication.php");
Input Validation
$employee = filter_input(INPUT_POST, "employee");
$value = filter_input(INPUT_POST, "value" . $itr);
$project = filter_input(INPUT_POST, "project" . $itr);
Financial Controls
- โข Settlement amounts validated against employee balances
- โข Proper separation of cash vs expense settlements
- โข Audit trail maintained for all transactions
- โข User tracking for accountability
Transaction Integrity
$mytransactions = new Transaction();
try {
// All settlement operations
$mytransactions->commit();
} catch (Exception $ex) {
$mytransactions->rollback();
}
---
๐ Performance Considerations
Database Optimization
1. Critical Indexes:
- bindsettlement(employeeid, groupno, deleted)
- bind(employeeid, deleted)
- dailyentry(dailyentryid)
- employee(conditions)
2. Query Optimization:
- Efficient employee balance calculations
- Fast settlement group lookups
- Optimized chart of accounts queries
Balance Calculation Performance
- โข Cache employee balance calculations
- โข Use database aggregations where possible
- โข Minimize loops in balance calculations
---
๐ Common Issues & Troubleshooting
1. Balance Calculation Errors
Issue: Employee cash balances don't match expected amounts
Cause: Missing bind records or settlement transactions
Debug:
-- Verify employee cash custody records
SELECT
employeeid,
bindtype,
CASE WHEN bindtype = 1 THEN savevalue ELSE ckekvalue END as amount,
deleted
FROM bind
WHERE employeeid = [EMPLOYEE_ID]
ORDER BY id;
-- Check settlement completeness
SELECT
groupno,
settlementway,
value,
deleted,
dailyentryid
FROM bindsettlement
WHERE employeeid = [EMPLOYEE_ID]
ORDER BY groupno, id;
2. Journal Entry Mismatches
Issue: Settlement journal entries don't balance
Cause: Incorrect account mapping or amount calculations
Debug:
-- Verify journal entry balance
SELECT
de.dailyentryid,
SUM(ded.value) as total_debits,
SUM(dec.value) as total_credits
FROM dailyentry de
LEFT JOIN dailyentrydebtor ded ON ded.dailyentryid = de.dailyentryid
LEFT JOIN dailyentrycreditor dec ON dec.dailyentryid = de.dailyentryid
WHERE de.dailyentryid IN (
SELECT dailyentryid FROM bindsettlement
WHERE employeeid = [EMPLOYEE_ID]
)
GROUP BY de.dailyentryid
HAVING total_debits != total_credits;
3. Group Number Conflicts
Issue: Settlement group numbers not unique or sequential
Cause: Concurrent settlement processing
Solution:
- โข Implement proper locking mechanism
- โข Use database sequences for group numbers
- โข Validate group uniqueness before creation
---
๐งช Testing Scenarios
Test Case 1: Simple Cash Settlement
1. Give employee cash custody (bind)
2. Process cash return settlement
3. Verify employee balance updated correctly
4. Check journal entries created properly
Test Case 2: Expense Reimbursement
1. Employee has cash custody
2. Process expense settlement with receipts
3. Verify expense categorization
4. Check project allocation if applicable
Test Case 3: Mixed Settlement Group
1. Create settlement with multiple lines
2. Mix cash returns and expense reimbursements
3. Verify group number assignment
4. Check all journal entries created
Test Case 4: Settlement Editing
1. Create settlement group
2. Edit settlement amounts and types
3. Verify old journal entries reversed
4. Check new entries created correctly
Test Case 5: Employee Balance Tracking
1. Process multiple bind assignments
2. Process multiple settlements over time
3. Verify balance calculation accuracy
4. Test edge cases (negative balances)
---
๐ Future Enhancement Opportunities
1. Advanced Expense Management
- โข Receipt image upload and storage
- โข Expense approval workflow
- โข Mileage and per diem calculations
- โข Integration with expense policies
2. Enhanced Reporting
- โข Employee settlement history reports
- โข Cash custody aging analysis
- โข Project cost allocation reports
- โข Expense category analytics
3. Process Automation
- โข Automated settlement reminders
- โข Policy-based settlement validation
- โข Integration with payroll systems
- โข Mobile expense submission
4. Financial Integration
- โข Real-time cash position updates
- โข Bank reconciliation integration
- โข Multi-currency settlement support
- โข Advanced cost center reporting
---
๐ Related Documentation
- โข CLAUDE.md - PHP 8.2 migration guide
- โข Employee Management - Employee operations
- โข Financial Controls - Accounting and controls
---
Documented By: AI Assistant
Review Status: โ Complete
Next Review: When cash management features are enhanced