# Comprehensive Criteria Improvements Proposal

## Current Issues

1. **Vague requirements** - No specific thresholds or measurable criteria
2. **Missing building validation** - Properties without structures score high for Guest/Rental/Workshop
3. **No size requirements** - Land size minimums not enforced
4. **Subjective scoring** - Too much interpretation, not enough concrete rules
5. **Missing KPI integration** - GPT doesn't see bedrooms, bathrooms, building_size_m2, land_size_m2

## Proposed Improved Criteria

### 1. Regeneratieve Market Garden (🌱)

**Current:**
> bodemgeschiktheid, zon, water, oppervlakte minimaal 2500 m²

**Improved:**
```
Regeneratieve market garden – Beoordeel ALLEEN als geschikt voor commerciële groenteteelt:

HARDE EISEN (score = 1 als NIET voldaan):
- Minimaal 2500 m² grond
- Zonnige ligging (zuid/zuidwest georiënteerd of vlak terrein)
- Waterbron binnen 100m (bron, rivier, irrigatie, of regenwater opvang mogelijk)

SCORE-CRITERIA:
5 = 5000+ m², perfecte zon, eigen waterbron, vruchtbare grond, vlak terrein
4 = 3500-5000 m², goede zon, water nabij (<50m), redelijke grond
3 = 2500-3500 m², gemiddelde zon, water realiseerbaar, grond verbeteren nodig
2 = 2500 m², matige zon OF hellend terrein OF waterbron ver (>100m)
1 = <2500 m² OF geen water OR te schaduwrijk OR te hellend

LET OP: Kijk of beschrijving meldt "grond", "land", "perceel" (goed) vs "bebouwd" (slecht).
```

### 2. Gastenverblijf (🏡)

**Current:**
> VEREIST BESTAANDE WONING/GEBOUW met slaapkamers

**Improved:**
```
Gastenverblijf – Geschiktheid voor Airbnb / B&B gastenaccommodatie:

HARDE EISEN (score = 1 als NIET voldaan):
- BESTAANDE woning/gebouw met minimaal 2 slaapkamers
- Beschrijving moet expliciet slaapkamers/kamers/bedrooms noemen
- Woning moet bewoonbaar zijn (niet "te renoveren" of "puin")

SCORE-CRITERIA:
5 = 4+ kamers, prachtig uitzicht, rustige locatie, zwembad, nabij attracties, direct verhuurbaar
4 = 3 kamers, mooi uitzicht, rustige locatie, goede bereikbaarheid, kleine renovatie nodig
3 = 2-3 kamers, redelijk uitzicht, bereikbaar, medium renovatie nodig
2 = 2 kamers, matige locatie, afgelegen, grote renovatie nodig
1 = <2 kamers OF geen gebouw OF puin/bouwval OR slechte locatie

LET OP: Als er geen vermelding is van "slaapkamers", "kamers", "bedrooms" → score = 1
```

### 3. Werkplaats/Voedselverwerking (🔧)

**Current:**
> VEREIST BESTAANDE GEBOUWEN

**Improved:**
```
Werkplaats/voedselverwerking – Geschiktheid voor ambachtelijke productie:

HARDE EISEN (score = 1 als NIET voldaan):
- BESTAANDE gebouw/schuur/loods minimaal 40 m²
- Beschrijving moet expliciet gebouw/schuur/stal/loods noemen
- Geen pure woning zonder bijgebouwen

SCORE-CRITERIA:
5 = 100+ m² werkruimte, elektra + water, verharde vloer, goede staat, loading dock
4 = 60-100 m², elektra of water aanwezig, redelijke staat, toegankelijk voor leveringen
3 = 40-60 m², basis nutsvoorzieningen mogelijk, renovatie nodig, bereikbaar
2 = 40 m², geen nutsvoorzieningen, grote renovatie, moeilijk bereikbaar
1 = <40 m² OR geen gebouw OR alleen woonhuis OR puin

LET OP: Vermeldingen zoals "schuur", "loods", "stal", "werkplaats" zijn goed.
        Alleen "huis" zonder schuur = score maximaal 2.
```

### 4. Zelfstandige Verhuureenheden (🏘️)

**Current:**
> VEREIST BESTAANDE WONING/GEBOUW met meerdere slaapkamers

**Improved:**
```
Zelfstandige verhuureenheden – Geschiktheid voor langetermijn/seizoensverhuur:

HARDE EISEN (score = 1 als NIET voldaan):
- BESTAANDE woning met minimaal 3 slaapkamers OF
- Meerdere aparte wooneenheden/appartementen
- Beschrijving moet expliciet slaapkamers/units/appartementen noemen

SCORE-CRITERIA:
5 = 5+ kamers OF 2+ aparte units, elk met eigen keuken/badkamer, goede staat
4 = 4 kamers OF mogelijkheid tot opsplitsing, aparte ingangen mogelijk, kleine renovatie
3 = 3-4 kamers, opsplitsing mogelijk maar renovatie nodig, één keuken
2 = 3 kamers, moeilijk op te splitsen, grote renovatie nodig
1 = <3 kamers OR geen gebouw OR niet op te splitsen

LET OP: Voor verhuur zijn aparte ingangen, keukens, badkamers essentieel.
        Alleen "groot huis" zonder details over units → maximaal score 3.
```

### 5. Ligging t.o.v. Kust, Stad en Vliegveld (📍)

**Current:**
> afstand en bereikbaarheid vanuit Nederland

**Improved:**
```
Ligging t.o.v. kust, stad en vliegveld – Bereikbaarheid en attractiviteit voor Nederlandse eigenaar:

SCORE-CRITERIA (op basis van afstanden):
5 = <15 km kust, <20 km stad (20k+ inwoners), <60 km international airport, goede wegen
4 = 15-30 km kust, 20-40 km stad, 60-100 km airport, redelijke wegen
3 = 30-60 km kust, 40-60 km stad, 100-150 km airport, matige wegen
2 = 60-100 km kust, 60+ km stad, 150-200 km airport, slechte wegen
1 = >100 km kust, >80 km stad, >200 km airport, zeer afgelegen

EXTRA PUNTEN:
+ Directe toegang tot snelweg
+ < 2 uur rijden vanaf grote luchthaven (Barcelona, Málaga, Porto, etc.)
+ Bereikbaar met directe vlucht vanuit Nederland (Schiphol, Eindhoven, Rotterdam)

LET OP: Gebruik {locatie_context} data voor afstanden.
```

### 6. Afstand tot Lokale Markt (🛒)

**Current:**
> relevante afzet voor producten of diensten

**Improved:**
```
Afstand tot lokale markt – Verkooppotentieel voor lokale producten/groente:

SCORE-CRITERIA:
5 = <5 km dorpskern (1000+ inwoners), wekelijkse markt, toeristisch gebied, restaurants nabij
4 = 5-10 km dorpskern, maandelijkse markt OF toeristen in zomer, lokale winkels
3 = 10-20 km dorp, weinig toerisme, supermarkt bereikbaar
2 = 20-40 km dorp, geen markt, moeilijk bereikbaar, weinig afzetmogelijkheden
1 = >40 km dorp, zeer afgelegen, geen lokale afzet

EXTRA FACTOREN:
+ Nabij wijnroute/culinaire route
+ Biowinkel in de buurt (<15 km)
+ Restaurants die lokaal inkopen
+ Toeristisch gebied (kust, bergen, natuurgebied)

LET OP: Gebruik {locatie_context} voor populatie en toeristische aantrekkelijkheid.
```

## Additional Improvements

### Add KPI-Based Validation Layer

After GPT scoring, run validation:

```python
def validate_gpt_scores(property_data, gpt_scores):
    """Override GPT scores based on extracted KPIs"""

    # Extract KPIs
    land_size = property_data.get('land_size_m2', 0)
    building_size = property_data.get('building_size_m2', 0)
    bedrooms = property_data.get('bedrooms', 0)
    bathrooms = property_data.get('bathrooms', 0)

    # VALIDATION RULE 1: No building = no guest/rental/workshop
    if building_size == 0 and bedrooms == 0:
        gpt_scores['guest_accommodation'] = 1
        gpt_scores['rental_units'] = 1
        gpt_scores['workshop'] = min(gpt_scores.get('workshop', 1), 2)

    # VALIDATION RULE 2: No bedrooms = no guest/rental
    if bedrooms == 0:
        gpt_scores['guest_accommodation'] = 1
        gpt_scores['rental_units'] = 1
    elif bedrooms < 2:
        gpt_scores['guest_accommodation'] = min(gpt_scores.get('guest_accommodation', 1), 2)
        gpt_scores['rental_units'] = 1
    elif bedrooms < 3:
        gpt_scores['rental_units'] = min(gpt_scores.get('rental_units', 1), 2)

    # VALIDATION RULE 3: Small land = low market garden
    if land_size > 0 and land_size < 2500:
        gpt_scores['market_garden'] = min(gpt_scores.get('market_garden', 1), 2)
    elif land_size == 0:
        gpt_scores['market_garden'] = 1

    # VALIDATION RULE 4: Small building = low workshop
    if building_size > 0 and building_size < 40:
        gpt_scores['workshop'] = min(gpt_scores.get('workshop', 1), 2)

    return gpt_scores
```

### Improve Property Data Extraction

1. **Scrape full property page** (not just summary)
2. **Extract more KPIs**: plot size, building size, rooms, bathrooms
3. **Pass KPIs to GPT** in the prompt so it can see them

### Add Warning Flags

Properties that need review:
- Score 4-5 for Guest/Rental but bedrooms = 0
- Score 4-5 for Market Garden but land_size_m2 < 2500
- Score 4-5 for Workshop but building_size_m2 < 40
- High scores but very low price (< €50k)

## Implementation Priority

1. ✅ **DONE**: Added building requirements to prompt.txt
2. **HIGH**: Update prompt.txt with all improved criteria (this document)
3. **HIGH**: Add KPI validation layer in custom_criteria.py
4. **MEDIUM**: Improve property scraping to extract KPIs reliably
5. **MEDIUM**: Add warning flags in UI for mismatched scores
6. **LOW**: Re-run GPT analysis on all properties

## Testing Plan

1. Test on known problem properties (like the €11k land plot)
2. Check 10 random properties for score accuracy
3. Verify KPIs are extracted correctly
4. Ensure validation layer catches edge cases
5. Review top 20 scored properties manually

