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:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**transactionsestates**Commercial transaction recordsid, transactionestate, transactionvalue, delegateid, fullcommission, services, externalcommission, delegatereliefid, reliefvalue, delegatedataid, datavalue, delegateclearanceid, delegateclearanceidvalue, onlinevalue, netservices, representativecommission, officecommission, savevalue, saveid, incomeid, incometypeid, addtoday, adduserid
### Related Tables (Referenced)

Table NamePurposeKey Columns
**income**Income trackingincomeId, dailyentryid, name, Value
**save**Cash registerssaveid, savename, savevalue, conditions
**user**System users/delegatesuserid, 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:

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:

---

๐Ÿ”„ Workflows

Workflow 1: Commercial Transaction Processing

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: New Commercial Transaction
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Transaction Setup
- Enter transaction estate name and value
- Assign main delegate
- Set full commission amount
- Configure service fees
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Commission Distribution
- Assign relief delegate and value
- Assign data delegate and value
- Assign clearance delegate and value
- Calculate representative commission
- Calculate office commission
- Set external commission
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Financial Integration
- Assign to cash register
- Calculate save value
- Create income entry via CURL
- Generate accounting entries
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Complete Transaction
- Store transaction record
- Link to income system
- Generate transaction ID
- Return to transaction listing
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

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 ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay transaction add form
`do=show`Show viewDisplay transaction listing
`do=edit&id={id}`Edit viewDisplay 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

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

Audit Trail

---

๐Ÿ“Š 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

---

๐Ÿ› 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:

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

---

Documented By: AI Assistant

Review Status: โœ… Complete (with noted issues)

Next Review: When refactoring/renaming occurs

Recommendation: Rename or refactor to match actual functionality