๐Ÿ“š ERP Documentation Viewer

Beautiful, colorful documentation for your ERP system

Expenses Report Controller Documentation

File: /controllers/expensesReportController.php

Purpose: Generates comprehensive expense reports with filtering by type, date, cost center, and user

Last Updated: December 20, 2024

Total Functions: 4

Lines of Code: ~346

---

๐Ÿ“‹ Overview

The Expenses Report Controller is a specialized reporting module that provides detailed expense analysis and tracking capabilities. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**expenses**Expense transactionsexpensesid, expensesname, expensesValue, expensesdate, expensestypeid, userid, saveid, productid, costcenterid, conditions
**expensestype**Expense type/category masterexpensestypeid, expensestypename, parent, deleted
### Related Tables

Table NamePurposeKey Columns
**costcenter**Cost center master datacostcenterid, costcentername, deleted
**save**Cash registers/payment methodssaveid, savename, conditions
**user**System usersuserid, username, conditions
**product**Product master dataproductid, productname
### Configuration Tables

Table NamePurposeKey Columns
**programsettings**System configurationprogramsettingsid, settingkey, settingvalue
**usergroup**User group settingsusergroupid, usergroupname
**youtubelink**Tutorial linksyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. Default Action - Comprehensive Expense Report

Location: Line 128

Purpose: Generate detailed expense report with multiple filter options

Function Signature:

// Triggered when: empty($do)
$expensestypeid = $_REQUEST['expensestypeid'];
$productid = $_REQUEST['productid'];
$from = $_REQUEST['from'];
$to = $_REQUEST['to'];
$Costcenterid = $_REQUEST['Costcenterid'];

Process Flow:

1. Load expense types hierarchy for dropdown

2. Load cost centers for filtering

3. Load YouTube tutorials

4. Process filter parameters

5. Build dynamic query string

6. Execute expense query with filters

7. Calculate totals excluding cancelled expenses

8. Display via show.html template

Dynamic Query Building:

$queryString = '';
if (isset($expensestypeid) && $expensestypeid != "-1") {
    $queryString .= " and expenses.expensestypeid = $expensestypeid ";
}
if (isset($from) && $from != "") {
    $queryString .= " and expenses.expensesdate >= '" . $from . "' ";
}
if (isset($to) && $to != "") {
    $queryString .= " and expenses.expensesdate <= '" . $to . "' ";
}
if ($productid > 0) {
    $queryString .= " and expenses.productid = $productid ";
}
if ($Costcenterid > 0) {
    $queryString .= " and expenses.costcenterid = $Costcenterid ";
}
$queryString .= " order by expensesid desc ";

Total Calculation with Conditions:

$sum = 0;
foreach ($expenseData as $data) {
    if ($data->conditions == 0) { // Only active expenses
        $sum += $data->expensesValue;
    }
}

---

2. showByType - Expense Type Summary Report

Location: Line 214

Purpose: Generate summary report grouped by expense types

Function Signature:

// Triggered when: do=showByType
$expensestypeid = (int) $_REQUEST['expensestypeid'];
$saveid = (int) $_REQUEST['saveid'];
$userid = (int) $_REQUEST['userid'];
$from = $_REQUEST['from'];
$to = $_REQUEST['to'];

Process Flow:

1. Load expense types hierarchy

2. Load cash registers and users for filtering

3. Build query string with multiple filters

4. Execute summary query grouped by expense type

5. Display via showbytype.html template

Summary Query Filters:

$queryString = '';
if (isset($expensestypeid) && $expensestypeid > 0) {
    $queryString .= " and expensestype.expensestypeid = $expensestypeid ";
}
if (isset($saveid) && $saveid > 0) {
    $queryString .= " and expenses.saveid = $saveid ";
}
if (isset($userid) && $userid > 0) {
    $queryString .= " and expenses.userid = $userid ";
}
if (isset($from) && !empty($from)) {
    $queryString .= " and expenses.expensesdate >= '" . $from . "' ";
}
if (isset($to) && !empty($to)) {
    $queryString .= " and expenses.expensesdate <= '" . $to . "' ";
}

---

3. showwithsearch() - Expense Type Filter

Location: Line 264

Purpose: Filter expenses by specific expense type

Function Signature:

function showwithsearch()

Process Flow:

1. Get expense type ID from request

2. Query expenses for specific type

3. Calculate totals

4. Assign to template

---

4. Helper Functions

show() - Show all expenses

showWithDate($from, $to) - Filter by date range

showWithDateAndType($from, $to, $expensestypeid, $productid, $Costcenterid) - Multi-filter search

---

๐Ÿ”„ Workflows

Workflow 1: Comprehensive Expense Report

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Access Expense Report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Filter Options
- Load expense type hierarchy
- Load cost centers
- Load YouTube tutorials
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Process Filter Parameters
- Expense type selection
- Date range (from/to)
- Product ID filter
- Cost center filter
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Build Dynamic Query
- Start with base query
- Add type filter if specified
- Add date filters if provided
- Add product/cost center filters
- Order by expense ID descending
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Execute Query and Process Results
- Query expenses with built filters
- Process each expense record:
โ”‚
โ†’ Check conditions (active/cancelled)
โ†’ Include in totals if active
โ†’ Link to related data (user, type, etc.)
โ”‚ โ””โ”€โ†’ Format for display โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Calculate Totals and Display
- Sum expense values (active only)
- Assign data to template
- Display expense report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Expense Type Summary Report

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Type Summary Report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Summary Options
- Load expense types
- Load cash registers
- Load users
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Build Summary Query
- Add expense type filter
- Add cash register filter
- Add user filter
- Add date range filters
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Execute Summary Query
- Group expenses by type
- Calculate totals per type
- Include related data
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Display Summary Report
- Show totals by expense type
- Include filtering information
- Display via showbytype.html
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionComprehensive expense report
`do=showByType`Type summaryExpense summary grouped by type
### Required Parameters

Comprehensive Report (default):

Type Summary (do=showByType):

---

๐Ÿงฎ Calculation Methods

Active Expense Total

$sum = 0;
foreach ($expenseData as $data) {
    if ($data->conditions == 0) { // Only active expenses
        $sum += $data->expensesValue;
    }
}

Query String Construction

$queryString = '';
if (isset($expensestypeid) && $expensestypeid != "-1") {
    $mytypedata = $ExpensetypeDAO->load($expensestypeid);
    $message .= " ุนุฑุถ ู…ุตุฑูˆูุงุช " . $mytypedata->expensestypename;
    $queryString .= " and expenses.expensestypeid = $expensestypeid ";
}

if (isset($from) && $from != "") {
    $message .= " ู…ู† ุชุงุฑูŠุฎ : " . $from;
    $queryString .= " and expenses.expensesdate >= '" . $from . "' ";
}

if (isset($to) && $to != "") {
    $message .= "  ุงู„ู‰ ุชุงุฑูŠุฎ  " . $to;
    $queryString .= " and expenses.expensesdate <= '" . $to . "' ";
}

---

๐Ÿ”’ Security & Permissions

Authentication

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

Input Validation

// Type casting for numeric filters
$expensestypeid = (int) $_REQUEST['expensestypeid'];
$saveid = (int) $_REQUEST['saveid'];
$userid = (int) $_REQUEST['userid'];

// Safe parameter handling
$productid = $_REQUEST['productid'];
$from = $_REQUEST['from'];
$to = $_REQUEST['to'];

SQL Injection Prevention

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Essential Indexes:

- expenses(expensestypeid, expensesdate)

- expenses(userid, expensesdate)

- expenses(costcenterid)

- expenses(productid)

- expenses(conditions)

2. Query Efficiency:

- Single table queries with efficient WHERE clauses

- ORDER BY on primary key for consistency

- Conditional filtering reduces result sets

3. Memory Management:

- Result sets typically smaller than transaction tables

- Simple data processing without complex aggregations

Performance Tips

-- Efficient expense query structure
SELECT * FROM expenses 
WHERE conditions = 0 
AND expensestypeid = ? 
AND expensesdate BETWEEN ? AND ?
ORDER BY expensesid DESC;

-- Add compound index for best performance
CREATE INDEX idx_expenses_filter ON expenses(conditions, expensestypeid, expensesdate);

---

๐Ÿ› Common Issues & Troubleshooting

1. Incorrect Total Calculations

Issue: Totals include cancelled expenses

Cause: Missing conditions = 0 filter in calculations

Fix:

// Always check conditions in totals
foreach ($expenseData as $data) {
    if ($data->conditions == 0) { // Only active
        $sum += $data->expensesValue;
    }
}

2. Missing Expense Types

Issue: Expense type dropdown empty or incomplete

Cause: Deleted expense types or hierarchy issues

Debug:

SELECT * FROM expensestype WHERE deleted = 0 ORDER BY parent, expensestypename;

3. Date Range Issues

Issue: Date filters not working correctly

Cause: Date format mismatches

Fix: Ensure dates are in YYYY-MM-DD format

4. Cost Center Filter Problems

Issue: Cost center filter not applying

Cause: Deleted cost centers or missing assignments

Debug:

SELECT DISTINCT costcenterid FROM expenses WHERE costcenterid IS NOT NULL;
SELECT * FROM costcenter WHERE deleted = 0;

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Expense Report

1. Access controller without filters
2. Verify all expenses display
3. Check total calculation accuracy
4. Confirm expense details are complete

Test Case 2: Multi-Filter Report

1. Select expense type and date range
2. Add cost center filter
3. Verify only matching expenses appear
4. Check message displays selected filters
5. Confirm totals match filtered data

Test Case 3: Type Summary Report

1. Access showByType action
2. Apply multiple filters (user, save, dates)
3. Verify grouping by expense type works
4. Check summary totals are accurate

Test Case 4: Edge Cases

1. Test with cancelled expenses (conditions != 0)
2. Test with missing cost centers
3. Test with invalid date ranges
4. Test with non-existent expense types

---

๐Ÿ“š Related Documentation

---

๐Ÿ” Key Features

Hierarchical Expense Types

Multi-Dimensional Filtering

Conditional Logic

Integration Points

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur

โ†‘