File size: 6,542 Bytes
ad8fdff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
Generate realistic property listings + insurance + documents data.
Run: python data/generate_data.py
"""
import json, random, sqlite3
from pathlib import Path
from datetime import date, timedelta

random.seed(42)

LOCATIONS = [
    "Andheri West","Andheri East","Bandra West","Bandra East",
    "Juhu","Versova","Santacruz West","Santacruz East",
    "Khar","Vile Parle","Goregaon","Malad","Kandivali",
    "Borivali","Dadar","Worli","Lower Parel","Prabhadevi",
    "Powai","Vikhroli","Ghatkopar","Mulund","Thane",
    "Navi Mumbai","Kharghar","Panvel","Ulwe","Dombivli",
    "Kalyan","Mira Road","Vasai","Nalasopara",
]
PREMIUM = {"Bandra West","Juhu","Worli","Lower Parel","Prabhadevi","Khar","Santacruz West"}
BUILDERS = [
    "Lodha Group","Godrej Properties","Oberoi Realty","Hiranandani",
    "Shapoorji Pallonji","Runwal Group","Rustomjee","Kalpataru",
    "L&T Realty","Mahindra Lifespaces","Prestige Group",
    "Raymond Realty","Piramal Realty","Tata Housing",
]
PROP_TYPES  = ["Apartment","Flat","Villa","Row House","Penthouse","Studio","Duplex"]
FURNISHINGS = ["Fully Furnished","Semi Furnished","Unfurnished"]
STATUSES    = ["Ready to Move","Under Construction","Ready to Move","Ready to Move"]
AMENITIES_POOL = [
    "Gym","Swimming Pool","Club House","Parking","Security","Power Backup","Lift",
    "Garden","Jogging Track","Kids Play Area","Indoor Games","CCTV","Intercom",
    "Visitor Parking","Terrace","Co-working Space","Library","Mini Theatre","Pet-friendly",
]
INS_COMPANIES = [
    "New India Assurance","HDFC ERGO","Bajaj Allianz","ICICI Lombard",
    "National Insurance","Oriental Insurance","United India",
]
INS_STATUSES = ["ACTIVE","ACTIVE","ACTIVE","PENDING","EXPIRED"]
DOCUMENT_TYPES = [
    "Sale Agreement","NOC from Society","Occupation Certificate",
    "Property Card","Index II","Stamp Duty Receipt","Possession Letter",
    "Title Search Report","Encumbrance Certificate","Building Plan Approval",
]
DOC_STATUSES = ["RECEIVED","PENDING","RECEIVED","RECEIVED","MISSING"]

def price_range(bhk, location):
    base = {1:(0.45,1.2),2:(0.9,2.5),3:(1.5,4.5),4:(3.0,8.0),5:(6.0,18.0)}
    lo,hi = base.get(bhk,(1.0,3.0))
    if location in PREMIUM: lo,hi = lo*1.6, hi*2.0
    return round(random.uniform(lo,hi),2)

def area_range(bhk):
    ranges = {1:(380,550),2:(650,950),3:(1000,1600),4:(1800,3000),5:(3200,6000)}
    lo,hi = ranges.get(bhk,(600,1200))
    return random.randint(lo,hi)

properties, insurance, documents = [], [], []
pid = 1001

for _ in range(300):
    bhk      = random.choices([1,2,3,4,5], weights=[15,35,30,15,5])[0]
    location = random.choice(LOCATIONS)
    ptype    = random.choice(PROP_TYPES)
    price    = price_range(bhk, location)
    area     = area_range(bhk)
    floors   = random.randint(10,45)
    floor    = random.randint(1,floors)
    amenities= random.sample(AMENITIES_POOL, k=random.randint(5,12))
    furnish  = random.choice(FURNISHINGS)
    status   = random.choice(STATUSES)
    builder  = random.choice(BUILDERS)
    society  = f"{builder.split()[0]} {random.choice(['Grandeur','Heights','Residences','Enclave','Greens','Palms','Towers','Estates','Park','Vista','Elysium','Artesia'])}"
    age      = random.randint(0,15)
    ppsf     = round((price*100)/(area/100), 0)
    city     = "Mumbai" if location not in ["Thane","Navi Mumbai","Kharghar","Panvel","Ulwe","Dombivli","Kalyan","Mira Road","Vasai","Nalasopara"] else "MMR"

    prop = {
        "id": pid,
        "title": f"{bhk} BHK {ptype} in {location}",
        "bhk": bhk, "type": ptype,
        "location": location, "city": city,
        "price_cr": price,
        "price_display": f"₹{price} Cr",
        "area_sqft": area,
        "price_per_sqft": int(ppsf),
        "floor": floor, "total_floors": floors,
        "furnishing": furnish,
        "amenities": amenities,
        "parking": "Parking" in amenities,
        "pool": "Swimming Pool" in amenities,
        "age_years": age,
        "status": status,
        "builder": builder,
        "society": society,
        "bedrooms": bhk,
        "bathrooms": bhk if bhk<=3 else bhk-1,
        "balconies": random.randint(1,min(bhk,3)),
        "facing": random.choice(["East","West","North","South","North-East","North-West"]),
        "listed_days_ago": random.randint(1,90),
        "contact": f"+91-9{random.randint(100000000,999999999)}",
        "description": (
            f"Spacious {bhk} BHK {ptype.lower()} in {society}, {location}. "
            f"{'Ready to move. ' if status=='Ready to Move' else 'Under construction. '}"
            f"{furnish} unit, {area} sqft, floor {floor}/{floors}. "
            f"Key amenities: {', '.join(amenities[:5])}. "
            f"Priced at ₹{price} Cr (₹{int(ppsf):,}/sqft). Built by {builder}."
        ),
        "available": True,
        "featured": random.random() < 0.1,
    }
    properties.append(prop)

    # Insurance record
    ins_status = random.choice(INS_STATUSES)
    start = date.today() - timedelta(days=random.randint(10,350))
    expiry = start + timedelta(days=365)
    insurance.append({
        "property_id": pid,
        "company": random.choice(INS_COMPANIES),
        "policy_no": f"POL-{pid}-{random.randint(10000,99999)}",
        "status": ins_status,
        "start_date": start.isoformat(),
        "expiry_date": expiry.isoformat(),
        "premium_annual": random.randint(8000,45000),
        "followup_person": random.choice(["Rajan Sharma","Priya Ghosh","Amit Das","Sneha Patil","Rahul Mehta"]),
        "followup_contact": f"+91-9{random.randint(100000000,999999999)}",
        "notes": random.choice(["Renewal reminder sent","Follow up urgently","Paid","","On hold"]),
    })

    # 2-4 documents per property
    doc_types = random.sample(DOCUMENT_TYPES, k=random.randint(2,5))
    for dt in doc_types:
        documents.append({
            "property_id": pid,
            "document_type": dt,
            "status": random.choice(DOC_STATUSES),
            "received_date": (date.today() - timedelta(days=random.randint(0,180))).isoformat() if random.random()>0.3 else None,
            "notes": "",
        })

    pid += 1

# Save JSON
DATA_DIR = Path(__file__).parent
(DATA_DIR / "properties.json").write_text(json.dumps(properties, indent=2))
print(f"Generated {len(properties)} properties, {len(insurance)} insurance records, {len(documents)} documents")
print(f"Price range: ₹{min(p['price_cr'] for p in properties)} – ₹{max(p['price_cr'] for p in properties)} Cr")
print(f"Locations: {len(set(p['location'] for p in properties))}")