Compare commits

..

3 Commits

9 changed files with 202 additions and 85 deletions

31
.env
View File

@@ -1,31 +0,0 @@
# -----------------------------
# Flask App Configuration
# -----------------------------
FLASK_ENV=development
FLASK_DEBUG=True
FLASK_HOST=0.0.0.0
FLASK_PORT=5001
# -----------------------------
# Security
# -----------------------------
SECRET_KEY=change-this-to-strong-secret-key
# -----------------------------
# Database Configuration
# -----------------------------
DB_DIALECT=mysql
DB_DRIVER=pymysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=comparisondb
DB_USER=root
DB_PASSWORD=admin
# DATABASE_URL=mysql+pymysql://root:root@localhost/comparisondb

View File

@@ -49,3 +49,4 @@ class ManholeDomesticChamber(db.Model):
def serialize(self):
return {c.name: getattr(self, c.name) for c in self.__table__.columns}

View File

@@ -1,11 +1,67 @@
import matplotlib
matplotlib.use("Agg")
from flask import Blueprint, render_template, session, redirect, url_for
import matplotlib.pyplot as plt
import io
import base64
dashboard_bp = Blueprint("dashboard", __name__, url_prefix="/dashboard")
# charts
def plot_to_base64():
img = io.BytesIO()
plt.savefig(img, format="png", bbox_inches="tight")
plt.close()
img.seek(0)
return base64.b64encode(img.getvalue()).decode()
# bar chart
def bar_chart():
categories = ["Trench", "Manhole", "Pipe Laying", "Restoration"]
values = [120, 80, 150, 60]
plt.figure()
plt.bar(categories, values)
plt.title("Work Category Report")
plt.xlabel("Category")
plt.ylabel("Count")
return plot_to_base64()
# Pie chart
def pie_chart():
labels = ["Completed", "In Progress", "Pending"]
sizes = [65, 20, 15]
plt.figure()
plt.pie(sizes, labels=labels, autopct="%1.1f%%", startangle=140)
plt.title("Project Status")
return plot_to_base64()
# Histogram chart
def histogram_chart():
daily_work = [5, 10, 15, 20, 20, 25, 30, 35, 40, 45, 50]
plt.figure()
plt.hist(daily_work, bins=5)
plt.title("Daily Work Distribution")
plt.xlabel("Work Units")
plt.ylabel("Frequency")
return plot_to_base64()
# Dashboaed page
@dashboard_bp.route("/")
def dashboard():
if not session.get("user_id"):
return redirect(url_for("auth.login"))
return render_template("dashboard.html", title="Dashboard")
return render_template(
"dashboard.html",
title="Dashboard",
bar_chart=bar_chart(),
pie_chart=pie_chart(),
histogram=histogram_chart()
)

View File

@@ -96,18 +96,18 @@ class FileService:
if not location or not mh_no:
continue
exists = TrenchExcavation.query.filter_by(
subcontractor_id=subcontractor_id,
RA_Bill_No=RA_Bill_No,
Location=location,
MH_NO=mh_no,
).first()
# exists = TrenchExcavation.query.filter_by(
# subcontractor_id=subcontractor_id,
# RA_Bill_No=RA_Bill_No,
# Location=location,
# MH_NO=mh_no,
# ).first()
if exists:
errors.append(
f"Model-Tr.Ex. (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
)
continue
# if exists:
# errors.append(
# f"Model-Tr.Ex. (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
# )
# continue
record_data = {}
for col in df.columns:
@@ -154,18 +154,18 @@ class FileService:
if not location or not mh_no:
continue
exists = ManholeExcavation.query.filter_by(
subcontractor_id=subcontractor_id,
RA_Bill_No=RA_Bill_No,
Location=location,
MH_NO=mh_no,
).first()
# exists = ManholeExcavation.query.filter_by(
# subcontractor_id=subcontractor_id,
# RA_Bill_No=RA_Bill_No,
# Location=location,
# MH_NO=mh_no,
# ).first()
if exists:
errors.append(
f"Model-MH Ex. (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
)
continue
# if exists:
# errors.append(
# f"Model-MH Ex. (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
# )
# continue
record_data = {}
for col in df.columns:
@@ -212,18 +212,18 @@ class FileService:
if not location or not mh_no:
continue
exists = ManholeDomesticChamber.query.filter_by(
subcontractor_id=subcontractor_id,
RA_Bill_No=RA_Bill_No,
Location=location,
MH_NO=mh_no,
).first()
# exists = ManholeDomesticChamber.query.filter_by(
# subcontractor_id=subcontractor_id,
# RA_Bill_No=RA_Bill_No,
# Location=location,
# MH_NO=mh_no,
# ).first()
if exists:
errors.append(
f"Model-MH & DC (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
)
continue
# if exists:
# errors.append(
# f"Model-MH & DC (Row {idx+1}): Duplicate → Location={location}, MH_NO={mh_no}"
# )
# continue
record_data = {}
for col in df.columns:

View File

@@ -40,10 +40,10 @@
</a>
</li>
<!-- Subcontractor -->
<!-- Subcontractor Model -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
<i class="bi bi-people-fill me-1"></i> Subcontractor
<i class="bi bi-people-fill me-1"></i> Subcontractor Model
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li>
@@ -59,10 +59,10 @@
</ul>
</li>
<!-- File System -->
<!-- Subcontractor File System -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
<i class="bi bi-folder-fill me-1"></i> File System
<i class="bi bi-folder-fill me-1"></i>Subcontractor File System
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li>
@@ -81,7 +81,7 @@
<!-- Client System -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
<i class="bi bi-building me-1"></i> Client System
<i class="bi bi-building me-1"></i> Client File System
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li>
@@ -90,11 +90,6 @@
</a>
</li>
<li>
<a class="dropdown-item" href="/report/comparison_report">
<i class="bi bi-arrow-left-right me-2"></i> client vs sub-cont. Comparison Report
</a>
</li>
<li>
<a class="dropdown-item" href="/file/client_vs_subcont">
<i class="bi bi-arrow-left-right me-2"></i> Comparison Report
@@ -103,6 +98,27 @@
</ul>
</li>
<!-- Reports -->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
<i class="bi bi-building me-1"></i> Reports
</a>
<ul class="dropdown-menu dropdown-menu-dark">
<li>
<a class="dropdown-item" href="/report/comparison_report">
<i class="bi bi-arrow-left-right me-2"></i> client vs sub-cont. Comparison Report
</a>
</li>
<!-- <li>
<a class="dropdown-item" href="/file/client_vs_subcont">
<i class="bi bi-arrow-left-right me-2"></i> Comparison Report
</a>
</li> -->
</ul>
</li>
<!-- Formats -->
<li class="nav-item">
<a class="nav-link" href="/file_format">

View File

@@ -1,10 +1,84 @@
{% extends "base.html" %}
{% block content %}
<h2 class="mb-4">Dashboard</h2>
<div class="card p-4 shadow-sm">
<h5>Welcome to Comparison Project</h5>
<p>This is dashboard panel.</p>
<div class="container-fluid px-2 px-md-4">
<h4 class="mb-3 text-center text-md-start">Dashboard</h4>
<!-- Summary Cards -->
<div class="row g-3 mb-4">
<div class="col-12 col-md-4">
<div class="card text-white bg-primary shadow h-100">
<div class="card-body text-center text-md-start">
<h6>Total Work</h6>
<h3 class="fw-bold">410</h3>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="card text-white bg-success shadow h-100">
<div class="card-body text-center text-md-start">
<h6>Completed</h6>
<h3 class="fw-bold">265</h3>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="card text-dark bg-warning shadow h-100">
<div class="card-body text-center text-md-start">
<h6>Pending</h6>
<h3 class="fw-bold">145</h3>
</div>
</div>
</div>
</div>
<!-- Charts -->
<div class="row g-3">
<!-- Bar Chart -->
<div class="col-12 col-md-6">
<div class="card shadow-sm h-100">
<div class="card-header bg-dark text-white text-center text-md-start">
Work Category Bar Chart
</div>
<div class="card-body text-center">
<img src="data:image/png;base64,{{ bar_chart }}" class="img-fluid" style="max-height:300px;">
</div>
</div>
</div>
<!-- Pie Chart -->
<div class="col-12 col-md-6">
<div class="card shadow-sm h-100">
<div class="card-header bg-dark text-white text-center text-md-start">
Project Status Pie Chart
</div>
<div class="card-body text-center">
<img src="data:image/png;base64,{{ pie_chart }}" class="img-fluid" style="max-height:300px;">
</div>
</div>
</div>
<!-- Histogram -->
<div class="col-12">
<div class="card shadow-sm">
<div class="card-header bg-dark text-white text-center text-md-start">
Daily Work Histogram
</div>
<div class="card-body text-center">
<img src="data:image/png;base64,{{ histogram }}" class="img-fluid" style="max-height:350px;">
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -31,7 +31,7 @@
Laxmi Civil Engineering Services Pvt Ltd
</h4>
<p class="text-muted mb-0">
Data Comparison System
Data Comparison Software Solapur(UGD)
</p>
</div>

View File

@@ -5,13 +5,13 @@
<!-- Header -->
<div class="row mb-3 align-items-center">
<div class="col-12 col-md-6">
<div class="col-12 col-md-6 ">
<h4 class="mb-2 mb-md-0 text-center text-md-start">
Subcontractor List
</h4>
</div>
<div class="col-12 col-md-6 text-center text-md-end">
<div class="col-12 col-md-3 text-center text-md-end">
<a href="/subcontractor/add" class="btn btn-success w-100 w-md-auto">
Add Subcontractor
</a>
@@ -65,8 +65,8 @@
</a>
</div>
</td>
/tr>
{% endfor %}
</tr>
{% endfor %}
</tbody>
<!-- TOTAL ROW -->

View File

@@ -6,3 +6,4 @@ Werkzeug
python-dotenv
cryptography
xlsxwriter
matplotlib