MaintennanceArchive Documentation

Maintenance Archive Controller Documentation

File: /controllers/maintennanceArchiveController.php

Purpose: Displays archived maintenance records with filtering and search capabilities

Last Updated: December 20, 2024

Total Functions: 1

Lines of Code: ~122

---

๐Ÿ“‹ Overview

The Maintenance Archive Controller provides a read-only interface for viewing completed maintenance records. It handles:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Archive Data)

Table NamePurposeKey Columns
**m_comreceipt**Maintenance receipt headersreceiptserial, branchid
**m_comreceiptdetail**Maintenance receipt detailsid, receiptserial, ourserial, clientid, branchid
### Reference Tables

Table NamePurposeKey Columns
**client**Customer informationclientid, clientname
**branch**Branch informationbranchId, branchName
**user**System usersuserid, employeename
---

๐Ÿ”‘ Key Functions

1. Default Action (show) - Archive Display

Location: Lines 58-116

Purpose: Main archive viewing interface with filtering capabilities

Function Signature:

if (empty($do)||$do=="all")

Process Flow:

1. Load dropdown data for filters (serials, clients)

2. Process filter parameters from POST request

3. Build dynamic query string based on filters

4. Execute complex JOIN query if filters applied

5. Display results via archive template

Filter Parameters:

Data Loading Process:

// Load all receipt serials for dropdown
$allReceiptSerials = $MComreceiptDetailEX->getRecitSerialsByBranchEX($_SESSION['branchId']);

// Load all internal serials for dropdown
$serials = $MComreceiptDetailEX->getSerialsByBranchEX($_SESSION['branchId']);

// Load all clients for dropdown
$clients = $MComreceiptDetailEX->getClientsByBranchEX($_SESSION['branchId']);

Dynamic Query Building:

$queryString = '';

if(isset($receiptSerial) && $receiptSerial != -1) {
    $queryString .= ' AND  m_comreceipt.receiptserial = '.$receiptSerial;
}

if(isset($ourserial) && $ourserial != -1) {
    $queryString .= ' AND  m_comreceiptdetail.ourserial = "'.$ourserial.'"';
}

if(isset($clientid) && $clientid != -1) {
    $queryString .= ' AND  client.clientid = '.$clientid;
}

// Always filter by current branch
if($queryString != '') {
    $queryString .= ' AND  m_comreceiptdetail.branchid = '.$_SESSION['branchId'];
    $archiveData = $MComreceiptDetailEX->queryByBranchInDetailEX3($queryString);
}

---

๐Ÿ”„ Workflows

Workflow 1: Archive Data Filtering

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: View Archive Data
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Load Filter Options
- Get all receipt serials for branch
- Load internal serials for branch
- Fetch client list for branch
- Populate filter dropdowns
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Apply User Filters
IF receiptSerial selected:
โ”‚ โ””โ”€โ†’ Add receipt serial filter โ”‚
IF ourserial selected:
โ”‚ โ””โ”€โ†’ Add internal serial filter โ”‚
IF clientid selected:
โ”‚ โ””โ”€โ†’ Add client filter โ”‚
ALWAYS: Add branch filter from session
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Execute Archive Query
IF filters applied:
โ†’ Build complex JOIN query
โ†’ Execute via Extended DAO method
โ”‚ โ””โ”€โ†’ Return filtered archive data โ”‚
ELSE:
โ”‚ โ””โ”€โ†’ Display empty archive interface โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Display Results
- Show filtered archive records
- Maintain filter selections
- Provide export/print options
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay archive interface
`do=all`Default actionSame as empty - display archive
### Filter Parameters (POST)

ParameterTypeDescription
`receiptSerial`IntegerMaintenance receipt serial number
`ourserial`StringInternal tracking serial
`clientid`IntegerClient ID for customer filter
---

๐Ÿ”’ Security & Permissions

Branch-Level Security

// All data filtered by user's branch
$queryString .= ' AND  m_comreceiptdetail.branchid = '.$_SESSION['branchId'];

Session-Based Access Control

Data Protection

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Indexes Needed:

- m_comreceiptdetail(branchid, receiptserial)

- m_comreceiptdetail(branchid, ourserial)

- m_comreceiptdetail(branchid, clientid)

- m_comreceipt(receiptserial)

2. Query Performance:

- Complex JOINs may be slow with large datasets

- Branch filtering reduces data volume

- Consider pagination for large result sets

Extended DAO Methods

// Utilizes optimized Extended DAO methods
$allReceiptSerials = $MComreceiptDetailEX->getRecitSerialsByBranchEX($_SESSION['branchId']);
$archiveData = $MComreceiptDetailEX->queryByBranchInDetailEX3($queryString);

---

๐Ÿ› Common Issues & Troubleshooting

1. Empty Archive Display

Issue: No data shows even with valid filters

Cause: Branch session not set or invalid branch ID

Debug:

// Check session branch
echo "Current Branch: " . $_SESSION['branchId'];

// Verify branch has archive data
SELECT COUNT(*) FROM m_comreceiptdetail WHERE branchid = [branch_id];

2. Slow Query Performance

Issue: Archive queries taking too long

Cause: Missing indexes on filter columns

Fix: Add compound indexes:

CREATE INDEX idx_receipt_branch ON m_comreceiptdetail(branchid, receiptserial);
CREATE INDEX idx_serial_branch ON m_comreceiptdetail(branchid, ourserial);
CREATE INDEX idx_client_branch ON m_comreceiptdetail(branchid, clientid);

3. Filter Dropdown Issues

Issue: Filter dropdowns not populating

Cause: Extended DAO methods not returning data

Debug:

// Check if Extended DAO methods exist and work
$testSerials = $MComreceiptDetailEX->getRecitSerialsByBranchEX($_SESSION['branchId']);
var_dump($testSerials);

4. Cross-Branch Data Leakage

Issue: Users seeing data from other branches

Cause: Missing or incorrect branch filtering

Fix: Always verify branch filter is applied:

if(!isset($_SESSION['branchId'])) {
    throw new Exception("Branch session not set");
}

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Archive Access

1. Login with valid branch assignment
2. Navigate to archive controller
3. Verify filter dropdowns populate with branch data
4. Confirm no data from other branches visible

Test Case 2: Filter Functionality

1. Select receipt serial filter
2. Verify results match selected serial
3. Add client filter to receipt serial filter
4. Confirm combined filtering works correctly

Test Case 3: Branch Isolation

1. Login as user from Branch A
2. Check available archive data
3. Login as user from Branch B
4. Verify different data set appears

Test Case 4: Performance Testing

1. Load archive with large dataset
2. Apply various filter combinations
3. Measure query execution times
4. Verify acceptable performance levels

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When performance optimization needed