SaveTypeReport Documentation

Save Type Report Controller Documentation

File: /controllers/saveTypeReportController.php

Purpose: Generates reports for safe/cash register types and their associated saves

Last Updated: December 20, 2024

Total Functions: 2 functions (main actions)

Lines of Code: ~25

---

๐Ÿ“‹ Overview

The Save Type Report Controller is a simple reporting module that provides comprehensive analysis of save types (cash register/safe categories) and their associated saves. This controller focuses on:

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**savetype**Save type categoriesid, name, del
**save**Individual saves/cash registerssaveid, savetypeid, savecurrentvalue, conditions
### Key Relationships

-- One-to-many: Save Type -> Saves
savetype.id -> save.savetypeid

---

๐Ÿ”‘ Key Functions

1. Default Action (empty $do) - Save Type Report Display

Location: Lines 7-17

Purpose: Display all save types with their associated saves and totals

Process Flow:

1. Query all active save types (del < 2)

2. For each save type:

- Load associated saves where conditions = 0

- Calculate total current value using SUM(savecurrentvalue)

3. Assign data to Smarty template

4. Display report via savetypereportview/show.html

Template Variables:

Database Queries:

// Load all active save types
$savetype = R::findAll('savetype', 'del < 2');

// For each save type, load associated saves
$type->saves = R::getAll('select * from save where savetypeid = ' . $type->id . ' and conditions = 0');

// Calculate total value for save type
$type->total = R::getCell('select sum(savecurrentvalue) from save where savetypeid = ' . $type->id . ' and conditions = 0 group by savetypeid');

---

2. Show Action ($do == "show") - Alternative Display

Location: Lines 18-24

Purpose: Alternative view of save types without detailed calculations

Process Flow:

1. Load all active save types

2. Display basic save type list

3. Use same template as default action

---

๐Ÿ”„ Workflows

Workflow 1: Save Type Report Generation

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Access Save Type Report
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Query Save Types
- Load savetype table
- Filter active types (del < 2)
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2For Each Save Type
FOR EACH save type:
โ”‚
โ†’ Query associated saves
โ”‚ โ”‚ โ””โ”€ Filter active saves (conditions = 0) โ”‚
โ”‚
โ†’ Calculate total current value
โ”‚ โ”‚ โ””โ”€ SUM(savecurrentvalue) group by savetypeid โ”‚
โ”‚
โ”‚ โ””โ”€โ†’ Attach data to save type object โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Generate Report Display
- Assign data to Smarty template
- Include header and footer
- Display via savetypereportview/show.html
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionFull save type report with totals
`do=show`Show actionBasic save type list display
### Parameters

---

๐Ÿงฎ Calculation Methods

Total Value Calculation per Save Type

// Calculate sum of current values for all saves in a type
$type->total = R::getCell('select sum(savecurrentvalue) from save where savetypeid = ' . $type->id . ' and conditions = 0 group by savetypeid');

Active Records Filtering

// Save types: del < 2 (not deleted)
$savetype = R::findAll('savetype', 'del < 2');

// Saves: conditions = 0 (active)
$type->saves = R::getAll('select * from save where savetypeid = ' . $type->id . ' and conditions = 0');

---

๐Ÿ”’ Security & Permissions

Access Control

Input Sanitization

---

๐Ÿ“Š Performance Considerations

Database Optimization Tips

1. Indexes Recommended:

   CREATE INDEX idx_savetype_del ON savetype(del);
   CREATE INDEX idx_save_type_conditions ON save(savetypeid, conditions);
   ```

2. **Query Performance**:
   - Individual queries per save type may cause N+1 problem
   - Consider single JOIN query for better performance:
   ```sql
   SELECT st.*, s.*, SUM(s.savecurrentvalue) as total
   FROM savetype st
   LEFT JOIN save s ON st.id = s.savetypeid AND s.conditions = 0
   WHERE st.del < 2
   GROUP BY st.id;
   ```

3. **Memory Usage**:
   - Lightweight controller with minimal data processing
   - No pagination needed for typical save type counts

---

## ๐Ÿ› Common Issues & Troubleshooting

### 1. **Missing Save Type Totals**
**Issue**: Save type shows null or empty total  
**Cause**: No active saves associated with the save type

**Debug**:
sql

SELECT st.id, st.name, COUNT(s.saveid) as save_count,

SUM(s.savecurrentvalue) as total_value

FROM savetype st

LEFT JOIN save s ON st.id = s.savetypeid AND s.conditions = 0

WHERE st.del < 2

GROUP BY st.id;

### 2. **No Save Types Displayed**
**Issue**: Report shows empty list  
**Cause**: All save types marked as deleted (`del >= 2`)

**Fix**:
sql

-- Check save type status

SELECT id, name, del FROM savetype;

-- Restore deleted save types if needed

UPDATE savetype SET del = 0 WHERE del >= 2;

### 3. **Inactive Saves Not Counted**
**Issue**: Save exists but not included in totals  
**Cause**: Save marked as inactive (`conditions != 0`)

**Debug**:
sql

-- Check save status

SELECT saveid, savetypeid, savecurrentvalue, conditions

FROM save WHERE savetypeid = [SAVE_TYPE_ID];

---

## ๐Ÿงช Testing Scenarios

### Test Case 1: Basic Report Display

1. Ensure at least one save type exists with del < 2

2. Create test saves with various current values

3. Access controller without parameters

4. Verify all active save types display

5. Check total calculations are correct

### Test Case 2: Empty Save Types

1. Create save type with no associated saves

2. Run report

3. Verify save type appears with null/zero total

4. Confirm no errors occur

### Test Case 3: Mixed Active/Inactive Records

1. Create saves with conditions = 0 (active) and conditions = 1 (inactive)

2. Set some save types with del = 0 (active) and del = 2 (deleted)

3. Run report

4. Verify only active records are included in calculations

```

---

๐Ÿ“š Related Documentation

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur