Savedaily Documentation

Save Daily Controller Documentation

File: /controllers/savedailyController.php

Purpose: Generates comprehensive daily treasury reports and cash flow tracking for cash registers and bank accounts

Last Updated: December 20, 2024

Total Functions: 13+

Lines of Code: ~2,050

---

๐Ÿ“‹ Overview

The Save Daily Controller is a critical treasury reporting module that provides detailed daily cash register reports, cash flow analysis, and transaction tracking. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**savedaily**Daily cash register transactionssavedailyid, saveid, savedailychangeamount, savedailychangetype, savedailydate, processname, tablename
**save**Cash registers/safes master datasaveid, savename, savecurrentvalue, userid, conditions
**accountmovement**Bank account movementsaccountmovementid, accountid, amount, movementtype, movementdate
### Transaction Source Tables

Table NamePurposeKey Columns
**sellbill**Sales transactionssellbillid, sellbillclientid, sellbilltotalpayed, sellbilldate
**buybill**Purchase transactionsbuybillid, buybillsupplierid, buybilltotalpayed, buybilldate
**expenses**Expense transactionsexpensesid, expensesValue, expensesdate, saveid
**income**Income transactionsincomeid, incomeValue, incomedate, saveid
**bills**Service billsbillid, clientid, finalnetbillvalue, billdate
**clientdebtchange**Customer debt changesclientdebtchangeid, clientid, clientdebtchangeamount, clientdebtchangetype
### Configuration Tables

Table NamePurposeKey Columns
**usergroup**User group settingsusergroupid, savedailydate, usergroupname
**programsettings**System configurationprogramsettingsid, reportsPlusHours, settingkey, settingvalue
**user**System usersuserid, username, usergroupid
**branch**Business branchesbranchid, branchname, branchcode
### Reference Tables

Table NamePurposeKey Columns
**client**Customer master dataclientid, clientname, clientdebt
**supplier**Supplier master datasupplierid, suppliername
**youtubelink**Tutorial linksyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. show() / Default Action - Daily Treasury Report

Location: Line 303

Purpose: Generate comprehensive daily cash register report with filtering capabilities

Function Signature:

// Triggered when: do=show or empty $do
$saveId = $_REQUEST['saveId'];     // Cash register ID
$userId = $_REQUEST['userId'];     // User filter
$startDate = $_REQUEST['from'];    // Start date
$endDate = $_REQUEST['to'];        // End date  
$processid = $_REQUEST['processid']; // Process type filter

Process Flow:

1. Load cash registers based on user privileges

2. Load process types for filtering

3. Parse date parameters with timezone handling

4. Apply search filters or default to today's data

5. Call search() with parameters

6. Handle CURL/API requests for external systems

7. Display via show.html template

Features:

---

2. search() - Core Search and Data Processing

Location: Line 1150

Purpose: Query and process cash register transactions with comprehensive filtering

Function Signature:

function search($saveid, $processid, $startDate, $endDate, $userId = 0)

Process Flow:

1. Build dynamic WHERE clause based on filters

2. Apply user privilege restrictions

3. Query savedaily table with filters

4. Process each transaction record:

- Link to source documents

- Load related party information

- Calculate running totals

- Categorize transaction types

5. Calculate summary statistics

6. Return structured data arrays

Transaction Processing Logic:

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;
    } else { // Expense
        $changeAmountSum -= $data->savedailychangeamount;
    }
}

---

3. loadSaveByUserPrivileg() - User-Based Cash Register Loading

Location: Line 1021

Purpose: Load cash registers based on user privileges and session settings

Function Signature:

function loadSaveByUserPrivileg()

Process Flow:

1. Check session setting searchinonesave

2. If restricted (=1): Load only user's assigned cash register

3. If unrestricted (=0): Load all active cash registers

4. Return filtered cash register array

Access Control Logic:

if ($_SESSION['searchinonesave'] == 1) {
    // Restricted: user's cash register only
    $saveData = $mySaveRecord->queryByUserid($_SESSION['userid']);
} else {
    // Full access: all cash registers
    $saveData = $mySaveRecord->queryByConditions(0);
}

---

4. getRoyalData() - External System Integration

Location: Line 2031

Purpose: Format transaction data for Royal/external system API consumption

Function Signature:

function getRoyalData($savedailyData, $allMovements)

Process Flow:

1. Process cash register transactions

2. Format for external API compatibility

3. Include bank movement data

4. Return JSON-formatted response

API Response Format:

return array(
    "savePayments" => $savedailyData,    // Cash transactions
    "bankPayments" => $allMovements      // Bank transactions
);

---

5. getOpticData() - Specialized Optical System Report

Location: Line 1818

Purpose: Generate reports for optical/medical businesses with insurance integration

Function Signature:

function getOpticData($saveId, $startDate, $endDate, $cash, $insurance, $network)

Process Flow:

1. Query sales bills within date range

2. Filter by payment method (cash/insurance/network)

3. Calculate totals and commissions

4. Format for optical business requirements

---

6. operationName() - Transaction Type Identification

Location: Line 2031

Purpose: Standardize transaction type names for consistent reporting

Function Signature:

function operationName($data)

Process Flow:

1. Analyze processname field

2. Map to standardized operation categories

3. Return localized operation name

Operation Mapping:

switch ($data->processname) {
    case 'sellbillController.php':
        return 'ู…ุจูŠุนุงุช ู†ู‚ุฏูŠ';
    case 'clientPayedDeptController.php':
        return 'ุชุญุตูŠู„ ู…ู† ุนู…ูŠู„';
    case 'expensesController.php':
        return 'ู…ุตุฑูˆู';
    // ... additional mappings
}

---

7. Helper Functions

sumCredit() - Calculate total across all cash registers

sumCreditById($id) - Calculate total for specific cash register

loadSave() - Load all active cash registers

loadprocess() - Load process types for filtering

showDetail() - Load detailed transaction records

---

๐Ÿ”„ Workflows

Workflow 1: Daily Treasury Report Generation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Access Daily Report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Check User Privileges
- Load accessible cash registers
- Apply session restrictions
- Load user-specific data
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Process Date/Filter Parameters
- Parse date range with timezone
- Apply process type filters
- Handle default "today" scenario
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Execute Search Query
- Build dynamic WHERE clause
- Query savedaily table
- Apply user access restrictions
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Process Transaction Records
FOR EACH transaction:
โ”‚
โ†’ Identify transaction source
โ”‚
โ†’ Load related party information
โ”‚ โ”œโ”€ Customer/supplier names
โ”‚ โ”œโ”€ Employee information
โ”‚ โ”‚ โ””โ”€ Bill details โ”‚
โ”‚
โ†’ Generate document links
โ”‚
โ†’ Calculate running totals
โ”‚ โ”œโ”€ Income transactions (+)
โ”‚ โ”‚ โ””โ”€ Expense transactions (-) โ”‚
โ”‚
โ”‚ โ””โ”€โ†’ Categorize transaction types โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Generate Report Output
- Calculate summary totals
- Format for display/API
- Include bank movement data
- Display via template or return JSON
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: External System API Integration

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: API Request (CURL)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Detect CURL Request
- Check $_POST['curlpost'] == 1
- Skip header display
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Process Search Request
- Execute normal search() function
- Get cash and bank transaction data
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Format for External System
- Call getRoyalData() for formatting
- Structure as API response
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Return JSON Response
- Output savePayments array
- Include bankPayments array
- Exit without footer display
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty) or `do=show`Default actionDaily treasury report
`do=showByDay``showByDay()`Single day summary view
`do=opticdata``getOpticData()`Optical business report
### Required Parameters

Daily Report (do=show):

API Integration:

---

๐Ÿงฎ Calculation Methods

Running Balance Calculation

$changeAmountSum = 0;
$changeAmountSumplus = 0; 
$changeAmountminus = 0;

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

Timezone-Aware Date Processing

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

User Access Control

// Cash register access control
if ($_SESSION['searchinonesave'] == 1) {
    // User restricted to specific cash register
    $saveData = $mySaveRecord->queryByUserid($_SESSION['userid']);
} else {
    // User has access to all cash registers
    $saveData = $mySaveRecord->queryByConditions(0);
}

Input Sanitization

---

๐Ÿ“Š Performance Considerations

Database Optimization Tips

1. Critical Indexes:

- savedaily(saveid, savedailydate)

- savedaily(savedailychangetype, processname)

- save(userid, conditions)

2. Query Optimization:

- Date range filtering with proper timezone handling

- User-based filtering to reduce dataset size

- Process type filtering for focused reports

3. Memory Management:

- Large date ranges may return thousands of records

- User privilege filtering reduces memory usage

- Transaction linking optimized for batch processing

---

๐Ÿ› Common Issues & Troubleshooting

1. Incorrect Balance Calculations

Issue: Running totals don't match expected values

Cause: Mixed transaction types or timezone issues

Debug:

SELECT 
    SUM(CASE WHEN savedailychangetype = 0 THEN savedailychangeamount ELSE 0 END) as income,
    SUM(CASE WHEN savedailychangetype = 1 THEN savedailychangeamount ELSE 0 END) as expenses
FROM savedaily WHERE saveid = [ID] AND savedailydate BETWEEN '[DATE1]' AND '[DATE2]';

2. Missing Transaction Links

Issue: Transaction shows "#" link instead of document link

Cause: savedailymodelid = -1 or unrecognized tablename

3. User Access Issues

Issue: User cannot see expected cash registers

Cause: Session variable searchinonesave restrictions

Fix: Check user group settings and cash register assignments

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Daily Report

1. Select cash register with recent transactions
2. Set today's date range
3. Verify transaction count and totals
4. Check transaction links work properly

Test Case 2: Multi-Register Report

1. Select "All Cash Registers" option
2. Set date range covering multiple registers
3. Verify totals are properly segregated
4. Check user access restrictions

Test Case 3: API Integration

1. Send CURL request with curlpost=1
2. Verify JSON response format
3. Check data accuracy vs web interface
4. Test error handling for invalid parameters

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur