๐Ÿ“š ERP Documentation Viewer

Beautiful, colorful documentation for your ERP system

Partner Transfer Between Controller Documentation

File: /controllers/partnerTransferBetweenController.php

Purpose: Inter-partner fund transfer management system

Last Updated: December 20, 2024

Total Functions: 6

Lines of Code: ~672

---

๐Ÿ“‹ Overview

The Partner Transfer Between Controller manages financial transfers between business partners within the system. It provides:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**partnertransferbetween**Transfer transactionspartnertransferbetweenid, partneridfrom, partneridto, partnervalue, partnerfrombefore, partnerfromafter, partnertobefore, partnertoafter, dailyentryid, conditions
**partner**Partner master datapartnerid, partnername, partnermoney, treeId
### Financial Tables (Referenced)

Table NamePurposeKey Columns
**dailyentry**Accounting journal entriesdailyentryid, entryComment, totalcreditor, totalDebtor
**dailyentrycreditor**Credit side entriesdailyentrycreditorid, dailyentryid, accountstreeid, value
**dailyentrydebtor**Debit side entriesdailyentrydebtoryid, dailyentryid, accountstreeid, value
**accountstree**Chart of accountsaccountstreeid, accountname, parentid
### Supporting Tables

Table NamePurposeKey Columns
**bankaccount**Bank account dataaccountid, bankid, accountbeginingbalance, treeId
**accountmovement**Bank account historyaccountmovementid, accountid, amountbefore, amountafter, movementtype
**user**System usersuserid, username, searchinonesave
**youtubelink**Tutorial videosyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. add() / Transfer Execution - Core Transfer Logic

Location: Line 290

Purpose: Execute fund transfer between two partners with full accounting integration

Function Signature:

function add()
// Triggered when: do=add
$partneridfrom = $_POST['partneridfrom'];
$partneridto = $_POST['partneridto'];
$partnervalue = $_POST['partnervalue'];

Process Flow:

1. Load partner data for from/to partners

2. Record transfer with before/after balances

3. Generate accounting daily entry

4. Update both partner balances directly

5. Create complete audit trail

Key Features:

// Record exact balances before transfer
$myPartnertransferbetween->partnerfrombefore = $partnerfromdata->partnermoney;
$myPartnertransferbetween->partnerfromafter = $partnerfromdata->partnermoney - $partnervalue;
$myPartnertransferbetween->partnertobefore = $partnertodata->partnermoney;
$myPartnertransferbetween->partnertoafter = $partnertodata->partnermoney + $partnervalue;

// Update partner balances atomically
R::exec("UPDATE `partner` SET `partnermoney`= partnermoney - " . $partnervalue . "  WHERE partnerid = '" . $partneridfrom . "' ");
R::exec("UPDATE `partner` SET `partnermoney`= partnermoney + " . $partnervalue . "  WHERE partnerid = '" . $partneridto . "' ");

---

2. tempdelete() / Transfer Reversal - Complete Transaction Reversal

Location: Line 329

Purpose: Reverse a transfer by creating an opposite transaction

Function Signature:

function tempdelete($partnertransferbetweenid)
// Creates reverse transaction instead of deletion

Process Flow:

1. Load original transfer record

2. Mark original transfer as deleted (conditions=1)

3. Create reverse transfer record

4. Swap from/to partners in reverse transaction

5. Update partner balances with reverse amounts

6. Reverse the original daily entry

Reversal Logic:

// Original: Partner A โ†’ Partner B ($100)
// Reversal: Partner B โ†’ Partner A ($100)
$myPartnertransferbetween->partneridfrom = $originalTransfer->partneridto;
$myPartnertransferbetween->partneridto = $originalTransfer->partneridfrom;
$myPartnertransferbetween->partnervalue = $originalTransfer->partnervalue;

// Reverse the daily entry
reverseEntryWithItsID($originalTransfer->dailyentryid);

---

3. loadPartner() / Partner Data Loading - Available Partner List

Location: Line 279

Purpose: Load all active partners for transfer selection

Function Signature:

function loadPartner()
// Returns: Array of active partners (conditions=0)

---

4. edit() / Transfer Edit Form - Load Transfer for Editing

Location: Line 367

Purpose: Load transfer data for modification

Function Signature:

function edit()
// URL Parameter: partnertransferbetweenid
// Returns: Transfer record with partner details

---

5. update() / Transfer Update Process - Edit Existing Transfer

Location: Line 250 (within main flow)

Purpose: Update transfer by deleting old and creating new

Process Flow:

1. Load old transfer ID from form

2. Delete/reverse old transfer

3. Create new transfer with updated values

4. Maintain audit trail continuity

---

6. makePartnerTransferDailyEntry() / Accounting Integration - Journal Entry Creation

Location: Line 646

Purpose: Generate proper accounting entries for partner transfers

Function Signature:

function makePartnerTransferDailyEntry($partneridfrom, $partneridto, $partnerMoney)
// Returns: Daily entry ID for linking

Accounting Logic:

// Transfer from Partner A to Partner B
// Debit Partner A account (decrease their equity)
$dailyEntryDebtor->accountstreeid = $partnerFrom['treeId'];

// Credit Partner B account (increase their equity)  
$dailyEntryCreditor->accountstreeid = $partnerTo['treeId'];

// Both sides equal the transfer amount
$dailyEntryDebtor->value = $partnerMoney;
$dailyEntryCreditor->value = $partnerMoney;

---

๐Ÿ”„ Workflows

Workflow 1: Partner Transfer Execution

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Partner Transfer Request
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Select Transfer Partners
- Choose source partner (from)
- Choose destination partner (to)
- Enter transfer amount
- Add transfer description
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Validate Transfer
- Check partner exists and is active
- Verify sufficient balance (if enforced)
- Confirm partners are different
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Record Transfer Details
- Capture current balances (before)
- Calculate resulting balances (after)
- Store transfer metadata
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Generate Accounting Entry
- Create daily entry with description
- Debit source partner account
- Credit destination partner account
- Link entry to transfer record
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Update Partner Balances
- Decrease source partner balance
- Increase destination partner balance
- Maintain balance integrity
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6Complete Transfer
- Save all changes to database
- Return success confirmation
- Display updated balances
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Transfer Reversal Process

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Transfer Reversal Request
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Original Transfer
- Find transfer by ID
- Verify transfer exists and is active
- Load all transfer details
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Mark Original as Deleted
- Set conditions=1 (soft delete)
- Preserve original record for audit
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Create Reverse Transaction
- Swap from/to partners
- Use same transfer amount
- Calculate reverse balance impacts
- Set conditions=1 (marked as reversal)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Update Partner Balances
- Restore original source partner balance
- Reduce destination partner balance
- Use direct SQL updates for atomicity
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Reverse Accounting Entry
- Call reverseEntryWithItsID()
- Create offsetting journal entry
- Maintain accounting balance
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6Complete Reversal
- Save all changes
- Return success status
- Update display with corrected balances
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default displayTransfer form with partner selection
`do=add``add()`Execute new transfer
`do=show`Transfer historyDisplay transfers with filters
`do=tempdelete``tempdelete()`Reverse/cancel transfer
`do=edit``edit()`Load transfer for editing
`do=update`Update processDelete old, create new transfer
### Required Parameters by Action

New Transfer (do=add):

Transfer History (do=show):

Transfer Reversal (do=tempdelete):

Transfer Edit (do=edit):

---

๐Ÿงฎ Calculation Methods

Balance Calculation

// Before transfer balances
$partnerfrombefore = $partnerfromdata->partnermoney;
$partnertobefore = $partnertodata->partnermoney;

// After transfer balances
$partnerfromafter = $partnerfromdata->partnermoney - $partnervalue;
$partnertoafter = $partnertodata->partnermoney + $partnervalue;

Transfer Impact

// Direct partner balance updates
UPDATE partner SET partnermoney = partnermoney - {amount} WHERE partnerid = {from};
UPDATE partner SET partnermoney = partnermoney + {amount} WHERE partnerid = {to};

Accounting Entry

// Debit source partner (their equity decreases)
$dailyEntryDebtor->value = $partnerMoney;
$dailyEntryDebtor->accountstreeid = $partnerFrom['treeId'];

// Credit destination partner (their equity increases)
$dailyEntryCreditor->value = $partnerMoney;
$dailyEntryCreditor->accountstreeid = $partnerTo['treeId'];

---

๐Ÿ”’ Security & Permissions

Authentication Requirements

include_once("../public/authentication.php");
// Required for all operations

Input Validation

Data Integrity

User Permissions

$userData = $myUserRecord->load($_SESSION['userid']);
// User context maintained throughout operations

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Required Indexes:

- partnertransferbetween(partneridfrom, partneridto, partnerdate)

- partnertransferbetween(conditions, partnerdate) - For active transfers

- partner(partnerid, conditions) - For balance lookups

2. Query Optimization:

- Direct SQL updates for balance changes (faster than ORM)

- Efficient date range filtering

- Partner lookup optimization

3. Memory Considerations:

- Transfer history can grow large over time

- Consider pagination for large date ranges

Performance Features

// Efficient partner balance updates
R::exec("UPDATE `partner` SET `partnermoney`= partnermoney - " . $partnervalue . "  WHERE partnerid = '" . $partneridfrom . "' ");
// Using direct SQL instead of ORM for better performance

---

๐Ÿ› Common Issues & Troubleshooting

1. Balance Synchronization Issues

Issue: Partner balances don't match transfer history

Cause: Failed or incomplete transfers

Debug:

-- Check partner balance vs transfer history
SELECT p.partnerid, p.partnername, p.partnermoney,
       SUM(CASE WHEN pt.partneridto = p.partnerid THEN pt.partnervalue ELSE 0 END) as received,
       SUM(CASE WHEN pt.partneridfrom = p.partnerid THEN pt.partnervalue ELSE 0 END) as sent
FROM partner p
LEFT JOIN partnertransferbetween pt ON (p.partnerid = pt.partneridfrom OR p.partnerid = pt.partneridto)
WHERE pt.conditions = 0
GROUP BY p.partnerid;

2. Transfer Reversal Problems

Issue: Reversed transfer doesn't restore original balances

Cause: Intervening transactions or calculation errors

Fix:

// Verify reversal calculations
$originalFrom = R::getRow('select * from partner where partnerid = ?', [$originalTransfer->partneridfrom]);
$expectedBalance = $originalFrom['partnermoney'] + $originalTransfer->partnervalue;

3. Accounting Entry Mismatches

Issue: Daily entries don't balance after transfers

Cause: Failed entry generation or reversal

Debug:

-- Find unbalanced daily entries
SELECT de.*, pt.partnertransferbetweenid
FROM dailyentry de
JOIN partnertransferbetween pt ON de.dailyentryid = pt.dailyentryid
WHERE de.totalcreditor != de.totalDebtor;

4. Partner Selection Issues

Issue: Inactive partners appear in transfer forms

Cause: Incorrect conditions filtering

Fix:

// Ensure only active partners loaded
$partnerData = $myPartnerRecord->queryByConditions(0); // conditions=0 for active

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Transfer

1. Access transfer form (empty do)
2. Select two different active partners
3. Enter valid transfer amount
4. Submit transfer (do=add)
5. Verify both partner balances updated correctly
6. Check transfer appears in history
7. Confirm accounting entry created

Test Case 2: Transfer Reversal

1. Create a test transfer
2. Note original partner balances
3. Reverse the transfer (tempdelete)
4. Verify balances restored to original amounts
5. Check original transfer marked as deleted
6. Confirm reversal transfer created
7. Verify accounting entries reversed

Test Case 3: Transfer Filtering

1. Create multiple transfers over different dates
2. Test date range filtering
3. Test partner-specific filtering
4. Verify filter combinations work correctly
5. Check empty result handling

Test Case 4: Edge Cases

1. Test transfer to same partner (should fail/prevent)
2. Test zero amount transfer
3. Test negative amount transfer
4. Test transfer with inactive partner
5. Verify proper error handling for each case

Debug Mode Enable

// Add transfer logging
error_log("Transfer: {$partneridfrom} โ†’ {$partneridto}, Amount: {$partnervalue}");
error_log("Before: From={$partnerfrombefore}, To={$partnertobefore}");
error_log("After: From={$partnerfromafter}, To={$partnertoafter}");

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When transfer business rules change

โ†‘