Cashflows Documentation

Cash Flows Controller Documentation

File: /controllers/cashflowsController.php

Purpose: Simplified daily treasury report focusing on cash flow transactions and summaries

Last Updated: December 20, 2024

Total Functions: 6

Lines of Code: ~731

---

๐Ÿ“‹ Overview

The Cash Flows Controller is a streamlined treasury reporting module that provides focused daily cash flow reports. It serves as a simplified alternative to the more comprehensive savedailyController.php, offering:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**savedaily**Daily cash register transactionssavedailyid, saveid, savedailychangeamount, savedailychangetype, savedailydate, processname, tablename, savedailymodelid
**save**Cash registers/safes master datasaveid, savename, savecurrentvalue, conditions
### Transaction Source Tables

Table NamePurposeKey Columns
**sellbill**Sales transactionssellbillid, sellbillclientid, sellbilldate
**buybill**Purchase transactionsbuybillid, buybillsupplierid, buybilldate
**returnsellbill**Sales returnsreturnsellbillid, returnsellbillclientid
**returnbuybill**Purchase returnsreturnbuybillid, returnbuybillsupplierid
**sellbillandrutern**Combined sell/return billssellbillid, sellbillclientid
**buyandruternbill**Combined buy/return billsbuyandruternbillid, buyandruternbillsupplierid
**expenses**Expense transactionsexpensesid, expensesname, expensesValue
**bills**Service billsbillid, clientid, billdate
**billsreturn**Service bill returnsbillsreturnid, billid
### Personnel Tables

Table NamePurposeKey Columns
**employeepersonnel**Employee personal transactionsemployeepersonnelid, employeeid
**employee**Employee master dataemployeeid, employeeName
### Configuration Tables

Table NamePurposeKey Columns
**usergroup**User group settingsusergroupid, savedailydate
**programsettings**System configurationprogramsettingsid, reportsPlusHours
**youtubelink**Tutorial linksyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. show() / Default Action - Basic Cash Flow Report

Location: Line 232

Purpose: Generate daily cash flow report with basic filtering

Function Signature:

// Triggered when: do=show or empty $do
$saveId = $_REQUEST['saveid'];
$startDate = $_REQUEST['from'];
$endDate = $_REQUEST['to'];
$processid = filter_input(INPUT_POST, 'processid', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

Process Flow:

1. Load cash registers for selection dropdown

2. Load process types for filtering

3. Parse date and filter parameters

4. Apply timezone adjustments if configured

5. Call search() with parameters

6. Display results via show.html template

Key Features:

---

2. search() - Core Search Function

Location: Line 411

Purpose: Query cash register transactions and build transaction details

Function Signature:

function search($saveId, $processid, $startDate, $endDate)

Process Flow:

1. Build dynamic WHERE clause based on filters

2. Query savedaily table using extension DAO

3. Process each transaction record:

- Generate document links

- Load related party information

- Calculate running totals

4. Assign results to template

Dynamic Query Building:

$queryString = ' WHERE';

if (isset($saveId) && $saveId != '-1') {
    $queryString .= ' savedaily.saveid = ' . $saveId . ' AND';
}

if (!empty($startDate) && !empty($endDate)) {
    $queryString .= ' savedaily.savedailydate >= "' . $startDate . '" AND savedaily.savedailydate <= "' . $endDate . '" AND';
}

if (isset($processid) && !empty($processid)) {
    $queryString .= ' savedaily.processname in( "' . implode('","', $processid) . '") AND';
}

Transaction Processing:

foreach ($savedailyData as $data) {
    // Generate document links
    if ($data->tablename == 'bills.php' || $data->tablename == 'billsreturn.php') {
        $data->link = '' . $data->tablename . '?do=details&id=' . $data->savedailymodelid;
    } else {
        $data->link = '' . $data->tablename . '?do=editprint&id=' . $data->savedailymodelid;
    }
    
    // Calculate running totals
    if ($data->savedailychangetype == 0) { // Income
        $changeAmountSum += $data->savedailychangeamount;
        $changeAmountSumpluse += $data->savedailychangeamount;
    } else { // Expense
        $changeAmountSum -= $data->savedailychangeamount;
        $changeAmountminse += $data->savedailychangeamount;
    }
}

---

3. loadSave() - Cash Register Loading

Location: Line 343

Purpose: Load all active cash registers for selection

Function Signature:

function loadSave()

Process Flow:

1. Query save table for active registers (conditions = 0)

2. Return array of cash register objects

---

4. loadprocess() - Process Type Loading

Location: Line 355

Purpose: Load all available process types for filtering

Function Signature:

function loadprocess()

Process Flow:

1. Query distinct process names from savedaily table

2. Return array of process types for dropdown

---

5. sumCredit() / sumCreditById() - Balance Calculations

Location: Lines 363, 381

Purpose: Calculate current cash register balances

Function Signatures:

function sumCredit()           // Total across all registers
function sumCreditById($id)    // Total for specific register

Process Flow:

1. Load cash register data

2. Sum current values

3. Return total balance

---

6. showDetail() - Transaction Details

Location: Line 397

Purpose: Load detailed transaction records for drill-down

Function Signature:

function showDetail()

Process Flow:

1. Get savedailyid from URL parameter

2. Query detailed transaction records

3. Return detail array

---

๐Ÿ”„ Workflows

Workflow 1: Basic Cash Flow Report

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Access Cash Flow Report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Dropdown Data
- Load active cash registers
- Load process types
- Load YouTube tutorials
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Parse User Filters
- Cash register selection
- Date range (with timezone)
- Process type filters
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Execute Search
- Build WHERE clause
- Query savedaily table
- Apply filters
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Process Results
FOR EACH transaction:
โ”‚
โ†’ Determine source table
โ”‚
โ†’ Load related party name
โ”‚ โ”œโ”€ Customer names (for sales)
โ”‚ โ”œโ”€ Supplier names (for purchases)
โ”‚ โ”œโ”€ Employee names (for personnel)
โ”‚ โ”‚ โ””โ”€ Expense names (for expenses) โ”‚
โ”‚
โ†’ Generate document link
โ”‚
โ”‚ โ””โ”€โ†’ Update running totals โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Display Report
- Show transactions with links
- Display income/expense totals
- Include cash register balances
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty) or `do=show`Default actionBasic cash flow report
`do=success`Static templateSuccess message display
`do=error`Static templateError message display
### Required Parameters

Cash Flow Report (do=show):

---

๐Ÿงฎ Calculation Methods

Cash Flow Totals

$changeAmountSum = 0;      // Net cash flow
$changeAmountSumpluse = 0; // Total income
$changeAmountminse = 0;    // Total expenses

foreach ($savedailyData as $data) {
    if ($data->savedailychangetype == 0) { // Income
        if ($data->savedailychangeamount > 0) {
            $changeAmountSum += $data->savedailychangeamount;
            $changeAmountSumpluse += $data->savedailychangeamount;
        } else {
            $changeAmountSum -= $data->savedailychangeamount;
            $changeAmountSumpluse += $data->savedailychangeamount;
        }
    } else { // Expense
        if ($data->savedailychangeamount > 0) {
            $changeAmountSum -= $data->savedailychangeamount;
            $changeAmountminse += $data->savedailychangeamount;
        } else {
            $changeAmountSum += $data->savedailychangeamount;
            $changeAmountminse -= $data->savedailychangeamount;
        }
    }
}

Timezone Handling

if (isset($Programsetting->reportsPlusHours) && !empty($Programsetting->reportsPlusHours)) {
    $reportsPlusHours = $Programsetting->reportsPlusHours + 24;
    $endDate = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour +0 minutes', strtotime($endDate)));
    $startDate = date('Y-m-d H:i:s', strtotime('+' . $Programsetting->reportsPlusHours . ' hour +0 minutes', strtotime($startDate)));
} else {
    $endDate = $endDate . ' 23:59:59';
    $startDate = $startDate . " 00:00:00";
}

---

๐Ÿ”’ Security & Permissions

Input Validation

// Array input filtering for process types
$processid = filter_input(INPUT_POST, 'processid', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

// Basic parameter sanitization
$saveId = $_REQUEST['saveid'];
$startDate = $_REQUEST['from'];
$endDate = $_REQUEST['to'];

Access Control

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Essential Indexes:

- savedaily(saveid, savedailydate)

- savedaily(processname)

- save(conditions)

2. Query Efficiency:

- Simple WHERE clause construction

- Limited JOIN operations

- Direct table queries without complex aggregations

3. Memory Usage:

- Smaller dataset compared to comprehensive treasury reports

- Basic transaction processing without complex calculations

---

๐Ÿ› Common Issues & Troubleshooting

1. Incorrect Transaction Links

Issue: Links point to wrong pages or show errors

Cause: Incorrect tablename values or missing savedailymodelid

Debug:

SELECT tablename, COUNT(*) 
FROM savedaily 
WHERE savedailymodelid = -1 OR tablename IS NULL
GROUP BY tablename;

2. Missing Process Types

Issue: Process filter dropdown is empty

Cause: No distinct process names in savedaily table

Fix: Check data population in savedaily.processname

3. Timezone Issues

Issue: Date ranges return unexpected results

Cause: reportsPlusHours setting conflicts

Fix: Verify programsettings.reportsPlusHours configuration

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Report Generation

1. Access controller without parameters
2. Verify dropdown data loads correctly
3. Select cash register and date range
4. Confirm transactions display with proper links

Test Case 2: Process Filtering

1. Select specific process types
2. Verify only matching transactions appear
3. Check totals calculate correctly
4. Confirm filter persistence

Test Case 3: Date Range Validation

1. Test various date ranges
2. Verify timezone handling
3. Check edge cases (same day, month boundaries)
4. Confirm proper SQL date formatting

---

๐Ÿ“š Related Documentation

---

๐Ÿ” Key Differences from savedailyController

Simplified Features

Use Cases

When to Use Each Controller

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur