Realestateunitsalertsemptys Documentation

Real Estate Units Alerts Emptys Controller

File: /controllers/realestateunitsalertsemptys.php

Purpose: Monitors and reports empty real estate properties and available units

Last Updated: December 20, 2024

Total Functions: 2

Lines of Code: ~32

---

๐Ÿ“‹ Overview

The Real Estate Units Alerts Emptys Controller is a specialized monitoring system that tracks and reports on empty/available real estate properties and units. It provides:

This controller serves as an alert system for property managers to quickly identify available rental properties and units for potential occupancy.

Primary Functions

Related Controllers

---

๐Ÿ—„๏ธ Database Tables

Primary Tables (Direct Operations)

Table NamePurposeKey Columns
**realestates**Property master recordsid, realestatename, del, savaible
**realestatesunits**Individual property unitsid, realestateid, unitname, unitarea, del, cavaible
---

๐Ÿ”‘ Key Functions

1. Default Action - Empty Properties Alert Interface

Location: Lines 6-9

Purpose: Display the main empty properties monitoring interface

Process Flow:

1. Display header template

2. Load empty properties alert view (realestateunitsalertsemptysview/show.html)

3. Display footer template

---

2. getdata - Generate Empty Properties and Units Report

Location: Lines 10-31

Purpose: Generate comprehensive report of all empty/available properties and units

Function Signature:

// Triggered when: do=getdata (POST)
$realestateid = filter_input(INPUT_POST, 'realestateid');
$realestateunitid = filter_input(INPUT_POST, 'realestateunitid');

Process Flow:

1. Input Processing:

$realestateid = filter_input(INPUT_POST, 'realestateid');
$realestateunitid = filter_input(INPUT_POST, 'realestateunitid');
$searchQuery = '';
$searchQuery2 = '';

2. Property Filter Building:

if($realestateid != ''){
    $searchQuery .=' and realestates.id = ' . $realestateid . ' ';
}

3. Unit Filter Building:

if($realestateunitid != ''){
    $searchQuery2 .=' and realestatesunits.id = ' . $realestateunitid . ' ';
}

4. Supplier-Available Properties Query:

// Properties available for supplier occupancy/purchase
$srealestates = R::findAll('realestates', "where del < 2 and realestates.savaible = 0 $searchQuery");

5. Client-Available Properties with Units Query:

// Properties for client rental with available units
$crealestates = R::findAll('realestates', "where del < 2 $searchQuery");

foreach($crealestates as $crealestate){
    // Find units within each property that are available for clients
    $realestatesunits = R::findAll('realestatesunits',
        "realestateid = $crealestate->id and realestatesunits.cavaible = 0 and del < 2 $searchQuery2");
    $crealestate->realestatesunits = $realestatesunits;
}

6. Template Assignment and Display:

$smarty->assign('srealestates', $srealestates);
$smarty->assign('crealestates', $crealestates);
$smarty->display("realestateunitsalertsemptysview/getdata.html");

---

๐Ÿ”„ Workflows

Workflow 1: Empty Properties Monitoring

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
START: Monitor Empty Properties
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1Process Filter Parameters (Optional)
- realestateid: Filter by specific property
- realestateunitid: Filter by specific unit
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
2Build Dynamic Search Queries
- Property filter: AND realestates.id = X
- Unit filter: AND realestatesunits.id = Y
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
3Query Supplier-Available Properties
- Find: del < 2 AND savaible = 0
- Result: Properties available for supplier use
- Apply property filter if specified
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
4Query Client-Available Properties and Units
- Find all active properties (del < 2)
- For each property, find available units:
- cavaible = 0 (client available)
- del < 2 (active)
- Apply unit filter if specified
- Attach units array to each property
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ–ผ
โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
5Generate Empty Properties Report
- Assign supplier-available properties
- Assign client-available properties with units
- Display via realestateunitsalertsemptysview template
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

---

๐ŸŒ URL Routes & Actions

URL ParameterFunction CalledDescription
`do=` (empty)Default actionDisplay empty properties monitoring interface
`do=getdata`getdata processingGenerate empty properties and units report
### Required Parameters for do=getdata

POST Parameters (all optional):

---

๐Ÿงฎ Calculation Methods

Availability Status Logic

Property-Level Availability (Supplier Focus):

// savaible = 0: Property available for supplier use/purchase
// savaible = 1: Property occupied/unavailable for suppliers
$srealestates = R::findAll('realestates', "where del < 2 and realestates.savaible = 0");

Unit-Level Availability (Client Focus):

// cavaible = 0: Unit available for client rental
// cavaible = 1: Unit occupied/unavailable for clients  
$realestatesunits = R::findAll('realestatesunits',
    "realestateid = $crealestate->id and realestatesunits.cavaible = 0 and del < 2");

Filtering Logic

// Property filtering
if($realestateid != ''){
    $searchQuery .=' and realestates.id = ' . $realestateid . ' ';
}

// Unit filtering (applied to unit queries)
if($realestateunitid != ''){
    $searchQuery2 .=' and realestatesunits.id = ' . $realestateunitid . ' ';
}

Data Structure Output

srealestates: [
    {
        id: 1,
        realestatename: "Property A",
        savaible: 0,
        del: 0
    }
]

crealestates: [
    {
        id: 2,
        realestatename: "Property B", 
        realestatesunits: [
            {
                id: 3,
                unitname: "Unit 1",
                unitarea: "100 sqm",
                cavaible: 0,
                del: 0
            }
        ]
    }
]

---

๐Ÿ”’ Security & Permissions

Input Validation

// Secure input filtering for numeric IDs
$realestateid = filter_input(INPUT_POST, 'realestateid');
$realestateunitid = filter_input(INPUT_POST, 'realestateunitid');

SQL Injection Prevention

Data Access Control

// Soft delete protection - only active records
"where del < 2"

// Availability status validation
"realestates.savaible = 0"  // Supplier available
"realestatesunits.cavaible = 0"  // Client available

---

๐Ÿ“Š Performance Considerations

Database Optimization

1. Critical Indexes:

- realestates(del, savaible)

- realestatesunits(realestateid, cavaible, del)

- realestates(id) for filtering

2. Query Efficiency:

- Simple WHERE clauses for availability status

- Efficient nested queries for property-unit relationships

- Minimal data loading (only necessary fields)

Memory Management

---

๐Ÿ› Common Issues & Troubleshooting

1. No Empty Properties Showing

Issue: Report shows no results despite having empty properties

Cause: Availability status flags incorrectly set

Debug:

-- Check property availability status distribution
SELECT savaible, COUNT(*) FROM realestates WHERE del < 2 GROUP BY savaible;

-- Check unit availability status distribution  
SELECT cavaible, COUNT(*) FROM realestatesunits WHERE del < 2 GROUP BY cavaible;

-- Verify empty properties exist
SELECT id, realestatename, savaible FROM realestates WHERE del < 2 AND savaible = 0;

2. Units Not Showing for Properties

Issue: Properties appear but without available units

Cause: Unit availability status or relationship issues

Debug:

-- Check property-unit relationships
SELECT r.id, r.realestatename, COUNT(ru.id) as unit_count,
       SUM(CASE WHEN ru.cavaible = 0 THEN 1 ELSE 0 END) as available_units
FROM realestates r
LEFT JOIN realestatesunits ru ON r.id = ru.realestateid AND ru.del < 2
WHERE r.del < 2
GROUP BY r.id;

3. Filtering Not Working

Issue: Property or unit filters don't affect results

Cause: Filter parameter handling or query building issues

Debug:

// Add debugging output
$realestateid = filter_input(INPUT_POST, 'realestateid');
$realestateunitid = filter_input(INPUT_POST, 'realestateunitid');

echo "Property filter: " . $realestateid . "<br>";
echo "Unit filter: " . $realestateunitid . "<br>";
echo "Search Query 1: " . $searchQuery . "<br>";
echo "Search Query 2: " . $searchQuery2 . "<br>";

---

๐Ÿงช Testing Scenarios

Test Case 1: Basic Empty Properties Display

1. Create test properties with savaible = 0 (empty)
2. Create test properties with savaible = 1 (occupied)
3. Run empty properties report
4. Verify only savaible = 0 properties appear
5. Check property details displayed correctly

Test Case 2: Available Units Display

1. Create test property with multiple units
2. Set some units cavaible = 0 (available)
3. Set some units cavaible = 1 (occupied)  
4. Run report
5. Verify only cavaible = 0 units appear under property
6. Check unit details (name, area) displayed

Test Case 3: Property Filtering

1. Create multiple empty properties
2. Apply property filter (specific ID)
3. Verify only specified property appears
4. Test with invalid property ID
5. Verify appropriate handling

Test Case 4: Unit Filtering

1. Create property with multiple available units
2. Apply unit filter (specific ID)
3. Verify only specified unit appears
4. Test filtering across different properties
5. Check unit-property relationship maintained

Test Case 5: Combined Filtering

1. Create multiple properties with various units
2. Apply both property and unit filters
3. Verify intersection logic works correctly
4. Test edge cases (unit not in specified property)
5. Verify no results when filters don't match

---

๐Ÿ“š Related Documentation

---

Key Design Principles:

1. Availability Status Separation:

- savaible for supplier/property level availability

- cavaible for client/unit level availability

2. Hierarchical Data Structure:

- Properties contain arrays of available units

- Maintains parent-child relationships

3. Filtering Flexibility:

- Optional filters for targeted monitoring

- Supports both property and unit level filtering

4. Real-time Monitoring:

- Shows current availability status

- No historical data, only current state

5. Soft Delete Protection:

- Only shows active properties/units (del < 2)

- Maintains data integrity

---

Use Cases:

---

Documented By: AI Assistant

Review Status: โœ… Complete

Next Review: When major changes occur