Beneficiaries Documentation
Beneficiaries Controller Documentation
File: /controllers/beneficiariesController.php
Purpose: Manages charity beneficiaries database with comprehensive demographic, socioeconomic, and housing data
Last Updated: December 20, 2024
Total Functions: 15+
Lines of Code: ~1,084
---
๐ Overview
The Beneficiaries Controller is a comprehensive beneficiary management module that handles detailed beneficiary registration, tracking, and reporting for charity organizations. It provides:
- โข Complete beneficiary profile management with demographics
- โข Detailed housing condition assessments
- โข Household inventory tracking (furniture, appliances)
- โข Family member information management
- โข Economic status documentation
- โข Excel import/export functionality
- โข Multi-charity support with permission controls
- โข Beneficiary search and verification system
- โข Subvention payment tracking
Primary Functions
- โ Create and edit comprehensive beneficiary profiles
- โ Track household inventory (appliances, furniture)
- โ Manage family member details
- โ Document economic conditions
- โ Excel bulk import with duplicate checking
- โ Search beneficiaries by ID number
- โ Multi-charity beneficiary assignment
- โ Age calculation from ID numbers
- โ Image upload and management
- โ Payment history tracking
Related Controllers
- โข charityController.php - Charity management
- โข subventionController.php - Payment processing
- โข areaController.php - Geographic areas
- โข diseaseController.php - Health conditions
---
๐๏ธ Database Tables
Primary Tables (Direct Operations)
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **beneficiaries** | Main beneficiary data | id, name, idnumber, phone_no, address, charity_id, area_id, age, diseas, work, workplace, del, sysdate, user_id | |
| **beneficiaries_family** | Family member details | id, beneficiaries_id, name, relation, age, id_number, status, job, salary, health_status, education_status | |
| **beneficiaries_eco** | Economic data | id, beneficiaries_id, income, paying | |
| **area** | Geographic areas | id, name, user_id, sysdate | |
| **disease** | Health conditions | id, name, del, user_id, sysdate |
| Table Name | Purpose | Key Columns | |
|---|---|---|---|
| **charities** | Charity organizations | id, charityname, charityphone, del | |
| **subvention** | Aid assignments | id, beneficier_id, charity_id, financial_aid, inkind_aid, guarantee_type_id, notes, del, sysdate | |
| **subventionpay** | Payment records | id, benefeciary_id, charity_id, month, financial_aid, inkind_aid, notes, del, sysdate | |
| **charitysearchlog** | Search activity log | id, user_id, charity_id, sysdate, idnumber, benefeciary_id | |
| **charityaddsubjectdetails** | Charity subject relations | charitysubjectid, charityid, del |
| Table Name | Purpose | Key Columns |
|---|---|---|
| **user** | System users | userid, username, charityids (session filter) |
๐ Key Functions
1. Default Action - Add Beneficiary Form
Location: Line 10
Purpose: Display add beneficiary form with all required dropdowns
Process Flow:
1. Load areas for area dropdown
2. Load diseases for disease dropdown
3. Apply charity session filter
4. Load charities for charity dropdown
5. Display add form template
Template Variables:
- โข
$allAreas- Available areas - โข
$allDisease- Available diseases - โข
$allCharities- Filtered charities - โข
$charity- Flag for charity mode
---
2. addSimple - Simplified Add Form
Location: Line 28
Purpose: Display simplified beneficiary add form
Process Flow:
1. Apply charity session filter
2. Load filtered charities
3. Display simplified template (add_smpl.html)
---
3. show - List Beneficiaries
Location: Line 41
Purpose: Display beneficiaries listing with search and filtering
Process Flow:
1. Check authentication
2. Apply charity session filter
3. Load charities for filter dropdown
4. Display listing template with DataTables
---
4. edit - Edit Beneficiary
Location: Line 56
Purpose: Load and display beneficiary editing form with all related data
Function Signature:
$id = filter_input(INPUT_GET, 'id');
Process Flow:
1. Load beneficiary by ID
2. Load areas, diseases, charities
3. Load family members for this beneficiary
4. Load economic data for this beneficiary
5. Display edit template with all data
Related Data Loading:
$allFamily = R::getAll('select * from beneficiaries_family where beneficiaries_id = ' . $id);
$allEco = R::getAll('select * from beneficiaries_eco where beneficiaries_id = ' . $id);
---
5. savedata() - Save Beneficiary Data
Location: Line 239
Purpose: Comprehensive beneficiary data save with image upload
Function Signature:
function savedata()
Process Flow:
1. Extract 80+ form fields (demographics, housing, inventory)
2. Handle image upload/update
3. Create new or load existing beneficiary record
4. Save main beneficiary data
5. Call saveFamilyData() to save family members
6. Call saveEcoData() to save economic data
7. Return success/error response
Key Features:
- โข Image upload with resize (300x300)
- โข Age validation and room/rent conditioning
- โข Comprehensive housing condition tracking
- โข Appliance and furniture inventory
- โข Audit trail with user and date tracking
Data Categories Saved:
- โข Demographics: name, nickname, age, ID number, phone, address
- โข Social: marital status, work, workplace, diseases, health status
- โข Housing: floors, rooms, rent, bathroom, flooring, ceiling, walls, lighting
- โข Appliances: cooker, washer, fridge, fan, phone, casset, blender, TV
- โข Furniture: bed, wardrobe, couch, salon, chair, library, carpet, mat, blanket
- โข Assessment: beneficiary needs, observer needs, opinions, final recommendations
---
6. showajax() - DataTables AJAX
Location: Line 503
Purpose: Provide paginated, searchable beneficiary data for DataTables
Function Signature:
function showajax()
Parameters:
- โข
start_date,end_date- Date range filter - โข
del- Deletion status filter - โข
data1- Beneficiary ID search - โข
data2- ID number search - โข
data3- Beneficiary ID filter - โข
chID- Charity ID filter
Process Flow:
1. Build dynamic WHERE clause based on filters
2. Apply charity session permissions
3. Execute search with pagination
4. Format data for DataTables JSON response
5. Include action buttons (edit/delete) based on deletion status
Search Fields:
OR beneficiaries.id LIKE "%{search}%"
OR beneficiaries.phone_no LIKE "%{search}%"
OR beneficiaries.idnumber LIKE "%{search}%"
OR beneficiaries.name LIKE "%{search}%"
---
7. removecontroller() - Soft Delete
Location: Line 612
Purpose: Soft delete beneficiary record
Function Signature:
function removecontroller()
Process Flow:
1. Load beneficiary by POST ID
2. Set del = 2 (soft delete)
3. Record deletion date and user
4. Save changes
5. Return success/error status
---
8. saveFamilyData() - Family Members Management
Location: Line 631
Purpose: Save and update family member information
Function Signature:
function saveFamilyData($beneficiariesid, $edit)
Process Flow:
1. Loop through family iteration count (familyItr)
2. For each family member:
- Extract family data (name, relation, age, ID, status, job, salary, health, education)
- Create new or load existing family record
- Save family member data
- Collect saved IDs
3. Delete family members not in current list
Family Data Fields:
- โข Personal: name, relation, age, id_number
- โข Status: status, job, salary
- โข Health: health_status, education_status
---
9. saveEcoData() - Economic Data Management
Location: Line 674
Purpose: Save household economic information
Function Signature:
function saveEcoData($beneficiariesid, $edit)
Process Flow:
1. Loop through economic iteration count (ecoItr)
2. For each economic entry:
- Extract income and paying fields
- Create new or load existing eco record
- Save economic data
- Collect saved IDs
3. Delete economic records not in current list
---
10. getBenData() - Beneficiary Search
Location: Line 123
Purpose: Search beneficiary by ID number and display aid history
Function Signature:
$idNo = filter_input(INPUT_POST, 'idno');
Process Flow:
1. Log search activity to charitysearchlog
2. Search beneficiary by ID number
3. Load aid history from subventionpay with charity details
4. Display search results or -1 if not found
Aid History Query:
SELECT charityname, charityphone, p.financial_aid, p.inkind_aid, p.month
FROM subventionpay p
JOIN charities ON p.charity_id = charities.id
WHERE p.benefeciary_id = {beneficiary_id}
---
11. addFromExcel() - Excel Import
Location: Line 837
Purpose: Bulk import beneficiaries from Excel file with duplicate handling
Function Signature:
function addFromExcel()
Process Flow:
1. Upload and identify Excel file
2. Read worksheet starting from row 4
3. For each row:
- Extract: name, address, phone, ID number, financial aid, in-kind aid, guarantee type, comment
- Check for existing beneficiary by ID number
- If exists and different charity: add payment record only
- If new: create beneficiary and subvention records
- Calculate age from ID number millennium/year
4. Create monthly payment record
5. Use transactions for data integrity
Excel Column Mapping:
$col=0: name
$col=1: address
$col=2: phone
$col=3: idNo
$col=4: money (financial aid)
$col=5: value (in-kind aid)
$col=6: guarantee_type_id
$col=7: comment
Age Calculation Logic:
$millenium = substr($idNo, 0, 1);
$birthyear = substr($idNo, 1, 2);
if ($millenium == 2) $year = $birthyear + 1900;
if ($millenium == 3) $year = $birthyear + 2000;
$age = $thisYear - $year;
---
12. addFromExcelTkafol() - Special Excel Import
Location: Line 971
Purpose: Excel import for "Tkafol" charity (ID=0) with different logic
Key Differences from Regular Import:
- โข Sets
charity_id = 0for all beneficiaries - โข Checks for duplicates within same charity only
- โข Uses different duplicate checking logic
---
13. savearea() - Area Management
Location: Line 702
Purpose: Add or update geographic areas
Returns: JSON with new area data for dropdown population
---
14. savedisease() - Disease Management
Location: Line 731
Purpose: Add or update health conditions
Returns: JSON with new disease data for dropdown population
---
15. Utility Functions
Various Locations: Support functions for data management
- โข
gettabledata()- Generic table data retrieval - โข
getselectdata()- Dropdown data with search - โข
getselectmultiple()- Multi-select dropdown data - โข
getMultipledit()- Multiple disease data for editing - โข
getMultidata()- Multi-record modal display - โข
updateVal()- Update disease names with duplicate checking
---
๐ Workflows
Workflow 1: Complete Beneficiary Registration
---
Workflow 2: Excel Bulk Import Process
---
๐ URL Routes & Actions
| URL Parameter | Function Called | Description | |
|---|---|---|---|
| `do=` (empty) | Default action | Display add beneficiary form | |
| `do=addSimple` | Simple form | Display simplified add form | |
| `do=show` | Listing | Display beneficiaries list with search | |
| `do=edit&id=X` | Edit form | Display edit form for beneficiary X | |
| `do=savedata` | `savedata()` | Save beneficiary data (POST) | |
| `do=showajax` | `showajax()` | DataTables AJAX data (POST) | |
| `do=removecontroller` | `removecontroller()` | Soft delete beneficiary (POST) | |
| `do=addexcel` | Excel form | Display Excel upload form | |
| `do=addexceltkafol` | Tkafol Excel | Display Tkafol Excel upload form | |
| `do=addfromexcel` | `addFromExcel()` | Process Excel import (POST) | |
| `do=search` | Search form | Display beneficiary search form | |
| `do=getBenData` | `getBenData()` | Search beneficiary by ID (POST) | |
| `do=searchLog` | Search log | Display search activity log | |
| `do=savearea` | `savearea()` | Add/update area (POST) | |
| `do=savedisease` | `savedisease()` | Add/update disease (POST) |
๐งฎ Data Management Features
Multi-Charity Support
// Session-based charity filtering
if ($_SESSION['charityids'])
$searchQuery .= ' and charities.id in(' . $_SESSION['charityids'] . ')';
Soft Delete System
// Deletion levels:
// del = 0: Active
// del = 1: Updated (edit mode)
// del = 2: Soft deleted
// del = 5: Special status
Dynamic Family/Economic Data
- โข Family members: Dynamic form rows with individual save/delete
- โข Economic data: Income/expense pairs with dynamic management
- โข Cleanup: Removes records not in current submission
Image Management
// Upload with automatic resize
$image = uploadImages($handle, "../views/default/images/beneficiaries", 300, 300);
// Update with old image cleanup
$image = updateImages($handle, "oldimage", "../views/default/images/beneficiaries", 300, 300);
unlink("../views/default/images/beneficiaries" . $beneficiaries->image);
---
๐ Security & Permissions
Charity Access Control
// Session-based charity filtering limits access to assigned charities
if ($_SESSION['charityids'] && !$data1 && !$data2 && !$data3 && !$chID)
$searchQuery .= ' and beneficiaries.charity_id in(' . $_SESSION['charityids'] . ')';
Input Filtering
// All inputs filtered through filter_input
$name = filter_input(INPUT_POST, 'b_name');
$age = filter_input(INPUT_POST, 'age');
$idnumber = filter_input(INPUT_POST, 'idnumber');
Search Activity Logging
// Log all beneficiary searches
$log = R::dispense('charitysearchlog');
$log->user_id = $_SESSION['userid'];
$log->charity_id = $_SESSION['charityids'];
$log->sysdate = date("Y-m-d H:i:s");
$log->idnumber = $idNo;
---
๐ Performance Considerations
Database Optimization
1. Required Indexes:
- beneficiaries(idnumber) - For duplicate checking
- beneficiaries(charity_id) - For charity filtering
- beneficiaries(del, sysdate) - For listing queries
- beneficiaries_family(beneficiaries_id) - For family lookups
- subventionpay(benefeciary_id, charity_id, month) - For aid history
2. Large Form Handling:
- 80+ fields in main form
- Dynamic family/economic sections
- Image upload processing
- Consider form chunking for very large families
Excel Import Performance
- โข Uses transactions for data integrity
- โข Processes row by row to manage memory
- โข Duplicate checking on each row (consider batch optimization)
- โข File cleanup after processing
---
๐ Common Issues & Troubleshooting
1. Age Calculation Errors
Issue: Incorrect ages calculated from ID numbers
Cause: ID number format assumptions
Debug:
// Check ID number format
$millenium = substr($idNo, 0, 1);
$birthyear = substr($idNo, 1, 2);
// Expected: 2YYMMDDXXXX or 3YYMMDDXXXX
2. Excel Import Failures
Issue: Excel import stops or creates incomplete data
Cause: File format, memory limits, or data validation
Debug:
// Check Excel file structure
// Verify data starts at row 4
// Check column mapping matches expected format
3. Family/Economic Data Loss
Issue: Family or economic data disappears on edit
Cause: ID mismatch in dynamic form processing
Fix: Verify family_id and eco_id hidden fields in forms
4. Charity Permission Issues
Issue: Users see wrong beneficiaries or get access denied
Cause: Session charity IDs not properly set
Debug:
// Check session charity assignment
var_dump($_SESSION['charityids']);
---
๐งช Testing Scenarios
Test Case 1: Complete Beneficiary Registration
1. Fill all form sections (demographics, housing, family, economic)
2. Upload photo
3. Add 3+ family members
4. Add 2+ economic entries
5. Submit and verify all data saved correctly
6. Check image uploaded and resized properly
Test Case 2: Excel Import with Duplicates
1. Create Excel with mix of new and existing beneficiaries
2. Include different charity assignments
3. Process import
4. Verify new beneficiaries created
5. Verify existing beneficiaries get payment records only
6. Check age calculations correct
Test Case 3: Multi-Charity Access Control
1. Login with restricted charity access
2. Try to view/edit beneficiaries from other charities
3. Verify access properly restricted
4. Test search functionality respects restrictions
---
๐ Related Documentation
- โข CLAUDE.md - PHP 8.2 migration guide
- โข charityController.php - Charity management
- โข subventionController.php - Aid and payment processing
- โข Excel Import Documentation - Bulk import procedures
---
Documented By: AI Assistant
Review Status: โ Complete
Next Review: When major changes occur