๐Ÿ“š ERP Documentation Viewer

Beautiful, colorful documentation for your ERP system

Cash Transfer Controller Documentation

File: /controllers/cashTransferController.php

Purpose: Manage cash transfers between bank accounts and cash registers with full transaction tracking

Last Updated: December 20, 2024

Total Functions: 8+

Lines of Code: ~664

---

๐Ÿ“‹ Overview

The Cash Transfer Controller manages cash movements between bank accounts and cash registers, providing complete transaction tracking and accounting integration. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Transaction Tables

Table NamePurposeKey Columns
**cashtransfer**Cash transfer recordscashtransferid, bankaccountid, saveid, cashtransferamount, type, conditions, dailyentryid
**accountmovement**Bank account movementsaccountmovementid, accountid, accountmovementamount, accountmovementtype, processname
**savedaily**Cash register historysavedailyid, saveid, savedailychangeamount, savedailychangetype, processname
### Account Management Tables

Table NamePurposeKey Columns
**bankaccount**Bank account masteraccountid, bankid, accountnumber, accountbeginingbalance, treeId
**save**Cash registerssaveid, savename, savecurrentvalue, treeId
**bank**Bank informationbankid, bankname
### Accounting Integration

Table NamePurposeKey Columns
**dailyentry**Journal entry headersid, dDateTime, entryComment
**dailyentrydebtor**Debit entriesid, dailyentryid, accountstreeid, value
**dailyentrycreditor**Credit entriesid, dailyentryid, accountstreeid, value
**accountstree**Chart of accountsid, customName, parent
### Support Tables

Table NamePurposeKey Columns
**youtubelink**Tutorial videosyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. add() - Create Cash Transfer

Location: Line 254

Purpose: Process new cash transfer with complete transaction handling

Function Signature:

function add()

Process Flow:

1. Extract and validate form parameters

2. Determine transfer type and direction

3. Create cash transfer record

4. Update cash register balance

5. Update bank account balance

6. Create transaction history records

7. Generate accounting entries

8. Commit transaction with safety

Transfer Types:

if ($transfer == 1) { // Bank to Cash Register
    $type = 1;
    $processname = "ุชุญูˆูŠู„ ู†ู‚ุฏูŠ ู…ู† ุงู„ุจู†ูƒ ุฅู„ู‰ ุงู„ุฎุฒู†ุฉ";
    $savedailychangetype = 0; // Cash increase
    $accountmovementtype = 1; // Bank decrease
} else if ($transfer == 2) { // Cash Register to Bank
    $type = 2;
    $processname = "ุชุญูˆูŠู„ ู†ู‚ุฏูŠ ู…ู† ุงู„ุฎุฒู†ุฉ ุฅู„ู‰ ุงู„ุจู†ูƒ";
    $savedailychangetype = 1; // Cash decrease
    $accountmovementtype = 0; // Bank increase
}

Cash Register Balance Update:

$savesData = $saveExt->loadForUpdateEx($saveId);
$saveBefore = $savesData->savecurrentvalue;

if ($transfer == 1) { // Bank to Cash
    $saveAfter = ($savesData->savecurrentvalue + $amount);
} else if ($transfer == 2) { // Cash to Bank
    $saveAfter = ($savesData->savecurrentvalue - $amount);
}

$save->savecurrentvalue = $saveAfter;
$save->saveid = $saveId;
$saveExt->updateSaveValue($save);

Bank Account Balance Update:

$accoundatat = $accountDAO->load($accountid);
$accountBefore = $accoundatat->accountbeginingbalance;

if ($accountmovementtype == 1) { // Bank decrease
    $account->accountbeginingbalance = $accountBefore - $amount;
    $accountmovementafter = $accountBefore - $amount;
} elseif ($accountmovementtype == 0) { // Bank increase
    $account->accountbeginingbalance = $accountBefore + $amount;
    $accountmovementafter = $accountBefore + $amount;
}

$accountExt->updateacount($account);

---

2. Accounting Integration

Location: Line 385-414

Purpose: Create double-entry accounting records for cash transfers

Process Flow:

1. Determine debit and credit accounts based on transfer direction

2. Create daily entry header

3. Set up debtor and creditor arrays

4. Call accounting integration function

5. Update transfer record with daily entry ID

Account Determination Logic:

$baccountData = $accountDAO->load($accountid);
$accountTreeId = $baccountData->treeId;

$saveData = $savesDAO->load($saveId);
$saveTreeId = $saveData->treeId;

if ($transfer == 1) { // Bank to Cash: Debit=Cash, Credit=Bank
    $dailyEntryDebtor->accountstreeid = $saveTreeId;
    $dailyEntryCreditor->accountstreeid = $accountTreeId;
} else { // Cash to Bank: Debit=Bank, Credit=Cash
    $dailyEntryDebtor->accountstreeid = $accountTreeId;
    $dailyEntryCreditor->accountstreeid = $saveTreeId;
}

Daily Entry Creation:

$dailyEntry->dDateTime = date('Y-m-d H:i:s');
$dailyEntry->entryComment = $processname;

$dailyEntryDebtor->value = $amount;
$dailyEntryCreditor->value = $amount;

$returnedData = insertEntery($dailyEntry, $dailyEntryDebtorArray, 
                           $dailyEntryCreditorArray, 1, $cashTransferId, 
                           'cashTransferController.php?do=editprint&id=' . $cashTransferId);

---

3. show() - Transfer History Display

Location: Line 459

Purpose: Display transfer history with flexible filtering options

Function Signature:

function show()

Filtering Options:

1. Date Range Filter: Show transfers between specified dates

2. Cash Register Filter: Show transfers for specific register

3. Default View: Show today's transfers

Filter Logic:

if (isset($to) && $to != "" && isset($from) && $from != "") {
    // Date range filter
    $shownData = $cashTransferExt->queryCashTransferBydate($from, $to);
    $message = "ุนุฑุถ ุงู„ุชุญูˆูŠู„ุงุช ุงู„ู†ู‚ุฏูŠุฉ ู…ู† ุชุงุฑูŠุฎ : " . $from . "  ุงู„ู‰ ุชุงุฑูŠุฎ  " . $to;
    
} elseif (isset($saveid) && $saveid != "-1") {
    // Cash register filter
    $saveData = $savesDAO->load($saveid);
    $shownData = $cashTransferExt->queryCashTransferBySaveId($saveid);
    $message = "ุนุฑุถ ุงู„ุชุญูˆูŠู„ุงุช ุงู„ู†ู‚ุฏูŠุฉ ู…ู† ูˆุฅู„ู‰ ุงู„ุฎุฒู†ุฉ : " . $saveData->savename;
    
} else {
    // Default: today's transfers
    $shownData = $cashTransferExt->queryCashTransferBydate(date("Y-m-d"), date("Y-m-d"));
    $message = "ุนุฑุถ ุงู„ุชุญูˆูŠู„ุงุช ุงู„ู†ู‚ุฏูŠุฉ ู…ู† ุชุงุฑูŠุฎ : " . date("Y-m-d") . "  ุงู„ู‰ ุชุงุฑูŠุฎ :   " . date("Y-m-d");
}

---

4. delete() - Transfer Reversal

Location: Line 493

Purpose: Reverse cash transfer with complete transaction rollback

Function Signature:

function delete($id)

Process Flow:

1. Load original transfer data

2. Reverse cash register balance changes

3. Reverse bank account balance changes

4. Create reversal transaction history

5. Mark transfer as cancelled

6. Reverse accounting entries

7. Commit all changes

Cash Register Reversal:

if ($type == 1) { // Original was bank to cash, so reverse: decrease cash
    $saveAfter = ($savedata->savecurrentvalue - $amount);
    $savedailychangetype = 1;
    $processname = "ุฅู„ุบุงุก ุชุญูˆูŠู„ ู†ู‚ุฏูŠ ู…ู† ุงู„ุจู†ูƒ ุฅู„ู‰ ุงู„ุฎุฒู†ุฉ";
} else if ($type == 2) { // Original was cash to bank, so reverse: increase cash
    $saveAfter = ($savedata->savecurrentvalue + $amount);
    $savedailychangetype = 0;
    $processname = "ุฅู„ุบุงุก ุชุญูˆูŠู„ ู†ู‚ุฏูŠ ู…ู† ุงู„ุฎุฒู†ุฉ ุฅู„ู‰ ุงู„ุจู†ูƒ";
}

Bank Account Reversal:

if ($type == 1) { // Reverse bank decrease
    $accountAfter = $accountBefore + $cashtransferamount;
    $accountmovementtype = 0;
} else if ($type == 2) { // Reverse bank increase
    $accountAfter = $accountBefore - $cashtransferamount;
    $accountmovementtype = 1;
}

---

5. execute() - Batch Operations

Location: Line 612

Purpose: Process batch transfer operations with error handling

Function Signature:

function execute()

Process Flow:

1. Parse operation type and selected transfers

2. Iterate through selected transfer IDs

3. Validate operation permissions

4. Execute operation (currently only deletion supported)

5. Track success/failure for each operation

6. Display consolidated results

Batch Processing Logic:

foreach ($choosedItemArr as $checkId) {
    $checkdata = $cashTransferDAO->load($checkId);
    $conditions = $checkdata->conditions;
    
    if ($operationType == '1' && $conditions == 0) { // Delete if not cancelled
        try {
            $note = delete($checkId);
            if ($note != "sucess") {
                $outputString .= $cashtransfernumber . ": " . $note . "<br/>";
            } else {
                $outputString .= $cashtransfernumber . ": ุชู…ุช ุงู„ุนู…ู„ูŠุฉ ุจู†ุฌุงุญ <br/>";
            }
        } catch (Exception $e) {
            // Error handling
        }
    } else {
        $outputString .= $cashtransfernumber . ": ู„ุง ูŠู…ูƒู† ุงู„ุบุงุก ู‡ุฐุง ุงู„ุดูŠูƒ ู„ุงู†ู‡ ู…ู„ุบู‰ ุณุงุจู‚ุง<br/>";
    }
}

---

6. edit() - Transfer Receipt Display

Location: Line 444

Purpose: Display transfer details for printing

Function Signature:

function edit()

Process Flow:

1. Get transfer ID from URL

2. Load extended transfer data

3. Display via print template

---

7. getSaves() - Cash Register List

Location: Line 247

Purpose: Load available cash registers for selection

Function Signature:

function getSaves()

Returns: Array of active cash register records

---

๐Ÿ”„ Workflows

Workflow 1: Cash Transfer Processing

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Initiate Cash Transfer
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Select Transfer Parameters
- Transfer direction (1=Bankโ†’Cash, 2=Cashโ†’Bank)
- Source bank account
- Target cash register
- Transfer amount
- Notes and reference number
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Validate Transfer Parameters
- Check account balances
- Verify user permissions
- Validate amount > 0
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Create Transfer Record
- Insert into cashtransfer table
- Set initial status (conditions = 0)
- Record user and timestamp
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Update Cash Register Balance
- Load current cash register value
- Calculate new balance based on direction
- Update save table with new amount
- Create savedaily history record
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Update Bank Account Balance
- Load current bank account balance
- Calculate new balance based on direction
- Update bankaccount table
- Create accountmovement history record
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6Create Accounting Entries
- Determine debit and credit accounts
- Create dailyentry header record
- Create dailyentrydebtor record
- Create dailyentrycreditor record
- Link transfer to daily entry
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
7Commit Transaction
- Verify all operations successful
- Commit database transaction
- Generate success message
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Transfer Reversal Process

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Reverse Cash Transfer
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Original Transfer Data
- Get transfer record by ID
- Extract amount, accounts, and type
- Verify transfer can be reversed (conditions = 0)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Reverse Cash Register Changes
- Load current cash register balance
- Apply opposite of original change
- Create reversal savedaily record
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Reverse Bank Account Changes
- Load current bank account balance
- Apply opposite of original change
- Create reversal accountmovement record
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Mark Transfer as Cancelled
- Update conditions field to 1
- Preserve original record for audit trail
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Reverse Accounting Entries
- Call reverseEntryWithItsID() function
- Create offsetting journal entries
- Maintain accounting balance
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6Commit Reversal Transaction
- Verify all reversals successful
- Commit database changes
- Generate success/failure message
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Show formDisplay transfer creation interface
`do=add``add()`Process new cash transfer
`do=show``show()`Display transfer history with filters
`do=editprint``edit()`Show printable transfer receipt
`do=executeOperation``execute()`Process batch operations
`do=delete``delete()`Reverse individual transfer
`do=details`Show detailsDisplay transfer details view
`do=sucess`Show templateDisplay success message
`do=error`Show templateDisplay error message
### Required Parameters by Action

Transfer Creation (do=add):

Transfer History (do=show):

Batch Operations (do=executeOperation):

Transfer Reversal (do=delete):

---

๐Ÿงฎ Balance Calculation Logic

Cash Register Balance Updates

// For Bankโ†’Cash transfers (type 1)
$saveAfter = $saveBefore + $amount;
$savedailychangetype = 0; // Increase

// For Cashโ†’Bank transfers (type 2)  
$saveAfter = $saveBefore - $amount;
$savedailychangetype = 1; // Decrease

Bank Account Balance Updates

// For Bankโ†’Cash transfers (decrease bank)
$accountAfter = $accountBefore - $amount;
$accountmovementtype = 1; // Withdrawal

// For Cashโ†’Bank transfers (increase bank)
$accountAfter = $accountBefore + $amount;
$accountmovementtype = 0; // Deposit

Accounting Entry Logic

// Bankโ†’Cash: Debit Cash Account, Credit Bank Account
if ($transfer == 1) {
    $dailyEntryDebtor->accountstreeid = $saveTreeId;    // Cash register
    $dailyEntryCreditor->accountstreeid = $accountTreeId; // Bank account
}

// Cashโ†’Bank: Debit Bank Account, Credit Cash Account
else {
    $dailyEntryDebtor->accountstreeid = $accountTreeId;   // Bank account
    $dailyEntryCreditor->accountstreeid = $saveTreeId;    // Cash register
}

---

๐Ÿ“Š Transaction Safety Features

Database Transactions

$cashTransactions = new Transaction();
try {
    // All operations here
    $cashTransactions->commit();
    $message = 'ุชู…ุช ุงู„ุนู…ู„ูŠุฉ ุจู†ุฌุงุญ';
} catch (Exception $ex) {
    $cashTransactions->rollback();
    $message = 'ุนููˆุง ู„ู‚ุฏ ุญุฏุซ ุฎุทุฃ';
}

Audit Trail Maintenance

Error Recovery

---

๐Ÿ”’ Security & Validation

Access Control

include_once("../public/authentication.php");

Input Validation

Transaction Integrity

---

๐Ÿ› Common Issues & Troubleshooting

1. Balance Inconsistencies

Issue: Cash register and bank balances don't match transaction history

Cause: Interrupted transactions or rollback failures

Debug:

-- Check balance vs. transaction sum
SELECT s.savename, s.savecurrentvalue,
       SUM(CASE WHEN sd.savedailychangetype = 0 THEN sd.savedailychangeamount ELSE -sd.savedailychangeamount END) as calculated
FROM save s
LEFT JOIN savedaily sd ON sd.saveid = s.saveid
GROUP BY s.saveid;

2. Accounting Entry Mismatches

Issue: Daily entries don't balance

Cause: Incorrect debit/credit assignment

Fix: Verify account tree IDs and transfer direction logic

3. Transfer Reversal Failures

Issue: Cannot reverse completed transfers

Cause: Missing daily entry ID or permissions

Solution: Verify dailyentryid is populated and user has reversal permissions

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur

โ†‘