Bankaccount Documentation

Bank Account Controller Documentation

File: /controllers/bankaccountController.php

Purpose: Complete CRUD management of bank accounts with accounting integration and balance tracking

Last Updated: December 20, 2024

Total Functions: 15

Lines of Code: ~769

---

๐Ÿ“‹ Overview

The Bank Account Controller is a comprehensive financial module that manages all aspects of bank account operations within the ERP system. It provides:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**bankaccount**Bank account master dataaccountid, accountname, accountnumber, accountbeginingbalance, bankid, visa, visaDisPer, treeId, conditions, userid
**bank**Bank master informationbankid, bankname, bankcode
**accountmovement**Account transaction logaccountmovementid, accountid, accountmovementamount, accountmovementbefore, accountmovementafter, tablename
### Accounting Integration Tables

Table NamePurposeKey Columns
**accountstree**Chart of accountsaccountstreeid, name, parentid, accounttype, customName
**dailyentry**Journal entry headersdailyentryid, entryComment, entryDate
**dailyentrycreditor**Credit side entriesdailyentrycreditorid, dailyentryid, accountstreeid, value
**dailyentrydebtor**Debit side entriesdailyentrydebtoreid, dailyentryid, accountstreeid, value
### Reference Tables

Table NamePurposeKey Columns
**youtubelink**Tutorial/help linksyoutubelinkid, title, url
**user**System usersuserid, username
---

๐Ÿ—„๏ธ Database Schema Details

bankaccount Table Structure

CREATE TABLE bankaccount (
    accountid INT PRIMARY KEY AUTO_INCREMENT,
    accountname VARCHAR(255) NOT NULL,
    accountnumber VARCHAR(100),
    accountbeginingbalance DECIMAL(15,2) DEFAULT 0.00,
    accountcurrencytype VARCHAR(10) DEFAULT 'USD',
    accountdate DATE,
    bankid INT NOT NULL,
    visa TINYINT DEFAULT 0, -- 0=regular, 1=visa card account
    visaDisPer DECIMAL(5,2) DEFAULT 0.00, -- Visa discount percentage
    treeId INT, -- Link to chart of accounts
    conditions TINYINT DEFAULT 0, -- 0=active, 1=inactive
    userid INT,
    webApiId INT DEFAULT 0, -- External API integration ID
    comment TEXT,
    FOREIGN KEY (bankid) REFERENCES bank(bankid),
    FOREIGN KEY (treeId) REFERENCES accountstree(accountstreeid),
    FOREIGN KEY (userid) REFERENCES user(userid)
);

---

๐Ÿ”‘ Key Functions

1. Default Action - Add Account Form

Location: Line 122

Purpose: Display form for creating new bank accounts

Process Flow:

1. Load Available Banks:

   $bankData = loadBanks();
   $smarty->assign("bankData", $bankData);
   ```

2. **Setup Navigation**:
   ```php
   $breadcrumbObject->add('ุงุฏุงุฑุฉ ุงู„ุจู†ูˆูƒ><a href="bankaccountController.php?do=show">ุญุณุงุจุงุช ุงู„ุจู†ูˆูƒ</a> > ุงุถุงูุฉ ุญุณุงุจ', 'bankaccountController.php', 0);
   ```

3. **Display Form**: Uses `add.html` template with bank dropdown

---

### 2. **add()** - Create New Bank Account
**Location**: Line 388  
**Purpose**: Complete bank account creation with accounting integration

**Function Signature**:
php

function add()

**Process Flow**:

#### **Step 1: Extract and Validate Form Data**
php

$bankId = $_POST['bankid'];

$accountName = $_POST['accountname'];

$accountNumber = $_POST['accountnumber'];

$accountBeginingbalance = $_POST['accountbeginingbalance'];

$accountCurrencytype = $_POST['accountcurrencytype'];

$comment = $_POST['comment'];

$visa = (int) $_POST['visa'];

$visaDisPer = (float) $_POST['visaDisPer'];

#### **Step 2: Create Account Record**
php

$myBankaccount->accountbeginingbalance = $accountBeginingbalance;

$myBankaccount->accountcurrencytype = $accountCurrencytype;

$myBankaccount->accountdate = date("Y-m-d");

$myBankaccount->accountname = $accountName;

$myBankaccount->accountnumber = $accountNumber;

$myBankaccount->bankid = $bankId;

$myBankaccount->visa = $visa;

$myBankaccount->visaDisPer = $visaDisPer;

$myBankaccount->conditions = 0; // Active by default

$myBankaccount->userid = $_SESSION["userid"];

$myBankaccount->webApiId = (int) $_POST['webApiId'];

$accountId = $myBankaccountRecord->insert($myBankaccount, $comment);

#### **Step 3: Create Initial Account Movement (if balance > 0)**
php

if ($accountBeginingbalance > 0) {

insertAccountmovement(0, $accountBeginingbalance, 0, $accountBeginingbalance,

"ุงุถุงูุฉ ุญุณุงุจ ูู‰ ุจู†ูƒ", $accountId, $accountId, $bankId, "bankaccountController.php");

}

#### **Step 4: Integrate with Chart of Accounts**
php

$bankData = $myBankRecord->load($bankId);

$treeid = addTreeElement("$accountName / $bankData->bankname", 38, 3, 0, 1, '', 0, 0);

$myBankaccount->treeId = $treeid;

$myBankaccountRecord->update($myBankaccount, $comment);

#### **Step 5: Generate Opening Journal Entry**
php

$dailyEntry->entryComment = 'ุชู… ุงุถุงูุฉ ุญุณุงุจ ' . $accountName;

// Debit: Bank Account (Asset)

$dailyEntryDebtor->accountstreeid = $treeid;

$dailyEntryDebtor->value = $accountBeginingbalance;

// Credit: Equity/Capital Account

$dailyEntryCreditor->accountstreeid = 121; // Capital account

$dailyEntryCreditor->value = $accountBeginingbalance;

insertEntery($dailyEntry, $dailyEntryDebtorArray, $dailyEntryCreditorArray, 1);

**Return Value**: 1 on success, 2 on error

---

### 3. **show()** - Display Account List
**Location**: Line 170  
**Purpose**: Show all bank accounts or filter by specific bank

**Process Flow**:
1. **Determine Display Mode**:
   ```php
   $bankId = $_REQUEST['bankid'];
   if (isset($bankId) && $bankId != "-1") {
       $bankaccountData = showByBankId($bankId);
   } else {
       $bankaccountData = showAll();
   }
   ```

2. **Load Support Data**:
   ```php
   $bankData = loadBanks();
   $youtubes = $youtubeLinkDAO->queryAll();
   ```

3. **Display Results**: Uses `show.html` template with account listing

---

### 4. **showAll()** - Load All Accounts
**Location**: Line 478  
**Purpose**: Retrieve all bank accounts with ordering

**Function Signature**:
php

function showAll()

**Implementation**:
php

global $myBankaccountEx;

$bankaccountData = $myBankaccountEx->queryWithOrder();

return $bankaccountData;

---

### 5. **showByBankId($bankid)** - Filter by Bank
**Location**: Line 488  
**Purpose**: Retrieve accounts for specific bank

**Function Signature**:
php

function showByBankId($bankid)

**Implementation**:
php

global $myBankaccountEx;

$bankaccountData = $myBankaccountEx->queryWithBankId($bankid);

return $bankaccountData;

---

### 6. **edit()** - Load Account for Editing
**Location**: Line 566  
**Purpose**: Load specific account data for modification

**Function Signature**:
php

function edit()

**Process Flow**:
php

$accountId = $_GET['accountid'];

$loadData = $myBankaccountEx->loadBankAccount($accountId);

return $loadData;

**Used by**: Edit form (`do=edit`) and details view (`do=details`)

---

### 7. **update()** - Modify Existing Account
**Location**: Line 578  
**Purpose**: Update account information with chart of accounts synchronization

**Function Signature**:
php

function update()

**Process Flow**:

#### **Step 1: Extract Update Data**
php

$bankId = $_POST['bankid'];

$accountName = $_POST['accountname'];

$accountNumber = $_POST['accountnumber'];

$accountBeginingbalance = $_POST['accountbeginingbalance'];

$accountCurrencytype = $_POST['accountcurrencytype'];

$visa = (int) $_POST['visa'];

$visaDisPer = (float) $_POST['visaDisPer'];

$accountId = $_POST['accountid'];

#### **Step 2: Load Current Data**
php

$oldData = $myBankaccountRecord->load($accountId);

#### **Step 3: Update Account Record**
php

$myBankaccount->accountbeginingbalance = $accountBeginingbalance;

$myBankaccount->accountcurrencytype = $accountCurrencytype;

$myBankaccount->accountname = $accountName;

$myBankaccount->accountnumber = $accountNumber;

$myBankaccount->bankid = $bankId;

$myBankaccount->visa = $visa;

$myBankaccount->visaDisPer = $visaDisPer;

$myBankaccount->treeId = $oldData->treeId;

$myBankaccount->accountid = $accountId;

$myBankaccountRecord->update($myBankaccount, $comment);

#### **Step 4: Update Chart of Accounts**
php

$treeId = $oldData->treeId;

$treedata = $accountsTreeDAO->load($treeId);

$bankData = $myBankRecord->load($bankId);

$treedata->name = "$accountName / $bankData->bankname";

$treedata->customName = "$accountName / $bankData->bankname";

editTreeElement($treedata);

**Return Value**: 1 on success, 2 on error

---

### 8. **deletetemp($accountId)** - Deactivate Account
**Location**: Line 498  
**Purpose**: Soft delete (deactivate) bank account

**Function Signature**:
php

function deletetemp($accountId)

**Process Flow**:
php

$myBankaccount->accountdate = date("Y-m-d");

$myBankaccount->conditions = 1; // Set to inactive

$myBankaccount->userid = $_SESSION["userid"];

$myBankaccount->accountid = $accountId;

$myBankaccountEx->updateConditions($myBankaccount);

**Return Value**: 1 on success, 2 on error

---

### 9. **returndelete($accountId)** - Reactivate Account
**Location**: Line 533  
**Purpose**: Restore previously deactivated account

**Function Signature**:
php

function returndelete($accountId)

**Process Flow**:
php

$myBankaccount->accountdate = date("Y-m-d");

$myBankaccount->conditions = 0; // Set to active

$myBankaccount->userid = $_SESSION["userid"];

$myBankaccount->accountid = $accountId;

$myBankaccountEx->updateConditions($myBankaccount);

---

### 10. **executeOperation()** - Bulk Operations
**Location**: Line 638  
**Purpose**: Execute bulk operations on multiple accounts

**Function Signature**:
php

function executeOperation()

**Process Flow**:
1. **Extract Operation Parameters**:
   ```php
   $operationType = $_POST['operation'];
   $choosedItemArr = $_POST['choosedItem'];
   ```

2. **Process Each Selected Account**:
   ```php
   foreach ($choosedItemArr as $accountId) {
       $bankaccountData = $myBankaccountRecord->load($accountId);
       $accountName = $bankaccountData->accountname;
       
       if ($operationType == '1') {
           deletetemp($accountId); // Deactivate
       } elseif ($operationType == "2") {
           returndelete($accountId); // Reactivate
       } elseif ($operationType == "3") {
           delete($accountId); // Hard delete
       }
   }
   ```

3. **Generate Operation Report**: Creates summary of completed operations

---

### 11. **Balance Management Functions**

#### **getAccountBalanceBefore($accountid)**
**Location**: Line 689  
**Purpose**: Retrieve current account balance
php

function getAccountBalanceBefore($accountid) {

global $myBankaccountRecord;

$bankaccountData = $myBankaccountRecord->load($accountid);

return $bankaccountData->accountbeginingbalance;

}

#### **getAccountBalanceAndPlus($accountid, $amount)**  
**Location**: Line 701
**Purpose**: Calculate balance after addition
php

function getAccountBalanceAndPlus($accountid, $accountmovementamount) {

$bankaccountData = $myBankaccountRecord->load($accountid);

$accountBalanceBefore = $bankaccountData->accountbeginingbalance;

$accountBalanceAfter = $accountBalanceBefore + $accountmovementamount;

return array($accountBalanceBefore, $accountBalanceAfter);

}

#### **getAccountBalanceAndMins($accountid, $amount)**
**Location**: Line 716  
**Purpose**: Calculate balance after subtraction
php

function getAccountBalanceAndMins($accountid, $accountmovementamount) {

$bankaccountData = $myBankaccountRecord->load($accountid);

$accountBalanceBefore = $bankaccountData->accountbeginingbalance;

$accountBalanceAfter = $accountBalanceBefore - $accountmovementamount;

return array($accountBalanceBefore, $accountBalanceAfter);

}

#### **updateBankAccount($accountid, $newBalance)**
**Location**: Line 731  
**Purpose**: Update account balance after transactions
php

function updateBankAccount($accountid, $accountBalanceAfter) {

global $myBankaccount;

global $myBankaccountEx;

$myBankaccount->accountbeginingbalance = $accountBalanceAfter;

$myBankaccount->userid = $_SESSION['userid'];

$myBankaccount->accountid = $accountid;

$myBankaccountEx->updateAccountbeginingbalance($myBankaccount);

}

---

### 12. **insertAccountmovement()** - Transaction Logging
**Location**: Line 746  
**Purpose**: Create account movement record for audit trail

**Function Signature**:
php

function insertAccountmovement($accountbefore, $accountamount, $accountmovementtype,

$accountafter, $processname, $accountmovementmodelid, $accountid, $bankid, $tablename)

**Implementation**:
php

$myAccountmovement->accountid = $accountid;

$myAccountmovement->accountmovementafter = $accountafter;

$myAccountmovement->accountmovementamount = $accountamount;

$myAccountmovement->accountmovementbefore = $accountbefore;

$myAccountmovement->accountmovementdate = date("Y-m-d H:i:s");

$myAccountmovement->accountmovementmodelid = $accountmovementmodelid;

$myAccountmovement->accountmovementtype = $accountmovementtype;

$myAccountmovement->bankid = $bankid;

$myAccountmovement->processname = $processname;

$myAccountmovement->tablename = $tablename;

$myAccountmovement->userid = $_SESSION['userid'];

$myAccountmovementRecord->insert($myAccountmovement);

---

## ๐Ÿ”„ Workflows

### Workflow 1: Bank Account Creation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ START: Create New Bank Account โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 1. Display Account Creation Form โ”‚

โ”‚ - Load available banks for selection โ”‚

โ”‚ - Show account configuration options โ”‚

โ”‚ - Include currency and Visa card settings โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 2. Process Form Submission โ”‚

โ”‚ - Validate required fields โ”‚

โ”‚ - Extract account details โ”‚

โ”‚ - Begin database transaction โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 3. Create Account Record โ”‚

โ”‚ - Insert into bankaccount table โ”‚

โ”‚ - Set initial balance and configuration โ”‚

โ”‚ - Assign to current user โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 4. Chart of Accounts Integration โ”‚

โ”‚ - Create account tree element โ”‚

โ”‚ - Set account hierarchy (under Bank Assets) โ”‚

โ”‚ - Update account with tree ID โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 5. Create Initial Account Movement (if balance > 0) โ”‚

โ”‚ - Log opening balance transaction โ”‚

โ”‚ - Record in accountmovement table โ”‚

โ”‚ - Set source as bankaccountController โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 6. Generate Opening Journal Entry โ”‚

โ”‚ - Create daily entry header โ”‚

โ”‚ - Debit: Bank Account (Asset) โ”‚

โ”‚ - Credit: Capital/Equity Account โ”‚

โ”‚ - Amount: Opening balance โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 7. Commit Transaction โ”‚

โ”‚ - Finalize all database changes โ”‚

โ”‚ - Return success/error status โ”‚

โ”‚ - Redirect to appropriate page โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

### Workflow 2: Account Balance Management

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ START: Account Transaction Occurs โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 1. Load Current Account Balance โ”‚

โ”‚ - Query bankaccount table โ”‚

โ”‚ - Get accountbeginingbalance โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 2. Calculate New Balance โ”‚

โ”‚ - For deposits: balance + amount โ”‚

โ”‚ - For withdrawals: balance - amount โ”‚

โ”‚ - Validate sufficient funds (if required) โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 3. Create Account Movement Record โ”‚

โ”‚ - Record before/after balances โ”‚

โ”‚ - Set transaction amount and type โ”‚

โ”‚ - Link to source transaction โ”‚

โ”‚ - Set process description โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 4. Update Account Balance โ”‚

โ”‚ - Update accountbeginingbalance โ”‚

โ”‚ - Set modification timestamp โ”‚

โ”‚ - Record modifying user โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”‚

โ–ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”

โ”‚ 5. Generate Journal Entry (if applicable) โ”‚

โ”‚ - Create appropriate debit/credit entries โ”‚

โ”‚ - Link to transaction source โ”‚

โ”‚ - Maintain accounting equation balance โ”‚

โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

## ๐ŸŒ URL Routes & Actions

| URL Parameter | Function Called | Description |
|---------------|----------------|-------------|
| `do=` (empty) | Default action | Display add account form |
| `do=add` | `add()` | Process new account creation |
| `do=show` | Display accounts | Show account list (all or by bank) |
| `do=edit` | `edit()` | Load account for modification |
| `do=update` | `update()` | Process account updates |
| `do=details` | `edit()` | View account details (read-only) |
| `do=deletetemp` | `deletetemp()` | Deactivate account |
| `do=returndelete` | `returndelete()` | Reactivate account |
| `do=executeOperation` | `executeOperation()` | Execute bulk operations |
| `do=sucess` | - | Show success message |
| `do=error` | - | Show error message |

### Required Parameters by Action

**Add Account** (`do=add`):
- `bankid` - Bank ID (required)
- `accountname` - Account name (required)
- `accountnumber` - Account number (optional)
- `accountbeginingbalance` - Opening balance (required)
- `accountcurrencytype` - Currency type (required)
- `visa` - Visa card flag (0/1)
- `visaDisPer` - Visa discount percentage
- `webApiId` - External API ID (optional)
- `comment` - Description (optional)

**Show Accounts** (`do=show`):
- `bankid` - Bank filter (-1 for all banks)

**Update Account** (`do=update`):
- `accountid` - Account ID (required)
- All fields from add operation
- `accountdate` - Account modification date
- `conditions` - Account status (0=active, 1=inactive)

**Bulk Operations** (`do=executeOperation`):
- `operation` - Operation type (1=deactivate, 2=reactivate, 3=delete)
- `choosedItem[]` - Array of account IDs

---

## ๐Ÿงฎ Calculation Methods

### Balance Calculations
php

// Current balance retrieval

$currentBalance = getAccountBalanceBefore($accountid);

// Addition calculation

list($balanceBefore, $balanceAfter) = getAccountBalanceAndPlus($accountid, $amount);

// Subtraction calculation

list($balanceBefore, $balanceAfter) = getAccountBalanceAndMins($accountid, $amount);

// Balance update

updateBankAccount($accountid, $newBalance);

### Journal Entry Logic
php

// Opening balance entry (account creation)

// Debit: Bank Account (Asset) - Increases asset

// Credit: Capital Account (Equity) - Increases equity

// Transaction entries handled by individual controllers

// Each controller calls balance update functions

---

## ๐Ÿ”’ Security & Permissions

### Authentication & Authorization
- All actions require authentication: `include_once("../public/authentication.php")`
- User ownership tracking in all records
- Session-based user identification
- Transaction-based operations for data consistency

### Input Validation
php

// Secure input handling

$bankId = $_POST['bankid']; // Required bank selection

$accountName = $_POST['accountname']; // Required account name

$accountBeginingbalance = $_POST['accountbeginingbalance']; // Numeric validation

$visa = (int) $_POST['visa']; // Type casting for safety

$visaDisPer = (float) $_POST['visaDisPer']; // Float validation

### Transaction Safety
- Database transactions for atomic operations
- Rollback on errors to maintain data integrity
- Foreign key constraints for referential integrity
- Audit trail through account movement logging

---

## ๐ŸŽฏ Special Features

### 1. **Visa Card Integration**
php

// Visa card account configuration

$myBankaccount->visa = $visa; // 0=regular account, 1=visa account

$myBankaccount->visaDisPer = $visaDisPer; // Discount percentage for visa transactions

### 2. **Multi-Currency Support**
php

// Currency type configuration

$myBankaccount->accountcurrencytype = $accountCurrencytype; // USD, EUR, etc.

### 3. **API Integration**
php

// External banking API integration

$myBankaccount->webApiId = (int) $_POST['webApiId']; // External system reference

### 4. **Chart of Accounts Integration**
php

// Automatic account hierarchy management

$treeid = addTreeElement("$accountName / $bankData->bankname", 38, 3, 0, 1, '', 0, 0);

// Links bank account to chart of accounts for financial reporting

### 5. **CURL/API Support**
php

// API response handling

if (isset($_POST['curlpost']) && $_POST['curlpost'] == 1) {

// Return JSON response for API calls

$data = array('status' => 1, 'message' => 'ุชู…ุช ุงู„ุนู…ู„ูŠู‡ ุจู†ุฌุงุญ', 'message_en' => 'Success');

echo json_encode($data);

} else {

// Regular web interface redirect

header("location:?do=sucess");

}

---

## ๐Ÿงช Common Use Cases

### 1. **New Bank Account Setup**

Scenario: Company opens new checking account

### 2. **Visa Card Account Configuration**

Scenario: Setup company credit card account

### 3. **Account Deactivation**

Scenario: Close old account

### 4. **Multi-Currency Account**

Scenario: International business operations

---

## ๐Ÿ› Troubleshooting

### Common Issues

1. **Chart of Accounts Integration Failure**
   ```
   Issue: Account created but no tree element
   Cause: addTreeElement() function failure
   Solution: Check accounts tree table and parent ID 38 exists
   ```

2. **Balance Calculation Errors**
   ```
   Issue: Account balance doesn't match transaction history
   Cause: Missing or incorrect account movements
   Solution: Verify accountmovement table completeness
   ```

3. **Journal Entry Missing**
   ```
   Issue: Opening balance created but no journal entry
   Cause: insertEntery() function failure
   Solution: Check daily entry tables and function availability
   ```

### Debug Queries
sql

-- Check account and tree integration

SELECT ba.accountname, ba.accountbeginingbalance, at.name, at.accountstreeid

FROM bankaccount ba

LEFT JOIN accountstree at ON ba.treeId = at.accountstreeid

WHERE ba.conditions = 0;

-- Verify account movements

SELECT accountid, SUM(CASE WHEN accountmovementtype = 0 THEN accountmovementamount ELSE -accountmovementamount END) as net_movement

FROM accountmovement

GROUP BY accountid;

-- Check journal entry consistency

SELECT de.entryComment, SUM(dedd.value) as total_debit, SUM(dedc.value) as total_credit

FROM dailyentry de

LEFT JOIN dailyentrydebtor dedd ON de.dailyentryid = dedd.dailyentryid

LEFT JOIN dailyentrycreditor dedc ON de.dailyentryid = dedc.dailyentryid

WHERE de.entryComment LIKE '%ุญุณุงุจ%'

GROUP BY de.dailyentryid;

```

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When API integration features are enhanced