๐Ÿ“š ERP Documentation Viewer

Beautiful, colorful documentation for your ERP system

Return Sell Bill Reports Controller Documentation

File: /controllers/ReturnSellBillReportsController.php

Purpose: Generates comprehensive reports for sales returns and combined sales/return operations

Last Updated: December 20, 2024

Total Functions: 8

Lines of Code: ~717

---

๐Ÿ“‹ Overview

The Return Sell Bill Reports Controller is a specialized reporting module that provides detailed analysis of sales return operations and combined sales/return transactions. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**returnsellbill**Sales return billsreturnsellbillid, returnsellbillclientid, returnsellbillaftertotalbill, returnsellQuantity, returnsellbilldate, conditions, billnameid
**returnsellbilldetail**Return bill line itemsreturnsellbilldetailid, returnsellbillid, returnsellbilldetailproductid, returnsellbilldetailquantity, returnsellbilldetailtotalprice
**sellbillandrutern**Combined sales/return billssellbillid, sellbillclientid, sellbillaftertotalbill, returnsellQuantity, sellbilldate, conditions, billnameid
**sellandruternbilldetail**Combined bill detailssellandruternbilldetailid, sellbillid, sellbilldetailproductid, sellbilldetailquantity, selltype
### Reference Tables

Table NamePurposeKey Columns
**client**Customer master dataclientid, clientname
**billname**Bill format definitionsbillnameid, billname, billtype
**billsettings**Bill formatting settingsbillsettingid, billnameid, settingkey, settingvalue
**user**System usersuserid, username, viewbills, usergroupid
**programsettings**System configurationprogramsettingsid, settingkey, settingvalue, reportsPlusHours
**youtubelink**Tutorial linksyoutubelinkid, title, url
---

๐Ÿ”‘ Key Functions

1. show() / Default Action - Main Report Display

Location: Line 120-167

Purpose: Generate filtered return bill reports based on search criteria

Function Signature:

// Triggered when: do=show or empty $do
$startDate = $_REQUEST['from'];
$endDate = $_REQUEST['to'];
$sellbillSerial = $_REQUEST['sellbillserial'];
$clientId = $_REQUEST['clientid'];

Process Flow:

1. Load client data for dropdown filters

2. Parse search parameters (date range, serial, client)

3. Call showAll() for main report generation

4. Display via returnSellBillReportsview/show.html template

5. Include YouTube tutorial links

Features:

---

2. showAll() - Core Report Generation Logic

Location: Line 294-540

Purpose: Build comprehensive return bill report with advanced filtering

Function Signature:

function showAll()

Process Flow:

1. Initialize Query Strings
   โ”œโ”€ Build WHERE clauses for returns and combined bills
   โ”œโ”€ Apply user permission restrictions
   โ””โ”€ Set up date range handling

2. Apply Search Filters
   โ”œโ”€ Client ID filter
   โ”œโ”€ Bill serial filter
   โ”œโ”€ Bill ID filter
   โ”œโ”€ Date range with timezone support
   โ””โ”€ Default to today if no criteria

3. Process Return Bills
   โ”œโ”€ Query returnsellbill table with filters
   โ”œโ”€ Calculate totals and quantities
   โ”œโ”€ Apply discount calculations
   โ”œโ”€ Calculate tax amounts
   โ””โ”€ Mark as type "returnSell"

4. Process Combined Bills
   โ”œโ”€ Query sellbillandrutern table
   โ”œโ”€ Extract return portions only
   โ”œโ”€ Calculate combined bill totals
   โ”œโ”€ Apply discount calculations
   โ””โ”€ Mark as type "sellAndReturn"

5. Generate Final Report
   โ”œโ”€ Merge both datasets
   โ”œโ”€ Calculate grand totals
   โ”œโ”€ Assign to template variables
   โ””โ”€ Display comprehensive results

Permission Handling:

if ($userData->viewbills == 0) {
    // User can only see their own bills
    $queryString .= ' sellbillandrutern.userid =' . $_SESSION['userid'] . ' AND';
    $returnqueryString .= ' returnsellbill.userid =' . $_SESSION['userid'] . ' AND';
} elseif ($userData->viewbills == 2) {
    // User can see bills from their user group
    $queryString .= ' u.usergroupid =' . $_SESSION['usergroupid'] . ' AND';
    $returnqueryString .= ' user2.usergroupid =' . $_SESSION['usergroupid'] . ' AND';
}

Timezone Support:

$Programsetting = $ProgramsettingDAO->load(1);
if (isset($Programsetting->reportsPlusHours) && !empty($Programsetting->reportsPlusHours)) {
    $reportsPlusHours = $Programsetting->reportsPlusHours + 24;
    $endDate = date('Y-m-d H:i:s', strtotime('+' . $reportsPlusHours . ' hour', strtotime($endDate)));
    $startDate = date('Y-m-d H:i:s', strtotime('+' . $Programsetting->reportsPlusHours . ' hour', strtotime($startDate)));
}

---

3. returnDetail() - Return Bill Detail View

Location: Line 168-187

Purpose: Display detailed information for a specific return bill

Function Signature:

// Triggered when: do=returnDetail
$returnsellbillId = $_GET['returnsellbillid'];

Process Flow:

1. Call showDetail() to load return bill data

2. Load bill formatting settings via loadBillProperty()

3. Load bill name configuration

4. Load program settings for display formatting

5. Display via returnSellBillReportsview/returnDetail.html

Data Loaded:

---

4. sellAndReturnDetail() - Combined Bill Detail View

Location: Line 188-211

Purpose: Display detailed information for combined sales/return bills

Function Signature:

// Triggered when: do=sellAndReturnDetail
$sellbillId = $_GET['sellbillid'];

Process Flow:

1. Call showsellAndReturnDetail() to load combined bill data

2. Load bill formatting settings

3. Load bill name configuration

4. Load program settings

5. Display via returnSellBillReportsview/sellAndReturnDetail.html

Data Loaded:

---

5. showDetail() - Return Bill Data Loader

Location: Line 250-267

Purpose: Load comprehensive data for a specific return bill

Function Signature:

function showDetail($returnsellbillId)

Process Flow:

1. Load return bill header via loadReturnsellbillById()

2. Load return bill details via queryWithReturnsellbillId()

3. Calculate total returned quantity

4. Return array with all data components

Return Value:

return array(
    $returnsellbillData,      // Header information
    $returnsellbilldetailData, // Line item details  
    $quantity                  // Total quantity
);

---

6. showsellAndReturnDetail() - Combined Bill Data Loader

Location: Line 269-292

Purpose: Load comprehensive data for a combined sales/return bill

Function Signature:

function showsellAndReturnDetail($sellbillid)

Process Flow:

1. Load combined bill header via loadSellbillandruternById()

2. Load sales details via queryWithSellBillIdAndSellType(billid, 0)

3. Calculate total sales quantity

4. Load return details via queryWithSellBillIdAndSellType(billid, 1)

5. Calculate total return quantity

6. Return array with all data components

Return Value:

return array(
    $sellbillandruternData,    // Header information
    $sellbilldetailData,       // Sales line items
    $ruternbilldetailData,     // Return line items
    $sellQuantity,             // Total sales quantity
    $returnQuantity            // Total return quantity
);

---

7. loadAllClient() - Client Data Loader

Location: Line 222-228

Purpose: Load all clients for dropdown filter population

Function Signature:

function loadAllClient()

Returns: Array of all client objects

---

8. loadBillProperty() - Bill Settings Loader

Location: Line 241-248

Purpose: Load bill formatting settings for a specific bill type

Function Signature:

function loadBillProperty($billnameid)

Returns: Array of bill setting configurations

---

๐Ÿ”„ Workflows

Workflow 1: Return Bill Report Generation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Report Request
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Parse Search Parameters
โ”œโ”€ Client ID filter
โ”œโ”€ Date range (from/to)
โ”œโ”€ Bill serial number
โ”œโ”€ Specific bill ID
โ”‚ โ””โ”€ User permission level โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Build Dynamic Query Strings
โ”œโ”€ Add client filter if specified
โ”œโ”€ Add date range with timezone adjustment
โ”œโ”€ Add serial/ID filters if provided
โ”œโ”€ Apply user permission restrictions
โ”‚ โ””โ”€ Default to today's date if no criteria โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Query Return Bill Data
โ”œโ”€ Execute returnsellbill query with filters
โ”œโ”€ Load related client information
โ”œโ”€ Filter out cancelled bills (conditions != 0)
โ”‚ โ””โ”€ Calculate basic totals โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Process Discount and Tax Calculations
FOR EACH return bill:
โ”œโ”€ Determine discount type (1=fixed, 2=percentage)
โ”œโ”€ Calculate discount amount
โ”‚ โ”œโ”€ Fixed: direct discount value
โ”‚ โ”‚ โ””โ”€ Percentage: (total ร— discount%)/100 โ”‚
โ”œโ”€ Calculate detail-level discounts
โ”œโ”€ Calculate tax on discounted amount
โ”‚ โ””โ”€ Update bill totals โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Query Combined Bill Data
โ”œโ”€ Execute sellbillandrutern query with filters
โ”œโ”€ Extract return portions only
โ”œโ”€ Calculate combined bill totals
โ”œโ”€ Apply discount calculations
โ”‚ โ””โ”€ Mark as "sellAndReturn" type โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6Generate Final Report
โ”œโ”€ Merge pure returns and combined bill returns
โ”œโ”€ Calculate grand totals (amount, quantity, tax)
โ”œโ”€ Assign data to template variables
โ”‚ โ””โ”€ Display via show.html template โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Return Bill Detail Display

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Detail Request
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Return Bill Header
โ”œโ”€ Query returnsellbill by ID
โ”œโ”€ Load customer information
โ”œโ”€ Load bill total and date information
โ”‚ โ””โ”€ Extract bill format ID โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Load Return Bill Details
โ”œโ”€ Query returnsellbilldetail by bill ID
โ”œโ”€ Load product information for each line item
โ”œโ”€ Calculate quantities and prices
โ”‚ โ””โ”€ Sum total quantities returned โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Load Bill Formatting Settings
โ”œโ”€ Query billsettings by billnameid
โ”œโ”€ Load display preferences
โ”œโ”€ Load bill layout configuration
โ”‚ โ””โ”€ Load company information settings โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Load Program Configuration
โ”œโ”€ Load system-wide settings
โ”œโ”€ Load currency and formatting preferences
โ”œโ”€ Load company logo and contact information
โ”‚ โ””โ”€ Load any custom field configurations โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Generate Formatted Bill Display
โ”œโ”€ Apply bill format template
โ”œโ”€ Display header information
โ”œโ”€ Show detailed line items with products
โ”œโ”€ Display totals and calculations
โ”‚ โ””โ”€ Present via returnDetail.html template โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty) or `do=show``showAll()`Main return bill report
`do=returnDetail``showDetail()`Individual return bill detail
`do=sellAndReturnDetail``showsellAndReturnDetail()`Combined bill detail
### Required Parameters by Action

Main Report (do=show):

Return Detail (do=returnDetail):

Combined Detail (do=sellAndReturnDetail):

---

๐Ÿงฎ Calculation Methods

Discount Calculation

// Fixed amount discount (type = 1)
if ($sellbilldiscounttype == 1) {
    $discount = $sellbilldiscount + $detaildiscount;
    $taxValue = $sellbillaftertotalbill - ($sellbilltotalbill - $sellbilldiscount);
}

// Percentage discount (type != 1)  
else {
    $discountValue = ($sellbilltotalbill / 100) * $sellbilldiscount;
    $discount = $discountValue + $detaildiscount;
    $taxValue = $sellbillaftertotalbill - ($sellbilltotalbill - $discountValue);
}

Tax Calculation

// Tax calculated after discount application
$taxValue = $billAfterTotal - ($billBeforeDiscount - $discountAmount);

Total Quantity Calculation

// For return bills
foreach ($returnsellbilldetailData as $detail) {
    $quantity = $quantity + $detail->returnsellbilldetailquantity;
}

// For combined bills (separate sales and returns)
foreach ($sellbilldetailData as $detail) {
    $sellQuantity = $sellQuantity + $detail->sellbilldetailquantity;
}
foreach ($returnbilldetailData as $detail) {
    $returnQuantity = $returnQuantity + $detail->sellbilldetailquantity;
}

---

๐Ÿ”’ Security & Permissions

User Permission Levels

// ViewBills Permission Check
$userData = $myUserRecord->load($_SESSION['userid']);

if ($userData->viewbills == 0) {
    // User can only see their own bills
    $queryString .= ' returnsellbill.userid =' . $_SESSION['userid'] . ' AND';
} elseif ($userData->viewbills == 2) {
    // User can see bills from their user group
    $queryString .= ' user2.usergroupid =' . $_SESSION['usergroupid'] . ' AND';
}

Permission Levels:

Input Sanitization

---

๐Ÿ“Š Performance Considerations

Database Optimization Tips

1. Required Indexes:

- returnsellbill(returnsellbillclientid, returnsellbilldate, conditions)

- sellbillandrutern(sellbillclientid, sellbilldate, conditions)

- returnsellbilldetail(returnsellbillid)

- sellandruternbilldetail(sellbillid, selltype)

2. Query Optimization:

- Use of efficient date range filtering

- Proper condition filtering to exclude cancelled bills

- Efficient joins for client name resolution

- Separate queries for different bill types to optimize indexes

3. Memory Management:

- Large date ranges may return significant data

- Consider pagination for high-volume return operations

- Efficient array merging for combined datasets

Known Performance Issues

-- This pattern can be slow for large datasets
SELECT * FROM returnsellbill r 
LEFT JOIN client c ON r.returnsellbillclientid = c.clientid
WHERE conditions = 0 
ORDER BY returnsellbilldate DESC;

-- Solution: Add composite indexes and limit results
CREATE INDEX idx_return_client_date ON returnsellbill(returnsellbillclientid, returnsellbilldate, conditions);

---

๐Ÿ› Common Issues & Troubleshooting

1. Missing Return Data

Issue: Some return bills don't appear in reports

Cause: Bills marked as cancelled or permission restrictions

Debug:

-- Check for cancelled bills
SELECT COUNT(*) FROM returnsellbill WHERE conditions != 0;

-- Check user permission restrictions
SELECT userid, viewbills FROM user WHERE userid = [SESSION_USERID];

2. Incorrect Discount Calculations

Issue: Discount amounts don't match bill totals

Cause: Mixed discount types or missing detail discounts

Debug:

-- Check discount configuration
SELECT returnsellbillid, returnsellbilldiscount, returnsellbilldiscounttype,
       returnsellbilltotalbill, returnsellbillaftertotalbill
FROM returnsellbill WHERE returnsellbillid = [BILL_ID];

-- Check detail-level discounts
SELECT SUM(returnsellbilldetaildiscount) 
FROM returnsellbilldetail WHERE returnsellbillid = [BILL_ID];

3. Date Range Issues

Issue: Reports show no data for valid date ranges

Cause: Timezone configuration or date format problems

Fix:

// Check timezone settings
$Programsetting = $ProgramsettingDAO->load(1);
echo "Report Plus Hours: " . $Programsetting->reportsPlusHours;

// Ensure proper date format
if (!empty($startDate)) $startDate .= " 00:00:00";
if (!empty($endDate)) $endDate .= " 23:59:59";

4. Combined Bill Display Issues

Issue: Combined bills show incorrect separation between sales and returns

Cause: Selltype field confusion or missing detail records

Debug:

-- Check selltype values in combined bill details
SELECT selltype, COUNT(*) 
FROM sellandruternbilldetail 
WHERE sellbillid = [BILL_ID] 
GROUP BY selltype;

-- Verify data consistency
SELECT * FROM sellandruternbilldetail WHERE sellbillid = [BILL_ID];

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Return Report

1. Create test return bills with different clients and dates
2. Apply various discount types and amounts
3. Run report with different date ranges
4. Verify calculations match bill totals
5. Check that cancelled bills are excluded

Test Case 2: Permission Enforcement

1. Login as user with viewbills = 0 (own bills only)
2. Create bills for different users
3. Run return report and verify only own bills appear
4. Test with different permission levels
5. Verify user group restrictions work correctly

Test Case 3: Combined Bill Processing

1. Create combined sales/return bills
2. Add both sales and return line items
3. Run combined bill detail report
4. Verify correct separation of sales vs returns
5. Check quantity calculations for each type

Debug Mode Enable

// Add at top of showAll() function for debugging
echo "Query String: " . $queryString . "<br>";
echo "Return Query String: " . $returnqueryString . "<br>";
echo "Date Range: " . $startDate . " to " . $endDate . "<br>";

// Debug data processing
foreach ($returnsellbillData as $bill) {
    echo "Bill ID: " . $bill->returnsellbillid . 
         " Amount: " . $bill->returnsellbillaftertotalbill . 
         " Discount: " . $bill->returnsellbilldiscount . "<br>";
}

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When return processing logic changes

โ†‘