ExternalMaintenanceGoReport Documentation
External Maintenance Go Report Controller Documentation
File: /controllers/externalMaintenanceGoReport.php
Purpose: Generates reports for external maintenance operations ready for dispatch to service providers
Last Updated: December 20, 2024
Total Functions: 2
Lines of Code: ~150
---
๐ Overview
The External Maintenance Go Report Controller is a specialized reporting module that generates dispatch reports for maintenance items ready to be sent to external service providers. It focuses on items that have been received and are ready to be shipped out for maintenance work (externalmaintenanceReturn = 0 and currentstage = 3). This controller plays a crucial role in the external maintenance workflow by providing visibility into items ready for dispatch.
Primary Functions
- โ Generate external maintenance dispatch reports
- โ Filter by supplier, date range, and branch
- โ Display items ready for external service
- โ Provide pagination for large datasets
- โ Integration with external maintenance workflow
- โ Branch-based access control
Related Controllers
- โข maintenancereceipts.php - Prior stage maintenance processing
- โข maintenancedeliverys.php - Post-service delivery processing
- โข maintenanceclients.php - Client management
- โข supplierController.php - Supplier management
---
๐๏ธ Database Tables
Primary Tables (Query Focus)
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **m_externalmaintenance** | External maintenance records | id, supplierId, externalmaintenanceDate, externalmaintenanceReturn, del, branchId | |
| **m_comreceiptdetail** | Receipt details with stages | id, currentstage |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **supplier** | Service providers | supplierid, suppliername | |
| **youtubelink** | Tutorial videos | youtubelinkid, title, url |
| Condition | Purpose | Impact | |
|---|---|---|---|
| **externalmaintenanceReturn = 0** | Items not yet returned | Shows active maintenance items | |
| **del = 0** | Non-deleted records | Active records only | |
| **currentstage = 3** | Ready for dispatch | Items at dispatch stage | |
| **branchId = session** | Branch restriction | User can only see own branch |
๐ Key Functions
1. Default Action (Empty $do or "all") - Generate Report
Location: Lines 35-49
Purpose: Display the external maintenance dispatch report with filtering options
Process Flow:
1. Call showAll() function to process data
2. Load all suppliers for filter dropdown
3. Set report titles and navigation
4. Display header template
5. Load externalMaintenanceGoReportView/externalMaintenanceGoReport.html template
Template Assignment:
$smarty->assign("title1", 'ุงูุตูุงูุฉ'); // Maintenance
$smarty->assign("title2", 'ุฅุฏุงุฑุฉ ุงูุตูุงูุฉ ุงูุฎุงุฑุฌูุฉ'); // External Maintenance Management
$smarty->assign("title3", 'ุนุฑุถ ุงูู
ูุชุฌุงุช'); // Show Products
$smarty->assign("link", '#');
Data Sources:
- โข
$allSuppliers- Supplier dropdown options - โข
$MExternalmaintenanceData- Filtered maintenance data
---
2. showAll() - Core Report Logic
Location: Lines 65-148
Purpose: Process filters and generate the maintenance dispatch report data
Function Signature:
function showAll()
Input Parameters (via POST):
- โข
supplierid- Filter by specific supplier (-1 for all) - โข
from- Start date filter (YYYY-MM-DD) - โข
to- End date filter (YYYY-MM-DD)
Process Flow:
1. Initialize Query Building:
$queryString = ' WHERE';
```
2. **Apply Supplier Filter**:
```php
if (isset($supplierid) && $supplierid != -1) {
$queryString .= ' m_externalmaintenance.supplierId = ' . $supplierid . ' AND';
}
```
3. **Apply Date Range Filter**:
```php
if (isset($from) && !empty($from) && isset($to) && !empty($to)) {
$queryString .= ' DATE( m_externalmaintenance.externalmaintenanceDate ) >= "' . $from . '" AND DATE( m_externalmaintenance.externalmaintenanceDate ) <= "' . $to . '"';
}
```
4. **Clean Query String**:
- Remove trailing 'AND' if present
- Remove 'WHERE' if no conditions added
- Ensure proper SQL syntax
5. **Apply Core Filters**:
```php
if ($queryString == ' ') {
$queryString .= ' WHERE externalmaintenanceReturn = 0';
} else {
$queryString .= ' AND externalmaintenanceReturn = 0';
}
$queryString .= ' AND m_externalmaintenance.del = 0 AND m_comreceiptdetail.currentstage = 3 AND m_externalmaintenance.branchId = ' . $_SESSION['branchId'];
```
6. **Execute Queries**:
- Get total count for pagination
- Get paginated data with limit/offset
- Assign data to Smarty template
7. **Setup Pagination**:
```php
$paginate = new SmartyPaginate;
$paginate->connect();
$paginate->setLimit(100); // 100 items per page
$paginate->setTotal(count($MExternalmaintenanceData));
```
---
## ๐ Workflows
### Workflow 1: External Maintenance Dispatch Report Generation
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ START: Generate Dispatch Report โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 1. Load Report Page โ
โ - Display report form โ
โ - Load supplier dropdown options โ
โ - Set default filters (current user's branch) โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 2. Apply User Filters โ
โ - Select supplier (optional) โ
โ - Set date range (optional) โ
โ - Submit filter form โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 3. Process Filters (showAll) โ
โ - Build dynamic WHERE clause โ
โ - Apply supplier filter if specified โ
โ - Apply date range if specified โ
โ - Ensure proper query syntax โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 4. Apply Core Business Logic โ
โ - Filter externalmaintenanceReturn = 0 โ
โ - Filter del = 0 (active records) โ
โ - Filter currentstage = 3 (ready for dispatch) โ
โ - Restrict to user's branch โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 5. Execute Queries โ
โ - Get total count for pagination setup โ
โ - Execute paginated query โ
โ - Load maintenance data with supplier info โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 6. Display Report Results โ
โ - Show filtered maintenance items โ
โ - Display pagination controls โ
โ - Provide export/print options โ
โ - Include supplier and date information โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
---
### Workflow 2: External Maintenance Item Lifecycle Context
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ External Maintenance Flow โ
โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 1: Item Receipt โ
โ - Customer brings item for maintenance โ
โ - Item details recorded โ
โ - currentstage < 3 โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 2: Internal Processing โ
โ - Initial assessment completed โ
โ - Decision made for external service โ
โ - currentstage approaching 3 โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 3: Ready for Dispatch (THIS REPORT) โ
โ - Item ready to send to external provider โ
โ - currentstage = 3 โ
โ - externalmaintenanceReturn = 0 โ
โ - Appears in this report โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 4: Dispatched to External Provider โ
โ - Item physically sent out โ
โ - Tracking information recorded โ
โ - Status updated in system โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Stage 5: Returned from External Service โ
โ - Item completed and returned โ
โ - externalmaintenanceReturn = 1 โ
โ - Ready for customer delivery โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
---
## ๐ URL Routes & Actions
| URL Parameter | Function Called | Description |
|---------------|----------------|-------------|
| `do=` (empty) or `do=all` | `showAll()` | Generate dispatch report with filters |
### Required Parameters
**Generate Report** (empty `do` or `do=all`):
- No required parameters
- Optional POST parameters:
- `supplierid` - Supplier filter (-1 for all)
- `from` - Start date (YYYY-MM-DD format)
- `to` - End date (YYYY-MM-DD format)
### Filter Parameter Behavior
**Supplier Filter**:
- `-1` or unset: Show all suppliers
- Valid supplier ID: Show only that supplier's items
**Date Filter**:
- Both `from` and `to` must be provided for date filtering
- If either is missing, date filter is ignored
- Uses `DATE()` function for date comparison
**Branch Filter**:
- Automatically applied based on `$_SESSION['branchId']`
- Users can only see items from their own branch
---
## ๐งฎ Calculation Methods
### No Complex Calculations
This controller focuses on data filtering and display rather than calculations:
### 1. **Query String Building Logic**
php
// Dynamic WHERE clause construction
$queryString = ' WHERE';
// Add conditions and clean up syntax
$arr = explode(' ', $queryString);
if (isset($arr) && count($arr) > 0) {
$lastWord = end($arr);
if ($lastWord == 'AND') {
array_pop($arr); // Remove trailing AND
$queryString = implode(' ', $arr);
} else if ($lastWord == 'WHERE') {
array_pop($arr); // Remove standalone WHERE
$queryString = ' ';
}
}
### 2. **Pagination Calculations**
php
$paginate = new SmartyPaginate;
$paginate->setLimit(100); // Items per page
$paginate->setTotal(count($MExternalmaintenanceData)); // Total items
// Get paginated subset
$MExternalmaintenanceData = $MExternalmaintenanceEX->queryByExternalmaintenanceReturnEXWithLimit(
$queryString,
$paginate->getCurrentIndex(), // Offset
$paginate->getLimit() // Limit
);
### 3. **Date Comparison Logic**
php
// Date range filtering using DATE() function
if (isset($from) && !empty($from) && isset($to) && !empty($to)) {
$queryString .= ' DATE( m_externalmaintenance.externalmaintenanceDate ) >= "' . $from . '" AND DATE( m_externalmaintenance.externalmaintenanceDate ) <= "' . $to . '"';
}
---
## ๐ Security & Permissions
### Branch-Based Access Control
php
// Automatic branch restriction
$queryString .= ' AND m_externalmaintenance.branchId = ' . $_SESSION['branchId'];
**Security Features**:
- Users can only see items from their own branch
- No cross-branch data exposure
- Session-based branch filtering
### Input Sanitization
- POST parameters should be validated before use
- Date inputs should be format-validated
- Supplier ID should be numeric validation
**Potential Security Issues**:
php
// Current implementation lacks input validation
$supplierid = $_POST["supplierid"]; // Should validate as integer
$from = $_POST["from"]; // Should validate date format
$to = $_POST["to"]; // Should validate date format
**Recommended Security Enhancements**:
php
// Secure input handling
$supplierid = filter_input(INPUT_POST, 'supplierid', FILTER_VALIDATE_INT);
$from = filter_input(INPUT_POST, 'from', FILTER_SANITIZE_STRING);
$to = filter_input(INPUT_POST, 'to', FILTER_SANITIZE_STRING);
// Date format validation
if ($from && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $from)) {
$from = null;
}
if ($to && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $to)) {
$to = null;
}
---
## ๐ Performance Considerations
### Database Optimization
1. **Critical Indexes Required**:
- `m_externalmaintenance(externalmaintenanceReturn, del, branchId)` - Core filters
- `m_externalmaintenance(externalmaintenanceDate)` - Date filtering
- `m_externalmaintenance(supplierId)` - Supplier filtering
- `m_comreceiptdetail(currentstage)` - Stage filtering
2. **Query Performance**:
- Uses DATE() function which can be slow on large datasets
- Multiple filter conditions with proper indexing
- Pagination limits result set size
### Performance Considerations
- **Large Date Ranges**: Could return many records
- **Cross-Table JOINs**: Requires proper index coverage
- **Session-Based Filtering**: Efficient with proper indexing
### Recommended Optimizations
sql
-- Composite index for common filter combination
CREATE INDEX idx_external_maintenance_filters
ON m_externalmaintenance(externalmaintenanceReturn, del, currentstage, branchId);
-- Date index for range queries
CREATE INDEX idx_external_maintenance_date
ON m_externalmaintenance(externalmaintenanceDate);
---
## ๐ Common Issues & Troubleshooting
### 1. **No Data Showing**
**Issue**: Report shows no results when data exists
**Possible Causes**:
- Incorrect stage filtering (`currentstage != 3`)
- Items already returned (`externalmaintenanceReturn = 1`)
- Branch restriction issues
- Date format problems
**Debug**:
sql
-- Check items by stage
SELECT currentstage, COUNT(*)
FROM m_comreceiptdetail
GROUP BY currentstage;
-- Check return status
SELECT externalmaintenanceReturn, COUNT(*)
FROM m_externalmaintenance
WHERE del = 0
GROUP BY externalmaintenanceReturn;
-- Check branch distribution
SELECT branchId, COUNT(*)
FROM m_externalmaintenance
WHERE del = 0 AND externalmaintenanceReturn = 0
GROUP BY branchId;
### 2. **Date Filter Not Working**
**Issue**: Date range filtering produces unexpected results
**Cause**: Date format mismatches or timezone issues
**Debug**:
sql
-- Check date formats in database
SELECT
externalmaintenanceDate,
DATE(externalmaintenanceDate) as date_only,
COUNT(*)
FROM m_externalmaintenance
GROUP BY DATE(externalmaintenanceDate)
ORDER BY externalmaintenanceDate DESC
LIMIT 10;
### 3. **Pagination Issues**
**Issue**: Incorrect item counts or pagination not working
**Cause**: Count query differs from data query
**Debug**:
php
// Add debugging to showAll() function
error_log("Query String: " . $queryString);
error_log("Total Count: " . count($MExternalmaintenanceData));
error_log("Current Page: " . $paginate->getCurrentIndex());
### 4. **Supplier Filter Problems**
**Issue**: Supplier filtering not working correctly
**Cause**: Invalid supplier IDs or missing supplier data
**Debug**:
sql
-- Check supplier relationships
SELECT
s.supplierid,
s.suppliername,
COUNT(em.id) as item_count
FROM supplier s
LEFT JOIN m_externalmaintenance em ON s.supplierid = em.supplierId
WHERE em.del = 0 AND em.externalmaintenanceReturn = 0
GROUP BY s.supplierid, s.suppliername;
---
## ๐งช Testing Scenarios
### Test Case 1: Basic Report Generation
1. Navigate to externalMaintenanceGoReport.php
2. Verify page loads with supplier dropdown
3. Submit without filters - should show all available items
4. Check pagination if more than 100 items
5. Verify only current branch items appear
### Test Case 2: Filter Testing
1. Test supplier filter with different suppliers
2. Test date range filtering with various ranges
3. Test combination of supplier + date filters
4. Test edge cases (no items, invalid dates)
5. Verify filter reset functionality
### Test Case 3: Data Accuracy
1. Create test maintenance items in stage 3
2. Verify they appear in report
3. Change stage and verify they disappear
4. Test with different branch users
5. Check returned items don't appear
### Test Case 4: Performance Testing
1. Test with large datasets (1000+ items)
2. Verify pagination performance
3. Test complex date range queries
4. Check query execution times
5. Validate memory usage with large result sets
```
---
๐ Related Documentation
- โข CLAUDE.md - PHP 8.2 migration guide
- โข maintenancereceipts.md - Receipt processing (prior stage)
- โข maintenancedeliverys.md - Delivery processing (post-service)
- โข supplierController.php - Supplier management
- โข Database Schema Documentation - External maintenance tables
---
Documented By: AI Assistant
Review Status: โ Complete
Key Features: Dispatch reporting, branch security, pagination
Security Notes: โ ๏ธ Input validation needed for POST parameters
Next Review: When external maintenance workflow changes