Claim Documentation

Claim Controller Documentation

File: /controllers/claimController.php

Purpose: Manages financial claims against client bills with complex transaction tracking and Excel export

Last Updated: December 20, 2024

Total Functions: 8

Lines of Code: ~609

---

๐Ÿ“‹ Overview

The Claim Controller is a sophisticated financial module that handles claims against client sales and return bills. It manages:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**claims**Main claim recordsid, from_date, to_date, typeclientids, claim_number, claim_value, claim_comment, debttrue, stoptrue, addtoday, adduserid
**claimstypeclients**Claim-client type associationsid, claimid, typeclientid, del, deltoday, deluserid
**claimsclientbills**Claim-client bill relationshipsid, claimid, clientid, typeclientid, sellbillfinalbill, returnsellbillfinalbill, valueclaimed, sellbillidsprices, returnsellbillidsprices
**claimsellbills**Individual sell bill claimsid, claimid, claimsclientbillid, claimsellbillid, claimsellbillfinalbill, del
**claimreturnsellbills**Individual return bill claimsid, claimid, claimsclientbillid, claimreturnsellbillid, claimreturnsellbillfinalbill, del
### Sales Tables (Referenced)

Table NamePurposeKey Columns
**sellbill**Sales billssellbillid, sellbillclientid, sellbillfinalbill, sellbilltypeclientid, sellbilldate, conditions
**returnsellbill**Return billsreturnsellbillid, returnsellbillclientid, returnsellbillfinalbill, returnsellbilltypeclientid, returnsellbilldate, conditions
**client**Customer master dataclientid, clientname
**typeclient**Client typestypeId, typeName
### Status Tables

Table NamePurposeKey Columns
**claimstop**Claim status historyid, claimid, stops, addtoday, adduserid
**claimdebts**Claim debt collectionid, claimid, del
---

๐Ÿ”‘ Key Functions

1. Default Action - Add Claim Form

Location: Lines 15-20

Purpose: Display the claim creation form

Template: claimview/add.html

---

2. show() - List Claims

Location: Lines 20-32

Purpose: Display claim listing page with data tables

Template: claimview/show.html

---

3. edit() - Edit Claim Form

Location: Lines 33-54

Purpose: Display claim editing form with related data

Process Flow:

1. Load claim record

2. Get associated client types

3. Load claim client bills with joins

4. Display edit form

Complex Query:

SELECT claimsclientbills.*, clientname, typeName  
FROM `claimsclientbills`
JOIN client ON client.clientid = claimsclientbills.clientid
JOIN typeclient ON typeclient.typeId = claimsclientbills.typeclientid
WHERE claimid = ? AND claimsclientbills.del < 2

Template: claimview/edit.html

---

4. detail() - View Claim Details

Location: Lines 54-74

Purpose: Read-only view of claim details (same as edit but different template)

Template: claimview/detail.html

---

5. excel() - Excel Export

Location: Lines 76-151

Purpose: Generate Excel export of claim data

Function Flow:

function excel() {
    include '../library/Classes/PHPExcel/IOFactory.php';
    
    // Load claim data
    $claim = R::load('claims', $id);
    
    // Get claim client bills
    $send_data = R::getAll('SELECT claimsclientbills.*, clientname, typeName...');
    
    // Create Excel workbook
    $objPHPExcel = new PHPExcel();
    
    // Set headers
    $objPHPExcel->getActiveSheet()
        ->setCellValue('A1', "ser(pk)")
        ->setCellValue('B1', "ุงู„ุนู…ูŠู„")
        ->setCellValue('C1', "ุฌู‡ุฉ ุงู„ุชุนุงู‚ุฏ")
        ->setCellValue('D1', "ุงู„ู…ุชุจู‚ู‰");
    
    // Populate data
    foreach ($send_data as $item) {
        // Add row data
    }
    
    // Export as Excel5 format
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="ุงู„ู…ุทุงู„ุจู‡ ุฑู‚ู… '.$id.'.xls"');
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
}

Excel Features:

---

6. stop() - Claim Status Control

Location: Lines 151-169

Purpose: Activate or deactivate claims

Process Flow:

1. Update claim stoptrue status

2. Record stop timestamp and user

3. Create audit entry in claimstop table

4. Redirect to show page

Status Values:

---

7. savedata() - Save/Update Claim

Location: Lines 293-452

Purpose: Complex claim creation/update with bill relationships

Function Signature:

function savedata()

Process Flow:

1. Extract form data
   โ”œโ”€โ”€ Basic claim info (dates, numbers, comments)
   โ”œโ”€โ”€ Client type IDs (comma-separated)
   โ””โ”€โ”€ Multiple client bill entries

2. Create/Update claim record
   โ”œโ”€โ”€ Set claim value and comment
   โ””โ”€โ”€ Store type client IDs

3. Process Client Types
   โ”œโ”€โ”€ Loop through type IDs
   โ”œโ”€โ”€ Create claimstypeclients records if not exist
   โ””โ”€โ”€ Maintain existing relationships

4. Process Client Bills
   โ”œโ”€โ”€ Loop through sellbills count
   โ”œโ”€โ”€ Create/update claimsclientbills
   โ”œโ”€โ”€ Process sell bill ID strings
   โ”œโ”€โ”€ Process return bill ID strings
   โ””โ”€โ”€ Create individual bill claim records

5. Create Individual Bill Claims
   โ”œโ”€โ”€ Parse sell bill IDs (format: "id/amount,id/amount")
   โ”œโ”€โ”€ Create claimsellbills records
   โ”œโ”€โ”€ Parse return bill IDs
   โ””โ”€โ”€ Create claimreturnsellbills records

Complex Data Structures:

// Sell bill IDs format: "123/1500.00,124/2000.00"
$sellbillids = explode(',', $sellbillids);
for ($i2 = 0; $i2 < count($sellbillids); $i2++) {
    $exsellbillids = explode('/', $sellbillids[$i2]);
    // $exsellbillids[0] = bill ID
    // $exsellbillids[1] = bill amount
}

---

8. changetypeclient() - Dynamic Client Type Selection

Location: Lines 175-252

Purpose: Ajax endpoint for filtering clients by type and date range

Function Flow:

function changetypeclient() {
    // Get filters
    $from_date = filter_input(INPUT_POST, 'from_date');
    $to_date = filter_input(INPUT_POST, 'to_date');
    $typeclientids = filter_input(INPUT_POST, 'typeclientids');
    
    // Build queries with date and type filters
    $sellbillQuery = '';
    $returnsellbillQuery = '';
    
    // Get unclaimed sell bills
    $sellbills = R::getAll('SELECT sellbillclientid as clientid, clientname, 
        sellbilltypeclientid, typeName, sum(sellbillfinalbill) as sellbillfinalbill,
        GROUP_CONCAT(CONCAT(sellbillid,"/",sellbillfinalbill) SEPARATOR ",") AS sellbillids
        FROM sellbill ... WHERE ... claimsellbills.claimsellbillid is null');
    
    // Get unclaimed return bills
    $returnsellbills = R::getAll('SELECT returnsellbillclientid as clientid, 
        returnsellbilltypeclientid, sum(returnsellbillfinalbill) as returnsellbillfinalbill,
        GROUP_CONCAT(CONCAT(returnsellbillid,"/",returnsellbillfinalbill) SEPARATOR ",") AS returnsellbillids
        FROM returnsellbill ... WHERE ... claimreturnsellbills.claimreturnsellbillid is null');
    
    // Merge and calculate totals
    foreach($sellbills as $key => $sellbill) {
        $valueclaimed = (int)$sellbill['sellbillfinalbill'] + $returnsellbills[$key]['returnsellbillfinalbill'];
        $sellbills[$key]['valueclaimed'] = $valueclaimed;
        $allvalueclaimed += $valueclaimed;
    }
}

Key Features:

---

9. showajax() - Ajax Data Table

Location: Lines 453-581

Purpose: Provide data for claim listing with complex filtering

Columns Returned:

1. Claim ID

2. From date

3. To date

4. Client types (concatenated names)

5. Claim number

6. Claim value

7. Add date

8. Employee name

9. Excel export button

10. Collection button (conditional)

11. Stop/Activate button

12. Edit button

13. Delete button

Status-Based Actions:

if($row["debttrue"] == 1) {
    // Collected claims - show Excel and collection details
    $sub_array[] = '<a href="claimController.php?do=excel&id=' . $row["id"] . '">ุงูƒุณู„</a>';
    $sub_array[] = '<a href="claimdebtController.php?do=detail&id=' . $claimdebt["id"] . '">ุชูุงุตูŠู„ ุงู„ุชุญุตูŠู„</a>';
} else if ($row["stoptrue"] == 1) {
    // Active claims - show full controls
    $sub_array[] = '<a href="claimdebtController.php?do=&id=' . $row["id"] . '">ุชุญุตูŠู„</a>';
    $sub_array[] = '<a href="claimController.php?do=stop&id=' . $row["id"] . '&stoptrue=0">ุงูŠู‚ุงู</a>';
} else {
    // Stopped claims - show activate option
    $sub_array[] = '<a href="claimController.php?do=stop&id=' . $row["id"] . '&stoptrue=1">ุชูุนูŠู„</a>';
}

---

10. removecontroller() - Delete Claim

Location: Lines 584-605

Purpose: Soft delete claim and all related records

Cascade Delete:

UPDATE `claimstypeclients` SET `del`= 2 WHERE claimid = $id
UPDATE `claimsclientbills` SET `del`= 2 WHERE claimid = $id  
UPDATE `claimsellbills` SET `del`= 2 WHERE claimid = $id
UPDATE `claimreturnsellbills` SET `del`= 2 WHERE claimid = $id

---

๐Ÿ”„ Workflows

Workflow 1: Claim Creation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Create New Claim
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Set Date Range & Client Types
- Select from/to dates
- Choose client types to include
- System filters unclaimed bills
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Load Available Bills
- Query unclaimed sell bills
- Query unclaimed return bills
- Group by client and type
- Calculate combined values
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3User Reviews and Adjusts
- Review bill selection
- Adjust claim amounts if needed
- Add claim number and comment
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Create Claim Structure
- Create main claim record
- Create type client associations
- Create client bill relationships
- Create individual bill claims
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

Workflow 2: Claim Processing Lifecycle

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Claim Active
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Claim Management Options
โ†’ Export to Excel
โ†’ Stop/Activate claim
โ†’ Edit claim details
โ”‚ โ””โ”€โ†’ Begin collection process โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Collection Process (claimdebtController)
- Create debt collection record
- Process bill payments
- Handle taxes and discounts
- Update claim status (debttrue = 1)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Completed Claim
- Export collection details
- View collection summary
- Claim marked as collected
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay claim add form
`do=show`Show viewDisplay claim listing page
`do=edit&id={id}`Edit viewDisplay claim edit form
`do=detail&id={id}`Detail viewDisplay claim details (read-only)
`do=excel&id={id}`Excel exportGenerate Excel file
`do=stop&id={id}&stoptrue={0\1}``stop()`Change claim status
`do=savedata``savedata()`Process claim save/update
`do=showajax``showajax()`Ajax data for claim table
`do=removecontroller``removecontroller()`Soft delete claim
`do=changetypeclient``changetypeclient()`Filter clients by type
`do=removeclaimsclientbills`Remove client billsDelete claim client bill
`do=gettypeclientids`Get type client IDsAjax endpoint for dropdowns
---

๐Ÿงฎ Calculation Methods

Claim Value Calculation

// Combine sell bills and return bills
$valueclaimed = (int)$sellbill['sellbillfinalbill'] + $returnsellbills[$key]['returnsellbillfinalbill'];

// Aggregate across all client types
$allvalueclaimed += $valueclaimed;

Bill ID String Processing

// Parse bill ID strings: "123/1500.00,124/2000.00"
$sellbillids = explode(',', $sellbillids);
for ($i2 = 0; $i2 < count($sellbillids); $i2++) {
    if (!$sellbillids[$i2]) continue;
    $exsellbillids = explode('/', $sellbillids[$i2]);
    $billId = $exsellbillids[0];
    $billAmount = $exsellbillids[1];
}

Custom Array Indexing

// Function to create multi-level array indexes
$sellbills = customArrayManyIndexOne($sellbills, $colName = ['clientid','sellbilltypeclientid']);

---

๐Ÿ”’ Security & Permissions

Input Sanitization

Data Integrity

Access Control

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Critical Indexes:

- claims(addtoday, del)

- claimsclientbills(claimid, del)

- sellbill(sellbilltypeclientid, sellbilldate, conditions)

- returnsellbill(returnsellbilltypeclientid, returnsellbilldate, conditions)

2. Query Optimization:

- Complex GROUP BY with CONCAT for bill aggregation

- LEFT JOIN with NULL checks to exclude claimed bills

- Efficient date range filtering

Memory Management

---

๐Ÿ› Common Issues & Troubleshooting

1. Bills Not Appearing in Claims

Issue: Available bills not showing in claim creation

Cause: Bills already claimed or date range issues

Debug:

-- Check if bills are already claimed
SELECT COUNT(*) FROM claimsellbills WHERE claimsellbillid = {bill_id} AND del < 2;

-- Check bill date range
SELECT sellbilldate FROM sellbill WHERE sellbillid = {bill_id};

2. Excel Export Failures

Issue: Excel file not downloading or corrupted

Cause: Headers already sent or memory limits

Fix:

// Ensure no output before headers
ob_clean();
// Increase memory if needed
ini_set('memory_limit', '256M');

3. Claim Value Discrepancies

Issue: Total claim value doesn't match individual bills

Cause: Return bill negative values or rounding issues

Debug:

-- Verify bill amounts
SELECT 
    SUM(claimsellbillfinalbill) as sell_total,
    SUM(claimreturnsellbillfinalbill) as return_total
FROM claimsclientbills WHERE claimid = {id};

---

๐Ÿงช Testing Scenarios

Test Case 1: Complex Claim Creation

1. Create mix of sell and return bills across different client types
2. Create claim covering specific date range
3. Verify only unclaimed bills appear
4. Check claim value calculations
5. Confirm all relationship tables populated correctly

Test Case 2: Excel Export Integrity

1. Create claim with Arabic client names
2. Export to Excel
3. Verify file downloads correctly
4. Check Arabic text displays properly
5. Confirm all data matches claim details

Test Case 3: Claim Status Lifecycle

1. Create active claim (stoptrue = 1)
2. Stop claim and verify status change
3. Activate claim again
4. Process through collection (claimdebtController)
5. Verify final status and available actions

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur