Subhakanta commited on
Commit
8630e6c
·
0 Parent(s):

Deploy chatbot FastAPI app

Browse files
.gitignore ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ========================
2
+ # Python
3
+ # ========================
4
+ __pycache__/
5
+ *.py[cod]
6
+ *.pyo
7
+ *.pyd
8
+ *.pyc
9
+ *.pdb
10
+ *.egg-info/
11
+ *.egg
12
+ *.dist-info/
13
+ *.log
14
+
15
+ # ========================
16
+ # Virtual Environments
17
+ # ========================
18
+ venv/
19
+ env/
20
+ .venv/
21
+ subha/
22
+
23
+ # ========================
24
+ # IDE / Editor
25
+ # ========================
26
+ .vscode/
27
+ *.code-workspace
28
+ .idea/
29
+ *.sublime-project
30
+ *.sublime-workspace
31
+
32
+ # ========================
33
+ # OS Files
34
+ # ========================
35
+ .DS_Store
36
+ Thumbs.db
37
+
38
+ # ========================
39
+ # Docker
40
+ # ========================
41
+ *.dockerignore
42
+ *.tar
43
+ *.img
44
+ docker-compose.override.yml
45
+
46
+ # ========================
47
+ # FAISS / Vectorstore
48
+ # ========================
49
+ # Optional: Ignore vectorstore if too large
50
+ vectorStore/
51
+
52
+ # ========================
53
+ # Env / Secrets
54
+ # ========================
55
+ .env
56
+ .env.local
57
+ .env.*.local
58
+
59
+ # ========================
60
+ # Logs
61
+ # ========================
62
+ logs/
63
+ *.log
64
+
65
+ # ========================
66
+ # Build / Packaging
67
+ # ========================
68
+ build/
69
+ dist/
70
+ *.tar.gz
71
+ *.whl
72
+
73
+ # ========================
74
+ # Database / Cache
75
+ # ========================
76
+ *.sqlite3
77
+ *.db
78
+ *.sqlite
79
+ __pycache__/
80
+ *.cache/
81
+
82
+ # ========================
83
+ # Hugging Face / Space temp files
84
+ # ========================
85
+ *.lock
86
+ *.h5
87
+ *.pt
Dockerfile ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use official Python image
2
+ FROM python:3.11-slim
3
+
4
+ # Set working directory
5
+ WORKDIR /app
6
+
7
+ # Install system dependencies (for building Python deps)
8
+ RUN apt-get update && apt-get install -y build-essential && rm -rf /var/lib/apt/lists/*
9
+
10
+ # Copy and install Python dependencies
11
+ COPY requirements.txt .
12
+ RUN pip install --no-cache-dir -r requirements.txt
13
+
14
+ # Copy project directories
15
+ COPY backend ./backend
16
+ COPY src ./src
17
+ COPY vectorstore ./vectorstore
18
+ COPY frontend ./frontend
19
+ COPY .env .env
20
+
21
+
22
+ # Expose the port that Hugging Face Spaces expects
23
+ EXPOSE 7860
24
+
25
+ # Run the FastAPI app
26
+ CMD ["uvicorn", "backend.api:app", "--host", "0.0.0.0", "--port", "7860"]
README.md ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # NoBrokerage Chatbot
2
+
3
+ **AI-powered real estate assistant** for NoBrokerage.com that retrieves property data from a FAISS vectorstore, applies structured filters, and generates grounded summaries and property cards using Groq LLM.
4
+
5
+ This project is built using **FastAPI**, **LangChain**, **FAISS**, **HuggingFace embeddings**, **Frontend**, and **Groq LLM**, and is ready for **Docker deployment** and **Hugging Face Spaces**.
6
+
7
+ ---
8
+
9
+ ## Table of Contents
10
+
11
+ - [NoBrokerage Chatbot](#nobrokerage-chatbot)
12
+ - [Table of Contents](#table-of-contents)
13
+ - [Project Overview](#project-overview)
14
+ - [Features](#features)
15
+ - [Project Structure](#project-structure)
16
+ - [Example Queries the Chatbot Can Handle](#example-queries-the-chatbot-can-handle)
17
+ - [How to Run Locally](#how-to-run-locally)
18
+ - [1. Clone the Repository](#1-clone-the-repository)
19
+ - [2. Create Virtual Environment](#2-create-virtual-environment)
20
+ - [3. Install Dependencies](#3-install-dependencies)
21
+ - [4. Set Up Environment Variables](#4-set-up-environment-variables)
22
+ - [5. Run the FastAPI Server](#5-run-the-fastapi-server)
23
+ - [Tech Stack](#tech-stack)
24
+ - [Features](#features-1)
25
+ - [Deployment Ready](#deployment-ready)
26
+ - [👨‍💻 Author](#-author)
27
+
28
+ ---
29
+
30
+ ## Project Overview
31
+
32
+ NoBrokerage Chatbot allows users to query property listings by specifying filters like **city, BHK, budget, status, locality**, and returns **summary text** and **cards** with property details.
33
+
34
+ - **Semantic search**: FAISS vectorstore with HuggingFace embeddings for similarity search.
35
+ - **Deterministic filters**: Apply structured metadata filters for city, BHK, budget, status, and locality.
36
+ - **LLM summarization**: Groq LLM produces grounded summaries and card outputs strictly from filtered property records.
37
+ - **Deployment-ready**: Can run via CLI, FastAPI, Docker, or Hugging Face Spaces.
38
+
39
+ ---
40
+
41
+ ## Features
42
+
43
+ - Parse natural language queries for:
44
+ - Budget (₹, Cr, Lakh)
45
+ - BHK
46
+ - City
47
+ - Property status (Ready to move / Under construction)
48
+ - Locality or project
49
+ - FAISS similarity search over property embeddings
50
+ - Deterministic filtering of search results
51
+ - Generate structured JSON output with:
52
+ - `summary` (text summary)
53
+ - `cards` (detailed property info)
54
+ - FastAPI backend with `/chat` endpoint
55
+ - Dockerized for easy deployment
56
+ - Compatible with Hugging Face Spaces
57
+
58
+ ---
59
+
60
+ ## Project Structure
61
+
62
+
63
+ ```bash
64
+ NOBROKERAGE/
65
+ ├── backend/
66
+ │ ├── api.py
67
+
68
+ ├── data/
69
+ ├── database/
70
+ ├── frontend/
71
+ ├── processed_data/
72
+ ├── src/
73
+ │ └── chatbot.py
74
+ ├── subha/
75
+ ├── vectorstore/
76
+ │ └── index.faiss
77
+ ├── .env
78
+ ├── .gitignore
79
+ ├── Dockerfile
80
+ ├── README.md
81
+ └── requirements.txt
82
+
83
+ ```
84
+ ---
85
+
86
+ ## Example Queries the Chatbot Can Handle
87
+
88
+ The chatbot can intelligently respond to natural language queries like:
89
+
90
+ - " Find 2BHK apartments in Chembur "
91
+ - " 3BHK flat in Pune under ₹1.2 Cr "
92
+ - " Under-construction 3BHK in Mumbai "
93
+ - " 2bhk flat in pune "
94
+ - " 3bhk in Mumbai "
95
+
96
+
97
+ It uses:
98
+ - **FAISS** to find the most relevant property documents.
99
+ - **LangChain + Groq LLM** (`llama-3.1-8b-instant`) to summarize matching results.
100
+ - **Structured filters** for city, budget, BHK, locality, and status.
101
+ ---
102
+
103
+ ## How to Run Locally
104
+
105
+ ### 1. Clone the Repository
106
+ ```bash
107
+ git clone https://github.com/yourusername/nobrokerage.git
108
+ cd nobrokerage
109
+ ```
110
+ ### 2. Create Virtual Environment
111
+ ```bash
112
+ python -m venv venv
113
+ venv\Scripts\activate # on Windows
114
+ # OR
115
+ source venv/bin/activate # on Mac/Linux
116
+ ```
117
+ ### 3. Install Dependencies
118
+ ```bash
119
+ pip install -r requirements.txt
120
+ ```
121
+ ### 4. Set Up Environment Variables
122
+ ```bash
123
+ GROQ_API_KEY=your_groq_api_key_here
124
+ ```
125
+ ### 5. Run the FastAPI Server
126
+ ```bash
127
+ cd backend
128
+ uvicorn api:app --reload
129
+ ```
130
+ ---
131
+
132
+ ## Tech Stack
133
+
134
+ - **FastAPI** — Backend API framework
135
+ - **Frontend** - index.html, style.css, script.js
136
+ - **LangChain** — LLM orchestration
137
+ - **Groq LLM (llama-3.1-8b-instant)** — Summarization & reasoning
138
+ - **FAISS** — Semantic vector search
139
+ - **HuggingFace Sentence Transformer** — Embeddings
140
+ - **Docker** — Containerization
141
+ - **Python 3.11**
142
+
143
+ ---
144
+
145
+ ## Features
146
+
147
+ ✅ Semantic property search using FAISS
148
+ ✅ Intelligent summaries and cards generated by Groq LLM
149
+ ✅ Handles filters like city, budget, BHK, and project status
150
+ ✅ Ready for Hugging Face Spaces or cloud deployment
151
+ ✅ Modular architecture (backend + src separation)
152
+
153
+ ---
154
+
155
+ ## Deployment Ready
156
+
157
+ This backend is designed to work seamlessly with **Docker** and can deploy directly to **Hugging Face Spaces**.
158
+ Make sure `vectorstore/` and `.env` are included in your project before building the Docker image.
159
+
160
+ ---
161
+
162
+ ## 👨‍💻 Author
163
+
164
+ **Subhakanta Rath**
165
+ 🎓 MSc AI & ML — IIIT Lucknow
166
+ 💡 Focused on ML, Data Engineering & Agentic AI Systems
167
+ 📍 Lucknow, India
backend/api.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from fastapi.middleware.cors import CORSMiddleware
3
+ from pydantic import BaseModel
4
+ from src.chatbot import handle_query # now safe
5
+
6
+ class ChatRequest(BaseModel):
7
+ query: str
8
+
9
+ class ChatResponse(BaseModel):
10
+ answer: str
11
+ cards: list = []
12
+
13
+ app = FastAPI(title="NoBrokerage Chatbot")
14
+
15
+ app.add_middleware(
16
+ CORSMiddleware,
17
+ allow_origins=["*"],
18
+ allow_credentials=True,
19
+ allow_methods=["*"],
20
+ allow_headers=["*"],
21
+ )
22
+
23
+ @app.post("/chat", response_model=ChatResponse)
24
+ def chat(request: ChatRequest):
25
+ result = handle_query(request.query)
26
+ return ChatResponse(answer=result.get("summary"), cards=result.get("cards", []))
27
+
28
+ @app.get("/")
29
+ def root():
30
+ return {"message": "✅ NoBrokerage running"}
data/ProjectAddress.csv ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ id , projectId , landmark , fullAddress , pincode
2
+ cmf53kl01000nvcu8ibut7fka, cmf53kkzy000fvcu8tx8jwjmr, Babys school , Mumbai chembur , 411017
3
+ cmf5r6hv30008vxptq5el3h5n, cmf5r6hv00001vxptnfichhfl, Sai nagar , "sr no 13 beside godrej, opposite to mca stadium, sai nagar, mamurdi, pune " , 412101
4
+ cmfawdrnt000kvc18h3j7e93j, cmfawdrno0007vc18l0fm0z2j, Sindhi Society , "Sindhi Society, Near Swami Vivekanand Jr College, Chembur, Mumbai Harbour, Mumbai" , 400071
5
+ cmfaxq2ot002avc18ild77rjg, cmfaxq2oo0020vc1806nmle00, Sindhi Society , "Cts 300, plot no 37, opposite midtown 71, Sindhi Society, Chembur, Mumbai, Maharashtra 400071" , 400069
6
+ cmfaycwya003hvc18yc5gtwtc, cmfaycwy70036vc18ppmb8mwh, Hind high school , "104, Yashvant Seth Jadhav Marg, Gauri Shankar Wadi No. 2, Savitribai Phule Nagar, Pant Nagar, Ghatkopar East, Mumbai, Maharashtra 400075" , 400075
7
+ cmfc6pq1n000cvca0gpdjstzf, cmfc6pq1k0001vca0ikzb258m, JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081
8
+ cmfc79ip8001lvca0o1ls6fuz, cmfc79ip5001cvca0qht6o44p, JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015
9
+ cmfc80zv4002lvca04o23il71, cmfc80zv1002dvca0hcgoc6ea, Infiniti Mall , "Swaroop Aditya Avenue, Sheraton Hotel, Marol Pipeline Rd, near Itc Maratha, Kanti Nagar, J B Nagar, Andheri East, Mumbai, Maharashtra 400099", 400099
10
+ cmfc8w1ea003nvca0sz7s13bl, cmfc8w1e8003dvca0yvieggaz, R Mall , "Marigold Miraaya, Purushottam Kheraj Rd, Asha Nagar, Mulund West, Mumbai, Maharashtra 400080" , 400080
11
+ cmfcccifw004vvca0mvtcgxos, cmfcccifs004nvca0b7im3r5a, Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201
12
+ cmfcd6uus005ovca0f1pjzb76, cmfcd6uup005fvca03vhph9j1, R City , "3WG5+CHM, 90 Feet Rd, Garodia Nagar, Ghatkopar East, Mumbai, Maharashtra 400077" , 400077
13
+ cmfcdo9ek006qvca0y01p1j7c, cmfcdo9ei006gvca0wq9t8usr, Criticare Hospital , "Makwana Rd, Gamdevi, Marol, Andheri East, Mumbai, Maharashtra 400059" , 400059
14
+ cmfcg9req000avc20v8brb1zg, cmfcg9ren0001vc209rw25eve, Sarai Sport Acadamy , " Kate Wasti Rd, Kate Wasti, Punawale, Pimpri-Chinchwad, Dattwadi, Maharashtra 411033" , 411033
15
+ cmfdmdqmu000jvc90b6auuc6b, cmfdmdqmq0008vc90svu2sfto, Station Road Saraswat Colony , "CTS NO 391, Station Rd, opp. Zilla Parishad, Mangalwar Peth, Somwar Peth, Pune, Maharashtra 411011" , 411011
16
+ cmfdnk2s1001xvc90bewa3cn0, cmfdnk2rz001rvc90t6aa3f0e, Model Colony , "1102/A/48, Lakaki Rd, Model Colony, Shivajinagar, Pune, Maharashtra 411016" , 411016
17
+ cmfdro2w4002ovc90arhj0v5w, cmfdro2w2002ivc90co2n24lb, Bharat English School & jr. College , "Dinmanee, Squadron Leader Sureshchandra Bhagwat Rd, Model Colony, Shivajinagar, Pune, Maharashtra 411016" , 411016
18
+ cmfdssd1b003fvc90p5sgwr4n, cmfdssd190037vc90paoxv29h, Renuka mata mandir , "Sr.no.36 Zoa, keshav nagar,Neatr renuka mata Temple Mundhwa, pune 411036" , 411036
19
+ cmfdu2099004evc90okn0mpde, cmfdu20970046vc90g587nym1, Shri Kshetra Kalbhairavnath Temple , "Survey no. 18-19, plot no. p7, river road, Thite Nagar, Kharadi, Pune, Maharashtra 411014" , 411014
20
+ cmfdvkxex0059vc90y73532b2, cmfdvkxeu0053vc90gquj3cbz, Sai nagar Rd , "Sai Nagar, Mamurdi, Dehu Road, Maharashtra 412101" , 412101
21
+ cmfdxi4sy005zvc909kpgh2dl, cmfdxi4sv005rvc90ygfhnzc9, Maharashtra Cricket Association Stadium, "MP78+P45, St Tukaram Nagar, Mamurdi, Dehu Road, Maharashtra 412101" , 412101
22
+ cmfdyb2yf0071vc90z0jmbahe, cmfdyb2yc006rvc900owycgrv, Chandraprabha corner , "BRT Link Rd, Ravet, Pimpri-Chinchwad, Maharashtra 412101" , 412099
23
+ cmfdz9fvz008hvc9079u0jrlc, cmfdz9fvx0088vc90pw26eyr8, Police Station , "Santiago sky town, MP9R+2JG, Ravet Rd, Vikas Nagar, Ravet, Pimpri-Chinchwad, Dehu Road, Maharashtra 412101" , 412101
24
+ cmfe01l6j009pvc902gw4nwqa, cmfe01l6h009gvc90y1zazr09, MNGL CNG Station , "The Silver altair Project Sr.No. 8/1,12/5 Near MNGL CNG Station , Aundh Ravet BRTS RD, Ravet" , 412101
25
+ cmff8swbn0007vxp7bhj7cmqv, cmff8swbm0001vxp7pe3neibi, sdfgb , asdfgh , 123456
26
+ cmftjwws90009vx552vtbze6k, cmftjwws60001vx55r0q7797l, LANDMARK , ADDRESS , 123456
27
+ cmfw5ivre0009vxnkmzexw3zd, cmfw5ivra0001vxnkbozvz8bd, sedrftgyhuj , awsedrftgyhujk , 123456
28
+ cmfwd3782000evxgxgjz4wuum, cmfwd377z0008vxgxd9nju858, landmark , address , 828123
29
+ cmfxrvmud000kqq13r64tex8v, cmfxrvmuc0009qq138n0vk91p, Jain mandir , "Building No 10, Subhash Nagar Redevelopment Cluster, Subhash Nagar, Chembur, Mumbai, Maharashtra 400071" , 400071
30
+ cmfxtgtbz000fvxov0zosuc1d, cmfxtgtbw0009vxov4t5onh7d, esrdfghbj , sdfghj , 123456
31
+ cmfxwmse80007qq099axxvni0, cmfxwmse70001qq0908yt6oar, Shri siddhivinayak ganesh temple , "Building No 10, Subhash Nagar Redevelopment Cluster, Subhash Nagar, Chembur, Mumbai, Maharashtra 400071" , 400076
32
+ cmfxxh08u001cqq09fwo5o5i7, cmfxxh08t0013qq09o0rajcrt, Shri siddhivinayak ganesh temple , "Subhash Nagar, Chembur, Mumbai Harbour, Mumbai" , 400076
data/ProjectConfiguration.csv ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ id , projectId , propertyCategory, type , customBHK
2
+ cmf53kkzz000ivcu89r5399s4, cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL , 1BHK ,
3
+ cmf53kl00000kvcu86ivy65di, cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL , 2BHK ,
4
+ cmf5r6hv20004vxpt0l657blu, cmf5r6hv00001vxptnfichhfl, RESIDENTIAL , 2BHK , 2BHK
5
+ cmfawdrnq000avc18qcvaxzi9, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 1BHK , 1BHK
6
+ cmfawdrnr000dvc188hupv4yy, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 3BHK , 3BHK
7
+ cmfawdrnr000gvc18iunqlv98, cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL , 2BHK , 2BHK
8
+ cmfaxq2or0023vc18biodrtiy, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 1BHK , 1BHK
9
+ cmfaxq2os0025vc18y99ryrns, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 2BHK , 2BHK
10
+ cmfaxq2os0027vc1861948lln, cmfaxq2oo0020vc1806nmle00, RESIDENTIAL , 3BHK , 3BHK
11
+ cmfaycwy80039vc18b1epdodx, cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL , 1BHK , 1BHK
12
+ cmfaycwy9003dvc1853ic14wb, cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL , 2BHK , 2BHK
13
+ cmfc6pq1m0004vca0cdihsx99, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 1BHK , 1BHK
14
+ cmfc6pq1m0006vca04kqz1wsp, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 2BHK , 2BHK
15
+ cmfc6pq1m0009vca0tmv501em, cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL , 3BHK , 3BHK
16
+ cmfc79ip7001fvca0dhfqinl1, cmfc79ip5001cvca0qht6o44p, RESIDENTIAL , 1BHK , 1BHK
17
+ cmfc79ip7001ivca0pjtsq247, cmfc79ip5001cvca0qht6o44p, RESIDENTIAL , 2BHK , 2BHK
18
+ cmfc80zv3002gvca08q08d09k, cmfc80zv1002dvca0hcgoc6ea, COMMERCIAL , Office , Office
19
+ cmfc8w1e9003gvca0vfq51lrw, cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL , 2BHK , 2BHK
20
+ cmfc8w1ea003kvca0antflsgo, cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL , 3BHK , 3BHK
21
+ cmfcccifu004qvca0daqsesxl, cmfcccifs004nvca0b7im3r5a, RESIDENTIAL , 1BHK , 1BHK
22
+ cmfcccifv004svca07g88pbp7, cmfcccifs004nvca0b7im3r5a, RESIDENTIAL , 2BHK , 2BHK
23
+ cmfcd6uur005ivca0zanvi722, cmfcd6uup005fvca03vhph9j1, RESIDENTIAL , 2BHK , 2BHK
24
+ cmfcd6uur005lvca0r1lfayx1, cmfcd6uup005fvca03vhph9j1, RESIDENTIAL , 3BHK , 3BHK
25
+ cmfcdo9ej006jvca0unalmr56, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , 1BHK , 1BHK
26
+ cmfcdo9ek006lvca0wye9m2zq, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , 2BHK , 2BHK
27
+ cmfcdo9ek006nvca0aerkp2r8, cmfcdo9ei006gvca0wq9t8usr, RESIDENTIAL , Office space,
28
+ cmfcg9rep0004vc20nnmldrf5, cmfcg9ren0001vc209rw25eve, RESIDENTIAL , 2BHK , 2BHK
29
+ cmfcg9rep0006vc20zocna1zw, cmfcg9ren0001vc209rw25eve, RESIDENTIAL , 3BHK , 3BHK
30
+ cmfdmdqms000bvc90e1hpq42a, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 1BHK , 1BHK
31
+ cmfdmdqmt000dvc90s9ndd0nq, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 2BHK , 2BHK
32
+ cmfdmdqmt000gvc90h6gcwpga, cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL , 3BHK , 3BHK
33
+ cmfdnk2s1001uvc90qi4xuo6m, cmfdnk2rz001rvc90t6aa3f0e, RESIDENTIAL , 4.5BHK , Custom
34
+ cmfdro2w3002lvc90reujbiw4, cmfdro2w2002ivc90co2n24lb, RESIDENTIAL , 3BHK , 3BHK
35
+ cmfdssd1a003avc90t92jvmti, cmfdssd190037vc90paoxv29h, RESIDENTIAL , 1BHK , 1BHK
36
+ cmfdssd1b003cvc905s09tzlj, cmfdssd190037vc90paoxv29h, RESIDENTIAL , 2BHK , 2BHK
37
+ cmfdu20980049vc901gbx5yzt, cmfdu20970046vc90g587nym1, RESIDENTIAL , 2BHK , 2BHK
38
+ cmfdu2099004bvc90md0gqlsn, cmfdu20970046vc90g587nym1, RESIDENTIAL , 3BHK , 3BHK
39
+ cmfdvkxew0056vc90azi120pa, cmfdvkxeu0053vc90gquj3cbz, RESIDENTIAL , 2BHK , 2BHK
40
+ cmfdxi4sx005uvc90ek5w6w18, cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL , 1BHK ,
41
+ cmfdxi4sx005wvc90x44fqzb5, cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL , 2BHK ,
42
+ cmfdyb2yd006uvc90uba2ys2y, cmfdyb2yc006rvc900owycgrv, RESIDENTIAL , 2BHK ,
43
+ cmfdyb2ye006xvc90tgudor3v, cmfdyb2yc006rvc900owycgrv, RESIDENTIAL , 3BHK ,
44
+ cmfdz9fvy008bvc90b7nawpiw, cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL , 2BHK , 2BHK
45
+ cmfdz9fvy008evc90f98iggaw, cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL , 3BHK , 3BHK
46
+ cmfe01l6i009jvc90qz54yiev, cmfe01l6h009gvc90y1zazr09, RESIDENTIAL , 2BHK , 2BHK
47
+ cmfe01l6j009mvc90aj7pny7p, cmfe01l6h009gvc90y1zazr09, RESIDENTIAL , 3BHK , 3BHK
48
+ cmfozqxd90001vxxuau2xc6lj, cmff8swbm0001vxp7pe3neibi, RESIDENTIAL , 5BHK ,
49
+ cmfozzj19001rvxxuloxiehen, cmff8swbm0001vxp7pe3neibi, RESIDENTIAL , 2BHK ,
50
+ cmftjwws80004vx55yx8nel0u, cmftjwws60001vx55r0q7797l, RESIDENTIAL , 4BHK , 4BHK
51
+ cmftjwws80006vx55x3s20w2u, cmftjwws60001vx55r0q7797l, RESIDENTIAL , 4.5BHK ,
52
+ cmfw5ivrc0004vxnkqlpfdbae, cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL , House_Villa , House_Villa
53
+ cmfw5ivrd0006vxnk2bia4myh, cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL , 3BHK , 3BHK
54
+ cmfwd3781000bvxgx5ilktqht, cmfwd377z0008vxgxd9nju858, RESIDENTIAL , 4BHK , 4BHK
55
+ cmfxrvmud000cqq134yeaya3o, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 1BHK , 1BHK
56
+ cmfxrvmud000eqq13dl82i5js, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 2BHK , 2BHK
57
+ cmfxrvmud000hqq136m0p71jv, cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL , 3BHK , 3BHK
58
+ cmfxtgtby000cvxovsdc7rfa6, cmfxtgtbw0009vxov4t5onh7d, RESIDENTIAL , 3BHK , 3BHK
59
+ cmfxwmse70004qq0987ge7h2b, cmfxwmse70001qq0908yt6oar, RESIDENTIAL , 1RK ,
60
+ cmfxxh08t0016qq09wmpw7s17, cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL , 1BHK , 1BHK
61
+ cmfxxh08u0018qq09k3wwm63q, cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL , 2BHK , 2BHK
data/ProjectConfigurationVariant.csv ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "id" , "configurationId" , "bathrooms", "privateBathrooms", "publicBathrooms", "balcony", "furnishedType" , "furnishingType" , "lift" , "ageOfProperty", "parkingType", "listingType", "floorPlanImage" , "carpetArea", "price" , "propertyImages" , "maintenanceCharges", "aboutProperty" , "createdAt" , "updatedAt"
2
+ "cmf5r6hv20005vxpt3yfnl2qp", "cmf5r6hv20004vxpt0l657blu", "12" , , , "3" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238520-ba6c9c4021ea321f.jpg" , "972" , "120000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238541-c8a6e3aced460e18.jpg""]" , "faded " , "about property " , "2025-09-04 18:42:08.748", "2025-09-04 18:42:08.748"
3
+ "cmf5r6hv20006vxptcx3lmm05", "cmf5r6hv20004vxpt0l657blu", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238542-2d39a8b06669406b.jpg" , "188.73" , "210000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757011238542-bd3d1a40c2d7fadb.jpg""]" , , "fsdaffdsafsfdddsa" , "2025-09-04 18:42:08.748", "2025-09-04 18:42:08.748"
4
+ "cmfawdrnq000bvc188680qjyx", "cmfawdrnq000avc18qcvaxzi9", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391101-b4e4be9945434d29.jpg" , "426.57" , "13000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391106-7c383f81d9c66290.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
5
+ "cmfawdrnr000cvc1897rpsu1b", "cmfawdrnq000avc18qcvaxzi9", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391141-e6c14becbdbd76a2.jpg" , "460.8" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391150-9b806803ceb0c8b6.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
6
+ "cmfawdrnr000evc18jwvlery4", "cmfawdrnr000dvc188hupv4yy", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391158-41329b8304cff17d.jpg" , "893.08" , "29000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391167-19d3844213de86cb.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
7
+ "cmfawdrnr000fvc18af74elnu", "cmfawdrnr000dvc188hupv4yy", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391179-7f2bff943c2805a5.jpg" , "918.27" , "29000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391188-7b25319224e8a812.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
8
+ "cmfawdrns000hvc18t3u6jukg", "cmfawdrnr000gvc18iunqlv98", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391195-0e9c4aa442f80776.jpg" , "804.6" , "26000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391202-e4d28b891dcb832f.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
9
+ "cmfawdrns000ivc181n6bq8cm", "cmfawdrnr000gvc18iunqlv98", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391210-70f3ad7351a09d4c.jpg" , "1036.67" , "33000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757322391218-4ca8b878a42de5ae.jpg""]" , , "na" , "2025-09-08 09:06:36.995", "2025-09-08 09:06:36.995"
10
+ "cmfaxq2or0024vc18pjebowp8", "cmfaxq2or0023vc18biodrtiy", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645437-975f7a8ecca1de6d.jpg" , "443.37" , "13000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645448-dbde48f7805f3bd0.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
11
+ "cmfaxq2os0026vc18v92cqw3r", "cmfaxq2os0025vc18y99ryrns", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645448-970dda42c441c73b.jpg" , "644.11" , "19000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645449-b2f826d061804b98.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
12
+ "cmfaxq2os0028vc18z4otsg17", "cmfaxq2os0027vc1861948lln", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645450-abde5eb3211c0467.jpg" , "798.57" , "23000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757324645451-d9b3e0a968cfc871.jpg""]" , , "na" , "2025-09-08 09:44:10.775", "2025-09-08 09:44:10.775"
13
+ "cmfaycwy9003avc18vwkotg8q", "cmfaycwy80039vc18b1epdodx", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712590-57c98e762d3e95c3.jpg" , "379" , "850000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712591-aa79bad30786e10c.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
14
+ "cmfaycwy9003bvc189xf97r7w", "cmfaycwy80039vc18b1epdodx", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712593-25cd2d9a5765be22.jpg" , "354" , "790000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712594-cd33c56e7db9cd37.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
15
+ "cmfaycwy9003cvc181yx3c5gf", "cmfaycwy80039vc18b1epdodx", "1" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712597-accd128a6ea12d10.jpg" , "391" , "880000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712598-d2ac8b8887119ad8.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
16
+ "cmfaycwy9003evc186uhex90a", "cmfaycwy9003dvc1853ic14wb", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712599-4bd849d13fb20425.jpg" , "536" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712607-8e031215d719e572.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
17
+ "cmfaycwy9003fvc1859euhuy7", "cmfaycwy9003dvc1853ic14wb", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712608-05900f06f63a6dfa.jpg" , "650" , "14000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757325712608-e94b60550c5c2690.jpg""]" , , "na" , "2025-09-08 10:01:56.431", "2025-09-08 10:01:56.431"
18
+ "cmfc6pq1m0005vca07z1oktrg", "cmfc6pq1m0004vca0cdihsx99", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210633-ec5431f188d4de3c.jpg" , "457.57" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210665-ab087e966ba018ff.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
19
+ "cmfc6pq1m0007vca0wei4jsgs", "cmfc6pq1m0006vca04kqz1wsp", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210671-c54804f690eac296.jpg" , "652.83" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210672-3f6998fafc9e8521.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
20
+ "cmfc6pq1m0008vca0hsbdneqc", "cmfc6pq1m0006vca04kqz1wsp", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210675-be2512dbfae0b3f7.jpg" , "728.5" , "19000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210678-f61b2d8c4b4a4a50.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
21
+ "cmfc6pq1n000avca0g8zz0fur", "cmfc6pq1m0009vca0tmv501em", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210681-7ca76e0e6739c3c1.jpg" , "1240.22" , "33000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210682-37e9e8c4f43b5b32.jpg""]" , , "na" , "2025-09-09 06:43:37.112", "2025-09-09 06:43:37.112"
22
+ "cmfc79ip7001gvca0u52qiras", "cmfc79ip7001fvca0dhfqinl1", "1" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136185-abf1e76a1175f931.jpg" , "416.56" , "9890000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-23bdb16c58a9e122.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
23
+ "cmfc79ip7001hvca0xz5kv4ld", "cmfc79ip7001fvca0dhfqinl1", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-d8d90b0f32b32c7f.jpg" , "438.63" , "14000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-7ce77cd129550d77.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
24
+ "cmfc79ip8001jvca0r5k1gc5d", "cmfc79ip7001ivca0pjtsq247", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-1ecea6707162bfe7.jpg" , "653.15" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136188-b404a27ba98528f4.jpg""]" , , "na" , "2025-09-09 06:59:00.713", "2025-09-09 06:59:00.713"
25
+ "cmfc80zv3002hvca0yghwoxui", "cmfc80zv3002gvca08q08d09k", "1" , "1" , "1" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417345-d65dfb1fd5d0d077.jpg" , "239" , "5975000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417346-ede3eaf6864e2efa.jpg""]" , , "na" , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
26
+ "cmfc80zv4002ivca0pti2hjp8", "cmfc80zv3002gvca08q08d09k", "1" , "1" , "1" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417346-59bcce3ff8c17194.jpg" , "309" , "7720000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417347-f5e0ac2f495d60e1.jpg""]" , , "na" , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
27
+ "cmfc80zv4002jvca0kkwyzbb6", "cmfc80zv3002gvca08q08d09k", "0" , "0" , "0" , , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417348-0cca2389f798785c.jpg" , "634" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757402417348-9bfc082c0bba270f.jpg""]" , , , "2025-09-09 07:20:22.669", "2025-09-09 07:20:22.669"
28
+ "cmfc8w1ea003hvca0yj9692xd", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866053-185c21624393f002.jpg" , "637.76" , "8900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-3b21d5295d1b7bce.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
29
+ "cmfc8w1ea003ivca01s66pru9", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-1c8c078c7503aa74.jpg" , "783.83" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-19520d6cb5866f61.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
30
+ "cmfc8w1ea003jvca011hgz43s", "cmfc8w1e9003gvca0vfq51lrw", "2" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-f05bbc2ef47cc262.jpg" , "719.46" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-18d491c4116a4a1d.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
31
+ "cmfc8w1ea003lvca01p19m6o0", "cmfc8w1ea003kvca0antflsgo", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866054-66f1c36cd5370f62.jpg" , "1090.59" , "15000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757403866055-12dde6891b923a80.jpg""]" , , "na" , "2025-09-09 07:44:30.992", "2025-09-09 07:44:30.992"
32
+ "cmfcccifv004rvca0a0lvecba", "cmfcccifu004qvca0daqsesxl", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672773-6523197b4bafe2f8.jpg" , "422" , "4190000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672775-37d2dedeb898bfd3.jpg""]" , , "na" , "2025-09-09 09:21:18.424", "2025-09-09 09:21:18.424"
33
+ "cmfcccifv004tvca0yjaewx04", "cmfcccifv004svca07g88pbp7", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-9c48211b8fc08a50.jpg" , "580" , "5770000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-55a3d0d5d7d3bb44.jpg""]" , , "na" , "2025-09-09 09:21:18.424", "2025-09-09 09:21:18.424"
34
+ "cmfcd6uur005jvca02nt9ohd3", "cmfcd6uur005ivca0zanvi722", "2" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089519-382dc615d1a8a01c.jpg" , "518.71" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089520-1fd3665afc1a746a.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
35
+ "cmfcd6uur005kvca0xz0ru5kf", "cmfcd6uur005ivca0zanvi722", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089523-4a25ba0ab26ba4af.jpg" , "712.68" , "24000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089524-f866cded7e572242.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
36
+ "cmfcd6uus005mvca0z74nkpkh", "cmfcd6uur005lvca0r1lfayx1", "3" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089524-85f5063857a9e066.jpg" , "1098.46" , "37000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411089525-9e16be48ea1c5dca.jpg""]" , , "na" , "2025-09-09 09:44:54.193", "2025-09-09 09:44:54.193"
37
+ "cmfcdo9ej006kvca0mi9penvv", "cmfcdo9ej006jvca0unalmr56", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900104-d2b27e1086902c25.jpg" , "425.39" , "12000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900105-0cd46f586c660d51.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
38
+ "cmfcdo9ek006mvca080i6yeza", "cmfcdo9ek006lvca0wye9m2zq", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900105-92746a06993e21a1.jpg" , "589.43" , "17000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900106-3270032d1b3b29a6.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
39
+ "cmfcdo9ek006ovca0wwc1e84f", "cmfcdo9ek006nvca0aerkp2r8", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900106-2052b7fd49a2faaa.jpg" , "710.63" , "21000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757411900108-5b7ad0636af0eef0.jpg""]" , , "na" , "2025-09-09 09:58:26.202", "2025-09-09 09:58:26.202"
40
+ "cmfcg9rep0005vc20150vzeqp", "cmfcg9rep0004vc20nnmldrf5", "0" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263429-b34f6e00dad04cee.jpg" , "835" , "67000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263441-db4005e8699b54f5.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
41
+ "cmfcg9rep0007vc20aotbggv3", "cmfcg9rep0006vc20zocna1zw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263442-37973fcf73632905.jpg" , "1064" , "86000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263443-efccc3b7b11a9cf6.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
42
+ "cmfcg9rep0008vc207t5kmleq", "cmfcg9rep0006vc20zocna1zw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263444-42b0f4d7ba7315d4.jpg" , "1185" , "96000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757416263445-61ad0a336e5cd7e8.jpg""]" , , "na" , "2025-09-09 11:11:08.543", "2025-09-09 11:11:08.543"
43
+ "cmfdmdqms000cvc90o7xhka3i", "cmfdmdqms000bvc90e1hpq42a", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991474-f7da47510a2039a9.jpeg", "269.1" , "5649000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991482-830ba2f79d951b2a.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
44
+ "cmfdmdqmt000evc90cfyoejib", "cmfdmdqmt000dvc90s9ndd0nq", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991488-c0b949b98960c0ed.jpg" , "685" , "14300000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991494-9ac904a02c4e153c.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
45
+ "cmfdmdqmt000fvc900m43j9nq", "cmfdmdqmt000dvc90s9ndd0nq", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , , "900" , "18900000" , "[]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
46
+ "cmfdmdqmt000hvc90cqvdwrq7", "cmfdmdqmt000gvc90h6gcwpga", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991499-74fa17a4c97985e2.jpg" , "1095" , "22900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757486991505-2373b8e162de669f.jpg""]" , "NA" , "NA" , "2025-09-10 06:49:58.034", "2025-09-10 06:49:58.034"
47
+ "cmfdnk2s1001vvc90hgqf4i31", "cmfdnk2s1001uvc90qi4xuo6m", "4" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757488967184-719e10b6efff3546.jpg" , "2650" , "55800000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757488967185-54cee65e85919c06.jpg""]" , , "NA" , "2025-09-10 07:22:53.328", "2025-09-10 07:22:53.328"
48
+ "cmfdro2w3002mvc90s7nanw73", "cmfdro2w3002lvc90reujbiw4", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757495874341-877b209a8dd708f2.jpg" , "1065" , "25400000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757495874342-f91c6d45130b2367.jpg""]" , "NA" , "NA" , "2025-09-10 09:17:58.561", "2025-09-10 09:17:58.561"
49
+ "cmfdssd1b003bvc90y4vu1v7i", "cmfdssd1a003avc90t92jvmti", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751961-62a4a746ffb7d92a.jpeg", "450" , "7499000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751961-e4b9f6b35ff84fc4.jpg""]" , "NA" , "NA" , "2025-09-10 09:49:17.949", "2025-09-10 09:49:17.949"
50
+ "cmfdssd1b003dvc903vfdvvi2", "cmfdssd1b003cvc905s09tzlj", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751962-8264b2f46aeac8b4.jpg" , "850" , "14100000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757497751962-181b9fb00f69e030.jpg""]" , "NA" , "NA" , "2025-09-10 09:49:17.949", "2025-09-10 09:49:17.949"
51
+ "cmfdu2098004avc90e18s3onw", "cmfdu20980049vc901gbx5yzt", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882365-234e90325d589de6.jpg" , "774" , "13600000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882366-5ff9be2083ac3230.jpg""]" , "NA" , "NA" , "2025-09-10 10:24:47.563", "2025-09-10 10:24:47.563"
52
+ "cmfdu2099004cvc90ne8y9pf7", "cmfdu2099004bvc90md0gqlsn", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882367-f956a3cf2e42cc2e.jpg" , "1044" , "13900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757499882368-39d519773fe47182.jpg""]" , "NA" , "NA" , "2025-09-10 10:24:47.563", "2025-09-10 10:24:47.563"
53
+ "cmfdvkxew0057vc90kpqcfjys", "cmfdvkxew0056vc90azi120pa", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757502445782-c4d339912dac6059.jpg" , "912" , "66800000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757502445783-07ddd86f8b94a188.jpg""]" , "NA" , "NA" , "2025-09-10 11:07:29.958", "2025-09-10 11:07:29.958"
54
+ "cmfdz9fvy008cvc90tbqa3czs", "cmfdz9fvy008bvc90b7nawpiw", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-94d95f7bbb80de8a.jpg" , "767" , "784300000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-f415324344fe391c.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
55
+ "cmfdz9fvy008dvc90825ql292", "cmfdz9fvy008bvc90b7nawpiw", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627511-b25862c0a7c41854.jpg" , "786" , "8037000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627515-f85803015d61e3d3.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
56
+ "cmfdz9fvy008fvc90mg7x9wwf", "cmfdz9fvy008evc90f98iggaw", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627516-8e8d34b349402165.jpg" , "1017" , "13900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757508627516-8162911bdda309f0.jpg""]" , "NA" , "NA" , "2025-09-10 12:50:32.493", "2025-09-10 12:50:32.493"
57
+ "cmfe01l6i009kvc90s59ib9e3", "cmfe01l6i009jvc90qz54yiev", "1" , , , "4" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935799-56e60e5d51f758f8.jpg" , "880" , "8409000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935800-7ec66eb73cfad6b5.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
58
+ "cmfe01l6j009lvc90tcyi3t79", "cmfe01l6i009jvc90qz54yiev", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-62f8a4e2e69af1fb.jpg" , "921" , "8885000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-4a6e51cf542453de.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
59
+ "cmfe01l6j009nvc904pcq2sfa", "cmfe01l6j009mvc90aj7pny7p", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935801-e3046c3165cb6a9a.jpg" , "1048" , "11000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757509935802-e9fd330d696b020e.jpg""]" , "NA" , "NA" , "2025-09-10 13:12:25.721", "2025-09-10 13:12:25.721"
60
+ "cmff8vfoq0013vxp7h3onmg46", "cmf53kkzz000ivcu89r5399s4", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757584023815-67012c27580e3e23.jpg" , "123" , "11111111" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-1e5179453b5df91d.jpg""]" , , "jjhhhu" , "2025-09-11 10:07:21.386", "2025-09-11 10:07:21.386"
61
+ "cmff8vjd4001dvxp7tq21djvf", "cmf53kl00000kvcu86ivy65di", "0" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-419924a4c5c28823.jpg" , "456" , "22222222" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-7c8c73119cb2047b.jpg""]" , , "nbhjg" , "2025-09-11 10:07:26.152", "2025-09-11 10:07:26.152"
62
+ "cmfgp97cv0001vxiu8xn9weu6", "cmfdyb2yd006uvc90uba2ys2y", "2" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025374-12d089344fa03c16.jpg" , "719" , "7916000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025374-6b9222f0e2694408.jpg""]" , , "NA" , "2025-09-12 10:33:43.807", "2025-09-12 10:33:43.807"
63
+ "cmfgp97ei0003vxiubxjn87zv", "cmfdyb2yd006uvc90uba2ys2y", "8" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-8c1c881fc556c580.jpg" , "714" , "7624000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-b7d209814ec2b899.jpg"",""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757573877398-e4d685da0a0dfae1.jpg""]", , "NA" , "2025-09-12 10:33:43.807", "2025-09-12 10:33:43.807"
64
+ "cmfgp9avl000mvxiui2lz3xmj", "cmfdyb2ye006xvc90tgudor3v", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025375-6d208dc15b1ffe3b.jpg" , "954" , "9900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025385-aedb0110dffa5f27.jpg""]" , , "NA" , "2025-09-12 10:33:48.369", "2025-09-12 10:33:48.369"
65
+ "cmfgp9avl000nvxiu2x1yqc8h", "cmfdyb2ye006xvc90tgudor3v", "3" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757507025386-cd046b94df0f53d9.jpg" , "973" , "11000000" , "[]" , , "NA" , "2025-09-12 10:33:48.369", "2025-09-12 10:33:48.369"
66
+ "cmfp02pgf0023vxxulf38fhsj", "cmfozqxd90001vxxuau2xc6lj", "8" , , , "8" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174783708-6bab276d8a2b3207.jpg" , "9.79" , "10088000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174623697-27c4f71a991e078c.jpg""]" , , "asdfghjk" , "2025-09-18 05:58:45.853", "2025-09-18 05:58:45.853"
67
+ "cmfp02t4b002dvxxu826dader", "cmfozzj19001rvxxuloxiehen", "99" , , , "987" , "SEMI_FURNISHED", "[""KITCHEN_APPLIANCES"",""BASIC_FURNITURE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174963753-1d59b6ee8bc63eff.jpg" , "9" , "980000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174963765-07ee6ee92139cc03.jpeg""]" , , "asdfghjkl;vbn" , "2025-09-18 05:58:50.603", "2025-09-18 05:58:50.603"
68
+ "cmfp02t6d002fvxxubqj69fmu", "cmfozzj19001rvxxuloxiehen", "10" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-bb8651e2ee2d0642.png" , "3" , "120000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-0dead4f474b5ccbc.jpg""]" , , "about property" , "2025-09-18 05:58:50.603", "2025-09-18 05:58:50.603"
69
+ "cmftjwws80005vx55hh50oj5t", "cmftjwws80004vx55yx8nel0u", "1" , , , "2" , "SEMI_FURNISHED", "[""KITCHEN_APPLIANCES"",""WARDROBE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157387-61f41f3b1aba317d.jpg" , "12" , "20000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157413-fd5b7567dbd1a680.png""]" , , "about this property hahah", "2025-09-21 10:25:12.438", "2025-09-21 10:25:12.438"
70
+ "cmftjwws80007vx55btfpj0zh", "cmftjwws80006vx55x3s20w2u", "1" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , , "122" , "10000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758450157414-15c5ef82cad99022.jpg""]" , , "ABOUT PROPERTY " , "2025-09-21 10:25:12.438", "2025-09-21 10:25:12.438"
71
+ "cmfw5ivrc0005vxnktgx2aruy", "cmfw5ivrc0004vxnkqlpfdbae", "5" , , , "4" , "SEMI_FURNISHED", "[""LIGHTS_FANS"",""BASIC_FURNITURE""]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532938-1eb357675429379e.jpg" , "8" , "80000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-b93d0b2a52058cc7.webp""]" , , "asdfghj" , "2025-09-23 06:05:41.83" , "2025-09-23 06:05:41.83"
72
+ "cmfw5ivrd0007vxnk9hpgpk3m", "cmfw5ivrd0006vxnk2bia4myh", "99" , , , "88" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-ac73972e2cdcdbfb.jpg" , "69" , "960000000", "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758607532944-e10a4f6be6b3cc76.jpg""]" , , "described huh ...?" , "2025-09-23 06:05:41.83" , "2025-09-23 06:05:41.83"
73
+ "cmfwd3781000cvxgxh6ehnao5", "cmfwd3781000bvxgx5ilktqht", "10" , , , "12" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758620243241-c0143b04ebeb03b2.jpg" , "2" , "30000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758620243242-5810bb1b43a5db87.webp""]" , , "about property" , "2025-09-23 09:37:27.119", "2025-09-23 09:37:27.119"
74
+ "cmfxrvmud000dqq13dhmztds7", "cmfxrvmud000cqq134yeaya3o", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551545-37ea5c3b2ad1281f.jpeg", "413.23" , "10900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551546-edea4e482b14fe41.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
75
+ "cmfxrvmud000fqq13a1u44y3m", "cmfxrvmud000eqq13dl82i5js", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551547-58f19a494160e237.jpeg", "705.14" , "18700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551548-68b2c475624ac9aa.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
76
+ "cmfxrvmud000gqq13js3rz2zw", "cmfxrvmud000eqq13dl82i5js", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551549-35d879317c8edbda.jpeg", "646.91" , "17200000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551550-8dd99bd7e0de26db.jpg""]" , , "Na" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
77
+ "cmfxrvmud000iqq13q80pzcvk", "cmfxrvmud000hqq136m0p71jv", "3" , , , "3" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551551-788c3a56eab050d8.jpeg", "901.26" , "23900000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758705551551-635af274c30c9045.jpg""]" , , "NA" , "2025-09-24 09:19:14.532", "2025-09-24 09:19:14.532"
78
+ "cmfxtgtby000dvxovucxxqsad", "cmfxtgtby000cvxovsdc7rfa6", "9" , , , "9" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-31db7b2bcb6394ec.webp", "7" , "80000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-b28e6ee1732f2e2b.webp""]" , , "sdfghjn" , "2025-09-24 10:03:42.333", "2025-09-24 10:03:42.333"
79
+ "cmfxwmse70005qq093vr7rk2k", "cmfxwmse70004qq0987ge7h2b", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758713537111-51daa54aa4442c6d.jpg" , "331.85" , "7944000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758713537116-09ebbf05ef9abbaa.jpg""]" , , "1 RK APARTMENTS" , "2025-09-24 11:32:19.903", "2025-09-24 11:32:19.903"
80
+ "cmfxxh08t0017qq09qd68njyj", "cmfxxh08t0016qq09wmpw7s17", "1" , , , "1" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944558-7c8147da421f3025.jpg" , "396.97" , "10700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944560-7c164d7b1cc645f7.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
81
+ "cmfxxh08u0019qq098khzka3e", "cmfxxh08u0018qq09k3wwm63q", "2" , , , "4" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944560-a72d3b85432ed5df.jpg" , "568.98" , "15300000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944561-7778f9768558b3c0.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
82
+ "cmfxxh08u001aqq09otdgddxp", "cmfxxh08u0018qq09k3wwm63q", "2" , , , "2" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944562-d6e4bab26b0d4fef.jpg" , "619.89" , "16700000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758714944562-e50632ef4ec31e1b.jpg""]" , , "NA" , "2025-09-24 11:55:49.757", "2025-09-24 11:55:49.757"
83
+ "cmfz8hny50001wkcc52edymyk", "cmfdxi4sx005uvc90ek5w6w18", "1" , , , "1" , "FURNISHED" , "[""KITCHEN_APPLIANCES"",""LIGHTS_FANS"",""WARDROBE"",""MODULAR_KITCHEN""]", "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674362-a03f1a776276e18c.jpg" , "497" , "30400000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674367-357debf889702320.jpg""]" , , "NA" , "2025-09-25 09:52:02.418", "2025-09-25 09:52:02.418"
84
+ "cmfz8hs5g000bwkccafirnr9h", "cmfdxi4sx005wvc90x44fqzb5", "0" , , , "0" , "UNFURNISHED" , "[]" , "false", , , "Sell" , "https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674380-a846f28fd0ac4508.jpg" , "805" , "49000000" , "[""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757505674385-88d968255a68bec4.jpg""]" , , "NA" , "2025-09-25 09:52:07.876", "2025-09-25 09:52:07.876"
data/project.csv ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ id , projectType, projectName , projectCategory, slug , slugId, status , projectAge, reraId , countryId , stateId , cityId , localityId , subLocalityId , projectSummary , possessionDate
2
+ cmf53kkzy000fvcu8tx8jwjmr, RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , , UNDER_CONSTRUCTION, , "[""P99000056045""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, , 2025-09-28 00:00:00
3
+ cmf5r6hv00001vxptnfichhfl, RESIDENTIAL, Pristine02 , STANDALONE , pristine02-modelcolony-shivajinagar-pune-428955 , , READY_TO_MOVE , 0.0, "[""P52100032109""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
4
+ cmfawdrno0007vc18l0fm0z2j, RESIDENTIAL, Gurukripa , COMPLEX , gurukripa-ashoknagar-chembur-mumbai-086047 , , UNDER_CONSTRUCTION, , "[""[\""P51800047648\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
5
+ cmfaxq2oo0020vc1806nmle00, RESIDENTIAL, Hari om , STANDALONE , hari-om-ashoknagar-chembur-mumbai-650559 , , UNDER_CONSTRUCTION, , "[""P51800066536""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfcec5ph007ivca007lzj3b3, ,
6
+ cmfaycwy70036vc18ppmb8mwh, RESIDENTIAL, Om makarand heights , STANDALONE , om-makarand-heights-ashoknagar-chembur-mumbai-716337 , , UNDER_CONSTRUCTION, , "[""P51800052217""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf6oxndf0021vcxsvog0r7bk, cmfcewd9m007svca0b4pla35a, , 2025-09-21 00:00:00
7
+ cmfc6pq1k0001vca0ikzb258m, RESIDENTIAL, Sainath Vrindavan , STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, , UNDER_CONSTRUCTION, , "[""[\""P51800049646\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
8
+ cmfc79ip5001cvca0qht6o44p, RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , , UNDER_CONSTRUCTION, , "[""[\""P51900032165\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
9
+ cmfc80zv1002dvca0hcgoc6ea, COMMERCIAL , Swaroop Aditya Avenue , STANDALONE , swaroop-aditya-avenue-ashoknagar-chembur-mumbai-422427 , , UNDER_CONSTRUCTION, , "[""[\""P51800017168\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
10
+ cmfc8w1e8003dvca0yvieggaz, RESIDENTIAL, Marigold miraaya , TOWNSHIP , luxury-marigold-miraaya--ashoknagar-chembur-mumbai-870766, , UNDER_CONSTRUCTION, , "[""[\""P51800003669\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
11
+ cmfcccifs004nvca0b7im3r5a, RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , , UNDER_CONSTRUCTION, , "[""[\""P51700048490\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
12
+ cmfcd6uup005fvca03vhph9j1, RESIDENTIAL, Bhoomi antara , STANDALONE , luxury-bhoomi-antara--ashoknagar-chembur-mumbai-093979 , , UNDER_CONSTRUCTION, , "[""[\""P51800045215\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
13
+ cmfcdo9ei006gvca0wq9t8usr, BOTH , Arkade Prime , COMPLEX , luxury-arkade-prime-ashoknagar-chembur-mumbai-906049 , , UNDER_CONSTRUCTION, , "[""[\""P51800047081\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmf51ix980003vcj0z7abv17k, ,
14
+ cmfcg9ren0001vc209rw25eve, RESIDENTIAL, Glory , STANDALONE , luxury-glory-katewasti-punawale-pune-268353 , , UNDER_CONSTRUCTION, , "[""[\""P52100077028\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmfcfnqp6007zvca0dcgj52pp, cmfcfoprz0081vca0fus0zwq5, ,
15
+ cmfdmdqmq0008vc90svu2sfto, RESIDENTIAL, Antriksh , STANDALONE , luxury-antriksh-somwarpeth-camp-pune-997560 , , UNDER_CONSTRUCTION, , "[""P52100019454"",""P52100047488""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, ,
16
+ cmfdnk2rz001rvc90t6aa3f0e, RESIDENTIAL, 16 Lakaki , STANDALONE , 16-lakaki-modelcolony-shivajinagar-pune-470663 , , UNDER_CONSTRUCTION, , "[""P52100078263""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, sdfghgvbndfgh ,
17
+ cmfdro2w2002ivc90co2n24lb, RESIDENTIAL, Dinmanee , STANDALONE , luxury-dinmanee--modelcolony-shivajinagar-pune-878430 , , UNDER_CONSTRUCTION, , "[""[\""P52100079399\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
18
+ cmfdssd190037vc90paoxv29h, RESIDENTIAL, Zoa Building - 2 Wing A , STANDALONE , zoa-building-2-wing-a-keshavnagar-mundhwa-pune-757777 , , UNDER_CONSTRUCTION, , "[""[\""P52100056199\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pwxtd003gvcxszmny2jn7, cmfds8hud0030vc90h37juexd, ,
19
+ cmfdu20970046vc90g587nym1, RESIDENTIAL, Leela by Empyrean Landmarks - Phase 1 & 2, STANDALONE , leela-by-empyrean-landmar-thitenagar-kharadi-pune-887385 , , UNDER_CONSTRUCTION, , "[""[\""P52100078302\"",\""P52100052570\""]""]", cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pxwqh003jvcxs9xzbgo7z, cmfdt1o8c003zvc90uqngk7v6, ,
20
+ cmfdvkxeu0053vc90gquj3cbz, RESIDENTIAL, Midori Towers , TOWNSHIP , midori-towers-modelcolony-shivajinagar-pune-449745 , , UNDER_CONSTRUCTION, , "[""[\""P52100047310\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
21
+ cmfdxi4sv005rvc90ygfhnzc9, RESIDENTIAL, Kedar Residency , STANDALONE , kedar-residency-modelcolony-shivajinagar-pune-678656 , , READY_TO_MOVE , 0.0, "[""[\""P52100032109\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, ,
22
+ cmfdyb2yc006rvc900owycgrv, RESIDENTIAL, Sonai Clara , STANDALONE , sonai-clara-brtlinkrd-ravet-pune-029297 , , UNDER_CONSTRUCTION, , "[""[\""P52100080205\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdxt4wr006pvc90zvflron5, ,
23
+ cmfdz9fvx0088vc90pw26eyr8, RESIDENTIAL, Santiago Skytown , STANDALONE , santiago-skytown-vikasnagar-ravet-pune-632333 , , UNDER_CONSTRUCTION, , "[""[\""P52100077942\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdyubxb0086vc90glhoi1tr, ,
24
+ cmfe01l6h009gvc90y1zazr09, RESIDENTIAL, The silver altair , STANDALONE , the-silver-altair--pcmc-ravet-pune-945470 , , UNDER_CONSTRUCTION, , "[""[\""P52100035075\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6qgr4u004fvcxswao9nc4r, cmfdzm7gn009evc907tntxrwq, ,
25
+ cmff8swbm0001vxp7pe3neibi, RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , , READY_TO_MOVE , 11.0, "[""123456789""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pk0cn0033vcxshxbf5hdh, cmfdn705v001pvc90uyle9m34, sdfghjhgfdfghjgfdfghgfgh ,
26
+ cmftjwws60001vx55r0q7797l, RESIDENTIAL, TESTING , TOWNSHIP , testing-somwarpeth-camp-pune-281770 , , READY_TO_MOVE , 2.0, "[""123124"",""345678""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, PROJECT SUMMARY ,
27
+ cmfw5ivra0001vxnkbozvz8bd, RESIDENTIAL, testing igi , TOWNSHIP , testing-igi-somwarpeth-camp-pune-541659 , , READY_TO_MOVE , 8.0, "[""[\""12345678\"",\""2345678\""]""]" , cmf3zcoe80000vcf8sd4qfpwd, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, aqwsedrftgyhujikozsxdcfvgbhjnkm ,
28
+ cmfwd377z0008vxgxd9nju858, RESIDENTIAL, some project testing , COMPLEX , some-project-testing-somwarpeth-camp-pune-246958 , , UNDER_CONSTRUCTION, , "[""[\""2345678\"",\""5678\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, project summary , 2025-09-24 00:00:00
29
+ cmfxrvmuc0009qq138n0vk91p, RESIDENTIAL, QUEENS PARK , STANDALONE , queens-park-subhashnagar-chembur-mumbai-554402 , , UNDER_CONSTRUCTION, , "[""[\""P51800047377\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Queens Park by Vaibhavlaxmi builder & developer is a well-designed residential development in Chembur, Mumbai. It provides contemporary features, convenient connectivity, and peaceful living, all supported by the developer's long-standing heritage and adherence to excellence. Situated in a well-developed suburb with the best infrastructure and great connectivity, the project meets the needs of the city life while affording peace and ease of living." , 2025-12-31 00:00:00
30
+ cmfxtgtbw0009vxov4t5onh7d, RESIDENTIAL, testring999 , COMPLEX , testring999-somwarpeth-camp-pune-222053 , , UNDER_CONSTRUCTION, , "[""[\""asdfghjkl\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf6nu3ru000gvcxspxarll3v, cmf6pksk30035vcxs7r2mo3iq, cmfdkuymm0001vc90iiyzkr8d, dsgfhjk , 2025-09-25 00:00:00
31
+ cmfxwmse70001qq0908yt6oar, RESIDENTIAL, Queens Glory , STANDALONE , queens-glory-subhashnagar-chembur-mumbai-539772 , , UNDER_CONSTRUCTION, , "[""[\""P51800076971\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Queens Glory by VaibhavLaxmi Builders and Developers is a well-designed residential development in Chembur, Mumbai. It provides contemporary features, convenient connectivity, and peaceful living, all supported by the developer's long-standing heritage and adherence to excellence. Situated in a well-developed suburb with the best infrastructure and great connectivity, the project meets the needs of the city life while affording peace and ease of living." , 2027-12-31 00:00:00
32
+ cmfxxh08t0013qq09o0rajcrt, RESIDENTIAL, Queens Avenue , TOWNSHIP , queens-avenue-subhashnagar-chembur-mumbai-949624 , , UNDER_CONSTRUCTION, , "[""[\""P51800054458\""]""]" , cmfw6qdtd0000vx6uelma0klf, cmf3ze56e0002vcf8e0hjqnsw, cmf50r5a00000vcj0k1iuocuu, cmf51ieam0001vcj0kljobiod, cmfxo3xxc0007qq13foyboh8s, "Vaibhavlaxmi Queens Avenue offers well-ventilated homes in Chembur East, combining luxury with modern living standards. With easy access to essential amenities, including schools, hospitals, and shopping malls, the project ensures a convenient lifestyle. Developed by Vaibhavlaxmi Developers, a renowned name in Mumbai's real estate sector, the project promises quality construction and timely delivery, making it a top choice for those seeking an ideal urban living experience.", 2027-12-31 00:00:00
database/mongo_upload.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ This script reads all CSV files from the data/ folder and inserts them into MongoDB.
3
+ """
4
+
5
+ import os
6
+ import pandas as pd
7
+ from pymongo import MongoClient
8
+ from dotenv import load_dotenv
9
+
10
+ # Load environment variables
11
+ load_dotenv()
12
+
13
+ # MongoDB config
14
+ MONGO_URI = os.getenv("MONGO_URI")
15
+ MONGO_DB = os.getenv("MONGO_DB")
16
+
17
+ # Initialize connection
18
+ client = MongoClient(MONGO_URI)
19
+ db = client[MONGO_DB]
20
+
21
+ def insert_csv_to_mongo(data_folder="../data"):
22
+ """Read CSV files from data folder and insert into MongoDB."""
23
+ csv_files = [f for f in os.listdir(data_folder) if f.endswith(".csv")]
24
+
25
+ if not csv_files:
26
+ print("⚠️ No CSV files found in the data folder.")
27
+ return
28
+
29
+ all_docs = []
30
+ for file in csv_files:
31
+ path = os.path.join(data_folder, file)
32
+ print(f"📂 Reading: {path}")
33
+ df = pd.read_csv(path)
34
+ records = df.to_dict(orient="records")
35
+ all_docs.extend(records)
36
+
37
+ if all_docs:
38
+ collection = db["company_data"]
39
+ collection.insert_many(all_docs)
40
+ print(f"✅ Inserted {len(all_docs)} records into MongoDB collection 'company_data'.")
41
+ else:
42
+ print("⚠️ No data found to insert.")
43
+
44
+ if __name__ == "__main__":
45
+ insert_csv_to_mongo()
frontend/index.html ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>AI Chatbot</title>
7
+ <link rel="stylesheet" href="style.css" />
8
+ </head>
9
+ <body>
10
+ <div class="app-container">
11
+ <!-- Sidebar -->
12
+ <aside class="sidebar" id="sidebar">
13
+ <div class="logo-container">
14
+ <img src="logo.png" alt="Property AI" class="logo">
15
+ </div>
16
+ <button id="new-chat-btn" class="new-chat-btn">+ New Chat</button>
17
+ <div id="chat-history" class="chat-history"></div>
18
+ </aside>
19
+
20
+ <!-- Main Chat -->
21
+ <div class="chat-container">
22
+ <header class="chat-header">
23
+ <button id="menu-toggle" class="menu-toggle">☰</button>
24
+ <h1 id="chat-title">New Chat</h1>
25
+ </header>
26
+
27
+ <div id="chat-box" class="chat-box">
28
+ <div class="message ai">
29
+ <div class="bubble">Hello! 👋 Welcome to Property AI. I'm here to help you find your perfect property. What are you looking for today?</div>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="chat-input-container">
34
+ <textarea id="user-input" placeholder="Type a message..." rows="1"></textarea>
35
+ <button id="send-btn">➤</button>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
40
+ <script src="script.js"></script>
41
+ </body>
42
+ </html>
frontend/logo.png ADDED
frontend/script.js ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ let db;
2
+ let currentChatId = null;
3
+
4
+ // ⚙️ Backend API Configuration
5
+ const API_BASE_URL = "http://localhost:8000"; // Change this to your backend URL
6
+
7
+ // ---------- IndexedDB Setup ----------
8
+ const request = indexedDB.open("ChatDB", 1);
9
+
10
+ request.onupgradeneeded = (e) => {
11
+ db = e.target.result;
12
+ const store = db.createObjectStore("chats", { keyPath: "id", autoIncrement: true });
13
+ store.createIndex("title", "title", { unique: false });
14
+ };
15
+
16
+ request.onsuccess = (e) => {
17
+ db = e.target.result;
18
+ loadChatHistory();
19
+ };
20
+
21
+ request.onerror = (e) => {
22
+ console.error("IndexedDB error:", e.target.error);
23
+ };
24
+
25
+ // ---------- UI Elements ----------
26
+ const chatBox = document.getElementById("chat-box");
27
+ const userInput = document.getElementById("user-input");
28
+ const sendBtn = document.getElementById("send-btn");
29
+ const newChatBtn = document.getElementById("new-chat-btn");
30
+ const chatHistory = document.getElementById("chat-history");
31
+ const chatTitle = document.getElementById("chat-title");
32
+
33
+ // ---------- Core Chat Functions ----------
34
+ function addMessage(content, sender, cards = [], save = true) {
35
+ const msg = document.createElement("div");
36
+ msg.classList.add("message", sender);
37
+
38
+ const bubble = document.createElement("div");
39
+ bubble.classList.add("bubble");
40
+ bubble.textContent = content;
41
+
42
+ msg.appendChild(bubble);
43
+
44
+ // Add property cards if they exist
45
+ if (cards && cards.length > 0) {
46
+ const cardsContainer = document.createElement("div");
47
+ cardsContainer.classList.add("property-cards");
48
+
49
+ cards.forEach(card => {
50
+ const cardEl = createPropertyCard(card);
51
+ cardsContainer.appendChild(cardEl);
52
+ });
53
+
54
+ msg.appendChild(cardsContainer);
55
+ }
56
+
57
+ chatBox.appendChild(msg);
58
+ chatBox.scrollTop = chatBox.scrollHeight;
59
+
60
+ if (save && currentChatId) saveMessageToDB(content, sender, cards);
61
+ }
62
+
63
+ function createPropertyCard(card) {
64
+ const cardEl = document.createElement("div");
65
+ cardEl.classList.add("property-card");
66
+
67
+ // Clean up the data
68
+ const title = card.title || card.project_name || 'Property';
69
+ const price = card.price || 'Price on request';
70
+ const location = card.city_locality || 'Location not specified';
71
+
72
+ // Clean BHK - remove underscores and format nicely
73
+ let bhk = card.bhk || '';
74
+ bhk = bhk.replace(/_/g, ' ').trim();
75
+
76
+ // Clean status - format nicely
77
+ let status = card.possession_status || '';
78
+ status = status.replace(/_/g, ' ')
79
+ .toLowerCase()
80
+ .split(' ')
81
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
82
+ .join(' ');
83
+
84
+ // Filter out placeholder amenities
85
+ let amenities = card.top_amenities || [];
86
+ amenities = amenities.filter(a =>
87
+ a &&
88
+ a.toLowerCase() !== 'about property' &&
89
+ a.toLowerCase() !== 'property' &&
90
+ a.trim().length > 2
91
+ );
92
+
93
+ cardEl.innerHTML = `
94
+ <div class="card-header">
95
+ <h3 class="card-title">${title}</h3>
96
+ <span class="card-price">${price}</span>
97
+ </div>
98
+ <div class="card-body">
99
+ <p class="card-location">📍 ${location}</p>
100
+ ${bhk ? `<p class="card-bhk">🏠 ${bhk}</p>` : ''}
101
+ ${status ? `<p class="card-status">🔑 ${status}</p>` : ''}
102
+ ${amenities.length > 0 ? `
103
+ <div class="card-amenities">
104
+ <strong>✨ Amenities:</strong>
105
+ <ul>
106
+ ${amenities.slice(0, 3).map(a => `<li>${a}</li>`).join('')}
107
+ </ul>
108
+ </div>
109
+ ` : ''}
110
+ </div>
111
+ <div class="card-footer">
112
+ <a href="${card.cta_url || '#'}" class="card-cta" target="_blank">View Details →</a>
113
+ </div>
114
+ `;
115
+
116
+ return cardEl;
117
+ }
118
+
119
+ function showTypingIndicator() {
120
+ const indicator = document.createElement("div");
121
+ indicator.classList.add("message", "ai", "typing-indicator");
122
+ indicator.id = "typing-indicator";
123
+ indicator.innerHTML = `
124
+ <div class="bubble">
125
+ <span></span><span></span><span></span>
126
+ </div>
127
+ `;
128
+ chatBox.appendChild(indicator);
129
+ chatBox.scrollTop = chatBox.scrollHeight;
130
+ }
131
+
132
+ function removeTypingIndicator() {
133
+ const indicator = document.getElementById("typing-indicator");
134
+ if (indicator) indicator.remove();
135
+ }
136
+
137
+ function isGreeting(text) {
138
+ const greetings = [
139
+ 'hi', 'hello', 'hey', 'hii', 'hiii', 'hiiii',
140
+ 'good morning', 'good afternoon', 'good evening', 'good night',
141
+ 'morning', 'evening', 'afternoon',
142
+ 'namaste', 'namaskar',
143
+ 'greetings', 'howdy', 'sup', 'yo',
144
+ 'how are you', 'whats up', "what's up",
145
+ 'hola', 'bonjour', 'ciao'
146
+ ];
147
+
148
+ const lowerText = text.toLowerCase().trim();
149
+ return greetings.some(greeting =>
150
+ lowerText === greeting ||
151
+ lowerText.startsWith(greeting + ' ') ||
152
+ lowerText.startsWith(greeting + '!')
153
+ );
154
+ }
155
+
156
+ function getGreetingResponse() {
157
+ return "Hello! 👋 Welcome to Property AI. I'm here to help you find your perfect property. What are you looking for today?";
158
+ }
159
+
160
+ async function aiResponse(userMsg) {
161
+ // Check if it's a greeting
162
+ if (isGreeting(userMsg)) {
163
+ showTypingIndicator();
164
+ setTimeout(() => {
165
+ removeTypingIndicator();
166
+ addMessage(getGreetingResponse(), "ai", []);
167
+ }, 700);
168
+ return;
169
+ }
170
+
171
+ showTypingIndicator();
172
+
173
+ try {
174
+ const response = await fetch(`${API_BASE_URL}/chat`, {
175
+ method: "POST",
176
+ headers: {
177
+ "Content-Type": "application/json",
178
+ },
179
+ body: JSON.stringify({ query: userMsg }),
180
+ });
181
+
182
+ if (!response.ok) {
183
+ throw new Error(`HTTP error! status: ${response.status}`);
184
+ }
185
+
186
+ const data = await response.json();
187
+ removeTypingIndicator();
188
+
189
+ // Display AI response WITHOUT cards - only show text summary
190
+ addMessage(data.answer, "ai", []);
191
+
192
+ } catch (error) {
193
+ removeTypingIndicator();
194
+ console.error("Error calling backend:", error);
195
+ addMessage(
196
+ "Sorry, I'm having trouble connecting to the server. Please make sure the backend is running on " + API_BASE_URL,
197
+ "ai"
198
+ );
199
+ }
200
+ }
201
+
202
+ function sendMessage() {
203
+ const text = userInput.value.trim();
204
+ if (!text) return;
205
+
206
+ // Disable send button while processing
207
+ sendBtn.disabled = true;
208
+ userInput.disabled = true;
209
+
210
+ // ✅ Automatically create a chat if none exists
211
+ if (!currentChatId) {
212
+ createNewChatWithMessage(text);
213
+ } else {
214
+ addMessage(text, "user");
215
+ userInput.value = "";
216
+ updateChatTitleIfNeeded(text);
217
+ aiResponse(text).finally(() => {
218
+ sendBtn.disabled = false;
219
+ userInput.disabled = false;
220
+ userInput.focus();
221
+ });
222
+ }
223
+ }
224
+
225
+ // ---------- IndexedDB Helpers ----------
226
+ function saveMessageToDB(content, sender, cards = []) {
227
+ const tx = db.transaction("chats", "readwrite");
228
+ const store = tx.objectStore("chats");
229
+ store.get(currentChatId).onsuccess = (e) => {
230
+ const chat = e.target.result;
231
+ chat.messages.push({ sender, content, cards: cards || [] });
232
+ store.put(chat);
233
+ };
234
+ }
235
+
236
+ function updateChatTitleIfNeeded(firstMsg) {
237
+ const tx = db.transaction("chats", "readwrite");
238
+ const store = tx.objectStore("chats");
239
+ store.get(currentChatId).onsuccess = (e) => {
240
+ const chat = e.target.result;
241
+ if (chat.title === "New Chat" && firstMsg) {
242
+ const shortTitle = firstMsg.length > 25 ? firstMsg.slice(0, 25) + "…" : firstMsg;
243
+ chat.title = shortTitle;
244
+ chatTitle.textContent = shortTitle;
245
+ store.put(chat);
246
+ loadChatHistory();
247
+ }
248
+ };
249
+ }
250
+
251
+ function createNewChat() {
252
+ const tx = db.transaction("chats", "readwrite");
253
+ const store = tx.objectStore("chats");
254
+ const newChat = { title: "New Chat", messages: [] };
255
+ const req = store.add(newChat);
256
+ req.onsuccess = () => {
257
+ currentChatId = req.result;
258
+ chatTitle.textContent = "New Chat";
259
+ chatBox.innerHTML = `
260
+ <div class="message ai">
261
+ <div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
262
+ </div>`;
263
+ loadChatHistory();
264
+ };
265
+ }
266
+
267
+ function createNewChatWithMessage(firstMessage) {
268
+ const tx = db.transaction("chats", "readwrite");
269
+ const store = tx.objectStore("chats");
270
+ const shortTitle = firstMessage.length > 25 ? firstMessage.slice(0, 25) + "…" : firstMessage;
271
+ const newChat = {
272
+ title: shortTitle,
273
+ messages: [{ sender: "user", content: firstMessage, cards: [] }]
274
+ };
275
+ const req = store.add(newChat);
276
+ req.onsuccess = () => {
277
+ currentChatId = req.result;
278
+ chatTitle.textContent = shortTitle;
279
+ chatBox.innerHTML = `
280
+ <div class="message ai">
281
+ <div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
282
+ </div>`;
283
+ addMessage(firstMessage, "user", [], false);
284
+ userInput.value = "";
285
+ loadChatHistory();
286
+ aiResponse(firstMessage).finally(() => {
287
+ sendBtn.disabled = false;
288
+ userInput.disabled = false;
289
+ userInput.focus();
290
+ });
291
+ };
292
+ }
293
+
294
+ function deleteChat(id) {
295
+ const tx = db.transaction("chats", "readwrite");
296
+ const store = tx.objectStore("chats");
297
+ store.delete(id).onsuccess = () => {
298
+ if (id === currentChatId) {
299
+ // If deleting active chat, reset UI
300
+ currentChatId = null;
301
+ chatTitle.textContent = "New Chat";
302
+ chatBox.innerHTML = `
303
+ <div class="message ai">
304
+ <div class="bubble">Hello 👋 I'm your AI assistant. How can I help you find properties today?</div>
305
+ </div>`;
306
+ }
307
+ loadChatHistory();
308
+ };
309
+ }
310
+
311
+ function loadChatHistory() {
312
+ chatHistory.innerHTML = "";
313
+ const tx = db.transaction("chats", "readonly");
314
+ const store = tx.objectStore("chats");
315
+
316
+ store.openCursor().onsuccess = (e) => {
317
+ const cursor = e.target.result;
318
+ if (cursor) {
319
+ const chat = cursor.value;
320
+
321
+ const item = document.createElement("div");
322
+ item.classList.add("chat-item");
323
+ if (chat.id === currentChatId) item.classList.add("active");
324
+
325
+ const title = document.createElement("div");
326
+ title.classList.add("chat-title");
327
+ title.textContent = chat.title || `Chat ${chat.id}`;
328
+ title.onclick = () => loadChat(chat.id);
329
+
330
+ const delBtn = document.createElement("button");
331
+ delBtn.classList.add("delete-btn");
332
+ delBtn.innerHTML = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
333
+ <path d="M2 4h12M5.333 4V2.667a1.333 1.333 0 0 1 1.334-1.334h2.666a1.333 1.333 0 0 1 1.334 1.334V4m2 0v9.333a1.333 1.333 0 0 1-1.334 1.334H4.667a1.333 1.333 0 0 1-1.334-1.334V4h9.334Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
334
+ </svg>`;
335
+ delBtn.onclick = (event) => {
336
+ event.stopPropagation();
337
+ deleteChat(chat.id);
338
+ };
339
+
340
+ item.appendChild(title);
341
+ item.appendChild(delBtn);
342
+ chatHistory.appendChild(item);
343
+ cursor.continue();
344
+ }
345
+ };
346
+ }
347
+
348
+ function loadChat(id) {
349
+ const tx = db.transaction("chats", "readonly");
350
+ const store = tx.objectStore("chats");
351
+ store.get(id).onsuccess = (e) => {
352
+ const chat = e.target.result;
353
+ currentChatId = id;
354
+ chatTitle.textContent = chat.title;
355
+ chatBox.innerHTML = "";
356
+ chat.messages.forEach((m) => addMessage(m.content, m.sender, m.cards || [], false));
357
+ loadChatHistory();
358
+ };
359
+ }
360
+
361
+ // ---------- Event Listeners ----------
362
+ sendBtn.addEventListener("click", sendMessage);
363
+ userInput.addEventListener("keydown", (e) => {
364
+ if (e.key === "Enter" && !e.shiftKey) {
365
+ e.preventDefault();
366
+ sendMessage();
367
+ }
368
+ });
369
+ newChatBtn.addEventListener("click", createNewChat);
370
+
371
+ // ---------- Mobile Menu Toggle ----------
372
+ const menuToggle = document.getElementById("menu-toggle");
373
+ const sidebar = document.getElementById("sidebar");
374
+
375
+ menuToggle.addEventListener("click", () => {
376
+ sidebar.classList.toggle("open");
377
+ });
378
+
379
+ // Close sidebar when clicking outside on mobile
380
+ document.addEventListener("click", (e) => {
381
+ if (window.innerWidth <= 768) {
382
+ if (!sidebar.contains(e.target) && !menuToggle.contains(e.target)) {
383
+ sidebar.classList.remove("open");
384
+ }
385
+ }
386
+ });
frontend/style.css ADDED
@@ -0,0 +1,386 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* --- Reset and Base --- */
2
+ * {
3
+ box-sizing: border-box;
4
+ margin: 0;
5
+ padding: 0;
6
+ }
7
+
8
+ body {
9
+ font-family: "Inter", system-ui, sans-serif;
10
+ background: radial-gradient(circle at top left, #0a0033, #000);
11
+ color: #e0e8ff;
12
+ height: 100vh;
13
+ overflow: hidden;
14
+ }
15
+
16
+ /* --- App Layout --- */
17
+ .app-container {
18
+ display: flex;
19
+ height: 100vh;
20
+ }
21
+
22
+ /* --- Sidebar --- */
23
+ .sidebar {
24
+ width: 260px;
25
+ background: rgba(9, 1, 32, 0.9);
26
+ border-right: 1px solid rgba(120, 80, 255, 0.3);
27
+ display: flex;
28
+ flex-direction: column;
29
+ padding: 16px;
30
+ box-shadow: 0 0 20px rgba(120, 80, 255, 0.15);
31
+ }
32
+
33
+ .sidebar h2 {
34
+ color: #9f7fff;
35
+ text-align: center;
36
+ margin-bottom: 16px;
37
+ font-weight: 700;
38
+ text-shadow: 0 0 6px rgba(140, 100, 255, 0.6);
39
+ }
40
+
41
+ .logo-container {
42
+ text-align: center;
43
+ margin-bottom: 20px;
44
+ padding: 10px;
45
+ }
46
+
47
+ .logo {
48
+ max-width: 140px;
49
+ width: 100%;
50
+ height: auto;
51
+ display: block;
52
+ margin: 0 auto;
53
+ filter: drop-shadow(0 0 10px rgba(120, 80, 255, 0.5));
54
+ }
55
+
56
+ .new-chat-btn {
57
+ background: linear-gradient(135deg, #6a00ff, #00bfff);
58
+ color: #fff;
59
+ border: none;
60
+ border-radius: 12px;
61
+ padding: 10px 12px;
62
+ font-size: 0.9rem;
63
+ cursor: pointer;
64
+ margin-bottom: 16px;
65
+ transition: 0.2s;
66
+ box-shadow: 0 0 10px rgba(100, 160, 255, 0.4);
67
+ }
68
+
69
+ .new-chat-btn:hover {
70
+ background: linear-gradient(135deg, #7a33ff, #33ccff);
71
+ transform: scale(1.03);
72
+ }
73
+
74
+ .chat-history {
75
+ flex: 1;
76
+ overflow-y: auto;
77
+ border-top: 1px solid rgba(120, 80, 255, 0.2);
78
+ padding-top: 10px;
79
+ }
80
+
81
+ .chat-item {
82
+ padding: 10px 12px;
83
+ border-radius: 10px;
84
+ margin-bottom: 8px;
85
+ background: rgba(120, 80, 255, 0.05);
86
+ cursor: pointer;
87
+ transition: 0.2s;
88
+ display: flex;
89
+ justify-content: space-between;
90
+ align-items: center;
91
+ }
92
+
93
+ .chat-title {
94
+ flex: 1;
95
+ overflow: hidden;
96
+ text-overflow: ellipsis;
97
+ white-space: nowrap;
98
+ padding-right: 8px;
99
+ }
100
+
101
+ .chat-item:hover {
102
+ background: rgba(120, 80, 255, 0.15);
103
+ }
104
+
105
+ .chat-item.active {
106
+ background: rgba(120, 80, 255, 0.3);
107
+ font-weight: 600;
108
+ }
109
+
110
+ /* --- Chat Area --- */
111
+ .chat-container {
112
+ flex: 1;
113
+ display: flex;
114
+ flex-direction: column;
115
+ background: linear-gradient(
116
+ 180deg,
117
+ rgba(5, 0, 40, 0.85),
118
+ rgba(0, 0, 30, 0.95)
119
+ );
120
+ border-left: 1px solid rgba(120, 80, 255, 0.2);
121
+ }
122
+
123
+ .chat-header {
124
+ padding: 16px 24px;
125
+ text-align: center;
126
+ color: #c9d8ff;
127
+ font-weight: 700;
128
+ border-bottom: 1px solid rgba(120, 80, 255, 0.2);
129
+ position: relative;
130
+
131
+ /* ✨ Transparent Glass Look */
132
+ background: rgba(10, 0, 40, 0.15);
133
+ backdrop-filter: blur(20px) saturate(180%);
134
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
135
+
136
+ /* 🌈 Glow and Depth */
137
+ text-shadow: 0 0 10px rgba(120, 80, 255, 0.4);
138
+ box-shadow: 0 2px 20px rgba(120, 80, 255, 0.15);
139
+ border-radius: 0 0 16px 16px;
140
+ z-index: 10;
141
+ }
142
+
143
+ /* --- Hamburger Menu Button --- */
144
+ .menu-toggle {
145
+ display: none;
146
+ position: absolute;
147
+ left: 16px;
148
+ top: 50%;
149
+ transform: translateY(-50%);
150
+ background: rgba(120, 80, 255, 0.2);
151
+ border: 1px solid rgba(120, 80, 255, 0.4);
152
+ color: #9f7fff;
153
+ font-size: 1.5rem;
154
+ width: 40px;
155
+ height: 40px;
156
+ border-radius: 8px;
157
+ cursor: pointer;
158
+ transition: 0.2s;
159
+ z-index: 1000;
160
+ }
161
+
162
+ .menu-toggle:hover {
163
+ background: rgba(120, 80, 255, 0.3);
164
+ transform: translateY(-50%) scale(1.05);
165
+ }
166
+
167
+ /* --- Chat Box --- */
168
+ .chat-box {
169
+ flex: 1;
170
+ padding: 24px;
171
+ overflow-y: auto;
172
+ display: flex;
173
+ flex-direction: column;
174
+ gap: 14px;
175
+ scroll-behavior: smooth;
176
+ }
177
+
178
+ /* --- Message Bubbles --- */
179
+ .message {
180
+ display: flex;
181
+ align-items: flex-start;
182
+ }
183
+
184
+ .message.user {
185
+ justify-content: flex-end;
186
+ }
187
+
188
+ .bubble {
189
+ max-width: 70%;
190
+ padding: 12px 16px;
191
+ border-radius: 14px;
192
+ font-size: 0.95rem;
193
+ line-height: 1.4;
194
+ animation: fadeIn 0.2s ease-in-out;
195
+ }
196
+
197
+ .message.ai .bubble {
198
+ background: rgba(10, 10, 40, 0.9);
199
+ color: #7fb3ff;
200
+ border: 1px solid rgba(100, 160, 255, 0.4);
201
+ border-top-left-radius: 4px;
202
+ box-shadow: 0 0 10px rgba(100, 160, 255, 0.15);
203
+ }
204
+
205
+ .message.user .bubble {
206
+ background: linear-gradient(135deg, #6a00ff, #00bfff);
207
+ color: #fff;
208
+ border-top-right-radius: 4px;
209
+ box-shadow: 0 0 10px rgba(100, 160, 255, 0.3);
210
+ }
211
+
212
+ /* --- Input --- */
213
+ .chat-input-container {
214
+ display: flex;
215
+ align-items: center;
216
+ padding: 12px 16px;
217
+ border-top: 1px solid rgba(120, 80, 255, 0.2);
218
+ background: rgba(10, 0, 40, 0.9);
219
+ }
220
+
221
+ .chat-input-container textarea {
222
+ flex: 1;
223
+ resize: none;
224
+ border: none;
225
+ outline: none;
226
+ font-size: 1rem;
227
+ padding: 10px;
228
+ background: #0a0a2a;
229
+ color: #fff;
230
+ border-radius: 12px;
231
+ margin-right: 8px;
232
+ border: 1px solid rgba(100, 160, 255, 0.3);
233
+ }
234
+
235
+ .chat-input-container button {
236
+ background: linear-gradient(135deg, #6a00ff, #00bfff);
237
+ color: #fff;
238
+ border: none;
239
+ border-radius: 50%;
240
+ width: 44px;
241
+ height: 44px;
242
+ font-size: 1.1rem;
243
+ cursor: pointer;
244
+ transition: 0.2s;
245
+ box-shadow: 0 0 10px rgba(100, 160, 255, 0.3);
246
+ }
247
+
248
+ .chat-input-container button:hover {
249
+ transform: scale(1.1);
250
+ background: linear-gradient(135deg, #7a33ff, #33ccff);
251
+ }
252
+
253
+ /* --- Delete Icon --- */
254
+ .delete-btn {
255
+ background: none;
256
+ border: none;
257
+ color: #79aaff;
258
+ cursor: pointer;
259
+ opacity: 0.5;
260
+ transition: all 0.2s;
261
+ padding: 6px;
262
+ flex-shrink: 0;
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: center;
266
+ border-radius: 6px;
267
+ }
268
+
269
+ .delete-btn:hover {
270
+ opacity: 1;
271
+ color: #ff6b6b;
272
+ background: rgba(255, 107, 107, 0.1);
273
+ transform: scale(1.1);
274
+ }
275
+
276
+ .delete-btn svg {
277
+ width: 16px;
278
+ height: 16px;
279
+ }
280
+
281
+ .delete-btn:hover {
282
+ opacity: 1;
283
+ color: #33ccff;
284
+ }
285
+
286
+ /* --- Animated Moving Dots Background --- */
287
+ @keyframes moveDots {
288
+ 0% {
289
+ background-position: 0 0, 50px 50px;
290
+ }
291
+ 100% {
292
+ background-position: 100px 100px, 150px 150px;
293
+ }
294
+ }
295
+
296
+ .chat-container::before,
297
+ .chat-header::before {
298
+ content: "";
299
+ position: absolute;
300
+ pointer-events: none;
301
+ top: 0;
302
+ left: 0;
303
+ width: 100%;
304
+ height: 100%;
305
+ background-image:
306
+ radial-gradient(rgba(120, 80, 255, 0.3) 2px, transparent 1px),
307
+ radial-gradient(rgba(100, 160, 255, 0.15) 2px, transparent 1px);
308
+ background-size: 50px 50px, 80px 80px;
309
+ animation: moveDots 20s linear infinite;
310
+ z-index: 0;
311
+ opacity: 0.3;
312
+ }
313
+
314
+ /* Ensure content appears above the animated background */
315
+ .chat-container,
316
+ .chat-header {
317
+ position: relative;
318
+ z-index: 1;
319
+ overflow: hidden;
320
+ }
321
+
322
+ /* --- Responsive Design --- */
323
+ @media (max-width: 768px) {
324
+ .sidebar {
325
+ position: fixed;
326
+ left: -260px;
327
+ top: 0;
328
+ height: 100vh;
329
+ z-index: 999;
330
+ transition: left 0.3s ease;
331
+ }
332
+
333
+ .sidebar.open {
334
+ left: 0;
335
+ box-shadow: 2px 0 15px rgba(0, 0, 0, 0.5);
336
+ }
337
+
338
+ .menu-toggle {
339
+ display: block;
340
+ }
341
+
342
+ .chat-header h1 {
343
+ font-size: 1.1rem;
344
+ margin-left: 30px;
345
+ }
346
+
347
+ .bubble {
348
+ max-width: 85%;
349
+ }
350
+
351
+ .chat-box {
352
+ padding: 16px;
353
+ }
354
+
355
+ .chat-input-container {
356
+ padding: 10px;
357
+ }
358
+
359
+ .chat-input-container textarea {
360
+ font-size: 0.9rem;
361
+ padding: 8px;
362
+ }
363
+
364
+ .chat-input-container button {
365
+ width: 38px;
366
+ height: 38px;
367
+ font-size: 1rem;
368
+ }
369
+ }
370
+
371
+ @media (max-width: 480px) {
372
+ .bubble {
373
+ max-width: 90%;
374
+ font-size: 0.9rem;
375
+ padding: 10px 14px;
376
+ }
377
+
378
+ .chat-header h1 {
379
+ font-size: 1rem;
380
+ }
381
+
382
+ .new-chat-btn {
383
+ font-size: 0.85rem;
384
+ padding: 8px 10px;
385
+ }
386
+ }
processed_data/final_merged_data1.csv ADDED
The diff for this file is too large to render. See raw diff
 
processed_data/final_merged_data_1st.csv ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ projectType, projectName , projectCategory, slug , status , projectAge, projectSummary , possessionDate , propertyCategory, type, customBHK, bathrooms , privateBathrooms, publicBathrooms, balcony , furnishedType , furnishingType , lift , ageOfProperty, parkingType, listingType , floorPlanImage , carpetArea , price , propertyImages , maintenanceCharges, aboutProperty , createdAt , updatedAt , Address info
2
+ RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , UNDER_CONSTRUCTION, , , 2025-09-28 00:00:00, RESIDENTIAL , 1BHK, , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757584023815-67012c27580e3e23.jpg"" ", " ""123"" ", " ""11111111"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-1e5179453b5df91d.jpg""""]"" ", , " ""jjhhhu"" ", " ""2025-09-11 10:07:21.386""", " ""2025-09-11 10:07:21.386""", " Babys school , Mumbai chembur , 411017"
3
+ RESIDENTIAL, Ashwini , STANDALONE , luxury-ashwini-ashoknagar-chembur-mumbai-675058 , UNDER_CONSTRUCTION, , , 2025-09-28 00:00:00, RESIDENTIAL , 2BHK, , " ""0"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-419924a4c5c28823.jpg"" ", " ""456"" ", " ""22222222"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1756971672464-7c8c73119cb2047b.jpg""""]"" ", , " ""nbhjg"" ", " ""2025-09-11 10:07:26.152""", " ""2025-09-11 10:07:26.152""", " Babys school , Mumbai chembur , 411017"
4
+ RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210633-ec5431f188d4de3c.jpg"" ", " ""457.57"" ", " ""12000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210665-ab087e966ba018ff.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
5
+ RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210671-c54804f690eac296.jpg"" ", " ""652.83"" ", " ""17000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210672-3f6998fafc9e8521.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
6
+ RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210675-be2512dbfae0b3f7.jpg"" ", " ""728.5"" ", " ""19000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210678-f61b2d8c4b4a4a50.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
7
+ RESIDENTIAL, Sainath Vrindavan, STANDALONE , luxury-sainath-vrindavan-ashoknagar-chembur-mumbai-216861, UNDER_CONSTRUCTION, , , , RESIDENTIAL , 3BHK, 3BHK , " ""3"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210681-7ca76e0e6739c3c1.jpg"" ", " ""1240.22"" ", " ""33000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757400210682-37e9e8c4f43b5b32.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:43:37.112""", " ""2025-09-09 06:43:37.112""", " JBCN International School Mulund , Prataprao Gujar Rd Neelam Nagar Mulund East Mumbai Maharashtra 400081 , 400081"
8
+ RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""0"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136185-abf1e76a1175f931.jpg"" ", " ""416.56"" ", " ""9890000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-23bdb16c58a9e122.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
9
+ RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136186-d8d90b0f32b32c7f.jpg"" ", " ""438.63"" ", " ""14000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-7ce77cd129550d77.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
10
+ RESIDENTIAL, Avenue 15 , STANDALONE , avenue-15-ashoknagar-chembur-mumbai-140508 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136187-1ecea6707162bfe7.jpg"" ", " ""653.15"" ", " ""15000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757401136188-b404a27ba98528f4.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 06:59:00.713""", " ""2025-09-09 06:59:00.713""", " JBCN International School Parel , AVENUE 15 Ramesh Barrel Supplying Company K.T.Gupta Wadi S.P.Murai Rd behind Sewri Road Sewri W Maharashtra 400015 , 400015"
11
+ RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 1BHK, 1BHK , " ""1"" ", , , " ""1"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672773-6523197b4bafe2f8.jpg"" ", " ""422"" ", " ""4190000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672775-37d2dedeb898bfd3.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 09:21:18.424""", " ""2025-09-09 09:21:18.424""", " Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201"
12
+ RESIDENTIAL, Balaji Kanha , STANDALONE , balaji-kanha--ashoknagar-chembur-mumbai-678207 , UNDER_CONSTRUCTION, , , , RESIDENTIAL , 2BHK, 2BHK , " ""2"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-9c48211b8fc08a50.jpg"" ", " ""580"" ", " ""5770000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1757409672776-55a3d0d5d7d3bb44.jpg""""]"" ", , " ""na"" ", " ""2025-09-09 09:21:18.424""", " ""2025-09-09 09:21:18.424""", " Lodha Xperia Mall , 64C5+C63 Dombivli East Dombivli Maharashtra 421301 , 421201"
13
+ RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , READY_TO_MOVE , 11.0, sdfghjhgfdfghjgfdfghgfgh, , RESIDENTIAL , 5BHK, , " ""8"" ", , , " ""8"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174783708-6bab276d8a2b3207.jpg"" ", " ""9.79"" ", " ""10088000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758174623697-27c4f71a991e078c.jpg""""]"" ", , " ""asdfghjk"" ", " ""2025-09-18 05:58:45.853""", " ""2025-09-18 05:58:45.853""", " sdfgb , asdfgh , 123456"
14
+ RESIDENTIAL, testing , STANDALONE , testing-modelcolony-shivajinagar-pune-301013 , READY_TO_MOVE , 11.0, sdfghjhgfdfghjgfdfghgfgh, , RESIDENTIAL , 2BHK, , " ""10"" ", , , " ""2"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-bb8651e2ee2d0642.png"" ", " ""3"" ", " ""120000000""", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758175122464-0dead4f474b5ccbc.jpg""""]"" ", , " ""about property"" ", " ""2025-09-18 05:58:50.603""", " ""2025-09-18 05:58:50.603""", " sdfgb , asdfgh , 123456"
15
+ RESIDENTIAL, testring999 , COMPLEX , testring999-somwarpeth-camp-pune-222053 , UNDER_CONSTRUCTION, , dsgfhjk , 2025-09-25 00:00:00, RESIDENTIAL , 3BHK, 3BHK , " ""9"" ", , , " ""9"" ", " ""UNFURNISHED"" ", " ""[]"" ", " ""false""", , , " ""Sell"" ", " ""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-31db7b2bcb6394ec.webp""", " ""7"" ", " ""80000000"" ", " ""[""""https://pub-d28896f69c604ec5aa743cb0397740d9.r2.dev/1758708115716-b28e6ee1732f2e2b.webp""""]"" ", , " ""sdfghjn"" ", " ""2025-09-24 10:03:42.333""", " ""2025-09-24 10:03:42.333""", " esrdfghbj , sdfghj , 123456"
processed_data/left.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
processed_data/nobrokrage.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ aiohappyeyeballs==2.6.1
2
+ aiohttp==3.13.0
3
+ aiosignal==1.4.0
4
+ annotated-types==0.7.0
5
+ anyio==4.11.0
6
+ async-timeout==4.0.3
7
+ attrs==25.4.0
8
+ certifi==2025.10.5
9
+ charset-normalizer==3.4.4
10
+ click==8.3.0
11
+ colorama==0.4.6
12
+ dataclasses-json==0.6.7
13
+ distro==1.9.0
14
+ dnspython==2.8.0
15
+ email-validator==2.3.0
16
+ exceptiongroup==1.3.0
17
+ faiss-cpu==1.12.0
18
+ fastapi==0.119.0
19
+ fastapi-cli==0.0.13
20
+ fastapi-cloud-cli==0.3.1
21
+ filelock==3.20.0
22
+ frozenlist==1.8.0
23
+ fsspec==2025.9.0
24
+ greenlet==3.2.4
25
+ groq==0.32.0
26
+ h11==0.16.0
27
+ httpcore==1.0.9
28
+ httptools==0.7.1
29
+ httpx==0.28.1
30
+ httpx-sse==0.4.3
31
+ huggingface-hub==0.35.3
32
+ idna==3.11
33
+ itsdangerous==2.2.0
34
+ Jinja2==3.1.6
35
+ joblib==1.5.2
36
+ jsonpatch==1.33
37
+ jsonpointer==3.0.0
38
+ langchain==0.3.27
39
+ langchain-community==0.3.31
40
+ langchain-core==0.3.79
41
+ langchain-groq==0.3.8
42
+ langchain-huggingface==0.3.1
43
+ langchain-text-splitters==0.3.11
44
+ langsmith==0.4.37
45
+ markdown-it-py==4.0.0
46
+ MarkupSafe==3.0.3
47
+ marshmallow==3.26.1
48
+ mdurl==0.1.2
49
+ mpmath==1.3.0
50
+ multidict==6.7.0
51
+ mypy_extensions==1.1.0
52
+ networkx==3.4.2
53
+ numpy==2.2.6
54
+ orjson==3.11.3
55
+ packaging==25.0
56
+ pandas==2.3.3
57
+ pillow==12.0.0
58
+ propcache==0.4.1
59
+ pydantic==2.12.2
60
+ pydantic-extra-types==2.10.6
61
+ pydantic-settings==2.11.0
62
+ pydantic_core==2.41.4
63
+ Pygments==2.19.2
64
+ pymongo==4.15.3
65
+ python-dateutil==2.9.0.post0
66
+ python-dotenv==1.1.1
67
+ python-multipart==0.0.20
68
+ pytz==2025.2
69
+ PyYAML==6.0.3
70
+ regex==2025.9.18
71
+ requests==2.32.5
72
+ requests-toolbelt==1.0.0
73
+ rich==14.2.0
74
+ rich-toolkit==0.15.1
75
+ rignore==0.7.1
76
+ safetensors==0.6.2
77
+ scikit-learn==1.7.2
78
+ scipy==1.15.3
79
+ sentence-transformers==5.1.1
80
+ sentry-sdk==2.42.0
81
+ shellingham==1.5.4
82
+ six==1.17.0
83
+ sniffio==1.3.1
84
+ SQLAlchemy==2.0.44
85
+ starlette==0.48.0
86
+ sympy==1.14.0
87
+ tenacity==9.1.2
88
+ threadpoolctl==3.6.0
89
+ tokenizers==0.22.1
90
+ torch==2.9.0
91
+ tqdm==4.67.1
92
+ transformers==4.57.1
93
+ typer==0.19.2
94
+ typing-inspect==0.9.0
95
+ typing-inspection==0.4.2
96
+ typing_extensions==4.15.0
97
+ tzdata==2025.2
98
+ ujson==5.11.0
99
+ urllib3==2.5.0
100
+ uvicorn==0.37.0
101
+ watchfiles==1.1.1
102
+ websockets==15.0.1
103
+ yarl==1.22.0
104
+ zstandard==0.25.0
src/chatbot.py ADDED
@@ -0,0 +1,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # chatbot.py
2
+ import os
3
+ import re
4
+ import json
5
+ from typing import Dict, Any, List, Tuple, Optional
6
+
7
+ from langchain_huggingface import HuggingFaceEmbeddings
8
+ from langchain_community.vectorstores import FAISS
9
+ from langchain.schema import HumanMessage
10
+ from langchain_groq import ChatGroq # groq LLM wrapper
11
+ from langchain.schema import Document
12
+ from dotenv import load_dotenv
13
+ load_dotenv()
14
+
15
+ # -------- Safe absolute path ----------
16
+ PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # project root
17
+ VECTORSTORE_DIR = os.getenv("VECTORSTORE_DIR", os.path.join(PROJECT_ROOT, "vectorstore"))
18
+
19
+ GROQ_API_KEY = os.getenv("GROQ_API_KEY")
20
+
21
+ # Load embeddings & vectorstore
22
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
23
+ faiss_index_path = os.path.join(VECTORSTORE_DIR, "index.faiss")
24
+ if not os.path.exists(faiss_index_path):
25
+ raise FileNotFoundError(f"FAISS index not found at {faiss_index_path}")
26
+ db = FAISS.load_local(VECTORSTORE_DIR, embeddings, allow_dangerous_deserialization=True)
27
+
28
+ # Instantiate Groq LLM
29
+
30
+ llm = ChatGroq(
31
+ api_key=GROQ_API_KEY,
32
+ model="llama-3.1-8b-instant"
33
+ )
34
+ # ---------------------------
35
+ # 1) Query parsing helpers
36
+ # ---------------------------
37
+ def parse_budget(text: str) -> Optional[float]:
38
+ """
39
+ Parse budgets like:
40
+ - "under ₹1.2 Cr" -> returns numeric rupees (float) e.g. 12000000
41
+ - "under 1.2cr", "under 12000000"
42
+ Returns numeric rupee value or None.
43
+ """
44
+ if not text:
45
+ return None
46
+ s = text.replace(",", "").lower()
47
+ # find ₹ or rupee symbols and numbers
48
+ m = re.search(r"under\s*[₹rs\.]*\s*([0-9]+(?:\.[0-9]+)?)\s*(cr|crore|l|lakhs|lakh|k)?", s)
49
+ if m:
50
+ num = float(m.group(1))
51
+ unit = (m.group(2) or "").lower()
52
+ if unit in ("cr", "crore"):
53
+ return num * 1e7
54
+ if unit in ("l", "lakh", "lakhs"):
55
+ return num * 1e5
56
+ if unit in ("k",):
57
+ return num * 1e3
58
+ # if no unit assume rupees raw
59
+ return num
60
+ # alternative: find direct rupee integers like 12000000
61
+ m2 = re.search(r"([0-9]{6,})", s)
62
+ if m2:
63
+ return float(m2.group(1))
64
+ return None
65
+
66
+
67
+ def parse_bhk(text: str) -> Optional[str]:
68
+ """Return like '2BHK' or '3BHK' if mentioned."""
69
+ if not text:
70
+ return None
71
+ m = re.search(r"(\d+)\s*-?\s*bhk", text.lower())
72
+ if m:
73
+ return f"{m.group(1)}BHK"
74
+ return None
75
+
76
+
77
+ def parse_city(text: str) -> Optional[str]:
78
+ """Very simple city detection — looks for common city names in text."""
79
+ if not text:
80
+ return None
81
+ s = text.lower()
82
+ # extend this list as you need
83
+ cities = ["pune", "mumbai", "delhi", "bangalore", "bangaluru", "chennai", "hyderabad", "kolkata"]
84
+ for c in cities:
85
+ if c in s:
86
+ # standardize "bangaluru" -> "Bangalore" etc if you prefer
87
+ return c.capitalize() if c != "bangaluru" else "Bangalore"
88
+ return None
89
+
90
+
91
+ def parse_status(text: str) -> Optional[str]:
92
+ """Detect readiness intents"""
93
+ s = text.lower()
94
+ if "ready" in s or "ready to move" in s or "ready-to-move" in s:
95
+ return "READY_TO_MOVE"
96
+ if "under construction" in s or "uc" in s or "under-construction" in s:
97
+ return "UNDER_CONSTRUCTION"
98
+ return None
99
+
100
+
101
+ def parse_locality_or_project(text: str) -> Optional[str]:
102
+ """Pick up locality words (heuristic). Returns substring if found after 'in' or 'near'."""
103
+ if not text:
104
+ return None
105
+ m = re.search(r"(?:in|near|at)\s+([a-zA-Z0-9\- ]{3,30})", text.lower())
106
+ if m:
107
+ return m.group(1).strip().title()
108
+ return None
109
+
110
+
111
+ def parse_query(query: str) -> Dict[str, Any]:
112
+ """Aggregate all parsed filters."""
113
+ return {
114
+ "raw": query,
115
+ "budget_rupees": parse_budget(query),
116
+ "bhk": parse_bhk(query),
117
+ "city": parse_city(query),
118
+ "status": parse_status(query),
119
+ "locality_or_project": parse_locality_or_project(query),
120
+ }
121
+
122
+
123
+ # ---------------------------
124
+ # 2) Search + deterministic filter
125
+ # ---------------------------
126
+ def semantic_search(query: str, k: int = 10) -> List[Document]:
127
+ """
128
+ Run similarity search over FAISS and return top-k Document objects.
129
+ """
130
+ return db.similarity_search(query, k=k)
131
+
132
+
133
+ def apply_filters(docs: List[Document], filters: Dict[str, Any]) -> List[Document]:
134
+ """Filter retrieved docs using structured metadata (price, city, BHK, status, locality)."""
135
+ budget = filters.get("budget_rupees")
136
+ bhk = filters.get("bhk")
137
+ city = filters.get("city")
138
+ status = filters.get("status")
139
+ locality = filters.get("locality_or_project")
140
+
141
+ def keep(doc: Document) -> bool:
142
+ md = doc.metadata or {}
143
+ # city filter
144
+ if city:
145
+ md_city = (md.get("city") or "").lower()
146
+ if city.lower() not in md_city:
147
+ return False
148
+ # bhk filter
149
+ if bhk:
150
+ md_bhk = (md.get("BHK") or md.get("bhk") or "").lower()
151
+ if bhk.lower() not in md_bhk:
152
+ return False
153
+ # price filter (budget_rupees)
154
+ if budget is not None:
155
+ price = md.get("price") or md.get("price_in_cr")
156
+ if price is None:
157
+ return False
158
+ # price might be stored either in rupees (price) or in crores (price_in_cr)
159
+ if md.get("price") is not None:
160
+ try:
161
+ if float(md.get("price")) > float(budget):
162
+ return False
163
+ except:
164
+ return False
165
+ else:
166
+ # price_in_cr present
167
+ try:
168
+ if float(md.get("price_in_cr")) * 1e7 > float(budget):
169
+ return False
170
+ except:
171
+ return False
172
+ # status filter
173
+ if status:
174
+ md_status = (md.get("status") or "").lower()
175
+ if status.lower() not in md_status:
176
+ return False
177
+ # locality filter — check in metadata locality or address or slug
178
+ if locality:
179
+ found = False
180
+ for key in ("locality", "address", "slug", "projectName"):
181
+ if key in md and md.get(key):
182
+ if locality.lower() in str(md.get(key)).lower():
183
+ found = True
184
+ break
185
+ if not found:
186
+ return False
187
+ return True
188
+
189
+ filtered = [d for d in docs if keep(d)]
190
+ return filtered
191
+
192
+
193
+ # ---------------------------
194
+ # 3) Create summary + cards input (no hallucination)
195
+ # ---------------------------
196
+ def build_context_for_llm(docs: List[Document]) -> str:
197
+ """
198
+ Build a compact, plain text context from the retrieved docs.
199
+ We'll pass this to Groq LLM and instruct it to only use this data.
200
+ """
201
+ lines = []
202
+ for i, d in enumerate(docs, 1):
203
+ md = d.metadata or {}
204
+ title = md.get("projectName") or md.get("slug") or "Unknown"
205
+ locality = md.get("locality") or ""
206
+ city = md.get("city") or ""
207
+ bhk = md.get("BHK") or md.get("bhk") or ""
208
+ price_cr = md.get("price_in_cr")
209
+ price_rupee = md.get("price")
210
+ price_str = (f"₹{round(price_cr,2)} Cr" if price_cr else (f"₹{int(price_rupee)}" if price_rupee else "N/A"))
211
+ status = md.get("status") or ""
212
+ amenities = md.get("amenities") or ""
213
+ possession = md.get("possessionDate") or ""
214
+ slug = md.get("slug") or ""
215
+
216
+ lines.append(
217
+ f"ITEM_{i} || title: {title} || city: {city} || locality: {locality} || bhk: {bhk} || price: {price_str} || status: {status} || possession: {possession} || amenities: {amenities} || slug: {slug}"
218
+ )
219
+ return "\n".join(lines)
220
+
221
+
222
+ # ---------------------------
223
+ # 4) Prompt to Groq (strict, grounded)
224
+ # ---------------------------
225
+ from langchain.schema import HumanMessage
226
+ import json, re
227
+
228
+ def generate_summary_and_cards(user_query: str, records_text: str) -> dict:
229
+ SUMMARY_PROMPT = f"""
230
+ You are an assistant for NoBrokerage.com. You will be given property records.
231
+ **INSTRUCTIONS:**
232
+ - Use ONLY the information in the provided records (do not hallucinate).
233
+ - Produce a JSON object with two keys: "summary" and "cards".
234
+ - "summary": 2-4 sentences summarizing matching properties, including price, BHK, readiness, localities, counts.
235
+ - "cards": list of at most 6 objects with keys: title, city_locality, bhk, price, project_name, possession_status, top_amenities (list of 1-3 strings), cta_url.
236
+ - If no records match, return:
237
+ {{"summary":"No matching properties found. I expanded the search and found X alternatives.","cards":[]}}
238
+ Records:
239
+ {records_text}
240
+
241
+ User query:
242
+ {user_query}
243
+ """
244
+
245
+ # Call Groq LLM
246
+ resp = llm.generate([[HumanMessage(content=SUMMARY_PROMPT)]])
247
+
248
+ # Extract text
249
+ try:
250
+ text = resp.generations[0][0].text
251
+ except Exception:
252
+ text = str(resp)
253
+
254
+ # Parse JSON
255
+ try:
256
+ result_json = json.loads(text)
257
+ except json.JSONDecodeError:
258
+ # Attempt to extract JSON blob
259
+ match = re.search(r"(\{.*\})", text, re.S)
260
+ if match:
261
+ try:
262
+ result_json = json.loads(match.group(1))
263
+ except:
264
+ result_json = {"summary": "Error: Could not parse LLM output as JSON.", "cards": []}
265
+ else:
266
+ result_json = {"summary": "Error: Could not parse LLM output as JSON.", "cards": []}
267
+
268
+ # Ensure summary fallback is strictly formatted
269
+ if not result_json.get("summary"):
270
+ result_json["summary"] = f"No matching properties found for '{user_query}'."
271
+
272
+ return result_json
273
+
274
+
275
+
276
+ # ---------------------------
277
+ # 5) Main handler
278
+ # ---------------------------
279
+ def handle_query(query: str, k: int = 12) -> Dict[str, Any]:
280
+ """
281
+ Full pipeline:
282
+ - parse query
283
+ - semantic search (k)
284
+ - deterministic filter
285
+ - pass filtered results to LLM for summary + cards (LLM is forced to use only these records)
286
+ """
287
+ parsed = parse_query(query)
288
+ sem_docs = semantic_search(query, k=k)
289
+
290
+ # apply deterministic metadata filter
291
+ filtered = apply_filters(sem_docs, parsed)
292
+
293
+ # If none after filtering, optionally expand search: use original sem_docs as fallback
294
+ to_use = filtered if filtered else sem_docs[:6] # keep up to 6 for LLM context
295
+
296
+ # Build plain records text for LLM
297
+ records_text = build_context_for_llm(to_use)
298
+
299
+ # If absolutely no documents at all:
300
+ if len(to_use) == 0:
301
+ return {"summary": "No matching properties found and no alternatives available.", "cards": []}
302
+
303
+ llm_result = generate_summary_and_cards(query, records_text)
304
+
305
+ # Ensure cards also include CTA built from slug if missing formatting
306
+ cards = llm_result.get("cards", [])
307
+ for c, doc in zip(cards, to_use):
308
+ # ensure cta_url exists
309
+ if not c.get("cta_url") or c.get("cta_url") == "":
310
+ slug = doc.metadata.get("slug") or ""
311
+ c["cta_url"] = f"/project/{slug}"
312
+ return llm_result
313
+
314
+
315
+ # ---------------------------
316
+ # CLI interactive usage
317
+ # ---------------------------
318
+ if __name__ == "__main__":
319
+ print("NoBrokerage Chatbot (Groq) — demo (grounded summary + cards).")
320
+ print("Type 'exit' to quit.")
321
+ while True:
322
+ q = input("\nEnter user query: ").strip()
323
+ if q.lower() in ("exit", "quit"):
324
+ break
325
+ out = handle_query(q)
326
+ print("\n=== Summary ===")
327
+ print(out.get("summary"))
328
+ # print("\n=== Cards ===")
329
+ # print(json.dumps(out.get("cards", []), indent=2))
src/check_index.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from langchain_huggingface import HuggingFaceEmbeddings
2
+ from langchain_community.vectorstores import FAISS
3
+
4
+ # Path of vectorstore
5
+ DB_FAISS_PATH = "../vectorStore"
6
+
7
+ def check_faiss_index():
8
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
9
+ db = FAISS.load_local(DB_FAISS_PATH, embeddings, allow_dangerous_deserialization=True)
10
+
11
+ # Number of vectors stored in index.faiss
12
+ num_vectors = db.index.ntotal
13
+
14
+ # Number of documents (with metadata) stored in index.pkl
15
+ num_docs = len(db.docstore._dict)
16
+
17
+ print(f"📦 index.faiss contains {num_vectors} vectors")
18
+ print(f"📑 index.pkl contains {num_docs} metadata entries")
19
+
20
+ if __name__ == "__main__":
21
+ check_faiss_index()
src/ingest.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pymongo
3
+ import pickle
4
+ from dotenv import load_dotenv
5
+ from langchain_community.vectorstores import FAISS
6
+ from langchain_huggingface import HuggingFaceEmbeddings
7
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
8
+ from langchain.schema import Document
9
+ from datetime import datetime
10
+
11
+ # -----------------------------
12
+ # 1. Load environment variables
13
+ # -----------------------------
14
+ load_dotenv()
15
+ MONGO_URI = os.getenv("MONGO_URI") # Mongo connection
16
+ DB_NAME = os.getenv("DB_NAME", "company_chatbot")
17
+ COLLECTION_NAME = os.getenv("COLLECTION_NAME", "processed_data")
18
+ VECTORSTORE_DIR = "../vectorstore"
19
+ os.makedirs(VECTORSTORE_DIR, exist_ok=True)
20
+
21
+ # -----------------------------
22
+ # 2. Connect to MongoDB
23
+ # -----------------------------
24
+ client = pymongo.MongoClient(MONGO_URI)
25
+ db = client[DB_NAME]
26
+ collection = db[COLLECTION_NAME]
27
+
28
+ # -----------------------------
29
+ # 3. Preprocessing helpers
30
+ # -----------------------------
31
+ def clean_string(val):
32
+ if val is None:
33
+ return ""
34
+ return str(val).replace('"', '').replace("'", '').strip()
35
+
36
+ def clean_numeric(val):
37
+ try:
38
+ return float(val)
39
+ except:
40
+ return None
41
+
42
+ def preprocess_document(doc):
43
+ """Convert MongoDB doc to LangChain Document with full structured metadata"""
44
+ project_name = clean_string(doc.get("projectName"))
45
+ project_type = clean_string(doc.get("projectType"))
46
+ project_category = clean_string(doc.get("projectCategory"))
47
+ slug = clean_string(doc.get("slug"))
48
+ status = clean_string(doc.get("status"))
49
+ bhk = clean_string(doc.get("type") or doc.get("customBHK"))
50
+ price = clean_numeric(doc.get("price"))
51
+ carpet_area = clean_numeric(doc.get("carpetArea"))
52
+ bathrooms = clean_numeric(doc.get("bathrooms"))
53
+ balcony = clean_numeric(doc.get("balcony"))
54
+ furnished = clean_string(doc.get("furnishedType"))
55
+ lift = doc.get("lift", False)
56
+ possession_date = clean_string(doc.get("possessionDate"))
57
+ amenities = clean_string(doc.get("aboutProperty"))
58
+ address = clean_string(doc.get("Address info"))
59
+
60
+ # Extract city/locality from slug (fallback if missing)
61
+ parts = slug.split("-") if slug else []
62
+ locality = parts[-3].capitalize() if len(parts) >= 3 else ""
63
+ city = parts[-2].capitalize() if len(parts) >= 2 else ""
64
+
65
+ # Page content for embeddings (can include any text you want LLM to use)
66
+ content = f"""
67
+ Project Name: {project_name}
68
+ Type: {bhk}
69
+ Status: {status}
70
+ Price: {price}
71
+ Carpet Area: {carpet_area}
72
+ Bathrooms: {bathrooms}
73
+ Balcony: {balcony}
74
+ Furnishing: {furnished}
75
+ Lift: {lift}
76
+ Location: {locality}, {city}
77
+ Address: {address}
78
+ Amenities: {amenities}
79
+ """
80
+
81
+ # Structured metadata
82
+ metadata = {
83
+ "id": str(doc.get("_id")),
84
+ "slug": slug,
85
+ "projectName": project_name,
86
+ "projectType": project_type,
87
+ "projectCategory": project_category,
88
+ "status": status,
89
+ "BHK": bhk,
90
+ "price": price,
91
+ "price_in_cr": round(price / 10000000, 2) if price else None,
92
+ "carpetArea": carpet_area,
93
+ "bathrooms": bathrooms,
94
+ "balcony": balcony,
95
+ "furnishedType": furnished,
96
+ "lift": lift,
97
+ "possessionDate": possession_date,
98
+ "city": city,
99
+ "locality": locality,
100
+ "address": address,
101
+ "amenities": amenities,
102
+ "createdAt": doc.get("createdAt"),
103
+ "updatedAt": doc.get("updatedAt")
104
+ }
105
+
106
+ return Document(page_content=" ".join(content.split()), metadata=metadata)
107
+
108
+
109
+ # -----------------------------
110
+ # 4. Fetch & preprocess all docs
111
+ # -----------------------------
112
+ raw_docs = list(collection.find({}))
113
+ documents = [preprocess_document(doc) for doc in raw_docs]
114
+ print(f"Fetched {len(documents)} documents from MongoDB")
115
+
116
+ # -----------------------------
117
+ # 5. Chunk documents
118
+ # -----------------------------
119
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=50)
120
+ docs = text_splitter.split_documents(documents)
121
+ print(f"After chunking → {len(docs)} chunks")
122
+
123
+ # -----------------------------
124
+ # 6. Generate embeddings
125
+ # -----------------------------
126
+ embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
127
+ vectorstore = FAISS.from_documents(docs, embedding_model)
128
+
129
+ # -----------------------------
130
+ # 7. Save FAISS index & metadata separately
131
+ # -----------------------------
132
+ # Save FAISS vectorstore (index + metadata) into the folder
133
+ vectorstore.save_local(VECTORSTORE_DIR)
134
+ print(f"✅ FAISS vectors and metadata saved in {VECTORSTORE_DIR}")
135
+
src/query.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ from langchain_huggingface import HuggingFaceEmbeddings
3
+ from langchain_community.vectorstores import FAISS
4
+
5
+ # Path to your saved FAISS vectorstore
6
+ VECTORSTORE_DIR = "../vectorStore"
7
+
8
+ def query_faiss():
9
+ # Load embeddings
10
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
11
+
12
+ # Load FAISS vectorstore
13
+ db = FAISS.load_local(VECTORSTORE_DIR, embeddings, allow_dangerous_deserialization=True)
14
+
15
+ print("✅ FAISS vectorstore loaded successfully.")
16
+ print(f"Total chunks in DB: {len(db.docstore._dict)}")
17
+
18
+ while True:
19
+ query = input("\nEnter your query (or type 'exit' to quit): ").strip()
20
+ if query.lower() == "exit":
21
+ print("Exiting...")
22
+ break
23
+
24
+ # Perform similarity search
25
+ results = db.similarity_search(query, k=5) # top 5 results
26
+
27
+ if not results:
28
+ print("❌ No matching documents found.")
29
+ else:
30
+ print(f"\n🔹 Top {len(results)} matches:")
31
+ for i, doc in enumerate(results, 1):
32
+ # Print metadata + first 200 chars of content
33
+ content_preview = doc.page_content[:200].replace("\n", " ")
34
+ print(f"{i}. {content_preview}")
35
+ print(f" Metadata: {doc.metadata}\n")
36
+
37
+ if __name__ == "__main__":
38
+ query_faiss()