diff --git a/app/Controllers/__pycache__/auth_controller.cpython-314.pyc b/app/Controllers/__pycache__/auth_controller.cpython-314.pyc index 7dfa298..6a525d9 100644 Binary files a/app/Controllers/__pycache__/auth_controller.cpython-314.pyc and b/app/Controllers/__pycache__/auth_controller.cpython-314.pyc differ diff --git a/app/Controllers/__pycache__/dashboard_controller.cpython-314.pyc b/app/Controllers/__pycache__/dashboard_controller.cpython-314.pyc index 4ba21a7..9781be8 100644 Binary files a/app/Controllers/__pycache__/dashboard_controller.cpython-314.pyc and b/app/Controllers/__pycache__/dashboard_controller.cpython-314.pyc differ diff --git a/app/Controllers/__pycache__/filter_controller.cpython-314.pyc b/app/Controllers/__pycache__/filter_controller.cpython-314.pyc index 68d4c00..0555f96 100644 Binary files a/app/Controllers/__pycache__/filter_controller.cpython-314.pyc and b/app/Controllers/__pycache__/filter_controller.cpython-314.pyc differ diff --git a/app/Controllers/__pycache__/report_controller.cpython-314.pyc b/app/Controllers/__pycache__/report_controller.cpython-314.pyc index ae67f6a..9a3ed27 100644 Binary files a/app/Controllers/__pycache__/report_controller.cpython-314.pyc and b/app/Controllers/__pycache__/report_controller.cpython-314.pyc differ diff --git a/app/Controllers/__pycache__/task_controller.cpython-314.pyc b/app/Controllers/__pycache__/task_controller.cpython-314.pyc index 0f59898..0f43660 100644 Binary files a/app/Controllers/__pycache__/task_controller.cpython-314.pyc and b/app/Controllers/__pycache__/task_controller.cpython-314.pyc differ diff --git a/app/Controllers/__pycache__/upload_controller.cpython-314.pyc b/app/Controllers/__pycache__/upload_controller.cpython-314.pyc index e5e60ea..19b598d 100644 Binary files a/app/Controllers/__pycache__/upload_controller.cpython-314.pyc and b/app/Controllers/__pycache__/upload_controller.cpython-314.pyc differ diff --git a/app/Controllers/auth_controller.py b/app/Controllers/auth_controller.py index a446ddf..9926549 100644 --- a/app/Controllers/auth_controller.py +++ b/app/Controllers/auth_controller.py @@ -3,7 +3,6 @@ from flask_login import login_user, logout_user, current_user from ldap3 import Server, Connection, ALL from app import LDAPUser - def login_controller(): if current_user.is_authenticated: return redirect(url_for("main.dashboard")) @@ -56,7 +55,6 @@ def login_controller(): # return render_template("login.html") # ldap_user_dn = f"uid={username},ou=users,dc=lcepl,dc=org" - # try: # # Connect to LDAP server # # server = Server("openldap", port=389, get_info=ALL) diff --git a/app/Controllers/dashboard_controller.py b/app/Controllers/dashboard_controller.py index c952b3f..e1a82d8 100644 --- a/app/Controllers/dashboard_controller.py +++ b/app/Controllers/dashboard_controller.py @@ -8,7 +8,6 @@ from app import db def dashboard_controller(): selected_block = request.args.getlist('block[]', None) - rate_col = cast(Task.rate, Float) qty_col = cast(Task.in_this_ra_bill_qty, Float) @@ -29,7 +28,6 @@ def dashboard_controller(): if selected_block and "All" not in selected_block: query = query.filter(Task.block_name.in_(selected_block)) - query = query.group_by(Task.block_name, Task.village_name) villages = query.all() diff --git a/app/Controllers/filter_controller.py b/app/Controllers/filter_controller.py index d95aa48..fabe5d4 100644 --- a/app/Controllers/filter_controller.py +++ b/app/Controllers/filter_controller.py @@ -4,6 +4,10 @@ from app import db from app.models import Task, WorkDetail from app.service.logger import log_activity +import pandas as pd +from flask import request, send_file +from io import BytesIO + def filter_tasks_controller(): @@ -18,7 +22,7 @@ def filter_tasks_controller(): # blocks if district: blocks = [b[0] for b in db.session.query(WorkDetail.block) - .filter(WorkDetail.district == district).distinct()] + .filter(WorkDetail.district == district).distinct()] else: blocks = [] @@ -40,7 +44,7 @@ def filter_tasks_controller(): query = ( db.session.query(Task) .join(WorkDetail, - Task.village_name == WorkDetail.name_of_village) + Task.village_name == WorkDetail.name_of_village) .filter( WorkDetail.district == district, WorkDetail.block == block, @@ -94,4 +98,59 @@ def filter_tasks_controller(): selected_district=district, selected_block=block, selected_village=village + ) + + + + + +def download_filtered_tasks_controller(): + district = request.args.get('district') + block = request.args.get('block') + village = request.args.get('village') + + query = ( + db.session.query(Task) + .join(WorkDetail, + Task.village_name == WorkDetail.name_of_village) + .filter( + WorkDetail.district == district, + WorkDetail.block == block, + WorkDetail.name_of_village == village + ) + ) + + tasks = query.all() + + data = [] + for task in tasks: + data.append({ + "Task Name": task.task_name, + "Unit": task.unit, + "Qty": task.qty, + "Rate": task.rate, + "BOQ Amount": task.boq_amount, + "Prev Billed Qty": task.previous_billed_qty, + "Prev Billing Amount": task.previous_billing_amount, + "RA Bill Qty": task.in_this_ra_bill_qty, + "RA Bill Amount": task.in_this_ra_billing_amount, + "Cum Billed Qty": task.cumulative_billed_qty, + "Cum Billed Amount": task.cumulative_billed_amount, + "Variation Qty": task.variation_qty, + "Variation Amount": task.variation_amount, + }) + + df = pd.DataFrame(data) + + output = BytesIO() + df.to_excel(output, index=False, engine='openpyxl') + output.seek(0) + + filename = f"{district}_{block}_{village}_tasks.xlsx" + + return send_file( + output, + download_name=filename, + as_attachment=True, + mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ) \ No newline at end of file diff --git a/app/Controllers/report_controller.py b/app/Controllers/report_controller.py index 31974b7..b15d837 100644 --- a/app/Controllers/report_controller.py +++ b/app/Controllers/report_controller.py @@ -5,7 +5,7 @@ from app.models import Task from app.service.logger import log_activity -def generate_report_page_controller(): +def generate_report_page_controller(): selected_district = request.args.get('district') selected_block = request.args.get('block') diff --git a/app/Controllers/task_controller.py b/app/Controllers/task_controller.py index 0caedf0..5c3a08d 100644 --- a/app/Controllers/task_controller.py +++ b/app/Controllers/task_controller.py @@ -8,21 +8,23 @@ from app.service.logger import log_activity def recalc_task(task): rate = float(task.rate or 0) qty = float(task.qty or 0) - + prev_qty = float(task.previous_billed_qty or 0) ra_qty = float(task.in_this_ra_bill_qty or 0) - + # H = G * E task.previous_billing_amount = round(prev_qty * rate, 2) + # J = I * E task.in_this_ra_billing_amount = round(ra_qty * rate, 2) - + # K = I + G task.cumulative_billed_qty = round(prev_qty + ra_qty, 2) + # L = K * E task.cumulative_billed_amount = round(task.cumulative_billed_qty * rate, 2) - + # M = IF(K > D , K - D , 0) if task.cumulative_billed_qty > qty: task.variation_qty = round(task.cumulative_billed_qty - qty, 2) else: task.variation_qty = 0 - + # N = M * E task.variation_amount = round(task.variation_qty * rate, 2) @@ -40,116 +42,54 @@ def update_tasks_controller(): "variation_qty", "variation_amount" ] - for key, new_value in updates.items(): - if '_' not in key: continue - field_name, task_id_str = key.rsplit('_', 1) - if not task_id_str.isdigit(): continue - task = Task.query.get(int(task_id_str)) - if task: - if field_name in formula_fields: continue - current_value = getattr(task, field_name, None) - if str(current_value) != str(new_value): setattr(task, field_name, new_value) - recalc_task(task) - update_count += 1 - log_activity( current_user.username, "Task Update", f"Task ID {task.id} - {field_name} changed to {new_value}" ) - if update_count > 0: db.session.commit() - log_activity( current_user.username, "Database Commit", f"{update_count} task field(s) updated" ) - return jsonify({'message': f'count: {update_count} field(s) updated.'}) - return jsonify({'message': 'No fields were updated.'}) - except Exception as e: log_activity(current_user.username, "Error", str(e)) return jsonify({'error': 'Update failed'}), 500 - - # # Update tasks route -# @main.route('/update_tasks', methods=['POST']) -# @login_required -# def update_tasks(): -# try: -# updates = request.get_json() -# update_count = 0 - -# for key, new_value in updates.items(): -# if '_' not in key: -# continue - -# field_name, task_id_str = key.rsplit('_', 1) -# if not task_id_str.isdigit(): -# continue - -# task_id = int(task_id_str) -# task = db.session.query(Task).filter_by(id=task_id).first() - -# if task: -# current_value = getattr(task, field_name, None) -# if current_value != new_value: -# setattr(task, field_name, new_value) -# update_count += 1 -# log_activity(current_user.username, "Task Update", f"Task ID {task.id} - {field_name} changed to {new_value}") - -# if update_count > 0: -# db.session.commit() -# log_activity(current_user.username, "Database Commit", f"{update_count} task field(s) updated") -# return jsonify({'message': f'count: {update_count} field(s) updated.'}) -# else: -# return jsonify({'message': 'No fields were updated.'}) - -# except Exception as e: -# log_activity(current_user.username, "Error", f"Update tasks error: {str(e)}") -# return jsonify({'error': 'An error occurred while updating tasks.'}), 500 - - def display_tasks_controller(): - work_details = WorkDetail.query.order_by( WorkDetail.uploaded_at.desc() ).first() - if not work_details: log_activity(current_user.username, "Tasks View", "No work details") return "No work details available.", 404 - tasks = Task.query.filter_by( district=work_details.district, village_name=work_details.name_of_village, block_name=work_details.block ).order_by(Task.uploaded_at.desc()).all() - grouped_tasks = [] current_main_task = None - for task in tasks: - task_data = { "id": task.id, "task_name": task.task_name, @@ -168,20 +108,17 @@ def display_tasks_controller(): "remark": task.remark, "district": task.district } - if task.serial_number: task_data["subtasks"] = [] grouped_tasks.append(task_data) current_main_task = task_data elif current_main_task: current_main_task["subtasks"].append(task_data) - log_activity( current_user.username, "Tasks View", f"{work_details.name_of_village}, {work_details.block}" ) - return render_template( 'tasks_display.html', work_details=work_details, diff --git a/app/Controllers/upload_controller.py b/app/Controllers/upload_controller.py index d4e614a..14d23fc 100644 --- a/app/Controllers/upload_controller.py +++ b/app/Controllers/upload_controller.py @@ -4,8 +4,8 @@ from flask import request, redirect, url_for, current_app from flask_login import current_user from app import db from app.models import Task, WorkDetail -from datetime import datetime from app.service.logger import log_activity + # keep helper inside controller def to_2_decimal(value): try: @@ -15,7 +15,6 @@ def to_2_decimal(value): except (TypeError, ValueError): return None - def upload_controller(): if 'file' not in request.files: return "No file part" @@ -31,7 +30,6 @@ def upload_controller(): log_activity(current_user.username, "File Upload", f"Uploaded file: {file.filename}") work_details_data = pd.read_excel(filepath, nrows=11, header=None, dtype=str) - work_details_dict = { "name_of_work": work_details_data.iloc[0, 1], "cover_agreement_no": work_details_data.iloc[1, 1], @@ -45,15 +43,11 @@ def upload_controller(): "measurement_book": work_details_data.iloc[9, 1], "district": work_details_data.iloc[10, 1] } - work_details_dict = {k: (None if pd.isna(v) else v) for k, v in work_details_dict.items()} - work_detail = WorkDetail(**work_details_dict) db.session.add(work_detail) - data = pd.read_excel(filepath, skiprows=10) data = data.astype(object).where(pd.notna(data), None) - expected_columns = [ "serial_number", "task_name", "unit", "qty", "rate", "boq_amount", "previous_billed_qty", "previous_billing_amount", @@ -61,27 +55,21 @@ def upload_controller(): "cumulative_billed_qty", "cumulative_billed_amount", "variation_qty", "variation_amount", "remark" ] - if data.shape[1] == len(expected_columns): data.columns = expected_columns else: data.columns = expected_columns[:data.shape[1]] - current_main_task_serial = None current_main_task_name = None - for _, row in data.iterrows(): - task_name = str(row["task_name"]) if row["task_name"] else "" serial_number = str(row["serial_number"]) if row["serial_number"] else None - if serial_number: current_main_task_serial = serial_number current_main_task_name = task_name parent_id = None else: parent_id = current_main_task_serial - task = Task( district=work_details_dict.get("district"), block_name=work_details_dict["block"], @@ -104,11 +92,9 @@ def upload_controller(): parent_task_name=current_main_task_name if not serial_number else None, remark=row["remark"] ) - db.session.add(task) - db.session.commit() - + log_activity( current_user.username, "Database Insert", @@ -118,97 +104,3 @@ def upload_controller(): return redirect(url_for('main.display_tasks')) -# # File upload route -# @main.route('/upload', methods=['POST']) -# @login_required -# def upload(): -# if 'file' not in request.files: -# return "No file part" -# file = request.files['file'] -# if file.filename == '': -# return "No selected file" -# if file: -# filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], file.filename) -# file.save(filepath) -# log_activity(current_user.username, "File Upload", f"Uploaded file: {file.filename}") - -# # Read work details (first 11 rows) -# work_details_data = pd.read_excel(filepath, nrows=11, header=None) -# work_details_dict = { - -# "name_of_work": work_details_data.iloc[0, 1], -# "cover_agreement_no": work_details_data.iloc[1, 1], -# "name_of_contractor": work_details_data.iloc[2, 1], -# "name_of_tpi_agency": work_details_data.iloc[3, 1], -# "name_of_division": work_details_data.iloc[4, 1], -# "name_of_village": work_details_data.iloc[5, 1], -# "block": work_details_data.iloc[6, 1], -# "scheme_id": work_details_data.iloc[7, 1], -# "date_of_billing": work_details_data.iloc[8, 1], -# "measurement_book": work_details_data.iloc[9, 1], -# "district": work_details_data.iloc[10, 1] # Example: row 11 (index 10), column 2 (index 1) - -# } - -# work_details_dict = {key: (None if pd.isna(value) else value) for key, value in work_details_dict.items()} -# work_detail = WorkDetail(**work_details_dict) -# db.session.add(work_detail) - -# # Read task data starting from row 12 -# data = pd.read_excel(filepath, skiprows=10) -# data = data.astype(str).replace({"nan": None, "NaT": None, "None": None}) - -# expected_columns = [ -# "serial_number", "task_name", "unit", "qty", "rate", "boq_amount", -# "previous_billed_qty", "previous_billing_amount", -# "in_this_ra_bill_qty", "in_this_ra_billing_amount", -# "cumulative_billed_qty", "cumulative_billed_amount", -# "variation_qty", "variation_amount", "remark" -# ] - -# if data.shape[1] == len(expected_columns): -# data.columns = expected_columns -# else: -# data.columns = expected_columns[:data.shape[1]] # Truncate - -# current_main_task_serial = None -# current_main_task_name = None - -# for _, row in data.iterrows(): -# task_name = str(row["task_name"]) if row["task_name"] else "" -# serial_number = row["serial_number"] - -# if serial_number: # Main task -# current_main_task_serial = serial_number -# current_main_task_name = task_name -# parent_id = None -# else: # Subtask -# parent_id = current_main_task_serial - -# task = Task( -# district=work_details_dict.get("district"), -# block_name=work_details_dict["block"], -# village_name=work_details_dict["name_of_village"], -# serial_number=serial_number, -# task_name=task_name, -# unit=row["unit"], -# qty=row["qty"], -# rate=row["rate"], -# boq_amount=row["boq_amount"], -# previous_billed_qty=row["previous_billed_qty"], -# previous_billing_amount=row["previous_billing_amount"], -# in_this_ra_bill_qty=row["in_this_ra_bill_qty"], -# in_this_ra_billing_amount=row["in_this_ra_billing_amount"], -# cumulative_billed_qty=row["cumulative_billed_qty"], -# cumulative_billed_amount=row["cumulative_billed_amount"], -# variation_qty=row["variation_qty"], -# variation_amount=row["variation_amount"], -# parent_id=parent_id, -# parent_task_name=current_main_task_name if not serial_number else None, -# remark=row["remark"] -# ) -# db.session.add(task) - -# db.session.commit() -# log_activity(current_user.username, "Database Insert", f"Inserted work details and tasks from {file.filename}") -# return redirect(url_for('main.display_tasks')) \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py index 36a1200..05ed028 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -97,6 +97,7 @@ def create_app(): from app.routes.reports import reports as reports_bp app.register_blueprint(main_bp) app.register_blueprint(reports_bp) + except ImportError as e: print(f"Error importing blueprints: {e}") diff --git a/app/__pycache__/__init__.cpython-314.pyc b/app/__pycache__/__init__.cpython-314.pyc index 4c5d598..8c40bab 100644 Binary files a/app/__pycache__/__init__.cpython-314.pyc and b/app/__pycache__/__init__.cpython-314.pyc differ diff --git a/app/__pycache__/models.cpython-314.pyc b/app/__pycache__/models.cpython-314.pyc index 1795023..75d7b45 100644 Binary files a/app/__pycache__/models.cpython-314.pyc and b/app/__pycache__/models.cpython-314.pyc differ diff --git a/app/activity.log b/app/activity.log index db7427b..07d2c69 100644 --- a/app/activity.log +++ b/app/activity.log @@ -4309,3 +4309,200 @@ Timestamp: 2026-04-15 11:51:20 | User: admin | Action: Task Update | Details: Ta Timestamp: 2026-04-15 11:51:20 | User: admin | Action: Database Commit | Details: 1 task field(s) updated Timestamp: 2026-04-15 11:51:21 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi Timestamp: 2026-04-15 11:55:04 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Task Update | Details: Task ID 5 - rate changed to 200025.06 +Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Database Commit | Details: 1 task field(s) updated +Timestamp: 2026-04-15 12:34:30 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 12:34:46 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 13:22:44 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-15 13:22:46 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:22:58 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 13:23:28 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:23:31 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:23:46 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:23:51 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:23:56 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:00 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:07 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:11 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:14 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:19 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:22 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:25 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:28 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:31 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:35 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:39 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:42 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:46 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:49 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:24:53 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:24:58 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:25:02 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:25:13 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:25:22 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 13:27:09 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:27:12 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:27:18 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:27:21 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:27:31 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:27:54 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:27:57 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:28:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:33:19 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-15 13:33:25 | User: admin | Action: File Upload | Details: Uploaded file: Asadpur bamnauli.xlsx +Timestamp: 2026-04-15 13:33:26 | User: admin | Action: Database Insert | Details: Inserted work details and tasks from Asadpur bamnauli.xlsx +Timestamp: 2026-04-15 13:33:26 | User: admin | Action: Tasks View | Details: Asadpur Bamnauli, Kairana +Timestamp: 2026-04-15 13:34:33 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:34:42 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-15 13:34:43 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:34:50 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:34:51 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:34:58 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-15 13:34:59 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:35:04 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:35:06 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:35:09 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 13:35:16 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 13:35:22 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana +Timestamp: 2026-04-15 13:36:02 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 13:36:49 | User: admin | Action: Task Update | Details: Task ID 7 - previous_billed_qty changed to 4 +Timestamp: 2026-04-15 13:36:49 | User: admin | Action: Database Commit | Details: 1 task field(s) updated +Timestamp: 2026-04-15 13:36:51 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 14:55:01 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 15:40:52 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 15:40:56 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 16:38:21 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 16:38:31 | User: admin | Action: Task Update | Details: Task ID 5 - previous_billed_qty changed to 3 +Timestamp: 2026-04-15 16:38:31 | User: admin | Action: Database Commit | Details: 1 task field(s) updated +Timestamp: 2026-04-15 16:38:34 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 16:39:09 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 16:40:13 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 17:03:03 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-15 17:03:05 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 17:03:11 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 17:03:24 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 17:03:53 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-15 17:04:32 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-15 17:05:48 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 17:06:09 | User: admin | Action: Task Update | Details: Task ID 5 - in_this_ra_bill_qty changed to 5 +Timestamp: 2026-04-15 17:06:10 | User: admin | Action: Database Commit | Details: 1 task field(s) updated +Timestamp: 2026-04-15 17:06:12 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-15 17:06:50 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-15 17:07:05 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-15 17:07:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana +Timestamp: 2026-04-15 17:08:40 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-16 15:38:01 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-16 15:38:02 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-16 15:38:08 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-16 15:40:15 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-16 15:41:52 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-16 15:45:55 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-16 15:46:09 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-16 16:43:33 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-16 16:43:38 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-16 16:43:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-16 16:45:50 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-16 16:45:56 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-16 16:45:59 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-16 16:46:00 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-16 16:46:01 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-17 10:39:37 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-17 10:48:16 | User: admin | Action: Task Update | Details: Task ID 9 - previous_billed_qty changed to 5 +Timestamp: 2026-04-17 10:48:16 | User: admin | Action: Database Commit | Details: 1 task field(s) updated +Timestamp: 2026-04-17 10:48:17 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-17 10:56:16 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-17 11:14:15 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:14:19 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:14:26 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:14:37 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:14:43 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:14:57 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:09 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:12 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:15:19 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:26 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:28 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:32 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-17 11:15:41 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:15:50 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:16:56 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:16:58 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:17:06 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:17:10 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:17:54 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:17:55 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:17:58 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:18:01 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:18:17 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:18:18 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:19:57 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:20:00 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:23:27 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:23:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:24:15 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:24:37 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:24:40 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:26:22 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:27:27 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:27:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:28:09 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:28:41 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 11:28:44 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 14 - previous_billed_qty changed to 34 +Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 15 - previous_billed_qty changed to 34 +Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 16 - previous_billed_qty changed to 34 +Timestamp: 2026-04-17 11:44:45 | User: admin | Action: Task Update | Details: Task ID 17 - previous_billed_qty changed to 34 +Timestamp: 2026-04-17 11:44:46 | User: admin | Action: Database Commit | Details: 4 task field(s) updated +Timestamp: 2026-04-17 11:44:48 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-17 15:28:30 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-17 15:28:33 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:05:41 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:18:31 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-18 11:18:33 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:27:44 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-18 11:27:48 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:27:52 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:29:11 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-18 11:29:13 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-18 11:29:23 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-20 13:39:03 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 14:05:29 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 14:05:44 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana +Timestamp: 2026-04-20 14:06:13 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 14:09:27 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 16:06:41 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-20 16:40:27 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx +Timestamp: 2026-04-20 16:41:16 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-20 16:41:21 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx +Timestamp: 2026-04-20 16:42:10 | User: admin | Action: File Upload | Details: Uploaded file: thanabhavan_ahatagarh.xlsx +Timestamp: 2026-04-20 16:42:11 | User: admin | Action: Database Insert | Details: Inserted work details and tasks from thanabhavan_ahatagarh.xlsx +Timestamp: 2026-04-20 16:42:11 | User: admin | Action: Tasks View | Details: None, None +Timestamp: 2026-04-20 16:47:42 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 16:48:07 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 16:48:14 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kairana +Timestamp: 2026-04-20 16:48:22 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-20 16:52:41 | User: admin | Action: Tasks View | Details: None, None +Timestamp: 2026-04-20 16:53:51 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli +Timestamp: 2026-04-20 16:55:24 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 16:55:30 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-20 17:18:18 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 17:18:43 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 17:22:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 17:40:32 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 17:41:37 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 17:49:29 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 18:44:28 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 18:46:24 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 18:51:45 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 18:52:52 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 18:54:38 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 19:40:23 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-20 20:01:45 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-20 20:01:57 | User: admin | Action: Page Load | Details: Upload Excel page accessed +Timestamp: 2026-04-20 20:02:01 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-21 10:02:55 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-21 10:18:57 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kandhla, village=Aldi +Timestamp: 2026-04-21 10:20:03 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-21 10:20:08 | User: admin | Action: Fetch Tasks | Details: Fetched tasks for block Kandhla +Timestamp: 2026-04-21 10:20:10 | User: admin | Action: Report Page | Details: district=None, block=None +Timestamp: 2026-04-21 10:20:20 | User: admin | Action: Filter Tasks | Details: district=Shamli, block=Kairana, village=Asadpur Bamnauli diff --git a/app/models.py b/app/models.py index 6f8dbde..e3ca091 100644 --- a/app/models.py +++ b/app/models.py @@ -23,7 +23,7 @@ class User(UserMixin, db.Model): return f'' # ========================== -# Your existing models below +# DB models below # ========================== class Task(db.Model): @@ -41,7 +41,7 @@ class Task(db.Model): boq_amount = db.Column(String_size) previous_billed_qty = db.Column(String_size) previous_billing_amount = db.Column(String_size) - remaining_amount = db.Column(String_size) + remaining_amount = db.Column(String_size) in_this_ra_bill_qty = db.Column(String_size) in_this_ra_billing_amount = db.Column(String_size) cumulative_billed_qty = db.Column(String_size) @@ -66,7 +66,7 @@ class WorkDetail(db.Model): uploaded_at = db.Column(db.DateTime, default=datetime.utcnow) district = db.Column(db.String(255)) -class ActivityLog(db.Model): # ✅ OUTSIDE WorkDetail +class ActivityLog(db.Model): # OUTSIDE WorkDetail id = db.Column(db.Integer, primary_key=True) user = db.Column(db.String(100)) # can link with User model later action = db.Column(db.String(255)) diff --git a/app/routes/__pycache__/main.cpython-314.pyc b/app/routes/__pycache__/main.cpython-314.pyc index a603a20..d149090 100644 Binary files a/app/routes/__pycache__/main.cpython-314.pyc and b/app/routes/__pycache__/main.cpython-314.pyc differ diff --git a/app/routes/main.py b/app/routes/main.py index 76be5d9..1717fe3 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -7,93 +7,110 @@ from app.Controllers.auth_controller import (login_controller,logout_controller) from app.Controllers.upload_controller import upload_controller from app.Controllers.activity_controller import activity_log_controller from app.Controllers.task_controller import (update_tasks_controller,display_tasks_controller) -from app.Controllers.filter_controller import filter_tasks_controller +from app.Controllers.filter_controller import (filter_tasks_controller,download_filtered_tasks_controller) from app.Controllers.report_controller import generate_report_page_controller from app.Controllers.dropdown_controller import (get_blocks_by_district_controller,get_tasks_by_block_controller,get_villages_by_block_controller) main = Blueprint("main", __name__) +# -----------Login----------------------------------- @main.route("/login", methods=["GET", "POST"]) def login(): return login_controller() - @main.route("/logout") @login_required def logout(): return logout_controller() +# ---------------------------------------------------- - +# ------------Upload Excel---------------------------- @main.route('/upload_excel') @login_required def upload_excel(): log_activity(current_user.username, "Page Load", "Upload Excel page accessed") return render_template('upload.html') - +# ----------------------------------------------------- # @main.route('/dashboard') # def upload_file(): # return render_template('dashboard.html') +# -----------Upload----------------------------------- @main.route('/upload', methods=['POST']) @login_required def upload(): return upload_controller() +# ---------------------------------------------------- - +# -----------Update Task----------------------------- @main.route('/update_tasks', methods=['POST']) @login_required def update_tasks(): return update_tasks_controller() +# ----------------------------------------------------- - +# --------Task---------------------------------------- @main.route('/tasks') @login_required def display_tasks(): return display_tasks_controller() +# ------------------------------------------------------ +# ----------------Home---------------------------------- @main.route('/') @login_required def dashboard(): return dashboard_controller() +# ------------------------------------------------------- - - +# ----------Get Block By Distrit------------------------- @main.route('/get_blocks_by_district') @login_required def get_blocks_by_district(): return get_blocks_by_district_controller() +# ------------------------------------------------------- - +# ------------------Get Task by Block-------------------- @main.route('/get_tasks_by_block') @login_required def get_tasks_by_block(): return get_tasks_by_block_controller() +# ------------------------------------------------------ - +# ---------------Get Village by Block-------------------- @main.route('/get_villages_by_block') @login_required def get_villages_by_block(): return get_villages_by_block_controller() +# ------------------------------------------------------- - +# --------------genrate Report-------------------------- @main.route('/generate_report_page') @login_required def generate_report_page(): return generate_report_page_controller() +#----------------------------------------------------- +# -----------Filter Task--------------------------------- @main.route('/filter_tasks', methods=['GET']) @login_required def filter_tasks(): return filter_tasks_controller() + # --Download Filter Task-- +@main.route('/download_filtered_tasks', methods=['GET']) +def download_filtered_tasks(): + return download_filtered_tasks_controller() +# ----------------------------------------------------------- + +# ----------------Activity Log-------------------------- @main.route('/activity_log', methods=['GET', 'POST']) @login_required def activity_log(): return activity_log_controller() - - +# ----------------------------------------------------------- diff --git a/app/templates/filter_tasks.html b/app/templates/filter_tasks.html index 05e211a..c9e60d6 100644 --- a/app/templates/filter_tasks.html +++ b/app/templates/filter_tasks.html @@ -279,6 +279,7 @@ + {% if grouped_tasks %} @@ -311,25 +312,50 @@ ] %} {% for group in grouped_tasks %} - + + + +{% for field in ["task_name","unit","qty","rate","boq_amount","previous_billed_qty","previous_billing_amount","in_this_ra_bill_qty","in_this_ra_billing_amount","cumulative_billed_qty","cumulative_billed_amount","variation_qty","variation_amount"] %} + + + {{ group[field] if group[field] is not none else '' }} + + + +{% endfor %} + {% for sub in group.subtasks %} {% for field in ["task_name","unit","qty","rate","boq_amount","previous_billed_qty","previous_billing_amount","in_this_ra_bill_qty","in_this_ra_billing_amount","cumulative_billed_qty","cumulative_billed_amount","variation_qty","variation_amount"] %} - {{ sub[field] }} + + {{ sub[field] if sub[field] is not none else '' }} + - - + > + {% endfor %} {% endfor %} @@ -434,6 +460,15 @@ } }); }); + + function downloadExcel() { + const district = document.getElementById("district").value; + const block = document.getElementById("block").value; + const village = document.getElementById("village").value; + + let url = `/download_filtered_tasks?district=${district}&block=${block}&village=${village}`; + window.location.href = url; + } \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html index 774740f..c18b527 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -3,10 +3,15 @@ - + LAXMI CIVIL ENGINEERING SERVICES PVT. LTD. @@ -268,9 +286,9 @@ tr:nth-child(even) { Logout -
LAXMI CIVIL ENGINEERING SERVICES PVT. LTD.
+
LAXMI CIVIL ENGINEERING SERVICES PVT. LTD.
-

Dashboard

+

DASHBOARD

diff --git a/app/templates/login.html b/app/templates/login.html index 59d0b86..9be9187 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -4,33 +4,39 @@ LCEPL Client Billing Software diff --git a/uploads/200 MMØ MSERW PlaneSlotted Pip_20260417_111715.xlsx b/uploads/200 MMØ MSERW PlaneSlotted Pip_20260417_111715.xlsx new file mode 100644 index 0000000..c6cbb1a Binary files /dev/null and b/uploads/200 MMØ MSERW PlaneSlotted Pip_20260417_111715.xlsx differ diff --git a/uploads/200 MMØ_20260415_132725.xlsx b/uploads/200 MMØ_20260415_132725.xlsx new file mode 100644 index 0000000..1620199 Binary files /dev/null and b/uploads/200 MMØ_20260415_132725.xlsx differ diff --git a/uploads/200 MMØ_20260417_111617.xlsx b/uploads/200 MMØ_20260417_111617.xlsx new file mode 100644 index 0000000..a92af26 Binary files /dev/null and b/uploads/200 MMØ_20260417_111617.xlsx differ diff --git a/uploads/30 HP_20260417_111739.xlsx b/uploads/30 HP_20260417_111739.xlsx new file mode 100644 index 0000000..9e455b0 Binary files /dev/null and b/uploads/30 HP_20260417_111739.xlsx differ diff --git a/uploads/300 MMØ MSERW PlainSlotted Pip_20260417_111719.xlsx b/uploads/300 MMØ MSERW PlainSlotted Pip_20260417_111719.xlsx new file mode 100644 index 0000000..8baf329 Binary files /dev/null and b/uploads/300 MMØ MSERW PlainSlotted Pip_20260417_111719.xlsx differ diff --git a/uploads/300 MMØ_20260415_132727.xlsx b/uploads/300 MMØ_20260415_132727.xlsx new file mode 100644 index 0000000..a92b091 Binary files /dev/null and b/uploads/300 MMØ_20260415_132727.xlsx differ diff --git a/uploads/300 MMØ_20260417_111621.xlsx b/uploads/300 MMØ_20260417_111621.xlsx new file mode 100644 index 0000000..a9bceb3 Binary files /dev/null and b/uploads/300 MMØ_20260417_111621.xlsx differ diff --git a/uploads/325 Kl 14 M Staging_20260417_112456.xlsx b/uploads/325 Kl 14 M Staging_20260417_112456.xlsx new file mode 100644 index 0000000..92648d9 Binary files /dev/null and b/uploads/325 Kl 14 M Staging_20260417_112456.xlsx differ diff --git a/uploads/325 Kl 14 M Staging_20260417_113004.xlsx b/uploads/325 Kl 14 M Staging_20260417_113004.xlsx new file mode 100644 index 0000000..9187341 Binary files /dev/null and b/uploads/325 Kl 14 M Staging_20260417_113004.xlsx differ diff --git a/uploads/500 MMØ_20260415_132506.xlsx b/uploads/500 MMØ_20260415_132506.xlsx new file mode 100644 index 0000000..0584b51 Binary files /dev/null and b/uploads/500 MMØ_20260415_132506.xlsx differ diff --git a/uploads/500 MMØ_20260415_144112.xlsx b/uploads/500 MMØ_20260415_144112.xlsx new file mode 100644 index 0000000..537a3b7 Binary files /dev/null and b/uploads/500 MMØ_20260415_144112.xlsx differ diff --git a/uploads/500 MMØ_20260415_170439.xlsx b/uploads/500 MMØ_20260415_170439.xlsx new file mode 100644 index 0000000..5562d94 Binary files /dev/null and b/uploads/500 MMØ_20260415_170439.xlsx differ diff --git a/uploads/500 MMØ_20260415_170441.xlsx b/uploads/500 MMØ_20260415_170441.xlsx new file mode 100644 index 0000000..f718b74 Binary files /dev/null and b/uploads/500 MMØ_20260415_170441.xlsx differ diff --git a/uploads/500 MMØ_20260415_170443.xlsx b/uploads/500 MMØ_20260415_170443.xlsx new file mode 100644 index 0000000..d7e4cb4 Binary files /dev/null and b/uploads/500 MMØ_20260415_170443.xlsx differ diff --git a/uploads/500 MMØ_20260415_170444.xlsx b/uploads/500 MMØ_20260415_170444.xlsx new file mode 100644 index 0000000..cbed1e7 Binary files /dev/null and b/uploads/500 MMØ_20260415_170444.xlsx differ diff --git a/uploads/500 MMØ_20260417_111554.xlsx b/uploads/500 MMØ_20260417_111554.xlsx new file mode 100644 index 0000000..d4c445c Binary files /dev/null and b/uploads/500 MMØ_20260417_111554.xlsx differ diff --git a/uploads/600 MMØ_20260415_132511.xlsx b/uploads/600 MMØ_20260415_132511.xlsx new file mode 100644 index 0000000..2d73a39 Binary files /dev/null and b/uploads/600 MMØ_20260415_132511.xlsx differ diff --git a/uploads/600 MMØ_20260417_111601.xlsx b/uploads/600 MMØ_20260417_111601.xlsx new file mode 100644 index 0000000..5d799d2 Binary files /dev/null and b/uploads/600 MMØ_20260417_111601.xlsx differ diff --git a/uploads/Asadpur bamnauli.xlsx b/uploads/Asadpur bamnauli.xlsx new file mode 100644 index 0000000..ce85f2e Binary files /dev/null and b/uploads/Asadpur bamnauli.xlsx differ diff --git a/uploads/Charges for Development by 250_20260417_111732.xlsx b/uploads/Charges for Development by 250_20260417_111732.xlsx new file mode 100644 index 0000000..a6f9845 Binary files /dev/null and b/uploads/Charges for Development by 250_20260417_111732.xlsx differ diff --git a/uploads/Charges for Development of TW _20260417_111736.xlsx b/uploads/Charges for Development of TW _20260417_111736.xlsx new file mode 100644 index 0000000..c834049 Binary files /dev/null and b/uploads/Charges for Development of TW _20260417_111736.xlsx differ diff --git a/uploads/Construction of 13 m high and _20260417_112338.xlsx b/uploads/Construction of 13 m high and _20260417_112338.xlsx new file mode 100644 index 0000000..eec9b98 Binary files /dev/null and b/uploads/Construction of 13 m high and _20260417_112338.xlsx differ diff --git a/uploads/Construction of 13 m high and _20260420_164840.xlsx b/uploads/Construction of 13 m high and _20260420_164840.xlsx new file mode 100644 index 0000000..ca581c8 Binary files /dev/null and b/uploads/Construction of 13 m high and _20260420_164840.xlsx differ diff --git a/uploads/Construction of 13 m high and _20260420_164849.xlsx b/uploads/Construction of 13 m high and _20260420_164849.xlsx new file mode 100644 index 0000000..dfcd38a Binary files /dev/null and b/uploads/Construction of 13 m high and _20260420_164849.xlsx differ diff --git a/uploads/Construction of 13 m high and _20260420_164854.xlsx b/uploads/Construction of 13 m high and _20260420_164854.xlsx new file mode 100644 index 0000000..5cb0689 Binary files /dev/null and b/uploads/Construction of 13 m high and _20260420_164854.xlsx differ diff --git a/uploads/Construction of 13 m high and _20260420_164858.xlsx b/uploads/Construction of 13 m high and _20260420_164858.xlsx new file mode 100644 index 0000000..4a80f10 Binary files /dev/null and b/uploads/Construction of 13 m high and _20260420_164858.xlsx differ diff --git a/uploads/MS fittings such as clamp bai_20260417_111648.xlsx b/uploads/MS fittings such as clamp bai_20260417_111648.xlsx new file mode 100644 index 0000000..0fdc6fd Binary files /dev/null and b/uploads/MS fittings such as clamp bai_20260417_111648.xlsx differ diff --git a/uploads/MS fittings such as ring cent_20260417_111652.xlsx b/uploads/MS fittings such as ring cent_20260417_111652.xlsx new file mode 100644 index 0000000..1a58454 Binary files /dev/null and b/uploads/MS fittings such as ring cent_20260417_111652.xlsx differ diff --git a/uploads/Provide all materials labour T_20260417_112251.xlsx b/uploads/Provide all materials labour T_20260417_112251.xlsx new file mode 100644 index 0000000..779a255 Binary files /dev/null and b/uploads/Provide all materials labour T_20260417_112251.xlsx differ diff --git a/uploads/Provide all materials labour T_20260417_112854.xlsx b/uploads/Provide all materials labour T_20260417_112854.xlsx new file mode 100644 index 0000000..3febb94 Binary files /dev/null and b/uploads/Provide all materials labour T_20260417_112854.xlsx differ diff --git a/uploads/Provide all materials labour T_20260417_113139.xlsx b/uploads/Provide all materials labour T_20260417_113139.xlsx new file mode 100644 index 0000000..0531313 Binary files /dev/null and b/uploads/Provide all materials labour T_20260417_113139.xlsx differ diff --git a/uploads/SITC of Solar power plant for _20260415_133541.xlsx b/uploads/SITC of Solar power plant for _20260415_133541.xlsx new file mode 100644 index 0000000..ab0651a Binary files /dev/null and b/uploads/SITC of Solar power plant for _20260415_133541.xlsx differ diff --git a/uploads/Supplying and unconsolidated p_20260417_111724.xlsx b/uploads/Supplying and unconsolidated p_20260417_111724.xlsx new file mode 100644 index 0000000..6d76d3d Binary files /dev/null and b/uploads/Supplying and unconsolidated p_20260417_111724.xlsx differ diff --git a/uploads/Transportation Installation Di_20260415_132403.xlsx b/uploads/Transportation Installation Di_20260415_132403.xlsx new file mode 100644 index 0000000..d7ca83e Binary files /dev/null and b/uploads/Transportation Installation Di_20260415_132403.xlsx differ diff --git a/uploads/Transportation Installation Di_20260417_111730.xlsx b/uploads/Transportation Installation Di_20260417_111730.xlsx new file mode 100644 index 0000000..c379c3d Binary files /dev/null and b/uploads/Transportation Installation Di_20260417_111730.xlsx differ diff --git a/uploads/thanabhavan_ahatagarh.xlsx b/uploads/thanabhavan_ahatagarh.xlsx new file mode 100644 index 0000000..59c33d9 Binary files /dev/null and b/uploads/thanabhavan_ahatagarh.xlsx differ