A responsive, data-driven web application for the Kopargaon Municipal Council to manage civic complaints, score them with a multi-factor priority formula, allocate constrained department resources, suggest technician assignments with logged overrides, and provide plain-language explanations to citizens and ward officers.
Every complaint is scored dynamically using a balanced triage formula:
-
Category Severity (1–10):
- Water Pipeline (8–10): High utility & public health risk
- Drainage (7–9): Flooding and disease hazard
- Potholes (5–7): Accident risk (scaled up on NH-60)
- Streetlights (4–6): Night public safety
- Sector Priority Score (30% Pop + 30% Infra + 25% Vuln + 15% Conn): Precomputed per Kopargaon ward with dynamic Monsoon Mode (+1.5 flood vulnerability on Godavari riverbanks).
-
Aging Bonus:
$+0.1$ per day open, capped at$+2.0$ .
- Triage queue is sorted descending by
FinalScore. - Municipal department capacity limits:
- Road/Civil: 16 crew-hours per cycle
- Water Supply/Plumbing: 12 crew-hours per cycle
- Drainage & Sewerage: 12 crew-hours per cycle
- Electrical & Streetlights: 10 crew-hours per cycle
- Jobs fitting within capacity are marked Allocated.
- Jobs exceeding capacity are marked Deferred with transparent, auto-generated justification strings.
- Automatically recommends the best-fit free technician based on trade, workload, and home ward proximity.
- Ward officers can accept recommendations in 1-click or execute a Manual Override.
- Manual overrides require a mandatory justification log, recorded into an immutable Assignment & Override Audit Trail.
- Hybrid Satellite GIS map centered at 19.885°N, 74.477°E (Kopargaon).
- Color-coded polygons for all 6 Kopargaon wards:
- 🔴 Critical (
$\ge 8.0$ ): Godavari Ghat Ward, Station & Central Bazar Ward - 🟠 High (
$6.0 - 7.9$ ): NH-60 Highway Ward, Sanjivani Road Ward, MIDC Industrial Ward - 🟡 Medium (
$4.0 - 5.9$ ): Shirdi Road Ward
- 🔴 Critical (
- Geotagged category pins with hover preview cards and click-to-inspect popups.
- Search by complaint token (e.g.
KPG-2025-081,KPG-2025-042,KPG-2025-103). - Step-by-step progress timeline: Geotagged $\rightarrow$ AI Scored $\rightarrow$ Resource Allocated $\rightarrow$ Dispatched $\rightarrow$ Resolved.
- Plain-language explanation cards detailing why their complaint is ranked and scheduled.
- Live photo upload / preset selector.
- Client-side Canvas edge & luminosity inspection: detects blur, darkness, and corrupted/blank captures with immediate feedback.
- Point-in-polygon ray casting automatically identifies the correct Kopargaon ward.
kopargaon-civic-platform/
├── index.html # HTML5 shell with Tailwind CSS & Leaflet GIS CDN
├── README.md # Project documentation & spec guide
├── assets/ # Curated complaint photos (including Kopargaon assets)
│ ├── pothole_road.jpg
│ ├── streetlight_issue.jpg
│ └── water_leakage_drainage.jpg
└── src/
├── data/
│ ├── sectors.js # Kopargaon wards, polygons & base scores
│ ├── workers.js # Municipal technician roster & status
│ ├── resourcePools.js # Departmental crew hour limits
│ └── initialComplaints.js # Curated complaints dataset
├── algorithms/
│ ├── priorityScoring.js # Priority formula & explanation generator
│ ├── resourceAllocation.js# Greedy allocation & deferral rationale
│ ├── workerSuggestion.js # Worker suggestion engine
│ └── geoUtils.js # Point-in-polygon containment & distance
├── utils/
│ └── imageValidator.js # Canvas blur/darkness QA validator
├── components/
│ ├── Navbar.js # Header, Monsoon toggle & view switcher
│ ├── LandingPage.js # Hero intro & key pillars
│ ├── WardDashboard.js # Priority table, hover zoom & resource gauges
│ ├── SectorMap.js # Leaflet Satellite hybrid GIS map
│ ├── WorkerPanel.js # Auto-dispatch & override audit trail
│ ├── CitizenLookup.js # Citizen complaint status tracker
│ ├── DataTaggingTool.js # Edge QA & photo ingestion simulator
│ └── HoverPreview.js # Hover thumbnail popover
└── app.js # Application state manager & router
- Open
index.htmldirectly in any modern web browser (Google Chrome, Microsoft Edge, Mozilla Firefox, Opera). - Alternatively, serve with any static web server:
# Optional: if Python is available python -m http.server 8000 - Open
http://localhost:8000in your browser.