ClientAddresses Documentation
Client Addresses Controller Documentation
File: /controllers/clientAddressesController.php
Purpose: Manages commercial transaction estates with complex commission structures and income integration
Last Updated: December 20, 2024
Total Functions: 4
Lines of Code: ~363
---
๐ Overview
โ ๏ธ NOTE: Despite the filename clientAddressesController.php, this controller actually manages commercial transaction estates, not client addresses. The code is identical to transactionsCommercialController.php and should likely be renamed or refactored.
The Client Addresses Controller (Commercial Transactions) is a financial module that handles:
- โข Commercial real estate transaction management
- โข Complex commission distribution among multiple delegates
- โข Income type integration with accounting system
- โข Service fee calculations
- โข External commission handling
- โข Cash register integration
- โข CURL-based income controller integration
Primary Functions
- โ Create and manage commercial transaction records
- โ Calculate complex commission structures across multiple delegates
- โ Integrate with income management system
- โ Track various service fees and commissions
- โ Handle external commission payments
- โ Support cash register assignment
- โ Ajax data tables with comprehensive filtering
Related Controllers
- โข incomeController.php - Income management integration
- โข saveController.php - Cash register management
- โข userController.php - Delegate/user management
---
๐๏ธ Database Tables
Primary Tables (Direct Operations)
| Table Name | Purpose | Key Columns |
|---|---|---|
| **transactionsestates** | Commercial transaction records | id, transactionestate, transactionvalue, delegateid, fullcommission, services, externalcommission, delegatereliefid, reliefvalue, delegatedataid, datavalue, delegateclearanceid, delegateclearanceidvalue, onlinevalue, netservices, representativecommission, officecommission, savevalue, saveid, incomeid, incometypeid, addtoday, adduserid |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **income** | Income tracking | incomeId, dailyentryid, name, Value | |
| **save** | Cash registers | saveid, savename, savevalue, conditions | |
| **user** | System users/delegates | userid, employeename, username |
๐ Key Functions
1. Default Action - Add Transaction Form
Location: Lines 8-15
Purpose: Display commercial transaction creation form
Template: transactionsCommercialView/add.html
JavaScript: transactionsestatesjs = 1
---
2. show() - List Transactions
Location: Lines 15-21
Purpose: Display transaction listing page with data tables
Template: transactionsCommercialView/show.html
---
3. edit() - Edit Transaction Form
Location: Lines 21-34
Purpose: Display transaction editing form with delegate information
Process Flow:
1. Load transaction estate record
2. Load delegate user information for each role:
- Main delegate (delegateid)
- Relief delegate (delegatereliefid)
- Data delegate (delegatedataid)
- Clearance delegate (delegateclearanceid)
3. Display edit form with populated data
Delegate Loading:
$editdata->delegate = R::getRow('SELECT * FROM `user` WHERE userid = ?', [$editdata->delegateid]);
$editdata->delegaterelief = R::getRow('SELECT * FROM `user` WHERE userid = ?', [$editdata->delegatereliefid]);
$editdata->delegatedata = R::getRow('SELECT * FROM `user` WHERE userid = ?', [$editdata->delegatedataid]);
$editdata->delegateclearance = R::getRow('SELECT * FROM `user` WHERE userid = ?', [$editdata->delegateclearanceid]);
Template: transactionsCommercialView/edit.html
---
4. savedata() - Save/Update Transaction
Location: Lines 43-138
Purpose: Create or update commercial transaction with income integration
Function Signature:
function savedata()
Complex Process Flow:
1. Extract Form Data
โโโ Basic transaction info (name, value)
โโโ Commission structure (full, external, representative, office)
โโโ Service fees (services, netservices, online)
โโโ Delegate assignments (4 different roles)
โโโ Delegate-specific values for each role
โโโ Cash register assignment
2. Create/Update Transaction Record
โโโ Set incometypeid = 4 (commercial transactions)
โโโ Assign to user's default cash register
โโโ Set audit trail fields
3. Income Integration (CURL)
โโโ For NEW records: Create income entry
โโโ For UPDATES: Update existing income entry
โโโ Link transaction to income system
โโโ Handle accounting journal entries
4. Return Success/Failure Status
Income Integration Logic:
if (!$etransactionestateid) {
// Create new income
$send_data = array(
'clientid' => -1,
'saveid' => $_SESSION['saveid'],
'Costcenterid' => -1,
'Value' => $savevalue,
'comment' => 'ุงุถุงูุฉ ููุน ุงูุฑุงุฏ ู
ุนุงู
ูุงุช ุชุฌุงุฑู ูุงุณู
ุงูุงูุฑุงุฏ ' . $transactionsestates->transactionestate,
'name' => $transactionsestates->transactionestate,
'parent' => 4,
);
$incomeController = CURL_IT2($send_data, 'incomeController.php?do=add');
$obj = json_decode($incomeController);
R::exec("UPDATE `transactionsestates` SET `incomeid`= $obj->id WHERE id = '" . $transactionestateid . "' ");
} else {
// Update existing income
$send_data = array(
'incomeId' => $income['incomeId'],
'oldname' => $incomeoldname,
'dailyentryid' => $income['dailyentryid'],
'Value' => $savevalue,
'comment' => 'ุชุนุฏูู ููุน ุงูุฑุงุฏ ู
ุนุงู
ูุงุช ุชุฌุงุฑู ูุงุณู
ุงูุงูุฑุงุฏ ' . $transactionsestates->transactionestate,
'name' => $transactionsestates->transactionestate,
'parent' => 4,
);
CURL_IT2($send_data, 'incomeController.php?do=update');
}
---
5. showajax() - Ajax Data Table
Location: Lines 141-303
Purpose: Provide comprehensive data for transaction listing with complex filtering
Extensive Column Structure (26 columns):
1. ID
2. Transaction Estate Name
3. Transaction Value
4. Main Delegate
5. Full Commission
6. Services
7. Net Services
8. Relief Delegate
9. Relief Value
10. Data Delegate
11. Data Value
12. Clearance Delegate
13. Clearance Value
14. Online Value
15. External Commission
16. Representative Commission
17. Office Commission
18. Save Value
19. Save Name
20. Add Date
21. Add User
22. Edit Button
23. Delete Button
Complex Filtering Options:
- โข Date range filtering (
start_date,end_date) - โข Individual delegate filtering (4 different delegate types)
- โข Cash register filtering (
saveid) - โข User filtering (
adduserid) - โข Status filtering (
del) - โข Full-text search across all 22+ fields
Multi-User JOIN Query:
SELECT transactionsestates.*,
userdelegateid.employeename as userdelegate,
userdelegatereliefid.employeename as userdelegaterelief,
userdelegatedataid.employeename as userdelegatedata,
userdelegateclearanceid.employeename as userdelegateclearance,
useradduserid.employeename as useradduser,
savename
FROM `transactionsestates`
LEFT JOIN user as userdelegateid ON transactionsestates.delegateid = userdelegateid.userid
LEFT JOIN user as userdelegatereliefid ON transactionsestates.delegatereliefid = userdelegatereliefid.userid
LEFT JOIN user as userdelegatedataid ON transactionsestates.delegatedataid = userdelegatedataid.userid
LEFT JOIN user as userdelegateclearanceid ON transactionsestates.delegateclearanceid = userdelegateclearanceid.userid
LEFT JOIN user as useradduserid ON transactionsestates.adduserid = useradduserid.userid
LEFT JOIN save ON transactionsestates.saveid = save.saveid
WHERE transactionsestates.incometypeid = 4
---
6. removecontroller() - Delete Transaction
Location: Lines 308-329
Purpose: Soft delete transaction and reverse income entries
Process Flow:
1. Mark transaction as deleted (del = 2)
2. Record deletion audit trail
3. Retrieve linked income record
4. Call income controller to reverse/delete income entry
5. Return success/failure status
Income Reversal:
$income = R::getRow('SELECT * FROM `income` WHERE incomeId = ?', [$tables->incomeid]);
$dailyentryid = $income['dailyentryid'];
CURL_IT2($send_data, "incomeController.php?do=delete&id=$tables->incomeid&action=$dailyentryid");
---
7. CURL_IT2() - Internal CURL Helper
Location: Lines 333-358
Purpose: Handle CURL requests to other controllers with session management
Features:
- โข Dynamic URL construction
- โข Session data transmission
- โข SSL verification disabled for local requests
- โข Error handling with silent failure
- โข Response capture and return
---
๐ Workflows
Workflow 1: Commercial Transaction Processing
---
Workflow 2: Commission Structure
Transaction Value: $100,000
โโโ Full Commission: $5,000 (to Main Delegate)
โโโ Services: $500
โโโ Net Services: $450 (Services - fees)
โโโ Relief Delegate: $200
โโโ Data Delegate: $150
โโโ Clearance Delegate: $300
โโโ Online Value: $100
โโโ External Commission: $800
โโโ Representative Commission: $600
โโโ Office Commission: $400
โโโ Save Value: $91,500 (net to cash register)
---
๐ URL Routes & Actions
| URL Parameter | Function Called | Description | |
|---|---|---|---|
| `do=` (empty) | Default action | Display transaction add form | |
| `do=show` | Show view | Display transaction listing | |
| `do=edit&id={id}` | Edit view | Display transaction edit form | |
| `do=savedata` | `savedata()` | Process transaction save/update | |
| `do=showajax` | `showajax()` | Ajax data for transaction table | |
| `do=removecontroller` | `removecontroller()` | Soft delete transaction |
๐งฎ Commission Calculation Structure
Commission Types
1. Full Commission - Main delegate commission
2. External Commission - Outside party commission
3. Representative Commission - Sales representative fee
4. Office Commission - Office overhead fee
5. Services - Gross service fees
6. Net Services - Net service fees (after deductions)
Delegate Value Distribution
- โข Relief Delegate - Backup/support delegate fee
- โข Data Delegate - Data processing/entry fee
- โข Clearance Delegate - Document clearance fee
- โข Online Value - Online processing fees
Net Cash Calculation
Save Value = Transaction Value - All Commissions - All Services - All Delegate Fees
---
๐ Security & Permissions
Session Integration
// Session data transmitted via CURL
$data_arr['sessionlist'] = json_encode($_SESSION);
Input Sanitization
- โข All form inputs filtered with
filter_input() - โข CURL requests use POST method
- โข SQL injection prevented by RedBean ORM
Audit Trail
- โข Creation tracking:
addtoday,adduserid - โข Update tracking:
updatetoday,updateuserid - โข Deletion tracking:
deltoday,deluserid
---
๐ Performance Considerations
Database Optimization
1. Critical Indexes:
- transactionsestates(incometypeid, del, addtoday)
- transactionsestates(delegateid)
- transactionsestates(saveid)
2. Query Optimization:
- Multiple LEFT JOINs with user table (5 joins)
- Consider view or materialized query for reporting
- Date range filtering with proper indexing
CURL Performance
- โข Multiple CURL requests for income integration
- โข Consider async processing for large transactions
- โข Network latency affects response times
---
๐ Common Issues & Troubleshooting
1. Income Integration Failures
Issue: Transaction saves but income not created
Cause: CURL request to incomeController fails
Debug:
// Add CURL error handling in CURL_IT2
if ($response === false) {
error_log('CURL Error: ' . curl_error($ch));
return false;
}
2. Commission Calculation Errors
Issue: Save value doesn't match expected amount
Cause: Missing commission fields or calculation errors
Debug:
// Verify commission totals
$totalCommissions = $fullcommission + $externalcommission + $representativecommission + $officecommission;
$totalDelegateValues = $reliefvalue + $datavalue + $delegateclearanceidvalue;
$totalServices = $services + $onlinevalue;
$expectedSaveValue = $transactionvalue - $totalCommissions - $totalDelegateValues - $totalServices;
3. Delegate Assignment Issues
Issue: Delegate names not showing in listing
Cause: User records deleted or inactive
Debug:
-- Check delegate user records
SELECT userid, employeename FROM user WHERE userid IN (delegateid, delegatereliefid, delegatedataid, delegateclearanceid);
---
๐งช Testing Scenarios
Test Case 1: Complex Commission Structure
1. Create transaction with all commission types
2. Assign different delegates to each role
3. Verify all calculations correct
4. Check income integration successful
5. Confirm cash register updated
Test Case 2: Edit Transaction Impact
1. Create transaction with income integration
2. Edit transaction changing commission structure
3. Verify income record updated correctly
4. Check accounting entries reflect changes
5. Confirm old entries properly reversed
Test Case 3: Deletion and Reversal
1. Create and process transaction
2. Verify income and accounting entries exist
3. Delete transaction
4. Check income entries properly reversed
5. Verify cash register balance correct
---
โ ๏ธ Known Issues
1. Filename Mismatch
The controller is named clientAddressesController.php but manages commercial transactions, not client addresses. This creates confusion and should be:
- โข Renamed to
transactionsCommercialController.php(matching template paths) - โข OR refactored to actually handle client addresses
- โข OR merged with existing
transactionsCommercialController.php
2. Template Path Inconsistency
Uses transactionsCommercialView templates but filename suggests client addresses functionality.
3. Duplicate Code
This controller appears to be identical to transactionsCommercialController.php, creating maintenance issues.
---
๐ Related Documentation
- โข CLAUDE.md - PHP 8.2 migration guide
- โข incomeController.php - Income management integration
- โข saveController.php - Cash register management
- โข userController.php - User/delegate management
---
Documented By: AI Assistant
Review Status: โ Complete (with noted issues)
Next Review: When refactoring/renaming occurs
Recommendation: Rename or refactor to match actual functionality